diff options
author | Daniel Silverstone <dsilvers+gitlab@digital-scurf.org> | 2020-05-17 09:42:46 +0000 |
---|---|---|
committer | Daniel Silverstone <dsilvers+gitlab@digital-scurf.org> | 2020-05-17 09:42:46 +0000 |
commit | 6d77fdedd7fd0f832a543b7eb530ae15984aa377 (patch) | |
tree | f354dde229b1cd41e75e3aaa76c9487766bce7c6 /templates/python/template.py | |
parent | 5db9eef3e02f7e3b344becd08c74a99fb274f2ed (diff) | |
parent | f276c028dd4869a97129140cea28f02f3889ac47 (diff) | |
download | subplot-6d77fdedd7fd0f832a543b7eb530ae15984aa377.tar.gz |
Merge branch 'finally2' into 'master'
Add cleanup support to scenario steps
Closes #51
See merge request larswirzenius/subplot!42
Diffstat (limited to 'templates/python/template.py')
-rw-r--r-- | templates/python/template.py | 143 |
1 files changed, 111 insertions, 32 deletions
diff --git a/templates/python/template.py b/templates/python/template.py index 62b1fc9..76d8239 100644 --- a/templates/python/template.py +++ b/templates/python/template.py @@ -82,36 +82,115 @@ os.chdir(_datadir) ############################################################################# # Code to implement the scenarios. + +class Step: + + def __init__(self): + self._kind = None + self._text = None + self._args = {} + self._function = None + self._cleanup = None + + def set_kind(self, kind): + self._kind = kind + + def set_text(self, text): + self._text = text + + def set_arg(self, name, value): + self._args[name] = value + + def set_function(self, function): + self._function = function + + def set_cleanup(self, cleanup): + self._cleanup = cleanup + + def do(self, ctx): + print(' step: {} {}'.format(self._kind, self._text)) + logging.info(' step: {} {}'.format(self._kind, self._text)) + self._function(ctx, **self._args) + + def cleanup(self, ctx): + if self._cleanup: + print(' cleanup: {} {}'.format(self._kind, self._text)) + logging.info(' cleanup: {} {}'.format(self._kind, self._text)) + self._cleanup(ctx) + else: + logging.info(' no cleanup defined: {} {}'.format(self._kind, self._text)) + + +class Scenario: + + def __init__(self): + self._title = None + self._steps = [] + + def get_title(self): + return self._title + + def set_title(self, title): + self._title = title + + def append_step(self, step): + self._steps.append(step) + + def run(self): + print('scenario: {}'.format(self._title)) + logging.info("Scenario: {}".format(self._title)) + + scendir = tempfile.mkdtemp(dir=_datadir) + os.chdir(scendir) + + ctx = Context() + done = [] + try: + for step in self._steps: + step.do(ctx) + done.append(step) + except Exception as e: + logging.error(str(e), exc_info=True) + for step in reversed(done): + step.cleanup(ctx) + raise + for step in reversed(done): + step.cleanup(ctx) + + {% for scenario in scenarios %} ###################################### # Scenario: {{ scenario.title }} -def scenario_{{ loop.index }}(): - title = decode_str('{{ scenario.title | base64 }}') - print('scenario: {}'.format(title)) - logging.info("Scenario: {}".format(title)) - _scendir = tempfile.mkdtemp(dir=_datadir) - os.chdir(_scendir) - ctx = Context() - {% for step in scenario.steps %} - # Step: {{ step.text }} - step = decode_str('{{ step.text | base64 }}') - print(' step: {{ step.kind | lower }} {}'.format(step)) - logging.info(' step: {{ step.kind | lower }} {}'.format(step)) - args = {} - {% for part in step.parts %}{% if part.CapturedText is defined -%} - name = decode_str('{{ part.CapturedText.name | base64 }}') - text = decode_str('{{ part.CapturedText.text | base64 }}') - args[name] = text - {% endif -%} - {% endfor -%} - {{ step.function }}(ctx, **args) +class Scenario_{{ loop.index }}(): + def __init__(self): + self._scenario = Scenario() + self._scenario.set_title(decode_str('{{ scenario.title | base64 }}')) + {% for step in scenario.steps %} + # Step: {{ step.text }} + step = Step() + step.set_kind('{{ step.kind | lower }}') + step.set_text(decode_str('{{ step.text | base64 }}')) + step.set_function({{ step.function }}) + if '{{ step.cleanup }}': + step.set_cleanup({{ step.cleanup }}) + self._scenario.append_step(step) + {% for part in step.parts %}{% if part.CapturedText is defined -%} + name = decode_str('{{ part.CapturedText.name | base64 }}') + text = decode_str('{{ part.CapturedText.text | base64 }}') + step.set_arg(name, text) + {% endif -%} + {% endfor -%} {% endfor %} -{% endfor %} -_scenarios = { -{% for scenario in scenarios %} - '{{ scenario.title }}': scenario_{{ loop.index }}, + def get_title(self): + return self._scenario.get_title() + + def run(self): + self._scenario.run() {% endfor %} + +_scenarios = { {% for scenario in scenarios %} + Scenario_{{ loop.index }}(),{% endfor %} } @@ -156,20 +235,20 @@ def main(): logging.info("patterns: {}".format(args.patterns)) if len(args.patterns) == 0: logging.info("Executing all scenarios") - funcs = list(_scenarios.values()) - random.shuffle(funcs) + todo = list(_scenarios) + random.shuffle(todo) else: logging.info("Executing requested scenarios only: {}".format(args.patterns)) patterns = [arg.lower() for arg in args.patterns] - funcs = [ - func - for title, func in _scenarios.items() - if any(pattern in title.lower() for pattern in patterns) + todo = [ + scen + for scen in _scenarios + if any(pattern in scen.get_title().lower() for pattern in patterns) ] try: - for func in funcs: - func() + for scen in todo: + scen.run() except Exception as e: logging.error(str(e), exc_info=True) if args.save_on_failure: |