From f8a76f95a949e73450cf3fb70ee06a556af88a10 Mon Sep 17 00:00:00 2001 From: Ben Mares Date: Wed, 24 Jan 2024 14:21:54 +0100 Subject: [PATCH 01/10] Add .DS_Store to .gitignore Co-authored-by: Srinivas Lade --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 9914ad0e..528ffc72 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ +**.DS_Store *.egg-info *.eggs *.pyc From 3c1b69a484c519e2720e702ebc2fda723223e6fd Mon Sep 17 00:00:00 2001 From: Ben Mares Date: Wed, 24 Jan 2024 14:24:13 +0100 Subject: [PATCH 02/10] =?UTF-8?q?Rename=20variable=20categories=20?= =?UTF-8?q?=E2=86=92=20categories=5Fto=5Finstall?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Srinivas Lade --- conda_lock/conda_lock.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/conda_lock/conda_lock.py b/conda_lock/conda_lock.py index f9edd810..f7c9fb35 100644 --- a/conda_lock/conda_lock.py +++ b/conda_lock/conda_lock.py @@ -602,7 +602,7 @@ def render_lockfile_for_platform( # noqa: C901 f"# input_hash: {lockfile.metadata.content_hash.get(platform)}\n", ] - categories = { + categories_to_install: Set[str] = { "main", *(extras or []), *(["dev"] if include_dev_dependencies else []), @@ -620,7 +620,7 @@ def render_lockfile_for_platform( # noqa: C901 lockfile.filter_virtual_packages_inplace() for p in lockfile.package: - if p.platform == platform and p.category in categories: + if p.platform == platform and p.category in categories_to_install: if p.manager == "pip": pip_deps.append(p) elif p.manager == "conda": From 5e4bb1f0f7e8f18b64b04301411d851ea19f82ea Mon Sep 17 00:00:00 2001 From: Ben Mares Date: Wed, 24 Jan 2024 14:28:25 +0100 Subject: [PATCH 03/10] Move .category from BaseLockedDependency into subclass defs Co-authored-by: Srinivas Lade --- conda_lock/lockfile/v1/models.py | 2 +- conda_lock/lockfile/v2prelim/models.py | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/conda_lock/lockfile/v1/models.py b/conda_lock/lockfile/v1/models.py index e431025a..66f95c26 100644 --- a/conda_lock/lockfile/v1/models.py +++ b/conda_lock/lockfile/v1/models.py @@ -54,7 +54,6 @@ class BaseLockedDependency(StrictModel): dependencies: Dict[str, str] = {} url: str hash: HashModel - category: str = "main" source: Optional[DependencySource] = None build: Optional[str] = None @@ -69,6 +68,7 @@ def validate_hash(cls, v: HashModel, values: Dict[str, typing.Any]) -> HashModel class LockedDependency(BaseLockedDependency): + category: str = "main" optional: bool diff --git a/conda_lock/lockfile/v2prelim/models.py b/conda_lock/lockfile/v2prelim/models.py index e322c803..61686e7a 100644 --- a/conda_lock/lockfile/v2prelim/models.py +++ b/conda_lock/lockfile/v2prelim/models.py @@ -17,6 +17,8 @@ class LockedDependency(BaseLockedDependency): + category: str = "main" + def to_v1(self) -> LockedDependencyV1: return LockedDependencyV1( name=self.name, From 0045df06f052fcff50a9a8f7261c55b0f843b862 Mon Sep 17 00:00:00 2001 From: Ben Mares Date: Wed, 24 Jan 2024 14:35:35 +0100 Subject: [PATCH 04/10] Rewrite containment in terms of sets Co-authored-by: Srinivas Lade --- conda_lock/conda_lock.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conda_lock/conda_lock.py b/conda_lock/conda_lock.py index f7c9fb35..e7184788 100644 --- a/conda_lock/conda_lock.py +++ b/conda_lock/conda_lock.py @@ -620,7 +620,7 @@ def render_lockfile_for_platform( # noqa: C901 lockfile.filter_virtual_packages_inplace() for p in lockfile.package: - if p.platform == platform and p.category in categories_to_install: + if p.platform == platform and len({p.category} & categories_to_install) > 0: if p.manager == "pip": pip_deps.append(p) elif p.manager == "conda": From 9bb4f7f7a0c8e634d7d67ee8825de41438c9f307 Mon Sep 17 00:00:00 2001 From: Ben Mares Date: Wed, 24 Jan 2024 14:41:56 +0100 Subject: [PATCH 05/10] Rewrite union in terms of singleton sets Co-authored-by: Srinivas Lade --- conda_lock/lockfile/__init__.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/conda_lock/lockfile/__init__.py b/conda_lock/lockfile/__init__.py index cd106084..1d8bf4bb 100644 --- a/conda_lock/lockfile/__init__.py +++ b/conda_lock/lockfile/__init__.py @@ -163,7 +163,9 @@ def write_conda_lock_file( content.filter_virtual_packages_inplace() with path.open("w") as f: if include_help_text: - categories = set(p.category for p in content.package) + categories: Set[str] = { + category for p in content.package for category in {p.category} + } def write_section(text: str) -> None: lines = dedent(text).split("\n") From 2a052456024bb4f841a8415c9d156d93578396b9 Mon Sep 17 00:00:00 2001 From: Ben Mares Date: Wed, 24 Jan 2024 15:13:10 +0100 Subject: [PATCH 06/10] Convert v2 locked deps into list of v1 deps Co-authored-by: Srinivas Lade --- conda_lock/lockfile/v2prelim/models.py | 47 ++++++++++++++++++-------- 1 file changed, 32 insertions(+), 15 deletions(-) diff --git a/conda_lock/lockfile/v2prelim/models.py b/conda_lock/lockfile/v2prelim/models.py index 61686e7a..0c1a49f7 100644 --- a/conda_lock/lockfile/v2prelim/models.py +++ b/conda_lock/lockfile/v2prelim/models.py @@ -19,20 +19,30 @@ class LockedDependency(BaseLockedDependency): category: str = "main" - def to_v1(self) -> LockedDependencyV1: - return LockedDependencyV1( - name=self.name, - version=self.version, - manager=self.manager, - platform=self.platform, - dependencies=self.dependencies, - url=self.url, - hash=self.hash, - category=self.category, - source=self.source, - build=self.build, - optional=self.category != "main", - ) + def to_v1(self) -> List[LockedDependencyV1]: + """Convert a v2 dependency into a list of v1 dependencies. + + In case a v2 dependency might contain multiple categories, but a v1 dependency + can only contain a single category, we represent multiple categories as a list + of v1 dependencies that are identical except for the `category` field. The + `category` field runs over all categories.""" + package_entries_per_category = [ + LockedDependencyV1( + name=self.name, + version=self.version, + manager=self.manager, + platform=self.platform, + dependencies=self.dependencies, + url=self.url, + hash=self.hash, + category=category, + source=self.source, + build=self.build, + optional=category != "main", + ) + for category in sorted({self.category}) + ] + return package_entries_per_category class Lockfile(StrictModel): @@ -129,8 +139,15 @@ def _toposort(package: List[LockedDependency]) -> List[LockedDependency]: return final_package def to_v1(self) -> LockfileV1: + # Each v2 package gives a list of v1 packages. + # Flatten these into a single list of v1 packages. + v1_packages = [ + package_entry_per_category + for p in self.package + for package_entry_per_category in p.to_v1() + ] return LockfileV1( - package=[p.to_v1() for p in self.package], + package=v1_packages, metadata=self.metadata, ) From 868d5af3b56d14decefd2e85743a266b466ba4f8 Mon Sep 17 00:00:00 2001 From: Ben Mares Date: Wed, 24 Jan 2024 15:45:21 +0100 Subject: [PATCH 07/10] Handle multiple categories when parsing v1 lockfiles Co-authored-by: Srinivas Lade --- conda_lock/lockfile/v2prelim/models.py | 63 ++++++++++++++++++++------ 1 file changed, 48 insertions(+), 15 deletions(-) diff --git a/conda_lock/lockfile/v2prelim/models.py b/conda_lock/lockfile/v2prelim/models.py index 0c1a49f7..f2f510f0 100644 --- a/conda_lock/lockfile/v2prelim/models.py +++ b/conda_lock/lockfile/v2prelim/models.py @@ -1,5 +1,5 @@ from collections import defaultdict -from typing import ClassVar, Dict, List, Optional +from typing import ClassVar, Dict, List, Optional, Set from conda_lock.lockfile.v1.models import ( BaseLockedDependency, @@ -7,6 +7,7 @@ GitMeta, HashModel, InputMeta, + LockKey, LockMeta, MetadataOption, TimeMeta, @@ -152,29 +153,61 @@ def to_v1(self) -> LockfileV1: ) -def _locked_dependency_v1_to_v2(dep: LockedDependencyV1) -> LockedDependency: +def _locked_dependency_v1_to_v2( + package_entries_per_category: List[LockedDependencyV1], +) -> LockedDependency: """Convert a LockedDependency from v1 to v2. - * Remove the optional field (it is always equal to category != "main") + This is an inverse to `LockedDependency.to_v1()`. """ + # Dependencies are parsed from a v1 lockfile, so there will always be + # at least one entry corresponding to what was parsed. + assert len(package_entries_per_category) > 0 + # All the package entries should share the same key. + assert all( + d.key() == package_entries_per_category[0].key() + for d in package_entries_per_category + ) + + categories = {d.category for d in package_entries_per_category} + + # Each entry should correspond to a distinct category + assert len(categories) == len(package_entries_per_category) + + # Until we allow multiple categories in v2 we need this workaround + single_category = package_entries_per_category[0].category + return LockedDependency( - name=dep.name, - version=dep.version, - manager=dep.manager, - platform=dep.platform, - dependencies=dep.dependencies, - url=dep.url, - hash=dep.hash, - category=dep.category, - source=dep.source, - build=dep.build, + name=package_entries_per_category[0].name, + version=package_entries_per_category[0].version, + manager=package_entries_per_category[0].manager, + platform=package_entries_per_category[0].platform, + dependencies=package_entries_per_category[0].dependencies, + url=package_entries_per_category[0].url, + hash=package_entries_per_category[0].hash, + category=single_category, + source=package_entries_per_category[0].source, + build=package_entries_per_category[0].build, ) def lockfile_v1_to_v2(lockfile_v1: LockfileV1) -> Lockfile: - """Convert a Lockfile from v1 to v2.""" + """Convert a Lockfile from v1 to v2. + + Entries may share the same key if they represent a dependency + belonging to multiple categories. They must be collected here. + """ + dependencies_for_key: Dict[LockKey, List[LockedDependencyV1]] = defaultdict(list) + for dep in lockfile_v1.package: + dependencies_for_key[dep.key()].append(dep) + + v2_packages = [ + _locked_dependency_v1_to_v2(package_entries_per_category) + for package_entries_per_category in dependencies_for_key.values() + ] + return Lockfile( - package=[_locked_dependency_v1_to_v2(p) for p in lockfile_v1.package], + package=v2_packages, metadata=lockfile_v1.metadata, ) From a0611428b1da1e824275e81c275f29128bb5fa02 Mon Sep 17 00:00:00 2001 From: Ben Mares Date: Wed, 24 Jan 2024 16:57:04 +0100 Subject: [PATCH 08/10] =?UTF-8?q?Change=20category=20=E2=86=92=20categorie?= =?UTF-8?q?s=20in=20LockedDependencyV2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Srinivas Lade --- conda_lock/conda_lock.py | 2 +- conda_lock/lockfile/__init__.py | 4 ++-- conda_lock/lockfile/v2prelim/models.py | 9 +++------ tests/test_conda_lock.py | 5 ++--- 4 files changed, 8 insertions(+), 12 deletions(-) diff --git a/conda_lock/conda_lock.py b/conda_lock/conda_lock.py index e7184788..48b1d717 100644 --- a/conda_lock/conda_lock.py +++ b/conda_lock/conda_lock.py @@ -620,7 +620,7 @@ def render_lockfile_for_platform( # noqa: C901 lockfile.filter_virtual_packages_inplace() for p in lockfile.package: - if p.platform == platform and len({p.category} & categories_to_install) > 0: + if p.platform == platform and len(p.categories & categories_to_install) > 0: if p.manager == "pip": pip_deps.append(p) elif p.manager == "conda": diff --git a/conda_lock/lockfile/__init__.py b/conda_lock/lockfile/__init__.py index 1d8bf4bb..12e89ac0 100644 --- a/conda_lock/lockfile/__init__.py +++ b/conda_lock/lockfile/__init__.py @@ -131,7 +131,7 @@ def dep_name(manager: str, dep: str) -> str: if not isinstance(targets, list): targets = [targets] for target in targets: - target.category = source.category + target.categories = {source.category} def parse_conda_lock_file(path: pathlib.Path) -> Lockfile: @@ -164,7 +164,7 @@ def write_conda_lock_file( with path.open("w") as f: if include_help_text: categories: Set[str] = { - category for p in content.package for category in {p.category} + category for p in content.package for category in p.categories } def write_section(text: str) -> None: diff --git a/conda_lock/lockfile/v2prelim/models.py b/conda_lock/lockfile/v2prelim/models.py index f2f510f0..3138d20e 100644 --- a/conda_lock/lockfile/v2prelim/models.py +++ b/conda_lock/lockfile/v2prelim/models.py @@ -18,7 +18,7 @@ class LockedDependency(BaseLockedDependency): - category: str = "main" + categories: Set[str] = {"main"} def to_v1(self) -> List[LockedDependencyV1]: """Convert a v2 dependency into a list of v1 dependencies. @@ -41,7 +41,7 @@ def to_v1(self) -> List[LockedDependencyV1]: build=self.build, optional=category != "main", ) - for category in sorted({self.category}) + for category in sorted(self.categories) ] return package_entries_per_category @@ -174,9 +174,6 @@ def _locked_dependency_v1_to_v2( # Each entry should correspond to a distinct category assert len(categories) == len(package_entries_per_category) - # Until we allow multiple categories in v2 we need this workaround - single_category = package_entries_per_category[0].category - return LockedDependency( name=package_entries_per_category[0].name, version=package_entries_per_category[0].version, @@ -185,7 +182,7 @@ def _locked_dependency_v1_to_v2( dependencies=package_entries_per_category[0].dependencies, url=package_entries_per_category[0].url, hash=package_entries_per_category[0].hash, - category=single_category, + categories=categories, source=package_entries_per_category[0].source, build=package_entries_per_category[0].build, ) diff --git a/tests/test_conda_lock.py b/tests/test_conda_lock.py index 858aef4c..c611296e 100644 --- a/tests/test_conda_lock.py +++ b/tests/test_conda_lock.py @@ -12,7 +12,6 @@ import tempfile import typing import uuid -import warnings from glob import glob from pathlib import Path @@ -394,10 +393,10 @@ def test_lock_poetry_ibis( ) lockfile = parse_conda_lock_file(pyproject.parent / DEFAULT_LOCKFILE_NAME) - all_categories = set() + all_categories: Set[str] = set() for pkg in lockfile.package: - all_categories.add(pkg.category) + all_categories.update(pkg.categories) for desired_category in extra_categories: assert ( From 1ac5f7c0d83ae34c5a96690b2a2aa47a70266197 Mon Sep 17 00:00:00 2001 From: Srinivas Lade Date: Sat, 23 Dec 2023 14:26:57 -0500 Subject: [PATCH 09/10] Add Support for Multiple Categories per LockedDependency Also change default categories value from `{'main'}` to empty set because we add instead of overwrite when we apply the categories. --- conda_lock/lockfile/__init__.py | 53 +++++++++++++++++++----- conda_lock/lockfile/v2prelim/models.py | 2 +- tests/test_conda_lock.py | 57 ++++++++++++++++++++++++++ 3 files changed, 100 insertions(+), 12 deletions(-) diff --git a/conda_lock/lockfile/__init__.py b/conda_lock/lockfile/__init__.py index 12e89ac0..53698cb7 100644 --- a/conda_lock/lockfile/__init__.py +++ b/conda_lock/lockfile/__init__.py @@ -2,7 +2,17 @@ from collections import defaultdict from textwrap import dedent -from typing import Collection, Dict, List, Mapping, Optional, Sequence, Set, Union +from typing import ( + Collection, + DefaultDict, + Dict, + List, + Mapping, + Optional, + Sequence, + Set, + Union, +) import yaml @@ -38,6 +48,23 @@ def _seperator_munge_get( return d[key.replace("_", "-")] +def _truncate_main_category( + planned: Mapping[str, Union[List[LockedDependency], LockedDependency]], +) -> None: + """ + Given the package dependencies with their respective categories + for any package that is in the main category, remove all other associated categories + """ + # Packages in the main category are always installed + # so other categories are not necessary + for targets in planned.values(): + if not isinstance(targets, list): + targets = [targets] + for target in targets: + if "main" in target.categories: + target.categories = {"main"} + + def apply_categories( requested: Dict[str, Dependency], planned: Mapping[str, Union[List[LockedDependency], LockedDependency]], @@ -111,27 +138,31 @@ def dep_name(manager: str, dep: str) -> str: by_category[request.category].append(request.name) - # now, map each package to its root request preferring the ones earlier in the - # list + # now, map each package to every root request that requires it categories = [*categories, *(k for k in by_category if k not in categories)] - root_requests = {} + root_requests: DefaultDict[str, List[str]] = defaultdict(list) for category in categories: for root in by_category.get(category, []): for transitive_dep in dependents[root]: - if transitive_dep not in root_requests: - root_requests[transitive_dep] = root + root_requests[transitive_dep].append(root) # include root requests themselves for name in requested: - root_requests[name] = name + root_requests[name].append(name) - for dep, root in root_requests.items(): - source = requested[root] + for dep, roots in root_requests.items(): # try a conda target first targets = _seperator_munge_get(planned, dep) if not isinstance(targets, list): targets = [targets] - for target in targets: - target.categories = {source.category} + + for root in roots: + source = requested[root] + for target in targets: + target.categories.add(source.category) + + # For any dep that is part of the 'main' category + # we should remove all other categories + _truncate_main_category(planned) def parse_conda_lock_file(path: pathlib.Path) -> Lockfile: diff --git a/conda_lock/lockfile/v2prelim/models.py b/conda_lock/lockfile/v2prelim/models.py index 3138d20e..edeb797a 100644 --- a/conda_lock/lockfile/v2prelim/models.py +++ b/conda_lock/lockfile/v2prelim/models.py @@ -18,7 +18,7 @@ class LockedDependency(BaseLockedDependency): - categories: Set[str] = {"main"} + categories: Set[str] = set() def to_v1(self) -> List[LockedDependencyV1]: """Convert a v2 dependency into a list of v1 dependencies. diff --git a/tests/test_conda_lock.py b/tests/test_conda_lock.py index c611296e..00d8cbac 100644 --- a/tests/test_conda_lock.py +++ b/tests/test_conda_lock.py @@ -33,6 +33,7 @@ _add_auth_to_line, _add_auth_to_lockfile, _extract_domain, + _solve_for_arch, _strip_auth_from_line, _strip_auth_from_lockfile, create_lockfile_from_spec, @@ -606,6 +607,7 @@ def test_choose_wheel() -> None: platform="linux-64", ) assert len(solution) == 1 + assert solution["fastavro"].categories == {"main"} assert solution["fastavro"].hash == HashModel( sha256="a111a384a786b7f1fd6a8a8307da07ccf4d4c425084e2d61bae33ecfb60de405" ) @@ -1820,6 +1822,61 @@ def test_aggregate_lock_specs_invalid_pip_repos(): aggregate_lock_specs([base_spec, spec_a, spec_a_b], platforms=[]) +def test_solve_arch_multiple_categories(): + _conda_exe = determine_conda_executable(None, mamba=False, micromamba=False) + channels = [Channel.from_string("conda-forge")] + + with tempfile.NamedTemporaryFile(dir=".") as tf: + spec = LockSpecification( + dependencies={ + "linux-64": [ + VersionedDependency( + name="python", + version="=3.10.9", + manager="conda", + category="main", + extras=[], + ), + VersionedDependency( + name="pandas", + version="=1.5.3", + manager="conda", + category="test", + extras=[], + ), + VersionedDependency( + name="pyarrow", + version="=9.0.0", + manager="conda", + category="dev", + extras=[], + ), + ], + }, + channels=channels, + # NB: this file must exist for relative path resolution to work + # in create_lockfile_from_spec + sources=[Path(tf.name)], + ) + + vpr = default_virtual_package_repodata() + with vpr: + locked_deps = _solve_for_arch( + conda=_conda_exe, + spec=spec, + platform="linux-64", + channels=channels, + pip_repositories=[], + virtual_package_repo=vpr, + ) + python_deps = [dep for dep in locked_deps if dep.name == "python"] + assert len(python_deps) == 1 + assert python_deps[0].categories == {"main"} + numpy_deps = [dep for dep in locked_deps if dep.name == "numpy"] + assert len(numpy_deps) == 1 + assert numpy_deps[0].categories == {"test", "dev"} + + def _check_package_installed(package: str, prefix: str): import glob From bd2043aa33abf0d401cbe938ba430add89cfa60f Mon Sep 17 00:00:00 2001 From: Srinivas Lade Date: Wed, 3 Jan 2024 23:33:06 -0500 Subject: [PATCH 10/10] Add Test Case with Conda-Lock Install --- tests/test-multiple-categories/conda-lock.yml | 1658 +++++++++++++++++ tests/test-multiple-categories/dev.yml | 9 + tests/test-multiple-categories/main.yml | 8 + tests/test-multiple-categories/test.yml | 8 + tests/test_conda_lock.py | 51 +- 5 files changed, 1733 insertions(+), 1 deletion(-) create mode 100644 tests/test-multiple-categories/conda-lock.yml create mode 100644 tests/test-multiple-categories/dev.yml create mode 100644 tests/test-multiple-categories/main.yml create mode 100644 tests/test-multiple-categories/test.yml diff --git a/tests/test-multiple-categories/conda-lock.yml b/tests/test-multiple-categories/conda-lock.yml new file mode 100644 index 00000000..a48272eb --- /dev/null +++ b/tests/test-multiple-categories/conda-lock.yml @@ -0,0 +1,1658 @@ +# This lock file was generated by conda-lock (https://github.com/conda/conda-lock). DO NOT EDIT! +# +# A "lock file" contains a concrete list of package versions (with checksums) to be installed. Unlike +# e.g. `conda env create`, the resulting environment will not change as new package versions become +# available, unless you explicitly update the lock file. +# +# Install this environment as "YOURENV" with: +# conda-lock install -n YOURENV --file conda-lock.yml +# This lock contains optional development dependencies. Include them in the installed environment with: +# conda-lock install --dev-dependencies -n YOURENV --file conda-lock.yml +# This lock contains optional dependency categories test. Include them in the installed environment with: +# conda-lock install -e test -n YOURENV --file conda-lock.yml +# To update a single package to the latest version compatible with the version constraints in the source: +# conda-lock lock --lockfile conda-lock.yml --update PACKAGE +# To re-solve the entire environment, e.g. after changing a version constraint in the source file: +# conda-lock -f main.yml -f dev.yml -f test.yml --lockfile conda-lock.yml +version: 1 +metadata: + content_hash: + linux-64: c5246bb68a36bc245f7efa8d034abd2fb682ba8cbf3c36a655343ab56fc7ea1c + channels: + - url: conda-forge + used_env_vars: [] + platforms: + - linux-64 + sources: + - main.yml + - dev.yml + - test.yml +package: +- name: _libgcc_mutex + version: '0.1' + manager: conda + platform: linux-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 + hash: + md5: d7c89558ba9fa0495403155b64376d81 + sha256: fe51de6107f9edc7aa4f786a70f4a883943bc9d39b3bb7307c04c41410990726 + category: main + optional: false +- name: _openmp_mutex + version: '4.5' + manager: conda + platform: linux-64 + dependencies: + _libgcc_mutex: '0.1' + libgomp: '>=7.5.0' + url: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 + hash: + md5: 73aaf86a425cc6e73fcf236a5a46396d + sha256: fbe2c5e56a653bebb982eda4876a9178aedfc2b545f25d0ce9c4c0b508253d22 + category: main + optional: false +- name: astropy + version: 5.0.6 + manager: conda + platform: linux-64 + dependencies: + importlib-metadata: '' + libgcc-ng: '>=12' + numpy: '>=1.21.6,<2.0a0' + packaging: '>=19.0' + pyerfa: '>=2.0' + python: '>=3.10,<3.11.0a0' + python_abi: 3.10.* + pyyaml: '>=3.13' + url: https://conda.anaconda.org/conda-forge/linux-64/astropy-5.0.6-py310h0a54255_0.conda + hash: + md5: e74faee5fc6bad19f5a243d64b317b01 + sha256: 81cadf84f7a8a37abd9c680cca6f5640d3406f45fc2b9fe1aa9a1e330dc5d9d8 + category: dev + optional: true +- name: aws-c-auth + version: 0.7.8 + manager: conda + platform: linux-64 + dependencies: + aws-c-cal: '>=0.6.9,<0.6.10.0a0' + aws-c-common: '>=0.9.10,<0.9.11.0a0' + aws-c-http: '>=0.7.15,<0.7.16.0a0' + aws-c-io: '>=0.13.36,<0.13.37.0a0' + aws-c-sdkutils: '>=0.1.13,<0.1.14.0a0' + libgcc-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.7.8-hcf8cf63_3.conda + hash: + md5: 8634ef2e79e9c8065fd69ead7902d27c + sha256: b1cb74ebd72cf3b2aeb7e17697ef1404cd6911b149af8c63a6432c810943c4c0 + category: test + optional: true +- name: aws-c-cal + version: 0.6.9 + manager: conda + platform: linux-64 + dependencies: + aws-c-common: '>=0.9.10,<0.9.11.0a0' + libgcc-ng: '>=12' + openssl: '>=3.2.0,<4.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.6.9-h5d48c4d_2.conda + hash: + md5: 9e51dfd5da37c1817d2a850188861987 + sha256: ec56734a24eee51e2f89bec3d686dd2c4dbb09d0305248b1d14e4c748065dc23 + category: test + optional: true +- name: aws-c-common + version: 0.9.10 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.9.10-hd590300_0.conda + hash: + md5: 93729f7a54b25cb135ac2b67ea3a7603 + sha256: dba8a20acedc6bc3574e4068c196969881462ad831aae267d25fbc9409785a6b + category: test + optional: true +- name: aws-c-compression + version: 0.2.17 + manager: conda + platform: linux-64 + dependencies: + aws-c-common: '>=0.9.10,<0.9.11.0a0' + libgcc-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.2.17-h7f92143_7.conda + hash: + md5: c55a1a0c1419fcdfce6d21c41b0f92ab + sha256: ce508018c1109d4e5c6b65695639deaa2beea31edc39145bb810efb13ffed2c3 + category: test + optional: true +- name: aws-c-event-stream + version: 0.3.2 + manager: conda + platform: linux-64 + dependencies: + aws-c-common: '>=0.9.10,<0.9.11.0a0' + aws-c-io: '>=0.13.36,<0.13.37.0a0' + aws-checksums: '>=0.1.17,<0.1.18.0a0' + libgcc-ng: '>=12' + libstdcxx-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.3.2-h0bcb0bb_8.conda + hash: + md5: 21dafb60b5854f82b196f32e5857dec6 + sha256: d2855cd791a95648ac773aa6561c61f9e77450f123c8aa82eea1d66e90d5bfb1 + category: test + optional: true +- name: aws-c-http + version: 0.7.15 + manager: conda + platform: linux-64 + dependencies: + aws-c-cal: '>=0.6.9,<0.6.10.0a0' + aws-c-common: '>=0.9.10,<0.9.11.0a0' + aws-c-compression: '>=0.2.17,<0.2.18.0a0' + aws-c-io: '>=0.13.36,<0.13.37.0a0' + libgcc-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.7.15-hd268abd_0.conda + hash: + md5: 7fe29e473e2d4491610ccb51285218c9 + sha256: 8c1bafb14d320e395f27fa5d3f9f5bb41ab0bd0a1659c90c3dd4294cf562781b + category: test + optional: true +- name: aws-c-io + version: 0.13.36 + manager: conda + platform: linux-64 + dependencies: + aws-c-cal: '>=0.6.9,<0.6.10.0a0' + aws-c-common: '>=0.9.10,<0.9.11.0a0' + libgcc-ng: '>=12' + s2n: '>=1.4.1,<1.4.2.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.13.36-hb3b01f7_3.conda + hash: + md5: e699c37931ecbb452a6d074c1c738b07 + sha256: ed17d57f20e62b77680d91eec3b98ce4f208ad58deb87c1ca6114942ecb9aecd + category: test + optional: true +- name: aws-c-mqtt + version: 0.10.0 + manager: conda + platform: linux-64 + dependencies: + aws-c-common: '>=0.9.10,<0.9.11.0a0' + aws-c-http: '>=0.7.15,<0.7.16.0a0' + aws-c-io: '>=0.13.36,<0.13.37.0a0' + libgcc-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.10.0-hbafccad_1.conda + hash: + md5: b587eb2e3fa4cabcf5b6ea7fd06f1043 + sha256: 6ef1dce310845f3e16b83d3143acf2980a0aaf920d8ba73d2cc67a3f4e4d6307 + category: test + optional: true +- name: aws-c-s3 + version: 0.4.7 + manager: conda + platform: linux-64 + dependencies: + aws-c-auth: '>=0.7.8,<0.7.9.0a0' + aws-c-cal: '>=0.6.9,<0.6.10.0a0' + aws-c-common: '>=0.9.10,<0.9.11.0a0' + aws-c-http: '>=0.7.15,<0.7.16.0a0' + aws-c-io: '>=0.13.36,<0.13.37.0a0' + aws-checksums: '>=0.1.17,<0.1.18.0a0' + libgcc-ng: '>=12' + openssl: '>=3.2.0,<4.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.4.7-h47b1690_0.conda + hash: + md5: 28ae93dc948e6615aa9923087e90d117 + sha256: 540d341fa9abb470d089ac75a6ce5018315480f1de8f51559cd4d75d9342a308 + category: test + optional: true +- name: aws-c-sdkutils + version: 0.1.13 + manager: conda + platform: linux-64 + dependencies: + aws-c-common: '>=0.9.10,<0.9.11.0a0' + libgcc-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.1.13-h7f92143_0.conda + hash: + md5: a4a83424ad4eab023c6e5b4adf264006 + sha256: 8696e7023fde7c4588db8aedd08ffc0b4041c8449bd9edd50f237534cbcfac93 + category: test + optional: true +- name: aws-checksums + version: 0.1.17 + manager: conda + platform: linux-64 + dependencies: + aws-c-common: '>=0.9.10,<0.9.11.0a0' + libgcc-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.1.17-h7f92143_6.conda + hash: + md5: 46bd4e9c2fd10de83bae22f0bb71139b + sha256: ac2082211e7d5fd3036f9abd7e398ef67d5327efb3808f17a30fcab59acacbfb + category: test + optional: true +- name: aws-crt-cpp + version: 0.25.1 + manager: conda + platform: linux-64 + dependencies: + aws-c-auth: '>=0.7.8,<0.7.9.0a0' + aws-c-cal: '>=0.6.9,<0.6.10.0a0' + aws-c-common: '>=0.9.10,<0.9.11.0a0' + aws-c-event-stream: '>=0.3.2,<0.3.3.0a0' + aws-c-http: '>=0.7.15,<0.7.16.0a0' + aws-c-io: '>=0.13.36,<0.13.37.0a0' + aws-c-mqtt: '>=0.10.0,<0.10.1.0a0' + aws-c-s3: '>=0.4.7,<0.4.8.0a0' + aws-c-sdkutils: '>=0.1.13,<0.1.14.0a0' + libgcc-ng: '>=12' + libstdcxx-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.25.1-h938c79c_1.conda + hash: + md5: c70b011e813c4d4d829eda9ac4e6c2ee + sha256: 294ec4ad5a7e348df66653eedab42c9bb85685ed0103a1ccd5e20af949ca3ee7 + category: test + optional: true +- name: aws-sdk-cpp + version: 1.11.210 + manager: conda + platform: linux-64 + dependencies: + aws-c-common: '>=0.9.10,<0.9.11.0a0' + aws-c-event-stream: '>=0.3.2,<0.3.3.0a0' + aws-checksums: '>=0.1.17,<0.1.18.0a0' + aws-crt-cpp: '>=0.25.1,<0.25.2.0a0' + libcurl: '>=8.5.0,<9.0a0' + libgcc-ng: '>=12' + libstdcxx-ng: '>=12' + libzlib: '>=1.2.13,<1.3.0a0' + openssl: '>=3.2.0,<4.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.210-h13098a4_6.conda + hash: + md5: ad76e86bdef91dcbbbaecff38850bfe6 + sha256: 0cd728a2bfaa63d29a2d78d7c33170b7ba9d19f3175d22e744f35ee61a12aa43 + category: test + optional: true +- name: bzip2 + version: 1.0.8 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hd590300_5.conda + hash: + md5: 69b8b6202a07720f448be700e300ccf4 + sha256: 242c0c324507ee172c0e0dd2045814e746bb303d1eb78870d182ceb0abc726a8 + category: main + optional: false +- name: c-ares + version: 1.24.0 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.24.0-hd590300_0.conda + hash: + md5: f5842b88e9cbfa177abfaeacd457a45d + sha256: b68b0611d1c9d0222b56d5fe3d634e7a26979c3aef30f5f48b1593e7249e8f7a + category: test + optional: true +- name: ca-certificates + version: 2023.11.17 + manager: conda + platform: linux-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2023.11.17-hbcca054_0.conda + hash: + md5: 01ffc8d36f9eba0ce0b3c1955fa780ee + sha256: fb4b9f4b7d885002db0b93e22f44b5b03791ef3d4efdc9d0662185a0faafd6b6 + category: main + optional: false +- name: gflags + version: 2.2.2 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=7.5.0' + libstdcxx-ng: '>=7.5.0' + url: https://conda.anaconda.org/conda-forge/linux-64/gflags-2.2.2-he1b5a44_1004.tar.bz2 + hash: + md5: cddaf2c63ea4a5901cf09524c490ecdc + sha256: a853c0cacf53cfc59e1bca8d6e5cdfe9f38fce836f08c2a69e35429c2a492e77 + category: test + optional: true +- name: glog + version: 0.6.0 + manager: conda + platform: linux-64 + dependencies: + gflags: '>=2.2.2,<2.3.0a0' + libgcc-ng: '>=10.3.0' + libstdcxx-ng: '>=10.3.0' + url: https://conda.anaconda.org/conda-forge/linux-64/glog-0.6.0-h6f12383_0.tar.bz2 + hash: + md5: b31f3565cb84435407594e548a2fb7b2 + sha256: 888cbcfb67f6e3d88a4c4ab9d26c9a406f620c4101a35dc6d2dbadb95f2221d4 + category: test + optional: true +- name: icu + version: '73.2' + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + libstdcxx-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/icu-73.2-h59595ed_0.conda + hash: + md5: cc47e1facc155f91abd89b11e48e72ff + sha256: e12fd90ef6601da2875ebc432452590bc82a893041473bc1c13ef29001a73ea8 + category: test + optional: true +- name: importlib-metadata + version: 7.0.1 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.8' + zipp: '>=0.5' + url: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-7.0.1-pyha770c72_0.conda + hash: + md5: 746623a787e06191d80a2133e5daff17 + sha256: e72d05f171f4567004c9360a838e9d5df21e23dcfeb945066b53a6e5f754b861 + category: dev + optional: true +- name: keyutils + version: 1.6.1 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=10.3.0' + url: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2 + hash: + md5: 30186d27e2c9fa62b45fb1476b7200e3 + sha256: 150c05a6e538610ca7c43beb3a40d65c90537497a4f6a5f4d15ec0451b6f5ebb + category: test + optional: true +- name: krb5 + version: 1.21.2 + manager: conda + platform: linux-64 + dependencies: + keyutils: '>=1.6.1,<2.0a0' + libedit: '>=3.1.20191231,<4.0a0' + libgcc-ng: '>=12' + libstdcxx-ng: '>=12' + openssl: '>=3.1.2,<4.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.2-h659d440_0.conda + hash: + md5: cd95826dbd331ed1be26bdf401432844 + sha256: 259bfaae731989b252b7d2228c1330ef91b641c9d68ff87dae02cbae682cb3e4 + category: test + optional: true +- name: ld_impl_linux-64 + version: '2.40' + manager: conda + platform: linux-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-h41732ed_0.conda + hash: + md5: 7aca3059a1729aa76c597603f10b0dd3 + sha256: f6cc89d887555912d6c61b295d398cff9ec982a3417d38025c45d5dd9b9e79cd + category: main + optional: false +- name: libabseil + version: '20230802.1' + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + libstdcxx-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20230802.1-cxx17_h59595ed_0.conda + hash: + md5: 2785ddf4cb0e7e743477991d64353947 + sha256: 8729021a93e67bb93b4e73ef0a132499db516accfea11561b667635bcd0507e7 + category: test + optional: true +- name: libarrow + version: 14.0.2 + manager: conda + platform: linux-64 + dependencies: + aws-crt-cpp: '>=0.25.1,<0.25.2.0a0' + aws-sdk-cpp: '>=1.11.210,<1.11.211.0a0' + bzip2: '>=1.0.8,<2.0a0' + glog: '>=0.6.0,<0.7.0a0' + libabseil: '>=20230802.1,<20230803.0a0' + libbrotlidec: '>=1.1.0,<1.2.0a0' + libbrotlienc: '>=1.1.0,<1.2.0a0' + libgcc-ng: '>=12' + libgoogle-cloud: '>=2.12.0,<2.13.0a0' + libre2-11: '>=2023.6.2,<2024.0a0' + libstdcxx-ng: '>=12' + libutf8proc: '>=2.8.0,<3.0a0' + libzlib: '>=1.2.13,<1.3.0a0' + lz4-c: '>=1.9.3,<1.10.0a0' + orc: '>=1.9.2,<1.9.3.0a0' + re2: '' + snappy: '>=1.1.10,<2.0a0' + zstd: '>=1.5.5,<1.6.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libarrow-14.0.2-h67bfddd_1_cpu.conda + hash: + md5: bf05b4bf521556a7154dd31a660e242b + sha256: 1b9175c9320e021e03934b9afd12d31a306203d5edb331056544ea8360e73be5 + category: test + optional: true +- name: libarrow-acero + version: 14.0.2 + manager: conda + platform: linux-64 + dependencies: + libarrow: 14.0.2 + libgcc-ng: '>=12' + libstdcxx-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-14.0.2-h59595ed_1_cpu.conda + hash: + md5: 88b9c13ca2fb2b8f5f70f61acc3251d8 + sha256: dec96d09290a96ed45a8c7c2fbf85cbf21fa0d02e8cccd208bc13156ff04dc87 + category: test + optional: true +- name: libarrow-dataset + version: 14.0.2 + manager: conda + platform: linux-64 + dependencies: + libarrow: 14.0.2 + libarrow-acero: 14.0.2 + libgcc-ng: '>=12' + libparquet: 14.0.2 + libstdcxx-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-14.0.2-h59595ed_1_cpu.conda + hash: + md5: 33ce67701dfa38269f988a259a0d51a7 + sha256: b831a6d9bfbdced3bc17087e10040383bd418a494610f798ed724c711371cbf7 + category: test + optional: true +- name: libarrow-flight + version: 14.0.2 + manager: conda + platform: linux-64 + dependencies: + libabseil: '>=20230802.1,<20230803.0a0' + libarrow: 14.0.2 + libgcc-ng: '>=12' + libgrpc: '>=1.59.3,<1.60.0a0' + libprotobuf: '>=4.24.4,<4.24.5.0a0' + libstdcxx-ng: '>=12' + ucx: '>=1.15.0,<1.16.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libarrow-flight-14.0.2-h120cb0d_1_cpu.conda + hash: + md5: 6baf92cf598e612b61712c490a1295fa + sha256: cc925667f54905b3f7e3bc9130b03c27c8f6ffd2e29d3185f1ff9b2dbc9584b1 + category: test + optional: true +- name: libarrow-flight-sql + version: 14.0.2 + manager: conda + platform: linux-64 + dependencies: + libarrow: 14.0.2 + libarrow-flight: 14.0.2 + libgcc-ng: '>=12' + libprotobuf: '>=4.24.4,<4.24.5.0a0' + libstdcxx-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/libarrow-flight-sql-14.0.2-h61ff412_1_cpu.conda + hash: + md5: 728e140b4e3ddab927d7ab3cb7dfbd55 + sha256: 182444209930c07e62eaae93fd4f4361169fea6a48e6c3d200a54ebeff2793c7 + category: test + optional: true +- name: libarrow-gandiva + version: 14.0.2 + manager: conda + platform: linux-64 + dependencies: + libarrow: 14.0.2 + libgcc-ng: '>=12' + libllvm15: '>=15.0.7,<15.1.0a0' + libre2-11: '>=2023.6.2,<2024.0a0' + libstdcxx-ng: '>=12' + libutf8proc: '>=2.8.0,<3.0a0' + openssl: '>=3.2.0,<4.0a0' + re2: '' + url: https://conda.anaconda.org/conda-forge/linux-64/libarrow-gandiva-14.0.2-hacb8726_1_cpu.conda + hash: + md5: 9a34553fd8038983a2e34216666ba113 + sha256: 861c50e340cf163a1c29cda6da62e7c73dede62a7a64c78306df5a3994c62bed + category: test + optional: true +- name: libarrow-substrait + version: 14.0.2 + manager: conda + platform: linux-64 + dependencies: + libarrow: 14.0.2 + libarrow-acero: 14.0.2 + libarrow-dataset: 14.0.2 + libgcc-ng: '>=12' + libprotobuf: '>=4.24.4,<4.24.5.0a0' + libstdcxx-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-14.0.2-h61ff412_1_cpu.conda + hash: + md5: c20bad7b4f07f2037e0c0a6e77d5ad4a + sha256: 88bc211364d5c45ed97ae81c88b2a418e9361b49f3781e54811bfecf42eee997 + category: test + optional: true +- name: libblas + version: 3.9.0 + manager: conda + platform: linux-64 + dependencies: + libopenblas: '>=0.3.25,<1.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-20_linux64_openblas.conda + hash: + md5: 2b7bb4f7562c8cf334fc2e20c2d28abc + sha256: 8a0ee1de693a9b3da4a11b95ec81b40dd434bd01fa1f5f38f8268cd2146bf8f0 + category: dev + optional: true +- name: libblas + version: 3.9.0 + manager: conda + platform: linux-64 + dependencies: + libopenblas: '>=0.3.25,<1.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-20_linux64_openblas.conda + hash: + md5: 2b7bb4f7562c8cf334fc2e20c2d28abc + sha256: 8a0ee1de693a9b3da4a11b95ec81b40dd434bd01fa1f5f38f8268cd2146bf8f0 + category: test + optional: true +- name: libbrotlicommon + version: 1.1.0 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hd590300_1.conda + hash: + md5: aec6c91c7371c26392a06708a73c70e5 + sha256: 40f29d1fab92c847b083739af86ad2f36d8154008cf99b64194e4705a1725d78 + category: test + optional: true +- name: libbrotlidec + version: 1.1.0 + manager: conda + platform: linux-64 + dependencies: + libbrotlicommon: 1.1.0 + libgcc-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hd590300_1.conda + hash: + md5: f07002e225d7a60a694d42a7bf5ff53f + sha256: 86fc861246fbe5ad85c1b6b3882aaffc89590a48b42d794d3d5c8e6d99e5f926 + category: test + optional: true +- name: libbrotlienc + version: 1.1.0 + manager: conda + platform: linux-64 + dependencies: + libbrotlicommon: 1.1.0 + libgcc-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hd590300_1.conda + hash: + md5: 5fc11c6020d421960607d821310fcd4d + sha256: f751b8b1c4754a2a8dfdc3b4040fa7818f35bbf6b10e905a47d3a194b746b071 + category: test + optional: true +- name: libcblas + version: 3.9.0 + manager: conda + platform: linux-64 + dependencies: + libblas: 3.9.0 + url: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-20_linux64_openblas.conda + hash: + md5: 36d486d72ab64ffea932329a1d3729a3 + sha256: 0e34fb0f82262f02fcb279ab4a1db8d50875dc98e3019452f8f387e6bf3c0247 + category: dev + optional: true +- name: libcblas + version: 3.9.0 + manager: conda + platform: linux-64 + dependencies: + libblas: 3.9.0 + url: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-20_linux64_openblas.conda + hash: + md5: 36d486d72ab64ffea932329a1d3729a3 + sha256: 0e34fb0f82262f02fcb279ab4a1db8d50875dc98e3019452f8f387e6bf3c0247 + category: test + optional: true +- name: libcrc32c + version: 1.1.2 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=9.4.0' + libstdcxx-ng: '>=9.4.0' + url: https://conda.anaconda.org/conda-forge/linux-64/libcrc32c-1.1.2-h9c3ff4c_0.tar.bz2 + hash: + md5: c965a5aa0d5c1c37ffc62dff36e28400 + sha256: fd1d153962764433fe6233f34a72cdeed5dcf8a883a85769e8295ce940b5b0c5 + category: test + optional: true +- name: libcurl + version: 8.5.0 + manager: conda + platform: linux-64 + dependencies: + krb5: '>=1.21.2,<1.22.0a0' + libgcc-ng: '>=12' + libnghttp2: '>=1.58.0,<2.0a0' + libssh2: '>=1.11.0,<2.0a0' + libzlib: '>=1.2.13,<1.3.0a0' + openssl: '>=3.2.0,<4.0a0' + zstd: '>=1.5.5,<1.6.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.5.0-hca28451_0.conda + hash: + md5: 7144d5a828e2cae218e0e3c98d8a0aeb + sha256: 00a6bea5ff90ca58eeb15ebc98e08ffb88bddaff27396bb62640064f59d29cf0 + category: test + optional: true +- name: libedit + version: 3.1.20191231 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=7.5.0' + ncurses: '>=6.2,<7.0.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2.tar.bz2 + hash: + md5: 4d331e44109e3f0e19b4cb8f9b82f3e1 + sha256: a57d37c236d8f7c886e01656f4949d9dcca131d2a0728609c6f7fa338b65f1cf + category: test + optional: true +- name: libev + version: '4.33' + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda + hash: + md5: 172bf1cd1ff8629f2b1179945ed45055 + sha256: 1cd6048169fa0395af74ed5d8f1716e22c19a81a8a36f934c110ca3ad4dd27b4 + category: test + optional: true +- name: libevent + version: 2.1.12 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + openssl: '>=3.1.1,<4.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libevent-2.1.12-hf998b51_1.conda + hash: + md5: a1cfcc585f0c42bf8d5546bb1dfb668d + sha256: 2e14399d81fb348e9d231a82ca4d816bf855206923759b69ad006ba482764131 + category: test + optional: true +- name: libffi + version: 3.4.2 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=9.4.0' + url: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2 + hash: + md5: d645c6d2ac96843a2bfaccd2d62b3ac3 + sha256: ab6e9856c21709b7b517e940ae7028ae0737546122f83c2aa5d692860c3b149e + category: main + optional: false +- name: libgcc-ng + version: 13.2.0 + manager: conda + platform: linux-64 + dependencies: + _libgcc_mutex: '0.1' + _openmp_mutex: '>=4.5' + url: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.2.0-h807b86a_3.conda + hash: + md5: 23fdf1fef05baeb7eadc2aed5fb0011f + sha256: 5e88f658e07a30ab41b154b42c59f079b168acfa9551a75bdc972099453f4105 + category: main + optional: false +- name: libgfortran-ng + version: 13.2.0 + manager: conda + platform: linux-64 + dependencies: + libgfortran5: 13.2.0 + url: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-13.2.0-h69a702a_3.conda + hash: + md5: 73031c79546ad06f1fe62e57fdd021bc + sha256: 5b918950b84605b6865de438757f507b1eff73c96fd562f7022c80028b088c14 + category: dev + optional: true +- name: libgfortran-ng + version: 13.2.0 + manager: conda + platform: linux-64 + dependencies: + libgfortran5: 13.2.0 + url: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-13.2.0-h69a702a_3.conda + hash: + md5: 73031c79546ad06f1fe62e57fdd021bc + sha256: 5b918950b84605b6865de438757f507b1eff73c96fd562f7022c80028b088c14 + category: test + optional: true +- name: libgfortran5 + version: 13.2.0 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=13.2.0' + url: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-13.2.0-ha4646dd_3.conda + hash: + md5: c714d905cdfa0e70200f68b80cc04764 + sha256: 0084a1d29a4f8ee3b8edad80eb6c42e5f0480f054f28cf713fb314bebb347a50 + category: dev + optional: true +- name: libgfortran5 + version: 13.2.0 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=13.2.0' + url: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-13.2.0-ha4646dd_3.conda + hash: + md5: c714d905cdfa0e70200f68b80cc04764 + sha256: 0084a1d29a4f8ee3b8edad80eb6c42e5f0480f054f28cf713fb314bebb347a50 + category: test + optional: true +- name: libgomp + version: 13.2.0 + manager: conda + platform: linux-64 + dependencies: + _libgcc_mutex: '0.1' + url: https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.2.0-h807b86a_3.conda + hash: + md5: 7124cbb46b13d395bdde68f2d215c989 + sha256: 6ebedee39b6bbbc969715d0d7fa4b381cce67e1139862604ffa393f821c08e81 + category: main + optional: false +- name: libgoogle-cloud + version: 2.12.0 + manager: conda + platform: linux-64 + dependencies: + libabseil: '>=20230802.1,<20230803.0a0' + libcrc32c: '>=1.1.2,<1.2.0a0' + libcurl: '>=8.4.0,<9.0a0' + libgcc-ng: '>=12' + libgrpc: '>=1.59.2,<1.60.0a0' + libprotobuf: '>=4.24.4,<4.24.5.0a0' + libstdcxx-ng: '>=12' + openssl: '>=3.1.4,<4.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-2.12.0-h5206363_4.conda + hash: + md5: b5eb63d2683102be45d17c55021282f6 + sha256: 82a7d211d0df165b073f9e8ba6d789c4b1c7c4882d546ca12d40f201fc3496fc + category: test + optional: true +- name: libgrpc + version: 1.59.3 + manager: conda + platform: linux-64 + dependencies: + c-ares: '>=1.21.0,<2.0a0' + libabseil: '>=20230802.1,<20230803.0a0' + libgcc-ng: '>=12' + libprotobuf: '>=4.24.4,<4.24.5.0a0' + libre2-11: '>=2023.6.2,<2024.0a0' + libstdcxx-ng: '>=12' + libzlib: '>=1.2.13,<1.3.0a0' + openssl: '>=3.1.4,<4.0a0' + re2: '' + url: https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.59.3-hd6c4280_0.conda + hash: + md5: 896c137eaf0c22f2fef58332eb4a4b83 + sha256: 3f95a2792e565b628cb284de92017a37a1cddc4a3f83453b8f75d9adc9f8cfdd + category: test + optional: true +- name: libiconv + version: '1.17' + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-hd590300_2.conda + hash: + md5: d66573916ffcf376178462f1b61c941e + sha256: 8ac2f6a9f186e76539439e50505d98581472fedb347a20e7d1f36429849f05c9 + category: test + optional: true +- name: liblapack + version: 3.9.0 + manager: conda + platform: linux-64 + dependencies: + libblas: 3.9.0 + url: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-20_linux64_openblas.conda + hash: + md5: 6fabc51f5e647d09cc010c40061557e0 + sha256: ad7745b8d0f2ccb9c3ba7aaa7167d62fc9f02e45eb67172ae5f0dfb5a3b1a2cc + category: dev + optional: true +- name: liblapack + version: 3.9.0 + manager: conda + platform: linux-64 + dependencies: + libblas: 3.9.0 + url: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-20_linux64_openblas.conda + hash: + md5: 6fabc51f5e647d09cc010c40061557e0 + sha256: ad7745b8d0f2ccb9c3ba7aaa7167d62fc9f02e45eb67172ae5f0dfb5a3b1a2cc + category: test + optional: true +- name: libllvm15 + version: 15.0.7 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + libstdcxx-ng: '>=12' + libxml2: '>=2.12.1,<2.13.0a0' + libzlib: '>=1.2.13,<1.3.0a0' + zstd: '>=1.5.5,<1.6.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libllvm15-15.0.7-hb3ce162_4.conda + hash: + md5: 8a35df3cbc0c8b12cc8af9473ae75eef + sha256: e71584c0f910140630580fdd0a013029a52fd31e435192aea2aa8d29005262d1 + category: test + optional: true +- name: libnghttp2 + version: 1.58.0 + manager: conda + platform: linux-64 + dependencies: + c-ares: '>=1.23.0,<2.0a0' + libev: '>=4.33,<5.0a0' + libgcc-ng: '>=12' + libstdcxx-ng: '>=12' + libzlib: '>=1.2.13,<1.3.0a0' + openssl: '>=3.2.0,<4.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.58.0-h47da74e_1.conda + hash: + md5: 700ac6ea6d53d5510591c4344d5c989a + sha256: 1910c5306c6aa5bcbd623c3c930c440e9c77a5a019008e1487810e3c1d3716cb + category: test + optional: true +- name: libnl + version: 3.9.0 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/libnl-3.9.0-hd590300_0.conda + hash: + md5: d27c451db4f1d3c983c78167d2fdabc2 + sha256: aae03117811e704c3f3666e8374dd2e632f1d78bef0c27330e7298b24004819e + category: test + optional: true +- name: libnsl + version: 2.0.1 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda + hash: + md5: 30fd6e37fe21f86f4bd26d6ee73eeec7 + sha256: 26d77a3bb4dceeedc2a41bd688564fe71bf2d149fdcf117049970bc02ff1add6 + category: main + optional: false +- name: libnuma + version: 2.0.16 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/libnuma-2.0.16-h0b41bf4_1.conda + hash: + md5: 28bfe2cb11357ccc5be21101a6b7ce86 + sha256: 814a50cba215548ec3ebfb53033ffb9b3b070b2966570ff44910b8d9ba1c359d + category: test + optional: true +- name: libopenblas + version: 0.3.25 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + libgfortran-ng: '' + libgfortran5: '>=12.3.0' + url: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.25-pthreads_h413a1c8_0.conda + hash: + md5: d172b34a443b95f86089e8229ddc9a17 + sha256: 628564517895ee1b09cf72c817548bd80ef1acce6a8214a8520d9f7b44c4cfaf + category: dev + optional: true +- name: libopenblas + version: 0.3.25 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + libgfortran-ng: '' + libgfortran5: '>=12.3.0' + url: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.25-pthreads_h413a1c8_0.conda + hash: + md5: d172b34a443b95f86089e8229ddc9a17 + sha256: 628564517895ee1b09cf72c817548bd80ef1acce6a8214a8520d9f7b44c4cfaf + category: test + optional: true +- name: libparquet + version: 14.0.2 + manager: conda + platform: linux-64 + dependencies: + libarrow: 14.0.2 + libgcc-ng: '>=12' + libstdcxx-ng: '>=12' + libthrift: '>=0.19.0,<0.19.1.0a0' + openssl: '>=3.2.0,<4.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libparquet-14.0.2-h352af49_1_cpu.conda + hash: + md5: fa6229e7af6ded84817b0e15beb216d0 + sha256: 7f6a87daa1e6980ef7c066845cc340ccaeb3e2f3e05277c62f56bb7b8ebfa722 + category: test + optional: true +- name: libprotobuf + version: 4.24.4 + manager: conda + platform: linux-64 + dependencies: + libabseil: '>=20230802.1,<20230803.0a0' + libgcc-ng: '>=12' + libstdcxx-ng: '>=12' + libzlib: '>=1.2.13,<1.3.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-4.24.4-hf27288f_0.conda + hash: + md5: 1a0287ab734591ad63603734f923016b + sha256: 3e0f6454190abb27edd2aeb724688ee440de133edb02cbb17d5609ba36aa8be0 + category: test + optional: true +- name: libre2-11 + version: 2023.06.02 + manager: conda + platform: linux-64 + dependencies: + libabseil: '>=20230802.1,<20230803.0a0' + libgcc-ng: '>=12' + libstdcxx-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/libre2-11-2023.06.02-h7a70373_0.conda + hash: + md5: c0e7eacd9694db3ef5ef2979a7deea70 + sha256: 22b0b2169c80b65665ba0d6418bd5d3d4c7d89915ee0f9613403efe871c27db8 + category: test + optional: true +- name: libsqlite + version: 3.44.2 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + libzlib: '>=1.2.13,<1.3.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.44.2-h2797004_0.conda + hash: + md5: 3b6a9f225c3dbe0d24f4fedd4625c5bf + sha256: ee2c4d724a3ed60d5b458864d66122fb84c6ce1df62f735f90d8db17b66cd88a + category: main + optional: false +- name: libssh2 + version: 1.11.0 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + libzlib: '>=1.2.13,<1.3.0a0' + openssl: '>=3.1.1,<4.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.0-h0841786_0.conda + hash: + md5: 1f5a58e686b13bcfde88b93f547d23fe + sha256: 50e47fd9c4f7bf841a11647ae7486f65220cfc988ec422a4475fe8d5a823824d + category: test + optional: true +- name: libstdcxx-ng + version: 13.2.0 + manager: conda + platform: linux-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.2.0-h7e041cc_3.conda + hash: + md5: 937eaed008f6bf2191c5fe76f87755e9 + sha256: 6c6c49efedcc5709a66f19fb6b26b69c6a5245310fd1d9a901fd5e38aaf7f882 + category: dev + optional: true +- name: libstdcxx-ng + version: 13.2.0 + manager: conda + platform: linux-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.2.0-h7e041cc_3.conda + hash: + md5: 937eaed008f6bf2191c5fe76f87755e9 + sha256: 6c6c49efedcc5709a66f19fb6b26b69c6a5245310fd1d9a901fd5e38aaf7f882 + category: test + optional: true +- name: libthrift + version: 0.19.0 + manager: conda + platform: linux-64 + dependencies: + libevent: '>=2.1.12,<2.1.13.0a0' + libgcc-ng: '>=12' + libstdcxx-ng: '>=12' + libzlib: '>=1.2.13,<1.3.0a0' + openssl: '>=3.1.3,<4.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libthrift-0.19.0-hb90f79a_1.conda + hash: + md5: 8cdb7d41faa0260875ba92414c487e2d + sha256: 719add2cf20d144ef9962c57cd0f77178259bdb3aae1cded2e2b2b7c646092f5 + category: test + optional: true +- name: libutf8proc + version: 2.8.0 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/libutf8proc-2.8.0-h166bdaf_0.tar.bz2 + hash: + md5: ede4266dc02e875fe1ea77b25dd43747 + sha256: 49082ee8d01339b225f7f8c60f32a2a2c05fe3b16f31b554b4fb2c1dea237d1c + category: test + optional: true +- name: libuuid + version: 2.38.1 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda + hash: + md5: 40b61aab5c7ba9ff276c41cfffe6b80b + sha256: 787eb542f055a2b3de553614b25f09eefb0a0931b0c87dbcce6efdfd92f04f18 + category: main + optional: false +- name: libxcrypt + version: 4.4.36 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda + hash: + md5: 5aa797f8787fe7a17d1b0821485b5adc + sha256: 6ae68e0b86423ef188196fff6207ed0c8195dd84273cb5623b85aa08033a410c + category: main + optional: false +- name: libxml2 + version: 2.12.3 + manager: conda + platform: linux-64 + dependencies: + icu: '>=73.2,<74.0a0' + libgcc-ng: '>=12' + libiconv: '>=1.17,<2.0a0' + libzlib: '>=1.2.13,<1.3.0a0' + xz: '>=5.2.6,<6.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.3-h232c23b_0.conda + hash: + md5: bc6ac4c0cea148d924f621985bc3892b + sha256: 31dd757689a1a28e42021208b6c740e84bcfdfee213a39c9bcc0dfbc33acf7a5 + category: test + optional: true +- name: libzlib + version: 1.2.13 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.13-hd590300_5.conda + hash: + md5: f36c115f1ee199da648e0597ec2047ad + sha256: 370c7c5893b737596fd6ca0d9190c9715d89d888b8c88537ae1ef168c25e82e4 + category: main + optional: false +- name: lz4-c + version: 1.9.4 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + libstdcxx-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.4-hcb278e6_0.conda + hash: + md5: 318b08df404f9c9be5712aaa5a6f0bb0 + sha256: 1b4c105a887f9b2041219d57036f72c4739ab9e9fe5a1486f094e58c76b31f5f + category: test + optional: true +- name: ncurses + version: '6.4' + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.4-h59595ed_2.conda + hash: + md5: 7dbaa197d7ba6032caf7ae7f32c1efa0 + sha256: 91cc03f14caf96243cead96c76fe91ab5925a695d892e83285461fb927dece5e + category: main + optional: false +- name: numpy + version: 1.26.3 + manager: conda + platform: linux-64 + dependencies: + 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.10,<3.11.0a0' + python_abi: 3.10.* + url: https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.3-py310hb13e2d6_0.conda + hash: + md5: e5e9c6f112d581cdf465b8ca861cb14f + sha256: bd199b12daf8713d2975e9b940e913cbb25527e5502c98bbf7acf16f992f6e66 + category: dev + optional: true +- name: numpy + version: 1.26.3 + manager: conda + platform: linux-64 + dependencies: + 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.10,<3.11.0a0' + python_abi: 3.10.* + url: https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.3-py310hb13e2d6_0.conda + hash: + md5: e5e9c6f112d581cdf465b8ca861cb14f + sha256: bd199b12daf8713d2975e9b940e913cbb25527e5502c98bbf7acf16f992f6e66 + category: test + optional: true +- name: openssl + version: 3.2.0 + manager: conda + platform: linux-64 + dependencies: + ca-certificates: '' + libgcc-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.2.0-hd590300_1.conda + hash: + md5: 603827b39ea2b835268adb8c821b8570 + sha256: 80efc6f429bd8e622d999652e5cba2ca56fcdb9c16a439d2ce9b4313116e4a87 + category: main + optional: false +- name: orc + version: 1.9.2 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + libprotobuf: '>=4.24.4,<4.24.5.0a0' + libstdcxx-ng: '>=12' + libzlib: '>=1.2.13,<1.3.0a0' + lz4-c: '>=1.9.3,<1.10.0a0' + snappy: '>=1.1.10,<2.0a0' + zstd: '>=1.5.5,<1.6.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/orc-1.9.2-h4b38347_0.conda + hash: + md5: 6e6f990b097d3e237e18a8e321d08484 + sha256: a06dd76bc0f2f99f5db5e348298c906007c3aa9e31b963f71d16e63f770b900b + category: test + optional: true +- name: packaging + version: '23.2' + manager: conda + platform: linux-64 + dependencies: + python: '>=3.7' + url: https://conda.anaconda.org/conda-forge/noarch/packaging-23.2-pyhd8ed1ab_0.conda + hash: + md5: 79002079284aa895f883c6b7f3f88fd6 + sha256: 69b3ace6cca2dab9047b2c24926077d81d236bef45329d264b394001e3c3e52f + category: dev + optional: true +- name: pandas + version: 2.0.3 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + libstdcxx-ng: '>=12' + numpy: '>=1.21.6,<2.0a0' + python: '>=3.10,<3.11.0a0' + python-dateutil: '>=2.8.1' + python-tzdata: '>=2022a' + python_abi: 3.10.* + pytz: '>=2020.1' + url: https://conda.anaconda.org/conda-forge/linux-64/pandas-2.0.3-py310h7cbd5c2_1.conda + hash: + md5: 11e0099d4571b4974c04386e4ce679ed + sha256: e8937c160b6eb469c5d80971046b25ed305fd97a8b1d6880de7c4a660cd245c3 + category: dev + optional: true +- name: pandas + version: 2.0.3 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + libstdcxx-ng: '>=12' + numpy: '>=1.21.6,<2.0a0' + python: '>=3.10,<3.11.0a0' + python-dateutil: '>=2.8.1' + python-tzdata: '>=2022a' + python_abi: 3.10.* + pytz: '>=2020.1' + url: https://conda.anaconda.org/conda-forge/linux-64/pandas-2.0.3-py310h7cbd5c2_1.conda + hash: + md5: 11e0099d4571b4974c04386e4ce679ed + sha256: e8937c160b6eb469c5d80971046b25ed305fd97a8b1d6880de7c4a660cd245c3 + category: test + optional: true +- name: py4j + version: 0.10.9.7 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.6' + url: https://conda.anaconda.org/conda-forge/noarch/py4j-0.10.9.7-pyhd8ed1ab_0.tar.bz2 + hash: + md5: 0f01a52cf858aef86632a8ab08011c0c + sha256: 5a1d134f58dbc2c77b7985069a5485fe4aa09d49f1b545087913af62559ff738 + category: test + optional: true +- name: pyarrow + version: 14.0.2 + manager: conda + platform: linux-64 + dependencies: + libarrow: 14.0.2 + libarrow-acero: 14.0.2 + libarrow-dataset: 14.0.2 + libarrow-flight: 14.0.2 + libarrow-flight-sql: 14.0.2 + libarrow-gandiva: 14.0.2 + libarrow-substrait: 14.0.2 + libgcc-ng: '>=12' + libparquet: 14.0.2 + libstdcxx-ng: '>=12' + numpy: '>=1.22.4,<2.0a0' + python: '>=3.10,<3.11.0a0' + python_abi: 3.10.* + url: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-14.0.2-py310hf9e7431_1_cpu.conda + hash: + md5: 95e12597a6ef3a7e94d11c08209163f7 + sha256: 30cb8cb4cb1431a6ad82036c8af9078896119ff198548e80193e504471e1fe2b + category: test + optional: true +- name: pyerfa + version: 2.0.1.1 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + numpy: '>=1.22.4,<2.0a0' + python: '>=3.10,<3.11.0a0' + python_abi: 3.10.* + url: https://conda.anaconda.org/conda-forge/linux-64/pyerfa-2.0.1.1-py310h1f7b6fc_0.conda + hash: + md5: 3e94f020268f6bd6c4a8a52b81aeee84 + sha256: a31812c6f9cf621459fa8991d53b7e887483a57ace65e47fb4336cd638a20328 + category: dev + optional: true +- name: pyspark + version: 3.4.1 + manager: conda + platform: linux-64 + dependencies: + numpy: '>=1.15' + pandas: '>=1.0.5' + py4j: 0.10.9.7 + pyarrow: '>=1.0.0' + python: '>=3.7' + url: https://conda.anaconda.org/conda-forge/noarch/pyspark-3.4.1-pyhd8ed1ab_0.conda + hash: + md5: 24382abab6ce7a37cc3d4739d46cc293 + sha256: c90e81d90ef181db914959a67a1a6d2b1def36c1df492531b6ab693638df279c + category: test + optional: true +- name: python + version: 3.10.13 + manager: conda + platform: linux-64 + dependencies: + bzip2: '>=1.0.8,<2.0a0' + ld_impl_linux-64: '>=2.36.1' + libffi: '>=3.4,<4.0a0' + libgcc-ng: '>=12' + libnsl: '>=2.0.1,<2.1.0a0' + libsqlite: '>=3.44.2,<4.0a0' + libuuid: '>=2.38.1,<3.0a0' + libxcrypt: '>=4.4.36' + libzlib: '>=1.2.13,<1.3.0a0' + ncurses: '>=6.4,<7.0a0' + openssl: '>=3.2.0,<4.0a0' + readline: '>=8.2,<9.0a0' + tk: '>=8.6.13,<8.7.0a0' + tzdata: '' + xz: '>=5.2.6,<6.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/python-3.10.13-hd12c33a_1_cpython.conda + hash: + md5: ed38140af93f81319ebc472fbcf16cca + sha256: 4234c8e301737aa245d12c8fb44a4128005795e42883977c29cca3f34c71a1eb + category: main + optional: false +- name: python-dateutil + version: 2.8.2 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.6' + six: '>=1.5' + url: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.8.2-pyhd8ed1ab_0.tar.bz2 + hash: + md5: dd999d1cc9f79e67dbb855c8924c7984 + sha256: 54d7785c7678166aa45adeaccfc1d2b8c3c799ca2dc05d4a82bb39b1968bd7da + category: dev + optional: true +- name: python-dateutil + version: 2.8.2 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.6' + six: '>=1.5' + url: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.8.2-pyhd8ed1ab_0.tar.bz2 + hash: + md5: dd999d1cc9f79e67dbb855c8924c7984 + sha256: 54d7785c7678166aa45adeaccfc1d2b8c3c799ca2dc05d4a82bb39b1968bd7da + category: test + optional: true +- name: python-tzdata + version: '2023.4' + manager: conda + platform: linux-64 + dependencies: + python: '>=3.6' + url: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2023.4-pyhd8ed1ab_0.conda + hash: + md5: c79cacf8a06a51552fc651652f170208 + sha256: d2381037bf362c78654a8ece0e0f54715e09113448ddd7ed837f688536cbf176 + category: dev + optional: true +- name: python-tzdata + version: '2023.4' + manager: conda + platform: linux-64 + dependencies: + python: '>=3.6' + url: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2023.4-pyhd8ed1ab_0.conda + hash: + md5: c79cacf8a06a51552fc651652f170208 + sha256: d2381037bf362c78654a8ece0e0f54715e09113448ddd7ed837f688536cbf176 + category: test + optional: true +- name: python_abi + version: '3.10' + manager: conda + platform: linux-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.10-4_cp310.conda + hash: + md5: 26322ec5d7712c3ded99dd656142b8ce + sha256: 456bec815bfc2b364763084d08b412fdc4c17eb9ccc66a36cb775fa7ac3cbaec + category: dev + optional: true +- name: python_abi + version: '3.10' + manager: conda + platform: linux-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.10-4_cp310.conda + hash: + md5: 26322ec5d7712c3ded99dd656142b8ce + sha256: 456bec815bfc2b364763084d08b412fdc4c17eb9ccc66a36cb775fa7ac3cbaec + category: test + optional: true +- name: pytz + version: 2023.3.post1 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.6' + url: https://conda.anaconda.org/conda-forge/noarch/pytz-2023.3.post1-pyhd8ed1ab_0.conda + hash: + md5: c93346b446cd08c169d843ae5fc0da97 + sha256: 6b680e63d69aaf087cd43ca765a23838723ef59b0a328799e6363eb13f52c49e + category: dev + optional: true +- name: pytz + version: 2023.3.post1 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.6' + url: https://conda.anaconda.org/conda-forge/noarch/pytz-2023.3.post1-pyhd8ed1ab_0.conda + hash: + md5: c93346b446cd08c169d843ae5fc0da97 + sha256: 6b680e63d69aaf087cd43ca765a23838723ef59b0a328799e6363eb13f52c49e + category: test + optional: true +- name: pyyaml + version: 6.0.1 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + python: '>=3.10,<3.11.0a0' + python_abi: 3.10.* + yaml: '>=0.2.5,<0.3.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.1-py310h2372a71_1.conda + hash: + md5: bb010e368de4940771368bc3dc4c63e7 + sha256: aa78ccddb0a75fa722f0f0eb3537c73ee1219c9dd46cea99d6b9eebfdd780f3d + category: dev + optional: true +- name: rdma-core + version: '49.0' + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc-ng: '>=12' + libnl: '>=3.9.0,<4.0a0' + libstdcxx-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/rdma-core-49.0-hd3aeb46_2.conda + hash: + md5: 855579013120ad3078e7d5dcadb643e1 + sha256: 3f541042f7b51484a996eab53493b9242969bc406614eba76ceecfa4f4a0822a + category: test + optional: true +- name: re2 + version: 2023.06.02 + manager: conda + platform: linux-64 + dependencies: + libre2-11: 2023.06.02 + url: https://conda.anaconda.org/conda-forge/linux-64/re2-2023.06.02-h2873b5e_0.conda + hash: + md5: bb2d5e593ef13fe4aff0bc9440f945ae + sha256: 3e0bfb04b6d43312d711c5b49dbc3c7660b2e6e681ed504b1b322794462a1bcd + category: test + optional: true +- name: readline + version: '8.2' + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + ncurses: '>=6.3,<7.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda + hash: + md5: 47d31b792659ce70f470b5c82fdfb7a4 + sha256: 5435cf39d039387fbdc977b0a762357ea909a7694d9528ab40f005e9208744d7 + category: main + optional: false +- name: s2n + version: 1.4.1 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + openssl: '>=3.2.0,<4.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/s2n-1.4.1-h06160fa_0.conda + hash: + md5: 54ae57d17d038b6a7aa7fdb55350d338 + sha256: 6f21a270e5fcf824d71b637ea26e389e469b3dc44a7e51062c27556c6e771b37 + category: test + optional: true +- name: six + version: 1.16.0 + manager: conda + platform: linux-64 + dependencies: + python: '' + url: https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2 + hash: + md5: e5f25f8dbc060e9a8d912e432202afc2 + sha256: a85c38227b446f42c5b90d9b642f2c0567880c15d72492d8da074a59c8f91dd6 + category: dev + optional: true +- name: six + version: 1.16.0 + manager: conda + platform: linux-64 + dependencies: + python: '' + url: https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2 + hash: + md5: e5f25f8dbc060e9a8d912e432202afc2 + sha256: a85c38227b446f42c5b90d9b642f2c0567880c15d72492d8da074a59c8f91dd6 + category: test + optional: true +- name: snappy + version: 1.1.10 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + libstdcxx-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/snappy-1.1.10-h9fff704_0.conda + hash: + md5: e6d228cd0bb74a51dd18f5bfce0b4115 + sha256: 02219f2382b4fe39250627dade087a4412d811936a5a445636b7260477164eac + category: test + optional: true +- name: tk + version: 8.6.13 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + libzlib: '>=1.2.13,<1.3.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda + hash: + md5: d453b98d9c83e71da0741bb0ff4d76bc + sha256: e0569c9caa68bf476bead1bed3d79650bb080b532c64a4af7d8ca286c08dea4e + category: main + optional: false +- name: tzdata + version: 2023d + manager: conda + platform: linux-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/noarch/tzdata-2023d-h0c530f3_0.conda + hash: + md5: 8dee24b8be2d9ff81e7bd4d7d97ff1b0 + sha256: 04f2ab3e36f2015841551415bf16bf62933bd94b7085d4be5493b388e95a9c3d + category: main + optional: false +- name: ucx + version: 1.15.0 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + libnuma: '>=2.0.16,<3.0a0' + libstdcxx-ng: '>=12' + rdma-core: '>=49' + url: https://conda.anaconda.org/conda-forge/linux-64/ucx-1.15.0-h75e419f_2.conda + hash: + md5: 5798de4587dc70fa6db81663e79f176a + sha256: 81fdea1a5ee5075bf4cbdc665b08d0e2ee9d3476f9d16acc58e2bbd913e9197b + category: test + optional: true +- name: xz + version: 5.2.6 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2 + hash: + md5: 2161070d867d1b1204ea749c8eec4ef0 + sha256: 03a6d28ded42af8a347345f82f3eebdd6807a08526d47899a42d62d319609162 + category: main + optional: false +- name: yaml + version: 0.2.5 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=9.4.0' + url: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2 + hash: + md5: 4cb3ad778ec2d5a7acbdf254eb1c42ae + sha256: a4e34c710eeb26945bdbdaba82d3d74f60a78f54a874ec10d373811a5d217535 + category: dev + optional: true +- name: zipp + version: 3.17.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.8' + url: https://conda.anaconda.org/conda-forge/noarch/zipp-3.17.0-pyhd8ed1ab_0.conda + hash: + md5: 2e4d6bc0b14e10f895fc6791a7d9b26a + sha256: bced1423fdbf77bca0a735187d05d9b9812d2163f60ab426fc10f11f92ecbe26 + category: dev + optional: true +- name: zstd + version: 1.5.5 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + libstdcxx-ng: '>=12' + libzlib: '>=1.2.13,<1.3.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.5-hfc55251_0.conda + hash: + md5: 04b88013080254850d6c01ed54810589 + sha256: 607cbeb1a533be98ba96cf5cdf0ddbb101c78019f1fda063261871dad6248609 + category: test + optional: true diff --git a/tests/test-multiple-categories/dev.yml b/tests/test-multiple-categories/dev.yml new file mode 100644 index 00000000..403c859f --- /dev/null +++ b/tests/test-multiple-categories/dev.yml @@ -0,0 +1,9 @@ +category: dev +channels: + - conda-forge +platforms: + - linux-64 + +dependencies: + - pandas =2.0 + - astropy =5.0 diff --git a/tests/test-multiple-categories/main.yml b/tests/test-multiple-categories/main.yml new file mode 100644 index 00000000..08af990e --- /dev/null +++ b/tests/test-multiple-categories/main.yml @@ -0,0 +1,8 @@ +category: main +channels: + - conda-forge +platforms: + - linux-64 + +dependencies: + - python =3.10 diff --git a/tests/test-multiple-categories/test.yml b/tests/test-multiple-categories/test.yml new file mode 100644 index 00000000..17f27a01 --- /dev/null +++ b/tests/test-multiple-categories/test.yml @@ -0,0 +1,8 @@ +category: test +channels: + - conda-forge +platforms: + - linux-64 + +dependencies: + - pyspark =3.4 diff --git a/tests/test_conda_lock.py b/tests/test_conda_lock.py index 00d8cbac..05d2dfa2 100644 --- a/tests/test_conda_lock.py +++ b/tests/test_conda_lock.py @@ -2023,7 +2023,6 @@ def test_install_with_pip_deps( tmp_path: Path, conda_exe: str, install_with_pip_deps_lockfile: Path, - monkeypatch: "pytest.MonkeyPatch", caplog, install_lock, ): @@ -2057,6 +2056,56 @@ def test_install_with_pip_deps( subprocess.check_call([str(python), "-c", "import requests"]) +@pytest.fixture +def install_multiple_categories_lockfile(tmp_path: Path): + return clone_test_dir("test-multiple-categories", tmp_path).joinpath( + "conda-lock.yml" + ) + + +@pytest.mark.parametrize("categories", [[], ["dev"], ["test"], ["dev", "test"]]) +def test_install_multiple_subcategories( + tmp_path: Path, + conda_exe: str, + install_multiple_categories_lockfile: Path, + categories: List[str], + install_lock, +): + root_prefix = tmp_path / "root_prefix" + root_prefix.mkdir(exist_ok=True) + prefix = root_prefix / "test_env" + + context: ContextManager + if sys.platform.lower().startswith("linux"): + context = contextlib.nullcontext() + else: + # since by default we do platform validation we would expect this to fail + context = pytest.raises(PlatformValidationError) + + with context: + install( + conda=str(conda_exe), + prefix=str(prefix), + lock_file=install_multiple_categories_lockfile, + extras=categories, + ) + + if sys.platform.lower().startswith("linux"): + packages_to_check = ["python"] + if "dev" in categories or "test" in categories: + packages_to_check += ["numpy", "pandas"] + if "dev" in categories: + packages_to_check.append("astropy") + if "test" in categories: + packages_to_check.append("pyspark") + + for package in packages_to_check: + assert _check_package_installed( + package=package, + prefix=str(prefix), + ), f"Package {package} does not exist in {prefix} environment" + + @pytest.mark.parametrize("kind", ["explicit", "env"]) def test_warn_on_explicit_lock_with_pip_deps( kind: Literal["explicit", "env"],