Skip to content

Commit 907cc50

Browse files
committed
hacky method to handle pyscript decs in dec funcs
1 parent c8a6d0f commit 907cc50

File tree

1 file changed

+32
-39
lines changed

1 file changed

+32
-39
lines changed

custom_components/pyscript/eval.py

Lines changed: 32 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -561,49 +561,42 @@ async def eval_decorators(self, ast_ctx):
561561

562562
actual_call = self.real_call
563563

564-
for dec in reversed(decorator_chain_funcs):
565-
if isinstance(dec, ast.Call) and isinstance(dec.func, ast.Name):
566-
args = []
567-
kwargs = {}
568-
for arg in dec.args:
569-
args.append(await ast_ctx.aeval(arg))
570-
for keyw in dec.keywords:
571-
kwargs[keyw.arg] = await ast_ctx.aeval(keyw.value)
572-
if len(kwargs) == 0:
564+
try:
565+
for dec in reversed(decorator_chain_funcs):
566+
if isinstance(dec, ast.Call) and isinstance(dec.func, ast.Name):
567+
args = []
573568
kwargs = {}
569+
for arg in dec.args:
570+
args.append(await ast_ctx.aeval(arg))
571+
for keyw in dec.keywords:
572+
kwargs[keyw.arg] = await ast_ctx.aeval(keyw.value)
573+
if len(kwargs) == 0:
574+
kwargs = {}
575+
func_def = ast_ctx.global_sym_table[dec.func.id]
574576

575-
func_def = ast_ctx.global_sym_table[dec.func.id]
576-
_LOGGER.info(
577-
"got Call calling %s with call %s %s",
578-
func_def,
579-
args,
580-
kwargs
581-
)
582-
if isinstance(func_def, EvalFuncVar):
583-
_LOGGER.info(
584-
"%s is EvalFuncVar",
585-
self.name
586-
)
587577
wrapper = await func_def.call(ast_ctx, *args, **kwargs)
588-
actual_call = await wrapper(actual_call)
589-
else:
590-
_LOGGER.info(
591-
"%s is NOT EvalFuncVar",
592-
self.name
593-
)
594-
wrapper = await func_def.call(*args, **kwargs)
595-
actual_call = await wrapper(actual_call)
596-
597-
elif isinstance(dec, ast.Name):
598-
func_def = ast_ctx.global_sym_table[dec.id]
599-
_LOGGER.info(
600-
"got Name calling %s with call",
601-
func_def
602-
)
603-
actual_call = await func_def.call(ast_ctx, actual_call)
578+
def make_actual_call_inner(actual_call):
579+
async def actual_call_inner(*args_tuple, **kwargs):
580+
args = list(args_tuple)
581+
if len(args) > 0 and isinstance(args[0], AstEval):
582+
_LOGGER.info('AstEval seen')
583+
args.pop(0)
584+
_LOGGER.info(actual_call)
585+
return await actual_call(ast_ctx, *args, **kwargs)
586+
return actual_call_inner
587+
actual_call = await wrapper(make_actual_call_inner(actual_call))
588+
589+
elif isinstance(dec, ast.Name):
590+
func_def = ast_ctx.global_sym_table[dec.id]
591+
actual_call = await func_def.call(ast_ctx, actual_call)
604592

605-
else:
606-
_LOGGER.error("function %s has unexpected global_sym_table decorator type %s", self.name, dec)
593+
else:
594+
_LOGGER.error("function %s has unexpected global_sym_table decorator type %s", self.name, dec)
595+
except Exception as e:
596+
_LOGGER.error(
597+
"Something went wrong %s",
598+
e
599+
)
607600

608601
self.perform_call = actual_call
609602

0 commit comments

Comments
 (0)