csdms

Source code for wmtexe.cmd.quickstart

"""Configure a wmt-exe environment from the command prompt."""

import os
from distutils.spawn import find_executable

from .. import formatting
from ..config import _DEFAULTS


[docs]class Prompter(object): def __init__(self, prefix='> ', defaults=None, interactive=True): self._prefix = prefix.strip() + ' ' self._vals = defaults or dict() self._interactive = interactive @property def vals(self): return self._vals
[docs] def get(self, key, text, default=None): try: default = default or self._vals[key] except KeyError: pass self._vals[key] = self._get_non_empty_input(text, default=default)
def _get_non_empty_input(self, text, default=None): if self._interactive: while True: val = raw_input(self.render_prompt(text, default=default)) if default and not val: val = default break else: val = default or '?' return val
[docs] def list(self, key, text, default=None): vals = [] while True: val = raw_input(self.render_prompt(text, default=default)) if default and not val: val = default if len(val.strip()) > 0: vals.append(val) else: break self._vals[key] = vals
[docs] def render_prompt(self, text, default=None): prompt = self._prefix + '%s' % text if default: prompt += ' [%s]' % default prompt += ': ' return formatting.dim(formatting.lightgreen(prompt))
[docs]def dict_to_ini(d, section): from ConfigParser import ConfigParser from StringIO import StringIO config = ConfigParser() config.add_section(section) for (key, value) in d.items(): config.set(section, key, value) output = StringIO() config.write(output) contents = output.getvalue() output.close() return contents.strip()
[docs]def prompt_for_paths(**kwds): defaults = dict(_DEFAULTS) prompt = Prompter('>>>', defaults=dict(defaults['paths']), interactive=kwds.get('interactive', False)) prompt.get('bash', 'path to bash') prompt.get('tail', 'path to tail') prompt.get('curl', 'path to curl') prompt.get('python', 'path to python') prompt.get('babel_config', 'path to babel-config') prompt.get('cca_spec_babel_config', 'path to cca-spec-babel-config') return prompt.vals
[docs]def prompt_for_launcher(**kwds): prompt = Prompter('>>>', **kwds) prompt.get('launcher', 'wmt-exe launcher', default='bash-launcher') if prompt.vals['launcher'] not in ['bash-launcher', 'qsub-launcher']: raise RuntimeError('%s: unknown launcher' % prompt.vals['launcher']) return prompt.vals
[docs]def prompt_for_bash_launcher(**kwds): prompt = Prompter('>>>', **kwds) prompt.get('bash', 'path to bash', default=find_executable('bash') or 'bash') return prompt.vals
[docs]def prompt_for_qsub_launcher(**kwds): prompt = Prompter('>>>', **kwds) prompt.get('qsub', 'path to qsub', default=find_executable('qsub') or 'qsub') return prompt.vals
[docs]def main(): import argparse parser = argparse.ArgumentParser(description=__doc__) parser.add_argument('--batch', action='store_true', default=False, help='run in batch mode') args = parser.parse_args() kwds = dict(interactive=not args.batch) sections = [] paths = prompt_for_paths(**kwds) launcher = prompt_for_launcher(**kwds) sections.append(dict_to_ini(paths, 'paths')) sections.append(dict_to_ini(launcher, 'launcher')) if launcher['launcher'] == 'bash-launcher': bash_launcher = prompt_for_bash_launcher(**kwds) sections.append(dict_to_ini(bash_launcher, 'bash-launcher')) elif launcher['launcher'] == 'qsub-launcher': qsub_launcher = prompt_for_qsub_launcher(**kwds) sections.append(dict_to_ini(qsub_launcher, 'qsub-launcher')) print (os.linesep * 2).join(sections)