Add semver_matches
function (#1713)
This commit is contained in:
parent
e01dbda156
commit
64d7d07185
7
Cargo.lock
generated
7
Cargo.lock
generated
@ -337,6 +337,7 @@ dependencies = [
|
|||||||
"num_cpus",
|
"num_cpus",
|
||||||
"pretty_assertions",
|
"pretty_assertions",
|
||||||
"regex",
|
"regex",
|
||||||
|
"semver",
|
||||||
"serde",
|
"serde",
|
||||||
"serde_json",
|
"serde_json",
|
||||||
"sha2",
|
"sha2",
|
||||||
@ -573,6 +574,12 @@ version = "1.0.15"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741"
|
checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "semver"
|
||||||
|
version = "1.0.20"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "836fa6a3e1e547f9a2c4040802ec865b5d85f4014efe00555d7090a3dcaa1090"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "serde"
|
name = "serde"
|
||||||
version = "1.0.188"
|
version = "1.0.188"
|
||||||
|
@ -33,6 +33,7 @@ libc = "0.2.0"
|
|||||||
log = "0.4.4"
|
log = "0.4.4"
|
||||||
num_cpus = "1.15.0"
|
num_cpus = "1.15.0"
|
||||||
regex = "1.5.4"
|
regex = "1.5.4"
|
||||||
|
semver = "1.0.20"
|
||||||
serde = { version = "1.0.130", features = ["derive", "rc"] }
|
serde = { version = "1.0.130", features = ["derive", "rc"] }
|
||||||
serde_json = "1.0.68"
|
serde_json = "1.0.68"
|
||||||
sha2 = "0.10"
|
sha2 = "0.10"
|
||||||
|
@ -1241,6 +1241,10 @@ These functions can fail, for example if a path does not have an extension, whic
|
|||||||
- `sha256_file(path)` - Return the SHA-256 hash of the file at `path` as a hexadecimal string.
|
- `sha256_file(path)` - Return the SHA-256 hash of the file at `path` as a hexadecimal string.
|
||||||
- `uuid()` - Return a randomly generated UUID.
|
- `uuid()` - Return a randomly generated UUID.
|
||||||
|
|
||||||
|
#### Semantic Versions
|
||||||
|
|
||||||
|
- `semver_matches(version, requirement)`<sup>master</sup> - Check whether a [semantic `version`](https://semver.org), e.g., `"0.1.0"` matches a `requirement`, e.g., `">=0.1.0"`, returning `"true"` if so and `"false"` otherwise.
|
||||||
|
|
||||||
### Recipe Attributes
|
### Recipe Attributes
|
||||||
|
|
||||||
Recipes may be annotated with attributes that change their behavior.
|
Recipes may be annotated with attributes that change their behavior.
|
||||||
|
@ -4,6 +4,7 @@ use {
|
|||||||
ToKebabCase, ToLowerCamelCase, ToShoutyKebabCase, ToShoutySnakeCase, ToSnakeCase, ToTitleCase,
|
ToKebabCase, ToLowerCamelCase, ToShoutyKebabCase, ToShoutySnakeCase, ToSnakeCase, ToTitleCase,
|
||||||
ToUpperCamelCase,
|
ToUpperCamelCase,
|
||||||
},
|
},
|
||||||
|
semver::{Version, VersionReq},
|
||||||
Function::*,
|
Function::*,
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -46,6 +47,7 @@ pub(crate) fn get(name: &str) -> Option<Function> {
|
|||||||
"quote" => Unary(quote),
|
"quote" => Unary(quote),
|
||||||
"replace" => Ternary(replace),
|
"replace" => Ternary(replace),
|
||||||
"replace_regex" => Ternary(replace_regex),
|
"replace_regex" => Ternary(replace_regex),
|
||||||
|
"semver_matches" => Binary(semver_matches),
|
||||||
"sha256" => Unary(sha256),
|
"sha256" => Unary(sha256),
|
||||||
"sha256_file" => Unary(sha256_file),
|
"sha256_file" => Unary(sha256_file),
|
||||||
"shoutykebabcase" => Unary(shoutykebabcase),
|
"shoutykebabcase" => Unary(shoutykebabcase),
|
||||||
@ -411,3 +413,23 @@ fn without_extension(_context: &FunctionContext, path: &str) -> Result<String, S
|
|||||||
|
|
||||||
Ok(parent.join(file_stem).to_string())
|
Ok(parent.join(file_stem).to_string())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Check whether a string processes properly as semver (e.x. "0.1.0")
|
||||||
|
/// and matches a given semver requirement (e.x. ">=0.1.0")
|
||||||
|
fn semver_matches(
|
||||||
|
_context: &FunctionContext,
|
||||||
|
version: &str,
|
||||||
|
requirement: &str,
|
||||||
|
) -> Result<String, String> {
|
||||||
|
Ok(
|
||||||
|
requirement
|
||||||
|
.parse::<VersionReq>()
|
||||||
|
.map_err(|err| format!("invalid semver requirement: {err}"))?
|
||||||
|
.matches(
|
||||||
|
&version
|
||||||
|
.parse::<Version>()
|
||||||
|
.map_err(|err| format!("invalid semver version: {err}"))?,
|
||||||
|
)
|
||||||
|
.to_string(),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
@ -412,6 +412,21 @@ test! {
|
|||||||
stderr: "echo Bar\n",
|
stderr: "echo Bar\n",
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn semver_matches() {
|
||||||
|
Test::new()
|
||||||
|
.justfile(
|
||||||
|
"
|
||||||
|
foo:
|
||||||
|
echo {{ semver_matches('0.1.0', '>=0.1.0') }}
|
||||||
|
echo {{ semver_matches('0.1.0', '=0.0.1') }}
|
||||||
|
",
|
||||||
|
)
|
||||||
|
.stdout("true\nfalse\n")
|
||||||
|
.stderr("echo true\necho false\n")
|
||||||
|
.run();
|
||||||
|
}
|
||||||
|
|
||||||
fn assert_eval_eq(expression: &str, result: &str) {
|
fn assert_eval_eq(expression: &str, result: &str) {
|
||||||
Test::new()
|
Test::new()
|
||||||
.justfile(format!("x := {expression}"))
|
.justfile(format!("x := {expression}"))
|
||||||
|
@ -39,6 +39,7 @@ pub(crate) struct Output {
|
|||||||
pub(crate) tempdir: TempDir,
|
pub(crate) tempdir: TempDir,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[must_use]
|
||||||
pub(crate) struct Test {
|
pub(crate) struct Test {
|
||||||
pub(crate) args: Vec<String>,
|
pub(crate) args: Vec<String>,
|
||||||
pub(crate) current_dir: PathBuf,
|
pub(crate) current_dir: PathBuf,
|
||||||
|
Loading…
Reference in New Issue
Block a user