Skip to content

Commit 32b887d

Browse files
committed
show installed plugin packages
1 parent 1f3e54d commit 32b887d

5 files changed

Lines changed: 49 additions & 29 deletions

File tree

packages/data-designer/src/data_designer/cli/README.md

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -336,7 +336,7 @@ data-designer plugin list
336336
# Search a specific catalog
337337
data-designer plugin --catalog research search transform
338338
339-
# Show package metadata, compatibility, docs, and the install command
339+
# Show package metadata, compatibility, docs, and the install strategy
340340
data-designer plugin info github
341341
342342
# Install a plugin package from a catalog and verify its runtime entry points can load
@@ -359,7 +359,7 @@ data-designer plugin catalog add research https://github.com/acme/dd-plugins
359359
data-designer plugin catalog list
360360
data-designer plugin catalog remove research
361361
362-
# List installed runtime plugins with package and version metadata
362+
# List installed plugin packages with their runtime plugins
363363
data-designer plugin installed
364364
```
365365

@@ -371,10 +371,10 @@ are kept in place. This prevents a plugin dependency from upgrading,
371371
downgrading, or reinstalling Data Designer itself.
372372

373373
Runtime plugin names shown by `plugin list`, `plugin search`, and
374-
`plugin installed` identify the registered plugin entry points.
375-
Install, uninstall, and info commands take the plugin package name or package
376-
alias. If a user passes a runtime plugin name to one of those package commands,
377-
the CLI points them to the owning package.
374+
`plugin installed` identify the registered entry points provided by a plugin
375+
package. Install, uninstall, and info commands take the plugin package name or
376+
package alias. If a user passes a runtime plugin name to one of those package
377+
commands, the CLI points them to the owning package.
378378

379379
In an active virtual environment with a user `pyproject.toml`, `uv` uses
380380
`uv add` so the plugin package is recorded in the project. Otherwise the CLI

packages/data-designer/src/data_designer/cli/commands/plugin.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -203,8 +203,8 @@ def uninstall_command(
203203

204204

205205
def installed_command(ctx: typer.Context) -> None:
206-
"""List installed Data Designer runtime plugins with package metadata."""
207-
_warn_if_parent_catalog_unused(ctx, "installed runtime plugins are discovered from the current Python environment")
206+
"""List installed Data Designer plugin packages with runtime plugin metadata."""
207+
_warn_if_parent_catalog_unused(ctx, "installed plugin packages are discovered from the current Python environment")
208208
controller = PluginCatalogController(DATA_DESIGNER_HOME)
209209
controller.run_installed()
210210

packages/data-designer/src/data_designer/cli/controllers/plugin_catalog_controller.py

Lines changed: 25 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -305,11 +305,11 @@ def run_uninstall(
305305
)
306306

307307
def run_installed(self) -> None:
308-
"""List installed runtime plugins without importing plugin modules."""
309-
print_header("Installed Data Designer Runtime Plugins")
308+
"""List installed plugin packages without importing plugin modules."""
309+
print_header("Installed Data Designer Plugin Packages")
310310
installed_plugins = self.catalog_service.list_installed_plugins()
311311
if not installed_plugins:
312-
print_warning("No installed Data Designer runtime plugins were discovered")
312+
print_warning("No installed Data Designer plugin packages were discovered")
313313
return
314314
self._display_installed_plugins(installed_plugins)
315315

@@ -590,18 +590,16 @@ def _display_catalog_entries_vertical(
590590

591591
@staticmethod
592592
def _display_installed_plugins(installed_plugins: list[InstalledPluginInfo]) -> None:
593-
table = Table(title="Installed Runtime Plugins", border_style=NordColor.NORD8.value)
594-
table.add_column("Runtime Plugin", style=NordColor.NORD14.value, no_wrap=True)
595-
table.add_column("Package", style=NordColor.NORD9.value, no_wrap=True)
593+
table = Table(title="Installed Plugin Packages", border_style=NordColor.NORD8.value)
594+
table.add_column("Package", style=NordColor.NORD14.value, no_wrap=True)
596595
table.add_column("Version", style=NordColor.NORD13.value, no_wrap=True)
597-
table.add_column("Entry Point", style=NordColor.NORD4.value)
596+
table.add_column("Runtime Plugins", style=NordColor.NORD9.value)
598597

599-
for plugin in installed_plugins:
598+
for package_name, package_version, package_plugins in _group_installed_plugins_by_package(installed_plugins):
600599
table.add_row(
601-
_escape_markup(plugin.name),
602-
_escape_markup(plugin.package_name or ""),
603-
_escape_markup(plugin.package_version or ""),
604-
_escape_markup(plugin.entry_point_value),
600+
_escape_markup(package_name),
601+
_escape_markup(package_version),
602+
_escape_markup(", ".join(plugin.name for plugin in package_plugins)),
605603
)
606604
console.print(table)
607605

@@ -741,6 +739,21 @@ def _package_entries_are_installed(
741739
)
742740

743741

742+
def _group_installed_plugins_by_package(
743+
installed_plugins: list[InstalledPluginInfo],
744+
) -> list[tuple[str, str, list[InstalledPluginInfo]]]:
745+
groups: dict[tuple[str, str], list[InstalledPluginInfo]] = {}
746+
for plugin in installed_plugins:
747+
package_name = plugin.package_name or "unknown"
748+
package_version = plugin.package_version or ""
749+
groups.setdefault((package_name, package_version), []).append(plugin)
750+
751+
return [
752+
(package_name, package_version, sorted(package_plugins, key=lambda plugin: plugin.name))
753+
for (package_name, package_version), package_plugins in sorted(groups.items())
754+
]
755+
756+
744757
def _package_alias(package_name: str) -> str | None:
745758
canonical_package_name = canonicalize_name(package_name)
746759
if not canonical_package_name.startswith(DATA_DESIGNER_PLUGIN_PACKAGE_PREFIX):

packages/data-designer/tests/cli/commands/test_plugin_command.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,7 @@ def test_plugin_installed_warns_when_parent_catalog_is_unused(
174174

175175
assert result.exit_code == 0
176176
mock_print_warning.assert_called_once_with(
177-
"Ignoring --catalog 'research'; installed runtime plugins are discovered from the current Python environment."
177+
"Ignoring --catalog 'research'; installed plugin packages are discovered from the current Python environment."
178178
)
179179
mock_ctrl.run_installed.assert_called_once_with()
180180

packages/data-designer/tests/cli/controllers/test_plugin_catalog_controller.py

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -994,11 +994,17 @@ def test_run_installed_renders_package_and_version_metadata(
994994
) -> None:
995995
controller.catalog_service.list_installed_plugins.return_value = [
996996
InstalledPluginInfo(
997-
name="github",
998-
package_name="data-designer-github",
997+
name="document-chunker",
998+
package_name="data-designer-retrieval-sdg",
999999
package_version="0.1.0",
1000-
entry_point_value="data_designer_github.plugin:plugin",
1001-
)
1000+
entry_point_value="data_designer_retrieval_sdg.plugins:document_chunker_plugin",
1001+
),
1002+
InstalledPluginInfo(
1003+
name="embedding-dedup",
1004+
package_name="data-designer-retrieval-sdg",
1005+
package_version="0.1.0",
1006+
entry_point_value="data_designer_retrieval_sdg.plugins:embedding_dedup_plugin",
1007+
),
10021008
]
10031009

10041010
controller.run_installed()
@@ -1007,14 +1013,15 @@ def test_run_installed_renders_package_and_version_metadata(
10071013
call.args[0] for call in mock_console.print.call_args_list if call.args and isinstance(call.args[0], Table)
10081014
]
10091015
assert printed_tables
1016+
assert printed_tables[0].title == "Installed Plugin Packages"
10101017
assert [column.header for column in printed_tables[0].columns] == [
1011-
"Runtime Plugin",
10121018
"Package",
10131019
"Version",
1014-
"Entry Point",
1020+
"Runtime Plugins",
10151021
]
1016-
assert list(printed_tables[0].columns[1].cells) == ["data-designer-github"]
1017-
assert list(printed_tables[0].columns[2].cells) == ["0.1.0"]
1022+
assert list(printed_tables[0].columns[0].cells) == ["data-designer-retrieval-sdg"]
1023+
assert list(printed_tables[0].columns[1].cells) == ["0.1.0"]
1024+
assert list(printed_tables[0].columns[2].cells) == ["document-chunker, embedding-dedup"]
10181025

10191026

10201027
@patch("data_designer.cli.controllers.plugin_catalog_controller.print_error")

0 commit comments

Comments
 (0)