diff options
| author | nsfisis <nsfisis@gmail.com> | 2026-02-22 00:37:54 +0900 |
|---|---|---|
| committer | nsfisis <nsfisis@gmail.com> | 2026-02-22 00:37:54 +0900 |
| commit | 0a8e5935e6305819bb02d8c69e2f046ff397913a (patch) | |
| tree | e5a288e679477b1603d7989e986ca22bbe590aa4 /crates/mozart/src/commands/suggests.rs | |
| parent | b5af594fec7da72b15c9a202c641af0494db6355 (diff) | |
| download | php-mozart-0a8e5935e6305819bb02d8c69e2f046ff397913a.tar.gz php-mozart-0a8e5935e6305819bb02d8c69e2f046ff397913a.tar.zst php-mozart-0a8e5935e6305819bb02d8c69e2f046ff397913a.zip | |
refactor(workspace): split monolithic crate into 6 workspace crates
Extract modules from the single `mozart` crate into 5 focused library
crates to improve compilation parallelism and architectural clarity:
- mozart-constraint: version constraint parser (independent)
- mozart-core: base types, console, validation, platform utilities
- mozart-archiver: archive creation (tar, zip, bzip2)
- mozart-registry: Packagist API, cache, resolver, downloader, lockfile
- mozart-autoload: autoloader generation and PHP scanner
Refactor Console::from_cli and build_cache_config to accept primitive
args instead of &Cli to break circular dependencies. Introduce
[workspace.dependencies] for centralized version management. Remove 9
unused direct dependencies from the CLI crate.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Diffstat (limited to 'crates/mozart/src/commands/suggests.rs')
| -rw-r--r-- | crates/mozart/src/commands/suggests.rs | 47 |
1 files changed, 26 insertions, 21 deletions
diff --git a/crates/mozart/src/commands/suggests.rs b/crates/mozart/src/commands/suggests.rs index df58e47..d528171 100644 --- a/crates/mozart/src/commands/suggests.rs +++ b/crates/mozart/src/commands/suggests.rs @@ -41,7 +41,7 @@ struct Suggestion { pub fn execute( args: &SuggestsArgs, cli: &super::Cli, - _console: &crate::console::Console, + _console: &mozart_core::console::Console, ) -> anyhow::Result<()> { let working_dir = match &cli.working_dir { Some(dir) => PathBuf::from(dir), @@ -160,9 +160,10 @@ fn collect_suggestions_from_locked( no_dev: bool, ) -> anyhow::Result<Vec<Suggestion>> { let lock_path = working_dir.join("composer.lock"); - let lock = crate::lockfile::LockFile::read_from_file(&lock_path)?; + let lock = mozart_registry::lockfile::LockFile::read_from_file(&lock_path)?; - let mut all_packages: Vec<&crate::lockfile::LockedPackage> = lock.packages.iter().collect(); + let mut all_packages: Vec<&mozart_registry::lockfile::LockedPackage> = + lock.packages.iter().collect(); if !no_dev && let Some(ref pkgs_dev) = lock.packages_dev { all_packages.extend(pkgs_dev.iter()); } @@ -187,7 +188,7 @@ fn collect_suggestions_from_installed( no_dev: bool, ) -> anyhow::Result<Vec<Suggestion>> { let vendor_dir = working_dir.join("vendor"); - let installed = crate::installed::InstalledPackages::read(&vendor_dir)?; + let installed = mozart_registry::installed::InstalledPackages::read(&vendor_dir)?; if installed.packages.is_empty() { let installed_json = vendor_dir.join("composer/installed.json"); @@ -233,7 +234,7 @@ fn collect_suggestions_from_root(working_dir: &Path) -> anyhow::Result<Vec<Sugge return Ok(vec![]); } - let root = crate::package::read_from_file(&composer_json_path)?; + let root = mozart_core::package::read_from_file(&composer_json_path)?; // suggest is in extra_fields since RawPackageData doesn't model it explicitly let suggest_val = root.extra_fields.get("suggest"); @@ -264,11 +265,12 @@ fn collect_installed_names_from_lock( no_dev: bool, ) -> anyhow::Result<HashSet<String>> { let lock_path = working_dir.join("composer.lock"); - let lock = crate::lockfile::LockFile::read_from_file(&lock_path)?; + let lock = mozart_registry::lockfile::LockFile::read_from_file(&lock_path)?; let mut names: HashSet<String> = HashSet::new(); - let mut all_packages: Vec<&crate::lockfile::LockedPackage> = lock.packages.iter().collect(); + let mut all_packages: Vec<&mozart_registry::lockfile::LockedPackage> = + lock.packages.iter().collect(); if !no_dev && let Some(ref pkgs_dev) = lock.packages_dev { all_packages.extend(pkgs_dev.iter()); } @@ -299,7 +301,7 @@ fn collect_installed_names_from_installed( no_dev: bool, ) -> anyhow::Result<HashSet<String>> { let vendor_dir = working_dir.join("vendor"); - let installed = crate::installed::InstalledPackages::read(&vendor_dir)?; + let installed = mozart_registry::installed::InstalledPackages::read(&vendor_dir)?; let dev_names: HashSet<String> = installed .dev_package_names @@ -330,7 +332,7 @@ fn collect_installed_names_from_installed( // Add platform packages from require/require-dev in composer.json let composer_json_path = working_dir.join("composer.json"); if composer_json_path.exists() - && let Ok(root) = crate::package::read_from_file(&composer_json_path) + && let Ok(root) = mozart_core::package::read_from_file(&composer_json_path) { for name in root.require.keys().chain(root.require_dev.keys()) { if is_platform_package(name) { @@ -342,7 +344,10 @@ fn collect_installed_names_from_installed( Ok(names) } -fn add_platform_names_from_lock(lock: &crate::lockfile::LockFile, names: &mut HashSet<String>) { +fn add_platform_names_from_lock( + lock: &mozart_registry::lockfile::LockFile, + names: &mut HashSet<String>, +) { // Collect platform keys from the lock's platform and platform_dev objects if let Some(obj) = lock.platform.as_object() { for key in obj.keys() { @@ -372,7 +377,7 @@ fn compute_direct_deps(working_dir: &Path) -> anyhow::Result<HashSet<String>> { if !composer_json_path.exists() { return Ok(HashSet::new()); } - let root = crate::package::read_from_file(&composer_json_path)?; + let root = mozart_core::package::read_from_file(&composer_json_path)?; let mut deps: HashSet<String> = HashSet::new(); for name in root.require.keys().chain(root.require_dev.keys()) { deps.insert(name.to_lowercase()); @@ -447,8 +452,8 @@ mod tests { fn make_locked_package( name: &str, suggest: Option<BTreeMap<String, String>>, - ) -> crate::lockfile::LockedPackage { - crate::lockfile::LockedPackage { + ) -> mozart_registry::lockfile::LockedPackage { + mozart_registry::lockfile::LockedPackage { name: name.to_string(), version: "1.0.0".to_string(), version_normalized: None, @@ -476,7 +481,7 @@ mod tests { fn make_installed_entry( name: &str, suggest: Option<BTreeMap<String, String>>, - ) -> crate::installed::InstalledPackageEntry { + ) -> mozart_registry::installed::InstalledPackageEntry { let mut extra_fields: BTreeMap<String, serde_json::Value> = BTreeMap::new(); if let Some(s) = suggest { let map: serde_json::Map<String, serde_json::Value> = s @@ -485,7 +490,7 @@ mod tests { .collect(); extra_fields.insert("suggest".to_string(), serde_json::Value::Object(map)); } - crate::installed::InstalledPackageEntry { + mozart_registry::installed::InstalledPackageEntry { name: name.to_string(), version: "1.0.0".to_string(), version_normalized: None, @@ -500,11 +505,11 @@ mod tests { } fn minimal_lock( - packages: Vec<crate::lockfile::LockedPackage>, - packages_dev: Option<Vec<crate::lockfile::LockedPackage>>, - ) -> crate::lockfile::LockFile { - crate::lockfile::LockFile { - readme: crate::lockfile::LockFile::default_readme(), + packages: Vec<mozart_registry::lockfile::LockedPackage>, + packages_dev: Option<Vec<mozart_registry::lockfile::LockedPackage>>, + ) -> mozart_registry::lockfile::LockFile { + mozart_registry::lockfile::LockFile { + readme: mozart_registry::lockfile::LockFile::default_readme(), content_hash: "abc123".to_string(), packages, packages_dev, @@ -687,7 +692,7 @@ mod tests { let mut suggest = BTreeMap::new(); suggest.insert("ext-redis".to_string(), "For Redis caching".to_string()); - let mut installed = crate::installed::InstalledPackages::new(); + let mut installed = mozart_registry::installed::InstalledPackages::new(); installed.upsert(make_installed_entry("vendor/cache", Some(suggest))); installed.upsert(make_installed_entry("vendor/other", None)); installed.write(&vendor_dir).unwrap(); |
