Skip to content

feat: upgrade of pep types #247

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Draft
wants to merge 1 commit into
base: main
Choose a base branch
from
Draft
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
355 changes: 254 additions & 101 deletions Cargo.lock

Large diffs are not rendered by default.

30 changes: 22 additions & 8 deletions crates/rattler_installs_packages/Cargo.toml
Original file line number Diff line number Diff line change
@@ -2,7 +2,10 @@
name = "rattler_installs_packages"
version.workspace = true
edition.workspace = true
authors = ["Bas Zalmstra <zalmstra.bas@gmail.com>", "Tim de Jager <tdejager89@gmail.com>"]
authors = [
"Bas Zalmstra <zalmstra.bas@gmail.com>",
"Tim de Jager <tdejager89@gmail.com>",
]
description = "Datastructures and algorithms to interact with Python packaging ecosystem"
categories.workspace = true
homepage.workspace = true
@@ -30,7 +33,10 @@ futures = "0.3.30"
html-escape = "0.2.13"
# reqwest needs an update to 1.0.0
http = "1.1.0"
http-cache-semantics = { version = "2.1.0", default-features = false, features = ["serde", "reqwest"] }
http-cache-semantics = { version = "2.1.0", default-features = false, features = [
"serde",
"reqwest",
] }
include_dir = "0.7.3"
indexmap = { version = "2.2.6", features = ["serde"] }
itertools = "0.12.1"
@@ -39,12 +45,15 @@ mime = "0.3.17"
once_cell = "1.19.0"
parking_lot = "0.12.1"
peg = "0.8.2"
pep440_rs = { version = "0.4.0", features = ["serde"] }
pep508_rs = { version = "0.3.0", features = ["serde"] }
pep440_rs = { version = "0.7.3" }
pep508_rs = { version = "0.9.2" }
pin-project-lite = "0.2.14"
rattler_digest = { version = "0.19.3", features = ["serde"] }
regex = "1.10.4"
reqwest = { version = "0.12.3", default-features = false, features = ["json", "stream"] }
reqwest = { version = "0.12.3", default-features = false, features = [
"json",
"stream",
] }
reqwest-middleware = "0.4.0"
serde = "1.0.198"
serde_json = "1.0.116"
@@ -55,18 +64,23 @@ thiserror = "1.0.58"
tl = "0.7.8"
tokio = { version = "1.37.0", features = ["process", "rt-multi-thread"] }
tokio-util = { version = "0.7.10", features = ["compat"] }
tracing = { version = "0.1.40", default-features = false, features = ["attributes"] }
tracing = { version = "0.1.40", default-features = false, features = [
"attributes",
] }
url = { version = "2.5.0", features = ["serde"] }
zip = "0.6.6"
resolvo = { version = "0.4.0", default-features = false, features = ["tokio"] }
pathdiff = "0.2.1"
async_zip = { version = "0.0.16", features = ["tokio", "deflate"] }
tar = "0.4.40"
flate2 = "1.0.28"
pyproject-toml = "0.9.0"
pyproject-toml = "0.13.0"
async-once-cell = "0.5.3"
configparser = "3.0.4"
cacache = { version = "13.0.0", default-features = false, features = ["tokio-runtime", "mmap"] }
cacache = { version = "13.0.0", default-features = false, features = [
"tokio-runtime",
"mmap",
] }
async-recursion = "1.1.0"
fs-err = "2.11.0"
fs_extra = "1.3.0"
46 changes: 26 additions & 20 deletions crates/rattler_installs_packages/src/resolve/dependency_provider.rs
Original file line number Diff line number Diff line change
@@ -7,17 +7,15 @@ use crate::{
artifacts::{SDist, Wheel},
index::{ArtifactRequest, PackageDb},
python_env::WheelTags,
types::{
ArtifactFromBytes, ArtifactInfo, ArtifactName, Extra, NormalizedPackageName, PackageName,
},
types::{ArtifactFromBytes, ArtifactInfo, ArtifactName, Extra, NormalizedPackageName},
wheel_builder::WheelBuilder,
};
use elsa::FrozenMap;
use itertools::Itertools;
use miette::{Diagnostic, MietteDiagnostic};
use parking_lot::Mutex;
use pep440_rs::{Operator, VersionSpecifier, VersionSpecifiers};
use pep508_rs::{MarkerEnvironment, Requirement, VersionOrUrl};
use pep440_rs::{Operator, VersionPattern, VersionSpecifier, VersionSpecifiers};
use pep508_rs::{ExtraName, MarkerEnvironment, Requirement, VerbatimUrl, VersionOrUrl};
use resolvo::{
Candidates, Dependencies, DependencyProvider, KnownDependencies, NameId, Pool, SolvableId,
SolverCache,
@@ -444,11 +442,16 @@ impl<'p> DependencyProvider<PypiVersionSet, PypiPackageName> for &'p PypiDepende
let specifiers = match package_version {
PypiVersion::Version { version, .. } => {
VersionOrUrl::VersionSpecifier(VersionSpecifiers::from_iter([
VersionSpecifier::new(Operator::ExactEqual, version.clone(), false)
.expect("failed to construct equality version specifier"),
VersionSpecifier::from_pattern(
Operator::ExactEqual,
VersionPattern::verbatim(version.clone()),
)
.expect("failed to construct equality version specifier"),
]))
}
PypiVersion::Url(url_version) => VersionOrUrl::Url(url_version.clone()),
PypiVersion::Url(url_version) => {
VersionOrUrl::Url(VerbatimUrl::from(url_version.clone()))
}
};

let version_set_id = self.pool.intern_version_set(
@@ -556,11 +559,16 @@ impl<'p> DependencyProvider<PypiVersionSet, PypiPackageName> for &'p PypiDepende
let specifiers = match package_version {
PypiVersion::Version { version, .. } => {
VersionOrUrl::VersionSpecifier(VersionSpecifiers::from_iter([
VersionSpecifier::new(Operator::ExactEqual, version.clone(), false)
.expect("failed to construct equality version specifier"),
VersionSpecifier::from_pattern(
Operator::ExactEqual,
VersionPattern::verbatim(version.clone()),
)
.expect("failed to construct equality version specifier"),
]))
}
PypiVersion::Url(url_version) => VersionOrUrl::Url(url_version.clone()),
PypiVersion::Url(url_version) => {
VersionOrUrl::Url(VerbatimUrl::from_url(url_version.clone()))
}
};
let version_set_id = self.pool.intern_version_set(
extra_name_id,
@@ -576,14 +584,13 @@ impl<'p> DependencyProvider<PypiVersionSet, PypiPackageName> for &'p PypiDepende
let extras = package_name
.extra()
.into_iter()
.map(|e| e.as_str())
.collect::<Vec<_>>();
.map(|e| ExtraName::from_str(e.as_str()))
.collect::<Result<Vec<_>, _>>()
.expect("invalid extra names");
for requirement in metadata.requires_dist {
// Evaluate environment markers
if let Some(markers) = requirement.marker.as_ref() {
if !markers.evaluate(&self.markers, &extras) {
continue;
}
if !requirement.marker.evaluate(&self.markers, &extras) {
continue;
}

// Add the dependency to the pool
@@ -593,7 +600,6 @@ impl<'p> DependencyProvider<PypiVersionSet, PypiPackageName> for &'p PypiDepende
extras,
..
} = requirement;
let name = PackageName::from_str(&name).expect("invalid package name");
let dependency_name_id = self
.pool
.intern_package_name(PypiPackageName::Base(name.clone().into()));
@@ -614,8 +620,8 @@ impl<'p> DependencyProvider<PypiVersionSet, PypiPackageName> for &'p PypiDepende
dependencies.requirements.push(version_set_id);

// Add a unique package for each extra/optional dependency
for extra in extras.into_iter().flatten() {
let extra = Extra::from_str(&extra).expect("invalid extra name");
for extra in extras.into_iter() {
let extra = Extra::from_str(extra.as_ref()).expect("invalid extra name");
let dependency_name_id = self
.pool
.intern_package_name(PypiPackageName::Extra(name.clone().into(), extra));
Original file line number Diff line number Diff line change
@@ -104,7 +104,7 @@ impl VersionSet for PypiVersionSet {

fn contains(&self, v: &Self::V) -> bool {
match (self.spec.as_ref(), v) {
(Some(VersionOrUrl::Url(a)), PypiVersion::Url(b)) => a == b,
(Some(VersionOrUrl::Url(a)), PypiVersion::Url(b)) => &a.to_url() == b,
(
Some(VersionOrUrl::VersionSpecifier(spec)),
PypiVersion::Version {
13 changes: 6 additions & 7 deletions crates/rattler_installs_packages/src/resolve/solve.rs
Original file line number Diff line number Diff line change
@@ -2,7 +2,6 @@ use crate::index::PackageDb;
use crate::python_env::WheelTags;
use crate::resolve::dependency_provider::PypiDependencyProvider;
use crate::resolve::pypi_version_types::PypiVersion;
use crate::types::PackageName;
use crate::wheel_builder::WheelBuilder;
use crate::{types::ArtifactInfo, types::Extra, types::NormalizedPackageName};
use elsa::FrozenMap;
@@ -108,8 +107,7 @@ fn resolve_inner<'r>(
..
} in requirements
{
let name = PackageName::from_str(name).expect("invalid package name");
let pypi_name = PypiPackageName::Base(name.clone().into());
let pypi_name = PypiPackageName::Base(NormalizedPackageName::from(name.clone()));
let dependency_package_name = pool.intern_package_name(pypi_name.clone());
let version_set_id = pool.intern_version_set(
dependency_package_name,
@@ -121,10 +119,11 @@ fn resolve_inner<'r>(
name_to_url.insert(pypi_name.base().clone(), url.clone().as_str().to_owned());
}

for extra in extras.iter().flatten() {
let extra: Extra = extra.parse().expect("invalid extra");
let dependency_package_name = pool
.intern_package_name(PypiPackageName::Extra(name.clone().into(), extra.clone()));
for extra in extras.iter() {
let dependency_package_name = pool.intern_package_name(PypiPackageName::Extra(
name.clone().into(),
Extra::from_str(extra.as_ref()).expect("invalid extra"),
));
let version_set_id = pool.intern_version_set(
dependency_package_name,
PypiVersionSet::from_spec(version_or_url.clone(), &options.pre_release_resolution),
8 changes: 3 additions & 5 deletions crates/rattler_installs_packages/src/resolve/solve_options.rs
Original file line number Diff line number Diff line change
@@ -2,12 +2,10 @@

use crate::{python_env::PythonLocation, types::NormalizedPackageName};
use pep508_rs::{Requirement, VersionOrUrl};
use std::collections::HashMap;
use std::sync::Arc;
use std::{collections::HashMap, str::FromStr};
use tokio::sync::Semaphore;

use crate::types::PackageName;

use super::PinnedPackage;

/// Defines how to handle sdists during resolution.
@@ -156,8 +154,8 @@ impl PreReleaseResolution {
match &spec.version_or_url {
Some(VersionOrUrl::VersionSpecifier(v)) => {
if v.iter().any(|s| s.version().any_prerelease()) {
let name = PackageName::from_str(&spec.name).expect("invalid package name");
allow_names.push(name.as_str().to_string());
let name = spec.name.clone();
allow_names.push(name.to_string());
}
}
_ => continue,
8 changes: 4 additions & 4 deletions crates/rattler_installs_packages/src/types/core_metadata.rs
Original file line number Diff line number Diff line change
@@ -7,7 +7,7 @@ use crate::{
types::Version, types::VersionSpecifiers,
};
use once_cell::sync::Lazy;
use pep440_rs::Pep440Error;
use pep440_rs::{VersionParseError, VersionSpecifiersParseError};
use pep508_rs::Requirement;
use std::{collections::HashSet, str::FromStr};
use thiserror::Error;
@@ -85,13 +85,13 @@ pub enum WheelCoreMetaDataError {
DuplicateKey(String),

#[error("invalid Metadata-Version: {0}")]
InvalidMetadataVersion(String),
InvalidMetadataVersion(VersionParseError),

#[error("invalid Version: {0}")]
InvalidVersion(String),
InvalidVersion(VersionParseError),

#[error("invalid Requires-Python: {0}")]
InvalidRequiresPython(#[source] Pep440Error),
InvalidRequiresPython(#[source] VersionSpecifiersParseError),

#[error("unsupported METADATA version {0}")]
UnsupportedVersion(Version),
6 changes: 6 additions & 0 deletions crates/rattler_installs_packages/src/types/package_name.rs
Original file line number Diff line number Diff line change
@@ -125,6 +125,12 @@ impl From<NormalizedPackageName> for PackageName {
}
}

impl From<pep508_rs::PackageName> for NormalizedPackageName {
fn from(value: pep508_rs::PackageName) -> Self {
Self(value.to_string().into_boxed_str())
}
}

impl Display for NormalizedPackageName {
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
write!(f, "{}", self.0)
Original file line number Diff line number Diff line change
@@ -357,16 +357,20 @@ impl BuildEnvironment {
pyproject_toml::BuildSystem {
requires: vec![
Requirement {
name: "setuptools".into(),
extras: None,
marker: None,
name: pep508_rs::PackageName::new("setuptools".to_string())
.expect("invalid package name"),
extras: Default::default(),
marker: Default::default(),
version_or_url: None,
origin: None,
},
Requirement {
name: "wheel".into(),
extras: None,
marker: None,
name: pep508_rs::PackageName::new("wheel".to_string())
.expect("invalid package name"),
extras: Default::default(),
marker: Default::default(),
version_or_url: None,
origin: None,
},
],
build_backend: Some("setuptools.build_meta:__legacy__".into()),