Skip to content

Instantly share code, notes, and snippets.

@Bahus
Created April 18, 2016 19:06
Show Gist options
  • Save Bahus/949160fbf539c2a4fa76f8cb52efb2a2 to your computer and use it in GitHub Desktop.
Save Bahus/949160fbf539c2a4fa76f8cb52efb2a2 to your computer and use it in GitHub Desktop.
# -*- coding: utf-8 -*-
from ansible.callbacks import display
from pprint import pformat
class FilterModule(object):
def filters(self):
return {
'shell_printer': self.shell_printer,
'show': self.show,
'as_method_params': self.as_method_params,
'pformat': self.pformat,
}
@staticmethod
def shell_printer(shell_result, *args, **kwargs):
""" Красиво выводит результаты исполнения плагина shell или command """
results = shell_result.get('results', [shell_result])
show_stderr = kwargs.get('show_stderr')
ret = []
for n, r in enumerate(results, 1):
cmd = r.get('cmd', ['SKIPPED'])
def caption(text):
display('{}. {}'.format(n, text), color='bright gray')
caption('COMMAND:')
display(' '.join(cmd), color='yellow')
if 'stdout' in r:
stdout = r['stdout']
if stdout:
caption('STDOUT:')
display(r['stdout'], color='green')
else:
caption('STDOUT: <empty>')
if show_stderr and 'stderr' in r:
stderr = r['stderr']
if stderr:
caption('STDERR:')
display(r['stderr'], color='red')
else:
caption('STDERR: <empty>')
status = 'SUCCESS'
if r.get('skipped'):
status = 'SKIPPED'
elif r['rc'] != 0:
status = 'FAILURE'
ret.append(status)
print
return '"' + ', '.join(ret) + '"'
@staticmethod
def show(var, *args, **kwargs):
print 'Variable: %r' % var
return None
@staticmethod
def as_method_params(var_dict, *args, **kwargs):
sort = kwargs.get('sort', True)
sort_func = sorted if sort else lambda x: x
return ', '.join(('='.join([k, repr(var_dict[k])]) for k in sort_func(var_dict)))
@staticmethod
def pformat(var, *args, **kwargs):
if 'indent' not in kwargs:
kwargs['indent'] = 0
return Formatter()(var, **kwargs)
class Formatter(object):
"""
taken from: http://stackoverflow.com/a/26209900
"""
def __init__(self, indent=0):
self.types = {}
self.htchar = ' '
self.lfchar = '\n'
self.indent = indent
self.sort_func = sorted
self.set_formater(object, self.format_object)
self.set_formater(dict, self.format_dict)
self.set_formater(list, self.format_list)
self.set_formater(tuple, self.format_tuple)
self.set_formater(str, self.format_str)
self.set_formater(unicode, self.format_str)
def set_formater(self, obj, callback):
self.types[obj] = callback
def get_formatter(self, obj):
return self.types[type(obj) if type(obj) in self.types else object]
def __call__(self, value, **args):
for key in args:
setattr(self, key, args[key])
formater = self.get_formatter(value)
return formater(value, self.indent)
def format_str(self, value, indent):
if isinstance(value, str):
return repr(value)
return u"u'{}'".format(value)
def format_object(self, value, indent):
return repr(value)
def format_dict(self, value, indent):
items = [
self.lfchar + self.htchar * (indent + 1) + repr(key) + ': ' +
self.get_formatter(value[key])(value[key], indent + 1)
for key in self.sort_func(value)
]
return '{%s}' % (','.join(items) + self.lfchar + self.htchar * indent)
def format_list(self, value, indent):
items = [
self.lfchar + self.htchar * (indent + 1) +
self.get_formatter(item)(item, indent + 1)
for item in value
]
return '[%s]' % (','.join(items) + self.lfchar + self.htchar * indent)
def format_tuple(self, value, indent):
items = [
self.lfchar + self.htchar * (indent + 1) +
self.get_formatter(item)(item, indent + 1)
for item in value
]
return '(%s)' % (','.join(items) + self.lfchar + self.htchar * indent)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment