Source code for pyos.psh_lib.representers
# -*- coding: utf-8 -*-
"""Module for representers which are used to convert objects into strings"""
import functools
import io
import pprint
from typing import Sequence
import mincepy
try:
import pyprnt
except ImportError:
pass
from pyos import utils as putils
from pyos import fmt
__all__ = 'get_default', 'set_default', 'dict_representer', 'make_custom_pyprnt', 'prnt'
_DEFAULT_REPRESENTER = None
def get_default():
global _DEFAULT_REPRESENTER # pylint: disable=global-statement, global-variable-not-assigned
if _DEFAULT_REPRESENTER is None:
try:
# We try importing here just in case the user has since installed pyprnt
import pyprnt as _ # pylint: disable=import-outside-toplevel
del _
return prnt
except ImportError:
return dict_representer
return _DEFAULT_REPRESENTER
def set_default(representer):
global _DEFAULT_REPRESENTER # pylint: disable=global-statement
_DEFAULT_REPRESENTER = representer
def dict_representer(obj):
try:
if isinstance(obj, mincepy.File):
return obj.read_text()
return pprint.pformat(fmt.obj_dict(obj))
except Exception as exc: # pylint: disable=broad-except
return str(exc)
def make_custom_pyprnt(**kwargs):
return functools.partial(pyprnt.prnt, **kwargs)
def _terminal_width_prnt(obj, **kwargs):
width = putils.get_terminal_width()
return pyprnt.prnt(obj, end='', width=width, truncate=True, **kwargs)
[docs]def prnt(obj, custom_prnt=None):
"""Pyprnt representer. Use the great pyprnt library to represent the object either as a
sequence or a dictionary of the public properties.
See https://github.com/kevink1103/pyprnt for details of pyprnt"""
to_prnt = to_simple_repr(obj)
custom_prnt = custom_prnt or _terminal_width_prnt
buffer = io.StringIO()
custom_prnt(to_prnt, output=False, file=buffer)
return buffer.getvalue()
def to_simple_repr(obj):
"""Convert an object into primitive types i.e. str, list, dict, etc"""
if isinstance(obj, mincepy.File):
return obj.read_text()
if isinstance(obj, Sequence): # pylint: disable=isinstance-second-argument-not-valid-type
return obj
if isinstance(obj, Exception):
return f'{obj.__class__.__name__}: {obj}'
return fmt.obj_dict(obj)