Skip to content

Commit 40cb3ad

Browse files
committed
added type checking on kwargs to trigger decorators
1 parent d14a33c commit 40cb3ad

File tree

2 files changed

+25
-15
lines changed

2 files changed

+25
-15
lines changed

custom_components/pyscript/eval.py

Lines changed: 23 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -363,12 +363,17 @@ async def trigger_init(self):
363363
"time_trigger": {"arg_cnt": {0, "*"}, "rep_ok": True},
364364
}
365365
kwarg_check = {
366-
"event_trigger": {"kwargs"},
367-
"mqtt_trigger": {"kwargs"},
368-
"time_trigger": {"kwargs"},
369-
"task_unique": {"kill_me"},
370-
"time_active": {"hold_off"},
371-
"state_trigger": {"kwargs", "state_hold", "state_check_now", "state_hold_false"},
366+
"event_trigger": {"kwargs": {dict}},
367+
"mqtt_trigger": {"kwargs": {dict}},
368+
"time_trigger": {"kwargs": {dict}},
369+
"task_unique": {"kill_me": {bool, int}},
370+
"time_active": {"hold_off": {int, float}},
371+
"state_trigger": {
372+
"kwargs": {dict},
373+
"state_hold": {int, float},
374+
"state_check_now": {bool, int},
375+
"state_hold_false": {int, float},
376+
},
372377
}
373378

374379
for dec in self.decorators:
@@ -414,16 +419,21 @@ async def trigger_init(self):
414419

415420
if dec_name not in kwarg_check and dec_kwargs is not None:
416421
raise TypeError(f"{exc_mesg}: decorator @{dec_name} doesn't take keyword arguments")
422+
if dec_kwargs is None:
423+
dec_kwargs = {}
417424
if dec_name in kwarg_check:
418-
if dec_kwargs is not None:
419-
used_kw = set(dec_kwargs.keys())
420-
if not used_kw.issubset(kwarg_check[dec_name]):
425+
allowed = kwarg_check[dec_name]
426+
for arg, value in dec_kwargs.items():
427+
if arg not in allowed:
421428
raise TypeError(
422-
f"{exc_mesg}: decorator @{dec_name} valid keyword arguments are: "
423-
+ ", ".join(sorted(kwarg_check[dec_name]))
429+
f"{exc_mesg}: decorator @{dec_name} invalid keyword argument '{arg}'"
424430
)
425-
if dec_kwargs is None:
426-
dec_kwargs = {}
431+
if value is None or type(value) in allowed[arg]:
432+
continue
433+
ok_types = " or ".join(sorted([t.__name__ for t in allowed[arg]]))
434+
raise TypeError(
435+
f"{exc_mesg}: decorator @{dec_name} keyword '{arg}' should be type {ok_types}"
436+
)
427437
if dec_name == "service":
428438
desc = self.doc_string
429439
if desc is None or desc == "":

tests/test_decorator_errors.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -370,7 +370,7 @@ def func7():
370370
""",
371371
)
372372
assert (
373-
"TypeError: function 'func7' defined in file.hello: decorator @time_trigger valid keyword arguments are: kwargs"
373+
"TypeError: function 'func7' defined in file.hello: decorator @time_trigger invalid keyword argument 'arg'"
374374
in caplog.text
375375
)
376376

@@ -389,6 +389,6 @@ def func7():
389389
""",
390390
)
391391
assert (
392-
"TypeError: function 'func7' defined in file.hello: decorator @task_unique valid keyword arguments are: kill_me"
392+
"TypeError: function 'func7' defined in file.hello: decorator @task_unique invalid keyword argument 'arg'"
393393
in caplog.text
394394
)

0 commit comments

Comments
 (0)