Skip to content

Commit b0633c9

Browse files
committed
docs: add types to recipe.counter
1 parent c4e9093 commit b0633c9

File tree

2 files changed

+34
-17
lines changed

2 files changed

+34
-17
lines changed

kazoo/recipe/counter.py

Lines changed: 32 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,15 @@
44
:Status: Unknown
55
66
"""
7+
import struct
8+
from typing import Optional, Tuple, Type, Union, cast
9+
10+
from kazoo.client import KazooClient
711
from kazoo.exceptions import BadVersionError
812
from kazoo.retry import ForceRetryError
9-
import struct
13+
14+
15+
CountT = Union[int, float]
1016

1117

1218
class Counter(object):
@@ -58,7 +64,13 @@ class Counter(object):
5864
5965
"""
6066

61-
def __init__(self, client, path, default=0, support_curator=False):
67+
def __init__(
68+
self,
69+
client: KazooClient,
70+
path: str,
71+
default: CountT = 0,
72+
support_curator: bool = False,
73+
):
6274
"""Create a Kazoo Counter
6375
6476
:param client: A :class:`~kazoo.client.KazooClient` instance.
@@ -70,46 +82,50 @@ def __init__(self, client, path, default=0, support_curator=False):
7082
"""
7183
self.client = client
7284
self.path = path
73-
self.default = default
74-
self.default_type = type(default)
85+
self.default: CountT = default
86+
self.default_type: Type[CountT] = type(default)
7587
self.support_curator = support_curator
7688
self._ensured_path = False
77-
self.pre_value = None
78-
self.post_value = None
89+
self.pre_value: Optional[CountT] = None
90+
self.post_value: Optional[CountT] = None
7991
if self.support_curator and not isinstance(self.default, int):
8092
raise TypeError(
8193
"when support_curator is enabled the default "
8294
"type must be an int"
8395
)
8496

85-
def _ensure_node(self):
97+
def _ensure_node(self) -> None:
8698
if not self._ensured_path:
8799
# make sure our node exists
88100
self.client.ensure_path(self.path)
89101
self._ensured_path = True
90102

91-
def _value(self):
103+
def _value(self) -> Tuple[CountT, int]:
92104
self._ensure_node()
93105
old, stat = self.client.get(self.path)
94106
if self.support_curator:
95-
old = struct.unpack(">i", old)[0] if old != b"" else self.default
107+
parsed_old: Union[int, float, str] = (
108+
cast(int, struct.unpack(">i", old)[0])
109+
if old != b""
110+
else self.default
111+
)
96112
else:
97-
old = old.decode("ascii") if old != b"" else self.default
113+
parsed_old = old.decode("ascii") if old != b"" else self.default
98114
version = stat.version
99-
data = self.default_type(old)
115+
data = self.default_type(parsed_old)
100116
return data, version
101117

102118
@property
103-
def value(self):
119+
def value(self) -> CountT:
104120
return self._value()[0]
105121

106-
def _change(self, value):
122+
def _change(self, value: CountT) -> "Counter":
107123
if not isinstance(value, self.default_type):
108124
raise TypeError("invalid type for value change")
109125
self.client.retry(self._inner_change, value)
110126
return self
111127

112-
def _inner_change(self, value):
128+
def _inner_change(self, value: CountT) -> None:
113129
self.pre_value, version = self._value()
114130
post_value = self.pre_value + value
115131
if self.support_curator:
@@ -123,10 +139,10 @@ def _inner_change(self, value):
123139
raise ForceRetryError()
124140
self.post_value = post_value
125141

126-
def __add__(self, value):
142+
def __add__(self, value: CountT) -> "Counter":
127143
"""Add value to counter."""
128144
return self._change(value)
129145

130-
def __sub__(self, value):
146+
def __sub__(self, value: CountT) -> "Counter":
131147
"""Subtract value from counter."""
132148
return self._change(-value)

pyproject.toml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,8 @@ disable_error_code = ["no-untyped-call", "no-untyped-def"]
3131
files = [
3232
"kazoo/recipe/election.py",
3333
"kazoo/recipe/lock.py",
34-
"kazoo/recipe/lease.py"
34+
"kazoo/recipe/lease.py",
35+
"kazoo/recipe/counter.py"
3536
]
3637

3738
[[tool.mypy.overrides]]

0 commit comments

Comments
 (0)