diff --git a/src/poetry/console/commands/self/show/plugins.py b/src/poetry/console/commands/self/show/plugins.py index 41daadfd747..4c05551a836 100644 --- a/src/poetry/console/commands/self/show/plugins.py +++ b/src/poetry/console/commands/self/show/plugins.py @@ -1,16 +1,24 @@ from __future__ import annotations -from collections import defaultdict +import dataclasses + from typing import TYPE_CHECKING -from typing import DefaultDict from poetry.console.commands.self.self_command import SelfCommand if TYPE_CHECKING: + from entrypoints import EntryPoint from poetry.core.packages.package import Package +@dataclasses.dataclass +class PluginPackage: + package: Package + plugins: list[EntryPoint] = dataclasses.field(default_factory=list) + application_plugins: list[EntryPoint] = dataclasses.field(default_factory=list) + + class SelfShowPluginsCommand(SelfCommand): name = "self show plugins" description = "Shows information about the currently installed plugins." @@ -32,13 +40,7 @@ def _system_project_handle(self) -> int: from poetry.utils.helpers import canonicalize_name from poetry.utils.helpers import pluralize - plugins: DefaultDict[str, dict[str, Package | list[str]]] = defaultdict( - lambda: { - "package": None, - "plugins": [], - "application_plugins": [], - } - ) + plugins: dict[str, PluginPackage] = {} system_env = EnvManager.get_system_env(naive=True) entry_points = PluginManager(ApplicationPlugin.group).get_plugin_entry_points( @@ -48,33 +50,41 @@ def _system_project_handle(self) -> int: system_env, with_dependencies=True ) - packages_by_name = {pkg.name: pkg for pkg in installed_repository.packages} + packages_by_name: dict[str, Package] = { + pkg.name: pkg for pkg in installed_repository.packages + } for entry_point in entry_points: plugin = entry_point.load() - category = "plugins" - if issubclass(plugin, ApplicationPlugin): - category = "application_plugins" package = packages_by_name[canonicalize_name(entry_point.distro.name)] - plugins[package.pretty_name]["package"] = package - plugins[package.pretty_name][category].append(entry_point) + + name = package.pretty_name + info = plugins.get(name) or PluginPackage(package=package) + + if issubclass(plugin, ApplicationPlugin): + info.application_plugins.append(entry_point) + else: + info.plugins.append(entry_point) + + plugins[name] = info for name, info in plugins.items(): - package = info["package"] + package = info.package description = " " + package.description if package.description else "" self.line("") self.line(f" • {name} ({package.version}){description}") provide_line = " " - if info["plugins"]: - count = len(info["plugins"]) + + if info.plugins: + count = len(info.plugins) provide_line += f" {count} plugin{pluralize(count)}" - if info["application_plugins"]: - if info["plugins"]: + if info.application_plugins: + if info.plugins: provide_line += " and" - count = len(info["application_plugins"]) + count = len(info.application_plugins) provide_line += ( f" {count} application plugin{pluralize(count)}" )