Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -13,13 +13,13 @@ edition = "2018"

[features]
default = ["markdown_deps_updated", "html_root_url_updated", "contains_regex"]
markdown_deps_updated = ["pulldown-cmark", "semver-parser", "toml"]
html_root_url_updated = ["url", "semver-parser", "syn", "proc-macro2"]
markdown_deps_updated = ["pulldown-cmark", "semver", "toml"]
html_root_url_updated = ["url", "semver", "syn", "proc-macro2"]
contains_regex = ["regex"]

[dependencies]
pulldown-cmark = { version = "0.8", default-features = false, optional = true }
semver-parser = { version = "0.9", optional = true }
semver = { version = "1.0", optional = true }
syn = { version = "1.0", default-features = false, features = ["parsing", "printing", "full"], optional = true }
proc-macro2 = { version = "1.0", default-features = false, features = ["span-locations"], optional = true }
toml = { version = "0.5", optional = true }
Expand Down
77 changes: 37 additions & 40 deletions src/helpers.rs
Original file line number Diff line number Diff line change
Expand Up @@ -45,45 +45,44 @@ pub fn indent(text: &str) -> String {
/// Verify that the version range request matches the given version.
#[cfg(any(feature = "html_root_url_updated", feature = "markdown_deps_updated"))]
pub fn version_matches_request(
version: &semver_parser::version::Version,
request: &semver_parser::range::VersionReq,
version: &semver::Version,
request: &semver::VersionReq,
) -> Result<()> {
use semver_parser::range::Op;
if request.predicates.len() != 1 {
use semver::Op;
if request.comparators.len() != 1 {
// Can only handle simple dependencies
return Ok(());
}

let pred = &request.predicates[0];
match pred.op {
Op::Tilde | Op::Compatible => {
if pred.major != version.major {
let comparator = &request.comparators[0];
match comparator.op {
Op::Tilde | Op::Caret => {
if comparator.major != version.major {
return Err(format!(
"expected major version {}, found {}",
version.major, pred.major,
version.major, comparator.major,
));
}
if let Some(minor) = pred.minor {
if let Some(minor) = comparator.minor {
if minor != version.minor {
return Err(format!(
"expected minor version {}, found {}",
version.minor, minor
));
}
}
if let Some(patch) = pred.patch {
if let Some(patch) = comparator.patch {
if patch != version.patch {
return Err(format!(
"expected patch version {}, found {}",
version.patch, patch
));
}
}
if pred.pre != version.pre {
if comparator.pre != version.pre {
return Err(format!(
"expected pre-release {:?}, found {:?}",
join(&version.pre, "."),
join(&pred.pre, ".")
"expected pre-release \"{}\", found \"{}\"",
version.pre, comparator.pre
));
}
}
Expand All @@ -96,9 +95,7 @@ pub fn version_matches_request(
#[cfg(test)]
mod tests {
#[cfg(any(feature = "html_root_url_updated", feature = "markdown_deps_updated"))]
use semver_parser::range::parse as parse_request;
#[cfg(any(feature = "html_root_url_updated", feature = "markdown_deps_updated"))]
use semver_parser::version::parse as parse_version;
use semver::{Version, VersionReq};

#[cfg(any(feature = "html_root_url_updated", feature = "markdown_deps_updated"))]
use super::*;
Expand All @@ -109,57 +106,57 @@ mod tests {

#[test]
fn implicit_compatible() {
let version = parse_version("1.2.3").unwrap();
let request = parse_request("1.2.3").unwrap();
let version = Version::parse("1.2.3").unwrap();
let request = VersionReq::parse("1.2.3").unwrap();
assert_eq!(version_matches_request(&version, &request), Ok(()));
}

#[test]
fn compatible() {
let version = parse_version("1.2.3").unwrap();
let request = parse_request("^1.2.3").unwrap();
let version = Version::parse("1.2.3").unwrap();
let request = VersionReq::parse("^1.2.3").unwrap();
assert_eq!(version_matches_request(&version, &request), Ok(()));
}

#[test]
fn tilde() {
let version = parse_version("1.2.3").unwrap();
let request = parse_request("~1.2.3").unwrap();
let version = Version::parse("1.2.3").unwrap();
let request = VersionReq::parse("~1.2.3").unwrap();
assert_eq!(version_matches_request(&version, &request), Ok(()));
}

#[test]
fn no_patch() {
let version = parse_version("1.2.3").unwrap();
let request = parse_request("1.2").unwrap();
let version = Version::parse("1.2.3").unwrap();
let request = VersionReq::parse("1.2").unwrap();
assert_eq!(version_matches_request(&version, &request), Ok(()));
}

#[test]
fn no_minor() {
let version = parse_version("1.2.3").unwrap();
let request = parse_request("1").unwrap();
let version = Version::parse("1.2.3").unwrap();
let request = VersionReq::parse("1").unwrap();
assert_eq!(version_matches_request(&version, &request), Ok(()));
}

#[test]
fn multiple_predicates() {
let version = parse_version("1.2.3").unwrap();
let request = parse_request(">= 1.2.3, < 2.0").unwrap();
let version = Version::parse("1.2.3").unwrap();
let request = VersionReq::parse(">= 1.2.3, < 2.0").unwrap();
assert_eq!(version_matches_request(&version, &request), Ok(()));
}

#[test]
fn unhandled_operator() {
let version = parse_version("1.2.3").unwrap();
let request = parse_request("< 2.0").unwrap();
let version = Version::parse("1.2.3").unwrap();
let request = VersionReq::parse("< 2.0").unwrap();
assert_eq!(version_matches_request(&version, &request), Ok(()));
}

#[test]
fn bad_major() {
let version = parse_version("2.0.0").unwrap();
let request = parse_request("1.2.3").unwrap();
let version = Version::parse("2.0.0").unwrap();
let request = VersionReq::parse("1.2.3").unwrap();
assert_eq!(
version_matches_request(&version, &request),
Err(String::from("expected major version 2, found 1"))
Expand All @@ -168,8 +165,8 @@ mod tests {

#[test]
fn bad_minor() {
let version = parse_version("1.3.0").unwrap();
let request = parse_request("1.2.3").unwrap();
let version = Version::parse("1.3.0").unwrap();
let request = VersionReq::parse("1.2.3").unwrap();
assert_eq!(
version_matches_request(&version, &request),
Err(String::from("expected minor version 3, found 2"))
Expand All @@ -178,8 +175,8 @@ mod tests {

#[test]
fn bad_patch() {
let version = parse_version("1.2.4").unwrap();
let request = parse_request("1.2.3").unwrap();
let version = Version::parse("1.2.4").unwrap();
let request = VersionReq::parse("1.2.3").unwrap();
assert_eq!(
version_matches_request(&version, &request),
Err(String::from("expected patch version 4, found 3"))
Expand All @@ -188,8 +185,8 @@ mod tests {

#[test]
fn bad_pre_release() {
let version = parse_version("1.2.3-rc2").unwrap();
let request = parse_request("1.2.3-rc1").unwrap();
let version = Version::parse("1.2.3-rc2").unwrap();
let request = VersionReq::parse("1.2.3-rc1").unwrap();
assert_eq!(
version_matches_request(&version, &request),
Err(String::from("expected pre-release \"rc2\", found \"rc1\""))
Expand Down
42 changes: 20 additions & 22 deletions src/html_root_url.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
#![cfg(feature = "html_root_url_updated")]
use semver_parser::range::parse as parse_request;
use semver_parser::version::parse as parse_version;
use semver_parser::version::Version;
use semver::{Version, VersionReq};
use syn::spanned::Spanned;
use url::Url;

Expand Down Expand Up @@ -51,7 +49,7 @@ fn url_matches(value: &str, pkg_name: &str, version: &Version) -> Result<()> {
//
// [1]: https://rust-lang-nursery.github.io/api-guidelines/documentation.html
// #crate-sets-html_root_url-attribute-c-html-root
parse_request(request)
VersionReq::parse(request)
.map_err(|err| format!("could not parse version in URL: {}", err))
.and_then(|request| version_matches_request(version, &request))
}
Expand All @@ -71,7 +69,7 @@ fn url_matches(value: &str, pkg_name: &str, version: &Version) -> Result<()> {
/// printed on `stdout`.
pub fn check_html_root_url(path: &str, pkg_name: &str, pkg_version: &str) -> Result<()> {
let code = read_file(path).map_err(|err| format!("could not read {}: {}", path, err))?;
let version = parse_version(pkg_version)
let version = Version::parse(pkg_version)
.map_err(|err| format!("bad package version {:?}: {}", pkg_version, err))?;
let krate: syn::File = syn::parse_file(&code)
.map_err(|_| format!("could not parse {}: please run \"cargo build\"", path))?;
Expand Down Expand Up @@ -150,7 +148,7 @@ mod test_url_matches {

#[test]
fn good_url() {
let ver = parse_version("1.2.3").unwrap();
let ver = Version::parse("1.2.3").unwrap();
assert_eq!(
url_matches("https://docs.rs/foo/1.2.3", "foo", &ver),
Ok(())
Expand All @@ -159,7 +157,7 @@ mod test_url_matches {

#[test]
fn trailing_slash() {
let ver = parse_version("1.2.3").unwrap();
let ver = Version::parse("1.2.3").unwrap();
assert_eq!(
url_matches("https://docs.rs/foo/1.2.3/", "foo", &ver),
Ok(())
Expand All @@ -168,25 +166,25 @@ mod test_url_matches {

#[test]
fn without_patch() {
let ver = parse_version("1.2.3").unwrap();
let ver = Version::parse("1.2.3").unwrap();
assert_eq!(url_matches("https://docs.rs/foo/1.2", "foo", &ver), Ok(()));
}

#[test]
fn without_minor() {
let ver = parse_version("1.2.3").unwrap();
let ver = Version::parse("1.2.3").unwrap();
assert_eq!(url_matches("https://docs.rs/foo/1", "foo", &ver), Ok(()));
}

#[test]
fn different_domain() {
let ver = parse_version("1.2.3").unwrap();
let ver = Version::parse("1.2.3").unwrap();
assert_eq!(url_matches("https://example.net/foo/", "bar", &ver), Ok(()));
}

#[test]
fn different_domain_http() {
let ver = parse_version("1.2.3").unwrap();
let ver = Version::parse("1.2.3").unwrap();
assert_eq!(
url_matches("http://example.net/foo/1.2.3", "foo", &ver),
Ok(())
Expand All @@ -195,7 +193,7 @@ mod test_url_matches {

#[test]
fn http_url() {
let ver = parse_version("1.2.3").unwrap();
let ver = Version::parse("1.2.3").unwrap();
assert_eq!(
url_matches("http://docs.rs/foo/1.2.3", "foo", &ver),
Err(String::from("expected \"https\", found \"http\""))
Expand All @@ -204,7 +202,7 @@ mod test_url_matches {

#[test]
fn bad_scheme() {
let ver = parse_version("1.2.3").unwrap();
let ver = Version::parse("1.2.3").unwrap();
assert_eq!(
url_matches("mailto:foo@example.net", "foo", &ver),
Err(String::from("expected \"https\", found \"mailto\""))
Expand All @@ -213,7 +211,7 @@ mod test_url_matches {

#[test]
fn no_package() {
let ver = parse_version("1.2.3").unwrap();
let ver = Version::parse("1.2.3").unwrap();
assert_eq!(
url_matches("https://docs.rs", "foo", &ver),
Err(String::from("missing package name"))
Expand All @@ -222,7 +220,7 @@ mod test_url_matches {

#[test]
fn no_package_trailing_slash() {
let ver = parse_version("1.2.3").unwrap();
let ver = Version::parse("1.2.3").unwrap();
assert_eq!(
url_matches("https://docs.rs/", "foo", &ver),
Err(String::from("missing package name"))
Expand All @@ -231,7 +229,7 @@ mod test_url_matches {

#[test]
fn no_version() {
let ver = parse_version("1.2.3").unwrap();
let ver = Version::parse("1.2.3").unwrap();
assert_eq!(
url_matches("https://docs.rs/foo", "foo", &ver),
Err(String::from("missing version number"))
Expand All @@ -240,7 +238,7 @@ mod test_url_matches {

#[test]
fn no_version_trailing_slash() {
let ver = parse_version("1.2.3").unwrap();
let ver = Version::parse("1.2.3").unwrap();
assert_eq!(
url_matches("https://docs.rs/foo/", "foo", &ver),
Err(String::from("missing version number"))
Expand All @@ -249,7 +247,7 @@ mod test_url_matches {

#[test]
fn bad_url() {
let ver = parse_version("1.2.3").unwrap();
let ver = Version::parse("1.2.3").unwrap();
assert_eq!(
url_matches("docs.rs/foo/bar", "foo", &ver),
Err(String::from("parse error: relative URL without a base"))
Expand All @@ -258,19 +256,19 @@ mod test_url_matches {

#[test]
fn bad_pkg_version() {
let ver = parse_version("1.2.3").unwrap();
let ver = Version::parse("1.2.3").unwrap();
assert_eq!(
url_matches("https://docs.rs/foo/1.2.bad/", "foo", &ver),
Err(String::from(
"could not parse version in URL: \
encountered unexpected token: AlphaNumeric(\"bad\")"
unexpected character 'b' while parsing patch version number"
))
);
}

#[test]
fn wrong_pkg_name() {
let ver = parse_version("1.2.3").unwrap();
let ver = Version::parse("1.2.3").unwrap();
assert_eq!(
url_matches("https://docs.rs/foo/1.2.3/", "bar", &ver),
Err(String::from("expected package \"bar\", found \"foo\""))
Expand Down Expand Up @@ -302,7 +300,7 @@ mod test_check_html_root_url {
assert_eq!(
check_html_root_url("src/lib.rs", "foobar", "1.2"),
Err(String::from(
"bad package version \"1.2\": expected more input"
"bad package version \"1.2\": unexpected end of input while parsing minor version number"
))
);
}
Expand Down
Loading