summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xftt-codegen56
1 files changed, 44 insertions, 12 deletions
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')