From 273f34f03e17fe6fdc91f9bf02455246598def47 Mon Sep 17 00:00:00 2001 From: Martin Geisler Date: Sun, 28 Nov 2021 21:43:42 +0100 Subject: [PATCH] Move from deprecated `semver-parser` to `semver` Based on steveklabnik/semver-parser@dc6c1077899d, I gather that we should use `semver` going forward. --- Cargo.toml | 6 ++-- src/helpers.rs | 77 +++++++++++++++++++++----------------------- src/html_root_url.rs | 42 ++++++++++++------------ src/markdown_deps.rs | 20 ++++++------ 4 files changed, 69 insertions(+), 76 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 1f824a4..8823ece 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -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 } diff --git a/src/helpers.rs b/src/helpers.rs index aa7fc46..f5ca15e 100644 --- a/src/helpers.rs +++ b/src/helpers.rs @@ -45,25 +45,25 @@ 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 {}", @@ -71,7 +71,7 @@ pub fn version_matches_request( )); } } - if let Some(patch) = pred.patch { + if let Some(patch) = comparator.patch { if patch != version.patch { return Err(format!( "expected patch version {}, found {}", @@ -79,11 +79,10 @@ pub fn version_matches_request( )); } } - 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 )); } } @@ -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::*; @@ -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")) @@ -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")) @@ -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")) @@ -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\"")) diff --git a/src/html_root_url.rs b/src/html_root_url.rs index 5369c99..27e1bec 100644 --- a/src/html_root_url.rs +++ b/src/html_root_url.rs @@ -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; @@ -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)) } @@ -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))?; @@ -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(()) @@ -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(()) @@ -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(()) @@ -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\"")) @@ -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\"")) @@ -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")) @@ -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")) @@ -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")) @@ -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")) @@ -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")) @@ -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\"")) @@ -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" )) ); } diff --git a/src/markdown_deps.rs b/src/markdown_deps.rs index c36dc2d..a47e8af 100644 --- a/src/markdown_deps.rs +++ b/src/markdown_deps.rs @@ -1,8 +1,6 @@ #![cfg(feature = "markdown_deps_updated")] use pulldown_cmark::{CodeBlockKind::Fenced, Event, Parser, Tag}; -use semver_parser::range::parse as parse_request; -use semver_parser::range::VersionReq; -use semver_parser::version::parse as parse_version; +use semver::{Version, VersionReq}; use toml::Value; use crate::helpers::{indent, read_file, version_matches_request, Result}; @@ -34,7 +32,7 @@ fn extract_version_request(pkg_name: &str, block: &str) -> Result { .or_else(|| dep.as_str()) }); match version { - Some(version) => parse_request(version) + Some(version) => VersionReq::parse(version) .map_err(|err| format!("could not parse dependency: {}", err)), None => Err(format!("no dependency on {}", pkg_name)), } @@ -129,7 +127,7 @@ fn find_toml_blocks(text: &str) -> Vec { /// `stdout`. pub fn check_markdown_deps(path: &str, pkg_name: &str, pkg_version: &str) -> Result<()> { let text = 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))?; println!("Checking code blocks in {}...", path); @@ -246,7 +244,7 @@ mod tests { let block = "[dependencies]\n\ foobar = '1.5'"; let request = extract_version_request("foobar", block); - assert_eq!(request.unwrap(), parse_request("1.5").unwrap()); + assert_eq!(request.unwrap(), VersionReq::parse("1.5").unwrap()); } #[test] @@ -254,7 +252,7 @@ mod tests { let block = "[dependencies]\n\ foobar = { version = '1.5', default-features = false }"; let request = extract_version_request("foobar", block); - assert_eq!(request.unwrap(), parse_request("1.5").unwrap()); + assert_eq!(request.unwrap(), VersionReq::parse("1.5").unwrap()); } #[test] @@ -264,7 +262,7 @@ mod tests { let block = "[dependencies]\n\ foobar = { git = 'https://example.net/foobar.git' }"; let request = extract_version_request("foobar", block); - assert_eq!(request.unwrap(), parse_request("*").unwrap()); + assert_eq!(request.unwrap(), VersionReq::parse("*").unwrap()); } #[test] @@ -272,7 +270,7 @@ mod tests { let block = "[dev-dependencies]\n\ foobar = '1.5'"; let request = extract_version_request("foobar", block); - assert_eq!(request.unwrap(), parse_request("1.5").unwrap()); + assert_eq!(request.unwrap(), VersionReq::parse("1.5").unwrap()); } #[test] @@ -283,7 +281,7 @@ mod tests { assert_eq!( request.unwrap_err(), "could not parse dependency: \ - encountered unexpected token: AlphaNumeric(\"bad\")" + unexpected character 'b' while parsing patch version number" ); } @@ -333,7 +331,7 @@ mod tests { assert_eq!( check_markdown_deps("README.md", "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" )) ); }