summaryrefslogtreecommitdiff
path: root/gitlab/v4/cli.py
diff options
context:
space:
mode:
Diffstat (limited to 'gitlab/v4/cli.py')
-rw-r--r--gitlab/v4/cli.py59
1 files changed, 45 insertions, 14 deletions
diff --git a/gitlab/v4/cli.py b/gitlab/v4/cli.py
index 821a27d..ca5c6b1 100644
--- a/gitlab/v4/cli.py
+++ b/gitlab/v4/cli.py
@@ -245,30 +245,47 @@ def extend_parser(parser):
return parser
+class JSONPrinter(object):
+ def display(self, d, **kwargs):
+ import json # noqa
+
+ print(json.dumps(d))
+
+
+class YAMLPrinter(object):
+ def display(self, d, **kwargs):
+ import yaml # noqa
+
+ print(yaml.safe_dump(d, default_flow_style=False))
+
+
class LegacyPrinter(object):
- def display(self, obj, verbose=False, padding=0):
- def display_dict(d):
+ def display(self, d, **kwargs):
+ verbose = kwargs.get('verbose', False)
+ padding = kwargs.get('padding', 0)
+ obj = kwargs.get('obj')
+
+ def display_dict(d, padding):
for k in sorted(d.keys()):
v = d[k]
if isinstance(v, dict):
print('%s%s:' % (' ' * padding, k))
new_padding = padding + 2
- self.display(v, True, new_padding)
+ self.display(v, verbose=True, padding=new_padding, obj=v)
continue
print('%s%s: %s' % (' ' * padding, k, v))
if verbose:
if isinstance(obj, dict):
- display_dict(obj)
+ display_dict(obj, padding)
return
# not a dict, we assume it's a RESTObject
- id = getattr(obj, obj._id_attr)
+ id = getattr(obj, obj._id_attr, None)
print('%s: %s' % (obj._id_attr, id))
attrs = obj.attributes
attrs.pop(obj._id_attr)
- display_dict(attrs)
- print('')
+ display_dict(attrs, padding)
else:
id = getattr(obj, obj._id_attr)
@@ -278,19 +295,33 @@ class LegacyPrinter(object):
print('%s: %s' % (obj._short_print_attr, value))
-def run(gl, what, action, args, verbose):
+PRINTERS = {
+ 'json': JSONPrinter,
+ 'legacy': LegacyPrinter,
+ 'yaml': YAMLPrinter,
+}
+
+
+def run(gl, what, action, args, verbose, output, fields):
g_cli = GitlabCLI(gl, what, action, args)
ret_val = g_cli()
- printer = LegacyPrinter()
+ printer = PRINTERS[output]()
+
+ def get_dict(obj):
+ if fields:
+ return {k: v for k, v in obj.attributes.items()
+ if k in fields}
+ return obj.attributes
if isinstance(ret_val, list):
- for o in ret_val:
- if isinstance(o, gitlab.base.RESTObject):
- printer.display(o, verbose)
+ for obj in ret_val:
+ if isinstance(obj, gitlab.base.RESTObject):
+ printer.display(get_dict(obj), verbose=verbose, obj=obj)
else:
- print(o)
+ print(obj)
+ print('')
elif isinstance(ret_val, gitlab.base.RESTObject):
- printer.display(ret_val, verbose)
+ printer.display(get_dict(ret_val), verbose=verbose, obj=ret_val)
elif isinstance(ret_val, six.string_types):
print(ret_val)