def __repr__(self):
return "{!r}".format(list(self))
- def print_nested(self, stream=None, level=0, indent=" ", prefix="", first_level_indent=True, trailer=""):
+ def print_nested(self, stream=None, level=0, indent=" ", prefix="", first_level_indent=True, trailer="", print_doc=True, first_line_suffix=""):
import sys
stream = stream or sys.stdout
stream.write(
( (prefix + level*indent) if first_level_indent else "")
- + "[\n"
+ + "[{}\n".format(first_line_suffix)
)
for val in self:
if not hasattr( getattr(val, 'print_nested', None), '__call__'):
(prefix + (level+1)*indent) + "{!r},\n".format(val)
)
else:
- val.print_nested(stream=stream, level=level+2, indent=indent, prefix=prefix, trailer=",")
+ val.print_nested(stream=stream, level=level+2, indent=indent, prefix=prefix, trailer=",", print_doc=print_doc)
stream.write( (prefix + level*indent) + "]{}\n".format(trailer) )
class SegmentSequence:
def __repr__(self):
return "{}.{}({!r})".format(self.__class__.__module__, self.__class__.__name__, self.segments)
- def print_nested(self, stream=None, level=0, indent=" ", prefix="", first_level_indent=True, trailer=""):
+ def print_nested(self, stream=None, level=0, indent=" ", prefix="", first_level_indent=True, trailer="", print_doc=True, first_line_suffix=""):
import sys
stream = stream or sys.stdout
stream.write(
( (prefix + level*indent) if first_level_indent else "")
- + "{}.{}([".format(self.__class__.__module__, self.__class__.__name__) + "\n"
+ + "{}.{}([".format(self.__class__.__module__, self.__class__.__name__)
+ + first_line_suffix
+ + "\n"
)
for segment in self.segments:
- segment.print_nested(stream=stream, level=level+1, indent=indent, prefix=prefix, first_level_indent=True, trailer=",")
+ segment.print_nested(stream=stream, level=level+1, indent=indent, prefix=prefix, first_level_indent=True, trailer=",", print_doc=print_doc)
stream.write( (prefix + level*indent) + "]){}\n".format(trailer) )
def find_segments(self, query=None, version=None, callback=None, recurse=True):
)
)
- def print_nested(self, stream=None, level=0, indent=" ", prefix="", first_level_indent=True, trailer=""):
+ def print_nested(self, stream=None, level=0, indent=" ", prefix="", first_level_indent=True, trailer="", print_doc=True, first_line_suffix=""):
"""Structured nested print of the object to the given stream.
The print-out is eval()able to reconstruct the object."""
stream.write(
( (prefix + level*indent) if first_level_indent else "")
- + "{}.{}(".format(self.__class__.__module__, self.__class__.__name__) + "\n"
+ + "{}.{}(".format(self.__class__.__module__, self.__class__.__name__)
+ + first_line_suffix
+ + "\n"
)
for name, value in self._repr_items:
val = getattr(self, name)
+ if print_doc:
+ docstring = self._fields[name]._inline_doc_comment(val)
+ else:
+ docstring = ""
if not hasattr( getattr(val, 'print_nested', None), '__call__'):
stream.write(
- (prefix + (level+1)*indent) + "{} = {!r},\n".format(name, val)
+ (prefix + (level+1)*indent) + "{} = {!r},{}\n".format(name, val, docstring)
)
else:
stream.write(
(prefix + (level+1)*indent) + "{} = ".format(name)
)
- val.print_nested(stream=stream, level=level+2, indent=indent, prefix=prefix, first_level_indent=False, trailer=",")
+ val.print_nested(stream=stream, level=level+2, indent=indent, prefix=prefix, first_level_indent=False, trailer=",", print_doc=print_doc, first_line_suffix=docstring)
stream.write( (prefix + level*indent) + "){}\n".format(trailer) )
+import inspect
import re
from contextlib import contextmanager
from datetime import datetime
)
)
- def print_nested(self, stream=None, level=0, indent=" ", prefix="", first_level_indent=True, trailer=""):
+ def print_nested(self, stream=None, level=0, indent=" ", prefix="", first_level_indent=True, trailer="", print_doc=True, first_line_suffix=""):
stream.write(
( (prefix + level*indent) if first_level_indent else "")
- + "{!r}{}\n".format(self, trailer)
+ + "{!r}{}{}\n".format(self, trailer, first_line_suffix)
)
return self.__str__().replace(*args, **kwargs)
class RepresentableEnum(Enum):
+ def __init__(self, *args, **kwargs):
+ Enum.__init__(self)
+
+ # Hack alert: Try to parse the docstring from the enum source, if available. Fail softly.
+ # FIXME Needs test
+ try:
+ val_1 = val_2 = repr(args[0])
+ if val_1.startswith("'"):
+ val_2 = '"' + val_1[1:-1] + '"'
+ elif val_1.startswith('"'):
+ val_2 = "'" + val_1[1:-1] + "'"
+ regex = re.compile(r"^.*?\S+\s*=\s*(?:(?:{})|(?:{}))\s*#:\s*(\S.*)$".format(
+ re.escape(val_1), re.escape(val_2)))
+ for line in inspect.getsourcelines(self.__class__)[0]:
+ m = regex.match(line)
+ if m:
+ self.__doc__ = m.group(1).strip()
+ break
+ except:
+ raise
+
def __repr__(self):
return "{}.{}.{}".format(self.__class__.__module__, self.__class__.__name__, self.name)
def __str__(self):
return self.value
-
+