Skip to content

Commit

Permalink
Add plugin subcommand
Browse files Browse the repository at this point in the history
  • Loading branch information
soapy1 committed Jan 3, 2025
1 parent c53e386 commit 9d6d683
Show file tree
Hide file tree
Showing 3 changed files with 109 additions and 0 deletions.
42 changes: 42 additions & 0 deletions src/_nebari/subcommands/plugin.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
import rich
import typer
from rich.table import Table

from importlib.metadata import version

from _nebari.version import __version__
from nebari.hookspecs import hookimpl

@hookimpl
def nebari_subcommand(cli: typer.Typer):
plugin_cmd = typer.Typer(
add_completion=False,
no_args_is_help=True,
rich_markup_mode="rich",
context_settings={"help_option_names": ["-h", "--help"]},
)

cli.add_typer(
plugin_cmd,
name="plugin",
help="Interact with nebari plugins",
rich_help_panel="Additional Commands"
)

@plugin_cmd.command()
def list(ctx: typer.Context):
"""
List installed plugins
"""
from nebari.plugins import nebari_plugin_manager

external_plugins = nebari_plugin_manager.get_external_plugins()

table = Table(title="Plugins")
table.add_column("name", justify="left", no_wrap=True)
table.add_column("version", justify="left", no_wrap=True)

for plugin in external_plugins:
table.add_row(plugin, version(plugin))

rich.print(table)
1 change: 1 addition & 0 deletions src/nebari/plugins.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
"_nebari.subcommands.deploy",
"_nebari.subcommands.destroy",
"_nebari.subcommands.keycloak",
"_nebari.subcommands.plugin",
"_nebari.subcommands.render",
"_nebari.subcommands.support",
"_nebari.subcommands.upgrade",
Expand Down
66 changes: 66 additions & 0 deletions tests/tests_unit/test_cli_plugin.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
import pytest
from typing import List
from typer.testing import CliRunner
from unittest.mock import Mock, patch

from _nebari.cli import create_cli

runner = CliRunner()

@pytest.mark.parametrize(
"args, exit_code, content",
[
# --help
([], 0, ["Usage:"]),
(["--help"], 0, ["Usage:"]),
(["-h"], 0, ["Usage:"]),
(["list", "--help"], 0, ["Usage:"]),
(["list", "-h"], 0, ["Usage:"]),
(["list"], 0, ["Plugins"]),
],
)
def test_cli_plugin_stdout(args: List[str], exit_code: int, content: List[str]):
app = create_cli()
result = runner.invoke(app, ["plugin"] + args)
assert result.exit_code == exit_code
for c in content:
assert c in result.stdout


def mock_get_plugins():
mytestexternalplugin = Mock()
mytestexternalplugin.__name__ = "mytestexternalplugin"

otherplugin = Mock()
otherplugin.__name__ = "otherplugin"

return [mytestexternalplugin, otherplugin]


def mock_version(pkg):
pkg_version_map = {
"mytestexternalplugin": "0.4.4",
"otherplugin": "1.1.1",
}
return pkg_version_map.get(pkg)


@patch(
"nebari.plugins.NebariPluginManager.plugin_manager.get_plugins",
mock_get_plugins
)
@patch(
"_nebari.subcommands.plugin.version",
mock_version
)
def test_cli_plugin_list_external_plugins():
app = create_cli()
result = runner.invoke(app, ["plugin", "list"])
assert result.exit_code == 0
expected_ouput = [
"Plugins",
"mytestexternalplugin │ 0.4.4",
"otherplugin │ 1.1.1"
]
for c in expected_ouput:
assert c in result.stdout

0 comments on commit 9d6d683

Please sign in to comment.