Source code for materials_commons.cli.print_formatter
def _trunc(s, size=40):
    _s = str(s)
    if len(_s) > size:
        _s = _s[:size-3] + '...'
    return _s
def _trunc_name(obj, size=40):
    _name = obj.name
    if len(_name) > size:
        _name = _name[:size-3] + '...'
    return _name
def _trunc_desc(obj, size=100):
    _desc = obj.description
    if len(_desc) > size:
        _desc = _desc[:size-3] + '...'
    return _desc
[docs]
class PrintFormatter(object):
    """Print dict-like records, nicely
    tabulate works nicely when you have all the records ahead of time, PrintFormatter lets you print without having all the records ahead of time.
    Arguments:
        fmt: List of tuples
            Specify how to format records via: (key, header, alignment, size, function)
                key: str, key being described
                header: str, header string
                alignment: str, string.format alignment option
                size: int, column size
                function: function, function that acts on record[key], or None if key is not in record, to determine what is printed.
    """
    def __init__(self, fmt, sep=" ", end="\n", truncate=True):
        self.fmt = fmt
        self.sep = sep
        self.end = end
        self.truncate = truncate
        self.fmtstr = ""
        for fmt_tuple in fmt:
            key = fmt_tuple[0]
            alignment = fmt_tuple[2]
            size = fmt_tuple[3]
            if self.truncate:
                self.fmtstr += "{" + key + ":" + alignment + str(size) + "}" + self.sep
            else:
                self.fmtstr += "{" + key + "}" + self.sep
        self.header_line = self.fmtstr.format(**{fmt_tuple[0]:fmt_tuple[1] for fmt_tuple in fmt})
        if self.truncate:
            self.header_sep = ""
            for fmt_tuple in fmt:
                size = fmt_tuple[3]
                self.header_sep += "-"*fmt_tuple[3] + self.sep
        def _if_key_in_record(key, record):
            return (key in record)
        def _get_key_from_record(key, record):
            return record[key]
        self.if_key_in_record = _if_key_in_record
        self.get_key_from_record = _get_key_from_record
        self.value_if_key_not_in_record = "-"
[docs]
    def print_header(self):
        print(self.header_line, end=self.end)
        if self.truncate:
            print(self.header_sep, end=self.end)
    def _record_to_data(self, record):
        data = {}
        for fmt_tuple in self.fmt:
            key = fmt_tuple[0]
            size = fmt_tuple[3]
            f = fmt_tuple[4]
            value = None
            if self.if_key_in_record(key, record):
                value = self.get_key_from_record(key, record)
            if value is None and self.truncate:
                value = self.value_if_key_not_in_record
            else:
                if self.truncate:
                    value = trunc(f(value), size)
                else:
                    value = f(value)
            data[key] = value
        return data
[docs]
    def print(self, record):
        print(self.fmtstr.format(**self._record_to_data(record)), end=self.end)
[docs]
    def print_detail(self, title_key, record):
        data = self._record_to_data(record)
        print(str(data[title_key]) + ":")
        for fmt_tuple in self.fmt:
            key = fmt_tuple[0]
            print(key + ": '" + str(data[key]) + "'")
        print()