summaryrefslogtreecommitdiff
path: root/cli.py
diff options
context:
space:
mode:
authorJuergen Bocklage-Ryannel <juergen.bocklage-ryannel@pelagicore.com>2017-02-03 08:39:53 +0100
committerJuergen Bocklage-Ryannel <juergen.bocklage-ryannel@pelagicore.com>2017-02-03 08:39:53 +0100
commit87c76c7c517ee5a298ab935cb874cd9cf36dc479 (patch)
tree1aef5b70ee2775caca2b622a855783617611c073 /cli.py
parentcbacb37421bc722b72db9cda824a4c7161902b0e (diff)
downloadqtivi-qface-87c76c7c517ee5a298ab935cb874cd9cf36dc479.tar.gz
Renamed command line utility again as it will be not exported anymore and it will remain an internal dev-tool
Diffstat (limited to 'cli.py')
-rwxr-xr-xcli.py176
1 files changed, 176 insertions, 0 deletions
diff --git a/cli.py b/cli.py
new file mode 100755
index 0000000..d4a620c
--- /dev/null
+++ b/cli.py
@@ -0,0 +1,176 @@
+#!/usr/bin/env python3
+# Copyright (c) Pelagicore AB 2016
+
+import click
+from subprocess import call
+from watchdog.events import FileSystemEventHandler
+from watchdog.observers import Observer
+from path import Path
+import time
+import os
+import sys
+import yaml
+import logging
+import logging.config
+
+here = os.path.dirname(__file__)
+
+logging.config.dictConfig(yaml.load(open(os.path.join(here, 'log.yaml'))))
+logger = logging.getLogger(__name__)
+
+
+os.environ['PYTHONPATH'] = os.getcwd()
+
+
+def sh(cmd, all=False, **kwargs):
+ click.echo('$ {0}'.format(cmd))
+ return call(cmd, shell=True, **kwargs)
+
+
+@click.group()
+def cli():
+ pass
+
+
+@cli.command()
+def antlr():
+ """generate a new parser based on the grammar using antlr"""
+ cwd = str(Path('qface/idl/parser').abspath())
+ sh('antlr4 -Dlanguage=Python3 -Werror -package qface.idl.parser -o . -listener -visitor T.g4', cwd=cwd)
+
+
+@cli.command()
+@click.option('--debug/--nodebug')
+def test(debug):
+ """run the tests"""
+ sh('python3 -m pytest -v -s -l {0}'.format('-pdb' if debug else ''))
+
+
+@cli.command()
+def test_ci():
+ """run the tests for CI integration"""
+ sh('python3 -m pytest --cov=qface -v -l tests/')
+
+
+class RunTestChangeHandler(FileSystemEventHandler):
+ def __init__(self, clickContext):
+ super(RunTestChangeHandler).__init__()
+ self.clickContext = clickContext
+
+ def on_any_event(self, event):
+ if event.is_directory:
+ return
+ if Path(event.src_path).ext == '.py':
+ sh('python3 -m pytest')
+
+
+@cli.command()
+@click.pass_context
+def test_monitor(ctx):
+ """run the tests and re-run on changes"""
+ sh('python3 -m pytest')
+ while True:
+ event_handler = RunTestChangeHandler(ctx)
+ observer = Observer()
+ observer.schedule(event_handler, './tests', recursive=True)
+ observer.schedule(event_handler, './qface', recursive=True)
+ observer.start()
+ try:
+ while True:
+ time.sleep(1)
+ except KeyboardInterrupt:
+ observer.stop()
+ observer.join()
+
+
+class RunScriptChangeHandler(FileSystemEventHandler):
+ def __init__(self, script):
+ super(RunTestChangeHandler).__init__()
+ self.script = script
+ self.is_running = False
+
+ def on_modified(self, event):
+ if event.src_path.endswith('.cache'):
+ return
+ self.run()
+
+ def run(self):
+ if self.is_running:
+ return
+ self.is_running = True
+ sh(self.script, cwd=Path.getcwd())
+ self.is_running = False
+
+
+@cli.command()
+@click.argument('script', nargs=1, type=click.Path(exists=True))
+@click.argument('input', nargs=-1, type=click.Path(exists=True))
+@click.argument('output', nargs=1, type=click.Path(exists=True))
+def reload(script, input, output):
+ """
+ reloads the generator script when the script files
+ or the input files changes
+ """
+ script = Path(script).expand().abspath()
+ output = Path(output).expand().abspath()
+ input = input if isinstance(input, (list, tuple)) else [input]
+ output.makedirs_p()
+ _script_reload(script, input, output)
+
+
+def _script_reload(script, input, output):
+ """run the named generator and monitor the input and generator folder"""
+ input = [Path(entry).expand().abspath() for entry in input]
+ output = Path(output).expand().abspath()
+ cmd = 'python3 {0} {1} {2}'.format(script, ' '.join(input), output)
+ event_handler = RunScriptChangeHandler(cmd)
+ event_handler.run() # run always once
+ observer = Observer()
+ path = script.dirname().expand().abspath()
+ click.secho('watch: {0}'.format(path), fg='blue')
+ observer.schedule(event_handler, path, recursive=True)
+ for entry in input:
+ entry = entry.dirname().expand().abspath()
+ click.secho('watch: {0}'.format(entry), fg='blue')
+ observer.schedule(event_handler, entry, recursive=True)
+ path = Path(__file__).parent / 'qface'
+ click.secho('watch: {0}'.format(path), fg='blue')
+ observer.schedule(event_handler, path, recursive=True)
+ observer.start()
+
+ try:
+ while True:
+ time.sleep(1)
+ except KeyboardInterrupt:
+ observer.stop()
+ observer.join()
+
+
+@click.option('--editable/--no-editable', default=False, help='install editable package')
+@cli.command()
+def install(editable):
+ """install the script onto the system using pip3"""
+ script_dir = str(Path(__file__).parent.abspath())
+ click.secho(script_dir, fg='blue')
+ if editable:
+ sh('pip3 install --editable {0} --upgrade'.format(script_dir))
+ else:
+ sh('pip3 install {0} --upgrade'.format(script_dir))
+
+
+@cli.command()
+def uninstall():
+ """uninstall the script from the system using pip3"""
+ sh('pip3 uninstall qface')
+
+
+@cli.command()
+def upload():
+ dist = Path('dist')
+ dist.rmdir_p()
+ sh('python3 setup.py bdist_wheel')
+ sh('twine upload dist/*')
+
+
+if __name__ == '__main__':
+ cli()