Rename Dev to Group internally (#15557)

The "dev" naming is a pre-PEP 735 artifact.
This commit is contained in:
konsti 2025-08-27 20:35:43 +02:00 committed by GitHub
parent 960714d4d6
commit 7d49571336
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
15 changed files with 125 additions and 113 deletions

View file

@ -118,11 +118,11 @@ pub enum ResolutionDiagnostic {
/// The extra that was requested. For example, `colorama` in `black[colorama]`. /// The extra that was requested. For example, `colorama` in `black[colorama]`.
extra: ExtraName, extra: ExtraName,
}, },
MissingDev { MissingGroup {
/// The distribution that was requested with a non-existent development dependency group. /// The distribution that was requested with a non-existent development dependency group.
dist: ResolvedDist, dist: ResolvedDist,
/// The development dependency group that was requested. /// The development dependency group that was requested.
dev: GroupName, group: GroupName,
}, },
YankedVersion { YankedVersion {
/// The package that was requested with a yanked version. For example, `black==23.10.0`. /// The package that was requested with a yanked version. For example, `black==23.10.0`.
@ -144,9 +144,9 @@ impl Diagnostic for ResolutionDiagnostic {
Self::MissingExtra { dist, extra } => { Self::MissingExtra { dist, extra } => {
format!("The package `{dist}` does not have an extra named `{extra}`") format!("The package `{dist}` does not have an extra named `{extra}`")
} }
Self::MissingDev { dist, dev } => { Self::MissingGroup { dist, group } => {
format!( format!(
"The package `{dist}` does not have a development dependency group named `{dev}`" "The package `{dist}` does not have a development dependency group named `{group}`"
) )
} }
Self::YankedVersion { dist, reason } => { Self::YankedVersion { dist, reason } => {
@ -170,7 +170,7 @@ impl Diagnostic for ResolutionDiagnostic {
fn includes(&self, name: &PackageName) -> bool { fn includes(&self, name: &PackageName) -> bool {
match self { match self {
Self::MissingExtra { dist, .. } => name == dist.name(), Self::MissingExtra { dist, .. } => name == dist.name(),
Self::MissingDev { dist, .. } => name == dist.name(), Self::MissingGroup { dist, .. } => name == dist.name(),
Self::YankedVersion { dist, .. } => name == dist.name(), Self::YankedVersion { dist, .. } => name == dist.name(),
Self::MissingLowerBound { package_name } => name == package_name, Self::MissingLowerBound { package_name } => name == package_name,
} }

View file

@ -775,7 +775,7 @@ fn collapse_no_versions_of_workspace_members(
// Then, if the package is a workspace member... // Then, if the package is a workspace member...
let (PubGrubPackageInner::Package { name, .. } let (PubGrubPackageInner::Package { name, .. }
| PubGrubPackageInner::Extra { name, .. } | PubGrubPackageInner::Extra { name, .. }
| PubGrubPackageInner::Dev { name, .. }) = &**package | PubGrubPackageInner::Group { name, .. }) = &**package
else { else {
return; return;
}; };

View file

@ -46,7 +46,7 @@ impl<'lock> ExportableRequirements<'lock> {
target: &impl Installable<'lock>, target: &impl Installable<'lock>,
prune: &[PackageName], prune: &[PackageName],
extras: &ExtrasSpecificationWithDefaults, extras: &ExtrasSpecificationWithDefaults,
dev: &DependencyGroupsWithDefaults, groups: &DependencyGroupsWithDefaults,
annotate: bool, annotate: bool,
install_options: &'lock InstallOptions, install_options: &'lock InstallOptions,
) -> Self { ) -> Self {
@ -76,7 +76,7 @@ impl<'lock> ExportableRequirements<'lock> {
.expect("found too many packages matching root") .expect("found too many packages matching root")
.expect("could not find root"); .expect("could not find root");
if dev.prod() { if groups.prod() {
// Add the workspace package to the graph. // Add the workspace package to the graph.
let index = *inverse let index = *inverse
.entry(&dist.id) .entry(&dist.id)
@ -103,7 +103,7 @@ impl<'lock> ExportableRequirements<'lock> {
.dependency_groups .dependency_groups
.iter() .iter()
.filter_map(|(group, deps)| { .filter_map(|(group, deps)| {
if dev.contains(group) { if groups.contains(group) {
Some(deps.iter().map(move |dep| (group, dep))) Some(deps.iter().map(move |dep| (group, dep)))
} else { } else {
None None
@ -163,7 +163,7 @@ impl<'lock> ExportableRequirements<'lock> {
.dependency_groups() .dependency_groups()
.iter() .iter()
.filter_map(|(group, deps)| { .filter_map(|(group, deps)| {
if dev.contains(group) { if groups.contains(group) {
Some(deps) Some(deps)
} else { } else {
None None

View file

@ -38,7 +38,7 @@ pub trait Installable<'lock> {
marker_env: &ResolverMarkerEnvironment, marker_env: &ResolverMarkerEnvironment,
tags: &Tags, tags: &Tags,
extras: &ExtrasSpecificationWithDefaults, extras: &ExtrasSpecificationWithDefaults,
dev: &DependencyGroupsWithDefaults, groups: &DependencyGroupsWithDefaults,
build_options: &BuildOptions, build_options: &BuildOptions,
install_options: &InstallOptions, install_options: &InstallOptions,
) -> Result<Resolution, LockError> { ) -> Result<Resolution, LockError> {
@ -74,7 +74,7 @@ pub trait Installable<'lock> {
})?; })?;
// Track the activated extras. // Track the activated extras.
if dev.prod() { if groups.prod() {
activated_projects.push(&dist.id.name); activated_projects.push(&dist.id.name);
for extra in extras.extra_names(dist.optional_dependencies.keys()) { for extra in extras.extra_names(dist.optional_dependencies.keys()) {
activated_extras.push((&dist.id.name, extra)); activated_extras.push((&dist.id.name, extra));
@ -85,7 +85,7 @@ pub trait Installable<'lock> {
for group in dist for group in dist
.dependency_groups .dependency_groups
.keys() .keys()
.filter(|group| dev.contains(group)) .filter(|group| groups.contains(group))
{ {
activated_groups.push((&dist.id.name, group)); activated_groups.push((&dist.id.name, group));
} }
@ -106,7 +106,7 @@ pub trait Installable<'lock> {
})?; })?;
// Add the workspace package to the graph. // Add the workspace package to the graph.
let index = petgraph.add_node(if dev.prod() { let index = petgraph.add_node(if groups.prod() {
self.package_to_node(dist, tags, build_options, install_options)? self.package_to_node(dist, tags, build_options, install_options)?
} else { } else {
self.non_installable_node(dist, tags)? self.non_installable_node(dist, tags)?
@ -122,7 +122,7 @@ pub trait Installable<'lock> {
// Add the workspace dependencies to the queue. // Add the workspace dependencies to the queue.
for (dist, index) in roots { for (dist, index) in roots {
if dev.prod() { if groups.prod() {
// Push its dependencies onto the queue. // Push its dependencies onto the queue.
queue.push_back((dist, None)); queue.push_back((dist, None));
for extra in extras.extra_names(dist.optional_dependencies.keys()) { for extra in extras.extra_names(dist.optional_dependencies.keys()) {
@ -135,7 +135,7 @@ pub trait Installable<'lock> {
.dependency_groups .dependency_groups
.iter() .iter()
.filter_map(|(group, deps)| { .filter_map(|(group, deps)| {
if dev.contains(group) { if groups.contains(group) {
Some(deps.iter().map(move |dep| (group, dep))) Some(deps.iter().map(move |dep| (group, dep)))
} else { } else {
None None
@ -172,7 +172,7 @@ pub trait Installable<'lock> {
// referenced as a development dependency, then we need to re-enable it. // referenced as a development dependency, then we need to re-enable it.
let index = *entry.get(); let index = *entry.get();
let node = &mut petgraph[index]; let node = &mut petgraph[index];
if !dev.prod() { if !groups.prod() {
*node = self.package_to_node( *node = self.package_to_node(
dep_dist, dep_dist,
tags, tags,
@ -225,7 +225,7 @@ pub trait Installable<'lock> {
})?; })?;
// Add the package to the graph. // Add the package to the graph.
let index = petgraph.add_node(if dev.prod() { let index = petgraph.add_node(if groups.prod() {
self.package_to_node(dist, tags, build_options, install_options)? self.package_to_node(dist, tags, build_options, install_options)?
} else { } else {
self.non_installable_node(dist, tags)? self.non_installable_node(dist, tags)?
@ -253,7 +253,7 @@ pub trait Installable<'lock> {
.dependency_groups() .dependency_groups()
.iter() .iter()
.filter_map(|(group, deps)| { .filter_map(|(group, deps)| {
if dev.contains(group) { if groups.contains(group) {
Some(deps.iter().map(move |dep| (group, dep))) Some(deps.iter().map(move |dep| (group, dep)))
} else { } else {
None None
@ -294,7 +294,7 @@ pub trait Installable<'lock> {
// referenced as a development dependency, then we need to re-enable it. // referenced as a development dependency, then we need to re-enable it.
let index = *entry.get(); let index = *entry.get();
let node = &mut petgraph[index]; let node = &mut petgraph[index];
if !dev.prod() { if !groups.prod() {
*node = self.package_to_node(dist, tags, build_options, install_options)?; *node = self.package_to_node(dist, tags, build_options, install_options)?;
} }
index index

View file

@ -314,7 +314,7 @@ impl Lock {
)?; )?;
} }
} }
if let Some(group) = dist.dev.as_ref() { if let Some(group) = dist.group.as_ref() {
let id = PackageId::from_annotated_dist(dist, root)?; let id = PackageId::from_annotated_dist(dist, root)?;
let Some(package) = packages.get_mut(&id) else { let Some(package) = packages.get_mut(&id) else {
return Err(LockErrorKind::MissingDevBase { return Err(LockErrorKind::MissingDevBase {

View file

@ -41,7 +41,7 @@ impl<'env> TreeDisplay<'env> {
depth: usize, depth: usize,
prune: &[PackageName], prune: &[PackageName],
packages: &[PackageName], packages: &[PackageName],
dev: &DependencyGroupsWithDefaults, groups: &DependencyGroupsWithDefaults,
no_dedupe: bool, no_dedupe: bool,
invert: bool, invert: bool,
) -> Self { ) -> Self {
@ -95,7 +95,7 @@ impl<'env> TreeDisplay<'env> {
// Add an edge from the root. // Add an edge from the root.
graph.add_edge(root, index, Edge::Prod(None)); graph.add_edge(root, index, Edge::Prod(None));
if dev.prod() { if groups.prod() {
// Push its dependencies on the queue. // Push its dependencies on the queue.
if seen.insert((id, None)) { if seen.insert((id, None)) {
queue.push_back((id, None)); queue.push_back((id, None));
@ -114,7 +114,7 @@ impl<'env> TreeDisplay<'env> {
.dependency_groups .dependency_groups
.iter() .iter()
.filter_map(|(group, deps)| { .filter_map(|(group, deps)| {
if dev.contains(group) { if groups.contains(group) {
Some(deps.iter().map(move |dep| (group, dep))) Some(deps.iter().map(move |dep| (group, dep)))
} else { } else {
None None

View file

@ -44,12 +44,12 @@ impl PubGrubDependency {
pub(crate) fn from_requirement<'a>( pub(crate) fn from_requirement<'a>(
conflicts: &Conflicts, conflicts: &Conflicts,
requirement: Cow<'a, Requirement>, requirement: Cow<'a, Requirement>,
dev: Option<&'a GroupName>, group_name: Option<&'a GroupName>,
parent_package: Option<&'a PubGrubPackage>, parent_package: Option<&'a PubGrubPackage>,
) -> impl Iterator<Item = Self> + 'a { ) -> impl Iterator<Item = Self> + 'a {
let parent_name = parent_package.and_then(|package| package.name_no_root()); let parent_name = parent_package.and_then(|package| package.name_no_root());
let is_normal_parent = parent_package let is_normal_parent = parent_package
.map(|pp| pp.extra().is_none() && pp.dev().is_none()) .map(|pp| pp.extra().is_none() && pp.group().is_none())
.unwrap_or(false); .unwrap_or(false);
let iter = if !requirement.extras.is_empty() { let iter = if !requirement.extras.is_empty() {
// This is crazy subtle, but if any of the extras in the // This is crazy subtle, but if any of the extras in the
@ -128,7 +128,7 @@ impl PubGrubDependency {
url, url,
}, },
PubGrubPackageInner::Extra { name, .. } => { PubGrubPackageInner::Extra { name, .. } => {
if dev.is_none() { if group_name.is_none() {
debug_assert!( debug_assert!(
parent_name.is_none_or(|parent_name| parent_name != name), parent_name.is_none_or(|parent_name| parent_name != name),
"extras not flattened for {name}" "extras not flattened for {name}"
@ -141,8 +141,8 @@ impl PubGrubDependency {
url, url,
} }
} }
PubGrubPackageInner::Dev { name, .. } => { PubGrubPackageInner::Group { name, .. } => {
if dev.is_none() { if group_name.is_none() {
debug_assert!( debug_assert!(
parent_name.is_none_or(|parent_name| parent_name != name), parent_name.is_none_or(|parent_name| parent_name != name),
"group not flattened for {name}" "group not flattened for {name}"

View file

@ -53,7 +53,7 @@ pub enum PubGrubPackageInner {
Package { Package {
name: PackageName, name: PackageName,
extra: Option<ExtraName>, extra: Option<ExtraName>,
dev: Option<GroupName>, group: Option<GroupName>,
marker: MarkerTree, marker: MarkerTree,
}, },
/// A proxy package to represent a dependency with an extra (e.g., `black[colorama]`). /// A proxy package to represent a dependency with an extra (e.g., `black[colorama]`).
@ -74,14 +74,14 @@ pub enum PubGrubPackageInner {
extra: ExtraName, extra: ExtraName,
marker: MarkerTree, marker: MarkerTree,
}, },
/// A proxy package to represent an enabled "dependency group" (e.g., development dependencies). /// A proxy package to represent an enabled dependency group.
/// ///
/// This is similar in spirit to [PEP 735](https://peps.python.org/pep-0735/) and similar in /// This is similar in spirit to [PEP 735](https://peps.python.org/pep-0735/) and similar in
/// implementation to the `Extra` variant. The main difference is that we treat groups as /// implementation to the `Extra` variant. The main difference is that we treat groups as
/// enabled globally, rather than on a per-requirement basis. /// enabled globally, rather than on a per-requirement basis.
Dev { Group {
name: PackageName, name: PackageName,
dev: GroupName, group: GroupName,
marker: MarkerTree, marker: MarkerTree,
}, },
/// A proxy package for a base package with a marker (e.g., `black; python_version >= "3.6"`). /// A proxy package for a base package with a marker (e.g., `black; python_version >= "3.6"`).
@ -115,15 +115,19 @@ impl PubGrubPackage {
extra, extra,
marker, marker,
})) }))
} else if let Some(dev) = group { } else if let Some(group) = group {
Self(Arc::new(PubGrubPackageInner::Dev { name, dev, marker })) Self(Arc::new(PubGrubPackageInner::Group {
name,
group,
marker,
}))
} else if !marker.is_true() { } else if !marker.is_true() {
Self(Arc::new(PubGrubPackageInner::Marker { name, marker })) Self(Arc::new(PubGrubPackageInner::Marker { name, marker }))
} else { } else {
Self(Arc::new(PubGrubPackageInner::Package { Self(Arc::new(PubGrubPackageInner::Package {
name, name,
extra, extra,
dev: None, group: None,
marker, marker,
})) }))
} }
@ -139,7 +143,7 @@ impl PubGrubPackage {
| PubGrubPackageInner::System(name) | PubGrubPackageInner::System(name)
| PubGrubPackageInner::Package { name, .. } | PubGrubPackageInner::Package { name, .. }
| PubGrubPackageInner::Extra { name, .. } | PubGrubPackageInner::Extra { name, .. }
| PubGrubPackageInner::Dev { name, .. } | PubGrubPackageInner::Group { name, .. }
| PubGrubPackageInner::Marker { name, .. } => Some(name), | PubGrubPackageInner::Marker { name, .. } => Some(name),
} }
} }
@ -153,7 +157,7 @@ impl PubGrubPackage {
| PubGrubPackageInner::System(_) => None, | PubGrubPackageInner::System(_) => None,
PubGrubPackageInner::Package { name, .. } PubGrubPackageInner::Package { name, .. }
| PubGrubPackageInner::Extra { name, .. } | PubGrubPackageInner::Extra { name, .. }
| PubGrubPackageInner::Dev { name, .. } | PubGrubPackageInner::Group { name, .. }
| PubGrubPackageInner::Marker { name, .. } => Some(name), | PubGrubPackageInner::Marker { name, .. } => Some(name),
} }
} }
@ -169,7 +173,7 @@ impl PubGrubPackage {
| PubGrubPackageInner::System(_) => MarkerTree::TRUE, | PubGrubPackageInner::System(_) => MarkerTree::TRUE,
PubGrubPackageInner::Package { marker, .. } PubGrubPackageInner::Package { marker, .. }
| PubGrubPackageInner::Extra { marker, .. } | PubGrubPackageInner::Extra { marker, .. }
| PubGrubPackageInner::Dev { marker, .. } => *marker, | PubGrubPackageInner::Group { marker, .. } => *marker,
PubGrubPackageInner::Marker { marker, .. } => *marker, PubGrubPackageInner::Marker { marker, .. } => *marker,
} }
} }
@ -186,7 +190,7 @@ impl PubGrubPackage {
| PubGrubPackageInner::Python(_) | PubGrubPackageInner::Python(_)
| PubGrubPackageInner::System(_) | PubGrubPackageInner::System(_)
| PubGrubPackageInner::Package { extra: None, .. } | PubGrubPackageInner::Package { extra: None, .. }
| PubGrubPackageInner::Dev { .. } | PubGrubPackageInner::Group { .. }
| PubGrubPackageInner::Marker { .. } => None, | PubGrubPackageInner::Marker { .. } => None,
PubGrubPackageInner::Package { PubGrubPackageInner::Package {
extra: Some(extra), .. extra: Some(extra), ..
@ -195,22 +199,24 @@ impl PubGrubPackage {
} }
} }
/// Returns the dev (aka "group") name associated with this PubGrub /// Returns the dependency group name associated with this PubGrub
/// package, if it has one. /// package, if it has one.
/// ///
/// Note that if this returns `Some`, then `extra` must return `None`. /// Note that if this returns `Some`, then `extra` must return `None`.
pub(crate) fn dev(&self) -> Option<&GroupName> { pub(crate) fn group(&self) -> Option<&GroupName> {
match &**self { match &**self {
// A root can never be a dependency of another package, and a `Python` pubgrub // A root can never be a dependency of another package, and a `Python` pubgrub
// package is never returned by `get_dependencies`. So these cases never occur. // package is never returned by `get_dependencies`. So these cases never occur.
PubGrubPackageInner::Root(_) PubGrubPackageInner::Root(_)
| PubGrubPackageInner::Python(_) | PubGrubPackageInner::Python(_)
| PubGrubPackageInner::System(_) | PubGrubPackageInner::System(_)
| PubGrubPackageInner::Package { dev: None, .. } | PubGrubPackageInner::Package { group: None, .. }
| PubGrubPackageInner::Extra { .. } | PubGrubPackageInner::Extra { .. }
| PubGrubPackageInner::Marker { .. } => None, | PubGrubPackageInner::Marker { .. } => None,
PubGrubPackageInner::Package { dev: Some(dev), .. } PubGrubPackageInner::Package {
| PubGrubPackageInner::Dev { dev, .. } => Some(dev), group: Some(group), ..
}
| PubGrubPackageInner::Group { group, .. } => Some(group),
} }
} }
@ -220,7 +226,7 @@ impl PubGrubPackage {
/// this returns `None`. /// this returns `None`.
pub(crate) fn conflicting_item(&self) -> Option<ConflictItemRef<'_>> { pub(crate) fn conflicting_item(&self) -> Option<ConflictItemRef<'_>> {
let package = self.name_no_root()?; let package = self.name_no_root()?;
match (self.extra(), self.dev()) { match (self.extra(), self.group()) {
(None, None) => Some(ConflictItemRef::from(package)), (None, None) => Some(ConflictItemRef::from(package)),
(Some(extra), None) => Some(ConflictItemRef::from((package, extra))), (Some(extra), None) => Some(ConflictItemRef::from((package, extra))),
(None, Some(group)) => Some(ConflictItemRef::from((package, group))), (None, Some(group)) => Some(ConflictItemRef::from((package, group))),
@ -244,7 +250,7 @@ impl PubGrubPackage {
matches!( matches!(
&**self, &**self,
PubGrubPackageInner::Extra { .. } PubGrubPackageInner::Extra { .. }
| PubGrubPackageInner::Dev { .. } | PubGrubPackageInner::Group { .. }
| PubGrubPackageInner::Marker { .. } | PubGrubPackageInner::Marker { .. }
) )
} }
@ -267,7 +273,7 @@ impl PubGrubPackage {
| PubGrubPackageInner::System(_) => {} | PubGrubPackageInner::System(_) => {}
PubGrubPackageInner::Package { ref mut marker, .. } PubGrubPackageInner::Package { ref mut marker, .. }
| PubGrubPackageInner::Extra { ref mut marker, .. } | PubGrubPackageInner::Extra { ref mut marker, .. }
| PubGrubPackageInner::Dev { ref mut marker, .. } | PubGrubPackageInner::Group { ref mut marker, .. }
| PubGrubPackageInner::Marker { ref mut marker, .. } => { | PubGrubPackageInner::Marker { ref mut marker, .. } => {
*marker = python_requirement.simplify_markers(*marker); *marker = python_requirement.simplify_markers(*marker);
} }
@ -283,7 +289,7 @@ impl PubGrubPackage {
PubGrubPackageInner::System(_) => "system", PubGrubPackageInner::System(_) => "system",
PubGrubPackageInner::Package { .. } => "package", PubGrubPackageInner::Package { .. } => "package",
PubGrubPackageInner::Extra { .. } => "extra", PubGrubPackageInner::Extra { .. } => "extra",
PubGrubPackageInner::Dev { .. } => "dev", PubGrubPackageInner::Group { .. } => "group",
PubGrubPackageInner::Marker { .. } => "marker", PubGrubPackageInner::Marker { .. } => "marker",
} }
} }
@ -318,7 +324,7 @@ impl std::fmt::Display for PubGrubPackageInner {
name, name,
extra: None, extra: None,
marker, marker,
dev: None, group: None,
} => { } => {
if let Some(marker) = marker.contents() { if let Some(marker) = marker.contents() {
write!(f, "{name}{{{marker}}}") write!(f, "{name}{{{marker}}}")
@ -330,7 +336,7 @@ impl std::fmt::Display for PubGrubPackageInner {
name, name,
extra: Some(extra), extra: Some(extra),
marker, marker,
dev: None, group: None,
} => { } => {
if let Some(marker) = marker.contents() { if let Some(marker) = marker.contents() {
write!(f, "{name}[{extra}]{{{marker}}}") write!(f, "{name}[{extra}]{{{marker}}}")
@ -342,7 +348,7 @@ impl std::fmt::Display for PubGrubPackageInner {
name, name,
extra: None, extra: None,
marker, marker,
dev: Some(dev), group: Some(dev),
} => { } => {
if let Some(marker) = marker.contents() { if let Some(marker) = marker.contents() {
write!(f, "{name}:{dev}{{{marker}}}") write!(f, "{name}:{dev}{{{marker}}}")
@ -358,13 +364,15 @@ impl std::fmt::Display for PubGrubPackageInner {
} }
} }
Self::Extra { name, extra, .. } => write!(f, "{name}[{extra}]"), Self::Extra { name, extra, .. } => write!(f, "{name}[{extra}]"),
Self::Dev { name, dev, .. } => write!(f, "{name}:{dev}"), Self::Group {
name, group: dev, ..
} => write!(f, "{name}:{dev}"),
// It is guaranteed that `extra` and `dev` are never set at the same time. // It is guaranteed that `extra` and `dev` are never set at the same time.
Self::Package { Self::Package {
name: _, name: _,
extra: Some(_), extra: Some(_),
marker: _, marker: _,
dev: Some(_), group: Some(_),
} => unreachable!(), } => unreachable!(),
} }
} }

View file

@ -132,7 +132,7 @@ impl PubGrubPriorities {
PubGrubPackageInner::System(_) => (PubGrubPriority::Root, PubGrubTiebreaker::from(3)), PubGrubPackageInner::System(_) => (PubGrubPriority::Root, PubGrubTiebreaker::from(3)),
PubGrubPackageInner::Marker { name, .. } PubGrubPackageInner::Marker { name, .. }
| PubGrubPackageInner::Extra { name, .. } | PubGrubPackageInner::Extra { name, .. }
| PubGrubPackageInner::Dev { name, .. } | PubGrubPackageInner::Group { name, .. }
| PubGrubPackageInner::Package { name, .. } => { | PubGrubPackageInner::Package { name, .. } => {
// To ensure deterministic resolution, each (virtual) package needs to be registered // To ensure deterministic resolution, each (virtual) package needs to be registered
// on discovery (as dependency of another package), before we query it for // on discovery (as dependency of another package), before we query it for

View file

@ -400,9 +400,9 @@ impl PubGrubReportFormatter<'_> {
match &**package { match &**package {
// TODO(zanieb): Improve handling of dev and extra for single-project workspaces // TODO(zanieb): Improve handling of dev and extra for single-project workspaces
PubGrubPackageInner::Package { PubGrubPackageInner::Package {
name, extra, dev, .. name, extra, group, ..
} if self.workspace_members.contains(name) => { } if self.workspace_members.contains(name) => {
if self.is_single_project_workspace() && extra.is_none() && dev.is_none() { if self.is_single_project_workspace() && extra.is_none() && group.is_none() {
Some("your project".to_string()) Some("your project".to_string())
} else { } else {
Some(format!("{package}")) Some(format!("{package}"))
@ -411,7 +411,7 @@ impl PubGrubReportFormatter<'_> {
PubGrubPackageInner::Extra { name, .. } if self.workspace_members.contains(name) => { PubGrubPackageInner::Extra { name, .. } if self.workspace_members.contains(name) => {
Some(format!("{package}")) Some(format!("{package}"))
} }
PubGrubPackageInner::Dev { name, .. } if self.workspace_members.contains(name) => { PubGrubPackageInner::Group { name, .. } if self.workspace_members.contains(name) => {
Some(format!("{package}")) Some(format!("{package}"))
} }
_ => None, _ => None,
@ -428,9 +428,9 @@ impl PubGrubReportFormatter<'_> {
match &**package { match &**package {
// TODO(zanieb): Improve handling of dev and extra for single-project workspaces // TODO(zanieb): Improve handling of dev and extra for single-project workspaces
PubGrubPackageInner::Package { PubGrubPackageInner::Package {
name, extra, dev, .. name, extra, group, ..
} if self.workspace_members.contains(name) => { } if self.workspace_members.contains(name) => {
self.is_single_project_workspace() && extra.is_none() && dev.is_none() self.is_single_project_workspace() && extra.is_none() && group.is_none()
} }
_ => false, _ => false,
} }
@ -647,7 +647,7 @@ impl PubGrubReportFormatter<'_> {
if package_name == dependency_name if package_name == dependency_name
&& (dependency.extra().is_none() || package.extra() == dependency.extra()) && (dependency.extra().is_none() || package.extra() == dependency.extra())
&& (dependency.dev().is_none() || dependency.dev() == package.dev()) && (dependency.group().is_none() || dependency.group() == package.group())
&& workspace_members.contains(package_name) && workspace_members.contains(package_name)
{ {
output_hints.insert(PubGrubHint::DependsOnItself { output_hints.insert(PubGrubHint::DependsOnItself {

View file

@ -28,7 +28,7 @@ pub(crate) struct AnnotatedDist {
pub(crate) name: PackageName, pub(crate) name: PackageName,
pub(crate) version: Version, pub(crate) version: Version,
pub(crate) extra: Option<ExtraName>, pub(crate) extra: Option<ExtraName>,
pub(crate) dev: Option<GroupName>, pub(crate) group: Option<GroupName>,
pub(crate) hashes: HashDigests, pub(crate) hashes: HashDigests,
pub(crate) metadata: Option<Metadata>, pub(crate) metadata: Option<Metadata>,
/// The "full" marker for this distribution. It precisely describes all /// The "full" marker for this distribution. It precisely describes all
@ -43,7 +43,7 @@ impl AnnotatedDist {
/// Returns `true` if the [`AnnotatedDist`] is a base package (i.e., not an extra or a /// Returns `true` if the [`AnnotatedDist`] is a base package (i.e., not an extra or a
/// dependency group). /// dependency group).
pub(crate) fn is_base(&self) -> bool { pub(crate) fn is_base(&self) -> bool {
self.extra.is_none() && self.dev.is_none() self.extra.is_none() && self.group.is_none()
} }
/// Returns the [`IndexUrl`] of the distribution, if it is from a registry. /// Returns the [`IndexUrl`] of the distribution, if it is from a registry.

View file

@ -87,7 +87,7 @@ impl ResolutionGraphNode {
match self { match self {
Self::Root => None, Self::Root => None,
Self::Dist(dist) => { Self::Dist(dist) => {
let group = dist.dev.as_ref()?; let group = dist.group.as_ref()?;
Some((&dist.name, group)) Some((&dist.name, group))
} }
} }
@ -294,7 +294,7 @@ impl ResolverOutput {
url: edge.from_url.as_ref(), url: edge.from_url.as_ref(),
index: edge.from_index.as_ref(), index: edge.from_index.as_ref(),
extra: edge.from_extra.as_ref(), extra: edge.from_extra.as_ref(),
group: edge.from_dev.as_ref(), group: edge.from_group.as_ref(),
}] }]
}); });
let to_index = inverse[&PackageRef { let to_index = inverse[&PackageRef {
@ -303,7 +303,7 @@ impl ResolverOutput {
url: edge.to_url.as_ref(), url: edge.to_url.as_ref(),
index: edge.to_index.as_ref(), index: edge.to_index.as_ref(),
extra: edge.to_extra.as_ref(), extra: edge.to_extra.as_ref(),
group: edge.to_dev.as_ref(), group: edge.to_group.as_ref(),
}]; }];
let edge_marker = { let edge_marker = {
@ -338,7 +338,7 @@ impl ResolverOutput {
let ResolutionPackage { let ResolutionPackage {
name, name,
extra, extra,
dev, dev: group,
url, url,
index, index,
} = &package; } = &package;
@ -367,11 +367,11 @@ impl ResolverOutput {
} }
// Validate the development dependency group. // Validate the development dependency group.
if let Some(dev) = dev { if let Some(dev) = group {
if !metadata.dependency_groups.contains_key(dev) { if !metadata.dependency_groups.contains_key(dev) {
diagnostics.push(ResolutionDiagnostic::MissingDev { diagnostics.push(ResolutionDiagnostic::MissingGroup {
dist: dist.clone(), dist: dist.clone(),
dev: dev.clone(), group: dev.clone(),
}); });
} }
} }
@ -383,7 +383,7 @@ impl ResolverOutput {
name: name.clone(), name: name.clone(),
version: version.clone(), version: version.clone(),
extra: extra.clone(), extra: extra.clone(),
dev: dev.clone(), group: group.clone(),
hashes, hashes,
metadata, metadata,
marker: UniversalMarker::TRUE, marker: UniversalMarker::TRUE,
@ -395,7 +395,7 @@ impl ResolverOutput {
url: url.as_ref(), url: url.as_ref(),
index: index.as_ref(), index: index.as_ref(),
extra: extra.as_ref(), extra: extra.as_ref(),
group: dev.as_ref(), group: group.as_ref(),
}, },
node, node,
); );
@ -914,8 +914,8 @@ impl From<ResolverOutput> for uv_distribution_types::Resolution {
let edge = if let Some(extra) = source_dist.extra.as_ref() { let edge = if let Some(extra) = source_dist.extra.as_ref() {
Edge::Optional(extra.clone()) Edge::Optional(extra.clone())
} else if let Some(dev) = source_dist.dev.as_ref() { } else if let Some(group) = source_dist.group.as_ref() {
Edge::Dev(dev.clone()) Edge::Dev(group.clone())
} else { } else {
Edge::Prod Edge::Prod
}; };

View file

@ -94,7 +94,7 @@ impl BatchPrefetcher {
let PubGrubPackageInner::Package { let PubGrubPackageInner::Package {
name, name,
extra: None, extra: None,
dev: None, group: None,
marker: MarkerTree::TRUE, marker: MarkerTree::TRUE,
} = &**next } = &**next
else { else {
@ -149,7 +149,7 @@ impl BatchPrefetcher {
let PubGrubPackageInner::Package { let PubGrubPackageInner::Package {
name, name,
extra: None, extra: None,
dev: None, group: None,
marker: MarkerTree::TRUE, marker: MarkerTree::TRUE,
} = &**package } = &**package
else { else {
@ -168,7 +168,7 @@ impl BatchPrefetcher {
let PubGrubPackageInner::Package { let PubGrubPackageInner::Package {
name, name,
extra: None, extra: None,
dev: None, group: None,
marker: MarkerTree::TRUE, marker: MarkerTree::TRUE,
} = &**next } = &**next
else { else {

View file

@ -53,7 +53,7 @@ impl DerivationChainBuilder {
path.push(DerivationStep::new( path.push(DerivationStep::new(
name.clone(), name.clone(),
p1.extra().cloned(), p1.extra().cloned(),
p1.dev().cloned(), p1.group().cloned(),
Some(version.clone()), Some(version.clone()),
v2.clone(), v2.clone(),
)); ));

View file

@ -817,7 +817,7 @@ impl<InstalledPackages: InstalledPackagesProvider> ResolverState<InstalledPackag
if let Some(ref extra) = edge.from_extra { if let Some(ref extra) = edge.from_extra {
write!(msg, " (extra: {extra})").unwrap(); write!(msg, " (extra: {extra})").unwrap();
} }
if let Some(ref dev) = edge.from_dev { if let Some(ref dev) = edge.from_group {
write!(msg, " (group: {dev})").unwrap(); write!(msg, " (group: {dev})").unwrap();
} }
@ -827,7 +827,7 @@ impl<InstalledPackages: InstalledPackagesProvider> ResolverState<InstalledPackag
if let Some(ref extra) = edge.to_extra { if let Some(ref extra) = edge.to_extra {
write!(msg, " (extra: {extra})").unwrap(); write!(msg, " (extra: {extra})").unwrap();
} }
if let Some(ref dev) = edge.to_dev { if let Some(ref dev) = edge.to_group {
write!(msg, " (group: {dev})").unwrap(); write!(msg, " (group: {dev})").unwrap();
} }
if let Some(marker) = edge.marker.contents() { if let Some(marker) = edge.marker.contents() {
@ -1034,7 +1034,7 @@ impl<InstalledPackages: InstalledPackagesProvider> ResolverState<InstalledPackag
let PubGrubPackageInner::Package { let PubGrubPackageInner::Package {
name, name,
extra: None, extra: None,
dev: None, group: None,
marker: MarkerTree::TRUE, marker: MarkerTree::TRUE,
} = &**package } = &**package
else { else {
@ -1103,7 +1103,7 @@ impl<InstalledPackages: InstalledPackagesProvider> ResolverState<InstalledPackag
PubGrubPackageInner::Marker { name, .. } PubGrubPackageInner::Marker { name, .. }
| PubGrubPackageInner::Extra { name, .. } | PubGrubPackageInner::Extra { name, .. }
| PubGrubPackageInner::Dev { name, .. } | PubGrubPackageInner::Group { name, .. }
| PubGrubPackageInner::Package { name, .. } => { | PubGrubPackageInner::Package { name, .. } => {
if let Some(url) = package.name().and_then(|name| fork_urls.get(name)) { if let Some(url) = package.name().and_then(|name| fork_urls.get(name)) {
self.choose_version_url(name, range, url, python_requirement) self.choose_version_url(name, range, url, python_requirement)
@ -1762,7 +1762,7 @@ impl<InstalledPackages: InstalledPackagesProvider> ResolverState<InstalledPackag
PubGrubPackageInner::Package { PubGrubPackageInner::Package {
name, name,
extra, extra,
dev, group,
marker: _, marker: _,
} => { } => {
// If we're excluding transitive dependencies, short-circuit. // If we're excluding transitive dependencies, short-circuit.
@ -1858,7 +1858,7 @@ impl<InstalledPackages: InstalledPackagesProvider> ResolverState<InstalledPackag
&metadata.requires_dist, &metadata.requires_dist,
&metadata.dependency_groups, &metadata.dependency_groups,
extra.as_ref(), extra.as_ref(),
dev.as_ref(), group.as_ref(),
Some(name), Some(name),
env, env,
python_requirement, python_requirement,
@ -1869,7 +1869,7 @@ impl<InstalledPackages: InstalledPackagesProvider> ResolverState<InstalledPackag
PubGrubDependency::from_requirement( PubGrubDependency::from_requirement(
&self.conflicts, &self.conflicts,
requirement, requirement,
dev.as_ref(), group.as_ref(),
Some(package), Some(package),
) )
}) })
@ -1890,7 +1890,7 @@ impl<InstalledPackages: InstalledPackagesProvider> ResolverState<InstalledPackag
package: PubGrubPackage::from(PubGrubPackageInner::Package { package: PubGrubPackage::from(PubGrubPackageInner::Package {
name: name.clone(), name: name.clone(),
extra: None, extra: None,
dev: None, group: None,
marker, marker,
}), }),
version: Range::singleton(version.clone()), version: Range::singleton(version.clone()),
@ -1918,7 +1918,7 @@ impl<InstalledPackages: InstalledPackagesProvider> ResolverState<InstalledPackag
package: PubGrubPackage::from(PubGrubPackageInner::Package { package: PubGrubPackage::from(PubGrubPackageInner::Package {
name: name.clone(), name: name.clone(),
extra: extra.cloned(), extra: extra.cloned(),
dev: None, group: None,
marker, marker,
}), }),
version: Range::singleton(version.clone()), version: Range::singleton(version.clone()),
@ -1931,7 +1931,11 @@ impl<InstalledPackages: InstalledPackagesProvider> ResolverState<InstalledPackag
} }
// Add a dependency on the dependency group, with and without the marker. // Add a dependency on the dependency group, with and without the marker.
PubGrubPackageInner::Dev { name, dev, marker } => { PubGrubPackageInner::Group {
name,
group,
marker,
} => {
return Ok(Dependencies::Unforkable( return Ok(Dependencies::Unforkable(
[MarkerTree::TRUE, *marker] [MarkerTree::TRUE, *marker]
.into_iter() .into_iter()
@ -1940,7 +1944,7 @@ impl<InstalledPackages: InstalledPackagesProvider> ResolverState<InstalledPackag
package: PubGrubPackage::from(PubGrubPackageInner::Package { package: PubGrubPackage::from(PubGrubPackageInner::Package {
name: name.clone(), name: name.clone(),
extra: None, extra: None,
dev: Some(dev.clone()), group: Some(group.clone()),
marker, marker,
}), }),
version: Range::singleton(version.clone()), version: Range::singleton(version.clone()),
@ -2669,7 +2673,7 @@ impl<InstalledPackages: InstalledPackagesProvider> ResolverState<InstalledPackag
PubGrubPackageInner::System(_) => {} PubGrubPackageInner::System(_) => {}
PubGrubPackageInner::Marker { .. } => {} PubGrubPackageInner::Marker { .. } => {}
PubGrubPackageInner::Extra { .. } => {} PubGrubPackageInner::Extra { .. } => {}
PubGrubPackageInner::Dev { .. } => {} PubGrubPackageInner::Group { .. } => {}
PubGrubPackageInner::Package { name, .. } => { PubGrubPackageInner::Package { name, .. } => {
reporter.on_progress(name, &VersionOrUrlRef::Version(version)); reporter.on_progress(name, &VersionOrUrlRef::Version(version));
} }
@ -3058,13 +3062,13 @@ impl ForkState {
let self_package = &self.pubgrub.package_store[self_package]; let self_package = &self.pubgrub.package_store[self_package];
let dependency_package = &self.pubgrub.package_store[dependency_package]; let dependency_package = &self.pubgrub.package_store[dependency_package];
let (self_name, self_extra, self_dev) = match &**self_package { let (self_name, self_extra, self_group) = match &**self_package {
PubGrubPackageInner::Package { PubGrubPackageInner::Package {
name: self_name, name: self_name,
extra: self_extra, extra: self_extra,
dev: self_dev, group: self_group,
marker: _, marker: _,
} => (Some(self_name), self_extra.as_ref(), self_dev.as_ref()), } => (Some(self_name), self_extra.as_ref(), self_group.as_ref()),
PubGrubPackageInner::Root(_) => (None, None, None), PubGrubPackageInner::Root(_) => (None, None, None),
@ -3079,7 +3083,7 @@ impl ForkState {
PubGrubPackageInner::Package { PubGrubPackageInner::Package {
name: ref dependency_name, name: ref dependency_name,
extra: ref dependency_extra, extra: ref dependency_extra,
dev: ref dependency_dev, group: ref dependency_dev,
marker: ref dependency_marker, marker: ref dependency_marker,
} => { } => {
debug_assert!( debug_assert!(
@ -3093,7 +3097,7 @@ impl ForkState {
// Ignore self-dependencies (e.g., `tensorflow-macos` depends on `tensorflow-macos`), // Ignore self-dependencies (e.g., `tensorflow-macos` depends on `tensorflow-macos`),
// but allow groups to depend on other groups, or on the package itself. // but allow groups to depend on other groups, or on the package itself.
if self_dev.is_none() { if self_group.is_none() {
if self_name == Some(dependency_name) { if self_name == Some(dependency_name) {
continue; continue;
} }
@ -3107,13 +3111,13 @@ impl ForkState {
from_url: self_url.cloned(), from_url: self_url.cloned(),
from_index: self_index.cloned(), from_index: self_index.cloned(),
from_extra: self_extra.cloned(), from_extra: self_extra.cloned(),
from_dev: self_dev.cloned(), from_group: self_group.cloned(),
to: dependency_name.clone(), to: dependency_name.clone(),
to_version: dependency_version.clone(), to_version: dependency_version.clone(),
to_url: to_url.cloned(), to_url: to_url.cloned(),
to_index: to_index.cloned(), to_index: to_index.cloned(),
to_extra: dependency_extra.clone(), to_extra: dependency_extra.clone(),
to_dev: dependency_dev.clone(), to_group: dependency_dev.clone(),
marker: *dependency_marker, marker: *dependency_marker,
}; };
edges.push(edge); edges.push(edge);
@ -3125,7 +3129,7 @@ impl ForkState {
} => { } => {
// Ignore self-dependencies (e.g., `tensorflow-macos` depends on `tensorflow-macos`), // Ignore self-dependencies (e.g., `tensorflow-macos` depends on `tensorflow-macos`),
// but allow groups to depend on other groups, or on the package itself. // but allow groups to depend on other groups, or on the package itself.
if self_dev.is_none() { if self_group.is_none() {
if self_name == Some(dependency_name) { if self_name == Some(dependency_name) {
continue; continue;
} }
@ -3139,13 +3143,13 @@ impl ForkState {
from_url: self_url.cloned(), from_url: self_url.cloned(),
from_index: self_index.cloned(), from_index: self_index.cloned(),
from_extra: self_extra.cloned(), from_extra: self_extra.cloned(),
from_dev: self_dev.cloned(), from_group: self_group.cloned(),
to: dependency_name.clone(), to: dependency_name.clone(),
to_version: dependency_version.clone(), to_version: dependency_version.clone(),
to_url: to_url.cloned(), to_url: to_url.cloned(),
to_index: to_index.cloned(), to_index: to_index.cloned(),
to_extra: None, to_extra: None,
to_dev: None, to_group: None,
marker: *dependency_marker, marker: *dependency_marker,
}; };
edges.push(edge); edges.push(edge);
@ -3156,7 +3160,7 @@ impl ForkState {
extra: ref dependency_extra, extra: ref dependency_extra,
marker: ref dependency_marker, marker: ref dependency_marker,
} => { } => {
if self_dev.is_none() { if self_group.is_none() {
debug_assert!( debug_assert!(
self_name != Some(dependency_name), self_name != Some(dependency_name),
"Extras should be flattened" "Extras should be flattened"
@ -3171,13 +3175,13 @@ impl ForkState {
from_url: self_url.cloned(), from_url: self_url.cloned(),
from_index: self_index.cloned(), from_index: self_index.cloned(),
from_extra: self_extra.cloned(), from_extra: self_extra.cloned(),
from_dev: self_dev.cloned(), from_group: self_group.cloned(),
to: dependency_name.clone(), to: dependency_name.clone(),
to_version: dependency_version.clone(), to_version: dependency_version.clone(),
to_url: to_url.cloned(), to_url: to_url.cloned(),
to_index: to_index.cloned(), to_index: to_index.cloned(),
to_extra: Some(dependency_extra.clone()), to_extra: Some(dependency_extra.clone()),
to_dev: None, to_group: None,
marker: *dependency_marker, marker: *dependency_marker,
}; };
edges.push(edge); edges.push(edge);
@ -3189,21 +3193,21 @@ impl ForkState {
from_url: self_url.cloned(), from_url: self_url.cloned(),
from_index: self_index.cloned(), from_index: self_index.cloned(),
from_extra: self_extra.cloned(), from_extra: self_extra.cloned(),
from_dev: self_dev.cloned(), from_group: self_group.cloned(),
to: dependency_name.clone(), to: dependency_name.clone(),
to_version: dependency_version.clone(), to_version: dependency_version.clone(),
to_url: to_url.cloned(), to_url: to_url.cloned(),
to_index: to_index.cloned(), to_index: to_index.cloned(),
to_extra: None, to_extra: None,
to_dev: None, to_group: None,
marker: *dependency_marker, marker: *dependency_marker,
}; };
edges.push(edge); edges.push(edge);
} }
PubGrubPackageInner::Dev { PubGrubPackageInner::Group {
name: ref dependency_name, name: ref dependency_name,
dev: ref dependency_dev, group: ref dependency_group,
marker: ref dependency_marker, marker: ref dependency_marker,
} => { } => {
debug_assert!( debug_assert!(
@ -3221,13 +3225,13 @@ impl ForkState {
from_url: self_url.cloned(), from_url: self_url.cloned(),
from_index: self_index.cloned(), from_index: self_index.cloned(),
from_extra: self_extra.cloned(), from_extra: self_extra.cloned(),
from_dev: self_dev.cloned(), from_group: self_group.cloned(),
to: dependency_name.clone(), to: dependency_name.clone(),
to_version: dependency_version.clone(), to_version: dependency_version.clone(),
to_url: to_url.cloned(), to_url: to_url.cloned(),
to_index: to_index.cloned(), to_index: to_index.cloned(),
to_extra: None, to_extra: None,
to_dev: Some(dependency_dev.clone()), to_group: Some(dependency_group.clone()),
marker: *dependency_marker, marker: *dependency_marker,
}; };
edges.push(edge); edges.push(edge);
@ -3244,7 +3248,7 @@ impl ForkState {
if let PubGrubPackageInner::Package { if let PubGrubPackageInner::Package {
name, name,
extra, extra,
dev, group,
marker: MarkerTree::TRUE, marker: MarkerTree::TRUE,
} = &*self.pubgrub.package_store[package] } = &*self.pubgrub.package_store[package]
{ {
@ -3253,7 +3257,7 @@ impl ForkState {
ResolutionPackage { ResolutionPackage {
name: name.clone(), name: name.clone(),
extra: extra.clone(), extra: extra.clone(),
dev: dev.clone(), dev: group.clone(),
url: url.cloned(), url: url.cloned(),
index: index.cloned(), index: index.cloned(),
}, },
@ -3310,13 +3314,13 @@ pub(crate) struct ResolutionDependencyEdge {
pub(crate) from_url: Option<VerbatimParsedUrl>, pub(crate) from_url: Option<VerbatimParsedUrl>,
pub(crate) from_index: Option<IndexUrl>, pub(crate) from_index: Option<IndexUrl>,
pub(crate) from_extra: Option<ExtraName>, pub(crate) from_extra: Option<ExtraName>,
pub(crate) from_dev: Option<GroupName>, pub(crate) from_group: Option<GroupName>,
pub(crate) to: PackageName, pub(crate) to: PackageName,
pub(crate) to_version: Version, pub(crate) to_version: Version,
pub(crate) to_url: Option<VerbatimParsedUrl>, pub(crate) to_url: Option<VerbatimParsedUrl>,
pub(crate) to_index: Option<IndexUrl>, pub(crate) to_index: Option<IndexUrl>,
pub(crate) to_extra: Option<ExtraName>, pub(crate) to_extra: Option<ExtraName>,
pub(crate) to_dev: Option<GroupName>, pub(crate) to_group: Option<GroupName>,
pub(crate) marker: MarkerTree, pub(crate) marker: MarkerTree,
} }