From 957366cd72daf0ca5ffe8d53ce87063ffc9f9b33 Mon Sep 17 00:00:00 2001 From: Alexander Sulfrian Date: Wed, 5 Jun 2013 03:29:48 +0200 Subject: Printer: add force argument to force to print at least an empty entry If you execute a search with negative matching the result could contain hosts without the field. Under normal circumstances the entry is not printed, because the filter_key does not exists. To get all the matching entries an new force mode is added to print at lease an empty entry. --- bin/hostinfo | 6 ++++-- hostinfo/printer.py | 15 ++++++++++----- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/bin/hostinfo b/bin/hostinfo index 4a48e2b..0a36f67 100755 --- a/bin/hostinfo +++ b/bin/hostinfo @@ -97,12 +97,14 @@ def print_search(basepath, flags, search, filter_key=None): p = printer.Printer(data, flags) if filter_key is not None or flags.details: - p.info(filter_key, label=_get_label(host), maxlength=max(length)) + p.info(filter_key, label=_get_label(host), + maxlength=max(length), force=True) else: if key is None: print(_get_label(host)) else: - p.info(key, label=_get_label(host), maxlength=max(length)) + p.info(key, label=_get_label(host), + maxlength=max(length), force=True) def print_info(path, flags, key=None): data = _get_data(path) diff --git a/hostinfo/printer.py b/hostinfo/printer.py index 4302e04..d635d0a 100644 --- a/hostinfo/printer.py +++ b/hostinfo/printer.py @@ -82,14 +82,14 @@ class Printer: return (lambda key: self._should_display(_get_full_key(prev_key, key), filter_key)) - def _print(self, value, printer, filter_key=None, sort=None): + def _print(self, value, printer, filter_key=None, sort=None, force=False): try: value = value.strip().splitlines() except AttributeError: pass if isinstance(value, dict): - self._print_dict(value, printer, filter_key, sort) + self._print_dict(value, printer, filter_key, sort, force) elif isinstance(value, list): self._print_list(value, printer, filter_key) elif value is None: @@ -126,7 +126,7 @@ class Printer: else: self._print(value, printer, filter_key) - def _print_dict(self, value, printer, filter_key, sort): + def _print_dict(self, value, printer, filter_key, sort, force): keys = _sort_with_list( [(key, full_key) for key in value.keys() for full_key in [_get_full_key(printer.full_key, key)] @@ -140,6 +140,7 @@ class Printer: _space(filter_key, printer.full_key, printer, True) + found = False for (key, full_key) in keys: new_filter_key = None if filter_key is not None: @@ -148,6 +149,7 @@ class Printer: elif full_key != filter_key: continue + found = True new_printer = prefix.Printer(full_key, printer) if filter_key is None: new_printer.set_label(self._get_label(key, full_key), maxlength) @@ -155,15 +157,18 @@ class Printer: self._print_key(full_key, value[key], new_printer, new_filter_key) _space(filter_key, printer.full_key, new_printer) + if force and not found: + printer.pprint('') + def _get_label(self, key, full_key): if full_key in self.labels: return self.labels[full_key] return key - def info(self, key, label=None, maxlength=0): + def info(self, key, label=None, maxlength=0, force=False): printer = prefix.Printer() if label is not None: printer.set_label(label, maxlength) - self._print(self.data, printer, filter_key=key, + self._print(self.data, printer, filter_key=key, force=force, sort=['hostname', 'arch', 'os', 'addresses', 'ports']) -- cgit v1.2.3-1-g7c22