Skip to content

Commit ad7f729

Browse files
committed
models/version: Implement highest_stable field
1 parent beb6b13 commit ad7f729

File tree

1 file changed

+34
-3
lines changed

1 file changed

+34
-3
lines changed

src/models/version.rs

+34-3
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,9 @@ pub struct NewVersion {
4343
pub struct TopVersions {
4444
/// The "highest" version in terms of semver
4545
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>,
4649
/// The "newest" version in terms of publishing date
4750
pub newest: Option<semver::Version>,
4851
}
@@ -61,9 +64,20 @@ impl TopVersions {
6164
T: Clone + IntoIterator<Item = (NaiveDateTime, semver::Version)>,
6265
{
6366
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();
6568

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+
}
6781
}
6882
}
6983

@@ -262,6 +276,7 @@ mod tests {
262276
TopVersions::from_date_version_pairs(versions),
263277
TopVersions {
264278
highest: None,
279+
highest_stable: None,
265280
newest: None,
266281
}
267282
);
@@ -274,23 +289,39 @@ mod tests {
274289
TopVersions::from_date_version_pairs(versions),
275290
TopVersions {
276291
highest: Some(version("1.0.0")),
292+
highest_stable: Some(version("1.0.0")),
277293
newest: Some(version("1.0.0")),
278294
}
279295
);
280296
}
281297

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+
282311
#[test]
283312
fn top_versions_multiple() {
284313
let versions = vec![
285314
(date("2018-12-03T12:34:56"), version("1.0.0")),
286315
(date("2019-12-03T12:34:56"), version("2.0.0-alpha.1")),
287316
(date("2020-12-03T12:34:56"), version("1.1.0")),
317+
(date("2020-12-31T12:34:56"), version("1.0.4")),
288318
];
289319
assert_eq!(
290320
TopVersions::from_date_version_pairs(versions),
291321
TopVersions {
292322
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")),
294325
}
295326
);
296327
}

0 commit comments

Comments
 (0)