Beremiz_cli.py
branchwxPython4
changeset 3501 fa291393aac7
child 3548 da7b461f54b7
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Beremiz_cli.py	Mon Jun 13 18:05:12 2022 +0200
@@ -0,0 +1,112 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+import os
+import posixpath
+import sys
+from functools import wraps
+
+import click
+from importlib import import_module
+
+
+class CLISession(object):
+    def __init__(self, **kwargs):
+        self.__dict__.update(kwargs)
+        self.controller = None
+
+pass_session = click.make_pass_decorator(CLISession)
+
+
+@click.group(chain=True)
+@click.option(
+    "--project-home",
+    envvar="PROJECT_HOME",
+    default=".",
+    metavar="PATH",
+    help="Changes the project folder location.",
+)
+@click.option(
+    "--config",
+    nargs=2,
+    multiple=True,
+    metavar="KEY VALUE",
+    help="Overrides a config key/value pair.",
+)
+@click.option(
+    "--keep", "-k", is_flag=True,
+    help="Keep local runtime, do not kill it after executing commands.",
+)
+@click.option("--verbose", "-v", is_flag=True, help="Enables verbose mode.")
+@click.option(
+    "--buildpath", "-b", help="Where to store files created during build."
+)
+@click.option(
+    "--uri", "-u", help="URI to reach remote PLC."
+)
+@click.version_option("0.1")
+@click.pass_context
+def cli(ctx, **kwargs):
+    """Beremiz CLI manipulates beremiz projects and runtimes. """
+
+    ctx.obj = CLISession(**kwargs)
+
+def ensure_controller(func):
+    @wraps(func)
+    def func_wrapper(session, *args, **kwargs):
+        if session.controller is None:
+            session.controller = import_module("CLIController").CLIController(session)
+        ret = func(session, *args, **kwargs)
+        return ret
+
+    return func_wrapper
+
+@cli.command()
+@click.option(
+    "--target", "-t", help="Target system triplet."
+)
+@pass_session
+@ensure_controller
+def build(session, target):
+    """Builds project. """
+    def processor():
+        return session.controller.build_project(target)
+    return processor
+
+@cli.command()
+@pass_session
+@ensure_controller
+def transfer(session):
+    """Transfer program to PLC runtim."""
+    def processor():
+        return session.controller.transfer_project()
+    return processor
+
+@cli.command()
+@pass_session
+@ensure_controller
+def run(session):
+    """Run program already present in PLC. """
+    def processor():
+        return session.controller.run_project()
+    return processor
+
+
+@cli.resultcallback()
+@pass_session
+def process_pipeline(session, processors, **kwargs):
+    ret = 0
+    for processor in processors:
+        ret = processor()
+        if ret != 0:
+            if len(processors) > 1 :
+                click.echo("Command sequence aborted")
+            break
+
+    session.controller.finish()
+
+    return ret
+
+if __name__ == '__main__':
+    cli()
+