@@ -3,8 +3,10 @@ use crate::Metadata;
33
44use std:: collections:: BTreeMap ;
55use std:: path:: Path ;
6+ use std:: str:: FromStr ;
67use uv_configuration:: SourceStrategy ;
78use uv_normalize:: { ExtraName , GroupName , PackageName , DEV_DEPENDENCIES } ;
9+ use uv_pypi_types:: VerbatimParsedUrl ;
810use uv_workspace:: pyproject:: ToolUvSources ;
911use uv_workspace:: { DiscoveryOptions , ProjectWorkspace } ;
1012
@@ -72,7 +74,7 @@ impl RequiresDist {
7274 } ;
7375
7476 let dev_dependencies = {
75- let dev_dependencies = project_workspace
77+ let dev_dependencies: Vec < _ > = project_workspace
7678 . current_project ( )
7779 . pyproject_toml ( )
7880 . tool
@@ -81,36 +83,77 @@ impl RequiresDist {
8183 . and_then ( |uv| uv. dev_dependencies . as_ref ( ) )
8284 . into_iter ( )
8385 . flatten ( )
84- . cloned ( ) ;
85- let dev_dependencies = match source_strategy {
86- SourceStrategy :: Enabled => dev_dependencies
87- . flat_map ( |requirement| {
88- let requirement_name = requirement. name . clone ( ) ;
89- LoweredRequirement :: from_requirement (
90- requirement,
91- & metadata. name ,
92- project_workspace. project_root ( ) ,
93- sources,
94- project_workspace. workspace ( ) ,
95- )
96- . map ( move |requirement| match requirement {
97- Ok ( requirement) => Ok ( requirement. into_inner ( ) ) ,
98- Err ( err) => {
99- Err ( MetadataError :: LoweringError ( requirement_name. clone ( ) , err) )
100- }
101- } )
102- } )
103- . collect :: < Result < Vec < _ > , _ > > ( ) ?,
104- SourceStrategy :: Disabled => dev_dependencies
105- . into_iter ( )
106- . map ( uv_pypi_types:: Requirement :: from)
107- . collect ( ) ,
108- } ;
109- if dev_dependencies. is_empty ( ) {
110- BTreeMap :: default ( )
111- } else {
112- BTreeMap :: from ( [ ( DEV_DEPENDENCIES . clone ( ) , dev_dependencies) ] )
113- }
86+ . cloned ( )
87+ . collect ( ) ;
88+
89+ let dependency_groups = project_workspace
90+ . current_project ( )
91+ . pyproject_toml ( )
92+ . dependency_groups
93+ . iter ( )
94+ . flatten ( )
95+ . map ( |( name, requirements) | {
96+ (
97+ name. clone ( ) ,
98+ requirements
99+ . iter ( )
100+ . map ( |requirement| {
101+ match uv_pep508:: Requirement :: < VerbatimParsedUrl > :: from_str (
102+ requirement,
103+ ) {
104+ Ok ( requirement) => Ok ( requirement) ,
105+ Err ( err) => Err ( MetadataError :: GroupRequirementError (
106+ name. clone ( ) ,
107+ requirement. clone ( ) ,
108+ Box :: new ( err) ,
109+ ) ) ,
110+ }
111+ } )
112+ . collect :: < Result < Vec < _ > , _ > > ( ) ,
113+ )
114+ } )
115+ . chain ( std:: iter:: once ( (
116+ DEV_DEPENDENCIES . clone ( ) ,
117+ Ok ( dev_dependencies) ,
118+ ) ) )
119+ . map ( |( name, requirements) | {
120+ let requirements = match requirements {
121+ Ok ( requirements) => match source_strategy {
122+ SourceStrategy :: Enabled => requirements
123+ . into_iter ( )
124+ . flat_map ( |requirement| {
125+ let requirement_name = requirement. name . clone ( ) ;
126+ LoweredRequirement :: from_requirement (
127+ requirement,
128+ & metadata. name ,
129+ project_workspace. project_root ( ) ,
130+ sources,
131+ project_workspace. workspace ( ) ,
132+ )
133+ . map ( move |requirement| {
134+ match requirement {
135+ Ok ( requirement) => Ok ( requirement. into_inner ( ) ) ,
136+ Err ( err) => Err ( MetadataError :: LoweringError (
137+ requirement_name. clone ( ) ,
138+ err,
139+ ) ) ,
140+ }
141+ } )
142+ } )
143+ . collect :: < Result < Vec < _ > , _ > > ( ) ,
144+ SourceStrategy :: Disabled => Ok ( requirements
145+ . into_iter ( )
146+ . map ( uv_pypi_types:: Requirement :: from)
147+ . collect ( ) ) ,
148+ } ,
149+ Err ( err) => Err ( err) ,
150+ } ;
151+ // TODO(zanieb): Rewrite this to raise the error correctly
152+ ( name, requirements. unwrap ( ) )
153+ } )
154+ . collect :: < BTreeMap < _ , _ > > ( ) ;
155+
156+ dependency_groups
114157 } ;
115158
116159 let requires_dist = metadata. requires_dist . into_iter ( ) ;
0 commit comments