@@ -43,6 +43,9 @@ pub struct NewVersion {
43
43
pub struct TopVersions {
44
44
/// The "highest" version in terms of semver
45
45
pub highest : Option < semver:: Version > ,
46
+ /// The "highest" non-prerelease version, or, if only
47
+ /// prereleases exist, the "highest" version
48
+ pub highest_stable : Option < semver:: Version > ,
46
49
/// The "newest" version in terms of publishing date
47
50
pub newest : Option < semver:: Version > ,
48
51
}
@@ -61,9 +64,20 @@ impl TopVersions {
61
64
T : Clone + IntoIterator < Item = ( NaiveDateTime , semver:: Version ) > ,
62
65
{
63
66
let newest = pairs. clone ( ) . into_iter ( ) . max ( ) . map ( |( _, v) | v) ;
64
- let highest = pairs. into_iter ( ) . map ( |( _, v) | v) . max ( ) ;
67
+ let highest = pairs. clone ( ) . into_iter ( ) . map ( |( _, v) | v) . max ( ) ;
65
68
66
- Self { newest, highest }
69
+ let highest_stable = pairs
70
+ . into_iter ( )
71
+ . map ( |( _, v) | v)
72
+ . filter ( |v| !v. is_prerelease ( ) )
73
+ . max ( )
74
+ . or_else ( || highest. clone ( ) ) ;
75
+
76
+ Self {
77
+ newest,
78
+ highest,
79
+ highest_stable,
80
+ }
67
81
}
68
82
}
69
83
@@ -262,6 +276,7 @@ mod tests {
262
276
TopVersions :: from_date_version_pairs( versions) ,
263
277
TopVersions {
264
278
highest: None ,
279
+ highest_stable: None ,
265
280
newest: None ,
266
281
}
267
282
) ;
@@ -274,23 +289,39 @@ mod tests {
274
289
TopVersions :: from_date_version_pairs( versions) ,
275
290
TopVersions {
276
291
highest: Some ( version( "1.0.0" ) ) ,
292
+ highest_stable: Some ( version( "1.0.0" ) ) ,
277
293
newest: Some ( version( "1.0.0" ) ) ,
278
294
}
279
295
) ;
280
296
}
281
297
298
+ #[ test]
299
+ fn top_versions_prerelease ( ) {
300
+ let versions = vec ! [ ( date( "2020-12-03T12:34:56" ) , version( "1.0.0-beta.5" ) ) ] ;
301
+ assert_eq ! (
302
+ TopVersions :: from_date_version_pairs( versions) ,
303
+ TopVersions {
304
+ highest: Some ( version( "1.0.0-beta.5" ) ) ,
305
+ highest_stable: Some ( version( "1.0.0-beta.5" ) ) ,
306
+ newest: Some ( version( "1.0.0-beta.5" ) ) ,
307
+ }
308
+ ) ;
309
+ }
310
+
282
311
#[ test]
283
312
fn top_versions_multiple ( ) {
284
313
let versions = vec ! [
285
314
( date( "2018-12-03T12:34:56" ) , version( "1.0.0" ) ) ,
286
315
( date( "2019-12-03T12:34:56" ) , version( "2.0.0-alpha.1" ) ) ,
287
316
( date( "2020-12-03T12:34:56" ) , version( "1.1.0" ) ) ,
317
+ ( date( "2020-12-31T12:34:56" ) , version( "1.0.4" ) ) ,
288
318
] ;
289
319
assert_eq ! (
290
320
TopVersions :: from_date_version_pairs( versions) ,
291
321
TopVersions {
292
322
highest: Some ( version( "2.0.0-alpha.1" ) ) ,
293
- newest: Some ( version( "1.1.0" ) ) ,
323
+ highest_stable: Some ( version( "1.1.0" ) ) ,
324
+ newest: Some ( version( "1.0.4" ) ) ,
294
325
}
295
326
) ;
296
327
}
0 commit comments