style: ruff format and the lint rules of the driver standard

Mechanical: ruff format, and ruff check --fix with the rule set every NAPALM
driver uses (E, F, I, UP, B at line length 100). typing.List/Dict/Optional
become builtin generics and X | None, imports are sorted, the coding cookies
are gone. Two tests that read the source text follow the new spelling.

What ruff cannot fix comes in the next commit.
This commit is contained in:
christianmanivong committed 2026-10-22 19:03:21 +02:00
1 parent ac8e7c4c11
commit 08296d0d2e
77 files changed
+1329 -1074

No files matched your search

+30 -21
View File
@@ -6,14 +6,14 @@ Instead of inheriting directly from `napalm.base.NetworkDriver`, a driver can in
```python
# without napalm-device-types
class OpenWrtDriver(NetworkDriver):
...
class OpenWrtDriver(NetworkDriver): ...
# with napalm-device-types
from napalm_device_types import AccessPointDriver
class OpenWrtDriver(AccessPointDriver):
...
class OpenWrtDriver(AccessPointDriver): ...
```
## Why?
@@ -29,8 +29,9 @@ OpenMediaVault box is a NAS built on Debian. So a driver inherits **one role bas
role its device fills**, and **the order it lists them in is the ranking**:
```python
class QnapQtsDriver(StorageDriver, HypervisorDriver, LinuxDriver):
... # primary_role_of(...) == "storage"
class QnapQtsDriver(
StorageDriver, HypervisorDriver, LinuxDriver
): ... # primary_role_of(...) == "storage"
```
`roles_of(cls)`, `role_keys_of(cls)` and `primary_role_of(cls)` read that back. Nothing
@@ -54,10 +55,12 @@ host OS's load; it has no `HealthMetricsMixin` (SNMP) and no command channel.
```python
class StorageDriver(DeviceTypeDriver):
"""Contract, not code."""
ROLE: str = "storage"
TYPE_LABEL: str = "Storage"
if TYPE_CHECKING: # nothing exists at runtime
if TYPE_CHECKING: # nothing exists at runtime
def get_disks(self) -> List[PhysicalDiskDict]: ...
```
@@ -312,20 +315,27 @@ generic data shapes belong here. Only the actual device communication belongs in
**Worked example — firewall rule diff/apply** (`FirewallRuleMixin`, in `FirewallDriver`):
```python
class FirewallRuleMixin: # mixed into FirewallDriver
class FirewallRuleMixin: # mixed into FirewallDriver
# Declared only — every driver implements its own device communication.
if TYPE_CHECKING:
def get_firewall_rules(self) -> List[FirewallRuleDict]: ...
def apply_firewall_rule(self, rule: FirewallRuleDict, *, uuid: Optional[str] = None) -> Dict[str, Any]: ...
def apply_firewall_rule(
self, rule: FirewallRuleDict, *, uuid: Optional[str] = None
) -> Dict[str, Any]: ...
def commit_firewall_rules(self) -> Dict[str, Any]: ...
# Concrete — the matching/comparison/orchestration algorithm is identical
# for every firewall vendor, so it lives here once.
def diff_firewall_rules(self, desired: List[FirewallRuleDict]) -> FirewallRuleDiffDict:
... # matches self.get_firewall_rules() against `desired` by description
def diff_firewall_rules(
self, desired: List[FirewallRuleDict]
) -> (
FirewallRuleDiffDict
): ... # matches self.get_firewall_rules() against `desired` by description
def apply_firewall_ruleset(self, desired: List[FirewallRuleDict]):
... # computes the diff, calls apply_firewall_rule() per change, commits
def apply_firewall_ruleset(
self, desired: List[FirewallRuleDict]
): ... # computes the diff, calls apply_firewall_rule() per change, commits
```
The same split applies to `DhcpServerMixin`: `get_dhcp_reservations`/
@@ -421,8 +431,8 @@ HTTP_FINGERPRINT = [
```python
from napalm_device_types import AccessPointDriver
class OpenWrtDriver(AccessPointDriver):
class OpenWrtDriver(AccessPointDriver):
def get_wireless_clients(self):
# return List[WirelessClientDict]
...
@@ -437,8 +447,8 @@ class OpenWrtDriver(AccessPointDriver):
```python
from napalm_device_types import SwitchDriver
class CiscoIOSDriver(SwitchDriver):
class CiscoIOSDriver(SwitchDriver):
def get_spanning_tree(self):
# return Dict[str, SpanningTreeDict]
...
@@ -453,8 +463,8 @@ class CiscoIOSDriver(SwitchDriver):
```python
from napalm_device_types import FirewallDriver
class PfSenseDriver(FirewallDriver):
class PfSenseDriver(FirewallDriver):
def get_nat_translations(self):
# return List[NATTranslationDict]
...
@@ -474,14 +484,13 @@ class PfSenseDriver(FirewallDriver):
```python
from napalm_device_types import HypervisorDriver
class ProxmoxDriver(HypervisorDriver):
class ProxmoxDriver(HypervisorDriver):
def get_vms(self):
# return List[VMDict]
...
def create_vm_snapshot(self, name, snapshot, description="", include_memory=False):
...
def create_vm_snapshot(self, name, snapshot, description="", include_memory=False): ...
def get_vm_cpu_types(self):
# optional — return List[VMCpuTypeDict]: the CPU models a new VM may get
@@ -505,8 +514,8 @@ unpacked; both are the same for every hypervisor.
```python
from napalm_device_types import OSDriver
class LinuxDriver(OSDriver):
class LinuxDriver(OSDriver):
def get_packages(self):
# return List[PackageDict]
...
@@ -533,8 +542,8 @@ class LinuxDriver(OSDriver):
```python
from napalm_device_types import StorageDriver
class TrueNASDriver(StorageDriver):
class TrueNASDriver(StorageDriver):
def get_disks(self):
# return List[PhysicalDiskDict]
...