diff options
Diffstat (limited to 'crates')
| -rw-r--r-- | crates/shirabe/src/command/create_project_command.rs | 4 | ||||
| -rw-r--r-- | crates/shirabe/src/command/show_command.rs | 6 | ||||
| -rw-r--r-- | crates/shirabe/src/package/dumper/array_dumper.rs | 4 | ||||
| -rw-r--r-- | crates/shirabe/src/package/package_interface.rs | 13 | ||||
| -rw-r--r-- | crates/shirabe/tests/command/show_command_test.rs | 153 |
5 files changed, 164 insertions, 16 deletions
diff --git a/crates/shirabe/src/command/create_project_command.rs b/crates/shirabe/src/command/create_project_command.rs index a2b44713..7f85b17d 100644 --- a/crates/shirabe/src/command/create_project_command.rs +++ b/crates/shirabe/src/command/create_project_command.rs @@ -392,8 +392,8 @@ impl CreateProjectCommand { )?)), false, ); - for (r#type, _meta) in SUPPORTED_LINK_TYPES.iter() { - for link in package.get_links_for_type(r#type).values() { + for (r#type, meta) in SUPPORTED_LINK_TYPES.iter() { + for link in package.get_links_for_type(meta.method).values() { if link.get_pretty_constraint() == "self.version" { config_source.add_link( r#type, diff --git a/crates/shirabe/src/command/show_command.rs b/crates/shirabe/src/command/show_command.rs index f1123e14..a4177b1d 100644 --- a/crates/shirabe/src/command/show_command.rs +++ b/crates/shirabe/src/command/show_command.rs @@ -594,9 +594,6 @@ impl ShowCommand { ) { let title = title.unwrap_or(link_type); let io = self.get_io(); - // TODO(port): `get_links_for_type` matches the composer.json key names ("require", - // "require-dev", ...), not the `Link::TYPE_*` values passed here, so it always returns - // an empty map and these sections never print. PHP dispatches on `Link::$TYPES`. let links = package.get_links_for_type(link_type); if !links.is_empty() { io.write(&format!("\n<info>{}</info>", title)); @@ -844,9 +841,6 @@ impl ShowCommand { package: CompletePackageInterfaceHandle, link_type: &str, ) { - // TODO(port): `get_links_for_type` matches the composer.json key names ("require", - // "require-dev", ...), not the `Link::TYPE_*` values passed here, so it always returns - // an empty map and these keys never reach the JSON. PHP dispatches on `Link::$TYPES`. let links = package.get_links_for_type(link_type); if !links.is_empty() { diff --git a/crates/shirabe/src/package/dumper/array_dumper.rs b/crates/shirabe/src/package/dumper/array_dumper.rs index 303a5871..336c96b0 100644 --- a/crates/shirabe/src/package/dumper/array_dumper.rs +++ b/crates/shirabe/src/package/dumper/array_dumper.rs @@ -92,8 +92,8 @@ impl ArrayDumper { data.insert("dist".to_string(), PhpMixed::Array(dist)); } - for type_name in SUPPORTED_LINK_TYPES.keys() { - let links = package.get_links_for_type(type_name); + for (type_name, opts) in SUPPORTED_LINK_TYPES.iter() { + let links = package.get_links_for_type(opts.method); if links.is_empty() { continue; } diff --git a/crates/shirabe/src/package/package_interface.rs b/crates/shirabe/src/package/package_interface.rs index d138fd83..c3cb1c56 100644 --- a/crates/shirabe/src/package/package_interface.rs +++ b/crates/shirabe/src/package/package_interface.rs @@ -191,17 +191,18 @@ pub trait PackageInterface: std::fmt::Display + std::fmt::Debug { /// @return array An array of package suggestions with descriptions fn get_suggests(&self) -> IndexMap<String, String>; - /// PHP helper that switches on the link kind (require/require-dev/conflict/etc.). + /// Stands in for PHP's `$package->{'get'.ucfirst($linkType)}()`, so `link_type` is one of the + /// `Link::TYPE_*` values. fn get_links_for_type( &self, link_type: &str, ) -> std::rc::Rc<IndexMap<String, crate::package::Link>> { match link_type { - "require" => self.get_requires(), - "require-dev" => self.get_dev_requires(), - "conflict" => self.get_conflicts(), - "provide" => self.get_provides(), - "replace" => self.get_replaces(), + crate::package::Link::TYPE_REQUIRE => self.get_requires(), + crate::package::Link::TYPE_DEV_REQUIRE => self.get_dev_requires(), + crate::package::Link::TYPE_CONFLICT => self.get_conflicts(), + crate::package::Link::TYPE_PROVIDE => self.get_provides(), + crate::package::Link::TYPE_REPLACE => self.get_replaces(), _ => std::rc::Rc::new(IndexMap::new()), } } diff --git a/crates/shirabe/tests/command/show_command_test.rs b/crates/shirabe/tests/command/show_command_test.rs index a35f6500..8cb124fd 100644 --- a/crates/shirabe/tests/command/show_command_test.rs +++ b/crates/shirabe/tests/command/show_command_test.rs @@ -1506,3 +1506,156 @@ vendor/longpackagename", app_tester.get_display().trim() ); } + +/// A `vendor/package` fixture carrying one link of every type `show <package>` renders. +fn package_with_every_link_type() -> PackageInterfaceHandle { + let link = |target: &str, operator: &str, version: &str, pretty: &str, r#type: &str| { + indexmap::IndexMap::from([( + target.to_string(), + Link::new( + "vendor/package".to_string(), + target.to_string(), + get_version_constraint(operator, version), + Some(r#type.to_string()), + pretty.to_string(), + ), + )]) + }; + + let pkg = get_complete_package("vendor/package", "1.0.0"); + pkg.__set_requires(link( + "vendor/required", + "=", + "1.0.0", + "1.0.0", + Link::TYPE_REQUIRE, + )); + pkg.__set_dev_requires(link( + "vendor/dev-required", + "=", + "2.0.0", + "2.0.0", + Link::TYPE_DEV_REQUIRE, + )); + pkg.__set_provides(link( + "vendor/provided", + "=", + "1.0.0", + "1.0.0", + Link::TYPE_PROVIDE, + )); + pkg.__set_conflicts(link( + "vendor/conflicted", + "<", + "1.0.0", + "<1.0.0", + Link::TYPE_CONFLICT, + )); + pkg.__set_replaces(link( + "vendor/replaced", + "=", + "3.0.0", + "3.0.0", + Link::TYPE_REPLACE, + )); + pkg.__set_suggests(indexmap::IndexMap::from([( + "vendor/suggested".to_string(), + "for testing".to_string(), + )])); + pkg.into() +} + +fn init_temp_composer_with_linked_package() -> crate::test_case::TearDown { + let tear_down = init_temp_composer( + Some(&serde_json::json!({ + "require": {"vendor/package": "1.0.0"}, + })), + None, + None, + true, + ); + create_installed_json(&[package_with_every_link_type()], &[], true); + tear_down +} + +#[test] +#[serial] +fn test_show_package_prints_every_link_section() { + let _tear_down = init_temp_composer_with_linked_package(); + + let mut app_tester = get_application_tester(); + app_tester + .run( + input(vec![ + ("command", InputValue::from("show")), + ("package", InputValue::from("vendor/package")), + ]), + RunOptions::default(), + ) + .unwrap(); + + let display = app_tester.get_display(); + let expected = "requires +vendor/required 1.0.0 + +requires (dev) +vendor/dev-required 2.0.0 + +suggests +vendor/suggested for testing + +provides +vendor/provided 1.0.0 + +conflicts +vendor/conflicted <1.0.0 + +replaces +vendor/replaced 3.0.0"; + assert!( + display.trim_end().ends_with(expected), + "expected link sections at the end of:\n{}", + display + ); +} + +#[test] +#[serial] +fn test_show_package_as_json_includes_every_link_type() { + let _tear_down = init_temp_composer_with_linked_package(); + + let mut app_tester = get_application_tester(); + app_tester + .run( + input(vec![ + ("command", InputValue::from("show")), + ("package", InputValue::from("vendor/package")), + ("--format", InputValue::from("json")), + ]), + RunOptions::default(), + ) + .unwrap(); + + let display = app_tester.get_display(); + let json: serde_json::Value = serde_json::from_str(display.trim()).unwrap(); + assert_eq!( + serde_json::json!({"vendor/required": "1.0.0"}), + json["requires"] + ); + assert_eq!( + serde_json::json!({"vendor/dev-required": "2.0.0"}), + json["devRequires"] + ); + assert_eq!( + serde_json::json!({"vendor/provided": "1.0.0"}), + json["provides"] + ); + assert_eq!( + serde_json::json!({"vendor/conflicted": "<1.0.0"}), + json["conflicts"] + ); + assert_eq!( + serde_json::json!({"vendor/replaced": "3.0.0"}), + json["replaces"] + ); +} |
