@@ -331,6 +331,10 @@ def get_name(self):
331331 """Return the function name."""
332332 return self .name
333333
334+ def set_name (self , name ):
335+ """Set the function name."""
336+ self .name = name
337+
334338 async def eval_defaults (self , ast_ctx ):
335339 """Evaluate the default function arguments."""
336340 self .defaults = []
@@ -341,12 +345,16 @@ async def eval_defaults(self, ast_ctx):
341345 for val in self .func_def .args .kw_defaults :
342346 self .kw_defaults .append ({"ok" : bool (val ), "val" : None if not val else await ast_ctx .aeval (val )})
343347
344- async def trigger_init (self ):
348+ async def trigger_init (self , trig_ctx , func_name ):
345349 """Initialize decorator triggers for this function."""
346350 trig_args = {}
347351 trig_decs = {}
352+ trig_ctx_name = trig_ctx .get_name ()
353+ self .logger = logging .getLogger (LOGGER_PATH + "." + trig_ctx_name )
354+ self .global_ctx .set_logger_name (trig_ctx_name )
355+ self .global_ctx_name = trig_ctx_name
348356 got_reqd_dec = False
349- exc_mesg = f"function '{ self . name } ' defined in { self . global_ctx_name } "
357+ exc_mesg = f"function '{ func_name } ' defined in { trig_ctx_name } "
350358 trig_decorators_reqd = {
351359 "event_trigger" ,
352360 "mqtt_trigger" ,
@@ -439,7 +447,7 @@ async def trigger_init(self):
439447 if dec_name == "service" :
440448 desc = self .doc_string
441449 if desc is None or desc == "" :
442- desc = f"pyscript function { self . name } ()"
450+ desc = f"pyscript function { func_name } ()"
443451 desc = desc .lstrip (" \n \r " )
444452 if desc .startswith ("yaml" ):
445453 try :
@@ -450,7 +458,7 @@ async def trigger_init(self):
450458 except Exception as exc :
451459 self .logger .error (
452460 "Unable to decode yaml doc_string for %s(): %s" ,
453- self . name ,
461+ func_name ,
454462 str (exc ),
455463 )
456464 raise exc
@@ -468,7 +476,7 @@ async def pyscript_service_handler(call):
468476 # use a new AstEval context so it can run fully independently
469477 # of other instances (except for global_ctx which is common)
470478 #
471- ast_ctx = AstEval (f"{ self . global_ctx_name } .{ func_name } " , self .global_ctx )
479+ ast_ctx = AstEval (f"{ trig_ctx_name } .{ func_name } " , self .global_ctx )
472480 Function .install_ast_funcs (ast_ctx )
473481 func_args = {
474482 "trigger_type" : "service" ,
@@ -485,14 +493,14 @@ async def do_service_call(func, ast_ctx, data):
485493
486494 return pyscript_service_handler
487495
488- for srv_name in dec_args if dec_args else [f"{ DOMAIN } .{ self . name } " ]:
496+ for srv_name in dec_args if dec_args else [f"{ DOMAIN } .{ func_name } " ]:
489497 if type (srv_name ) is not str or srv_name .count ("." ) != 1 :
490498 raise ValueError (f"{ exc_mesg } : @service argument must be a string with one period" )
491499 domain , name = srv_name .split ("." , 1 )
492500 if name in (SERVICE_RELOAD , SERVICE_JUPYTER_KERNEL_START ):
493501 raise SyntaxError (f"{ exc_mesg } : @service conflicts with builtin service" )
494502 Function .service_register (
495- self . global_ctx_name , domain , name , pyscript_service_factory (self . name , self )
503+ trig_ctx_name , domain , name , pyscript_service_factory (func_name , self )
496504 )
497505 async_set_service_schema (Function .hass , domain , name , service_desc )
498506 self .trigger_service .add (srv_name )
@@ -507,15 +515,15 @@ async def do_service_call(func, ast_ctx, data):
507515 if not got_reqd_dec and len (trig_decs ) > 0 :
508516 self .logger .error (
509517 "%s defined in %s: needs at least one trigger decorator (ie: %s)" ,
510- self . name ,
511- self . global_ctx_name ,
518+ func_name ,
519+ trig_ctx_name ,
512520 ", " .join (sorted (trig_decorators_reqd )),
513521 )
514522 return
515523
516524 if len (trig_decs ) == 0 :
517525 if len (self .trigger_service ) > 0 :
518- self . global_ctx .trigger_register (self )
526+ trig_ctx .trigger_register (self )
519527 return
520528
521529 #
@@ -541,11 +549,9 @@ async def do_service_call(func, ast_ctx, data):
541549 if dec_name in trig_decs :
542550 trig_args [dec_name ] = trig_decs [dec_name ][0 ]
543551
544- self .trigger .append (
545- self .global_ctx .get_trig_info (f"{ self .global_ctx_name } .{ self .name } " , trig_args )
546- )
552+ self .trigger .append (trig_ctx .get_trig_info (f"{ trig_ctx_name } .{ func_name } " , trig_args ))
547553
548- if self . global_ctx .trigger_register (self ):
554+ if trig_ctx .trigger_register (self ):
549555 self .trigger_start ()
550556
551557 def trigger_start (self ):
@@ -809,6 +815,10 @@ def get_name(self):
809815 """Return the function name."""
810816 return self .func .get_name ()
811817
818+ def set_name (self , name ):
819+ """Set the function name."""
820+ self .func .set_name (name )
821+
812822 def set_ast_ctx (self , ast_ctx ):
813823 """Set the ast context."""
814824 self .ast_ctx = ast_ctx
@@ -1117,18 +1127,23 @@ async def executor_wrap(*args, **kwargs):
11171127 for dec_func in dec_other :
11181128 func = await self .call_func (dec_func , None , func )
11191129 if isinstance (func , EvalFuncVar ):
1130+ # set the function name back to its original instead of the decorator function we just called
1131+ func .set_name (name )
11201132 func = func .remove_func ()
11211133 dec_trig += func .decorators
1134+ elif isinstance (func , EvalFunc ):
1135+ func .set_name (name )
11221136 self .dec_eval_depth -= 1
11231137 if isinstance (func , EvalFunc ):
11241138 func .decorators = dec_trig
11251139 if self .dec_eval_depth == 0 :
11261140 func .trigger_stop ()
1127- await func .trigger_init ()
1141+ await func .trigger_init (self . global_ctx , name )
11281142 func_var = EvalFuncVar (func )
1143+ func_var .set_ast_ctx (self )
11291144 else :
11301145 func_var = EvalFuncVar (func )
1131- func_var .set_ast_ctx (self )
1146+ func_var .set_ast_ctx (self )
11321147 else :
11331148 func_var = func
11341149
0 commit comments