Skip to content

Commit 37b6476

Browse files
authored
Merge pull request #258 from jumpstarter-dev/entrypoints
Implement `jmp driver list` command for listing locally installed drivers
2 parents c653ff9 + fc7df88 commit 37b6476

File tree

17 files changed

+176
-0
lines changed

17 files changed

+176
-0
lines changed
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
# Jumpstarter Driver CLI
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import logging
2+
from typing import Optional
3+
4+
import asyncclick as click
5+
from jumpstarter_cli_common import AliasedGroup, opt_log_level, version
6+
7+
from .driver import list_drivers
8+
9+
10+
@click.group(cls=AliasedGroup)
11+
@opt_log_level
12+
def driver(log_level: Optional[str]):
13+
"""Jumpstarter driver CLI tool"""
14+
if log_level:
15+
logging.basicConfig(level=log_level.upper())
16+
else:
17+
logging.basicConfig(level=logging.INFO)
18+
19+
20+
driver.add_command(list_drivers)
21+
driver.add_command(version)
22+
23+
if __name__ == "__main__":
24+
driver()
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
from importlib.metadata import entry_points
2+
3+
import asyncclick as click
4+
from jumpstarter_cli_common import make_table
5+
6+
7+
@click.command("list")
8+
async def list_drivers():
9+
drivers = list(entry_points(group="jumpstarter.drivers"))
10+
if not drivers:
11+
click.echo("No drivers found.")
12+
else:
13+
click.echo(make_table(["NAME", "TYPE"], [{"NAME": e.name, "TYPE": e.value.replace(":", ".")} for e in drivers]))
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import pytest
2+
from asyncclick.testing import CliRunner
3+
4+
from . import driver
5+
6+
7+
@pytest.mark.anyio
8+
async def test_list_drivers():
9+
runner = CliRunner()
10+
11+
result = await runner.invoke(
12+
driver,
13+
["list"],
14+
)
15+
assert result.exit_code == 0
16+
17+
18+
@pytest.fixture
19+
def anyio_backend():
20+
return "asyncio"
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
[project]
2+
name = "jumpstarter-cli-driver"
3+
dynamic = ["version", "urls"]
4+
description = ""
5+
authors = [
6+
{ name = "Nick Cao", email = "[email protected]" },
7+
{ name = "Miguel Angel Ajo Pelayo", email = "[email protected]" },
8+
{ name = "Kirk Brauer", email = "[email protected]" },
9+
]
10+
readme = "README.md"
11+
license = { text = "Apache-2.0" }
12+
requires-python = ">=3.11"
13+
dependencies = [
14+
"jumpstarter-cli-common",
15+
"asyncclick>=8.1.7.2",
16+
]
17+
18+
[dependency-groups]
19+
dev = [
20+
"pytest>=8.3.2",
21+
"pytest-anyio>=0.0.0",
22+
"pytest-asyncio>=0.0.0",
23+
"pytest-cov>=5.0.0",
24+
]
25+
26+
[project.scripts]
27+
jmp-driver = "jumpstarter_cli_driver:driver"
28+
29+
[tool.hatch.build.targets.wheel]
30+
packages = ["jumpstarter_cli_driver"]
31+
32+
[tool.hatch.metadata.hooks.vcs.urls]
33+
Homepage = "https://jumpstarter.dev"
34+
source_archive = "https://github.com/jumpstarter-dev/repo/archive/{commit_hash}.zip"
35+
36+
[tool.hatch.version]
37+
source = "vcs"
38+
raw-options = { 'root' = '../../'}
39+
40+
[build-system]
41+
requires = ["hatchling", "hatch-vcs"]
42+
build-backend = "hatchling.build"

packages/jumpstarter-cli/jumpstarter_cli/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
from jumpstarter_cli_admin import admin
33
from jumpstarter_cli_client import client
44
from jumpstarter_cli_common import AliasedGroup, version
5+
from jumpstarter_cli_driver import driver
56
from jumpstarter_cli_exporter import exporter
67

78

@@ -11,6 +12,7 @@ def jmp():
1112

1213

1314
jmp.add_command(client)
15+
jmp.add_command(driver)
1416
jmp.add_command(exporter)
1517
jmp.add_command(admin)
1618
jmp.add_command(version)

packages/jumpstarter-cli/pyproject.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ requires-python = ">=3.11"
1313
dependencies = [
1414
"jumpstarter-cli-admin",
1515
"jumpstarter-cli-client",
16+
"jumpstarter-cli-driver",
1617
"jumpstarter-cli-exporter",
1718
]
1819

packages/jumpstarter-driver-can/pyproject.toml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,11 @@ dependencies = [
1616
"can-isotp>=2.0.6",
1717
]
1818

19+
[project.entry-points."jumpstarter.drivers"]
20+
Can = "jumpstarter_driver_can.driver:Can"
21+
IsoTpPython = "jumpstarter_driver_can.driver:IsoTpPython"
22+
IsoTpSocket = "jumpstarter_driver_can.driver:IsoTpSocket"
23+
1924
[dependency-groups]
2025
dev = [
2126
"pytest>=8.3.2",

packages/jumpstarter-driver-composite/pyproject.toml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,9 @@ dependencies = [
1414
"asyncclick>=8.1.7.2"
1515
]
1616

17+
[project.entry-points."jumpstarter.drivers"]
18+
Composite = "jumpstarter_driver_composite.driver:Composite"
19+
1720
[dependency-groups]
1821
dev = [
1922
"pytest>=8.3.2",

packages/jumpstarter-driver-dutlink/pyproject.toml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,12 @@ dependencies = [
2222
"asyncclick>=8.1.7.2"
2323
]
2424

25+
[project.entry-points."jumpstarter.drivers"]
26+
Dutlink = "jumpstarter_driver_dutlink.driver:Dutlink"
27+
DutlinkSerial = "jumpstarter_driver_dutlink.driver:DutlinkSerial"
28+
DutlinkStorageMux = "jumpstarter_driver_dutlink.driver:DutlinkStorageMux"
29+
DutlinkPower = "jumpstarter_driver_dutlink.driver:DutlinkPower"
30+
2531
[dependency-groups]
2632
dev = [
2733
"pytest>=8.3.2",

packages/jumpstarter-driver-network/pyproject.toml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,18 @@ dependencies = [
1616
"wsproto>=1.2.0"
1717
]
1818

19+
[project.entry-points."jumpstarter.drivers"]
20+
TcpNetwork = "jumpstarter_driver_network.driver:TcpNetwork"
21+
UdpNetwork = "jumpstarter_driver_network.driver:UdpNetwork"
22+
UnixNetwork = "jumpstarter_driver_network.driver:UnixNetwork"
23+
EchoNetwork = "jumpstarter_driver_network.driver:EchoNetwork"
24+
25+
[project.entry-points."jumpstarter.adapters"]
26+
TcpPortforward = "jumpstarter_driver_network.adapters:TcpPortforwardAdapter"
27+
UnixPortforward = "jumpstarter_driver_network.adapters:UnixPortforwardAdapter"
28+
Pexpect = "jumpstarter_driver_network.adapters:PexpectAdapter"
29+
Novnc = "jumpstarter_driver_network.adapters:NovncAdapter"
30+
1931
[dependency-groups]
2032
dev = [
2133
"pytest>=8.3.2",

packages/jumpstarter-driver-opendal/pyproject.toml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@ dependencies = [
1515
"asyncclick>=8.1.7.2"
1616
]
1717

18+
[project.entry-points."jumpstarter.adapters"]
19+
Opendal = "jumpstarter_driver_opendal.adapters:OpendalAdapter"
20+
1821
[dependency-groups]
1922
dev = [
2023
"pytest>=8.3.2",

packages/jumpstarter-driver-power/pyproject.toml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@ dependencies = [
1515
"asyncclick>=8.1.7.2"
1616
]
1717

18+
[project.entry-points."jumpstarter.drivers"]
19+
MockPower = "jumpstarter_driver_power.driver:MockPower"
20+
1821
[dependency-groups]
1922
dev = [
2023
"pytest>=8.3.2",

packages/jumpstarter-driver-raspberrypi/pyproject.toml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,10 @@ dependencies = [
1515
"gpiozero>=2.0.1",
1616
]
1717

18+
[project.entry-points."jumpstarter.drivers"]
19+
DigitalInput = "jumpstarter_driver_raspberrypi.driver:DigitalInput"
20+
DigitalOutput = "jumpstarter_driver_raspberrypi.driver:DigitalOutput"
21+
1822
[dependency-groups]
1923
dev = [
2024
"pytest>=8.3.2",

packages/jumpstarter-driver-sdwire/pyproject.toml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@ dependencies = [
1515
"pyudev>=0.24.3",
1616
]
1717

18+
[project.entry-points."jumpstarter.drivers"]
19+
SDWire = "jumpstarter_driver_sdwire.driver:SDWire"
20+
1821
[dependency-groups]
1922
dev = [
2023
"pytest>=8.3.2",

pyproject.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ jumpstarter-cli = { workspace = true }
77
jumpstarter-cli-admin = { workspace = true }
88
jumpstarter-cli-client = { workspace = true }
99
jumpstarter-cli-common = { workspace = true }
10+
jumpstarter-cli-driver = { workspace = true }
1011
jumpstarter-cli-exporter = { workspace = true }
1112
jumpstarter-driver-can = { workspace = true }
1213
jumpstarter-driver-composite = { workspace = true }

uv.lock

Lines changed: 33 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)