aboutsummaryrefslogtreecommitdiffhomepage
path: root/crates/mozart/src/commands/licenses.rs
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/commands/licenses.rs
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/commands/licenses.rs')
-rw-r--r--crates/mozart/src/commands/licenses.rs46
1 files changed, 22 insertions, 24 deletions
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(),