Skip to content

Commit c73d8e2

Browse files
Type NodeInfo.role as NodeRole instead of raw int
The role legend comment ("0=voter, 1=standby, 2=spare") encoded an enum that already exists in dqlitewire as NodeRole. Switch the field annotation to NodeRole and construct VOTER instances via the enum. IntEnum stays int-compatible so existing integer comparisons continue to work. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1 parent 73003bc commit c73d8e2

2 files changed

Lines changed: 21 additions & 2 deletions

File tree

src/dqliteclient/node_store.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
from collections.abc import Sequence
55
from dataclasses import dataclass
66

7+
from dqlitewire import NodeRole
8+
79

810
@dataclass(frozen=True, slots=True)
911
class NodeInfo:
@@ -16,7 +18,7 @@ class NodeInfo:
1618

1719
node_id: int
1820
address: str
19-
role: int # 0=voter, 1=standby, 2=spare
21+
role: NodeRole
2022

2123

2224
class NodeStore(ABC):
@@ -44,7 +46,7 @@ class MemoryNodeStore(NodeStore):
4446
def __init__(self, initial_addresses: list[str] | None = None) -> None:
4547
if initial_addresses:
4648
self._nodes: tuple[NodeInfo, ...] = tuple(
47-
NodeInfo(node_id=i + 1, address=addr, role=0)
49+
NodeInfo(node_id=i + 1, address=addr, role=NodeRole.VOTER)
4850
for i, addr in enumerate(initial_addresses)
4951
)
5052
else:

tests/test_node_store.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,3 +77,20 @@ async def test_node_info_is_hashable(self) -> None:
7777
info2 = NodeInfo(node_id=1, address="h:1", role=0)
7878
assert hash(info1) == hash(info2)
7979
assert {info1, info2} == {info1}
80+
81+
async def test_memory_store_seeds_with_noderole_voter(self) -> None:
82+
from dqlitewire import NodeRole
83+
84+
store = MemoryNodeStore(initial_addresses=["a:9001", "b:9001"])
85+
nodes = await store.get_nodes()
86+
assert all(isinstance(n.role, NodeRole) for n in nodes)
87+
assert all(n.role == NodeRole.VOTER for n in nodes)
88+
# IntEnum comparison with raw int still works.
89+
assert nodes[0].role == 0
90+
91+
async def test_node_info_role_accepts_noderole(self) -> None:
92+
from dqlitewire import NodeRole
93+
94+
info = NodeInfo(node_id=1, address="h:1", role=NodeRole.STANDBY)
95+
assert info.role is NodeRole.STANDBY
96+
assert info.role == 1

0 commit comments

Comments
 (0)