diff options
| author | nsfisis <nsfisis@gmail.com> | 2026-06-27 08:44:57 +0900 |
|---|---|---|
| committer | nsfisis <nsfisis@gmail.com> | 2026-06-27 08:44:57 +0900 |
| commit | 901878ee3f2bee6605b02d321cc4c92bc32fd5b0 (patch) | |
| tree | 83d8c8c9a24cb95c0656866d328b87c2d4c5127f /crates/shirabe/tests/composer_test.rs | |
| parent | 5c2c72223cb6b4d77a332eeeeff7ee4e82e3f239 (diff) | |
| download | php-shirabe-901878ee3f2bee6605b02d321cc4c92bc32fd5b0.tar.gz php-shirabe-901878ee3f2bee6605b02d321cc4c92bc32fd5b0.tar.zst php-shirabe-901878ee3f2bee6605b02d321cc4c92bc32fd5b0.zip | |
refactor(composer): hold managers behind *Interface traits
Composer/PartialComposer exposed its RepositoryManager, InstallationManager,
EventDispatcher, Locker, DownloadManager, AutoloadGenerator and ArchiveManager
as concrete types, but Composer's public setters (setDownloadManager() etc.)
let plugins swap in subclasses. Introduce a *Interface trait per manager and
store each as Rc<RefCell<dyn ...Interface>> so a replacement is honored.
Only Composer's slots and the sinks fed from its accessors become trait
objects; managers injected concretely at construction keep their concrete
references, matching PHP semantics. Fluent setters on the affected classes now
return () and Locker::update_hash is de-generified to a boxed FnOnce so the
traits stay object-safe.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Diffstat (limited to 'crates/shirabe/tests/composer_test.rs')
| -rw-r--r-- | crates/shirabe/tests/composer_test.rs | 22 |
1 files changed, 11 insertions, 11 deletions
diff --git a/crates/shirabe/tests/composer_test.rs b/crates/shirabe/tests/composer_test.rs index 908e813..bffe4ce 100644 --- a/crates/shirabe/tests/composer_test.rs +++ b/crates/shirabe/tests/composer_test.rs @@ -7,12 +7,15 @@ use indexmap::IndexMap; use shirabe::composer::Composer; use shirabe::config::Config; use shirabe::downloader::DownloadManager; +use shirabe::downloader::DownloadManagerInterface; use shirabe::installer::InstallationManager; +use shirabe::installer::InstallationManagerInterface; use shirabe::io::IOInterface; use shirabe::io::null_io::NullIO; use shirabe::json::JsonFile; -use shirabe::package::{Locker, RootPackageHandle, RootPackageInterfaceHandle}; +use shirabe::package::{Locker, LockerInterface, RootPackageHandle, RootPackageInterfaceHandle}; use shirabe::repository::RepositoryManager; +use shirabe::repository::RepositoryManagerInterface; use shirabe::util::http_downloader::HttpDownloader; use shirabe::util::r#loop::Loop; use shirabe::util::process_executor::ProcessExecutor; @@ -60,7 +63,7 @@ fn test_set_get_locker() { let io = null_io(); let json_file = JsonFile::new("composer.lock".to_string(), None, None).unwrap(); let process = Rc::new(RefCell::new(ProcessExecutor::new(Some(io.clone())))); - let locker = Rc::new(RefCell::new(Locker::new( + let locker: Rc<RefCell<dyn LockerInterface>> = Rc::new(RefCell::new(Locker::new( io.clone(), json_file, installation_manager(&io), @@ -77,13 +80,9 @@ fn test_set_get_repository_manager() { let mut composer = Composer::new(); let io = null_io(); let config = Rc::new(RefCell::new(Config::new(false, None))); - let manager = Rc::new(RefCell::new(RepositoryManager::new( - io.clone(), - config, - http_downloader(&io), - None, - None, - ))); + let manager: Rc<RefCell<dyn RepositoryManagerInterface>> = Rc::new(RefCell::new( + RepositoryManager::new(io.clone(), config, http_downloader(&io), None, None), + )); composer.set_repository_manager(manager.clone()); assert!(Rc::ptr_eq(&composer.get_repository_manager(), &manager)); @@ -92,7 +91,8 @@ fn test_set_get_repository_manager() { #[test] fn test_set_get_download_manager() { let mut composer = Composer::new(); - let manager = Rc::new(RefCell::new(DownloadManager::new(null_io(), false, None))); + let manager: Rc<RefCell<dyn DownloadManagerInterface>> = + Rc::new(RefCell::new(DownloadManager::new(null_io(), false, None))); composer.set_download_manager(manager.clone()); assert!(Rc::ptr_eq(&composer.get_download_manager(), &manager)); @@ -102,7 +102,7 @@ fn test_set_get_download_manager() { fn test_set_get_installation_manager() { let mut composer = Composer::new(); let io = null_io(); - let manager = installation_manager(&io); + let manager: Rc<RefCell<dyn InstallationManagerInterface>> = installation_manager(&io); composer.set_installation_manager(manager.clone()); assert!(Rc::ptr_eq(&composer.get_installation_manager(), &manager)); |
