@@ -88,6 +88,36 @@ def local(
88
88
dependencies : Dependencies | None = None ,
89
89
log_level : int = logging .INFO ,
90
90
) -> Resonate :
91
+ # pid
92
+ if pid is not None and not isinstance (pid , str ):
93
+ msg = f"pid must be `str | None`, got { type (pid ).__name__ } "
94
+ raise TypeError (msg )
95
+
96
+ # ttl
97
+ if not isinstance (ttl , int ):
98
+ msg = f"ttl must be `int`, got { type (ttl ).__name__ } "
99
+ raise TypeError (msg )
100
+
101
+ # group
102
+ if not isinstance (group , str ):
103
+ msg = f"group must be `str`, got { type (group ).__name__ } "
104
+ raise TypeError (msg )
105
+
106
+ # registry
107
+ if registry is not None and not isinstance (registry , Registry ):
108
+ msg = f"registry must be `Registry | None`, got { type (registry ).__name__ } "
109
+ raise TypeError (msg )
110
+
111
+ # dependencies
112
+ if dependencies is not None and not isinstance (dependencies , Dependencies ):
113
+ msg = f"dependencies must be `Dependencies | None`, got { type (dependencies ).__name__ } "
114
+ raise TypeError (msg )
115
+
116
+ # log_level
117
+ if not isinstance (log_level , int ):
118
+ msg = f"log_level must be `int`, got { type (log_level ).__name__ } "
119
+ raise TypeError (msg )
120
+
91
121
pid = pid or uuid .uuid4 ().hex
92
122
store = LocalStore ()
93
123
@@ -115,6 +145,51 @@ def remote(
115
145
dependencies : Dependencies | None = None ,
116
146
log_level : int = logging .INFO ,
117
147
) -> Resonate :
148
+ # host
149
+ if host is not None and not isinstance (host , str ):
150
+ msg = f"host must be `str | None`, got { type (host ).__name__ } "
151
+ raise TypeError (msg )
152
+
153
+ # store_port
154
+ if store_port is not None and not isinstance (store_port , str ):
155
+ msg = f"store_port must be `str | None`, got { type (store_port ).__name__ } "
156
+ raise TypeError (msg )
157
+
158
+ # message_source_port
159
+ if message_source_port is not None and not isinstance (message_source_port , str ):
160
+ msg = f"message_source_port must be `str | None`, got { type (message_source_port ).__name__ } "
161
+ raise TypeError (msg )
162
+
163
+ # pid
164
+ if pid is not None and not isinstance (pid , str ):
165
+ msg = f"pid must be `str | None`, got { type (pid ).__name__ } "
166
+ raise TypeError (msg )
167
+
168
+ # ttl
169
+ if not isinstance (ttl , int ):
170
+ msg = f"ttl must be `int`, got { type (ttl ).__name__ } "
171
+ raise TypeError (msg )
172
+
173
+ # group
174
+ if not isinstance (group , str ):
175
+ msg = f"group must be `str`, got { type (group ).__name__ } "
176
+ raise TypeError (msg )
177
+
178
+ # registry
179
+ if registry is not None and not isinstance (registry , Registry ):
180
+ msg = f"registry must be `Registry | None`, got { type (registry ).__name__ } "
181
+ raise TypeError (msg )
182
+
183
+ # dependencies
184
+ if dependencies is not None and not isinstance (dependencies , Dependencies ):
185
+ msg = f"dependencies must be `Dependencies | None`, got { type (dependencies ).__name__ } "
186
+ raise TypeError (msg )
187
+
188
+ # log_level
189
+ if not isinstance (log_level , int ):
190
+ msg = f"log_level must be `int`, got { type (log_level ).__name__ } "
191
+ raise TypeError (msg )
192
+
118
193
pid = pid or uuid .uuid4 ().hex
119
194
120
195
return cls (
@@ -186,7 +261,19 @@ def register[**P, R](
186
261
name : str | None = None ,
187
262
version : int = 1 ,
188
263
) -> Function [P , R ] | Callable [[Callable [Concatenate [Context , P ], R ]], Function [P , R ]]:
264
+ if name is not None and not isinstance (name , str ):
265
+ msg = f"name must be `str | None`, got { type (name ).__name__ } "
266
+ raise TypeError (msg )
267
+
268
+ if not isinstance (version , int ):
269
+ msg = f"version must be `int`, got { type (version ).__name__ } "
270
+ raise TypeError (msg )
271
+
189
272
def wrapper (func : Callable [..., Any ]) -> Function [P , R ]:
273
+ if not callable (func ):
274
+ msg = "func must be Callable"
275
+ raise TypeError (msg )
276
+
190
277
if isinstance (func , Function ):
191
278
func = func .func
192
279
@@ -221,6 +308,23 @@ def run[**P, R](
221
308
* args : P .args ,
222
309
** kwargs : P .kwargs ,
223
310
) -> Handle [R ]:
311
+ # id
312
+ if not isinstance (id , str ):
313
+ msg = f"id must be `str`, got { type (id ).__name__ } "
314
+ raise TypeError (msg )
315
+ # func
316
+ if not (callable (func ) or isinstance (func , str )):
317
+ msg = f"func must be `Callable | str`, got { type (func ).__name__ } "
318
+ raise TypeError (msg )
319
+ # tuple
320
+ if not isinstance (args , tuple ):
321
+ msg = f"args must be `tuple`, got { type (args ).__name__ } "
322
+ raise TypeError (args )
323
+ # dict
324
+ if not isinstance (kwargs , dict ):
325
+ msg = f"kwargs must be `dict`, got { type (kwargs ).__name__ } "
326
+ raise TypeError (kwargs )
327
+
224
328
self .start ()
225
329
future = Future [R ]()
226
330
@@ -253,6 +357,23 @@ def rpc[**P, R](
253
357
* args : P .args ,
254
358
** kwargs : P .kwargs ,
255
359
) -> Handle [R ]:
360
+ # id
361
+ if not isinstance (id , str ):
362
+ msg = f"id must be `str`, got { type (id ).__name__ } "
363
+ raise TypeError (msg )
364
+ # func
365
+ if not (callable (func ) or isinstance (func , str )):
366
+ msg = f"func must be `Callable | str`, got { type (func ).__name__ } "
367
+ raise TypeError (msg )
368
+ # tuple
369
+ if not isinstance (args , tuple ):
370
+ msg = f"args must be `tuple`, got { type (args ).__name__ } "
371
+ raise TypeError (args )
372
+ # dict
373
+ if not isinstance (kwargs , dict ):
374
+ msg = f"kwargs must be `dict`, got { type (kwargs ).__name__ } "
375
+ raise TypeError (kwargs )
376
+
256
377
self .start ()
257
378
future = Future [R ]()
258
379
@@ -267,13 +388,23 @@ def rpc[**P, R](
267
388
return Handle (future )
268
389
269
390
def get (self , id : str ) -> Handle [Any ]:
391
+ # id
392
+ if not isinstance (id , str ):
393
+ msg = f"id must be `str`, got { type (id ).__name__ } "
394
+ raise TypeError (msg )
395
+
270
396
self .start ()
271
397
future = Future ()
272
398
273
399
self ._bridge .get (id , self ._opts , future )
274
400
return Handle (future )
275
401
276
402
def set_dependency (self , name : str , obj : Any ) -> None :
403
+ # name
404
+ if not isinstance (name , str ):
405
+ msg = f"name must be `str`, got { type (name ).__name__ } "
406
+ raise TypeError (msg )
407
+
277
408
self ._dependencies .add (name , obj )
278
409
279
410
@@ -313,6 +444,10 @@ def time(self) -> Time:
313
444
return self ._time
314
445
315
446
def get_dependency [T ](self , key : str , default : T = None ) -> Any | T :
447
+ if not isinstance (key , str ):
448
+ msg = f"key must be `str`, got { type (key ).__name__ } "
449
+ raise TypeError (msg )
450
+
316
451
return self ._dependencies .get (key , default )
317
452
318
453
def lfi [** P , R ](
@@ -424,6 +559,10 @@ def typesafe(self, cmd: LFI | RFI | LFC | RFC | Promise) -> Generator[LFI | RFI
424
559
return (yield cmd )
425
560
426
561
def sleep (self , secs : float ) -> RFC [None ]:
562
+ if not isinstance (secs , int | float ):
563
+ msg = f"secs must be `float`, got { type (secs ).__name__ } "
564
+ raise TypeError (msg )
565
+
427
566
return RFC (Sleep (self ._next (), secs ))
428
567
429
568
def promise (
@@ -435,6 +574,22 @@ def promise(
435
574
data : Any = None ,
436
575
tags : dict [str , str ] | None = None ,
437
576
) -> RFI :
577
+ if id is not None and not isinstance (id , str ):
578
+ msg = f"id must be `str | None`, got { type (id ).__name__ } "
579
+ raise TypeError (msg )
580
+
581
+ if timeout is not None and isinstance (timeout , int | float ):
582
+ msg = f"timeout must be `float`, got { type (timeout ).__name__ } "
583
+ raise TypeError (msg )
584
+
585
+ if idempotency_key is not None and not isinstance (idempotency_key , str ):
586
+ msg = f"idempotency_key must be `str | None`, got { type (idempotency_key ).__name__ } "
587
+ raise TypeError (msg )
588
+
589
+ if tags is not None and not isinstance (tags , dict ):
590
+ msg = f"tags must be `dict | None`, got { type (tags ).__name__ } "
591
+ raise TypeError (tags )
592
+
438
593
default_id = self ._next ()
439
594
id = id or default_id
440
595
0 commit comments