diff options
| author | nsfisis <nsfisis@gmail.com> | 2026-05-11 02:05:34 +0900 |
|---|---|---|
| committer | nsfisis <nsfisis@gmail.com> | 2026-05-11 02:05:34 +0900 |
| commit | 4df5f8491320e5795718cf0222e80fa27e57c8ad (patch) | |
| tree | 707e19f34dbdef18490ec3245d34389e3d189a57 /crates/mozart/src/commands | |
| parent | 8871b923fa3df1935c263db155cb8bc3d59705cd (diff) | |
| download | php-mozart-4df5f8491320e5795718cf0222e80fa27e57c8ad.tar.gz php-mozart-4df5f8491320e5795718cf0222e80fa27e57c8ad.tar.zst php-mozart-4df5f8491320e5795718cf0222e80fa27e57c8ad.zip | |
refactor(package): rename traits and switch dep maps to IndexMap
Rename Package/CompletePackage to PackageInterface/CompletePackageInterface
to mirror Composer's interface names, and split each into its own module
under crates/mozart-core/src/package/.
Switch dependency-link and metadata maps from BTreeMap to indexmap::IndexMap
so serialized JSON preserves the original key ordering rather than sorting
alphabetically — matching PHP associative-array semantics. The
--sort-packages behaviour in `require` is preserved via sort_unstable_keys.
Diffstat (limited to 'crates/mozart/src/commands')
| -rw-r--r-- | crates/mozart/src/commands/audit.rs | 44 | ||||
| -rw-r--r-- | crates/mozart/src/commands/browse.rs | 2 | ||||
| -rw-r--r-- | crates/mozart/src/commands/bump.rs | 16 | ||||
| -rw-r--r-- | crates/mozart/src/commands/check_platform_reqs.rs | 89 | ||||
| -rw-r--r-- | crates/mozart/src/commands/dependency.rs | 27 | ||||
| -rw-r--r-- | crates/mozart/src/commands/diagnose.rs | 2 | ||||
| -rw-r--r-- | crates/mozart/src/commands/exec.rs | 2 | ||||
| -rw-r--r-- | crates/mozart/src/commands/init.rs | 10 | ||||
| -rw-r--r-- | crates/mozart/src/commands/install.rs | 51 | ||||
| -rw-r--r-- | crates/mozart/src/commands/licenses.rs | 46 | ||||
| -rw-r--r-- | crates/mozart/src/commands/remove.rs | 43 | ||||
| -rw-r--r-- | crates/mozart/src/commands/require.rs | 52 | ||||
| -rw-r--r-- | crates/mozart/src/commands/show.rs | 28 | ||||
| -rw-r--r-- | crates/mozart/src/commands/suggests.rs | 39 | ||||
| -rw-r--r-- | crates/mozart/src/commands/update.rs | 13 |
15 files changed, 221 insertions, 243 deletions
diff --git a/crates/mozart/src/commands/audit.rs b/crates/mozart/src/commands/audit.rs index 0b84ccf..f543cb4 100644 --- a/crates/mozart/src/commands/audit.rs +++ b/crates/mozart/src/commands/audit.rs @@ -194,8 +194,6 @@ fn load_locked_packages(working_dir: &Path, no_dev: bool) -> anyhow::Result<Vec< #[cfg(test)] mod tests { - use std::collections::BTreeMap; - use super::*; use mozart_core::repository::lockfile::{LockFile, LockedPackage}; @@ -242,7 +240,7 @@ mod tests { aliases: vec![], homepage: None, support: None, - extra_fields: BTreeMap::new(), + extra_fields: indexmap::IndexMap::new(), }); installed.write(&vendor_dir).unwrap(); @@ -273,7 +271,7 @@ mod tests { aliases: vec![], homepage: None, support: None, - extra_fields: BTreeMap::new(), + extra_fields: indexmap::IndexMap::new(), }); installed.upsert(mozart_core::repository::installed::InstalledPackageEntry { name: "phpunit/phpunit".to_string(), @@ -287,7 +285,7 @@ mod tests { aliases: vec![], homepage: None, support: None, - extra_fields: BTreeMap::new(), + extra_fields: indexmap::IndexMap::new(), }); installed .dev_package_names @@ -315,11 +313,11 @@ mod tests { version_normalized: Some("3.0.0.0".to_string()), source: None, dist: None, - require: BTreeMap::new(), - require_dev: BTreeMap::new(), - conflict: BTreeMap::new(), - provide: BTreeMap::new(), - replace: BTreeMap::new(), + require: indexmap::IndexMap::new(), + require_dev: indexmap::IndexMap::new(), + conflict: indexmap::IndexMap::new(), + provide: indexmap::IndexMap::new(), + replace: indexmap::IndexMap::new(), suggest: None, package_type: None, autoload: None, @@ -332,7 +330,7 @@ mod tests { support: None, funding: None, time: None, - extra_fields: BTreeMap::new(), + extra_fields: indexmap::IndexMap::new(), }], packages_dev: None, aliases: vec![], @@ -370,11 +368,11 @@ mod tests { version_normalized: None, source: None, dist: None, - require: BTreeMap::new(), - require_dev: BTreeMap::new(), - conflict: BTreeMap::new(), - provide: BTreeMap::new(), - replace: BTreeMap::new(), + require: indexmap::IndexMap::new(), + require_dev: indexmap::IndexMap::new(), + conflict: indexmap::IndexMap::new(), + provide: indexmap::IndexMap::new(), + replace: indexmap::IndexMap::new(), suggest: None, package_type: None, autoload: None, @@ -387,7 +385,7 @@ mod tests { support: None, funding: None, time: None, - extra_fields: BTreeMap::new(), + extra_fields: indexmap::IndexMap::new(), }], packages_dev: Some(vec![LockedPackage { name: "phpunit/phpunit".to_string(), @@ -395,11 +393,11 @@ mod tests { version_normalized: None, source: None, dist: None, - require: BTreeMap::new(), - require_dev: BTreeMap::new(), - conflict: BTreeMap::new(), - provide: BTreeMap::new(), - replace: BTreeMap::new(), + require: indexmap::IndexMap::new(), + require_dev: indexmap::IndexMap::new(), + conflict: indexmap::IndexMap::new(), + provide: indexmap::IndexMap::new(), + replace: indexmap::IndexMap::new(), suggest: None, package_type: None, autoload: None, @@ -412,7 +410,7 @@ mod tests { support: None, funding: None, time: None, - extra_fields: BTreeMap::new(), + extra_fields: indexmap::IndexMap::new(), }]), aliases: vec![], minimum_stability: "stable".to_string(), diff --git a/crates/mozart/src/commands/browse.rs b/crates/mozart/src/commands/browse.rs index e3eae22..957f4bc 100644 --- a/crates/mozart/src/commands/browse.rs +++ b/crates/mozart/src/commands/browse.rs @@ -4,7 +4,7 @@ use mozart_core::console::IoInterface; use mozart_core::console_writeln; use mozart_core::console_writeln_error; use mozart_core::exit_code; -use mozart_core::package::Package as _; +use mozart_core::package::PackageInterface as _; use mozart_core::repository::browse_repos::{BrowseRepos, CompletePackageView}; use mozart_core::repository::cache::{Cache, build_cache_config}; use mozart_core::repository::installed::InstalledPackages; diff --git a/crates/mozart/src/commands/bump.rs b/crates/mozart/src/commands/bump.rs index 351be01..2d6eea8 100644 --- a/crates/mozart/src/commands/bump.rs +++ b/crates/mozart/src/commands/bump.rs @@ -3,7 +3,7 @@ use clap::Args; use indexmap::IndexMap; use mozart_core::composer::LocalRepository; use mozart_core::console::IoInterface; -use mozart_core::package::{Link, Package as _}; +use mozart_core::package::PackageInterface as _; use mozart_core::{console_writeln, console_writeln_error}; use std::collections::BTreeMap; use std::path::Path; @@ -151,7 +151,7 @@ pub async fn do_bump( } } - let mut tasks: Vec<(&'static str, &BTreeMap<String, Link>)> = Vec::new(); + let mut tasks = Vec::new(); if !dev_only { tasks.push(("require", composer.package().requires())); } @@ -386,11 +386,11 @@ mod tests { version_normalized: Some(format!("{version}.0")), source: None, dist: None, - require: BTreeMap::new(), - require_dev: BTreeMap::new(), - conflict: BTreeMap::new(), - provide: BTreeMap::new(), - replace: BTreeMap::new(), + require: indexmap::IndexMap::new(), + require_dev: indexmap::IndexMap::new(), + conflict: indexmap::IndexMap::new(), + provide: indexmap::IndexMap::new(), + replace: indexmap::IndexMap::new(), suggest: None, package_type: None, autoload: None, @@ -403,7 +403,7 @@ mod tests { support: None, funding: None, time: None, - extra_fields: BTreeMap::new(), + extra_fields: indexmap::IndexMap::new(), } } diff --git a/crates/mozart/src/commands/check_platform_reqs.rs b/crates/mozart/src/commands/check_platform_reqs.rs index 2dbcd3b..f6731d7 100644 --- a/crates/mozart/src/commands/check_platform_reqs.rs +++ b/crates/mozart/src/commands/check_platform_reqs.rs @@ -3,7 +3,6 @@ use mozart_core::console::IoInterface; use mozart_core::console_writeln; use mozart_core::console_writeln_error; use mozart_core::installer::{InstalledCandidate, InstalledRepoLite}; -use std::collections::BTreeMap; use std::path::Path; #[derive(Args)] @@ -75,7 +74,7 @@ pub async fn execute( let installed_path = vendor_dir.join("composer/installed.json"); let mut installed_repo = InstalledRepoLite::new(); - let mut requires: BTreeMap<String, Vec<Link>> = BTreeMap::new(); + let mut requires = indexmap::IndexMap::new(); if args.lock { if !lock_path.exists() { @@ -141,8 +140,8 @@ pub async fn execute( pretty_name: pkg.name, version: pkg.version.clone(), pretty_version: pkg.version, - provides: BTreeMap::new(), - replaces: BTreeMap::new(), + provides: indexmap::IndexMap::new(), + replaces: indexmap::IndexMap::new(), }); } @@ -251,7 +250,7 @@ fn load_lock( lock_path: &Path, no_dev: bool, repo: &mut InstalledRepoLite, - requires: &mut BTreeMap<String, Vec<Link>>, + requires: &mut indexmap::IndexMap<String, Vec<Link>>, ) -> anyhow::Result<()> { let lock = mozart_core::repository::lockfile::LockFile::read_from_file(lock_path)?; @@ -282,7 +281,7 @@ fn load_installed( installed: &mozart_core::repository::installed::InstalledPackages, no_dev: bool, repo: &mut InstalledRepoLite, - requires: &mut BTreeMap<String, Vec<Link>>, + requires: &mut indexmap::IndexMap<String, Vec<Link>>, ) { let dev_names: indexmap::IndexSet<String> = installed .dev_package_names @@ -334,10 +333,10 @@ fn add_root_as_candidate( } fn string_map_from_extra( - extra: &BTreeMap<String, serde_json::Value>, + extra: &indexmap::IndexMap<String, serde_json::Value>, key: &str, -) -> BTreeMap<String, String> { - let mut out: BTreeMap<String, String> = BTreeMap::new(); +) -> indexmap::IndexMap<String, String> { + let mut out = indexmap::IndexMap::new(); if let Some(val) = extra.get(key) && let Some(obj) = val.as_object() { @@ -351,7 +350,7 @@ fn string_map_from_extra( } fn push_platform_link( - requires: &mut BTreeMap<String, Vec<Link>>, + requires: &mut indexmap::IndexMap<String, Vec<Link>>, source: &str, target: &str, constraint: &str, @@ -470,7 +469,6 @@ fn print_table( mod tests { use super::*; use mozart_core::console::Console; - use std::collections::BTreeMap; use tempfile::tempdir; fn test_console() -> std::sync::Arc<std::sync::Mutex<Box<dyn IoInterface>>> { @@ -481,22 +479,26 @@ mod tests { fn write_lock( path: &Path, - packages: &[(&str, BTreeMap<String, String>)], - dev_packages: &[(&str, BTreeMap<String, String>)], + packages: &[(&str, indexmap::IndexMap<String, String>)], + dev_packages: &[(&str, indexmap::IndexMap<String, String>)], ) { write_lock_with(path, packages, dev_packages, &[]); } fn write_lock_with( path: &Path, - packages: &[(&str, BTreeMap<String, String>)], - dev_packages: &[(&str, BTreeMap<String, String>)], - provides: &[(&str, BTreeMap<String, String>, BTreeMap<String, String>)], // (name, provide, replace) + packages: &[(&str, indexmap::IndexMap<String, String>)], + dev_packages: &[(&str, indexmap::IndexMap<String, String>)], + provides: &[( + &str, + indexmap::IndexMap<String, String>, + indexmap::IndexMap<String, String>, + )], // (name, provide, replace) ) { let make_pkg = |name: &str, - require: BTreeMap<String, String>, - provide: BTreeMap<String, String>, - replace: BTreeMap<String, String>| { + require: indexmap::IndexMap<String, String>, + provide: indexmap::IndexMap<String, String>, + replace: indexmap::IndexMap<String, String>| { serde_json::json!({ "name": name, "version": "1.0.0", @@ -508,15 +510,34 @@ mod tests { let mut pkgs_json: Vec<serde_json::Value> = packages .iter() - .map(|(name, req)| make_pkg(name, req.clone(), BTreeMap::new(), BTreeMap::new())) + .map(|(name, req)| { + make_pkg( + name, + req.clone(), + indexmap::IndexMap::new(), + indexmap::IndexMap::new(), + ) + }) .collect(); for (name, prov, repl) in provides { - pkgs_json.push(make_pkg(name, BTreeMap::new(), prov.clone(), repl.clone())); + pkgs_json.push(make_pkg( + name, + indexmap::IndexMap::new(), + prov.clone(), + repl.clone(), + )); } let dev_pkgs_json: Vec<serde_json::Value> = dev_packages .iter() - .map(|(name, req)| make_pkg(name, req.clone(), BTreeMap::new(), BTreeMap::new())) + .map(|(name, req)| { + make_pkg( + name, + req.clone(), + indexmap::IndexMap::new(), + indexmap::IndexMap::new(), + ) + }) .collect(); let lock_json = serde_json::json!({ @@ -565,7 +586,7 @@ mod tests { let dir = tempdir().unwrap(); let lock_path = dir.path().join("composer.lock"); - let mut pkg_require = BTreeMap::new(); + let mut pkg_require = indexmap::IndexMap::new(); pkg_require.insert("php".to_string(), ">=8.1".to_string()); pkg_require.insert("ext-json".to_string(), "*".to_string()); pkg_require.insert("monolog/monolog".to_string(), "^3.0".to_string()); // not platform @@ -573,7 +594,7 @@ mod tests { write_lock(&lock_path, &[("vendor/pkg", pkg_require)], &[]); let mut repo = InstalledRepoLite::new(); - let mut requires: BTreeMap<String, Vec<Link>> = BTreeMap::new(); + let mut requires = indexmap::IndexMap::new(); load_lock(&lock_path, false, &mut repo, &mut requires).unwrap(); assert!(requires.contains_key("php")); @@ -591,10 +612,10 @@ mod tests { let dir = tempdir().unwrap(); let lock_path = dir.path().join("composer.lock"); - let mut prod_require = BTreeMap::new(); + let mut prod_require = indexmap::IndexMap::new(); prod_require.insert("php".to_string(), ">=8.0".to_string()); - let mut dev_require = BTreeMap::new(); + let mut dev_require = indexmap::IndexMap::new(); dev_require.insert("ext-xdebug".to_string(), "*".to_string()); write_lock( @@ -604,13 +625,13 @@ mod tests { ); let mut repo = InstalledRepoLite::new(); - let mut requires: BTreeMap<String, Vec<Link>> = BTreeMap::new(); + let mut requires = indexmap::IndexMap::new(); load_lock(&lock_path, true, &mut repo, &mut requires).unwrap(); assert!(requires.contains_key("php")); assert!(!requires.contains_key("ext-xdebug")); let mut repo2 = InstalledRepoLite::new(); - let mut requires2: BTreeMap<String, Vec<Link>> = BTreeMap::new(); + let mut requires2 = indexmap::IndexMap::new(); load_lock(&lock_path, false, &mut repo2, &mut requires2).unwrap(); assert!(requires2.contains_key("ext-xdebug")); } @@ -626,10 +647,10 @@ mod tests { pretty_name: "vendor/pkg".into(), version: "1.0.0".into(), pretty_version: "1.0.0".into(), - provides: BTreeMap::new(), - replaces: BTreeMap::new(), + provides: indexmap::IndexMap::new(), + replaces: indexmap::IndexMap::new(), }); - let mut polyfill_provides = BTreeMap::new(); + let mut polyfill_provides = indexmap::IndexMap::new(); polyfill_provides.insert("ext-mbstring".to_string(), "*".to_string()); repo.add_candidate(InstalledCandidate { name: "symfony/polyfill-mbstring".into(), @@ -637,7 +658,7 @@ mod tests { version: "1.30.0".into(), pretty_version: "1.30.0".into(), provides: polyfill_provides, - replaces: BTreeMap::new(), + replaces: indexmap::IndexMap::new(), }); let candidates = repo.find_with_replacers_and_providers("ext-mbstring"); @@ -652,7 +673,7 @@ mod tests { #[test] fn test_replacer_candidate_satisfies_require() { - let mut replaces = BTreeMap::new(); + let mut replaces = indexmap::IndexMap::new(); replaces.insert("ext-mbstring".to_string(), "1.0".to_string()); let mut repo = InstalledRepoLite::new(); @@ -661,7 +682,7 @@ mod tests { pretty_name: "vendor/legacy-replacement".into(), version: "2.0.0".into(), pretty_version: "2.0.0".into(), - provides: BTreeMap::new(), + provides: indexmap::IndexMap::new(), replaces, }); diff --git a/crates/mozart/src/commands/dependency.rs b/crates/mozart/src/commands/dependency.rs index 70d1644..5766b08 100644 --- a/crates/mozart/src/commands/dependency.rs +++ b/crates/mozart/src/commands/dependency.rs @@ -9,7 +9,6 @@ use indexmap::IndexSet; use mozart_core::console::IoInterface; use mozart_core::console_format; use mozart_core::console_writeln; -use std::collections::BTreeMap; use std::path::Path; /// Inputs for [`do_execute`], collected from the `depends` / `prohibits` CLI args. @@ -160,11 +159,11 @@ pub struct PackageInfo { pub name: String, pub version: String, /// Runtime requirements (`require` section). - pub require: BTreeMap<String, String>, + pub require: indexmap::IndexMap<String, String>, /// Dev requirements (`require-dev`) — only non-empty for the root package. - pub require_dev: BTreeMap<String, String>, + pub require_dev: indexmap::IndexMap<String, String>, /// Conflict declarations (`conflict` section). - pub conflict: BTreeMap<String, String>, + pub conflict: indexmap::IndexMap<String, String>, /// Whether this is the root `composer.json` package. pub is_root: bool, } @@ -218,9 +217,9 @@ pub fn load_packages(working_dir: &Path, locked: bool) -> Result<Vec<PackageInfo packages.push(PackageInfo { name: pp.name.clone(), version: pp.version.clone(), - require: BTreeMap::new(), - require_dev: BTreeMap::new(), - conflict: BTreeMap::new(), + require: indexmap::IndexMap::new(), + require_dev: indexmap::IndexMap::new(), + conflict: indexmap::IndexMap::new(), is_root: false, }); } @@ -230,7 +229,7 @@ pub fn load_packages(working_dir: &Path, locked: bool) -> Result<Vec<PackageInfo && let Ok(root) = mozart_core::package::read_from_file(&composer_json_path) { // Extract conflict from extra_fields if present - let conflict: BTreeMap<String, String> = root + let conflict = root .extra_fields .get("conflict") .and_then(|v| v.as_object()) @@ -267,7 +266,7 @@ fn load_from_lockfile(lock_path: &Path) -> Result<Vec<PackageInfo>> { name: pkg.name.clone(), version: pkg.version.clone(), require: pkg.require.clone(), - require_dev: BTreeMap::new(), // locked packages don't expose require-dev + require_dev: indexmap::IndexMap::new(), // locked packages don't expose require-dev conflict: pkg.conflict.clone(), is_root: false, }); @@ -279,7 +278,7 @@ fn load_from_lockfile(lock_path: &Path) -> Result<Vec<PackageInfo>> { name: pkg.name.clone(), version: pkg.version.clone(), require: pkg.require.clone(), - require_dev: BTreeMap::new(), + require_dev: indexmap::IndexMap::new(), conflict: pkg.conflict.clone(), is_root: false, }); @@ -325,7 +324,7 @@ fn load_from_installed(working_dir: &Path) -> Result<Vec<PackageInfo>> { name: p.name.clone(), version: p.version.clone(), require, - require_dev: BTreeMap::new(), + require_dev: indexmap::IndexMap::new(), conflict, is_root: false, } @@ -367,7 +366,7 @@ fn get_dependents_forward( let needle_set: IndexSet<String> = needles.iter().map(|n| n.to_lowercase()).collect(); // Build name→PackageInfo lookup - let pkg_map: BTreeMap<String, &PackageInfo> = packages + let pkg_map: indexmap::IndexMap<_, _> = packages .iter() .map(|p| (p.name.to_lowercase(), p)) .collect(); @@ -448,7 +447,7 @@ fn collect_direct_requires(packages: &[PackageInfo], needle: &str) -> Vec<Depend fn recurse_dependents( packages: &[PackageInfo], needle: &str, - pkg_map: &BTreeMap<String, &PackageInfo>, + pkg_map: &indexmap::IndexMap<String, &PackageInfo>, visited: &mut IndexSet<String>, _original_needles: &IndexSet<String>, ) -> Vec<DependencyResult> { @@ -760,7 +759,7 @@ mod tests { .iter() .map(|(k, v)| (k.to_string(), v.to_string())) .collect(), - require_dev: BTreeMap::new(), + require_dev: indexmap::IndexMap::new(), conflict: conflict .iter() .map(|(k, v)| (k.to_string(), v.to_string())) diff --git a/crates/mozart/src/commands/diagnose.rs b/crates/mozart/src/commands/diagnose.rs index a1d655f..6b2817a 100644 --- a/crates/mozart/src/commands/diagnose.rs +++ b/crates/mozart/src/commands/diagnose.rs @@ -8,7 +8,7 @@ use mozart_core::console::IoInterface; use mozart_core::console_writeln; use mozart_core::factory::create_config; use mozart_core::http::HttpDownloader; -use mozart_core::package::CompletePackage as _; +use mozart_core::package::CompletePackageInterface as _; use std::borrow::Cow; use std::path::Path; diff --git a/crates/mozart/src/commands/exec.rs b/crates/mozart/src/commands/exec.rs index f2a9c55..1078158 100644 --- a/crates/mozart/src/commands/exec.rs +++ b/crates/mozart/src/commands/exec.rs @@ -1,6 +1,6 @@ use crate::composer::Composer; use clap::Args; -use mozart_core::package::Package as _; +use mozart_core::package::PackageInterface as _; use mozart_core::{console::IoInterface, console_writeln}; use std::path::{Path, PathBuf}; diff --git a/crates/mozart/src/commands/init.rs b/crates/mozart/src/commands/init.rs index 0e16054..4598d39 100644 --- a/crates/mozart/src/commands/init.rs +++ b/crates/mozart/src/commands/init.rs @@ -425,7 +425,7 @@ async fn build_interactive( "Would you like to define your dev dependencies (require-dev) interactively [<comment>yes</comment>]?" )) { - let all_required: BTreeMap<String, String> = require + let all_required: indexmap::IndexMap<_, _> = require .iter() .chain(require_dev.iter()) .map(|(k, v)| (k.clone(), v.clone())) @@ -493,7 +493,7 @@ async fn build_interactive( /// Returns a map of package name → version constraint selected by the user. async fn interactive_search_packages( label: &str, - already_required: &BTreeMap<String, String>, + already_required: &indexmap::IndexMap<String, String>, preferred_stability: Stability, repo_cache: &mozart_core::repository::cache::Cache, io: &std::sync::Arc<std::sync::Mutex<Box<dyn IoInterface>>>, @@ -749,8 +749,8 @@ fn get_git_config_value(key: &str) -> Option<String> { get_git_config().get(key).cloned().filter(|v| !v.is_empty()) } -fn parse_requirements(reqs: &[String]) -> anyhow::Result<BTreeMap<String, String>> { - let mut map = BTreeMap::new(); +fn parse_requirements(reqs: &[String]) -> anyhow::Result<indexmap::IndexMap<String, String>> { + let mut map = indexmap::IndexMap::new(); for req in reqs { let (name, version) = validation::parse_require_string(req).map_err(|e| anyhow::anyhow!(e))?; @@ -761,7 +761,7 @@ fn parse_requirements(reqs: &[String]) -> anyhow::Result<BTreeMap<String, String fn build_autoload(path: &str, package_name: &str) -> Option<RawAutoload> { let namespace = validation::namespace_from_package_name(package_name)?; - let mut psr4 = BTreeMap::new(); + let mut psr4 = indexmap::IndexMap::new(); psr4.insert(format!("{namespace}\\"), path.to_string()); Some(RawAutoload { psr4 }) } diff --git a/crates/mozart/src/commands/install.rs b/crates/mozart/src/commands/install.rs index 54256e2..709b934 100644 --- a/crates/mozart/src/commands/install.rs +++ b/crates/mozart/src/commands/install.rs @@ -2,7 +2,7 @@ use clap::Args; use indexmap::IndexSet; use mozart_core::console::IoInterface; use mozart_core::console_format; -use mozart_core::package::{Package as _, RootPackage as _, RootPackageData}; +use mozart_core::package::{PackageInterface as _, RootPackage as _, RootPackageData}; use mozart_core::repository::installed; use mozart_core::repository::installer_executor::{ Action, ExecuteContext, FilesystemExecutor, InstallerExecutor, PackageOperation, @@ -11,7 +11,6 @@ use mozart_core::repository::installer_executor::{ locked_to_installed_entry, previously_installed_alias_versions, }; use mozart_core::repository::lockfile; -use std::collections::BTreeMap; use std::path::Path; #[derive(Args)] @@ -212,7 +211,7 @@ fn verify_lock_platform_problems( /// `provide` is intentionally excluded — `getNames(false)` excludes it, and /// virtual `provide` targets allow multiple co-installed providers. fn verify_lock_same_name_problems(lock: &lockfile::LockFile, dev_mode: bool) -> Vec<String> { - let mut providers: BTreeMap<String, Vec<String>> = BTreeMap::new(); + let mut providers: indexmap::IndexMap<_, Vec<_>> = indexmap::IndexMap::new(); let mut all_pkgs: Vec<&lockfile::LockedPackage> = lock.packages.iter().collect(); if dev_mode { @@ -397,8 +396,8 @@ fn combine_platform_requirements( root: &RootPackageData, lock: &lockfile::LockFile, dev_mode: bool, -) -> BTreeMap<String, String> { - let mut combined: BTreeMap<String, String> = BTreeMap::new(); +) -> indexmap::IndexMap<String, String> { + let mut combined = indexmap::IndexMap::new(); if let Some(obj) = lock.platform.as_object() { for (name, val) in obj { @@ -434,7 +433,7 @@ fn combine_platform_requirements( } fn check_platform_requirements_against( - combined: &BTreeMap<String, String>, + combined: &indexmap::IndexMap<String, String>, platform: &[mozart_core::platform::PlatformPackage], ignore_platform_reqs: bool, ignore_platform_req: &[String], @@ -1081,7 +1080,6 @@ pub async fn run( #[cfg(test)] mod tests { use super::*; - use std::collections::BTreeMap; use tempfile::tempdir; fn make_locked_package(name: &str, version: &str) -> lockfile::LockedPackage { @@ -1091,11 +1089,11 @@ mod tests { version_normalized: None, source: None, dist: None, - require: BTreeMap::new(), - require_dev: BTreeMap::new(), - conflict: BTreeMap::new(), - provide: BTreeMap::new(), - replace: BTreeMap::new(), + require: indexmap::IndexMap::new(), + require_dev: indexmap::IndexMap::new(), + conflict: indexmap::IndexMap::new(), + provide: indexmap::IndexMap::new(), + replace: indexmap::IndexMap::new(), suggest: None, package_type: Some("library".to_string()), autoload: None, @@ -1108,7 +1106,7 @@ mod tests { support: None, funding: None, time: None, - extra_fields: BTreeMap::new(), + extra_fields: indexmap::IndexMap::new(), } } @@ -1125,7 +1123,7 @@ mod tests { aliases: vec![], homepage: None, support: None, - extra_fields: BTreeMap::new(), + extra_fields: indexmap::IndexMap::new(), } } @@ -1506,9 +1504,10 @@ mod tests { #[test] fn check_platform_requirements_reports_missing_extension() { - let combined: BTreeMap<String, String> = [("ext-foo".to_string(), "^10".to_string())] - .into_iter() - .collect(); + let combined: indexmap::IndexMap<String, String> = + [("ext-foo".to_string(), "^10".to_string())] + .into_iter() + .collect(); let platform = vec![pp("php", "8.2.0")]; let problems = check_platform_requirements_against(&combined, &platform, false, &[]); @@ -1521,7 +1520,7 @@ mod tests { #[test] fn check_platform_requirements_reports_unsatisfied_php() { - let combined: BTreeMap<String, String> = [("php".to_string(), "^20".to_string())] + let combined: indexmap::IndexMap<String, String> = [("php".to_string(), "^20".to_string())] .into_iter() .collect(); let platform = vec![pp("php", "8.2.0")]; @@ -1536,9 +1535,10 @@ mod tests { #[test] fn check_platform_requirements_satisfied_returns_empty() { - let combined: BTreeMap<String, String> = [("php".to_string(), "^8.0".to_string())] - .into_iter() - .collect(); + let combined: indexmap::IndexMap<String, String> = + [("php".to_string(), "^8.0".to_string())] + .into_iter() + .collect(); let platform = vec![pp("php", "8.2.0")]; let problems = check_platform_requirements_against(&combined, &platform, false, &[]); @@ -1547,9 +1547,10 @@ mod tests { #[test] fn check_platform_requirements_ignore_platform_reqs_short_circuits() { - let combined: BTreeMap<String, String> = [("ext-foo".to_string(), "^10".to_string())] - .into_iter() - .collect(); + let combined: indexmap::IndexMap<String, String> = + [("ext-foo".to_string(), "^10".to_string())] + .into_iter() + .collect(); let platform: Vec<mozart_core::platform::PlatformPackage> = vec![]; let problems = check_platform_requirements_against(&combined, &platform, true, &[]); @@ -1558,7 +1559,7 @@ mod tests { #[test] fn check_platform_requirements_specific_ignore_filters_named_packages() { - let combined: BTreeMap<String, String> = [ + let combined: indexmap::IndexMap<String, String> = [ ("ext-foo".to_string(), "^10".to_string()), ("ext-bar".to_string(), "^10".to_string()), ] diff --git a/crates/mozart/src/commands/licenses.rs b/crates/mozart/src/commands/licenses.rs index 73f2018..0e4ea0b 100644 --- a/crates/mozart/src/commands/licenses.rs +++ b/crates/mozart/src/commands/licenses.rs @@ -4,14 +4,13 @@ use indexmap::IndexMap; use mozart_core::console::IoInterface; use mozart_core::console::hyperlink; use mozart_core::console_writeln; -use mozart_core::package::Package as _; +use mozart_core::package::PackageInterface as _; use mozart_core::package_info; use mozart_core::package_info::PackageUrls; use mozart_core::package_sorter::sort_packages_alphabetically; use mozart_core::repository_utils; use mozart_core::repository_utils::Required; use serde::Serialize as _; -use std::collections::BTreeMap; #[derive(Args)] pub struct LicensesArgs { @@ -38,7 +37,7 @@ struct LicenseEntry { name: String, version: String, licenses: Vec<String>, - requires: BTreeMap<String, String>, + requires: indexmap::IndexMap<String, String>, support_source: Option<String>, source_url: Option<String>, homepage: Option<String>, @@ -48,7 +47,7 @@ impl Required for LicenseEntry { fn package_name(&self) -> &str { &self.name } - fn requires(&self) -> &BTreeMap<String, String> { + fn requires(&self) -> &indexmap::IndexMap<String, String> { &self.requires } } @@ -144,7 +143,7 @@ fn read_root_licenses(composer_json_path: &std::path::Path) -> anyhow::Result<Ve fn load_installed_entries<V>( working_dir: &std::path::Path, - root_requires: &BTreeMap<String, V>, + root_requires: &indexmap::IndexMap<String, V>, no_dev: bool, ) -> anyhow::Result<Vec<LicenseEntry>> { let vendor_dir = working_dir.join("vendor"); @@ -453,7 +452,6 @@ fn tally_licenses(entries: &[LicenseEntry]) -> Vec<(String, usize)> { #[cfg(test)] mod tests { use super::*; - use std::collections::BTreeMap; fn entry(name: &str, licenses: &[&str]) -> LicenseEntry { LicenseEntry { @@ -461,7 +459,7 @@ mod tests { name: name.to_lowercase(), version: "1.0.0".to_string(), licenses: licenses.iter().map(|s| s.to_string()).collect(), - requires: BTreeMap::new(), + requires: indexmap::IndexMap::new(), support_source: None, source_url: None, homepage: None, @@ -547,7 +545,7 @@ mod tests { #[test] fn installed_to_entry_extracts_require_and_license() { use mozart_core::repository::installed::InstalledPackageEntry; - let mut extra = BTreeMap::new(); + let mut extra = indexmap::IndexMap::new(); extra.insert("license".to_string(), serde_json::json!(["MIT"])); extra.insert( "require".to_string(), @@ -587,7 +585,7 @@ mod tests { aliases: vec![], homepage: Some("https://example.com/".to_string()), support: Some(serde_json::json!({"source": "https://github.com/v/p"})), - extra_fields: BTreeMap::new(), + extra_fields: indexmap::IndexMap::new(), }; let e = installed_to_entry(&pkg); assert_eq!(e.support_source.as_deref(), Some("https://github.com/v/p")); @@ -630,7 +628,7 @@ mod tests { aliases: vec![], homepage: None, support: None, - extra_fields: BTreeMap::new(), + extra_fields: indexmap::IndexMap::new(), }); installed.upsert(mozart_core::repository::installed::InstalledPackageEntry { name: "b/b".to_string(), @@ -644,11 +642,11 @@ mod tests { aliases: vec![], homepage: None, support: None, - extra_fields: BTreeMap::new(), + extra_fields: indexmap::IndexMap::new(), }); installed.write(&vendor_dir).unwrap(); - let mut root_req = BTreeMap::new(); + let mut root_req = indexmap::IndexMap::new(); root_req.insert("a/a".to_string(), "*".to_string()); let kept = load_installed_entries(working_dir, &root_req, true).unwrap(); @@ -679,11 +677,11 @@ mod tests { version_normalized: None, source: None, dist: None, - require: BTreeMap::new(), - require_dev: BTreeMap::new(), - conflict: BTreeMap::new(), - provide: BTreeMap::new(), - replace: BTreeMap::new(), + require: indexmap::IndexMap::new(), + require_dev: indexmap::IndexMap::new(), + conflict: indexmap::IndexMap::new(), + provide: indexmap::IndexMap::new(), + replace: indexmap::IndexMap::new(), suggest: None, package_type: None, autoload: None, @@ -696,7 +694,7 @@ mod tests { support: None, funding: None, time: None, - extra_fields: BTreeMap::new(), + extra_fields: indexmap::IndexMap::new(), }], packages_dev: Some(vec![LockedPackage { name: "phpunit/phpunit".to_string(), @@ -704,11 +702,11 @@ mod tests { version_normalized: None, source: None, dist: None, - require: BTreeMap::new(), - require_dev: BTreeMap::new(), - conflict: BTreeMap::new(), - provide: BTreeMap::new(), - replace: BTreeMap::new(), + require: indexmap::IndexMap::new(), + require_dev: indexmap::IndexMap::new(), + conflict: indexmap::IndexMap::new(), + provide: indexmap::IndexMap::new(), + replace: indexmap::IndexMap::new(), suggest: None, package_type: None, autoload: None, @@ -721,7 +719,7 @@ mod tests { support: None, funding: None, time: None, - extra_fields: BTreeMap::new(), + extra_fields: indexmap::IndexMap::new(), }]), aliases: vec![], minimum_stability: "stable".to_string(), diff --git a/crates/mozart/src/commands/remove.rs b/crates/mozart/src/commands/remove.rs index 5bb3be3..938a5d1 100644 --- a/crates/mozart/src/commands/remove.rs +++ b/crates/mozart/src/commands/remove.rs @@ -154,7 +154,7 @@ pub async fn execute( if args.dev { if composer.require_dev.contains_key(&name) { console_writeln!(io, "<info>Removing {name} from require-dev</info>"); - composer.require_dev.remove(&name); + composer.require_dev.shift_remove(&name); packages_removed.push(name); } else { io.lock().unwrap().info(&console_format!( @@ -163,11 +163,11 @@ pub async fn execute( } } else if composer.require.contains_key(&name) { console_writeln!(io, "<info>Removing {name} from require</info>"); - composer.require.remove(&name); + composer.require.shift_remove(&name); packages_removed.push(name); } else if composer.require_dev.contains_key(&name) { console_writeln!(io, "<info>Removing {name} from require-dev</info>"); - composer.require_dev.remove(&name); + composer.require_dev.shift_remove(&name); packages_removed.push(name); } else { io.lock().unwrap().info(&console_format!( @@ -682,7 +682,6 @@ mod tests { use super::*; use mozart_core::package::RawPackageData; use mozart_core::repository::lockfile; - use std::collections::BTreeMap; fn make_locked_package(name: &str, version: &str) -> lockfile::LockedPackage { lockfile::LockedPackage { @@ -691,11 +690,11 @@ mod tests { version_normalized: Some(format!("{}.0", version)), source: None, dist: None, - require: BTreeMap::new(), - require_dev: BTreeMap::new(), - conflict: BTreeMap::new(), - provide: BTreeMap::new(), - replace: BTreeMap::new(), + require: indexmap::IndexMap::new(), + require_dev: indexmap::IndexMap::new(), + conflict: indexmap::IndexMap::new(), + provide: indexmap::IndexMap::new(), + replace: indexmap::IndexMap::new(), suggest: None, package_type: Some("library".to_string()), autoload: None, @@ -708,7 +707,7 @@ mod tests { support: None, funding: None, time: None, - extra_fields: BTreeMap::new(), + extra_fields: indexmap::IndexMap::new(), } } @@ -746,7 +745,7 @@ mod tests { assert!(composer.require.contains_key("psr/log")); - composer.require.remove("psr/log"); + composer.require.shift_remove("psr/log"); assert!( !composer.require.contains_key("psr/log"), @@ -771,7 +770,7 @@ mod tests { assert!(composer.require_dev.contains_key("phpunit/phpunit")); - composer.require_dev.remove("phpunit/phpunit"); + composer.require_dev.shift_remove("phpunit/phpunit"); assert!( !composer.require_dev.contains_key("phpunit/phpunit"), @@ -792,8 +791,8 @@ mod tests { .insert("psr/log".to_string(), "^3.0".to_string()); let name = "nonexistent/package"; - let found_in_require = composer.require.remove(name).is_some(); - let found_in_require_dev = composer.require_dev.remove(name).is_some(); + let found_in_require = composer.require.shift_remove(name).is_some(); + let found_in_require_dev = composer.require_dev.shift_remove(name).is_some(); assert!(!found_in_require); assert!(!found_in_require_dev); @@ -814,9 +813,9 @@ mod tests { .insert("phpunit/phpunit".to_string(), "^11.0".to_string()); let name = "psr/log"; - let removed_from_require = composer.require.remove(name).is_some(); + let removed_from_require = composer.require.shift_remove(name).is_some(); let removed_from_dev = if !removed_from_require { - composer.require_dev.remove(name).is_some() + composer.require_dev.shift_remove(name).is_some() } else { false }; @@ -842,9 +841,9 @@ mod tests { .insert("phpunit/phpunit".to_string(), "^11.0".to_string()); let name = "phpunit/phpunit"; - let removed_from_require = composer.require.remove(name).is_some(); + let removed_from_require = composer.require.shift_remove(name).is_some(); let removed_from_dev = if !removed_from_require { - composer.require_dev.remove(name).is_some() + composer.require_dev.shift_remove(name).is_some() } else { false }; @@ -894,8 +893,8 @@ mod tests { // A glob-style name: not a valid exact package name, not in require either. let name = "vendor/*"; - let found = - composer.require.remove(name).is_some() || composer.require_dev.remove(name).is_some(); + let found = composer.require.shift_remove(name).is_some() + || composer.require_dev.shift_remove(name).is_some(); // Should NOT be found (falls through to "not required" warning), not panicked/bailed. assert!(!found, "glob name should not match any package"); @@ -1001,7 +1000,7 @@ mod tests { .write_to_file(&lock_path) .expect("should write initial lock file"); - composer.require.remove("psr/log"); + composer.require.shift_remove("psr/log"); package::write_to_file(&composer, &composer_path).unwrap(); let request2 = ResolveRequest { @@ -1084,7 +1083,7 @@ mod tests { std::fs::write(&composer_path, content).unwrap(); let mut composer: RawPackageData = serde_json::from_str(content).unwrap(); - composer.require.remove("psr/log"); + composer.require.shift_remove("psr/log"); package::write_to_file(&composer, &composer_path).unwrap(); assert!( diff --git a/crates/mozart/src/commands/require.rs b/crates/mozart/src/commands/require.rs index 3d5fcd6..f92442c 100644 --- a/crates/mozart/src/commands/require.rs +++ b/crates/mozart/src/commands/require.rs @@ -1026,9 +1026,9 @@ pub async fn execute( // Remove from the opposite section before inserting into the target. for pkg in &inconsistent { if args.dev { - raw.require.remove(pkg.as_str()); + raw.require.shift_remove(pkg.as_str()); } else { - raw.require_dev.remove(pkg.as_str()); + raw.require_dev.shift_remove(pkg.as_str()); } } @@ -1066,10 +1066,8 @@ pub async fn execute( let sort_packages = args.sort_packages || config_sort_packages; if sort_packages { - let sorted_require: std::collections::BTreeMap<_, _> = raw.require.clone(); - raw.require = sorted_require; - let sorted_dev: std::collections::BTreeMap<_, _> = raw.require_dev.clone(); - raw.require_dev = sorted_dev; + raw.require.sort_unstable_keys(); + raw.require_dev.sort_unstable_keys(); } // --- Write composer.json (unless --dry-run) --- @@ -1129,7 +1127,6 @@ pub async fn execute( #[cfg(test)] mod tests { use super::*; - use std::collections::BTreeMap; fn make_locked_package(name: &str, version: &str) -> lockfile::LockedPackage { lockfile::LockedPackage { @@ -1138,11 +1135,11 @@ mod tests { version_normalized: Some(format!("{}.0", version)), source: None, dist: None, - require: BTreeMap::new(), - require_dev: BTreeMap::new(), - conflict: BTreeMap::new(), - provide: BTreeMap::new(), - replace: BTreeMap::new(), + require: indexmap::IndexMap::new(), + require_dev: indexmap::IndexMap::new(), + conflict: indexmap::IndexMap::new(), + provide: indexmap::IndexMap::new(), + replace: indexmap::IndexMap::new(), suggest: None, package_type: Some("library".to_string()), autoload: None, @@ -1155,7 +1152,7 @@ mod tests { support: None, funding: None, time: None, - extra_fields: BTreeMap::new(), + extra_fields: indexmap::IndexMap::new(), } } @@ -1176,35 +1173,6 @@ mod tests { } } - /// Verify that --sort-packages sorts both require and require-dev maps. - #[test] - fn test_sort_packages_sorts_both_sections() { - use mozart_core::package::RawPackageData; - - let mut raw = RawPackageData::new("test/project".to_string()); - raw.require - .insert("z/package".to_string(), "^1.0".to_string()); - raw.require - .insert("a/package".to_string(), "^2.0".to_string()); - raw.require - .insert("m/package".to_string(), "^3.0".to_string()); - raw.require_dev - .insert("z/dev".to_string(), "^1.0".to_string()); - raw.require_dev - .insert("a/dev".to_string(), "^2.0".to_string()); - - let sorted_require: BTreeMap<String, String> = raw.require.clone(); - raw.require = sorted_require; - let sorted_dev: BTreeMap<String, String> = raw.require_dev.clone(); - raw.require_dev = sorted_dev; - - let require_keys: Vec<_> = raw.require.keys().collect(); - assert_eq!(require_keys, vec!["a/package", "m/package", "z/package"]); - - let dev_keys: Vec<_> = raw.require_dev.keys().collect(); - assert_eq!(dev_keys, vec!["a/dev", "z/dev"]); - } - /// Verify that compute_update_changes produces correct Install entries for new packages. #[test] fn test_require_change_report_new_packages() { diff --git a/crates/mozart/src/commands/show.rs b/crates/mozart/src/commands/show.rs index d0a2218..81eaaad 100644 --- a/crates/mozart/src/commands/show.rs +++ b/crates/mozart/src/commands/show.rs @@ -6,7 +6,6 @@ use mozart_core::console_writeln; use mozart_core::console_writeln_error; use mozart_core::matches_wildcard; use mozart_core::platform::is_platform_package; -use std::collections::BTreeMap; use std::path::Path; #[derive(Default, Args)] @@ -255,15 +254,15 @@ struct PackageDetail { support: Option<serde_json::Value>, /// A13: autoload rules. autoload: Option<serde_json::Value>, - require: BTreeMap<String, String>, - require_dev: BTreeMap<String, String>, + require: indexmap::IndexMap<String, String>, + require_dev: indexmap::IndexMap<String, String>, /// A12: conflict links. - conflict: BTreeMap<String, String>, + conflict: indexmap::IndexMap<String, String>, /// A12: provide links. - provide: BTreeMap<String, String>, + provide: indexmap::IndexMap<String, String>, /// A12: replace links. - replace: BTreeMap<String, String>, - suggest: BTreeMap<String, String>, + replace: indexmap::IndexMap<String, String>, + suggest: indexmap::IndexMap<String, String>, } #[derive(Debug, Clone, Copy, PartialEq, Eq)] @@ -1132,7 +1131,7 @@ async fn print_package_detail( /// Print a named section of package links (requires, conflict, etc.). fn print_links_section( label: &str, - links: &BTreeMap<String, String>, + links: &indexmap::IndexMap<String, String>, io: std::sync::Arc<std::sync::Mutex<Box<dyn IoInterface>>>, ) { if links.is_empty() { @@ -2077,7 +2076,7 @@ fn get_installed_release_date( fn get_installed_link_map( pkg: &mozart_core::repository::installed::InstalledPackageEntry, key: &str, -) -> BTreeMap<String, String> { +) -> indexmap::IndexMap<String, String> { pkg.extra_fields .get(key) .and_then(|v| v.as_object()) @@ -2092,7 +2091,7 @@ fn get_installed_link_map( /// Extract a map of `{package: reason}` from an installed package's suggest field. fn get_installed_suggest_map( pkg: &mozart_core::repository::installed::InstalledPackageEntry, -) -> BTreeMap<String, String> { +) -> indexmap::IndexMap<String, String> { pkg.extra_fields .get("suggest") .and_then(|v| v.as_object()) @@ -2268,8 +2267,7 @@ mod tests { #[test] fn test_get_installed_description_present() { - use std::collections::BTreeMap; - let mut extra = BTreeMap::new(); + let mut extra = indexmap::IndexMap::new(); extra.insert( "description".to_string(), serde_json::Value::String("A logging library".to_string()), @@ -2293,7 +2291,6 @@ mod tests { #[test] fn test_get_installed_description_absent() { - use std::collections::BTreeMap; let pkg = mozart_core::repository::installed::InstalledPackageEntry { name: "psr/log".to_string(), version: "3.0.0".to_string(), @@ -2306,15 +2303,14 @@ mod tests { aliases: vec![], homepage: None, support: None, - extra_fields: BTreeMap::new(), + extra_fields: indexmap::IndexMap::new(), }; assert_eq!(get_installed_description(&pkg), ""); } #[test] fn test_get_installed_keywords() { - use std::collections::BTreeMap; - let mut extra = BTreeMap::new(); + let mut extra = indexmap::IndexMap::new(); extra.insert( "keywords".to_string(), serde_json::json!(["log", "psr3", "logging"]), diff --git a/crates/mozart/src/commands/suggests.rs b/crates/mozart/src/commands/suggests.rs index b882f5c..ca8e5fe 100644 --- a/crates/mozart/src/commands/suggests.rs +++ b/crates/mozart/src/commands/suggests.rs @@ -235,11 +235,10 @@ fn build_root_info(root: Option<&mozart_core::package::RawPackageData>) -> RootI mod tests { use super::*; use mozart_core::installer::{HasSuggests, InstalledRepoLite, RootInfo}; - use std::collections::BTreeMap; fn make_locked_package( name: &str, - suggest: Option<BTreeMap<String, String>>, + suggest: Option<indexmap::IndexMap<String, String>>, ) -> mozart_core::repository::lockfile::LockedPackage { mozart_core::repository::lockfile::LockedPackage { name: name.to_string(), @@ -247,11 +246,11 @@ mod tests { version_normalized: None, source: None, dist: None, - require: BTreeMap::new(), - require_dev: BTreeMap::new(), - conflict: BTreeMap::new(), - provide: BTreeMap::new(), - replace: BTreeMap::new(), + require: indexmap::IndexMap::new(), + require_dev: indexmap::IndexMap::new(), + conflict: indexmap::IndexMap::new(), + provide: indexmap::IndexMap::new(), + replace: indexmap::IndexMap::new(), suggest, package_type: None, autoload: None, @@ -264,15 +263,15 @@ mod tests { support: None, funding: None, time: None, - extra_fields: BTreeMap::new(), + extra_fields: indexmap::IndexMap::new(), } } fn make_installed_entry( name: &str, - suggest: Option<BTreeMap<String, String>>, + suggest: Option<indexmap::IndexMap<String, String>>, ) -> mozart_core::repository::installed::InstalledPackageEntry { - let mut extra_fields: BTreeMap<String, serde_json::Value> = BTreeMap::new(); + let mut extra_fields = indexmap::IndexMap::new(); if let Some(s) = suggest { let map: serde_json::Map<String, serde_json::Value> = s .into_iter() @@ -322,7 +321,7 @@ mod tests { #[test] fn locked_package_implements_has_suggests() { - let mut suggest = BTreeMap::new(); + let mut suggest = indexmap::IndexMap::new(); suggest.insert("ext-intl".to_string(), "for i18n".to_string()); suggest.insert("ext-redis".to_string(), "for cache".to_string()); let pkg = make_locked_package("vendor/a", Some(suggest)); @@ -333,7 +332,7 @@ mod tests { #[test] fn installed_entry_reads_suggest_from_extra_fields() { - let mut suggest = BTreeMap::new(); + let mut suggest = indexmap::IndexMap::new(); suggest.insert("ext-redis".to_string(), "for cache".to_string()); let entry = make_installed_entry("vendor/cache", Some(suggest)); let pairs = entry.suggests(); @@ -413,15 +412,15 @@ mod tests { license: None, authors: vec![], minimum_stability: None, - require: BTreeMap::new(), - require_dev: BTreeMap::new(), - conflict: BTreeMap::new(), - provide: BTreeMap::new(), - replace: BTreeMap::new(), + require: indexmap::IndexMap::new(), + require_dev: indexmap::IndexMap::new(), + conflict: indexmap::IndexMap::new(), + provide: indexmap::IndexMap::new(), + replace: indexmap::IndexMap::new(), repositories: vec![], autoload: None, bin: vec![], - extra_fields: BTreeMap::new(), + extra_fields: indexmap::IndexMap::new(), }; root.require.insert("vendor/a".into(), "^1.0".into()); root.require_dev.insert("vendor/b".into(), "^2.0".into()); @@ -437,7 +436,7 @@ mod tests { let console = console(); let mut reporter = SuggestedPackagesReporter::new(&console); - let mut suggest = BTreeMap::new(); + let mut suggest = indexmap::IndexMap::new(); suggest.insert("ext-intl".to_string(), "for i18n".to_string()); suggest.insert("vendor/optional".to_string(), "Optional".to_string()); let pkg = make_locked_package("vendor/a", Some(suggest)); @@ -452,7 +451,7 @@ mod tests { let console = console(); let mut reporter = SuggestedPackagesReporter::new(&console); - let mut suggest = BTreeMap::new(); + let mut suggest = indexmap::IndexMap::new(); suggest.insert("vendor/already-here".to_string(), "".to_string()); suggest.insert("vendor/not-here".to_string(), "".to_string()); let pkg = make_locked_package("vendor/a", Some(suggest)); diff --git a/crates/mozart/src/commands/update.rs b/crates/mozart/src/commands/update.rs index f482272..334e221 100644 --- a/crates/mozart/src/commands/update.rs +++ b/crates/mozart/src/commands/update.rs @@ -1803,7 +1803,6 @@ pub async fn run( #[cfg(test)] mod tests { use super::*; - use std::collections::BTreeMap; fn make_locked_package(name: &str, version: &str) -> lockfile::LockedPackage { lockfile::LockedPackage { @@ -1812,11 +1811,11 @@ mod tests { version_normalized: Some(format!("{}.0", version)), source: None, dist: None, - require: BTreeMap::new(), - require_dev: BTreeMap::new(), - conflict: BTreeMap::new(), - provide: BTreeMap::new(), - replace: BTreeMap::new(), + require: indexmap::IndexMap::new(), + require_dev: indexmap::IndexMap::new(), + conflict: indexmap::IndexMap::new(), + provide: indexmap::IndexMap::new(), + replace: indexmap::IndexMap::new(), suggest: None, package_type: Some("library".to_string()), autoload: None, @@ -1829,7 +1828,7 @@ mod tests { support: None, funding: None, time: None, - extra_fields: BTreeMap::new(), + extra_fields: indexmap::IndexMap::new(), } } |
