Skip to content

Commit ee2eef3

Browse files
authored
Merge pull request #93 from steveklabnik/deprecation
Parse deprecated versions.
2 parents 68fb5ab + a3b67d6 commit ee2eef3

File tree

2 files changed

+57
-18
lines changed

2 files changed

+57
-18
lines changed

src/version_req.rs

Lines changed: 35 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,7 @@ use semver_parser;
1818

1919
use self::Op::{Ex, Gt, GtEq, Lt, LtEq, Tilde, Compatible, Wildcard};
2020
use self::WildcardVersion::{Major, Minor, Patch};
21-
use self::ReqParseError::{InvalidVersionRequirement, OpAlreadySet, InvalidSigil,
22-
VersionComponentsMustBeNumeric, InvalidIdentifier, MajorVersionRequired,
23-
UnimplementedVersionRequirement};
21+
use self::ReqParseError::*;
2422

2523
/// A `VersionReq` is a struct containing a list of predicates that can apply to ranges of version
2624
/// numbers. Matching operations can then be done with the `VersionReq` against a particular
@@ -100,7 +98,7 @@ impl From<semver_parser::range::Predicate> for Predicate {
10098

10199
/// A `ReqParseError` is returned from methods which parse a string into a `VersionReq`. Each
102100
/// enumeration is one of the possible errors that can occur.
103-
#[derive(Copy, Clone, Debug, PartialEq)]
101+
#[derive(Clone, Debug, PartialEq)]
104102
pub enum ReqParseError {
105103
/// The given version requirement is invalid.
106104
InvalidVersionRequirement,
@@ -116,6 +114,8 @@ pub enum ReqParseError {
116114
MajorVersionRequired,
117115
/// An unimplemented version requirement.
118116
UnimplementedVersionRequirement,
117+
/// This form of requirement is deprecated.
118+
DeprecatedVersionRequirement(VersionReq),
119119
}
120120

121121
impl fmt::Display for ReqParseError {
@@ -126,18 +126,19 @@ impl fmt::Display for ReqParseError {
126126

127127
impl Error for ReqParseError {
128128
fn description(&self) -> &str {
129-
match *self {
130-
InvalidVersionRequirement => "the given version requirement is invalid",
131-
OpAlreadySet => {
129+
match self {
130+
&InvalidVersionRequirement => "the given version requirement is invalid",
131+
&OpAlreadySet => {
132132
"you have already provided an operation, such as =, ~, or ^; only use one"
133-
}
134-
InvalidSigil => "the sigil you have written is not correct",
135-
VersionComponentsMustBeNumeric => "version components must be numeric",
136-
InvalidIdentifier => "invalid identifier",
137-
MajorVersionRequired => "at least a major version number is required",
138-
UnimplementedVersionRequirement => {
133+
},
134+
&InvalidSigil => "the sigil you have written is not correct",
135+
&VersionComponentsMustBeNumeric => "version components must be numeric",
136+
&InvalidIdentifier => "invalid identifier",
137+
&MajorVersionRequired => "at least a major version number is required",
138+
&UnimplementedVersionRequirement => {
139139
"the given version requirement is not implemented, yet"
140-
}
140+
},
141+
&DeprecatedVersionRequirement(_) => "This requirement is deprecated",
141142
}
142143
}
143144
}
@@ -200,10 +201,26 @@ impl VersionReq {
200201
pub fn parse(input: &str) -> Result<VersionReq, ReqParseError> {
201202
let res = semver_parser::range::parse(input);
202203

203-
match res {
204-
// Convert plain String error into proper ParseError
205-
Err(e) => Err(From::from(e)),
206-
Ok(v) => Ok(From::from(v)),
204+
if let Ok(v) = res {
205+
return Ok(From::from(v));
206+
}
207+
208+
return match VersionReq::parse_deprecated(input) {
209+
Some(v) => {
210+
Err(ReqParseError::DeprecatedVersionRequirement(v))
211+
}
212+
None => Err(From::from(res.err().unwrap())),
213+
}
214+
}
215+
216+
fn parse_deprecated(version: &str) -> Option<VersionReq> {
217+
return match version {
218+
".*" => Some(VersionReq::any()),
219+
"0.1.0." => Some(VersionReq::parse("0.1.0").unwrap()),
220+
"0.3.1.3" => Some(VersionReq::parse("0.3.13").unwrap()),
221+
"0.2*" => Some(VersionReq::parse("0.2.*").unwrap()),
222+
"*.0" => Some(VersionReq::any()),
223+
_ => None,
207224
}
208225
}
209226

tests/deprecation.rs

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
extern crate semver;
2+
3+
#[test]
4+
fn test_regressions() {
5+
use semver::VersionReq;
6+
use semver::ReqParseError;
7+
8+
let versions = vec![
9+
(".*", VersionReq::any()),
10+
("0.1.0.", VersionReq::parse("0.1.0").unwrap()),
11+
("0.3.1.3", VersionReq::parse("0.3.13").unwrap()),
12+
("0.2*", VersionReq::parse("0.2.*").unwrap()),
13+
("*.0", VersionReq::any()),
14+
];
15+
16+
for (version, requirement) in versions.into_iter() {
17+
let parsed = VersionReq::parse(version);
18+
let error = parsed.err().unwrap();
19+
20+
assert_eq!(ReqParseError::DeprecatedVersionRequirement(requirement), error);
21+
}
22+
}

0 commit comments

Comments
 (0)