Skip to content
This repository was archived by the owner on Jan 23, 2026. It is now read-only.

Commit 35f128c

Browse files
committed
Add inspection capability for packages
1 parent e000de8 commit 35f128c

8 files changed

Lines changed: 412 additions & 145 deletions

File tree

packages/jumpstarter-cli-pkg/jumpstarter_cli_pkg/commands/list.py

Lines changed: 35 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
from jumpstarter_cli_common.opt import OutputMode, OutputType
88
from jumpstarter_cli_common.table import make_table
99

10+
from ..opt import opt_adapters, opt_driver_clients, opt_drivers, opt_inspect
1011
from ..repository import (
1112
LocalDriverRepository,
1213
V1Alpha1AdapterEntryPointList,
@@ -42,7 +43,6 @@ def print_packages(packages: V1Alpha1DriverPackageList, output: OutputType):
4243
for package in packages.items:
4344
click.echo(f"package.jumpstarter.dev/{package.name}")
4445
case _:
45-
click.echo("Fetching local packages for current Python environment")
4646
if output == OutputMode.WIDE:
4747
columns = ["NAME", "VERSION", "INSTALLED", "CATEGORIES", "LICENSE", "SUMMARY"]
4848
else:
@@ -51,7 +51,7 @@ def print_packages(packages: V1Alpha1DriverPackageList, output: OutputType):
5151
for package in packages.items:
5252
driver_rows.append(
5353
{
54-
"INSTALLED": "*" if package.installed else "",
54+
"INSTALLED": "Yes" if package.installed else "No",
5555
"NAME": package.name,
5656
"VERSION": package.version,
5757
"CATEGORIES": ",".join(package.categories),
@@ -62,7 +62,7 @@ def print_packages(packages: V1Alpha1DriverPackageList, output: OutputType):
6262
click.echo(make_table(columns, driver_rows))
6363

6464

65-
def print_drivers(packages: V1Alpha1DriverPackageList, output: OutputType):
65+
def print_drivers(packages: V1Alpha1DriverPackageList, output: OutputType, inspect: bool):
6666
drivers = V1Alpha1DriverEntryPointList()
6767
for package in packages.items:
6868
for driver in package.drivers.items:
@@ -76,14 +76,21 @@ def print_drivers(packages: V1Alpha1DriverPackageList, output: OutputType):
7676
for driver in drivers.items:
7777
click.echo(f"driver.jumpstarter.dev/{driver.package}/{driver.name}")
7878
case _:
79-
click.echo("Fetching local packages for current Python environment")
80-
if output == OutputMode.WIDE:
81-
columns = ["NAME", "PACKAGE", "TYPE"]
79+
if output == OutputMode.WIDE and inspect:
80+
columns = ["NAME", "PACKAGE", "TYPE", "CLIENT", "SUMMARY"]
8281
else:
8382
columns = ["NAME", "PACKAGE", "TYPE"]
8483
driver_rows = []
8584
for driver in drivers.items:
86-
driver_rows.append({"NAME": driver.name, "PACKAGE": driver.package, "TYPE": driver.type})
85+
driver_rows.append(
86+
{
87+
"NAME": driver.name,
88+
"PACKAGE": driver.package,
89+
"TYPE": driver.type,
90+
"CLIENT": driver.client_type if driver.client_type else "",
91+
"SUMMARY": clean_truncate_summary(driver.summary),
92+
}
93+
)
8794
click.echo(make_table(columns, driver_rows))
8895

8996

@@ -101,14 +108,20 @@ def print_driver_clients(packages: V1Alpha1DriverPackageList, output: OutputType
101108
for client in driver_clients.items:
102109
click.echo(f"client.jumpstarter.dev/{client.package}/{client.name}")
103110
case _:
104-
click.echo("Fetching local packages for current Python environment")
105111
if output == OutputMode.WIDE:
106-
columns = ["NAME", "PACKAGE", "TYPE"]
112+
columns = ["NAME", "PACKAGE", "TYPE", "SUMMARY"]
107113
else:
108114
columns = ["NAME", "PACKAGE", "TYPE"]
109115
driver_client_rows = []
110116
for client in driver_clients.items:
111-
driver_client_rows.append({"NAME": client.name, "PACKAGE": client.package, "TYPE": client.type})
117+
driver_client_rows.append(
118+
{
119+
"NAME": client.name,
120+
"PACKAGE": client.package,
121+
"TYPE": client.type,
122+
"SUMMARY": clean_truncate_summary(client.summary),
123+
}
124+
)
112125
click.echo(make_table(columns, driver_client_rows))
113126

114127

@@ -126,7 +139,6 @@ def print_adapters(packages: V1Alpha1DriverPackageList, output: OutputType):
126139
for adapter in adapters.items:
127140
click.echo(f"adapter.jumpstarter.dev/{adapter.package}/{adapter.name}")
128141
case _:
129-
click.echo("Fetching local packages for current Python environment")
130142
if output == OutputMode.WIDE:
131143
columns = ["NAME", "PACKAGE", "TYPE"]
132144
else:
@@ -138,20 +150,26 @@ def print_adapters(packages: V1Alpha1DriverPackageList, output: OutputType):
138150

139151

140152
@click.command("list")
141-
@click.option("--drivers", is_flag=True, help="Print drivers only.")
142-
@click.option("--driver-clients", is_flag=True, help="Print driver clients only.")
143-
@click.option("--adapters", is_flag=True, help="Print adapters only.")
153+
@opt_drivers
154+
@opt_driver_clients
155+
@opt_adapters
156+
@opt_inspect
144157
@opt_output_all
145158
@handle_exceptions
146-
def list(output: OutputType, drivers: bool, driver_clients: bool, adapters: bool):
159+
def list(output: OutputType, drivers: bool, driver_clients: bool, adapters: bool, inspect: bool):
147160
"""List available Jumpstarter packages."""
148161
# Add validation to ensure only one flag is set
149162
if sum([drivers, driver_clients, adapters]) > 1:
150163
raise click.UsageError("Only one of --drivers, --driver-clients, or --adapters can be specified.")
164+
# Print loading message for text outputs
165+
if output is None or output == OutputMode.WIDE:
166+
click.echo("Fetching local packages for current Python environment")
167+
# Load the packages from the local environment
151168
local_repo = LocalDriverRepository.from_venv()
152-
local_packages = local_repo.list_packages()
169+
local_packages = local_repo.list_packages(inspect)
170+
# Print specified output
153171
if drivers:
154-
print_drivers(local_packages, output)
172+
print_drivers(local_packages, output, inspect)
155173
elif driver_clients:
156174
print_driver_clients(local_packages, output)
157175
elif adapters:
Lines changed: 83 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,46 +1,101 @@
11
import asyncclick as click
22
from jumpstarter_cli_common import OutputMode, OutputType, opt_output_all
33
from jumpstarter_cli_common.exceptions import handle_exceptions
4-
from jumpstarter_cli_pkg.repository import LocalDriverRepository
54

5+
from ..opt import opt_adapters, opt_driver_clients, opt_drivers, opt_inspect
6+
from ..repository import LocalDriverRepository, V1Alpha1DriverPackage
67

7-
def print_package_details(package: str, drivers: bool, driver_clients: bool, adapters: bool, output: OutputType):
8+
9+
def print_package_info(package: V1Alpha1DriverPackage):
10+
"""Print basic package information."""
11+
click.echo("Name: " + package.name)
12+
click.echo("Version: " + package.version)
13+
click.echo("Summary: " + (package.summary if package.summary else ""))
14+
click.echo("Categories: " + ", ".join(package.categories))
15+
click.echo("License: " + (package.license if package.license else ""))
16+
17+
18+
def print_drivers(package: V1Alpha1DriverPackage, inspect: bool):
19+
"""Print drivers information."""
20+
click.echo("Drivers:")
21+
for driver in package.drivers.items:
22+
click.echo(f" {driver.name}:")
23+
click.echo(f" Module: {driver.module}")
24+
click.echo(f" Class: {driver.class_name}")
25+
click.echo(f" Type: {driver.type}")
26+
27+
client_type_out = driver.client_type if driver.client_type else "(not available)"
28+
if not inspect:
29+
client_type_out = "(run this command with --inspect to see the client type)"
30+
click.echo(f" Client: {client_type_out}")
31+
32+
summary_out = driver.summary if driver.summary else "(not available)"
33+
if not inspect:
34+
summary_out = "(run this command with --inspect to see the summary)"
35+
click.echo(f" Summary: {summary_out}")
36+
37+
38+
def print_driver_clients(package: V1Alpha1DriverPackage, inspect: bool):
39+
"""Print driver clients information."""
40+
click.echo("Driver Clients:")
41+
for driver_client in package.driver_clients.items:
42+
click.echo(f" {driver_client.name}:")
43+
click.echo(f" Module: {driver_client.module}")
44+
click.echo(f" Class: {driver_client.class_name}")
45+
click.echo(f" Type: {driver_client.type}")
46+
47+
summary_out = driver_client.summary if driver_client.summary else "(not available)"
48+
if not inspect:
49+
summary_out = "(run this command with --inspect to see the summary)"
50+
click.echo(f" Summary: {summary_out}")
51+
cli_out = "Yes" if driver_client.cli else "No"
52+
if not inspect:
53+
cli_out = "(run this command with --inspect to check if a CLI is available)"
54+
click.echo(f" Has CLI: {cli_out}")
55+
56+
57+
def print_adapters(package: V1Alpha1DriverPackage, inspect: bool):
58+
"""Print adapters information."""
59+
click.echo("Adapters:")
60+
for adapter in package.adapters.items:
61+
click.echo(f" {adapter.name}:")
62+
click.echo(f" Module: {adapter.module}")
63+
click.echo(f" Function: {adapter.function_name}")
64+
click.echo(f" Type: {adapter.type}")
65+
summary_out = adapter.summary if adapter.summary else "(not available)"
66+
if not inspect:
67+
summary_out = "(run this command with --inspect to see the summary)"
68+
click.echo(f" Summary: {summary_out}")
69+
70+
71+
def print_package_details(
72+
package: V1Alpha1DriverPackage, drivers: bool, driver_clients: bool, adapters: bool, inspect: bool
73+
):
74+
"""Print package details based on the specified flags."""
875
flag_sum = sum([drivers, driver_clients, adapters])
76+
977
if flag_sum == 0:
10-
click.echo("Name: " + package.name)
11-
click.echo("Version: " + package.version)
12-
click.echo("Summary: " + (package.summary if package.summary else ""))
13-
click.echo("Categories: " + ", ".join(package.categories))
14-
click.echo("License: " + (package.license if package.license else ""))
78+
print_package_info(package)
1579

1680
if flag_sum == 0 or drivers:
17-
click.echo("Drivers:")
18-
for driver in package.drivers.items:
19-
click.echo(f" {driver.name}:")
20-
click.echo(f" Name: {driver.name}")
21-
click.echo(f" Type: {driver.type}")
81+
print_drivers(package, inspect)
82+
2283
if flag_sum == 0 or driver_clients:
23-
click.echo("Driver Clients:")
24-
for driver_client in package.driver_clients.items:
25-
click.echo(f" {driver_client.name}:")
26-
click.echo(f" Name: {driver_client.name}")
27-
click.echo(f" Type: {driver_client.type}")
84+
print_driver_clients(package, inspect)
85+
2886
if flag_sum == 0 or adapters:
29-
click.echo("Adapters:")
30-
for adapter in package.adapters.items:
31-
click.echo(f" {adapter.name}:")
32-
click.echo(f" Name: {adapter.name}")
33-
click.echo(f" Type: {adapter.type}")
87+
print_adapters(package, inspect)
3488

3589

3690
@click.command("show")
3791
@click.argument("package")
38-
@click.option("--drivers", is_flag=True, help="Print drivers only.")
39-
@click.option("--driver-clients", is_flag=True, help="Print driver clients only.")
40-
@click.option("--adapters", is_flag=True, help="Print adapters only.")
92+
@opt_drivers
93+
@opt_driver_clients
94+
@opt_adapters
95+
@opt_inspect
4196
@opt_output_all
4297
@handle_exceptions
43-
def show(package: str, drivers: bool, driver_clients: bool, adapters: bool, output: OutputType):
98+
def show(package: str, drivers: bool, driver_clients: bool, adapters: bool, output: OutputType, inspect: bool):
4499
"""
45100
Show a Jumpstarter plugin package details.
46101
"""
@@ -49,7 +104,7 @@ def show(package: str, drivers: bool, driver_clients: bool, adapters: bool, outp
49104
raise click.UsageError("Only one of --drivers, --driver-clients, or --adapters can be specified.")
50105

51106
local_repo = LocalDriverRepository.from_venv()
52-
local_package = local_repo.get_package(package)
107+
local_package = local_repo.get_package(package, inspect)
53108

54109
match output:
55110
case OutputMode.JSON:
@@ -71,4 +126,4 @@ def show(package: str, drivers: bool, driver_clients: bool, adapters: bool, outp
71126
else:
72127
click.echo(local_package.dump_yaml())
73128
case _:
74-
print_package_details(local_package, drivers, driver_clients, adapters, output)
129+
print_package_details(local_package, drivers, driver_clients, adapters, inspect)
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import asyncclick as click
2+
3+
opt_drivers = click.option("--drivers", is_flag=True, help="Print drivers only.")
4+
5+
opt_driver_clients = click.option("--driver-clients", is_flag=True, help="Print driver clients only.")
6+
7+
opt_adapters = click.option("--adapters", is_flag=True, help="Print adapters only.")
8+
9+
opt_inspect = click.option("--inspect", "-i", is_flag=True, help="Inspect the packages to get additional metadata.")

0 commit comments

Comments
 (0)