@@ -85,6 +85,8 @@ pub enum PyPiRequirement {
85
85
version : VersionOrStar ,
86
86
#[ serde( default ) ]
87
87
extras : Vec < ExtraName > ,
88
+ #[ serde( default ) ]
89
+ index : Option < Url > ,
88
90
} ,
89
91
RawVersion ( VersionOrStar ) ,
90
92
}
@@ -138,6 +140,10 @@ struct RawPyPiRequirement {
138
140
139
141
// Git and Url only
140
142
pub subdirectory : Option < String > ,
143
+
144
+ // Pinned index
145
+ #[ serde( default ) ]
146
+ pub index : Option < Url > ,
141
147
}
142
148
143
149
impl < ' de > Deserialize < ' de > for PyPiRequirement {
@@ -186,18 +192,24 @@ impl<'de> Deserialize<'de> for PyPiRequirement {
186
192
) ) ) ;
187
193
}
188
194
189
- let req = match ( raw_req. url , raw_req. path , raw_req. git , raw_req. extras ) {
190
- ( Some ( url) , None , None , extras) => PyPiRequirement :: Url {
195
+ let req = match (
196
+ raw_req. url ,
197
+ raw_req. path ,
198
+ raw_req. git ,
199
+ raw_req. extras ,
200
+ raw_req. index ,
201
+ ) {
202
+ ( Some ( url) , None , None , extras, None ) => PyPiRequirement :: Url {
191
203
url,
192
204
extras,
193
205
subdirectory : raw_req. subdirectory ,
194
206
} ,
195
- ( None , Some ( path) , None , extras) => PyPiRequirement :: Path {
207
+ ( None , Some ( path) , None , extras, None ) => PyPiRequirement :: Path {
196
208
path,
197
209
editable : raw_req. editable ,
198
210
extras,
199
211
} ,
200
- ( None , None , Some ( git) , extras) => PyPiRequirement :: Git {
212
+ ( None , None , Some ( git) , extras, None ) => PyPiRequirement :: Git {
201
213
url : ParsedGitUrl {
202
214
git,
203
215
branch : raw_req. branch ,
@@ -207,13 +219,15 @@ impl<'de> Deserialize<'de> for PyPiRequirement {
207
219
} ,
208
220
extras,
209
221
} ,
210
- ( None , None , None , extras) => PyPiRequirement :: Version {
222
+ ( None , None , None , extras, index ) => PyPiRequirement :: Version {
211
223
version : raw_req. version . unwrap_or ( VersionOrStar :: Star ) ,
212
224
extras,
225
+ index,
213
226
} ,
214
- ( _, _, _, extras) if !extras. is_empty ( ) => PyPiRequirement :: Version {
227
+ ( _, _, _, extras, index ) if !extras. is_empty ( ) => PyPiRequirement :: Version {
215
228
version : raw_req. version . unwrap_or ( VersionOrStar :: Star ) ,
216
229
extras,
230
+ index,
217
231
} ,
218
232
_ => {
219
233
return Err ( serde_untagged:: de:: Error :: custom (
@@ -278,17 +292,35 @@ impl From<PyPiRequirement> for toml_edit::Value {
278
292
}
279
293
}
280
294
295
+ fn insert_index ( table : & mut toml_edit:: InlineTable , index : & Option < Url > ) {
296
+ if let Some ( index) = index {
297
+ table. insert (
298
+ "index" ,
299
+ toml_edit:: Value :: String ( toml_edit:: Formatted :: new ( index. to_string ( ) ) ) ,
300
+ ) ;
301
+ }
302
+ }
303
+
281
304
match & val {
282
- PyPiRequirement :: Version { version, extras } if extras. is_empty ( ) => {
305
+ PyPiRequirement :: Version {
306
+ version,
307
+ extras,
308
+ index,
309
+ } if extras. is_empty ( ) && index. is_none ( ) => {
283
310
toml_edit:: Value :: from ( version. to_string ( ) )
284
311
}
285
- PyPiRequirement :: Version { version, extras } => {
312
+ PyPiRequirement :: Version {
313
+ version,
314
+ extras,
315
+ index,
316
+ } => {
286
317
let mut table = toml_edit:: Table :: new ( ) . into_inline_table ( ) ;
287
318
table. insert (
288
319
"version" ,
289
320
toml_edit:: Value :: String ( toml_edit:: Formatted :: new ( version. to_string ( ) ) ) ,
290
321
) ;
291
322
insert_extras ( & mut table, extras) ;
323
+ insert_index ( & mut table, index) ;
292
324
toml_edit:: Value :: InlineTable ( table. to_owned ( ) )
293
325
}
294
326
PyPiRequirement :: Git {
@@ -423,6 +455,7 @@ impl TryFrom<pep508_rs::Requirement> for PyPiRequirement {
423
455
pep508_rs:: VersionOrUrl :: VersionSpecifier ( v) => PyPiRequirement :: Version {
424
456
version : v. into ( ) ,
425
457
extras : req. extras ,
458
+ index : None ,
426
459
} ,
427
460
pep508_rs:: VersionOrUrl :: Url ( u) => {
428
461
let url = u. to_url ( ) ;
@@ -494,6 +527,7 @@ impl TryFrom<pep508_rs::Requirement> for PyPiRequirement {
494
527
PyPiRequirement :: Version {
495
528
version : VersionOrStar :: Star ,
496
529
extras : req. extras ,
530
+ index : None ,
497
531
}
498
532
} else {
499
533
PyPiRequirement :: RawVersion ( VersionOrStar :: Star )
@@ -616,6 +650,7 @@ mod tests {
616
650
& PyPiRequirement :: Version {
617
651
version: ">=3.12" . parse( ) . unwrap( ) ,
618
652
extras: vec![ ExtraName :: from_str( "bar" ) . unwrap( ) ] ,
653
+ index: None ,
619
654
}
620
655
) ;
621
656
@@ -636,6 +671,7 @@ mod tests {
636
671
ExtraName :: from_str( "bar" ) . unwrap( ) ,
637
672
ExtraName :: from_str( "foo" ) . unwrap( ) ,
638
673
] ,
674
+ index: None ,
639
675
}
640
676
) ;
641
677
}
@@ -659,6 +695,7 @@ mod tests {
659
695
ExtraName :: from_str( "feature1" ) . unwrap( ) ,
660
696
ExtraName :: from_str( "feature2" ) . unwrap( )
661
697
] ,
698
+ index: None ,
662
699
}
663
700
) ;
664
701
}
0 commit comments