diff --git a/Cargo.lock b/Cargo.lock index 37e6fa6d780..9784f00bace 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1122,6 +1122,7 @@ dependencies = [ "claims", "crates_io_env_vars", "git2", + "insta", "secrecy", "serde", "serde_json", diff --git a/crates/crates_io_index/Cargo.toml b/crates/crates_io_index/Cargo.toml index bfd0d20e169..ae1092ebe94 100644 --- a/crates/crates_io_index/Cargo.toml +++ b/crates/crates_io_index/Cargo.toml @@ -29,3 +29,4 @@ url = "=2.5.2" [dev-dependencies] claims = "=0.7.1" +insta = "=1.40.0" diff --git a/crates/crates_io_index/data.rs b/crates/crates_io_index/data.rs index 7fe19bb6d84..a7d5f5f6b35 100644 --- a/crates/crates_io_index/data.rs +++ b/crates/crates_io_index/data.rs @@ -1,5 +1,5 @@ +use crate::features::FeaturesMap; use std::cmp::Ordering; -use std::collections::BTreeMap; #[derive(Serialize, Deserialize, Debug)] pub struct Crate { @@ -7,7 +7,7 @@ pub struct Crate { pub vers: String, pub deps: Vec, pub cksum: String, - pub features: BTreeMap>, + pub features: FeaturesMap, /// This field contains features with new, extended syntax. Specifically, /// namespaced features (`dep:`) and weak dependencies (`pkg?/feat`). /// @@ -18,7 +18,7 @@ pub struct Crate { /// will fail to load due to not being able to parse the new syntax, even /// with a `Cargo.lock` file. #[serde(skip_serializing_if = "Option::is_none")] - pub features2: Option>>, + pub features2: Option, pub yanked: Option, #[serde(skip_serializing_if = "Option::is_none")] pub links: Option, diff --git a/src/models/feature.rs b/crates/crates_io_index/features.rs similarity index 97% rename from src/models/feature.rs rename to crates/crates_io_index/features.rs index 99e2ae1dede..993e45a5874 100644 --- a/src/models/feature.rs +++ b/crates/crates_io_index/features.rs @@ -6,7 +6,9 @@ pub type FeaturesMap = BTreeMap>; /// values. /// /// See . -pub fn split_features(features: FeaturesMap) -> (FeaturesMap, FeaturesMap) { +pub fn split_features( + features: impl IntoIterator)>, +) -> (FeaturesMap, FeaturesMap) { const ITERATION_LIMIT: usize = 100; // First, we partition the features into two groups: those that use the new @@ -49,6 +51,7 @@ pub fn split_features(features: FeaturesMap) -> (FeaturesMap, FeaturesMap) { mod tests { use super::*; use insta::{assert_compact_debug_snapshot, assert_debug_snapshot}; + use serde_json::json; #[test] fn test_split_features_no_deps() { diff --git a/crates/crates_io_index/lib.rs b/crates/crates_io_index/lib.rs index f11505edc07..a268e56af6c 100644 --- a/crates/crates_io_index/lib.rs +++ b/crates/crates_io_index/lib.rs @@ -5,6 +5,7 @@ extern crate tracing; mod credentials; mod data; +pub mod features; mod repo; mod ser; #[cfg(feature = "testing")] diff --git a/src/models/snapshots/crates_io__models__feature__tests__split_features_clap.snap b/crates/crates_io_index/snapshots/crates_io_index__features__tests__split_features_clap.snap similarity index 97% rename from src/models/snapshots/crates_io__models__feature__tests__split_features_clap.snap rename to crates/crates_io_index/snapshots/crates_io_index__features__tests__split_features_clap.snap index ba6be73039e..b07471fd5bd 100644 --- a/src/models/snapshots/crates_io__models__feature__tests__split_features_clap.snap +++ b/crates/crates_io_index/snapshots/crates_io_index__features__tests__split_features_clap.snap @@ -1,5 +1,5 @@ --- -source: src/models/feature.rs +source: crates/crates_io_index/features.rs expression: split_features(features) --- ( diff --git a/src/models.rs b/src/models.rs index d18c576ea63..f5bfb170457 100644 --- a/src/models.rs +++ b/src/models.rs @@ -24,7 +24,6 @@ mod default_versions; pub mod dependency; mod download; mod email; -pub mod feature; mod follow; mod keyword; pub mod krate; diff --git a/src/models/krate.rs b/src/models/krate.rs index 2615ff3d2bc..441feee0530 100644 --- a/src/models/krate.rs +++ b/src/models/krate.rs @@ -1,4 +1,5 @@ use chrono::NaiveDateTime; +use crates_io_index::features::split_features; use diesel::associations::Identifiable; use diesel::dsl; use diesel::pg::Pg; @@ -8,7 +9,6 @@ use secrecy::SecretString; use thiserror::Error; use crate::controllers::helpers::pagination::*; -use crate::models::feature::split_features; use crate::models::helpers::with_count::*; use crate::models::version::TopVersions; use crate::models::{ diff --git a/src/models/version.rs b/src/models/version.rs index 6db3d787334..3a519e6adad 100644 --- a/src/models/version.rs +++ b/src/models/version.rs @@ -1,13 +1,13 @@ use std::collections::BTreeMap; use chrono::NaiveDateTime; +use crates_io_index::features::FeaturesMap; use derive_builder::Builder; use diesel::prelude::*; use serde::Deserialize; use crate::util::errors::{bad_request, AppResult}; -use crate::models::feature::FeaturesMap; use crate::models::{Crate, Dependency, User}; use crate::schema::*; use crate::sql::split_part;