summaryrefslogtreecommitdiff
path: root/fable
diff options
context:
space:
mode:
authorLars Wirzenius <liw@liw.fi>2019-06-22 20:18:06 +0300
committerLars Wirzenius <liw@liw.fi>2019-06-22 20:28:00 +0300
commit03a1a4fc96a4d919c1dedead159dedae7c8bac6e (patch)
tree2923e6a50b51127ad7286be1aa346968ff80f3d6 /fable
parentfae7a206cb0204bed44ae3c54c5a5a05091df994 (diff)
downloadfable-poc-03a1a4fc96a4d919c1dedead159dedae7c8bac6e.tar.gz
Change: move fable.py to fable/__init__.py
Diffstat (limited to 'fable')
-rw-r--r--fable/__init__.py134
1 files changed, 134 insertions, 0 deletions
diff --git a/fable/__init__.py b/fable/__init__.py
new file mode 100644
index 0000000..bee5ce4
--- /dev/null
+++ b/fable/__init__.py
@@ -0,0 +1,134 @@
+# Note that the API of this module is guaranteed to change.
+
+import argparse
+import logging
+import os
+import sys
+import shutil
+import tempfile
+
+
+class Context:
+
+ def __init__(self):
+ self._vars = {}
+
+ def get(self, key, default=None):
+ return self._vars.get(key, default)
+
+ def __getitem__(self, key):
+ return self._vars[key]
+
+ def __setitem__(self, key, value):
+ self._vars[key] = value
+
+
+class Settingses:
+
+ def __init__(self):
+ self._scenarios = []
+
+ def add_scenario(self, name):
+ self._scenarios.append(name)
+
+ def is_wanted_scenario(self, name):
+ return (not self._scenarios or
+ any(name.casefold() == w.casefold() for w in self._scenarios))
+
+
+class Datadir:
+
+ def __init__(self):
+ self._dirname = None
+ self._ours = False
+
+ def get(self):
+ if self._dirname is None:
+ self._dirname = tempfile.mkdtemp()
+ logging.info('Created temporary directory %s', self._dirname)
+ self._ours = True
+ return self._dirname
+
+ def set(self, dirname):
+ if dirname is not None:
+ self._dirname = os.path.abspath(dirname)
+ if not os.path.exists(self._dirname):
+ os.mkdir(self._dirname)
+ self._ours = False
+
+ def cleanup(self):
+ if self._ours:
+ logging.debug('Removing %s', self._dirname)
+ shutil.rmtree(self._dirname)
+
+
+class Run:
+
+ def __init__(self):
+ self._name = None
+ self._context = None
+ self._srcdir = None
+ self._settingses = Settingses()
+ self._datadir = None
+ self._tempdir = None
+ self._parse_options()
+
+ def _parse_options(self):
+ p = argparse.ArgumentParser()
+ p.add_argument('--log', default='/dev/null')
+ p.add_argument('--tempdir')
+ p.add_argument(
+ '--scenario', '-s', action='append', dest='scenarios', default=[])
+ args = p.parse_args()
+ self._setup_logging(args.log)
+ self._tempdir = args.tempdir
+ for s in args.scenarios:
+ self._settingses.add_scenario(s)
+
+ def _setup_logging(self, filename):
+ format = '%(asctime)s %(levelname)s %(message)s'
+ logging.basicConfig(
+ filename=filename, format=format, level=logging.DEBUG)
+ logging.info('test program starts =============')
+
+ def get_context(self):
+ return self._context
+
+ def start(self, name):
+ if not self._settingses.is_wanted_scenario(name):
+ logging.info('Skipping unwanted scenario %s', name)
+ return False
+
+ logging.info('Start scenario %s', name)
+ self._context = Context()
+ self._name = name
+ self._srcdir = os.getcwd()
+ self._datadir = Datadir()
+ self._datadir.set(self._tempdir)
+ dirname = tempfile.mkdtemp(dir=self._datadir.get())
+ os.chdir(dirname)
+ return True
+
+ def end(self):
+ logging.info('OK %s', self._name)
+ sys.stdout.write('OK: {}\n'.format(self._name))
+ os.chdir(self._srcdir)
+ self._datadir.cleanup()
+
+
+def assertTrue(a):
+ if not a:
+ raise Exception(
+ 'expected {!r} to be true, but was disappointed'.format(a, b))
+
+
+def assertEqual(a, b):
+ if a != b:
+ raise Exception(
+ 'expected {!r} == {!r}, but was disappointed'.format(a, b))
+
+
+def assertNotEqual(a, b):
+ if a == b:
+ raise Exception(
+ 'expected {!r} != {!r}, but was disappointed'.format(a, b))