mirror of https://github.com/astral-sh/uv
Fork version selection based on `requires-python` requirements (#9827)
## Summary This PR addresses a significant limitation in the resolver whereby we avoid choosing the latest versions of packages when the user supports a wider range. For example, with NumPy, the latest versions only support Python 3.10 and later. If you lock a project with `requires-python = ">=3.8"`, we pick the last NumPy version that supported Python 3.8, and use that for _all_ Python versions. So you get `1.24.4` for all versions, rather than `2.2.0`. And we'll never upgrade you unless you bump your `requires-python`. (Even worse, those versions don't have wheels for Python 3.12, etc., so you end up building from source.) (As-is, this is intentional. We optimize for minimizing the number of selected versions, and the current logic does that well!) Instead, we know recognize when a version has an elevated `requires-python` specifier and fork. This is a new fork point, since we need to fork once we have the package metadata, as opposed to when we see the dependencies. In this iteration, I've made this behavior the default. I'm sort of undecided on whether I want to push on that... Previously, I'd suggested making it opt-in via a setting (https://github.com/astral-sh/uv/pull/8686). Closes https://github.com/astral-sh/uv/issues/8492.
This commit is contained in:
parent
dc0525ddd0
commit
0ee21146f4
|
|
@ -60,6 +60,18 @@ pub enum CompatibleDist<'a> {
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl CompatibleDist<'_> {
|
||||||
|
/// Return the `requires-python` specifier for the distribution, if any.
|
||||||
|
pub fn requires_python(&self) -> Option<&VersionSpecifiers> {
|
||||||
|
match self {
|
||||||
|
CompatibleDist::InstalledDist(_) => None,
|
||||||
|
CompatibleDist::SourceDist { sdist, .. } => sdist.file.requires_python.as_ref(),
|
||||||
|
CompatibleDist::CompatibleWheel { wheel, .. } => wheel.file.requires_python.as_ref(),
|
||||||
|
CompatibleDist::IncompatibleWheel { sdist, .. } => sdist.file.requires_python.as_ref(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Debug, PartialEq, Eq, Clone)]
|
#[derive(Debug, PartialEq, Eq, Clone)]
|
||||||
pub enum IncompatibleDist {
|
pub enum IncompatibleDist {
|
||||||
/// An incompatible wheel is available.
|
/// An incompatible wheel is available.
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,5 @@
|
||||||
|
use std::collections::Bound;
|
||||||
|
|
||||||
use uv_pep440::Version;
|
use uv_pep440::Version;
|
||||||
use uv_pep508::{MarkerEnvironment, MarkerTree};
|
use uv_pep508::{MarkerEnvironment, MarkerTree};
|
||||||
use uv_python::{Interpreter, PythonVersion};
|
use uv_python::{Interpreter, PythonVersion};
|
||||||
|
|
@ -84,6 +86,28 @@ impl PythonRequirement {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Split the [`PythonRequirement`] at the given version.
|
||||||
|
///
|
||||||
|
/// For example, if the current requirement is `>=3.10`, and the split point is `3.11`, then
|
||||||
|
/// the result will be `>=3.10 and <3.11` and `>=3.11`.
|
||||||
|
pub fn split(&self, at: Bound<Version>) -> Option<(Self, Self)> {
|
||||||
|
let (lower, upper) = self.target.split(at)?;
|
||||||
|
Some((
|
||||||
|
Self {
|
||||||
|
exact: self.exact.clone(),
|
||||||
|
installed: self.installed.clone(),
|
||||||
|
target: lower,
|
||||||
|
source: self.source,
|
||||||
|
},
|
||||||
|
Self {
|
||||||
|
exact: self.exact.clone(),
|
||||||
|
installed: self.installed.clone(),
|
||||||
|
target: upper,
|
||||||
|
source: self.source,
|
||||||
|
},
|
||||||
|
))
|
||||||
|
}
|
||||||
|
|
||||||
/// Returns `true` if the minimum version of Python required by the target is greater than the
|
/// Returns `true` if the minimum version of Python required by the target is greater than the
|
||||||
/// installed version.
|
/// installed version.
|
||||||
pub fn raises(&self, target: &RequiresPythonRange) -> bool {
|
pub fn raises(&self, target: &RequiresPythonRange) -> bool {
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,9 @@
|
||||||
use pubgrub::Range;
|
|
||||||
use std::cmp::Ordering;
|
use std::cmp::Ordering;
|
||||||
use std::collections::Bound;
|
use std::collections::Bound;
|
||||||
use std::ops::Deref;
|
use std::ops::Deref;
|
||||||
|
|
||||||
|
use pubgrub::Range;
|
||||||
|
|
||||||
use uv_distribution_filename::WheelFilename;
|
use uv_distribution_filename::WheelFilename;
|
||||||
use uv_pep440::{release_specifiers_to_ranges, Version, VersionSpecifier, VersionSpecifiers};
|
use uv_pep440::{release_specifiers_to_ranges, Version, VersionSpecifier, VersionSpecifiers};
|
||||||
use uv_pep508::{MarkerExpression, MarkerTree, MarkerValueVersion};
|
use uv_pep508::{MarkerExpression, MarkerTree, MarkerValueVersion};
|
||||||
|
|
@ -73,24 +74,43 @@ impl RequiresPython {
|
||||||
}
|
}
|
||||||
})?;
|
})?;
|
||||||
|
|
||||||
// Extract the bounds.
|
|
||||||
let (lower_bound, upper_bound) = range
|
|
||||||
.bounding_range()
|
|
||||||
.map(|(lower_bound, upper_bound)| {
|
|
||||||
(
|
|
||||||
LowerBound(lower_bound.cloned()),
|
|
||||||
UpperBound(upper_bound.cloned()),
|
|
||||||
)
|
|
||||||
})
|
|
||||||
.unwrap_or((LowerBound::default(), UpperBound::default()));
|
|
||||||
|
|
||||||
// Convert back to PEP 440 specifiers.
|
// Convert back to PEP 440 specifiers.
|
||||||
let specifiers = VersionSpecifiers::from_release_only_bounds(range.iter());
|
let specifiers = VersionSpecifiers::from_release_only_bounds(range.iter());
|
||||||
|
|
||||||
Some(Self {
|
// Extract the bounds.
|
||||||
specifiers,
|
let range = RequiresPythonRange::from_range(&range);
|
||||||
range: RequiresPythonRange(lower_bound, upper_bound),
|
|
||||||
})
|
Some(Self { specifiers, range })
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Split the [`RequiresPython`] at the given version.
|
||||||
|
///
|
||||||
|
/// For example, if the current requirement is `>=3.10`, and the split point is `3.11`, then
|
||||||
|
/// the result will be `>=3.10 and <3.11` and `>=3.11`.
|
||||||
|
pub fn split(&self, bound: Bound<Version>) -> Option<(Self, Self)> {
|
||||||
|
let RequiresPythonRange(.., upper) = &self.range;
|
||||||
|
|
||||||
|
let upper = Range::from_range_bounds((bound, upper.clone().into()));
|
||||||
|
let lower = upper.complement();
|
||||||
|
|
||||||
|
// Intersect left and right with the existing range.
|
||||||
|
let lower = lower.intersection(&Range::from(self.range.clone()));
|
||||||
|
let upper = upper.intersection(&Range::from(self.range.clone()));
|
||||||
|
|
||||||
|
if lower.is_empty() || upper.is_empty() {
|
||||||
|
None
|
||||||
|
} else {
|
||||||
|
Some((
|
||||||
|
Self {
|
||||||
|
specifiers: VersionSpecifiers::from_release_only_bounds(lower.iter()),
|
||||||
|
range: RequiresPythonRange::from_range(&lower),
|
||||||
|
},
|
||||||
|
Self {
|
||||||
|
specifiers: VersionSpecifiers::from_release_only_bounds(upper.iter()),
|
||||||
|
range: RequiresPythonRange::from_range(&upper),
|
||||||
|
},
|
||||||
|
))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Narrow the [`RequiresPython`] by computing the intersection with the given range.
|
/// Narrow the [`RequiresPython`] by computing the intersection with the given range.
|
||||||
|
|
@ -489,14 +509,9 @@ impl serde::Serialize for RequiresPython {
|
||||||
impl<'de> serde::Deserialize<'de> for RequiresPython {
|
impl<'de> serde::Deserialize<'de> for RequiresPython {
|
||||||
fn deserialize<D: serde::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
|
fn deserialize<D: serde::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
|
||||||
let specifiers = VersionSpecifiers::deserialize(deserializer)?;
|
let specifiers = VersionSpecifiers::deserialize(deserializer)?;
|
||||||
let (lower_bound, upper_bound) = release_specifiers_to_ranges(specifiers.clone())
|
let range = release_specifiers_to_ranges(specifiers.clone());
|
||||||
.bounding_range()
|
let range = RequiresPythonRange::from_range(&range);
|
||||||
.map(|(lower_bound, upper_bound)| (lower_bound.cloned(), upper_bound.cloned()))
|
Ok(Self { specifiers, range })
|
||||||
.unwrap_or((Bound::Unbounded, Bound::Unbounded));
|
|
||||||
Ok(Self {
|
|
||||||
specifiers,
|
|
||||||
range: RequiresPythonRange(LowerBound(lower_bound), UpperBound(upper_bound)),
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -504,6 +519,15 @@ impl<'de> serde::Deserialize<'de> for RequiresPython {
|
||||||
pub struct RequiresPythonRange(LowerBound, UpperBound);
|
pub struct RequiresPythonRange(LowerBound, UpperBound);
|
||||||
|
|
||||||
impl RequiresPythonRange {
|
impl RequiresPythonRange {
|
||||||
|
/// Initialize a [`RequiresPythonRange`] from a [`Range`].
|
||||||
|
pub fn from_range(range: &Range<Version>) -> Self {
|
||||||
|
let (lower, upper) = range
|
||||||
|
.bounding_range()
|
||||||
|
.map(|(lower_bound, upper_bound)| (lower_bound.cloned(), upper_bound.cloned()))
|
||||||
|
.unwrap_or((Bound::Unbounded, Bound::Unbounded));
|
||||||
|
Self(LowerBound(lower), UpperBound(upper))
|
||||||
|
}
|
||||||
|
|
||||||
/// Initialize a [`RequiresPythonRange`] with the given bounds.
|
/// Initialize a [`RequiresPythonRange`] with the given bounds.
|
||||||
pub fn new(lower: LowerBound, upper: UpperBound) -> Self {
|
pub fn new(lower: LowerBound, upper: UpperBound) -> Self {
|
||||||
Self(lower, upper)
|
Self(lower, upper)
|
||||||
|
|
@ -967,4 +991,68 @@ mod tests {
|
||||||
assert_eq!(requires_python.is_exact_without_patch(), expected);
|
assert_eq!(requires_python.is_exact_without_patch(), expected);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn split_version() {
|
||||||
|
// Splitting `>=3.10` on `>3.12` should result in `>=3.10, <=3.12` and `>3.12`.
|
||||||
|
let version_specifiers = VersionSpecifiers::from_str(">=3.10").unwrap();
|
||||||
|
let requires_python = RequiresPython::from_specifiers(&version_specifiers);
|
||||||
|
let (lower, upper) = requires_python
|
||||||
|
.split(Bound::Excluded(Version::new([3, 12])))
|
||||||
|
.unwrap();
|
||||||
|
assert_eq!(
|
||||||
|
lower,
|
||||||
|
RequiresPython::from_specifiers(
|
||||||
|
&VersionSpecifiers::from_str(">=3.10, <=3.12").unwrap()
|
||||||
|
)
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
upper,
|
||||||
|
RequiresPython::from_specifiers(&VersionSpecifiers::from_str(">3.12").unwrap())
|
||||||
|
);
|
||||||
|
|
||||||
|
// Splitting `>=3.10` on `>=3.12` should result in `>=3.10, <3.12` and `>=3.12`.
|
||||||
|
let version_specifiers = VersionSpecifiers::from_str(">=3.10").unwrap();
|
||||||
|
let requires_python = RequiresPython::from_specifiers(&version_specifiers);
|
||||||
|
let (lower, upper) = requires_python
|
||||||
|
.split(Bound::Included(Version::new([3, 12])))
|
||||||
|
.unwrap();
|
||||||
|
assert_eq!(
|
||||||
|
lower,
|
||||||
|
RequiresPython::from_specifiers(&VersionSpecifiers::from_str(">=3.10, <3.12").unwrap())
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
upper,
|
||||||
|
RequiresPython::from_specifiers(&VersionSpecifiers::from_str(">=3.12").unwrap())
|
||||||
|
);
|
||||||
|
|
||||||
|
// Splitting `>=3.10` on `>=3.9` should return `None`.
|
||||||
|
let version_specifiers = VersionSpecifiers::from_str(">=3.10").unwrap();
|
||||||
|
let requires_python = RequiresPython::from_specifiers(&version_specifiers);
|
||||||
|
assert!(requires_python
|
||||||
|
.split(Bound::Included(Version::new([3, 9])))
|
||||||
|
.is_none());
|
||||||
|
|
||||||
|
// Splitting `>=3.10` on `>=3.10` should return `None`.
|
||||||
|
let version_specifiers = VersionSpecifiers::from_str(">=3.10").unwrap();
|
||||||
|
let requires_python = RequiresPython::from_specifiers(&version_specifiers);
|
||||||
|
assert!(requires_python
|
||||||
|
.split(Bound::Included(Version::new([3, 10])))
|
||||||
|
.is_none());
|
||||||
|
|
||||||
|
// Splitting `>=3.9, <3.13` on `>=3.11` should result in `>=3.9, <3.11` and `>=3.11, <3.13`.
|
||||||
|
let version_specifiers = VersionSpecifiers::from_str(">=3.9, <3.13").unwrap();
|
||||||
|
let requires_python = RequiresPython::from_specifiers(&version_specifiers);
|
||||||
|
let (lower, upper) = requires_python
|
||||||
|
.split(Bound::Included(Version::new([3, 11])))
|
||||||
|
.unwrap();
|
||||||
|
assert_eq!(
|
||||||
|
lower,
|
||||||
|
RequiresPython::from_specifiers(&VersionSpecifiers::from_str(">=3.9, <3.11").unwrap())
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
upper,
|
||||||
|
RequiresPython::from_specifiers(&VersionSpecifiers::from_str(">=3.11, <3.13").unwrap())
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,9 +1,11 @@
|
||||||
use std::fmt::{Display, Formatter};
|
use std::fmt::{Display, Formatter};
|
||||||
|
|
||||||
use crate::resolver::MetadataUnavailable;
|
|
||||||
use uv_distribution_types::IncompatibleDist;
|
use uv_distribution_types::IncompatibleDist;
|
||||||
use uv_pep440::{Version, VersionSpecifiers};
|
use uv_pep440::{Version, VersionSpecifiers};
|
||||||
|
|
||||||
|
use crate::resolver::MetadataUnavailable;
|
||||||
|
use crate::ResolverEnvironment;
|
||||||
|
|
||||||
/// The reason why a package or a version cannot be used.
|
/// The reason why a package or a version cannot be used.
|
||||||
#[derive(Debug, Clone, Eq, PartialEq)]
|
#[derive(Debug, Clone, Eq, PartialEq)]
|
||||||
pub(crate) enum UnavailableReason {
|
pub(crate) enum UnavailableReason {
|
||||||
|
|
@ -164,8 +166,10 @@ impl From<&MetadataUnavailable> for UnavailablePackage {
|
||||||
|
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone)]
|
||||||
pub(crate) enum ResolverVersion {
|
pub(crate) enum ResolverVersion {
|
||||||
/// A usable version
|
|
||||||
Available(Version),
|
|
||||||
/// A version that is not usable for some reason
|
/// A version that is not usable for some reason
|
||||||
Unavailable(Version, UnavailableVersion),
|
Unavailable(Version, UnavailableVersion),
|
||||||
|
/// A usable version
|
||||||
|
Unforked(Version),
|
||||||
|
/// A set of forks.
|
||||||
|
Forked(Vec<ResolverEnvironment>),
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
use tracing::trace;
|
||||||
|
use uv_pep440::VersionSpecifiers;
|
||||||
use uv_pep508::{MarkerEnvironment, MarkerTree};
|
use uv_pep508::{MarkerEnvironment, MarkerTree};
|
||||||
use uv_pypi_types::{ConflictItem, ConflictItemRef, ResolverMarkerEnvironment};
|
use uv_pypi_types::{ConflictItem, ConflictItemRef, ResolverMarkerEnvironment};
|
||||||
|
|
||||||
|
|
@ -7,7 +8,7 @@ use crate::pubgrub::{PubGrubDependency, PubGrubPackage};
|
||||||
use crate::requires_python::RequiresPythonRange;
|
use crate::requires_python::RequiresPythonRange;
|
||||||
use crate::resolver::ForkState;
|
use crate::resolver::ForkState;
|
||||||
use crate::universal_marker::{ConflictMarker, UniversalMarker};
|
use crate::universal_marker::{ConflictMarker, UniversalMarker};
|
||||||
use crate::PythonRequirement;
|
use crate::{PythonRequirement, RequiresPython};
|
||||||
|
|
||||||
/// Represents one or more marker environments for a resolution.
|
/// Represents one or more marker environments for a resolution.
|
||||||
///
|
///
|
||||||
|
|
@ -510,6 +511,50 @@ impl<'d> Forker<'d> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Fork the resolver based on a `Requires-Python` specifier.
|
||||||
|
pub(crate) fn fork_python_requirement(
|
||||||
|
requires_python: &VersionSpecifiers,
|
||||||
|
python_requirement: &PythonRequirement,
|
||||||
|
env: &ResolverEnvironment,
|
||||||
|
) -> Vec<ResolverEnvironment> {
|
||||||
|
let requires_python = RequiresPython::from_specifiers(requires_python);
|
||||||
|
let lower = requires_python.range().lower().clone();
|
||||||
|
|
||||||
|
// Attempt to split the current Python requirement based on the `requires-python` specifier.
|
||||||
|
//
|
||||||
|
// For example, if the current requirement is `>=3.10`, and the split point is `>=3.11`, then
|
||||||
|
// the result will be `>=3.10 and <3.11` and `>=3.11`.
|
||||||
|
//
|
||||||
|
// However, if the current requirement is `>=3.10`, and the split point is `>=3.9`, then the
|
||||||
|
// lower segment will be empty, so we should return an empty list.
|
||||||
|
let Some((lower, upper)) = python_requirement.split(lower.into()) else {
|
||||||
|
trace!(
|
||||||
|
"Unable to split Python requirement `{}` via `Requires-Python` specifier `{}`",
|
||||||
|
python_requirement.target(),
|
||||||
|
requires_python,
|
||||||
|
);
|
||||||
|
return vec![];
|
||||||
|
};
|
||||||
|
|
||||||
|
let Kind::Universal {
|
||||||
|
markers: ref env_marker,
|
||||||
|
..
|
||||||
|
} = env.kind
|
||||||
|
else {
|
||||||
|
panic!("resolver must be in universal mode for forking")
|
||||||
|
};
|
||||||
|
|
||||||
|
let mut envs = vec![];
|
||||||
|
if !env_marker.is_disjoint(lower.to_marker_tree()) {
|
||||||
|
envs.push(env.narrow_environment(lower.to_marker_tree()));
|
||||||
|
}
|
||||||
|
if !env_marker.is_disjoint(upper.to_marker_tree()) {
|
||||||
|
envs.push(env.narrow_environment(upper.to_marker_tree()));
|
||||||
|
}
|
||||||
|
debug_assert!(!envs.is_empty(), "at least one fork should be produced");
|
||||||
|
envs
|
||||||
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use std::ops::Bound;
|
use std::ops::Bound;
|
||||||
|
|
|
||||||
|
|
@ -30,7 +30,7 @@ use uv_distribution_types::{
|
||||||
};
|
};
|
||||||
use uv_git::GitResolver;
|
use uv_git::GitResolver;
|
||||||
use uv_normalize::{ExtraName, GroupName, PackageName};
|
use uv_normalize::{ExtraName, GroupName, PackageName};
|
||||||
use uv_pep440::{release_specifiers_to_ranges, Version, MIN_VERSION};
|
use uv_pep440::{release_specifiers_to_ranges, Version, VersionSpecifiers, MIN_VERSION};
|
||||||
use uv_pep508::MarkerTree;
|
use uv_pep508::MarkerTree;
|
||||||
use uv_platform_tags::Tags;
|
use uv_platform_tags::Tags;
|
||||||
use uv_pypi_types::{
|
use uv_pypi_types::{
|
||||||
|
|
@ -59,8 +59,8 @@ pub(crate) use crate::resolver::availability::{
|
||||||
};
|
};
|
||||||
use crate::resolver::batch_prefetch::BatchPrefetcher;
|
use crate::resolver::batch_prefetch::BatchPrefetcher;
|
||||||
pub use crate::resolver::derivation::DerivationChainBuilder;
|
pub use crate::resolver::derivation::DerivationChainBuilder;
|
||||||
use crate::resolver::environment::ForkingPossibility;
|
|
||||||
pub use crate::resolver::environment::ResolverEnvironment;
|
pub use crate::resolver::environment::ResolverEnvironment;
|
||||||
|
use crate::resolver::environment::{fork_python_requirement, ForkingPossibility};
|
||||||
pub(crate) use crate::resolver::fork_map::{ForkMap, ForkSet};
|
pub(crate) use crate::resolver::fork_map::{ForkMap, ForkSet};
|
||||||
pub(crate) use crate::resolver::urls::Urls;
|
pub(crate) use crate::resolver::urls::Urls;
|
||||||
use crate::universal_marker::{ConflictMarker, UniversalMarker};
|
use crate::universal_marker::{ConflictMarker, UniversalMarker};
|
||||||
|
|
@ -323,82 +323,90 @@ impl<InstalledPackages: InstalledPackagesProvider> ResolverState<InstalledPackag
|
||||||
}
|
}
|
||||||
let start = Instant::now();
|
let start = Instant::now();
|
||||||
loop {
|
loop {
|
||||||
// Run unit propagation.
|
let highest_priority_pkg =
|
||||||
if let Err(err) = state.pubgrub.unit_propagation(state.next) {
|
if let Some(initial) = state.initial.take() {
|
||||||
return Err(self.convert_no_solution_err(
|
// If we just forked based on `requires-python`, we can skip unit
|
||||||
err,
|
// propagation, since we already propagated the package that initiated
|
||||||
state.fork_urls,
|
// the fork.
|
||||||
&state.fork_indexes,
|
initial
|
||||||
state.env,
|
} else {
|
||||||
&visited,
|
// Run unit propagation.
|
||||||
&self.locations,
|
if let Err(err) = state.pubgrub.unit_propagation(state.next) {
|
||||||
&self.capabilities,
|
return Err(self.convert_no_solution_err(
|
||||||
));
|
err,
|
||||||
}
|
state.fork_urls,
|
||||||
|
&state.fork_indexes,
|
||||||
// Pre-visit all candidate packages, to allow metadata to be fetched in parallel.
|
state.env,
|
||||||
if self.dependency_mode.is_transitive() {
|
&visited,
|
||||||
Self::pre_visit(
|
&self.locations,
|
||||||
state
|
&self.capabilities,
|
||||||
.pubgrub
|
));
|
||||||
.partial_solution
|
|
||||||
.prioritized_packages()
|
|
||||||
.map(|(id, range)| (&state.pubgrub.package_store[id], range)),
|
|
||||||
&self.urls,
|
|
||||||
&self.indexes,
|
|
||||||
&state.python_requirement,
|
|
||||||
&request_sink,
|
|
||||||
)?;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Choose a package version.
|
|
||||||
let Some(highest_priority_pkg) = state
|
|
||||||
.pubgrub
|
|
||||||
.partial_solution
|
|
||||||
.pick_highest_priority_pkg(|id, _range| {
|
|
||||||
state.priorities.get(&state.pubgrub.package_store[id])
|
|
||||||
})
|
|
||||||
else {
|
|
||||||
// All packages have been assigned, the fork has been successfully resolved
|
|
||||||
if tracing::enabled!(Level::DEBUG) {
|
|
||||||
prefetcher.log_tried_versions();
|
|
||||||
}
|
|
||||||
debug!(
|
|
||||||
"{} resolution took {:.3}s",
|
|
||||||
state.env,
|
|
||||||
start.elapsed().as_secs_f32()
|
|
||||||
);
|
|
||||||
|
|
||||||
let resolution = state.into_resolution();
|
|
||||||
|
|
||||||
// Walk over the selected versions, and mark them as preferences. We have to
|
|
||||||
// add forks back as to not override the preferences from the lockfile for
|
|
||||||
// the next fork
|
|
||||||
//
|
|
||||||
// If we're using a resolution mode that varies based on whether a dependency is
|
|
||||||
// direct or transitive, skip preferences, as we risk adding a preference from
|
|
||||||
// one fork (in which it's a transitive dependency) to another fork (in which
|
|
||||||
// it's direct).
|
|
||||||
if matches!(
|
|
||||||
self.options.resolution_mode,
|
|
||||||
ResolutionMode::Lowest | ResolutionMode::Highest
|
|
||||||
) {
|
|
||||||
for (package, version) in &resolution.nodes {
|
|
||||||
preferences.insert(
|
|
||||||
package.name.clone(),
|
|
||||||
package.index.clone(),
|
|
||||||
resolution
|
|
||||||
.env
|
|
||||||
.try_universal_markers()
|
|
||||||
.unwrap_or(UniversalMarker::TRUE),
|
|
||||||
version.clone(),
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
resolutions.push(resolution);
|
// Pre-visit all candidate packages, to allow metadata to be fetched in parallel.
|
||||||
continue 'FORK;
|
if self.dependency_mode.is_transitive() {
|
||||||
};
|
Self::pre_visit(
|
||||||
|
state
|
||||||
|
.pubgrub
|
||||||
|
.partial_solution
|
||||||
|
.prioritized_packages()
|
||||||
|
.map(|(id, range)| (&state.pubgrub.package_store[id], range)),
|
||||||
|
&self.urls,
|
||||||
|
&self.indexes,
|
||||||
|
&state.python_requirement,
|
||||||
|
&request_sink,
|
||||||
|
)?;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Choose a package.
|
||||||
|
let Some(highest_priority_pkg) =
|
||||||
|
state.pubgrub.partial_solution.pick_highest_priority_pkg(
|
||||||
|
|id, _range| state.priorities.get(&state.pubgrub.package_store[id]),
|
||||||
|
)
|
||||||
|
else {
|
||||||
|
// All packages have been assigned, the fork has been successfully resolved
|
||||||
|
if tracing::enabled!(Level::DEBUG) {
|
||||||
|
prefetcher.log_tried_versions();
|
||||||
|
}
|
||||||
|
debug!(
|
||||||
|
"{} resolution took {:.3}s",
|
||||||
|
state.env,
|
||||||
|
start.elapsed().as_secs_f32()
|
||||||
|
);
|
||||||
|
|
||||||
|
let resolution = state.into_resolution();
|
||||||
|
|
||||||
|
// Walk over the selected versions, and mark them as preferences. We have to
|
||||||
|
// add forks back as to not override the preferences from the lockfile for
|
||||||
|
// the next fork
|
||||||
|
//
|
||||||
|
// If we're using a resolution mode that varies based on whether a dependency is
|
||||||
|
// direct or transitive, skip preferences, as we risk adding a preference from
|
||||||
|
// one fork (in which it's a transitive dependency) to another fork (in which
|
||||||
|
// it's direct).
|
||||||
|
if matches!(
|
||||||
|
self.options.resolution_mode,
|
||||||
|
ResolutionMode::Lowest | ResolutionMode::Highest
|
||||||
|
) {
|
||||||
|
for (package, version) in &resolution.nodes {
|
||||||
|
preferences.insert(
|
||||||
|
package.name.clone(),
|
||||||
|
package.index.clone(),
|
||||||
|
resolution
|
||||||
|
.env
|
||||||
|
.try_universal_markers()
|
||||||
|
.unwrap_or(UniversalMarker::TRUE),
|
||||||
|
version.clone(),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
resolutions.push(resolution);
|
||||||
|
continue 'FORK;
|
||||||
|
};
|
||||||
|
|
||||||
|
highest_priority_pkg
|
||||||
|
};
|
||||||
|
|
||||||
state.next = highest_priority_pkg;
|
state.next = highest_priority_pkg;
|
||||||
|
|
||||||
|
|
@ -481,8 +489,16 @@ impl<InstalledPackages: InstalledPackagesProvider> ResolverState<InstalledPackag
|
||||||
}
|
}
|
||||||
Some(version) => version,
|
Some(version) => version,
|
||||||
};
|
};
|
||||||
|
|
||||||
let version = match version {
|
let version = match version {
|
||||||
ResolverVersion::Available(version) => version,
|
ResolverVersion::Unforked(version) => version,
|
||||||
|
ResolverVersion::Forked(forks) => {
|
||||||
|
for mut fork in self.version_forks_to_fork_states(state, forks) {
|
||||||
|
fork.initial = Some(next_id);
|
||||||
|
forked_states.push(fork);
|
||||||
|
}
|
||||||
|
continue 'FORK;
|
||||||
|
}
|
||||||
ResolverVersion::Unavailable(version, reason) => {
|
ResolverVersion::Unavailable(version, reason) => {
|
||||||
state.add_unavailable_version(version, reason);
|
state.add_unavailable_version(version, reason);
|
||||||
continue;
|
continue;
|
||||||
|
|
@ -742,6 +758,31 @@ impl<InstalledPackages: InstalledPackagesProvider> ResolverState<InstalledPackag
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Convert the dependency [`Fork`]s into [`ForkState`]s.
|
||||||
|
#[allow(clippy::unused_self)]
|
||||||
|
fn version_forks_to_fork_states(
|
||||||
|
&self,
|
||||||
|
current_state: ForkState,
|
||||||
|
forks: Vec<ResolverEnvironment>,
|
||||||
|
) -> impl Iterator<Item = ForkState> + '_ {
|
||||||
|
// This is a somewhat tortured technique to ensure
|
||||||
|
// that our resolver state is only cloned as much
|
||||||
|
// as it needs to be. We basically move the state
|
||||||
|
// into `forked_states`, and then only clone it if
|
||||||
|
// there is at least one more fork to visit.
|
||||||
|
let mut cur_state = Some(current_state);
|
||||||
|
let forks_len = forks.len();
|
||||||
|
forks.into_iter().enumerate().map(move |(i, fork)| {
|
||||||
|
let is_last = i == forks_len - 1;
|
||||||
|
let forked_state = cur_state.take().unwrap();
|
||||||
|
if !is_last {
|
||||||
|
cur_state = Some(forked_state.clone());
|
||||||
|
}
|
||||||
|
|
||||||
|
forked_state.with_env(fork)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
/// Visit a [`PubGrubPackage`] prior to selection. This should be called on a [`PubGrubPackage`]
|
/// Visit a [`PubGrubPackage`] prior to selection. This should be called on a [`PubGrubPackage`]
|
||||||
/// before it is selected, to allow metadata to be fetched in parallel.
|
/// before it is selected, to allow metadata to be fetched in parallel.
|
||||||
fn visit_package(
|
fn visit_package(
|
||||||
|
|
@ -864,7 +905,7 @@ impl<InstalledPackages: InstalledPackagesProvider> ResolverState<InstalledPackag
|
||||||
) -> Result<Option<ResolverVersion>, ResolveError> {
|
) -> Result<Option<ResolverVersion>, ResolveError> {
|
||||||
match &**package {
|
match &**package {
|
||||||
PubGrubPackageInner::Root(_) => {
|
PubGrubPackageInner::Root(_) => {
|
||||||
Ok(Some(ResolverVersion::Available(MIN_VERSION.clone())))
|
Ok(Some(ResolverVersion::Unforked(MIN_VERSION.clone())))
|
||||||
}
|
}
|
||||||
|
|
||||||
PubGrubPackageInner::Python(_) => {
|
PubGrubPackageInner::Python(_) => {
|
||||||
|
|
@ -1000,7 +1041,7 @@ impl<InstalledPackages: InstalledPackagesProvider> ResolverState<InstalledPackag
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(Some(ResolverVersion::Available(version.clone())))
|
Ok(Some(ResolverVersion::Unforked(version.clone())))
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Given a candidate registry requirement, choose the next version in range to try, or `None`
|
/// Given a candidate registry requirement, choose the next version in range to try, or `None`
|
||||||
|
|
@ -1080,7 +1121,28 @@ impl<InstalledPackages: InstalledPackagesProvider> ResolverState<InstalledPackag
|
||||||
};
|
};
|
||||||
|
|
||||||
// Check whether the version is incompatible due to its Python requirement.
|
// Check whether the version is incompatible due to its Python requirement.
|
||||||
if let Some(incompatibility) = Self::check_requires_python(dist, python_requirement) {
|
if let Some((requires_python, incompatibility)) =
|
||||||
|
Self::check_requires_python(dist, python_requirement)
|
||||||
|
{
|
||||||
|
if env.marker_environment().is_none() {
|
||||||
|
let forks = fork_python_requirement(requires_python, python_requirement, env);
|
||||||
|
if !forks.is_empty() {
|
||||||
|
debug!(
|
||||||
|
"Forking Python requirement `{}` on `{}` for {}=={} ({})",
|
||||||
|
python_requirement.target(),
|
||||||
|
requires_python,
|
||||||
|
name,
|
||||||
|
candidate.version(),
|
||||||
|
forks
|
||||||
|
.iter()
|
||||||
|
.map(ToString::to_string)
|
||||||
|
.collect::<Vec<_>>()
|
||||||
|
.join(", ")
|
||||||
|
);
|
||||||
|
return Ok(Some(ResolverVersion::Forked(forks)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return Ok(Some(ResolverVersion::Unavailable(
|
return Ok(Some(ResolverVersion::Unavailable(
|
||||||
candidate.version().clone(),
|
candidate.version().clone(),
|
||||||
UnavailableVersion::IncompatibleDist(incompatibility),
|
UnavailableVersion::IncompatibleDist(incompatibility),
|
||||||
|
|
@ -1129,47 +1191,39 @@ impl<InstalledPackages: InstalledPackagesProvider> ResolverState<InstalledPackag
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(Some(ResolverVersion::Available(version)))
|
Ok(Some(ResolverVersion::Unforked(version)))
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Check if the distribution is incompatible with the Python requirement, and if so, return
|
/// Check if the distribution is incompatible with the Python requirement, and if so, return
|
||||||
/// the incompatibility.
|
/// the incompatibility.
|
||||||
fn check_requires_python(
|
fn check_requires_python<'dist>(
|
||||||
dist: &CompatibleDist,
|
dist: &'dist CompatibleDist,
|
||||||
python_requirement: &PythonRequirement,
|
python_requirement: &PythonRequirement,
|
||||||
) -> Option<IncompatibleDist> {
|
) -> Option<(&'dist VersionSpecifiers, IncompatibleDist)> {
|
||||||
let requires_python = match dist {
|
let requires_python = dist.requires_python()?;
|
||||||
CompatibleDist::InstalledDist(_) => None,
|
|
||||||
CompatibleDist::SourceDist { sdist, .. }
|
|
||||||
| CompatibleDist::IncompatibleWheel { sdist, .. } => {
|
|
||||||
sdist.file.requires_python.as_ref()
|
|
||||||
}
|
|
||||||
CompatibleDist::CompatibleWheel { wheel, .. } => wheel.file.requires_python.as_ref(),
|
|
||||||
}?;
|
|
||||||
if python_requirement.target().is_contained_by(requires_python) {
|
if python_requirement.target().is_contained_by(requires_python) {
|
||||||
None
|
None
|
||||||
} else {
|
} else {
|
||||||
if matches!(dist, CompatibleDist::CompatibleWheel { .. }) {
|
let incompatibility = if matches!(dist, CompatibleDist::CompatibleWheel { .. }) {
|
||||||
Some(IncompatibleDist::Wheel(IncompatibleWheel::RequiresPython(
|
IncompatibleDist::Wheel(IncompatibleWheel::RequiresPython(
|
||||||
requires_python.clone(),
|
requires_python.clone(),
|
||||||
if python_requirement.installed() == python_requirement.target() {
|
if python_requirement.installed() == python_requirement.target() {
|
||||||
PythonRequirementKind::Installed
|
PythonRequirementKind::Installed
|
||||||
} else {
|
} else {
|
||||||
PythonRequirementKind::Target
|
PythonRequirementKind::Target
|
||||||
},
|
},
|
||||||
)))
|
|
||||||
} else {
|
|
||||||
Some(IncompatibleDist::Source(
|
|
||||||
IncompatibleSource::RequiresPython(
|
|
||||||
requires_python.clone(),
|
|
||||||
if python_requirement.installed() == python_requirement.target() {
|
|
||||||
PythonRequirementKind::Installed
|
|
||||||
} else {
|
|
||||||
PythonRequirementKind::Target
|
|
||||||
},
|
|
||||||
),
|
|
||||||
))
|
))
|
||||||
}
|
} else {
|
||||||
|
IncompatibleDist::Source(IncompatibleSource::RequiresPython(
|
||||||
|
requires_python.clone(),
|
||||||
|
if python_requirement.installed() == python_requirement.target() {
|
||||||
|
PythonRequirementKind::Installed
|
||||||
|
} else {
|
||||||
|
PythonRequirementKind::Target
|
||||||
|
},
|
||||||
|
))
|
||||||
|
};
|
||||||
|
Some((requires_python, incompatibility))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -2078,6 +2132,9 @@ pub(crate) struct ForkState {
|
||||||
/// in this state. We also ultimately retrieve the final set of version
|
/// in this state. We also ultimately retrieve the final set of version
|
||||||
/// assignments (to packages) from this state's "partial solution."
|
/// assignments (to packages) from this state's "partial solution."
|
||||||
pubgrub: State<UvDependencyProvider>,
|
pubgrub: State<UvDependencyProvider>,
|
||||||
|
/// The initial package to select. If set, the first iteration over this state will avoid
|
||||||
|
/// asking PubGrub for the highest-priority package, and will instead use the provided package.
|
||||||
|
initial: Option<Id<PubGrubPackage>>,
|
||||||
/// The next package on which to run unit propagation.
|
/// The next package on which to run unit propagation.
|
||||||
next: Id<PubGrubPackage>,
|
next: Id<PubGrubPackage>,
|
||||||
/// The set of pinned versions we accrue throughout resolution.
|
/// The set of pinned versions we accrue throughout resolution.
|
||||||
|
|
@ -2147,6 +2204,7 @@ impl ForkState {
|
||||||
python_requirement: PythonRequirement,
|
python_requirement: PythonRequirement,
|
||||||
) -> Self {
|
) -> Self {
|
||||||
Self {
|
Self {
|
||||||
|
initial: None,
|
||||||
next: pubgrub.root_package,
|
next: pubgrub.root_package,
|
||||||
pubgrub,
|
pubgrub,
|
||||||
pins: FilePins::default(),
|
pins: FilePins::default(),
|
||||||
|
|
|
||||||
|
|
@ -1847,7 +1847,7 @@ fn lock_conditional_dependency_extra() -> Result<()> {
|
||||||
----- stdout -----
|
----- stdout -----
|
||||||
|
|
||||||
----- stderr -----
|
----- stderr -----
|
||||||
Resolved 7 packages in [TIME]
|
Resolved 8 packages in [TIME]
|
||||||
"###);
|
"###);
|
||||||
|
|
||||||
let lock = fs_err::read_to_string(&lockfile).unwrap();
|
let lock = fs_err::read_to_string(&lockfile).unwrap();
|
||||||
|
|
@ -1860,7 +1860,8 @@ fn lock_conditional_dependency_extra() -> Result<()> {
|
||||||
version = 1
|
version = 1
|
||||||
requires-python = ">=3.7"
|
requires-python = ">=3.7"
|
||||||
resolution-markers = [
|
resolution-markers = [
|
||||||
"python_full_version < '3.10'",
|
"python_full_version >= '3.8' and python_full_version < '3.10'",
|
||||||
|
"python_full_version < '3.8'",
|
||||||
"python_full_version >= '3.10'",
|
"python_full_version >= '3.10'",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
@ -2014,7 +2015,8 @@ fn lock_conditional_dependency_extra() -> Result<()> {
|
||||||
{ name = "certifi" },
|
{ name = "certifi" },
|
||||||
{ name = "charset-normalizer" },
|
{ name = "charset-normalizer" },
|
||||||
{ name = "idna" },
|
{ name = "idna" },
|
||||||
{ name = "urllib3" },
|
{ name = "urllib3", version = "2.0.7", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.8'" },
|
||||||
|
{ name = "urllib3", version = "2.2.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.8'" },
|
||||||
]
|
]
|
||||||
sdist = { url = "https://files.pythonhosted.org/packages/9d/be/10918a2eac4ae9f02f6cfe6414b7a155ccd8f7f9d4380d62fd5b955065c3/requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1", size = 110794 }
|
sdist = { url = "https://files.pythonhosted.org/packages/9d/be/10918a2eac4ae9f02f6cfe6414b7a155ccd8f7f9d4380d62fd5b955065c3/requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1", size = 110794 }
|
||||||
wheels = [
|
wheels = [
|
||||||
|
|
@ -2030,10 +2032,26 @@ fn lock_conditional_dependency_extra() -> Result<()> {
|
||||||
name = "urllib3"
|
name = "urllib3"
|
||||||
version = "2.0.7"
|
version = "2.0.7"
|
||||||
source = { registry = "https://pypi.org/simple" }
|
source = { registry = "https://pypi.org/simple" }
|
||||||
|
resolution-markers = [
|
||||||
|
"python_full_version < '3.8'",
|
||||||
|
]
|
||||||
sdist = { url = "https://files.pythonhosted.org/packages/af/47/b215df9f71b4fdba1025fc05a77db2ad243fa0926755a52c5e71659f4e3c/urllib3-2.0.7.tar.gz", hash = "sha256:c97dfde1f7bd43a71c8d2a58e369e9b2bf692d1334ea9f9cae55add7d0dd0f84", size = 282546 }
|
sdist = { url = "https://files.pythonhosted.org/packages/af/47/b215df9f71b4fdba1025fc05a77db2ad243fa0926755a52c5e71659f4e3c/urllib3-2.0.7.tar.gz", hash = "sha256:c97dfde1f7bd43a71c8d2a58e369e9b2bf692d1334ea9f9cae55add7d0dd0f84", size = 282546 }
|
||||||
wheels = [
|
wheels = [
|
||||||
{ url = "https://files.pythonhosted.org/packages/d2/b2/b157855192a68541a91ba7b2bbcb91f1b4faa51f8bae38d8005c034be524/urllib3-2.0.7-py3-none-any.whl", hash = "sha256:fdb6d215c776278489906c2f8916e6e7d4f5a9b602ccbcfdf7f016fc8da0596e", size = 124213 },
|
{ url = "https://files.pythonhosted.org/packages/d2/b2/b157855192a68541a91ba7b2bbcb91f1b4faa51f8bae38d8005c034be524/urllib3-2.0.7-py3-none-any.whl", hash = "sha256:fdb6d215c776278489906c2f8916e6e7d4f5a9b602ccbcfdf7f016fc8da0596e", size = 124213 },
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "urllib3"
|
||||||
|
version = "2.2.1"
|
||||||
|
source = { registry = "https://pypi.org/simple" }
|
||||||
|
resolution-markers = [
|
||||||
|
"python_full_version >= '3.8' and python_full_version < '3.10'",
|
||||||
|
"python_full_version >= '3.10'",
|
||||||
|
]
|
||||||
|
sdist = { url = "https://files.pythonhosted.org/packages/7a/50/7fd50a27caa0652cd4caf224aa87741ea41d3265ad13f010886167cfcc79/urllib3-2.2.1.tar.gz", hash = "sha256:d0570876c61ab9e520d776c38acbbb5b05a776d3f9ff98a5c8fd5162a444cf19", size = 291020 }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/a2/73/a68704750a7679d0b6d3ad7aa8d4da8e14e151ae82e6fee774e6e0d05ec8/urllib3-2.2.1-py3-none-any.whl", hash = "sha256:450b20ec296a467077128bff42b73080516e71b56ff59a60a02bef2232c4fa9d", size = 121067 },
|
||||||
|
]
|
||||||
"###
|
"###
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
@ -2065,7 +2083,7 @@ fn lock_conditional_dependency_extra() -> Result<()> {
|
||||||
+ idna==3.6
|
+ idna==3.6
|
||||||
+ project==0.1.0 (from file://[TEMP_DIR]/)
|
+ project==0.1.0 (from file://[TEMP_DIR]/)
|
||||||
+ requests==2.31.0
|
+ requests==2.31.0
|
||||||
+ urllib3==2.0.7
|
+ urllib3==2.2.1
|
||||||
"###);
|
"###);
|
||||||
|
|
||||||
// Validate that the extra is included on relevant Python versions.
|
// Validate that the extra is included on relevant Python versions.
|
||||||
|
|
@ -2081,7 +2099,7 @@ fn lock_conditional_dependency_extra() -> Result<()> {
|
||||||
----- stdout -----
|
----- stdout -----
|
||||||
|
|
||||||
----- stderr -----
|
----- stderr -----
|
||||||
Resolved 7 packages in [TIME]
|
Resolved 8 packages in [TIME]
|
||||||
"###);
|
"###);
|
||||||
|
|
||||||
// Install from the lockfile.
|
// Install from the lockfile.
|
||||||
|
|
@ -2099,7 +2117,7 @@ fn lock_conditional_dependency_extra() -> Result<()> {
|
||||||
+ project==0.1.0 (from file://[TEMP_DIR]/)
|
+ project==0.1.0 (from file://[TEMP_DIR]/)
|
||||||
+ pysocks==1.7.1
|
+ pysocks==1.7.1
|
||||||
+ requests==2.31.0
|
+ requests==2.31.0
|
||||||
+ urllib3==2.0.7
|
+ urllib3==2.2.1
|
||||||
"###);
|
"###);
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
|
|
@ -3213,7 +3231,7 @@ fn lock_requires_python() -> Result<()> {
|
||||||
----- stdout -----
|
----- stdout -----
|
||||||
|
|
||||||
----- stderr -----
|
----- stderr -----
|
||||||
× No solution found when resolving dependencies:
|
× No solution found when resolving dependencies for split (python_full_version >= '3.7' and python_full_version < '3.7.9'):
|
||||||
╰─▶ Because the requested Python version (>=3.7) does not satisfy Python>=3.8 and the requested Python version (>=3.7) does not satisfy Python>=3.7.9,<3.8, we can conclude that Python>=3.7.9 is incompatible.
|
╰─▶ Because the requested Python version (>=3.7) does not satisfy Python>=3.8 and the requested Python version (>=3.7) does not satisfy Python>=3.7.9,<3.8, we can conclude that Python>=3.7.9 is incompatible.
|
||||||
And because pygls>=1.1.0,<=1.2.1 depends on Python>=3.7.9,<4 and only pygls<=1.3.0 is available, we can conclude that all of:
|
And because pygls>=1.1.0,<=1.2.1 depends on Python>=3.7.9,<4 and only pygls<=1.3.0 is available, we can conclude that all of:
|
||||||
pygls>=1.1.0,<1.3.0
|
pygls>=1.1.0,<1.3.0
|
||||||
|
|
@ -3253,7 +3271,7 @@ fn lock_requires_python() -> Result<()> {
|
||||||
----- stdout -----
|
----- stdout -----
|
||||||
|
|
||||||
----- stderr -----
|
----- stderr -----
|
||||||
Resolved 10 packages in [TIME]
|
Resolved 17 packages in [TIME]
|
||||||
"###);
|
"###);
|
||||||
|
|
||||||
let lock = fs_err::read_to_string(&lockfile).unwrap();
|
let lock = fs_err::read_to_string(&lockfile).unwrap();
|
||||||
|
|
@ -3265,6 +3283,12 @@ fn lock_requires_python() -> Result<()> {
|
||||||
lock, @r###"
|
lock, @r###"
|
||||||
version = 1
|
version = 1
|
||||||
requires-python = ">=3.7"
|
requires-python = ">=3.7"
|
||||||
|
resolution-markers = [
|
||||||
|
"python_full_version >= '3.8'",
|
||||||
|
"python_full_version >= '3.7.9' and python_full_version < '3.8'",
|
||||||
|
"python_full_version >= '3.7.4' and python_full_version < '3.7.9'",
|
||||||
|
"python_full_version < '3.7.4'",
|
||||||
|
]
|
||||||
|
|
||||||
[options]
|
[options]
|
||||||
exclude-newer = "2024-03-25T00:00:00Z"
|
exclude-newer = "2024-03-25T00:00:00Z"
|
||||||
|
|
@ -3285,16 +3309,38 @@ fn lock_requires_python() -> Result<()> {
|
||||||
name = "cattrs"
|
name = "cattrs"
|
||||||
version = "23.1.2"
|
version = "23.1.2"
|
||||||
source = { registry = "https://pypi.org/simple" }
|
source = { registry = "https://pypi.org/simple" }
|
||||||
|
resolution-markers = [
|
||||||
|
"python_full_version >= '3.7.9' and python_full_version < '3.8'",
|
||||||
|
"python_full_version >= '3.7.4' and python_full_version < '3.7.9'",
|
||||||
|
"python_full_version < '3.7.4'",
|
||||||
|
]
|
||||||
dependencies = [
|
dependencies = [
|
||||||
{ name = "attrs" },
|
{ name = "attrs", marker = "python_full_version < '3.8'" },
|
||||||
{ name = "exceptiongroup", marker = "python_full_version < '3.11'" },
|
{ name = "exceptiongroup", marker = "python_full_version < '3.8'" },
|
||||||
{ name = "typing-extensions", marker = "python_full_version < '3.11'" },
|
{ name = "typing-extensions", version = "4.7.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.8'" },
|
||||||
]
|
]
|
||||||
sdist = { url = "https://files.pythonhosted.org/packages/68/d4/27f9fd840e74d51b6d6a024d39ff495b56ffde71d28eb82758b7b85d0617/cattrs-23.1.2.tar.gz", hash = "sha256:db1c821b8c537382b2c7c66678c3790091ca0275ac486c76f3c8f3920e83c657", size = 39998 }
|
sdist = { url = "https://files.pythonhosted.org/packages/68/d4/27f9fd840e74d51b6d6a024d39ff495b56ffde71d28eb82758b7b85d0617/cattrs-23.1.2.tar.gz", hash = "sha256:db1c821b8c537382b2c7c66678c3790091ca0275ac486c76f3c8f3920e83c657", size = 39998 }
|
||||||
wheels = [
|
wheels = [
|
||||||
{ url = "https://files.pythonhosted.org/packages/3a/ba/05df14efaa0624fac6b1510e87f5ce446208d2f6ce50270a89b6268aebfe/cattrs-23.1.2-py3-none-any.whl", hash = "sha256:b2bb14311ac17bed0d58785e5a60f022e5431aca3932e3fc5cc8ed8639de50a4", size = 50845 },
|
{ url = "https://files.pythonhosted.org/packages/3a/ba/05df14efaa0624fac6b1510e87f5ce446208d2f6ce50270a89b6268aebfe/cattrs-23.1.2-py3-none-any.whl", hash = "sha256:b2bb14311ac17bed0d58785e5a60f022e5431aca3932e3fc5cc8ed8639de50a4", size = 50845 },
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "cattrs"
|
||||||
|
version = "23.2.3"
|
||||||
|
source = { registry = "https://pypi.org/simple" }
|
||||||
|
resolution-markers = [
|
||||||
|
"python_full_version >= '3.8'",
|
||||||
|
]
|
||||||
|
dependencies = [
|
||||||
|
{ name = "attrs", marker = "python_full_version >= '3.8'" },
|
||||||
|
{ name = "exceptiongroup", marker = "python_full_version >= '3.8' and python_full_version < '3.11'" },
|
||||||
|
{ name = "typing-extensions", version = "4.10.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.8' and python_full_version < '3.11'" },
|
||||||
|
]
|
||||||
|
sdist = { url = "https://files.pythonhosted.org/packages/1e/57/c6ccd22658c4bcb3beb3f1c262e1f170cf136e913b122763d0ddd328d284/cattrs-23.2.3.tar.gz", hash = "sha256:a934090d95abaa9e911dac357e3a8699e0b4b14f8529bcc7d2b1ad9d51672b9f", size = 610215 }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/b3/0d/cd4a4071c7f38385dc5ba91286723b4d1090b87815db48216212c6c6c30e/cattrs-23.2.3-py3-none-any.whl", hash = "sha256:0341994d94971052e9ee70662542699a3162ea1e0c62f7ce1b4a57f563685108", size = 57474 },
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "exceptiongroup"
|
name = "exceptiongroup"
|
||||||
version = "1.2.0"
|
version = "1.2.0"
|
||||||
|
|
@ -3309,21 +3355,43 @@ fn lock_requires_python() -> Result<()> {
|
||||||
version = "6.7.0"
|
version = "6.7.0"
|
||||||
source = { registry = "https://pypi.org/simple" }
|
source = { registry = "https://pypi.org/simple" }
|
||||||
dependencies = [
|
dependencies = [
|
||||||
{ name = "typing-extensions", marker = "python_full_version < '3.8'" },
|
{ name = "typing-extensions", version = "4.7.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.8'" },
|
||||||
{ name = "zipp" },
|
{ name = "zipp", marker = "python_full_version < '3.8'" },
|
||||||
]
|
]
|
||||||
sdist = { url = "https://files.pythonhosted.org/packages/a3/82/f6e29c8d5c098b6be61460371c2c5591f4a335923639edec43b3830650a4/importlib_metadata-6.7.0.tar.gz", hash = "sha256:1aaf550d4f73e5d6783e7acb77aec43d49da8017410afae93822cc9cca98c4d4", size = 53569 }
|
sdist = { url = "https://files.pythonhosted.org/packages/a3/82/f6e29c8d5c098b6be61460371c2c5591f4a335923639edec43b3830650a4/importlib_metadata-6.7.0.tar.gz", hash = "sha256:1aaf550d4f73e5d6783e7acb77aec43d49da8017410afae93822cc9cca98c4d4", size = 53569 }
|
||||||
wheels = [
|
wheels = [
|
||||||
{ url = "https://files.pythonhosted.org/packages/ff/94/64287b38c7de4c90683630338cf28f129decbba0a44f0c6db35a873c73c4/importlib_metadata-6.7.0-py3-none-any.whl", hash = "sha256:cb52082e659e97afc5dac71e79de97d8681de3aa07ff18578330904a9d18e5b5", size = 22934 },
|
{ url = "https://files.pythonhosted.org/packages/ff/94/64287b38c7de4c90683630338cf28f129decbba0a44f0c6db35a873c73c4/importlib_metadata-6.7.0-py3-none-any.whl", hash = "sha256:cb52082e659e97afc5dac71e79de97d8681de3aa07ff18578330904a9d18e5b5", size = 22934 },
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "lsprotocol"
|
||||||
|
version = "2023.0.0"
|
||||||
|
source = { registry = "https://pypi.org/simple" }
|
||||||
|
resolution-markers = [
|
||||||
|
"python_full_version >= '3.7.9' and python_full_version < '3.8'",
|
||||||
|
]
|
||||||
|
dependencies = [
|
||||||
|
{ name = "attrs", marker = "python_full_version >= '3.7.9' and python_full_version < '3.8'" },
|
||||||
|
{ name = "cattrs", version = "23.1.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.7.9' and python_full_version < '3.8'" },
|
||||||
|
]
|
||||||
|
sdist = { url = "https://files.pythonhosted.org/packages/3e/fe/f7671a4fb28606ff1663bba60aff6af21b1e43a977c74c33db13cb83680f/lsprotocol-2023.0.0.tar.gz", hash = "sha256:c9d92e12a3f4ed9317d3068226592860aab5357d93cf5b2451dc244eee8f35f2", size = 69399 }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/2d/5b/f18eb1823a4cee9bed70cdcc25eed5a75845367c42e63a79010a7c34f8a7/lsprotocol-2023.0.0-py3-none-any.whl", hash = "sha256:e85fc87ee26c816adca9eb497bb3db1a7c79c477a11563626e712eaccf926a05", size = 70789 },
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "lsprotocol"
|
name = "lsprotocol"
|
||||||
version = "2023.0.1"
|
version = "2023.0.1"
|
||||||
source = { registry = "https://pypi.org/simple" }
|
source = { registry = "https://pypi.org/simple" }
|
||||||
|
resolution-markers = [
|
||||||
|
"python_full_version >= '3.8'",
|
||||||
|
"python_full_version >= '3.7.4' and python_full_version < '3.7.9'",
|
||||||
|
"python_full_version < '3.7.4'",
|
||||||
|
]
|
||||||
dependencies = [
|
dependencies = [
|
||||||
{ name = "attrs" },
|
{ name = "attrs", marker = "python_full_version < '3.7.9' or python_full_version >= '3.8'" },
|
||||||
{ name = "cattrs" },
|
{ name = "cattrs", version = "23.1.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.7.9'" },
|
||||||
|
{ name = "cattrs", version = "23.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.8'" },
|
||||||
]
|
]
|
||||||
sdist = { url = "https://files.pythonhosted.org/packages/9d/f6/6e80484ec078d0b50699ceb1833597b792a6c695f90c645fbaf54b947e6f/lsprotocol-2023.0.1.tar.gz", hash = "sha256:cc5c15130d2403c18b734304339e51242d3018a05c4f7d0f198ad6e0cd21861d", size = 69434 }
|
sdist = { url = "https://files.pythonhosted.org/packages/9d/f6/6e80484ec078d0b50699ceb1833597b792a6c695f90c645fbaf54b947e6f/lsprotocol-2023.0.1.tar.gz", hash = "sha256:cc5c15130d2403c18b734304339e51242d3018a05c4f7d0f198ad6e0cd21861d", size = 69434 }
|
||||||
wheels = [
|
wheels = [
|
||||||
|
|
@ -3335,7 +3403,10 @@ fn lock_requires_python() -> Result<()> {
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
source = { editable = "." }
|
source = { editable = "." }
|
||||||
dependencies = [
|
dependencies = [
|
||||||
{ name = "pygls" },
|
{ name = "pygls", version = "1.0.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.7.4'" },
|
||||||
|
{ name = "pygls", version = "1.0.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.7.4' and python_full_version < '3.7.9'" },
|
||||||
|
{ name = "pygls", version = "1.2.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.7.9' and python_full_version < '3.8'" },
|
||||||
|
{ name = "pygls", version = "1.3.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.8'" },
|
||||||
]
|
]
|
||||||
|
|
||||||
[package.metadata]
|
[package.metadata]
|
||||||
|
|
@ -3345,33 +3416,119 @@ fn lock_requires_python() -> Result<()> {
|
||||||
name = "pygls"
|
name = "pygls"
|
||||||
version = "1.0.1"
|
version = "1.0.1"
|
||||||
source = { registry = "https://pypi.org/simple" }
|
source = { registry = "https://pypi.org/simple" }
|
||||||
|
resolution-markers = [
|
||||||
|
"python_full_version < '3.7.4'",
|
||||||
|
]
|
||||||
dependencies = [
|
dependencies = [
|
||||||
{ name = "lsprotocol" },
|
{ name = "lsprotocol", version = "2023.0.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.7.4'" },
|
||||||
{ name = "typeguard" },
|
{ name = "typeguard", version = "2.13.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.7.4'" },
|
||||||
]
|
]
|
||||||
sdist = { url = "https://files.pythonhosted.org/packages/8e/27/58ff0f76b379fc11a1d03e8d4b4e96fd0abb463d27709a7fb4193bcdbbc4/pygls-1.0.1.tar.gz", hash = "sha256:f3ee98ddbb4690eb5c755bc32ba7e129607f14cbd313575f33d0cea443b78cb2", size = 674546 }
|
sdist = { url = "https://files.pythonhosted.org/packages/8e/27/58ff0f76b379fc11a1d03e8d4b4e96fd0abb463d27709a7fb4193bcdbbc4/pygls-1.0.1.tar.gz", hash = "sha256:f3ee98ddbb4690eb5c755bc32ba7e129607f14cbd313575f33d0cea443b78cb2", size = 674546 }
|
||||||
wheels = [
|
wheels = [
|
||||||
{ url = "https://files.pythonhosted.org/packages/da/9b/4fd77a060068f2f3f46f97ed6ba8762c5a73f11ef0c196cfd34f3a9be878/pygls-1.0.1-py3-none-any.whl", hash = "sha256:adacc96da77598c70f46acfdfd1481d3da90cd54f639f7eee52eb6e4dbd57b55", size = 40367 },
|
{ url = "https://files.pythonhosted.org/packages/da/9b/4fd77a060068f2f3f46f97ed6ba8762c5a73f11ef0c196cfd34f3a9be878/pygls-1.0.1-py3-none-any.whl", hash = "sha256:adacc96da77598c70f46acfdfd1481d3da90cd54f639f7eee52eb6e4dbd57b55", size = 40367 },
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "pygls"
|
||||||
|
version = "1.0.2"
|
||||||
|
source = { registry = "https://pypi.org/simple" }
|
||||||
|
resolution-markers = [
|
||||||
|
"python_full_version >= '3.7.4' and python_full_version < '3.7.9'",
|
||||||
|
]
|
||||||
|
dependencies = [
|
||||||
|
{ name = "lsprotocol", version = "2023.0.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.7.4' and python_full_version < '3.7.9'" },
|
||||||
|
{ name = "typeguard", version = "3.0.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.7.4' and python_full_version < '3.7.9'" },
|
||||||
|
]
|
||||||
|
sdist = { url = "https://files.pythonhosted.org/packages/bb/c4/fc9c817ba0f1ad0fdbe1686bc8211a0dc2390ab11cf7780e9eeed718594b/pygls-1.0.2.tar.gz", hash = "sha256:888ed63d1f650b4fc64d603d73d37545386ec533c0caac921aed80f80ea946a4", size = 674931 }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/6d/c6/ed6aa6fb709abf57b1a75b83f7809792b79320247391dda8f04d2a003548/pygls-1.0.2-py3-none-any.whl", hash = "sha256:6d278d29fa6559b0f7a448263c85cb64ec6e9369548b02f1a7944060848b21f9", size = 38654 },
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "pygls"
|
||||||
|
version = "1.2.1"
|
||||||
|
source = { registry = "https://pypi.org/simple" }
|
||||||
|
resolution-markers = [
|
||||||
|
"python_full_version >= '3.7.9' and python_full_version < '3.8'",
|
||||||
|
]
|
||||||
|
dependencies = [
|
||||||
|
{ name = "lsprotocol", version = "2023.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.7.9' and python_full_version < '3.8'" },
|
||||||
|
]
|
||||||
|
sdist = { url = "https://files.pythonhosted.org/packages/e6/94/534c11ba5475df09542e48d751a66e0448d52bbbb92cbef5541deef7760d/pygls-1.2.1.tar.gz", hash = "sha256:04f9b9c115b622dcc346fb390289066565343d60245a424eca77cb429b911ed8", size = 45274 }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/36/31/3799444d3f072ffca1a35eb02a48f964384cc13f001125e87d9f0748687b/pygls-1.2.1-py3-none-any.whl", hash = "sha256:7dcfcf12b6f15beb606afa46de2ed348b65a279c340ef2242a9a35c22eeafe94", size = 55983 },
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "pygls"
|
||||||
|
version = "1.3.0"
|
||||||
|
source = { registry = "https://pypi.org/simple" }
|
||||||
|
resolution-markers = [
|
||||||
|
"python_full_version >= '3.8'",
|
||||||
|
]
|
||||||
|
dependencies = [
|
||||||
|
{ name = "cattrs", version = "23.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.8'" },
|
||||||
|
{ name = "lsprotocol", version = "2023.0.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.8'" },
|
||||||
|
]
|
||||||
|
sdist = { url = "https://files.pythonhosted.org/packages/e9/8d/31b50ac0879464049d744a1ddf00dc6474433eb55d40fa0c8e8510591ad2/pygls-1.3.0.tar.gz", hash = "sha256:1b44ace89c9382437a717534f490eadc6fda7c0c6c16ac1eaaf5568e345e4fb8", size = 45539 }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/4e/1e/643070d8f5c851958662e7e5df16d9c3a068a598a7ee7bb2eb8d95b4e5d7/pygls-1.3.0-py3-none-any.whl", hash = "sha256:d4a01414b6ed4e34e7e8fd29b77d3e88c29615df7d0bbff49bf019e15ec04b8f", size = 56031 },
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "typeguard"
|
name = "typeguard"
|
||||||
version = "2.13.3"
|
version = "2.13.3"
|
||||||
source = { registry = "https://pypi.org/simple" }
|
source = { registry = "https://pypi.org/simple" }
|
||||||
|
resolution-markers = [
|
||||||
|
"python_full_version < '3.7.4'",
|
||||||
|
]
|
||||||
sdist = { url = "https://files.pythonhosted.org/packages/3a/38/c61bfcf62a7b572b5e9363a802ff92559cb427ee963048e1442e3aef7490/typeguard-2.13.3.tar.gz", hash = "sha256:00edaa8da3a133674796cf5ea87d9f4b4c367d77476e185e80251cc13dfbb8c4", size = 40604 }
|
sdist = { url = "https://files.pythonhosted.org/packages/3a/38/c61bfcf62a7b572b5e9363a802ff92559cb427ee963048e1442e3aef7490/typeguard-2.13.3.tar.gz", hash = "sha256:00edaa8da3a133674796cf5ea87d9f4b4c367d77476e185e80251cc13dfbb8c4", size = 40604 }
|
||||||
wheels = [
|
wheels = [
|
||||||
{ url = "https://files.pythonhosted.org/packages/9a/bb/d43e5c75054e53efce310e79d63df0ac3f25e34c926be5dffb7d283fb2a8/typeguard-2.13.3-py3-none-any.whl", hash = "sha256:5e3e3be01e887e7eafae5af63d1f36c849aaa94e3a0112097312aabfa16284f1", size = 17605 },
|
{ url = "https://files.pythonhosted.org/packages/9a/bb/d43e5c75054e53efce310e79d63df0ac3f25e34c926be5dffb7d283fb2a8/typeguard-2.13.3-py3-none-any.whl", hash = "sha256:5e3e3be01e887e7eafae5af63d1f36c849aaa94e3a0112097312aabfa16284f1", size = 17605 },
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "typeguard"
|
||||||
|
version = "3.0.2"
|
||||||
|
source = { registry = "https://pypi.org/simple" }
|
||||||
|
resolution-markers = [
|
||||||
|
"python_full_version >= '3.7.4' and python_full_version < '3.7.9'",
|
||||||
|
]
|
||||||
|
dependencies = [
|
||||||
|
{ name = "importlib-metadata", marker = "python_full_version >= '3.7.4' and python_full_version < '3.7.9'" },
|
||||||
|
{ name = "typing-extensions", version = "4.7.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.7.4' and python_full_version < '3.7.9'" },
|
||||||
|
]
|
||||||
|
sdist = { url = "https://files.pythonhosted.org/packages/af/40/3398497c6e6951c92abaf933492d6633e7ac4df0bfc9d81f304b3f977f15/typeguard-3.0.2.tar.gz", hash = "sha256:fee5297fdb28f8e9efcb8142b5ee219e02375509cd77ea9d270b5af826358d5a", size = 58171 }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/e2/62/7d206b0ac6fcbb163215ecc622a54eb747f85ad86d14bc513a834442d0f6/typeguard-3.0.2-py3-none-any.whl", hash = "sha256:bbe993854385284ab42fd5bd3bee6f6556577ce8b50696d6cb956d704f286c8e", size = 30696 },
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "typing-extensions"
|
name = "typing-extensions"
|
||||||
version = "4.7.1"
|
version = "4.7.1"
|
||||||
source = { registry = "https://pypi.org/simple" }
|
source = { registry = "https://pypi.org/simple" }
|
||||||
|
resolution-markers = [
|
||||||
|
"python_full_version >= '3.7.9' and python_full_version < '3.8'",
|
||||||
|
"python_full_version >= '3.7.4' and python_full_version < '3.7.9'",
|
||||||
|
"python_full_version < '3.7.4'",
|
||||||
|
]
|
||||||
sdist = { url = "https://files.pythonhosted.org/packages/3c/8b/0111dd7d6c1478bf83baa1cab85c686426c7a6274119aceb2bd9d35395ad/typing_extensions-4.7.1.tar.gz", hash = "sha256:b75ddc264f0ba5615db7ba217daeb99701ad295353c45f9e95963337ceeeffb2", size = 72876 }
|
sdist = { url = "https://files.pythonhosted.org/packages/3c/8b/0111dd7d6c1478bf83baa1cab85c686426c7a6274119aceb2bd9d35395ad/typing_extensions-4.7.1.tar.gz", hash = "sha256:b75ddc264f0ba5615db7ba217daeb99701ad295353c45f9e95963337ceeeffb2", size = 72876 }
|
||||||
wheels = [
|
wheels = [
|
||||||
{ url = "https://files.pythonhosted.org/packages/ec/6b/63cc3df74987c36fe26157ee12e09e8f9db4de771e0f3404263117e75b95/typing_extensions-4.7.1-py3-none-any.whl", hash = "sha256:440d5dd3af93b060174bf433bccd69b0babc3b15b1a8dca43789fd7f61514b36", size = 33232 },
|
{ url = "https://files.pythonhosted.org/packages/ec/6b/63cc3df74987c36fe26157ee12e09e8f9db4de771e0f3404263117e75b95/typing_extensions-4.7.1-py3-none-any.whl", hash = "sha256:440d5dd3af93b060174bf433bccd69b0babc3b15b1a8dca43789fd7f61514b36", size = 33232 },
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "typing-extensions"
|
||||||
|
version = "4.10.0"
|
||||||
|
source = { registry = "https://pypi.org/simple" }
|
||||||
|
resolution-markers = [
|
||||||
|
"python_full_version >= '3.8'",
|
||||||
|
]
|
||||||
|
sdist = { url = "https://files.pythonhosted.org/packages/16/3a/0d26ce356c7465a19c9ea8814b960f8a36c3b0d07c323176620b7b483e44/typing_extensions-4.10.0.tar.gz", hash = "sha256:b0abd7c89e8fb96f98db18d86106ff1d90ab692004eb746cf6eda2682f91b3cb", size = 77558 }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/f9/de/dc04a3ea60b22624b51c703a84bbe0184abcd1d0b9bc8074b5d6b7ab90bb/typing_extensions-4.10.0-py3-none-any.whl", hash = "sha256:69b1a937c3a517342112fb4c6df7e72fc39a38e7891a5730ed4985b5214b5475", size = 33926 },
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "zipp"
|
name = "zipp"
|
||||||
version = "3.15.0"
|
version = "3.15.0"
|
||||||
|
|
@ -3408,7 +3565,7 @@ fn lock_requires_python() -> Result<()> {
|
||||||
----- stdout -----
|
----- stdout -----
|
||||||
|
|
||||||
----- stderr -----
|
----- stderr -----
|
||||||
Resolved 9 packages in [TIME]
|
Resolved 13 packages in [TIME]
|
||||||
"###);
|
"###);
|
||||||
|
|
||||||
let lock = fs_err::read_to_string(&lockfile).unwrap();
|
let lock = fs_err::read_to_string(&lockfile).unwrap();
|
||||||
|
|
@ -3420,6 +3577,10 @@ fn lock_requires_python() -> Result<()> {
|
||||||
lock, @r###"
|
lock, @r###"
|
||||||
version = 1
|
version = 1
|
||||||
requires-python = ">=3.7.9"
|
requires-python = ">=3.7.9"
|
||||||
|
resolution-markers = [
|
||||||
|
"python_full_version >= '3.8'",
|
||||||
|
"python_full_version < '3.8'",
|
||||||
|
]
|
||||||
|
|
||||||
[options]
|
[options]
|
||||||
exclude-newer = "2024-03-25T00:00:00Z"
|
exclude-newer = "2024-03-25T00:00:00Z"
|
||||||
|
|
@ -3440,16 +3601,36 @@ fn lock_requires_python() -> Result<()> {
|
||||||
name = "cattrs"
|
name = "cattrs"
|
||||||
version = "23.1.2"
|
version = "23.1.2"
|
||||||
source = { registry = "https://pypi.org/simple" }
|
source = { registry = "https://pypi.org/simple" }
|
||||||
|
resolution-markers = [
|
||||||
|
"python_full_version < '3.8'",
|
||||||
|
]
|
||||||
dependencies = [
|
dependencies = [
|
||||||
{ name = "attrs" },
|
{ name = "attrs", marker = "python_full_version < '3.8'" },
|
||||||
{ name = "exceptiongroup", marker = "python_full_version < '3.11'" },
|
{ name = "exceptiongroup", marker = "python_full_version < '3.8'" },
|
||||||
{ name = "typing-extensions", marker = "python_full_version < '3.11'" },
|
{ name = "typing-extensions", version = "4.7.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.8'" },
|
||||||
]
|
]
|
||||||
sdist = { url = "https://files.pythonhosted.org/packages/68/d4/27f9fd840e74d51b6d6a024d39ff495b56ffde71d28eb82758b7b85d0617/cattrs-23.1.2.tar.gz", hash = "sha256:db1c821b8c537382b2c7c66678c3790091ca0275ac486c76f3c8f3920e83c657", size = 39998 }
|
sdist = { url = "https://files.pythonhosted.org/packages/68/d4/27f9fd840e74d51b6d6a024d39ff495b56ffde71d28eb82758b7b85d0617/cattrs-23.1.2.tar.gz", hash = "sha256:db1c821b8c537382b2c7c66678c3790091ca0275ac486c76f3c8f3920e83c657", size = 39998 }
|
||||||
wheels = [
|
wheels = [
|
||||||
{ url = "https://files.pythonhosted.org/packages/3a/ba/05df14efaa0624fac6b1510e87f5ce446208d2f6ce50270a89b6268aebfe/cattrs-23.1.2-py3-none-any.whl", hash = "sha256:b2bb14311ac17bed0d58785e5a60f022e5431aca3932e3fc5cc8ed8639de50a4", size = 50845 },
|
{ url = "https://files.pythonhosted.org/packages/3a/ba/05df14efaa0624fac6b1510e87f5ce446208d2f6ce50270a89b6268aebfe/cattrs-23.1.2-py3-none-any.whl", hash = "sha256:b2bb14311ac17bed0d58785e5a60f022e5431aca3932e3fc5cc8ed8639de50a4", size = 50845 },
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "cattrs"
|
||||||
|
version = "23.2.3"
|
||||||
|
source = { registry = "https://pypi.org/simple" }
|
||||||
|
resolution-markers = [
|
||||||
|
"python_full_version >= '3.8'",
|
||||||
|
]
|
||||||
|
dependencies = [
|
||||||
|
{ name = "attrs", marker = "python_full_version >= '3.8'" },
|
||||||
|
{ name = "exceptiongroup", marker = "python_full_version >= '3.8' and python_full_version < '3.11'" },
|
||||||
|
{ name = "typing-extensions", version = "4.10.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.8' and python_full_version < '3.11'" },
|
||||||
|
]
|
||||||
|
sdist = { url = "https://files.pythonhosted.org/packages/1e/57/c6ccd22658c4bcb3beb3f1c262e1f170cf136e913b122763d0ddd328d284/cattrs-23.2.3.tar.gz", hash = "sha256:a934090d95abaa9e911dac357e3a8699e0b4b14f8529bcc7d2b1ad9d51672b9f", size = 610215 }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/b3/0d/cd4a4071c7f38385dc5ba91286723b4d1090b87815db48216212c6c6c30e/cattrs-23.2.3-py3-none-any.whl", hash = "sha256:0341994d94971052e9ee70662542699a3162ea1e0c62f7ce1b4a57f563685108", size = 57474 },
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "exceptiongroup"
|
name = "exceptiongroup"
|
||||||
version = "1.2.0"
|
version = "1.2.0"
|
||||||
|
|
@ -3464,8 +3645,8 @@ fn lock_requires_python() -> Result<()> {
|
||||||
version = "6.7.0"
|
version = "6.7.0"
|
||||||
source = { registry = "https://pypi.org/simple" }
|
source = { registry = "https://pypi.org/simple" }
|
||||||
dependencies = [
|
dependencies = [
|
||||||
{ name = "typing-extensions", marker = "python_full_version < '3.8'" },
|
{ name = "typing-extensions", version = "4.7.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.8'" },
|
||||||
{ name = "zipp" },
|
{ name = "zipp", marker = "python_full_version < '3.8'" },
|
||||||
]
|
]
|
||||||
sdist = { url = "https://files.pythonhosted.org/packages/a3/82/f6e29c8d5c098b6be61460371c2c5591f4a335923639edec43b3830650a4/importlib_metadata-6.7.0.tar.gz", hash = "sha256:1aaf550d4f73e5d6783e7acb77aec43d49da8017410afae93822cc9cca98c4d4", size = 53569 }
|
sdist = { url = "https://files.pythonhosted.org/packages/a3/82/f6e29c8d5c098b6be61460371c2c5591f4a335923639edec43b3830650a4/importlib_metadata-6.7.0.tar.gz", hash = "sha256:1aaf550d4f73e5d6783e7acb77aec43d49da8017410afae93822cc9cca98c4d4", size = 53569 }
|
||||||
wheels = [
|
wheels = [
|
||||||
|
|
@ -3476,21 +3657,41 @@ fn lock_requires_python() -> Result<()> {
|
||||||
name = "lsprotocol"
|
name = "lsprotocol"
|
||||||
version = "2023.0.0"
|
version = "2023.0.0"
|
||||||
source = { registry = "https://pypi.org/simple" }
|
source = { registry = "https://pypi.org/simple" }
|
||||||
|
resolution-markers = [
|
||||||
|
"python_full_version < '3.8'",
|
||||||
|
]
|
||||||
dependencies = [
|
dependencies = [
|
||||||
{ name = "attrs" },
|
{ name = "attrs", marker = "python_full_version < '3.8'" },
|
||||||
{ name = "cattrs" },
|
{ name = "cattrs", version = "23.1.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.8'" },
|
||||||
]
|
]
|
||||||
sdist = { url = "https://files.pythonhosted.org/packages/3e/fe/f7671a4fb28606ff1663bba60aff6af21b1e43a977c74c33db13cb83680f/lsprotocol-2023.0.0.tar.gz", hash = "sha256:c9d92e12a3f4ed9317d3068226592860aab5357d93cf5b2451dc244eee8f35f2", size = 69399 }
|
sdist = { url = "https://files.pythonhosted.org/packages/3e/fe/f7671a4fb28606ff1663bba60aff6af21b1e43a977c74c33db13cb83680f/lsprotocol-2023.0.0.tar.gz", hash = "sha256:c9d92e12a3f4ed9317d3068226592860aab5357d93cf5b2451dc244eee8f35f2", size = 69399 }
|
||||||
wheels = [
|
wheels = [
|
||||||
{ url = "https://files.pythonhosted.org/packages/2d/5b/f18eb1823a4cee9bed70cdcc25eed5a75845367c42e63a79010a7c34f8a7/lsprotocol-2023.0.0-py3-none-any.whl", hash = "sha256:e85fc87ee26c816adca9eb497bb3db1a7c79c477a11563626e712eaccf926a05", size = 70789 },
|
{ url = "https://files.pythonhosted.org/packages/2d/5b/f18eb1823a4cee9bed70cdcc25eed5a75845367c42e63a79010a7c34f8a7/lsprotocol-2023.0.0-py3-none-any.whl", hash = "sha256:e85fc87ee26c816adca9eb497bb3db1a7c79c477a11563626e712eaccf926a05", size = 70789 },
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "lsprotocol"
|
||||||
|
version = "2023.0.1"
|
||||||
|
source = { registry = "https://pypi.org/simple" }
|
||||||
|
resolution-markers = [
|
||||||
|
"python_full_version >= '3.8'",
|
||||||
|
]
|
||||||
|
dependencies = [
|
||||||
|
{ name = "attrs", marker = "python_full_version >= '3.8'" },
|
||||||
|
{ name = "cattrs", version = "23.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.8'" },
|
||||||
|
]
|
||||||
|
sdist = { url = "https://files.pythonhosted.org/packages/9d/f6/6e80484ec078d0b50699ceb1833597b792a6c695f90c645fbaf54b947e6f/lsprotocol-2023.0.1.tar.gz", hash = "sha256:cc5c15130d2403c18b734304339e51242d3018a05c4f7d0f198ad6e0cd21861d", size = 69434 }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/8d/37/2351e48cb3309673492d3a8c59d407b75fb6630e560eb27ecd4da03adc9a/lsprotocol-2023.0.1-py3-none-any.whl", hash = "sha256:c75223c9e4af2f24272b14c6375787438279369236cd568f596d4951052a60f2", size = 70826 },
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "project"
|
name = "project"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
source = { editable = "." }
|
source = { editable = "." }
|
||||||
dependencies = [
|
dependencies = [
|
||||||
{ name = "pygls" },
|
{ name = "pygls", version = "1.2.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.8'" },
|
||||||
|
{ name = "pygls", version = "1.3.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.8'" },
|
||||||
]
|
]
|
||||||
|
|
||||||
[package.metadata]
|
[package.metadata]
|
||||||
|
|
@ -3500,23 +3701,57 @@ fn lock_requires_python() -> Result<()> {
|
||||||
name = "pygls"
|
name = "pygls"
|
||||||
version = "1.2.1"
|
version = "1.2.1"
|
||||||
source = { registry = "https://pypi.org/simple" }
|
source = { registry = "https://pypi.org/simple" }
|
||||||
|
resolution-markers = [
|
||||||
|
"python_full_version < '3.8'",
|
||||||
|
]
|
||||||
dependencies = [
|
dependencies = [
|
||||||
{ name = "lsprotocol" },
|
{ name = "lsprotocol", version = "2023.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.8'" },
|
||||||
]
|
]
|
||||||
sdist = { url = "https://files.pythonhosted.org/packages/e6/94/534c11ba5475df09542e48d751a66e0448d52bbbb92cbef5541deef7760d/pygls-1.2.1.tar.gz", hash = "sha256:04f9b9c115b622dcc346fb390289066565343d60245a424eca77cb429b911ed8", size = 45274 }
|
sdist = { url = "https://files.pythonhosted.org/packages/e6/94/534c11ba5475df09542e48d751a66e0448d52bbbb92cbef5541deef7760d/pygls-1.2.1.tar.gz", hash = "sha256:04f9b9c115b622dcc346fb390289066565343d60245a424eca77cb429b911ed8", size = 45274 }
|
||||||
wheels = [
|
wheels = [
|
||||||
{ url = "https://files.pythonhosted.org/packages/36/31/3799444d3f072ffca1a35eb02a48f964384cc13f001125e87d9f0748687b/pygls-1.2.1-py3-none-any.whl", hash = "sha256:7dcfcf12b6f15beb606afa46de2ed348b65a279c340ef2242a9a35c22eeafe94", size = 55983 },
|
{ url = "https://files.pythonhosted.org/packages/36/31/3799444d3f072ffca1a35eb02a48f964384cc13f001125e87d9f0748687b/pygls-1.2.1-py3-none-any.whl", hash = "sha256:7dcfcf12b6f15beb606afa46de2ed348b65a279c340ef2242a9a35c22eeafe94", size = 55983 },
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "pygls"
|
||||||
|
version = "1.3.0"
|
||||||
|
source = { registry = "https://pypi.org/simple" }
|
||||||
|
resolution-markers = [
|
||||||
|
"python_full_version >= '3.8'",
|
||||||
|
]
|
||||||
|
dependencies = [
|
||||||
|
{ name = "cattrs", version = "23.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.8'" },
|
||||||
|
{ name = "lsprotocol", version = "2023.0.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.8'" },
|
||||||
|
]
|
||||||
|
sdist = { url = "https://files.pythonhosted.org/packages/e9/8d/31b50ac0879464049d744a1ddf00dc6474433eb55d40fa0c8e8510591ad2/pygls-1.3.0.tar.gz", hash = "sha256:1b44ace89c9382437a717534f490eadc6fda7c0c6c16ac1eaaf5568e345e4fb8", size = 45539 }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/4e/1e/643070d8f5c851958662e7e5df16d9c3a068a598a7ee7bb2eb8d95b4e5d7/pygls-1.3.0-py3-none-any.whl", hash = "sha256:d4a01414b6ed4e34e7e8fd29b77d3e88c29615df7d0bbff49bf019e15ec04b8f", size = 56031 },
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "typing-extensions"
|
name = "typing-extensions"
|
||||||
version = "4.7.1"
|
version = "4.7.1"
|
||||||
source = { registry = "https://pypi.org/simple" }
|
source = { registry = "https://pypi.org/simple" }
|
||||||
|
resolution-markers = [
|
||||||
|
"python_full_version < '3.8'",
|
||||||
|
]
|
||||||
sdist = { url = "https://files.pythonhosted.org/packages/3c/8b/0111dd7d6c1478bf83baa1cab85c686426c7a6274119aceb2bd9d35395ad/typing_extensions-4.7.1.tar.gz", hash = "sha256:b75ddc264f0ba5615db7ba217daeb99701ad295353c45f9e95963337ceeeffb2", size = 72876 }
|
sdist = { url = "https://files.pythonhosted.org/packages/3c/8b/0111dd7d6c1478bf83baa1cab85c686426c7a6274119aceb2bd9d35395ad/typing_extensions-4.7.1.tar.gz", hash = "sha256:b75ddc264f0ba5615db7ba217daeb99701ad295353c45f9e95963337ceeeffb2", size = 72876 }
|
||||||
wheels = [
|
wheels = [
|
||||||
{ url = "https://files.pythonhosted.org/packages/ec/6b/63cc3df74987c36fe26157ee12e09e8f9db4de771e0f3404263117e75b95/typing_extensions-4.7.1-py3-none-any.whl", hash = "sha256:440d5dd3af93b060174bf433bccd69b0babc3b15b1a8dca43789fd7f61514b36", size = 33232 },
|
{ url = "https://files.pythonhosted.org/packages/ec/6b/63cc3df74987c36fe26157ee12e09e8f9db4de771e0f3404263117e75b95/typing_extensions-4.7.1-py3-none-any.whl", hash = "sha256:440d5dd3af93b060174bf433bccd69b0babc3b15b1a8dca43789fd7f61514b36", size = 33232 },
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "typing-extensions"
|
||||||
|
version = "4.10.0"
|
||||||
|
source = { registry = "https://pypi.org/simple" }
|
||||||
|
resolution-markers = [
|
||||||
|
"python_full_version >= '3.8'",
|
||||||
|
]
|
||||||
|
sdist = { url = "https://files.pythonhosted.org/packages/16/3a/0d26ce356c7465a19c9ea8814b960f8a36c3b0d07c323176620b7b483e44/typing_extensions-4.10.0.tar.gz", hash = "sha256:b0abd7c89e8fb96f98db18d86106ff1d90ab692004eb746cf6eda2682f91b3cb", size = 77558 }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/f9/de/dc04a3ea60b22624b51c703a84bbe0184abcd1d0b9bc8074b5d6b7ab90bb/typing_extensions-4.10.0-py3-none-any.whl", hash = "sha256:69b1a937c3a517342112fb4c6df7e72fc39a38e7891a5730ed4985b5214b5475", size = 33926 },
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "zipp"
|
name = "zipp"
|
||||||
version = "3.15.0"
|
version = "3.15.0"
|
||||||
|
|
@ -4513,7 +4748,7 @@ fn lock_requires_python_unbounded() -> Result<()> {
|
||||||
|
|
||||||
----- stderr -----
|
----- stderr -----
|
||||||
warning: The workspace `requires-python` value (`<=3.12`) does not contain a lower bound. Add a lower bound to indicate the minimum compatible Python version (e.g., `>=3.11`).
|
warning: The workspace `requires-python` value (`<=3.12`) does not contain a lower bound. Add a lower bound to indicate the minimum compatible Python version (e.g., `>=3.11`).
|
||||||
Resolved 2 packages in [TIME]
|
Resolved 3 packages in [TIME]
|
||||||
"###);
|
"###);
|
||||||
|
|
||||||
let lock = fs_err::read_to_string(&lockfile).unwrap();
|
let lock = fs_err::read_to_string(&lockfile).unwrap();
|
||||||
|
|
@ -4525,6 +4760,10 @@ fn lock_requires_python_unbounded() -> Result<()> {
|
||||||
lock, @r###"
|
lock, @r###"
|
||||||
version = 1
|
version = 1
|
||||||
requires-python = "<=3.12"
|
requires-python = "<=3.12"
|
||||||
|
resolution-markers = [
|
||||||
|
"python_full_version >= '3.7'",
|
||||||
|
"python_full_version < '3.7'",
|
||||||
|
]
|
||||||
|
|
||||||
[options]
|
[options]
|
||||||
exclude-newer = "2024-03-25T00:00:00Z"
|
exclude-newer = "2024-03-25T00:00:00Z"
|
||||||
|
|
@ -4533,17 +4772,33 @@ fn lock_requires_python_unbounded() -> Result<()> {
|
||||||
name = "iniconfig"
|
name = "iniconfig"
|
||||||
version = "1.1.1"
|
version = "1.1.1"
|
||||||
source = { registry = "https://pypi.org/simple" }
|
source = { registry = "https://pypi.org/simple" }
|
||||||
|
resolution-markers = [
|
||||||
|
"python_full_version < '3.7'",
|
||||||
|
]
|
||||||
sdist = { url = "https://files.pythonhosted.org/packages/23/a2/97899f6bd0e873fed3a7e67ae8d3a08b21799430fb4da15cfedf10d6e2c2/iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32", size = 8104 }
|
sdist = { url = "https://files.pythonhosted.org/packages/23/a2/97899f6bd0e873fed3a7e67ae8d3a08b21799430fb4da15cfedf10d6e2c2/iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32", size = 8104 }
|
||||||
wheels = [
|
wheels = [
|
||||||
{ url = "https://files.pythonhosted.org/packages/9b/dd/b3c12c6d707058fa947864b67f0c4e0c39ef8610988d7baea9578f3c48f3/iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3", size = 4990 },
|
{ url = "https://files.pythonhosted.org/packages/9b/dd/b3c12c6d707058fa947864b67f0c4e0c39ef8610988d7baea9578f3c48f3/iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3", size = 4990 },
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "iniconfig"
|
||||||
|
version = "2.0.0"
|
||||||
|
source = { registry = "https://pypi.org/simple" }
|
||||||
|
resolution-markers = [
|
||||||
|
"python_full_version >= '3.7'",
|
||||||
|
]
|
||||||
|
sdist = { url = "https://files.pythonhosted.org/packages/d7/4b/cbd8e699e64a6f16ca3a8220661b5f83792b3017d0f79807cb8708d33913/iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3", size = 4646 }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/ef/a6/62565a6e1cf69e10f5727360368e451d4b7f58beeac6173dc9db836a5b46/iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374", size = 5892 },
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "project"
|
name = "project"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
source = { editable = "." }
|
source = { editable = "." }
|
||||||
dependencies = [
|
dependencies = [
|
||||||
{ name = "iniconfig" },
|
{ name = "iniconfig", version = "1.1.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.7'" },
|
||||||
|
{ name = "iniconfig", version = "2.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.7'" },
|
||||||
]
|
]
|
||||||
|
|
||||||
[package.metadata]
|
[package.metadata]
|
||||||
|
|
@ -4560,7 +4815,166 @@ fn lock_requires_python_unbounded() -> Result<()> {
|
||||||
|
|
||||||
----- stderr -----
|
----- stderr -----
|
||||||
warning: The workspace `requires-python` value (`<=3.12`) does not contain a lower bound. Add a lower bound to indicate the minimum compatible Python version (e.g., `>=3.11`).
|
warning: The workspace `requires-python` value (`<=3.12`) does not contain a lower bound. Add a lower bound to indicate the minimum compatible Python version (e.g., `>=3.11`).
|
||||||
Resolved 2 packages in [TIME]
|
Resolved 3 packages in [TIME]
|
||||||
|
"###);
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn lock_requires_python_maximum_version() -> Result<()> {
|
||||||
|
let context = TestContext::new("3.11");
|
||||||
|
|
||||||
|
let lockfile = context.temp_dir.join("uv.lock");
|
||||||
|
|
||||||
|
let pyproject_toml = context.temp_dir.child("pyproject.toml");
|
||||||
|
pyproject_toml.write_str(
|
||||||
|
r#"
|
||||||
|
[project]
|
||||||
|
name = "project"
|
||||||
|
version = "0.1.0"
|
||||||
|
requires-python = ">=3.8"
|
||||||
|
dependencies = ["numpy"]
|
||||||
|
|
||||||
|
[build-system]
|
||||||
|
requires = ["setuptools>=42"]
|
||||||
|
build-backend = "setuptools.build_meta"
|
||||||
|
"#,
|
||||||
|
)?;
|
||||||
|
|
||||||
|
uv_snapshot!(context.filters(), context.lock(), @r###"
|
||||||
|
success: true
|
||||||
|
exit_code: 0
|
||||||
|
----- stdout -----
|
||||||
|
|
||||||
|
----- stderr -----
|
||||||
|
Resolved 3 packages in [TIME]
|
||||||
|
"###);
|
||||||
|
|
||||||
|
let lock = fs_err::read_to_string(&lockfile).unwrap();
|
||||||
|
|
||||||
|
insta::with_settings!({
|
||||||
|
filters => context.filters(),
|
||||||
|
}, {
|
||||||
|
assert_snapshot!(
|
||||||
|
lock, @r###"
|
||||||
|
version = 1
|
||||||
|
requires-python = ">=3.8"
|
||||||
|
resolution-markers = [
|
||||||
|
"python_full_version >= '3.9'",
|
||||||
|
"python_full_version < '3.9'",
|
||||||
|
]
|
||||||
|
|
||||||
|
[options]
|
||||||
|
exclude-newer = "2024-03-25T00:00:00Z"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "numpy"
|
||||||
|
version = "1.24.4"
|
||||||
|
source = { registry = "https://pypi.org/simple" }
|
||||||
|
resolution-markers = [
|
||||||
|
"python_full_version < '3.9'",
|
||||||
|
]
|
||||||
|
sdist = { url = "https://files.pythonhosted.org/packages/a4/9b/027bec52c633f6556dba6b722d9a0befb40498b9ceddd29cbe67a45a127c/numpy-1.24.4.tar.gz", hash = "sha256:80f5e3a4e498641401868df4208b74581206afbee7cf7b8329daae82676d9463", size = 10911229 }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/6b/80/6cdfb3e275d95155a34659163b83c09e3a3ff9f1456880bec6cc63d71083/numpy-1.24.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c0bfb52d2169d58c1cdb8cc1f16989101639b34c7d3ce60ed70b19c63eba0b64", size = 19789140 },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/64/5f/3f01d753e2175cfade1013eea08db99ba1ee4bdb147ebcf3623b75d12aa7/numpy-1.24.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ed094d4f0c177b1b8e7aa9cba7d6ceed51c0e569a5318ac0ca9a090680a6a1b1", size = 13854297 },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/5a/b3/2f9c21d799fa07053ffa151faccdceeb69beec5a010576b8991f614021f7/numpy-1.24.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79fc682a374c4a8ed08b331bef9c5f582585d1048fa6d80bc6c35bc384eee9b4", size = 13995611 },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/10/be/ae5bf4737cb79ba437879915791f6f26d92583c738d7d960ad94e5c36adf/numpy-1.24.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ffe43c74893dbf38c2b0a1f5428760a1a9c98285553c89e12d70a96a7f3a4d6", size = 17282357 },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/c0/64/908c1087be6285f40e4b3e79454552a701664a079321cff519d8c7051d06/numpy-1.24.4-cp310-cp310-win32.whl", hash = "sha256:4c21decb6ea94057331e111a5bed9a79d335658c27ce2adb580fb4d54f2ad9bc", size = 12429222 },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/22/55/3d5a7c1142e0d9329ad27cece17933b0e2ab4e54ddc5c1861fbfeb3f7693/numpy-1.24.4-cp310-cp310-win_amd64.whl", hash = "sha256:b4bea75e47d9586d31e892a7401f76e909712a0fd510f58f5337bea9572c571e", size = 14841514 },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/a9/cc/5ed2280a27e5dab12994c884f1f4d8c3bd4d885d02ae9e52a9d213a6a5e2/numpy-1.24.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f136bab9c2cfd8da131132c2cf6cc27331dd6fae65f95f69dcd4ae3c3639c810", size = 19775508 },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/c0/bc/77635c657a3668cf652806210b8662e1aff84b818a55ba88257abf6637a8/numpy-1.24.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e2926dac25b313635e4d6cf4dc4e51c8c0ebfed60b801c799ffc4c32bf3d1254", size = 13840033 },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/a7/4c/96cdaa34f54c05e97c1c50f39f98d608f96f0677a6589e64e53104e22904/numpy-1.24.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:222e40d0e2548690405b0b3c7b21d1169117391c2e82c378467ef9ab4c8f0da7", size = 13991951 },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/22/97/dfb1a31bb46686f09e68ea6ac5c63fdee0d22d7b23b8f3f7ea07712869ef/numpy-1.24.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7215847ce88a85ce39baf9e89070cb860c98fdddacbaa6c0da3ffb31b3350bd5", size = 17278923 },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/35/e2/76a11e54139654a324d107da1d98f99e7aa2a7ef97cfd7c631fba7dbde71/numpy-1.24.4-cp311-cp311-win32.whl", hash = "sha256:4979217d7de511a8d57f4b4b5b2b965f707768440c17cb70fbf254c4b225238d", size = 12422446 },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/d8/ec/ebef2f7d7c28503f958f0f8b992e7ce606fb74f9e891199329d5f5f87404/numpy-1.24.4-cp311-cp311-win_amd64.whl", hash = "sha256:b7b1fc9864d7d39e28f41d089bfd6353cb5f27ecd9905348c24187a768c79694", size = 14834466 },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/11/10/943cfb579f1a02909ff96464c69893b1d25be3731b5d3652c2e0cf1281ea/numpy-1.24.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1452241c290f3e2a312c137a9999cdbf63f78864d63c79039bda65ee86943f61", size = 19780722 },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/a7/ae/f53b7b265fdc701e663fbb322a8e9d4b14d9cb7b2385f45ddfabfc4327e4/numpy-1.24.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:04640dab83f7c6c85abf9cd729c5b65f1ebd0ccf9de90b270cd61935eef0197f", size = 13843102 },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/25/6f/2586a50ad72e8dbb1d8381f837008a0321a3516dfd7cb57fc8cf7e4bb06b/numpy-1.24.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5425b114831d1e77e4b5d812b69d11d962e104095a5b9c3b641a218abcc050e", size = 14039616 },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/98/5d/5738903efe0ecb73e51eb44feafba32bdba2081263d40c5043568ff60faf/numpy-1.24.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd80e219fd4c71fc3699fc1dadac5dcf4fd882bfc6f7ec53d30fa197b8ee22dc", size = 17316263 },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/d1/57/8d328f0b91c733aa9aa7ee540dbc49b58796c862b4fbcb1146c701e888da/numpy-1.24.4-cp38-cp38-win32.whl", hash = "sha256:4602244f345453db537be5314d3983dbf5834a9701b7723ec28923e2889e0bb2", size = 12455660 },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/69/65/0d47953afa0ad569d12de5f65d964321c208492064c38fe3b0b9744f8d44/numpy-1.24.4-cp38-cp38-win_amd64.whl", hash = "sha256:692f2e0f55794943c5bfff12b3f56f99af76f902fc47487bdfe97856de51a706", size = 14868112 },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/9a/cd/d5b0402b801c8a8b56b04c1e85c6165efab298d2f0ab741c2406516ede3a/numpy-1.24.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2541312fbf09977f3b3ad449c4e5f4bb55d0dbf79226d7724211acc905049400", size = 19816549 },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/14/27/638aaa446f39113a3ed38b37a66243e21b38110d021bfcb940c383e120f2/numpy-1.24.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9667575fb6d13c95f1b36aca12c5ee3356bf001b714fc354eb5465ce1609e62f", size = 13879950 },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/8f/27/91894916e50627476cff1a4e4363ab6179d01077d71b9afed41d9e1f18bf/numpy-1.24.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f3a86ed21e4f87050382c7bc96571755193c4c1392490744ac73d660e8f564a9", size = 14030228 },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/7a/7c/d7b2a0417af6428440c0ad7cb9799073e507b1a465f827d058b826236964/numpy-1.24.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d11efb4dbecbdf22508d55e48d9c8384db795e1b7b51ea735289ff96613ff74d", size = 17311170 },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/18/9d/e02ace5d7dfccee796c37b995c63322674daf88ae2f4a4724c5dd0afcc91/numpy-1.24.4-cp39-cp39-win32.whl", hash = "sha256:6620c0acd41dbcb368610bb2f4d83145674040025e5536954782467100aa8835", size = 12454918 },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/63/38/6cc19d6b8bfa1d1a459daf2b3fe325453153ca7019976274b6f33d8b5663/numpy-1.24.4-cp39-cp39-win_amd64.whl", hash = "sha256:befe2bf740fd8373cf56149a5c23a0f601e82869598d41f8e188a0e9869926f8", size = 14867441 },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/a4/fd/8dff40e25e937c94257455c237b9b6bf5a30d42dd1cc11555533be099492/numpy-1.24.4-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:31f13e25b4e304632a4619d0e0777662c2ffea99fcae2029556b17d8ff958aef", size = 19156590 },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/42/e7/4bf953c6e05df90c6d351af69966384fed8e988d0e8c54dad7103b59f3ba/numpy-1.24.4-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95f7ac6540e95bc440ad77f56e520da5bf877f87dca58bd095288dce8940532a", size = 16705744 },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/fc/dd/9106005eb477d022b60b3817ed5937a43dad8fd1f20b0610ea8a32fcb407/numpy-1.24.4-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:e98f220aa76ca2a977fe435f5b04d7b3470c0a2e6312907b37ba6068f26787f2", size = 14734290 },
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "numpy"
|
||||||
|
version = "1.26.4"
|
||||||
|
source = { registry = "https://pypi.org/simple" }
|
||||||
|
resolution-markers = [
|
||||||
|
"python_full_version >= '3.9'",
|
||||||
|
]
|
||||||
|
sdist = { url = "https://files.pythonhosted.org/packages/65/6e/09db70a523a96d25e115e71cc56a6f9031e7b8cd166c1ac8438307c14058/numpy-1.26.4.tar.gz", hash = "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010", size = 15786129 }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/a7/94/ace0fdea5241a27d13543ee117cbc65868e82213fb31a8eb7fe9ff23f313/numpy-1.26.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9ff0f4f29c51e2803569d7a51c2304de5554655a60c5d776e35b4a41413830d0", size = 20631468 },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/20/f7/b24208eba89f9d1b58c1668bc6c8c4fd472b20c45573cb767f59d49fb0f6/numpy-1.26.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2e4ee3380d6de9c9ec04745830fd9e2eccb3e6cf790d39d7b98ffd19b0dd754a", size = 13966411 },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/fc/a5/4beee6488160798683eed5bdb7eead455892c3b4e1f78d79d8d3f3b084ac/numpy-1.26.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d209d8969599b27ad20994c8e41936ee0964e6da07478d6c35016bc386b66ad4", size = 14219016 },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/4b/d7/ecf66c1cd12dc28b4040b15ab4d17b773b87fa9d29ca16125de01adb36cd/numpy-1.26.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ffa75af20b44f8dba823498024771d5ac50620e6915abac414251bd971b4529f", size = 18240889 },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/24/03/6f229fe3187546435c4f6f89f6d26c129d4f5bed40552899fcf1f0bf9e50/numpy-1.26.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:62b8e4b1e28009ef2846b4c7852046736bab361f7aeadeb6a5b89ebec3c7055a", size = 13876746 },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/39/fe/39ada9b094f01f5a35486577c848fe274e374bbf8d8f472e1423a0bbd26d/numpy-1.26.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a4abb4f9001ad2858e7ac189089c42178fcce737e4169dc61321660f1a96c7d2", size = 18078620 },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/d5/ef/6ad11d51197aad206a9ad2286dc1aac6a378059e06e8cf22cd08ed4f20dc/numpy-1.26.4-cp310-cp310-win32.whl", hash = "sha256:bfe25acf8b437eb2a8b2d49d443800a5f18508cd811fea3181723922a8a82b07", size = 5972659 },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/19/77/538f202862b9183f54108557bfda67e17603fc560c384559e769321c9d92/numpy-1.26.4-cp310-cp310-win_amd64.whl", hash = "sha256:b97fe8060236edf3662adfc2c633f56a08ae30560c56310562cb4f95500022d5", size = 15808905 },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/11/57/baae43d14fe163fa0e4c47f307b6b2511ab8d7d30177c491960504252053/numpy-1.26.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c66707fabe114439db9068ee468c26bbdf909cac0fb58686a42a24de1760c71", size = 20630554 },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/1a/2e/151484f49fd03944c4a3ad9c418ed193cfd02724e138ac8a9505d056c582/numpy-1.26.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:edd8b5fe47dab091176d21bb6de568acdd906d1887a4584a15a9a96a1dca06ef", size = 13997127 },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/79/ae/7e5b85136806f9dadf4878bf73cf223fe5c2636818ba3ab1c585d0403164/numpy-1.26.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ab55401287bfec946ced39700c053796e7cc0e3acbef09993a9ad2adba6ca6e", size = 14222994 },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/3a/d0/edc009c27b406c4f9cbc79274d6e46d634d139075492ad055e3d68445925/numpy-1.26.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:666dbfb6ec68962c033a450943ded891bed2d54e6755e35e5835d63f4f6931d5", size = 18252005 },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/09/bf/2b1aaf8f525f2923ff6cfcf134ae5e750e279ac65ebf386c75a0cf6da06a/numpy-1.26.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:96ff0b2ad353d8f990b63294c8986f1ec3cb19d749234014f4e7eb0112ceba5a", size = 13885297 },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/df/a0/4e0f14d847cfc2a633a1c8621d00724f3206cfeddeb66d35698c4e2cf3d2/numpy-1.26.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:60dedbb91afcbfdc9bc0b1f3f402804070deed7392c23eb7a7f07fa857868e8a", size = 18093567 },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/d2/b7/a734c733286e10a7f1a8ad1ae8c90f2d33bf604a96548e0a4a3a6739b468/numpy-1.26.4-cp311-cp311-win32.whl", hash = "sha256:1af303d6b2210eb850fcf03064d364652b7120803a0b872f5211f5234b399f20", size = 5968812 },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/3f/6b/5610004206cf7f8e7ad91c5a85a8c71b2f2f8051a0c0c4d5916b76d6cbb2/numpy-1.26.4-cp311-cp311-win_amd64.whl", hash = "sha256:cd25bcecc4974d09257ffcd1f098ee778f7834c3ad767fe5db785be9a4aa9cb2", size = 15811913 },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/95/12/8f2020a8e8b8383ac0177dc9570aad031a3beb12e38847f7129bacd96228/numpy-1.26.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b3ce300f3644fb06443ee2222c2201dd3a89ea6040541412b8fa189341847218", size = 20335901 },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/75/5b/ca6c8bd14007e5ca171c7c03102d17b4f4e0ceb53957e8c44343a9546dcc/numpy-1.26.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:03a8c78d01d9781b28a6989f6fa1bb2c4f2d51201cf99d3dd875df6fbd96b23b", size = 13685868 },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/79/f8/97f10e6755e2a7d027ca783f63044d5b1bc1ae7acb12afe6a9b4286eac17/numpy-1.26.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9fad7dcb1aac3c7f0584a5a8133e3a43eeb2fe127f47e3632d43d677c66c102b", size = 13925109 },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/0f/50/de23fde84e45f5c4fda2488c759b69990fd4512387a8632860f3ac9cd225/numpy-1.26.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:675d61ffbfa78604709862923189bad94014bef562cc35cf61d3a07bba02a7ed", size = 17950613 },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/4c/0c/9c603826b6465e82591e05ca230dfc13376da512b25ccd0894709b054ed0/numpy-1.26.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ab47dbe5cc8210f55aa58e4805fe224dac469cde56b9f731a4c098b91917159a", size = 13572172 },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/76/8c/2ba3902e1a0fc1c74962ea9bb33a534bb05984ad7ff9515bf8d07527cadd/numpy-1.26.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:1dda2e7b4ec9dd512f84935c5f126c8bd8b9f2fc001e9f54af255e8c5f16b0e0", size = 17786643 },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/28/4a/46d9e65106879492374999e76eb85f87b15328e06bd1550668f79f7b18c6/numpy-1.26.4-cp312-cp312-win32.whl", hash = "sha256:50193e430acfc1346175fcbdaa28ffec49947a06918b7b92130744e81e640110", size = 5677803 },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/16/2e/86f24451c2d530c88daf997cb8d6ac622c1d40d19f5a031ed68a4b73a374/numpy-1.26.4-cp312-cp312-win_amd64.whl", hash = "sha256:08beddf13648eb95f8d867350f6a018a4be2e5ad54c8d8caed89ebca558b2818", size = 15517754 },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/7d/24/ce71dc08f06534269f66e73c04f5709ee024a1afe92a7b6e1d73f158e1f8/numpy-1.26.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7349ab0fa0c429c82442a27a9673fc802ffdb7c7775fad780226cb234965e53c", size = 20636301 },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/ae/8c/ab03a7c25741f9ebc92684a20125fbc9fc1b8e1e700beb9197d750fdff88/numpy-1.26.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:52b8b60467cd7dd1e9ed082188b4e6bb35aa5cdd01777621a1658910745b90be", size = 13971216 },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/6d/64/c3bcdf822269421d85fe0d64ba972003f9bb4aa9a419da64b86856c9961f/numpy-1.26.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d5241e0a80d808d70546c697135da2c613f30e28251ff8307eb72ba696945764", size = 14226281 },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/54/30/c2a907b9443cf42b90c17ad10c1e8fa801975f01cb9764f3f8eb8aea638b/numpy-1.26.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f870204a840a60da0b12273ef34f7051e98c3b5961b61b0c2c1be6dfd64fbcd3", size = 18249516 },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/43/12/01a563fc44c07095996d0129b8899daf89e4742146f7044cdbdb3101c57f/numpy-1.26.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:679b0076f67ecc0138fd2ede3a8fd196dddc2ad3254069bcb9faf9a79b1cebcd", size = 13882132 },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/16/ee/9df80b06680aaa23fc6c31211387e0db349e0e36d6a63ba3bd78c5acdf11/numpy-1.26.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:47711010ad8555514b434df65f7d7b076bb8261df1ca9bb78f53d3b2db02e95c", size = 18084181 },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/28/7d/4b92e2fe20b214ffca36107f1a3e75ef4c488430e64de2d9af5db3a4637d/numpy-1.26.4-cp39-cp39-win32.whl", hash = "sha256:a354325ee03388678242a4d7ebcd08b5c727033fcff3b2f536aea978e15ee9e6", size = 5976360 },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/b5/42/054082bd8220bbf6f297f982f0a8f5479fcbc55c8b511d928df07b965869/numpy-1.26.4-cp39-cp39-win_amd64.whl", hash = "sha256:3373d5d70a5fe74a2c1bb6d2cfd9609ecf686d47a2d7b1d37a8f3b6bf6003aea", size = 15814633 },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/3f/72/3df6c1c06fc83d9cfe381cccb4be2532bbd38bf93fbc9fad087b6687f1c0/numpy-1.26.4-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:afedb719a9dcfc7eaf2287b839d8198e06dcd4cb5d276a3df279231138e83d30", size = 20455961 },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/8e/02/570545bac308b58ffb21adda0f4e220ba716fb658a63c151daecc3293350/numpy-1.26.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95a7476c59002f2f6c590b9b7b998306fba6a5aa646b1e22ddfeaf8f78c3a29c", size = 18061071 },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/f4/5f/fafd8c51235f60d49f7a88e2275e13971e90555b67da52dd6416caec32fe/numpy-1.26.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7e50d0a0cc3189f9cb0aeb3a6a6af18c16f59f004b866cd2be1c14b36134a4a0", size = 15709730 },
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "project"
|
||||||
|
version = "0.1.0"
|
||||||
|
source = { editable = "." }
|
||||||
|
dependencies = [
|
||||||
|
{ name = "numpy", version = "1.24.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" },
|
||||||
|
{ name = "numpy", version = "1.26.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" },
|
||||||
|
]
|
||||||
|
|
||||||
|
[package.metadata]
|
||||||
|
requires-dist = [{ name = "numpy" }]
|
||||||
|
"###
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
// Re-run with `--locked`.
|
||||||
|
uv_snapshot!(context.filters(), context.lock().arg("--locked"), @r###"
|
||||||
|
success: true
|
||||||
|
exit_code: 0
|
||||||
|
----- stdout -----
|
||||||
|
|
||||||
|
----- stderr -----
|
||||||
|
Resolved 3 packages in [TIME]
|
||||||
"###);
|
"###);
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
|
|
@ -15322,7 +15736,6 @@ fn lock_python_upper_bound() -> Result<()> {
|
||||||
version = "1.24.4"
|
version = "1.24.4"
|
||||||
source = { registry = "https://pypi.org/simple" }
|
source = { registry = "https://pypi.org/simple" }
|
||||||
resolution-markers = [
|
resolution-markers = [
|
||||||
"python_full_version >= '3.13'",
|
|
||||||
"python_full_version < '3.9'",
|
"python_full_version < '3.9'",
|
||||||
]
|
]
|
||||||
sdist = { url = "https://files.pythonhosted.org/packages/a4/9b/027bec52c633f6556dba6b722d9a0befb40498b9ceddd29cbe67a45a127c/numpy-1.24.4.tar.gz", hash = "sha256:80f5e3a4e498641401868df4208b74581206afbee7cf7b8329daae82676d9463", size = 10911229 }
|
sdist = { url = "https://files.pythonhosted.org/packages/a4/9b/027bec52c633f6556dba6b722d9a0befb40498b9ceddd29cbe67a45a127c/numpy-1.24.4.tar.gz", hash = "sha256:80f5e3a4e498641401868df4208b74581206afbee7cf7b8329daae82676d9463", size = 10911229 }
|
||||||
|
|
@ -15409,8 +15822,8 @@ fn lock_python_upper_bound() -> Result<()> {
|
||||||
dependencies = [
|
dependencies = [
|
||||||
{ name = "coloredlogs" },
|
{ name = "coloredlogs" },
|
||||||
{ name = "flatbuffers" },
|
{ name = "flatbuffers" },
|
||||||
{ name = "numpy", version = "1.24.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9' or python_full_version >= '3.13'" },
|
{ name = "numpy", version = "1.24.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" },
|
||||||
{ name = "numpy", version = "1.26.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9' and python_full_version < '3.13'" },
|
{ name = "numpy", version = "1.26.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" },
|
||||||
{ name = "packaging" },
|
{ name = "packaging" },
|
||||||
{ name = "protobuf" },
|
{ name = "protobuf" },
|
||||||
{ name = "sympy" },
|
{ name = "sympy" },
|
||||||
|
|
|
||||||
|
|
@ -8640,7 +8640,9 @@ fn universal_no_repeated_unconditional_distributions_1() -> Result<()> {
|
||||||
----- stdout -----
|
----- stdout -----
|
||||||
# This file was autogenerated by uv via the following command:
|
# This file was autogenerated by uv via the following command:
|
||||||
# uv pip compile --cache-dir [CACHE_DIR] requirements.in -p 3.8 --universal
|
# uv pip compile --cache-dir [CACHE_DIR] requirements.in -p 3.8 --universal
|
||||||
alabaster==0.7.13
|
alabaster==0.7.13 ; python_full_version < '3.9'
|
||||||
|
# via sphinx
|
||||||
|
alabaster==0.7.16 ; python_full_version >= '3.9'
|
||||||
# via sphinx
|
# via sphinx
|
||||||
astroid==3.1.0
|
astroid==3.1.0
|
||||||
# via pylint
|
# via pylint
|
||||||
|
|
@ -8686,19 +8688,31 @@ fn universal_no_repeated_unconditional_distributions_1() -> Result<()> {
|
||||||
# via sphinx
|
# via sphinx
|
||||||
snowballstemmer==2.2.0
|
snowballstemmer==2.2.0
|
||||||
# via sphinx
|
# via sphinx
|
||||||
sphinx==7.1.2
|
sphinx==7.1.2 ; python_full_version < '3.9'
|
||||||
# via -r requirements.in
|
# via -r requirements.in
|
||||||
sphinxcontrib-applehelp==1.0.4
|
sphinx==7.2.6 ; python_full_version >= '3.9'
|
||||||
|
# via -r requirements.in
|
||||||
|
sphinxcontrib-applehelp==1.0.4 ; python_full_version < '3.9'
|
||||||
# via sphinx
|
# via sphinx
|
||||||
sphinxcontrib-devhelp==1.0.2
|
sphinxcontrib-applehelp==1.0.8 ; python_full_version >= '3.9'
|
||||||
# via sphinx
|
# via sphinx
|
||||||
sphinxcontrib-htmlhelp==2.0.1
|
sphinxcontrib-devhelp==1.0.2 ; python_full_version < '3.9'
|
||||||
|
# via sphinx
|
||||||
|
sphinxcontrib-devhelp==1.0.6 ; python_full_version >= '3.9'
|
||||||
|
# via sphinx
|
||||||
|
sphinxcontrib-htmlhelp==2.0.1 ; python_full_version < '3.9'
|
||||||
|
# via sphinx
|
||||||
|
sphinxcontrib-htmlhelp==2.0.5 ; python_full_version >= '3.9'
|
||||||
# via sphinx
|
# via sphinx
|
||||||
sphinxcontrib-jsmath==1.0.1
|
sphinxcontrib-jsmath==1.0.1
|
||||||
# via sphinx
|
# via sphinx
|
||||||
sphinxcontrib-qthelp==1.0.3
|
sphinxcontrib-qthelp==1.0.3 ; python_full_version < '3.9'
|
||||||
# via sphinx
|
# via sphinx
|
||||||
sphinxcontrib-serializinghtml==1.1.5
|
sphinxcontrib-qthelp==1.0.7 ; python_full_version >= '3.9'
|
||||||
|
# via sphinx
|
||||||
|
sphinxcontrib-serializinghtml==1.1.5 ; python_full_version < '3.9'
|
||||||
|
# via sphinx
|
||||||
|
sphinxcontrib-serializinghtml==1.1.10 ; python_full_version >= '3.9'
|
||||||
# via sphinx
|
# via sphinx
|
||||||
tomli==2.0.1 ; python_full_version < '3.11'
|
tomli==2.0.1 ; python_full_version < '3.11'
|
||||||
# via pylint
|
# via pylint
|
||||||
|
|
@ -8715,7 +8729,7 @@ fn universal_no_repeated_unconditional_distributions_1() -> Result<()> {
|
||||||
|
|
||||||
----- stderr -----
|
----- stderr -----
|
||||||
warning: The requested Python version 3.8 is not available; 3.12.[X] will be used to build dependencies instead.
|
warning: The requested Python version 3.8 is not available; 3.12.[X] will be used to build dependencies instead.
|
||||||
Resolved 34 packages in [TIME]
|
Resolved 41 packages in [TIME]
|
||||||
"###
|
"###
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
@ -8921,7 +8935,9 @@ fn universal_marker_propagation() -> Result<()> {
|
||||||
# via sympy
|
# via sympy
|
||||||
networkx==3.2.1
|
networkx==3.2.1
|
||||||
# via torch
|
# via torch
|
||||||
numpy==1.26.3
|
numpy==1.26.3 ; python_full_version < '3.9'
|
||||||
|
# via torchvision
|
||||||
|
numpy==1.26.4 ; python_full_version >= '3.9'
|
||||||
# via torchvision
|
# via torchvision
|
||||||
pillow==10.2.0
|
pillow==10.2.0
|
||||||
# via torchvision
|
# via torchvision
|
||||||
|
|
@ -8953,7 +8969,7 @@ fn universal_marker_propagation() -> Result<()> {
|
||||||
|
|
||||||
----- stderr -----
|
----- stderr -----
|
||||||
warning: The requested Python version 3.8 is not available; 3.12.[X] will be used to build dependencies instead.
|
warning: The requested Python version 3.8 is not available; 3.12.[X] will be used to build dependencies instead.
|
||||||
Resolved 23 packages in [TIME]
|
Resolved 24 packages in [TIME]
|
||||||
"###
|
"###
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
@ -13319,7 +13335,9 @@ matplotlib
|
||||||
----- stdout -----
|
----- stdout -----
|
||||||
# This file was autogenerated by uv via the following command:
|
# This file was autogenerated by uv via the following command:
|
||||||
# uv pip compile --cache-dir [CACHE_DIR] requirements.in --universal -p 3.8
|
# uv pip compile --cache-dir [CACHE_DIR] requirements.in --universal -p 3.8
|
||||||
contourpy==1.1.1
|
contourpy==1.1.1 ; python_full_version < '3.9'
|
||||||
|
# via matplotlib
|
||||||
|
contourpy==1.2.0 ; python_full_version >= '3.9'
|
||||||
# via matplotlib
|
# via matplotlib
|
||||||
coverage==7.4.4
|
coverage==7.4.4
|
||||||
# via -r requirements.in
|
# via -r requirements.in
|
||||||
|
|
@ -13331,21 +13349,25 @@ matplotlib
|
||||||
# via matplotlib
|
# via matplotlib
|
||||||
kiwisolver==1.4.5
|
kiwisolver==1.4.5
|
||||||
# via matplotlib
|
# via matplotlib
|
||||||
matplotlib==3.7.5
|
matplotlib==3.7.5 ; python_full_version < '3.9'
|
||||||
# via -r requirements.in
|
# via -r requirements.in
|
||||||
numpy==1.24.4 ; python_full_version < '3.12'
|
matplotlib==3.8.3 ; python_full_version >= '3.9'
|
||||||
|
# via -r requirements.in
|
||||||
|
numpy==1.24.4 ; python_full_version < '3.9'
|
||||||
# via
|
# via
|
||||||
# contourpy
|
# contourpy
|
||||||
# matplotlib
|
# matplotlib
|
||||||
# pandas
|
# pandas
|
||||||
numpy==1.26.4 ; python_full_version >= '3.12'
|
numpy==1.26.4 ; python_full_version >= '3.9'
|
||||||
# via
|
# via
|
||||||
# contourpy
|
# contourpy
|
||||||
# matplotlib
|
# matplotlib
|
||||||
# pandas
|
# pandas
|
||||||
packaging==24.0
|
packaging==24.0
|
||||||
# via matplotlib
|
# via matplotlib
|
||||||
pandas==2.0.3
|
pandas==2.0.3 ; python_full_version < '3.9'
|
||||||
|
# via -r requirements.in
|
||||||
|
pandas==2.2.1 ; python_full_version >= '3.9'
|
||||||
# via -r requirements.in
|
# via -r requirements.in
|
||||||
pillow==10.2.0
|
pillow==10.2.0
|
||||||
# via matplotlib
|
# via matplotlib
|
||||||
|
|
@ -13365,7 +13387,7 @@ matplotlib
|
||||||
# via importlib-resources
|
# via importlib-resources
|
||||||
|
|
||||||
----- stderr -----
|
----- stderr -----
|
||||||
Resolved [NUM] packages in [TIME]
|
Resolved 22 packages in [TIME]
|
||||||
"###);
|
"###);
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
|
|
|
||||||
|
|
@ -5,8 +5,12 @@ expression: lock
|
||||||
version = 1
|
version = 1
|
||||||
requires-python = ">=3.8"
|
requires-python = ">=3.8"
|
||||||
resolution-markers = [
|
resolution-markers = [
|
||||||
"implementation_name == 'pypy' and sys_platform == 'win32'",
|
"python_full_version >= '3.10' and implementation_name == 'pypy' and sys_platform == 'win32'",
|
||||||
"implementation_name != 'pypy' or sys_platform != 'win32'",
|
"python_full_version == '3.9.*' and implementation_name == 'pypy' and sys_platform == 'win32'",
|
||||||
|
"python_full_version < '3.9' and implementation_name == 'pypy' and sys_platform == 'win32'",
|
||||||
|
"(python_full_version >= '3.10' and implementation_name != 'pypy') or (python_full_version >= '3.10' and sys_platform != 'win32')",
|
||||||
|
"(python_full_version == '3.9.*' and implementation_name != 'pypy') or (python_full_version == '3.9.*' and sys_platform != 'win32')",
|
||||||
|
"(python_full_version < '3.9' and implementation_name != 'pypy') or (python_full_version < '3.9' and sys_platform != 'win32')",
|
||||||
]
|
]
|
||||||
|
|
||||||
[options]
|
[options]
|
||||||
|
|
@ -195,7 +199,9 @@ d = [
|
||||||
{ name = "aiohttp" },
|
{ name = "aiohttp" },
|
||||||
]
|
]
|
||||||
jupyter = [
|
jupyter = [
|
||||||
{ name = "ipython" },
|
{ name = "ipython", version = "8.12.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" },
|
||||||
|
{ name = "ipython", version = "8.18.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" },
|
||||||
|
{ name = "ipython", version = "8.26.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" },
|
||||||
{ name = "tokenize-rt" },
|
{ name = "tokenize-rt" },
|
||||||
]
|
]
|
||||||
uvloop = [
|
uvloop = [
|
||||||
|
|
@ -249,6 +255,15 @@ wheels = [
|
||||||
{ url = "https://files.pythonhosted.org/packages/d5/50/83c593b07763e1161326b3b8c6686f0f4b0f24d5526546bee538c89837d6/decorator-5.1.1-py3-none-any.whl", hash = "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186", size = 9073 },
|
{ url = "https://files.pythonhosted.org/packages/d5/50/83c593b07763e1161326b3b8c6686f0f4b0f24d5526546bee538c89837d6/decorator-5.1.1-py3-none-any.whl", hash = "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186", size = 9073 },
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "exceptiongroup"
|
||||||
|
version = "1.2.2"
|
||||||
|
source = { registry = "https://pypi.org/simple" }
|
||||||
|
sdist = { url = "https://files.pythonhosted.org/packages/09/35/2495c4ac46b980e4ca1f6ad6db102322ef3ad2410b79fdde159a4b0f3b92/exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc", size = 28883 }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/02/cc/b7e31358aac6ed1ef2bb790a9746ac2c69bcb3c8588b41616914eb106eaf/exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b", size = 16453 },
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "executing"
|
name = "executing"
|
||||||
version = "2.0.1"
|
version = "2.0.1"
|
||||||
|
|
@ -355,26 +370,82 @@ wheels = [
|
||||||
name = "ipython"
|
name = "ipython"
|
||||||
version = "8.12.3"
|
version = "8.12.3"
|
||||||
source = { registry = "https://pypi.org/simple" }
|
source = { registry = "https://pypi.org/simple" }
|
||||||
|
resolution-markers = [
|
||||||
|
"python_full_version < '3.9' and implementation_name == 'pypy' and sys_platform == 'win32'",
|
||||||
|
"(python_full_version < '3.9' and implementation_name != 'pypy') or (python_full_version < '3.9' and sys_platform != 'win32')",
|
||||||
|
]
|
||||||
dependencies = [
|
dependencies = [
|
||||||
{ name = "appnope", marker = "sys_platform == 'darwin'" },
|
{ name = "appnope", marker = "python_full_version < '3.9' and sys_platform == 'darwin'" },
|
||||||
{ name = "backcall" },
|
{ name = "backcall", marker = "python_full_version < '3.9'" },
|
||||||
{ name = "colorama", marker = "sys_platform == 'win32'" },
|
{ name = "colorama", marker = "python_full_version < '3.9' and sys_platform == 'win32'" },
|
||||||
{ name = "decorator" },
|
{ name = "decorator", marker = "python_full_version < '3.9'" },
|
||||||
{ name = "jedi" },
|
{ name = "jedi", marker = "python_full_version < '3.9'" },
|
||||||
{ name = "matplotlib-inline" },
|
{ name = "matplotlib-inline", marker = "python_full_version < '3.9'" },
|
||||||
{ name = "pexpect", marker = "sys_platform != 'win32'" },
|
{ name = "pexpect", marker = "python_full_version < '3.9' and sys_platform != 'win32'" },
|
||||||
{ name = "pickleshare" },
|
{ name = "pickleshare", marker = "python_full_version < '3.9'" },
|
||||||
{ name = "prompt-toolkit" },
|
{ name = "prompt-toolkit", marker = "python_full_version < '3.9'" },
|
||||||
{ name = "pygments" },
|
{ name = "pygments", marker = "python_full_version < '3.9'" },
|
||||||
{ name = "stack-data" },
|
{ name = "stack-data", marker = "python_full_version < '3.9'" },
|
||||||
{ name = "traitlets" },
|
{ name = "traitlets", marker = "python_full_version < '3.9'" },
|
||||||
{ name = "typing-extensions", marker = "python_full_version < '3.10'" },
|
{ name = "typing-extensions", marker = "python_full_version < '3.9'" },
|
||||||
]
|
]
|
||||||
sdist = { url = "https://files.pythonhosted.org/packages/9e/6a/44ef299b1762f5a73841e87fae8a73a8cc8aee538d6dc8c77a5afe1fd2ce/ipython-8.12.3.tar.gz", hash = "sha256:3910c4b54543c2ad73d06579aa771041b7d5707b033bd488669b4cf544e3b363", size = 5470171 }
|
sdist = { url = "https://files.pythonhosted.org/packages/9e/6a/44ef299b1762f5a73841e87fae8a73a8cc8aee538d6dc8c77a5afe1fd2ce/ipython-8.12.3.tar.gz", hash = "sha256:3910c4b54543c2ad73d06579aa771041b7d5707b033bd488669b4cf544e3b363", size = 5470171 }
|
||||||
wheels = [
|
wheels = [
|
||||||
{ url = "https://files.pythonhosted.org/packages/8d/97/8fe103906cd81bc42d3b0175b5534a9f67dccae47d6451131cf8d0d70bb2/ipython-8.12.3-py3-none-any.whl", hash = "sha256:b0340d46a933d27c657b211a329d0be23793c36595acf9e6ef4164bc01a1804c", size = 798307 },
|
{ url = "https://files.pythonhosted.org/packages/8d/97/8fe103906cd81bc42d3b0175b5534a9f67dccae47d6451131cf8d0d70bb2/ipython-8.12.3-py3-none-any.whl", hash = "sha256:b0340d46a933d27c657b211a329d0be23793c36595acf9e6ef4164bc01a1804c", size = 798307 },
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "ipython"
|
||||||
|
version = "8.18.1"
|
||||||
|
source = { registry = "https://pypi.org/simple" }
|
||||||
|
resolution-markers = [
|
||||||
|
"python_full_version == '3.9.*' and implementation_name == 'pypy' and sys_platform == 'win32'",
|
||||||
|
"(python_full_version == '3.9.*' and implementation_name != 'pypy') or (python_full_version == '3.9.*' and sys_platform != 'win32')",
|
||||||
|
]
|
||||||
|
dependencies = [
|
||||||
|
{ name = "colorama", marker = "python_full_version == '3.9.*' and sys_platform == 'win32'" },
|
||||||
|
{ name = "decorator", marker = "python_full_version == '3.9.*'" },
|
||||||
|
{ name = "exceptiongroup", marker = "python_full_version == '3.9.*'" },
|
||||||
|
{ name = "jedi", marker = "python_full_version == '3.9.*'" },
|
||||||
|
{ name = "matplotlib-inline", marker = "python_full_version == '3.9.*'" },
|
||||||
|
{ name = "pexpect", marker = "python_full_version == '3.9.*' and sys_platform != 'win32'" },
|
||||||
|
{ name = "prompt-toolkit", marker = "python_full_version == '3.9.*'" },
|
||||||
|
{ name = "pygments", marker = "python_full_version == '3.9.*'" },
|
||||||
|
{ name = "stack-data", marker = "python_full_version == '3.9.*'" },
|
||||||
|
{ name = "traitlets", marker = "python_full_version == '3.9.*'" },
|
||||||
|
{ name = "typing-extensions", marker = "python_full_version == '3.9.*'" },
|
||||||
|
]
|
||||||
|
sdist = { url = "https://files.pythonhosted.org/packages/b1/b9/3ba6c45a6df813c09a48bac313c22ff83efa26cbb55011218d925a46e2ad/ipython-8.18.1.tar.gz", hash = "sha256:ca6f079bb33457c66e233e4580ebfc4128855b4cf6370dddd73842a9563e8a27", size = 5486330 }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/47/6b/d9fdcdef2eb6a23f391251fde8781c38d42acd82abe84d054cb74f7863b0/ipython-8.18.1-py3-none-any.whl", hash = "sha256:e8267419d72d81955ec1177f8a29aaa90ac80ad647499201119e2f05e99aa397", size = 808161 },
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "ipython"
|
||||||
|
version = "8.26.0"
|
||||||
|
source = { registry = "https://pypi.org/simple" }
|
||||||
|
resolution-markers = [
|
||||||
|
"python_full_version >= '3.10' and implementation_name == 'pypy' and sys_platform == 'win32'",
|
||||||
|
"(python_full_version >= '3.10' and implementation_name != 'pypy') or (python_full_version >= '3.10' and sys_platform != 'win32')",
|
||||||
|
]
|
||||||
|
dependencies = [
|
||||||
|
{ name = "colorama", marker = "python_full_version >= '3.10' and sys_platform == 'win32'" },
|
||||||
|
{ name = "decorator", marker = "python_full_version >= '3.10'" },
|
||||||
|
{ name = "exceptiongroup", marker = "python_full_version == '3.10.*'" },
|
||||||
|
{ name = "jedi", marker = "python_full_version >= '3.10'" },
|
||||||
|
{ name = "matplotlib-inline", marker = "python_full_version >= '3.10'" },
|
||||||
|
{ name = "pexpect", marker = "python_full_version >= '3.10' and sys_platform != 'emscripten' and sys_platform != 'win32'" },
|
||||||
|
{ name = "prompt-toolkit", marker = "python_full_version >= '3.10'" },
|
||||||
|
{ name = "pygments", marker = "python_full_version >= '3.10'" },
|
||||||
|
{ name = "stack-data", marker = "python_full_version >= '3.10'" },
|
||||||
|
{ name = "traitlets", marker = "python_full_version >= '3.10'" },
|
||||||
|
{ name = "typing-extensions", marker = "python_full_version >= '3.10' and python_full_version < '3.12'" },
|
||||||
|
]
|
||||||
|
sdist = { url = "https://files.pythonhosted.org/packages/7e/f4/dc45805e5c3e327a626139c023b296bafa4537e602a61055d377704ca54c/ipython-8.26.0.tar.gz", hash = "sha256:1cec0fbba8404af13facebe83d04436a7434c7400e59f47acf467c64abd0956c", size = 5493422 }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/73/48/4d2818054671bb272d1b12ca65748a4145dc602a463683b5c21b260becee/ipython-8.26.0-py3-none-any.whl", hash = "sha256:e6b347c27bdf9c32ee9d31ae85defc525755a1869f14057e900675b9e8d6e6ff", size = 817939 },
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "jedi"
|
name = "jedi"
|
||||||
version = "0.19.1"
|
version = "0.19.1"
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
---
|
---
|
||||||
source: crates/uv/tests/ecosystem.rs
|
source: crates/uv/tests/it/ecosystem.rs
|
||||||
expression: snapshot
|
expression: snapshot
|
||||||
---
|
---
|
||||||
success: true
|
success: true
|
||||||
|
|
@ -7,4 +7,4 @@ exit_code: 0
|
||||||
----- stdout -----
|
----- stdout -----
|
||||||
|
|
||||||
----- stderr -----
|
----- stderr -----
|
||||||
Resolved 39 packages in [TIME]
|
Resolved 42 packages in [TIME]
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue