diff --git a/Cargo.lock b/Cargo.lock index 51055d33d..6367ae4e7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -479,9 +479,9 @@ dependencies = [ [[package]] name = "aws-sdk-ssooidc" -version = "1.89.0" +version = "1.88.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "695dc67bb861ccb8426c9129b91c30e266a0e3d85650cafdf62fcca14c8fd338" +checksum = "9a68d675582afea0e94d38b6ca9c5aaae4ca14f1d36faa6edb19b42e687e70d7" dependencies = [ "aws-credential-types", "aws-runtime", @@ -1008,9 +1008,9 @@ checksum = "36f64beae40a84da1b4b26ff2761a5b895c12adc41dc25aaee1c4f2bbfe97a6e" [[package]] name = "bstr" -version = "1.12.1" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63044e1ae8e69f3b5a92c736ca6269b8d12fa7efe39bf34ddb06d102cf0e2cab" +checksum = "234113d19d0d7d613b40e86fb654acf958910802bcceab913a4f9e7cda03b1a4" dependencies = [ "memchr", "regex-automata", @@ -1080,9 +1080,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.43" +version = "1.2.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "739eb0f94557554b3ca9a86d2d37bebd49c5e6d0c1d2bda35ba5bdac830befc2" +checksum = "ac9fe6cdbb24b6ade63616c0a0688e45bb56732262c158df3c0c4bea4ca47cb7" dependencies = [ "find-msvc-tools", "jobserver", @@ -1637,9 +1637,9 @@ dependencies = [ [[package]] name = "deranged" -version = "0.5.5" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ececcb659e7ba858fb4f10388c250a7252eb0a27373f1a72b8748afdd248e587" +checksum = "a41953f86f8a05768a6cda24def994fd2f424b04ec5c719cf89989779f199071" dependencies = [ "powerfmt", "serde_core", @@ -1985,9 +1985,9 @@ checksum = "1d674e81391d1e1ab681a28d99df07927c6d4aa5b027d7da16ba32d1d21ecd99" [[package]] name = "flate2" -version = "1.1.5" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfe33edd8e85a12a67454e37f8c75e730830d83e313556ab9ebf9ee7fbeb3bfb" +checksum = "dc5a4e564e38c699f2880d3fda590bedc2e69f3f84cd48b457bd892ce61d0aa9" dependencies = [ "crc32fast", "libz-rs-sys", @@ -2268,9 +2268,9 @@ dependencies = [ [[package]] name = "google-cloud-auth" -version = "1.1.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f084abe65c3bdde490bf4a4eebc7e103637fb3ac4b101d09508dd5bf12ce82b1" +checksum = "c5a0f0ef58bc79d636e95db264939a6f3fd80951f77743f2b7ec55e22171150d" dependencies = [ "async-trait", "base64", @@ -2290,9 +2290,9 @@ dependencies = [ [[package]] name = "google-cloud-gax" -version = "1.2.0" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a36f8701dac18c2cbedf588d15ee4ce5c018da531c2e74e9ad043cbd32b0fccb" +checksum = "58bc95deae841e35758fa5caba317092f26940135c7184570feb691a1844db08" dependencies = [ "base64", "bytes", @@ -2464,11 +2464,11 @@ dependencies = [ [[package]] name = "home" -version = "0.5.12" +version = "0.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc627f471c528ff0c4a49e1d5e60450c8f6461dd6d10ba9dcd3a61d3dff7728d" +checksum = "589533453244b0995c858700322199b2becb13b627df2851f64a2775d024abcf" dependencies = [ - "windows-sys 0.61.2", + "windows-sys 0.59.0", ] [[package]] @@ -2834,9 +2834,9 @@ dependencies = [ [[package]] name = "indicatif" -version = "0.18.2" +version = "0.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ade6dfcba0dfb62ad59e59e7241ec8912af34fd29e0e743e3db992bd278e8b65" +checksum = "e2e0ddd45fe8e09ee1a607920b12271f8a5528a41ecaf6e1d1440d6493315b6b" dependencies = [ "console 0.16.1", "portable-atomic", @@ -2958,9 +2958,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.82" +version = "0.3.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b011eec8cc36da2aab2d5cff675ec18454fad408585853910a202391cf9f8e65" +checksum = "ec48937a97411dcb524a265206ccd4c90bb711fca92b2792c407f268825b9305" dependencies = [ "once_cell", "wasm-bindgen", @@ -4017,22 +4017,23 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.103" +version = "1.0.102" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00ec45f49e8" +checksum = "8e0f6df8eaa422d97d72edcd152e1451618fed47fabbdbd5a8864167b1d4aff7" dependencies = [ "unicode-ident", ] [[package]] name = "proptest" -version = "1.9.0" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bee689443a2bd0a16ab0348b52ee43e3b2d1b1f931c8aa5c9f8de4c86fbe8c40" +checksum = "2bb0be07becd10686a0bb407298fb425360a5c44a663774406340c59a22de4ce" dependencies = [ "bit-set", "bit-vec", "bitflags 2.10.0", + "lazy_static", "num-traits", "rand 0.9.2", "rand_chacha 0.9.0", @@ -5335,9 +5336,9 @@ dependencies = [ [[package]] name = "rustls-pki-types" -version = "1.13.0" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94182ad936a0c91c324cd46c6511b9510ed16af436d7b5bab34beab0afd55f7a" +checksum = "229a4a4c221013e7e1f1a043678c5cc39fe5171437c88fb47151a21e6f5b5c79" dependencies = [ "web-time", "zeroize", @@ -6013,9 +6014,9 @@ dependencies = [ [[package]] name = "target-triple" -version = "1.0.0" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "591ef38edfb78ca4771ee32cf494cb8771944bee237a9b91fc9c1424ac4b777b" +checksum = "1ac9aa371f599d22256307c24a9d748c041e548cbf599f35d890f9d365361790" [[package]] name = "temp-env" @@ -6501,9 +6502,9 @@ checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" [[package]] name = "trybuild" -version = "1.0.113" +version = "1.0.112" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "559b6a626c0815c942ac98d434746138b4f89ddd6a1b8cbb168c6845fb3376c5" +checksum = "4d66678374d835fe847e0dc8348fde2ceb5be4a7ec204437d8367f0d8df266a5" dependencies = [ "dissimilar", "glob", @@ -6625,6 +6626,15 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" +[[package]] +name = "upgrade-lock-file" +version = "0.1.0" +dependencies = [ + "anyhow", + "clap", + "rattler_lock", +] + [[package]] name = "url" version = "2.5.7" @@ -6758,9 +6768,9 @@ dependencies = [ [[package]] name = "wasm-bindgen" -version = "0.2.105" +version = "0.2.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da95793dfc411fbbd93f5be7715b0578ec61fe87cb1a42b12eb625caa5c5ea60" +checksum = "c1da10c01ae9f1ae40cbfac0bac3b1e724b320abfcf52229f80b547c0d250e2d" dependencies = [ "cfg-if", "once_cell", @@ -6769,11 +6779,25 @@ dependencies = [ "wasm-bindgen-shared", ] +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "671c9a5a66f49d8a47345ab942e2cb93c7d1d0339065d4f8139c486121b43b19" +dependencies = [ + "bumpalo", + "log", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + [[package]] name = "wasm-bindgen-futures" -version = "0.4.55" +version = "0.4.54" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "551f88106c6d5e7ccc7cd9a16f312dd3b5d36ea8b4954304657d5dfba115d4a0" +checksum = "7e038d41e478cc73bae0ff9b36c60cff1c98b8f38f8d7e8061e79ee63608ac5c" dependencies = [ "cfg-if", "js-sys", @@ -6784,9 +6808,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.105" +version = "0.2.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04264334509e04a7bf8690f2384ef5265f05143a4bff3889ab7a3269adab59c2" +checksum = "7ca60477e4c59f5f2986c50191cd972e3a50d8a95603bc9434501cf156a9a119" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -6794,22 +6818,22 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.105" +version = "0.2.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "420bc339d9f322e562942d52e115d57e950d12d88983a14c79b86859ee6c7ebc" +checksum = "9f07d2f20d4da7b26400c9f4a0511e6e0345b040694e8a75bd41d578fa4421d7" dependencies = [ - "bumpalo", "proc-macro2", "quote", "syn", + "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.105" +version = "0.2.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76f218a38c84bcb33c25ec7059b07847d465ce0e0a76b995e134a45adcb6af76" +checksum = "bad67dc8b2a1a6e5448428adec4c3e84c43e561d8c9ee8a9e5aabeb193ec41d1" dependencies = [ "unicode-ident", ] @@ -6858,9 +6882,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.82" +version = "0.3.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a1f95c0d03a47f4ae1f7a64643a6bb97465d9b740f0fa8f90ea33915c99a9a1" +checksum = "9367c417a924a74cae129e6a2ae3b47fabb1f8995595ab474029da749a8be120" dependencies = [ "js-sys", "wasm-bindgen", diff --git a/crates/rattler_lock/src/builder.rs b/crates/rattler_lock/src/builder.rs index 5564226fb..46635bed1 100644 --- a/crates/rattler_lock/src/builder.rs +++ b/crates/rattler_lock/src/builder.rs @@ -2,19 +2,19 @@ use std::{ borrow::Cow, - collections::{BTreeSet, HashMap}, + collections::{BTreeMap, BTreeSet, HashMap}, sync::Arc, }; use indexmap::{IndexMap, IndexSet}; use pep508_rs::ExtraName; -use rattler_conda_types::{Platform, Version}; +use rattler_conda_types::Platform; use crate::{ file_format_version::FileFormatVersion, Channel, CondaBinaryData, CondaPackageData, CondaSourceData, EnvironmentData, EnvironmentPackageData, LockFile, LockFileInner, LockedPackageRef, PypiIndexes, PypiPackageData, PypiPackageEnvironmentData, SolveOptions, - UrlOrPath, + UrlOrPath, VariantValue, }; /// Information about a single locked package in an environment. @@ -54,7 +54,7 @@ impl LockedPackage { /// might not be the normalized name. pub fn name(&self) -> &str { match self { - LockedPackage::Conda(data) => data.record().name.as_source(), + LockedPackage::Conda(data) => data.name().as_source(), LockedPackage::Pypi(data, _) => data.name.as_ref(), } } @@ -127,22 +127,30 @@ pub struct LockFileBuilder { /// A unique identifier for a conda package. This is used to deduplicate /// packages. This only includes the unique identifying aspects of a package. #[derive(Debug, Hash, Eq, PartialEq)] -struct UniqueCondaIdentifier { - location: UrlOrPath, - normalized_name: String, - version: Version, - build: String, - subdir: String, +enum UniqueCondaIdentifier { + Binary { + location: UrlOrPath, + }, + Source { + location: UrlOrPath, + name: rattler_conda_types::PackageName, + variants: BTreeMap, + dev: bool, + }, } impl<'a> From<&'a CondaPackageData> for UniqueCondaIdentifier { fn from(value: &'a CondaPackageData) -> Self { - Self { - location: value.location().clone(), - normalized_name: value.record().name.as_normalized().to_string(), - version: value.record().version.version().clone(), - build: value.record().build.clone(), - subdir: value.record().subdir.clone(), + match value { + CondaPackageData::Binary(pkg) => UniqueCondaIdentifier::Binary { + location: pkg.location.clone(), + }, + CondaPackageData::Source(pkg) => UniqueCondaIdentifier::Source { + location: pkg.location.clone(), + name: pkg.name.clone(), + variants: pkg.variants.clone(), + dev: pkg.dev, + }, } } } diff --git a/crates/rattler_lock/src/conda.rs b/crates/rattler_lock/src/conda.rs index 5652aa4f9..ef5aeb558 100644 --- a/crates/rattler_lock/src/conda.rs +++ b/crates/rattler_lock/src/conda.rs @@ -1,14 +1,65 @@ use crate::source::SourceLocation; use crate::UrlOrPath; use rattler_conda_types::{ - ChannelUrl, MatchSpec, Matches, NamelessMatchSpec, PackageRecord, RepoDataRecord, + ChannelUrl, MatchSpec, Matches, NamelessMatchSpec, PackageName, PackageRecord, PackageUrl, + RepoDataRecord, VersionWithSource, }; use rattler_digest::Sha256Hash; -use std::collections::BTreeMap; +use serde::{Deserialize, Serialize}; +use std::collections::{BTreeMap, BTreeSet}; +use std::fmt::Display; use std::{borrow::Cow, cmp::Ordering, hash::Hash}; use typed_path::Utf8TypedPathBuf; use url::Url; +/// Represents a conda-build variant value. +/// +/// Variants are used in conda-build to specify different build configurations. +/// They can be strings (e.g., "3.11" for python version), integers (e.g., 1 for feature flags), +/// or booleans (e.g., true/false for optional features). +#[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] +#[serde(untagged)] +pub enum VariantValue { + /// String variant value (most common, e.g., python version "3.11") + String(String), + /// Integer variant value (e.g., for numeric feature flags) + Int(i64), + /// Boolean variant value (e.g., for on/off features) + Bool(bool), +} + +impl PartialOrd for VariantValue { + fn partial_cmp(&self, other: &Self) -> Option { + Some(self.cmp(other)) + } +} + +impl Ord for VariantValue { + fn cmp(&self, other: &Self) -> Ordering { + #[allow(clippy::match_same_arms)] + match (self, other) { + (VariantValue::String(a), VariantValue::String(b)) => a.cmp(b), + (VariantValue::Int(a), VariantValue::Int(b)) => a.cmp(b), + (VariantValue::Bool(a), VariantValue::Bool(b)) => a.cmp(b), + // Define ordering between different types for deterministic sorting + (VariantValue::String(_), _) => Ordering::Less, + (_, VariantValue::String(_)) => Ordering::Greater, + (VariantValue::Int(_), VariantValue::Bool(_)) => Ordering::Less, + (VariantValue::Bool(_), VariantValue::Int(_)) => Ordering::Greater, + } + } +} + +impl Display for VariantValue { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + VariantValue::String(s) => write!(f, "{s}"), + VariantValue::Int(i) => write!(f, "{i}"), + VariantValue::Bool(b) => write!(f, "{b}"), + } + } +} + /// A locked conda dependency can be either a binary package or a source /// package. /// @@ -19,6 +70,7 @@ use url::Url; /// be installed. Although the source package is not built, it does contain /// dependency information through the [`PackageRecord`] struct. #[derive(Clone, Debug, PartialEq, Eq, Hash)] +#[allow(clippy::large_enum_variant)] pub enum CondaPackageData { /// A binary package. A binary package is identified by looking at the /// location or filename of the package file and seeing if it represents a @@ -38,11 +90,60 @@ impl CondaPackageData { } } - /// Returns the dependency information of the package. - pub fn record(&self) -> &PackageRecord { + /// Returns the name of the package (works for both binary and source packages). + pub fn name(&self) -> &PackageName { + match self { + CondaPackageData::Binary(data) => &data.package_record.name, + CondaPackageData::Source(data) => &data.name, + } + } + + /// Returns the version of the package (if available). + pub fn version(&self) -> Option<&VersionWithSource> { + match self { + CondaPackageData::Binary(data) => Some(&data.package_record.version), + CondaPackageData::Source(data) => data.version.as_ref(), + } + } + + /// Returns the build string of the package (if available). + pub fn build(&self) -> Option<&str> { match self { - CondaPackageData::Binary(data) => &data.package_record, - CondaPackageData::Source(data) => &data.package_record, + CondaPackageData::Binary(data) => Some(&data.package_record.build), + CondaPackageData::Source(_data) => None, + } + } + + /// Returns the build number of the package (if available). + pub fn build_number(&self) -> Option { + match self { + CondaPackageData::Binary(data) => Some(data.package_record.build_number), + CondaPackageData::Source(_data) => None, + } + } + + /// Returns the listed dependencies of the package + pub fn depends(&self) -> &[String] { + match self { + CondaPackageData::Binary(data) => &data.package_record.depends, + CondaPackageData::Source(data) => &data.depends, + } + } + + /// Returns the listed dependencies of the package + pub fn purls(&self) -> Option<&BTreeSet> { + match self { + CondaPackageData::Binary(data) => data.package_record.purls.as_ref(), + CondaPackageData::Source(data) => data.purls.as_ref(), + } + } + + /// Returns whether this is a dev package (only contributes dependencies, not installed). + /// Only source packages can be dev packages; binary packages always return false. + pub fn is_dev(&self) -> bool { + match self { + CondaPackageData::Binary(_) => false, + CondaPackageData::Source(data) => data.dev, } } @@ -196,21 +297,51 @@ pub enum PackageBuildSource { /// Information about a source package stored in the lock-file. #[derive(Clone, Debug, PartialEq, Eq, Hash)] pub struct CondaSourceData { - /// The package record. - pub package_record: PackageRecord, + /// The name of the package + pub name: PackageName, + + /// The version of the package (optional) + pub version: Option, /// The location of the package. This can be a URL or a local path. pub location: UrlOrPath, - /// Package build source location for reproducible builds - pub package_build_source: Option, + /// Conda-build variants used to disambiguate between multiple source packages + /// at the same location. This is a map from variant name to variant value. + /// Used in lock file format V7 and later. + pub variants: BTreeMap, - /// The input hash of the package - pub input: Option, + /// Specification of packages this package depends on + pub depends: Vec, + + /// Additional constraints on packages + pub constrains: Vec, + + /// Experimental: additional dependencies grouped by feature name + pub experimental_extra_depends: BTreeMap>, + + /// The specific license of the package + pub license: Option, + + /// Package identifiers of packages that are equivalent to this package but + /// from other ecosystems (e.g., `PyPI`) + pub purls: Option>, /// Information about packages that should be built from source instead of binary. /// This maps from a normalized package name to location of the source. pub sources: BTreeMap, + + /// The input hash of the package + pub input: Option, + + /// Package build source location for reproducible builds + pub package_build_source: Option, + + /// Python site-packages path if this is a Python package + pub python_site_packages_path: Option, + + /// Whether this is a dev package (only contributes dependencies, not installed). + pub dev: bool, } impl From for CondaPackageData { @@ -221,18 +352,13 @@ impl From for CondaPackageData { impl CondaSourceData { pub(crate) fn merge(&self, other: &Self) -> Cow<'_, Self> { - if self.location == other.location { - let package_record_merge = - merge_package_record(&self.package_record, &other.package_record); + if self.location == other.location && self.name == other.name && self.dev == other.dev { let package_build_source_merge = merge_package_build_source(&self.package_build_source, &other.package_build_source); - // Return an owned version if either merge produced an owned result - if matches!(package_record_merge, Cow::Owned(_)) - || matches!(package_build_source_merge, Cow::Owned(_)) - { + // Return an owned version if merge produced an owned result + if matches!(package_build_source_merge, Cow::Owned(_)) { return Cow::Owned(Self { - package_record: package_record_merge.into_owned(), package_build_source: package_build_source_merge.into_owned(), ..self.clone() }); @@ -254,15 +380,6 @@ pub struct InputHash { pub globs: Vec, } -impl AsRef for CondaPackageData { - fn as_ref(&self) -> &PackageRecord { - match self { - Self::Binary(data) => &data.package_record, - Self::Source(data) => &data.package_record, - } - } -} - impl PartialOrd for CondaPackageData { fn partial_cmp(&self, other: &Self) -> Option { Some(self.cmp(other)) @@ -271,17 +388,36 @@ impl PartialOrd for CondaPackageData { impl Ord for CondaPackageData { fn cmp(&self, other: &Self) -> Ordering { - let pkg_a: &PackageRecord = self.as_ref(); - let pkg_b: &PackageRecord = other.as_ref(); let location_a = self.location(); let location_b = other.location(); - location_a - .cmp(location_b) - .then_with(|| pkg_a.name.cmp(&pkg_b.name)) - .then_with(|| pkg_a.version.cmp(&pkg_b.version)) - .then_with(|| pkg_a.build.cmp(&pkg_b.build)) - .then_with(|| pkg_a.subdir.cmp(&pkg_b.subdir)) + // First compare by location + location_a.cmp(location_b).then_with(|| { + // Then compare by name + self.name().cmp(other.name()).then_with(|| { + // For binary packages, also compare version, build, and subdir + match (self.as_binary(), other.as_binary()) { + (Some(a), Some(b)) => a + .package_record + .version + .cmp(&b.package_record.version) + .then_with(|| a.package_record.build.cmp(&b.package_record.build)) + .then_with(|| a.package_record.subdir.cmp(&b.package_record.subdir)), + // Source packages only compare by location and name + // If one is source and one is binary, sort source first + (None, Some(_)) => Ordering::Less, + (Some(_), None) => Ordering::Greater, + (None, None) => { + // Both are source packages, compare by variants + if let (Some(a), Some(b)) = (self.as_source(), other.as_source()) { + a.variants.cmp(&b.variants) + } else { + Ordering::Equal + } + } + } + }) + }) } } @@ -335,61 +471,57 @@ pub enum ConversionError { impl CondaPackageData { /// Returns true if this package satisfies the given `spec`. + /// + /// Only binary packages can be matched against specs. Source packages + /// don't have version/build/subdir information and cannot satisfy specs. pub fn satisfies(&self, spec: &MatchSpec) -> bool { - self.matches(spec) + match self { + Self::Binary(binary) => binary.matches(spec), + Self::Source(_) => false, + } } } -impl Matches for CondaPackageData { +impl Matches for CondaBinaryData { fn matches(&self, spec: &MatchSpec) -> bool { // Check if the name matches if let Some(name) = &spec.name { - if name != &self.record().name { + if name != &self.package_record.name { return false; } } // Check if the channel matches if let Some(channel) = &spec.channel { - match self { - CondaPackageData::Binary(binary) => { - if let Some(record_channel) = &binary.channel { - if &channel.base_url != record_channel { - return false; - } - } - } - CondaPackageData::Source(_) => { + if let Some(record_channel) = &self.channel { + if &channel.base_url != record_channel { return false; } + } else { + return false; } } // Check if the record matches - spec.matches(self.record()) + spec.matches(&self.package_record) } } -impl Matches for CondaPackageData { +impl Matches for CondaBinaryData { fn matches(&self, spec: &NamelessMatchSpec) -> bool { // Check if the channel matches if let Some(channel) = &spec.channel { - match self { - CondaPackageData::Binary(binary) => { - if let Some(record_channel) = &binary.channel { - if &channel.base_url != record_channel { - return false; - } - } - } - CondaPackageData::Source(_) => { + if let Some(record_channel) = &self.channel { + if &channel.base_url != record_channel { return false; } + } else { + return false; } } // Check if the record matches - spec.matches(self.record()) + spec.matches(&self.package_record) } } diff --git a/crates/rattler_lock/src/file_format_version.rs b/crates/rattler_lock/src/file_format_version.rs index bf6ac2416..c9b51a503 100644 --- a/crates/rattler_lock/src/file_format_version.rs +++ b/crates/rattler_lock/src/file_format_version.rs @@ -26,6 +26,9 @@ pub enum FileFormatVersion { /// fields are derived from the location and the `kind` is merged with the location. V6 = 6, + + /// Source package format overhaul (variants-based disambiguation). + V7 = 7, } impl Display for FileFormatVersion { @@ -36,7 +39,7 @@ impl Display for FileFormatVersion { impl FileFormatVersion { /// The latest version this crate supports. - pub const LATEST: Self = FileFormatVersion::V6; + pub const LATEST: Self = FileFormatVersion::V7; /// Returns true if the pypi indexes should be present in the lock file if /// there are pypi packages present. @@ -67,6 +70,7 @@ impl TryFrom for FileFormatVersion { 4 => Self::V4, 5 => Self::V5, 6 => Self::V6, + 7 => Self::V7, _ => { return Err(ParseCondaLockError::IncompatibleVersion { lock_file_version: value, diff --git a/crates/rattler_lock/src/lib.rs b/crates/rattler_lock/src/lib.rs index 2e759007d..cae12d1b3 100644 --- a/crates/rattler_lock/src/lib.rs +++ b/crates/rattler_lock/src/lib.rs @@ -76,7 +76,7 @@ //! for different platforms and with different channels in a single lock-file. //! This allows storing production- and test environments in a single file. -use std::{collections::HashMap, io::Read, path::Path, str::FromStr, sync::Arc}; +use std::{collections::HashMap, io::Read, path::Path, sync::Arc}; use indexmap::IndexSet; use rattler_conda_types::{Platform, RepoDataRecord}; @@ -98,7 +98,7 @@ pub use builder::{LockFileBuilder, LockedPackage}; pub use channel::Channel; pub use conda::{ CondaBinaryData, CondaPackageData, CondaSourceData, ConversionError, GitShallowSpec, InputHash, - PackageBuildSource, + PackageBuildSource, VariantValue, }; pub use file_format_version::FileFormatVersion; pub use hash::PackageHashes; @@ -177,17 +177,22 @@ impl LockFile { LockFileBuilder::new() } - /// Parses an conda-lock file from a reader. + /// Parses a conda-lock file from a reader. pub fn from_reader(mut reader: impl Read) -> Result { let mut str = String::new(); reader.read_to_string(&mut str)?; - Self::from_str(&str) + Self::parse_str(&str) } - /// Parses an conda-lock file from a file. + /// Parses a conda-lock file from a file. pub fn from_path(path: &Path) -> Result { let source = std::fs::read_to_string(path)?; - Self::from_str(&source) + Self::parse_str(&source) + } + + /// Parses a conda-lock file from a string. + pub fn parse_str(source: &str) -> Result { + crate::parse::parse_from_str(source) } /// Writes the conda lock to a file @@ -489,7 +494,7 @@ impl<'lock> LockedPackageRef<'lock> { /// might not be the normalized name. pub fn name(self) -> &'lock str { match self { - LockedPackageRef::Conda(data) => data.record().name.as_source(), + LockedPackageRef::Conda(data) => data.name().as_source(), LockedPackageRef::Pypi(data, _) => data.name.as_ref(), } } @@ -556,7 +561,6 @@ mod test { #[case::v4_pypi_absolute_path("v4/absolute-path-lock.yml")] #[case::v5_pypi_flat_index("v5/flat-index-lock.yml")] #[case::v5_with_and_without_purl("v5/similar-with-and-without-purl.yml")] - #[case::v6_conda_source_path("v6/conda-path-lock.yml")] #[case::v6_derived_channel("v6/derived-channel-lock.yml")] #[case::v6_sources("v6/sources-lock.yml")] #[case::v6_options("v6/options-lock.yml")] @@ -564,6 +568,15 @@ mod test { #[case::v6_pixi_build_url_source("v6/pixi-build-url-source-lock.yml")] #[case::v6_pixi_build_git_tag_source("v6/pixi-build-git-tag-source-lock.yml")] #[case::v6_pixi_build_git_rev_only_source("v6/pixi-build-git-rev-only-source-lock.yml")] + #[case::v7_single_binary_package("v7/single_binary_package.lock.yml")] + #[case::v7_single_source_package("v7/single_source_package.lock.yml")] + #[case::v7_multiple_source_packages_different_name( + "v7/multiple_source_package_different_name.lock.yml" + )] + #[case::v7_multiple_source_packages_different_variants( + "v7/multiple_source_package_different_variants.lock.yml" + )] + #[case::v7_complex_multi_environment("v7/complex_multi_environment.lock.yml")] fn test_parse(#[case] file_name: &str) { let path = Path::new(env!("CARGO_MANIFEST_DIR")) .join("../../test-data/conda-lock") @@ -572,10 +585,39 @@ mod test { insta::assert_yaml_snapshot!(file_name, conda_lock); } + /// Test that V6 lock files with ambiguous source packages fail to serialize to V7 + /// because they cannot be disambiguated without variant information. + #[rstest] + #[case::v6_conda_source_path("v6/conda-path-lock.yml")] + fn test_v6_ambiguous_source_packages_error(#[case] file_name: &str) { + let path = Path::new(env!("CARGO_MANIFEST_DIR")) + .join("../../test-data/conda-lock") + .join(file_name); + + // Parsing should succeed + let conda_lock = LockFile::from_path(&path).unwrap(); + + // But serialization should fail with a clear error about ambiguous source packages + let result = conda_lock.render_to_string(); + assert!(result.is_err()); + + let err = result.unwrap_err(); + let err_msg = err.to_string(); + assert!( + err_msg.contains("Failed to disambiguate source packages"), + "Expected error about ambiguous source packages, got: {err_msg}" + ); + assert!( + err_msg.contains("cannot be distinguished without variant information"), + "Expected error to mention variant information, got: {err_msg}" + ); + } + #[rstest] fn test_roundtrip( #[files("../../test-data/conda-lock/**/*.yml")] #[exclude("forward-compatible-lock")] + #[exclude("conda-path-lock")] path: PathBuf, ) { // Load the lock-file diff --git a/crates/rattler_lock/src/parse/deserialize.rs b/crates/rattler_lock/src/parse/deserialize.rs index f94a3ed4e..895333c47 100644 --- a/crates/rattler_lock/src/parse/deserialize.rs +++ b/crates/rattler_lock/src/parse/deserialize.rs @@ -1,136 +1,93 @@ use std::{ - borrow::Cow, collections::{BTreeMap, BTreeSet}, marker::PhantomData, sync::Arc, }; use indexmap::IndexSet; -use itertools::Either; use pep508_rs::ExtraName; -use rattler_conda_types::{PackageName, Platform, VersionWithSource}; -use serde::{de::Error, Deserialize, Deserializer}; -use serde_with::{serde_as, DeserializeAs}; +use rattler_conda_types::Platform; +use serde::Deserialize; use serde_yaml::Value; use crate::{ file_format_version::FileFormatVersion, - parse::{models, models::v6, V5, V6}, + parse::{V5, V6, V7}, Channel, CondaPackageData, EnvironmentData, EnvironmentPackageData, LockFile, LockFileInner, ParseCondaLockError, PypiIndexes, PypiPackageData, PypiPackageEnvironmentData, SolveOptions, UrlOrPath, }; -#[serde_as] -#[derive(Deserialize)] -#[serde(bound(deserialize = "P: DeserializeAs<'de, PackageData>"))] -struct DeserializableLockFile

{ - environments: BTreeMap, - #[serde_as(as = "Vec

")] - packages: Vec, - #[serde(skip)] - _data: PhantomData

, +/// Helper trait for types that have a location +pub(crate) trait HasLocation { + fn location(&self) -> &UrlOrPath; +} + +/// Trait defining version-specific types for lock file parsing. +/// +/// Each lock file version (V5, V6, V7) implements this trait to specify: +/// - The package data representation (models vs converted types) +/// - The selector type used in environments +/// - How to resolve selectors to package indices +pub(crate) trait LockFileVersion { + /// The package data type for this version (e.g., `PackageDataV5`, `PackageDataV6`) + type PackageData: for<'de> Deserialize<'de>; + + /// The selector type used in environment package lists + type Selector: for<'de> Deserialize<'de> + PackageSelector; + + /// The conda package representation during resolution (model or final type) + /// Must be convertible to `CondaPackageData` after resolution completes + type CondaPackage: TryInto + HasLocation; + + /// Extract conda and pypi packages from the package data list (keeping models for resolution) + fn extract_packages( + packages: Vec, + ) -> Result<(Vec, Vec), ParseCondaLockError>; } -#[allow(clippy::large_enum_variant)] -enum PackageData { - Conda(CondaPackageData), - Pypi(PypiPackageData), +/// Schema-agnostic lock-file representation used during deserialization. +/// +/// `V` is the lock file version marker (V5, V6, V7) which specifies the types via `LockFileVersion` trait +#[derive(Deserialize)] +#[serde(bound(deserialize = "V: LockFileVersion"))] +struct DeserializableLockFile +where + V: LockFileVersion, +{ + environments: BTreeMap>, + packages: Vec, + #[serde(skip)] + _marker: PhantomData, } +/// Environment payload as stored on disk for a specific format version. +/// +/// `S` is the selector representation for that version (used later to resolve +/// actual package indices inside `parse_from_lock`). #[derive(Deserialize)] -struct DeserializableEnvironment { +#[serde(bound(deserialize = "S: Deserialize<'de>"))] +struct DeserializableEnvironment { channels: Vec, #[serde(flatten)] indexes: Option, #[serde(default)] options: SolveOptions, - packages: BTreeMap>, -} - -impl<'de> DeserializeAs<'de, PackageData> for V5 { - fn deserialize_as(deserializer: D) -> Result - where - D: Deserializer<'de>, - { - #[derive(Deserialize)] - #[serde(tag = "kind", rename_all = "snake_case")] - #[allow(clippy::large_enum_variant)] - enum Inner<'d> { - Conda(models::v5::CondaPackageDataModel<'d>), - Pypi(models::v5::PypiPackageDataModel<'d>), - } - - Ok(match Inner::deserialize(deserializer)? { - Inner::Conda(c) => PackageData::Conda(c.into()), - Inner::Pypi(p) => PackageData::Pypi(p.into()), - }) - } -} - -impl<'de> DeserializeAs<'de, PackageData> for V6 { - fn deserialize_as(deserializer: D) -> Result - where - D: Deserializer<'de>, - { - #[derive(Deserialize)] - #[serde(untagged)] - enum Discriminant { - Conda { - #[serde(rename = "conda")] - _conda: String, - }, - Pypi { - #[serde(rename = "pypi")] - _pypi: String, - }, - } - - let value = serde_value::Value::deserialize(deserializer)?; - let Ok(discriminant) = Discriminant::deserialize( - serde_value::ValueDeserializer::::new(value.clone()), - ) else { - return Err(D::Error::custom( - "expected at least `conda` or `pypi` field", - )); - }; - - let deserializer = serde_value::ValueDeserializer::::new(value); - Ok(match discriminant { - Discriminant::Conda { .. } => PackageData::Conda( - v6::CondaPackageDataModel::deserialize(deserializer)? - .try_into() - .map_err(D::Error::custom)?, - ), - Discriminant::Pypi { .. } => { - PackageData::Pypi(v6::PypiPackageDataModel::deserialize(deserializer)?.into()) - } - }) - } + packages: BTreeMap>, } #[derive(Deserialize)] -#[serde(untagged, rename_all = "snake_case")] -#[allow(clippy::large_enum_variant)] -enum DeserializablePackageSelector { - Conda { - conda: UrlOrPath, - name: Option, - version: Option, - build: Option, - subdir: Option, - }, - Pypi { - pypi: UrlOrPath, - #[serde(flatten)] - runtime: DeserializablePypiPackageEnvironmentData, - }, +pub(crate) struct PypiSelector { + #[serde(rename = "pypi")] + pub(crate) pypi: UrlOrPath, + #[serde(flatten)] + pub(crate) runtime: DeserializablePypiPackageEnvironmentData, } #[derive(Hash, Deserialize, Eq, PartialEq)] -struct DeserializablePypiPackageEnvironmentData { +pub(crate) struct DeserializablePypiPackageEnvironmentData { #[serde(default)] - extras: BTreeSet, + pub(crate) extras: BTreeSet, } impl From for PypiPackageEnvironmentData { @@ -141,6 +98,44 @@ impl From for PypiPackageEnvironmentDa } } +/// Shared context used while resolving selectors into concrete package indices. +pub(crate) struct ResolveCtx<'a, CP> { + pub(crate) environment_name: &'a str, + pub(crate) platform: Platform, + pub(crate) conda_packages: &'a mut Vec, + pub(crate) conda_url_lookup: &'a ahash::HashMap>, + pub(crate) pypi_url_lookup: &'a ahash::HashMap, + pub(crate) pypi_runtime_lookup: &'a mut IndexSet, +} + +/// Trait implemented by version-specific selector enums so they can resolve +/// themselves into canonical `EnvironmentPackageData` entries. +pub(crate) trait PackageSelector { + fn resolve( + self, + ctx: &mut ResolveCtx<'_, CP>, + ) -> Result; +} + +/// Resolve a `PyPI` selector into the shared package index while deduplicating +/// environment runtime configurations. +pub(crate) fn resolve_pypi_selector( + selector: PypiSelector, + ctx: &mut ResolveCtx<'_, CP>, +) -> Result { + let index = *ctx.pypi_url_lookup.get(&selector.pypi).ok_or_else(|| { + ParseCondaLockError::MissingPackage( + ctx.environment_name.to_string(), + ctx.platform, + selector.pypi.clone(), + ) + })?; + + let runtime_idx = ctx.pypi_runtime_lookup.insert_full(selector.runtime).0; + + Ok(EnvironmentPackageData::Pypi(index, runtime_idx)) +} + /// Parses a [`LockFile`] from a [`serde_yaml::Value`]. pub fn parse_from_document_v5( document: Value, @@ -148,7 +143,7 @@ pub fn parse_from_document_v5( ) -> Result { let raw: DeserializableLockFile = serde_yaml::from_value(document).map_err(ParseCondaLockError::ParseError)?; - parse_from_lock(version, raw) + parse_from_lock::(version, raw) } pub fn parse_from_document_v6( @@ -157,23 +152,83 @@ pub fn parse_from_document_v6( ) -> Result { let raw: DeserializableLockFile = serde_yaml::from_value(document).map_err(ParseCondaLockError::ParseError)?; - parse_from_lock(version, raw) + parse_from_lock::(version, raw) } -fn parse_from_lock

( - file_version: FileFormatVersion, - raw: DeserializableLockFile

, +pub fn parse_from_document_v7( + document: Value, + version: FileFormatVersion, ) -> Result { - // Split the packages into conda and pypi packages. - let mut conda_packages = Vec::new(); - let mut pypi_packages = Vec::new(); - for package in raw.packages { - match package { - PackageData::Conda(p) => conda_packages.push(p), - PackageData::Pypi(p) => pypi_packages.push(p), - } + let raw: DeserializableLockFile = + serde_yaml::from_value(document).map_err(ParseCondaLockError::ParseError)?; + parse_from_lock::(version, raw) +} + +/// Resolve all packages for a single environment across all platforms. +/// +/// This function resolves version-specific package selectors into canonical +/// `EnvironmentPackageData` entries, handling disambiguation and PyPI runtime +/// configuration lookup. +#[allow(clippy::doc_markdown)] +fn process_environment_packages( + environment_name: String, + packages: BTreeMap>, + conda_packages: &mut Vec, + conda_url_lookup: &ahash::HashMap>, + pypi_url_lookup: &ahash::HashMap, + pypi_runtime_lookup: &mut IndexSet, +) -> Result< + ( + String, + ahash::HashMap>, + ), + ParseCondaLockError, +> +where + V: LockFileVersion, + >::Error: Into, +{ + let mut packages_by_platform = ahash::HashMap::default(); + + for (platform, selectors) in packages { + let mut ctx = ResolveCtx { + environment_name: &environment_name, + platform, + conda_packages, + conda_url_lookup, + pypi_url_lookup, + pypi_runtime_lookup, + }; + + let platform_packages = selectors + .into_iter() + .map(|selector| selector.resolve(&mut ctx)) + .collect::, _>>()?; + + packages_by_platform.insert(platform, platform_packages); } + Ok((environment_name, packages_by_platform)) +} + +/// Convert the lock-file representation into the canonical in-memory model. +fn parse_from_lock( + file_version: FileFormatVersion, + raw: DeserializableLockFile, +) -> Result +where + V: LockFileVersion, + >::Error: Into, +{ + let DeserializableLockFile { + environments: raw_environments, + packages: raw_packages, + .. + } = raw; + + // Extract and convert packages to final types + let (mut conda_packages, pypi_packages) = V::extract_packages(raw_packages)?; + // Determine the indices of the packages by url let mut conda_url_lookup: ahash::HashMap> = ahash::HashMap::default(); for (idx, conda_package) in conda_packages.iter().enumerate() { @@ -186,150 +241,36 @@ fn parse_from_lock

( let pypi_url_lookup = pypi_packages .iter() .enumerate() - .map(|(idx, p)| (&p.location, idx)) + .map(|(idx, p)| (p.location.clone(), idx)) .collect::>(); let mut pypi_runtime_lookup = IndexSet::new(); - let environments = raw - .environments + let environments = raw_environments .into_iter() .map(|(environment_name, env)| { + let DeserializableEnvironment { + channels, + indexes, + options, + packages, + } = env; + + let (env_name, packages_by_platform) = process_environment_packages::( + environment_name, + packages, + &mut conda_packages, + &conda_url_lookup, + &pypi_url_lookup, + &mut pypi_runtime_lookup, + )?; + Ok(( - environment_name.clone(), + env_name, EnvironmentData { - channels: env.channels, - indexes: env.indexes, - options: env.options, - packages: env - .packages - .into_iter() - .map(|(platform, packages)| { - let packages = packages - .into_iter() - .map(|p| { - Ok(match p { - DeserializablePackageSelector::Conda { - conda, - name, - version, - build, - subdir, - } => { - let all_packages = conda_url_lookup - .get(&conda) - .map_or(&[] as &[usize], Vec::as_slice); - - // Before V6 the package was selected by the first - // match. This is actually a bug because when parsing an - // older lock-file there can be more than one package - // with the same url. Instead, we should look at the - // subdir to disambiguate. - let package_index: Option = if file_version - < FileFormatVersion::V6 - { - // Find the packages that match the subdir of - // this environment - let mut all_packages_with_subdir = all_packages - .iter() - .filter(|&idx| { - let conda_package = &conda_packages[*idx]; - conda_package.record().subdir.as_str() - == platform.as_str() - }) - .peekable(); - - // If there are no packages for the subdir, use all - // packages. - let mut matching_packages = - if all_packages_with_subdir.peek().is_some() { - Either::Left(all_packages_with_subdir) - } else { - Either::Right(all_packages.iter()) - }; - - // Merge all matching packages. - if let Some(&first_package_idx) = - matching_packages.next() - { - let merged_package = Cow::Borrowed( - &conda_packages[first_package_idx], - ); - let package = matching_packages.fold( - merged_package, - |acc, &next_package_idx| { - if let Cow::Owned(merged) = acc.merge( - &conda_packages[next_package_idx], - ) { - Cow::Owned(merged) - } else { - acc - } - }, - ); - Some(match package { - Cow::Borrowed(_) => first_package_idx, - Cow::Owned(package) => { - conda_packages.push(package); - conda_packages.len() - 1 - } - }) - } else { - None - } - } else { - // Find the package that matches all the fields from - // the selector. - all_packages - .iter() - .find(|&idx| { - let conda_package = &conda_packages[*idx]; - name.as_ref().is_none_or(|name| { - name == &conda_package.record().name - }) && version.as_ref().is_none_or( - |version| { - version - == &conda_package - .record() - .version - }, - ) && build.as_ref().is_none_or(|build| { - build == &conda_package.record().build - }) && subdir.as_ref().is_none_or(|subdir| { - subdir == &conda_package.record().subdir - }) - }) - .copied() - }; - - EnvironmentPackageData::Conda( - package_index.ok_or_else(|| { - ParseCondaLockError::MissingPackage( - environment_name.clone(), - platform, - conda, - ) - })?, - ) - } - DeserializablePackageSelector::Pypi { pypi, runtime } => { - EnvironmentPackageData::Pypi( - *pypi_url_lookup.get(&pypi).ok_or_else(|| { - ParseCondaLockError::MissingPackage( - environment_name.clone(), - platform, - pypi, - ) - })?, - pypi_runtime_lookup.insert_full(runtime).0, - ) - } - }) - }) - .collect::>()?; - - Ok((platform, packages)) - }) - .collect::>()?, + channels, + indexes, + options, + packages: packages_by_platform, }, )) }) @@ -341,12 +282,18 @@ fn parse_from_lock

( .map(|(idx, (name, env))| ((name, idx), env)) .unzip(); + // Convert models to final CondaPackageData after all selector resolution is complete + let final_conda_packages: Vec = conda_packages + .into_iter() + .map(|model| model.try_into().map_err(Into::into)) + .collect::, _>>()?; + Ok(LockFile { inner: Arc::new(LockFileInner { version: file_version, environments, environment_lookup, - conda_packages, + conda_packages: final_conda_packages, pypi_packages, pypi_environment_package_data: pypi_runtime_lookup .into_iter() diff --git a/crates/rattler_lock/src/parse/mod.rs b/crates/rattler_lock/src/parse/mod.rs index 647357c21..8e1034b1b 100644 --- a/crates/rattler_lock/src/parse/mod.rs +++ b/crates/rattler_lock/src/parse/mod.rs @@ -11,7 +11,10 @@ use serde_yaml::Value; use v3::parse_v3_or_lower; use super::{LockFile, UrlOrPath}; -use crate::{file_format_version::FileFormatVersion, parse::deserialize::parse_from_document_v5}; +use crate::{ + file_format_version::FileFormatVersion, + parse::deserialize::{parse_from_document_v5, parse_from_document_v7}, +}; #[allow(missing_docs)] #[derive(Debug, thiserror::Error)] @@ -42,38 +45,68 @@ pub enum ParseCondaLockError { LocationToUrlConversionError(#[from] file_url::FileURLParseError), } -impl FromStr for LockFile { - type Err = ParseCondaLockError; +#[allow(clippy::fallible_impl_from)] +impl From for ParseCondaLockError { + fn from(err: crate::ConversionError) -> Self { + match err { + crate::ConversionError::Missing(field) => { + // We don't have the package URL context here, so use a placeholder + ParseCondaLockError::MissingField( + field, + UrlOrPath::Url(url::Url::parse("unknown://").unwrap()), + ) + } + crate::ConversionError::LocationToUrlConversionError(e) => { + ParseCondaLockError::LocationToUrlConversionError(e) + } + } + } +} - fn from_str(s: &str) -> Result { - // First parse the document to a `serde_yaml::Value`. - let document: Value = serde_yaml::from_str(s).map_err(ParseCondaLockError::ParseError)?; +impl From for ParseCondaLockError { + fn from(err: std::convert::Infallible) -> Self { + match err {} + } +} - // Read the version number from the document - let version: FileFormatVersion = document - .get("version") - .ok_or_else(|| { +pub fn parse_from_str(s: &str) -> Result { + // First parse the document to a `serde_yaml::Value`. + let document: Value = serde_yaml::from_str(s).map_err(ParseCondaLockError::ParseError)?; + + // Read the version number from the document + let version: FileFormatVersion = document + .get("version") + .ok_or_else(|| { + ParseCondaLockError::ParseError(serde_yaml::Error::custom( + "missing `version` field in lock file", + )) + }) + .and_then(|v| { + let v = v.as_u64().ok_or_else(|| { ParseCondaLockError::ParseError(serde_yaml::Error::custom( - "missing `version` field in lock file", + "`version` field in lock file is not an integer", )) - }) - .and_then(|v| { - let v = v.as_u64().ok_or_else(|| { - ParseCondaLockError::ParseError(serde_yaml::Error::custom( - "`version` field in lock file is not an integer", - )) - })?; - - FileFormatVersion::try_from(v) })?; - if version <= FileFormatVersion::V3 { - parse_v3_or_lower(document, version) - } else if version <= FileFormatVersion::V5 { - parse_from_document_v5(document, version) - } else { - deserialize::parse_from_document_v6(document, version) - } + FileFormatVersion::try_from(v) + })?; + + if version <= FileFormatVersion::V3 { + parse_v3_or_lower(document, version) + } else if version <= FileFormatVersion::V5 { + parse_from_document_v5(document, version) + } else if version == FileFormatVersion::V6 { + deserialize::parse_from_document_v6(document, version) + } else { + parse_from_document_v7(document, version) + } +} + +impl FromStr for LockFile { + type Err = ParseCondaLockError; + + fn from_str(s: &str) -> Result { + parse_from_str(s) } } @@ -85,6 +118,10 @@ struct V5; /// versions. struct V6; +/// A helper struct to differentiate between the serde code paths for different +/// versions. +struct V7; + #[cfg(test)] mod test { use std::path::Path; @@ -100,7 +137,7 @@ mod test { .err() .unwrap(); - insta::assert_snapshot!(format!("{}", err), @"found newer lockfile format version 1000, but only up to including version 6 is supported"); + insta::assert_snapshot!(format!("{}", err), @"found newer lockfile format version 1000, but only up to including version 7 is supported"); } // This test verifies the deterministic ordering of lock files. It does so by diff --git a/crates/rattler_lock/src/parse/models/mod.rs b/crates/rattler_lock/src/parse/models/mod.rs index 3155f6058..922626824 100644 --- a/crates/rattler_lock/src/parse/models/mod.rs +++ b/crates/rattler_lock/src/parse/models/mod.rs @@ -2,3 +2,4 @@ pub mod v5; pub mod v6; +pub mod v7; diff --git a/crates/rattler_lock/src/parse/models/v5/deserialize.rs b/crates/rattler_lock/src/parse/models/v5/deserialize.rs new file mode 100644 index 000000000..af5feabbb --- /dev/null +++ b/crates/rattler_lock/src/parse/models/v5/deserialize.rs @@ -0,0 +1,284 @@ +//! Deserialization helpers specific to V5 lock file contents. + +use std::borrow::Cow; + +use itertools::Itertools; +use serde::{Deserialize, Deserializer}; + +use crate::{ + parse::{models, ParseCondaLockError, V5}, + CondaPackageData, EnvironmentPackageData, PypiPackageData, UrlOrPath, +}; + +use super::super::super::deserialize::{ + HasLocation, LockFileVersion, PackageSelector, PypiSelector, ResolveCtx, +}; + +impl HasLocation for CondaPackageData { + fn location(&self) -> &UrlOrPath { + CondaPackageData::location(self) + } +} + +/// V5-specific package data (stores final converted types) +#[allow(clippy::large_enum_variant)] +pub(crate) enum PackageDataV5 { + Conda(CondaPackageData), + Pypi(PypiPackageData), +} + +// V5 uses tagged format and converts immediately +impl<'de> Deserialize<'de> for PackageDataV5 { + fn deserialize(deserializer: D) -> Result + where + D: Deserializer<'de>, + { + #[derive(Deserialize)] + #[serde(tag = "kind", rename_all = "snake_case")] + #[allow(clippy::large_enum_variant)] + enum Inner<'d> { + Conda(models::v5::CondaPackageDataModel<'d>), + Pypi(models::v5::PypiPackageDataModel<'d>), + } + + Ok(match Inner::deserialize(deserializer)? { + Inner::Conda(c) => PackageDataV5::Conda(c.into()), + Inner::Pypi(p) => PackageDataV5::Pypi(p.into()), + }) + } +} + +// V5 selectors - only have location, no disambiguation fields +/// Selector used in V5 lock files to reference either a conda or PyPI package. +#[allow(clippy::doc_markdown)] +#[derive(Deserialize)] +#[serde(untagged)] +pub(crate) enum DeserializablePackageSelectorV5 { + Conda(CondaSelectorV5), + Pypi(PypiSelector), +} + +/// Minimal conda selector available in V5 lock files (location only). +#[derive(Deserialize)] +pub(crate) struct CondaSelectorV5 { + #[serde(rename = "conda")] + pub(crate) conda: crate::UrlOrPath, +} + +// V5 uses CondaPackageData directly +impl PackageSelector for DeserializablePackageSelectorV5 { + fn resolve( + self, + ctx: &mut ResolveCtx<'_, CondaPackageData>, + ) -> Result { + match self { + DeserializablePackageSelectorV5::Conda(selector) => { + resolve_conda_selector_v5(selector, ctx) + } + DeserializablePackageSelectorV5::Pypi(selector) => { + super::super::super::deserialize::resolve_pypi_selector(selector, ctx) + } + } + } +} + +/// Resolve conda selector for V5 and earlier (works with final `CondaPackageData`) +/// This merges duplicate records when only location information is available. +fn resolve_conda_selector_v5( + selector: CondaSelectorV5, + ctx: &mut ResolveCtx<'_, CondaPackageData>, +) -> Result { + let conda = selector.conda; + + let candidates = ctx + .conda_url_lookup + .get(&conda) + .map_or(&[] as &[usize], Vec::as_slice); + + // Filter to platform-specific packages (or noarch) + let mut indices: Vec = candidates + .iter() + .copied() + .filter(|&idx| { + let Some(binary) = ctx.conda_packages[idx].as_binary() else { + return false; + }; + binary.package_record.subdir.as_str() == ctx.platform.as_str() + || binary.package_record.subdir.as_str() == "noarch" + }) + .collect(); + + // If no platform-specific packages found, use all candidates + if indices.is_empty() { + indices.extend_from_slice(candidates); + } + + let mut iter = indices.into_iter(); + let first_package_idx = iter.next().ok_or_else(|| { + ParseCondaLockError::MissingPackage( + ctx.environment_name.to_string(), + ctx.platform, + conda.clone(), + ) + })?; + + // Merge duplicate records + let merged_package = iter.fold( + Cow::Borrowed(&ctx.conda_packages[first_package_idx]), + |acc, next_package_idx| { + if let Cow::Owned(merged) = acc.merge(&ctx.conda_packages[next_package_idx]) { + Cow::Owned(merged) + } else { + acc + } + }, + ); + + let package_index = match merged_package { + Cow::Borrowed(_) => first_package_idx, + Cow::Owned(package) => { + ctx.conda_packages.push(package); + ctx.conda_packages.len() - 1 + } + }; + + Ok(EnvironmentPackageData::Conda(package_index)) +} + +// Implement LockFileVersion for V5 +impl LockFileVersion for V5 { + type PackageData = PackageDataV5; + type Selector = DeserializablePackageSelectorV5; + type CondaPackage = CondaPackageData; + + fn extract_packages( + packages: Vec, + ) -> Result<(Vec, Vec), ParseCondaLockError> { + Ok(packages.into_iter().partition_map(|package| match package { + PackageDataV5::Conda(p) => itertools::Either::Left(p), + PackageDataV5::Pypi(p) => itertools::Either::Right(p), + })) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use rattler_conda_types::Platform; + use url::Url; + + /// Helper to create a test binary package + fn test_binary_package(location: UrlOrPath, subdir: &str) -> CondaPackageData { + use crate::conda::CondaBinaryData; + use rattler_conda_types::{PackageRecord, Version}; + use std::str::FromStr; + + CondaPackageData::Binary(CondaBinaryData { + package_record: PackageRecord { + subdir: subdir.to_string(), + ..PackageRecord::new( + "test-package".parse().unwrap(), + Version::from_str("1.0.0").unwrap(), + "0".to_string(), + ) + }, + location, + file_name: "package.tar.bz2".to_string(), + channel: None, + }) + } + + /// Tests that V5 selectors correctly filter packages by platform subdir. + /// + /// V5 selectors only contain location information, so they must match by + /// comparing the package's subdir field against the target platform. + #[test] + fn test_conda_selector_v5_matches_platform_subdir() { + let location = UrlOrPath::Url(Url::parse("https://example.com/package.tar.bz2").unwrap()); + let selector = CondaSelectorV5 { + conda: location.clone(), + }; + + let linux64_pkg = test_binary_package(location.clone(), "linux-64"); + let win64_pkg = test_binary_package(location.clone(), "win-64"); + + let mut packages = vec![linux64_pkg, win64_pkg]; + let mut lookup = ahash::AHashMap::default(); + lookup.insert(location.clone(), vec![0, 1]); + + let mut ctx = ResolveCtx { + environment_name: "test", + platform: Platform::Linux64, + conda_packages: &mut packages, + conda_url_lookup: &lookup, + pypi_url_lookup: &ahash::AHashMap::default(), + pypi_runtime_lookup: &mut indexmap::IndexSet::new(), + }; + + let result = resolve_conda_selector_v5(selector, &mut ctx); + assert!(result.is_ok()); + // Should resolve to the linux-64 package (index 0) + assert_eq!(result.unwrap(), EnvironmentPackageData::Conda(0)); + } + + /// Tests that V5 selectors can match noarch packages when platform-specific is unavailable. + /// + /// When no packages match the target platform's subdir, V5 falls back to + /// matching any available packages at the location, including noarch. + #[test] + fn test_conda_selector_v5_noarch_fallback() { + let location = UrlOrPath::Url(Url::parse("https://example.com/package.tar.bz2").unwrap()); + let selector = CondaSelectorV5 { + conda: location.clone(), + }; + + let noarch_pkg = test_binary_package(location.clone(), "noarch"); + + let mut packages = vec![noarch_pkg]; + let mut lookup = ahash::HashMap::default(); + lookup.insert(location.clone(), vec![0]); + + let mut ctx = ResolveCtx { + environment_name: "test", + platform: Platform::Linux64, + conda_packages: &mut packages, + conda_url_lookup: &lookup, + pypi_url_lookup: &ahash::HashMap::default(), + pypi_runtime_lookup: &mut indexmap::IndexSet::new(), + }; + + let result = resolve_conda_selector_v5(selector, &mut ctx); + assert!(result.is_ok()); + } + + /// Tests that V5 selectors return an error when the package location is not found. + /// + /// When a selector references a package location that doesn't exist in the + /// lock file's package lookup, the resolution must fail with a clear error. + #[test] + fn test_conda_selector_v5_missing_package() { + let location = UrlOrPath::Url(Url::parse("https://example.com/missing.tar.bz2").unwrap()); + let selector = CondaSelectorV5 { + conda: location.clone(), + }; + + let mut packages = vec![]; + let lookup = ahash::HashMap::default(); + + let mut ctx = ResolveCtx { + environment_name: "test", + platform: Platform::Linux64, + conda_packages: &mut packages, + conda_url_lookup: &lookup, + pypi_url_lookup: &ahash::HashMap::default(), + pypi_runtime_lookup: &mut indexmap::IndexSet::new(), + }; + + let result = resolve_conda_selector_v5(selector, &mut ctx); + assert!(result.is_err()); + assert!(matches!( + result.err(), + Some(ParseCondaLockError::MissingPackage(_, _, _)) + )); + } +} diff --git a/crates/rattler_lock/src/parse/models/v5/mod.rs b/crates/rattler_lock/src/parse/models/v5/mod.rs index 8e1fa8da4..a094c6ef2 100644 --- a/crates/rattler_lock/src/parse/models/v5/mod.rs +++ b/crates/rattler_lock/src/parse/models/v5/mod.rs @@ -1,4 +1,5 @@ mod conda_package_data; +pub(crate) mod deserialize; mod pypi_package_data; pub(crate) use conda_package_data::CondaPackageDataModel; diff --git a/crates/rattler_lock/src/parse/models/v6/conda_package_data.rs b/crates/rattler_lock/src/parse/models/v6/conda_package_data.rs index 69eb246ca..dfe838d14 100644 --- a/crates/rattler_lock/src/parse/models/v6/conda_package_data.rs +++ b/crates/rattler_lock/src/parse/models/v6/conda_package_data.rs @@ -4,8 +4,8 @@ use std::{ }; use rattler_conda_types::{ - package::ArchiveIdentifier, utils::TimestampMs, BuildNumber, ChannelUrl, NoArchType, - PackageName, PackageRecord, PackageUrl, VersionWithSource, + package::ArchiveIdentifier, BuildNumber, ChannelUrl, NoArchType, PackageName, PackageRecord, + PackageUrl, VersionWithSource, }; use rattler_digest::{serde::SerializableHash, Md5Hash, Sha256Hash}; use serde::{Deserialize, Serialize}; @@ -138,71 +138,74 @@ impl<'a> TryFrom> for CondaPackageData { fn try_from(value: CondaPackageDataModel<'a>) -> Result { let derived = LocationDerivedFields::new(&value.location); - let build = value - .build - .map(Cow::into_owned) - .or_else(|| derived.build.clone()) - .unwrap_or_default(); - let build_number = value - .build_number - .or_else(|| derived_fields::derive_build_number_from_build(&build)) - .unwrap_or(0); - let subdir = value - .subdir - .map(Cow::into_owned) - .or_else(|| derived.subdir.clone()) - .ok_or_else(|| ConversionError::Missing("subdir".to_string()))?; - let noarch = value.noarch.map_or_else( - || { - derived_fields::derive_noarch_type( - derived.subdir.as_deref().unwrap_or(&subdir), - derived.build.as_deref().unwrap_or(&build), - ) - }, - Cow::into_owned, - ); - let (derived_arch, derived_platform) = derived_fields::derive_arch_and_platform(&subdir); - - let package_record = PackageRecord { - build, - build_number, - constrains: value.constrains.into_owned(), - depends: value.depends.into_owned(), - experimental_extra_depends: value.experimental_extra_depends.into_owned(), - features: value.features.into_owned(), - legacy_bz2_md5: value.legacy_bz2_md5, - legacy_bz2_size: value.legacy_bz2_size.into_owned(), - license: value.license.into_owned(), - license_family: value.license_family.into_owned(), - md5: value.md5, - name: value - .name - .map(Cow::into_owned) - .or(derived.name) - .ok_or_else(|| ConversionError::Missing("name".to_string()))?, - noarch, - arch: derived_arch, - platform: derived_platform, - purls: value.purls.into_owned(), - sha256: value.sha256, - size: value.size.into_owned(), - subdir, - timestamp: value.timestamp.map(Into::into), - track_features: value.track_features.into_owned(), - version: value - .version - .map(Cow::into_owned) - .or(derived.version) - .ok_or_else(|| ConversionError::Missing("version".to_string()))?, - run_exports: None, - python_site_packages_path: value.python_site_packages_path.into_owned(), - }; if value .location .file_name() .is_some_and(|name| ArchiveIdentifier::try_from_filename(name).is_some()) { + // Binary package + let build = value + .build + .map(Cow::into_owned) + .or_else(|| derived.build.clone()) + .unwrap_or_default(); + let build_number = value + .build_number + .or_else(|| derived_fields::derive_build_number_from_build(&build)) + .unwrap_or(0); + let subdir = value + .subdir + .map(Cow::into_owned) + .or_else(|| derived.subdir.clone()) + .ok_or_else(|| ConversionError::Missing("subdir".to_string()))?; + let noarch = value.noarch.map_or_else( + || { + derived_fields::derive_noarch_type( + derived.subdir.as_deref().unwrap_or(&subdir), + derived.build.as_deref().unwrap_or(&build), + ) + }, + Cow::into_owned, + ); + let (derived_arch, derived_platform) = + derived_fields::derive_arch_and_platform(&subdir); + + let package_record = PackageRecord { + build, + build_number, + constrains: value.constrains.into_owned(), + depends: value.depends.into_owned(), + experimental_extra_depends: value.experimental_extra_depends.into_owned(), + features: value.features.into_owned(), + legacy_bz2_md5: value.legacy_bz2_md5, + legacy_bz2_size: value.legacy_bz2_size.into_owned(), + license: value.license.into_owned(), + license_family: value.license_family.into_owned(), + md5: value.md5, + name: value + .name + .map(Cow::into_owned) + .or(derived.name) + .ok_or_else(|| ConversionError::Missing("name".to_string()))?, + noarch, + arch: derived_arch, + platform: derived_platform, + purls: value.purls.into_owned(), + sha256: value.sha256, + size: value.size.into_owned(), + subdir, + timestamp: value.timestamp.map(Into::into), + track_features: value.track_features.into_owned(), + version: value + .version + .map(Cow::into_owned) + .or(derived.version) + .ok_or_else(|| ConversionError::Missing("version".to_string()))?, + run_exports: None, + python_site_packages_path: value.python_site_packages_path.into_owned(), + }; + Ok(CondaPackageData::Binary(CondaBinaryData { location: value.location, file_name: value @@ -225,15 +228,29 @@ impl<'a> TryFrom> for CondaPackageData { package_record, })) } else { + // Source package - extract only the fields we need Ok(CondaPackageData::Source(CondaSourceData { - package_record, + name: value + .name + .map(Cow::into_owned) + .or(derived.name) + .ok_or_else(|| ConversionError::Missing("name".to_string()))?, + version: value.version.map(Cow::into_owned).or(derived.version), location: value.location, - package_build_source: value.package_build_source, + variants: BTreeMap::new(), // V6 doesn't have variants + depends: value.depends.into_owned(), + constrains: value.constrains.into_owned(), + experimental_extra_depends: value.experimental_extra_depends.into_owned(), + license: value.license.into_owned(), + purls: value.purls.into_owned(), + sources: value.sources, input: value.input.map(|input| conda::InputHash { hash: input.hash, globs: input.globs.into_owned(), }), - sources: value.sources, + package_build_source: value.package_build_source, + python_site_packages_path: value.python_site_packages_path.into_owned(), + dev: false, // V6 doesn't have dev field })) } } @@ -241,71 +258,116 @@ impl<'a> TryFrom> for CondaPackageData { impl<'a> From<&'a CondaPackageData> for CondaPackageDataModel<'a> { fn from(value: &'a CondaPackageData) -> Self { - let package_record = value.record(); - let derived = LocationDerivedFields::new(value.location()); - let derived_build_number = - derived_fields::derive_build_number_from_build(&package_record.build).unwrap_or(0); - let derived_noarch = derived_fields::derive_noarch_type( - derived.subdir.as_deref().unwrap_or(&package_record.subdir), - derived.build.as_deref().unwrap_or(&package_record.build), - ); + match value { + CondaPackageData::Binary(binary_data) => { + let package_record = &binary_data.package_record; + let derived = LocationDerivedFields::new(&binary_data.location); + let derived_build_number = + derived_fields::derive_build_number_from_build(&package_record.build) + .unwrap_or(0); + let derived_noarch = derived_fields::derive_noarch_type( + derived.subdir.as_deref().unwrap_or(&package_record.subdir), + derived.build.as_deref().unwrap_or(&package_record.build), + ); + + let channel = binary_data.channel.as_ref(); + let file_name = Some(binary_data.file_name.as_str()); - let channel = value.as_binary().and_then(|binary| binary.channel.as_ref()); - let file_name = value.as_binary().map(|binary| binary.file_name.as_str()); - let input = value.as_source().and_then(|source| source.input.as_ref()); - let package_build_source = value - .as_source() - .and_then(|source| source.package_build_source.as_ref()); - let sources = value - .as_source() - .map_or_else(BTreeMap::new, |source| source.sources.clone()); + let normalized_channel = channel + .map(|channel| strip_trailing_slash(channel.as_ref())) + .map(Cow::into_owned); - let normalized_channel = channel - .map(|channel| strip_trailing_slash(channel.as_ref())) - .map(Cow::into_owned); + Self { + location: binary_data.location.clone(), + name: (Some(package_record.name.as_source()) + != derived.name.as_ref().map(PackageName::as_source)) + .then_some(Cow::Borrowed(&package_record.name)), + version: (Some(package_record.version.as_str()) + != derived.version.as_ref().map(VersionWithSource::as_str)) + .then_some(Cow::Borrowed(&package_record.version)), + build: (package_record.build.as_str() + != derived.build.as_ref().map_or("", |s| s.as_str())) + .then_some(Cow::Borrowed(&package_record.build)), + build_number: (package_record.build_number != derived_build_number) + .then_some(package_record.build_number), + subdir: (Some(package_record.subdir.as_str()) != derived.subdir.as_deref()) + .then_some(Cow::Borrowed(&package_record.subdir)), + noarch: (package_record.noarch != derived_noarch) + .then_some(Cow::Borrowed(&package_record.noarch)), + channel: (channel != derived.channel.as_ref()) + .then_some(Cow::Owned(normalized_channel)), + file_name: (file_name != derived.file_name.as_deref()) + .then_some(Cow::Owned(file_name.map(ToString::to_string))), + purls: Cow::Borrowed(&package_record.purls), + depends: Cow::Borrowed(&package_record.depends), + constrains: Cow::Borrowed(&package_record.constrains), + experimental_extra_depends: Cow::Borrowed( + &package_record.experimental_extra_depends, + ), + md5: package_record.md5, + legacy_bz2_md5: package_record.legacy_bz2_md5, + sha256: package_record.sha256, + size: Cow::Borrowed(&package_record.size), + legacy_bz2_size: Cow::Borrowed(&package_record.legacy_bz2_size), + timestamp: package_record.timestamp.map(Into::into), + features: Cow::Borrowed(&package_record.features), + track_features: Cow::Borrowed(&package_record.track_features), + license: Cow::Borrowed(&package_record.license), + license_family: Cow::Borrowed(&package_record.license_family), + python_site_packages_path: Cow::Borrowed( + &package_record.python_site_packages_path, + ), + input: None, + package_build_source: None, + sources: BTreeMap::new(), + } + } + CondaPackageData::Source(source_data) => { + let derived = LocationDerivedFields::new(&source_data.location); - Self { - location: value.location().clone(), - name: (Some(package_record.name.as_source()) - != derived.name.as_ref().map(PackageName::as_source)) - .then_some(Cow::Borrowed(&package_record.name)), - version: (Some(package_record.version.as_str()) - != derived.version.as_ref().map(VersionWithSource::as_str)) - .then_some(Cow::Borrowed(&package_record.version)), - build: (package_record.build.as_str() - != derived.build.as_ref().map_or("", |s| s.as_str())) - .then_some(Cow::Borrowed(&package_record.build)), - build_number: (package_record.build_number != derived_build_number) - .then_some(package_record.build_number), - subdir: (Some(package_record.subdir.as_str()) != derived.subdir.as_deref()) - .then_some(Cow::Borrowed(&package_record.subdir)), - noarch: (package_record.noarch != derived_noarch) - .then_some(Cow::Borrowed(&package_record.noarch)), - channel: (channel != derived.channel.as_ref()) - .then_some(Cow::Owned(normalized_channel)), - file_name: (file_name != derived.file_name.as_deref()) - .then_some(Cow::Owned(file_name.map(ToString::to_string))), - purls: Cow::Borrowed(&package_record.purls), - depends: Cow::Borrowed(&package_record.depends), - constrains: Cow::Borrowed(&package_record.constrains), - experimental_extra_depends: Cow::Borrowed(&package_record.experimental_extra_depends), - md5: package_record.md5, - legacy_bz2_md5: package_record.legacy_bz2_md5, - sha256: package_record.sha256, - size: Cow::Borrowed(&package_record.size), - legacy_bz2_size: Cow::Borrowed(&package_record.legacy_bz2_size), - timestamp: package_record.timestamp.map(TimestampMs::into_datetime), - features: Cow::Borrowed(&package_record.features), - track_features: Cow::Borrowed(&package_record.track_features), - license: Cow::Borrowed(&package_record.license), - license_family: Cow::Borrowed(&package_record.license_family), - python_site_packages_path: Cow::Borrowed(&package_record.python_site_packages_path), - input: input.map(|input| InputHash { - hash: input.hash, - globs: Cow::Borrowed(&input.globs), - }), - package_build_source: package_build_source.cloned(), - sources, + Self { + location: source_data.location.clone(), + name: (Some(source_data.name.as_source()) + != derived.name.as_ref().map(PackageName::as_source)) + .then_some(Cow::Borrowed(&source_data.name)), + version: source_data.version.as_ref().and_then(|version| { + (Some(version.as_str()) + != derived.version.as_ref().map(VersionWithSource::as_str)) + .then_some(Cow::Borrowed(version)) + }), + build: None, + build_number: None, + subdir: None, + noarch: None, + channel: None, + file_name: None, + purls: Cow::Borrowed(&source_data.purls), + depends: Cow::Borrowed(&source_data.depends), + constrains: Cow::Borrowed(&source_data.constrains), + experimental_extra_depends: Cow::Borrowed( + &source_data.experimental_extra_depends, + ), + md5: None, + legacy_bz2_md5: None, + sha256: None, + size: Cow::Borrowed(&None), + legacy_bz2_size: Cow::Borrowed(&None), + timestamp: None, + features: Cow::Borrowed(&None), + track_features: Cow::Owned(Vec::new()), + license: Cow::Borrowed(&source_data.license), + license_family: Cow::Borrowed(&None), + python_site_packages_path: Cow::Borrowed( + &source_data.python_site_packages_path, + ), + input: source_data.input.as_ref().map(|input| InputHash { + hash: input.hash, + globs: Cow::Borrowed(&input.globs), + }), + package_build_source: source_data.package_build_source.clone(), + sources: source_data.sources.clone(), + } + } } } } diff --git a/crates/rattler_lock/src/parse/models/v6/deserialize.rs b/crates/rattler_lock/src/parse/models/v6/deserialize.rs new file mode 100644 index 000000000..a5e2b577e --- /dev/null +++ b/crates/rattler_lock/src/parse/models/v6/deserialize.rs @@ -0,0 +1,190 @@ +//! Deserialization helpers specific to V6 lock file contents. + +use itertools::Itertools; +use rattler_conda_types::{PackageName, VersionWithSource}; +use serde::Deserialize; + +use crate::{ + parse::{models::v6, ParseCondaLockError, V6}, + utils::derived_fields::LocationDerivedFields, + EnvironmentPackageData, PypiPackageData, UrlOrPath, +}; + +use super::super::super::deserialize::{ + HasLocation, LockFileVersion, PackageSelector, PypiSelector, ResolveCtx, +}; + +impl HasLocation for v6::CondaPackageDataModel<'static> { + fn location(&self) -> &UrlOrPath { + &self.location + } +} + +/// V6-specific package data (stores models before conversion) +#[derive(Deserialize)] +#[serde(untagged)] +#[allow(clippy::large_enum_variant)] +pub(crate) enum PackageDataV6<'a> { + Conda(v6::CondaPackageDataModel<'a>), + Pypi(v6::PypiPackageDataModel<'a>), +} + +/// Conda selector representation stored in V6 lock files. +#[derive(Deserialize)] +pub(crate) struct CondaSelectorV6 { + /// URL or path to the conda artifact referenced by the selector. + #[serde(rename = "conda")] + pub(crate) conda: UrlOrPath, + /// Optional package name used to disambiguate multiple artifacts with the same location. + pub(crate) name: Option, + /// Optional version (with source) hint supplied by the lock file. + pub(crate) version: Option, + /// Optional build string recorded in the lock file. + pub(crate) build: Option, + /// Optional platform-specific subdirectory for the package. + pub(crate) subdir: Option, +} + +/// Check if an expected field value matches the model's field or a derived value. +fn field_matches( + expected: T, + model_field: Option, + derived_field: Option, +) -> bool { + match model_field { + Some(model_value) => expected == model_value, + None => derived_field.as_ref().is_some_and(|d| expected == *d), + } +} + +impl CondaSelectorV6 { + /// Resolve this selector to a package index by matching against V6 models. + /// + /// This works with `CondaPackageDataModel` which has the selector fields available, + /// and will derive missing fields (version, build, subdir) from the package URL + /// when they are not explicitly present in the model. + pub(crate) fn resolve( + &self, + conda_packages: &[v6::CondaPackageDataModel<'_>], + candidates: &[usize], + ) -> Option { + candidates + .iter() + .find(|&&idx| { + let model = &conda_packages[idx]; + + // Check name - compare with model's name field if present + if let Some(expected_name) = &self.name { + if let Some(model_name) = &model.name { + if expected_name != model_name.as_ref() { + return false; + } + } + } + + // Derive fields from URL if needed + let derived_fields = LocationDerivedFields::new(&model.location); + + // Check version - model's version field or derive from URL + if let Some(expected_version) = &self.version { + if !field_matches( + expected_version, + model.version.as_deref(), + derived_fields.version.as_ref(), + ) { + return false; + } + } + + // Check build - model's build field or derive from URL + if let Some(expected_build) = &self.build { + if !field_matches( + expected_build.as_str(), + model.build.as_deref(), + derived_fields.build.as_deref(), + ) { + return false; + } + } + + // Check subdir - model's subdir field or derive from URL + if let Some(expected_subdir) = &self.subdir { + if !field_matches( + expected_subdir.as_str(), + model.subdir.as_deref(), + derived_fields.subdir.as_deref(), + ) { + return false; + } + } + + true + }) + .copied() + } +} + +/// Selector used in V6 lock files to reference either a conda or PyPI package. +#[allow(clippy::doc_markdown)] +#[derive(Deserialize)] +#[serde(untagged)] +#[allow(clippy::large_enum_variant)] +pub(crate) enum DeserializablePackageSelectorV6 { + Conda(CondaSelectorV6), + Pypi(PypiSelector), +} + +impl PackageSelector> for DeserializablePackageSelectorV6 { + fn resolve( + self, + ctx: &mut ResolveCtx<'_, v6::CondaPackageDataModel<'static>>, + ) -> Result { + match self { + DeserializablePackageSelectorV6::Conda(selector) => { + resolve_conda_selector_v6_models(selector, ctx) + } + DeserializablePackageSelectorV6::Pypi(selector) => { + super::super::super::deserialize::resolve_pypi_selector(selector, ctx) + } + } + } +} + +/// Resolve conda selector for V6 (works with models) +fn resolve_conda_selector_v6_models( + selector: CondaSelectorV6, + ctx: &mut ResolveCtx<'_, v6::CondaPackageDataModel<'static>>, +) -> Result { + let candidates = ctx + .conda_url_lookup + .get(&selector.conda) + .map_or(&[] as &[usize], Vec::as_slice); + + let package_index = selector.resolve(ctx.conda_packages.as_slice(), candidates); + + let package_index = package_index.ok_or_else(|| { + ParseCondaLockError::MissingPackage( + ctx.environment_name.to_string(), + ctx.platform, + selector.conda.clone(), + ) + })?; + + Ok(EnvironmentPackageData::Conda(package_index)) +} + +// Implement LockFileVersion for V6 +impl LockFileVersion for V6 { + type PackageData = PackageDataV6<'static>; + type Selector = DeserializablePackageSelectorV6; + type CondaPackage = v6::CondaPackageDataModel<'static>; + + fn extract_packages( + packages: Vec, + ) -> Result<(Vec, Vec), ParseCondaLockError> { + Ok(packages.into_iter().partition_map(|package| match package { + PackageDataV6::Conda(model) => itertools::Either::Left(model), + PackageDataV6::Pypi(model) => itertools::Either::Right(model.into()), + })) + } +} diff --git a/crates/rattler_lock/src/parse/models/v6/mod.rs b/crates/rattler_lock/src/parse/models/v6/mod.rs index 02e588a33..bea6c6637 100644 --- a/crates/rattler_lock/src/parse/models/v6/mod.rs +++ b/crates/rattler_lock/src/parse/models/v6/mod.rs @@ -1,6 +1,7 @@ mod conda_package_data; -mod pypi_package_data; -mod source_data; +pub(crate) mod deserialize; +pub(in crate::parse::models) mod pypi_package_data; +pub(in crate::parse::models) mod source_data; pub(crate) use conda_package_data::CondaPackageDataModel; pub(crate) use pypi_package_data::PypiPackageDataModel; diff --git a/crates/rattler_lock/src/parse/models/v7/conda_package_data.rs b/crates/rattler_lock/src/parse/models/v7/conda_package_data.rs new file mode 100644 index 000000000..b9cff26a5 --- /dev/null +++ b/crates/rattler_lock/src/parse/models/v7/conda_package_data.rs @@ -0,0 +1,404 @@ +// V7 conda package data models - initially identical to V6 but can evolve independently +// TODO: Will be modified to support variants-based disambiguation in later steps + +use std::{ + borrow::Cow, + collections::{BTreeMap, BTreeSet}, +}; + +use rattler_conda_types::{ + package::ArchiveIdentifier, BuildNumber, ChannelUrl, NoArchType, PackageName, PackageRecord, + PackageUrl, VersionWithSource, +}; +use rattler_digest::{serde::SerializableHash, Md5Hash, Sha256Hash}; +use serde::{Deserialize, Serialize}; +use serde_with::serde_as; +use url::Url; + +use super::source_data::{PackageBuildSourceSerializer, SourceLocationSerializer}; +use crate::{ + conda, + conda::{CondaBinaryData, CondaSourceData, PackageBuildSource}, + source::SourceLocation, + utils::{derived_fields, derived_fields::LocationDerivedFields}, + CondaPackageData, ConversionError, UrlOrPath, +}; + +/// A helper struct that wraps all fields of a [`crate::CondaPackageData`] and +/// allows for easy conversion between the two. +/// +/// This type provides full control over the order of the fields when +/// serializing. This is important because one of the design goals is that it +/// should be easy to read the lock file. A [`PackageRecord`] is serialized in +/// alphabetic order which might not be the most readable. This type instead +/// puts the "most important" fields at the top followed by more detailed ones. +/// +/// So note that for reproducibility the order of these fields should not change +/// or should be reflected in a version change. +// +/// This type also adds more default values (e.g. for `build_number` and +/// `build_string`). +/// +/// The complexity with `Cow<_>` types is introduced to allow both efficient +/// deserialization and serialization without requiring all data to be cloned +/// when serializing. We want to be able to use the same type of both +/// serialization and deserialization to ensure that when any of the +/// types involved change we are forced to update this struct as well. +#[serde_as] +#[derive(Serialize, Deserialize, Eq, PartialEq)] +pub(crate) struct CondaPackageDataModel<'a> { + /// The location of the package. This can be a URL or a path. + #[serde(rename = "conda")] + pub location: UrlOrPath, + + // Unique identifiers go to the top + #[serde(default, skip_serializing_if = "Option::is_none")] + pub name: Option>, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub version: Option>, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub build: Option>, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub build_number: Option, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub subdir: Option>, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub noarch: Option>, + + // Dev field for source packages (only contributes dependencies, not installed) + #[serde(default, skip_serializing_if = "is_false")] + pub dev: bool, + + // Then the hashes + #[serde(default, skip_serializing_if = "Option::is_none")] + #[serde_as(as = "Option>")] + pub sha256: Option, + #[serde(default, skip_serializing_if = "Option::is_none")] + #[serde_as(as = "Option>")] + pub md5: Option, + #[serde(default, skip_serializing_if = "Option::is_none")] + #[serde_as(as = "Option>")] + pub legacy_bz2_md5: Option, + + // Dependencies + #[serde(default, skip_serializing_if = "<[String]>::is_empty")] + pub depends: Cow<'a, [String]>, + #[serde(default, skip_serializing_if = "<[String]>::is_empty")] + pub constrains: Cow<'a, [String]>, + #[serde(default, skip_serializing_if = "BTreeMap::is_empty")] + #[serde(rename = "extra_depends")] + pub experimental_extra_depends: Cow<'a, BTreeMap>>, + + // Additional properties (in semi alphabetic order but grouped by commonality) + #[serde(default, skip_serializing_if = "Option::is_none")] + pub channel: Option>>, + + #[serde(default, skip_serializing_if = "Option::is_none")] + pub features: Cow<'a, Option>, + #[serde(default, skip_serializing_if = "<[String]>::is_empty")] + pub track_features: Cow<'a, [String]>, + + #[serde(default, skip_serializing_if = "Option::is_none")] + pub file_name: Option>>, + + #[serde(default, skip_serializing_if = "Option::is_none")] + pub license: Cow<'a, Option>, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub license_family: Cow<'a, Option>, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub purls: Cow<'a, Option>>, + + #[serde(default, skip_serializing_if = "Option::is_none")] + pub size: Cow<'a, Option>, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub legacy_bz2_size: Cow<'a, Option>, + + #[serde(default, skip_serializing_if = "Option::is_none")] + #[serde_as(as = "Option")] + pub timestamp: Option>, + + #[serde(default, skip_serializing_if = "Option::is_none")] + pub input: Option>, + + #[serde(default, skip_serializing_if = "Option::is_none")] + #[serde_as(as = "Option")] + pub package_build_source: Option, + + #[serde(default, skip_serializing_if = "BTreeMap::is_empty")] + #[serde_as(as = "BTreeMap<_, SourceLocationSerializer>")] + pub sources: BTreeMap, + + #[serde(default, skip_serializing_if = "Option::is_none")] + pub python_site_packages_path: Cow<'a, Option>, + + // V7-specific: variants for source package disambiguation + #[serde(default, skip_serializing_if = "BTreeMap::is_empty")] + pub variants: BTreeMap, +} + +#[serde_as] +#[derive(Serialize, Deserialize, Eq, PartialEq)] +pub(crate) struct InputHash<'a> { + #[serde_as(as = "SerializableHash::")] + pub hash: Sha256Hash, + pub globs: Cow<'a, [String]>, +} + +impl<'a> TryFrom> for CondaPackageData { + type Error = ConversionError; + + fn try_from(value: CondaPackageDataModel<'a>) -> Result { + let derived = LocationDerivedFields::new(&value.location); + + if value + .location + .file_name() + .is_some_and(|name| ArchiveIdentifier::try_from_filename(name).is_some()) + { + // Binary package + let build = value + .build + .map(Cow::into_owned) + .or_else(|| derived.build.clone()) + .unwrap_or_default(); + let build_number = value + .build_number + .or_else(|| derived_fields::derive_build_number_from_build(&build)) + .unwrap_or(0); + let subdir = value + .subdir + .map(Cow::into_owned) + .or_else(|| derived.subdir.clone()) + .ok_or_else(|| ConversionError::Missing("subdir".to_string()))?; + let noarch = value.noarch.map_or_else( + || { + derived_fields::derive_noarch_type( + derived.subdir.as_deref().unwrap_or(&subdir), + derived.build.as_deref().unwrap_or(&build), + ) + }, + Cow::into_owned, + ); + let (derived_arch, derived_platform) = + derived_fields::derive_arch_and_platform(&subdir); + + let package_record = PackageRecord { + build, + build_number, + constrains: value.constrains.into_owned(), + depends: value.depends.into_owned(), + experimental_extra_depends: value.experimental_extra_depends.into_owned(), + features: value.features.into_owned(), + legacy_bz2_md5: value.legacy_bz2_md5, + legacy_bz2_size: value.legacy_bz2_size.into_owned(), + license: value.license.into_owned(), + license_family: value.license_family.into_owned(), + md5: value.md5, + name: value + .name + .map(Cow::into_owned) + .or(derived.name) + .ok_or_else(|| ConversionError::Missing("name".to_string()))?, + noarch, + arch: derived_arch, + platform: derived_platform, + purls: value.purls.into_owned(), + sha256: value.sha256, + size: value.size.into_owned(), + subdir, + timestamp: value.timestamp.map(Into::into), + track_features: value.track_features.into_owned(), + version: value + .version + .map(Cow::into_owned) + .or(derived.version) + .ok_or_else(|| ConversionError::Missing("version".to_string()))?, + run_exports: None, + python_site_packages_path: value.python_site_packages_path.into_owned(), + }; + + Ok(CondaPackageData::Binary(CondaBinaryData { + location: value.location, + file_name: value + .file_name + .map(Cow::into_owned) + .unwrap_or(derived.file_name) + .unwrap_or_else(|| { + format!( + "{}-{}-{}.conda", + package_record.name.as_normalized(), + package_record.version, + package_record.build + ) + }), + channel: value + .channel + .map(Cow::into_owned) + .map(|m| m.map(ChannelUrl::from)) + .unwrap_or(derived.channel), + package_record, + })) + } else { + // Source package - extract only the fields we need + Ok(CondaPackageData::Source(CondaSourceData { + name: value + .name + .map(Cow::into_owned) + .or(derived.name) + .ok_or_else(|| ConversionError::Missing("name".to_string()))?, + version: value.version.map(Cow::into_owned).or(derived.version), + location: value.location, + variants: value.variants, // V7 supports variants + depends: value.depends.into_owned(), + constrains: value.constrains.into_owned(), + experimental_extra_depends: value.experimental_extra_depends.into_owned(), + license: value.license.into_owned(), + purls: value.purls.into_owned(), + sources: value.sources, + input: value.input.map(|input| conda::InputHash { + hash: input.hash, + globs: input.globs.into_owned(), + }), + package_build_source: value.package_build_source, + python_site_packages_path: value.python_site_packages_path.into_owned(), + dev: value.dev, + })) + } + } +} + +impl<'a> From<&'a CondaPackageData> for CondaPackageDataModel<'a> { + fn from(value: &'a CondaPackageData) -> Self { + match value { + CondaPackageData::Binary(binary_data) => { + let package_record = &binary_data.package_record; + let derived = LocationDerivedFields::new(&binary_data.location); + let derived_build_number = + derived_fields::derive_build_number_from_build(&package_record.build) + .unwrap_or(0); + let derived_noarch = derived_fields::derive_noarch_type( + derived.subdir.as_deref().unwrap_or(&package_record.subdir), + derived.build.as_deref().unwrap_or(&package_record.build), + ); + + let channel = binary_data.channel.as_ref(); + let file_name = Some(binary_data.file_name.as_str()); + + let normalized_channel = channel + .map(|channel| strip_trailing_slash(channel.as_ref())) + .map(Cow::into_owned); + + Self { + location: binary_data.location.clone(), + name: (Some(package_record.name.as_source()) + != derived.name.as_ref().map(PackageName::as_source)) + .then_some(Cow::Borrowed(&package_record.name)), + version: (Some(package_record.version.as_str()) + != derived.version.as_ref().map(VersionWithSource::as_str)) + .then_some(Cow::Borrowed(&package_record.version)), + build: (package_record.build.as_str() + != derived.build.as_ref().map_or("", |s| s.as_str())) + .then_some(Cow::Borrowed(&package_record.build)), + build_number: (package_record.build_number != derived_build_number) + .then_some(package_record.build_number), + subdir: (Some(package_record.subdir.as_str()) != derived.subdir.as_deref()) + .then_some(Cow::Borrowed(&package_record.subdir)), + noarch: (package_record.noarch != derived_noarch) + .then_some(Cow::Borrowed(&package_record.noarch)), + channel: (channel != derived.channel.as_ref()) + .then_some(Cow::Owned(normalized_channel)), + file_name: (file_name != derived.file_name.as_deref()) + .then_some(Cow::Owned(file_name.map(ToString::to_string))), + purls: Cow::Borrowed(&package_record.purls), + depends: Cow::Borrowed(&package_record.depends), + constrains: Cow::Borrowed(&package_record.constrains), + experimental_extra_depends: Cow::Borrowed( + &package_record.experimental_extra_depends, + ), + md5: package_record.md5, + legacy_bz2_md5: package_record.legacy_bz2_md5, + sha256: package_record.sha256, + size: Cow::Borrowed(&package_record.size), + legacy_bz2_size: Cow::Borrowed(&package_record.legacy_bz2_size), + timestamp: package_record.timestamp.map(Into::into), + features: Cow::Borrowed(&package_record.features), + track_features: Cow::Borrowed(&package_record.track_features), + license: Cow::Borrowed(&package_record.license), + license_family: Cow::Borrowed(&package_record.license_family), + python_site_packages_path: Cow::Borrowed( + &package_record.python_site_packages_path, + ), + input: None, + package_build_source: None, + sources: BTreeMap::new(), + variants: BTreeMap::new(), + dev: false, // Binary packages are never dev packages + } + } + CondaPackageData::Source(source_data) => { + let derived = LocationDerivedFields::new(&source_data.location); + + Self { + location: source_data.location.clone(), + name: (Some(source_data.name.as_source()) + != derived.name.as_ref().map(PackageName::as_source)) + .then_some(Cow::Borrowed(&source_data.name)), + version: source_data.version.as_ref().and_then(|version| { + (Some(version.as_str()) + != derived.version.as_ref().map(VersionWithSource::as_str)) + .then_some(Cow::Borrowed(version)) + }), + build: None, + build_number: None, + subdir: None, + noarch: None, + channel: None, + file_name: None, + purls: Cow::Borrowed(&source_data.purls), + depends: Cow::Borrowed(&source_data.depends), + constrains: Cow::Borrowed(&source_data.constrains), + experimental_extra_depends: Cow::Borrowed( + &source_data.experimental_extra_depends, + ), + md5: None, + legacy_bz2_md5: None, + sha256: None, + size: Cow::Borrowed(&None), + legacy_bz2_size: Cow::Borrowed(&None), + timestamp: None, + features: Cow::Borrowed(&None), + track_features: Cow::Owned(Vec::new()), + license: Cow::Borrowed(&source_data.license), + license_family: Cow::Borrowed(&None), + python_site_packages_path: Cow::Borrowed( + &source_data.python_site_packages_path, + ), + input: source_data.input.as_ref().map(|input| InputHash { + hash: input.hash, + globs: Cow::Borrowed(&input.globs), + }), + package_build_source: source_data.package_build_source.clone(), + sources: source_data.sources.clone(), + variants: source_data.variants.clone(), + dev: source_data.dev, + } + } + } + } +} + +fn strip_trailing_slash(url: &Url) -> Cow<'_, Url> { + let path = url.path(); + if path.ends_with("/") { + let mut updated_url = url.clone(); + updated_url.set_path(path.trim_end_matches('/')); + Cow::Owned(updated_url) + } else { + Cow::Borrowed(url) + } +} + +/// Helper function to check if a boolean is false (for serde `skip_serializing_if`) +fn is_false(value: &bool) -> bool { + !*value +} diff --git a/crates/rattler_lock/src/parse/models/v7/deserialize.rs b/crates/rattler_lock/src/parse/models/v7/deserialize.rs new file mode 100644 index 000000000..d4f6eac5a --- /dev/null +++ b/crates/rattler_lock/src/parse/models/v7/deserialize.rs @@ -0,0 +1,241 @@ +//! Deserialization helpers specific to V7 lock file contents. + +use std::collections::BTreeMap; + +use itertools::Itertools; +use rattler_conda_types::PackageName; +use serde::{de::Error, Deserialize}; +use serde_value::Value; + +use crate::{ + parse::{models::v7, ParseCondaLockError, V7}, + utils::derived_fields::LocationDerivedFields, + EnvironmentPackageData, PypiPackageData, UrlOrPath, +}; + +use super::super::super::deserialize::{ + HasLocation, LockFileVersion, PackageSelector, PypiSelector, ResolveCtx, +}; + +impl HasLocation for v7::CondaPackageDataModel<'static> { + fn location(&self) -> &UrlOrPath { + &self.location + } +} + +/// V7-specific package data (stores models before conversion) +#[allow(clippy::large_enum_variant)] +pub(crate) enum PackageDataV7<'a> { + Conda(v7::CondaPackageDataModel<'a>), + Pypi(v7::PypiPackageDataModel<'a>), +} + +impl<'de> Deserialize<'de> for PackageDataV7<'static> { + fn deserialize(deserializer: D) -> Result + where + D: serde::Deserializer<'de>, + { + #[derive(Deserialize)] + #[allow(clippy::large_enum_variant)] + #[serde(untagged)] + enum RawRecord { + Conda { + conda: String, + #[serde(flatten)] + extra: BTreeMap, + }, + Pypi { + pypi: String, + #[serde(flatten)] + extra: BTreeMap, + }, + } + + let record = RawRecord::deserialize(deserializer)?; + Ok(match record { + RawRecord::Conda { conda, mut extra } => { + extra.insert(Value::String(String::from("conda")), Value::String(conda)); + Self::Conda( + Value::Map(extra) + .deserialize_into() + .map_err(D::Error::custom)?, + ) + } + RawRecord::Pypi { pypi, mut extra } => { + extra.insert(Value::String(String::from("pypi")), Value::String(pypi)); + Self::Pypi( + Value::Map(extra) + .deserialize_into() + .map_err(D::Error::custom)?, + ) + } + }) + } +} + +// V7 selectors - simplified, use variants for source package disambiguation +// Binary packages are unique by location, so no version/build/subdir needed +/// Conda selector representation stored in V7 lock files. +#[derive(Deserialize)] +pub(crate) struct CondaSelectorV7 { + /// URL or path to the conda artifact referenced by the selector. + #[serde(rename = "conda")] + pub(crate) conda: UrlOrPath, + /// Optional package name used to disambiguate source artifacts. + pub(crate) name: Option, + /// Variants recorded in the lock file to disambiguate source packages. + #[serde(default)] + pub(crate) variants: BTreeMap, + /// Whether this is a dev package (only for source packages). + /// These are intended to be only used for its metadata. + #[serde(default)] + pub(crate) dev: bool, +} + +/// Selector used in V7 lock files to reference either a conda or PyPI package. +#[allow(clippy::doc_markdown)] +#[derive(Deserialize)] +#[serde(untagged)] +#[allow(clippy::large_enum_variant)] +pub(crate) enum DeserializablePackageSelectorV7 { + Conda(CondaSelectorV7), + Pypi(PypiSelector), +} + +impl PackageSelector> for DeserializablePackageSelectorV7 { + fn resolve( + self, + ctx: &mut ResolveCtx<'_, v7::CondaPackageDataModel<'static>>, + ) -> Result { + match self { + DeserializablePackageSelectorV7::Conda(selector) => { + resolve_conda_selector_v7(selector, ctx) + } + DeserializablePackageSelectorV7::Pypi(selector) => { + super::super::super::deserialize::resolve_pypi_selector(selector, ctx) + } + } + } +} + +/// Check if a binary package candidate matches the selector criteria. +fn matches_binary_candidate( + model: &v7::CondaPackageDataModel<'static>, + platform: rattler_conda_types::Platform, +) -> bool { + // Get the subdir - either from the model or derive from the URL + let derived_fields = LocationDerivedFields::new(&model.location); + let subdir = model.subdir.as_deref().or(derived_fields.subdir.as_deref()); + + // Must match the current platform's subdir OR be noarch + match subdir { + Some(subdir) => subdir == platform.as_str() || subdir == "noarch", + None => false, + } +} + +/// Check if a source package candidate matches the selector criteria. +fn matches_source_candidate( + model: &v7::CondaPackageDataModel<'static>, + expected_variants: &std::collections::BTreeMap, + expected_dev: bool, +) -> bool { + // Dev field must match + if model.dev != expected_dev { + return false; + } + + // Source package - all expected variants must match + expected_variants + .iter() + .all(|(expected_key, expected_value)| { + model + .variants + .get(expected_key) + .is_some_and(|v| v == expected_value) + }) +} + +/// Check if the package name matches the selector criteria. +fn matches_name( + model: &v7::CondaPackageDataModel<'static>, + expected_name: &Option, +) -> bool { + match (expected_name, &model.name) { + (Some(expected), Some(model_name)) => expected == model_name.as_ref(), + (None, _) => true, + _ => false, + } +} + +/// Resolve a V7 conda selector using simplified logic with models: +/// - Binary packages: match by location + subdir (using model's subdir field) +/// - Source packages: match by location + name + variants (using model's variants field) +fn resolve_conda_selector_v7( + selector: CondaSelectorV7, + ctx: &mut ResolveCtx<'_, v7::CondaPackageDataModel<'static>>, +) -> Result { + let CondaSelectorV7 { + conda, + name, + variants, + dev, + } = selector; + + let candidates = ctx + .conda_url_lookup + .get(&conda) + .map_or(&[] as &[usize], Vec::as_slice); + + // Find matching package using model fields + let package_index = candidates + .iter() + .find(|&&idx| { + let model = &ctx.conda_packages[idx]; + + // Name must match if specified + if !matches_name(model, &name) { + return false; + } + + // Check if this is a binary or source package + // Binary packages have a filename that has an archive extension. + let is_binary = model.location.file_name().is_some_and(|name| { + rattler_conda_types::package::ArchiveType::try_from(name).is_some() + }); + + if is_binary { + // Binary packages ignore the dev field (they're never dev) + matches_binary_candidate(model, ctx.platform) + } else { + matches_source_candidate(model, &variants, dev) + } + }) + .copied(); + + let package_index = package_index.ok_or_else(|| { + ParseCondaLockError::MissingPackage( + ctx.environment_name.to_string(), + ctx.platform, + conda.clone(), + ) + })?; + + Ok(EnvironmentPackageData::Conda(package_index)) +} + +// Implement LockFileVersion for V7 +impl LockFileVersion for V7 { + type PackageData = PackageDataV7<'static>; + type Selector = DeserializablePackageSelectorV7; + type CondaPackage = v7::CondaPackageDataModel<'static>; + + fn extract_packages( + packages: Vec, + ) -> Result<(Vec, Vec), ParseCondaLockError> { + Ok(packages.into_iter().partition_map(|package| match package { + PackageDataV7::Conda(model) => itertools::Either::Left(model), + PackageDataV7::Pypi(model) => itertools::Either::Right(model.into()), + })) + } +} diff --git a/crates/rattler_lock/src/parse/models/v7/mod.rs b/crates/rattler_lock/src/parse/models/v7/mod.rs new file mode 100644 index 000000000..97d438731 --- /dev/null +++ b/crates/rattler_lock/src/parse/models/v7/mod.rs @@ -0,0 +1,7 @@ +mod conda_package_data; +pub(crate) mod deserialize; +mod pypi_package_data; +mod source_data; + +pub(crate) use conda_package_data::CondaPackageDataModel; +pub(crate) use pypi_package_data::PypiPackageDataModel; diff --git a/crates/rattler_lock/src/parse/models/v7/pypi_package_data.rs b/crates/rattler_lock/src/parse/models/v7/pypi_package_data.rs new file mode 100644 index 000000000..926e1b1e8 --- /dev/null +++ b/crates/rattler_lock/src/parse/models/v7/pypi_package_data.rs @@ -0,0 +1,4 @@ +// V7 pypi package data models - re-export from v6 as they're identical +// PyPI package format hasn't changed between v6 and v7 + +pub(crate) use super::super::v6::pypi_package_data::PypiPackageDataModel; diff --git a/crates/rattler_lock/src/parse/models/v7/source_data.rs b/crates/rattler_lock/src/parse/models/v7/source_data.rs new file mode 100644 index 000000000..9f4b1fa7c --- /dev/null +++ b/crates/rattler_lock/src/parse/models/v7/source_data.rs @@ -0,0 +1,6 @@ +// V7 source data models - re-export from v6 as they're identical +// Source data serialization (git/url/path locations) hasn't changed between v6 and v7 + +pub(crate) use super::super::v6::source_data::{ + PackageBuildSourceSerializer, SourceLocationSerializer, +}; diff --git a/crates/rattler_lock/src/parse/serialize.rs b/crates/rattler_lock/src/parse/serialize.rs index 96287f1a1..c7579a09c 100644 --- a/crates/rattler_lock/src/parse/serialize.rs +++ b/crates/rattler_lock/src/parse/serialize.rs @@ -6,16 +6,17 @@ use std::{ use itertools::Itertools; use pep508_rs::ExtraName; -use rattler_conda_types::{PackageName, Platform, VersionWithSource}; +use rattler_conda_types::{PackageName, Platform}; use serde::{Serialize, Serializer}; use serde_with::{serde_as, SerializeAs}; use url::Url; use crate::{ file_format_version::FileFormatVersion, - parse::{models::v6, V6}, - Channel, CondaPackageData, EnvironmentData, EnvironmentPackageData, LockFile, LockFileInner, - PypiIndexes, PypiPackageData, PypiPackageEnvironmentData, SolveOptions, UrlOrPath, + parse::{models, V7}, + Channel, CondaBinaryData, CondaPackageData, CondaSourceData, EnvironmentData, + EnvironmentPackageData, LockFile, LockFileInner, PypiIndexes, PypiPackageData, + PypiPackageEnvironmentData, SolveOptions, UrlOrPath, }; #[serde_as] @@ -41,50 +42,48 @@ struct SerializableEnvironment<'a> { } impl<'a> SerializableEnvironment<'a> { - fn from_environment( + fn from_environment( inner: &'a LockFileInner, env_data: &'a EnvironmentData, used_conda_packages: &HashSet, used_pypi_packages: &HashSet, - ) -> Self { - SerializableEnvironment { + ) -> Result { + let mut packages = BTreeMap::new(); + + for (platform, platform_packages) in &env_data.packages { + let mut selectors = Vec::new(); + for &package_data in platform_packages { + let selector = SerializablePackageSelector::from_lock_file( + inner, + package_data, + *platform, + used_conda_packages, + used_pypi_packages, + )?; + selectors.push(selector); + } + selectors.sort(); + packages.insert(*platform, selectors); + } + + Ok(SerializableEnvironment { channels: &env_data.channels, indexes: env_data.indexes.as_ref(), options: env_data.options.clone(), - packages: env_data - .packages - .iter() - .map(|(platform, packages)| { - ( - *platform, - packages - .iter() - .map(|&package_data| { - SerializablePackageSelector::from_lock_file( - inner, - package_data, - used_conda_packages, - used_pypi_packages, - ) - }) - .sorted() - .collect(), - ) - }) - .collect(), - } + packages, + }) } } #[allow(clippy::large_enum_variant)] #[derive(Serialize, Eq, PartialEq)] #[serde(untagged)] -enum SerializablePackageDataV6<'a> { - Conda(v6::CondaPackageDataModel<'a>), - Pypi(v6::PypiPackageDataModel<'a>), +enum SerializablePackageDataV7<'a> { + Conda(models::v7::CondaPackageDataModel<'a>), + Pypi(models::v7::PypiPackageDataModel<'a>), } -impl<'a> From> for SerializablePackageDataV6<'a> { +impl<'a> From> for SerializablePackageDataV7<'a> { fn from(package: PackageData<'a>) -> Self { match package { PackageData::Conda(p) => Self::Conda(p.into()), @@ -100,12 +99,13 @@ enum SerializablePackageSelector<'a> { conda: &'a UrlOrPath, #[serde(skip_serializing_if = "Option::is_none")] name: Option<&'a PackageName>, - #[serde(skip_serializing_if = "Option::is_none")] - version: Option<&'a VersionWithSource>, - #[serde(skip_serializing_if = "Option::is_none")] - build: Option<&'a str>, - #[serde(skip_serializing_if = "Option::is_none")] - subdir: Option<&'a str>, + // V7: variants for source package disambiguation + // Binary packages have empty variants map + #[serde(skip_serializing_if = "BTreeMap::is_empty", default)] + variants: BTreeMap, + // Dev field for source packages (skip serializing if false) + #[serde(skip_serializing_if = "is_false", default)] + dev: bool, }, Pypi { pypi: &'a UrlOrPath, @@ -114,114 +114,44 @@ enum SerializablePackageSelector<'a> { }, } -#[derive(Copy, Clone)] -enum CondaDisambiguityFilter { - Name, - Version, - Build, - Subdir, -} - -impl CondaDisambiguityFilter { - fn all() -> [CondaDisambiguityFilter; 4] { - [Self::Name, Self::Version, Self::Build, Self::Subdir] - } - - fn filter(&self, package: &CondaPackageData, other: &CondaPackageData) -> bool { - match self { - Self::Name => package.record().name == other.record().name, - Self::Version => package.record().version == other.record().version, - Self::Build => package.record().build == other.record().build, - Self::Subdir => package.record().subdir == other.record().subdir, - } - } -} - impl<'a> SerializablePackageSelector<'a> { - fn from_lock_file( + fn from_lock_file( inner: &'a LockFileInner, package: EnvironmentPackageData, + platform: Platform, used_conda_packages: &HashSet, used_pypi_packages: &HashSet, - ) -> Self { + ) -> Result { match package { - EnvironmentPackageData::Conda(idx) => { - Self::from_conda(inner, &inner.conda_packages[idx], used_conda_packages) - } - EnvironmentPackageData::Pypi(pkg_data_idx, env_data_idx) => Self::from_pypi( + EnvironmentPackageData::Conda(idx) => Self::from_conda( + inner, + &inner.conda_packages[idx], + platform, + used_conda_packages, + ), + EnvironmentPackageData::Pypi(pkg_data_idx, env_data_idx) => Ok(Self::from_pypi( inner, &inner.pypi_packages[pkg_data_idx], &inner.pypi_environment_package_data[env_data_idx], used_pypi_packages, - ), + )), } } - fn from_conda( + fn from_conda( inner: &'a LockFileInner, package: &'a CondaPackageData, + platform: Platform, used_conda_packages: &HashSet, - ) -> Self { - // Find all packages that share the same location - let mut similar_packages = inner - .conda_packages - .iter() - .enumerate() - .filter_map(|(idx, p)| used_conda_packages.contains(&idx).then_some(p)) - .filter(|p| p.location() == package.location()) - .collect::>(); - - // Iterate over other distinguishing factors and reduce the set of possible - // packages to a minimum with the least number of keys added. - let mut name = None; - let mut version = None; - let mut build = None; - let mut subdir = None; - while similar_packages.len() > 1 { - let (filter, similar) = CondaDisambiguityFilter::all() - .into_iter() - .map(|filter| { - ( - filter, - similar_packages - .iter() - .copied() - .filter(|p| filter.filter(package, p)) - .collect_vec(), - ) - }) - .min_by_key(|(_filter, set)| set.len()) - .expect("cannot be empty because the set should always contain `package`"); - - if similar.len() == similar_packages.len() { - // No further disambiguation possible. Assume that the package is a duplicate. - break; + ) -> Result { + match package { + CondaPackageData::Binary(_) => { + Self::build_binary_selector(inner, package, platform, used_conda_packages) } - - similar_packages = similar; - match filter { - CondaDisambiguityFilter::Name => { - name = Some(&package.record().name); - } - CondaDisambiguityFilter::Version => { - version = Some(&package.record().version); - } - CondaDisambiguityFilter::Build => { - build = Some(package.record().build.as_str()); - } - CondaDisambiguityFilter::Subdir => { - subdir = Some(package.record().subdir.as_str()); - } + CondaPackageData::Source(_) => { + Self::build_source_selector(inner, package, used_conda_packages) } } - - Self::Conda { - conda: package.location(), - name, - version, - build, - subdir, - } } fn from_pypi( @@ -237,6 +167,195 @@ impl<'a> SerializablePackageSelector<'a> { } } +/// Determine the smallest set of variant key/value pairs that uniquely identify +/// `target` among the remaining conflicting source packages. +fn select_minimal_variant_keys<'a>( + target: &'a CondaSourceData, + mut conflicts: Vec<&'a CondaSourceData>, +) -> Option> { + let mut selected = BTreeMap::new(); + + // Keep picking discriminating keys until no conflicting packages remain. + while !conflicts.is_empty() { + let mut best: Option<(String, crate::VariantValue, Vec<&CondaSourceData>)> = None; + + for (key, value) in &target.variants { + if selected.contains_key(key) { + continue; + } + + // Restrict conflicts to those that share the current key/value combo. + let matching: Vec<&CondaSourceData> = conflicts + .iter() + .copied() + .filter(|candidate| candidate.variants.get(key) == Some(value)) + .collect(); + + if matching.len() == conflicts.len() { + continue; + } + + match &best { + Some((best_key, _best_value, best_matching)) => { + if matching.len() < best_matching.len() + || (matching.len() == best_matching.len() && key < best_key) + { + best = Some((key.clone(), value.clone(), matching)); + } + } + None => best = Some((key.clone(), value.clone(), matching)), + } + } + + // If no new key can reduce the conflict set, disambiguation fails. + let (key, value, reduced) = best?; + selected.insert(key, value); + conflicts = reduced; + } + + Some(selected) +} + +impl<'a> SerializablePackageSelector<'a> { + /// Serialize a binary package selector, erroring if multiple binaries remain. + fn build_binary_selector( + inner: &'a LockFileInner, + package: &'a CondaPackageData, + platform: Platform, + used_conda_packages: &HashSet, + ) -> Result { + let binary = package + .as_binary() + .expect("build_binary_selector should only be called for binary packages"); + + // Gather all binary packages at the same location that apply to the platform. + let candidates: Vec<&CondaBinaryData> = inner + .conda_packages + .iter() + .enumerate() + .filter(|(idx, p)| { + used_conda_packages.contains(idx) && p.location() == package.location() + }) + .filter_map(|(_, p)| p.as_binary()) + .filter(|candidate| { + candidate.package_record.subdir == platform.as_str() + || candidate.package_record.subdir == "noarch" + }) + .collect(); + + // The target binary must still be present after filtering. + if candidates.is_empty() + || !candidates + .iter() + .any(|candidate| std::ptr::eq(*candidate, binary)) + { + return Err(E::custom(format!( + "Failed to locate binary package '{}' for platform '{}'.", + package.location(), + platform.as_str() + ))); + } + + // If more than one candidate survives, we cannot serialize an unambiguous selector. + if candidates.len() > 1 { + return Err(E::custom(format!( + "Failed to disambiguate binary packages at location '{}' for platform '{}'. \ + Multiple packages share the same location and subdir.", + package.location(), + platform.as_str() + ))); + } + + Ok(Self::Conda { + conda: package.location(), + name: None, + variants: BTreeMap::new(), + dev: false, // Binary packages are never dev + }) + } + + /// Serialize a source selector, emitting the minimal variant subset needed. + fn build_source_selector( + inner: &'a LockFileInner, + package: &'a CondaPackageData, + used_conda_packages: &HashSet, + ) -> Result { + let source = package + .as_source() + .expect("build_source_selector should only be called for source packages"); + + // Collect every source package referenced from the same location. + let similar_sources: Vec<&CondaSourceData> = inner + .conda_packages + .iter() + .enumerate() + .filter(|(idx, p)| { + used_conda_packages.contains(idx) && p.location() == package.location() + }) + .filter_map(|(_, p)| p.as_source()) + .collect(); + + // Include the package name if multiple names exist at this location. + let include_name = similar_sources + .iter() + .any(|candidate| !std::ptr::eq(*candidate, source) && candidate.name != source.name); + + let mut conflicts: Vec<&CondaSourceData> = similar_sources + .into_iter() + .filter(|candidate| !std::ptr::eq(*candidate, source)) + .collect(); + + if include_name { + conflicts.retain(|candidate| candidate.name == source.name); + } + + // Filter out packages with different dev status - they're already disambiguated + conflicts.retain(|candidate| candidate.dev == source.dev); + + let variants = select_minimal_variant_keys(source, conflicts.clone()).ok_or_else(|| { + // Build a list of all conflicting packages for the error message + let mut all_packages = vec![source]; + all_packages.extend(conflicts.iter().copied()); + + let package_details: Vec = all_packages + .iter() + .map(|pkg| { + let version_str = pkg.version + .as_ref() + .map(|v| format!(" (version: {v})")) + .unwrap_or_default(); + let variants_str = if pkg.variants.is_empty() { + String::new() + } else { + let variant_pairs: Vec = pkg.variants + .iter() + .map(|(k, v)| format!("{k}={v}")) + .collect(); + format!(" [variants: {}]", variant_pairs.join(", ")) + }; + format!(" - {}{}{}", pkg.name.as_normalized(), version_str, variants_str) + }) + .collect(); + + E::custom(format!( + "Failed to disambiguate source packages at location '{}'. \ + Multiple source packages exist but cannot be distinguished without variant information. \ + This typically occurs when converting from lock file format V6 to V7.\n\ + Conflicting packages:\n{}", + package.location(), + package_details.join("\n") + )) + })?; + + Ok(Self::Conda { + conda: package.location(), + name: include_name.then_some(package.name()), + variants, + dev: source.dev, + }) + } +} + impl PartialOrd for SerializablePackageSelector<'_> { fn partial_cmp(&self, other: &Self) -> Option { Some(self.cmp(other)) @@ -264,22 +383,19 @@ impl Ord for SerializablePackageSelector<'_> { SerializablePackageSelector::Conda { conda: a, name: name_a, - build: build_a, - version: version_a, - subdir: subdir_a, + variants: variants_a, + dev: dev_a, }, SerializablePackageSelector::Conda { conda: b, name: name_b, - build: build_b, - version: version_b, - subdir: subdir_b, + variants: variants_b, + dev: dev_b, }, ) => compare_url_by_location(a, b) .then_with(|| name_a.cmp(name_b)) - .then_with(|| version_a.cmp(version_b)) - .then_with(|| build_a.cmp(build_b)) - .then_with(|| subdir_a.cmp(subdir_b)), + .then_with(|| variants_a.cmp(variants_b)) + .then_with(|| dev_a.cmp(dev_b)), ( SerializablePackageSelector::Pypi { pypi: a, .. }, SerializablePackageSelector::Pypi { pypi: b, .. }, @@ -319,12 +435,12 @@ fn compare_url_by_location(a: &UrlOrPath, b: &UrlOrPath) -> Ordering { } } -impl<'a> SerializeAs> for V6 { +impl<'a> SerializeAs> for V7 { fn serialize_as(source: &PackageData<'a>, serializer: S) -> Result where S: Serializer, { - SerializablePackageDataV6::from(*source).serialize(serializer) + SerializablePackageDataV7::from(*source).serialize(serializer) } } @@ -354,21 +470,16 @@ impl Serialize for LockFile { } // Collect all environments - let environments = inner - .environment_lookup - .iter() - .map(|(name, env_idx)| { - ( - name, - SerializableEnvironment::from_environment( - inner, - &inner.environments[*env_idx], - &used_conda_packages, - &used_pypi_packages, - ), - ) - }) - .collect::>(); + let mut environments = BTreeMap::new(); + for (name, env_idx) in &inner.environment_lookup { + let env = SerializableEnvironment::from_environment( + inner, + &inner.environments[*env_idx], + &used_conda_packages, + &used_pypi_packages, + )?; + environments.insert(name, env); + } // Get all packages. let conda_packages = inner @@ -389,11 +500,12 @@ impl Serialize for LockFile { // for more information. let packages = itertools::chain!(conda_packages, pypi_packages).sorted(); + // Always serialize using the LATEST version let raw = SerializableLockFile { version: FileFormatVersion::LATEST, environments, packages: packages.collect(), - _version: PhantomData::, + _version: PhantomData::, }; raw.serialize(serializer) @@ -409,7 +521,7 @@ pub enum PackageData<'a> { impl PackageData<'_> { fn source_name(&self) -> &str { match self { - PackageData::Conda(p) => p.record().name.as_source(), + PackageData::Conda(p) => p.name().as_source(), PackageData::Pypi(p) => p.name.as_ref(), } } @@ -440,7 +552,7 @@ impl Serialize for CondaPackageData { where S: Serializer, { - SerializablePackageDataV6::Conda(v6::CondaPackageDataModel::from(self)) + SerializablePackageDataV7::Conda(models::v7::CondaPackageDataModel::from(self)) .serialize(serializer) } } @@ -450,6 +562,140 @@ impl Serialize for PypiPackageData { where S: Serializer, { - SerializablePackageDataV6::Pypi(v6::PypiPackageDataModel::from(self)).serialize(serializer) + SerializablePackageDataV7::Pypi(models::v7::PypiPackageDataModel::from(self)) + .serialize(serializer) + } +} + +/// Helper function to check if a boolean is false (for serde `skip_serializing_if`) +fn is_false(value: &bool) -> bool { + !*value +} + +#[cfg(test)] +mod tests { + use super::select_minimal_variant_keys; + use crate::{CondaSourceData, UrlOrPath, VariantValue}; + use rattler_conda_types::PackageName; + use std::collections::BTreeMap; + use std::str::FromStr; + use url::Url; + + fn make_source( + name: &str, + location: &str, + variants: BTreeMap, + ) -> CondaSourceData { + CondaSourceData { + name: PackageName::from_str(name).unwrap(), + version: None, + location: UrlOrPath::from(Url::parse(location).unwrap()), + variants, + depends: Vec::new(), + constrains: Vec::new(), + experimental_extra_depends: BTreeMap::new(), + license: None, + purls: None, + sources: BTreeMap::new(), + input: None, + package_build_source: None, + python_site_packages_path: None, + dev: false, + } + } + + /// Only one variant key differs (python version), so a single key should be selected. + #[test] + fn selects_single_variant_key() { + let mut target_variants = BTreeMap::new(); + target_variants.insert( + "python".to_string(), + VariantValue::String("3.10".to_string()), + ); + let target = make_source("foo", "https://example.org/pkg", target_variants); + + let mut other_variants = BTreeMap::new(); + other_variants.insert( + "python".to_string(), + VariantValue::String("3.11".to_string()), + ); + let other = make_source("foo", "https://example.org/pkg", other_variants); + + let selected = + select_minimal_variant_keys(&target, vec![&other]).expect("should disambiguate"); + assert_eq!(selected.len(), 1); + assert_eq!( + selected.get("python"), + Some(&VariantValue::String("3.10".to_string())) + ); + } + + /// Two variants (`cuda` + `blas_impl`) are necessary to eliminate all conflicts. + #[test] + fn selects_multiple_variant_keys_when_needed() { + let mut target_variants = BTreeMap::new(); + target_variants.insert( + "python".to_string(), + VariantValue::String("3.10".to_string()), + ); + target_variants.insert("cuda".to_string(), VariantValue::String("11.8".to_string())); + target_variants.insert( + "blas_impl".to_string(), + VariantValue::String("openblas".to_string()), + ); + let target = make_source("foo", "https://example.org/pkg", target_variants); + + let mut other1_variants = BTreeMap::new(); + other1_variants.insert( + "python".to_string(), + VariantValue::String("3.10".to_string()), + ); + other1_variants.insert("cuda".to_string(), VariantValue::String("11.2".to_string())); + other1_variants.insert( + "blas_impl".to_string(), + VariantValue::String("openblas".to_string()), + ); + let other1 = make_source("foo", "https://example.org/pkg", other1_variants); + + let mut other2_variants = BTreeMap::new(); + other2_variants.insert( + "python".to_string(), + VariantValue::String("3.10".to_string()), + ); + other2_variants.insert("cuda".to_string(), VariantValue::String("11.8".to_string())); + other2_variants.insert( + "blas_impl".to_string(), + VariantValue::String("mkl".to_string()), + ); + let other2 = make_source("foo", "https://example.org/pkg", other2_variants); + + let selected = select_minimal_variant_keys(&target, vec![&other1, &other2]) + .expect("should disambiguate"); + assert_eq!(selected.len(), 2); + assert_eq!( + selected.get("cuda"), + Some(&VariantValue::String("11.8".to_string())) + ); + assert_eq!( + selected.get("blas_impl"), + Some(&VariantValue::String("openblas".to_string())) + ); + } + + /// Identical variant maps cannot be distinguished, so the helper must fail. + #[test] + fn returns_none_when_variants_insufficient() { + let mut target_variants = BTreeMap::new(); + target_variants.insert( + "python".to_string(), + VariantValue::String("3.10".to_string()), + ); + let target = make_source("foo", "https://example.org/pkg", target_variants.clone()); + let other = make_source("foo", "https://example.org/pkg", target_variants); + + assert!( + select_minimal_variant_keys(&target, vec![&other]).is_none(), + "expected disambiguation failure" + ); } } diff --git a/crates/rattler_lock/src/snapshots/rattler_lock__builder__test__merge_records_and_purls.snap b/crates/rattler_lock/src/snapshots/rattler_lock__builder__test__merge_records_and_purls.snap index a8a71d82c..10cabe425 100644 --- a/crates/rattler_lock/src/snapshots/rattler_lock__builder__test__merge_records_and_purls.snap +++ b/crates/rattler_lock/src/snapshots/rattler_lock__builder__test__merge_records_and_purls.snap @@ -2,7 +2,7 @@ source: crates/rattler_lock/src/builder.rs expression: lock_file.render_to_string().unwrap() --- -version: 6 +version: 7 environments: default: channels: [] diff --git a/crates/rattler_lock/src/snapshots/rattler_lock__test__v0__numpy-conda-lock.yml.snap b/crates/rattler_lock/src/snapshots/rattler_lock__test__v0__numpy-conda-lock.yml.snap index bb0263448..dac266d3e 100644 --- a/crates/rattler_lock/src/snapshots/rattler_lock__test__v0__numpy-conda-lock.yml.snap +++ b/crates/rattler_lock/src/snapshots/rattler_lock__test__v0__numpy-conda-lock.yml.snap @@ -2,7 +2,7 @@ source: crates/rattler_lock/src/lib.rs expression: conda_lock --- -version: 6 +version: 7 environments: default: channels: diff --git a/crates/rattler_lock/src/snapshots/rattler_lock__test__v0__pypi-matplotlib-conda-lock.yml.snap b/crates/rattler_lock/src/snapshots/rattler_lock__test__v0__pypi-matplotlib-conda-lock.yml.snap index edfda1888..e342deb26 100644 --- a/crates/rattler_lock/src/snapshots/rattler_lock__test__v0__pypi-matplotlib-conda-lock.yml.snap +++ b/crates/rattler_lock/src/snapshots/rattler_lock__test__v0__pypi-matplotlib-conda-lock.yml.snap @@ -2,7 +2,7 @@ source: crates/rattler_lock/src/lib.rs expression: conda_lock --- -version: 6 +version: 7 environments: default: channels: diff --git a/crates/rattler_lock/src/snapshots/rattler_lock__test__v0__python-conda-lock.yml.snap b/crates/rattler_lock/src/snapshots/rattler_lock__test__v0__python-conda-lock.yml.snap index 0eafd04d2..f03c3df50 100644 --- a/crates/rattler_lock/src/snapshots/rattler_lock__test__v0__python-conda-lock.yml.snap +++ b/crates/rattler_lock/src/snapshots/rattler_lock__test__v0__python-conda-lock.yml.snap @@ -2,7 +2,7 @@ source: crates/rattler_lock/src/lib.rs expression: conda_lock --- -version: 6 +version: 7 environments: default: channels: diff --git a/crates/rattler_lock/src/snapshots/rattler_lock__test__v3__robostack-turtlesim-conda-lock.yml.snap b/crates/rattler_lock/src/snapshots/rattler_lock__test__v3__robostack-turtlesim-conda-lock.yml.snap index f52d882c1..d8c47d9de 100644 --- a/crates/rattler_lock/src/snapshots/rattler_lock__test__v3__robostack-turtlesim-conda-lock.yml.snap +++ b/crates/rattler_lock/src/snapshots/rattler_lock__test__v3__robostack-turtlesim-conda-lock.yml.snap @@ -2,7 +2,7 @@ source: crates/rattler_lock/src/lib.rs expression: conda_lock --- -version: 6 +version: 7 environments: default: channels: @@ -14,18 +14,14 @@ environments: - 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/aiohttp-3.8.4-py310h2372a71_1.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.3.1-pyhd8ed1ab_0.tar.bz2" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.8-h166bdaf_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/linux-64/aom-3.5.0-h27087fc_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.1.1-pyhd8ed1ab_0.conda" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/linux-64/assimp-5.2.5-hf40c2ba_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/async-timeout-4.0.2-pyhd8ed1ab_0.tar.bz2" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/linux-64/atk-1.0-2.38.0-hd4edc92_1.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/linux-64/attr-2.5.1-h166bdaf_1.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/attrs-23.1.0-pyh71513ae_1.conda" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/linux-64/boost-1.78.0-py310hc4a4660_4.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/linux-64/boost-cpp-1.78.0-h5adbc97_2.conda" - conda: "https://conda.anaconda.org/conda-forge/linux-64/brotli-1.0.9-h166bdaf_9.conda" @@ -37,52 +33,37 @@ environments: - conda: "https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2023.5.7-hbcca054_0.conda" - conda: "https://conda.anaconda.org/conda-forge/linux-64/cairo-1.16.0-ha61ee94_1014.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/catkin_pkg-0.5.2-pyhd8ed1ab_0.tar.bz2" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/certifi-2023.5.7-pyhd8ed1ab_0.conda" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/linux-64/cffi-1.15.1-py310h255011f_3.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.2.0-pyhd8ed1ab_0.conda" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/linux-64/cmake-3.26.3-h077f3f9_0.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/linux-64/console_bridge-1.0.2-h924138e_1.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.1.0-py310hd41b1e2_0.conda" - conda: "https://conda.anaconda.org/conda-forge/linux-64/cppcheck-2.10.3-py310he65e294_0.conda" - conda: "https://conda.anaconda.org/conda-forge/linux-64/cryptography-41.0.1-py310h75e40e8_0.conda" - conda: "https://conda.anaconda.org/conda-forge/linux-64/curl-7.88.1-hdc1c0ab_1.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/cycler-0.11.0-pyhd8ed1ab_0.tar.bz2" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/linux-64/dbus-1.13.6-h5008d03_3.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/distro-1.8.0-pyhd8ed1ab_0.conda" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/linux-64/docutils-0.20.1-py310hff52083_0.conda" - conda: "https://conda.anaconda.org/conda-forge/linux-64/double-conversion-3.2.0-h27087fc_1.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/linux-64/eigen-3.4.0-h4bd325d_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/empy-3.3.4-pyh9f0ad1d_1.tar.bz2" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.1.2-pyhd8ed1ab_0.conda" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/linux-64/expat-2.5.0-hcb278e6_1.conda" - conda: "https://conda.anaconda.org/conda-forge/linux-64/ffmpeg-5.1.2-gpl_h8dda1f0_106.conda" - conda: "https://conda.anaconda.org/conda-forge/linux-64/fftw-3.3.10-nompi_hc118613_108.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/flake8-6.0.0-pyhd8ed1ab_0.conda" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/linux-64/flann-1.9.1-he05ef13_1011.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/linux-64/fmt-9.1.0-h924138e_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-hab24e00_0.tar.bz2" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.14.2-h14ed4e7_0.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.40.0-py310h2372a71_0.conda" - conda: "https://conda.anaconda.org/conda-forge/linux-64/foonathan-memory-0.7.2-h27087fc_1.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-h9c3ff4c_1.tar.bz2" @@ -113,14 +94,10 @@ environments: - conda: "https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.12.2-nompi_h4df4325_101.conda" - conda: "https://conda.anaconda.org/conda-forge/linux-64/icu-70.1-h27087fc_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/idna-3.4-pyhd8ed1ab_0.tar.bz2" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/linux-64/imath-3.1.6-h6239696_1.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-6.8.0-pyha770c72_0.conda" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.0.0-pyhd8ed1ab_0.conda" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/linux-64/jack-1.9.22-h11f4161_0.conda" - conda: "https://conda.anaconda.org/conda-forge/linux-64/jasper-2.0.33-h0ff4b12_1.conda" - conda: "https://conda.anaconda.org/conda-forge/linux-64/jpeg-9e-h0b41bf4_3.conda" @@ -131,7 +108,6 @@ environments: - conda: "https://conda.anaconda.org/conda-forge/linux-64/krb5-1.20.1-h81ceb04_0.conda" - conda: "https://conda.anaconda.org/conda-forge/linux-64/lame-3.100-h166bdaf_1003.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/lark-parser-0.12.0-pyhd8ed1ab_0.tar.bz2" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.14-h6ed2654_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-h41732ed_0.conda" - conda: "https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2" @@ -215,11 +191,9 @@ environments: - conda: "https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.4-hcb278e6_0.conda" - conda: "https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.7.1-py310he60537e_0.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/mccabe-0.7.0-pyhd8ed1ab_0.tar.bz2" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/linux-64/mpg123-1.31.3-hcb278e6_0.conda" - conda: "https://conda.anaconda.org/conda-forge/linux-64/multidict-6.0.4-py310h1fa729e_0.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/linux-64/mysql-common-8.0.33-hf1915f5_1.conda" - conda: "https://conda.anaconda.org/conda-forge/linux-64/mysql-libs-8.0.33-hca2cd23_1.conda" - conda: "https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.4-hcb278e6_0.conda" @@ -236,20 +210,16 @@ environments: - conda: "https://conda.anaconda.org/conda-forge/linux-64/orocos-kdl-1.5.1-h27087fc_4.conda" - conda: "https://conda.anaconda.org/conda-forge/linux-64/p11-kit-0.24.1-hc5aa10d_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/packaging-23.1-pyhd8ed1ab_0.conda" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/linux-64/pango-1.50.14-hd33c08f_0.conda" - conda: "https://conda.anaconda.org/conda-forge/linux-64/pcl-1.12.1-he8b3650_4.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/linux-64/pcre-8.45-h9c3ff4c_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.40-hc3806b6_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/pep517-0.13.0-pyhd8ed1ab_0.tar.bz2" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/linux-64/pillow-9.2.0-py310h454ad03_3.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/linux-64/pixman-0.40.0-h36c2ea0_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/linux-64/pkg-config-0.29.2-h36c2ea0_1008.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/pluggy-1.2.0-pyhd8ed1ab_0.conda" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/ply-3.11-py_1.tar.bz2" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/linux-64/proj-9.1.0-h93bde94_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/linux-64/psutil-5.9.5-py310h1fa729e_0.conda" - conda: "https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-h36c2ea0_1001.tar.bz2" @@ -260,32 +230,22 @@ environments: - conda: "https://conda.anaconda.org/conda-forge/linux-64/py-opencv-4.6.0-py310hfdc917e_8.conda" - conda: "https://conda.anaconda.org/conda-forge/linux-64/pybind11-2.10.4-py310hdf3cbec_0.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/pybind11-abi-4-hd8ed1ab_3.tar.bz2" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/linux-64/pybind11-global-2.10.4-py310hdf3cbec_0.conda" - conda: "https://conda.anaconda.org/conda-forge/linux-64/pybullet-3.24-py310h769672d_0.conda" - conda: "https://conda.anaconda.org/conda-forge/linux-64/pycairo-1.24.0-py310hda9f760_0.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/pycodestyle-2.10.0-pyhd8ed1ab_0.conda" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/pycparser-2.21-pyhd8ed1ab_0.tar.bz2" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/pydocstyle-6.3.0-pyhd8ed1ab_0.conda" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/linux-64/pydot-1.4.2-py310hff52083_3.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/pyflakes-3.0.1-pyhd8ed1ab_0.conda" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/pygments-2.15.1-pyhd8ed1ab_0.conda" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.0-pyhd8ed1ab_0.conda" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/linux-64/pyqt-5.15.7-py310hab646b1_3.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/pyqt-builder-1.15.1-pyhd8ed1ab_0.conda" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/linux-64/pyqt5-sip-12.11.0-py310heca2aa9_3.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/pytest-7.4.0-pyhd8ed1ab_0.conda" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/linux-64/python-3.10.12-hd12c33a_0_cpython.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.8.2-pyhd8ed1ab_0.tar.bz2" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.10-3_cp310.conda" - conda: "https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0-py310h5764c6d_5.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h4bd325d_2.tar.bz2" @@ -583,14 +543,11 @@ environments: - conda: "https://conda.anaconda.org/robostack-staging/linux-64/ros2-distro-mutex-0.3.0-humble.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/linux-64/rosdistro-0.9.0-py310hff52083_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/rospkg-1.5.0-pyhd8ed1ab_0.conda" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/linux-64/sdl2-2.26.5-h949db6a_0.conda" - conda: "https://conda.anaconda.org/conda-forge/linux-64/setuptools-61.0.0-py310hff52083_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/linux-64/sip-6.7.9-py310hc6cd4ac_0.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/linux-64/spdlog-1.11.0-h9b3ece8_1.conda" - conda: "https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.42.0-h2c6b66d_0.conda" - conda: "https://conda.anaconda.org/conda-forge/linux-64/svt-av1-1.4.1-hcb278e6_0.conda" @@ -600,21 +557,15 @@ environments: - conda: "https://conda.anaconda.org/conda-forge/linux-64/tinyxml2-9.0.0-h9c3ff4c_2.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.12-h27826a3_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_0.tar.bz2" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.7.1-hd8ed1ab_0.conda" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.7.1-pyha770c72_0.conda" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/tzdata-2023c-h71feb2d_0.conda" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/linux-64/uncrustify-0.74.0-h27087fc_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-15.0.0-py310h5764c6d_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/linux-64/utfcpp-3.2.3-ha770c72_0.conda" - conda: "https://conda.anaconda.org/conda-forge/linux-64/vtk-9.2.2-qt_py310hc895abb_205.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/wslink-1.11.1-pyhd8ed1ab_0.conda" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/linux-64/x264-1!164.3095-h166bdaf_2.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/linux-64/x265-3.5-h924138e_3.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/linux-64/xcb-util-0.4.0-h516909a_0.tar.bz2" @@ -649,23 +600,18 @@ environments: - conda: "https://conda.anaconda.org/conda-forge/linux-64/yaml-cpp-0.7.0-h27087fc_2.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/linux-64/yarl-1.9.2-py310h2372a71_0.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/zipp-3.16.0-pyhd8ed1ab_0.conda" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/linux-64/zlib-1.2.13-hd590300_5.conda" - conda: "https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.2-hfc55251_7.conda" - conda: "https://conda.anaconda.org/conda-forge/linux-64/zziplib-0.13.69-h27826a3_1.tar.bz2" osx-64: - conda: "https://conda.anaconda.org/conda-forge/osx-64/aiohttp-3.8.4-py310h6729b98_1.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.3.1-pyhd8ed1ab_0.tar.bz2" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/osx-64/aom-3.5.0-hf0c8a7f_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.1.1-pyhd8ed1ab_0.conda" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/osx-64/assimp-5.2.5-hd9e13b6_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/async-timeout-4.0.2-pyhd8ed1ab_0.tar.bz2" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/osx-64/atk-1.0-2.38.0-h1d18e73_1.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/attrs-23.1.0-pyh71513ae_1.conda" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/osx-64/boost-1.78.0-py310h3e792ce_4.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/osx-64/boost-cpp-1.78.0-h31500c2_2.conda" - conda: "https://conda.anaconda.org/conda-forge/osx-64/brotli-1.0.9-hb7f2c08_9.conda" @@ -677,50 +623,35 @@ environments: - conda: "https://conda.anaconda.org/conda-forge/osx-64/ca-certificates-2023.5.7-h8857fd0_0.conda" - conda: "https://conda.anaconda.org/conda-forge/osx-64/cairo-1.16.0-h904041c_1014.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/catkin_pkg-0.5.2-pyhd8ed1ab_0.tar.bz2" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/certifi-2023.5.7-pyhd8ed1ab_0.conda" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/osx-64/cffi-1.15.1-py310ha78151a_3.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.2.0-pyhd8ed1ab_0.conda" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/osx-64/cmake-3.26.3-h4032537_0.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/osx-64/console_bridge-1.0.2-hbb4e6a2_1.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/osx-64/contourpy-1.1.0-py310h88cfcbd_0.conda" - conda: "https://conda.anaconda.org/conda-forge/osx-64/cppcheck-2.10.3-py310h944fa21_0.conda" - conda: "https://conda.anaconda.org/conda-forge/osx-64/cryptography-41.0.1-py310ha1817de_0.conda" - conda: "https://conda.anaconda.org/conda-forge/osx-64/curl-7.88.1-h6df9250_1.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/cycler-0.11.0-pyhd8ed1ab_0.tar.bz2" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/distro-1.8.0-pyhd8ed1ab_0.conda" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/osx-64/docutils-0.20.1-py310h2ec42d9_0.conda" - conda: "https://conda.anaconda.org/conda-forge/osx-64/double-conversion-3.2.0-hf0c8a7f_1.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/osx-64/eigen-3.4.0-h940c156_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/empy-3.3.4-pyh9f0ad1d_1.tar.bz2" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.1.2-pyhd8ed1ab_0.conda" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/osx-64/expat-2.5.0-hf0c8a7f_1.conda" - conda: "https://conda.anaconda.org/conda-forge/osx-64/ffmpeg-5.1.2-gpl_h8b4fe81_106.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/flake8-6.0.0-pyhd8ed1ab_0.conda" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/osx-64/flann-1.9.1-h56de9e4_1011.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/osx-64/fmt-9.1.0-hb8565cd_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-hab24e00_0.tar.bz2" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/osx-64/fontconfig-2.14.2-h5bb23bf_0.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/osx-64/fonttools-4.40.0-py310h6729b98_0.conda" - conda: "https://conda.anaconda.org/conda-forge/osx-64/foonathan-memory-0.7.2-hf0c8a7f_1.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/osx-64/freeimage-3.18.0-haafd79f_10.tar.bz2" @@ -749,14 +680,10 @@ environments: - conda: "https://conda.anaconda.org/conda-forge/osx-64/hdf5-1.12.2-nompi_h48135f9_101.conda" - conda: "https://conda.anaconda.org/conda-forge/osx-64/icu-70.1-h96cf925_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/idna-3.4-pyhd8ed1ab_0.tar.bz2" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/osx-64/imath-3.1.6-hbc0c0cd_1.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-6.8.0-pyha770c72_0.conda" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.0.0-pyhd8ed1ab_0.conda" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/osx-64/jasper-2.0.33-h7c6fec8_1.conda" - conda: "https://conda.anaconda.org/conda-forge/osx-64/jpeg-9e-hb7f2c08_3.conda" - conda: "https://conda.anaconda.org/conda-forge/osx-64/jsoncpp-1.9.5-h940c156_1.tar.bz2" @@ -765,7 +692,6 @@ environments: - conda: "https://conda.anaconda.org/conda-forge/osx-64/krb5-1.20.1-h049b76e_0.conda" - conda: "https://conda.anaconda.org/conda-forge/osx-64/lame-3.100-hb7f2c08_1003.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/lark-parser-0.12.0-pyhd8ed1ab_0.tar.bz2" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/osx-64/lcms2-2.14-h90f4b2a_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/osx-64/lerc-4.0.0-hb486fe8_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/osx-64/libaec-1.0.6-hf0c8a7f_1.conda" @@ -827,10 +753,8 @@ environments: - conda: "https://conda.anaconda.org/conda-forge/osx-64/lz4-c-1.9.4-hf0c8a7f_0.conda" - conda: "https://conda.anaconda.org/conda-forge/osx-64/matplotlib-base-3.7.1-py310he725631_0.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/mccabe-0.7.0-pyhd8ed1ab_0.tar.bz2" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/osx-64/multidict-6.0.4-py310h90acd4f_0.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/osx-64/mysql-common-8.0.33-hc6116ba_1.conda" - conda: "https://conda.anaconda.org/conda-forge/osx-64/mysql-libs-8.0.33-haa61052_1.conda" - conda: "https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.4-hf0c8a7f_0.conda" @@ -847,20 +771,16 @@ environments: - conda: "https://conda.anaconda.org/conda-forge/osx-64/orocos-kdl-1.5.1-hf0c8a7f_4.conda" - conda: "https://conda.anaconda.org/conda-forge/osx-64/p11-kit-0.24.1-h65f8906_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/packaging-23.1-pyhd8ed1ab_0.conda" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/osx-64/pango-1.50.14-hbd9bf65_0.conda" - conda: "https://conda.anaconda.org/conda-forge/osx-64/pcl-1.12.1-h21768ba_4.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/osx-64/pcre-8.45-he49afe7_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/osx-64/pcre2-10.40-h1c4e4bc_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/pep517-0.13.0-pyhd8ed1ab_0.tar.bz2" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/osx-64/pillow-9.2.0-py310hffcf78b_3.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/osx-64/pixman-0.40.0-hbcb3906_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/osx-64/pkg-config-0.29.2-ha3d46e9_1008.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/pluggy-1.2.0-pyhd8ed1ab_0.conda" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/ply-3.11-py_1.tar.bz2" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/osx-64/proj-9.1.0-hcbd9701_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/osx-64/psutil-5.9.5-py310h90acd4f_0.conda" - conda: "https://conda.anaconda.org/conda-forge/osx-64/pthread-stubs-0.4-hc929b4f_1001.tar.bz2" @@ -868,32 +788,22 @@ environments: - conda: "https://conda.anaconda.org/conda-forge/osx-64/py-opencv-4.6.0-py310ha188af9_8.conda" - conda: "https://conda.anaconda.org/conda-forge/osx-64/pybind11-2.10.4-py310ha23aa8a_0.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/pybind11-abi-4-hd8ed1ab_3.tar.bz2" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/osx-64/pybind11-global-2.10.4-py310ha23aa8a_0.conda" - conda: "https://conda.anaconda.org/conda-forge/osx-64/pybullet-3.24-py310hcd8b382_0.conda" - conda: "https://conda.anaconda.org/conda-forge/osx-64/pycairo-1.24.0-py310h0b97775_0.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/pycodestyle-2.10.0-pyhd8ed1ab_0.conda" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/pycparser-2.21-pyhd8ed1ab_0.tar.bz2" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/pydocstyle-6.3.0-pyhd8ed1ab_0.conda" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/osx-64/pydot-1.4.2-py310h2ec42d9_3.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/pyflakes-3.0.1-pyhd8ed1ab_0.conda" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/pygments-2.15.1-pyhd8ed1ab_0.conda" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.0-pyhd8ed1ab_0.conda" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/osx-64/pyqt-5.15.7-py310hdd03f62_3.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/pyqt-builder-1.15.1-pyhd8ed1ab_0.conda" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/osx-64/pyqt5-sip-12.11.0-py310h415000c_3.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/pytest-7.4.0-pyhd8ed1ab_0.conda" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/osx-64/python-3.10.12-had23ca6_0_cpython.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.8.2-pyhd8ed1ab_0.tar.bz2" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/osx-64/python_abi-3.10-3_cp310.conda" - conda: "https://conda.anaconda.org/conda-forge/osx-64/pyyaml-6.0-py310h90acd4f_5.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/osx-64/qhull-2020.2-h940c156_2.tar.bz2" @@ -1187,14 +1097,11 @@ environments: - conda: "https://conda.anaconda.org/robostack-staging/osx-64/ros2-distro-mutex-0.3.0-humble.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/osx-64/rosdistro-0.9.0-py310h2ec42d9_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/rospkg-1.5.0-pyhd8ed1ab_0.conda" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/osx-64/sdl2-2.26.5-hf0c8a7f_0.conda" - conda: "https://conda.anaconda.org/conda-forge/osx-64/setuptools-61.0.0-py310h2ec42d9_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/osx-64/sip-6.7.9-py310h9e9d8ca_0.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/osx-64/spdlog-1.11.0-ha64ae7f_1.conda" - conda: "https://conda.anaconda.org/conda-forge/osx-64/sqlite-3.42.0-h2b0dec6_0.conda" - conda: "https://conda.anaconda.org/conda-forge/osx-64/svt-av1-1.4.1-hf0c8a7f_0.conda" @@ -1204,21 +1111,15 @@ environments: - conda: "https://conda.anaconda.org/conda-forge/osx-64/tinyxml2-9.0.0-he49afe7_2.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.12-h5dbffcc_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_0.tar.bz2" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.7.1-hd8ed1ab_0.conda" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.7.1-pyha770c72_0.conda" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/tzdata-2023c-h71feb2d_0.conda" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/osx-64/uncrustify-0.74.0-h96cf925_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/osx-64/unicodedata2-15.0.0-py310h90acd4f_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/osx-64/utfcpp-3.2.3-h694c41f_0.conda" - conda: "https://conda.anaconda.org/conda-forge/osx-64/vtk-9.2.2-qt_py310hea5b068_205.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/wslink-1.11.1-pyhd8ed1ab_0.conda" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/osx-64/x264-1!164.3095-h775f41a_2.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/osx-64/x265-3.5-hbb4e6a2_3.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/osx-64/xorg-kbproto-1.0.7-h35c211d_1002.tar.bz2" @@ -1243,23 +1144,18 @@ environments: - conda: "https://conda.anaconda.org/conda-forge/osx-64/yaml-cpp-0.7.0-hf0c8a7f_2.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/osx-64/yarl-1.9.2-py310h6729b98_0.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/zipp-3.16.0-pyhd8ed1ab_0.conda" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/osx-64/zlib-1.2.13-h8a1eda9_5.conda" - conda: "https://conda.anaconda.org/conda-forge/osx-64/zstd-1.5.2-h829000d_7.conda" - conda: "https://conda.anaconda.org/conda-forge/osx-64/zziplib-0.13.69-h5dbffcc_1.tar.bz2" osx-arm64: - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/aiohttp-3.8.4-py310h2aa6e3c_1.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.3.1-pyhd8ed1ab_0.tar.bz2" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/aom-3.5.0-h7ea286d_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.1.1-pyhd8ed1ab_0.conda" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/assimp-5.2.5-h276577b_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/async-timeout-4.0.2-pyhd8ed1ab_0.tar.bz2" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/atk-1.0-2.38.0-hcb7b3dd_1.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/attrs-23.1.0-pyh71513ae_1.conda" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/boost-1.78.0-py310h629746b_4.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/boost-cpp-1.78.0-hf1d6563_2.conda" - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/brotli-1.0.9-h1a8c8d9_9.conda" @@ -1271,50 +1167,35 @@ environments: - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/ca-certificates-2023.5.7-hf0a4a13_0.conda" - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/cairo-1.16.0-h73a0509_1014.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/catkin_pkg-0.5.2-pyhd8ed1ab_0.tar.bz2" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/noarch/certifi-2023.5.7-pyhd8ed1ab_0.conda" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/cffi-1.15.1-py310h2399d43_3.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.2.0-pyhd8ed1ab_0.conda" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/cmake-3.26.3-hf234bd0_0.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/console_bridge-1.0.2-h3e96240_1.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/contourpy-1.1.0-py310h38f39d4_0.conda" - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/cppcheck-2.7.5-py310hf3ebaa5_1.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/cryptography-41.0.1-py310hdd3b5e7_0.conda" - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/curl-7.88.1-h9049daf_1.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/cycler-0.11.0-pyhd8ed1ab_0.tar.bz2" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/noarch/distro-1.8.0-pyhd8ed1ab_0.conda" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/docutils-0.20.1-py310hbe9552e_0.conda" - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/double-conversion-3.2.0-hb7217d7_1.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/eigen-3.4.0-hc021e02_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/empy-3.3.4-pyh9f0ad1d_1.tar.bz2" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.1.2-pyhd8ed1ab_0.conda" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/expat-2.5.0-hb7217d7_1.conda" - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/ffmpeg-5.1.2-gpl_hf318d42_106.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/flake8-6.0.0-pyhd8ed1ab_0.conda" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/flann-1.9.1-hd3e9afc_1011.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/fmt-9.1.0-hffc8910_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-hab24e00_0.tar.bz2" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/fontconfig-2.14.2-h82840c6_0.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/fonttools-4.40.0-py310h2aa6e3c_0.conda" - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/foonathan-memory-0.7.2-hb7217d7_1.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/freeimage-3.18.0-hb513136_10.tar.bz2" @@ -1343,14 +1224,10 @@ environments: - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/hdf5-1.12.2-nompi_ha7af310_101.conda" - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/icu-70.1-h6b3803e_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/idna-3.4-pyhd8ed1ab_0.tar.bz2" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/imath-3.1.6-hb5ab8b9_1.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-6.8.0-pyha770c72_0.conda" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.0.0-pyhd8ed1ab_0.conda" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/jasper-2.0.33-hc3cd1e9_1.conda" - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/jpeg-9e-h1a8c8d9_3.conda" - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/jsoncpp-1.9.5-hc021e02_1.tar.bz2" @@ -1359,7 +1236,6 @@ environments: - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.20.1-h69eda48_0.conda" - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/lame-3.100-h1a8c8d9_1003.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/lark-parser-0.12.0-pyhd8ed1ab_0.tar.bz2" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/lcms2-2.14-h8193b64_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/lerc-4.0.0-h9a09cb3_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/libaec-1.0.6-hb7217d7_1.conda" @@ -1422,10 +1298,8 @@ environments: - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/lz4-c-1.9.4-hb7217d7_0.conda" - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/matplotlib-base-3.7.2-py310h49faba3_0.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/mccabe-0.7.0-pyhd8ed1ab_0.tar.bz2" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/multidict-6.0.4-py310h8e9501a_0.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/mysql-common-8.0.33-h7b5afe1_1.conda" - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/mysql-libs-8.0.33-hb292caa_1.conda" - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.4-h7ea286d_0.conda" @@ -1442,20 +1316,16 @@ environments: - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/orocos-kdl-1.5.1-hb7217d7_4.conda" - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/p11-kit-0.24.1-h29577a5_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/packaging-23.1-pyhd8ed1ab_0.conda" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/pango-1.50.14-h6c112b8_0.conda" - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/pcl-1.12.1-h4d3e839_4.conda" - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/pcre-8.45-hbdafb3b_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/pcre2-10.40-hb34f9b4_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/pep517-0.13.0-pyhd8ed1ab_0.tar.bz2" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/pillow-9.2.0-py310h9337a76_3.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/pixman-0.40.0-h27ca646_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/pkg-config-0.29.2-hab62308_1008.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/pluggy-1.2.0-pyhd8ed1ab_0.conda" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/noarch/ply-3.11-py_1.tar.bz2" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/proj-9.1.0-h3bdf472_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/psutil-5.9.5-py310h8e9501a_0.conda" - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/pthread-stubs-0.4-h27ca646_1001.tar.bz2" @@ -1463,31 +1333,22 @@ environments: - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/py-opencv-4.6.0-py310h69fb684_8.conda" - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/pybind11-2.10.4-py310h2887b22_0.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/pybind11-abi-4-hd8ed1ab_3.tar.bz2" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/pybind11-global-2.10.4-py310h2887b22_0.conda" - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/pybullet-3.24-py310h2b830bf_0.conda" - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/pycairo-1.24.0-py310hb83b24a_0.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/pycodestyle-2.10.0-pyhd8ed1ab_0.conda" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/noarch/pycparser-2.21-pyhd8ed1ab_0.tar.bz2" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/noarch/pydocstyle-6.3.0-pyhd8ed1ab_0.conda" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/pydot-1.4.2-py310hbe9552e_3.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/pyflakes-3.0.1-pyhd8ed1ab_0.conda" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/noarch/pygments-2.11.2-pyhd8ed1ab_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.0.9-pyhd8ed1ab_0.tar.bz2" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/pyqt-5.15.7-py310h7aaa74b_3.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/pyqt-builder-1.15.1-pyhd8ed1ab_0.conda" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/pyqt5-sip-12.11.0-py310h0f1eb42_3.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/pytest-7.4.0-pyhd8ed1ab_0.conda" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/python-3.10.12-h01493a6_0_cpython.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.8.2-pyhd8ed1ab_0.tar.bz2" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/python_abi-3.10-3_cp310.conda" - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/pyyaml-6.0-py310h8e9501a_5.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/qhull-2020.2-hc021e02_2.tar.bz2" @@ -1781,14 +1642,11 @@ environments: - conda: "https://conda.anaconda.org/robostack-staging/osx-arm64/ros2-distro-mutex-0.3.0-humble.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/rosdistro-0.9.0-py310hbe9552e_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/rospkg-1.5.0-pyhd8ed1ab_0.conda" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/sdl2-2.26.5-hb7217d7_0.conda" - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/setuptools-61.0.0-py310hbe9552e_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/sip-6.7.9-py310h1253130_0.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/spdlog-1.11.0-h6981a3a_1.conda" - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/sqlite-3.42.0-h203b68d_0.conda" - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/svt-av1-1.4.1-h7ea286d_0.conda" @@ -1798,21 +1656,15 @@ environments: - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/tinyxml2-9.0.0-hbdafb3b_2.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.12-he1e0b03_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_0.tar.bz2" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.7.1-hd8ed1ab_0.conda" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.7.1-pyha770c72_0.conda" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/noarch/tzdata-2023c-h71feb2d_0.conda" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/uncrustify-0.74.0-h6b3803e_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/unicodedata2-15.0.0-py310h8e9501a_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/utfcpp-3.2.3-hce30654_0.conda" - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/vtk-9.2.2-qt_py310hc6e6bcd_205.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/wslink-1.11.1-pyhd8ed1ab_0.conda" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/x264-1!164.3095-h57fd34a_2.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/x265-3.5-hbc6ce65_3.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/xorg-kbproto-1.0.7-h27ca646_1002.tar.bz2" @@ -1837,22 +1689,17 @@ environments: - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/yaml-cpp-0.7.0-hb7217d7_2.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/yarl-1.9.2-py310h2aa6e3c_0.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/zipp-3.16.0-pyhd8ed1ab_0.conda" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/zlib-1.2.13-h53f4e23_5.conda" - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.2-h4f39d0f_7.conda" - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/zziplib-0.13.69-he1e0b03_1.tar.bz2" win-64: - conda: "https://conda.anaconda.org/conda-forge/win-64/aiohttp-3.8.4-py310h8d17308_1.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.3.1-pyhd8ed1ab_0.tar.bz2" - subdir: win-64 - conda: "https://conda.anaconda.org/conda-forge/win-64/aom-3.5.0-h63175ca_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.1.1-pyhd8ed1ab_0.conda" - subdir: win-64 - conda: "https://conda.anaconda.org/conda-forge/win-64/assimp-5.2.5-h4dcb625_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/async-timeout-4.0.2-pyhd8ed1ab_0.tar.bz2" - subdir: win-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/attrs-23.1.0-pyh71513ae_1.conda" - subdir: win-64 - conda: "https://conda.anaconda.org/conda-forge/win-64/boost-1.78.0-py310h220cb41_4.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/win-64/boost-cpp-1.78.0-h9f4b32c_3.conda" - conda: "https://conda.anaconda.org/conda-forge/win-64/brotli-1.0.9-hcfcfb64_9.conda" @@ -1863,51 +1710,36 @@ environments: - conda: "https://conda.anaconda.org/conda-forge/win-64/ca-certificates-2023.5.7-h56e8100_0.conda" - conda: "https://conda.anaconda.org/conda-forge/win-64/cairo-1.16.0-hd694305_1014.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/catkin_pkg-0.5.2-pyhd8ed1ab_0.tar.bz2" - subdir: win-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/certifi-2023.5.7-pyhd8ed1ab_0.conda" - subdir: win-64 - conda: "https://conda.anaconda.org/conda-forge/win-64/cffi-1.15.1-py310h628cb3f_3.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.2.0-pyhd8ed1ab_0.conda" - subdir: win-64 - conda: "https://conda.anaconda.org/conda-forge/win-64/cmake-3.26.4-h1537add_0.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2" - subdir: win-64 - conda: "https://conda.anaconda.org/conda-forge/win-64/console_bridge-1.0.2-h5362a0b_1.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/win-64/contourpy-1.1.0-py310h232114e_0.conda" - conda: "https://conda.anaconda.org/conda-forge/win-64/cppcheck-2.10.3-py310hbf4f5aa_0.conda" - conda: "https://conda.anaconda.org/conda-forge/win-64/cryptography-41.0.1-py310h6e82f81_0.conda" - conda: "https://conda.anaconda.org/conda-forge/win-64/curl-7.88.1-h68f0423_1.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/cycler-0.11.0-pyhd8ed1ab_0.tar.bz2" - subdir: win-64 - conda: "https://conda.anaconda.org/conda-forge/win-64/dav1d-1.2.0-hcfcfb64_0.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/distro-1.8.0-pyhd8ed1ab_0.conda" - subdir: win-64 - conda: "https://conda.anaconda.org/conda-forge/win-64/docutils-0.20.1-py310h5588dad_0.conda" - conda: "https://conda.anaconda.org/conda-forge/win-64/double-conversion-3.2.0-h63175ca_1.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/win-64/eigen-3.4.0-h2d74725_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/empy-3.3.4-pyh9f0ad1d_1.tar.bz2" - subdir: win-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.1.2-pyhd8ed1ab_0.conda" - subdir: win-64 - conda: "https://conda.anaconda.org/conda-forge/win-64/expat-2.5.0-h63175ca_1.conda" - conda: "https://conda.anaconda.org/conda-forge/win-64/ffmpeg-5.1.2-gpl_h5037a79_109.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/flake8-6.0.0-pyhd8ed1ab_0.conda" - subdir: win-64 - conda: "https://conda.anaconda.org/conda-forge/win-64/flann-1.9.1-h23a95e4_1011.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/win-64/fmt-9.1.0-h181d51b_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2" - subdir: win-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2" - subdir: win-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2" - subdir: win-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-hab24e00_0.tar.bz2" - subdir: win-64 - conda: "https://conda.anaconda.org/conda-forge/win-64/fontconfig-2.14.2-hbde0cde_0.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2" - subdir: win-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2" - subdir: win-64 - conda: "https://conda.anaconda.org/conda-forge/win-64/fonttools-4.40.0-py310h8d17308_0.conda" - conda: "https://conda.anaconda.org/conda-forge/win-64/foonathan-memory-0.7.2-h57928b3_1.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/win-64/freeglut-3.2.2-h63175ca_2.conda" @@ -1933,14 +1765,10 @@ environments: - conda: "https://conda.anaconda.org/conda-forge/win-64/hdf5-1.12.2-nompi_h57737ce_101.conda" - conda: "https://conda.anaconda.org/conda-forge/win-64/icu-70.1-h0e60522_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/idna-3.4-pyhd8ed1ab_0.tar.bz2" - subdir: win-64 - conda: "https://conda.anaconda.org/conda-forge/win-64/imath-3.1.6-h12be248_1.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-6.8.0-pyha770c72_0.conda" - subdir: win-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.0.0-pyhd8ed1ab_0.conda" - subdir: win-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda" - subdir: win-64 - conda: "https://conda.anaconda.org/conda-forge/win-64/intel-openmp-2023.1.0-h57928b3_46319.conda" - conda: "https://conda.anaconda.org/conda-forge/win-64/jasper-2.0.33-hc2e4405_1.conda" - conda: "https://conda.anaconda.org/conda-forge/win-64/jpeg-9e-hcfcfb64_3.conda" @@ -1949,7 +1777,6 @@ environments: - conda: "https://conda.anaconda.org/conda-forge/win-64/kiwisolver-1.4.4-py310h232114e_1.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/win-64/krb5-1.20.1-heb0366b_0.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/lark-parser-0.12.0-pyhd8ed1ab_0.tar.bz2" - subdir: win-64 - conda: "https://conda.anaconda.org/conda-forge/win-64/lcms2-2.14-h90d422f_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/win-64/lerc-4.0.0-h63175ca_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/win-64/libaec-1.0.6-h63175ca_1.conda" @@ -2001,12 +1828,10 @@ environments: - conda: "https://conda.anaconda.org/conda-forge/win-64/m2w64-libwinpthread-git-5.0.0.4634.697f757-2.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/win-64/matplotlib-base-3.7.2-py310h51140c5_0.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/mccabe-0.7.0-pyhd8ed1ab_0.tar.bz2" - subdir: win-64 - conda: "https://conda.anaconda.org/conda-forge/win-64/mkl-2022.1.0-h6a75c08_874.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/win-64/msys2-conda-epoch-20160418-1.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/win-64/multidict-6.0.4-py310h8d17308_0.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2" - subdir: win-64 - conda: "https://conda.anaconda.org/conda-forge/win-64/netifaces-0.11.0-py310h8d17308_1.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/win-64/nlohmann_json-3.11.2-h39d44d4_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/win-64/numpy-1.25.1-py310hd02465a_0.conda" @@ -2016,20 +1841,16 @@ environments: - conda: "https://conda.anaconda.org/conda-forge/win-64/openssl-3.1.1-hcfcfb64_1.conda" - conda: "https://conda.anaconda.org/conda-forge/win-64/orocos-kdl-1.5.1-h63175ca_4.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/packaging-23.1-pyhd8ed1ab_0.conda" - subdir: win-64 - conda: "https://conda.anaconda.org/conda-forge/win-64/pango-1.50.14-hdffb7b3_0.conda" - conda: "https://conda.anaconda.org/conda-forge/win-64/pcl-1.12.1-h266aab6_4.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/win-64/pcre-8.45-h0e60522_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/win-64/pcre2-10.40-h17e33f8_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/pep517-0.13.0-pyhd8ed1ab_0.tar.bz2" - subdir: win-64 - conda: "https://conda.anaconda.org/conda-forge/win-64/pillow-9.2.0-py310hd4fb230_3.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/win-64/pixman-0.40.0-h8ffe710_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/win-64/pkg-config-0.29.2-h2bf4dc2_1008.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/pluggy-1.2.0-pyhd8ed1ab_0.conda" - subdir: win-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/ply-3.11-py_1.tar.bz2" - subdir: win-64 - conda: "https://conda.anaconda.org/conda-forge/win-64/proj-9.1.0-h3863b3b_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/win-64/psutil-5.9.5-py310h8d17308_0.conda" - conda: "https://conda.anaconda.org/conda-forge/win-64/pthread-stubs-0.4-hcd874cb_1001.tar.bz2" @@ -2038,32 +1859,22 @@ environments: - conda: "https://conda.anaconda.org/conda-forge/win-64/py-opencv-4.6.0-py310hbbfc1a7_8.conda" - conda: "https://conda.anaconda.org/conda-forge/win-64/pybind11-2.10.4-py310h232114e_0.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/pybind11-abi-4-hd8ed1ab_3.tar.bz2" - subdir: win-64 - conda: "https://conda.anaconda.org/conda-forge/win-64/pybind11-global-2.10.4-py310h232114e_0.conda" - conda: "https://conda.anaconda.org/conda-forge/win-64/pybullet-3.24-py310h1c4a608_0.conda" - conda: "https://conda.anaconda.org/conda-forge/win-64/pycairo-1.24.0-py310h42c1a3e_0.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/pycodestyle-2.10.0-pyhd8ed1ab_0.conda" - subdir: win-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/pycparser-2.21-pyhd8ed1ab_0.tar.bz2" - subdir: win-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/pydocstyle-6.3.0-pyhd8ed1ab_0.conda" - subdir: win-64 - conda: "https://conda.anaconda.org/conda-forge/win-64/pydot-1.4.2-py310h5588dad_3.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/pyflakes-3.0.1-pyhd8ed1ab_0.conda" - subdir: win-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/pygments-2.15.1-pyhd8ed1ab_0.conda" - subdir: win-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.0.9-pyhd8ed1ab_0.tar.bz2" - subdir: win-64 - conda: "https://conda.anaconda.org/conda-forge/win-64/pyqt-5.15.7-py310h1fd54f2_3.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/pyqt-builder-1.15.1-pyhd8ed1ab_0.conda" - subdir: win-64 - conda: "https://conda.anaconda.org/conda-forge/win-64/pyqt5-sip-12.11.0-py310h00ffb61_3.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/pytest-7.4.0-pyhd8ed1ab_0.conda" - subdir: win-64 - conda: "https://conda.anaconda.org/conda-forge/win-64/python-3.10.12-h4de0772_0_cpython.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.8.2-pyhd8ed1ab_0.tar.bz2" - subdir: win-64 - conda: "https://conda.anaconda.org/conda-forge/win-64/python_abi-3.10-3_cp310.conda" - conda: "https://conda.anaconda.org/conda-forge/win-64/pyyaml-6.0-py310h8d17308_5.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/win-64/qhull-2020.2-h70d2c02_2.tar.bz2" @@ -2350,14 +2161,11 @@ environments: - conda: "https://conda.anaconda.org/robostack-staging/win-64/ros2-distro-mutex-0.3.0-humble.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/win-64/rosdistro-0.9.0-py310h5588dad_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/rospkg-1.5.0-pyhd8ed1ab_0.conda" - subdir: win-64 - conda: "https://conda.anaconda.org/conda-forge/win-64/sdl2-2.26.5-h63175ca_0.conda" - conda: "https://conda.anaconda.org/conda-forge/win-64/setuptools-61.0.0-py310h5588dad_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/win-64/sip-6.7.9-py310h00ffb61_0.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2" - subdir: win-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2" - subdir: win-64 - conda: "https://conda.anaconda.org/conda-forge/win-64/spdlog-1.11.0-hfbadfc6_1.conda" - conda: "https://conda.anaconda.org/conda-forge/win-64/sqlite-3.42.0-hcfcfb64_0.conda" - conda: "https://conda.anaconda.org/conda-forge/win-64/svt-av1-1.4.1-h63175ca_0.conda" @@ -2367,15 +2175,10 @@ environments: - conda: "https://conda.anaconda.org/conda-forge/win-64/tinyxml2-9.0.0-h0e60522_2.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/win-64/tk-8.6.12-h8ffe710_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_0.tar.bz2" - subdir: win-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2" - subdir: win-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.7.1-hd8ed1ab_0.conda" - subdir: win-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.7.1-pyha770c72_0.conda" - subdir: win-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/tzdata-2023c-h71feb2d_0.conda" - subdir: win-64 - conda: "https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.22621.0-h57928b3_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/win-64/uncrustify-0.74.0-h57928b3_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/win-64/unicodedata2-15.0.0-py310h8d17308_0.tar.bz2" @@ -2386,7 +2189,6 @@ environments: - conda: "https://conda.anaconda.org/conda-forge/win-64/vtk-9.2.2-qt_py310h2fd250f_205.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/win32_setctime-1.1.0-pyhd8ed1ab_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/wslink-1.11.1-pyhd8ed1ab_0.conda" - subdir: win-64 - conda: "https://conda.anaconda.org/conda-forge/win-64/x264-1!164.3095-h8ffe710_2.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/win-64/x265-3.5-h2d74725_3.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/win-64/xorg-kbproto-1.0.7-hcd874cb_1002.tar.bz2" @@ -2405,7 +2207,6 @@ environments: - conda: "https://conda.anaconda.org/conda-forge/win-64/yaml-cpp-0.7.0-h63175ca_2.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/win-64/yarl-1.9.2-py310h8d17308_0.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/zipp-3.16.0-pyhd8ed1ab_0.conda" - subdir: win-64 - conda: "https://conda.anaconda.org/conda-forge/win-64/zlib-1.2.13-hcfcfb64_5.conda" - conda: "https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.2-h12be248_7.conda" - conda: "https://conda.anaconda.org/conda-forge/win-64/zziplib-0.13.69-h1d00b33_1.tar.bz2" diff --git a/crates/rattler_lock/src/snapshots/rattler_lock__test__v4__absolute-path-lock.yml.snap b/crates/rattler_lock/src/snapshots/rattler_lock__test__v4__absolute-path-lock.yml.snap index 43b25ed3c..c26eb9729 100644 --- a/crates/rattler_lock/src/snapshots/rattler_lock__test__v4__absolute-path-lock.yml.snap +++ b/crates/rattler_lock/src/snapshots/rattler_lock__test__v4__absolute-path-lock.yml.snap @@ -2,7 +2,7 @@ source: crates/rattler_lock/src/lib.rs expression: conda_lock --- -version: 6 +version: 7 environments: default: channels: diff --git a/crates/rattler_lock/src/snapshots/rattler_lock__test__v4__numpy-lock.yml.snap b/crates/rattler_lock/src/snapshots/rattler_lock__test__v4__numpy-lock.yml.snap index a238f2774..32f408a5c 100644 --- a/crates/rattler_lock/src/snapshots/rattler_lock__test__v4__numpy-lock.yml.snap +++ b/crates/rattler_lock/src/snapshots/rattler_lock__test__v4__numpy-lock.yml.snap @@ -2,7 +2,7 @@ source: crates/rattler_lock/src/lib.rs expression: conda_lock --- -version: 6 +version: 7 environments: default: channels: @@ -12,31 +12,21 @@ environments: - 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/noarch/alabaster-0.7.13-pyhd8ed1ab_0.conda" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.8-h166bdaf_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/appdirs-1.4.4-pyh9f0ad1d_0.tar.bz2" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/asttokens-2.2.1-pyhd8ed1ab_0.conda" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/linux-64/attr-2.5.1-h166bdaf_1.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/attrs-22.2.0-pyh71513ae_0.conda" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/babel-2.11.0-pyhd8ed1ab_0.tar.bz2" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/backcall-0.2.0-pyh9f0ad1d_0.tar.bz2" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/backports-1.0-pyhd8ed1ab_3.conda" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/backports.functools_lru_cache-1.6.4-pyhd8ed1ab_0.tar.bz2" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/linux-64/backports.zoneinfo-0.2.1-py39hf3d152e_7.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.11.2-pyha770c72_0.conda" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/linux-64/binutils-2.39-hdd6e379_1.conda" - conda: "https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.39-he00db2b_1.conda" - conda: "https://conda.anaconda.org/conda-forge/linux-64/binutils_linux-64-2.39-h5fc0e48_11.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/breathe-4.34.0-pyhd8ed1ab_0.tar.bz2" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/linux-64/brotli-1.0.9-h166bdaf_8.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.0.9-h166bdaf_8.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/linux-64/brotlipy-0.7.0-py39hb9d737c_1005.tar.bz2" @@ -45,33 +35,24 @@ environments: - conda: "https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2022.12.7-ha878542_0.conda" - conda: "https://conda.anaconda.org/conda-forge/linux-64/cairo-1.16.0-ha61ee94_1014.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/certifi-2022.12.7-pyhd8ed1ab_0.conda" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/linux-64/cffi-1.15.1-py39he91dace_3.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-2.1.1-pyhd8ed1ab_0.tar.bz2" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/click-8.1.3-unix_pyhd8ed1ab_2.tar.bz2" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/linux-64/compilers-1.5.2-ha770c72_0.conda" - conda: "https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.0.7-py39h4b4f3f3_0.conda" - conda: "https://conda.anaconda.org/conda-forge/linux-64/coverage-7.1.0-py39h72bdee0_0.conda" - conda: "https://conda.anaconda.org/conda-forge/linux-64/cryptography-39.0.1-py39h079d5ae_0.conda" - conda: "https://conda.anaconda.org/conda-forge/linux-64/cxx-compiler-1.5.2-hf52228f_0.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/cycler-0.11.0-pyhd8ed1ab_0.tar.bz2" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/linux-64/cython-0.29.33-py39h227be39_0.conda" - conda: "https://conda.anaconda.org/conda-forge/linux-64/dbus-1.13.6-h5008d03_3.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/decorator-5.1.1-pyhd8ed1ab_0.tar.bz2" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/linux-64/docutils-0.19-py39hf3d152e_1.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/linux-64/doxygen-1.9.5-h583eb01_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.1.0-pyhd8ed1ab_0.conda" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/execnet-1.9.0-pyhd8ed1ab_0.tar.bz2" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/executing-1.2.0-pyhd8ed1ab_0.tar.bz2" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/linux-64/expat-2.5.0-h27087fc_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/linux-64/fftw-3.3.10-nompi_hf0379b8_106.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2" @@ -92,9 +73,7 @@ environments: - conda: "https://conda.anaconda.org/conda-forge/linux-64/gfortran_impl_linux-64-11.3.0-he34c6f7_19.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/linux-64/gfortran_linux-64-11.3.0-h3c55166_11.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/gitdb-4.0.10-pyhd8ed1ab_0.conda" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/gitpython-3.1.30-pyhd8ed1ab_0.conda" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/linux-64/glib-2.74.1-h6239696_1.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/linux-64/glib-tools-2.74.1-h6239696_1.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.13-h58526e2_1001.tar.bz2" @@ -106,23 +85,15 @@ environments: - conda: "https://conda.anaconda.org/conda-forge/linux-64/gxx_linux-64-11.3.0-hc203a17_11.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-6.0.0-h8e241bc_0.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/hypothesis-6.68.1-pyha770c72_0.conda" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/linux-64/icu-70.1-h27087fc_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/idna-3.4-pyhd8ed1ab_0.tar.bz2" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-6.0.0-pyha770c72_0.conda" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/ipython-8.10.0-pyh41d4057_0.conda" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/linux-64/jack-1.9.22-h11f4161_0.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/jedi-0.18.2-pyhd8ed1ab_0.conda" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.2-pyhd8ed1ab_1.tar.bz2" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/linux-64/jpeg-9e-h0b41bf4_3.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-2.6.32-he073ed8_15.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2" @@ -185,147 +156,93 @@ environments: - conda: "https://conda.anaconda.org/conda-forge/linux-64/matplotlib-3.6.3-py39hf3d152e_0.conda" - conda: "https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.6.3-py39he190548_0.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.1.6-pyhd8ed1ab_0.tar.bz2" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/meson-1.0.0-pyhd8ed1ab_0.conda" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/meson-python-0.12.0-pyh71feb2d_0.conda" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/linux-64/mpg123-1.31.2-hcb278e6_0.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/linux-64/mypy-0.981-py39hb9d737c_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_0.conda" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/linux-64/mysql-common-8.0.32-ha901b37_0.conda" - conda: "https://conda.anaconda.org/conda-forge/linux-64/mysql-libs-8.0.32-hd7da12d_0.conda" - conda: "https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.3-h27087fc_1.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/linux-64/ninja-1.11.0-h924138e_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/nomkl-1.0-h5ca1d4c_0.tar.bz2" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/linux-64/nspr-4.35-h27087fc_0.conda" - conda: "https://conda.anaconda.org/conda-forge/linux-64/nss-3.88-he45b914_0.conda" - conda: "https://conda.anaconda.org/conda-forge/linux-64/numpy-1.24.2-py39h7360e5f_0.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/numpydoc-1.4.0-pyhd8ed1ab_1.tar.bz2" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/linux-64/openblas-0.3.21-pthreads_h320a7e8_3.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.0-hfec8fc6_2.conda" - conda: "https://conda.anaconda.org/conda-forge/linux-64/openssl-3.0.8-h0b41bf4_0.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/packaging-23.0-pyhd8ed1ab_0.conda" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/linux-64/pandas-1.5.3-py39h2ad29b5_0.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/parso-0.8.3-pyhd8ed1ab_0.tar.bz2" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.40-hc3806b6_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/pexpect-4.8.0-pyh1a96a4e_2.tar.bz2" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/pickleshare-0.7.5-py_1003.tar.bz2" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/linux-64/pillow-9.4.0-py39h2320bf1_1.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/pip-23.0-pyhd8ed1ab_0.conda" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/linux-64/pixman-0.40.0-h36c2ea0_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/linux-64/pkg-config-0.29.2-h36c2ea0_1008.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/pluggy-1.0.0-pyhd8ed1ab_5.tar.bz2" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/ply-3.11-py_1.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/pooch-1.6.0-pyhd8ed1ab_0.tar.bz2" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.36-pyha770c72_0.conda" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/linux-64/psutil-5.9.4-py39hb9d737c_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-h36c2ea0_1001.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd3deb0d_0.tar.bz2" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/linux-64/pulseaudio-16.1-ha8d29e2_1.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.2-pyhd8ed1ab_0.tar.bz2" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/pycodestyle-2.7.0-pyhd8ed1ab_0.tar.bz2" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/pycparser-2.21-pyhd8ed1ab_0.tar.bz2" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/pydata-sphinx-theme-0.9.0-pyhd8ed1ab_1.tar.bz2" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/pygments-2.14.0-pyhd8ed1ab_0.conda" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/pyopenssl-23.0.0-pyhd8ed1ab_0.conda" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.0.9-pyhd8ed1ab_0.tar.bz2" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/pyproject-metadata-0.7.1-pyhd8ed1ab_0.conda" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/linux-64/pyqt-5.15.7-py39h5c7b992_3.conda" - conda: "https://conda.anaconda.org/conda-forge/linux-64/pyqt5-sip-12.11.0-py39h227be39_3.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/pytest-7.2.1-pyhd8ed1ab_0.conda" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/pytest-cov-4.0.0-pyhd8ed1ab_0.tar.bz2" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.2.0-pyhd8ed1ab_0.conda" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/linux-64/python-3.9.16-h2782a2a_0_cpython.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.8.2-pyhd8ed1ab_0.tar.bz2" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.9-3_cp39.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/pytz-2022.7.1-pyhd8ed1ab_0.conda" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/linux-64/qt-main-5.15.8-h5d23da1_6.conda" - conda: "https://conda.anaconda.org/conda-forge/linux-64/readline-8.1.2-h0f457ee_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/requests-2.28.2-pyhd8ed1ab_0.conda" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/linux-64/scipy-1.10.0-py39h7360e5f_2.conda" - conda: "https://conda.anaconda.org/conda-forge/linux-64/setuptools-59.2.0-py39hf3d152e_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/linux-64/sip-6.7.7-py39h227be39_0.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/smmap-3.0.5-pyh44b312d_0.tar.bz2" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_0.tar.bz2" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.3.2.post1-pyhd8ed1ab_0.tar.bz2" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/sphinx-5.3.0-pyhd8ed1ab_0.tar.bz2" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/sphinx-design-0.3.0-pyhd8ed1ab_0.tar.bz2" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-1.0.4-pyhd8ed1ab_0.conda" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-1.0.2-py_0.tar.bz2" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.0.1-pyhd8ed1ab_0.conda" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-py_0.tar.bz2" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-1.0.3-py_0.tar.bz2" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.5-pyhd8ed1ab_2.tar.bz2" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.2-pyhd8ed1ab_0.conda" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-64-2.12-he073ed8_15.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.12-h27826a3_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_0.tar.bz2" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/linux-64/tornado-6.2-py39hb9d737c_1.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/traitlets-5.9.0-pyhd8ed1ab_0.conda" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.4.0-hd8ed1ab_0.tar.bz2" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.4.0-pyha770c72_0.tar.bz2" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/tzdata-2022g-h191b570_0.conda" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-15.0.0-py39hb9d737c_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/urllib3-1.26.14-pyhd8ed1ab_0.conda" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.2.6-pyhd8ed1ab_0.conda" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/wheel-0.38.4-pyhd8ed1ab_0.tar.bz2" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/linux-64/xcb-util-0.4.0-h166bdaf_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/linux-64/xcb-util-image-0.4.0-h166bdaf_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/linux-64/xcb-util-keysyms-0.4.0-h166bdaf_0.tar.bz2" @@ -344,35 +261,24 @@ environments: - conda: "https://conda.anaconda.org/conda-forge/linux-64/xorg-xproto-7.0.31-h7f98852_1007.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/zipp-3.13.0-pyhd8ed1ab_0.conda" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/linux-64/zlib-1.2.13-h166bdaf_4.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.2-h3eb15da_6.conda" linux-aarch64: - conda: "https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-2_gnu.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/alabaster-0.7.13-pyhd8ed1ab_0.conda" - subdir: linux-aarch64 - conda: "https://conda.anaconda.org/conda-forge/noarch/appdirs-1.4.4-pyh9f0ad1d_0.tar.bz2" - subdir: linux-aarch64 - conda: "https://conda.anaconda.org/conda-forge/noarch/asttokens-2.2.1-pyhd8ed1ab_0.conda" - subdir: linux-aarch64 - conda: "https://conda.anaconda.org/conda-forge/noarch/attrs-22.2.0-pyh71513ae_0.conda" - subdir: linux-aarch64 - conda: "https://conda.anaconda.org/conda-forge/noarch/babel-2.11.0-pyhd8ed1ab_0.tar.bz2" - subdir: linux-aarch64 - conda: "https://conda.anaconda.org/conda-forge/noarch/backcall-0.2.0-pyh9f0ad1d_0.tar.bz2" - subdir: linux-aarch64 - conda: "https://conda.anaconda.org/conda-forge/noarch/backports-1.0-pyhd8ed1ab_3.conda" - subdir: linux-aarch64 - conda: "https://conda.anaconda.org/conda-forge/noarch/backports.functools_lru_cache-1.6.4-pyhd8ed1ab_0.tar.bz2" - subdir: linux-aarch64 - conda: "https://conda.anaconda.org/conda-forge/linux-aarch64/backports.zoneinfo-0.2.1-py39h4420490_7.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.11.2-pyha770c72_0.conda" - subdir: linux-aarch64 - conda: "https://conda.anaconda.org/conda-forge/linux-aarch64/binutils-2.39-h64c2a2e_1.conda" - conda: "https://conda.anaconda.org/conda-forge/linux-aarch64/binutils_impl_linux-aarch64-2.39-h48546ad_1.conda" - conda: "https://conda.anaconda.org/conda-forge/linux-aarch64/binutils_linux-aarch64-2.39-h489c705_11.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/breathe-4.34.0-pyhd8ed1ab_0.tar.bz2" - subdir: linux-aarch64 - conda: "https://conda.anaconda.org/conda-forge/linux-aarch64/brotli-1.0.9-h4e544f5_8.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/linux-aarch64/brotli-bin-1.0.9-h4e544f5_8.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/linux-aarch64/brotlipy-0.7.0-py39h0fd3b05_1005.tar.bz2" @@ -380,32 +286,23 @@ environments: - conda: "https://conda.anaconda.org/conda-forge/linux-aarch64/c-compiler-1.5.2-hb4cce97_0.conda" - conda: "https://conda.anaconda.org/conda-forge/linux-aarch64/ca-certificates-2022.12.7-h4fd8a4c_0.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/certifi-2022.12.7-pyhd8ed1ab_0.conda" - subdir: linux-aarch64 - conda: "https://conda.anaconda.org/conda-forge/linux-aarch64/cffi-1.15.1-py39hb26bf21_3.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-2.1.1-pyhd8ed1ab_0.tar.bz2" - subdir: linux-aarch64 - conda: "https://conda.anaconda.org/conda-forge/noarch/click-8.1.3-unix_pyhd8ed1ab_2.tar.bz2" - subdir: linux-aarch64 - conda: "https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2" - subdir: linux-aarch64 - conda: "https://conda.anaconda.org/conda-forge/linux-aarch64/compilers-1.5.2-h8af1aa0_0.conda" - conda: "https://conda.anaconda.org/conda-forge/linux-aarch64/contourpy-1.0.7-py39hd9a2fea_0.conda" - conda: "https://conda.anaconda.org/conda-forge/linux-aarch64/coverage-7.1.0-py39h599bc27_0.conda" - conda: "https://conda.anaconda.org/conda-forge/linux-aarch64/cryptography-39.0.1-py39h8a84b6a_0.conda" - conda: "https://conda.anaconda.org/conda-forge/linux-aarch64/cxx-compiler-1.5.2-h4c384f3_0.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/cycler-0.11.0-pyhd8ed1ab_0.tar.bz2" - subdir: linux-aarch64 - conda: "https://conda.anaconda.org/conda-forge/linux-aarch64/cython-0.29.33-py39hdcdd789_0.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/decorator-5.1.1-pyhd8ed1ab_0.tar.bz2" - subdir: linux-aarch64 - conda: "https://conda.anaconda.org/conda-forge/linux-aarch64/docutils-0.19-py39ha65689a_1.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/linux-aarch64/doxygen-1.9.5-h04155f4_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.1.0-pyhd8ed1ab_0.conda" - subdir: linux-aarch64 - conda: "https://conda.anaconda.org/conda-forge/noarch/execnet-1.9.0-pyhd8ed1ab_0.tar.bz2" - subdir: linux-aarch64 - conda: "https://conda.anaconda.org/conda-forge/noarch/executing-1.2.0-pyhd8ed1ab_0.tar.bz2" - subdir: linux-aarch64 - conda: "https://conda.anaconda.org/conda-forge/linux-aarch64/fonttools-4.38.0-py39h0fd3b05_1.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/linux-aarch64/fortran-compiler-1.5.2-h878be85_0.conda" - conda: "https://conda.anaconda.org/conda-forge/linux-aarch64/freetype-2.12.1-hbbbf32d_1.conda" @@ -416,28 +313,18 @@ environments: - conda: "https://conda.anaconda.org/conda-forge/linux-aarch64/gfortran_impl_linux-aarch64-11.3.0-h0a651b8_19.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/linux-aarch64/gfortran_linux-aarch64-11.3.0-hff98631_11.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/gitdb-4.0.10-pyhd8ed1ab_0.conda" - subdir: linux-aarch64 - conda: "https://conda.anaconda.org/conda-forge/noarch/gitpython-3.1.30-pyhd8ed1ab_0.conda" - subdir: linux-aarch64 - conda: "https://conda.anaconda.org/conda-forge/linux-aarch64/gxx-11.3.0-he2d1185_11.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/linux-aarch64/gxx_impl_linux-aarch64-11.3.0-h771ed3b_19.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/linux-aarch64/gxx_linux-aarch64-11.3.0-h7ccc656_11.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/hypothesis-6.68.1-pyha770c72_0.conda" - subdir: linux-aarch64 - conda: "https://conda.anaconda.org/conda-forge/noarch/idna-3.4-pyhd8ed1ab_0.tar.bz2" - subdir: linux-aarch64 - conda: "https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2" - subdir: linux-aarch64 - conda: "https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-6.0.0-pyha770c72_0.conda" - subdir: linux-aarch64 - conda: "https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda" - subdir: linux-aarch64 - conda: "https://conda.anaconda.org/conda-forge/noarch/ipython-8.10.0-pyh41d4057_0.conda" - subdir: linux-aarch64 - conda: "https://conda.anaconda.org/conda-forge/noarch/jedi-0.18.2-pyhd8ed1ab_0.conda" - subdir: linux-aarch64 - conda: "https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.2-pyhd8ed1ab_1.tar.bz2" - subdir: linux-aarch64 - conda: "https://conda.anaconda.org/conda-forge/linux-aarch64/jpeg-9e-h2a766a3_3.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-aarch64-4.18.0-h5b4a56d_13.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/linux-aarch64/kiwisolver-1.4.4-py39h110580c_1.tar.bz2" @@ -474,167 +361,102 @@ environments: - conda: "https://conda.anaconda.org/conda-forge/linux-aarch64/matplotlib-3.6.3-py39ha65689a_0.conda" - conda: "https://conda.anaconda.org/conda-forge/linux-aarch64/matplotlib-base-3.6.3-py39h2983639_0.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.1.6-pyhd8ed1ab_0.tar.bz2" - subdir: linux-aarch64 - conda: "https://conda.anaconda.org/conda-forge/noarch/meson-1.0.0-pyhd8ed1ab_0.conda" - subdir: linux-aarch64 - conda: "https://conda.anaconda.org/conda-forge/noarch/meson-python-0.12.0-pyh71feb2d_0.conda" - subdir: linux-aarch64 - conda: "https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2" - subdir: linux-aarch64 - conda: "https://conda.anaconda.org/conda-forge/linux-aarch64/mypy-0.981-py39h0fd3b05_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_0.conda" - subdir: linux-aarch64 - conda: "https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.3-headf329_1.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/linux-aarch64/ninja-1.11.0-hdd96247_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/nomkl-1.0-h5ca1d4c_0.tar.bz2" - subdir: linux-aarch64 - conda: "https://conda.anaconda.org/conda-forge/linux-aarch64/numpy-1.24.2-py39hafab3e7_0.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/numpydoc-1.4.0-pyhd8ed1ab_1.tar.bz2" - subdir: linux-aarch64 - conda: "https://conda.anaconda.org/conda-forge/linux-aarch64/openblas-0.3.21-pthreads_h2d9dd7e_3.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/linux-aarch64/openjpeg-2.5.0-h9508984_2.conda" - conda: "https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.0.8-hb4cce97_0.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/packaging-23.0-pyhd8ed1ab_0.conda" - subdir: linux-aarch64 - conda: "https://conda.anaconda.org/conda-forge/linux-aarch64/pandas-1.5.3-py39h1e1c27f_0.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/parso-0.8.3-pyhd8ed1ab_0.tar.bz2" - subdir: linux-aarch64 - conda: "https://conda.anaconda.org/conda-forge/noarch/pexpect-4.8.0-pyh1a96a4e_2.tar.bz2" - subdir: linux-aarch64 - conda: "https://conda.anaconda.org/conda-forge/noarch/pickleshare-0.7.5-py_1003.tar.bz2" - subdir: linux-aarch64 - conda: "https://conda.anaconda.org/conda-forge/linux-aarch64/pillow-9.4.0-py39h72365ce_1.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/pip-23.0-pyhd8ed1ab_0.conda" - subdir: linux-aarch64 - conda: "https://conda.anaconda.org/conda-forge/linux-aarch64/pkg-config-0.29.2-hb9de7d4_1008.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/pluggy-1.0.0-pyhd8ed1ab_5.tar.bz2" - subdir: linux-aarch64 - conda: "https://conda.anaconda.org/conda-forge/noarch/pooch-1.6.0-pyhd8ed1ab_0.tar.bz2" - subdir: linux-aarch64 - conda: "https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.36-pyha770c72_0.conda" - subdir: linux-aarch64 - conda: "https://conda.anaconda.org/conda-forge/linux-aarch64/psutil-5.9.4-py39h0fd3b05_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/linux-aarch64/pthread-stubs-0.4-hb9de7d4_1001.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd3deb0d_0.tar.bz2" - subdir: linux-aarch64 - conda: "https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.2-pyhd8ed1ab_0.tar.bz2" - subdir: linux-aarch64 - conda: "https://conda.anaconda.org/conda-forge/noarch/pycodestyle-2.7.0-pyhd8ed1ab_0.tar.bz2" - subdir: linux-aarch64 - conda: "https://conda.anaconda.org/conda-forge/noarch/pycparser-2.21-pyhd8ed1ab_0.tar.bz2" - subdir: linux-aarch64 - conda: "https://conda.anaconda.org/conda-forge/noarch/pydata-sphinx-theme-0.9.0-pyhd8ed1ab_1.tar.bz2" - subdir: linux-aarch64 - conda: "https://conda.anaconda.org/conda-forge/noarch/pygments-2.14.0-pyhd8ed1ab_0.conda" - subdir: linux-aarch64 - conda: "https://conda.anaconda.org/conda-forge/noarch/pyopenssl-23.0.0-pyhd8ed1ab_0.conda" - subdir: linux-aarch64 - conda: "https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.0.9-pyhd8ed1ab_0.tar.bz2" - subdir: linux-aarch64 - conda: "https://conda.anaconda.org/conda-forge/noarch/pyproject-metadata-0.7.1-pyhd8ed1ab_0.conda" - subdir: linux-aarch64 - conda: "https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2" - subdir: linux-aarch64 - conda: "https://conda.anaconda.org/conda-forge/noarch/pytest-7.2.1-pyhd8ed1ab_0.conda" - subdir: linux-aarch64 - conda: "https://conda.anaconda.org/conda-forge/noarch/pytest-cov-4.0.0-pyhd8ed1ab_0.tar.bz2" - subdir: linux-aarch64 - conda: "https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.2.0-pyhd8ed1ab_0.conda" - subdir: linux-aarch64 - conda: "https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.9.16-hb363c5e_0_cpython.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.8.2-pyhd8ed1ab_0.tar.bz2" - subdir: linux-aarch64 - conda: "https://conda.anaconda.org/conda-forge/linux-aarch64/python_abi-3.9-3_cp39.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/pytz-2022.7.1-pyhd8ed1ab_0.conda" - subdir: linux-aarch64 - conda: "https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.1.2-h38e3740_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/requests-2.28.2-pyhd8ed1ab_0.conda" - subdir: linux-aarch64 - conda: "https://conda.anaconda.org/conda-forge/linux-aarch64/scipy-1.10.0-py39hafab3e7_2.conda" - conda: "https://conda.anaconda.org/conda-forge/linux-aarch64/setuptools-59.2.0-py39ha65689a_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2" - subdir: linux-aarch64 - conda: "https://conda.anaconda.org/conda-forge/noarch/smmap-3.0.5-pyh44b312d_0.tar.bz2" - subdir: linux-aarch64 - conda: "https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2" - subdir: linux-aarch64 - conda: "https://conda.anaconda.org/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_0.tar.bz2" - subdir: linux-aarch64 - conda: "https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.3.2.post1-pyhd8ed1ab_0.tar.bz2" - subdir: linux-aarch64 - conda: "https://conda.anaconda.org/conda-forge/noarch/sphinx-5.3.0-pyhd8ed1ab_0.tar.bz2" - subdir: linux-aarch64 - conda: "https://conda.anaconda.org/conda-forge/noarch/sphinx-design-0.3.0-pyhd8ed1ab_0.tar.bz2" - subdir: linux-aarch64 - conda: "https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-1.0.4-pyhd8ed1ab_0.conda" - subdir: linux-aarch64 - conda: "https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-1.0.2-py_0.tar.bz2" - subdir: linux-aarch64 - conda: "https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.0.1-pyhd8ed1ab_0.conda" - subdir: linux-aarch64 - conda: "https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-py_0.tar.bz2" - subdir: linux-aarch64 - conda: "https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-1.0.3-py_0.tar.bz2" - subdir: linux-aarch64 - conda: "https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.5-pyhd8ed1ab_2.tar.bz2" - subdir: linux-aarch64 - conda: "https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.2-pyhd8ed1ab_0.conda" - subdir: linux-aarch64 - conda: "https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-aarch64-2.17-h43d7e78_13.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.12-hd8af866_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_0.tar.bz2" - subdir: linux-aarch64 - conda: "https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2" - subdir: linux-aarch64 - conda: "https://conda.anaconda.org/conda-forge/linux-aarch64/tornado-6.2-py39hb9a1dbb_1.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/traitlets-5.9.0-pyhd8ed1ab_0.conda" - subdir: linux-aarch64 - conda: "https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.4.0-hd8ed1ab_0.tar.bz2" - subdir: linux-aarch64 - conda: "https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.4.0-pyha770c72_0.tar.bz2" - subdir: linux-aarch64 - conda: "https://conda.anaconda.org/conda-forge/noarch/tzdata-2022g-h191b570_0.conda" - subdir: linux-aarch64 - conda: "https://conda.anaconda.org/conda-forge/linux-aarch64/unicodedata2-15.0.0-py39h0fd3b05_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/urllib3-1.26.14-pyhd8ed1ab_0.conda" - subdir: linux-aarch64 - conda: "https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.2.6-pyhd8ed1ab_0.conda" - subdir: linux-aarch64 - conda: "https://conda.anaconda.org/conda-forge/noarch/wheel-0.38.4-pyhd8ed1ab_0.tar.bz2" - subdir: linux-aarch64 - conda: "https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxau-1.0.9-h3557bc0_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxdmcp-1.1.3-h3557bc0_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/linux-aarch64/xz-5.2.6-h9cdd2b7_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/zipp-3.13.0-pyhd8ed1ab_0.conda" - subdir: linux-aarch64 - conda: "https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.2-h44f6412_6.conda" linux-ppc64le: - conda: "https://conda.anaconda.org/conda-forge/linux-ppc64le/_libgcc_mutex-0.1-conda_forge.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/linux-ppc64le/_openmp_mutex-4.5-2_gnu.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/alabaster-0.7.13-pyhd8ed1ab_0.conda" - subdir: linux-ppc64le - conda: "https://conda.anaconda.org/conda-forge/noarch/appdirs-1.4.4-pyh9f0ad1d_0.tar.bz2" - subdir: linux-ppc64le - conda: "https://conda.anaconda.org/conda-forge/noarch/asttokens-2.2.1-pyhd8ed1ab_0.conda" - subdir: linux-ppc64le - conda: "https://conda.anaconda.org/conda-forge/noarch/attrs-22.2.0-pyh71513ae_0.conda" - subdir: linux-ppc64le - conda: "https://conda.anaconda.org/conda-forge/noarch/babel-2.11.0-pyhd8ed1ab_0.tar.bz2" - subdir: linux-ppc64le - conda: "https://conda.anaconda.org/conda-forge/noarch/backcall-0.2.0-pyh9f0ad1d_0.tar.bz2" - subdir: linux-ppc64le - conda: "https://conda.anaconda.org/conda-forge/noarch/backports-1.0-pyhd8ed1ab_3.conda" - subdir: linux-ppc64le - conda: "https://conda.anaconda.org/conda-forge/noarch/backports.functools_lru_cache-1.6.4-pyhd8ed1ab_0.tar.bz2" - subdir: linux-ppc64le - conda: "https://conda.anaconda.org/conda-forge/linux-ppc64le/backports.zoneinfo-0.2.1-py39h0b1cf3c_7.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.11.2-pyha770c72_0.conda" - subdir: linux-ppc64le - conda: "https://conda.anaconda.org/conda-forge/linux-ppc64le/binutils-2.39-h7f02139_1.conda" - conda: "https://conda.anaconda.org/conda-forge/linux-ppc64le/binutils_impl_linux-ppc64le-2.39-heb37b50_1.conda" - conda: "https://conda.anaconda.org/conda-forge/linux-ppc64le/binutils_linux-ppc64le-2.39-h5e55cfe_11.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/breathe-4.34.0-pyhd8ed1ab_0.tar.bz2" - subdir: linux-ppc64le - conda: "https://conda.anaconda.org/conda-forge/linux-ppc64le/brotli-1.0.9-hb283c62_8.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/linux-ppc64le/brotli-bin-1.0.9-hb283c62_8.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/linux-ppc64le/brotlipy-0.7.0-py39h98ec90c_1005.tar.bz2" @@ -642,32 +464,23 @@ environments: - conda: "https://conda.anaconda.org/conda-forge/linux-ppc64le/c-compiler-1.5.2-h4194056_0.conda" - conda: "https://conda.anaconda.org/conda-forge/linux-ppc64le/ca-certificates-2022.12.7-h1084571_0.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/certifi-2022.12.7-pyhd8ed1ab_0.conda" - subdir: linux-ppc64le - conda: "https://conda.anaconda.org/conda-forge/linux-ppc64le/cffi-1.15.1-py39h1929af6_3.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-2.1.1-pyhd8ed1ab_0.tar.bz2" - subdir: linux-ppc64le - conda: "https://conda.anaconda.org/conda-forge/noarch/click-8.1.3-unix_pyhd8ed1ab_2.tar.bz2" - subdir: linux-ppc64le - conda: "https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2" - subdir: linux-ppc64le - conda: "https://conda.anaconda.org/conda-forge/linux-ppc64le/compilers-1.5.2-ha3edaa6_0.conda" - conda: "https://conda.anaconda.org/conda-forge/linux-ppc64le/contourpy-1.0.7-py39h9e1b185_0.conda" - conda: "https://conda.anaconda.org/conda-forge/linux-ppc64le/coverage-7.1.0-py39h3c7ea95_0.conda" - conda: "https://conda.anaconda.org/conda-forge/linux-ppc64le/cryptography-39.0.1-py39h31bd36e_0.conda" - conda: "https://conda.anaconda.org/conda-forge/linux-ppc64le/cxx-compiler-1.5.2-he01d56d_0.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/cycler-0.11.0-pyhd8ed1ab_0.tar.bz2" - subdir: linux-ppc64le - conda: "https://conda.anaconda.org/conda-forge/linux-ppc64le/cython-0.29.33-py39h89b8a7f_0.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/decorator-5.1.1-pyhd8ed1ab_0.tar.bz2" - subdir: linux-ppc64le - conda: "https://conda.anaconda.org/conda-forge/linux-ppc64le/docutils-0.19-py39hc1b9086_1.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/linux-ppc64le/doxygen-1.9.5-hc3812df_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.1.0-pyhd8ed1ab_0.conda" - subdir: linux-ppc64le - conda: "https://conda.anaconda.org/conda-forge/noarch/execnet-1.9.0-pyhd8ed1ab_0.tar.bz2" - subdir: linux-ppc64le - conda: "https://conda.anaconda.org/conda-forge/noarch/executing-1.2.0-pyhd8ed1ab_0.tar.bz2" - subdir: linux-ppc64le - conda: "https://conda.anaconda.org/conda-forge/linux-ppc64le/fonttools-4.38.0-py39h98ec90c_1.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/linux-ppc64le/fortran-compiler-1.5.2-hc9fb769_0.conda" - conda: "https://conda.anaconda.org/conda-forge/linux-ppc64le/freetype-2.12.1-h90753b0_1.conda" @@ -678,28 +491,18 @@ environments: - conda: "https://conda.anaconda.org/conda-forge/linux-ppc64le/gfortran_impl_linux-ppc64le-11.3.0-h230bcad_19.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/linux-ppc64le/gfortran_linux-ppc64le-11.3.0-h7e72f06_11.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/gitdb-4.0.10-pyhd8ed1ab_0.conda" - subdir: linux-ppc64le - conda: "https://conda.anaconda.org/conda-forge/noarch/gitpython-3.1.30-pyhd8ed1ab_0.conda" - subdir: linux-ppc64le - conda: "https://conda.anaconda.org/conda-forge/linux-ppc64le/gxx-11.3.0-ha746174_11.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/linux-ppc64le/gxx_impl_linux-ppc64le-11.3.0-h8f9c6bb_19.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/linux-ppc64le/gxx_linux-ppc64le-11.3.0-h3c74164_11.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/hypothesis-6.68.1-pyha770c72_0.conda" - subdir: linux-ppc64le - conda: "https://conda.anaconda.org/conda-forge/noarch/idna-3.4-pyhd8ed1ab_0.tar.bz2" - subdir: linux-ppc64le - conda: "https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2" - subdir: linux-ppc64le - conda: "https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-6.0.0-pyha770c72_0.conda" - subdir: linux-ppc64le - conda: "https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda" - subdir: linux-ppc64le - conda: "https://conda.anaconda.org/conda-forge/noarch/ipython-8.10.0-pyh41d4057_0.conda" - subdir: linux-ppc64le - conda: "https://conda.anaconda.org/conda-forge/noarch/jedi-0.18.2-pyhd8ed1ab_0.conda" - subdir: linux-ppc64le - conda: "https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.2-pyhd8ed1ab_1.tar.bz2" - subdir: linux-ppc64le - conda: "https://conda.anaconda.org/conda-forge/linux-ppc64le/jpeg-9e-h4194056_3.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-ppc64le-3.10.0-h23d7e6c_13.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/linux-ppc64le/kiwisolver-1.4.4-py39h2bf7372_1.tar.bz2" @@ -736,164 +539,98 @@ environments: - conda: "https://conda.anaconda.org/conda-forge/linux-ppc64le/matplotlib-3.6.3-py39hc1b9086_0.conda" - conda: "https://conda.anaconda.org/conda-forge/linux-ppc64le/matplotlib-base-3.6.3-py39h5497c37_0.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.1.6-pyhd8ed1ab_0.tar.bz2" - subdir: linux-ppc64le - conda: "https://conda.anaconda.org/conda-forge/noarch/meson-1.0.0-pyhd8ed1ab_0.conda" - subdir: linux-ppc64le - conda: "https://conda.anaconda.org/conda-forge/noarch/meson-python-0.12.0-pyh71feb2d_0.conda" - subdir: linux-ppc64le - conda: "https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2" - subdir: linux-ppc64le - conda: "https://conda.anaconda.org/conda-forge/linux-ppc64le/mypy-0.981-py39h98ec90c_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_0.conda" - subdir: linux-ppc64le - conda: "https://conda.anaconda.org/conda-forge/linux-ppc64le/ncurses-6.3-hab78ccb_1.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/linux-ppc64le/ninja-1.11.0-h06f31f1_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/nomkl-1.0-h5ca1d4c_0.tar.bz2" - subdir: linux-ppc64le - conda: "https://conda.anaconda.org/conda-forge/linux-ppc64le/numpy-1.24.2-py39h27d966d_0.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/numpydoc-1.4.0-pyhd8ed1ab_1.tar.bz2" - subdir: linux-ppc64le - conda: "https://conda.anaconda.org/conda-forge/linux-ppc64le/openblas-0.3.21-pthreads_h5960496_3.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/linux-ppc64le/openjpeg-2.5.0-hbcaec15_2.conda" - conda: "https://conda.anaconda.org/conda-forge/linux-ppc64le/openssl-3.0.8-h4194056_0.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/packaging-23.0-pyhd8ed1ab_0.conda" - subdir: linux-ppc64le - conda: "https://conda.anaconda.org/conda-forge/linux-ppc64le/pandas-1.5.3-py39h3cc8c3b_0.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/parso-0.8.3-pyhd8ed1ab_0.tar.bz2" - subdir: linux-ppc64le - conda: "https://conda.anaconda.org/conda-forge/noarch/pexpect-4.8.0-pyh1a96a4e_2.tar.bz2" - subdir: linux-ppc64le - conda: "https://conda.anaconda.org/conda-forge/noarch/pickleshare-0.7.5-py_1003.tar.bz2" - subdir: linux-ppc64le - conda: "https://conda.anaconda.org/conda-forge/linux-ppc64le/pillow-9.4.0-py39h845a511_1.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/pip-23.0-pyhd8ed1ab_0.conda" - subdir: linux-ppc64le - conda: "https://conda.anaconda.org/conda-forge/linux-ppc64le/pkg-config-0.29.2-h339bb43_1008.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/pluggy-1.0.0-pyhd8ed1ab_5.tar.bz2" - subdir: linux-ppc64le - conda: "https://conda.anaconda.org/conda-forge/noarch/pooch-1.6.0-pyhd8ed1ab_0.tar.bz2" - subdir: linux-ppc64le - conda: "https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.36-pyha770c72_0.conda" - subdir: linux-ppc64le - conda: "https://conda.anaconda.org/conda-forge/linux-ppc64le/psutil-5.9.4-py39h98ec90c_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/linux-ppc64le/pthread-stubs-0.4-h339bb43_1001.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd3deb0d_0.tar.bz2" - subdir: linux-ppc64le - conda: "https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.2-pyhd8ed1ab_0.tar.bz2" - subdir: linux-ppc64le - conda: "https://conda.anaconda.org/conda-forge/noarch/pycodestyle-2.7.0-pyhd8ed1ab_0.tar.bz2" - subdir: linux-ppc64le - conda: "https://conda.anaconda.org/conda-forge/noarch/pycparser-2.21-pyhd8ed1ab_0.tar.bz2" - subdir: linux-ppc64le - conda: "https://conda.anaconda.org/conda-forge/noarch/pydata-sphinx-theme-0.9.0-pyhd8ed1ab_1.tar.bz2" - subdir: linux-ppc64le - conda: "https://conda.anaconda.org/conda-forge/noarch/pygments-2.14.0-pyhd8ed1ab_0.conda" - subdir: linux-ppc64le - conda: "https://conda.anaconda.org/conda-forge/noarch/pyopenssl-23.0.0-pyhd8ed1ab_0.conda" - subdir: linux-ppc64le - conda: "https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.0.9-pyhd8ed1ab_0.tar.bz2" - subdir: linux-ppc64le - conda: "https://conda.anaconda.org/conda-forge/noarch/pyproject-metadata-0.7.1-pyhd8ed1ab_0.conda" - subdir: linux-ppc64le - conda: "https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2" - subdir: linux-ppc64le - conda: "https://conda.anaconda.org/conda-forge/noarch/pytest-7.2.1-pyhd8ed1ab_0.conda" - subdir: linux-ppc64le - conda: "https://conda.anaconda.org/conda-forge/noarch/pytest-cov-4.0.0-pyhd8ed1ab_0.tar.bz2" - subdir: linux-ppc64le - conda: "https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.2.0-pyhd8ed1ab_0.conda" - subdir: linux-ppc64le - conda: "https://conda.anaconda.org/conda-forge/linux-ppc64le/python-3.9.16-h342c621_0_cpython.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.8.2-pyhd8ed1ab_0.tar.bz2" - subdir: linux-ppc64le - conda: "https://conda.anaconda.org/conda-forge/linux-ppc64le/python_abi-3.9-3_cp39.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/pytz-2022.7.1-pyhd8ed1ab_0.conda" - subdir: linux-ppc64le - conda: "https://conda.anaconda.org/conda-forge/linux-ppc64le/readline-8.1.2-h6828edc_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/requests-2.28.2-pyhd8ed1ab_0.conda" - subdir: linux-ppc64le - conda: "https://conda.anaconda.org/conda-forge/linux-ppc64le/scipy-1.10.0-py39h27d966d_2.conda" - conda: "https://conda.anaconda.org/conda-forge/linux-ppc64le/setuptools-59.2.0-py39hc1b9086_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2" - subdir: linux-ppc64le - conda: "https://conda.anaconda.org/conda-forge/noarch/smmap-3.0.5-pyh44b312d_0.tar.bz2" - subdir: linux-ppc64le - conda: "https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2" - subdir: linux-ppc64le - conda: "https://conda.anaconda.org/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_0.tar.bz2" - subdir: linux-ppc64le - conda: "https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.3.2.post1-pyhd8ed1ab_0.tar.bz2" - subdir: linux-ppc64le - conda: "https://conda.anaconda.org/conda-forge/noarch/sphinx-5.3.0-pyhd8ed1ab_0.tar.bz2" - subdir: linux-ppc64le - conda: "https://conda.anaconda.org/conda-forge/noarch/sphinx-design-0.3.0-pyhd8ed1ab_0.tar.bz2" - subdir: linux-ppc64le - conda: "https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-1.0.4-pyhd8ed1ab_0.conda" - subdir: linux-ppc64le - conda: "https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-1.0.2-py_0.tar.bz2" - subdir: linux-ppc64le - conda: "https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.0.1-pyhd8ed1ab_0.conda" - subdir: linux-ppc64le - conda: "https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-py_0.tar.bz2" - subdir: linux-ppc64le - conda: "https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-1.0.3-py_0.tar.bz2" - subdir: linux-ppc64le - conda: "https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.5-pyhd8ed1ab_2.tar.bz2" - subdir: linux-ppc64le - conda: "https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.2-pyhd8ed1ab_0.conda" - subdir: linux-ppc64le - conda: "https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-ppc64le-2.17-h395ec9b_13.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/linux-ppc64le/tk-8.6.12-h41c6715_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_0.tar.bz2" - subdir: linux-ppc64le - conda: "https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2" - subdir: linux-ppc64le - conda: "https://conda.anaconda.org/conda-forge/linux-ppc64le/tornado-6.2-py39h9ca6cee_1.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/traitlets-5.9.0-pyhd8ed1ab_0.conda" - subdir: linux-ppc64le - conda: "https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.4.0-hd8ed1ab_0.tar.bz2" - subdir: linux-ppc64le - conda: "https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.4.0-pyha770c72_0.tar.bz2" - subdir: linux-ppc64le - conda: "https://conda.anaconda.org/conda-forge/noarch/tzdata-2022g-h191b570_0.conda" - subdir: linux-ppc64le - conda: "https://conda.anaconda.org/conda-forge/linux-ppc64le/unicodedata2-15.0.0-py39h98ec90c_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/urllib3-1.26.14-pyhd8ed1ab_0.conda" - subdir: linux-ppc64le - conda: "https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.2.6-pyhd8ed1ab_0.conda" - subdir: linux-ppc64le - conda: "https://conda.anaconda.org/conda-forge/noarch/wheel-0.38.4-pyhd8ed1ab_0.tar.bz2" - subdir: linux-ppc64le - conda: "https://conda.anaconda.org/conda-forge/linux-ppc64le/xorg-libxau-1.0.9-h4e0d66e_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/linux-ppc64le/xorg-libxdmcp-1.1.3-h4e0d66e_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/linux-ppc64le/xz-5.2.6-hb283c62_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/zipp-3.13.0-pyhd8ed1ab_0.conda" - subdir: linux-ppc64le - conda: "https://conda.anaconda.org/conda-forge/linux-ppc64le/zstd-1.5.2-h7affb48_6.conda" osx-64: - conda: "https://conda.anaconda.org/conda-forge/noarch/alabaster-0.7.13-pyhd8ed1ab_0.conda" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/appdirs-1.4.4-pyh9f0ad1d_0.tar.bz2" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/appnope-0.1.3-pyhd8ed1ab_0.tar.bz2" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/asttokens-2.2.1-pyhd8ed1ab_0.conda" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/attrs-22.2.0-pyh71513ae_0.conda" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/babel-2.11.0-pyhd8ed1ab_0.tar.bz2" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/backcall-0.2.0-pyh9f0ad1d_0.tar.bz2" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/backports-1.0-pyhd8ed1ab_3.conda" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/backports.functools_lru_cache-1.6.4-pyhd8ed1ab_0.tar.bz2" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/osx-64/backports.zoneinfo-0.2.1-py39h6e9494a_7.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.11.2-pyha770c72_0.conda" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/breathe-4.34.0-pyhd8ed1ab_0.tar.bz2" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/osx-64/brotli-1.0.9-hb7f2c08_8.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/osx-64/brotli-bin-1.0.9-hb7f2c08_8.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/osx-64/brotlipy-0.7.0-py39ha30fb19_1005.tar.bz2" @@ -903,19 +640,15 @@ environments: - conda: "https://conda.anaconda.org/conda-forge/osx-64/cctools-973.0.1-h76f1dac_11.conda" - conda: "https://conda.anaconda.org/conda-forge/osx-64/cctools_osx-64-973.0.1-hcc6d90d_11.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/certifi-2022.12.7-pyhd8ed1ab_0.conda" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/osx-64/cffi-1.15.1-py39h131948b_3.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-2.1.1-pyhd8ed1ab_0.tar.bz2" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/osx-64/clang-14-14.0.6-default_h55ffa42_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/osx-64/clang-14.0.6-h694c41f_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/osx-64/clang_osx-64-14.0.6-h3113cd8_4.conda" - conda: "https://conda.anaconda.org/conda-forge/osx-64/clangxx-14.0.6-default_h55ffa42_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/osx-64/clangxx_osx-64-14.0.6-h6f97653_4.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/click-8.1.3-unix_pyhd8ed1ab_2.tar.bz2" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/osx-64/compiler-rt-14.0.6-h613da45_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/compiler-rt_osx-64-14.0.6-hab78ec2_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/osx-64/compilers-1.5.2-h694c41f_0.conda" @@ -924,18 +657,13 @@ environments: - conda: "https://conda.anaconda.org/conda-forge/osx-64/cryptography-39.0.1-py39hbeae22c_0.conda" - conda: "https://conda.anaconda.org/conda-forge/osx-64/cxx-compiler-1.5.2-hb8565cd_0.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/cycler-0.11.0-pyhd8ed1ab_0.tar.bz2" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/osx-64/cython-0.29.33-py39h7a8716b_0.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/decorator-5.1.1-pyhd8ed1ab_0.tar.bz2" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/osx-64/docutils-0.19-py39h6e9494a_1.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/osx-64/doxygen-1.9.5-h6ca31d6_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.1.0-pyhd8ed1ab_0.conda" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/execnet-1.9.0-pyhd8ed1ab_0.tar.bz2" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/executing-1.2.0-pyhd8ed1ab_0.tar.bz2" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/osx-64/fonttools-4.38.0-py39ha30fb19_1.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/osx-64/fortran-compiler-1.5.2-haad3a49_0.conda" - conda: "https://conda.anaconda.org/conda-forge/osx-64/freetype-2.12.1-h3f81eb7_1.conda" @@ -943,27 +671,17 @@ environments: - conda: "https://conda.anaconda.org/conda-forge/osx-64/gfortran_impl_osx-64-11.3.0-h1f927f5_27.conda" - conda: "https://conda.anaconda.org/conda-forge/osx-64/gfortran_osx-64-11.3.0-h18f7dce_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/gitdb-4.0.10-pyhd8ed1ab_0.conda" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/gitpython-3.1.30-pyhd8ed1ab_0.conda" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/osx-64/gmp-6.2.1-h2e338ed_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/hypothesis-6.68.1-pyha770c72_0.conda" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/idna-3.4-pyhd8ed1ab_0.tar.bz2" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-6.0.0-pyha770c72_0.conda" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/ipython-8.10.0-pyhd1c38e8_0.conda" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/osx-64/isl-0.25-hb486fe8_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/jedi-0.18.2-pyhd8ed1ab_0.conda" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.2-pyhd8ed1ab_1.tar.bz2" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/osx-64/jpeg-9e-hb7f2c08_3.conda" - conda: "https://conda.anaconda.org/conda-forge/osx-64/kiwisolver-1.4.4-py39h92daf61_1.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/osx-64/lcms2-2.14-h29502cd_1.conda" @@ -998,168 +716,102 @@ environments: - conda: "https://conda.anaconda.org/conda-forge/osx-64/matplotlib-3.6.3-py39h6e9494a_0.conda" - conda: "https://conda.anaconda.org/conda-forge/osx-64/matplotlib-base-3.6.3-py39hb2f573b_0.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.1.6-pyhd8ed1ab_0.tar.bz2" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/meson-1.0.0-pyhd8ed1ab_0.conda" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/meson-python-0.12.0-pyh71feb2d_0.conda" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/osx-64/mpc-1.3.1-h81bd1dd_0.conda" - conda: "https://conda.anaconda.org/conda-forge/osx-64/mpfr-4.1.0-h0f52abe_1.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/osx-64/mypy-0.981-py39ha30fb19_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_0.conda" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.3-h96cf925_1.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/osx-64/ninja-1.11.0-h1b54a9f_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/nomkl-1.0-h5ca1d4c_0.tar.bz2" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/osx-64/numpy-1.24.2-py39h6ee2318_0.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/numpydoc-1.4.0-pyhd8ed1ab_1.tar.bz2" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/osx-64/openblas-0.3.21-openmp_hbefa662_3.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/osx-64/openjpeg-2.5.0-h13ac156_2.conda" - conda: "https://conda.anaconda.org/conda-forge/osx-64/openssl-3.0.8-hfd90126_0.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/packaging-23.0-pyhd8ed1ab_0.conda" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/osx-64/pandas-1.5.3-py39hecff1ad_0.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/parso-0.8.3-pyhd8ed1ab_0.tar.bz2" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/pexpect-4.8.0-pyh1a96a4e_2.tar.bz2" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/pickleshare-0.7.5-py_1003.tar.bz2" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/osx-64/pillow-9.4.0-py39h7f5cd59_1.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/pip-23.0-pyhd8ed1ab_0.conda" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/osx-64/pkg-config-0.29.2-ha3d46e9_1008.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/pluggy-1.0.0-pyhd8ed1ab_5.tar.bz2" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/pooch-1.6.0-pyhd8ed1ab_0.tar.bz2" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.36-pyha770c72_0.conda" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/osx-64/psutil-5.9.4-py39ha30fb19_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/osx-64/pthread-stubs-0.4-hc929b4f_1001.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd3deb0d_0.tar.bz2" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.2-pyhd8ed1ab_0.tar.bz2" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/pycodestyle-2.7.0-pyhd8ed1ab_0.tar.bz2" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/pycparser-2.21-pyhd8ed1ab_0.tar.bz2" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/pydata-sphinx-theme-0.9.0-pyhd8ed1ab_1.tar.bz2" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/pygments-2.14.0-pyhd8ed1ab_0.conda" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/pyopenssl-23.0.0-pyhd8ed1ab_0.conda" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.0.9-pyhd8ed1ab_0.tar.bz2" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/pyproject-metadata-0.7.1-pyhd8ed1ab_0.conda" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/pytest-7.2.1-pyhd8ed1ab_0.conda" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/pytest-cov-4.0.0-pyhd8ed1ab_0.tar.bz2" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.2.0-pyhd8ed1ab_0.conda" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/osx-64/python-3.9.16-h709bd14_0_cpython.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.8.2-pyhd8ed1ab_0.tar.bz2" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/osx-64/python_abi-3.9-3_cp39.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/pytz-2022.7.1-pyhd8ed1ab_0.conda" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/osx-64/readline-8.1.2-h3899abd_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/requests-2.28.2-pyhd8ed1ab_0.conda" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/osx-64/scipy-1.10.0-py39h8a15683_2.conda" - conda: "https://conda.anaconda.org/conda-forge/osx-64/setuptools-59.2.0-py39h6e9494a_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/osx-64/sigtool-0.1.3-h88f4db0_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/smmap-3.0.5-pyh44b312d_0.tar.bz2" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_0.tar.bz2" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.3.2.post1-pyhd8ed1ab_0.tar.bz2" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/sphinx-5.3.0-pyhd8ed1ab_0.tar.bz2" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/sphinx-design-0.3.0-pyhd8ed1ab_0.tar.bz2" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-1.0.4-pyhd8ed1ab_0.conda" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-1.0.2-py_0.tar.bz2" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.0.1-pyhd8ed1ab_0.conda" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-py_0.tar.bz2" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-1.0.3-py_0.tar.bz2" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.5-pyhd8ed1ab_2.tar.bz2" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.2-pyhd8ed1ab_0.conda" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/osx-64/tapi-1100.0.11-h9ce4665_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.12-h5dbffcc_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_0.tar.bz2" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/osx-64/tornado-6.2-py39ha30fb19_1.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/traitlets-5.9.0-pyhd8ed1ab_0.conda" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.4.0-hd8ed1ab_0.tar.bz2" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.4.0-pyha770c72_0.tar.bz2" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/tzdata-2022g-h191b570_0.conda" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/osx-64/unicodedata2-15.0.0-py39ha30fb19_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/urllib3-1.26.14-pyhd8ed1ab_0.conda" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.2.6-pyhd8ed1ab_0.conda" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/wheel-0.38.4-pyhd8ed1ab_0.tar.bz2" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/osx-64/xorg-libxau-1.0.9-h35c211d_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/osx-64/xorg-libxdmcp-1.1.3-h35c211d_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/osx-64/xz-5.2.6-h775f41a_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/zipp-3.13.0-pyhd8ed1ab_0.conda" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/osx-64/zlib-1.2.13-hfd90126_4.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/osx-64/zstd-1.5.2-hbc0c0cd_6.conda" osx-arm64: - conda: "https://conda.anaconda.org/conda-forge/noarch/alabaster-0.7.13-pyhd8ed1ab_0.conda" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/noarch/appdirs-1.4.4-pyh9f0ad1d_0.tar.bz2" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/noarch/appnope-0.1.3-pyhd8ed1ab_0.tar.bz2" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/noarch/asttokens-2.2.1-pyhd8ed1ab_0.conda" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/noarch/attrs-22.2.0-pyh71513ae_0.conda" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/noarch/babel-2.11.0-pyhd8ed1ab_0.tar.bz2" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/noarch/backcall-0.2.0-pyh9f0ad1d_0.tar.bz2" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/noarch/backports-1.0-pyhd8ed1ab_3.conda" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/noarch/backports.functools_lru_cache-1.6.4-pyhd8ed1ab_0.tar.bz2" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/backports.zoneinfo-0.2.1-py39h2804cbe_7.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.11.2-pyha770c72_0.conda" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/noarch/breathe-4.34.0-pyhd8ed1ab_0.tar.bz2" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/brotli-1.0.9-h1a8c8d9_8.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/brotli-bin-1.0.9-h1a8c8d9_8.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/brotlipy-0.7.0-py39h02fc5c5_1005.tar.bz2" @@ -1169,19 +821,15 @@ environments: - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/cctools-973.0.1-hcbb26d4_11.conda" - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/cctools_osx-arm64-973.0.1-hef52d2f_11.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/certifi-2022.12.7-pyhd8ed1ab_0.conda" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/cffi-1.15.1-py39h7e6b969_3.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-2.1.1-pyhd8ed1ab_0.tar.bz2" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/clang-14-14.0.6-default_h81a5282_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/clang-14.0.6-hce30654_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/clang_osx-arm64-14.0.6-h15773ab_4.conda" - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/clangxx-14.0.6-default_hb7ecf47_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/clangxx_osx-arm64-14.0.6-he29aa18_4.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/click-8.1.3-unix_pyhd8ed1ab_2.tar.bz2" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/compiler-rt-14.0.6-h30b49de_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/compiler-rt_osx-arm64-14.0.6-h48302dc_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/compilers-1.5.2-hce30654_0.conda" @@ -1190,18 +838,13 @@ environments: - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/cryptography-39.0.1-py39he2a39a8_0.conda" - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/cxx-compiler-1.5.2-hffc8910_0.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/cycler-0.11.0-pyhd8ed1ab_0.tar.bz2" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/cython-0.29.33-py39h23fbdae_0.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/decorator-5.1.1-pyhd8ed1ab_0.tar.bz2" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/docutils-0.19-py39h2804cbe_1.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/doxygen-1.9.5-hd78112f_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.1.0-pyhd8ed1ab_0.conda" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/noarch/execnet-1.9.0-pyhd8ed1ab_0.tar.bz2" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/noarch/executing-1.2.0-pyhd8ed1ab_0.tar.bz2" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/fonttools-4.38.0-py39h02fc5c5_1.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/fortran-compiler-1.5.2-h2ccabda_0.conda" - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/freetype-2.12.1-hd633e50_1.conda" @@ -1210,27 +853,17 @@ environments: - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/gfortran_impl_osx-arm64-11.3.0-h2a9d086_27.conda" - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/gfortran_osx-arm64-11.3.0-h57527a5_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/gitdb-4.0.10-pyhd8ed1ab_0.conda" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/noarch/gitpython-3.1.30-pyhd8ed1ab_0.conda" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/gmp-6.2.1-h9f76cd9_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/hypothesis-6.68.1-pyha770c72_0.conda" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/noarch/idna-3.4-pyhd8ed1ab_0.tar.bz2" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-6.0.0-pyha770c72_0.conda" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/noarch/ipython-8.10.0-pyhd1c38e8_0.conda" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/isl-0.25-h9a09cb3_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/jedi-0.18.2-pyhd8ed1ab_0.conda" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.2-pyhd8ed1ab_1.tar.bz2" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/jpeg-9e-h1a8c8d9_3.conda" - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/kiwisolver-1.4.4-py39haaf3ac1_1.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/lcms2-2.14-h481adae_1.conda" @@ -1266,143 +899,88 @@ environments: - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/matplotlib-3.6.3-py39hdf13c20_0.conda" - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/matplotlib-base-3.6.3-py39h35e9e80_0.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.1.6-pyhd8ed1ab_0.tar.bz2" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/noarch/meson-1.0.0-pyhd8ed1ab_0.conda" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/noarch/meson-python-0.12.0-pyh71feb2d_0.conda" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/mpc-1.3.1-h91ba8db_0.conda" - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/mpfr-4.1.0-h6d7a090_1.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/mypy-0.981-py39h02fc5c5_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_0.conda" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.3-h07bb92c_1.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/ninja-1.11.0-hf86a087_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/nomkl-1.0-h5ca1d4c_0.tar.bz2" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/numpy-1.24.2-py39hff61c6a_0.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/numpydoc-1.4.0-pyhd8ed1ab_1.tar.bz2" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/openblas-0.3.21-openmp_hf78f355_3.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/openjpeg-2.5.0-hbc2ba62_2.conda" - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.0.8-h03a7124_0.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/packaging-23.0-pyhd8ed1ab_0.conda" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/pandas-1.5.3-py39hde7b980_0.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/parso-0.8.3-pyhd8ed1ab_0.tar.bz2" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/pcre2-10.40-hb34f9b4_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/pexpect-4.8.0-pyh1a96a4e_2.tar.bz2" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/noarch/pickleshare-0.7.5-py_1003.tar.bz2" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/pillow-9.4.0-py39h8bd98a6_1.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/pip-23.0-pyhd8ed1ab_0.conda" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/pkg-config-0.29.2-hab62308_1008.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/pluggy-1.0.0-pyhd8ed1ab_5.tar.bz2" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/noarch/pooch-1.6.0-pyhd8ed1ab_0.tar.bz2" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.36-pyha770c72_0.conda" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/psutil-5.9.4-py39h02fc5c5_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/pthread-stubs-0.4-h27ca646_1001.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd3deb0d_0.tar.bz2" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.2-pyhd8ed1ab_0.tar.bz2" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/noarch/pycodestyle-2.7.0-pyhd8ed1ab_0.tar.bz2" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/noarch/pycparser-2.21-pyhd8ed1ab_0.tar.bz2" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/noarch/pydata-sphinx-theme-0.9.0-pyhd8ed1ab_1.tar.bz2" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/noarch/pygments-2.14.0-pyhd8ed1ab_0.conda" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/noarch/pyopenssl-23.0.0-pyhd8ed1ab_0.conda" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.0.9-pyhd8ed1ab_0.tar.bz2" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/noarch/pyproject-metadata-0.7.1-pyhd8ed1ab_0.conda" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/noarch/pytest-7.2.1-pyhd8ed1ab_0.conda" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/noarch/pytest-cov-4.0.0-pyhd8ed1ab_0.tar.bz2" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.2.0-pyhd8ed1ab_0.conda" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/python-3.9.16-hea58f1e_0_cpython.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.8.2-pyhd8ed1ab_0.tar.bz2" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/python_abi-3.9-3_cp39.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/pytz-2022.7.1-pyhd8ed1ab_0.conda" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.1.2-h46ed386_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/requests-2.28.2-pyhd8ed1ab_0.conda" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/scipy-1.10.0-py39h18313fe_2.conda" - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/setuptools-59.2.0-py39h2804cbe_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/sigtool-0.1.3-h44b9a77_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/noarch/smmap-3.0.5-pyh44b312d_0.tar.bz2" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_0.tar.bz2" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.3.2.post1-pyhd8ed1ab_0.tar.bz2" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/noarch/sphinx-5.3.0-pyhd8ed1ab_0.tar.bz2" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/noarch/sphinx-design-0.3.0-pyhd8ed1ab_0.tar.bz2" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-1.0.4-pyhd8ed1ab_0.conda" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-1.0.2-py_0.tar.bz2" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.0.1-pyhd8ed1ab_0.conda" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-py_0.tar.bz2" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-1.0.3-py_0.tar.bz2" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.5-pyhd8ed1ab_2.tar.bz2" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.2-pyhd8ed1ab_0.conda" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/tapi-1100.0.11-he4954df_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.12-he1e0b03_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_0.tar.bz2" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.2-py39h02fc5c5_1.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/traitlets-5.9.0-pyhd8ed1ab_0.conda" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.4.0-hd8ed1ab_0.tar.bz2" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.4.0-pyha770c72_0.tar.bz2" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/noarch/tzdata-2022g-h191b570_0.conda" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/unicodedata2-15.0.0-py39h02fc5c5_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/urllib3-1.26.14-pyhd8ed1ab_0.conda" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.2.6-pyhd8ed1ab_0.conda" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/noarch/wheel-0.38.4-pyhd8ed1ab_0.tar.bz2" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxau-1.0.9-h27ca646_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxdmcp-1.1.3-h27ca646_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/xz-5.2.6-h57fd34a_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/zipp-3.13.0-pyhd8ed1ab_0.conda" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/zlib-1.2.13-h03a7124_4.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.2-hf913c23_6.conda" packages: diff --git a/crates/rattler_lock/src/snapshots/rattler_lock__test__v4__path-based-lock.yml.snap b/crates/rattler_lock/src/snapshots/rattler_lock__test__v4__path-based-lock.yml.snap index 0737e8e3c..697c33b78 100644 --- a/crates/rattler_lock/src/snapshots/rattler_lock__test__v4__path-based-lock.yml.snap +++ b/crates/rattler_lock/src/snapshots/rattler_lock__test__v4__path-based-lock.yml.snap @@ -2,7 +2,7 @@ source: crates/rattler_lock/src/lib.rs expression: conda_lock --- -version: 6 +version: 7 environments: default: channels: diff --git a/crates/rattler_lock/src/snapshots/rattler_lock__test__v4__pypi-matplotlib-lock.yml.snap b/crates/rattler_lock/src/snapshots/rattler_lock__test__v4__pypi-matplotlib-lock.yml.snap index b6017005c..79dcc7b5e 100644 --- a/crates/rattler_lock/src/snapshots/rattler_lock__test__v4__pypi-matplotlib-lock.yml.snap +++ b/crates/rattler_lock/src/snapshots/rattler_lock__test__v4__pypi-matplotlib-lock.yml.snap @@ -2,7 +2,7 @@ source: crates/rattler_lock/src/lib.rs expression: conda_lock --- -version: 6 +version: 7 environments: default: channels: @@ -23,7 +23,6 @@ environments: - conda: "https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.3-h9c3ff4c_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/linux-64/openssl-3.0.0-h7f98852_2.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/pip-22.0.3-pyhd8ed1ab_0.tar.bz2" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/linux-64/python-3.9.10-hc74c709_2_cpython.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.9-2_cp39.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/linux-64/readline-8.1-h46c0cb4_0.tar.bz2" @@ -31,9 +30,7 @@ environments: - conda: "https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.37.0-h9cd32fc_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.12-h27826a3_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/tzdata-2021e-he74cb21_0.tar.bz2" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/wheel-0.37.1-pyhd8ed1ab_0.tar.bz2" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.5-h516909a_1.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/linux-64/zlib-1.2.11-h36c2ea0_1013.tar.bz2" - pypi: "https://files.pythonhosted.org/packages/5c/f9/695d6bedebd747e5eb0fe8fad57b72fdf25411273a39791cde838d5a8f51/cycler-0.11.0-py3-none-any.whl" @@ -56,7 +53,6 @@ environments: - conda: "https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.3-he49afe7_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/osx-64/openssl-3.0.0-h0d85af4_2.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/pip-22.0.3-pyhd8ed1ab_0.tar.bz2" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/osx-64/python-3.9.10-hea1dfa3_2_cpython.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/osx-64/python_abi-3.9-2_cp39.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/osx-64/readline-8.1-h05e3726_0.tar.bz2" @@ -64,9 +60,7 @@ environments: - conda: "https://conda.anaconda.org/conda-forge/osx-64/sqlite-3.37.0-h23a322b_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.12-h5dbffcc_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/tzdata-2021e-he74cb21_0.tar.bz2" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/wheel-0.37.1-pyhd8ed1ab_0.tar.bz2" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/osx-64/xz-5.2.5-haf1e3a3_1.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/osx-64/zlib-1.2.11-h9173be1_1013.tar.bz2" - pypi: "https://files.pythonhosted.org/packages/5c/f9/695d6bedebd747e5eb0fe8fad57b72fdf25411273a39791cde838d5a8f51/cycler-0.11.0-py3-none-any.whl" @@ -88,19 +82,16 @@ environments: - conda: "https://conda.anaconda.org/conda-forge/win-64/libzlib-1.2.11-h8ffe710_1013.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/win-64/openssl-3.0.0-h8ffe710_2.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/pip-22.0.3-pyhd8ed1ab_0.tar.bz2" - subdir: win-64 - conda: "https://conda.anaconda.org/conda-forge/win-64/python-3.9.10-hcf16a7b_2_cpython.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/win-64/python_abi-3.9-2_cp39.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/win-64/setuptools-60.9.3-py39hcbf5309_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/win-64/sqlite-3.37.0-h8ffe710_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/win-64/tk-8.6.12-h8ffe710_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/tzdata-2021e-he74cb21_0.tar.bz2" - subdir: win-64 - conda: "https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.20348.0-h57928b3_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/win-64/vc-14.2-hb210afc_6.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/win-64/vs2015_runtime-14.29.30037-h902a5da_6.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/wheel-0.37.1-pyhd8ed1ab_0.tar.bz2" - subdir: win-64 - conda: "https://conda.anaconda.org/conda-forge/win-64/xz-5.2.5-h62dcd97_1.tar.bz2" - pypi: "https://files.pythonhosted.org/packages/5c/f9/695d6bedebd747e5eb0fe8fad57b72fdf25411273a39791cde838d5a8f51/cycler-0.11.0-py3-none-any.whl" - pypi: "https://files.pythonhosted.org/packages/1d/46/65a58d7b92905e2767000b3f6eb1d0301e9ed7d459d14461075c1db63349/fonttools-4.29.1-py3-none-any.whl" diff --git a/crates/rattler_lock/src/snapshots/rattler_lock__test__v4__python-lock.yml.snap b/crates/rattler_lock/src/snapshots/rattler_lock__test__v4__python-lock.yml.snap index e51b69a1a..8ed307bf3 100644 --- a/crates/rattler_lock/src/snapshots/rattler_lock__test__v4__python-lock.yml.snap +++ b/crates/rattler_lock/src/snapshots/rattler_lock__test__v4__python-lock.yml.snap @@ -2,7 +2,7 @@ source: crates/rattler_lock/src/lib.rs expression: conda_lock --- -version: 6 +version: 7 environments: default: channels: @@ -24,16 +24,12 @@ environments: - conda: "https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.3-h27087fc_1.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/linux-64/openssl-3.0.8-h0b41bf4_0.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/pip-23.0.1-pyhd8ed1ab_0.conda" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/linux-64/python-3.11.0-he550d4f_1_cpython.conda" - conda: "https://conda.anaconda.org/conda-forge/linux-64/readline-8.1.2-h0f457ee_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/setuptools-67.4.0-pyhd8ed1ab_0.conda" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.12-h27826a3_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/tzdata-2022g-h191b570_0.conda" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/wheel-0.38.4-pyhd8ed1ab_0.tar.bz2" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2" linux-aarch64: - conda: "https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-2_gnu.tar.bz2" @@ -50,16 +46,12 @@ environments: - conda: "https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.3-headf329_1.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.0.8-hb4cce97_0.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/pip-23.0.1-pyhd8ed1ab_0.conda" - subdir: linux-aarch64 - conda: "https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.11.0-ha43d526_1_cpython.conda" - conda: "https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.1.2-h38e3740_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/setuptools-67.4.0-pyhd8ed1ab_0.conda" - subdir: linux-aarch64 - conda: "https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.12-hd8af866_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/tzdata-2022g-h191b570_0.conda" - subdir: linux-aarch64 - conda: "https://conda.anaconda.org/conda-forge/noarch/wheel-0.38.4-pyhd8ed1ab_0.tar.bz2" - subdir: linux-aarch64 - conda: "https://conda.anaconda.org/conda-forge/linux-aarch64/xz-5.2.6-h9cdd2b7_0.tar.bz2" linux-ppc64le: - conda: "https://conda.anaconda.org/conda-forge/linux-ppc64le/_libgcc_mutex-0.1-conda_forge.tar.bz2" @@ -77,16 +69,12 @@ environments: - conda: "https://conda.anaconda.org/conda-forge/linux-ppc64le/ncurses-6.3-hab78ccb_1.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/linux-ppc64le/openssl-3.0.8-h4194056_0.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/pip-23.0.1-pyhd8ed1ab_0.conda" - subdir: linux-ppc64le - conda: "https://conda.anaconda.org/conda-forge/linux-ppc64le/python-3.11.0-h062392f_1_cpython.conda" - conda: "https://conda.anaconda.org/conda-forge/linux-ppc64le/readline-8.1.2-h6828edc_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/setuptools-67.4.0-pyhd8ed1ab_0.conda" - subdir: linux-ppc64le - conda: "https://conda.anaconda.org/conda-forge/linux-ppc64le/tk-8.6.12-h41c6715_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/tzdata-2022g-h191b570_0.conda" - subdir: linux-ppc64le - conda: "https://conda.anaconda.org/conda-forge/noarch/wheel-0.38.4-pyhd8ed1ab_0.tar.bz2" - subdir: linux-ppc64le - conda: "https://conda.anaconda.org/conda-forge/linux-ppc64le/xz-5.2.6-hb283c62_0.tar.bz2" osx-64: - conda: "https://conda.anaconda.org/conda-forge/osx-64/bzip2-1.0.8-h0d85af4_4.tar.bz2" @@ -97,16 +85,12 @@ environments: - conda: "https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.3-h96cf925_1.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/osx-64/openssl-3.0.8-hfd90126_0.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/pip-23.0.1-pyhd8ed1ab_0.conda" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/osx-64/python-3.11.0-he7542f4_1_cpython.conda" - conda: "https://conda.anaconda.org/conda-forge/osx-64/readline-8.1.2-h3899abd_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/setuptools-67.4.0-pyhd8ed1ab_0.conda" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.12-h5dbffcc_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/tzdata-2022g-h191b570_0.conda" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/wheel-0.38.4-pyhd8ed1ab_0.tar.bz2" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/osx-64/xz-5.2.6-h775f41a_0.tar.bz2" osx-arm64: - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-h3422bc3_4.tar.bz2" @@ -117,16 +101,12 @@ environments: - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.3-h07bb92c_1.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.0.8-h03a7124_0.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/pip-23.0.1-pyhd8ed1ab_0.conda" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/python-3.11.0-h3ba56d0_1_cpython.conda" - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.1.2-h46ed386_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/setuptools-67.4.0-pyhd8ed1ab_0.conda" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.12-he1e0b03_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/tzdata-2022g-h191b570_0.conda" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/noarch/wheel-0.38.4-pyhd8ed1ab_0.tar.bz2" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/xz-5.2.6-h57fd34a_0.tar.bz2" win-64: - conda: "https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h8ffe710_4.tar.bz2" @@ -136,18 +116,14 @@ environments: - conda: "https://conda.anaconda.org/conda-forge/win-64/libzlib-1.2.13-hcfcfb64_4.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/win-64/openssl-3.0.8-hcfcfb64_0.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/pip-23.0.1-pyhd8ed1ab_0.conda" - subdir: win-64 - conda: "https://conda.anaconda.org/conda-forge/win-64/python-3.11.0-hcf16a7b_0_cpython.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/setuptools-67.4.0-pyhd8ed1ab_0.conda" - subdir: win-64 - conda: "https://conda.anaconda.org/conda-forge/win-64/tk-8.6.12-h8ffe710_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/tzdata-2022g-h191b570_0.conda" - subdir: win-64 - conda: "https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.22621.0-h57928b3_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/win-64/vc-14.3-hb6edc58_10.conda" - conda: "https://conda.anaconda.org/conda-forge/win-64/vs2015_runtime-14.34.31931-h4c5c07a_10.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/wheel-0.38.4-pyhd8ed1ab_0.tar.bz2" - subdir: win-64 - conda: "https://conda.anaconda.org/conda-forge/win-64/xz-5.2.6-h8d14728_0.tar.bz2" packages: - conda: "https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2" diff --git a/crates/rattler_lock/src/snapshots/rattler_lock__test__v4__turtlesim-lock.yml.snap b/crates/rattler_lock/src/snapshots/rattler_lock__test__v4__turtlesim-lock.yml.snap index f52d882c1..d8c47d9de 100644 --- a/crates/rattler_lock/src/snapshots/rattler_lock__test__v4__turtlesim-lock.yml.snap +++ b/crates/rattler_lock/src/snapshots/rattler_lock__test__v4__turtlesim-lock.yml.snap @@ -2,7 +2,7 @@ source: crates/rattler_lock/src/lib.rs expression: conda_lock --- -version: 6 +version: 7 environments: default: channels: @@ -14,18 +14,14 @@ environments: - 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/aiohttp-3.8.4-py310h2372a71_1.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.3.1-pyhd8ed1ab_0.tar.bz2" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.8-h166bdaf_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/linux-64/aom-3.5.0-h27087fc_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.1.1-pyhd8ed1ab_0.conda" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/linux-64/assimp-5.2.5-hf40c2ba_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/async-timeout-4.0.2-pyhd8ed1ab_0.tar.bz2" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/linux-64/atk-1.0-2.38.0-hd4edc92_1.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/linux-64/attr-2.5.1-h166bdaf_1.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/attrs-23.1.0-pyh71513ae_1.conda" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/linux-64/boost-1.78.0-py310hc4a4660_4.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/linux-64/boost-cpp-1.78.0-h5adbc97_2.conda" - conda: "https://conda.anaconda.org/conda-forge/linux-64/brotli-1.0.9-h166bdaf_9.conda" @@ -37,52 +33,37 @@ environments: - conda: "https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2023.5.7-hbcca054_0.conda" - conda: "https://conda.anaconda.org/conda-forge/linux-64/cairo-1.16.0-ha61ee94_1014.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/catkin_pkg-0.5.2-pyhd8ed1ab_0.tar.bz2" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/certifi-2023.5.7-pyhd8ed1ab_0.conda" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/linux-64/cffi-1.15.1-py310h255011f_3.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.2.0-pyhd8ed1ab_0.conda" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/linux-64/cmake-3.26.3-h077f3f9_0.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/linux-64/console_bridge-1.0.2-h924138e_1.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.1.0-py310hd41b1e2_0.conda" - conda: "https://conda.anaconda.org/conda-forge/linux-64/cppcheck-2.10.3-py310he65e294_0.conda" - conda: "https://conda.anaconda.org/conda-forge/linux-64/cryptography-41.0.1-py310h75e40e8_0.conda" - conda: "https://conda.anaconda.org/conda-forge/linux-64/curl-7.88.1-hdc1c0ab_1.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/cycler-0.11.0-pyhd8ed1ab_0.tar.bz2" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/linux-64/dbus-1.13.6-h5008d03_3.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/distro-1.8.0-pyhd8ed1ab_0.conda" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/linux-64/docutils-0.20.1-py310hff52083_0.conda" - conda: "https://conda.anaconda.org/conda-forge/linux-64/double-conversion-3.2.0-h27087fc_1.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/linux-64/eigen-3.4.0-h4bd325d_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/empy-3.3.4-pyh9f0ad1d_1.tar.bz2" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.1.2-pyhd8ed1ab_0.conda" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/linux-64/expat-2.5.0-hcb278e6_1.conda" - conda: "https://conda.anaconda.org/conda-forge/linux-64/ffmpeg-5.1.2-gpl_h8dda1f0_106.conda" - conda: "https://conda.anaconda.org/conda-forge/linux-64/fftw-3.3.10-nompi_hc118613_108.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/flake8-6.0.0-pyhd8ed1ab_0.conda" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/linux-64/flann-1.9.1-he05ef13_1011.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/linux-64/fmt-9.1.0-h924138e_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-hab24e00_0.tar.bz2" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.14.2-h14ed4e7_0.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.40.0-py310h2372a71_0.conda" - conda: "https://conda.anaconda.org/conda-forge/linux-64/foonathan-memory-0.7.2-h27087fc_1.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-h9c3ff4c_1.tar.bz2" @@ -113,14 +94,10 @@ environments: - conda: "https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.12.2-nompi_h4df4325_101.conda" - conda: "https://conda.anaconda.org/conda-forge/linux-64/icu-70.1-h27087fc_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/idna-3.4-pyhd8ed1ab_0.tar.bz2" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/linux-64/imath-3.1.6-h6239696_1.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-6.8.0-pyha770c72_0.conda" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.0.0-pyhd8ed1ab_0.conda" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/linux-64/jack-1.9.22-h11f4161_0.conda" - conda: "https://conda.anaconda.org/conda-forge/linux-64/jasper-2.0.33-h0ff4b12_1.conda" - conda: "https://conda.anaconda.org/conda-forge/linux-64/jpeg-9e-h0b41bf4_3.conda" @@ -131,7 +108,6 @@ environments: - conda: "https://conda.anaconda.org/conda-forge/linux-64/krb5-1.20.1-h81ceb04_0.conda" - conda: "https://conda.anaconda.org/conda-forge/linux-64/lame-3.100-h166bdaf_1003.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/lark-parser-0.12.0-pyhd8ed1ab_0.tar.bz2" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.14-h6ed2654_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-h41732ed_0.conda" - conda: "https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2" @@ -215,11 +191,9 @@ environments: - conda: "https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.4-hcb278e6_0.conda" - conda: "https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.7.1-py310he60537e_0.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/mccabe-0.7.0-pyhd8ed1ab_0.tar.bz2" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/linux-64/mpg123-1.31.3-hcb278e6_0.conda" - conda: "https://conda.anaconda.org/conda-forge/linux-64/multidict-6.0.4-py310h1fa729e_0.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/linux-64/mysql-common-8.0.33-hf1915f5_1.conda" - conda: "https://conda.anaconda.org/conda-forge/linux-64/mysql-libs-8.0.33-hca2cd23_1.conda" - conda: "https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.4-hcb278e6_0.conda" @@ -236,20 +210,16 @@ environments: - conda: "https://conda.anaconda.org/conda-forge/linux-64/orocos-kdl-1.5.1-h27087fc_4.conda" - conda: "https://conda.anaconda.org/conda-forge/linux-64/p11-kit-0.24.1-hc5aa10d_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/packaging-23.1-pyhd8ed1ab_0.conda" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/linux-64/pango-1.50.14-hd33c08f_0.conda" - conda: "https://conda.anaconda.org/conda-forge/linux-64/pcl-1.12.1-he8b3650_4.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/linux-64/pcre-8.45-h9c3ff4c_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.40-hc3806b6_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/pep517-0.13.0-pyhd8ed1ab_0.tar.bz2" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/linux-64/pillow-9.2.0-py310h454ad03_3.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/linux-64/pixman-0.40.0-h36c2ea0_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/linux-64/pkg-config-0.29.2-h36c2ea0_1008.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/pluggy-1.2.0-pyhd8ed1ab_0.conda" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/ply-3.11-py_1.tar.bz2" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/linux-64/proj-9.1.0-h93bde94_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/linux-64/psutil-5.9.5-py310h1fa729e_0.conda" - conda: "https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-h36c2ea0_1001.tar.bz2" @@ -260,32 +230,22 @@ environments: - conda: "https://conda.anaconda.org/conda-forge/linux-64/py-opencv-4.6.0-py310hfdc917e_8.conda" - conda: "https://conda.anaconda.org/conda-forge/linux-64/pybind11-2.10.4-py310hdf3cbec_0.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/pybind11-abi-4-hd8ed1ab_3.tar.bz2" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/linux-64/pybind11-global-2.10.4-py310hdf3cbec_0.conda" - conda: "https://conda.anaconda.org/conda-forge/linux-64/pybullet-3.24-py310h769672d_0.conda" - conda: "https://conda.anaconda.org/conda-forge/linux-64/pycairo-1.24.0-py310hda9f760_0.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/pycodestyle-2.10.0-pyhd8ed1ab_0.conda" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/pycparser-2.21-pyhd8ed1ab_0.tar.bz2" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/pydocstyle-6.3.0-pyhd8ed1ab_0.conda" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/linux-64/pydot-1.4.2-py310hff52083_3.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/pyflakes-3.0.1-pyhd8ed1ab_0.conda" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/pygments-2.15.1-pyhd8ed1ab_0.conda" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.0-pyhd8ed1ab_0.conda" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/linux-64/pyqt-5.15.7-py310hab646b1_3.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/pyqt-builder-1.15.1-pyhd8ed1ab_0.conda" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/linux-64/pyqt5-sip-12.11.0-py310heca2aa9_3.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/pytest-7.4.0-pyhd8ed1ab_0.conda" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/linux-64/python-3.10.12-hd12c33a_0_cpython.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.8.2-pyhd8ed1ab_0.tar.bz2" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.10-3_cp310.conda" - conda: "https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0-py310h5764c6d_5.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h4bd325d_2.tar.bz2" @@ -583,14 +543,11 @@ environments: - conda: "https://conda.anaconda.org/robostack-staging/linux-64/ros2-distro-mutex-0.3.0-humble.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/linux-64/rosdistro-0.9.0-py310hff52083_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/rospkg-1.5.0-pyhd8ed1ab_0.conda" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/linux-64/sdl2-2.26.5-h949db6a_0.conda" - conda: "https://conda.anaconda.org/conda-forge/linux-64/setuptools-61.0.0-py310hff52083_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/linux-64/sip-6.7.9-py310hc6cd4ac_0.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/linux-64/spdlog-1.11.0-h9b3ece8_1.conda" - conda: "https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.42.0-h2c6b66d_0.conda" - conda: "https://conda.anaconda.org/conda-forge/linux-64/svt-av1-1.4.1-hcb278e6_0.conda" @@ -600,21 +557,15 @@ environments: - conda: "https://conda.anaconda.org/conda-forge/linux-64/tinyxml2-9.0.0-h9c3ff4c_2.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.12-h27826a3_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_0.tar.bz2" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.7.1-hd8ed1ab_0.conda" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.7.1-pyha770c72_0.conda" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/tzdata-2023c-h71feb2d_0.conda" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/linux-64/uncrustify-0.74.0-h27087fc_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-15.0.0-py310h5764c6d_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/linux-64/utfcpp-3.2.3-ha770c72_0.conda" - conda: "https://conda.anaconda.org/conda-forge/linux-64/vtk-9.2.2-qt_py310hc895abb_205.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/wslink-1.11.1-pyhd8ed1ab_0.conda" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/linux-64/x264-1!164.3095-h166bdaf_2.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/linux-64/x265-3.5-h924138e_3.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/linux-64/xcb-util-0.4.0-h516909a_0.tar.bz2" @@ -649,23 +600,18 @@ environments: - conda: "https://conda.anaconda.org/conda-forge/linux-64/yaml-cpp-0.7.0-h27087fc_2.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/linux-64/yarl-1.9.2-py310h2372a71_0.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/zipp-3.16.0-pyhd8ed1ab_0.conda" - subdir: linux-64 - conda: "https://conda.anaconda.org/conda-forge/linux-64/zlib-1.2.13-hd590300_5.conda" - conda: "https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.2-hfc55251_7.conda" - conda: "https://conda.anaconda.org/conda-forge/linux-64/zziplib-0.13.69-h27826a3_1.tar.bz2" osx-64: - conda: "https://conda.anaconda.org/conda-forge/osx-64/aiohttp-3.8.4-py310h6729b98_1.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.3.1-pyhd8ed1ab_0.tar.bz2" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/osx-64/aom-3.5.0-hf0c8a7f_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.1.1-pyhd8ed1ab_0.conda" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/osx-64/assimp-5.2.5-hd9e13b6_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/async-timeout-4.0.2-pyhd8ed1ab_0.tar.bz2" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/osx-64/atk-1.0-2.38.0-h1d18e73_1.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/attrs-23.1.0-pyh71513ae_1.conda" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/osx-64/boost-1.78.0-py310h3e792ce_4.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/osx-64/boost-cpp-1.78.0-h31500c2_2.conda" - conda: "https://conda.anaconda.org/conda-forge/osx-64/brotli-1.0.9-hb7f2c08_9.conda" @@ -677,50 +623,35 @@ environments: - conda: "https://conda.anaconda.org/conda-forge/osx-64/ca-certificates-2023.5.7-h8857fd0_0.conda" - conda: "https://conda.anaconda.org/conda-forge/osx-64/cairo-1.16.0-h904041c_1014.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/catkin_pkg-0.5.2-pyhd8ed1ab_0.tar.bz2" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/certifi-2023.5.7-pyhd8ed1ab_0.conda" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/osx-64/cffi-1.15.1-py310ha78151a_3.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.2.0-pyhd8ed1ab_0.conda" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/osx-64/cmake-3.26.3-h4032537_0.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/osx-64/console_bridge-1.0.2-hbb4e6a2_1.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/osx-64/contourpy-1.1.0-py310h88cfcbd_0.conda" - conda: "https://conda.anaconda.org/conda-forge/osx-64/cppcheck-2.10.3-py310h944fa21_0.conda" - conda: "https://conda.anaconda.org/conda-forge/osx-64/cryptography-41.0.1-py310ha1817de_0.conda" - conda: "https://conda.anaconda.org/conda-forge/osx-64/curl-7.88.1-h6df9250_1.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/cycler-0.11.0-pyhd8ed1ab_0.tar.bz2" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/distro-1.8.0-pyhd8ed1ab_0.conda" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/osx-64/docutils-0.20.1-py310h2ec42d9_0.conda" - conda: "https://conda.anaconda.org/conda-forge/osx-64/double-conversion-3.2.0-hf0c8a7f_1.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/osx-64/eigen-3.4.0-h940c156_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/empy-3.3.4-pyh9f0ad1d_1.tar.bz2" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.1.2-pyhd8ed1ab_0.conda" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/osx-64/expat-2.5.0-hf0c8a7f_1.conda" - conda: "https://conda.anaconda.org/conda-forge/osx-64/ffmpeg-5.1.2-gpl_h8b4fe81_106.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/flake8-6.0.0-pyhd8ed1ab_0.conda" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/osx-64/flann-1.9.1-h56de9e4_1011.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/osx-64/fmt-9.1.0-hb8565cd_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-hab24e00_0.tar.bz2" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/osx-64/fontconfig-2.14.2-h5bb23bf_0.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/osx-64/fonttools-4.40.0-py310h6729b98_0.conda" - conda: "https://conda.anaconda.org/conda-forge/osx-64/foonathan-memory-0.7.2-hf0c8a7f_1.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/osx-64/freeimage-3.18.0-haafd79f_10.tar.bz2" @@ -749,14 +680,10 @@ environments: - conda: "https://conda.anaconda.org/conda-forge/osx-64/hdf5-1.12.2-nompi_h48135f9_101.conda" - conda: "https://conda.anaconda.org/conda-forge/osx-64/icu-70.1-h96cf925_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/idna-3.4-pyhd8ed1ab_0.tar.bz2" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/osx-64/imath-3.1.6-hbc0c0cd_1.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-6.8.0-pyha770c72_0.conda" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.0.0-pyhd8ed1ab_0.conda" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/osx-64/jasper-2.0.33-h7c6fec8_1.conda" - conda: "https://conda.anaconda.org/conda-forge/osx-64/jpeg-9e-hb7f2c08_3.conda" - conda: "https://conda.anaconda.org/conda-forge/osx-64/jsoncpp-1.9.5-h940c156_1.tar.bz2" @@ -765,7 +692,6 @@ environments: - conda: "https://conda.anaconda.org/conda-forge/osx-64/krb5-1.20.1-h049b76e_0.conda" - conda: "https://conda.anaconda.org/conda-forge/osx-64/lame-3.100-hb7f2c08_1003.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/lark-parser-0.12.0-pyhd8ed1ab_0.tar.bz2" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/osx-64/lcms2-2.14-h90f4b2a_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/osx-64/lerc-4.0.0-hb486fe8_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/osx-64/libaec-1.0.6-hf0c8a7f_1.conda" @@ -827,10 +753,8 @@ environments: - conda: "https://conda.anaconda.org/conda-forge/osx-64/lz4-c-1.9.4-hf0c8a7f_0.conda" - conda: "https://conda.anaconda.org/conda-forge/osx-64/matplotlib-base-3.7.1-py310he725631_0.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/mccabe-0.7.0-pyhd8ed1ab_0.tar.bz2" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/osx-64/multidict-6.0.4-py310h90acd4f_0.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/osx-64/mysql-common-8.0.33-hc6116ba_1.conda" - conda: "https://conda.anaconda.org/conda-forge/osx-64/mysql-libs-8.0.33-haa61052_1.conda" - conda: "https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.4-hf0c8a7f_0.conda" @@ -847,20 +771,16 @@ environments: - conda: "https://conda.anaconda.org/conda-forge/osx-64/orocos-kdl-1.5.1-hf0c8a7f_4.conda" - conda: "https://conda.anaconda.org/conda-forge/osx-64/p11-kit-0.24.1-h65f8906_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/packaging-23.1-pyhd8ed1ab_0.conda" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/osx-64/pango-1.50.14-hbd9bf65_0.conda" - conda: "https://conda.anaconda.org/conda-forge/osx-64/pcl-1.12.1-h21768ba_4.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/osx-64/pcre-8.45-he49afe7_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/osx-64/pcre2-10.40-h1c4e4bc_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/pep517-0.13.0-pyhd8ed1ab_0.tar.bz2" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/osx-64/pillow-9.2.0-py310hffcf78b_3.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/osx-64/pixman-0.40.0-hbcb3906_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/osx-64/pkg-config-0.29.2-ha3d46e9_1008.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/pluggy-1.2.0-pyhd8ed1ab_0.conda" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/ply-3.11-py_1.tar.bz2" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/osx-64/proj-9.1.0-hcbd9701_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/osx-64/psutil-5.9.5-py310h90acd4f_0.conda" - conda: "https://conda.anaconda.org/conda-forge/osx-64/pthread-stubs-0.4-hc929b4f_1001.tar.bz2" @@ -868,32 +788,22 @@ environments: - conda: "https://conda.anaconda.org/conda-forge/osx-64/py-opencv-4.6.0-py310ha188af9_8.conda" - conda: "https://conda.anaconda.org/conda-forge/osx-64/pybind11-2.10.4-py310ha23aa8a_0.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/pybind11-abi-4-hd8ed1ab_3.tar.bz2" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/osx-64/pybind11-global-2.10.4-py310ha23aa8a_0.conda" - conda: "https://conda.anaconda.org/conda-forge/osx-64/pybullet-3.24-py310hcd8b382_0.conda" - conda: "https://conda.anaconda.org/conda-forge/osx-64/pycairo-1.24.0-py310h0b97775_0.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/pycodestyle-2.10.0-pyhd8ed1ab_0.conda" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/pycparser-2.21-pyhd8ed1ab_0.tar.bz2" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/pydocstyle-6.3.0-pyhd8ed1ab_0.conda" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/osx-64/pydot-1.4.2-py310h2ec42d9_3.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/pyflakes-3.0.1-pyhd8ed1ab_0.conda" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/pygments-2.15.1-pyhd8ed1ab_0.conda" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.0-pyhd8ed1ab_0.conda" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/osx-64/pyqt-5.15.7-py310hdd03f62_3.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/pyqt-builder-1.15.1-pyhd8ed1ab_0.conda" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/osx-64/pyqt5-sip-12.11.0-py310h415000c_3.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/pytest-7.4.0-pyhd8ed1ab_0.conda" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/osx-64/python-3.10.12-had23ca6_0_cpython.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.8.2-pyhd8ed1ab_0.tar.bz2" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/osx-64/python_abi-3.10-3_cp310.conda" - conda: "https://conda.anaconda.org/conda-forge/osx-64/pyyaml-6.0-py310h90acd4f_5.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/osx-64/qhull-2020.2-h940c156_2.tar.bz2" @@ -1187,14 +1097,11 @@ environments: - conda: "https://conda.anaconda.org/robostack-staging/osx-64/ros2-distro-mutex-0.3.0-humble.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/osx-64/rosdistro-0.9.0-py310h2ec42d9_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/rospkg-1.5.0-pyhd8ed1ab_0.conda" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/osx-64/sdl2-2.26.5-hf0c8a7f_0.conda" - conda: "https://conda.anaconda.org/conda-forge/osx-64/setuptools-61.0.0-py310h2ec42d9_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/osx-64/sip-6.7.9-py310h9e9d8ca_0.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/osx-64/spdlog-1.11.0-ha64ae7f_1.conda" - conda: "https://conda.anaconda.org/conda-forge/osx-64/sqlite-3.42.0-h2b0dec6_0.conda" - conda: "https://conda.anaconda.org/conda-forge/osx-64/svt-av1-1.4.1-hf0c8a7f_0.conda" @@ -1204,21 +1111,15 @@ environments: - conda: "https://conda.anaconda.org/conda-forge/osx-64/tinyxml2-9.0.0-he49afe7_2.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.12-h5dbffcc_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_0.tar.bz2" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.7.1-hd8ed1ab_0.conda" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.7.1-pyha770c72_0.conda" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/tzdata-2023c-h71feb2d_0.conda" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/osx-64/uncrustify-0.74.0-h96cf925_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/osx-64/unicodedata2-15.0.0-py310h90acd4f_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/osx-64/utfcpp-3.2.3-h694c41f_0.conda" - conda: "https://conda.anaconda.org/conda-forge/osx-64/vtk-9.2.2-qt_py310hea5b068_205.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/wslink-1.11.1-pyhd8ed1ab_0.conda" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/osx-64/x264-1!164.3095-h775f41a_2.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/osx-64/x265-3.5-hbb4e6a2_3.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/osx-64/xorg-kbproto-1.0.7-h35c211d_1002.tar.bz2" @@ -1243,23 +1144,18 @@ environments: - conda: "https://conda.anaconda.org/conda-forge/osx-64/yaml-cpp-0.7.0-hf0c8a7f_2.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/osx-64/yarl-1.9.2-py310h6729b98_0.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/zipp-3.16.0-pyhd8ed1ab_0.conda" - subdir: osx-64 - conda: "https://conda.anaconda.org/conda-forge/osx-64/zlib-1.2.13-h8a1eda9_5.conda" - conda: "https://conda.anaconda.org/conda-forge/osx-64/zstd-1.5.2-h829000d_7.conda" - conda: "https://conda.anaconda.org/conda-forge/osx-64/zziplib-0.13.69-h5dbffcc_1.tar.bz2" osx-arm64: - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/aiohttp-3.8.4-py310h2aa6e3c_1.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.3.1-pyhd8ed1ab_0.tar.bz2" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/aom-3.5.0-h7ea286d_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.1.1-pyhd8ed1ab_0.conda" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/assimp-5.2.5-h276577b_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/async-timeout-4.0.2-pyhd8ed1ab_0.tar.bz2" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/atk-1.0-2.38.0-hcb7b3dd_1.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/attrs-23.1.0-pyh71513ae_1.conda" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/boost-1.78.0-py310h629746b_4.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/boost-cpp-1.78.0-hf1d6563_2.conda" - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/brotli-1.0.9-h1a8c8d9_9.conda" @@ -1271,50 +1167,35 @@ environments: - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/ca-certificates-2023.5.7-hf0a4a13_0.conda" - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/cairo-1.16.0-h73a0509_1014.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/catkin_pkg-0.5.2-pyhd8ed1ab_0.tar.bz2" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/noarch/certifi-2023.5.7-pyhd8ed1ab_0.conda" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/cffi-1.15.1-py310h2399d43_3.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.2.0-pyhd8ed1ab_0.conda" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/cmake-3.26.3-hf234bd0_0.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/console_bridge-1.0.2-h3e96240_1.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/contourpy-1.1.0-py310h38f39d4_0.conda" - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/cppcheck-2.7.5-py310hf3ebaa5_1.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/cryptography-41.0.1-py310hdd3b5e7_0.conda" - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/curl-7.88.1-h9049daf_1.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/cycler-0.11.0-pyhd8ed1ab_0.tar.bz2" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/noarch/distro-1.8.0-pyhd8ed1ab_0.conda" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/docutils-0.20.1-py310hbe9552e_0.conda" - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/double-conversion-3.2.0-hb7217d7_1.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/eigen-3.4.0-hc021e02_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/empy-3.3.4-pyh9f0ad1d_1.tar.bz2" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.1.2-pyhd8ed1ab_0.conda" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/expat-2.5.0-hb7217d7_1.conda" - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/ffmpeg-5.1.2-gpl_hf318d42_106.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/flake8-6.0.0-pyhd8ed1ab_0.conda" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/flann-1.9.1-hd3e9afc_1011.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/fmt-9.1.0-hffc8910_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-hab24e00_0.tar.bz2" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/fontconfig-2.14.2-h82840c6_0.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/fonttools-4.40.0-py310h2aa6e3c_0.conda" - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/foonathan-memory-0.7.2-hb7217d7_1.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/freeimage-3.18.0-hb513136_10.tar.bz2" @@ -1343,14 +1224,10 @@ environments: - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/hdf5-1.12.2-nompi_ha7af310_101.conda" - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/icu-70.1-h6b3803e_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/idna-3.4-pyhd8ed1ab_0.tar.bz2" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/imath-3.1.6-hb5ab8b9_1.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-6.8.0-pyha770c72_0.conda" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.0.0-pyhd8ed1ab_0.conda" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/jasper-2.0.33-hc3cd1e9_1.conda" - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/jpeg-9e-h1a8c8d9_3.conda" - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/jsoncpp-1.9.5-hc021e02_1.tar.bz2" @@ -1359,7 +1236,6 @@ environments: - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.20.1-h69eda48_0.conda" - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/lame-3.100-h1a8c8d9_1003.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/lark-parser-0.12.0-pyhd8ed1ab_0.tar.bz2" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/lcms2-2.14-h8193b64_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/lerc-4.0.0-h9a09cb3_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/libaec-1.0.6-hb7217d7_1.conda" @@ -1422,10 +1298,8 @@ environments: - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/lz4-c-1.9.4-hb7217d7_0.conda" - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/matplotlib-base-3.7.2-py310h49faba3_0.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/mccabe-0.7.0-pyhd8ed1ab_0.tar.bz2" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/multidict-6.0.4-py310h8e9501a_0.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/mysql-common-8.0.33-h7b5afe1_1.conda" - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/mysql-libs-8.0.33-hb292caa_1.conda" - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.4-h7ea286d_0.conda" @@ -1442,20 +1316,16 @@ environments: - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/orocos-kdl-1.5.1-hb7217d7_4.conda" - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/p11-kit-0.24.1-h29577a5_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/packaging-23.1-pyhd8ed1ab_0.conda" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/pango-1.50.14-h6c112b8_0.conda" - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/pcl-1.12.1-h4d3e839_4.conda" - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/pcre-8.45-hbdafb3b_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/pcre2-10.40-hb34f9b4_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/pep517-0.13.0-pyhd8ed1ab_0.tar.bz2" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/pillow-9.2.0-py310h9337a76_3.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/pixman-0.40.0-h27ca646_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/pkg-config-0.29.2-hab62308_1008.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/pluggy-1.2.0-pyhd8ed1ab_0.conda" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/noarch/ply-3.11-py_1.tar.bz2" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/proj-9.1.0-h3bdf472_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/psutil-5.9.5-py310h8e9501a_0.conda" - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/pthread-stubs-0.4-h27ca646_1001.tar.bz2" @@ -1463,31 +1333,22 @@ environments: - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/py-opencv-4.6.0-py310h69fb684_8.conda" - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/pybind11-2.10.4-py310h2887b22_0.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/pybind11-abi-4-hd8ed1ab_3.tar.bz2" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/pybind11-global-2.10.4-py310h2887b22_0.conda" - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/pybullet-3.24-py310h2b830bf_0.conda" - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/pycairo-1.24.0-py310hb83b24a_0.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/pycodestyle-2.10.0-pyhd8ed1ab_0.conda" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/noarch/pycparser-2.21-pyhd8ed1ab_0.tar.bz2" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/noarch/pydocstyle-6.3.0-pyhd8ed1ab_0.conda" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/pydot-1.4.2-py310hbe9552e_3.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/pyflakes-3.0.1-pyhd8ed1ab_0.conda" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/noarch/pygments-2.11.2-pyhd8ed1ab_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.0.9-pyhd8ed1ab_0.tar.bz2" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/pyqt-5.15.7-py310h7aaa74b_3.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/pyqt-builder-1.15.1-pyhd8ed1ab_0.conda" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/pyqt5-sip-12.11.0-py310h0f1eb42_3.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/pytest-7.4.0-pyhd8ed1ab_0.conda" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/python-3.10.12-h01493a6_0_cpython.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.8.2-pyhd8ed1ab_0.tar.bz2" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/python_abi-3.10-3_cp310.conda" - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/pyyaml-6.0-py310h8e9501a_5.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/qhull-2020.2-hc021e02_2.tar.bz2" @@ -1781,14 +1642,11 @@ environments: - conda: "https://conda.anaconda.org/robostack-staging/osx-arm64/ros2-distro-mutex-0.3.0-humble.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/rosdistro-0.9.0-py310hbe9552e_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/rospkg-1.5.0-pyhd8ed1ab_0.conda" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/sdl2-2.26.5-hb7217d7_0.conda" - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/setuptools-61.0.0-py310hbe9552e_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/sip-6.7.9-py310h1253130_0.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/spdlog-1.11.0-h6981a3a_1.conda" - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/sqlite-3.42.0-h203b68d_0.conda" - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/svt-av1-1.4.1-h7ea286d_0.conda" @@ -1798,21 +1656,15 @@ environments: - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/tinyxml2-9.0.0-hbdafb3b_2.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.12-he1e0b03_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_0.tar.bz2" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.7.1-hd8ed1ab_0.conda" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.7.1-pyha770c72_0.conda" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/noarch/tzdata-2023c-h71feb2d_0.conda" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/uncrustify-0.74.0-h6b3803e_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/unicodedata2-15.0.0-py310h8e9501a_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/utfcpp-3.2.3-hce30654_0.conda" - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/vtk-9.2.2-qt_py310hc6e6bcd_205.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/wslink-1.11.1-pyhd8ed1ab_0.conda" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/x264-1!164.3095-h57fd34a_2.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/x265-3.5-hbc6ce65_3.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/xorg-kbproto-1.0.7-h27ca646_1002.tar.bz2" @@ -1837,22 +1689,17 @@ environments: - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/yaml-cpp-0.7.0-hb7217d7_2.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/yarl-1.9.2-py310h2aa6e3c_0.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/zipp-3.16.0-pyhd8ed1ab_0.conda" - subdir: osx-arm64 - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/zlib-1.2.13-h53f4e23_5.conda" - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.2-h4f39d0f_7.conda" - conda: "https://conda.anaconda.org/conda-forge/osx-arm64/zziplib-0.13.69-he1e0b03_1.tar.bz2" win-64: - conda: "https://conda.anaconda.org/conda-forge/win-64/aiohttp-3.8.4-py310h8d17308_1.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.3.1-pyhd8ed1ab_0.tar.bz2" - subdir: win-64 - conda: "https://conda.anaconda.org/conda-forge/win-64/aom-3.5.0-h63175ca_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.1.1-pyhd8ed1ab_0.conda" - subdir: win-64 - conda: "https://conda.anaconda.org/conda-forge/win-64/assimp-5.2.5-h4dcb625_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/async-timeout-4.0.2-pyhd8ed1ab_0.tar.bz2" - subdir: win-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/attrs-23.1.0-pyh71513ae_1.conda" - subdir: win-64 - conda: "https://conda.anaconda.org/conda-forge/win-64/boost-1.78.0-py310h220cb41_4.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/win-64/boost-cpp-1.78.0-h9f4b32c_3.conda" - conda: "https://conda.anaconda.org/conda-forge/win-64/brotli-1.0.9-hcfcfb64_9.conda" @@ -1863,51 +1710,36 @@ environments: - conda: "https://conda.anaconda.org/conda-forge/win-64/ca-certificates-2023.5.7-h56e8100_0.conda" - conda: "https://conda.anaconda.org/conda-forge/win-64/cairo-1.16.0-hd694305_1014.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/catkin_pkg-0.5.2-pyhd8ed1ab_0.tar.bz2" - subdir: win-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/certifi-2023.5.7-pyhd8ed1ab_0.conda" - subdir: win-64 - conda: "https://conda.anaconda.org/conda-forge/win-64/cffi-1.15.1-py310h628cb3f_3.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.2.0-pyhd8ed1ab_0.conda" - subdir: win-64 - conda: "https://conda.anaconda.org/conda-forge/win-64/cmake-3.26.4-h1537add_0.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2" - subdir: win-64 - conda: "https://conda.anaconda.org/conda-forge/win-64/console_bridge-1.0.2-h5362a0b_1.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/win-64/contourpy-1.1.0-py310h232114e_0.conda" - conda: "https://conda.anaconda.org/conda-forge/win-64/cppcheck-2.10.3-py310hbf4f5aa_0.conda" - conda: "https://conda.anaconda.org/conda-forge/win-64/cryptography-41.0.1-py310h6e82f81_0.conda" - conda: "https://conda.anaconda.org/conda-forge/win-64/curl-7.88.1-h68f0423_1.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/cycler-0.11.0-pyhd8ed1ab_0.tar.bz2" - subdir: win-64 - conda: "https://conda.anaconda.org/conda-forge/win-64/dav1d-1.2.0-hcfcfb64_0.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/distro-1.8.0-pyhd8ed1ab_0.conda" - subdir: win-64 - conda: "https://conda.anaconda.org/conda-forge/win-64/docutils-0.20.1-py310h5588dad_0.conda" - conda: "https://conda.anaconda.org/conda-forge/win-64/double-conversion-3.2.0-h63175ca_1.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/win-64/eigen-3.4.0-h2d74725_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/empy-3.3.4-pyh9f0ad1d_1.tar.bz2" - subdir: win-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.1.2-pyhd8ed1ab_0.conda" - subdir: win-64 - conda: "https://conda.anaconda.org/conda-forge/win-64/expat-2.5.0-h63175ca_1.conda" - conda: "https://conda.anaconda.org/conda-forge/win-64/ffmpeg-5.1.2-gpl_h5037a79_109.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/flake8-6.0.0-pyhd8ed1ab_0.conda" - subdir: win-64 - conda: "https://conda.anaconda.org/conda-forge/win-64/flann-1.9.1-h23a95e4_1011.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/win-64/fmt-9.1.0-h181d51b_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2" - subdir: win-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2" - subdir: win-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2" - subdir: win-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-hab24e00_0.tar.bz2" - subdir: win-64 - conda: "https://conda.anaconda.org/conda-forge/win-64/fontconfig-2.14.2-hbde0cde_0.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2" - subdir: win-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2" - subdir: win-64 - conda: "https://conda.anaconda.org/conda-forge/win-64/fonttools-4.40.0-py310h8d17308_0.conda" - conda: "https://conda.anaconda.org/conda-forge/win-64/foonathan-memory-0.7.2-h57928b3_1.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/win-64/freeglut-3.2.2-h63175ca_2.conda" @@ -1933,14 +1765,10 @@ environments: - conda: "https://conda.anaconda.org/conda-forge/win-64/hdf5-1.12.2-nompi_h57737ce_101.conda" - conda: "https://conda.anaconda.org/conda-forge/win-64/icu-70.1-h0e60522_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/idna-3.4-pyhd8ed1ab_0.tar.bz2" - subdir: win-64 - conda: "https://conda.anaconda.org/conda-forge/win-64/imath-3.1.6-h12be248_1.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-6.8.0-pyha770c72_0.conda" - subdir: win-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.0.0-pyhd8ed1ab_0.conda" - subdir: win-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda" - subdir: win-64 - conda: "https://conda.anaconda.org/conda-forge/win-64/intel-openmp-2023.1.0-h57928b3_46319.conda" - conda: "https://conda.anaconda.org/conda-forge/win-64/jasper-2.0.33-hc2e4405_1.conda" - conda: "https://conda.anaconda.org/conda-forge/win-64/jpeg-9e-hcfcfb64_3.conda" @@ -1949,7 +1777,6 @@ environments: - conda: "https://conda.anaconda.org/conda-forge/win-64/kiwisolver-1.4.4-py310h232114e_1.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/win-64/krb5-1.20.1-heb0366b_0.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/lark-parser-0.12.0-pyhd8ed1ab_0.tar.bz2" - subdir: win-64 - conda: "https://conda.anaconda.org/conda-forge/win-64/lcms2-2.14-h90d422f_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/win-64/lerc-4.0.0-h63175ca_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/win-64/libaec-1.0.6-h63175ca_1.conda" @@ -2001,12 +1828,10 @@ environments: - conda: "https://conda.anaconda.org/conda-forge/win-64/m2w64-libwinpthread-git-5.0.0.4634.697f757-2.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/win-64/matplotlib-base-3.7.2-py310h51140c5_0.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/mccabe-0.7.0-pyhd8ed1ab_0.tar.bz2" - subdir: win-64 - conda: "https://conda.anaconda.org/conda-forge/win-64/mkl-2022.1.0-h6a75c08_874.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/win-64/msys2-conda-epoch-20160418-1.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/win-64/multidict-6.0.4-py310h8d17308_0.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2" - subdir: win-64 - conda: "https://conda.anaconda.org/conda-forge/win-64/netifaces-0.11.0-py310h8d17308_1.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/win-64/nlohmann_json-3.11.2-h39d44d4_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/win-64/numpy-1.25.1-py310hd02465a_0.conda" @@ -2016,20 +1841,16 @@ environments: - conda: "https://conda.anaconda.org/conda-forge/win-64/openssl-3.1.1-hcfcfb64_1.conda" - conda: "https://conda.anaconda.org/conda-forge/win-64/orocos-kdl-1.5.1-h63175ca_4.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/packaging-23.1-pyhd8ed1ab_0.conda" - subdir: win-64 - conda: "https://conda.anaconda.org/conda-forge/win-64/pango-1.50.14-hdffb7b3_0.conda" - conda: "https://conda.anaconda.org/conda-forge/win-64/pcl-1.12.1-h266aab6_4.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/win-64/pcre-8.45-h0e60522_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/win-64/pcre2-10.40-h17e33f8_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/pep517-0.13.0-pyhd8ed1ab_0.tar.bz2" - subdir: win-64 - conda: "https://conda.anaconda.org/conda-forge/win-64/pillow-9.2.0-py310hd4fb230_3.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/win-64/pixman-0.40.0-h8ffe710_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/win-64/pkg-config-0.29.2-h2bf4dc2_1008.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/pluggy-1.2.0-pyhd8ed1ab_0.conda" - subdir: win-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/ply-3.11-py_1.tar.bz2" - subdir: win-64 - conda: "https://conda.anaconda.org/conda-forge/win-64/proj-9.1.0-h3863b3b_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/win-64/psutil-5.9.5-py310h8d17308_0.conda" - conda: "https://conda.anaconda.org/conda-forge/win-64/pthread-stubs-0.4-hcd874cb_1001.tar.bz2" @@ -2038,32 +1859,22 @@ environments: - conda: "https://conda.anaconda.org/conda-forge/win-64/py-opencv-4.6.0-py310hbbfc1a7_8.conda" - conda: "https://conda.anaconda.org/conda-forge/win-64/pybind11-2.10.4-py310h232114e_0.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/pybind11-abi-4-hd8ed1ab_3.tar.bz2" - subdir: win-64 - conda: "https://conda.anaconda.org/conda-forge/win-64/pybind11-global-2.10.4-py310h232114e_0.conda" - conda: "https://conda.anaconda.org/conda-forge/win-64/pybullet-3.24-py310h1c4a608_0.conda" - conda: "https://conda.anaconda.org/conda-forge/win-64/pycairo-1.24.0-py310h42c1a3e_0.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/pycodestyle-2.10.0-pyhd8ed1ab_0.conda" - subdir: win-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/pycparser-2.21-pyhd8ed1ab_0.tar.bz2" - subdir: win-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/pydocstyle-6.3.0-pyhd8ed1ab_0.conda" - subdir: win-64 - conda: "https://conda.anaconda.org/conda-forge/win-64/pydot-1.4.2-py310h5588dad_3.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/pyflakes-3.0.1-pyhd8ed1ab_0.conda" - subdir: win-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/pygments-2.15.1-pyhd8ed1ab_0.conda" - subdir: win-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.0.9-pyhd8ed1ab_0.tar.bz2" - subdir: win-64 - conda: "https://conda.anaconda.org/conda-forge/win-64/pyqt-5.15.7-py310h1fd54f2_3.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/pyqt-builder-1.15.1-pyhd8ed1ab_0.conda" - subdir: win-64 - conda: "https://conda.anaconda.org/conda-forge/win-64/pyqt5-sip-12.11.0-py310h00ffb61_3.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/pytest-7.4.0-pyhd8ed1ab_0.conda" - subdir: win-64 - conda: "https://conda.anaconda.org/conda-forge/win-64/python-3.10.12-h4de0772_0_cpython.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.8.2-pyhd8ed1ab_0.tar.bz2" - subdir: win-64 - conda: "https://conda.anaconda.org/conda-forge/win-64/python_abi-3.10-3_cp310.conda" - conda: "https://conda.anaconda.org/conda-forge/win-64/pyyaml-6.0-py310h8d17308_5.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/win-64/qhull-2020.2-h70d2c02_2.tar.bz2" @@ -2350,14 +2161,11 @@ environments: - conda: "https://conda.anaconda.org/robostack-staging/win-64/ros2-distro-mutex-0.3.0-humble.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/win-64/rosdistro-0.9.0-py310h5588dad_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/rospkg-1.5.0-pyhd8ed1ab_0.conda" - subdir: win-64 - conda: "https://conda.anaconda.org/conda-forge/win-64/sdl2-2.26.5-h63175ca_0.conda" - conda: "https://conda.anaconda.org/conda-forge/win-64/setuptools-61.0.0-py310h5588dad_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/win-64/sip-6.7.9-py310h00ffb61_0.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2" - subdir: win-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2" - subdir: win-64 - conda: "https://conda.anaconda.org/conda-forge/win-64/spdlog-1.11.0-hfbadfc6_1.conda" - conda: "https://conda.anaconda.org/conda-forge/win-64/sqlite-3.42.0-hcfcfb64_0.conda" - conda: "https://conda.anaconda.org/conda-forge/win-64/svt-av1-1.4.1-h63175ca_0.conda" @@ -2367,15 +2175,10 @@ environments: - conda: "https://conda.anaconda.org/conda-forge/win-64/tinyxml2-9.0.0-h0e60522_2.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/win-64/tk-8.6.12-h8ffe710_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_0.tar.bz2" - subdir: win-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2" - subdir: win-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.7.1-hd8ed1ab_0.conda" - subdir: win-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.7.1-pyha770c72_0.conda" - subdir: win-64 - conda: "https://conda.anaconda.org/conda-forge/noarch/tzdata-2023c-h71feb2d_0.conda" - subdir: win-64 - conda: "https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.22621.0-h57928b3_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/win-64/uncrustify-0.74.0-h57928b3_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/win-64/unicodedata2-15.0.0-py310h8d17308_0.tar.bz2" @@ -2386,7 +2189,6 @@ environments: - conda: "https://conda.anaconda.org/conda-forge/win-64/vtk-9.2.2-qt_py310h2fd250f_205.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/win32_setctime-1.1.0-pyhd8ed1ab_0.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/noarch/wslink-1.11.1-pyhd8ed1ab_0.conda" - subdir: win-64 - conda: "https://conda.anaconda.org/conda-forge/win-64/x264-1!164.3095-h8ffe710_2.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/win-64/x265-3.5-h2d74725_3.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/win-64/xorg-kbproto-1.0.7-hcd874cb_1002.tar.bz2" @@ -2405,7 +2207,6 @@ environments: - conda: "https://conda.anaconda.org/conda-forge/win-64/yaml-cpp-0.7.0-h63175ca_2.tar.bz2" - conda: "https://conda.anaconda.org/conda-forge/win-64/yarl-1.9.2-py310h8d17308_0.conda" - conda: "https://conda.anaconda.org/conda-forge/noarch/zipp-3.16.0-pyhd8ed1ab_0.conda" - subdir: win-64 - conda: "https://conda.anaconda.org/conda-forge/win-64/zlib-1.2.13-hcfcfb64_5.conda" - conda: "https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.2-h12be248_7.conda" - conda: "https://conda.anaconda.org/conda-forge/win-64/zziplib-0.13.69-h1d00b33_1.tar.bz2" diff --git a/crates/rattler_lock/src/snapshots/rattler_lock__test__v5__flat-index-lock.yml.snap b/crates/rattler_lock/src/snapshots/rattler_lock__test__v5__flat-index-lock.yml.snap index 0946547d4..31f914b92 100644 --- a/crates/rattler_lock/src/snapshots/rattler_lock__test__v5__flat-index-lock.yml.snap +++ b/crates/rattler_lock/src/snapshots/rattler_lock__test__v5__flat-index-lock.yml.snap @@ -2,7 +2,7 @@ source: crates/rattler_lock/src/lib.rs expression: conda_lock --- -version: 6 +version: 7 environments: default: channels: diff --git a/crates/rattler_lock/src/snapshots/rattler_lock__test__v5__similar-with-and-without-purl.yml.snap b/crates/rattler_lock/src/snapshots/rattler_lock__test__v5__similar-with-and-without-purl.yml.snap index 088a3d5f2..6b10f3185 100644 --- a/crates/rattler_lock/src/snapshots/rattler_lock__test__v5__similar-with-and-without-purl.yml.snap +++ b/crates/rattler_lock/src/snapshots/rattler_lock__test__v5__similar-with-and-without-purl.yml.snap @@ -2,7 +2,7 @@ source: crates/rattler_lock/src/lib.rs expression: conda_lock --- -version: 6 +version: 7 environments: default: channels: diff --git a/crates/rattler_lock/src/snapshots/rattler_lock__test__v6__conda-path-lock.yml.snap b/crates/rattler_lock/src/snapshots/rattler_lock__test__v6__conda-path-lock.yml.snap deleted file mode 100644 index 82ca3cb5e..000000000 --- a/crates/rattler_lock/src/snapshots/rattler_lock__test__v6__conda-path-lock.yml.snap +++ /dev/null @@ -1,61 +0,0 @@ ---- -source: crates/rattler_lock/src/lib.rs -expression: conda_lock ---- -version: 6 -environments: - default: - channels: - - url: "https://conda.anaconda.org/conda-forge/" - packages: - linux-64: - - conda: "../minimal-project" - subdir: linux-64 - win-64: - - conda: "../a-python-project" - name: a-python-project - - conda: "../a-python-project" - name: b-python-project - - conda: "../minimal-project" - build: first - subdir: win-64 - second: - channels: - - url: "https://conda.anaconda.org/conda-forge/" - packages: - win-64: - - conda: "../minimal-project" - build: second -packages: - - conda: "../a-python-project" - name: a-python-project - version: "0.1" - build: py38 - subdir: noarch - - conda: "../a-python-project" - name: b-python-project - version: "0.1" - build: h398123 - subdir: noarch - noarch: python - - conda: "../minimal-project" - name: minimal-project - version: "0.1" - build: first - subdir: linux-64 - depends: - - __unix - - conda: "../minimal-project" - name: minimal-project - version: "0.1" - build: first - subdir: win-64 - depends: - - __win - - conda: "../minimal-project" - name: minimal-project - version: "0.1" - build: second - subdir: win-64 - depends: - - __win diff --git a/crates/rattler_lock/src/snapshots/rattler_lock__test__v6__derived-channel-lock.yml.snap b/crates/rattler_lock/src/snapshots/rattler_lock__test__v6__derived-channel-lock.yml.snap index 0a17c6a38..174bde9d6 100644 --- a/crates/rattler_lock/src/snapshots/rattler_lock__test__v6__derived-channel-lock.yml.snap +++ b/crates/rattler_lock/src/snapshots/rattler_lock__test__v6__derived-channel-lock.yml.snap @@ -2,7 +2,7 @@ source: crates/rattler_lock/src/lib.rs expression: conda_lock --- -version: 6 +version: 7 environments: default: channels: @@ -15,8 +15,6 @@ packages: - conda: child-package name: child-package version: 0.1.0 - build: pyhbf21a9e_0 - subdir: noarch depends: - python input: diff --git a/crates/rattler_lock/src/snapshots/rattler_lock__test__v6__options-lock.yml.snap b/crates/rattler_lock/src/snapshots/rattler_lock__test__v6__options-lock.yml.snap index 0d937e2c1..6a4e75f9c 100644 --- a/crates/rattler_lock/src/snapshots/rattler_lock__test__v6__options-lock.yml.snap +++ b/crates/rattler_lock/src/snapshots/rattler_lock__test__v6__options-lock.yml.snap @@ -2,7 +2,7 @@ source: crates/rattler_lock/src/lib.rs expression: conda_lock --- -version: 6 +version: 7 environments: with-channel-priority: channels: [] diff --git a/crates/rattler_lock/src/snapshots/rattler_lock__test__v6__pixi-build-git-rev-only-source-lock.yml.snap b/crates/rattler_lock/src/snapshots/rattler_lock__test__v6__pixi-build-git-rev-only-source-lock.yml.snap index ef5d7e4b2..6c23cb19c 100644 --- a/crates/rattler_lock/src/snapshots/rattler_lock__test__v6__pixi-build-git-rev-only-source-lock.yml.snap +++ b/crates/rattler_lock/src/snapshots/rattler_lock__test__v6__pixi-build-git-rev-only-source-lock.yml.snap @@ -2,7 +2,7 @@ source: crates/rattler_lock/src/lib.rs expression: conda_lock --- -version: 6 +version: 7 environments: default: channels: @@ -14,8 +14,6 @@ packages: - conda: pixi-rev-package name: pixi-rev-package version: 0.5.0 - build: pyhbf21a9e_0 - subdir: noarch package_build_source: git: "https://github.com/example/pixi-package.git" rev: 123abc456def789012345678 diff --git a/crates/rattler_lock/src/snapshots/rattler_lock__test__v6__pixi-build-git-tag-source-lock.yml.snap b/crates/rattler_lock/src/snapshots/rattler_lock__test__v6__pixi-build-git-tag-source-lock.yml.snap index 7db877954..44433f37f 100644 --- a/crates/rattler_lock/src/snapshots/rattler_lock__test__v6__pixi-build-git-tag-source-lock.yml.snap +++ b/crates/rattler_lock/src/snapshots/rattler_lock__test__v6__pixi-build-git-tag-source-lock.yml.snap @@ -2,7 +2,7 @@ source: crates/rattler_lock/src/lib.rs expression: conda_lock --- -version: 6 +version: 7 environments: default: channels: @@ -14,8 +14,6 @@ packages: - conda: pixi-tag-package name: pixi-tag-package version: 1.2.0 - build: pyhbf21a9e_0 - subdir: noarch package_build_source: git: "https://github.com/example/pixi-package.git" tag: v1.2.0 diff --git a/crates/rattler_lock/src/snapshots/rattler_lock__test__v6__pixi-build-pinned-source-lock.yml.snap b/crates/rattler_lock/src/snapshots/rattler_lock__test__v6__pixi-build-pinned-source-lock.yml.snap index 1cfe4a13b..645530c99 100644 --- a/crates/rattler_lock/src/snapshots/rattler_lock__test__v6__pixi-build-pinned-source-lock.yml.snap +++ b/crates/rattler_lock/src/snapshots/rattler_lock__test__v6__pixi-build-pinned-source-lock.yml.snap @@ -2,7 +2,7 @@ source: crates/rattler_lock/src/lib.rs expression: conda_lock --- -version: 6 +version: 7 environments: default: channels: @@ -14,8 +14,6 @@ packages: - conda: pixi-build-package name: pixi-build-package version: 1.0.0 - build: pyhbf21a9e_0 - subdir: noarch package_build_source: git: "https://github.com/example/pixi-package.git" branch: main diff --git a/crates/rattler_lock/src/snapshots/rattler_lock__test__v6__pixi-build-url-source-lock.yml.snap b/crates/rattler_lock/src/snapshots/rattler_lock__test__v6__pixi-build-url-source-lock.yml.snap index 410856425..1048114d7 100644 --- a/crates/rattler_lock/src/snapshots/rattler_lock__test__v6__pixi-build-url-source-lock.yml.snap +++ b/crates/rattler_lock/src/snapshots/rattler_lock__test__v6__pixi-build-url-source-lock.yml.snap @@ -2,7 +2,7 @@ source: crates/rattler_lock/src/lib.rs expression: conda_lock --- -version: 6 +version: 7 environments: default: channels: @@ -14,8 +14,6 @@ packages: - conda: pixi-url-package name: pixi-url-package version: 2.0.0 - build: pyhbf21a9e_0 - subdir: noarch package_build_source: url: "https://example.com/package.tar.gz" sha256: 1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef diff --git a/crates/rattler_lock/src/snapshots/rattler_lock__test__v6__sources-lock.yml.snap b/crates/rattler_lock/src/snapshots/rattler_lock__test__v6__sources-lock.yml.snap index b6c6be118..70c73c893 100644 --- a/crates/rattler_lock/src/snapshots/rattler_lock__test__v6__sources-lock.yml.snap +++ b/crates/rattler_lock/src/snapshots/rattler_lock__test__v6__sources-lock.yml.snap @@ -2,7 +2,7 @@ source: crates/rattler_lock/src/lib.rs expression: conda_lock --- -version: 6 +version: 7 environments: default: channels: @@ -14,8 +14,6 @@ packages: - conda: child-package name: child-package version: 0.1.0 - build: pyhbf21a9e_0 - subdir: noarch depends: - path - git_tag diff --git a/crates/rattler_lock/src/snapshots/rattler_lock__test__v7__complex_multi_environment.lock.yml.snap b/crates/rattler_lock/src/snapshots/rattler_lock__test__v7__complex_multi_environment.lock.yml.snap new file mode 100644 index 000000000..42167e6a4 --- /dev/null +++ b/crates/rattler_lock/src/snapshots/rattler_lock__test__v7__complex_multi_environment.lock.yml.snap @@ -0,0 +1,88 @@ +--- +source: crates/rattler_lock/src/lib.rs +expression: conda_lock +--- +version: 7 +environments: + default: + channels: + - url: "https://conda.anaconda.org/conda-forge/" + packages: + linux-64: + - conda: "https://conda.anaconda.org/conda-forge/linux-64/python-3.12.0-h2628c8c_0_cpython.conda" + - conda: my-monorepo + name: core-library + variants: + python_version: "3.12" + - conda: my-monorepo + name: utils-library + win-64: + - conda: "https://conda.anaconda.org/conda-forge/win-64/python-3.12.0-h2628c8c_0_cpython.conda" + - conda: my-monorepo + name: core-library + variants: + python_version: "3.12" + - conda: my-monorepo + name: utils-library + test: + channels: + - url: "https://conda.anaconda.org/conda-forge/" + packages: + linux-64: + - conda: "https://conda.anaconda.org/conda-forge/linux-64/pytest-7.4.3-pyhd8ed1ab_0.conda" + - conda: my-monorepo + name: core-library + variants: + python_version: "3.11" +packages: + - conda: my-monorepo + name: core-library + depends: + - python =3.11 + license: MIT + package_build_source: + url: "https://github.com/user/my-monorepo/archive/refs/tags/v1.0.0.tar.gz" + sha256: cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc + variants: + python_version: "3.11" + - conda: my-monorepo + name: core-library + depends: + - python =3.12 + license: MIT + package_build_source: + url: "https://github.com/user/my-monorepo/archive/refs/tags/v1.0.0.tar.gz" + sha256: cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc + variants: + python_version: "3.12" + - conda: "https://conda.anaconda.org/conda-forge/linux-64/pytest-7.4.3-pyhd8ed1ab_0.conda" + sha256: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + md5: bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb + depends: + - python >=3.8 + license: MIT + size: 1000000 + timestamp: 1696321871976 + - conda: "https://conda.anaconda.org/conda-forge/linux-64/python-3.12.0-h2628c8c_0_cpython.conda" + sha256: 90553586879bf328f2f9efb8d8faa958ecba822faf379f0a20c3461467b9b955 + md5: defd5d375853a2caff36a19d2d81a28e + license: Python-2.0 + size: 16140836 + timestamp: 1696321871976 + - conda: "https://conda.anaconda.org/conda-forge/win-64/python-3.12.0-h2628c8c_0_cpython.conda" + sha256: 90553586879bf328f2f9efb8d8faa958ecba822faf379f0a20c3461467b9b955 + md5: defd5d375853a2caff36a19d2d81a28e + license: Python-2.0 + size: 16140836 + timestamp: 1696321871976 + - conda: my-monorepo + name: utils-library + depends: + - python =3.12 + - core-library + license: MIT + package_build_source: + url: "https://github.com/user/my-monorepo/archive/refs/tags/v1.0.0.tar.gz" + sha256: cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc + variants: + python_version: "3.12" diff --git a/crates/rattler_lock/src/snapshots/rattler_lock__test__v7__multiple_source_package_different_name.lock.yml.snap b/crates/rattler_lock/src/snapshots/rattler_lock__test__v7__multiple_source_package_different_name.lock.yml.snap new file mode 100644 index 000000000..7009f7967 --- /dev/null +++ b/crates/rattler_lock/src/snapshots/rattler_lock__test__v7__multiple_source_package_different_name.lock.yml.snap @@ -0,0 +1,26 @@ +--- +source: crates/rattler_lock/src/lib.rs +expression: conda_lock +--- +version: 7 +environments: + default: + channels: + - url: "https://conda.anaconda.org/conda-forge/" + packages: + linux-64: + - conda: my-package + name: my-package + - conda: my-package + name: my-package-dev +packages: + - conda: my-package + name: my-package + depends: + - python >=3.8 + license: MIT + - conda: my-package + name: my-package-dev + depends: + - python >=3.8 + license: MIT diff --git a/crates/rattler_lock/src/snapshots/rattler_lock__test__v7__multiple_source_package_different_variants.lock.yml.snap b/crates/rattler_lock/src/snapshots/rattler_lock__test__v7__multiple_source_package_different_variants.lock.yml.snap new file mode 100644 index 000000000..61dcd9230 --- /dev/null +++ b/crates/rattler_lock/src/snapshots/rattler_lock__test__v7__multiple_source_package_different_variants.lock.yml.snap @@ -0,0 +1,33 @@ +--- +source: crates/rattler_lock/src/lib.rs +expression: conda_lock +--- +version: 7 +environments: + default: + channels: + - url: "https://conda.anaconda.org/conda-forge/" + packages: + linux-64: + - conda: my-package + variants: + target_platform: linux-64 + win-64: + - conda: my-package + variants: + target_platform: win-64 +packages: + - conda: my-package + name: my-package + depends: + - python >=3.8 + license: MIT + variants: + target_platform: linux-64 + - conda: my-package + name: my-package + depends: + - python >=3.8 + license: MIT + variants: + target_platform: win-64 diff --git a/crates/rattler_lock/src/snapshots/rattler_lock__test__v7__single_binary_package.lock.yml.snap b/crates/rattler_lock/src/snapshots/rattler_lock__test__v7__single_binary_package.lock.yml.snap new file mode 100644 index 000000000..f0ca86072 --- /dev/null +++ b/crates/rattler_lock/src/snapshots/rattler_lock__test__v7__single_binary_package.lock.yml.snap @@ -0,0 +1,19 @@ +--- +source: crates/rattler_lock/src/lib.rs +expression: conda_lock +--- +version: 7 +environments: + default: + channels: + - url: "https://prefix.dev/conda-forge/" + packages: + linux-64: + - conda: "https://conda.anaconda.org/conda-forge/linux-64/python-3.12.0-h2628c8c_0_cpython.conda" +packages: + - conda: "https://conda.anaconda.org/conda-forge/linux-64/python-3.12.0-h2628c8c_0_cpython.conda" + sha256: 90553586879bf328f2f9efb8d8faa958ecba822faf379f0a20c3461467b9b955 + md5: defd5d375853a2caff36a19d2d81a28e + license: Python-2.0 + size: 16140836 + timestamp: 1696321871976 diff --git a/crates/rattler_lock/src/snapshots/rattler_lock__test__v7__single_source_package.lock.yml.snap b/crates/rattler_lock/src/snapshots/rattler_lock__test__v7__single_source_package.lock.yml.snap new file mode 100644 index 000000000..15572fa04 --- /dev/null +++ b/crates/rattler_lock/src/snapshots/rattler_lock__test__v7__single_source_package.lock.yml.snap @@ -0,0 +1,18 @@ +--- +source: crates/rattler_lock/src/lib.rs +expression: conda_lock +--- +version: 7 +environments: + default: + channels: + - url: "https://conda.anaconda.org/conda-forge/" + packages: + linux-64: + - conda: my-package +packages: + - conda: my-package + name: my-package + depends: + - python >=3.8 + license: MIT diff --git a/py-rattler/Cargo.lock b/py-rattler/Cargo.lock index 90db83c7d..2b24adac1 100644 --- a/py-rattler/Cargo.lock +++ b/py-rattler/Cargo.lock @@ -3162,7 +3162,7 @@ checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" [[package]] name = "path_resolver" -version = "0.2.1" +version = "0.2.2" dependencies = [ "ahash", "fs-err", @@ -3415,7 +3415,7 @@ dependencies = [ [[package]] name = "py-rattler" -version = "0.16.0" +version = "0.17.0" dependencies = [ "anyhow", "chrono", @@ -3720,7 +3720,7 @@ dependencies = [ [[package]] name = "rattler" -version = "0.38.3" +version = "0.38.4" dependencies = [ "anyhow", "console", @@ -3762,7 +3762,7 @@ dependencies = [ [[package]] name = "rattler_cache" -version = "0.4.0" +version = "0.4.1" dependencies = [ "ahash", "anyhow", @@ -3793,7 +3793,7 @@ dependencies = [ [[package]] name = "rattler_conda_types" -version = "0.40.3" +version = "0.40.4" dependencies = [ "ahash", "chrono", @@ -3832,7 +3832,7 @@ dependencies = [ [[package]] name = "rattler_config" -version = "0.2.14" +version = "0.2.15" dependencies = [ "console", "fs-err", @@ -3865,7 +3865,7 @@ dependencies = [ [[package]] name = "rattler_index" -version = "0.26.5" +version = "0.27.0" dependencies = [ "ahash", "anyhow", @@ -3901,7 +3901,7 @@ dependencies = [ [[package]] name = "rattler_lock" -version = "0.26.0" +version = "0.26.1" dependencies = [ "ahash", "chrono", @@ -3933,7 +3933,7 @@ dependencies = [ [[package]] name = "rattler_menuinst" -version = "0.2.33" +version = "0.2.34" dependencies = [ "chrono", "configparser", @@ -3961,7 +3961,7 @@ dependencies = [ [[package]] name = "rattler_networking" -version = "0.25.20" +version = "0.25.21" dependencies = [ "anyhow", "async-once-cell", @@ -3991,7 +3991,7 @@ dependencies = [ [[package]] name = "rattler_package_streaming" -version = "0.23.12" +version = "0.23.13" dependencies = [ "bzip2", "chrono", @@ -4038,7 +4038,7 @@ dependencies = [ [[package]] name = "rattler_repodata_gateway" -version = "0.24.13" +version = "0.24.14" dependencies = [ "anyhow", "async-compression", @@ -4097,7 +4097,7 @@ dependencies = [ [[package]] name = "rattler_s3" -version = "0.1.9" +version = "0.1.10" dependencies = [ "aws-config", "aws-credential-types", @@ -4113,7 +4113,7 @@ dependencies = [ [[package]] name = "rattler_shell" -version = "0.25.6" +version = "0.25.7" dependencies = [ "anyhow", "enum_dispatch", @@ -4131,7 +4131,7 @@ dependencies = [ [[package]] name = "rattler_solve" -version = "3.0.8" +version = "3.0.9" dependencies = [ "chrono", "futures", @@ -4147,7 +4147,7 @@ dependencies = [ [[package]] name = "rattler_virtual_packages" -version = "2.2.4" +version = "2.2.5" dependencies = [ "archspec", "libloading", diff --git a/py-rattler/Cargo.toml b/py-rattler/Cargo.toml index 1eed6a81d..1ea1b6d81 100644 --- a/py-rattler/Cargo.toml +++ b/py-rattler/Cargo.toml @@ -1,87 +1,82 @@ [package] name = "py-rattler" -version = "0.16.0" +version = "0.17.0" edition = "2021" license = "BSD-3-Clause" publish = false +# Prevent package from thinking it's in the workspace +[workspace] + [lib] -name = "rattler" crate-type = ["cdylib"] - -[features] -default = ["rustls-tls"] -native-tls = [ - "rattler_networking/native-tls", - "rattler_repodata_gateway/native-tls", -] -rustls-tls = [ - "rattler_networking/rustls-tls", - "rattler_repodata_gateway/rustls-tls", - "reqwest/rustls-tls-native-roots", -] -vendored-openssl = ["openssl", "openssl/vendored"] -pty = ["rattler_pty", "nix"] +name = "rattler" [dependencies] anyhow = "1.0.97" chrono = { version = "0.4" } futures = "0.3.31" +nix = { version = "0.30.1", features = ["process"], optional = true } +openssl = { version = "0.10", optional = true } parking_lot = { version = "0.12.3", features = ["arc_lock", "send_guard"] } - -rattler_s3 = { path = "../crates/rattler_s3", features = ["serde"]} -rattler = { path = "../crates/rattler", default-features = false, features = [ - "indicatif", +pep508_rs = "0.9.2" +pyo3 = { version = "0.25.1", features = [ + "abi3-py38", + "chrono", + "extension-module", + "multiple-pymethods", ] } -rattler_repodata_gateway = { path = "../crates/rattler_repodata_gateway", default-features = false, features = [ - "sparse", - "gateway", - "indicatif", +pyo3-async-runtimes = { version = "0.25.0", features = ["tokio-runtime"] } +pyo3-file = "0.13.0" +pythonize = "0.25.0" +rattler = { path = "../crates/rattler", default-features = false, features = [ + "indicatif", ] } rattler_conda_types = { path = "../crates/rattler_conda_types", default-features = false } rattler_config = { path = "../crates/rattler_config", default-features = false } rattler_digest = { path = "../crates/rattler_digest" } +rattler_index = { path = "../crates/rattler_index" } +rattler_lock = { path = "../crates/rattler_lock", default-features = false } rattler_networking = { path = "../crates/rattler_networking", default-features = false, features = [ - "gcs", - "s3", - "system-integration" + "gcs", + "s3", + "system-integration" ] } -rattler_shell = { path = "../crates/rattler_shell", default-features = false } +rattler_package_streaming = { path = "../crates/rattler_package_streaming", default-features = false } rattler_pty = { path = "../crates/rattler_pty", default-features = false, optional = true } -rattler_virtual_packages = { path = "../crates/rattler_virtual_packages", default-features = false } -rattler_solve = { path = "../crates/rattler_solve", default-features = false, features = [ - "resolvo", +rattler_repodata_gateway = { path = "../crates/rattler_repodata_gateway", default-features = false, features = [ + "gateway", + "indicatif", + "sparse", ] } -rattler_index = { path = "../crates/rattler_index" } -rattler_lock = { path = "../crates/rattler_lock", default-features = false } -rattler_package_streaming = { path = "../crates/rattler_package_streaming", default-features = false } -pyo3 = { version = "0.25.1", features = [ - "abi3-py38", - "extension-module", - "multiple-pymethods", - "chrono", +rattler_s3 = { path = "../crates/rattler_s3", features = ["serde"] } +rattler_shell = { path = "../crates/rattler_shell", default-features = false } +rattler_solve = { path = "../crates/rattler_solve", default-features = false, features = [ + "resolvo", ] } -pyo3-async-runtimes = { version = "0.25.0", features = ["tokio-runtime"] } -pythonize = "0.25.0" -tokio = { version = "1.46.1" } - +rattler_virtual_packages = { path = "../crates/rattler_virtual_packages", default-features = false } reqwest = { version = "0.12.15", default-features = false } reqwest-middleware = "0.4.2" - +serde_json = "1.0.140" thiserror = "2.0.12" +tokio = { version = "1.46.1" } url = "2.5.4" -openssl = { version = "0.10", optional = true } -pep508_rs = "0.9.2" -serde_json = "1.0.140" -pyo3-file = "0.13.0" -nix = { version = "0.30.1", features = ["process"], optional = true } - [build-dependencies] pyo3-build-config = "0.25.1" +[features] +default = ["rustls-tls"] +native-tls = [ + "rattler_networking/native-tls", + "rattler_repodata_gateway/native-tls", +] +pty = ["nix", "rattler_pty"] +rustls-tls = [ + "rattler_networking/rustls-tls", + "rattler_repodata_gateway/rustls-tls", + "reqwest/rustls-tls-native-roots", +] +vendored-openssl = ["openssl", "openssl/vendored"] [patch.crates-io] - -# Prevent package from thinking it's in the workspace -[workspace] diff --git a/py-rattler/src/lock/mod.rs b/py-rattler/src/lock/mod.rs index 1c8a423ee..55921b005 100644 --- a/py-rattler/src/lock/mod.rs +++ b/py-rattler/src/lock/mod.rs @@ -73,9 +73,8 @@ impl PyLockFile { /// Parses an rattler-lock file from a file. #[staticmethod] pub fn from_path(path: PathBuf) -> PyResult { - Ok(LockFile::from_path(&path) - .map(Into::into) - .map_err(PyRattlerError::from)?) + let lock_file = LockFile::from_path(&path).map_err(PyRattlerError::from)?; + Ok(lock_file.into()) } /// Returns the environment with the given name. @@ -354,14 +353,19 @@ impl PyLockedPackage { } #[getter] - pub fn package_record(&self) -> PyRecord { - self.as_conda().record().clone().into() + pub fn package_record(&self) -> Option { + match self.as_conda() { + CondaPackageData::Binary(conda_binary_data) => { + Some(conda_binary_data.package_record.clone().into()) + } + CondaPackageData::Source(_) => None, + } } #[getter] pub fn name(&self) -> String { match &self.inner { - LockedPackage::Conda(data) => data.record().name.as_source().to_string(), + LockedPackage::Conda(data) => data.name().as_source().to_string(), LockedPackage::Pypi(data, _) => data.name.to_string(), } } @@ -375,8 +379,10 @@ impl PyLockedPackage { } #[getter] - pub fn conda_version(&self) -> PyVersion { - self.as_conda().record().version.version().clone().into() + pub fn conda_version(&self) -> Option { + self.as_conda() + .version() + .map(|version_with_source| version_with_source.version().clone().into()) } #[getter] @@ -394,15 +400,15 @@ impl PyLockedPackage { #[getter] pub fn hashes(&self) -> Option { let hash = match &self.inner { - LockedPackage::Conda(pkg) => { - let record = pkg.record(); + LockedPackage::Conda(pkg) => pkg.as_binary().and_then(|binary| { + let record = &binary.package_record; match (record.md5, record.sha256) { (Some(md5), Some(sha256)) => Some(PackageHashes::Md5Sha256(md5, sha256)), (Some(md5), None) => Some(PackageHashes::Md5(md5)), (None, Some(sha256)) => Some(PackageHashes::Sha256(sha256)), (None, None) => None, } - } + }), LockedPackage::Pypi(data, _) => data.hash.clone(), }; hash.map(Into::into) diff --git a/test-data/conda-lock/v7/binary_with_derived_subdir.lock.yml b/test-data/conda-lock/v7/binary_with_derived_subdir.lock.yml new file mode 100644 index 000000000..13ddf99f5 --- /dev/null +++ b/test-data/conda-lock/v7/binary_with_derived_subdir.lock.yml @@ -0,0 +1,51 @@ +# Binary packages with derived subdir +# +# This test case verifies that the V7 format correctly handles binary packages +# where the 'subdir' field is OMITTED from the lock file but can be DERIVED +# from the package URL. +# +# Key points: +# - Package URLs like "...linux-64/python-3.12.tar.bz2" contain the subdir "linux-64" +# - The V7 format omits redundant fields when they can be derived +# - Deserialization must re-derive these fields from URLs during parsing +# - This tests the LocationDerivedFields logic in action + +version: 7 +environments: + default: + channels: + - url: https://conda.anaconda.org/conda-forge/ + packages: + linux-64: + # Note: no 'subdir' field specified in selector + # It will be derived from the URL path: "...linux-64/..." + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.0-h2628c8c_0_cpython.conda + win-64: + # Same package but for Windows + # Subdir will be derived from: "...win-64/..." + - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.12.0-h2628c8c_0_cpython.conda + +packages: + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.0-h2628c8c_0_cpython.conda + name: python + version: 3.12.0 + build: h2628c8c_0_cpython + build_number: 0 + subdir: linux-64 + sha256: 90553586879bf328f2f9efb8d8faa958ecba822faf379f0a20c3461467b9b955 + md5: defd5d375853a2caff36a19d2d81a28e + license: Python-2.0 + size: 16140836 + timestamp: 1696321871976 + + - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.12.0-h2628c8c_0_cpython.conda + name: python + version: 3.12.0 + build: h2628c8c_0_cpython + build_number: 0 + subdir: win-64 + sha256: 90553586879bf328f2f9efb8d8faa958ecba822faf379f0a20c3461467b9b955 + md5: defd5d375853a2caff36a19d2d81a28e + license: Python-2.0 + size: 16140836 + timestamp: 1696321871976 diff --git a/test-data/conda-lock/v7/complex_multi_environment.lock.yml b/test-data/conda-lock/v7/complex_multi_environment.lock.yml new file mode 100644 index 000000000..83923841a --- /dev/null +++ b/test-data/conda-lock/v7/complex_multi_environment.lock.yml @@ -0,0 +1,134 @@ +# Complex Multi-Environment with Edge Cases +# +# This test combines multiple disambiguation scenarios: +# - Two environments (linux-64 and win-64) +# - Mix of binary and source packages +# - Multiple packages at the same location +# - Disambiguation by both name and variants +# - Tests the full serialization/deserialization round-trip + +version: 7 +environments: + default: + channels: + - url: https://conda.anaconda.org/conda-forge/ + packages: + linux-64: + # Binary package - unique by location + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.0-h2628c8c_0_cpython.conda + # Source package with variant-based disambiguation + - conda: my-monorepo + name: core-library + variants: + python_version: "3.12" + - conda: my-monorepo + name: utils-library + variants: + python_version: "3.12" + win-64: + # Binary package - different platform + - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.12.0-h2628c8c_0_cpython.conda + # Same source packages but for windows + - conda: my-monorepo + name: core-library + variants: + python_version: "3.12" + - conda: my-monorepo + name: utils-library + variants: + python_version: "3.12" + + test: + channels: + - url: https://conda.anaconda.org/conda-forge/ + packages: + linux-64: + # Binary package - same as default but in different environment + - conda: https://conda.anaconda.org/conda-forge/linux-64/pytest-7.4.3-pyhd8ed1ab_0.conda + # Source package with different variant + - conda: my-monorepo + name: core-library + variants: + python_version: "3.11" + +packages: + # Binary packages + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.0-h2628c8c_0_cpython.conda + name: python + version: 3.12.0 + build: h2628c8c_0_cpython + build_number: 0 + subdir: linux-64 + sha256: 90553586879bf328f2f9efb8d8faa958ecba822faf379f0a20c3461467b9b955 + md5: defd5d375853a2caff36a19d2d81a28e + license: Python-2.0 + size: 16140836 + timestamp: 1696321871976 + + - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.12.0-h2628c8c_0_cpython.conda + name: python + version: 3.12.0 + build: h2628c8c_0_cpython + build_number: 0 + subdir: win-64 + sha256: 90553586879bf328f2f9efb8d8faa958ecba822faf379f0a20c3461467b9b955 + md5: defd5d375853a2caff36a19d2d81a28e + license: Python-2.0 + size: 16140836 + timestamp: 1696321871976 + + - conda: https://conda.anaconda.org/conda-forge/linux-64/pytest-7.4.3-pyhd8ed1ab_0.conda + name: pytest + version: 7.4.3 + build: pyhd8ed1ab_0 + build_number: 0 + subdir: linux-64 + sha256: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + md5: bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb + depends: + - python >=3.8 + license: MIT + size: 1000000 + timestamp: 1696321871976 + + # Source packages - same location, different names (monorepo pattern) + - conda: my-monorepo + name: core-library + variants: + python_version: "3.12" + package_build_source: + url: https://github.com/user/my-monorepo/archive/refs/tags/v1.0.0.tar.gz + sha256: cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc + depends: + - python =3.12 + license: MIT + size: 5000000 + timestamp: 1696321871976 + + - conda: my-monorepo + name: utils-library + variants: + python_version: "3.12" + package_build_source: + url: https://github.com/user/my-monorepo/archive/refs/tags/v1.0.0.tar.gz + sha256: cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc + depends: + - python =3.12 + - core-library + license: MIT + size: 5000000 + timestamp: 1696321871976 + + # Same source packages but with different variant + - conda: my-monorepo + name: core-library + variants: + python_version: "3.11" + package_build_source: + url: https://github.com/user/my-monorepo/archive/refs/tags/v1.0.0.tar.gz + sha256: cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc + depends: + - python =3.11 + license: MIT + size: 5000000 + timestamp: 1696321871976 diff --git a/test-data/conda-lock/v7/dev_and_non_dev_source.lock.yml b/test-data/conda-lock/v7/dev_and_non_dev_source.lock.yml new file mode 100644 index 000000000..566cd192e --- /dev/null +++ b/test-data/conda-lock/v7/dev_and_non_dev_source.lock.yml @@ -0,0 +1,39 @@ +# Dev and Non-Dev Variants of Same Package +# +# Tests that both dev and non-dev variants of the same source package +# can coexist in the lock file. The dev field is part of the uniqueness +# identifier for source packages. +# +# This demonstrates that package names are no longer unique when dev field differs. + +version: 7 +environments: + default: + channels: + - url: https://conda.anaconda.org/conda-forge/ + packages: + linux-64: + # Regular (non-dev) version of the package + - conda: my-package + # Dev version of the same package - only adds dependencies + - conda: my-package + dev: true + +packages: + # Non-dev source package (regular installation) + - conda: my-package + name: my-package + variants: {} + depends: + - python >=3.8 + license: MIT + + # Dev source package (only contributes dependencies, not installed) + - conda: my-package + name: my-package + dev: true + variants: {} + depends: + - python >=3.8 + - pytest # Dev packages often add test dependencies + license: MIT diff --git a/test-data/conda-lock/v7/dev_source_package.lock.yml b/test-data/conda-lock/v7/dev_source_package.lock.yml new file mode 100644 index 000000000..f5e599aa8 --- /dev/null +++ b/test-data/conda-lock/v7/dev_source_package.lock.yml @@ -0,0 +1,28 @@ +# Single Dev Source Package +# +# Tests serialization of a single source package marked as dev. +# Dev packages only contribute their dependencies and are not installed. +# +# This represents the basic case for dev packages. + +version: 7 +environments: + default: + channels: + - url: https://conda.anaconda.org/conda-forge/ + packages: + linux-64: + # Dev source package - only adds dependencies, not installed + - conda: my-dev-package + dev: true + +packages: + # Source package marked as dev + - conda: my-dev-package + name: my-dev-package + dev: true + variants: {} + depends: + - python >=3.8 + - numpy >=1.20 + license: MIT diff --git a/test-data/conda-lock/v7/multiple_source_package_different_name.lock.yml b/test-data/conda-lock/v7/multiple_source_package_different_name.lock.yml new file mode 100644 index 000000000..5f418724f --- /dev/null +++ b/test-data/conda-lock/v7/multiple_source_package_different_name.lock.yml @@ -0,0 +1,29 @@ +# Multiple source package only by name +# +# Packages need to be disambiguated by name since they share the same source location. + +version: 7 +environments: + default: + channels: + - url: https://conda.anaconda.org/conda-forge/ + packages: + linux-64: + - conda: my-package + name: my-package + - conda: my-package + name: my-package-dev + +packages: + - conda: my-package + name: my-package + variants: {} + depends: + - python >=3.8 + license: MIT + - conda: my-package + name: my-package-dev + variants: {} + depends: + - python >=3.8 + license: MIT diff --git a/test-data/conda-lock/v7/multiple_source_package_different_variants.lock.yml b/test-data/conda-lock/v7/multiple_source_package_different_variants.lock.yml new file mode 100644 index 000000000..97e120eea --- /dev/null +++ b/test-data/conda-lock/v7/multiple_source_package_different_variants.lock.yml @@ -0,0 +1,34 @@ +# Multiple source package with different variants +# +# Packages need to be disambiguated by name since they share the same source location and name. + +version: 7 +environments: + default: + channels: + - url: https://conda.anaconda.org/conda-forge/ + packages: + linux-64: + - conda: my-package + variants: + target_platform: linux-64 + win-64: + - conda: my-package + variants: + target_platform: win-64 + +packages: + - conda: my-package + name: my-package + variants: + target_platform: linux-64 + depends: + - python >=3.8 + license: MIT + - conda: my-package + name: my-package + variants: + target_platform: win-64 + depends: + - python >=3.8 + license: MIT diff --git a/test-data/conda-lock/v7/single_binary_package.lock.yml b/test-data/conda-lock/v7/single_binary_package.lock.yml new file mode 100644 index 000000000..82d575a1e --- /dev/null +++ b/test-data/conda-lock/v7/single_binary_package.lock.yml @@ -0,0 +1,30 @@ +# Single Binary Package (No Disambiguation Needed) +# +# Tests serialization of a single binary package where no disambiguation is needed. +# +# This represents the "happy path" for binary packages. + +version: 7 +environments: + default: + channels: + - url: https://prefix.dev/conda-forge/ + packages: + linux-64: + # This package uniquely identifies itself by location alone + # No name field needed in selector because there's only one package at this location + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.0-h2628c8c_0_cpython.conda + +packages: + # Single binary package - the only package in the lock file + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.0-h2628c8c_0_cpython.conda + name: python + version: 3.12.0 + build: h2628c8c_0_cpython + build_number: 0 + subdir: linux-64 + sha256: 90553586879bf328f2f9efb8d8faa958ecba822faf379f0a20c3461467b9b955 + md5: defd5d375853a2caff36a19d2d81a28e + license: Python-2.0 + size: 16140836 + timestamp: 1696321871976 diff --git a/test-data/conda-lock/v7/single_source_package.lock.yml b/test-data/conda-lock/v7/single_source_package.lock.yml new file mode 100644 index 000000000..1e1e902d4 --- /dev/null +++ b/test-data/conda-lock/v7/single_source_package.lock.yml @@ -0,0 +1,24 @@ +# Single source package (No Disambiguation Needed) +# +# Tests serialization of a single binary package where no disambiguation is needed. +# +# This represents the "happy path" for binary packages. + +version: 7 +environments: + default: + channels: + - url: https://conda.anaconda.org/conda-forge/ + packages: + linux-64: + # Single source package and no variants to disambiguate + - conda: my-package + +packages: + # Source package without variant information + - conda: my-package + name: my-package + variants: {} + depends: + - python >=3.8 + license: MIT diff --git a/tools/upgrade-lock-file/Cargo.toml b/tools/upgrade-lock-file/Cargo.toml new file mode 100644 index 000000000..5c7636e2a --- /dev/null +++ b/tools/upgrade-lock-file/Cargo.toml @@ -0,0 +1,14 @@ +[package] +name = "upgrade-lock-file" +version = "0.1.0" +description = "Upgrade rattler lock files to the latest format version" +homepage.workspace = true +repository.workspace = true +license.workspace = true +edition.workspace = true +publish = false + +[dependencies] +anyhow = { workspace = true } +clap = { workspace = true, features = ["derive"] } +rattler_lock = { path = "../../crates/rattler_lock" } diff --git a/tools/upgrade-lock-file/src/main.rs b/tools/upgrade-lock-file/src/main.rs new file mode 100644 index 000000000..de5ec34bb --- /dev/null +++ b/tools/upgrade-lock-file/src/main.rs @@ -0,0 +1,55 @@ +use anyhow::{Context, Result}; +use clap::Parser; +use std::path::PathBuf; + +#[derive(Parser)] +#[clap( + name = "upgrade-lock-file", + version, + about = "Upgrade rattler lock files to the latest format version" +)] +struct Args { + /// Path to the lock file to upgrade + #[clap(value_name = "FILE")] + input: PathBuf, + + /// Output path (defaults to overwriting the input file) + #[clap(short, long, value_name = "FILE")] + output: Option, +} + +fn main() -> Result<()> { + let args = Args::parse(); + + // Read the lock file + let lock_file = rattler_lock::LockFile::from_path(&args.input) + .with_context(|| format!("Failed to parse lock file: {}", args.input.display()))?; + + // Get the current version + let current_version = lock_file.version(); + let latest_version = rattler_lock::FileFormatVersion::LATEST; + + println!("Current version: {current_version}, Latest version: {latest_version}",); + + if current_version == latest_version { + println!("Lock file is already at the latest version (v{latest_version})",); + if args.output.is_none() { + return Ok(()); + } + } + + // Determine output path + let output = args.output.as_ref().unwrap_or(&args.input); + + // Serialize to the latest version (happens automatically) + lock_file + .to_path(output) + .with_context(|| format!("Failed to write lock file: {}", output.display()))?; + + println!( + "Successfully upgraded lock file from v{current_version} to v{latest_version}: {}", + output.display() + ); + + Ok(()) +}