aboutsummaryrefslogtreecommitdiffhomepage
path: root/crates/mozart/src
diff options
context:
space:
mode:
authornsfisis <nsfisis@gmail.com>2026-05-11 02:05:34 +0900
committernsfisis <nsfisis@gmail.com>2026-05-11 02:05:34 +0900
commit4df5f8491320e5795718cf0222e80fa27e57c8ad (patch)
tree707e19f34dbdef18490ec3245d34389e3d189a57 /crates/mozart/src
parent8871b923fa3df1935c263db155cb8bc3d59705cd (diff)
downloadphp-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')
-rw-r--r--crates/mozart/src/commands/audit.rs44
-rw-r--r--crates/mozart/src/commands/browse.rs2
-rw-r--r--crates/mozart/src/commands/bump.rs16
-rw-r--r--crates/mozart/src/commands/check_platform_reqs.rs89
-rw-r--r--crates/mozart/src/commands/dependency.rs27
-rw-r--r--crates/mozart/src/commands/diagnose.rs2
-rw-r--r--crates/mozart/src/commands/exec.rs2
-rw-r--r--crates/mozart/src/commands/init.rs10
-rw-r--r--crates/mozart/src/commands/install.rs51
-rw-r--r--crates/mozart/src/commands/licenses.rs46
-rw-r--r--crates/mozart/src/commands/remove.rs43
-rw-r--r--crates/mozart/src/commands/require.rs52
-rw-r--r--crates/mozart/src/commands/show.rs28
-rw-r--r--crates/mozart/src/commands/suggests.rs39
-rw-r--r--crates/mozart/src/commands/update.rs13
-rw-r--r--crates/mozart/src/factory.rs2
16 files changed, 222 insertions, 244 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(),
}
}
diff --git a/crates/mozart/src/factory.rs b/crates/mozart/src/factory.rs
index 41f157a..581b53a 100644
--- a/crates/mozart/src/factory.rs
+++ b/crates/mozart/src/factory.rs
@@ -368,7 +368,7 @@ mod tests {
r#"{"name": "acme/app", "require": {"vendor/pkg": "^1.0"}}"#,
);
- use mozart_core::package::Package;
+ use mozart_core::package::PackageInterface;
let composer = Composer::require(io(), dir.path()).unwrap();
assert_eq!(composer.package().name(), "acme/app");
assert_eq!(