diff --git a/Cargo.lock.msrv b/Cargo.lock.msrv index 6075999..b8b7609 100644 --- a/Cargo.lock.msrv +++ b/Cargo.lock.msrv @@ -8,12 +8,44 @@ version = "1.0.52" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "84450d0b4a8bd1ba4144ce8ce718fbc5d071358b1e5384bace6536b3d1f2d5b3" +[[package]] +name = "autocfg" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" + +[[package]] +name = "cargo_toml" +version = "0.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "497049e9477329f8f6a559972ee42e117487d01d1e8c2cc9f836ea6fa23a9e1a" +dependencies = [ + "serde", + "toml", +] + [[package]] name = "glob" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574" +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown", +] + [[package]] name = "itoa" version = "1.0.1" @@ -26,6 +58,15 @@ version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" +[[package]] +name = "metadata_check" +version = "0.1.0" +dependencies = [ + "cargo_toml", + "serde", + "serde_yaml", +] + [[package]] name = "num_enum" version = "0.6.0" @@ -105,22 +146,22 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.132" +version = "1.0.159" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b9875c23cf305cd1fd7eb77234cbb705f21ea6a72c637a5c6db5fe4b8e7f008" +checksum = "3c04e8343c3daeec41f58990b9d77068df31209f2af111e059e9fe9646693065" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.132" +version = "1.0.159" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ecc0db5cb2556c0e558887d9bbdcf6ac4471e83ff66cf696e5419024d1606276" +checksum = "4c614d17805b093df4b147b51339e7e44bf05ef59fba1e45d83500bcfb4d8585" dependencies = [ "proc-macro2", "quote", - "syn 1.0.84", + "syn 2.0.11", ] [[package]] @@ -142,6 +183,19 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_yaml" +version = "0.9.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f82e6c8c047aa50a7328632d067bcae6ef38772a79e28daf32f735e0e4f3dd10" +dependencies = [ + "indexmap", + "itoa", + "ryu", + "serde", + "unsafe-libyaml", +] + [[package]] name = "stress_tests" version = "0.1.0" @@ -236,6 +290,12 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3" +[[package]] +name = "unsafe-libyaml" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad2024452afd3874bf539695e04af6732ba06517424dbf958fdb16a01f3bef6c" + [[package]] name = "walkdir" version = "2.3.2" diff --git a/Cargo.toml b/Cargo.toml index 7ae4114..968894b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,5 +1,5 @@ [workspace] -members = ["num_enum", "num_enum_derive", "renamed_num_enum", "serde_example", "stress_tests"] +members = ["metadata_checks", "num_enum", "num_enum_derive", "renamed_num_enum", "serde_example", "stress_tests"] # Exclude num_enum_derive because its useful doc comments import num_enum, which the crate doesn't do (because it would # cause a circular dependency), so the doc tests don't actually compile. default-members = ["num_enum", "renamed_num_enum", "serde_example", "stress_tests"] diff --git a/metadata_checks/Cargo.toml b/metadata_checks/Cargo.toml new file mode 100644 index 0000000..ad6df47 --- /dev/null +++ b/metadata_checks/Cargo.toml @@ -0,0 +1,10 @@ +[package] +name = "metadata_check" +version = "0.1.0" +edition = "2018" +publish = false + +[dev-dependencies] +cargo_toml = "0.13.3" +serde = "1" +serde_yaml = "0.9" diff --git a/metadata_checks/tests/metadata_checks.rs b/metadata_checks/tests/metadata_checks.rs new file mode 100644 index 0000000..d450e40 --- /dev/null +++ b/metadata_checks/tests/metadata_checks.rs @@ -0,0 +1,117 @@ +use cargo_toml::Manifest; +use std::collections::{BTreeMap, BTreeSet}; +use std::path::PathBuf; + +#[test] +fn msrv() { + let workspace_root = get_workspace_root(); + + let crates_to_msrvs: BTreeMap = vec!["num_enum", "num_enum_derive"] + .into_iter() + .map(|crate_name| { + let manifest_path = workspace_root.join(crate_name).join("Cargo.toml"); + ( + crate_name.to_owned(), + Manifest::from_path(&manifest_path) + .map_err(|err| { + format!( + "Failed to read manifest from path {:?}: {:?}", + manifest_path, err + ) + }) + .unwrap() + .package + .ok_or_else(|| format!("Missing package for crate {:?}", crate_name)) + .unwrap() + .rust_version() + .ok_or_else(|| format!("Missing rust-version for crate {:?}", crate_name)) + .unwrap() + .to_owned(), + ) + }) + .collect(); + + let crates_msrvs: BTreeSet<_> = crates_to_msrvs.values().cloned().collect(); + if crates_msrvs.len() != 1 { + panic!( + "Want exactly one MSRV across crates, but found: {:?}", + crates_to_msrvs + ); + } + + let action_bytes = std::fs::read( + workspace_root + .join(".github") + .join("workflows") + .join("msrv-build.yml"), + ) + .expect("Failed to read github workflows yaml"); + let action_file: github_action::File = serde_yaml::from_slice(&action_bytes).unwrap(); + + let toolchains: BTreeSet = action_file + .jobs + .values() + .flat_map(|v| v.steps.iter()) + .filter_map(|step| step.with.as_ref()) + .map(|step_with| step_with.toolchain.clone()) + .collect(); + + assert_eq!(toolchains, crates_msrvs); +} + +#[test] +fn dep_version() { + let workspace_root = get_workspace_root(); + let num_enum_manifest = + Manifest::from_path(workspace_root.join("num_enum").join("Cargo.toml")).unwrap(); + let num_enum_derive_manifest = + Manifest::from_path(workspace_root.join("num_enum_derive").join("Cargo.toml")).unwrap(); + + let requested_dependency_version = num_enum_manifest + .dependencies + .get("num_enum_derive") + .unwrap() + .detail() + .unwrap() + .version + .clone() + .unwrap(); + let num_enum_derive_version = num_enum_derive_manifest.package.unwrap().version.unwrap(); + + let expected_dependency_version = format!("={}", num_enum_derive_version); + + assert_eq!(expected_dependency_version, requested_dependency_version); +} + +fn get_workspace_root() -> PathBuf { + PathBuf::from(std::env::var_os("CARGO_MANIFEST_DIR").unwrap()) + .parent() + .unwrap() + .to_path_buf() +} + +mod github_action { + use serde::Deserialize; + use std::collections::BTreeMap; + + #[derive(Deserialize)] + pub struct File { + pub jobs: BTreeMap, + } + + #[derive(Deserialize)] + pub struct Job { + pub steps: Vec, + } + + #[derive(Deserialize)] + pub struct Step { + pub uses: Option, + pub with: Option, + } + + #[derive(Deserialize)] + pub struct With { + pub toolchain: String, + } +} diff --git a/num_enum/Cargo.toml b/num_enum/Cargo.toml index e34d900..232cfeb 100644 --- a/num_enum/Cargo.toml +++ b/num_enum/Cargo.toml @@ -1,6 +1,7 @@ [package] name = "num_enum" version = "0.6.0" # Keep in sync with num_enum_derive, the the dependency on it below. +rust-version = "1.56.0" authors = [ "Daniel Wagner-Hall ", "Daniel Henry-Mantilla ", diff --git a/num_enum_derive/Cargo.toml b/num_enum_derive/Cargo.toml index 29b9042..abd3330 100644 --- a/num_enum_derive/Cargo.toml +++ b/num_enum_derive/Cargo.toml @@ -1,6 +1,7 @@ [package] name = "num_enum_derive" version = "0.6.0" # Keep in sync with num_enum. +rust-version = "1.56.0" authors = [ "Daniel Wagner-Hall ", "Daniel Henry-Mantilla ",