Mercurial > repos > bcclaywell > argo_navis
comparison 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 |
comparison
equal
deleted
inserted
replaced
| -1:000000000000 | 0:d67268158946 |
|---|---|
| 1 import os | |
| 2 import sys | |
| 3 | |
| 4 import click | |
| 5 | |
| 6 # Hack to place Galaxy modules on PYTHONPATH - without | |
| 7 # actually having them on the real external PYTHONPATH. | |
| 8 import planemo_ext | |
| 9 planemo_ext_path = planemo_ext.__path__[0] | |
| 10 sys.path.append(os.path.join(planemo_ext_path)) | |
| 11 | |
| 12 from .io import error # noqa, import must happen after Galaxy hack | |
| 13 from .config import read_global_config # noqa, ditto | |
| 14 from planemo import __version__ # noqa, ditto | |
| 15 | |
| 16 | |
| 17 CONTEXT_SETTINGS = dict(auto_envvar_prefix='PLANEMO') | |
| 18 COMMAND_ALIASES = { | |
| 19 "l": "lint", | |
| 20 "t": "test", | |
| 21 "s": "serve", | |
| 22 } | |
| 23 | |
| 24 | |
| 25 class Context(object): | |
| 26 | |
| 27 def __init__(self): | |
| 28 self.home = os.getcwd() | |
| 29 self._global_config = None | |
| 30 # Will be set by planemo CLI driver | |
| 31 self.verbose = False | |
| 32 self.planemo_config = None | |
| 33 self.planemo_directory = None | |
| 34 | |
| 35 @property | |
| 36 def global_config(self): | |
| 37 if self._global_config is None: | |
| 38 self._global_config = read_global_config(self.planemo_config) | |
| 39 return self._global_config | |
| 40 | |
| 41 def log(self, msg, *args): | |
| 42 """Logs a message to stderr.""" | |
| 43 if args: | |
| 44 msg %= args | |
| 45 click.echo(msg, file=sys.stderr) | |
| 46 | |
| 47 def vlog(self, msg, *args): | |
| 48 """Logs a message to stderr only if verbose is enabled.""" | |
| 49 if self.verbose: | |
| 50 self.log(msg, *args) | |
| 51 | |
| 52 @property | |
| 53 def workspace(self): | |
| 54 if not self.planemo_directory: | |
| 55 raise Exception("No planemo workspace defined.") | |
| 56 workspace = self.planemo_directory | |
| 57 if not os.path.exists(workspace): | |
| 58 os.makedirs(workspace) | |
| 59 if not os.path.isdir(workspace): | |
| 60 template = "Planemo workspace directory [%s] unavailable." | |
| 61 message = template % workspace | |
| 62 raise Exception(message) | |
| 63 return workspace | |
| 64 | |
| 65 | |
| 66 pass_context = click.make_pass_decorator(Context, ensure=True) | |
| 67 cmd_folder = os.path.abspath(os.path.join(os.path.dirname(__file__), | |
| 68 'commands')) | |
| 69 | |
| 70 | |
| 71 def list_cmds(): | |
| 72 rv = [] | |
| 73 for filename in os.listdir(cmd_folder): | |
| 74 if filename.endswith('.py') and \ | |
| 75 filename.startswith('cmd_'): | |
| 76 rv.append(filename[len("cmd_"):-len(".py")]) | |
| 77 rv.sort() | |
| 78 return rv | |
| 79 | |
| 80 | |
| 81 def name_to_command(name): | |
| 82 try: | |
| 83 if sys.version_info[0] == 2: | |
| 84 name = name.encode('ascii', 'replace') | |
| 85 mod_name = 'planemo.commands.cmd_' + name | |
| 86 mod = __import__(mod_name, None, None, ['cli']) | |
| 87 except ImportError as e: | |
| 88 error("Problem loading command %s, exception %s" % (name, e)) | |
| 89 return | |
| 90 return mod.cli | |
| 91 | |
| 92 | |
| 93 class PlanemoCLI(click.MultiCommand): | |
| 94 | |
| 95 def list_commands(self, ctx): | |
| 96 return list_cmds() | |
| 97 | |
| 98 def get_command(self, ctx, name): | |
| 99 if name in COMMAND_ALIASES: | |
| 100 name = COMMAND_ALIASES[name] | |
| 101 return name_to_command(name) | |
| 102 | |
| 103 | |
| 104 @click.command(cls=PlanemoCLI, context_settings=CONTEXT_SETTINGS) | |
| 105 @click.version_option(__version__) | |
| 106 @click.option('-v', '--verbose', is_flag=True, | |
| 107 help='Enables verbose mode.') | |
| 108 @click.option('--config', | |
| 109 default="~/.planemo.yml", | |
| 110 envvar="PLANEMO_GLOBAL_CONFIG_PATH", | |
| 111 help="Planemo configuration YAML file.") | |
| 112 @click.option('--directory', | |
| 113 default="~/.planemo", | |
| 114 envvar="PLANEMO_GLOBAL_WORKSPACE", | |
| 115 help="Workspace for planemo.") | |
| 116 @pass_context | |
| 117 def planemo(ctx, config, directory, verbose): | |
| 118 """Utilities to assist with the development of Galaxy tools.""" | |
| 119 ctx.verbose = verbose | |
| 120 ctx.planemo_config = os.path.expanduser(config) | |
| 121 ctx.planemo_directory = os.path.expanduser(directory) |
