From 2bd1fa6718ca3b8aeb3e786ea388cff3b07f54c8 Mon Sep 17 00:00:00 2001 From: ivan-aksamentov Date: Fri, 1 Sep 2023 17:18:27 +0200 Subject: [PATCH] fix: bump version to 3.0.0-alpha.0 and fix compatibility checks --- Cargo.lock | 9 ++++--- packages_rs/nextclade-cli/Cargo.toml | 4 +-- .../src/cli/nextclade_dataset_get.rs | 9 +++---- .../src/cli/nextclade_dataset_list.rs | 7 +++-- .../nextclade-cli/src/io/http_client.rs | 5 ++-- packages_rs/nextclade-web/Cargo.toml | 2 +- packages_rs/nextclade-web/package.json | 2 +- .../src/io/fetchDatasetsIndex.ts | 2 +- packages_rs/nextclade/Cargo.toml | 4 +-- .../nextclade/src/analyze/virus_properties.rs | 8 ++++++ packages_rs/nextclade/src/io/dataset.rs | 16 ++++++++---- packages_rs/nextclade/src/io/results_json.rs | 7 +++-- packages_rs/nextclade/src/utils/getenv.rs | 2 +- packages_rs/nextclade/src/utils/info.rs | 26 +++++++++++++++++++ packages_rs/nextclade/src/utils/mod.rs | 1 + 15 files changed, 73 insertions(+), 31 deletions(-) create mode 100644 packages_rs/nextclade/src/utils/info.rs diff --git a/Cargo.lock b/Cargo.lock index 8c5d9c0e7..44d8841e9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1712,7 +1712,7 @@ dependencies = [ [[package]] name = "nextclade" -version = "2.14.0" +version = "3.0.0-alpha.0" dependencies = [ "assert2", "atty", @@ -1776,7 +1776,7 @@ dependencies = [ [[package]] name = "nextclade-cli" -version = "2.14.0" +version = "3.0.0-alpha.0" dependencies = [ "assert2", "clap", @@ -1816,7 +1816,7 @@ dependencies = [ [[package]] name = "nextclade-web" -version = "2.14.0" +version = "3.0.0-alpha.0" dependencies = [ "assert2", "console_error_panic_hook", @@ -2515,6 +2515,9 @@ name = "semver" version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bebd363326d05ec3e2f532ab7660680f3b02130d780c299bca73469d521bc0ed" +dependencies = [ + "serde", +] [[package]] name = "serde" diff --git a/packages_rs/nextclade-cli/Cargo.toml b/packages_rs/nextclade-cli/Cargo.toml index 36e87ce42..2b891e126 100644 --- a/packages_rs/nextclade-cli/Cargo.toml +++ b/packages_rs/nextclade-cli/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "nextclade-cli" -version = "2.14.0" +version = "3.0.0-alpha.0" description = "Alignment, mutation calling, phylogenetic placement, clade assignment and quality control checks for viral genetic sequences. CLI module." repository = "https://github.com/nextstrain/nextclade" documentation = "https://docs.nextstrain.org/projects/nextclade/en/stable/" @@ -34,7 +34,7 @@ rayon = "=1.7.0" regex = "=1.8.4" reqwest = { version = "=0.11.18", default-features = false, features = ["blocking", "deflate", "gzip", "brotli", "socks", "rustls-tls"] } schemars = { version = "=0.8.12", features = ["chrono", "either", "enumset", "indexmap1"] } -semver = "=1.0.17" +semver = { version = "=1.0.17", features = ["serde"] } serde = { version = "=1.0.164", features = ["derive"] } serde_json = { version = "=1.0.99", features = ["preserve_order", "indexmap", "unbounded_depth"] } strum = "=0.25.0" diff --git a/packages_rs/nextclade-cli/src/cli/nextclade_dataset_get.rs b/packages_rs/nextclade-cli/src/cli/nextclade_dataset_get.rs index 71cc76098..34c245d09 100644 --- a/packages_rs/nextclade-cli/src/cli/nextclade_dataset_get.rs +++ b/packages_rs/nextclade-cli/src/cli/nextclade_dataset_get.rs @@ -5,10 +5,9 @@ use eyre::{Report, WrapErr}; use itertools::Itertools; use log::{warn, LevelFilter}; use nextclade::io::dataset::{Dataset, DatasetsIndexJson}; +use nextclade::utils::info::{this_package_version, this_package_version_str}; use nextclade::utils::string::find_similar_strings; -use nextclade::{getenv, make_error, make_internal_error}; - -const THIS_VERSION: &str = getenv!("CARGO_PKG_VERSION"); +use nextclade::{make_error, make_internal_error}; pub struct DatasetHttpGetParams<'s> { pub name: &'s str, @@ -93,12 +92,12 @@ pub fn dataset_http_get(http: &mut HttpClient, name: impl AsRef, tag: &Opti } }?; - if !dataset.is_cli_compatible(THIS_VERSION) { + if !dataset.is_cli_compatible(&this_package_version()) { warn!( "The requested dataset '{}' with version tag '{}' is not compatible with this version of Nextclade ({}). This may cause errors and unexpected results. Please try to upgrade your Nextclade version and/or report this to dataset authors.", dataset.path, dataset.tag(), - THIS_VERSION + this_package_version_str() ); } diff --git a/packages_rs/nextclade-cli/src/cli/nextclade_dataset_list.rs b/packages_rs/nextclade-cli/src/cli/nextclade_dataset_list.rs index 0ce436b19..b279c5612 100644 --- a/packages_rs/nextclade-cli/src/cli/nextclade_dataset_list.rs +++ b/packages_rs/nextclade-cli/src/cli/nextclade_dataset_list.rs @@ -7,9 +7,8 @@ use itertools::Itertools; use log::LevelFilter; use nextclade::io::dataset::{Dataset, DatasetsIndexJson}; use nextclade::io::json::{json_stringify, JsonPretty}; -use nextclade::{getenv, make_error}; - -const THIS_VERSION: &str = getenv!("CARGO_PKG_VERSION"); +use nextclade::make_error; +use nextclade::utils::info::this_package_version; pub fn nextclade_dataset_list( NextcladeDatasetListArgs { @@ -50,7 +49,7 @@ pub fn nextclade_dataset_list( if let Some(tag) = tag.as_ref() { dataset.is_tag(tag) } else { - let is_compatible = include_incompatible || dataset.is_cli_compatible(THIS_VERSION); + let is_compatible = include_incompatible || dataset.is_cli_compatible(&this_package_version()); let is_not_deprecated = include_deprecated || !dataset.is_deprecated(); let is_not_experimental = include_experimental || !dataset.is_experimental(); let is_not_community = include_community || !dataset.is_community(); diff --git a/packages_rs/nextclade-cli/src/io/http_client.rs b/packages_rs/nextclade-cli/src/io/http_client.rs index 5e0bb4bf1..ecca60d7b 100644 --- a/packages_rs/nextclade-cli/src/io/http_client.rs +++ b/packages_rs/nextclade-cli/src/io/http_client.rs @@ -1,7 +1,8 @@ use clap::{Parser, ValueHint}; use eyre::Report; use log::info; -use nextclade::{getenv, make_internal_error}; +use nextclade::make_internal_error; +use nextclade::utils::info::{this_package_name, this_package_version_str}; use reqwest::blocking::Client; use reqwest::{Method, Proxy}; use std::str::FromStr; @@ -57,7 +58,7 @@ impl HttpClient { client_builder }; - let user_agent = format!("{} {}", getenv!("CARGO_PKG_NAME"), getenv!("CARGO_PKG_VERSION")); + let user_agent = format!("{} {}", this_package_name(), this_package_version_str()); let client = client_builder .connection_verbose(verbose) diff --git a/packages_rs/nextclade-web/Cargo.toml b/packages_rs/nextclade-web/Cargo.toml index 13364ba34..8288ad8f1 100644 --- a/packages_rs/nextclade-web/Cargo.toml +++ b/packages_rs/nextclade-web/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "nextclade-web" -version = "2.14.0" +version = "3.0.0-alpha.0" description = "Alignment, mutation calling, phylogenetic placement, clade assignment and quality control checks for viral genetic sequences. WebAssembly module." edition = "2021" license = "MIT" diff --git a/packages_rs/nextclade-web/package.json b/packages_rs/nextclade-web/package.json index 07e17c326..0c7446ac1 100644 --- a/packages_rs/nextclade-web/package.json +++ b/packages_rs/nextclade-web/package.json @@ -1,6 +1,6 @@ { "name": "@nextstrain/nextclade-web", - "version": "2.14.1", + "version": "3.0.0-alpha.0", "description": "Clade assignment, mutation calling, and sequence quality checks", "homepage": "https://clades.nextstrain.org", "repository": { diff --git a/packages_rs/nextclade-web/src/io/fetchDatasetsIndex.ts b/packages_rs/nextclade-web/src/io/fetchDatasetsIndex.ts index 28e6c194d..d39e3403f 100644 --- a/packages_rs/nextclade-web/src/io/fetchDatasetsIndex.ts +++ b/packages_rs/nextclade-web/src/io/fetchDatasetsIndex.ts @@ -13,7 +13,7 @@ export function isEnabled(dataset: Dataset) { export function isCompatible(dataset: Dataset): boolean { const minVersion = dataset.version?.compatibility?.web ?? thisVersion - return semver.gte(thisVersion, minVersion) && semver.lte(thisVersion, minVersion) + return semver.gte(thisVersion, minVersion) } export function isLatest(dataset: Dataset): boolean { diff --git a/packages_rs/nextclade/Cargo.toml b/packages_rs/nextclade/Cargo.toml index 0ec4916e8..3e60a046d 100644 --- a/packages_rs/nextclade/Cargo.toml +++ b/packages_rs/nextclade/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "nextclade" -version = "2.14.0" +version = "3.0.0-alpha.0" description = "Alignment, mutation calling, phylogenetic placement, clade assignment and quality control checks for viral genetic sequences. Library module." repository = "https://github.com/nextstrain/nextclade" documentation = "https://docs.nextstrain.org/projects/nextclade/en/stable/" @@ -49,7 +49,7 @@ pretty_assertions = "=1.3.0" rayon = "=1.7.0" regex = "=1.8.4" schemars = { version = "=0.8.12", features = ["chrono", "either", "enumset", "indexmap"] } -semver = "=1.0.17" +semver = { version = "=1.0.17", features = ["serde"] } serde = { version = "=1.0.164", features = ["derive"] } serde_json = { version = "=1.0.99", features = ["preserve_order", "indexmap", "unbounded_depth"] } serde_repr = "=0.1.12" diff --git a/packages_rs/nextclade/src/analyze/virus_properties.rs b/packages_rs/nextclade/src/analyze/virus_properties.rs index 82a372c93..1cec3211a 100644 --- a/packages_rs/nextclade/src/analyze/virus_properties.rs +++ b/packages_rs/nextclade/src/analyze/virus_properties.rs @@ -14,6 +14,7 @@ use crate::run::params_general::NextcladeGeneralParamsOptional; use crate::tree::params::TreeBuilderParamsOptional; use crate::utils::boolean::{bool_false, bool_true}; use eyre::{Report, WrapErr}; +use semver::Version; use serde::{Deserialize, Serialize}; use std::collections::BTreeMap; use std::path::Path; @@ -199,4 +200,11 @@ impl VirusProperties { json_parse::(s).wrap_err("When parsing pathogen.json file") } + + pub fn is_cli_compatible(&self, current_cli_version: &Version) -> bool { + self + .compatibility + .as_ref() + .map_or(true, |compat| compat.is_cli_compatible(current_cli_version)) + } } diff --git a/packages_rs/nextclade/src/io/dataset.rs b/packages_rs/nextclade/src/io/dataset.rs index 671fc70eb..653af23dd 100644 --- a/packages_rs/nextclade/src/io/dataset.rs +++ b/packages_rs/nextclade/src/io/dataset.rs @@ -4,6 +4,7 @@ use crate::o; use eyre::Report; use itertools::Itertools; use schemars::JsonSchema; +use semver::Version; use serde::{Deserialize, Serialize}; use std::cmp::Ordering; use std::collections::BTreeMap; @@ -96,7 +97,7 @@ impl Dataset { [&self.root_path(), filename.as_ref()].iter().join("/") } - pub fn is_cli_compatible(&self, cli_version: impl AsRef) -> bool { + pub fn is_cli_compatible(&self, cli_version: &Version) -> bool { self .version .compatibility @@ -191,15 +192,20 @@ impl Default for DatasetVersion { #[serde(rename_all = "camelCase")] pub struct DatasetCompatibility { #[serde(default, skip_serializing_if = "Option::is_none")] - cli: Option, + #[schemars(with = "String")] + pub cli: Option, #[serde(default, skip_serializing_if = "Option::is_none")] - web: Option, + #[schemars(with = "String")] + pub web: Option, } impl DatasetCompatibility { - pub fn is_cli_compatible(&self, cli_version: impl AsRef) -> bool { - self.cli.as_ref().map_or(true, |cli| cli_version.as_ref() >= cli) + pub fn is_cli_compatible(&self, cli_version: &Version) -> bool { + self + .cli + .as_ref() + .map_or(true, |min_cli_version| cli_version >= min_cli_version) } } diff --git a/packages_rs/nextclade/src/io/results_json.rs b/packages_rs/nextclade/src/io/results_json.rs index f4228900e..61ef82ab9 100644 --- a/packages_rs/nextclade/src/io/results_json.rs +++ b/packages_rs/nextclade/src/io/results_json.rs @@ -9,6 +9,7 @@ use crate::utils::datetime::date_iso_now; use eyre::Report; use serde::{Deserialize, Serialize}; use std::path::{Path, PathBuf}; +use crate::utils::info::this_package_version_str; #[derive(Serialize, Deserialize, schemars::JsonSchema)] #[serde(rename_all = "camelCase")] @@ -33,11 +34,9 @@ pub struct ResultsJson { impl ResultsJson { pub fn new(clade_node_attrs: &[CladeNodeAttrKeyDesc], phenotype_attr_keys: &[PhenotypeAttrDesc]) -> Self { - const VERSION: &str = env!("CARGO_PKG_VERSION"); - Self { - schema_version: "1.0.0".to_owned(), - nextclade_algo_version: VERSION.to_owned(), + schema_version: "3.0.0".to_owned(), + nextclade_algo_version: this_package_version_str().to_owned(), nextclade_web_version: None, created_at: date_iso_now(), clade_node_attr_keys: clade_node_attrs.to_vec(), diff --git a/packages_rs/nextclade/src/utils/getenv.rs b/packages_rs/nextclade/src/utils/getenv.rs index a65dea649..6afa4e696 100644 --- a/packages_rs/nextclade/src/utils/getenv.rs +++ b/packages_rs/nextclade/src/utils/getenv.rs @@ -1,4 +1,4 @@ -#[macro_export(local_inner_macros)] +#[macro_export] macro_rules! getenv { ($arg:tt) => {{ match core::option_env!($arg) { diff --git a/packages_rs/nextclade/src/utils/info.rs b/packages_rs/nextclade/src/utils/info.rs new file mode 100644 index 000000000..c78746808 --- /dev/null +++ b/packages_rs/nextclade/src/utils/info.rs @@ -0,0 +1,26 @@ +use lazy_static::lazy_static; +use semver::Version; + +pub fn this_package_name() -> &'static str { + lazy_static! { + pub static ref PKG_NAME: &'static str = env!("CARGO_PKG_NAME"); + } + &PKG_NAME +} + +pub fn this_package_version() -> &'static Version { + lazy_static! { + pub static ref VERSION: Version = Version::parse(env!("CARGO_PKG_VERSION")).expect( + "Unable to parse env var `CARGO_PKG_VERSION` in semantic version format. \ + In most cases it comes from `version` field in `Cargo.toml` file." + ); + } + &VERSION +} + +pub fn this_package_version_str() -> &'static str { + lazy_static! { + pub static ref VERSION_STR: String = this_package_version().to_string(); + } + &VERSION_STR +} diff --git a/packages_rs/nextclade/src/utils/mod.rs b/packages_rs/nextclade/src/utils/mod.rs index 48084fef6..4a269f3b1 100644 --- a/packages_rs/nextclade/src/utils/mod.rs +++ b/packages_rs/nextclade/src/utils/mod.rs @@ -4,6 +4,7 @@ pub mod datetime; pub mod error; pub mod getenv; pub mod global_init; +pub mod info; pub mod num; pub mod option; pub mod string;