Created
April 18, 2016 19:06
-
-
Save Bahus/949160fbf539c2a4fa76f8cb52efb2a2 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# -*- 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) | |
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