diff options
author | Jan Pokorný <jpokorny@redhat.com> | 2014-12-11 21:07:04 +0100 |
---|---|---|
committer | Jan Pokorný <jpokorny@redhat.com> | 2014-12-11 22:41:15 +0100 |
commit | bd2d29585cc1fe676c1076a3c33d8829bdaca8f0 (patch) | |
tree | 004880686d3a19e4560e2a9ceb020db6296725b4 | |
parent | fd4e0b44b69f3c35464461e135cf1586f7d6adfa (diff) | |
download | clufter-bd2d29585cc1fe676c1076a3c33d8829bdaca8f0.tar.gz clufter-bd2d29585cc1fe676c1076a3c33d8829bdaca8f0.tar.xz clufter-bd2d29585cc1fe676c1076a3c33d8829bdaca8f0.zip |
Integrate FancyOutput helper class
Signed-off-by: Jan Pokorný <jpokorny@redhat.com>
-rw-r--r-- | command.py | 37 | ||||
-rw-r--r-- | commands/ccs2pcs.py | 13 | ||||
-rw-r--r-- | filter.py | 25 | ||||
-rw-r--r-- | main.py | 11 |
4 files changed, 58 insertions, 28 deletions
@@ -35,7 +35,8 @@ from .utils_func import apply_aggregation_preserving_depth, \ bifilter, \ tailshake, \ zip_empty -from .utils_prog import cli_decor, \ +from .utils_prog import FancyOutput, \ + cli_decor, \ longopt_letters_reprio, \ defer_common @@ -451,12 +452,16 @@ class Command(object): ) ret(SimpleFormat.FILE, fn) except FormatError: - print >>stderr, "[{0:{1}}] dumping failed".format( - flt.__class__.name, maxl + cmd_ctxt['svc_output']( + "|header:[{0:{1}}]| dumping failed" + .format(flt.__class__.name, maxl), + base='error', + urgent=True ) else: - print >>stderr, "[{0:{1}}] dump file: {2}".format( - flt.__class__.name, maxl, fn + cmd_ctxt['svc_output']( + "|header:[{0:{1}}]| dump file: |highlight:{2}|" + .format(flt.__class__.name, maxl, fn) ) continue # output time! (INFILTER terminal listed twice in io_chain) @@ -467,11 +472,11 @@ class Command(object): .format(flt.__class__.name, io_decl)) # store output somewhere, which even can be useful (use as a lib) passout['passout'] = flt_ctxt['out'](*io_decl) - if not cmd_ctxt['quiet'] and passout is unused: - if io_decl[0] == SimpleFormat.FILE: - print >>stderr, "[{0:{1}}] output file: {2}".format( - flt.__class__.name, maxl, passout['passout'] - ) + if passout is unused and io_decl[0] == SimpleFormat.FILE: + cmd_ctxt['svc_output']( + "|header:[{0:{1}}]| output file: |highlight:{2}|" + .format(flt.__class__.name, maxl, passout['passout']) + ) map(lambda f: f.close(), magic_fds.itervalues()) # close "magic" fds return EC.EXIT_SUCCESS # XXX some better decision? @@ -522,7 +527,17 @@ class Command(object): 'filter_dump': getattr(opts, 'dump', ()), 'system': getattr(opts, 'sys', ''), 'system_extra': getattr(opts, 'dist', '').split(','), - 'quiet': getattr(opts, 'quiet', False), + 'svc_output': FancyOutput(f=stderr, + quiet=getattr(opts, 'quiet', + False), + color=dict(auto=None, + never=False, + always=True)[ + getattr(opts, + 'color', + 'auto') + ] + ), }, bypass=True) cmd_ctxt.ensure_filters(apply_intercalate(self._filter_chain)) io_driver = any2iter(self._fnc(cmd_ctxt, **kwargs)) diff --git a/commands/ccs2pcs.py b/commands/ccs2pcs.py index bd71d7e..2025329 100644 --- a/commands/ccs2pcs.py +++ b/commands/ccs2pcs.py @@ -16,10 +16,15 @@ def _check_pacemaker_1_2(cmd_ctxt): system_extra = cmd_ctxt.get('system_extra', 'UNKNOWN-DISTRO') if not cluster_pcs_1_2(system, system_extra): from sys import stderr - print >>stderr, ("Resulting configuration will likely not be applicable" - " to ``{0}'' system as it seems so outdated as far as" - " Pacemaker not supporting validation schema v1.2" - ).format(': '.join((system, system_extra))) + svc_output = cmd_ctxt.get('svc_output', + lambda s, **kwargs: stderr.write(s + '\n')) + svc_output("Resulting configuration will likely not be applicable to" + " ``{0}'' system as it seems so outdated as far as Pacemaker" + " not supporting validation schema v1.2" + .format(': '.join((system, system_extra))), + base="error", + urgent=True, + ) @Command.deco(('ccs2ccsflat', @@ -458,7 +458,7 @@ class XMLFilter(Filter, MetaPlugin): return ret, global_msgs return validate_hook - def _xslt_get_atom_hook(self, quiet=False, validator_specs={}, **kws): + def _xslt_get_atom_hook(self, validator_specs={}, **kws): validate_hook = None if issubclass(self._out_format, XML): # only when out format is XML-based, we can be quite sure the @@ -471,20 +471,21 @@ class XMLFilter(Filter, MetaPlugin): if validator: validate_hook = self._xslt_get_validate_hook(validator, **kws) return (lambda ret, error_log=(): - self._xslt_atom_hook(ret, error_log, quiet, validate_hook, - **kws)) + self._xslt_atom_hook(ret, error_log, validate_hook, **kws)) @classmethod - def _xslt_atom_hook(cls, ret, error_log, quiet=False, validate_hook=None, - **kws): + def _xslt_atom_hook(cls, ret, error_log, validate_hook=None, **kws): fatal = [] maxl = kws.get('maxl', 1) + svc_output = kws.get('svc_output', + lambda s, **kwargs: stderr.write(s + '\n')) for entry in error_log: - msg = "[{0:{1}}] XSLT: {2}".format(cls.name, maxl, entry.message) - if entry.type != 0 or not quiet: # avoid logging (suppression) - print >>stderr, msg - if entry.type != 0: - fatal.append("XSLT: " + entry.message) + msg = ("|header:[{0:{1}}]| |subheader:XSLT|: {2}" + .format(cls.name, maxl, entry.message)) + svc_output(msg, urgent=entry.type != 0, + base=entry.message.startswith('WARNING:') and 'warning') + if entry.type != 0: + fatal.append("XSLT: " + entry.message) if not fatal and validate_hook: ret, entries = validate_hook(ret) fatal.extend("RNG: " + ':'.join(args2tuple(str(e[0]), str(e[1]), @@ -873,7 +874,7 @@ class XMLFilter(Filter, MetaPlugin): def_first += '<clufter:descent-mix preserve-rest="true"/>' xslt_atom_hook = self._xslt_get_atom_hook(**filterdict_pop(kwargs, - 'editor', 'interactive', 'maxl', 'quiet', 'validator_specs' + 'editor', 'interactive', 'maxl', 'svc_output', 'validator_specs' )) kwargs.setdefault('walk_default_first', def_first) @@ -894,7 +895,7 @@ class XMLFilter(Filter, MetaPlugin): """The same as `filter_proceed_xslt`, context-aware""" kwargs = filterdict_keep(ctxt, 'raw', 'system', 'system_extra', # <- proceed_xslt / atom_hook -v - 'editor', 'interactive', 'maxl', 'quiet', 'validator_specs', + 'editor', 'interactive', 'maxl', 'svc_output', 'validator_specs', **kwargs ) return self.filter_proceed_xslt(in_obj, **kwargs) @@ -43,11 +43,20 @@ opts_common = ( action='store_true', help="refrain from unnecesary messages (usually on stderr)" )), + (('--color', ), dict( + metavar="[WHEN]", + action='store', + dest='color', + default='auto', + type='choice', + choices=('auto', 'never', 'always'), + help="colorize messages if available [%default out of %choices]" + )), (('--loglevel', ), dict( action='store', dest='loglevel', default=logging.getLevelName(logging.WARNING), - type="choice", + type='choice', choices=map(logging.getLevelName, xrange(logging.NOTSET, logging.CRITICAL + 1, logging.DEBUG - logging.NOTSET)), |