Skip to content

Commit 8e40279

Browse files
authored
Merge pull request #92 from nymtech/feature/semver-client
Feature/semver client
2 parents d34907e + 65f5683 commit 8e40279

File tree

6 files changed

+86
-6
lines changed

6 files changed

+86
-6
lines changed

Cargo.lock

+8
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

common/topology/Cargo.toml

+1
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ serde = { version = "1.0.104", features = ["derive"] }
1616

1717
## internal
1818
addressing = {path = "../addressing"}
19+
version-checker = {path = "../version-checker" }
1920

2021
## will be moved to proper dependencies once released
2122
sphinx = { git = "https://github.com/nymtech/sphinx", rev="1d8cefcb6a0cb8e87d00d89eb1ccf2839e92aa1f" }

common/topology/src/lib.rs

+13-6
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ use sphinx::route::{Node as SphinxNode, NodeAddressBytes};
66
use std::cmp::max;
77
use std::collections::HashMap;
88
use std::net::SocketAddr;
9+
use version_checker;
910

1011
#[derive(Debug, Clone)]
1112
pub struct MixNode {
@@ -167,27 +168,33 @@ pub trait NymTopology: Sized {
167168

168169
fn filter_node_versions(
169170
&self,
170-
mix_version: &str,
171-
provider_version: &str,
172-
coco_version: &str,
171+
expected_mix_version: &str,
172+
expected_provider_version: &str,
173+
expected_coco_version: &str,
173174
) -> Self {
174175
let filtered_mixes = self
175176
.get_mix_nodes()
176177
.iter()
178+
.filter(|mix_node| {
179+
version_checker::is_compatible(&mix_node.version, expected_mix_version)
180+
})
177181
.cloned()
178-
.filter(|mix_node| mix_node.version == mix_version)
179182
.collect();
180183
let filtered_providers = self
181184
.get_mix_provider_nodes()
182185
.iter()
186+
.filter(|provider_node| {
187+
version_checker::is_compatible(&provider_node.version, expected_provider_version)
188+
})
183189
.cloned()
184-
.filter(|provider_node| provider_node.version == provider_version)
185190
.collect();
186191
let filtered_coco_nodes = self
187192
.get_coco_nodes()
188193
.iter()
194+
.filter(|coco_node| {
195+
version_checker::is_compatible(&coco_node.version, expected_coco_version)
196+
})
189197
.cloned()
190-
.filter(|coco_node| coco_node.version == coco_version)
191198
.collect();
192199

193200
Self::new_from_nodes(filtered_mixes, filtered_providers, filtered_coco_nodes)

common/version-checker/.gitignore

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
/target
2+
**/*.rs.bk
3+
Cargo.lock

common/version-checker/Cargo.toml

+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
[package]
2+
name = "version-checker"
3+
version = "0.1.0"
4+
authors = ["Dave Hrycyszyn <futurechimp@users.noreply.github.com>"]
5+
edition = "2018"
6+
7+
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
8+
9+
[dependencies]
10+
semver = "0.9.0"

common/version-checker/src/lib.rs

+51
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
use semver::Version;
2+
use semver::VersionReq;
3+
4+
/// Checks whether given `version` is compatible with a given semantic
5+
/// version requirement `req` according to major-minor semver rules.
6+
/// The semantic version requirement can be passed as a full, concrete version
7+
/// number, because that's what we'll have in our Cargo.toml files (e.g. 0.3.2).
8+
/// The patch number in the requirement will be dropped and replaced with a wildcard (0.3.*) as all minor versions should be compatible with each other.
9+
pub fn is_compatible(version: &str, req: &str) -> bool {
10+
let version = Version::parse(version).unwrap();
11+
let tmp = Version::parse(req).unwrap();
12+
let wildcard = format!("{}.{}.*", tmp.major, tmp.minor).to_string();
13+
let semver_requirement = VersionReq::parse(&wildcard).unwrap();
14+
15+
semver_requirement.matches(&version)
16+
}
17+
18+
#[cfg(test)]
19+
mod tests {
20+
use super::*;
21+
22+
#[test]
23+
fn version_0_3_0_is_compatible_with_requirement_0_3_x() {
24+
assert!(is_compatible("0.3.0", "0.3.2"));
25+
}
26+
27+
#[test]
28+
fn version_0_3_1_is_compatible_with_minimum_requirement_0_3_x() {
29+
assert!(is_compatible("0.3.1", "0.3.2"));
30+
}
31+
32+
#[test]
33+
fn version_0_3_2_is_compatible_with_minimum_requirement_0_3_x() {
34+
assert!(is_compatible("0.3.2", "0.3.0"));
35+
}
36+
37+
#[test]
38+
fn version_0_2_0_is_not_compatible_with_requirement_0_3_x() {
39+
assert!(!is_compatible("0.2.0", "0.3.2"));
40+
}
41+
42+
#[test]
43+
fn version_0_4_0_is_not_compatible_with_requirement_0_3_x() {
44+
assert!(!is_compatible("0.4.0", "0.3.2"));
45+
}
46+
47+
#[test]
48+
fn version_1_3_2_is_not_compatible_with_requirement_0_3_x() {
49+
assert!(!is_compatible("1.3.2", "0.3.2"));
50+
}
51+
}

0 commit comments

Comments
 (0)