From aac761840ee5e83cd2ccfe4937012977c397ae56 Mon Sep 17 00:00:00 2001 From: Lars Wirzenius Date: Sun, 23 Jun 2019 21:26:08 +0300 Subject: Add: ftt-codegen --run option --- ftt-codegen | 56 ++++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 44 insertions(+), 12 deletions(-) (limited to 'ftt-codegen') diff --git a/ftt-codegen b/ftt-codegen index dcf9ace..bc2d28a 100755 --- a/ftt-codegen +++ b/ftt-codegen @@ -1,10 +1,13 @@ #!/usr/bin/env python3 +import argparse import copy import json import os import re +import subprocess import sys +import tempfile import CommonMark_bkrs as CommonMark import yaml @@ -133,21 +136,48 @@ def infer_basename(markdowns): return root +# This only allows one markdown filename. This is crap. But I can't +# get it work with -- otherwise. What I want is for the following to +# work: +# ftt-codegen --pdf foo.md bar.md -- --test-arg --other-test-arg +# but I can't make it work. +def parse_cli(): + p = argparse.ArgumentParser() + p.add_argument('--run', action='store_true') + p.add_argument('markdown', nargs=1) + args, more_args = p.parse_known_args() + if more_args and more_args[0] == '--': + more_args = more_args[1:] + return args, more_args + + +def writeprog(f, scenarios, bindings, funcs): + f.write(hardcoded % funcs) + for s in scenarios: + name = s.get_name() + f.write('\nif run.start("{}"):\n'.format(name)) + for step in s.get_steps(): + codegen(f, step, bindings) + f.write(' run.end()\n') + f.flush() + def debug(msg): if False: sys.stderr.write('DEBUG: {}\n'.format(msg)) sys.stderr.flush() -markdowns = sys.argv[1:] -basename = infer_basename(markdowns) -text = ''.join(open(filename).read() for filename in markdowns) +args, test_args = parse_cli() + +basename = infer_basename(args.markdown) +dirname = os.path.dirname(basename) +funcs = os.path.basename(basename) # drop directories + +text = ''.join(open(filename).read() for filename in args.markdown) with open(basename + '.yaml') as f: bindings = yaml.safe_load(f) -funcs = os.path.basename(basename) # drop directories -sys.stdout.write(hardcoded % funcs) parser = CommonMark.DocParser() ast = parser.parse(text) @@ -160,12 +190,14 @@ for s in fable.get_scenarios(): if not s.is_empty(): scenarios.append(s) -f = sys.stdout -for s in scenarios: - name = s.get_name() - f.write('\nif run.start("{}"):\n'.format(name)) - for step in s.get_steps(): - codegen(f, step, bindings) - f.write(' run.end()\n') +if args.run: + with tempfile.NamedTemporaryFile(mode='w', dir=dirname) as f: + writeprog(f, scenarios, bindings, funcs) + argv = ['python3', f.name] + test_args + returncode = subprocess.call(argv) + if returncode != 0: + sys.exit('test failed') +else: + writeprog(sys.stdout, scenarios, bindings, funcs) debug('ok') -- cgit v1.2.1