diff venv/lib/python2.7/site-packages/planemo/cli.py @ 0:d67268158946 draft

planemo upload commit a3f181f5f126803c654b3a66dd4e83a48f7e203b
author bcclaywell
date Mon, 12 Oct 2015 17:43:33 -0400
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/venv/lib/python2.7/site-packages/planemo/cli.py	Mon Oct 12 17:43:33 2015 -0400
@@ -0,0 +1,121 @@
+import os
+import sys
+
+import click
+
+# Hack to place Galaxy modules on PYTHONPATH - without
+# actually having them on the real external PYTHONPATH.
+import planemo_ext
+planemo_ext_path = planemo_ext.__path__[0]
+sys.path.append(os.path.join(planemo_ext_path))
+
+from .io import error  # noqa, import must happen after Galaxy hack
+from .config import read_global_config  # noqa, ditto
+from planemo import __version__  # noqa, ditto
+
+
+CONTEXT_SETTINGS = dict(auto_envvar_prefix='PLANEMO')
+COMMAND_ALIASES = {
+    "l": "lint",
+    "t": "test",
+    "s": "serve",
+}
+
+
+class Context(object):
+
+    def __init__(self):
+        self.home = os.getcwd()
+        self._global_config = None
+        # Will be set by planemo CLI driver
+        self.verbose = False
+        self.planemo_config = None
+        self.planemo_directory = None
+
+    @property
+    def global_config(self):
+        if self._global_config is None:
+            self._global_config = read_global_config(self.planemo_config)
+        return self._global_config
+
+    def log(self, msg, *args):
+        """Logs a message to stderr."""
+        if args:
+            msg %= args
+        click.echo(msg, file=sys.stderr)
+
+    def vlog(self, msg, *args):
+        """Logs a message to stderr only if verbose is enabled."""
+        if self.verbose:
+            self.log(msg, *args)
+
+    @property
+    def workspace(self):
+        if not self.planemo_directory:
+            raise Exception("No planemo workspace defined.")
+        workspace = self.planemo_directory
+        if not os.path.exists(workspace):
+            os.makedirs(workspace)
+        if not os.path.isdir(workspace):
+            template = "Planemo workspace directory [%s] unavailable."
+            message = template % workspace
+            raise Exception(message)
+        return workspace
+
+
+pass_context = click.make_pass_decorator(Context, ensure=True)
+cmd_folder = os.path.abspath(os.path.join(os.path.dirname(__file__),
+                                          'commands'))
+
+
+def list_cmds():
+    rv = []
+    for filename in os.listdir(cmd_folder):
+        if filename.endswith('.py') and \
+           filename.startswith('cmd_'):
+            rv.append(filename[len("cmd_"):-len(".py")])
+    rv.sort()
+    return rv
+
+
+def name_to_command(name):
+    try:
+        if sys.version_info[0] == 2:
+            name = name.encode('ascii', 'replace')
+        mod_name = 'planemo.commands.cmd_' + name
+        mod = __import__(mod_name, None, None, ['cli'])
+    except ImportError as e:
+        error("Problem loading command %s, exception %s" % (name, e))
+        return
+    return mod.cli
+
+
+class PlanemoCLI(click.MultiCommand):
+
+    def list_commands(self, ctx):
+        return list_cmds()
+
+    def get_command(self, ctx, name):
+        if name in COMMAND_ALIASES:
+            name = COMMAND_ALIASES[name]
+        return name_to_command(name)
+
+
+@click.command(cls=PlanemoCLI, context_settings=CONTEXT_SETTINGS)
+@click.version_option(__version__)
+@click.option('-v', '--verbose', is_flag=True,
+              help='Enables verbose mode.')
+@click.option('--config',
+              default="~/.planemo.yml",
+              envvar="PLANEMO_GLOBAL_CONFIG_PATH",
+              help="Planemo configuration YAML file.")
+@click.option('--directory',
+              default="~/.planemo",
+              envvar="PLANEMO_GLOBAL_WORKSPACE",
+              help="Workspace for planemo.")
+@pass_context
+def planemo(ctx, config, directory, verbose):
+    """Utilities to assist with the development of Galaxy tools."""
+    ctx.verbose = verbose
+    ctx.planemo_config = os.path.expanduser(config)
+    ctx.planemo_directory = os.path.expanduser(directory)