Skip to content

Commit c96f18a

Browse files
committed
Merge branch 'main' into local-version-semantics
2 parents d082763 + 224622b commit c96f18a

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

49 files changed

+957
-667
lines changed

crates/uv-bench/benches/uv.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ mod resolver {
101101
use uv_python::Interpreter;
102102
use uv_resolver::{
103103
FlatIndex, InMemoryIndex, Manifest, OptionsBuilder, PythonRequirement, RequiresPython,
104-
ResolutionGraph, Resolver, ResolverMarkers,
104+
ResolutionGraph, Resolver, ResolverEnvironment,
105105
};
106106
use uv_types::{BuildIsolation, EmptyInstalledPackages, HashStrategy, InFlight};
107107

@@ -198,9 +198,9 @@ mod resolver {
198198
);
199199

200200
let markers = if universal {
201-
ResolverMarkers::universal(vec![])
201+
ResolverEnvironment::universal(vec![])
202202
} else {
203-
ResolverMarkers::specific_environment(ResolverMarkerEnvironment::from(MARKERS.clone()))
203+
ResolverEnvironment::specific(ResolverMarkerEnvironment::from(MARKERS.clone()))
204204
};
205205

206206
let resolver = Resolver::new(

crates/uv-client/src/base_client.rs

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
use itertools::Itertools;
22
use reqwest::{Client, ClientBuilder, Response};
3-
use reqwest_middleware::ClientWithMiddleware;
3+
use reqwest_middleware::{ClientWithMiddleware, Middleware};
44
use reqwest_retry::policies::ExponentialBackoff;
55
use reqwest_retry::{
66
DefaultRetryableStrategy, RetryTransientMiddleware, Retryable, RetryableStrategy,
77
};
88
use std::error::Error;
99
use std::fmt::Debug;
1010
use std::path::Path;
11+
use std::sync::Arc;
1112
use std::time::Duration;
1213
use std::{env, iter};
1314
use tracing::debug;
@@ -54,6 +55,19 @@ pub struct BaseClientBuilder<'a> {
5455
platform: Option<&'a Platform>,
5556
auth_integration: AuthIntegration,
5657
default_timeout: Duration,
58+
extra_middleware: Option<ExtraMiddleware>,
59+
}
60+
61+
/// A list of user-defined middlewares to be applied to the client.
62+
#[derive(Clone)]
63+
pub struct ExtraMiddleware(pub Vec<Arc<dyn Middleware>>);
64+
65+
impl Debug for ExtraMiddleware {
66+
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
67+
f.debug_struct("ExtraMiddleware")
68+
.field("0", &format!("{} middlewares", self.0.len()))
69+
.finish()
70+
}
5771
}
5872

5973
impl Default for BaseClientBuilder<'_> {
@@ -75,6 +89,7 @@ impl BaseClientBuilder<'_> {
7589
platform: None,
7690
auth_integration: AuthIntegration::default(),
7791
default_timeout: Duration::from_secs(30),
92+
extra_middleware: None,
7893
}
7994
}
8095
}
@@ -140,6 +155,12 @@ impl<'a> BaseClientBuilder<'a> {
140155
self
141156
}
142157

158+
#[must_use]
159+
pub fn extra_middleware(mut self, middleware: ExtraMiddleware) -> Self {
160+
self.extra_middleware = Some(middleware);
161+
self
162+
}
163+
143164
pub fn is_offline(&self) -> bool {
144165
matches!(self.connectivity, Connectivity::Offline)
145166
}
@@ -313,6 +334,13 @@ impl<'a> BaseClientBuilder<'a> {
313334
}
314335
}
315336

337+
// When supplied add the extra middleware
338+
if let Some(extra_middleware) = &self.extra_middleware {
339+
for middleware in &extra_middleware.0 {
340+
client = client.with_arc(middleware.clone());
341+
}
342+
}
343+
316344
client.build()
317345
}
318346
Connectivity::Offline => reqwest_middleware::ClientBuilder::new(client)

crates/uv-client/src/registry_client.rs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ use uv_pep508::MarkerEnvironment;
2626
use uv_platform_tags::Platform;
2727
use uv_pypi_types::{ResolutionMetadata, SimpleJson};
2828

29-
use crate::base_client::BaseClientBuilder;
29+
use crate::base_client::{BaseClientBuilder, ExtraMiddleware};
3030
use crate::cached_client::CacheControl;
3131
use crate::html::SimpleHtml;
3232
use crate::remote_metadata::wheel_metadata_from_remote_zip;
@@ -110,6 +110,12 @@ impl<'a> RegistryClientBuilder<'a> {
110110
self
111111
}
112112

113+
#[must_use]
114+
pub fn extra_middleware(mut self, middleware: ExtraMiddleware) -> Self {
115+
self.base_client_builder = self.base_client_builder.extra_middleware(middleware);
116+
self
117+
}
118+
113119
#[must_use]
114120
pub fn markers(mut self, markers: &'a MarkerEnvironment) -> Self {
115121
self.base_client_builder = self.base_client_builder.markers(markers);

crates/uv-dispatch/src/lib.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ use uv_pypi_types::Requirement;
3030
use uv_python::{Interpreter, PythonEnvironment};
3131
use uv_resolver::{
3232
ExcludeNewer, FlatIndex, Flexibility, InMemoryIndex, Manifest, OptionsBuilder,
33-
PythonRequirement, Resolver, ResolverMarkers,
33+
PythonRequirement, Resolver, ResolverEnvironment,
3434
};
3535
use uv_types::{BuildContext, BuildIsolation, EmptyInstalledPackages, HashStrategy, InFlight};
3636

@@ -174,7 +174,7 @@ impl<'a> BuildContext for BuildDispatch<'a> {
174174

175175
async fn resolve<'data>(&'data self, requirements: &'data [Requirement]) -> Result<Resolution> {
176176
let python_requirement = PythonRequirement::from_interpreter(self.interpreter);
177-
let markers = self.interpreter.resolver_markers();
177+
let marker_env = self.interpreter.resolver_marker_environment();
178178
let tags = self.interpreter.tags()?;
179179

180180
let resolver = Resolver::new(
@@ -185,7 +185,7 @@ impl<'a> BuildContext for BuildDispatch<'a> {
185185
.flexibility(Flexibility::Fixed)
186186
.build(),
187187
&python_requirement,
188-
ResolverMarkers::specific_environment(markers),
188+
ResolverEnvironment::specific(marker_env),
189189
Some(tags),
190190
self.flat_index,
191191
self.index,

crates/uv-normalize/src/extra_name.rs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,11 @@ impl ExtraName {
2323
pub fn new(name: String) -> Result<Self, InvalidNameError> {
2424
validate_and_normalize_owned(name).map(Self)
2525
}
26+
27+
/// Return the underlying extra name as a string.
28+
pub fn as_str(&self) -> &str {
29+
&self.0
30+
}
2631
}
2732

2833
impl FromStr for ExtraName {
@@ -51,6 +56,6 @@ impl Display for ExtraName {
5156

5257
impl AsRef<str> for ExtraName {
5358
fn as_ref(&self) -> &str {
54-
&self.0
59+
self.as_str()
5560
}
5661
}

crates/uv-python/src/discovery.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1546,7 +1546,10 @@ impl PythonPreference {
15461546
}
15471547

15481548
pub(crate) fn allows_managed(self) -> bool {
1549-
matches!(self, Self::Managed | Self::OnlyManaged)
1549+
match self {
1550+
Self::OnlySystem => false,
1551+
Self::Managed | Self::System | Self::OnlyManaged => true,
1552+
}
15501553
}
15511554
}
15521555

crates/uv-python/src/interpreter.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@ impl Interpreter {
147147
}
148148

149149
/// Return the [`ResolverMarkerEnvironment`] for this Python executable.
150-
pub fn resolver_markers(&self) -> ResolverMarkerEnvironment {
150+
pub fn resolver_marker_environment(&self) -> ResolverMarkerEnvironment {
151151
ResolverMarkerEnvironment::from(self.markers().clone())
152152
}
153153

crates/uv-requirements/src/lookahead.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ use uv_distribution::{DistributionDatabase, Reporter};
1010
use uv_distribution_types::{Dist, DistributionMetadata};
1111
use uv_normalize::GroupName;
1212
use uv_pypi_types::{Requirement, RequirementSource};
13-
use uv_resolver::{InMemoryIndex, MetadataResponse, ResolverMarkers};
13+
use uv_resolver::{InMemoryIndex, MetadataResponse, ResolverEnvironment};
1414
use uv_types::{BuildContext, HashStrategy, RequestedRequirements};
1515

1616
use crate::{required_dist, Error};
@@ -87,7 +87,7 @@ impl<'a, Context: BuildContext> LookaheadResolver<'a, Context> {
8787
/// to "only evaluate marker expressions that reference an extra name.")
8888
pub async fn resolve(
8989
self,
90-
markers: &ResolverMarkers,
90+
env: &ResolverEnvironment,
9191
) -> Result<Vec<RequestedRequirements>, Error> {
9292
let mut results = Vec::new();
9393
let mut futures = FuturesUnordered::new();
@@ -97,7 +97,7 @@ impl<'a, Context: BuildContext> LookaheadResolver<'a, Context> {
9797
let mut queue: VecDeque<_> = self
9898
.constraints
9999
.apply(self.overrides.apply(self.requirements))
100-
.filter(|requirement| requirement.evaluate_markers(markers.marker_environment(), &[]))
100+
.filter(|requirement| requirement.evaluate_markers(env.marker_environment(), &[]))
101101
.map(|requirement| (*requirement).clone())
102102
.collect();
103103

@@ -117,7 +117,7 @@ impl<'a, Context: BuildContext> LookaheadResolver<'a, Context> {
117117
.apply(self.overrides.apply(lookahead.requirements()))
118118
{
119119
if requirement
120-
.evaluate_markers(markers.marker_environment(), lookahead.extras())
120+
.evaluate_markers(env.marker_environment(), lookahead.extras())
121121
{
122122
queue.push_back((*requirement).clone());
123123
}

0 commit comments

Comments
 (0)