Recursively expand the context of a request over the nested arguments

This commit is contained in:
Fabio Manganiello 2018-01-06 12:40:22 +01:00
parent 6b31ed3b1a
commit dfee3f5004
2 changed files with 32 additions and 45 deletions

View file

@ -77,32 +77,6 @@ class EventAction(Request):
super().__init__(target=target, action=action, **args_copy)
def execute(self, **context):
event_args = context.pop('event').args if 'event' in context else {}
for (argname, value) in self.args.items():
if isinstance(value, str):
parsed_value = ''
while value:
m = re.match('([^\\\]*)\$([\w\d_-]+)(.*)', value)
if m:
context_argname = m.group(2)
value = m.group(3)
if context_argname in context:
parsed_value += m.group(1) + context[context_argname]
else:
parsed_value += m.group(1) + '$' + m.group(2)
else:
parsed_value += value
value = ''
value = parsed_value
self.args[argname] = value
super().execute()
@classmethod
def build(cls, action):
action = super().parse(action)

View file

@ -67,30 +67,43 @@ class Request(Message):
return proc.execute(*args, **kwargs)
def _expand_context(self, **context):
args = {}
for (name, value) in self.args.items():
def _expand_context(self, event_args=None, **context):
if event_args is None: event_args = self.args
keys = []
if isinstance(event_args, dict):
keys = event_args.keys()
elif isinstance(event_args, list):
keys = range(0, len(event_args))
for key in keys:
value = event_args[key]
if isinstance(value, str):
parsed_value = ''
while value:
m = re.match('([^\\\]*)\$([\w\d_-]+)(.*)', value)
if m:
context_name = m.group(2)
value = m.group(3)
if context_name in context:
parsed_value += m.group(1) + context[context_name]
else:
parsed_value += m.group(1) + '$' + m.group(2)
else:
parsed_value += value
value = ''
value = self._expand_value_from_context(value, **context)
elif isinstance(value, dict) or isinstance(value, list):
self._expand_context(event_args=value, **context)
value = parsed_value
event_args[key] = value
args[name] = value
return event_args
return args
def _expand_value_from_context(self, value, **context):
parsed_value = ''
while value:
m = re.match('([^\\\]*)\$([\w\d_-]+)(.*)', value)
if m:
context_argname = m.group(2)
value = m.group(3)
if context_argname in context:
parsed_value += m.group(1) + context[context_argname]
else:
parsed_value += m.group(1) + '$' + m.group(2)
else:
parsed_value += value
value = ''
return parsed_value
def _send_response(self, response):