Skip to content

Commit adba5aa

Browse files
authored
docs: continued docstring for drivers (jina-ai#1951)
1 parent 2143fa2 commit adba5aa

File tree

7 files changed

+241
-79
lines changed

7 files changed

+241
-79
lines changed

jina/drivers/__init__.py

+80-24
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,8 @@ class QuerySetReader:
104104

105105
@property
106106
def as_querylang(self):
107+
"""Render as QueryLang parameters.
108+
# noqa: DAR201"""
107109
parameters = {
108110
name: getattr(self, name) for name in self._init_kwargs_dict.keys()
109111
}
@@ -119,10 +121,10 @@ def _get_parameter(self, key: str, default: Any):
119121
if getattr(self, 'queryset', None):
120122
for q in self.queryset:
121123
if (
122-
not q.disabled
123-
and self.__class__.__name__ == q.name
124-
and q.priority > self._priority
125-
and key in q.parameters
124+
not q.disabled
125+
and self.__class__.__name__ == q.name
126+
and q.priority > self._priority
127+
and key in q.parameters
126128
):
127129
ret = q.parameters[key]
128130
return dict(ret) if isinstance(ret, Struct) else ret
@@ -139,12 +141,28 @@ def __getattr__(self, name: str):
139141

140142

141143
class DriverType(type(JAMLCompatible), type):
144+
"""A meta class representing a Driver
145+
146+
When a new Driver is created, it gets registered
147+
"""
148+
142149
def __new__(cls, *args, **kwargs):
150+
"""Create and register a new class with this meta class.
151+
152+
:param *args: *args for super
153+
:param **kwargs: **kwargs for super
154+
:return: the newly registered class
155+
"""
143156
_cls = super().__new__(cls, *args, **kwargs)
144157
return cls.register_class(_cls)
145158

146159
@staticmethod
147160
def register_class(cls):
161+
"""Register a class
162+
163+
:param cls: the class
164+
:return: the class, after being registered
165+
"""
148166
reg_cls_set = getattr(cls, '_registered_class', set())
149167
if cls.__name__ not in reg_cls_set or getattr(cls, 'force_register', False):
150168
wrap_func(cls, ['__init__'], store_init_kwargs)
@@ -189,12 +207,17 @@ def attach(self, runtime: 'ZEDRuntime', *args, **kwargs) -> None:
189207

190208
@property
191209
def req(self) -> 'Request':
192-
"""Get the current (typed) request, shortcut to ``self.runtime.request``"""
210+
"""Get the current (typed) request, shortcut to ``self.runtime.request``
211+
# noqa: DAR201
212+
"""
193213
return self.runtime.request
194214

195215
@property
196216
def partial_reqs(self) -> Sequence['Request']:
197-
"""The collected partial requests under the current ``request_id`` """
217+
"""The collected partial requests under the current ``request_id``
218+
# noqa: DAR401
219+
# noqa: DAR201
220+
"""
198221
if self.expect_parts > 1:
199222
return self.runtime.partial_requests
200223
else:
@@ -205,27 +228,42 @@ def partial_reqs(self) -> Sequence['Request']:
205228

206229
@property
207230
def expect_parts(self) -> int:
208-
"""The expected number of partial messages """
231+
"""The expected number of partial messages
232+
# noqa: DAR201
233+
"""
209234
return self.runtime.expect_parts
210235

211236
@property
212237
def msg(self) -> 'Message':
213-
"""Get the current request, shortcut to ``self.runtime.message``"""
238+
"""Get the current request, shortcut to ``self.runtime.message``
239+
# noqa: DAR201
240+
"""
214241
return self.runtime.message
215242

216243
@property
217244
def queryset(self) -> 'QueryLangSet':
245+
"""
246+
# noqa: DAR101
247+
# noqa: DAR102
248+
# noqa: DAR201
249+
"""
218250
if self.msg:
219251
return self.msg.request.queryset
220252
else:
221253
return []
222254

223255
@property
224256
def logger(self) -> 'JinaLogger':
225-
"""Shortcut to ``self.runtime.logger``"""
257+
"""Shortcut to ``self.runtime.logger``
258+
# noqa: DAR201
259+
"""
226260
return self.runtime.logger
227261

228262
def __call__(self, *args, **kwargs) -> None:
263+
"""
264+
# noqa: DAR102
265+
# noqa: DAR101
266+
"""
229267
raise NotImplementedError
230268

231269
def __eq__(self, other):
@@ -249,29 +287,33 @@ class RecursiveMixin(BaseDriver):
249287

250288
@property
251289
def docs(self):
290+
"""
291+
# noqa: DAR102
292+
# noqa: DAR201
293+
"""
252294
if self.expect_parts > 1:
253295
return (d for r in reversed(self.partial_reqs) for d in r.docs)
254296
else:
255297
return self.req.docs
256298

257299
def _apply_root(
258-
self,
259-
docs: 'DocumentSet',
260-
field: str,
261-
*args,
262-
**kwargs,
300+
self,
301+
docs: 'DocumentSet',
302+
field: str,
303+
*args,
304+
**kwargs,
263305
) -> None:
264306
return self._apply_all(docs, None, field, *args, **kwargs)
265307

266308
# TODO(Han): probably want to publicize this, as it is not obvious for driver
267309
# developer which one should be inherited
268310
def _apply_all(
269-
self,
270-
docs: 'DocumentSet',
271-
context_doc: 'Document',
272-
field: str,
273-
*args,
274-
**kwargs,
311+
self,
312+
docs: 'DocumentSet',
313+
context_doc: 'Document',
314+
field: str,
315+
*args,
316+
**kwargs,
275317
) -> None:
276318
"""Apply function works on a list of docs, modify the docs in-place
277319
@@ -283,6 +325,11 @@ def _apply_all(
283325
"""
284326

285327
def __call__(self, *args, **kwargs):
328+
"""Call the Driver.
329+
330+
:param *args: *args for ``_traverse_apply``
331+
:param **kwargs: **kwargs for ``_traverse_apply``
332+
"""
286333
self._traverse_apply(self.docs, *args, **kwargs)
287334

288335
def _traverse_apply(self, docs: 'DocumentSet', *args, **kwargs) -> None:
@@ -326,10 +373,17 @@ class FastRecursiveMixin:
326373
"""
327374

328375
def __call__(self, *args, **kwargs):
376+
"""Traverse with _apply_all
377+
378+
:param *args: *args for ``_apply_all``
379+
:param **kwargs: **kwargs for ``_apply_all``
380+
"""
329381
self._apply_all(self.docs, *args, **kwargs)
330382

331383
@property
332384
def docs(self) -> 'DocumentSet':
385+
"""The DocumentSet after applying the traversal
386+
# noqa: DAR201"""
333387
from ..types.sets import DocumentSet
334388

335389
if self.expect_parts > 1:
@@ -386,7 +440,9 @@ def __init__(self, executor: Optional[str] = None,
386440

387441
@property
388442
def exec(self) -> 'AnyExecutor':
389-
"""the executor that to which the instance is attached"""
443+
"""the executor that to which the instance is attached
444+
# noqa: DAR201
445+
"""
390446
return self._exec
391447

392448
@property
@@ -396,8 +452,8 @@ def exec_fn(self) -> Callable:
396452
:return: the Callable to execute in the driver
397453
"""
398454
if (
399-
not self.msg.is_error
400-
or self.runtime.args.on_error_strategy < OnErrorStrategy.SKIP_EXECUTOR
455+
not self.msg.is_error
456+
or self.runtime.args.on_error_strategy < OnErrorStrategy.SKIP_EXECUTOR
401457
):
402458
return self._exec_fn
403459
else:
@@ -417,7 +473,7 @@ def attach(self, executor: 'AnyExecutor', *args, **kwargs) -> None:
417473
else:
418474
for c in executor.components:
419475
if any(
420-
t.__name__ == self._executor_name for t in type.mro(c.__class__)
476+
t.__name__ == self._executor_name for t in type.mro(c.__class__)
421477
):
422478
self._exec = c
423479
break

jina/drivers/control.py

+32-12
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,9 @@ class BaseControlDriver(BaseDriver):
1717

1818
@property
1919
def envelope(self) -> 'jina_pb2.EnvelopeProto':
20-
"""Get the current request, shortcut to ``self.runtime.message``"""
20+
"""Get the current request, shortcut to ``self.runtime.message``
21+
# noqa: DAR201
22+
"""
2123
return self.msg.envelope
2224

2325

@@ -28,14 +30,19 @@ def __init__(self, key: str = 'request', json: bool = True, *args, **kwargs):
2830
"""
2931
:param key: (str) that represents a first level or nested key in the dict
3032
:param json: (bool) indicating if the log output should be formatted as json
31-
:param *args:
32-
:param **kwargs:
33+
:param *args: *args for super
34+
:param **kwargs: **kwargs for super
3335
"""
3436
super().__init__(*args, **kwargs)
3537
self.key = key
3638
self.json = json
3739

3840
def __call__(self, *args, **kwargs):
41+
"""Log the information.
42+
43+
:param *args: unused
44+
:param **kwargs: unused
45+
"""
3946
data = dunder_get(self.msg.proto, self.key)
4047
if self.json:
4148
self.logger.info(
@@ -49,13 +56,20 @@ class WaitDriver(BaseControlDriver):
4956
"""Wait for some seconds, mainly for demo purpose"""
5057

5158
def __call__(self, *args, **kwargs):
59+
"""Wait for some seconds, mainly for demo purpose
60+
# noqa: DAR101"""
5261
time.sleep(5)
5362

5463

5564
class ControlReqDriver(BaseControlDriver):
5665
"""Handling the control request, by default it is installed for all :class:`jina.peapods.peas.BasePea`"""
5766

5867
def __call__(self, *args, **kwargs):
68+
"""Handle the request controlling.
69+
70+
:param *args: unused
71+
:param **kwargs: unused
72+
"""
5973
if self.req.command == 'TERMINATE':
6074
self.envelope.status.code = jina_pb2.StatusProto.SUCCESS
6175
raise RuntimeTerminated
@@ -79,28 +93,34 @@ class RouteDriver(ControlReqDriver):
7993
- The router receives requests from both dealer and upstream pusher.
8094
if it is an upstream request, use LB to schedule the receiver,
8195
mark it in the envelope if it is a control request in
96+
97+
:param raise_no_dealer: raise a RuntimeError when no available dealer
98+
:param *args: *args for super
99+
:param **kwargs: **kwargs for super
82100
"""
83101

84102
def __init__(self, raise_no_dealer: bool = False, *args, **kwargs):
85-
"""
86-
:param raise_no_dealer: raise a RuntimeError when no available dealer
87-
:param *args:
88-
:param **kwargs:
89-
"""
90103
super().__init__(*args, **kwargs)
91104
self.idle_dealer_ids = set()
92-
self.is_pollin_paused = False
105+
self.is_polling_paused = False
93106
self.raise_no_dealer = raise_no_dealer
94107

95108
def __call__(self, *args, **kwargs):
109+
"""Perform the routing.
110+
111+
:param *args: *args for super().__call__
112+
:param **kwargs: **kwargs for super().__call__
113+
114+
# noqa: DAR401
115+
"""
96116
if self.msg.is_data_request:
97117
self.logger.debug(self.idle_dealer_ids)
98118
if self.idle_dealer_ids:
99119
dealer_id = self.idle_dealer_ids.pop()
100120
self.envelope.receiver_id = dealer_id
101121
if not self.idle_dealer_ids:
102122
self.runtime._zmqlet.pause_pollin()
103-
self.is_pollin_paused = True
123+
self.is_polling_paused = True
104124
elif self.raise_no_dealer:
105125
raise RuntimeError('if this router connects more than one dealer, '
106126
'then this error should never be raised. often when it '
@@ -119,9 +139,9 @@ def __call__(self, *args, **kwargs):
119139
elif self.req.command == 'IDLE':
120140
self.idle_dealer_ids.add(self.envelope.receiver_id)
121141
self.logger.debug(f'{self.envelope.receiver_id} is idle, now I know these idle peas {self.idle_dealer_ids}')
122-
if self.is_pollin_paused:
142+
if self.is_polling_paused:
123143
self.runtime._zmqlet.resume_pollin()
124-
self.is_pollin_paused = False
144+
self.is_polling_paused = False
125145
raise NoExplicitMessage
126146
else:
127147
super().__call__(*args, **kwargs)

jina/drivers/convertdriver.py

+17-2
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@ class ConvertDriver(RecursiveMixin, BaseRecursiveDriver):
1414
def __init__(self, convert_fn: str, *args, **kwargs):
1515
"""
1616
:param convert_fn: the method name from `:class:`Document` to be applied
17-
:param *args:
18-
:param **kwargs: the set of named arguments to be passed to the method with name `convert_fn`
17+
:param *args: *args for super
18+
:param **kwargs: the set of named arguments to be passed to `convert_fn`
1919
"""
2020
super().__init__(*args, **kwargs)
2121
self._convert_fn = convert_fn
@@ -32,40 +32,55 @@ def _apply_all(
3232

3333

3434
class URI2Buffer(ConvertDriver):
35+
"""Driver to convert URI to buffer"""
3536
def __init__(self, convert_fn: str = 'convert_uri_to_buffer', *args, **kwargs):
3637
super().__init__(convert_fn, *args, **kwargs)
3738

3839

3940
class URI2DataURI(ConvertDriver):
41+
"""Driver to convert URI to data URI
42+
"""
4043
def __init__(self, convert_fn: str = 'convert_uri_to_data_uri', *args, **kwargs):
4144
super().__init__(convert_fn, *args, **kwargs)
4245

4346

4447
class Buffer2URI(ConvertDriver):
48+
"""Driver to convert buffer to URI
49+
"""
4550
def __init__(self, convert_fn: str = 'convert_buffer_to_uri', *args, **kwargs):
4651
super().__init__(convert_fn, *args, **kwargs)
4752

4853

4954
class BufferImage2Blob(ConvertDriver):
55+
"""Driver to convert image buffer to blob
56+
"""
5057
def __init__(self, convert_fn: str = 'convert_buffer_image_to_blob', *args, **kwargs):
5158
super().__init__(convert_fn, *args, **kwargs)
5259

5360

5461
class URI2Blob(ConvertDriver):
62+
"""Driver to convert URI to blob
63+
"""
5564
def __init__(self, convert_fn: str = 'convert_uri_to_blob', *args, **kwargs):
5665
super().__init__(convert_fn, *args, **kwargs)
5766

5867

5968
class Text2URI(ConvertDriver):
69+
"""Driver to convert text to URI
70+
"""
6071
def __init__(self, convert_fn: str = 'convert_text_to_uri', *args, **kwargs):
6172
super().__init__(convert_fn, *args, **kwargs)
6273

6374

6475
class URI2Text(ConvertDriver):
76+
"""Driver to convert URI to text
77+
"""
6578
def __init__(self, convert_fn: str = 'convert_uri_to_text', *args, **kwargs):
6679
super().__init__(convert_fn, *args, **kwargs)
6780

6881

6982
class Blob2PngURI(ConvertDriver):
83+
"""Driver to convert blob to URI
84+
"""
7085
def __init__(self, convert_fn: str = 'convert_blob_to_uri', *args, **kwargs):
7186
super().__init__(convert_fn, *args, **kwargs)

0 commit comments

Comments
 (0)