aboutsummaryrefslogtreecommitdiffhomepage
path: root/crates
diff options
context:
space:
mode:
Diffstat (limited to 'crates')
-rw-r--r--crates/shirabe/src/command/create_project_command.rs4
-rw-r--r--crates/shirabe/src/command/show_command.rs6
-rw-r--r--crates/shirabe/src/package/dumper/array_dumper.rs4
-rw-r--r--crates/shirabe/src/package/package_interface.rs13
-rw-r--r--crates/shirabe/tests/command/show_command_test.rs153
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"]
+ );
+}