diff --git a/Cargo.lock b/Cargo.lock index f81381222..712acadea 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1954,10 +1954,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0a7c22c4d34ef4788c351e971c52bfdfe7ea2766f8c5466bc175dd46e52ac22e" dependencies = [ "console", + "globset", "lazy_static", "linked-hash-map", "serde", "similar", + "walkdir", "yaml-rust", ] diff --git a/Cargo.toml b/Cargo.toml index 2982005f0..e0e4cafa9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -56,7 +56,6 @@ human_bytes = "0.4.3" humantime = "2.1.0" indexmap = { version = "2.2.5", features = ["serde"] } indicatif = "0.17.8" -insta = { version = "1.36.1", features = ["yaml"] } install-wheel-rs = { git = "https://github.com/astral-sh/uv", tag = "0.1.16" } is_executable = "1.0.1" @@ -151,6 +150,8 @@ serde_json = "1.0.114" serial_test = "3.0.0" tokio = { version = "1.36.0", features = ["rt"] } toml = "0.8.10" +insta = { version = "1.36.1", features = ["yaml", "glob"] } + [patch.crates-io] # For pyproject-toml diff --git a/src/lock_file/package_identifier.rs b/src/lock_file/package_identifier.rs index f4cf71088..041b94f25 100644 --- a/src/lock_file/package_identifier.rs +++ b/src/lock_file/package_identifier.rs @@ -2,7 +2,6 @@ use crate::project::manifest::python::PyPiPackageName; use crate::pypi_name_mapping; use pep508_rs::{Requirement, VersionOrUrl}; use rattler_conda_types::{PackageUrl, RepoDataRecord}; -use rattler_lock::CondaPackage; use std::{collections::HashSet, str::FromStr}; use thiserror::Error; use uv_normalize::{ExtraName, InvalidNameError, PackageName}; @@ -24,53 +23,53 @@ impl PypiPackageIdentifier { Ok(result) } - /// Constructs a new instance from a locked Pypi dependency. - pub fn from_locked_pypi_dependency( - package: &rattler_lock::PypiPackage, - ) -> Result { - Ok(Self { - name: PyPiPackageName::from_normalized(package.data().package.name.clone()), - version: package.data().package.version.clone(), - extras: package.extras().iter().cloned().collect(), - }) - } - - /// Determine the python packages that will be installed when the specified locked dependency is - /// installed. - pub fn from_locked_conda_dependency( - package: &CondaPackage, - ) -> Result, ConversionError> { - let record = package.package_record(); - let mut result = Vec::new(); - - // Get the PyPI urls from the package - let mut has_pypi_purl = false; - for purl in record.purls.iter() { - if let Some(entry) = Self::try_from_purl(purl, &record.version.as_str())? { - result.push(entry); - has_pypi_purl = true; - } - } - - // If there is no pypi purl, but the package is a conda-forge package, we just assume that - // the name of the package is equivalent to the name of the python package. - if !has_pypi_purl && pypi_name_mapping::is_conda_forge_url(package.url()) { - // Convert the conda package names to pypi package names. If the conversion fails we - // just assume that its not a valid python package. - let name = PackageName::from_str(record.name.as_normalized()).ok(); - let version = pep440_rs::Version::from_str(&record.version.as_str()).ok(); - if let (Some(name), Some(version)) = (name, version) { - result.push(PypiPackageIdentifier { - name: PyPiPackageName::from_normalized(name), - version, - // TODO: We can't really tell which python extras are enabled in a conda package. - extras: Default::default(), - }); - } - } - - Ok(result) - } + // /// Constructs a new instance from a locked Pypi dependency. + // pub fn from_locked_pypi_dependency( + // package: &rattler_lock::PypiPackage, + // ) -> Result { + // Ok(Self { + // name: PyPiPackageName::from_normalized(package.data().package.name.clone()), + // version: package.data().package.version.clone(), + // extras: package.extras().iter().cloned().collect(), + // }) + // } + // + // /// Determine the python packages that will be installed when the specified locked dependency is + // /// installed. + // pub fn from_locked_conda_dependency( + // package: &CondaPackage, + // ) -> Result, ConversionError> { + // let record = package.package_record(); + // let mut result = Vec::new(); + // + // // Get the PyPI urls from the package + // let mut has_pypi_purl = false; + // for purl in record.purls.iter() { + // if let Some(entry) = Self::try_from_purl(purl, &record.version.as_str())? { + // result.push(entry); + // has_pypi_purl = true; + // } + // } + // + // // If there is no pypi purl, but the package is a conda-forge package, we just assume that + // // the name of the package is equivalent to the name of the python package. + // if !has_pypi_purl && pypi_name_mapping::is_conda_forge_url(package.url()) { + // // Convert the conda package names to pypi package names. If the conversion fails we + // // just assume that its not a valid python package. + // let name = PackageName::from_str(record.name.as_normalized()).ok(); + // let version = pep440_rs::Version::from_str(&record.version.as_str()).ok(); + // if let (Some(name), Some(version)) = (name, version) { + // result.push(PypiPackageIdentifier { + // name: PyPiPackageName::from_normalized(name), + // version, + // // TODO: We can't really tell which python extras are enabled in a conda package. + // extras: Default::default(), + // }); + // } + // } + // + // Ok(result) + // } /// Helper function to write the result of extract the python packages that will be installed /// into a pre-allocated vector. diff --git a/src/lock_file/records_by_name.rs b/src/lock_file/records_by_name.rs index cd6aa09e8..e3e0ca618 100644 --- a/src/lock_file/records_by_name.rs +++ b/src/lock_file/records_by_name.rs @@ -1,8 +1,9 @@ use crate::lock_file::{PypiPackageIdentifier, PypiRecord}; +use crate::pypi_tags::is_python_record; use rattler_conda_types::{PackageName, RepoDataRecord}; use std::borrow::Borrow; use std::collections::hash_map::Entry; -use std::collections::{HashMap, HashSet}; +use std::collections::HashMap; use std::hash::Hash; /// A struct that holds both a ``Vec` of `RepoDataRecord` and a mapping from name to index. @@ -33,11 +34,59 @@ impl RepoDataRecordsByName { self.by_name.get(key).map(|idx| &self.records[*idx]) } + /// Returns the index of the record with the given name or `None` if no such record exists. + pub fn index_by_name(&self, key: &Q) -> Option + where + PackageName: Borrow, + Q: Hash + Eq, + { + self.by_name.get(key).copied() + } + + /// Returns the record that represents the python interpreter or `None` if no such record exists. + pub fn python_interpreter_record(&self) -> Option<&RepoDataRecord> { + self.records.iter().find(|record| is_python_record(*record)) + } + + /// Returns true if there are no records stored in this instance + pub fn is_empty(&self) -> bool { + self.records.is_empty() + } + + /// Returns the number of entries in the mapping. + pub fn len(&self) -> usize { + self.records.len() + } + /// Converts this instance into the internally stored records. pub fn into_inner(self) -> Vec { self.records } + /// Constructs a new instance from an iterator of repodata records. If multiple records exist + /// for the same package name an error is returned. + pub fn from_unique_iter>( + iter: I, + ) -> Result> { + let iter = iter.into_iter(); + let min_size = iter.size_hint().0; + let mut by_name = HashMap::with_capacity(min_size); + let mut records = Vec::with_capacity(min_size); + for record in iter { + match by_name.entry(record.package_record.name.clone()) { + Entry::Vacant(entry) => { + let idx = records.len(); + records.push(record); + entry.insert(idx); + } + Entry::Occupied(_) => { + return Err(Box::new(record)); + } + } + } + Ok(Self { records, by_name }) + } + /// Constructs a new instance from an iterator of repodata records. The records are /// deduplicated where the record with the highest version wins. pub fn from_iter>(iter: I) -> Self { @@ -65,43 +114,28 @@ impl RepoDataRecordsByName { Self { records, by_name } } - /// Constructs a subset of the records in this set that only contain the packages with the given - /// names and recursively their dependencies. - pub fn subset( + /// Convert the records into a map of pypi package identifiers mapped to the records they were + /// extracted from. + pub fn by_pypi_name( &self, - package_names: impl IntoIterator, - virtual_packages: &HashSet, - ) -> Self { - let mut queue = package_names.into_iter().collect::>(); - let mut queued_names = queue.iter().cloned().collect::>(); - let mut records = Vec::new(); - let mut by_name = HashMap::new(); - while let Some(package) = queue.pop() { - // Find the record in the superset of records - let found_package = if virtual_packages.contains(&package) { - continue; - } else if let Some(record) = self.by_name(&package) { - record - } else { - continue; - }; - - // Find all the dependencies of the package and add them to the queue - for dependency in found_package.package_record.depends.iter() { - let dependency_name = PackageName::new_unchecked( - dependency.split_once(' ').unwrap_or((&dependency, "")).0, - ); - if queued_names.insert(dependency_name.clone()) { - queue.push(dependency_name); - } - } - - let idx = records.len(); - by_name.insert(package, idx); - records.push(found_package.clone()); - } - - Self { records, by_name } + ) -> HashMap { + self.records + .iter() + .enumerate() + .filter_map(|(idx, record)| { + PypiPackageIdentifier::from_record(record) + .ok() + .map(move |identifiers| (idx, record, identifiers)) + }) + .flat_map(|(idx, record, identifiers)| { + identifiers.into_iter().map(move |identifier| { + ( + identifier.name.as_normalized().clone(), + (identifier, idx, record), + ) + }) + }) + .collect() } } @@ -121,11 +155,59 @@ impl PypiRecordsByName { self.by_name.get(key).map(|idx| &self.records[*idx]) } + /// Returns the index of the record with the given name or `None` if no such record exists. + pub fn index_by_name(&self, key: &Q) -> Option + where + uv_normalize::PackageName: Borrow, + Q: Hash + Eq, + { + self.by_name.get(key).copied() + } + + /// Returns true if there are no records stored in this instance + pub fn is_empty(&self) -> bool { + self.records.is_empty() + } + + /// Returns the number of entries in the mapping. + pub fn len(&self) -> usize { + self.records.len() + } + + /// Returns an iterator over the names of the records stored in this instance. + pub fn names(&self) -> impl Iterator { + self.by_name.keys() + } + /// Converts this instance into the internally stored records. pub fn into_inner(self) -> Vec { self.records } + /// Constructs a new instance from an iterator of pypi records. If multiple records exist + /// for the same package name an error is returned. + pub fn from_unique_iter>( + iter: I, + ) -> Result { + let iter = iter.into_iter(); + let min_size = iter.size_hint().0; + let mut by_name = HashMap::with_capacity(min_size); + let mut records = Vec::with_capacity(min_size); + for record in iter { + match by_name.entry(record.0.name.clone()) { + Entry::Vacant(entry) => { + let idx = records.len(); + records.push(record); + entry.insert(idx); + } + Entry::Occupied(_) => { + return Err(record); + } + } + } + Ok(Self { records, by_name }) + } + /// Constructs a new instance from an iterator of repodata records. The records are /// deduplicated where the record with the highest version wins. pub fn from_iter>(iter: I) -> Self { @@ -152,40 +234,4 @@ impl PypiRecordsByName { Self { records, by_name } } - - /// Constructs a subset of the records in this set that only contain the packages with the given - /// names and recursively their dependencies. - pub fn subset( - &self, - package_names: impl IntoIterator, - conda_package_identifiers: &HashMap, - ) -> Self { - let mut queue = package_names.into_iter().collect::>(); - let mut queued_names = queue.iter().cloned().collect::>(); - let mut records = Vec::new(); - let mut by_name = HashMap::new(); - while let Some(package) = queue.pop() { - // Find the record in the superset of records - let found_package = if conda_package_identifiers.contains_key(&package) { - continue; - } else if let Some(record) = self.by_name(&package) { - record - } else { - continue; - }; - - // Find all the dependencies of the package and add them to the queue - for dependency in found_package.0.requires_dist.iter() { - if queued_names.insert(dependency.name.clone()) { - queue.push(dependency.name.clone()); - } - } - - let idx = records.len(); - by_name.insert(package, idx); - records.push(found_package.clone()); - } - - Self { records, by_name } - } } diff --git a/src/lock_file/satisfiability.rs b/src/lock_file/satisfiability.rs index 7874c19e9..6d3ebefe0 100644 --- a/src/lock_file/satisfiability.rs +++ b/src/lock_file/satisfiability.rs @@ -1,17 +1,20 @@ -use super::package_identifier; -use crate::{ - project::Environment, pypi_marker_env::determine_marker_environment, - pypi_tags::is_python_record, -}; +use super::{PypiRecord, PypiRecordsByName, RepoDataRecordsByName}; +use crate::{project::Environment, pypi_marker_env::determine_marker_environment}; use itertools::Itertools; use miette::Diagnostic; use pep440_rs::VersionSpecifiers; use pep508_rs::Requirement; -use rattler_conda_types::{MatchSpec, ParseMatchSpecError, ParseStrictness, Platform}; -use rattler_lock::{CondaPackage, Package, PypiPackage}; -use std::collections::{HashMap, HashSet}; +use rattler_conda_types::ParseStrictness::Lenient; +use rattler_conda_types::{ + GenericVirtualPackage, MatchSpec, ParseMatchSpecError, Platform, RepoDataRecord, +}; +use rattler_lock::{ConversionError, Package}; +use std::{ + borrow::Cow, + collections::{HashMap, HashSet}, +}; use thiserror::Error; -use uv_normalize::PackageName; +use uv_normalize::{ExtraName, PackageName}; #[derive(Debug, Error, Diagnostic)] pub enum EnvironmentUnsat { @@ -36,6 +39,9 @@ pub enum PlatformUnsat { #[error("there are more conda packages in the lock-file than are used by the environment")] TooManyCondaPackages, + #[error("corrupted lock-file entry for '{0}'")] + CorruptedEntry(String, ConversionError), + #[error("there are more pypi packages in the lock-file than are used by the environment: {}", .0.iter().format(", "))] TooManyPypiPackages(Vec), @@ -91,58 +97,87 @@ pub fn verify_platform_satisfiability( locked_environment: &rattler_lock::Environment, platform: Platform, ) -> Result<(), PlatformUnsat> { - // Get all the conda packages from the locked environment - let conda_packages = locked_environment - .packages(platform) - .into_iter() - .flatten() - .filter_map(Package::into_conda) - .collect_vec(); + // Convert the lock file into a list of conda and pypi packages + let mut conda_packages: Vec = Vec::new(); + let mut pypi_packages: Vec = Vec::new(); + for package in locked_environment.packages(platform).into_iter().flatten() { + match package { + Package::Conda(conda) => { + let url = conda.url().clone(); + conda_packages.push( + conda + .try_into() + .map_err(|e| PlatformUnsat::CorruptedEntry(url.to_string(), e))?, + ); + } + Package::Pypi(pypi) => { + pypi_packages.push((pypi.data().package.clone(), pypi.data().environment.clone())); + } + } + } - // Check the satisfiability of the conda packages. - verify_conda_platform_satisfiability(environment, &conda_packages, platform)?; + // Create a lookup table from package name to package record. Returns an error if we find a + // duplicate entry for a record + let repodata_records_by_name = match RepoDataRecordsByName::from_unique_iter(conda_packages) { + Ok(conda_packages) => conda_packages, + Err(duplicate) => { + return Err(PlatformUnsat::DuplicateEntry( + duplicate.package_record.name.as_source().to_string(), + )) + } + }; - // Get all the pypi packages from the locked environment - let pypi_packages = locked_environment - .packages(platform) - .into_iter() - .flatten() - .filter_map(Package::into_pypi) - .collect_vec(); + // Create a lookup table from package name to package record. Returns an error if we find a + // duplicate entry for a record + let pypi_records_by_name = match PypiRecordsByName::from_unique_iter(pypi_packages) { + Ok(conda_packages) => conda_packages, + Err(duplicate) => return Err(PlatformUnsat::DuplicateEntry(duplicate.0.name.to_string())), + }; - // Check the satisfiability of the pypi packages. - verify_pypi_platform_satisfiability(environment, &conda_packages, &pypi_packages, platform)?; + verify_package_platform_satisfiability( + environment, + &repodata_records_by_name, + &pypi_records_by_name, + platform, + ) +} - Ok(()) +enum Dependency { + Conda(MatchSpec, Cow<'static, str>), + PyPi(Requirement, Cow<'static, str>), } -pub fn verify_conda_platform_satisfiability( +pub fn verify_package_platform_satisfiability( environment: &Environment<'_>, - locked_environment: &Vec, + locked_conda_packages: &RepoDataRecordsByName, + locked_pypi_environment: &PypiRecordsByName, platform: Platform, ) -> Result<(), PlatformUnsat> { - // Get all the requirements from the environment - let mut specs = environment + // Determine the dependencies requested by the environment + let conda_specs = environment .dependencies(None, Some(platform)) .into_match_specs() - .map(|spec| (spec, "")) + .map(|spec| Dependency::Conda(spec, "".into())) .collect_vec(); - // Create a lookup table from package name to package record. Returns an error if we find a - // duplicate entry for a record. - let mut name_to_record = HashMap::new(); - for (record_idx, record) in locked_environment.iter().enumerate() { - if name_to_record - .insert( - record.package_record().name.as_normalized().to_string(), - record_idx, - ) - .is_some() - { - return Err(PlatformUnsat::DuplicateEntry( - record.package_record().name.as_normalized().to_string(), - )); - } + if conda_specs.is_empty() && !locked_conda_packages.is_empty() { + return Err(PlatformUnsat::TooManyCondaPackages); + } + + let pypi_requirements = environment + .pypi_dependencies(Some(platform)) + .iter() + .flat_map(|(name, reqs)| { + reqs.iter().map(move |req| { + Dependency::PyPi(req.as_pep508(name.as_normalized()), "".into()) + }) + }) + .collect_vec(); + + if pypi_requirements.is_empty() && !locked_pypi_environment.is_empty() { + return Err(PlatformUnsat::TooManyPypiPackages( + locked_pypi_environment.names().cloned().collect(), + )); } // Create a list of virtual packages by name @@ -152,257 +187,349 @@ pub fn verify_conda_platform_satisfiability( .map(|vpkg| (vpkg.name.clone(), vpkg)) .collect::>(); - // Keep a list of all records we have seen. - let mut records_visited = HashSet::new(); + // Find the python interpreter from the list of conda packages. Note that this refers to the + // locked python interpreter, it might not match the specs from the environment. That is ok + // because we will find that out when we check all the records. + let python_interpreter_record = locked_conda_packages.python_interpreter_record(); + + // Determine the marker environment from the python interpreter package. + let marker_environment = python_interpreter_record + .map(|interpreter| determine_marker_environment(platform, &interpreter.package_record)) + .transpose() + .map_err(|err| PlatformUnsat::FailedToDetermineMarkerEnvironment(err.into()))?; + + // Determine the pypi packages provided by the locked conda packages. + let locked_conda_pypi_packages = locked_conda_packages.by_pypi_name(); - // Iterate over all the requirements and find all packages that match the requirements. If - while let Some((spec, source)) = specs.pop() { - let matching_record_idx = match &spec.name { - None => { - // If the spec does not define a name this means we have to find any record that - // matches the spec. - locked_environment.iter().position(|r| r.satisfies(&spec)) + // Keep a list of all conda packages that we have already visisted + let mut conda_packages_visited = HashSet::new(); + let mut pypi_packages_visited = HashSet::new(); + let mut pypi_requirements_visited = pypi_requirements + .iter() + .filter_map(|r| match r { + Dependency::PyPi(req, _) => Some(req.clone()), + _ => None, + }) + .collect::>(); + + // Iterate over all packages. First iterate over all conda matchspecs and then over all pypi + // requirements. We want to ensure we always check the conda packages first. + let mut conda_queue = conda_specs; + let mut pypi_queue = pypi_requirements; + while let Some(package) = conda_queue.pop().or_else(|| pypi_queue.pop()) { + enum FoundPackage { + Conda(usize), + PyPi(usize, Vec), + } + + // Determine the package that matches the requirement of matchspec. + let found_package = match package { + Dependency::Conda(spec, source) => { + match &spec.name { + None => { + // No name means we have to find any package that matches the spec. + match locked_conda_packages + .records + .iter() + .position(|record| record.matches(&spec)) + { + None => { + // No records match the spec. + return Err(PlatformUnsat::UnsatisfiableMatchSpec( + spec, + source.into_owned(), + )); + } + Some(idx) => FoundPackage::Conda(idx), + } + } + Some(name) => { + match locked_conda_packages + .index_by_name(name) + .map(|idx| (idx, &locked_conda_packages.records[idx])) + { + Some((idx, record)) if record.matches(&spec) => { + FoundPackage::Conda(idx) + } + Some(_) => { + // The record does not match the spec, the lock-file is inconsistent. + return Err(PlatformUnsat::UnsatisfiableMatchSpec( + spec, + source.into_owned(), + )); + } + None => { + // Check if there is a virtual package by that name + if let Some(vpkg) = virtual_packages.get(name.as_normalized()) { + if vpkg.matches(&spec) { + // The matchspec matches a virtual package. No need to propagate the dependencies. + continue; + } else { + // The record does not match the spec, the lock-file is inconsistent. + return Err(PlatformUnsat::UnsatisfiableMatchSpec( + spec, + source.into_owned(), + )); + } + } else { + // The record does not match the spec, the lock-file is inconsistent. + return Err(PlatformUnsat::UnsatisfiableMatchSpec( + spec, + source.into_owned(), + )); + } + } + } + } + } } - Some(name) => { - // If the spec does define a name we can do a quick lookup based on the name. - // - // We start by looking at virtual packages. This is also what the solver does. It - // first tries to find a virtual package that matches the spec followed by regular - // packages. - if let Some(vpkg) = virtual_packages.get(name) { - if spec - .version - .as_ref() - .map(|spec| spec.matches(&vpkg.version)) - .unwrap_or(true) - && spec - .build - .as_ref() - .map(|spec| spec.matches(&vpkg.build_string)) - .unwrap_or(true) - { - // Virtual package matches - continue; + Dependency::PyPi(requirement, source) => { + // Check if there is a pypi identifier that matches our requirement. + if let Some((identifier, repodata_idx, _)) = + locked_conda_pypi_packages.get(&requirement.name) + { + if identifier.satisfies(&requirement) { + FoundPackage::Conda(*repodata_idx) + } else { + // The record does not match the spec, the lock-file is inconsistent. + return Err(PlatformUnsat::UnsatisfiableRequirement( + requirement, + source.into_owned(), + )); + } + } else if let Some(idx) = locked_pypi_environment.index_by_name(&requirement.name) { + let record = &locked_pypi_environment.records[idx]; + if record.0.satisfies(&requirement) { + FoundPackage::PyPi(idx, requirement.extras) + } else { + // The record does not match the spec, the lock-file is inconsistent. + return Err(PlatformUnsat::UnsatisfiableRequirement( + requirement, + source.into_owned(), + )); } + } else { + // The record does not match the spec, the lock-file is inconsistent. + return Err(PlatformUnsat::UnsatisfiableRequirement( + requirement, + source.into_owned(), + )); } - - // Otherwise, find the record that matches the spec. - name_to_record - .get(name.as_normalized()) - .copied() - .and_then(|idx| { - let record = &locked_environment[idx]; - if record.satisfies(&spec) { - Some(idx) - } else { - None - } - }) } }; - // Bail if no record could be found - let Some(matching_record_idx) = matching_record_idx else { - return Err(PlatformUnsat::UnsatisfiableMatchSpec( - spec, - source.to_string(), - )); - }; + // Add all the requirements of the package to the queue. + match found_package { + FoundPackage::Conda(idx) => { + if !conda_packages_visited.insert(idx) { + // We already visited this package, so we can skip adding its dependencies to the queue + continue; + } - // Check if we've already seen this package - if !records_visited.insert(matching_record_idx) { - continue; - } + let record = &locked_conda_packages.records[idx]; + for depends in &record.package_record.depends { + let spec = MatchSpec::from_str(depends.as_str(), Lenient) + .map_err(|e| PlatformUnsat::FailedToParseMatchSpec(depends.clone(), e))?; + conda_queue.push(Dependency::Conda( + spec, + Cow::Owned(record.file_name.clone()), + )); + } + } + FoundPackage::PyPi(idx, extras) => { + let record = &locked_pypi_environment.records[idx]; + + // If there is no marker environment there is no python version + let Some(marker_environment) = marker_environment.as_ref() else { + return Err(PlatformUnsat::MissingPythonInterpreter); + }; + + if pypi_packages_visited.insert(idx) { + // Ensure that the record matches the currently selected interpreter. + if let Some(python_version) = &record.0.requires_python { + if !python_version.contains(&marker_environment.python_full_version.version) + { + return Err(PlatformUnsat::PythonVersionMismatch( + record.0.name.clone(), + python_version.clone(), + marker_environment + .python_full_version + .version + .clone() + .into(), + )); + } + } + } + + // Add all the requirements of the package to the queue. + for requirement in &record.0.requires_dist { + if !pypi_requirements_visited.insert(requirement.clone()) { + continue; + } + + // Skip this requirement if it does not apply. + if !requirement.evaluate_markers(marker_environment, &extras) { + continue; + } - // Otherwise, add all the requirements of the record to the queue. - let record = &locked_environment[matching_record_idx]; - let source = record - .file_name() - .unwrap_or_else(|| record.package_record().name.as_normalized()); - for depends in &record.package_record().depends { - let spec = MatchSpec::from_str(depends.as_str(), ParseStrictness::Lenient) - .map_err(|e| PlatformUnsat::FailedToParseMatchSpec(depends.clone(), e))?; - specs.push((spec, source)) + pypi_queue.push(Dependency::PyPi( + requirement.clone(), + record.0.name.as_ref().to_string().into(), + )); + } + } } } - // If we didn't visit all conda-records it means we have too many packages in the lock-file. We - // don't want to install more packages than we need. - if records_visited.len() != locked_environment.len() { + // Check if all locked packages have also been visisted + if conda_packages_visited.len() != locked_conda_packages.len() { return Err(PlatformUnsat::TooManyCondaPackages); } - Ok(()) -} - -pub fn verify_pypi_platform_satisfiability( - environment: &Environment<'_>, - locked_conda_packages: &[CondaPackage], - locked_pypi_environment: &[PypiPackage], - platform: Platform, -) -> Result<(), PlatformUnsat> { - let mut requirements = environment - .pypi_dependencies(Some(platform)) - .iter() - .flat_map(|(name, reqs)| { - reqs.iter() - .map(move |req| (req.as_pep508(name.as_normalized()), "")) - }) - .collect_vec(); - - // If there are no pypi packages specified in the requirement, we can skip verifying them. - if requirements.is_empty() { - return if !locked_pypi_environment.is_empty() { - Err(PlatformUnsat::TooManyPypiPackages( - locked_pypi_environment - .iter() - .map(|p| p.data().package.name.clone()) - .collect(), - )) - } else { - Ok(()) - }; + if pypi_packages_visited.len() != locked_pypi_environment.len() { + return Err(PlatformUnsat::TooManyPypiPackages( + locked_pypi_environment + .names() + .enumerate() + .filter_map(|(idx, name)| { + if pypi_packages_visited.contains(&idx) { + None + } else { + Some(name.clone()) + } + }) + .collect(), + )); } - // Construct package identifiers for the locked packages - let package_identifiers = - package_identifiers_from_locked_packages(locked_conda_packages, locked_pypi_environment); - - // Create a lookup by name for the package identifiers. - let mut name_to_package_identifiers = HashMap::new(); - for (idx, (identifier, _)) in package_identifiers.iter().enumerate() { - name_to_package_identifiers - .entry(identifier.name.as_normalized()) - .or_insert_with(Vec::new) - .push(idx); - } + Ok(()) +} - // Find the python package from the list of conda packages. - let Some(python_record) = locked_conda_packages.iter().find(|r| is_python_record(*r)) else { - return Err(PlatformUnsat::MissingPythonInterpreter); - }; +trait MatchesMatchspec { + fn matches(&self, spec: &MatchSpec) -> bool; +} - // Determine the marker environment from the python interpreter package - let marker_environment = - match determine_marker_environment(platform, python_record.package_record()) { - Ok(marker_environment) => marker_environment, - Err(e) => return Err(PlatformUnsat::FailedToDetermineMarkerEnvironment(e.into())), - }; +impl MatchesMatchspec for RepoDataRecord { + fn matches(&self, spec: &MatchSpec) -> bool { + if !spec.matches(&self.package_record) { + return false; + } - // Keep a list of all requirements we have seen so we don't check them again. - let mut requirements_visited = requirements - .iter() - .map(|(req, _source)| req.clone()) - .collect::>(); + // TODO: We should really move this into rattler + // Check the channel + if let Some(channel) = &spec.channel { + if !self.url.as_str().starts_with(channel.base_url.as_str()) { + return false; + } + } - // Keep a list of all packages visited - let mut packages_visited = HashSet::new(); - - // Iterate over all the requirements and find a packages that match the requirements. - while let Some((requirement, source)) = requirements.pop() { - // Look-up the identifier that matches the requirement - let matched_package = name_to_package_identifiers - .get(&requirement.name) - .into_iter() - .flat_map(|idxs| idxs.iter().map(|idx| &package_identifiers[*idx])) - .find(|(identifier, _pypi_package_idx)| identifier.satisfies(&requirement)); - - // Error if no package could be found that matches the requirement - let Some((_identifier, pypi_package_idx)) = matched_package else { - return Err(PlatformUnsat::UnsatisfiableRequirement( - requirement, - source.to_string(), - )); - }; + true + } +} - // Get the package data from the found package. Or if there is no package data, continue, - // because that indicates that the package is a conda package. - let Some(pypi_package_idx) = *pypi_package_idx else { - continue; - }; - let pkg_data = locked_pypi_environment[pypi_package_idx].data().package; - - // Record that we visited this package. - packages_visited.insert(pypi_package_idx); - - // Check that the package is compatible with the python version - if let Some(required_python_version) = &pkg_data.requires_python { - if !required_python_version.contains(&marker_environment.python_full_version.version) { - return Err(PlatformUnsat::PythonVersionMismatch( - pkg_data.name.clone(), - required_python_version.clone(), - marker_environment - .python_full_version - .version - .clone() - .into(), - )); +impl MatchesMatchspec for GenericVirtualPackage { + fn matches(&self, spec: &MatchSpec) -> bool { + if let Some(name) = &spec.name { + if name != &self.name { + return false; } } - // Loop over all requirements of the package and add them to the queue. - for dependency in pkg_data.requires_dist.iter() { - // Skip this requirement if it does not apply. - if !dependency.evaluate_markers(&marker_environment, &requirement.extras) { - continue; + if let Some(version) = &spec.version { + if !version.matches(&self.version) { + return false; } + } - // Make sure we don't visit the same requirement twice. - if requirements_visited.get(dependency).is_some() { - continue; + if let Some(build) = &spec.build { + if !build.matches(&self.build_string) { + return false; } + } - // Add the requirement to the queue. - requirements_visited.insert(dependency.clone()); - requirements.push((dependency.clone(), pkg_data.name.as_ref())); + true + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::Project; + use miette::{DebugReportHandler, IntoDiagnostic, NarratableReportHandler}; + use rattler_lock::LockFile; + use rstest::rstest; + use std::path::PathBuf; + + #[derive(Error, Debug)] + enum LockfileUnsat { + #[error("environment '{0}' is missing")] + EnvironmentMissing(String), + + #[error("environment '{0}' does not satisfy the requirements of the project")] + Environment(String, #[source] EnvironmentUnsat), + + #[error( + "environment '{0}' does not satisfy the requirements of the project for platform '{1}" + )] + PlatformUnsat(String, Platform, #[source] PlatformUnsat), + } + + fn verify_lockfile_satisfiability( + project: &Project, + lock_file: &LockFile, + ) -> Result<(), LockfileUnsat> { + for env in project.environments() { + let locked_env = lock_file + .environment(env.name().as_str()) + .ok_or_else(|| LockfileUnsat::EnvironmentMissing(env.name().to_string()))?; + verify_environment_satisfiability(&env, &locked_env) + .map_err(|e| LockfileUnsat::Environment(env.name().to_string(), e))?; + + for platform in env.platforms() { + verify_platform_satisfiability(&env, &locked_env, platform).map_err(|e| { + LockfileUnsat::PlatformUnsat(env.name().to_string(), platform, e) + })?; + } } + Ok(()) } - // Make sure we don't have more packages than we need. - if packages_visited.len() != locked_pypi_environment.len() { - let extraneous_packages = HashSet::from_iter(0..locked_pypi_environment.len()) - .difference(&packages_visited) - .map(|idx| locked_pypi_environment[*idx].data().package.name.clone()) - .collect_vec(); - return Err(PlatformUnsat::TooManyPypiPackages(extraneous_packages)); + #[rstest] + fn test_good_satisfiability( + #[files("tests/satisfiability/**/pixi.toml")] manifest_path: PathBuf, + ) { + let project = Project::load(&manifest_path).unwrap(); + let lock_file = LockFile::from_path(&project.lock_file_path()).unwrap(); + match verify_lockfile_satisfiability(&project, &lock_file).into_diagnostic() { + Ok(()) => {} + Err(e) => panic!("{e:?}"), + } } - Ok(()) -} + #[rstest] + fn test_example_satisfiability(#[files("examples/**/pixi.toml")] manifest_path: PathBuf) { + let project = Project::load(&manifest_path).unwrap(); + let lock_file = LockFile::from_path(&project.lock_file_path()).unwrap(); + match verify_lockfile_satisfiability(&project, &lock_file).into_diagnostic() { + Ok(()) => {} + Err(e) => panic!("{e:?}"), + } + } -/// Returns the [`PypiPackageIdentifier`] that are present in the given set of locked packages. The -/// resulting identifiers are also associated with the package data that they came from. This is -/// only the case for Pypi packages. -/// -/// Both Conda and Pypi package have [`PypiPackageIdentifier`]s associated with them. -fn package_identifiers_from_locked_packages( - locked_conda_environment: &[CondaPackage], - locked_pypi_environment: &[PypiPackage], -) -> Vec<(package_identifier::PypiPackageIdentifier, Option)> { - // Construct package identifiers for the conda locked packages - let conda_package_identifiers = locked_conda_environment - .iter() - .map(package_identifier::PypiPackageIdentifier::from_locked_conda_dependency) - .filter_map(Result::ok) - .flatten() - .map(|pkg| (pkg, None)); - - // Construct package identifiers from the locked pypi packages. Also associate the resulting - // identifiers with the package data that it came from. - let pypi_package_identifiers = - locked_pypi_environment - .iter() - .enumerate() - .filter_map(|(idx, pypi_package)| { - Some(( - package_identifier::PypiPackageIdentifier::from_locked_pypi_dependency( - pypi_package, - ) - .ok()?, - Some(idx), - )) - }); - - // Combine the two sets of identifiers. - itertools::chain(conda_package_identifiers, pypi_package_identifiers).collect() + #[test] + fn test_failing_satisiability() { + let _handler = miette::set_hook(Box::new(|_| { + Box::new(NarratableReportHandler::new().with_cause_chain()) + })); + + insta::glob!("../../tests/non-satisfiability", "**/pixi.toml", |path| { + let project = Project::load(&path).unwrap(); + let lock_file = LockFile::from_path(&project.lock_file_path()).unwrap(); + let mut err = verify_lockfile_satisfiability(&project, &lock_file) + .into_diagnostic() + .expect_err("expected failing satisfiability"); + insta::assert_snapshot!(format!("{err:?}")); + }); + } } diff --git a/src/lock_file/snapshots/pixi__lock_file__satisfiability__tests__failing_satisiability.snap b/src/lock_file/snapshots/pixi__lock_file__satisfiability__tests__failing_satisiability.snap new file mode 100644 index 000000000..826e5910b --- /dev/null +++ b/src/lock_file/snapshots/pixi__lock_file__satisfiability__tests__failing_satisiability.snap @@ -0,0 +1,10 @@ +--- +source: src/lock_file/satisfiability.rs +assertion_line: 560 +expression: "format!(\"{err:?}\")" +input_file: tests/non-satisfiability/solve-groups-pypi/pixi.toml +--- + × environment 'default' does not satisfy the requirements of the project for + │ platform 'win-64 + ╰─▶ the requirement 'packaging >=20.0' could not be satisfied (required + by 'matplotlib') diff --git a/src/lock_file/snapshots/pixi__lock_file__satisfiability__tests__failing_satisiability@mismatched-spec__pixi.toml.snap b/src/lock_file/snapshots/pixi__lock_file__satisfiability__tests__failing_satisiability@mismatched-spec__pixi.toml.snap new file mode 100644 index 000000000..4557c2556 --- /dev/null +++ b/src/lock_file/snapshots/pixi__lock_file__satisfiability__tests__failing_satisiability@mismatched-spec__pixi.toml.snap @@ -0,0 +1,9 @@ +--- +source: src/lock_file/satisfiability.rs +assertion_line: 532 +expression: "format!(\"{err:?}\")" +input_file: tests/non-satisfiability/mismatched-spec/pixi.toml +--- +environment 'default' does not satisfy the requirements of the project for platform 'win-64 + Diagnostic severity: error + Caused by: the requirement 'pixi <0.15.2' could not be satisfied (required by '') diff --git a/src/lock_file/snapshots/pixi__lock_file__satisfiability__tests__failing_satisiability@missing-dependency__pixi.toml.snap b/src/lock_file/snapshots/pixi__lock_file__satisfiability__tests__failing_satisiability@missing-dependency__pixi.toml.snap new file mode 100644 index 000000000..29fe3c670 --- /dev/null +++ b/src/lock_file/snapshots/pixi__lock_file__satisfiability__tests__failing_satisiability@missing-dependency__pixi.toml.snap @@ -0,0 +1,9 @@ +--- +source: src/lock_file/satisfiability.rs +assertion_line: 532 +expression: "format!(\"{err:?}\")" +input_file: tests/non-satisfiability/missing-dependency/pixi.toml +--- +environment 'default' does not satisfy the requirements of the project for platform 'win-64 + Diagnostic severity: error + Caused by: the requirement 'vc14_runtime >=14.29.30139' could not be satisfied (required by 'pixi-0.15.2-h7ea99a0_0.conda') diff --git a/src/lock_file/snapshots/pixi__lock_file__satisfiability__tests__failing_satisiability@missing-pypi-extra__pixi.toml.snap b/src/lock_file/snapshots/pixi__lock_file__satisfiability__tests__failing_satisiability@missing-pypi-extra__pixi.toml.snap new file mode 100644 index 000000000..2918b48e7 --- /dev/null +++ b/src/lock_file/snapshots/pixi__lock_file__satisfiability__tests__failing_satisiability@missing-pypi-extra__pixi.toml.snap @@ -0,0 +1,9 @@ +--- +source: src/lock_file/satisfiability.rs +assertion_line: 532 +expression: "format!(\"{err:?}\")" +input_file: tests/non-satisfiability/missing-pypi-extra/pixi.toml +--- +environment 'default' does not satisfy the requirements of the project for platform 'win-64 + Diagnostic severity: error + Caused by: the requirement 'ipython >=7.8.0 ; extra == 'jupyter'' could not be satisfied (required by 'black') diff --git a/src/lock_file/snapshots/pixi__lock_file__satisfiability__tests__failing_satisiability@solve-groups-pypi__pixi.toml.snap b/src/lock_file/snapshots/pixi__lock_file__satisfiability__tests__failing_satisiability@solve-groups-pypi__pixi.toml.snap new file mode 100644 index 000000000..b3168f346 --- /dev/null +++ b/src/lock_file/snapshots/pixi__lock_file__satisfiability__tests__failing_satisiability@solve-groups-pypi__pixi.toml.snap @@ -0,0 +1,9 @@ +--- +source: src/lock_file/satisfiability.rs +assertion_line: 532 +expression: "format!(\"{err:?}\")" +input_file: tests/non-satisfiability/solve-groups-pypi/pixi.toml +--- +environment 'default' does not satisfy the requirements of the project for platform 'win-64 + Diagnostic severity: error + Caused by: the requirement 'packaging >=20.0' could not be satisfied (required by 'matplotlib') diff --git a/src/lock_file/update.rs b/src/lock_file/update.rs index ffbea3f53..2e398002c 100644 --- a/src/lock_file/update.rs +++ b/src/lock_file/update.rs @@ -1,15 +1,14 @@ -use crate::lock_file::UvResolutionContext; +use crate::lock_file::{PypiRecord, UvResolutionContext}; use crate::project::grouped_environment::GroupedEnvironmentName; +use crate::pypi_marker_env::determine_marker_environment; +use crate::pypi_tags::is_python_record; use crate::{ config, consts, environment::{ self, LockFileUsage, PerEnvironmentAndPlatform, PerGroup, PerGroupAndPlatform, PythonStatus, }, load_lock_file, - lock_file::{ - self, update, OutdatedEnvironments, PypiPackageIdentifier, PypiRecordsByName, - RepoDataRecordsByName, - }, + lock_file::{self, update, OutdatedEnvironments, PypiRecordsByName, RepoDataRecordsByName}, prefix::Prefix, progress::global_multi_progress, project::{grouped_environment::GroupedEnvironment, Environment}, @@ -32,11 +31,13 @@ use std::{ collections::{HashMap, HashSet}, convert::identity, future::{ready, Future}, + iter, sync::Arc, time::{Duration, Instant}, }; use tokio::sync::Semaphore; use tracing::Instrument; +use uv_normalize::ExtraName; impl Project { /// Ensures that the lock-file is up-to-date with the project information. @@ -252,30 +253,6 @@ struct UpdateContext<'p> { } impl<'p> UpdateContext<'p> { - /// Returns a future that will resolve to the solved repodata records for the given environment - /// or `None` if the records do not exist and are also not in the process of being updated. - pub fn get_latest_repodata_records( - &self, - environment: &Environment<'p>, - platform: Platform, - ) -> Option>> { - self.solved_repodata_records - .get(environment) - .and_then(|records| records.get(&platform)) - .map(|records| { - let records = records.clone(); - Either::Left(async move { records.wait().await.clone() }) - }) - .or_else(|| { - self.locked_repodata_records - .get(environment) - .and_then(|records| records.get(&platform)) - .cloned() - .map(ready) - .map(Either::Right) - }) - } - /// Returns a future that will resolve to the solved repodata records for the given environment /// group or `None` if the records do not exist and are also not in the process of being /// updated. @@ -304,6 +281,27 @@ impl<'p> UpdateContext<'p> { Some(ready(locked_records).right_future()) } + /// Returns a future that will resolve to the solved pypi records for the given environment + /// group or `None` if the records do not exist and are also not in the process of being + /// updated. + pub fn get_latest_group_pypi_records( + &self, + group: &GroupedEnvironment<'p>, + platform: Platform, + ) -> Option>> { + // Check if there is a pending operation for this group and platform + if let Some(pending_records) = self + .grouped_solved_pypi_records + .get(group) + .and_then(|records| records.get(&platform)) + .cloned() + { + return Some(async move { pending_records.wait().await.clone() }); + } + + None + } + /// Takes the latest repodata records for the given environment and platform. Returns `None` if /// neither the records exist nor are in the process of being updated. /// @@ -584,6 +582,18 @@ pub async fn ensure_up_to_date_lock_file( }) .collect(); + // Create a mapping that iterators over all outdated environments and their platforms for both + // and pypi. + let all_outdated_envs = itertools::chain(outdated.conda.iter(), outdated.pypi.iter()).fold( + HashMap::, HashSet>::new(), + |mut acc, (env, platforms)| { + acc.entry(env.clone()) + .or_default() + .extend(platforms.iter().cloned()); + acc + }, + ); + let mut context = UpdateContext { repo_data: Arc::new(repo_data), @@ -618,61 +628,40 @@ pub async fn ensure_up_to_date_lock_file( for platform in ordered_platforms { // Is there an existing pending task to solve the group? - let group_solve_records = if let Some(cell) = context + if context .grouped_solved_repodata_records .get(&source) .and_then(|platforms| platforms.get(&platform)) + .is_some() { // Yes, we can reuse the existing cell. - cell.clone() - } else { - // No, we need to spawn a task to update for the entire solve group. - let locked_group_records = context - .locked_grouped_repodata_records - .get(&source) - .and_then(|records| records.get(&platform)) - .cloned() - .unwrap_or_default(); - - // Spawn a task to solve the group. - let group_solve_task = spawn_solve_conda_environment_task( - source.clone(), - locked_group_records, - context.repo_data.clone(), - platform, - solve_semaphore.clone(), - ) - .boxed_local(); - - // Store the task so we can poll it later. - pending_futures.push(group_solve_task); - - // Create an entry that can be used by other tasks to wait for the result. - let cell = Arc::new(BarrierCell::new()); - let previous_cell = context - .grouped_solved_repodata_records - .entry(source.clone()) - .or_default() - .insert(platform, cell.clone()); - assert!( - previous_cell.is_none(), - "a cell has already been added to update conda records" - ); - - cell - }; + continue; + } + // No, we need to spawn a task to update for the entire solve group. + let locked_group_records = context + .locked_grouped_repodata_records + .get(&source) + .and_then(|records| records.get(&platform)) + .cloned() + .unwrap_or_default(); + + // Spawn a task to solve the group. + let group_solve_task = spawn_solve_conda_environment_task( + source.clone(), + locked_group_records, + context.repo_data.clone(), + platform, + solve_semaphore.clone(), + ) + .boxed_local(); - // Spawn a task to extract the records from the group solve task. - let records_future = - spawn_extract_conda_environment_task(environment.clone(), platform, async move { - group_solve_records.wait().await.clone() - }) - .boxed_local(); + // Store the task so we can poll it later. + pending_futures.push(group_solve_task); - pending_futures.push(records_future); + // Create an entry that can be used by other tasks to wait for the result. let previous_cell = context - .solved_repodata_records - .entry(environment.clone()) + .grouped_solved_repodata_records + .entry(source.clone()) .or_default() .insert(platform, Arc::default()); assert!( @@ -747,100 +736,107 @@ pub async fn ensure_up_to_date_lock_file( .into_iter() .flat_map(|(env, platforms)| platforms.into_iter().map(move |p| (env.clone(), p))) { - let dependencies = environment.pypi_dependencies(Some(platform)); - if dependencies.is_empty() { - pending_futures.push( - ready(Ok(TaskResult::PypiSolved( - environment.name().clone(), - platform, - Arc::default(), - ))) - .boxed_local(), - ); - } else { - let group = GroupedEnvironment::from(environment.clone()); + let group = GroupedEnvironment::from(environment.clone()); - // Solve all the pypi records in the solve group together. - let grouped_pypi_records = if let Some(cell) = context - .grouped_solved_pypi_records - .get(&group) - .and_then(|records| records.get(&platform)) - { - // There is already a task to solve the pypi records for the group. - cell.clone() - } else { - // Construct a future that will resolve when we have the repodata available - let repodata_future = context - .get_latest_group_repodata_records(&group, platform) - .expect("conda records should be available now or in the future"); - - // Construct a future that will resolve when we have the conda prefix available - let prefix_future = context - .get_conda_prefix(&group) - .expect("prefix should be available now or in the future"); - - // Get the uv context - let uv_context = match &uv_context { - None => { - let context = UvResolutionContext::from_project(project)?; - uv_context = Some(context.clone()); - context - } - Some(context) => context.clone(), - }; - // Get environment variables from the activation - let env_variables = project.get_env_variables(&environment).await?; - - // Spawn a task to solve the pypi environment - let pypi_solve_future = spawn_solve_pypi_task( - uv_context, - group.clone(), - platform, - repodata_future, - prefix_future, - env_variables, - ); + // Solve all the pypi records in the solve group together. + if context + .grouped_solved_pypi_records + .get(&group) + .and_then(|records| records.get(&platform)) + .is_some() + { + // There is already a task to solve the pypi records for the group. + continue; + } + // Construct a future that will resolve when we have the repodata available + let repodata_future = context + .get_latest_group_repodata_records(&group, platform) + .expect("conda records should be available now or in the future"); - pending_futures.push(pypi_solve_future.boxed_local()); + // Construct a future that will resolve when we have the conda prefix available + let prefix_future = context + .get_conda_prefix(&group) + .expect("prefix should be available now or in the future"); - let cell = Arc::new(BarrierCell::new()); - let previous_cell = context - .grouped_solved_pypi_records - .entry(group) - .or_default() - .insert(platform, cell.clone()); - assert!( - previous_cell.is_none(), - "a cell has already been added to update pypi records" - ); + // Get the uv context + let uv_context = match &uv_context { + None => { + let context = UvResolutionContext::from_project(project)?; + uv_context = Some(context.clone()); + context + } + Some(context) => context.clone(), + }; - cell - }; + // Get environment variables from the activation + let env_variables = project.get_env_variables(&environment).await?; - // Followed by spawning a task to extract exactly the pypi records that are needed for - // this environment. - let pypi_records_future = async move { grouped_pypi_records.wait().await.clone() }; - let conda_records_future = context - .get_latest_repodata_records(&environment, platform) - .expect("must have conda records available"); - let records_future = spawn_extract_pypi_environment_task( - environment.clone(), - platform, - conda_records_future, - pypi_records_future, - ) - .boxed_local(); - pending_futures.push(records_future); - } + // Spawn a task to solve the pypi environment + let pypi_solve_future = spawn_solve_pypi_task( + uv_context, + group.clone(), + platform, + repodata_future, + prefix_future, + env_variables, + ); + + pending_futures.push(pypi_solve_future.boxed_local()); + + let previous_cell = context + .grouped_solved_pypi_records + .entry(group) + .or_default() + .insert(platform, Arc::default()); + assert!( + previous_cell.is_none(), + "a cell has already been added to update pypi records" + ); + } + + // Iteratate over all outdated environments and their platforms and extract the corresponding records from them. + for (environment, platform) in all_outdated_envs.iter().flat_map(|(env, platforms)| { + iter::once(env.clone()).cartesian_product(platforms.iter().cloned()) + }) { + let grouped_environment = GroupedEnvironment::from(environment.clone()); + + // Get futures that will resolve when the conda and pypi records become available. + let grouped_repodata_records = context + .get_latest_group_repodata_records(&grouped_environment, platform) + .expect("conda records should be available now or in the future"); + let grouped_pypi_records = context + .get_latest_group_pypi_records(&grouped_environment, platform) + .map(Either::Left) + .unwrap_or_else(|| Either::Right(ready(Arc::default()))); + + // Spawn a task to extract a subset of the resolution. + let extract_resolution_task = spawn_extract_environment_task( + environment.clone(), + platform, + grouped_repodata_records, + grouped_pypi_records, + ); + pending_futures.push(extract_resolution_task.boxed_local()); + + // Create a cell that will be used to store the result of the extraction. + let previous_cell = context + .solved_repodata_records + .entry(environment.clone()) + .or_default() + .insert(platform, Arc::default()); + assert!( + previous_cell.is_none(), + "a cell has already been added to update conda records" + ); let previous_cell = context .solved_pypi_records - .entry(environment) + .entry(environment.clone()) .or_default() .insert(platform, Arc::default()); assert!( previous_cell.is_none(), - "a cell has already been added to extract pypi records" + "a cell has already been added to update pypi records" ); } @@ -900,30 +896,6 @@ pub async fn ensure_up_to_date_lock_file( } } } - TaskResult::CondaSolved(environment, platform, records) => { - let environment = project - .environment(&environment) - .expect("environment should exist"); - - context - .solved_repodata_records - .get_mut(&environment) - .expect("the entry for this environment should exist") - .get_mut(&platform) - .expect("the entry for this platform should exist") - .set(records) - .expect("records should not be solved twice"); - - let group = GroupedEnvironment::from(environment.clone()); - if matches!(group, GroupedEnvironment::Group(_)) { - tracing::info!( - "extracted conda packages for '{}' '{}' from the '{}' group", - environment.name().fancy_display(), - consts::PLATFORM_STYLE.apply_to(platform), - group.name().fancy_display(), - ); - } - } TaskResult::CondaPrefixUpdated(group_name, prefix, python_status, duration) => { let group = GroupedEnvironment::from_name(project, &group_name) .expect("grouped environment should exist"); @@ -973,7 +945,12 @@ pub async fn ensure_up_to_date_lock_file( } } } - TaskResult::PypiSolved(environment, platform, records) => { + TaskResult::ExtractedRecordsSubset( + environment, + platform, + repodata_records, + pypi_records, + ) => { let environment = project .environment(&environment) .expect("environment should exist"); @@ -984,13 +961,22 @@ pub async fn ensure_up_to_date_lock_file( .expect("the entry for this environment should exist") .get_mut(&platform) .expect("the entry for this platform should exist") - .set(records) + .set(pypi_records) + .expect("records should not be solved twice"); + + context + .solved_repodata_records + .get_mut(&environment) + .expect("the entry for this environment should exist") + .get_mut(&platform) + .expect("the entry for this platform should exist") + .set(repodata_records) .expect("records should not be solved twice"); let group = GroupedEnvironment::from(environment.clone()); if matches!(group, GroupedEnvironment::Group(_)) { tracing::info!( - "extracted pypi packages for '{}' '{}' from the '{}' group", + "extracted subset of records for '{}' '{}' from the '{}' group", environment.name().fancy_display(), consts::PLATFORM_STYLE.apply_to(platform), group.name().fancy_display(), @@ -1056,21 +1042,32 @@ pub async fn ensure_up_to_date_lock_file( /// Represents data that is sent back from a task. This is used to communicate the result of a task /// back to the main task which will forward the information to other tasks waiting for results. enum TaskResult { + /// The conda dependencies for a grouped environment have been solved. CondaGroupSolved( GroupedEnvironmentName, Platform, RepoDataRecordsByName, Duration, ), - CondaSolved(EnvironmentName, Platform, Arc), + + /// A prefix was updated with the latest conda packages CondaPrefixUpdated(GroupedEnvironmentName, Prefix, Box, Duration), + + /// The pypi dependencies for a grouped environment have been solved. PypiGroupSolved( GroupedEnvironmentName, Platform, PypiRecordsByName, Duration, ), - PypiSolved(EnvironmentName, Platform, Arc), + + /// The records for a specific environment have been extracted from a grouped solve. + ExtractedRecordsSubset( + EnvironmentName, + Platform, + Arc, + Arc, + ), } /// A task that solves the conda dependencies for a given environment. @@ -1187,84 +1184,158 @@ async fn spawn_solve_conda_environment_task( } /// Distill the repodata that is applicable for the given `environment` from the repodata of an entire solve group. -async fn spawn_extract_conda_environment_task( +async fn spawn_extract_environment_task( environment: Environment<'_>, platform: Platform, - solve_group_records: impl Future>, + grouped_repodata_records: impl Future>, + grouped_pypi_records: impl Future>, ) -> miette::Result { let group = GroupedEnvironment::from(environment.clone()); // Await the records from the group - let group_records = solve_group_records.await; + let (grouped_repodata_records, grouped_pypi_records) = + tokio::join!(grouped_repodata_records, grouped_pypi_records); // If the group is just the environment on its own we can immediately return the records. - let records = match group { - GroupedEnvironment::Environment(_) => { - // For a single environment group we can just clone the Arc - group_records.clone() - } - GroupedEnvironment::Group(_) => { - let virtual_package_names = group - .virtual_packages(platform) - .into_iter() - .map(|vp| vp.name) - .collect::>(); + if let GroupedEnvironment::Environment(_) = group { + return Ok(TaskResult::ExtractedRecordsSubset( + environment.name().clone(), + platform, + grouped_repodata_records, + grouped_pypi_records, + )); + } - let environment_dependencies = environment.dependencies(None, Some(platform)); - Arc::new(group_records.subset( - environment_dependencies.into_iter().map(|(name, _)| name), - &virtual_package_names, - )) + // Convert all the conda records to package identifiers. + let conda_package_identifiers = grouped_repodata_records.by_pypi_name(); + + #[derive(Clone, Eq, PartialEq, Hash)] + enum PackageName { + Conda(rattler_conda_types::PackageName), + Pypi((uv_normalize::PackageName, Option)), + } + + enum PackageRecord<'a> { + Conda(&'a RepoDataRecord), + Pypi((&'a PypiRecord, Option)), + } + + // Determine the conda packages we need. + let conda_package_names = environment + .dependencies(None, Some(platform)) + .names() + .cloned() + .map(PackageName::Conda) + .collect::>(); + + // Determine the pypi packages we need. + let pypi_dependencies = environment.pypi_dependencies(Some(platform)); + let has_pypi_dependencies = !pypi_dependencies.is_empty(); + let mut pypi_package_names = HashSet::new(); + for (name, reqs) in pypi_dependencies { + let name = name.as_normalized().clone(); + for req in reqs { + for extra in req.extras.into_iter().flatten() { + pypi_package_names.insert(PackageName::Pypi((name.clone(), Some(extra)))); + } } + pypi_package_names.insert(PackageName::Pypi((name, None))); + } + + // Compute the Pypi marker environment. Only do this if we have pypi dependencies. + let marker_environment = if has_pypi_dependencies { + grouped_repodata_records + .records + .iter() + .find(|r| is_python_record(r)) + .and_then(|record| determine_marker_environment(platform, &record.package_record).ok()) + } else { + None }; - Ok(TaskResult::CondaSolved( - environment.name().clone(), - platform, - records, - )) -} + // Construct a queue of packages that we need to check. + let mut queue = itertools::chain(conda_package_names, pypi_package_names).collect::>(); + let mut queued_names = queue.iter().cloned().collect::>(); + + let mut conda_records = Vec::new(); + let mut pypi_records = HashMap::new(); + while let Some(package) = queue.pop() { + let record = match package { + PackageName::Conda(name) => grouped_repodata_records + .by_name(&name) + .map(PackageRecord::Conda), + PackageName::Pypi((name, extra)) => { + if let Some(found_record) = grouped_pypi_records.by_name(&name) { + Some(PackageRecord::Pypi((found_record, extra))) + } else if let Some((_, _, found_record)) = conda_package_identifiers.get(&name) { + Some(PackageRecord::Conda(found_record)) + } else { + None + } + } + }; -async fn spawn_extract_pypi_environment_task( - environment: Environment<'_>, - platform: Platform, - conda_records: impl Future>, - solve_group_records: impl Future>, -) -> miette::Result { - let group = GroupedEnvironment::from(environment.clone()); - let dependencies = environment.pypi_dependencies(Some(platform)); + let Some(record) = record else { + // If this happens we are missing a dependency from the grouped environment. We + // currently just ignore this. + continue; + }; - let records = match group { - GroupedEnvironment::Environment(_) => { - // For a single environment group we can just clone the Arc. - solve_group_records.await.clone() - } - GroupedEnvironment::Group(_) => { - // Convert all the conda records to package identifiers. - let conda_package_identifiers = conda_records - .await - .records - .iter() - .filter_map(|record| PypiPackageIdentifier::from_record(record).ok()) - .flatten() - .map(|identifier| (identifier.name.as_normalized().clone(), identifier)) - .collect::>(); - - Arc::new( - solve_group_records.await.subset( - dependencies - .into_keys() - .map(|name| name.as_normalized().clone()), - &conda_package_identifiers, - ), - ) + match record { + PackageRecord::Conda(record) => { + // Find all dependencies in the record and add them to the queue. + for dependency in record.package_record.depends.iter() { + let dependency_name = + PackageName::Conda(rattler_conda_types::PackageName::new_unchecked( + dependency.split_once(' ').unwrap_or((&dependency, "")).0, + )); + if queued_names.insert(dependency_name.clone()) { + queue.push(dependency_name); + } + } + + // Store the record itself as part of the subset + conda_records.push(record); + } + PackageRecord::Pypi((record, extra)) => { + // Evaluate all dependencies + let extras = extra.map(|extra| vec![extra]).unwrap_or_default(); + for req in record.0.requires_dist.iter() { + // Evaluate the marker environment with the given extras + if let Some(marker_env) = &marker_environment { + if !req.evaluate_markers(marker_env, &extras) { + continue; + } + } + + // Add the package to the queue + for extra in req.extras.iter() { + if queued_names + .insert(PackageName::Pypi((req.name.clone(), Some(extra.clone())))) + { + queue.push(PackageName::Pypi((req.name.clone(), Some(extra.clone())))); + } + } + + // Also add the dependency without any extras + queue.push(PackageName::Pypi((req.name.clone(), None))); + } + + // Insert the record if it is not already present + pypi_records.entry(record.0.name.clone()).or_insert(record); + } } - }; + } - Ok(TaskResult::PypiSolved( + Ok(TaskResult::ExtractedRecordsSubset( environment.name().clone(), platform, - records, + Arc::new(RepoDataRecordsByName::from_iter( + conda_records.into_iter().cloned(), + )), + Arc::new(PypiRecordsByName::from_iter( + pypi_records.into_values().cloned(), + )), )) } diff --git a/src/project/mod.rs b/src/project/mod.rs index d1b2e7e6b..31ef16822 100644 --- a/src/project/mod.rs +++ b/src/project/mod.rs @@ -163,7 +163,7 @@ impl Project { } /// Loads a project from manifest file. - fn load(manifest_path: &Path) -> miette::Result { + pub fn load(manifest_path: &Path) -> miette::Result { // Determine the parent directory of the manifest file let full_path = dunce::canonicalize(manifest_path).into_diagnostic()?; if full_path.file_name().and_then(OsStr::to_str) != Some(PROJECT_MANIFEST) { diff --git a/tests/non-satisfiability/mismatched-spec/pixi.lock b/tests/non-satisfiability/mismatched-spec/pixi.lock new file mode 100644 index 000000000..f52f8c968 --- /dev/null +++ b/tests/non-satisfiability/mismatched-spec/pixi.lock @@ -0,0 +1,76 @@ +version: 4 +environments: + default: + channels: + - url: https://conda.anaconda.org/conda-forge/ + packages: + win-64: + - conda: https://conda.anaconda.org/conda-forge/win-64/pixi-0.15.2-h7ea99a0_0.conda + - 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-hcf57466_18.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.38.33130-h82b7239_18.conda +packages: +- kind: conda + name: pixi + version: 0.15.2 + build: h7ea99a0_0 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/pixi-0.15.2-h7ea99a0_0.conda + sha256: 663e752ba19bebb97b32ca541cfdeebedfc50664d9423637eda4c9c47343fdbb + md5: 25cf5df2adcc9b411c8c791325f1e8c3 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: BSD-3-Clause + license_family: BSD + size: 7384925 + timestamp: 1709223176184 +- kind: conda + name: ucrt + version: 10.0.22621.0 + build: h57928b3_0 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.22621.0-h57928b3_0.tar.bz2 + sha256: f29cdaf8712008f6b419b8b1a403923b00ab2504bfe0fb2ba8eb60e72d4f14c6 + md5: 72608f6cd3e5898229c3ea16deb1ac43 + constrains: + - vs2015_runtime >=14.29.30037 + license: LicenseRef-Proprietary + license_family: PROPRIETARY + size: 1283972 + timestamp: 1666630199266 +- kind: conda + name: vc + version: '14.3' + build: hcf57466_18 + build_number: 18 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-hcf57466_18.conda + sha256: 447a8d8292a7b2107dcc18afb67f046824711a652725fc0f522c368e7a7b8318 + md5: 20e1e652a4c740fa719002a8449994a2 + depends: + - vc14_runtime >=14.38.33130 + track_features: + - vc14 + license: BSD-3-Clause + license_family: BSD + size: 16977 + timestamp: 1702511255313 +- kind: conda + name: vc14_runtime + version: 14.38.33130 + build: h82b7239_18 + build_number: 18 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.38.33130-h82b7239_18.conda + sha256: bf94c9af4b2e9cba88207001197e695934eadc96a5c5e4cd7597e950aae3d8ff + md5: 8be79fdd2725ddf7bbf8a27a4c1f79ba + depends: + - ucrt >=10.0.20348.0 + constrains: + - vs2015_runtime 14.38.33130.* *_18 + license: LicenseRef-ProprietaryMicrosoft + license_family: Proprietary + size: 749868 + timestamp: 1702511239004 diff --git a/tests/non-satisfiability/mismatched-spec/pixi.toml b/tests/non-satisfiability/mismatched-spec/pixi.toml new file mode 100644 index 000000000..416c0df1b --- /dev/null +++ b/tests/non-satisfiability/mismatched-spec/pixi.toml @@ -0,0 +1,7 @@ +[project] +name = "simple" +channels = ["conda-forge"] +platforms = ["win-64"] + +[dependencies] +pixi = "<0.15.2" diff --git a/tests/non-satisfiability/missing-dependency/pixi.lock b/tests/non-satisfiability/missing-dependency/pixi.lock new file mode 100644 index 000000000..fead1c5d8 --- /dev/null +++ b/tests/non-satisfiability/missing-dependency/pixi.lock @@ -0,0 +1,76 @@ +version: 4 +environments: + default: + channels: + - url: https://conda.anaconda.org/conda-forge/ + packages: + win-64: + - conda: https://conda.anaconda.org/conda-forge/win-64/pixi-0.15.2-h7ea99a0_0.conda + - 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-hcf57466_18.conda + # - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.38.33130-h82b7239_18.conda +packages: +- kind: conda + name: pixi + version: 0.15.2 + build: h7ea99a0_0 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/pixi-0.15.2-h7ea99a0_0.conda + sha256: 663e752ba19bebb97b32ca541cfdeebedfc50664d9423637eda4c9c47343fdbb + md5: 25cf5df2adcc9b411c8c791325f1e8c3 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: BSD-3-Clause + license_family: BSD + size: 7384925 + timestamp: 1709223176184 +- kind: conda + name: ucrt + version: 10.0.22621.0 + build: h57928b3_0 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.22621.0-h57928b3_0.tar.bz2 + sha256: f29cdaf8712008f6b419b8b1a403923b00ab2504bfe0fb2ba8eb60e72d4f14c6 + md5: 72608f6cd3e5898229c3ea16deb1ac43 + constrains: + - vs2015_runtime >=14.29.30037 + license: LicenseRef-Proprietary + license_family: PROPRIETARY + size: 1283972 + timestamp: 1666630199266 +- kind: conda + name: vc + version: '14.3' + build: hcf57466_18 + build_number: 18 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-hcf57466_18.conda + sha256: 447a8d8292a7b2107dcc18afb67f046824711a652725fc0f522c368e7a7b8318 + md5: 20e1e652a4c740fa719002a8449994a2 + depends: + - vc14_runtime >=14.38.33130 + track_features: + - vc14 + license: BSD-3-Clause + license_family: BSD + size: 16977 + timestamp: 1702511255313 +- kind: conda + name: vc14_runtime + version: 14.38.33130 + build: h82b7239_18 + build_number: 18 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.38.33130-h82b7239_18.conda + sha256: bf94c9af4b2e9cba88207001197e695934eadc96a5c5e4cd7597e950aae3d8ff + md5: 8be79fdd2725ddf7bbf8a27a4c1f79ba + depends: + - ucrt >=10.0.20348.0 + constrains: + - vs2015_runtime 14.38.33130.* *_18 + license: LicenseRef-ProprietaryMicrosoft + license_family: Proprietary + size: 749868 + timestamp: 1702511239004 diff --git a/tests/non-satisfiability/missing-dependency/pixi.toml b/tests/non-satisfiability/missing-dependency/pixi.toml new file mode 100644 index 000000000..832361670 --- /dev/null +++ b/tests/non-satisfiability/missing-dependency/pixi.toml @@ -0,0 +1,7 @@ +[project] +name = "simple" +channels = ["conda-forge"] +platforms = ["win-64"] + +[dependencies] +pixi = "*" diff --git a/tests/non-satisfiability/missing-pypi-extra/pixi.lock b/tests/non-satisfiability/missing-pypi-extra/pixi.lock new file mode 100644 index 000000000..190bd3164 --- /dev/null +++ b/tests/non-satisfiability/missing-pypi-extra/pixi.lock @@ -0,0 +1,573 @@ +version: 4 +environments: + default: + channels: + - url: https://conda.anaconda.org/conda-forge/ + packages: + win-64: + - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-hcfcfb64_5.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/ca-certificates-2024.2.2-h56e8100_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.6.1-h63175ca_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.4.2-h8ffe710_5.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.45.1-hcfcfb64_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.2.13-hcfcfb64_5.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.2.1-hcfcfb64_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.12.2-h2628c8c_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h5226925_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda + - 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-hcf57466_18.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.38.33130-h82b7239_18.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vs2015_runtime-14.38.33130-hcb4865c_18.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/xz-5.2.6-h8d14728_0.tar.bz2 + - pypi: https://files.pythonhosted.org/packages/45/86/4736ac618d82a20d87d2f92ae19441ebc7ac9e7a581d7e58bbe79233b24a/asttokens-2.4.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/3e/58/89e5f5a1c4c5b66dc74eabe6337623d53b4d1c27fbbbe16defee53397f60/black-24.2.0-cp312-cp312-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/00/2e/d53fa4befbf2cfa713304affc7ca780ce4fc1fd8710527771b58311a3229/click-8.1.7-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d5/50/83c593b07763e1161326b3b8c6686f0f4b0f24d5526546bee538c89837d6/decorator-5.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/80/03/6ea8b1b2a5ab40a7a60dc464d3daa7aa546e0a74d74a9f8ff551ea7905db/executing-2.0.1-py2.py3-none-any.whl + # - pypi: https://files.pythonhosted.org/packages/2f/4c/a960e920f0566d46084b7dd03888c1fec2a86e9f09dddae3bedfaab1d459/ipython-8.22.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/20/9f/bc63f0f0737ad7a60800bfd472a4836661adae21f9c2535f3957b1e54ceb/jedi-0.19.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f2/51/c34d7a1d528efaae3d8ddb18ef45a41f284eacf9e514523b191b7d0872cc/matplotlib_inline-0.1.6-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2a/e2/5d3f6ada4297caebe1a2add3b126fe800c96f56dbe5d1988a2cbe0b267aa/mypy_extensions-1.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/49/df/1fceb2f8900f8639e278b056416d49134fb8d84c5942ffaa01ad34782422/packaging-24.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/05/63/8011bd08a4111858f79d2b09aad86638490d62fbf881c44e434a6dfca87b/parso-0.8.3-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/cc/20/ff623b09d963f88bfde16306a54e12ee5ea43e9b597108672ff3a408aad6/pathspec-0.12.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/55/72/4898c44ee9ea6f43396fbc23d9bfaf3d06e01b83698bdf2e4c919deceb7c/platformdirs-4.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ee/fd/ca7bf3869e7caa7a037e23078539467b433a4e01eebd93f77180ab927766/prompt_toolkit-3.0.43-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2b/27/77f9d5684e6bce929f5cfe18d6cfbe5133013c06cb2fbf5933670e60761d/pure_eval-0.2.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/97/9c/372fef8377a6e340b1704768d20daaded98bf13282b5327beb2e2fe2c7ef/pygments-2.17.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d9/5a/e7c31adbe875f2abbb91bd84cf2dc52d792b5a01506781dbcf25c91daf11/six-1.16.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8d/35/78f03aa48cfebd13646707f64477bc7eacf1081edcdcd1b4d57cb1b5d0a8/tokenize_rt-5.2.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7c/c4/366a09036c07f46eb8c9b2af39c97f502ef24f11f2a6e4d763655d9f2708/traitlets-5.14.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/fd/84/fd2ba7aafacbad3c4201d395674fc6348826569da3c0937e75505ead3528/wcwidth-0.2.13-py2.py3-none-any.whl +packages: +- kind: pypi + name: asttokens + version: 2.4.1 + url: https://files.pythonhosted.org/packages/45/86/4736ac618d82a20d87d2f92ae19441ebc7ac9e7a581d7e58bbe79233b24a/asttokens-2.4.1-py2.py3-none-any.whl + sha256: 051ed49c3dcae8913ea7cd08e46a606dba30b79993209636c4875bc1d637bc24 + requires_dist: + - six >=1.12.0 + - typing ; python_version < '3.5' + - astroid <2, >=1 ; python_version < '3' and extra == 'astroid' + - astroid <4, >=2 ; python_version >= '3' and extra == 'astroid' + - pytest ; extra == 'test' + - astroid <2, >=1 ; python_version < '3' and extra == 'test' + - astroid <4, >=2 ; python_version >= '3' and extra == 'test' +- kind: pypi + name: black + version: 24.2.0 + url: https://files.pythonhosted.org/packages/3e/58/89e5f5a1c4c5b66dc74eabe6337623d53b4d1c27fbbbe16defee53397f60/black-24.2.0-cp312-cp312-win_amd64.whl + sha256: ba15742a13de85e9b8f3239c8f807723991fbfae24bad92d34a2b12e81904982 + requires_dist: + - click >=8.0.0 + - mypy-extensions >=0.4.3 + - packaging >=22.0 + - pathspec >=0.9.0 + - platformdirs >=2 + - tomli >=1.1.0 ; python_version < '3.11' + - typing-extensions >=4.0.1 ; python_version < '3.11' + - colorama >=0.4.3 ; extra == 'colorama' + - aiohttp !=3.9.0, >=3.7.4 ; (sys_platform == 'win32' and implementation_name == 'pypy') and extra == 'd' + - aiohttp >=3.7.4 ; (sys_platform != 'win32' or implementation_name != 'pypy') and extra == 'd' + - ipython >=7.8.0 ; extra == 'jupyter' + - tokenize-rt >=3.2.0 ; extra == 'jupyter' + - uvloop >=0.15.2 ; extra == 'uvloop' + requires_python: '>=3.8' +- kind: conda + name: bzip2 + version: 1.0.8 + build: hcfcfb64_5 + build_number: 5 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-hcfcfb64_5.conda + sha256: ae5f47a5c86fd6db822931255dcf017eb12f60c77f07dc782ccb477f7808aab2 + md5: 26eb8ca6ea332b675e11704cce84a3be + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: bzip2-1.0.6 + license_family: BSD + size: 124580 + timestamp: 1699280668742 +- kind: conda + name: ca-certificates + version: 2024.2.2 + build: h56e8100_0 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/ca-certificates-2024.2.2-h56e8100_0.conda + sha256: 4d587088ecccd393fec3420b64f1af4ee1a0e6897a45cfd5ef38055322cea5d0 + md5: 63da060240ab8087b60d1357051ea7d6 + license: ISC + size: 155886 + timestamp: 1706843918052 +- kind: pypi + name: click + version: 8.1.7 + url: https://files.pythonhosted.org/packages/00/2e/d53fa4befbf2cfa713304affc7ca780ce4fc1fd8710527771b58311a3229/click-8.1.7-py3-none-any.whl + sha256: ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28 + requires_dist: + - colorama ; platform_system == 'Windows' + - importlib-metadata ; python_version < '3.8' + requires_python: '>=3.7' +- kind: pypi + name: colorama + version: 0.4.6 + url: https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl + sha256: 4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6 + requires_python: '!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7' +- kind: pypi + name: decorator + version: 5.1.1 + url: https://files.pythonhosted.org/packages/d5/50/83c593b07763e1161326b3b8c6686f0f4b0f24d5526546bee538c89837d6/decorator-5.1.1-py3-none-any.whl + sha256: b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186 + requires_python: '>=3.5' +- kind: pypi + name: executing + version: 2.0.1 + url: https://files.pythonhosted.org/packages/80/03/6ea8b1b2a5ab40a7a60dc464d3daa7aa546e0a74d74a9f8ff551ea7905db/executing-2.0.1-py2.py3-none-any.whl + sha256: eac49ca94516ccc753f9fb5ce82603156e590b27525a8bc32cce8ae302eb61bc + requires_dist: + - asttokens >=2.1.0 ; extra == 'tests' + - ipython ; extra == 'tests' + - pytest ; extra == 'tests' + - coverage ; extra == 'tests' + - coverage-enable-subprocess ; extra == 'tests' + - littleutils ; extra == 'tests' + - rich ; python_version >= '3.11' and extra == 'tests' + requires_python: '>=3.5' +- kind: pypi + name: ipython + version: 8.22.2 + url: https://files.pythonhosted.org/packages/2f/4c/a960e920f0566d46084b7dd03888c1fec2a86e9f09dddae3bedfaab1d459/ipython-8.22.2-py3-none-any.whl + sha256: 3c86f284c8f3d8f2b6c662f885c4889a91df7cd52056fd02b7d8d6195d7f56e9 + requires_dist: + - decorator + - jedi >=0.16 + - matplotlib-inline + - prompt-toolkit <3.1.0, >=3.0.41 + - pygments >=2.4.0 + - stack-data + - traitlets >=5.13.0 + - typing-extensions ; python_version < '3.10' + - exceptiongroup ; python_version < '3.11' + - pexpect >4.3 ; sys_platform != 'win32' and sys_platform != 'emscripten' + - colorama ; sys_platform == 'win32' + - ipython[black,doc,kernel,nbconvert,nbformat,notebook,parallel,qtconsole,terminal] ; extra == 'all' + - ipython[test,test-extra] ; extra == 'all' + - black ; extra == 'black' + - ipykernel ; extra == 'doc' + - setuptools >=18.5 ; extra == 'doc' + - sphinx >=1.3 ; extra == 'doc' + - sphinx-rtd-theme ; extra == 'doc' + - sphinxcontrib-jquery ; extra == 'doc' + - docrepr ; extra == 'doc' + - matplotlib ; extra == 'doc' + - stack-data ; extra == 'doc' + - typing-extensions ; extra == 'doc' + - exceptiongroup ; extra == 'doc' + - ipython[test] ; extra == 'doc' + - ipykernel ; extra == 'kernel' + - nbconvert ; extra == 'nbconvert' + - nbformat ; extra == 'nbformat' + - ipywidgets ; extra == 'notebook' + - notebook ; extra == 'notebook' + - ipyparallel ; extra == 'parallel' + - qtconsole ; extra == 'qtconsole' + - pytest <8 ; extra == 'test' + - pytest-asyncio <0.22 ; extra == 'test' + - testpath ; extra == 'test' + - pickleshare ; extra == 'test' + - ipython[test] ; extra == 'test_extra' + - curio ; extra == 'test_extra' + - matplotlib !=3.2.0 ; extra == 'test_extra' + - nbformat ; extra == 'test_extra' + - numpy >=1.23 ; extra == 'test_extra' + - pandas ; extra == 'test_extra' + - trio ; extra == 'test_extra' + requires_python: '>=3.10' +- kind: pypi + name: jedi + version: 0.19.1 + url: https://files.pythonhosted.org/packages/20/9f/bc63f0f0737ad7a60800bfd472a4836661adae21f9c2535f3957b1e54ceb/jedi-0.19.1-py2.py3-none-any.whl + sha256: e983c654fe5c02867aef4cdfce5a2fbb4a50adc0af145f70504238f18ef5e7e0 + requires_dist: + - parso <0.9.0, >=0.8.3 + - jinja2 ==2.11.3 ; extra == 'docs' + - markupsafe ==1.1.1 ; extra == 'docs' + - pygments ==2.8.1 ; extra == 'docs' + - alabaster ==0.7.12 ; extra == 'docs' + - babel ==2.9.1 ; extra == 'docs' + - chardet ==4.0.0 ; extra == 'docs' + - commonmark ==0.8.1 ; extra == 'docs' + - docutils ==0.17.1 ; extra == 'docs' + - future ==0.18.2 ; extra == 'docs' + - idna ==2.10 ; extra == 'docs' + - imagesize ==1.2.0 ; extra == 'docs' + - mock ==1.0.1 ; extra == 'docs' + - packaging ==20.9 ; extra == 'docs' + - pyparsing ==2.4.7 ; extra == 'docs' + - pytz ==2021.1 ; extra == 'docs' + - readthedocs-sphinx-ext ==2.1.4 ; extra == 'docs' + - recommonmark ==0.5.0 ; extra == 'docs' + - requests ==2.25.1 ; extra == 'docs' + - six ==1.15.0 ; extra == 'docs' + - snowballstemmer ==2.1.0 ; extra == 'docs' + - sphinx-rtd-theme ==0.4.3 ; extra == 'docs' + - sphinx ==1.8.5 ; extra == 'docs' + - sphinxcontrib-serializinghtml ==1.1.4 ; extra == 'docs' + - sphinxcontrib-websupport ==1.2.4 ; extra == 'docs' + - urllib3 ==1.26.4 ; extra == 'docs' + - flake8 ==5.0.4 ; extra == 'qa' + - mypy ==0.971 ; extra == 'qa' + - types-setuptools ==67.2.0.1 ; extra == 'qa' + - django ; extra == 'testing' + - attrs ; extra == 'testing' + - colorama ; extra == 'testing' + - docopt ; extra == 'testing' + - pytest <7.0.0 ; extra == 'testing' + requires_python: '>=3.6' +- kind: conda + name: libexpat + version: 2.6.1 + build: h63175ca_0 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.6.1-h63175ca_0.conda + sha256: 160ef43c55806495e8f96fc49ded0ab538c1cde9fdecafa1eb92a568e470ae20 + md5: 6d663a0052380f703665a290e5fbb922 + constrains: + - expat 2.6.1.* + license: MIT + license_family: MIT + size: 139015 + timestamp: 1709746966440 +- kind: conda + name: libffi + version: 3.4.2 + build: h8ffe710_5 + build_number: 5 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/libffi-3.4.2-h8ffe710_5.tar.bz2 + sha256: 1951ab740f80660e9bc07d2ed3aefb874d78c107264fd810f24a1a6211d4b1a5 + md5: 2c96d1b6915b408893f9472569dee135 + depends: + - vc >=14.1,<15.0a0 + - vs2015_runtime >=14.16.27012 + license: MIT + license_family: MIT + size: 42063 + timestamp: 1636489106777 +- kind: conda + name: libsqlite + version: 3.45.1 + build: hcfcfb64_0 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.45.1-hcfcfb64_0.conda + sha256: e1010f4ac7b056d85d91e6cb6137ef118f920eba88059261689e543780b230df + md5: c583c1d6999b7aa148eff3089e13c44b + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: Unlicense + size: 870045 + timestamp: 1707495642340 +- kind: conda + name: libzlib + version: 1.2.13 + build: hcfcfb64_5 + build_number: 5 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.2.13-hcfcfb64_5.conda + sha256: c161822ee8130b71e08b6d282b9919c1de2c5274b29921a867bca0f7d30cad26 + md5: 5fdb9c6a113b6b6cb5e517fd972d5f41 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + constrains: + - zlib 1.2.13 *_5 + license: Zlib + license_family: Other + size: 55800 + timestamp: 1686575452215 +- kind: pypi + name: matplotlib-inline + version: 0.1.6 + url: https://files.pythonhosted.org/packages/f2/51/c34d7a1d528efaae3d8ddb18ef45a41f284eacf9e514523b191b7d0872cc/matplotlib_inline-0.1.6-py3-none-any.whl + sha256: f1f41aab5328aa5aaea9b16d083b128102f8712542f819fe7e6a420ff581b311 + requires_dist: + - traitlets + requires_python: '>=3.5' +- kind: pypi + name: mypy-extensions + version: 1.0.0 + url: https://files.pythonhosted.org/packages/2a/e2/5d3f6ada4297caebe1a2add3b126fe800c96f56dbe5d1988a2cbe0b267aa/mypy_extensions-1.0.0-py3-none-any.whl + sha256: 4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d + requires_python: '>=3.5' +- kind: conda + name: openssl + version: 3.2.1 + build: hcfcfb64_0 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/openssl-3.2.1-hcfcfb64_0.conda + sha256: 1df1c43136f863d5e9ba20b703001caf9a4d0ea56bdc3eeb948c977e3d4f91d3 + md5: 158df8eead8092cf0e27167c8761a8dd + depends: + - ca-certificates + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + constrains: + - pyopenssl >=22.1 + license: Apache-2.0 + license_family: Apache + size: 8229619 + timestamp: 1706638014697 +- kind: pypi + name: packaging + version: '24.0' + url: https://files.pythonhosted.org/packages/49/df/1fceb2f8900f8639e278b056416d49134fb8d84c5942ffaa01ad34782422/packaging-24.0-py3-none-any.whl + sha256: 2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5 + requires_python: '>=3.7' +- kind: pypi + name: parso + version: 0.8.3 + url: https://files.pythonhosted.org/packages/05/63/8011bd08a4111858f79d2b09aad86638490d62fbf881c44e434a6dfca87b/parso-0.8.3-py2.py3-none-any.whl + sha256: c001d4636cd3aecdaf33cbb40aebb59b094be2a74c556778ef5576c175e19e75 + requires_dist: + - flake8 ==3.8.3 ; extra == 'qa' + - mypy ==0.782 ; extra == 'qa' + - docopt ; extra == 'testing' + - pytest <6.0.0 ; extra == 'testing' + requires_python: '>=3.6' +- kind: pypi + name: pathspec + version: 0.12.1 + url: https://files.pythonhosted.org/packages/cc/20/ff623b09d963f88bfde16306a54e12ee5ea43e9b597108672ff3a408aad6/pathspec-0.12.1-py3-none-any.whl + sha256: a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08 + requires_python: '>=3.8' +- kind: pypi + name: platformdirs + version: 4.2.0 + url: https://files.pythonhosted.org/packages/55/72/4898c44ee9ea6f43396fbc23d9bfaf3d06e01b83698bdf2e4c919deceb7c/platformdirs-4.2.0-py3-none-any.whl + sha256: 0614df2a2f37e1a662acbd8e2b25b92ccf8632929bc6d43467e17fe89c75e068 + requires_dist: + - furo >=2023.9.10 ; extra == 'docs' + - proselint >=0.13 ; extra == 'docs' + - sphinx-autodoc-typehints >=1.25.2 ; extra == 'docs' + - sphinx >=7.2.6 ; extra == 'docs' + - appdirs ==1.4.4 ; extra == 'test' + - covdefaults >=2.3 ; extra == 'test' + - pytest-cov >=4.1 ; extra == 'test' + - pytest-mock >=3.12 ; extra == 'test' + - pytest >=7.4.3 ; extra == 'test' + requires_python: '>=3.8' +- kind: pypi + name: prompt-toolkit + version: 3.0.43 + url: https://files.pythonhosted.org/packages/ee/fd/ca7bf3869e7caa7a037e23078539467b433a4e01eebd93f77180ab927766/prompt_toolkit-3.0.43-py3-none-any.whl + sha256: a11a29cb3bf0a28a387fe5122cdb649816a957cd9261dcedf8c9f1fef33eacf6 + requires_dist: + - wcwidth + requires_python: '>=3.7.0' +- kind: pypi + name: pure-eval + version: 0.2.2 + url: https://files.pythonhosted.org/packages/2b/27/77f9d5684e6bce929f5cfe18d6cfbe5133013c06cb2fbf5933670e60761d/pure_eval-0.2.2-py3-none-any.whl + sha256: 01eaab343580944bc56080ebe0a674b39ec44a945e6d09ba7db3cb8cec289350 + requires_dist: + - pytest ; extra == 'tests' +- kind: pypi + name: pygments + version: 2.17.2 + url: https://files.pythonhosted.org/packages/97/9c/372fef8377a6e340b1704768d20daaded98bf13282b5327beb2e2fe2c7ef/pygments-2.17.2-py3-none-any.whl + sha256: b27c2826c47d0f3219f29554824c30c5e8945175d888647acd804ddd04af846c + requires_dist: + - importlib-metadata ; python_version < '3.8' and extra == 'plugins' + - colorama >=0.4.6 ; extra == 'windows-terminal' + requires_python: '>=3.7' +- kind: conda + name: python + version: 3.12.2 + build: h2628c8c_0_cpython + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/python-3.12.2-h2628c8c_0_cpython.conda + sha256: b8eda863b48ae4531635e23fd15e759d93212b6204c6847d591e25fa5fd67477 + md5: be8803e9f75a477df61d4aabea3c1246 + depends: + - bzip2 >=1.0.8,<2.0a0 + - libexpat >=2.5.0,<3.0a0 + - libffi >=3.4,<4.0a0 + - libsqlite >=3.45.1,<4.0a0 + - libzlib >=1.2.13,<1.3.0a0 + - openssl >=3.2.1,<4.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + - xz >=5.2.6,<6.0a0 + constrains: + - python_abi 3.12.* *_cp312 + license: Python-2.0 + size: 16083296 + timestamp: 1708116662336 +- kind: pypi + name: six + version: 1.16.0 + url: https://files.pythonhosted.org/packages/d9/5a/e7c31adbe875f2abbb91bd84cf2dc52d792b5a01506781dbcf25c91daf11/six-1.16.0-py2.py3-none-any.whl + sha256: 8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254 + requires_python: '>=2.7,!=3.0.*,!=3.1.*,!=3.2.*' +- kind: pypi + name: stack-data + version: 0.6.3 + url: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl + sha256: d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695 + requires_dist: + - executing >=1.2.0 + - asttokens >=2.1.0 + - pure-eval + - pytest ; extra == 'tests' + - typeguard ; extra == 'tests' + - pygments ; extra == 'tests' + - littleutils ; extra == 'tests' + - cython ; extra == 'tests' +- kind: conda + name: tk + version: 8.6.13 + build: h5226925_1 + build_number: 1 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h5226925_1.conda + sha256: 2c4e914f521ccb2718946645108c9bd3fc3216ba69aea20c2c3cedbd8db32bb1 + md5: fc048363eb8f03cd1737600a5d08aafe + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: TCL + license_family: BSD + size: 3503410 + timestamp: 1699202577803 +- kind: pypi + name: tokenize-rt + version: 5.2.0 + url: https://files.pythonhosted.org/packages/8d/35/78f03aa48cfebd13646707f64477bc7eacf1081edcdcd1b4d57cb1b5d0a8/tokenize_rt-5.2.0-py2.py3-none-any.whl + sha256: b79d41a65cfec71285433511b50271b05da3584a1da144a0752e9c621a285289 + requires_python: '>=3.8' +- kind: pypi + name: traitlets + version: 5.14.2 + url: https://files.pythonhosted.org/packages/7c/c4/366a09036c07f46eb8c9b2af39c97f502ef24f11f2a6e4d763655d9f2708/traitlets-5.14.2-py3-none-any.whl + sha256: fcdf85684a772ddeba87db2f398ce00b40ff550d1528c03c14dbf6a02003cd80 + requires_dist: + - myst-parser ; extra == 'docs' + - pydata-sphinx-theme ; extra == 'docs' + - sphinx ; extra == 'docs' + - argcomplete >=3.0.3 ; extra == 'test' + - mypy >=1.7.0 ; extra == 'test' + - pre-commit ; extra == 'test' + - pytest-mock ; extra == 'test' + - pytest-mypy-testing ; extra == 'test' + - pytest <8.1, >=7.0 ; extra == 'test' + requires_python: '>=3.8' +- kind: conda + name: tzdata + version: 2024a + build: h0c530f3_0 + subdir: noarch + noarch: generic + url: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda + sha256: 7b2b69c54ec62a243eb6fba2391b5e443421608c3ae5dbff938ad33ca8db5122 + md5: 161081fc7cec0bfda0d86d7cb595f8d8 + license: LicenseRef-Public-Domain + size: 119815 + timestamp: 1706886945727 +- kind: conda + name: ucrt + version: 10.0.22621.0 + build: h57928b3_0 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.22621.0-h57928b3_0.tar.bz2 + sha256: f29cdaf8712008f6b419b8b1a403923b00ab2504bfe0fb2ba8eb60e72d4f14c6 + md5: 72608f6cd3e5898229c3ea16deb1ac43 + constrains: + - vs2015_runtime >=14.29.30037 + license: LicenseRef-Proprietary + license_family: PROPRIETARY + size: 1283972 + timestamp: 1666630199266 +- kind: conda + name: vc + version: '14.3' + build: hcf57466_18 + build_number: 18 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-hcf57466_18.conda + sha256: 447a8d8292a7b2107dcc18afb67f046824711a652725fc0f522c368e7a7b8318 + md5: 20e1e652a4c740fa719002a8449994a2 + depends: + - vc14_runtime >=14.38.33130 + track_features: + - vc14 + license: BSD-3-Clause + license_family: BSD + size: 16977 + timestamp: 1702511255313 +- kind: conda + name: vc14_runtime + version: 14.38.33130 + build: h82b7239_18 + build_number: 18 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.38.33130-h82b7239_18.conda + sha256: bf94c9af4b2e9cba88207001197e695934eadc96a5c5e4cd7597e950aae3d8ff + md5: 8be79fdd2725ddf7bbf8a27a4c1f79ba + depends: + - ucrt >=10.0.20348.0 + constrains: + - vs2015_runtime 14.38.33130.* *_18 + license: LicenseRef-ProprietaryMicrosoft + license_family: Proprietary + size: 749868 + timestamp: 1702511239004 +- kind: conda + name: vs2015_runtime + version: 14.38.33130 + build: hcb4865c_18 + build_number: 18 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/vs2015_runtime-14.38.33130-hcb4865c_18.conda + sha256: a2fec221f361d6263c117f4ea6d772b21c90a2f8edc6f3eb0eadec6bfe8843db + md5: 10d42885e3ed84e575b454db30f1aa93 + depends: + - vc14_runtime >=14.38.33130 + license: BSD-3-Clause + license_family: BSD + size: 16988 + timestamp: 1702511261442 +- kind: pypi + name: wcwidth + version: 0.2.13 + url: https://files.pythonhosted.org/packages/fd/84/fd2ba7aafacbad3c4201d395674fc6348826569da3c0937e75505ead3528/wcwidth-0.2.13-py2.py3-none-any.whl + sha256: 3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859 + requires_dist: + - backports-functools-lru-cache >=1.2.1 ; python_version < '3.2' +- kind: conda + name: xz + version: 5.2.6 + build: h8d14728_0 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/xz-5.2.6-h8d14728_0.tar.bz2 + sha256: 54d9778f75a02723784dc63aff4126ff6e6749ba21d11a6d03c1f4775f269fe0 + md5: 515d77642eaa3639413c6b1bc3f94219 + depends: + - vc >=14.1,<15 + - vs2015_runtime >=14.16.27033 + license: LGPL-2.1 and GPL-2.0 + size: 217804 + timestamp: 1660346976440 diff --git a/tests/non-satisfiability/missing-pypi-extra/pixi.toml b/tests/non-satisfiability/missing-pypi-extra/pixi.toml new file mode 100644 index 000000000..898fc00bd --- /dev/null +++ b/tests/non-satisfiability/missing-pypi-extra/pixi.toml @@ -0,0 +1,10 @@ +[project] +name = "missing-pypi-extra" +channels = ["conda-forge"] +platforms = ["win-64"] + +[dependencies] +python = "*" + +[pypi-dependencies] +black = { version = "*", extras = ["jupyter"] } diff --git a/tests/non-satisfiability/solve-groups-pypi/pixi.lock b/tests/non-satisfiability/solve-groups-pypi/pixi.lock new file mode 100644 index 000000000..cc934421a --- /dev/null +++ b/tests/non-satisfiability/solve-groups-pypi/pixi.lock @@ -0,0 +1,2308 @@ +version: 4 +environments: + default: + channels: + - url: https://conda.anaconda.org/conda-forge/ + packages: + win-64: + - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-hcfcfb64_5.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/ca-certificates-2024.2.2-h56e8100_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.6.1-h63175ca_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.4.2-h8ffe710_5.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.45.1-hcfcfb64_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.2.13-hcfcfb64_5.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.2.1-hcfcfb64_0.conda + # - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.11.8-h2628c8c_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h5226925_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda + - 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-hcf57466_18.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.38.33130-h82b7239_18.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vs2015_runtime-14.38.33130-hcb4865c_18.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/xz-5.2.6-h8d14728_0.tar.bz2 + - pypi: https://files.pythonhosted.org/packages/ca/2a/d197a412ec474391ee878b1218cf2fe9c6e963903755887fc5654c06636a/contourpy-1.2.0-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ea/69/89f4bb69e28bb293b95abb0a66d49a841580451a584adb1aba59f39b6dff/fonttools-4.49.0-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/1e/37/d3c2d4ba2719059a0f12730947bbe1ad5ee8bff89e8c35319dcb2c9ddb4c/kiwisolver-1.4.5-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/a1/27/8a807464b0cf47fdf3ba8cbb542d4f3a551da0254d7588667857f8a8a88a/matplotlib-3.8.3-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/3f/6b/5610004206cf7f8e7ad91c5a85a8c71b2f2f8051a0c0c4d5916b76d6cbb2/numpy-1.26.4-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/43/56/f92715a873187b5eff72a4a0d2ac6258e18e9bfb0e136aafde65c49a841a/pillow-10.2.0-cp311-cp311-win_amd64.whl + dev: + channels: + - url: https://conda.anaconda.org/conda-forge/ + packages: + win-64: + - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.6.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-23.2.0-pyh71513ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/aws-sam-translator-1.86.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/aws-xray-sdk-2.13.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/bcrypt-4.1.2-py311hc37eb10_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/blinker-1.7.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/boto3-1.34.60-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/botocore-1.34.60-pyge310_1234567_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/brotli-python-1.1.0-py311h12c1d0e_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-hcfcfb64_5.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/ca-certificates-2024.2.2-h56e8100_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2024.2.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/cffi-1.16.0-py311ha68e1ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cfn-lint-0.86.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.3.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-win_pyh7428d3b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/cryptography-42.0.5-py311h28e9c30_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/docker-py-7.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ecdsa-0.18.0-pyhd8ed1ab_1.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/flask-3.0.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/flask_cors-3.0.10-pyhd3deb0d_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/gmpy2-2.1.2-py311h419b2c2_1.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/graphql-core-3.2.3-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-7.0.2-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-7.0.2-hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.1.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/itsdangerous-2.1.2-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jmespath-1.0.1-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/joserfc-0.9.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jschema-to-python-1.2.3-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/jsondiff-2.0.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/jsonpatch-1.33-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jsonpickle-3.0.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/jsonpointer-2.4-py311h1ea47a8_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.21.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-path-0.3.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2023.7.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/junit-xml-1.9-pyh9f0ad1d_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/lazy-object-proxy-1.10.0-py311ha68e1ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.6.1-h63175ca_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.4.2-h8ffe710_5.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.45.1-hcfcfb64_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.2.13-hcfcfb64_5.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/markupsafe-2.1.5-py311ha68e1ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/moto-5.0.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/mpc-1.3.1-h4ff82f8_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/mpfr-4.2.1-h64bf75a_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/mpir-3.0.0-he025d50_1002.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/openapi-schema-validator-0.6.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/openapi-spec-validator-0.7.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.2.1-hcfcfb64_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/paramiko-3.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathable-0.4.3-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/pbr-6.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pip-24.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pkgutil-resolve-name-1.3.10-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyasn1-0.5.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.21-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.6.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pydantic-core-2.16.3-py311hc37eb10_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pynacl-1.5.0-py311hd53affc_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyh0701188_6.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.11.8-h2628c8c_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-jose-3.3.0-pyh6c4a22f_1.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/python_abi-3.11-4_cp311.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pywin32-306-py311h12c1d0e_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pywin32-on-windows-0.1.0-pyh07e9846_2.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/pyyaml-6.0.1-py311ha68e1ae_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.30.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/regex-2023.12.25-py311ha68e1ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/responses-0.25.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/rpds-py-0.18.0-py311hc37eb10_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rsa-4.9-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/s3transfer-0.10.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sarif-om-1.0.4-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-69.1.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/sshpubkeys-3.3.1-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/sympy-1.12-pyh04b8f61_3.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h5226925_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/types-pyyaml-6.0.12.20240311-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.10.0-hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.10.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda + - 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/noarch/urllib3-2.0.7-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-hcf57466_18.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.38.33130-h82b7239_18.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vs2015_runtime-14.38.33130-hcb4865c_18.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.7.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/werkzeug-3.0.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/wheel-0.42.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/win_inet_pton-1.1.0-pyhd8ed1ab_6.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/wrapt-1.16.0-py311ha68e1ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/xmltodict-0.13.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/xz-5.2.6-h8d14728_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/yaml-0.2.5-h8ffe710_2.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.17.0-pyhd8ed1ab_0.conda + - pypi: https://files.pythonhosted.org/packages/ca/2a/d197a412ec474391ee878b1218cf2fe9c6e963903755887fc5654c06636a/contourpy-1.2.0-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ea/69/89f4bb69e28bb293b95abb0a66d49a841580451a584adb1aba59f39b6dff/fonttools-4.49.0-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/1e/37/d3c2d4ba2719059a0f12730947bbe1ad5ee8bff89e8c35319dcb2c9ddb4c/kiwisolver-1.4.5-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/a1/27/8a807464b0cf47fdf3ba8cbb542d4f3a551da0254d7588667857f8a8a88a/matplotlib-3.8.3-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/3f/6b/5610004206cf7f8e7ad91c5a85a8c71b2f2f8051a0c0c4d5916b76d6cbb2/numpy-1.26.4-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/43/56/f92715a873187b5eff72a4a0d2ac6258e18e9bfb0e136aafde65c49a841a/pillow-10.2.0-cp311-cp311-win_amd64.whl +packages: +- kind: conda + name: annotated-types + version: 0.6.0 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.6.0-pyhd8ed1ab_0.conda + sha256: 3a2c98154d95cfd54daba6b7d507d31f5ba07ac2ad955c44eb041b66563193cd + md5: 997c29372bdbe2afee073dff71f35923 + depends: + - python >=3.7 + - typing-extensions >=4.0.0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/annotated-types + size: 17026 + timestamp: 1696634393637 +- kind: conda + name: attrs + version: 23.2.0 + build: pyh71513ae_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/attrs-23.2.0-pyh71513ae_0.conda + sha256: 77c7d03bdb243a048fff398cedc74327b7dc79169ebe3b4c8448b0331ea55fea + md5: 5e4c0743c70186509d1412e03c2d8dfa + depends: + - python >=3.7 + license: MIT + license_family: MIT + purls: + - pkg:pypi/attrs + size: 54582 + timestamp: 1704011393776 +- kind: conda + name: aws-sam-translator + version: 1.86.0 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/aws-sam-translator-1.86.0-pyhd8ed1ab_0.conda + sha256: f1205b9438e8947fc0a3b70eabe07e6ef25c2bc228edb2ca3a26010c5f0a2e71 + md5: 250e721935d1b8feb2a17f24120c5e06 + depends: + - boto3 >=1.19.5 + - jsonschema <5,>=3.2 + - pydantic >=1.8,<3 + - python >=3.7,<4.0 + - typing-extensions >=4.4 + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/aws-sam-translator + size: 257073 + timestamp: 1709910495881 +- kind: conda + name: aws-xray-sdk + version: 2.13.0 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/aws-xray-sdk-2.13.0-pyhd8ed1ab_0.conda + sha256: dd6556c48140a316914a7ea06d1003aabdf08a6d790e695ca57e98c9b97772fc + md5: 9e44d239f6f7ed151b095268d8f4aa85 + depends: + - botocore >=1.11.3 + - python >=3.7 + - wrapt + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/aws-xray-sdk + size: 73047 + timestamp: 1709810601937 +- kind: conda + name: bcrypt + version: 4.1.2 + build: py311hc37eb10_0 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/bcrypt-4.1.2-py311hc37eb10_0.conda + sha256: a4fe67a2a67181275a06cc451c0fc9f99a9f8f285de3912b869e562be2bd5aa7 + md5: 0d43e07d003f3682e16af18a1fb0fe5f + depends: + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/bcrypt + size: 151190 + timestamp: 1702664837466 +- kind: conda + name: blinker + version: 1.7.0 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/blinker-1.7.0-pyhd8ed1ab_0.conda + sha256: c8d72c2af4f57898dfd5e4c62ae67f7fea1490a37c8b6855460a170d61591177 + md5: 550da20b2c2e38be9cc44bb819fda5d5 + depends: + - python >=3.8 + license: MIT + license_family: MIT + purls: + - pkg:pypi/blinker + size: 17886 + timestamp: 1698890303249 +- kind: conda + name: boto3 + version: 1.34.60 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/boto3-1.34.60-pyhd8ed1ab_0.conda + sha256: 9c84229bf02f473c0d53bcc0b5b96a907e7ab3e8a28942422b3523fa9f19541c + md5: 93ec2ce8c14b96b7f30d61b4cab15287 + depends: + - botocore >=1.34.60,<1.35.0 + - jmespath >=0.7.1,<2.0.0 + - python >=3.8 + - s3transfer >=0.10.0,<0.11.0 + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/boto3 + size: 80888 + timestamp: 1710202861396 +- kind: conda + name: botocore + version: 1.34.60 + build: pyge310_1234567_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/botocore-1.34.60-pyge310_1234567_0.conda + sha256: 81875a2f8a1731b06ab032e91b59aa776b4a1f3b9374a6da2c59b43dce200c7b + md5: 2c231e36b650a4a9e00f38563d0989a0 + depends: + - jmespath >=0.7.1,<2.0.0 + - python >=3.10 + - python-dateutil >=2.1,<3.0.0 + - urllib3 >=1.25.4,<2.1 + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/botocore + size: 6832221 + timestamp: 1710199491937 +- kind: conda + name: brotli-python + version: 1.1.0 + build: py311h12c1d0e_1 + build_number: 1 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/brotli-python-1.1.0-py311h12c1d0e_1.conda + sha256: 5390e1e5e8e159d4893ecbfd2c08ca75ef51bdce1a4a44ff4ee9e2d596004aac + md5: 42fbf4e947c17ea605e6a4d7f526669a + depends: + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + constrains: + - libbrotlicommon 1.1.0 hcfcfb64_1 + license: MIT + license_family: MIT + size: 322086 + timestamp: 1695990976742 +- kind: conda + name: bzip2 + version: 1.0.8 + build: hcfcfb64_5 + build_number: 5 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-hcfcfb64_5.conda + sha256: ae5f47a5c86fd6db822931255dcf017eb12f60c77f07dc782ccb477f7808aab2 + md5: 26eb8ca6ea332b675e11704cce84a3be + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: bzip2-1.0.6 + license_family: BSD + size: 124580 + timestamp: 1699280668742 +- kind: conda + name: ca-certificates + version: 2024.2.2 + build: h56e8100_0 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/ca-certificates-2024.2.2-h56e8100_0.conda + sha256: 4d587088ecccd393fec3420b64f1af4ee1a0e6897a45cfd5ef38055322cea5d0 + md5: 63da060240ab8087b60d1357051ea7d6 + license: ISC + size: 155886 + timestamp: 1706843918052 +- kind: conda + name: certifi + version: 2024.2.2 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/certifi-2024.2.2-pyhd8ed1ab_0.conda + sha256: f1faca020f988696e6b6ee47c82524c7806380b37cfdd1def32f92c326caca54 + md5: 0876280e409658fc6f9e75d035960333 + depends: + - python >=3.7 + license: ISC + size: 160559 + timestamp: 1707022289175 +- kind: conda + name: cffi + version: 1.16.0 + build: py311ha68e1ae_0 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/cffi-1.16.0-py311ha68e1ae_0.conda + sha256: eb7463fe3785dd9ac0b3b1e5fea3b721d20eb082e194cab0af8d9ff28c28934f + md5: d109d6e767c4890ea32880b8bfa4a3b6 + depends: + - pycparser + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: MIT + license_family: MIT + size: 297043 + timestamp: 1696002186279 +- kind: conda + name: cfn-lint + version: 0.86.0 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/cfn-lint-0.86.0-pyhd8ed1ab_0.conda + sha256: 18b972f8ed1ede9a6c8aade643180f4fceb45c2d4b24632bf1deb795cf07b732 + md5: d2b123d03e90c526da05a58d32c1ccc9 + depends: + - aws-sam-translator >=1.85.0 + - jschema-to-python >=1.2.3,<1.3.dev0 + - jsonpatch + - jsonschema >=3.0,<5 + - junit-xml >=1.9,<2.dev0 + - networkx >=2.4,<4 + - python >=3.7,<4.0 + - pyyaml >5.4 + - regex >=2021.7.1 + - sarif-om >=1.0.4,<1.1.dev0 + - sympy >=1.0.0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/cfn-lint + size: 1035427 + timestamp: 1709599282518 +- kind: conda + name: charset-normalizer + version: 3.3.2 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.3.2-pyhd8ed1ab_0.conda + sha256: 20cae47d31fdd58d99c4d2e65fbdcefa0b0de0c84e455ba9d6356a4bdbc4b5b9 + md5: 7f4a9e3fcff3f6356ae99244a014da6a + depends: + - python >=3.7 + license: MIT + license_family: MIT + purls: + - pkg:pypi/charset-normalizer + size: 46597 + timestamp: 1698833765762 +- kind: conda + name: click + version: 8.1.7 + build: win_pyh7428d3b_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-win_pyh7428d3b_0.conda + sha256: 90236b113b9a20041736e80b80ee965167f9aac0468315c55e2bad902d673fb0 + md5: 3549ecbceb6cd77b91a105511b7d0786 + depends: + - __win + - colorama + - python >=3.8 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/click + size: 85051 + timestamp: 1692312207348 +- kind: conda + name: colorama + version: 0.4.6 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2 + sha256: 2c1b2e9755ce3102bca8d69e8f26e4f087ece73f50418186aee7c74bef8e1698 + md5: 3faab06a954c2a04039983f2c4a50d99 + depends: + - python >=3.7 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/colorama + size: 25170 + timestamp: 1666700778190 +- kind: pypi + name: contourpy + version: 1.2.0 + url: https://files.pythonhosted.org/packages/ca/2a/d197a412ec474391ee878b1218cf2fe9c6e963903755887fc5654c06636a/contourpy-1.2.0-cp311-cp311-win_amd64.whl + sha256: 99ad97258985328b4f207a5e777c1b44a83bfe7cf1f87b99f9c11d4ee477c4de + requires_dist: + - numpy <2.0, >=1.20 + - furo ; extra == 'docs' + - sphinx >=7.2 ; extra == 'docs' + - sphinx-copybutton ; extra == 'docs' + - bokeh ; extra == 'bokeh' + - selenium ; extra == 'bokeh' + - contourpy[bokeh,docs] ; extra == 'mypy' + - docutils-stubs ; extra == 'mypy' + - mypy ==1.6.1 ; extra == 'mypy' + - types-pillow ; extra == 'mypy' + - contourpy[test-no-images] ; extra == 'test' + - matplotlib ; extra == 'test' + - pillow ; extra == 'test' + - pytest ; extra == 'test-no-images' + - pytest-cov ; extra == 'test-no-images' + - pytest-xdist ; extra == 'test-no-images' + - wurlitzer ; extra == 'test-no-images' + requires_python: '>=3.9' +- kind: conda + name: cryptography + version: 42.0.5 + build: py311h28e9c30_0 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/cryptography-42.0.5-py311h28e9c30_0.conda + sha256: c4aff2311f4e6a19e8ade41b826d2bd705ed95a0760d9bd734382fdcc251309a + md5: e51206d9da67379e8226173484f9b6a7 + depends: + - cffi >=1.12 + - openssl >=3.2.1,<4.0a0 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: Apache-2.0 AND BSD-3-Clause AND PSF-2.0 AND MIT + license_family: BSD + size: 1163078 + timestamp: 1708781139715 +- kind: pypi + name: cycler + version: 0.12.1 + url: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl + sha256: 85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30 + requires_dist: + - ipython ; extra == 'docs' + - matplotlib ; extra == 'docs' + - numpydoc ; extra == 'docs' + - sphinx ; extra == 'docs' + - pytest ; extra == 'tests' + - pytest-cov ; extra == 'tests' + - pytest-xdist ; extra == 'tests' + requires_python: '>=3.8' +- kind: conda + name: docker-py + version: 7.0.0 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/docker-py-7.0.0-pyhd8ed1ab_0.conda + sha256: b9bf5990dc968123e5817096daddd2105857cfd4c5b94c0937d929bc74fc7a31 + md5: aec5f308cb9055e83c59afecd5fcb58a + depends: + - packaging >=14.0 + - paramiko >=2.4.3 + - python >=3.7 + - pywin32-on-windows + - requests >=2.26.0 + - urllib3 >=1.26.0 + - websocket-client >=0.32.0 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/docker + size: 103474 + timestamp: 1702081626157 +- kind: conda + name: ecdsa + version: 0.18.0 + build: pyhd8ed1ab_1 + build_number: 1 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/ecdsa-0.18.0-pyhd8ed1ab_1.tar.bz2 + sha256: 7770998e7b1ad6b80d1c3ffa71ae3f8812260676f0268d339abe32879115bc0c + md5: 566165664cc0964a7202dc239af6619d + depends: + - gmpy2 + - python >=3.3 + - six >=1.9.0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/ecdsa + size: 122345 + timestamp: 1657437614057 +- kind: conda + name: flask + version: 3.0.2 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/flask-3.0.2-pyhd8ed1ab_0.conda + sha256: d5bfe0e74b001572135bef51ffa329fa2f5dfd37fb87b2878ed851025ced9334 + md5: 7f88df670921cc31c309719e30c22021 + depends: + - blinker >=1.6.2 + - click >=8.1.3 + - importlib-metadata >=3.6.0 + - itsdangerous >=2.1.2 + - jinja2 >=3.1.2 + - python >=3.8 + - werkzeug >=3.0.0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/flask + size: 80485 + timestamp: 1707044052869 +- kind: conda + name: flask_cors + version: 3.0.10 + build: pyhd3deb0d_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/flask_cors-3.0.10-pyhd3deb0d_0.tar.bz2 + sha256: 0ffe072bf8b7bfdbb3a2e6f41cd65264259a92a77db3fb3ffc4e74f3eee2ea4d + md5: f06be6d2d27dc3ea2b3da84ade76583c + depends: + - flask >=0.9 + - python + - six + license: MIT + license_family: MIT + purls: + - pkg:pypi/flask-cors + size: 15089 + timestamp: 1609901852949 +- kind: pypi + name: fonttools + version: 4.49.0 + url: https://files.pythonhosted.org/packages/ea/69/89f4bb69e28bb293b95abb0a66d49a841580451a584adb1aba59f39b6dff/fonttools-4.49.0-cp311-cp311-win_amd64.whl + sha256: fc11e5114f3f978d0cea7e9853627935b30d451742eeb4239a81a677bdee6bf6 + requires_dist: + - fs <3, >=2.2.0 ; extra == 'all' + - lxml >=4.0 ; extra == 'all' + - zopfli >=0.1.4 ; extra == 'all' + - lz4 >=1.7.4.2 ; extra == 'all' + - pycairo ; extra == 'all' + - matplotlib ; extra == 'all' + - sympy ; extra == 'all' + - skia-pathops >=0.5.0 ; extra == 'all' + - uharfbuzz >=0.23.0 ; extra == 'all' + - brotlicffi >=0.8.0 ; platform_python_implementation != 'CPython' and extra == 'all' + - scipy ; platform_python_implementation != 'PyPy' and extra == 'all' + - brotli >=1.0.1 ; platform_python_implementation == 'CPython' and extra == 'all' + - munkres ; platform_python_implementation == 'PyPy' and extra == 'all' + - unicodedata2 >=15.1.0 ; python_version <= '3.12' and extra == 'all' + - xattr ; sys_platform == 'darwin' and extra == 'all' + - lz4 >=1.7.4.2 ; extra == 'graphite' + - pycairo ; extra == 'interpolatable' + - scipy ; platform_python_implementation != 'PyPy' and extra == 'interpolatable' + - munkres ; platform_python_implementation == 'PyPy' and extra == 'interpolatable' + - lxml >=4.0 ; extra == 'lxml' + - skia-pathops >=0.5.0 ; extra == 'pathops' + - matplotlib ; extra == 'plot' + - uharfbuzz >=0.23.0 ; extra == 'repacker' + - sympy ; extra == 'symfont' + - xattr ; sys_platform == 'darwin' and extra == 'type1' + - fs <3, >=2.2.0 ; extra == 'ufo' + - unicodedata2 >=15.1.0 ; python_version <= '3.12' and extra == 'unicode' + - zopfli >=0.1.4 ; extra == 'woff' + - brotlicffi >=0.8.0 ; platform_python_implementation != 'CPython' and extra == 'woff' + - brotli >=1.0.1 ; platform_python_implementation == 'CPython' and extra == 'woff' + requires_python: '>=3.8' +- kind: conda + name: gmpy2 + version: 2.1.2 + build: py311h419b2c2_1 + build_number: 1 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/gmpy2-2.1.2-py311h419b2c2_1.tar.bz2 + sha256: 7c31e5ed9070e2d5c9ca8490443a77009fa75dab112706b04f180516e4067eff + md5: 590703891acc83654ced4d914e88af84 + depends: + - mpc >=1.2.1,<2.0a0 + - mpfr >=4.1.0,<5.0a0 + - mpir >=3.0.0,<4.0a0 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vs2015_runtime >=14.29.30139 + license: LGPL-3.0-or-later + license_family: LGPL + purls: + - pkg:pypi/gmpy2 + size: 165009 + timestamp: 1666810762174 +- kind: conda + name: graphql-core + version: 3.2.3 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/graphql-core-3.2.3-pyhd8ed1ab_0.tar.bz2 + sha256: 6f7da913ecad98951cadfe512af2c3979fbff752bf714da66760701e5463dd29 + md5: 87cafe8c7638a5ac6fd8ec8fb01f1508 + depends: + - python >=3.6 + - typing_extensions >=4,<5 + license: MIT + license_family: MIT + purls: + - pkg:pypi/graphql-core + size: 366839 + timestamp: 1663938476477 +- kind: conda + name: idna + version: '3.6' + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/idna-3.6-pyhd8ed1ab_0.conda + sha256: 6ee4c986d69ce61e60a20b2459b6f2027baeba153f0a64995fd3cb47c2cc7e07 + md5: 1a76f09108576397c41c0b0c5bd84134 + depends: + - python >=3.6 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/idna + size: 50124 + timestamp: 1701027126206 +- kind: conda + name: importlib-metadata + version: 7.0.2 + build: pyha770c72_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-7.0.2-pyha770c72_0.conda + sha256: 9a26136d2cc81ccac209d6ae24281ceba3365fe34e34b2c45570f2a96e9d9c1b + md5: b050a4bb0e90ebd6e7fa4093d6346867 + depends: + - python >=3.8 + - zipp >=0.5 + license: Apache-2.0 + license_family: APACHE + size: 26900 + timestamp: 1709821273570 +- kind: conda + name: importlib_metadata + version: 7.0.2 + build: hd8ed1ab_0 + subdir: noarch + noarch: generic + url: https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-7.0.2-hd8ed1ab_0.conda + sha256: b250e6a3e741b762bb2caf05119feb6245cb41b468542e5a9263cd01671098f7 + md5: d11132727a247f2c1998779a2af743a1 + depends: + - importlib-metadata >=7.0.2,<7.0.3.0a0 + license: Apache-2.0 + license_family: APACHE + size: 9439 + timestamp: 1709821278370 +- kind: conda + name: importlib_resources + version: 6.1.3 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.1.3-pyhd8ed1ab_0.conda + sha256: d651911f327987a32626e06efdc4719f5880f6e5db84a075fad6b344b7652fe8 + md5: b865eadcceebf641fa833ee086756e8b + depends: + - python >=3.8 + - zipp >=3.1.0 + constrains: + - importlib-resources >=6.1.3,<6.1.4.0a0 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/importlib-resources + size: 30666 + timestamp: 1709821283746 +- kind: conda + name: itsdangerous + version: 2.1.2 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/itsdangerous-2.1.2-pyhd8ed1ab_0.tar.bz2 + sha256: 31e3492686b4e92b53db9b48bc0eb03873b1caaf28629fee7d2d47627a2c56d3 + md5: 3c3de74912f11d2b590184f03c7cd09b + depends: + - python >=3.7 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/itsdangerous + size: 16377 + timestamp: 1648147263536 +- kind: conda + name: jinja2 + version: 3.1.3 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.3-pyhd8ed1ab_0.conda + sha256: fd517b7dd3a61eca34f8a6f9f92f306397149cae1204fce72ac3d227107dafdc + md5: e7d8df6509ba635247ff9aea31134262 + depends: + - markupsafe >=2.0 + - python >=3.7 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/jinja2 + size: 111589 + timestamp: 1704967140287 +- kind: conda + name: jmespath + version: 1.0.1 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/jmespath-1.0.1-pyhd8ed1ab_0.tar.bz2 + sha256: 95ac5f9ee95fd4e34dc051746fc86016d3d4f6abefed113e2ede049d59ec2991 + md5: 2cfa3e1cf3fb51bb9b17acc5b5e9ea11 + depends: + - python >=3.7 + license: MIT + license_family: MIT + purls: + - pkg:pypi/jmespath + size: 21003 + timestamp: 1655568358125 +- kind: conda + name: joserfc + version: 0.9.0 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/joserfc-0.9.0-pyhd8ed1ab_0.conda + sha256: a4283e21281679c54b8d4eb5b6992c22078fbbfced8250d629d1f76834778ae8 + md5: be29c638909641ea369e91e0d53bc04e + depends: + - cryptography + - python >=3.8 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/joserfc + size: 45743 + timestamp: 1710064274693 +- kind: conda + name: jschema-to-python + version: 1.2.3 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/jschema-to-python-1.2.3-pyhd8ed1ab_0.tar.bz2 + sha256: 244f9103888438b57ab9f4aac7a8aba8db19947267fd2ddbdaa2222c39f6c8a9 + md5: 686ca7c72f9583791fe424600987411f + depends: + - attrs + - jsonpickle + - pbr + - python >=3.6 + license: MIT + license_family: MIT + purls: + - pkg:pypi/jschema-to-python + size: 11963 + timestamp: 1637091554664 +- kind: conda + name: jsondiff + version: 2.0.0 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/jsondiff-2.0.0-pyhd8ed1ab_0.tar.bz2 + sha256: 04e6b6fbec9e262781c5c753cee5c6baf5e22767242ec3db54d2208463814df1 + md5: 737c0737e5d262688097097534fb1bd5 + depends: + - python >=3.6 + license: MIT + license_family: MIT + purls: + - pkg:pypi/jsondiff + size: 10412 + timestamp: 1649613086031 +- kind: conda + name: jsonpatch + version: '1.33' + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/jsonpatch-1.33-pyhd8ed1ab_0.conda + sha256: fbb17e33ace3225c6416d1604637c1058906b8223da968cc015128985336b2b4 + md5: bfdb7c5c6ad1077c82a69a8642c87aff + depends: + - jsonpointer >=1.9 + - python >=3.8 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/jsonpatch + size: 17366 + timestamp: 1695536420928 +- kind: conda + name: jsonpickle + version: 3.0.2 + build: pyhd8ed1ab_1 + build_number: 1 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/jsonpickle-3.0.2-pyhd8ed1ab_1.conda + sha256: c947f2a64e4f06c722973894afb8e26df3aa2212e2e742def3506ccbad42141b + md5: f351864256e291b24b5a3bedda184bff + depends: + - importlib_metadata + - python >=3.7 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/jsonpickle + size: 39358 + timestamp: 1697667677996 +- kind: conda + name: jsonpointer + version: '2.4' + build: py311h1ea47a8_3 + build_number: 3 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/jsonpointer-2.4-py311h1ea47a8_3.conda + sha256: 13042586b08e8caa60615e7c42d05601f9421e8bda5df932e3ef9d2401bf2435 + md5: db8fc59f9215e668e602f769d0bf67bb + depends: + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/jsonpointer + size: 34654 + timestamp: 1695397742357 +- kind: conda + name: jsonschema + version: 4.21.1 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.21.1-pyhd8ed1ab_0.conda + sha256: c5c1b4e08e91fdd697289015be1a176409b4e63942899a43b276f1f250be8129 + md5: 8a3a3d01629da20befa340919e3dd2c4 + depends: + - attrs >=22.2.0 + - importlib_resources >=1.4.0 + - jsonschema-specifications >=2023.03.6 + - pkgutil-resolve-name >=1.3.10 + - python >=3.8 + - referencing >=0.28.4 + - rpds-py >=0.7.1 + license: MIT + license_family: MIT + size: 72817 + timestamp: 1705707712082 +- kind: conda + name: jsonschema-path + version: 0.3.2 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/jsonschema-path-0.3.2-pyhd8ed1ab_0.conda + sha256: 37d650a156a086a113be9ae917ba9737000be54e8939edd25e8d9f6fdd208bf2 + md5: 397d8d6ea406285f184534976f5bc9ae + depends: + - pathable >=0.4.1,<0.5.0 + - python >=3.8.0 + - pyyaml >=5.1 + - referencing >=0.28.0,<0.31.0 + - requests >=2.31.0,<3.0.0 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/jsonschema-path + size: 17957 + timestamp: 1700052469896 +- kind: conda + name: jsonschema-specifications + version: 2023.7.1 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2023.7.1-pyhd8ed1ab_0.conda + sha256: 7b0061e106674f27cc718f79a095e90a5667a3635ec6626dd23b3be0fd2bfbdc + md5: 7c27ea1bdbe520bb830dcadd59f55cbf + depends: + - importlib_resources >=1.4.0 + - python >=3.8 + - referencing >=0.25.0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/jsonschema-specifications + size: 15296 + timestamp: 1689701341221 +- kind: conda + name: junit-xml + version: '1.9' + build: pyh9f0ad1d_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/junit-xml-1.9-pyh9f0ad1d_0.tar.bz2 + sha256: b89ace740500f4a311475ae44add2675d72dc42c02971910ea844812edf93736 + md5: 7b503c6c097fa8677d6ff17d2bfb623f + depends: + - python + - six + license: MIT + license_family: MIT + size: 10521 + timestamp: 1601482753179 +- kind: pypi + name: kiwisolver + version: 1.4.5 + url: https://files.pythonhosted.org/packages/1e/37/d3c2d4ba2719059a0f12730947bbe1ad5ee8bff89e8c35319dcb2c9ddb4c/kiwisolver-1.4.5-cp311-cp311-win_amd64.whl + sha256: 6c08e1312a9cf1074d17b17728d3dfce2a5125b2d791527f33ffbe805200a355 + requires_dist: + - typing-extensions ; python_version < '3.8' + requires_python: '>=3.7' +- kind: conda + name: lazy-object-proxy + version: 1.10.0 + build: py311ha68e1ae_0 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/lazy-object-proxy-1.10.0-py311ha68e1ae_0.conda + sha256: 88abe80109f318de48e8353aab12395b6d840c1d051f6531c122aa12d0342c1f + md5: 922a4f709c7331941eebea33ffb97ab6 + depends: + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: BSD-2-Clause + license_family: BSD + purls: + - pkg:pypi/lazy-object-proxy + size: 40743 + timestamp: 1702664095597 +- kind: conda + name: libexpat + version: 2.6.1 + build: h63175ca_0 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.6.1-h63175ca_0.conda + sha256: 160ef43c55806495e8f96fc49ded0ab538c1cde9fdecafa1eb92a568e470ae20 + md5: 6d663a0052380f703665a290e5fbb922 + constrains: + - expat 2.6.1.* + license: MIT + license_family: MIT + size: 139015 + timestamp: 1709746966440 +- kind: conda + name: libffi + version: 3.4.2 + build: h8ffe710_5 + build_number: 5 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/libffi-3.4.2-h8ffe710_5.tar.bz2 + sha256: 1951ab740f80660e9bc07d2ed3aefb874d78c107264fd810f24a1a6211d4b1a5 + md5: 2c96d1b6915b408893f9472569dee135 + depends: + - vc >=14.1,<15.0a0 + - vs2015_runtime >=14.16.27012 + license: MIT + license_family: MIT + size: 42063 + timestamp: 1636489106777 +- kind: conda + name: libsqlite + version: 3.45.1 + build: hcfcfb64_0 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.45.1-hcfcfb64_0.conda + sha256: e1010f4ac7b056d85d91e6cb6137ef118f920eba88059261689e543780b230df + md5: c583c1d6999b7aa148eff3089e13c44b + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: Unlicense + size: 870045 + timestamp: 1707495642340 +- kind: conda + name: libzlib + version: 1.2.13 + build: hcfcfb64_5 + build_number: 5 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.2.13-hcfcfb64_5.conda + sha256: c161822ee8130b71e08b6d282b9919c1de2c5274b29921a867bca0f7d30cad26 + md5: 5fdb9c6a113b6b6cb5e517fd972d5f41 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + constrains: + - zlib 1.2.13 *_5 + license: Zlib + license_family: Other + size: 55800 + timestamp: 1686575452215 +- kind: conda + name: markupsafe + version: 2.1.5 + build: py311ha68e1ae_0 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/markupsafe-2.1.5-py311ha68e1ae_0.conda + sha256: c629f79fe78b5df7f08daa6b7f125f7a67f789bf734949c6d68aa063d7296208 + md5: 07da1326e2837e055ef6f44ef3334b0a + depends: + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + constrains: + - jinja2 >=3.0.0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/markupsafe + size: 30011 + timestamp: 1706900632904 +- kind: pypi + name: matplotlib + version: 3.8.3 + url: https://files.pythonhosted.org/packages/a1/27/8a807464b0cf47fdf3ba8cbb542d4f3a551da0254d7588667857f8a8a88a/matplotlib-3.8.3-cp311-cp311-win_amd64.whl + sha256: 40321634e3a05ed02abf7c7b47a50be50b53ef3eaa3a573847431a545585b407 + requires_dist: + - contourpy >=1.0.1 + - cycler >=0.10 + - fonttools >=4.22.0 + - kiwisolver >=1.3.1 + - numpy <2, >=1.21 + - packaging >=20.0 + - pillow >=8 + - pyparsing >=2.3.1 + - python-dateutil >=2.7 + - importlib-resources >=3.2.0 ; python_version < '3.10' + requires_python: '>=3.9' +- kind: conda + name: moto + version: 5.0.3 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/moto-5.0.3-pyhd8ed1ab_0.conda + sha256: 89edf678481fc620ce5bdb49b8d0f14cf43d3386ec7bd39a445b249762130241 + md5: 31d81c30d7244228121e31a40c7dc612 + depends: + - aws-xray-sdk !=0.96,>=0.93 + - boto3 >=1.9.201 + - botocore >=1.12.201 + - cfn-lint >=0.40.0 + - cryptography >=3.3.1 + - docker-py >=2.5.1 + - flask !=2.2.0,!=2.2.1 + - flask_cors + - graphql-core + - idna >=2.5,<4 + - importlib_metadata + - jinja2 >=2.10.1 + - joserfc + - jsondiff >=1.1.2 + - openapi-spec-validator >=0.2.8 + - pyparsing >=3.0.7 + - python >=3.3 + - python-dateutil >=2.1,<3.0.0 + - python-jose >=3.1.0,<4.0.0 + - pytz + - pyyaml >=5.1 + - requests >=2.5 + - responses >=0.9.0 + - setuptools + - sshpubkeys >=3.1.0 + - werkzeug >=0.5,!=2.2.0,!=2.2.1 + - xmltodict + license: Apache-2.0 + license_family: APACHE + size: 1926030 + timestamp: 1710084527235 +- kind: conda + name: mpc + version: 1.3.1 + build: h4ff82f8_0 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/mpc-1.3.1-h4ff82f8_0.conda + sha256: 66ff57d0a9d19d0fdcef0ea77704873d6709f8fce4e4eb00eda38ba77dd581e9 + md5: 41067dedcc6a2e03c28a4adb75b841bc + depends: + - mpfr >=4.1.0,<5.0a0 + - mpir >=3.0.0,<4.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vs2015_runtime >=14.29.30139 + license: LGPL-3.0-or-later + license_family: LGPL + size: 109570 + timestamp: 1674264690969 +- kind: conda + name: mpfr + version: 4.2.1 + build: h64bf75a_0 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/mpfr-4.2.1-h64bf75a_0.conda + sha256: d7de072ecf72828ca4efaa306204e95249009952da1cce12d25eeed938ce77e6 + md5: 79630cb281f008b9cd4975c6a4748c65 + depends: + - mpir >=3.0.0,<4.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: LGPL-3.0-only + license_family: LGPL + size: 386668 + timestamp: 1698005520388 +- kind: conda + name: mpir + version: 3.0.0 + build: he025d50_1002 + build_number: 1002 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/mpir-3.0.0-he025d50_1002.tar.bz2 + sha256: c7243b2c3f8e849a9367eab8d77babcd8dd5b828d6b5068441297edc86843b69 + md5: 126ea50b4b4a33448c3994df2ff8b0cc + depends: + - vc >=14,<15.0a0 + license: LGPL 3 + size: 3119992 + timestamp: 1543566020324 +- kind: conda + name: mpmath + version: 1.3.0 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.3.0-pyhd8ed1ab_0.conda + sha256: a4f025c712ec1502a55c471b56a640eaeebfce38dd497d5a1a33729014cac47a + md5: dbf6e2d89137da32fa6670f3bffc024e + depends: + - python >=3.6 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/mpmath + size: 438339 + timestamp: 1678228210181 +- kind: conda + name: networkx + version: 3.2.1 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/networkx-3.2.1-pyhd8ed1ab_0.conda + sha256: 7629aa4f9f8cdff45ea7a4701fe58dccce5bf2faa01c26eb44cbb27b7e15ca9d + md5: 425fce3b531bed6ec3c74fab3e5f0a1c + depends: + - python >=3.9 + constrains: + - matplotlib >=3.5 + - scipy >=1.9,!=1.11.0,!=1.11.1 + - numpy >=1.22 + - pandas >=1.4 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/networkx + size: 1149552 + timestamp: 1698504905258 +- kind: pypi + name: numpy + version: 1.26.4 + url: https://files.pythonhosted.org/packages/3f/6b/5610004206cf7f8e7ad91c5a85a8c71b2f2f8051a0c0c4d5916b76d6cbb2/numpy-1.26.4-cp311-cp311-win_amd64.whl + sha256: cd25bcecc4974d09257ffcd1f098ee778f7834c3ad767fe5db785be9a4aa9cb2 + requires_python: '>=3.9' +- kind: conda + name: openapi-schema-validator + version: 0.6.2 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/openapi-schema-validator-0.6.2-pyhd8ed1ab_0.conda + sha256: 184ab5d662741d549e5bdc3ea75846ed9a5d0ae2072d9b970d92ab0e4fbe6145 + md5: 86794cb397bb1b311da59f9ac232b0c8 + depends: + - jsonschema >=4.19.1,<5.0.0a0 + - jsonschema-specifications >=2023.5.2,<2024.0.0 + - python >=3.8 + - rfc3339-validator + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/openapi-schema-validator + size: 17458 + timestamp: 1696516113933 +- kind: conda + name: openapi-spec-validator + version: 0.7.1 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/openapi-spec-validator-0.7.1-pyhd8ed1ab_0.conda + sha256: b3aff38febb575647f1b5ad246dc4a9f221e3f712027a71be6e2554c3fe44220 + md5: 01d3b50ae6ec011c99b043388fc3148d + depends: + - importlib_resources >=5.8,<7.0 + - jsonschema >=4.18.0,<5.0.0 + - jsonschema-path >=0.3.1,<0.4.0 + - lazy-object-proxy >=1.7.1,<2.0.0 + - openapi-schema-validator >=0.6.0,<0.7.0 + - python >=3.8.0 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/openapi-spec-validator + size: 41961 + timestamp: 1697293600865 +- kind: conda + name: openssl + version: 3.2.1 + build: hcfcfb64_0 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/openssl-3.2.1-hcfcfb64_0.conda + sha256: 1df1c43136f863d5e9ba20b703001caf9a4d0ea56bdc3eeb948c977e3d4f91d3 + md5: 158df8eead8092cf0e27167c8761a8dd + depends: + - ca-certificates + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + constrains: + - pyopenssl >=22.1 + license: Apache-2.0 + license_family: Apache + size: 8229619 + timestamp: 1706638014697 +- kind: conda + name: packaging + version: '24.0' + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/packaging-24.0-pyhd8ed1ab_0.conda + sha256: a390182d74c31dfd713c16db888c92c277feeb6d1fe96ff9d9c105f9564be48a + md5: 248f521b64ce055e7feae3105e7abeb8 + depends: + - python >=3.8 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/packaging + size: 49832 + timestamp: 1710076089469 +- kind: conda + name: paramiko + version: 3.4.0 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/paramiko-3.4.0-pyhd8ed1ab_0.conda + sha256: 2e66359261954a79b66858c30e69ea6dd4380bf8bd733940527386b25e31dd13 + md5: a5e792523b028b06d7ce6e65a6cd4a33 + depends: + - bcrypt >=3.2 + - cryptography >=3.3 + - pynacl >=1.5 + - python >=3.6 + license: LGPL-2.1-or-later + license_family: LGPL + purls: + - pkg:pypi/paramiko + size: 160045 + timestamp: 1703016056314 +- kind: conda + name: pathable + version: 0.4.3 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/pathable-0.4.3-pyhd8ed1ab_0.tar.bz2 + sha256: 7258b7f6a8e5fcd5e5a22e0a85b89e03e9cf5049d1591bc98420fd080007f25d + md5: f3e7301de38fd621c902faf8087bc564 + depends: + - python >=3.7 + license: Apache-2.0 + license_family: APACHE + size: 16637 + timestamp: 1662125265190 +- kind: conda + name: pbr + version: 6.0.0 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/pbr-6.0.0-pyhd8ed1ab_0.conda + sha256: 4c83853fc6349de163c2871613e064e5fdab91723db9b50bcda681adc05e4b87 + md5: 8dbab5ba746ed14aa32cb232dc437f8f + depends: + - pip + - python >=3.6 + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/pbr + size: 73106 + timestamp: 1699384879677 +- kind: pypi + name: pillow + version: 10.2.0 + url: https://files.pythonhosted.org/packages/43/56/f92715a873187b5eff72a4a0d2ac6258e18e9bfb0e136aafde65c49a841a/pillow-10.2.0-cp311-cp311-win_amd64.whl + sha256: 1da3b2703afd040cf65ec97efea81cfba59cdbed9c11d8efc5ab09df9509fc56 + requires_dist: + - furo ; extra == 'docs' + - olefile ; extra == 'docs' + - sphinx >=2.4 ; extra == 'docs' + - sphinx-copybutton ; extra == 'docs' + - sphinx-inline-tabs ; extra == 'docs' + - sphinx-removed-in ; extra == 'docs' + - sphinxext-opengraph ; extra == 'docs' + - olefile ; extra == 'fpx' + - olefile ; extra == 'mic' + - check-manifest ; extra == 'tests' + - coverage ; extra == 'tests' + - defusedxml ; extra == 'tests' + - markdown2 ; extra == 'tests' + - olefile ; extra == 'tests' + - packaging ; extra == 'tests' + - pyroma ; extra == 'tests' + - pytest ; extra == 'tests' + - pytest-cov ; extra == 'tests' + - pytest-timeout ; extra == 'tests' + - typing-extensions ; python_version < '3.10' and extra == 'typing' + - defusedxml ; extra == 'xmp' + requires_python: '>=3.8' +- kind: conda + name: pip + version: '24.0' + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/pip-24.0-pyhd8ed1ab_0.conda + sha256: b7c1c5d8f13e8cb491c4bd1d0d1896a4cf80fc47de01059ad77509112b664a4a + md5: f586ac1e56c8638b64f9c8122a7b8a67 + depends: + - python >=3.7 + - setuptools + - wheel + license: MIT + license_family: MIT + purls: + - pkg:pypi/pip + size: 1398245 + timestamp: 1706960660581 +- kind: conda + name: pkgutil-resolve-name + version: 1.3.10 + build: pyhd8ed1ab_1 + build_number: 1 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/pkgutil-resolve-name-1.3.10-pyhd8ed1ab_1.conda + sha256: fecf95377134b0e8944762d92ecf7b0149c07d8186fb5db583125a2705c7ea0a + md5: 405678b942f2481cecdb3e010f4925d9 + depends: + - python >=3.6 + license: MIT AND PSF-2.0 + purls: + - pkg:pypi/pkgutil-resolve-name + size: 10778 + timestamp: 1694617398467 +- kind: conda + name: pyasn1 + version: 0.5.1 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/pyasn1-0.5.1-pyhd8ed1ab_0.conda + sha256: 8b116da9acbb471e107203c11acaffcb259aca2367aa7e83e796e43ed5d381b3 + md5: fb1a800972b072aa4d16450983c81418 + depends: + - python !=3.0,!=3.1,!=3.2,!=3.3,!=3.4,!=3.5 + license: BSD-2-Clause + license_family: BSD + purls: + - pkg:pypi/pyasn1 + size: 63586 + timestamp: 1701287134208 +- kind: conda + name: pycparser + version: '2.21' + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.21-pyhd8ed1ab_0.tar.bz2 + sha256: 74c63fd03f1f1ea2b54e8bc529fd1a600aaafb24027b738d0db87909ee3a33dc + md5: 076becd9e05608f8dc72757d5f3a91ff + depends: + - python ==2.7.*|>=3.4 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/pycparser + size: 102747 + timestamp: 1636257201998 +- kind: conda + name: pydantic + version: 2.6.3 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.6.3-pyhd8ed1ab_0.conda + sha256: 7367461b8f9e309f20f129605daa78635a1daa2538fe0b40d7f7238f8d430a29 + md5: 4f4e78b41c489b89d98719fcbde09361 + depends: + - annotated-types >=0.4.0 + - pydantic-core 2.16.3 + - python >=3.7 + - typing-extensions >=4.6.1 + license: MIT + license_family: MIT + purls: + - pkg:pypi/pydantic + size: 271902 + timestamp: 1709075341323 +- kind: conda + name: pydantic-core + version: 2.16.3 + build: py311hc37eb10_0 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/pydantic-core-2.16.3-py311hc37eb10_0.conda + sha256: 3ccbc5d14b643c1bf406b2da39f7cd318d2f5cd9f2f37796efad2a825a2dce53 + md5: 20243cfaf181fac16e4ce93418756ab5 + depends: + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + - typing-extensions >=4.6.0,!=4.7.0 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: MIT + license_family: MIT + purls: + - pkg:pypi/pydantic-core + size: 1613720 + timestamp: 1708701859366 +- kind: conda + name: pynacl + version: 1.5.0 + build: py311hd53affc_3 + build_number: 3 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/pynacl-1.5.0-py311hd53affc_3.conda + sha256: 5c226512cb702b0d19a760eb2ad7b38716592a782300cd27e880043987c741ac + md5: f281b8aabfefac05a58db6a623be8e5c + depends: + - cffi >=1.4.1 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + - six + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/pynacl + size: 1244245 + timestamp: 1695545315762 +- kind: conda + name: pyparsing + version: 3.1.2 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.2-pyhd8ed1ab_0.conda + sha256: 06c77cb03e5dde2d939b216c99dd2db52ea93a4c7c599f3882f136005c359c7b + md5: b9a4dacf97241704529131a0dfc0494f + depends: + - python >=3.6 + license: MIT + license_family: MIT + purls: + - pkg:pypi/pyparsing + size: 89455 + timestamp: 1709721146886 +- kind: conda + name: pysocks + version: 1.7.1 + build: pyh0701188_6 + build_number: 6 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyh0701188_6.tar.bz2 + sha256: b3a612bc887f3dd0fb7c4199ad8e342bd148cf69a9b74fd9468a18cf2bef07b7 + md5: 56cd9fe388baac0e90c7149cfac95b60 + depends: + - __win + - python >=3.8 + - win_inet_pton + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/pysocks + size: 19348 + timestamp: 1661605138291 +- kind: conda + name: python + version: 3.11.8 + build: h2628c8c_0_cpython + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/python-3.11.8-h2628c8c_0_cpython.conda + sha256: 8b2db64acfd351f4281d75465b09109f4b51096d5e58128cb7a4c1d2ade47203 + md5: 5af649cf283ec4c1ffff5c4fe0cec12b + depends: + - bzip2 >=1.0.8,<2.0a0 + - libexpat >=2.5.0,<3.0a0 + - libffi >=3.4,<4.0a0 + - libsqlite >=3.45.1,<4.0a0 + - libzlib >=1.2.13,<1.3.0a0 + - openssl >=3.2.1,<4.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + - xz >=5.2.6,<6.0a0 + constrains: + - python_abi 3.11.* *_cp311 + license: Python-2.0 + size: 18096526 + timestamp: 1708116524168 +- kind: conda + name: python-dateutil + version: 2.9.0 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda + sha256: f3ceef02ac164a8d3a080d0d32f8e2ebe10dd29e3a685d240e38b3599e146320 + md5: 2cf4264fffb9e6eff6031c5b6884d61c + depends: + - python >=3.7 + - six >=1.5 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/python-dateutil + size: 222742 + timestamp: 1709299922152 +- kind: conda + name: python-jose + version: 3.3.0 + build: pyh6c4a22f_1 + build_number: 1 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/python-jose-3.3.0-pyh6c4a22f_1.tar.bz2 + sha256: 31bcedfa1803116e589602a24db4a01dbda2e0df819f497cb5d48c29d17631ec + md5: 8fa19760945f1c3754c9419c6459f7e0 + depends: + - cryptography + - ecdsa !=0.15 + - pyasn1 + - python >=3.6 + - rsa + license: MIT + license_family: MIT + purls: + - pkg:pypi/python-jose + size: 115786 + timestamp: 1624701909146 +- kind: conda + name: python_abi + version: '3.11' + build: 4_cp311 + build_number: 4 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/python_abi-3.11-4_cp311.conda + sha256: 67c2aade3e2160642eec0742384e766b20c766055e3d99335681e3e05d88ed7b + md5: 70513332c71b56eace4ee6441e66c012 + constrains: + - python 3.11.* *_cpython + license: BSD-3-Clause + license_family: BSD + size: 6755 + timestamp: 1695147711935 +- kind: conda + name: pytz + version: '2024.1' + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda + sha256: 1a7d6b233f7e6e3bbcbad054c8fd51e690a67b129a899a056a5e45dd9f00cb41 + md5: 3eeeeb9e4827ace8c0c1419c85d590ad + depends: + - python >=3.7 + license: MIT + license_family: MIT + purls: + - pkg:pypi/pytz + size: 188538 + timestamp: 1706886944988 +- kind: conda + name: pywin32 + version: '306' + build: py311h12c1d0e_2 + build_number: 2 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/pywin32-306-py311h12c1d0e_2.conda + sha256: 79d942817bdaf384602113e5fcb9158dc45cae4044bed308918a5db97f141fdb + md5: 25df0fc55722ea1a94494f41302e2d1c + depends: + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: PSF-2.0 + license_family: PSF + size: 6124285 + timestamp: 1695974706892 +- kind: conda + name: pywin32-on-windows + version: 0.1.0 + build: pyh07e9846_2 + build_number: 2 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/pywin32-on-windows-0.1.0-pyh07e9846_2.tar.bz2 + sha256: 09803b75cccc16d8586d2f41ea890658d165f4afc359973fa1c7904a2c140eae + md5: 91733394059b880d9cc0d010c20abda0 + depends: + - python >=2.7 + - pywin32 + license: BSD-3-Clause + license_family: BSD + size: 5282 + timestamp: 1646866839398 +- kind: conda + name: pyyaml + version: 6.0.1 + build: py311ha68e1ae_1 + build_number: 1 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/pyyaml-6.0.1-py311ha68e1ae_1.conda + sha256: 4fb0770fc70381a8ab3ced33413ad9dc5e82d4c535b593edd580113ce8760298 + md5: 2b4128962cd665153e946f2a88667a3b + depends: + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + - yaml >=0.2.5,<0.3.0a0 + license: MIT + license_family: MIT + size: 175469 + timestamp: 1695374086205 +- kind: conda + name: referencing + version: 0.30.2 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/referencing-0.30.2-pyhd8ed1ab_0.conda + sha256: a6768fabc12f1eed87fec68c5c65439e908655cded1e458d70a164abbce13287 + md5: a33161b983172ba6ef69d5fc850650cd + depends: + - attrs >=22.2.0 + - python >=3.8 + - rpds-py >=0.7.0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/referencing + size: 38061 + timestamp: 1691337409918 +- kind: conda + name: regex + version: 2023.12.25 + build: py311ha68e1ae_0 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/regex-2023.12.25-py311ha68e1ae_0.conda + sha256: 05a932390b96bb7f24d98aecff06d26c4c8f205f9aa3360cd4c75e3d1c9a5d2d + md5: aa44d1a8e74282b225bb19525d579861 + depends: + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: Python-2.0 + license_family: PSF + purls: + - pkg:pypi/regex + size: 365770 + timestamp: 1703393978413 +- kind: conda + name: requests + version: 2.31.0 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda + sha256: 9f629d6fd3c8ac5f2a198639fe7af87c4db2ac9235279164bfe0fcb49d8c4bad + md5: a30144e4156cdbb236f99ebb49828f8b + depends: + - certifi >=2017.4.17 + - charset-normalizer >=2,<4 + - idna >=2.5,<4 + - python >=3.7 + - urllib3 >=1.21.1,<3 + constrains: + - chardet >=3.0.2,<6 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/requests + size: 56690 + timestamp: 1684774408600 +- kind: conda + name: responses + version: 0.25.0 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/responses-0.25.0-pyhd8ed1ab_0.conda + sha256: ffda7ac561d4b946dd8e2be9126a0418933340d345f3b96e3c9c4a1968bf3c3f + md5: 3a3a9d37b275336a17386f80bfcca835 + depends: + - python >=3.7 + - pyyaml + - requests >=2.30.0,<3.0 + - types-pyyaml + - typing_extensions + - urllib3 >=1.25.10,<3.0 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/responses + size: 50817 + timestamp: 1707873136928 +- kind: conda + name: rfc3339-validator + version: 0.1.4 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_0.tar.bz2 + sha256: 7c7052b51de0b5c558f890bb11f8b5edbb9934a653d76be086b1182b9f54185d + md5: fed45fc5ea0813240707998abe49f520 + depends: + - python >=3.5 + - six + license: MIT + license_family: MIT + purls: + - pkg:pypi/rfc3339-validator + size: 8064 + timestamp: 1638811838081 +- kind: conda + name: rpds-py + version: 0.18.0 + build: py311hc37eb10_0 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/rpds-py-0.18.0-py311hc37eb10_0.conda + sha256: 46766bb9b8df78ef7c8125f5a51f2cd77ddfbdc622a7db1a5c19c41b8d034965 + md5: 9851ab425910f099cc2d512996fc01ce + depends: + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: MIT + license_family: MIT + purls: + - pkg:pypi/rpds-py + size: 203072 + timestamp: 1707923793999 +- kind: conda + name: rsa + version: '4.9' + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/rsa-4.9-pyhd8ed1ab_0.tar.bz2 + sha256: 23214cdc15a41d14136754857fd9cd46ca3c55a7e751da3b3a48c673f0ee2a57 + md5: 03bf410858b2cefc267316408a77c436 + depends: + - pyasn1 >=0.1.3 + - python >=3.6 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/rsa + size: 29863 + timestamp: 1658329024970 +- kind: conda + name: s3transfer + version: 0.10.0 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/s3transfer-0.10.0-pyhd8ed1ab_0.conda + sha256: 5f1fccbbc0460971f12dda7ab0465d8f6037486042d156b611881e57d218ce95 + md5: 2d52125a7fe49248ce5e883fed6c935a + depends: + - botocore >=1.33.2,<2.0a.0 + - python >=3.8 + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/s3transfer + size: 62916 + timestamp: 1703197581493 +- kind: conda + name: sarif-om + version: 1.0.4 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/sarif-om-1.0.4-pyhd8ed1ab_0.tar.bz2 + sha256: 02e18825ab15654d6555aa2d78c396e726e200e398691bd0bce3b810205e28df + md5: 010e6280a9dc265d0488b598c45103d9 + depends: + - attrs + - pbr + - python >=3.6 + license: MIT + license_family: MIT + purls: + - pkg:pypi/sarif-om + size: 19220 + timestamp: 1637091367035 +- kind: conda + name: setuptools + version: 69.1.1 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/setuptools-69.1.1-pyhd8ed1ab_0.conda + sha256: 7a6dca60efcaa42d0ebb784950bc16230a968256cb5048a4441cb34653b5ec58 + md5: 576de899521b7d43674ba3ef6eae9142 + depends: + - python >=3.8 + license: MIT + license_family: MIT + purls: + - pkg:pypi/setuptools + size: 469644 + timestamp: 1708702431036 +- kind: conda + name: six + version: 1.16.0 + build: pyh6c4a22f_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2 + sha256: a85c38227b446f42c5b90d9b642f2c0567880c15d72492d8da074a59c8f91dd6 + md5: e5f25f8dbc060e9a8d912e432202afc2 + depends: + - python + license: MIT + license_family: MIT + purls: + - pkg:pypi/six + size: 14259 + timestamp: 1620240338595 +- kind: conda + name: sshpubkeys + version: 3.3.1 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/sshpubkeys-3.3.1-pyhd8ed1ab_0.tar.bz2 + sha256: d19ddc51a4e0c09172f3d70a4f75d2b7f67a9b0204eb25ae586e94830ffe4b44 + md5: b8359fec314d52ccb52b59d47cd2c2c0 + depends: + - cryptography >=2.1.4 + - ecdsa >=0.13 + - python >=3.6 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/sshpubkeys + size: 13999 + timestamp: 1654870563661 +- kind: conda + name: sympy + version: '1.12' + build: pyh04b8f61_3 + build_number: 3 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/sympy-1.12-pyh04b8f61_3.conda + sha256: 75b525ecb0948380796f519fe723470d52f9369e23c68f194c28f34df5e49b39 + md5: 6af285473a6a49ea8068e0b5b28ed7de + depends: + - mpmath >=0.19 + - python >=3.8 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/sympy + size: 4243034 + timestamp: 1684180691391 +- kind: conda + name: tk + version: 8.6.13 + build: h5226925_1 + build_number: 1 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h5226925_1.conda + sha256: 2c4e914f521ccb2718946645108c9bd3fc3216ba69aea20c2c3cedbd8db32bb1 + md5: fc048363eb8f03cd1737600a5d08aafe + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: TCL + license_family: BSD + size: 3503410 + timestamp: 1699202577803 +- kind: conda + name: types-pyyaml + version: 6.0.12.20240311 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/types-pyyaml-6.0.12.20240311-pyhd8ed1ab_0.conda + sha256: 0101df6ec0d1bf632f215795225eb7d0308ae542c61a2f3a3ce66c39dad956fb + md5: df5d4b66033ecb54c7a4040627215529 + depends: + - python >=3.6 + license: Apache-2.0 AND MIT + size: 25219 + timestamp: 1710134479192 +- kind: conda + name: typing-extensions + version: 4.10.0 + build: hd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.10.0-hd8ed1ab_0.conda + sha256: 0698fe2c4e555fb44c27c60f7a21fa0eea7f5bf8186ad109543c5b056e27f96a + md5: 091683b9150d2ebaa62fd7e2c86433da + depends: + - typing_extensions 4.10.0 pyha770c72_0 + license: PSF-2.0 + license_family: PSF + size: 10181 + timestamp: 1708904805365 +- kind: conda + name: typing_extensions + version: 4.10.0 + build: pyha770c72_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.10.0-pyha770c72_0.conda + sha256: 4be24d557897b2f6609f5d5f7c437833c62f4d4a96581e39530067e96a2d0451 + md5: 16ae769069b380646c47142d719ef466 + depends: + - python >=3.8 + license: PSF-2.0 + license_family: PSF + purls: + - pkg:pypi/typing-extensions + size: 37018 + timestamp: 1708904796013 +- kind: conda + name: tzdata + version: 2024a + build: h0c530f3_0 + subdir: noarch + noarch: generic + url: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda + sha256: 7b2b69c54ec62a243eb6fba2391b5e443421608c3ae5dbff938ad33ca8db5122 + md5: 161081fc7cec0bfda0d86d7cb595f8d8 + license: LicenseRef-Public-Domain + size: 119815 + timestamp: 1706886945727 +- kind: conda + name: ucrt + version: 10.0.22621.0 + build: h57928b3_0 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.22621.0-h57928b3_0.tar.bz2 + sha256: f29cdaf8712008f6b419b8b1a403923b00ab2504bfe0fb2ba8eb60e72d4f14c6 + md5: 72608f6cd3e5898229c3ea16deb1ac43 + constrains: + - vs2015_runtime >=14.29.30037 + license: LicenseRef-Proprietary + license_family: PROPRIETARY + size: 1283972 + timestamp: 1666630199266 +- kind: conda + name: urllib3 + version: 2.0.7 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.0.7-pyhd8ed1ab_0.conda + sha256: 9fe14735dde74278c6f1710cbe883d5710fc98501a96031dec6849a8d8a1bb11 + md5: 270e71c14d37074b1d066ee21cf0c4a6 + depends: + - brotli-python >=1.0.9 + - pysocks >=1.5.6,<2.0,!=1.5.7 + - python >=3.7 + license: MIT + license_family: MIT + purls: + - pkg:pypi/urllib3 + size: 98507 + timestamp: 1697720586316 +- kind: conda + name: vc + version: '14.3' + build: hcf57466_18 + build_number: 18 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-hcf57466_18.conda + sha256: 447a8d8292a7b2107dcc18afb67f046824711a652725fc0f522c368e7a7b8318 + md5: 20e1e652a4c740fa719002a8449994a2 + depends: + - vc14_runtime >=14.38.33130 + track_features: + - vc14 + license: BSD-3-Clause + license_family: BSD + size: 16977 + timestamp: 1702511255313 +- kind: conda + name: vc14_runtime + version: 14.38.33130 + build: h82b7239_18 + build_number: 18 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.38.33130-h82b7239_18.conda + sha256: bf94c9af4b2e9cba88207001197e695934eadc96a5c5e4cd7597e950aae3d8ff + md5: 8be79fdd2725ddf7bbf8a27a4c1f79ba + depends: + - ucrt >=10.0.20348.0 + constrains: + - vs2015_runtime 14.38.33130.* *_18 + license: LicenseRef-ProprietaryMicrosoft + license_family: Proprietary + size: 749868 + timestamp: 1702511239004 +- kind: conda + name: vs2015_runtime + version: 14.38.33130 + build: hcb4865c_18 + build_number: 18 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/vs2015_runtime-14.38.33130-hcb4865c_18.conda + sha256: a2fec221f361d6263c117f4ea6d772b21c90a2f8edc6f3eb0eadec6bfe8843db + md5: 10d42885e3ed84e575b454db30f1aa93 + depends: + - vc14_runtime >=14.38.33130 + license: BSD-3-Clause + license_family: BSD + size: 16988 + timestamp: 1702511261442 +- kind: conda + name: websocket-client + version: 1.7.0 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.7.0-pyhd8ed1ab_0.conda + sha256: d9b537d5b7c5aa7a02a4ce4c6b755e458bd8083b67752a73c92d113ccec6c10f + md5: 50ad31e07d706aae88b14a4ac9c73f23 + depends: + - python >=3.8 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/websocket-client + size: 46626 + timestamp: 1701630814576 +- kind: conda + name: werkzeug + version: 3.0.1 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/werkzeug-3.0.1-pyhd8ed1ab_0.conda + sha256: b7ac49549d370a411b1d6150d24243a15adcce07f1c61ec2ea1b536346e47aa0 + md5: af8d825d93dbe6331ee6d61c69869ca0 + depends: + - markupsafe >=2.1.1 + - python >=3.8 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/werkzeug + size: 241704 + timestamp: 1698235401441 +- kind: conda + name: wheel + version: 0.42.0 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/wheel-0.42.0-pyhd8ed1ab_0.conda + sha256: 80be0ccc815ce22f80c141013302839b0ed938a2edb50b846cf48d8a8c1cfa01 + md5: 1cdea58981c5cbc17b51973bcaddcea7 + depends: + - python >=3.7 + license: MIT + license_family: MIT + purls: + - pkg:pypi/wheel + size: 57553 + timestamp: 1701013309664 +- kind: conda + name: win_inet_pton + version: 1.1.0 + build: pyhd8ed1ab_6 + build_number: 6 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/win_inet_pton-1.1.0-pyhd8ed1ab_6.tar.bz2 + sha256: a11ae693a0645bf6c7b8a47bac030be9c0967d0b1924537b9ff7458e832c0511 + md5: 30878ecc4bd36e8deeea1e3c151b2e0b + depends: + - __win + - python >=3.6 + license: PUBLIC-DOMAIN + purls: + - pkg:pypi/win-inet-pton + size: 8191 + timestamp: 1667051294134 +- kind: conda + name: wrapt + version: 1.16.0 + build: py311ha68e1ae_0 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/wrapt-1.16.0-py311ha68e1ae_0.conda + sha256: e8209b3ebdde15834b59101fd14a7f293d868d2fbad2dcd634357cc3406f1052 + md5: b96598823313b647148417455f2fa659 + depends: + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: BSD-2-Clause + license_family: BSD + purls: + - pkg:pypi/wrapt + size: 62017 + timestamp: 1699533574835 +- kind: conda + name: xmltodict + version: 0.13.0 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/xmltodict-0.13.0-pyhd8ed1ab_0.tar.bz2 + sha256: eb40b33ae953e0020406318c9be0eb6edf62f3aa8e64ab0bf1953440b1a92763 + md5: b5b33faed6ed2b4ba47a690b8f5c0818 + depends: + - python >=3.6 + license: MIT + license_family: MIT + purls: + - pkg:pypi/xmltodict + size: 13620 + timestamp: 1652020928232 +- kind: conda + name: xz + version: 5.2.6 + build: h8d14728_0 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/xz-5.2.6-h8d14728_0.tar.bz2 + sha256: 54d9778f75a02723784dc63aff4126ff6e6749ba21d11a6d03c1f4775f269fe0 + md5: 515d77642eaa3639413c6b1bc3f94219 + depends: + - vc >=14.1,<15 + - vs2015_runtime >=14.16.27033 + license: LGPL-2.1 and GPL-2.0 + size: 217804 + timestamp: 1660346976440 +- kind: conda + name: yaml + version: 0.2.5 + build: h8ffe710_2 + build_number: 2 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/yaml-0.2.5-h8ffe710_2.tar.bz2 + sha256: 4e2246383003acbad9682c7c63178e2e715ad0eb84f03a8df1fbfba455dfedc5 + md5: adbfb9f45d1004a26763652246a33764 + depends: + - vc >=14.1,<15.0a0 + - vs2015_runtime >=14.16.27012 + license: MIT + license_family: MIT + size: 63274 + timestamp: 1641347623319 +- kind: conda + name: zipp + version: 3.17.0 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/zipp-3.17.0-pyhd8ed1ab_0.conda + sha256: bced1423fdbf77bca0a735187d05d9b9812d2163f60ab426fc10f11f92ecbe26 + md5: 2e4d6bc0b14e10f895fc6791a7d9b26a + depends: + - python >=3.8 + license: MIT + license_family: MIT + purls: + - pkg:pypi/zipp + size: 18954 + timestamp: 1695255262261 diff --git a/tests/non-satisfiability/solve-groups-pypi/pixi.toml b/tests/non-satisfiability/solve-groups-pypi/pixi.toml new file mode 100644 index 000000000..546662ec6 --- /dev/null +++ b/tests/non-satisfiability/solve-groups-pypi/pixi.toml @@ -0,0 +1,17 @@ +[project] +name = "bug_test" +channels = ["conda-forge"] +platforms = ["win-64"] + +[dependencies] +python = "=3.11" + +[pypi-dependencies] +matplotlib = "~=3.8" + +[feature.dev.dependencies] +moto = "=5.0" + +[environments] +default = { features = [], solve-group = "bug_test" } +dev = { features = ["dev"], solve-group = "bug_test" } diff --git a/tests/satisfiability/solve-groups-pypi/pixi.lock b/tests/satisfiability/solve-groups-pypi/pixi.lock new file mode 100644 index 000000000..7b96b9736 --- /dev/null +++ b/tests/satisfiability/solve-groups-pypi/pixi.lock @@ -0,0 +1,2308 @@ +version: 4 +environments: + default: + channels: + - url: https://conda.anaconda.org/conda-forge/ + packages: + win-64: + - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-hcfcfb64_5.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/ca-certificates-2024.2.2-h56e8100_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.6.1-h63175ca_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.4.2-h8ffe710_5.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.45.1-hcfcfb64_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.2.13-hcfcfb64_5.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.2.1-hcfcfb64_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.11.8-h2628c8c_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h5226925_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda + - 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-hcf57466_18.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.38.33130-h82b7239_18.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vs2015_runtime-14.38.33130-hcb4865c_18.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/xz-5.2.6-h8d14728_0.tar.bz2 + - pypi: https://files.pythonhosted.org/packages/ca/2a/d197a412ec474391ee878b1218cf2fe9c6e963903755887fc5654c06636a/contourpy-1.2.0-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ea/69/89f4bb69e28bb293b95abb0a66d49a841580451a584adb1aba59f39b6dff/fonttools-4.49.0-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/1e/37/d3c2d4ba2719059a0f12730947bbe1ad5ee8bff89e8c35319dcb2c9ddb4c/kiwisolver-1.4.5-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/a1/27/8a807464b0cf47fdf3ba8cbb542d4f3a551da0254d7588667857f8a8a88a/matplotlib-3.8.3-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/3f/6b/5610004206cf7f8e7ad91c5a85a8c71b2f2f8051a0c0c4d5916b76d6cbb2/numpy-1.26.4-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/43/56/f92715a873187b5eff72a4a0d2ac6258e18e9bfb0e136aafde65c49a841a/pillow-10.2.0-cp311-cp311-win_amd64.whl + dev: + channels: + - url: https://conda.anaconda.org/conda-forge/ + packages: + win-64: + - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.6.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-23.2.0-pyh71513ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/aws-sam-translator-1.86.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/aws-xray-sdk-2.13.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/bcrypt-4.1.2-py311hc37eb10_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/blinker-1.7.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/boto3-1.34.60-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/botocore-1.34.60-pyge310_1234567_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/brotli-python-1.1.0-py311h12c1d0e_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-hcfcfb64_5.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/ca-certificates-2024.2.2-h56e8100_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2024.2.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/cffi-1.16.0-py311ha68e1ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cfn-lint-0.86.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.3.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-win_pyh7428d3b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/cryptography-42.0.5-py311h28e9c30_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/docker-py-7.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ecdsa-0.18.0-pyhd8ed1ab_1.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/flask-3.0.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/flask_cors-3.0.10-pyhd3deb0d_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/gmpy2-2.1.2-py311h419b2c2_1.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/graphql-core-3.2.3-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-7.0.2-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-7.0.2-hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.1.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/itsdangerous-2.1.2-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jmespath-1.0.1-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/joserfc-0.9.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jschema-to-python-1.2.3-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/jsondiff-2.0.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/jsonpatch-1.33-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jsonpickle-3.0.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/jsonpointer-2.4-py311h1ea47a8_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.21.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-path-0.3.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2023.7.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/junit-xml-1.9-pyh9f0ad1d_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/lazy-object-proxy-1.10.0-py311ha68e1ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.6.1-h63175ca_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.4.2-h8ffe710_5.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.45.1-hcfcfb64_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.2.13-hcfcfb64_5.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/markupsafe-2.1.5-py311ha68e1ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/moto-5.0.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/mpc-1.3.1-h4ff82f8_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/mpfr-4.2.1-h64bf75a_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/mpir-3.0.0-he025d50_1002.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/openapi-schema-validator-0.6.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/openapi-spec-validator-0.7.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.2.1-hcfcfb64_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/paramiko-3.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathable-0.4.3-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/pbr-6.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pip-24.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pkgutil-resolve-name-1.3.10-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyasn1-0.5.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.21-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.6.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pydantic-core-2.16.3-py311hc37eb10_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pynacl-1.5.0-py311hd53affc_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyh0701188_6.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.11.8-h2628c8c_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-jose-3.3.0-pyh6c4a22f_1.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/python_abi-3.11-4_cp311.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pywin32-306-py311h12c1d0e_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pywin32-on-windows-0.1.0-pyh07e9846_2.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/pyyaml-6.0.1-py311ha68e1ae_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.30.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/regex-2023.12.25-py311ha68e1ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/responses-0.25.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/rpds-py-0.18.0-py311hc37eb10_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rsa-4.9-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/s3transfer-0.10.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sarif-om-1.0.4-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-69.1.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/sshpubkeys-3.3.1-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/sympy-1.12-pyh04b8f61_3.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h5226925_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/types-pyyaml-6.0.12.20240311-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.10.0-hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.10.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda + - 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/noarch/urllib3-2.0.7-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-hcf57466_18.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.38.33130-h82b7239_18.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vs2015_runtime-14.38.33130-hcb4865c_18.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.7.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/werkzeug-3.0.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/wheel-0.42.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/win_inet_pton-1.1.0-pyhd8ed1ab_6.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/wrapt-1.16.0-py311ha68e1ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/xmltodict-0.13.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/xz-5.2.6-h8d14728_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/yaml-0.2.5-h8ffe710_2.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.17.0-pyhd8ed1ab_0.conda + - pypi: https://files.pythonhosted.org/packages/ca/2a/d197a412ec474391ee878b1218cf2fe9c6e963903755887fc5654c06636a/contourpy-1.2.0-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ea/69/89f4bb69e28bb293b95abb0a66d49a841580451a584adb1aba59f39b6dff/fonttools-4.49.0-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/1e/37/d3c2d4ba2719059a0f12730947bbe1ad5ee8bff89e8c35319dcb2c9ddb4c/kiwisolver-1.4.5-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/a1/27/8a807464b0cf47fdf3ba8cbb542d4f3a551da0254d7588667857f8a8a88a/matplotlib-3.8.3-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/3f/6b/5610004206cf7f8e7ad91c5a85a8c71b2f2f8051a0c0c4d5916b76d6cbb2/numpy-1.26.4-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/43/56/f92715a873187b5eff72a4a0d2ac6258e18e9bfb0e136aafde65c49a841a/pillow-10.2.0-cp311-cp311-win_amd64.whl +packages: +- kind: conda + name: annotated-types + version: 0.6.0 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.6.0-pyhd8ed1ab_0.conda + sha256: 3a2c98154d95cfd54daba6b7d507d31f5ba07ac2ad955c44eb041b66563193cd + md5: 997c29372bdbe2afee073dff71f35923 + depends: + - python >=3.7 + - typing-extensions >=4.0.0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/annotated-types + size: 17026 + timestamp: 1696634393637 +- kind: conda + name: attrs + version: 23.2.0 + build: pyh71513ae_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/attrs-23.2.0-pyh71513ae_0.conda + sha256: 77c7d03bdb243a048fff398cedc74327b7dc79169ebe3b4c8448b0331ea55fea + md5: 5e4c0743c70186509d1412e03c2d8dfa + depends: + - python >=3.7 + license: MIT + license_family: MIT + purls: + - pkg:pypi/attrs + size: 54582 + timestamp: 1704011393776 +- kind: conda + name: aws-sam-translator + version: 1.86.0 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/aws-sam-translator-1.86.0-pyhd8ed1ab_0.conda + sha256: f1205b9438e8947fc0a3b70eabe07e6ef25c2bc228edb2ca3a26010c5f0a2e71 + md5: 250e721935d1b8feb2a17f24120c5e06 + depends: + - boto3 >=1.19.5 + - jsonschema <5,>=3.2 + - pydantic >=1.8,<3 + - python >=3.7,<4.0 + - typing-extensions >=4.4 + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/aws-sam-translator + size: 257073 + timestamp: 1709910495881 +- kind: conda + name: aws-xray-sdk + version: 2.13.0 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/aws-xray-sdk-2.13.0-pyhd8ed1ab_0.conda + sha256: dd6556c48140a316914a7ea06d1003aabdf08a6d790e695ca57e98c9b97772fc + md5: 9e44d239f6f7ed151b095268d8f4aa85 + depends: + - botocore >=1.11.3 + - python >=3.7 + - wrapt + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/aws-xray-sdk + size: 73047 + timestamp: 1709810601937 +- kind: conda + name: bcrypt + version: 4.1.2 + build: py311hc37eb10_0 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/bcrypt-4.1.2-py311hc37eb10_0.conda + sha256: a4fe67a2a67181275a06cc451c0fc9f99a9f8f285de3912b869e562be2bd5aa7 + md5: 0d43e07d003f3682e16af18a1fb0fe5f + depends: + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/bcrypt + size: 151190 + timestamp: 1702664837466 +- kind: conda + name: blinker + version: 1.7.0 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/blinker-1.7.0-pyhd8ed1ab_0.conda + sha256: c8d72c2af4f57898dfd5e4c62ae67f7fea1490a37c8b6855460a170d61591177 + md5: 550da20b2c2e38be9cc44bb819fda5d5 + depends: + - python >=3.8 + license: MIT + license_family: MIT + purls: + - pkg:pypi/blinker + size: 17886 + timestamp: 1698890303249 +- kind: conda + name: boto3 + version: 1.34.60 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/boto3-1.34.60-pyhd8ed1ab_0.conda + sha256: 9c84229bf02f473c0d53bcc0b5b96a907e7ab3e8a28942422b3523fa9f19541c + md5: 93ec2ce8c14b96b7f30d61b4cab15287 + depends: + - botocore >=1.34.60,<1.35.0 + - jmespath >=0.7.1,<2.0.0 + - python >=3.8 + - s3transfer >=0.10.0,<0.11.0 + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/boto3 + size: 80888 + timestamp: 1710202861396 +- kind: conda + name: botocore + version: 1.34.60 + build: pyge310_1234567_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/botocore-1.34.60-pyge310_1234567_0.conda + sha256: 81875a2f8a1731b06ab032e91b59aa776b4a1f3b9374a6da2c59b43dce200c7b + md5: 2c231e36b650a4a9e00f38563d0989a0 + depends: + - jmespath >=0.7.1,<2.0.0 + - python >=3.10 + - python-dateutil >=2.1,<3.0.0 + - urllib3 >=1.25.4,<2.1 + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/botocore + size: 6832221 + timestamp: 1710199491937 +- kind: conda + name: brotli-python + version: 1.1.0 + build: py311h12c1d0e_1 + build_number: 1 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/brotli-python-1.1.0-py311h12c1d0e_1.conda + sha256: 5390e1e5e8e159d4893ecbfd2c08ca75ef51bdce1a4a44ff4ee9e2d596004aac + md5: 42fbf4e947c17ea605e6a4d7f526669a + depends: + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + constrains: + - libbrotlicommon 1.1.0 hcfcfb64_1 + license: MIT + license_family: MIT + size: 322086 + timestamp: 1695990976742 +- kind: conda + name: bzip2 + version: 1.0.8 + build: hcfcfb64_5 + build_number: 5 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-hcfcfb64_5.conda + sha256: ae5f47a5c86fd6db822931255dcf017eb12f60c77f07dc782ccb477f7808aab2 + md5: 26eb8ca6ea332b675e11704cce84a3be + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: bzip2-1.0.6 + license_family: BSD + size: 124580 + timestamp: 1699280668742 +- kind: conda + name: ca-certificates + version: 2024.2.2 + build: h56e8100_0 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/ca-certificates-2024.2.2-h56e8100_0.conda + sha256: 4d587088ecccd393fec3420b64f1af4ee1a0e6897a45cfd5ef38055322cea5d0 + md5: 63da060240ab8087b60d1357051ea7d6 + license: ISC + size: 155886 + timestamp: 1706843918052 +- kind: conda + name: certifi + version: 2024.2.2 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/certifi-2024.2.2-pyhd8ed1ab_0.conda + sha256: f1faca020f988696e6b6ee47c82524c7806380b37cfdd1def32f92c326caca54 + md5: 0876280e409658fc6f9e75d035960333 + depends: + - python >=3.7 + license: ISC + size: 160559 + timestamp: 1707022289175 +- kind: conda + name: cffi + version: 1.16.0 + build: py311ha68e1ae_0 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/cffi-1.16.0-py311ha68e1ae_0.conda + sha256: eb7463fe3785dd9ac0b3b1e5fea3b721d20eb082e194cab0af8d9ff28c28934f + md5: d109d6e767c4890ea32880b8bfa4a3b6 + depends: + - pycparser + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: MIT + license_family: MIT + size: 297043 + timestamp: 1696002186279 +- kind: conda + name: cfn-lint + version: 0.86.0 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/cfn-lint-0.86.0-pyhd8ed1ab_0.conda + sha256: 18b972f8ed1ede9a6c8aade643180f4fceb45c2d4b24632bf1deb795cf07b732 + md5: d2b123d03e90c526da05a58d32c1ccc9 + depends: + - aws-sam-translator >=1.85.0 + - jschema-to-python >=1.2.3,<1.3.dev0 + - jsonpatch + - jsonschema >=3.0,<5 + - junit-xml >=1.9,<2.dev0 + - networkx >=2.4,<4 + - python >=3.7,<4.0 + - pyyaml >5.4 + - regex >=2021.7.1 + - sarif-om >=1.0.4,<1.1.dev0 + - sympy >=1.0.0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/cfn-lint + size: 1035427 + timestamp: 1709599282518 +- kind: conda + name: charset-normalizer + version: 3.3.2 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.3.2-pyhd8ed1ab_0.conda + sha256: 20cae47d31fdd58d99c4d2e65fbdcefa0b0de0c84e455ba9d6356a4bdbc4b5b9 + md5: 7f4a9e3fcff3f6356ae99244a014da6a + depends: + - python >=3.7 + license: MIT + license_family: MIT + purls: + - pkg:pypi/charset-normalizer + size: 46597 + timestamp: 1698833765762 +- kind: conda + name: click + version: 8.1.7 + build: win_pyh7428d3b_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-win_pyh7428d3b_0.conda + sha256: 90236b113b9a20041736e80b80ee965167f9aac0468315c55e2bad902d673fb0 + md5: 3549ecbceb6cd77b91a105511b7d0786 + depends: + - __win + - colorama + - python >=3.8 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/click + size: 85051 + timestamp: 1692312207348 +- kind: conda + name: colorama + version: 0.4.6 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2 + sha256: 2c1b2e9755ce3102bca8d69e8f26e4f087ece73f50418186aee7c74bef8e1698 + md5: 3faab06a954c2a04039983f2c4a50d99 + depends: + - python >=3.7 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/colorama + size: 25170 + timestamp: 1666700778190 +- kind: pypi + name: contourpy + version: 1.2.0 + url: https://files.pythonhosted.org/packages/ca/2a/d197a412ec474391ee878b1218cf2fe9c6e963903755887fc5654c06636a/contourpy-1.2.0-cp311-cp311-win_amd64.whl + sha256: 99ad97258985328b4f207a5e777c1b44a83bfe7cf1f87b99f9c11d4ee477c4de + requires_dist: + - numpy <2.0, >=1.20 + - furo ; extra == 'docs' + - sphinx >=7.2 ; extra == 'docs' + - sphinx-copybutton ; extra == 'docs' + - bokeh ; extra == 'bokeh' + - selenium ; extra == 'bokeh' + - contourpy[bokeh,docs] ; extra == 'mypy' + - docutils-stubs ; extra == 'mypy' + - mypy ==1.6.1 ; extra == 'mypy' + - types-pillow ; extra == 'mypy' + - contourpy[test-no-images] ; extra == 'test' + - matplotlib ; extra == 'test' + - pillow ; extra == 'test' + - pytest ; extra == 'test-no-images' + - pytest-cov ; extra == 'test-no-images' + - pytest-xdist ; extra == 'test-no-images' + - wurlitzer ; extra == 'test-no-images' + requires_python: '>=3.9' +- kind: conda + name: cryptography + version: 42.0.5 + build: py311h28e9c30_0 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/cryptography-42.0.5-py311h28e9c30_0.conda + sha256: c4aff2311f4e6a19e8ade41b826d2bd705ed95a0760d9bd734382fdcc251309a + md5: e51206d9da67379e8226173484f9b6a7 + depends: + - cffi >=1.12 + - openssl >=3.2.1,<4.0a0 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: Apache-2.0 AND BSD-3-Clause AND PSF-2.0 AND MIT + license_family: BSD + size: 1163078 + timestamp: 1708781139715 +- kind: pypi + name: cycler + version: 0.12.1 + url: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl + sha256: 85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30 + requires_dist: + - ipython ; extra == 'docs' + - matplotlib ; extra == 'docs' + - numpydoc ; extra == 'docs' + - sphinx ; extra == 'docs' + - pytest ; extra == 'tests' + - pytest-cov ; extra == 'tests' + - pytest-xdist ; extra == 'tests' + requires_python: '>=3.8' +- kind: conda + name: docker-py + version: 7.0.0 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/docker-py-7.0.0-pyhd8ed1ab_0.conda + sha256: b9bf5990dc968123e5817096daddd2105857cfd4c5b94c0937d929bc74fc7a31 + md5: aec5f308cb9055e83c59afecd5fcb58a + depends: + - packaging >=14.0 + - paramiko >=2.4.3 + - python >=3.7 + - pywin32-on-windows + - requests >=2.26.0 + - urllib3 >=1.26.0 + - websocket-client >=0.32.0 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/docker + size: 103474 + timestamp: 1702081626157 +- kind: conda + name: ecdsa + version: 0.18.0 + build: pyhd8ed1ab_1 + build_number: 1 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/ecdsa-0.18.0-pyhd8ed1ab_1.tar.bz2 + sha256: 7770998e7b1ad6b80d1c3ffa71ae3f8812260676f0268d339abe32879115bc0c + md5: 566165664cc0964a7202dc239af6619d + depends: + - gmpy2 + - python >=3.3 + - six >=1.9.0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/ecdsa + size: 122345 + timestamp: 1657437614057 +- kind: conda + name: flask + version: 3.0.2 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/flask-3.0.2-pyhd8ed1ab_0.conda + sha256: d5bfe0e74b001572135bef51ffa329fa2f5dfd37fb87b2878ed851025ced9334 + md5: 7f88df670921cc31c309719e30c22021 + depends: + - blinker >=1.6.2 + - click >=8.1.3 + - importlib-metadata >=3.6.0 + - itsdangerous >=2.1.2 + - jinja2 >=3.1.2 + - python >=3.8 + - werkzeug >=3.0.0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/flask + size: 80485 + timestamp: 1707044052869 +- kind: conda + name: flask_cors + version: 3.0.10 + build: pyhd3deb0d_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/flask_cors-3.0.10-pyhd3deb0d_0.tar.bz2 + sha256: 0ffe072bf8b7bfdbb3a2e6f41cd65264259a92a77db3fb3ffc4e74f3eee2ea4d + md5: f06be6d2d27dc3ea2b3da84ade76583c + depends: + - flask >=0.9 + - python + - six + license: MIT + license_family: MIT + purls: + - pkg:pypi/flask-cors + size: 15089 + timestamp: 1609901852949 +- kind: pypi + name: fonttools + version: 4.49.0 + url: https://files.pythonhosted.org/packages/ea/69/89f4bb69e28bb293b95abb0a66d49a841580451a584adb1aba59f39b6dff/fonttools-4.49.0-cp311-cp311-win_amd64.whl + sha256: fc11e5114f3f978d0cea7e9853627935b30d451742eeb4239a81a677bdee6bf6 + requires_dist: + - fs <3, >=2.2.0 ; extra == 'all' + - lxml >=4.0 ; extra == 'all' + - zopfli >=0.1.4 ; extra == 'all' + - lz4 >=1.7.4.2 ; extra == 'all' + - pycairo ; extra == 'all' + - matplotlib ; extra == 'all' + - sympy ; extra == 'all' + - skia-pathops >=0.5.0 ; extra == 'all' + - uharfbuzz >=0.23.0 ; extra == 'all' + - brotlicffi >=0.8.0 ; platform_python_implementation != 'CPython' and extra == 'all' + - scipy ; platform_python_implementation != 'PyPy' and extra == 'all' + - brotli >=1.0.1 ; platform_python_implementation == 'CPython' and extra == 'all' + - munkres ; platform_python_implementation == 'PyPy' and extra == 'all' + - unicodedata2 >=15.1.0 ; python_version <= '3.12' and extra == 'all' + - xattr ; sys_platform == 'darwin' and extra == 'all' + - lz4 >=1.7.4.2 ; extra == 'graphite' + - pycairo ; extra == 'interpolatable' + - scipy ; platform_python_implementation != 'PyPy' and extra == 'interpolatable' + - munkres ; platform_python_implementation == 'PyPy' and extra == 'interpolatable' + - lxml >=4.0 ; extra == 'lxml' + - skia-pathops >=0.5.0 ; extra == 'pathops' + - matplotlib ; extra == 'plot' + - uharfbuzz >=0.23.0 ; extra == 'repacker' + - sympy ; extra == 'symfont' + - xattr ; sys_platform == 'darwin' and extra == 'type1' + - fs <3, >=2.2.0 ; extra == 'ufo' + - unicodedata2 >=15.1.0 ; python_version <= '3.12' and extra == 'unicode' + - zopfli >=0.1.4 ; extra == 'woff' + - brotlicffi >=0.8.0 ; platform_python_implementation != 'CPython' and extra == 'woff' + - brotli >=1.0.1 ; platform_python_implementation == 'CPython' and extra == 'woff' + requires_python: '>=3.8' +- kind: conda + name: gmpy2 + version: 2.1.2 + build: py311h419b2c2_1 + build_number: 1 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/gmpy2-2.1.2-py311h419b2c2_1.tar.bz2 + sha256: 7c31e5ed9070e2d5c9ca8490443a77009fa75dab112706b04f180516e4067eff + md5: 590703891acc83654ced4d914e88af84 + depends: + - mpc >=1.2.1,<2.0a0 + - mpfr >=4.1.0,<5.0a0 + - mpir >=3.0.0,<4.0a0 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vs2015_runtime >=14.29.30139 + license: LGPL-3.0-or-later + license_family: LGPL + purls: + - pkg:pypi/gmpy2 + size: 165009 + timestamp: 1666810762174 +- kind: conda + name: graphql-core + version: 3.2.3 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/graphql-core-3.2.3-pyhd8ed1ab_0.tar.bz2 + sha256: 6f7da913ecad98951cadfe512af2c3979fbff752bf714da66760701e5463dd29 + md5: 87cafe8c7638a5ac6fd8ec8fb01f1508 + depends: + - python >=3.6 + - typing_extensions >=4,<5 + license: MIT + license_family: MIT + purls: + - pkg:pypi/graphql-core + size: 366839 + timestamp: 1663938476477 +- kind: conda + name: idna + version: '3.6' + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/idna-3.6-pyhd8ed1ab_0.conda + sha256: 6ee4c986d69ce61e60a20b2459b6f2027baeba153f0a64995fd3cb47c2cc7e07 + md5: 1a76f09108576397c41c0b0c5bd84134 + depends: + - python >=3.6 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/idna + size: 50124 + timestamp: 1701027126206 +- kind: conda + name: importlib-metadata + version: 7.0.2 + build: pyha770c72_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-7.0.2-pyha770c72_0.conda + sha256: 9a26136d2cc81ccac209d6ae24281ceba3365fe34e34b2c45570f2a96e9d9c1b + md5: b050a4bb0e90ebd6e7fa4093d6346867 + depends: + - python >=3.8 + - zipp >=0.5 + license: Apache-2.0 + license_family: APACHE + size: 26900 + timestamp: 1709821273570 +- kind: conda + name: importlib_metadata + version: 7.0.2 + build: hd8ed1ab_0 + subdir: noarch + noarch: generic + url: https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-7.0.2-hd8ed1ab_0.conda + sha256: b250e6a3e741b762bb2caf05119feb6245cb41b468542e5a9263cd01671098f7 + md5: d11132727a247f2c1998779a2af743a1 + depends: + - importlib-metadata >=7.0.2,<7.0.3.0a0 + license: Apache-2.0 + license_family: APACHE + size: 9439 + timestamp: 1709821278370 +- kind: conda + name: importlib_resources + version: 6.1.3 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.1.3-pyhd8ed1ab_0.conda + sha256: d651911f327987a32626e06efdc4719f5880f6e5db84a075fad6b344b7652fe8 + md5: b865eadcceebf641fa833ee086756e8b + depends: + - python >=3.8 + - zipp >=3.1.0 + constrains: + - importlib-resources >=6.1.3,<6.1.4.0a0 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/importlib-resources + size: 30666 + timestamp: 1709821283746 +- kind: conda + name: itsdangerous + version: 2.1.2 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/itsdangerous-2.1.2-pyhd8ed1ab_0.tar.bz2 + sha256: 31e3492686b4e92b53db9b48bc0eb03873b1caaf28629fee7d2d47627a2c56d3 + md5: 3c3de74912f11d2b590184f03c7cd09b + depends: + - python >=3.7 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/itsdangerous + size: 16377 + timestamp: 1648147263536 +- kind: conda + name: jinja2 + version: 3.1.3 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.3-pyhd8ed1ab_0.conda + sha256: fd517b7dd3a61eca34f8a6f9f92f306397149cae1204fce72ac3d227107dafdc + md5: e7d8df6509ba635247ff9aea31134262 + depends: + - markupsafe >=2.0 + - python >=3.7 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/jinja2 + size: 111589 + timestamp: 1704967140287 +- kind: conda + name: jmespath + version: 1.0.1 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/jmespath-1.0.1-pyhd8ed1ab_0.tar.bz2 + sha256: 95ac5f9ee95fd4e34dc051746fc86016d3d4f6abefed113e2ede049d59ec2991 + md5: 2cfa3e1cf3fb51bb9b17acc5b5e9ea11 + depends: + - python >=3.7 + license: MIT + license_family: MIT + purls: + - pkg:pypi/jmespath + size: 21003 + timestamp: 1655568358125 +- kind: conda + name: joserfc + version: 0.9.0 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/joserfc-0.9.0-pyhd8ed1ab_0.conda + sha256: a4283e21281679c54b8d4eb5b6992c22078fbbfced8250d629d1f76834778ae8 + md5: be29c638909641ea369e91e0d53bc04e + depends: + - cryptography + - python >=3.8 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/joserfc + size: 45743 + timestamp: 1710064274693 +- kind: conda + name: jschema-to-python + version: 1.2.3 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/jschema-to-python-1.2.3-pyhd8ed1ab_0.tar.bz2 + sha256: 244f9103888438b57ab9f4aac7a8aba8db19947267fd2ddbdaa2222c39f6c8a9 + md5: 686ca7c72f9583791fe424600987411f + depends: + - attrs + - jsonpickle + - pbr + - python >=3.6 + license: MIT + license_family: MIT + purls: + - pkg:pypi/jschema-to-python + size: 11963 + timestamp: 1637091554664 +- kind: conda + name: jsondiff + version: 2.0.0 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/jsondiff-2.0.0-pyhd8ed1ab_0.tar.bz2 + sha256: 04e6b6fbec9e262781c5c753cee5c6baf5e22767242ec3db54d2208463814df1 + md5: 737c0737e5d262688097097534fb1bd5 + depends: + - python >=3.6 + license: MIT + license_family: MIT + purls: + - pkg:pypi/jsondiff + size: 10412 + timestamp: 1649613086031 +- kind: conda + name: jsonpatch + version: '1.33' + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/jsonpatch-1.33-pyhd8ed1ab_0.conda + sha256: fbb17e33ace3225c6416d1604637c1058906b8223da968cc015128985336b2b4 + md5: bfdb7c5c6ad1077c82a69a8642c87aff + depends: + - jsonpointer >=1.9 + - python >=3.8 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/jsonpatch + size: 17366 + timestamp: 1695536420928 +- kind: conda + name: jsonpickle + version: 3.0.2 + build: pyhd8ed1ab_1 + build_number: 1 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/jsonpickle-3.0.2-pyhd8ed1ab_1.conda + sha256: c947f2a64e4f06c722973894afb8e26df3aa2212e2e742def3506ccbad42141b + md5: f351864256e291b24b5a3bedda184bff + depends: + - importlib_metadata + - python >=3.7 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/jsonpickle + size: 39358 + timestamp: 1697667677996 +- kind: conda + name: jsonpointer + version: '2.4' + build: py311h1ea47a8_3 + build_number: 3 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/jsonpointer-2.4-py311h1ea47a8_3.conda + sha256: 13042586b08e8caa60615e7c42d05601f9421e8bda5df932e3ef9d2401bf2435 + md5: db8fc59f9215e668e602f769d0bf67bb + depends: + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/jsonpointer + size: 34654 + timestamp: 1695397742357 +- kind: conda + name: jsonschema + version: 4.21.1 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.21.1-pyhd8ed1ab_0.conda + sha256: c5c1b4e08e91fdd697289015be1a176409b4e63942899a43b276f1f250be8129 + md5: 8a3a3d01629da20befa340919e3dd2c4 + depends: + - attrs >=22.2.0 + - importlib_resources >=1.4.0 + - jsonschema-specifications >=2023.03.6 + - pkgutil-resolve-name >=1.3.10 + - python >=3.8 + - referencing >=0.28.4 + - rpds-py >=0.7.1 + license: MIT + license_family: MIT + size: 72817 + timestamp: 1705707712082 +- kind: conda + name: jsonschema-path + version: 0.3.2 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/jsonschema-path-0.3.2-pyhd8ed1ab_0.conda + sha256: 37d650a156a086a113be9ae917ba9737000be54e8939edd25e8d9f6fdd208bf2 + md5: 397d8d6ea406285f184534976f5bc9ae + depends: + - pathable >=0.4.1,<0.5.0 + - python >=3.8.0 + - pyyaml >=5.1 + - referencing >=0.28.0,<0.31.0 + - requests >=2.31.0,<3.0.0 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/jsonschema-path + size: 17957 + timestamp: 1700052469896 +- kind: conda + name: jsonschema-specifications + version: 2023.7.1 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2023.7.1-pyhd8ed1ab_0.conda + sha256: 7b0061e106674f27cc718f79a095e90a5667a3635ec6626dd23b3be0fd2bfbdc + md5: 7c27ea1bdbe520bb830dcadd59f55cbf + depends: + - importlib_resources >=1.4.0 + - python >=3.8 + - referencing >=0.25.0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/jsonschema-specifications + size: 15296 + timestamp: 1689701341221 +- kind: conda + name: junit-xml + version: '1.9' + build: pyh9f0ad1d_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/junit-xml-1.9-pyh9f0ad1d_0.tar.bz2 + sha256: b89ace740500f4a311475ae44add2675d72dc42c02971910ea844812edf93736 + md5: 7b503c6c097fa8677d6ff17d2bfb623f + depends: + - python + - six + license: MIT + license_family: MIT + size: 10521 + timestamp: 1601482753179 +- kind: pypi + name: kiwisolver + version: 1.4.5 + url: https://files.pythonhosted.org/packages/1e/37/d3c2d4ba2719059a0f12730947bbe1ad5ee8bff89e8c35319dcb2c9ddb4c/kiwisolver-1.4.5-cp311-cp311-win_amd64.whl + sha256: 6c08e1312a9cf1074d17b17728d3dfce2a5125b2d791527f33ffbe805200a355 + requires_dist: + - typing-extensions ; python_version < '3.8' + requires_python: '>=3.7' +- kind: conda + name: lazy-object-proxy + version: 1.10.0 + build: py311ha68e1ae_0 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/lazy-object-proxy-1.10.0-py311ha68e1ae_0.conda + sha256: 88abe80109f318de48e8353aab12395b6d840c1d051f6531c122aa12d0342c1f + md5: 922a4f709c7331941eebea33ffb97ab6 + depends: + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: BSD-2-Clause + license_family: BSD + purls: + - pkg:pypi/lazy-object-proxy + size: 40743 + timestamp: 1702664095597 +- kind: conda + name: libexpat + version: 2.6.1 + build: h63175ca_0 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.6.1-h63175ca_0.conda + sha256: 160ef43c55806495e8f96fc49ded0ab538c1cde9fdecafa1eb92a568e470ae20 + md5: 6d663a0052380f703665a290e5fbb922 + constrains: + - expat 2.6.1.* + license: MIT + license_family: MIT + size: 139015 + timestamp: 1709746966440 +- kind: conda + name: libffi + version: 3.4.2 + build: h8ffe710_5 + build_number: 5 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/libffi-3.4.2-h8ffe710_5.tar.bz2 + sha256: 1951ab740f80660e9bc07d2ed3aefb874d78c107264fd810f24a1a6211d4b1a5 + md5: 2c96d1b6915b408893f9472569dee135 + depends: + - vc >=14.1,<15.0a0 + - vs2015_runtime >=14.16.27012 + license: MIT + license_family: MIT + size: 42063 + timestamp: 1636489106777 +- kind: conda + name: libsqlite + version: 3.45.1 + build: hcfcfb64_0 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.45.1-hcfcfb64_0.conda + sha256: e1010f4ac7b056d85d91e6cb6137ef118f920eba88059261689e543780b230df + md5: c583c1d6999b7aa148eff3089e13c44b + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: Unlicense + size: 870045 + timestamp: 1707495642340 +- kind: conda + name: libzlib + version: 1.2.13 + build: hcfcfb64_5 + build_number: 5 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.2.13-hcfcfb64_5.conda + sha256: c161822ee8130b71e08b6d282b9919c1de2c5274b29921a867bca0f7d30cad26 + md5: 5fdb9c6a113b6b6cb5e517fd972d5f41 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + constrains: + - zlib 1.2.13 *_5 + license: Zlib + license_family: Other + size: 55800 + timestamp: 1686575452215 +- kind: conda + name: markupsafe + version: 2.1.5 + build: py311ha68e1ae_0 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/markupsafe-2.1.5-py311ha68e1ae_0.conda + sha256: c629f79fe78b5df7f08daa6b7f125f7a67f789bf734949c6d68aa063d7296208 + md5: 07da1326e2837e055ef6f44ef3334b0a + depends: + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + constrains: + - jinja2 >=3.0.0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/markupsafe + size: 30011 + timestamp: 1706900632904 +- kind: pypi + name: matplotlib + version: 3.8.3 + url: https://files.pythonhosted.org/packages/a1/27/8a807464b0cf47fdf3ba8cbb542d4f3a551da0254d7588667857f8a8a88a/matplotlib-3.8.3-cp311-cp311-win_amd64.whl + sha256: 40321634e3a05ed02abf7c7b47a50be50b53ef3eaa3a573847431a545585b407 + requires_dist: + - contourpy >=1.0.1 + - cycler >=0.10 + - fonttools >=4.22.0 + - kiwisolver >=1.3.1 + - numpy <2, >=1.21 + - packaging >=20.0 + - pillow >=8 + - pyparsing >=2.3.1 + - python-dateutil >=2.7 + - importlib-resources >=3.2.0 ; python_version < '3.10' + requires_python: '>=3.9' +- kind: conda + name: moto + version: 5.0.3 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/moto-5.0.3-pyhd8ed1ab_0.conda + sha256: 89edf678481fc620ce5bdb49b8d0f14cf43d3386ec7bd39a445b249762130241 + md5: 31d81c30d7244228121e31a40c7dc612 + depends: + - aws-xray-sdk !=0.96,>=0.93 + - boto3 >=1.9.201 + - botocore >=1.12.201 + - cfn-lint >=0.40.0 + - cryptography >=3.3.1 + - docker-py >=2.5.1 + - flask !=2.2.0,!=2.2.1 + - flask_cors + - graphql-core + - idna >=2.5,<4 + - importlib_metadata + - jinja2 >=2.10.1 + - joserfc + - jsondiff >=1.1.2 + - openapi-spec-validator >=0.2.8 + - pyparsing >=3.0.7 + - python >=3.3 + - python-dateutil >=2.1,<3.0.0 + - python-jose >=3.1.0,<4.0.0 + - pytz + - pyyaml >=5.1 + - requests >=2.5 + - responses >=0.9.0 + - setuptools + - sshpubkeys >=3.1.0 + - werkzeug >=0.5,!=2.2.0,!=2.2.1 + - xmltodict + license: Apache-2.0 + license_family: APACHE + size: 1926030 + timestamp: 1710084527235 +- kind: conda + name: mpc + version: 1.3.1 + build: h4ff82f8_0 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/mpc-1.3.1-h4ff82f8_0.conda + sha256: 66ff57d0a9d19d0fdcef0ea77704873d6709f8fce4e4eb00eda38ba77dd581e9 + md5: 41067dedcc6a2e03c28a4adb75b841bc + depends: + - mpfr >=4.1.0,<5.0a0 + - mpir >=3.0.0,<4.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vs2015_runtime >=14.29.30139 + license: LGPL-3.0-or-later + license_family: LGPL + size: 109570 + timestamp: 1674264690969 +- kind: conda + name: mpfr + version: 4.2.1 + build: h64bf75a_0 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/mpfr-4.2.1-h64bf75a_0.conda + sha256: d7de072ecf72828ca4efaa306204e95249009952da1cce12d25eeed938ce77e6 + md5: 79630cb281f008b9cd4975c6a4748c65 + depends: + - mpir >=3.0.0,<4.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: LGPL-3.0-only + license_family: LGPL + size: 386668 + timestamp: 1698005520388 +- kind: conda + name: mpir + version: 3.0.0 + build: he025d50_1002 + build_number: 1002 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/mpir-3.0.0-he025d50_1002.tar.bz2 + sha256: c7243b2c3f8e849a9367eab8d77babcd8dd5b828d6b5068441297edc86843b69 + md5: 126ea50b4b4a33448c3994df2ff8b0cc + depends: + - vc >=14,<15.0a0 + license: LGPL 3 + size: 3119992 + timestamp: 1543566020324 +- kind: conda + name: mpmath + version: 1.3.0 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.3.0-pyhd8ed1ab_0.conda + sha256: a4f025c712ec1502a55c471b56a640eaeebfce38dd497d5a1a33729014cac47a + md5: dbf6e2d89137da32fa6670f3bffc024e + depends: + - python >=3.6 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/mpmath + size: 438339 + timestamp: 1678228210181 +- kind: conda + name: networkx + version: 3.2.1 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/networkx-3.2.1-pyhd8ed1ab_0.conda + sha256: 7629aa4f9f8cdff45ea7a4701fe58dccce5bf2faa01c26eb44cbb27b7e15ca9d + md5: 425fce3b531bed6ec3c74fab3e5f0a1c + depends: + - python >=3.9 + constrains: + - matplotlib >=3.5 + - scipy >=1.9,!=1.11.0,!=1.11.1 + - numpy >=1.22 + - pandas >=1.4 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/networkx + size: 1149552 + timestamp: 1698504905258 +- kind: pypi + name: numpy + version: 1.26.4 + url: https://files.pythonhosted.org/packages/3f/6b/5610004206cf7f8e7ad91c5a85a8c71b2f2f8051a0c0c4d5916b76d6cbb2/numpy-1.26.4-cp311-cp311-win_amd64.whl + sha256: cd25bcecc4974d09257ffcd1f098ee778f7834c3ad767fe5db785be9a4aa9cb2 + requires_python: '>=3.9' +- kind: conda + name: openapi-schema-validator + version: 0.6.2 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/openapi-schema-validator-0.6.2-pyhd8ed1ab_0.conda + sha256: 184ab5d662741d549e5bdc3ea75846ed9a5d0ae2072d9b970d92ab0e4fbe6145 + md5: 86794cb397bb1b311da59f9ac232b0c8 + depends: + - jsonschema >=4.19.1,<5.0.0a0 + - jsonschema-specifications >=2023.5.2,<2024.0.0 + - python >=3.8 + - rfc3339-validator + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/openapi-schema-validator + size: 17458 + timestamp: 1696516113933 +- kind: conda + name: openapi-spec-validator + version: 0.7.1 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/openapi-spec-validator-0.7.1-pyhd8ed1ab_0.conda + sha256: b3aff38febb575647f1b5ad246dc4a9f221e3f712027a71be6e2554c3fe44220 + md5: 01d3b50ae6ec011c99b043388fc3148d + depends: + - importlib_resources >=5.8,<7.0 + - jsonschema >=4.18.0,<5.0.0 + - jsonschema-path >=0.3.1,<0.4.0 + - lazy-object-proxy >=1.7.1,<2.0.0 + - openapi-schema-validator >=0.6.0,<0.7.0 + - python >=3.8.0 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/openapi-spec-validator + size: 41961 + timestamp: 1697293600865 +- kind: conda + name: openssl + version: 3.2.1 + build: hcfcfb64_0 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/openssl-3.2.1-hcfcfb64_0.conda + sha256: 1df1c43136f863d5e9ba20b703001caf9a4d0ea56bdc3eeb948c977e3d4f91d3 + md5: 158df8eead8092cf0e27167c8761a8dd + depends: + - ca-certificates + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + constrains: + - pyopenssl >=22.1 + license: Apache-2.0 + license_family: Apache + size: 8229619 + timestamp: 1706638014697 +- kind: conda + name: packaging + version: '24.0' + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/packaging-24.0-pyhd8ed1ab_0.conda + sha256: a390182d74c31dfd713c16db888c92c277feeb6d1fe96ff9d9c105f9564be48a + md5: 248f521b64ce055e7feae3105e7abeb8 + depends: + - python >=3.8 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/packaging + size: 49832 + timestamp: 1710076089469 +- kind: conda + name: paramiko + version: 3.4.0 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/paramiko-3.4.0-pyhd8ed1ab_0.conda + sha256: 2e66359261954a79b66858c30e69ea6dd4380bf8bd733940527386b25e31dd13 + md5: a5e792523b028b06d7ce6e65a6cd4a33 + depends: + - bcrypt >=3.2 + - cryptography >=3.3 + - pynacl >=1.5 + - python >=3.6 + license: LGPL-2.1-or-later + license_family: LGPL + purls: + - pkg:pypi/paramiko + size: 160045 + timestamp: 1703016056314 +- kind: conda + name: pathable + version: 0.4.3 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/pathable-0.4.3-pyhd8ed1ab_0.tar.bz2 + sha256: 7258b7f6a8e5fcd5e5a22e0a85b89e03e9cf5049d1591bc98420fd080007f25d + md5: f3e7301de38fd621c902faf8087bc564 + depends: + - python >=3.7 + license: Apache-2.0 + license_family: APACHE + size: 16637 + timestamp: 1662125265190 +- kind: conda + name: pbr + version: 6.0.0 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/pbr-6.0.0-pyhd8ed1ab_0.conda + sha256: 4c83853fc6349de163c2871613e064e5fdab91723db9b50bcda681adc05e4b87 + md5: 8dbab5ba746ed14aa32cb232dc437f8f + depends: + - pip + - python >=3.6 + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/pbr + size: 73106 + timestamp: 1699384879677 +- kind: pypi + name: pillow + version: 10.2.0 + url: https://files.pythonhosted.org/packages/43/56/f92715a873187b5eff72a4a0d2ac6258e18e9bfb0e136aafde65c49a841a/pillow-10.2.0-cp311-cp311-win_amd64.whl + sha256: 1da3b2703afd040cf65ec97efea81cfba59cdbed9c11d8efc5ab09df9509fc56 + requires_dist: + - furo ; extra == 'docs' + - olefile ; extra == 'docs' + - sphinx >=2.4 ; extra == 'docs' + - sphinx-copybutton ; extra == 'docs' + - sphinx-inline-tabs ; extra == 'docs' + - sphinx-removed-in ; extra == 'docs' + - sphinxext-opengraph ; extra == 'docs' + - olefile ; extra == 'fpx' + - olefile ; extra == 'mic' + - check-manifest ; extra == 'tests' + - coverage ; extra == 'tests' + - defusedxml ; extra == 'tests' + - markdown2 ; extra == 'tests' + - olefile ; extra == 'tests' + - packaging ; extra == 'tests' + - pyroma ; extra == 'tests' + - pytest ; extra == 'tests' + - pytest-cov ; extra == 'tests' + - pytest-timeout ; extra == 'tests' + - typing-extensions ; python_version < '3.10' and extra == 'typing' + - defusedxml ; extra == 'xmp' + requires_python: '>=3.8' +- kind: conda + name: pip + version: '24.0' + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/pip-24.0-pyhd8ed1ab_0.conda + sha256: b7c1c5d8f13e8cb491c4bd1d0d1896a4cf80fc47de01059ad77509112b664a4a + md5: f586ac1e56c8638b64f9c8122a7b8a67 + depends: + - python >=3.7 + - setuptools + - wheel + license: MIT + license_family: MIT + purls: + - pkg:pypi/pip + size: 1398245 + timestamp: 1706960660581 +- kind: conda + name: pkgutil-resolve-name + version: 1.3.10 + build: pyhd8ed1ab_1 + build_number: 1 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/pkgutil-resolve-name-1.3.10-pyhd8ed1ab_1.conda + sha256: fecf95377134b0e8944762d92ecf7b0149c07d8186fb5db583125a2705c7ea0a + md5: 405678b942f2481cecdb3e010f4925d9 + depends: + - python >=3.6 + license: MIT AND PSF-2.0 + purls: + - pkg:pypi/pkgutil-resolve-name + size: 10778 + timestamp: 1694617398467 +- kind: conda + name: pyasn1 + version: 0.5.1 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/pyasn1-0.5.1-pyhd8ed1ab_0.conda + sha256: 8b116da9acbb471e107203c11acaffcb259aca2367aa7e83e796e43ed5d381b3 + md5: fb1a800972b072aa4d16450983c81418 + depends: + - python !=3.0,!=3.1,!=3.2,!=3.3,!=3.4,!=3.5 + license: BSD-2-Clause + license_family: BSD + purls: + - pkg:pypi/pyasn1 + size: 63586 + timestamp: 1701287134208 +- kind: conda + name: pycparser + version: '2.21' + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.21-pyhd8ed1ab_0.tar.bz2 + sha256: 74c63fd03f1f1ea2b54e8bc529fd1a600aaafb24027b738d0db87909ee3a33dc + md5: 076becd9e05608f8dc72757d5f3a91ff + depends: + - python ==2.7.*|>=3.4 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/pycparser + size: 102747 + timestamp: 1636257201998 +- kind: conda + name: pydantic + version: 2.6.3 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.6.3-pyhd8ed1ab_0.conda + sha256: 7367461b8f9e309f20f129605daa78635a1daa2538fe0b40d7f7238f8d430a29 + md5: 4f4e78b41c489b89d98719fcbde09361 + depends: + - annotated-types >=0.4.0 + - pydantic-core 2.16.3 + - python >=3.7 + - typing-extensions >=4.6.1 + license: MIT + license_family: MIT + purls: + - pkg:pypi/pydantic + size: 271902 + timestamp: 1709075341323 +- kind: conda + name: pydantic-core + version: 2.16.3 + build: py311hc37eb10_0 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/pydantic-core-2.16.3-py311hc37eb10_0.conda + sha256: 3ccbc5d14b643c1bf406b2da39f7cd318d2f5cd9f2f37796efad2a825a2dce53 + md5: 20243cfaf181fac16e4ce93418756ab5 + depends: + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + - typing-extensions >=4.6.0,!=4.7.0 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: MIT + license_family: MIT + purls: + - pkg:pypi/pydantic-core + size: 1613720 + timestamp: 1708701859366 +- kind: conda + name: pynacl + version: 1.5.0 + build: py311hd53affc_3 + build_number: 3 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/pynacl-1.5.0-py311hd53affc_3.conda + sha256: 5c226512cb702b0d19a760eb2ad7b38716592a782300cd27e880043987c741ac + md5: f281b8aabfefac05a58db6a623be8e5c + depends: + - cffi >=1.4.1 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + - six + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/pynacl + size: 1244245 + timestamp: 1695545315762 +- kind: conda + name: pyparsing + version: 3.1.2 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.2-pyhd8ed1ab_0.conda + sha256: 06c77cb03e5dde2d939b216c99dd2db52ea93a4c7c599f3882f136005c359c7b + md5: b9a4dacf97241704529131a0dfc0494f + depends: + - python >=3.6 + license: MIT + license_family: MIT + purls: + - pkg:pypi/pyparsing + size: 89455 + timestamp: 1709721146886 +- kind: conda + name: pysocks + version: 1.7.1 + build: pyh0701188_6 + build_number: 6 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyh0701188_6.tar.bz2 + sha256: b3a612bc887f3dd0fb7c4199ad8e342bd148cf69a9b74fd9468a18cf2bef07b7 + md5: 56cd9fe388baac0e90c7149cfac95b60 + depends: + - __win + - python >=3.8 + - win_inet_pton + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/pysocks + size: 19348 + timestamp: 1661605138291 +- kind: conda + name: python + version: 3.11.8 + build: h2628c8c_0_cpython + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/python-3.11.8-h2628c8c_0_cpython.conda + sha256: 8b2db64acfd351f4281d75465b09109f4b51096d5e58128cb7a4c1d2ade47203 + md5: 5af649cf283ec4c1ffff5c4fe0cec12b + depends: + - bzip2 >=1.0.8,<2.0a0 + - libexpat >=2.5.0,<3.0a0 + - libffi >=3.4,<4.0a0 + - libsqlite >=3.45.1,<4.0a0 + - libzlib >=1.2.13,<1.3.0a0 + - openssl >=3.2.1,<4.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + - xz >=5.2.6,<6.0a0 + constrains: + - python_abi 3.11.* *_cp311 + license: Python-2.0 + size: 18096526 + timestamp: 1708116524168 +- kind: conda + name: python-dateutil + version: 2.9.0 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda + sha256: f3ceef02ac164a8d3a080d0d32f8e2ebe10dd29e3a685d240e38b3599e146320 + md5: 2cf4264fffb9e6eff6031c5b6884d61c + depends: + - python >=3.7 + - six >=1.5 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/python-dateutil + size: 222742 + timestamp: 1709299922152 +- kind: conda + name: python-jose + version: 3.3.0 + build: pyh6c4a22f_1 + build_number: 1 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/python-jose-3.3.0-pyh6c4a22f_1.tar.bz2 + sha256: 31bcedfa1803116e589602a24db4a01dbda2e0df819f497cb5d48c29d17631ec + md5: 8fa19760945f1c3754c9419c6459f7e0 + depends: + - cryptography + - ecdsa !=0.15 + - pyasn1 + - python >=3.6 + - rsa + license: MIT + license_family: MIT + purls: + - pkg:pypi/python-jose + size: 115786 + timestamp: 1624701909146 +- kind: conda + name: python_abi + version: '3.11' + build: 4_cp311 + build_number: 4 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/python_abi-3.11-4_cp311.conda + sha256: 67c2aade3e2160642eec0742384e766b20c766055e3d99335681e3e05d88ed7b + md5: 70513332c71b56eace4ee6441e66c012 + constrains: + - python 3.11.* *_cpython + license: BSD-3-Clause + license_family: BSD + size: 6755 + timestamp: 1695147711935 +- kind: conda + name: pytz + version: '2024.1' + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda + sha256: 1a7d6b233f7e6e3bbcbad054c8fd51e690a67b129a899a056a5e45dd9f00cb41 + md5: 3eeeeb9e4827ace8c0c1419c85d590ad + depends: + - python >=3.7 + license: MIT + license_family: MIT + purls: + - pkg:pypi/pytz + size: 188538 + timestamp: 1706886944988 +- kind: conda + name: pywin32 + version: '306' + build: py311h12c1d0e_2 + build_number: 2 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/pywin32-306-py311h12c1d0e_2.conda + sha256: 79d942817bdaf384602113e5fcb9158dc45cae4044bed308918a5db97f141fdb + md5: 25df0fc55722ea1a94494f41302e2d1c + depends: + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: PSF-2.0 + license_family: PSF + size: 6124285 + timestamp: 1695974706892 +- kind: conda + name: pywin32-on-windows + version: 0.1.0 + build: pyh07e9846_2 + build_number: 2 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/pywin32-on-windows-0.1.0-pyh07e9846_2.tar.bz2 + sha256: 09803b75cccc16d8586d2f41ea890658d165f4afc359973fa1c7904a2c140eae + md5: 91733394059b880d9cc0d010c20abda0 + depends: + - python >=2.7 + - pywin32 + license: BSD-3-Clause + license_family: BSD + size: 5282 + timestamp: 1646866839398 +- kind: conda + name: pyyaml + version: 6.0.1 + build: py311ha68e1ae_1 + build_number: 1 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/pyyaml-6.0.1-py311ha68e1ae_1.conda + sha256: 4fb0770fc70381a8ab3ced33413ad9dc5e82d4c535b593edd580113ce8760298 + md5: 2b4128962cd665153e946f2a88667a3b + depends: + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + - yaml >=0.2.5,<0.3.0a0 + license: MIT + license_family: MIT + size: 175469 + timestamp: 1695374086205 +- kind: conda + name: referencing + version: 0.30.2 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/referencing-0.30.2-pyhd8ed1ab_0.conda + sha256: a6768fabc12f1eed87fec68c5c65439e908655cded1e458d70a164abbce13287 + md5: a33161b983172ba6ef69d5fc850650cd + depends: + - attrs >=22.2.0 + - python >=3.8 + - rpds-py >=0.7.0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/referencing + size: 38061 + timestamp: 1691337409918 +- kind: conda + name: regex + version: 2023.12.25 + build: py311ha68e1ae_0 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/regex-2023.12.25-py311ha68e1ae_0.conda + sha256: 05a932390b96bb7f24d98aecff06d26c4c8f205f9aa3360cd4c75e3d1c9a5d2d + md5: aa44d1a8e74282b225bb19525d579861 + depends: + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: Python-2.0 + license_family: PSF + purls: + - pkg:pypi/regex + size: 365770 + timestamp: 1703393978413 +- kind: conda + name: requests + version: 2.31.0 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda + sha256: 9f629d6fd3c8ac5f2a198639fe7af87c4db2ac9235279164bfe0fcb49d8c4bad + md5: a30144e4156cdbb236f99ebb49828f8b + depends: + - certifi >=2017.4.17 + - charset-normalizer >=2,<4 + - idna >=2.5,<4 + - python >=3.7 + - urllib3 >=1.21.1,<3 + constrains: + - chardet >=3.0.2,<6 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/requests + size: 56690 + timestamp: 1684774408600 +- kind: conda + name: responses + version: 0.25.0 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/responses-0.25.0-pyhd8ed1ab_0.conda + sha256: ffda7ac561d4b946dd8e2be9126a0418933340d345f3b96e3c9c4a1968bf3c3f + md5: 3a3a9d37b275336a17386f80bfcca835 + depends: + - python >=3.7 + - pyyaml + - requests >=2.30.0,<3.0 + - types-pyyaml + - typing_extensions + - urllib3 >=1.25.10,<3.0 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/responses + size: 50817 + timestamp: 1707873136928 +- kind: conda + name: rfc3339-validator + version: 0.1.4 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_0.tar.bz2 + sha256: 7c7052b51de0b5c558f890bb11f8b5edbb9934a653d76be086b1182b9f54185d + md5: fed45fc5ea0813240707998abe49f520 + depends: + - python >=3.5 + - six + license: MIT + license_family: MIT + purls: + - pkg:pypi/rfc3339-validator + size: 8064 + timestamp: 1638811838081 +- kind: conda + name: rpds-py + version: 0.18.0 + build: py311hc37eb10_0 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/rpds-py-0.18.0-py311hc37eb10_0.conda + sha256: 46766bb9b8df78ef7c8125f5a51f2cd77ddfbdc622a7db1a5c19c41b8d034965 + md5: 9851ab425910f099cc2d512996fc01ce + depends: + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: MIT + license_family: MIT + purls: + - pkg:pypi/rpds-py + size: 203072 + timestamp: 1707923793999 +- kind: conda + name: rsa + version: '4.9' + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/rsa-4.9-pyhd8ed1ab_0.tar.bz2 + sha256: 23214cdc15a41d14136754857fd9cd46ca3c55a7e751da3b3a48c673f0ee2a57 + md5: 03bf410858b2cefc267316408a77c436 + depends: + - pyasn1 >=0.1.3 + - python >=3.6 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/rsa + size: 29863 + timestamp: 1658329024970 +- kind: conda + name: s3transfer + version: 0.10.0 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/s3transfer-0.10.0-pyhd8ed1ab_0.conda + sha256: 5f1fccbbc0460971f12dda7ab0465d8f6037486042d156b611881e57d218ce95 + md5: 2d52125a7fe49248ce5e883fed6c935a + depends: + - botocore >=1.33.2,<2.0a.0 + - python >=3.8 + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/s3transfer + size: 62916 + timestamp: 1703197581493 +- kind: conda + name: sarif-om + version: 1.0.4 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/sarif-om-1.0.4-pyhd8ed1ab_0.tar.bz2 + sha256: 02e18825ab15654d6555aa2d78c396e726e200e398691bd0bce3b810205e28df + md5: 010e6280a9dc265d0488b598c45103d9 + depends: + - attrs + - pbr + - python >=3.6 + license: MIT + license_family: MIT + purls: + - pkg:pypi/sarif-om + size: 19220 + timestamp: 1637091367035 +- kind: conda + name: setuptools + version: 69.1.1 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/setuptools-69.1.1-pyhd8ed1ab_0.conda + sha256: 7a6dca60efcaa42d0ebb784950bc16230a968256cb5048a4441cb34653b5ec58 + md5: 576de899521b7d43674ba3ef6eae9142 + depends: + - python >=3.8 + license: MIT + license_family: MIT + purls: + - pkg:pypi/setuptools + size: 469644 + timestamp: 1708702431036 +- kind: conda + name: six + version: 1.16.0 + build: pyh6c4a22f_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2 + sha256: a85c38227b446f42c5b90d9b642f2c0567880c15d72492d8da074a59c8f91dd6 + md5: e5f25f8dbc060e9a8d912e432202afc2 + depends: + - python + license: MIT + license_family: MIT + purls: + - pkg:pypi/six + size: 14259 + timestamp: 1620240338595 +- kind: conda + name: sshpubkeys + version: 3.3.1 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/sshpubkeys-3.3.1-pyhd8ed1ab_0.tar.bz2 + sha256: d19ddc51a4e0c09172f3d70a4f75d2b7f67a9b0204eb25ae586e94830ffe4b44 + md5: b8359fec314d52ccb52b59d47cd2c2c0 + depends: + - cryptography >=2.1.4 + - ecdsa >=0.13 + - python >=3.6 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/sshpubkeys + size: 13999 + timestamp: 1654870563661 +- kind: conda + name: sympy + version: '1.12' + build: pyh04b8f61_3 + build_number: 3 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/sympy-1.12-pyh04b8f61_3.conda + sha256: 75b525ecb0948380796f519fe723470d52f9369e23c68f194c28f34df5e49b39 + md5: 6af285473a6a49ea8068e0b5b28ed7de + depends: + - mpmath >=0.19 + - python >=3.8 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/sympy + size: 4243034 + timestamp: 1684180691391 +- kind: conda + name: tk + version: 8.6.13 + build: h5226925_1 + build_number: 1 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h5226925_1.conda + sha256: 2c4e914f521ccb2718946645108c9bd3fc3216ba69aea20c2c3cedbd8db32bb1 + md5: fc048363eb8f03cd1737600a5d08aafe + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: TCL + license_family: BSD + size: 3503410 + timestamp: 1699202577803 +- kind: conda + name: types-pyyaml + version: 6.0.12.20240311 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/types-pyyaml-6.0.12.20240311-pyhd8ed1ab_0.conda + sha256: 0101df6ec0d1bf632f215795225eb7d0308ae542c61a2f3a3ce66c39dad956fb + md5: df5d4b66033ecb54c7a4040627215529 + depends: + - python >=3.6 + license: Apache-2.0 AND MIT + size: 25219 + timestamp: 1710134479192 +- kind: conda + name: typing-extensions + version: 4.10.0 + build: hd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.10.0-hd8ed1ab_0.conda + sha256: 0698fe2c4e555fb44c27c60f7a21fa0eea7f5bf8186ad109543c5b056e27f96a + md5: 091683b9150d2ebaa62fd7e2c86433da + depends: + - typing_extensions 4.10.0 pyha770c72_0 + license: PSF-2.0 + license_family: PSF + size: 10181 + timestamp: 1708904805365 +- kind: conda + name: typing_extensions + version: 4.10.0 + build: pyha770c72_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.10.0-pyha770c72_0.conda + sha256: 4be24d557897b2f6609f5d5f7c437833c62f4d4a96581e39530067e96a2d0451 + md5: 16ae769069b380646c47142d719ef466 + depends: + - python >=3.8 + license: PSF-2.0 + license_family: PSF + purls: + - pkg:pypi/typing-extensions + size: 37018 + timestamp: 1708904796013 +- kind: conda + name: tzdata + version: 2024a + build: h0c530f3_0 + subdir: noarch + noarch: generic + url: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda + sha256: 7b2b69c54ec62a243eb6fba2391b5e443421608c3ae5dbff938ad33ca8db5122 + md5: 161081fc7cec0bfda0d86d7cb595f8d8 + license: LicenseRef-Public-Domain + size: 119815 + timestamp: 1706886945727 +- kind: conda + name: ucrt + version: 10.0.22621.0 + build: h57928b3_0 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.22621.0-h57928b3_0.tar.bz2 + sha256: f29cdaf8712008f6b419b8b1a403923b00ab2504bfe0fb2ba8eb60e72d4f14c6 + md5: 72608f6cd3e5898229c3ea16deb1ac43 + constrains: + - vs2015_runtime >=14.29.30037 + license: LicenseRef-Proprietary + license_family: PROPRIETARY + size: 1283972 + timestamp: 1666630199266 +- kind: conda + name: urllib3 + version: 2.0.7 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.0.7-pyhd8ed1ab_0.conda + sha256: 9fe14735dde74278c6f1710cbe883d5710fc98501a96031dec6849a8d8a1bb11 + md5: 270e71c14d37074b1d066ee21cf0c4a6 + depends: + - brotli-python >=1.0.9 + - pysocks >=1.5.6,<2.0,!=1.5.7 + - python >=3.7 + license: MIT + license_family: MIT + purls: + - pkg:pypi/urllib3 + size: 98507 + timestamp: 1697720586316 +- kind: conda + name: vc + version: '14.3' + build: hcf57466_18 + build_number: 18 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-hcf57466_18.conda + sha256: 447a8d8292a7b2107dcc18afb67f046824711a652725fc0f522c368e7a7b8318 + md5: 20e1e652a4c740fa719002a8449994a2 + depends: + - vc14_runtime >=14.38.33130 + track_features: + - vc14 + license: BSD-3-Clause + license_family: BSD + size: 16977 + timestamp: 1702511255313 +- kind: conda + name: vc14_runtime + version: 14.38.33130 + build: h82b7239_18 + build_number: 18 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.38.33130-h82b7239_18.conda + sha256: bf94c9af4b2e9cba88207001197e695934eadc96a5c5e4cd7597e950aae3d8ff + md5: 8be79fdd2725ddf7bbf8a27a4c1f79ba + depends: + - ucrt >=10.0.20348.0 + constrains: + - vs2015_runtime 14.38.33130.* *_18 + license: LicenseRef-ProprietaryMicrosoft + license_family: Proprietary + size: 749868 + timestamp: 1702511239004 +- kind: conda + name: vs2015_runtime + version: 14.38.33130 + build: hcb4865c_18 + build_number: 18 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/vs2015_runtime-14.38.33130-hcb4865c_18.conda + sha256: a2fec221f361d6263c117f4ea6d772b21c90a2f8edc6f3eb0eadec6bfe8843db + md5: 10d42885e3ed84e575b454db30f1aa93 + depends: + - vc14_runtime >=14.38.33130 + license: BSD-3-Clause + license_family: BSD + size: 16988 + timestamp: 1702511261442 +- kind: conda + name: websocket-client + version: 1.7.0 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.7.0-pyhd8ed1ab_0.conda + sha256: d9b537d5b7c5aa7a02a4ce4c6b755e458bd8083b67752a73c92d113ccec6c10f + md5: 50ad31e07d706aae88b14a4ac9c73f23 + depends: + - python >=3.8 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/websocket-client + size: 46626 + timestamp: 1701630814576 +- kind: conda + name: werkzeug + version: 3.0.1 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/werkzeug-3.0.1-pyhd8ed1ab_0.conda + sha256: b7ac49549d370a411b1d6150d24243a15adcce07f1c61ec2ea1b536346e47aa0 + md5: af8d825d93dbe6331ee6d61c69869ca0 + depends: + - markupsafe >=2.1.1 + - python >=3.8 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/werkzeug + size: 241704 + timestamp: 1698235401441 +- kind: conda + name: wheel + version: 0.42.0 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/wheel-0.42.0-pyhd8ed1ab_0.conda + sha256: 80be0ccc815ce22f80c141013302839b0ed938a2edb50b846cf48d8a8c1cfa01 + md5: 1cdea58981c5cbc17b51973bcaddcea7 + depends: + - python >=3.7 + license: MIT + license_family: MIT + purls: + - pkg:pypi/wheel + size: 57553 + timestamp: 1701013309664 +- kind: conda + name: win_inet_pton + version: 1.1.0 + build: pyhd8ed1ab_6 + build_number: 6 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/win_inet_pton-1.1.0-pyhd8ed1ab_6.tar.bz2 + sha256: a11ae693a0645bf6c7b8a47bac030be9c0967d0b1924537b9ff7458e832c0511 + md5: 30878ecc4bd36e8deeea1e3c151b2e0b + depends: + - __win + - python >=3.6 + license: PUBLIC-DOMAIN + purls: + - pkg:pypi/win-inet-pton + size: 8191 + timestamp: 1667051294134 +- kind: conda + name: wrapt + version: 1.16.0 + build: py311ha68e1ae_0 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/wrapt-1.16.0-py311ha68e1ae_0.conda + sha256: e8209b3ebdde15834b59101fd14a7f293d868d2fbad2dcd634357cc3406f1052 + md5: b96598823313b647148417455f2fa659 + depends: + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: BSD-2-Clause + license_family: BSD + purls: + - pkg:pypi/wrapt + size: 62017 + timestamp: 1699533574835 +- kind: conda + name: xmltodict + version: 0.13.0 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/xmltodict-0.13.0-pyhd8ed1ab_0.tar.bz2 + sha256: eb40b33ae953e0020406318c9be0eb6edf62f3aa8e64ab0bf1953440b1a92763 + md5: b5b33faed6ed2b4ba47a690b8f5c0818 + depends: + - python >=3.6 + license: MIT + license_family: MIT + purls: + - pkg:pypi/xmltodict + size: 13620 + timestamp: 1652020928232 +- kind: conda + name: xz + version: 5.2.6 + build: h8d14728_0 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/xz-5.2.6-h8d14728_0.tar.bz2 + sha256: 54d9778f75a02723784dc63aff4126ff6e6749ba21d11a6d03c1f4775f269fe0 + md5: 515d77642eaa3639413c6b1bc3f94219 + depends: + - vc >=14.1,<15 + - vs2015_runtime >=14.16.27033 + license: LGPL-2.1 and GPL-2.0 + size: 217804 + timestamp: 1660346976440 +- kind: conda + name: yaml + version: 0.2.5 + build: h8ffe710_2 + build_number: 2 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/yaml-0.2.5-h8ffe710_2.tar.bz2 + sha256: 4e2246383003acbad9682c7c63178e2e715ad0eb84f03a8df1fbfba455dfedc5 + md5: adbfb9f45d1004a26763652246a33764 + depends: + - vc >=14.1,<15.0a0 + - vs2015_runtime >=14.16.27012 + license: MIT + license_family: MIT + size: 63274 + timestamp: 1641347623319 +- kind: conda + name: zipp + version: 3.17.0 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/zipp-3.17.0-pyhd8ed1ab_0.conda + sha256: bced1423fdbf77bca0a735187d05d9b9812d2163f60ab426fc10f11f92ecbe26 + md5: 2e4d6bc0b14e10f895fc6791a7d9b26a + depends: + - python >=3.8 + license: MIT + license_family: MIT + purls: + - pkg:pypi/zipp + size: 18954 + timestamp: 1695255262261 diff --git a/tests/satisfiability/solve-groups-pypi/pixi.toml b/tests/satisfiability/solve-groups-pypi/pixi.toml new file mode 100644 index 000000000..546662ec6 --- /dev/null +++ b/tests/satisfiability/solve-groups-pypi/pixi.toml @@ -0,0 +1,17 @@ +[project] +name = "bug_test" +channels = ["conda-forge"] +platforms = ["win-64"] + +[dependencies] +python = "=3.11" + +[pypi-dependencies] +matplotlib = "~=3.8" + +[feature.dev.dependencies] +moto = "=5.0" + +[environments] +default = { features = [], solve-group = "bug_test" } +dev = { features = ["dev"], solve-group = "bug_test" }