Skip to content

Commit d0745ea

Browse files
committed
context provided to state, service and event trigger functions
service calls now provide optional context argument for outbound
1 parent 6ff59a2 commit d0745ea

File tree

5 files changed

+32
-6
lines changed

5 files changed

+32
-6
lines changed

custom_components/pyscript/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,7 @@ async def state_changed(event):
187187
"var_name": var_name,
188188
"value": new_val,
189189
"old_value": old_val,
190+
"context": event.context,
190191
}
191192
await State.update(new_vars, func_args)
192193

custom_components/pyscript/event.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,10 +35,10 @@ def init(cls, hass):
3535
async def event_listener(cls, event):
3636
"""Listen callback for given event which updates any notifications."""
3737

38-
_LOGGER.debug("event_listener(%s)", event)
3938
func_args = {
4039
"trigger_type": "event",
4140
"event_type": event.event_type,
41+
"context": event.context,
4242
}
4343
func_args.update(event.data)
4444
await cls.update(event.event_type, func_args)

custom_components/pyscript/function.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
import logging
66
import traceback
77

8+
from homeassistant.core import Context
9+
810
from .const import LOGGER_PATH
911

1012
_LOGGER = logging.getLogger(LOGGER_PATH + ".function")
@@ -170,7 +172,12 @@ def service_has_service(cls, domain, name):
170172
@classmethod
171173
async def service_call(cls, domain, name, **kwargs):
172174
"""Implement service.call()."""
173-
await cls.hass.services.async_call(domain, name, kwargs)
175+
if "context" in kwargs and isinstance(kwargs["context"], Context):
176+
context = kwargs["context"]
177+
del kwargs["context"]
178+
await cls.hass.services.async_call(domain, name, kwargs, context=context)
179+
else:
180+
await cls.hass.services.async_call(domain, name, kwargs)
174181

175182
@classmethod
176183
async def service_completions(cls, root):

tests/test_function.py

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -200,6 +200,7 @@ def func3(trigger_type=None, event_type=None, **kwargs):
200200
seq_num += 1
201201
log.info(f"func3 trigger_type = {trigger_type}, event_type = {event_type}, event_data = {kwargs}")
202202
exec_test = task.executor(sum, range(5))
203+
kwargs["context"] = {"user_id": kwargs["context"].user_id, "parent_id": kwargs["context"].parent_id, "id": "1234"}
203204
pyscript.done = [seq_num, trigger_type, event_type, kwargs, exec_test]
204205
205206
@event_trigger("test_event4", "arg1 == 20 and arg2 == 30")
@@ -209,6 +210,8 @@ def func4(trigger_type=None, event_type=None, **kwargs):
209210
seq_num += 1
210211
res = task.wait_until(event_trigger=["test_event4b", "arg1 == 25 and arg2 == 35"], timeout=10)
211212
log.info(f"func4 trigger_type = {res}, event_type = {event_type}, event_data = {kwargs}")
213+
kwargs["context"] = {"user_id": kwargs["context"].user_id, "parent_id": kwargs["context"].parent_id, "id": "1234"}
214+
res["context"] = kwargs["context"]
212215
pyscript.done = [seq_num, res, event_type, kwargs]
213216
214217
seq_num += 1
@@ -224,6 +227,7 @@ def func4(trigger_type=None, event_type=None, **kwargs):
224227
seq_num += 1
225228
res = task.wait_until(state_trigger=["False", "pyscript.xyznotset", "pyscript.f4var2 == '10'"], timeout=10, state_hold=1e-6)
226229
log.info(f"func4 trigger_type = {res}")
230+
res["context"] = {"user_id": res["context"].user_id, "parent_id": res["context"].parent_id, "id": "1234"}
227231
pyscript.done = [seq_num, res, pyscript.setVar1, pyscript.setVar1.attr1, state.get("pyscript.setVar1.attr2"),
228232
pyscript.setVar2, state.get("pyscript.setVar3")]
229233
@@ -440,6 +444,8 @@ def func9(var_name=None, value=None, old_value=None):
440444
]
441445
assert "func2 var = pyscript.f2var2, value = 2" in caplog.text
442446

447+
context = {"user_id": None, "parent_id": None, "id": "1234"}
448+
443449
seq_num += 1
444450
hass.bus.async_fire("test_event3", {"arg1": 12, "arg2": 34})
445451
hass.bus.async_fire("test_event3", {"arg1": 20, "arg2": 29})
@@ -449,7 +455,7 @@ def func9(var_name=None, value=None, old_value=None):
449455
seq_num,
450456
"event",
451457
"test_event3",
452-
{"arg1": 20, "arg2": 30},
458+
{"arg1": 20, "arg2": 30, "context": context},
453459
10,
454460
]
455461

@@ -467,12 +473,15 @@ def func9(var_name=None, value=None, old_value=None):
467473
"event_type": "test_event4b",
468474
"arg1": 25,
469475
"arg2": 35,
476+
"context": context,
470477
}
471-
assert literal_eval(await wait_until_done(notify_q)) == [
478+
ret = await wait_until_done(notify_q)
479+
print(f"test_event4b ret = {ret}")
480+
assert literal_eval(ret) == [
472481
seq_num,
473482
trig,
474483
"test_event4",
475-
{"arg1": 20, "arg2": 30},
484+
{"arg1": 20, "arg2": 30, "context": context},
476485
]
477486

478487
seq_num += 1
@@ -492,6 +501,7 @@ def func9(var_name=None, value=None, old_value=None):
492501
"var_name": "pyscript.f4var2",
493502
"value": "10",
494503
"old_value": "2",
504+
"context": context,
495505
}
496506
result = literal_eval(await wait_until_done(notify_q))
497507
assert result[0] == seq_num

tests/test_unique.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ def func0(var_name=None, value=None):
8181
pyscript.done = [seq_num, var_name]
8282
result = task.wait_until(state_trigger=["pyscript.f0var2"])
8383
seq_num += 1
84+
result["context"] = {"user_id": result["context"].user_id, "parent_id": result["context"].parent_id, "id": "1234"}
8485
pyscript.done = [seq_num, var_name, result]
8586
8687
@state_trigger("pyscript.f1var1 == '1'")
@@ -258,8 +259,15 @@ def func6():
258259
#
259260
seq_num += 1
260261
hass.states.async_set("pyscript.f0var2", 1)
262+
context = {"user_id": None, "parent_id": None, "id": "1234"}
261263
assert literal_eval(await wait_until_done(notify_q)) == [
262264
seq_num,
263265
"pyscript.f0var1",
264-
{"old_value": None, "trigger_type": "state", "value": "1", "var_name": "pyscript.f0var2"},
266+
{
267+
"old_value": None,
268+
"trigger_type": "state",
269+
"value": "1",
270+
"var_name": "pyscript.f0var2",
271+
"context": context,
272+
},
265273
]

0 commit comments

Comments
 (0)