diff options
| author | nsfisis <nsfisis@gmail.com> | 2026-06-04 21:09:02 +0900 |
|---|---|---|
| committer | nsfisis <nsfisis@gmail.com> | 2026-06-04 21:09:02 +0900 |
| commit | 06e8e14520a4a38fed500581d2b75a42418b22c4 (patch) | |
| tree | 573af18bf6e0933488aea9c1bac47bf4e857546d /crates/shirabe/src/command | |
| parent | a9f19862350c6fd3592d93515d869ffe07ecb399 (diff) | |
| download | php-shirabe-06e8e14520a4a38fed500581d2b75a42418b22c4.tar.gz php-shirabe-06e8e14520a4a38fed500581d2b75a42418b22c4.tar.zst php-shirabe-06e8e14520a4a38fed500581d2b75a42418b22c4.zip | |
feat(package): implement PackageInterface accessor layer for Package/CompletePackage/RootPackage
Fill the trait-impl todo!() across the package accessor layer so loaded
packages are actually usable (the ArrayLoader::load path depends on it):
- Package: implement BasePackage/PackageInterface from struct fields and
existing inherent methods; Display via get_unique_name.
- CompletePackage: delegate PackageInterface to inner Package.
- RootPackage: delegate CompletePackageInterface/PackageInterface to inner
CompletePackage; RootPackageInterface link setters delegate to Package.
Correct three unfaithful trait signatures found during implementation:
- get_target_dir returns Option<String> (PHP computes a normalized value;
a borrow cannot represent it, and AliasPackage could not implement &str
across its aliasOf handle).
- RootPackageInterface link setters take IndexMap<String, Link>, matching
Package and the real ArrayLoader caller (PHP RootPackage inherits
Package::setRequires; the Link[] docblock was imprecise).
- get_full_pretty_version takes a DisplayMode enum instead of a raw i64;
the match is now exhaustive, so it returns String without an error path.
Move mirror conversion to the boundaries: PackageInterface mirror methods
use Vec<Mirror> (the typed form, matching the inherent methods), with
array<->Mirror conversion done by the producer (ComposerRepository) and
consumer (ArrayDumper).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Diffstat (limited to 'crates/shirabe/src/command')
| -rw-r--r-- | crates/shirabe/src/command/create_project_command.rs | 5 | ||||
| -rw-r--r-- | crates/shirabe/src/command/licenses_command.rs | 18 | ||||
| -rw-r--r-- | crates/shirabe/src/command/show_command.rs | 29 |
3 files changed, 29 insertions, 23 deletions
diff --git a/crates/shirabe/src/command/create_project_command.rs b/crates/shirabe/src/command/create_project_command.rs index efbfd44..1667ac1 100644 --- a/crates/shirabe/src/command/create_project_command.rs +++ b/crates/shirabe/src/command/create_project_command.rs @@ -895,10 +895,7 @@ impl CreateProjectCommand { io.write_error(&format!( "<info>Installing {} ({})</info>", package.get_name(), - package.get_full_pretty_version( - false, - <dyn crate::package::PackageInterface>::DISPLAY_SOURCE_REF_IF_DEV - ) + package.get_full_pretty_version(false, crate::package::DisplayMode::SourceRefIfDev) )); if disable_plugins { diff --git a/crates/shirabe/src/command/licenses_command.rs b/crates/shirabe/src/command/licenses_command.rs index 681ac7a..ddd7d3d 100644 --- a/crates/shirabe/src/command/licenses_command.rs +++ b/crates/shirabe/src/command/licenses_command.rs @@ -19,7 +19,6 @@ use crate::json::JsonFile; use crate::package::BasePackage; use crate::package::CompletePackage; use crate::package::CompletePackageInterface; -use crate::package::PackageInterface; use crate::plugin::CommandEvent; use crate::plugin::PluginEvents; use crate::repository::CanonicalPackagesTrait; @@ -178,14 +177,10 @@ impl LicensesCommand { }; table.add_row(PhpMixed::List(vec![ Box::new(PhpMixed::String(name)), - Box::new(PhpMixed::String( - package - .get_full_pretty_version( - false, - <dyn PackageInterface>::DISPLAY_SOURCE_REF_IF_DEV, - ) - .to_string(), - )), + Box::new(PhpMixed::String(package.get_full_pretty_version( + false, + crate::package::DisplayMode::SourceRefIfDev, + ))), Box::new(PhpMixed::String(licenses_str)), ])); } @@ -203,7 +198,10 @@ impl LicensesCommand { let mut dep_info: IndexMap<String, PhpMixed> = IndexMap::new(); dep_info.insert( "version".to_string(), - PhpMixed::String(package.get_full_pretty_version(true, 0).to_string()), + PhpMixed::String(package.get_full_pretty_version( + true, + crate::package::DisplayMode::SourceRefIfDev, + )), ); dep_info.insert( "license".to_string(), diff --git a/crates/shirabe/src/command/show_command.rs b/crates/shirabe/src/command/show_command.rs index e7fcfe1..f992798 100644 --- a/crates/shirabe/src/command/show_command.rs +++ b/crates/shirabe/src/command/show_command.rs @@ -606,8 +606,9 @@ impl ShowCommand { && latest_package .as_ref() .unwrap() - .get_full_pretty_version(true, 0) - != package.get_full_pretty_version(true, 0) + .get_full_pretty_version(true, crate::package::DisplayMode::SourceRefIfDev) + != package + .get_full_pretty_version(true, crate::package::DisplayMode::SourceRefIfDev) && (latest_package .as_ref() .unwrap() @@ -905,9 +906,13 @@ impl ShowCommand { // Determine if Composer is checking outdated dependencies and if current package should trigger non-default exit code let mut package_is_up_to_date = if let Some(latest) = latest_package { - latest.get_full_pretty_version(true, 0) - == package.get_full_pretty_version(true, 0) - && latest.as_complete().map_or(true, |c| !c.is_abandoned()) + latest.get_full_pretty_version( + true, + crate::package::DisplayMode::SourceRefIfDev, + ) == package.get_full_pretty_version( + true, + crate::package::DisplayMode::SourceRefIfDev, + ) && latest.as_complete().map_or(true, |c| !c.is_abandoned()) } else { false }; @@ -967,7 +972,10 @@ impl ShowCommand { } name_length = name_length.max(package.get_pretty_name().len()); if write_version { - let mut version_str = package.get_full_pretty_version(true, 0); + let mut version_str = package.get_full_pretty_version( + true, + crate::package::DisplayMode::SourceRefIfDev, + ); if format == "text" { version_str = version_str.trim_start_matches('v').to_string(); } @@ -1003,7 +1011,10 @@ impl ShowCommand { } if write_latest && latest_package.is_some() { let latest = latest_package.unwrap(); - let mut latest_version_str = latest.get_full_pretty_version(true, 0); + let mut latest_version_str = latest.get_full_pretty_version( + true, + crate::package::DisplayMode::SourceRefIfDev, + ); if format == "text" { latest_version_str = latest_version_str.trim_start_matches('v').to_string(); @@ -2518,8 +2529,8 @@ impl ShowCommand { latest_package: PackageInterfaceHandle, package: PackageInterfaceHandle, ) -> String { - if latest_package.get_full_pretty_version(true, 0) - == package.get_full_pretty_version(true, 0) + if latest_package.get_full_pretty_version(true, crate::package::DisplayMode::SourceRefIfDev) + == package.get_full_pretty_version(true, crate::package::DisplayMode::SourceRefIfDev) { return "up-to-date".to_string(); } |
