Skip to content
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

feat: upgrade of pep types #247

Draft
wants to merge 1 commit into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
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
Expand Up @@ -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
Expand Down Expand Up @@ -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"
Expand All @@ -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"
Expand All @@ -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"
Expand Down
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
Expand Up @@ -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,
Expand Down Expand Up @@ -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(
Expand Down Expand Up @@ -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,
Expand All @@ -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
Expand All @@ -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()));
Expand All @@ -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));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
13 changes: 6 additions & 7 deletions crates/rattler_installs_packages/src/resolve/solve.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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,
Expand All @@ -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),
Expand Down
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
Expand Up @@ -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.
Expand Down Expand Up @@ -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,
Expand Down
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
Expand Up @@ -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;
Expand Down Expand Up @@ -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),
Expand Down
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
Expand Up @@ -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)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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()),
Expand Down
Loading