Mercurial > repos > shellac > guppy_basecaller
diff env/lib/python3.7/site-packages/ruamel/yaml/representer.py @ 5:9b1c78e6ba9c draft default tip
"planemo upload commit 6c0a8142489327ece472c84e558c47da711a9142"
author | shellac |
---|---|
date | Mon, 01 Jun 2020 08:59:25 -0400 |
parents | 79f47841a781 |
children |
line wrap: on
line diff
--- a/env/lib/python3.7/site-packages/ruamel/yaml/representer.py Thu May 14 16:47:39 2020 -0400 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1280 +0,0 @@ -# coding: utf-8 - -from __future__ import print_function, absolute_import, division - - -from ruamel.yaml.error import * # NOQA -from ruamel.yaml.nodes import * # NOQA -from ruamel.yaml.compat import text_type, binary_type, to_unicode, PY2, PY3, ordereddict -from ruamel.yaml.compat import nprint, nprintf # NOQA -from ruamel.yaml.scalarstring import ( - LiteralScalarString, - FoldedScalarString, - SingleQuotedScalarString, - DoubleQuotedScalarString, - PlainScalarString, -) -from ruamel.yaml.scalarint import ScalarInt, BinaryInt, OctalInt, HexInt, HexCapsInt -from ruamel.yaml.scalarfloat import ScalarFloat -from ruamel.yaml.scalarbool import ScalarBoolean -from ruamel.yaml.timestamp import TimeStamp - -import datetime -import sys -import types - -if PY3: - import copyreg - import base64 -else: - import copy_reg as copyreg # type: ignore - -if False: # MYPY - from typing import Dict, List, Any, Union, Text, Optional # NOQA - -# fmt: off -__all__ = ['BaseRepresenter', 'SafeRepresenter', 'Representer', - 'RepresenterError', 'RoundTripRepresenter'] -# fmt: on - - -class RepresenterError(YAMLError): - pass - - -if PY2: - - def get_classobj_bases(cls): - # type: (Any) -> Any - bases = [cls] - for base in cls.__bases__: - bases.extend(get_classobj_bases(base)) - return bases - - -class BaseRepresenter(object): - - yaml_representers = {} # type: Dict[Any, Any] - yaml_multi_representers = {} # type: Dict[Any, Any] - - def __init__(self, default_style=None, default_flow_style=None, dumper=None): - # type: (Any, Any, Any, Any) -> None - self.dumper = dumper - if self.dumper is not None: - self.dumper._representer = self - self.default_style = default_style - self.default_flow_style = default_flow_style - self.represented_objects = {} # type: Dict[Any, Any] - self.object_keeper = [] # type: List[Any] - self.alias_key = None # type: Optional[int] - self.sort_base_mapping_type_on_output = True - - @property - def serializer(self): - # type: () -> Any - try: - if hasattr(self.dumper, 'typ'): - return self.dumper.serializer - return self.dumper._serializer - except AttributeError: - return self # cyaml - - def represent(self, data): - # type: (Any) -> None - node = self.represent_data(data) - self.serializer.serialize(node) - self.represented_objects = {} # type: Dict[Any, Any] - self.object_keeper = [] # type: List[Any] - self.alias_key = None - - def represent_data(self, data): - # type: (Any) -> Any - if self.ignore_aliases(data): - self.alias_key = None - else: - self.alias_key = id(data) - if self.alias_key is not None: - if self.alias_key in self.represented_objects: - node = self.represented_objects[self.alias_key] - # if node is None: - # raise RepresenterError( - # "recursive objects are not allowed: %r" % data) - return node - # self.represented_objects[alias_key] = None - self.object_keeper.append(data) - data_types = type(data).__mro__ - if PY2: - # if type(data) is types.InstanceType: - if isinstance(data, types.InstanceType): - data_types = get_classobj_bases(data.__class__) + list(data_types) - if data_types[0] in self.yaml_representers: - node = self.yaml_representers[data_types[0]](self, data) - else: - for data_type in data_types: - if data_type in self.yaml_multi_representers: - node = self.yaml_multi_representers[data_type](self, data) - break - else: - if None in self.yaml_multi_representers: - node = self.yaml_multi_representers[None](self, data) - elif None in self.yaml_representers: - node = self.yaml_representers[None](self, data) - else: - node = ScalarNode(None, text_type(data)) - # if alias_key is not None: - # self.represented_objects[alias_key] = node - return node - - def represent_key(self, data): - # type: (Any) -> Any - """ - David Fraser: Extract a method to represent keys in mappings, so that - a subclass can choose not to quote them (for example) - used in represent_mapping - https://bitbucket.org/davidfraser/pyyaml/commits/d81df6eb95f20cac4a79eed95ae553b5c6f77b8c - """ - return self.represent_data(data) - - @classmethod - def add_representer(cls, data_type, representer): - # type: (Any, Any) -> None - if 'yaml_representers' not in cls.__dict__: - cls.yaml_representers = cls.yaml_representers.copy() - cls.yaml_representers[data_type] = representer - - @classmethod - def add_multi_representer(cls, data_type, representer): - # type: (Any, Any) -> None - if 'yaml_multi_representers' not in cls.__dict__: - cls.yaml_multi_representers = cls.yaml_multi_representers.copy() - cls.yaml_multi_representers[data_type] = representer - - def represent_scalar(self, tag, value, style=None, anchor=None): - # type: (Any, Any, Any, Any) -> Any - if style is None: - style = self.default_style - comment = None - if style and style[0] in '|>': - comment = getattr(value, 'comment', None) - if comment: - comment = [None, [comment]] - node = ScalarNode(tag, value, style=style, comment=comment, anchor=anchor) - if self.alias_key is not None: - self.represented_objects[self.alias_key] = node - return node - - def represent_sequence(self, tag, sequence, flow_style=None): - # type: (Any, Any, Any) -> Any - value = [] # type: List[Any] - node = SequenceNode(tag, value, flow_style=flow_style) - if self.alias_key is not None: - self.represented_objects[self.alias_key] = node - best_style = True - for item in sequence: - node_item = self.represent_data(item) - if not (isinstance(node_item, ScalarNode) and not node_item.style): - best_style = False - value.append(node_item) - if flow_style is None: - if self.default_flow_style is not None: - node.flow_style = self.default_flow_style - else: - node.flow_style = best_style - return node - - def represent_omap(self, tag, omap, flow_style=None): - # type: (Any, Any, Any) -> Any - value = [] # type: List[Any] - node = SequenceNode(tag, value, flow_style=flow_style) - if self.alias_key is not None: - self.represented_objects[self.alias_key] = node - best_style = True - for item_key in omap: - item_val = omap[item_key] - node_item = self.represent_data({item_key: item_val}) - # if not (isinstance(node_item, ScalarNode) \ - # and not node_item.style): - # best_style = False - value.append(node_item) - if flow_style is None: - if self.default_flow_style is not None: - node.flow_style = self.default_flow_style - else: - node.flow_style = best_style - return node - - def represent_mapping(self, tag, mapping, flow_style=None): - # type: (Any, Any, Any) -> Any - value = [] # type: List[Any] - node = MappingNode(tag, value, flow_style=flow_style) - if self.alias_key is not None: - self.represented_objects[self.alias_key] = node - best_style = True - if hasattr(mapping, 'items'): - mapping = list(mapping.items()) - if self.sort_base_mapping_type_on_output: - try: - mapping = sorted(mapping) - except TypeError: - pass - for item_key, item_value in mapping: - node_key = self.represent_key(item_key) - node_value = self.represent_data(item_value) - if not (isinstance(node_key, ScalarNode) and not node_key.style): - best_style = False - if not (isinstance(node_value, ScalarNode) and not node_value.style): - best_style = False - value.append((node_key, node_value)) - if flow_style is None: - if self.default_flow_style is not None: - node.flow_style = self.default_flow_style - else: - node.flow_style = best_style - return node - - def ignore_aliases(self, data): - # type: (Any) -> bool - return False - - -class SafeRepresenter(BaseRepresenter): - def ignore_aliases(self, data): - # type: (Any) -> bool - # https://docs.python.org/3/reference/expressions.html#parenthesized-forms : - # "i.e. two occurrences of the empty tuple may or may not yield the same object" - # so "data is ()" should not be used - if data is None or (isinstance(data, tuple) and data == ()): - return True - if isinstance(data, (binary_type, text_type, bool, int, float)): - return True - return False - - def represent_none(self, data): - # type: (Any) -> Any - return self.represent_scalar(u'tag:yaml.org,2002:null', u'null') - - if PY3: - - def represent_str(self, data): - # type: (Any) -> Any - return self.represent_scalar(u'tag:yaml.org,2002:str', data) - - def represent_binary(self, data): - # type: (Any) -> Any - if hasattr(base64, 'encodebytes'): - data = base64.encodebytes(data).decode('ascii') - else: - data = base64.encodestring(data).decode('ascii') - return self.represent_scalar(u'tag:yaml.org,2002:binary', data, style='|') - - else: - - def represent_str(self, data): - # type: (Any) -> Any - tag = None - style = None - try: - data = unicode(data, 'ascii') - tag = u'tag:yaml.org,2002:str' - except UnicodeDecodeError: - try: - data = unicode(data, 'utf-8') - tag = u'tag:yaml.org,2002:str' - except UnicodeDecodeError: - data = data.encode('base64') - tag = u'tag:yaml.org,2002:binary' - style = '|' - return self.represent_scalar(tag, data, style=style) - - def represent_unicode(self, data): - # type: (Any) -> Any - return self.represent_scalar(u'tag:yaml.org,2002:str', data) - - def represent_bool(self, data, anchor=None): - # type: (Any, Optional[Any]) -> Any - try: - value = self.dumper.boolean_representation[bool(data)] - except AttributeError: - if data: - value = u'true' - else: - value = u'false' - return self.represent_scalar(u'tag:yaml.org,2002:bool', value, anchor=anchor) - - def represent_int(self, data): - # type: (Any) -> Any - return self.represent_scalar(u'tag:yaml.org,2002:int', text_type(data)) - - if PY2: - - def represent_long(self, data): - # type: (Any) -> Any - return self.represent_scalar(u'tag:yaml.org,2002:int', text_type(data)) - - inf_value = 1e300 - while repr(inf_value) != repr(inf_value * inf_value): - inf_value *= inf_value - - def represent_float(self, data): - # type: (Any) -> Any - if data != data or (data == 0.0 and data == 1.0): - value = u'.nan' - elif data == self.inf_value: - value = u'.inf' - elif data == -self.inf_value: - value = u'-.inf' - else: - value = to_unicode(repr(data)).lower() - if getattr(self.serializer, 'use_version', None) == (1, 1): - if u'.' not in value and u'e' in value: - # Note that in some cases `repr(data)` represents a float number - # without the decimal parts. For instance: - # >>> repr(1e17) - # '1e17' - # Unfortunately, this is not a valid float representation according - # to the definition of the `!!float` tag in YAML 1.1. We fix - # this by adding '.0' before the 'e' symbol. - value = value.replace(u'e', u'.0e', 1) - return self.represent_scalar(u'tag:yaml.org,2002:float', value) - - def represent_list(self, data): - # type: (Any) -> Any - # pairs = (len(data) > 0 and isinstance(data, list)) - # if pairs: - # for item in data: - # if not isinstance(item, tuple) or len(item) != 2: - # pairs = False - # break - # if not pairs: - return self.represent_sequence(u'tag:yaml.org,2002:seq', data) - - # value = [] - # for item_key, item_value in data: - # value.append(self.represent_mapping(u'tag:yaml.org,2002:map', - # [(item_key, item_value)])) - # return SequenceNode(u'tag:yaml.org,2002:pairs', value) - - def represent_dict(self, data): - # type: (Any) -> Any - return self.represent_mapping(u'tag:yaml.org,2002:map', data) - - def represent_ordereddict(self, data): - # type: (Any) -> Any - return self.represent_omap(u'tag:yaml.org,2002:omap', data) - - def represent_set(self, data): - # type: (Any) -> Any - value = {} # type: Dict[Any, None] - for key in data: - value[key] = None - return self.represent_mapping(u'tag:yaml.org,2002:set', value) - - def represent_date(self, data): - # type: (Any) -> Any - value = to_unicode(data.isoformat()) - return self.represent_scalar(u'tag:yaml.org,2002:timestamp', value) - - def represent_datetime(self, data): - # type: (Any) -> Any - value = to_unicode(data.isoformat(' ')) - return self.represent_scalar(u'tag:yaml.org,2002:timestamp', value) - - def represent_yaml_object(self, tag, data, cls, flow_style=None): - # type: (Any, Any, Any, Any) -> Any - if hasattr(data, '__getstate__'): - state = data.__getstate__() - else: - state = data.__dict__.copy() - return self.represent_mapping(tag, state, flow_style=flow_style) - - def represent_undefined(self, data): - # type: (Any) -> None - raise RepresenterError('cannot represent an object: %s' % (data,)) - - -SafeRepresenter.add_representer(type(None), SafeRepresenter.represent_none) - -SafeRepresenter.add_representer(str, SafeRepresenter.represent_str) - -if PY2: - SafeRepresenter.add_representer(unicode, SafeRepresenter.represent_unicode) -else: - SafeRepresenter.add_representer(bytes, SafeRepresenter.represent_binary) - -SafeRepresenter.add_representer(bool, SafeRepresenter.represent_bool) - -SafeRepresenter.add_representer(int, SafeRepresenter.represent_int) - -if PY2: - SafeRepresenter.add_representer(long, SafeRepresenter.represent_long) - -SafeRepresenter.add_representer(float, SafeRepresenter.represent_float) - -SafeRepresenter.add_representer(list, SafeRepresenter.represent_list) - -SafeRepresenter.add_representer(tuple, SafeRepresenter.represent_list) - -SafeRepresenter.add_representer(dict, SafeRepresenter.represent_dict) - -SafeRepresenter.add_representer(set, SafeRepresenter.represent_set) - -SafeRepresenter.add_representer(ordereddict, SafeRepresenter.represent_ordereddict) - -if sys.version_info >= (2, 7): - import collections - - SafeRepresenter.add_representer( - collections.OrderedDict, SafeRepresenter.represent_ordereddict - ) - -SafeRepresenter.add_representer(datetime.date, SafeRepresenter.represent_date) - -SafeRepresenter.add_representer(datetime.datetime, SafeRepresenter.represent_datetime) - -SafeRepresenter.add_representer(None, SafeRepresenter.represent_undefined) - - -class Representer(SafeRepresenter): - if PY2: - - def represent_str(self, data): - # type: (Any) -> Any - tag = None - style = None - try: - data = unicode(data, 'ascii') - tag = u'tag:yaml.org,2002:str' - except UnicodeDecodeError: - try: - data = unicode(data, 'utf-8') - tag = u'tag:yaml.org,2002:python/str' - except UnicodeDecodeError: - data = data.encode('base64') - tag = u'tag:yaml.org,2002:binary' - style = '|' - return self.represent_scalar(tag, data, style=style) - - def represent_unicode(self, data): - # type: (Any) -> Any - tag = None - try: - data.encode('ascii') - tag = u'tag:yaml.org,2002:python/unicode' - except UnicodeEncodeError: - tag = u'tag:yaml.org,2002:str' - return self.represent_scalar(tag, data) - - def represent_long(self, data): - # type: (Any) -> Any - tag = u'tag:yaml.org,2002:int' - if int(data) is not data: - tag = u'tag:yaml.org,2002:python/long' - return self.represent_scalar(tag, to_unicode(data)) - - def represent_complex(self, data): - # type: (Any) -> Any - if data.imag == 0.0: - data = u'%r' % data.real - elif data.real == 0.0: - data = u'%rj' % data.imag - elif data.imag > 0: - data = u'%r+%rj' % (data.real, data.imag) - else: - data = u'%r%rj' % (data.real, data.imag) - return self.represent_scalar(u'tag:yaml.org,2002:python/complex', data) - - def represent_tuple(self, data): - # type: (Any) -> Any - return self.represent_sequence(u'tag:yaml.org,2002:python/tuple', data) - - def represent_name(self, data): - # type: (Any) -> Any - try: - name = u'%s.%s' % (data.__module__, data.__qualname__) - except AttributeError: - # probably PY2 - name = u'%s.%s' % (data.__module__, data.__name__) - return self.represent_scalar(u'tag:yaml.org,2002:python/name:' + name, "") - - def represent_module(self, data): - # type: (Any) -> Any - return self.represent_scalar(u'tag:yaml.org,2002:python/module:' + data.__name__, "") - - if PY2: - - def represent_instance(self, data): - # type: (Any) -> Any - # For instances of classic classes, we use __getinitargs__ and - # __getstate__ to serialize the data. - - # If data.__getinitargs__ exists, the object must be reconstructed - # by calling cls(**args), where args is a tuple returned by - # __getinitargs__. Otherwise, the cls.__init__ method should never - # be called and the class instance is created by instantiating a - # trivial class and assigning to the instance's __class__ variable. - - # If data.__getstate__ exists, it returns the state of the object. - # Otherwise, the state of the object is data.__dict__. - - # We produce either a !!python/object or !!python/object/new node. - # If data.__getinitargs__ does not exist and state is a dictionary, - # we produce a !!python/object node . Otherwise we produce a - # !!python/object/new node. - - cls = data.__class__ - class_name = u'%s.%s' % (cls.__module__, cls.__name__) - args = None - state = None - if hasattr(data, '__getinitargs__'): - args = list(data.__getinitargs__()) - if hasattr(data, '__getstate__'): - state = data.__getstate__() - else: - state = data.__dict__ - if args is None and isinstance(state, dict): - return self.represent_mapping( - u'tag:yaml.org,2002:python/object:' + class_name, state - ) - if isinstance(state, dict) and not state: - return self.represent_sequence( - u'tag:yaml.org,2002:python/object/new:' + class_name, args - ) - value = {} - if bool(args): - value['args'] = args - value['state'] = state # type: ignore - return self.represent_mapping( - u'tag:yaml.org,2002:python/object/new:' + class_name, value - ) - - def represent_object(self, data): - # type: (Any) -> Any - # We use __reduce__ API to save the data. data.__reduce__ returns - # a tuple of length 2-5: - # (function, args, state, listitems, dictitems) - - # For reconstructing, we calls function(*args), then set its state, - # listitems, and dictitems if they are not None. - - # A special case is when function.__name__ == '__newobj__'. In this - # case we create the object with args[0].__new__(*args). - - # Another special case is when __reduce__ returns a string - we don't - # support it. - - # We produce a !!python/object, !!python/object/new or - # !!python/object/apply node. - - cls = type(data) - if cls in copyreg.dispatch_table: - reduce = copyreg.dispatch_table[cls](data) - elif hasattr(data, '__reduce_ex__'): - reduce = data.__reduce_ex__(2) - elif hasattr(data, '__reduce__'): - reduce = data.__reduce__() - else: - raise RepresenterError('cannot represent object: %r' % (data,)) - reduce = (list(reduce) + [None] * 5)[:5] - function, args, state, listitems, dictitems = reduce - args = list(args) - if state is None: - state = {} - if listitems is not None: - listitems = list(listitems) - if dictitems is not None: - dictitems = dict(dictitems) - if function.__name__ == '__newobj__': - function = args[0] - args = args[1:] - tag = u'tag:yaml.org,2002:python/object/new:' - newobj = True - else: - tag = u'tag:yaml.org,2002:python/object/apply:' - newobj = False - try: - function_name = u'%s.%s' % (function.__module__, function.__qualname__) - except AttributeError: - # probably PY2 - function_name = u'%s.%s' % (function.__module__, function.__name__) - if not args and not listitems and not dictitems and isinstance(state, dict) and newobj: - return self.represent_mapping( - u'tag:yaml.org,2002:python/object:' + function_name, state - ) - if not listitems and not dictitems and isinstance(state, dict) and not state: - return self.represent_sequence(tag + function_name, args) - value = {} - if args: - value['args'] = args - if state or not isinstance(state, dict): - value['state'] = state - if listitems: - value['listitems'] = listitems - if dictitems: - value['dictitems'] = dictitems - return self.represent_mapping(tag + function_name, value) - - -if PY2: - Representer.add_representer(str, Representer.represent_str) - - Representer.add_representer(unicode, Representer.represent_unicode) - - Representer.add_representer(long, Representer.represent_long) - -Representer.add_representer(complex, Representer.represent_complex) - -Representer.add_representer(tuple, Representer.represent_tuple) - -Representer.add_representer(type, Representer.represent_name) - -if PY2: - Representer.add_representer(types.ClassType, Representer.represent_name) - -Representer.add_representer(types.FunctionType, Representer.represent_name) - -Representer.add_representer(types.BuiltinFunctionType, Representer.represent_name) - -Representer.add_representer(types.ModuleType, Representer.represent_module) - -if PY2: - Representer.add_multi_representer(types.InstanceType, Representer.represent_instance) - -Representer.add_multi_representer(object, Representer.represent_object) - -Representer.add_multi_representer(type, Representer.represent_name) - -from ruamel.yaml.comments import ( - CommentedMap, - CommentedOrderedMap, - CommentedSeq, - CommentedKeySeq, - CommentedKeyMap, - CommentedSet, - comment_attrib, - merge_attrib, - TaggedScalar, -) # NOQA - - -class RoundTripRepresenter(SafeRepresenter): - # need to add type here and write out the .comment - # in serializer and emitter - - def __init__(self, default_style=None, default_flow_style=None, dumper=None): - # type: (Any, Any, Any) -> None - if not hasattr(dumper, 'typ') and default_flow_style is None: - default_flow_style = False - SafeRepresenter.__init__( - self, - default_style=default_style, - default_flow_style=default_flow_style, - dumper=dumper, - ) - - def ignore_aliases(self, data): - # type: (Any) -> bool - try: - if data.anchor is not None and data.anchor.value is not None: - return False - except AttributeError: - pass - return SafeRepresenter.ignore_aliases(self, data) - - def represent_none(self, data): - # type: (Any) -> Any - if len(self.represented_objects) == 0 and not self.serializer.use_explicit_start: - # this will be open ended (although it is not yet) - return self.represent_scalar(u'tag:yaml.org,2002:null', u'null') - return self.represent_scalar(u'tag:yaml.org,2002:null', "") - - def represent_literal_scalarstring(self, data): - # type: (Any) -> Any - tag = None - style = '|' - anchor = data.yaml_anchor(any=True) - if PY2 and not isinstance(data, unicode): - data = unicode(data, 'ascii') - tag = u'tag:yaml.org,2002:str' - return self.represent_scalar(tag, data, style=style, anchor=anchor) - - represent_preserved_scalarstring = represent_literal_scalarstring - - def represent_folded_scalarstring(self, data): - # type: (Any) -> Any - tag = None - style = '>' - anchor = data.yaml_anchor(any=True) - for fold_pos in reversed(getattr(data, 'fold_pos', [])): - if ( - data[fold_pos] == ' ' - and (fold_pos > 0 and not data[fold_pos - 1].isspace()) - and (fold_pos < len(data) and not data[fold_pos + 1].isspace()) - ): - data = data[:fold_pos] + '\a' + data[fold_pos:] - if PY2 and not isinstance(data, unicode): - data = unicode(data, 'ascii') - tag = u'tag:yaml.org,2002:str' - return self.represent_scalar(tag, data, style=style, anchor=anchor) - - def represent_single_quoted_scalarstring(self, data): - # type: (Any) -> Any - tag = None - style = "'" - anchor = data.yaml_anchor(any=True) - if PY2 and not isinstance(data, unicode): - data = unicode(data, 'ascii') - tag = u'tag:yaml.org,2002:str' - return self.represent_scalar(tag, data, style=style, anchor=anchor) - - def represent_double_quoted_scalarstring(self, data): - # type: (Any) -> Any - tag = None - style = '"' - anchor = data.yaml_anchor(any=True) - if PY2 and not isinstance(data, unicode): - data = unicode(data, 'ascii') - tag = u'tag:yaml.org,2002:str' - return self.represent_scalar(tag, data, style=style, anchor=anchor) - - def represent_plain_scalarstring(self, data): - # type: (Any) -> Any - tag = None - style = '' - anchor = data.yaml_anchor(any=True) - if PY2 and not isinstance(data, unicode): - data = unicode(data, 'ascii') - tag = u'tag:yaml.org,2002:str' - return self.represent_scalar(tag, data, style=style, anchor=anchor) - - def insert_underscore(self, prefix, s, underscore, anchor=None): - # type: (Any, Any, Any, Any) -> Any - if underscore is None: - return self.represent_scalar(u'tag:yaml.org,2002:int', prefix + s, anchor=anchor) - if underscore[0]: - sl = list(s) - pos = len(s) - underscore[0] - while pos > 0: - sl.insert(pos, '_') - pos -= underscore[0] - s = "".join(sl) - if underscore[1]: - s = '_' + s - if underscore[2]: - s += '_' - return self.represent_scalar(u'tag:yaml.org,2002:int', prefix + s, anchor=anchor) - - def represent_scalar_int(self, data): - # type: (Any) -> Any - if data._width is not None: - s = '{:0{}d}'.format(data, data._width) - else: - s = format(data, 'd') - anchor = data.yaml_anchor(any=True) - return self.insert_underscore("", s, data._underscore, anchor=anchor) - - def represent_binary_int(self, data): - # type: (Any) -> Any - if data._width is not None: - # cannot use '{:#0{}b}', that strips the zeros - s = '{:0{}b}'.format(data, data._width) - else: - s = format(data, 'b') - anchor = data.yaml_anchor(any=True) - return self.insert_underscore('0b', s, data._underscore, anchor=anchor) - - def represent_octal_int(self, data): - # type: (Any) -> Any - if data._width is not None: - # cannot use '{:#0{}o}', that strips the zeros - s = '{:0{}o}'.format(data, data._width) - else: - s = format(data, 'o') - anchor = data.yaml_anchor(any=True) - return self.insert_underscore('0o', s, data._underscore, anchor=anchor) - - def represent_hex_int(self, data): - # type: (Any) -> Any - if data._width is not None: - # cannot use '{:#0{}x}', that strips the zeros - s = '{:0{}x}'.format(data, data._width) - else: - s = format(data, 'x') - anchor = data.yaml_anchor(any=True) - return self.insert_underscore('0x', s, data._underscore, anchor=anchor) - - def represent_hex_caps_int(self, data): - # type: (Any) -> Any - if data._width is not None: - # cannot use '{:#0{}X}', that strips the zeros - s = '{:0{}X}'.format(data, data._width) - else: - s = format(data, 'X') - anchor = data.yaml_anchor(any=True) - return self.insert_underscore('0x', s, data._underscore, anchor=anchor) - - def represent_scalar_float(self, data): - # type: (Any) -> Any - """ this is way more complicated """ - value = None - anchor = data.yaml_anchor(any=True) - if data != data or (data == 0.0 and data == 1.0): - value = u'.nan' - elif data == self.inf_value: - value = u'.inf' - elif data == -self.inf_value: - value = u'-.inf' - if value: - return self.represent_scalar(u'tag:yaml.org,2002:float', value, anchor=anchor) - if data._exp is None and data._prec > 0 and data._prec == data._width - 1: - # no exponent, but trailing dot - value = u'{}{:d}.'.format(data._m_sign if data._m_sign else "", abs(int(data))) - elif data._exp is None: - # no exponent, "normal" dot - prec = data._prec - ms = data._m_sign if data._m_sign else "" - # -1 for the dot - value = u'{}{:0{}.{}f}'.format( - ms, abs(data), data._width - len(ms), data._width - prec - 1 - ) - if prec == 0 or (prec == 1 and ms != ""): - value = value.replace(u'0.', u'.') - while len(value) < data._width: - value += u'0' - else: - # exponent - m, es = u'{:{}.{}e}'.format( - # data, data._width, data._width - data._prec + (1 if data._m_sign else 0) - data, - data._width, - data._width + (1 if data._m_sign else 0), - ).split('e') - w = data._width if data._prec > 0 else (data._width + 1) - if data < 0: - w += 1 - m = m[:w] - e = int(es) - m1, m2 = m.split('.') # always second? - while len(m1) + len(m2) < data._width - (1 if data._prec >= 0 else 0): - m2 += u'0' - if data._m_sign and data > 0: - m1 = '+' + m1 - esgn = u'+' if data._e_sign else "" - if data._prec < 0: # mantissa without dot - if m2 != u'0': - e -= len(m2) - else: - m2 = "" - while (len(m1) + len(m2) - (1 if data._m_sign else 0)) < data._width: - m2 += u'0' - e -= 1 - value = m1 + m2 + data._exp + u'{:{}0{}d}'.format(e, esgn, data._e_width) - elif data._prec == 0: # mantissa with trailing dot - e -= len(m2) - value = ( - m1 + m2 + u'.' + data._exp + u'{:{}0{}d}'.format(e, esgn, data._e_width) - ) - else: - if data._m_lead0 > 0: - m2 = u'0' * (data._m_lead0 - 1) + m1 + m2 - m1 = u'0' - m2 = m2[: -data._m_lead0] # these should be zeros - e += data._m_lead0 - while len(m1) < data._prec: - m1 += m2[0] - m2 = m2[1:] - e -= 1 - value = ( - m1 + u'.' + m2 + data._exp + u'{:{}0{}d}'.format(e, esgn, data._e_width) - ) - - if value is None: - value = to_unicode(repr(data)).lower() - return self.represent_scalar(u'tag:yaml.org,2002:float', value, anchor=anchor) - - def represent_sequence(self, tag, sequence, flow_style=None): - # type: (Any, Any, Any) -> Any - value = [] # type: List[Any] - # if the flow_style is None, the flow style tacked on to the object - # explicitly will be taken. If that is None as well the default flow - # style rules - try: - flow_style = sequence.fa.flow_style(flow_style) - except AttributeError: - flow_style = flow_style - try: - anchor = sequence.yaml_anchor() - except AttributeError: - anchor = None - node = SequenceNode(tag, value, flow_style=flow_style, anchor=anchor) - if self.alias_key is not None: - self.represented_objects[self.alias_key] = node - best_style = True - try: - comment = getattr(sequence, comment_attrib) - node.comment = comment.comment - # reset any comment already printed information - if node.comment and node.comment[1]: - for ct in node.comment[1]: - ct.reset() - item_comments = comment.items - for v in item_comments.values(): - if v and v[1]: - for ct in v[1]: - ct.reset() - item_comments = comment.items - node.comment = comment.comment - try: - node.comment.append(comment.end) - except AttributeError: - pass - except AttributeError: - item_comments = {} - for idx, item in enumerate(sequence): - node_item = self.represent_data(item) - self.merge_comments(node_item, item_comments.get(idx)) - if not (isinstance(node_item, ScalarNode) and not node_item.style): - best_style = False - value.append(node_item) - if flow_style is None: - if len(sequence) != 0 and self.default_flow_style is not None: - node.flow_style = self.default_flow_style - else: - node.flow_style = best_style - return node - - def merge_comments(self, node, comments): - # type: (Any, Any) -> Any - if comments is None: - assert hasattr(node, 'comment') - return node - if getattr(node, 'comment', None) is not None: - for idx, val in enumerate(comments): - if idx >= len(node.comment): - continue - nc = node.comment[idx] - if nc is not None: - assert val is None or val == nc - comments[idx] = nc - node.comment = comments - return node - - def represent_key(self, data): - # type: (Any) -> Any - if isinstance(data, CommentedKeySeq): - self.alias_key = None - return self.represent_sequence(u'tag:yaml.org,2002:seq', data, flow_style=True) - if isinstance(data, CommentedKeyMap): - self.alias_key = None - return self.represent_mapping(u'tag:yaml.org,2002:map', data, flow_style=True) - return SafeRepresenter.represent_key(self, data) - - def represent_mapping(self, tag, mapping, flow_style=None): - # type: (Any, Any, Any) -> Any - value = [] # type: List[Any] - try: - flow_style = mapping.fa.flow_style(flow_style) - except AttributeError: - flow_style = flow_style - try: - anchor = mapping.yaml_anchor() - except AttributeError: - anchor = None - node = MappingNode(tag, value, flow_style=flow_style, anchor=anchor) - if self.alias_key is not None: - self.represented_objects[self.alias_key] = node - best_style = True - # no sorting! !! - try: - comment = getattr(mapping, comment_attrib) - node.comment = comment.comment - if node.comment and node.comment[1]: - for ct in node.comment[1]: - ct.reset() - item_comments = comment.items - for v in item_comments.values(): - if v and v[1]: - for ct in v[1]: - ct.reset() - try: - node.comment.append(comment.end) - except AttributeError: - pass - except AttributeError: - item_comments = {} - merge_list = [m[1] for m in getattr(mapping, merge_attrib, [])] - try: - merge_pos = getattr(mapping, merge_attrib, [[0]])[0][0] - except IndexError: - merge_pos = 0 - item_count = 0 - if bool(merge_list): - items = mapping.non_merged_items() - else: - items = mapping.items() - for item_key, item_value in items: - item_count += 1 - node_key = self.represent_key(item_key) - node_value = self.represent_data(item_value) - item_comment = item_comments.get(item_key) - if item_comment: - assert getattr(node_key, 'comment', None) is None - node_key.comment = item_comment[:2] - nvc = getattr(node_value, 'comment', None) - if nvc is not None: # end comment already there - nvc[0] = item_comment[2] - nvc[1] = item_comment[3] - else: - node_value.comment = item_comment[2:] - if not (isinstance(node_key, ScalarNode) and not node_key.style): - best_style = False - if not (isinstance(node_value, ScalarNode) and not node_value.style): - best_style = False - value.append((node_key, node_value)) - if flow_style is None: - if ((item_count != 0) or bool(merge_list)) and self.default_flow_style is not None: - node.flow_style = self.default_flow_style - else: - node.flow_style = best_style - if bool(merge_list): - # because of the call to represent_data here, the anchors - # are marked as being used and thereby created - if len(merge_list) == 1: - arg = self.represent_data(merge_list[0]) - else: - arg = self.represent_data(merge_list) - arg.flow_style = True - value.insert(merge_pos, (ScalarNode(u'tag:yaml.org,2002:merge', '<<'), arg)) - return node - - def represent_omap(self, tag, omap, flow_style=None): - # type: (Any, Any, Any) -> Any - value = [] # type: List[Any] - try: - flow_style = omap.fa.flow_style(flow_style) - except AttributeError: - flow_style = flow_style - try: - anchor = omap.yaml_anchor() - except AttributeError: - anchor = None - node = SequenceNode(tag, value, flow_style=flow_style, anchor=anchor) - if self.alias_key is not None: - self.represented_objects[self.alias_key] = node - best_style = True - try: - comment = getattr(omap, comment_attrib) - node.comment = comment.comment - if node.comment and node.comment[1]: - for ct in node.comment[1]: - ct.reset() - item_comments = comment.items - for v in item_comments.values(): - if v and v[1]: - for ct in v[1]: - ct.reset() - try: - node.comment.append(comment.end) - except AttributeError: - pass - except AttributeError: - item_comments = {} - for item_key in omap: - item_val = omap[item_key] - node_item = self.represent_data({item_key: item_val}) - # node_item.flow_style = False - # node item has two scalars in value: node_key and node_value - item_comment = item_comments.get(item_key) - if item_comment: - if item_comment[1]: - node_item.comment = [None, item_comment[1]] - assert getattr(node_item.value[0][0], 'comment', None) is None - node_item.value[0][0].comment = [item_comment[0], None] - nvc = getattr(node_item.value[0][1], 'comment', None) - if nvc is not None: # end comment already there - nvc[0] = item_comment[2] - nvc[1] = item_comment[3] - else: - node_item.value[0][1].comment = item_comment[2:] - # if not (isinstance(node_item, ScalarNode) \ - # and not node_item.style): - # best_style = False - value.append(node_item) - if flow_style is None: - if self.default_flow_style is not None: - node.flow_style = self.default_flow_style - else: - node.flow_style = best_style - return node - - def represent_set(self, setting): - # type: (Any) -> Any - flow_style = False - tag = u'tag:yaml.org,2002:set' - # return self.represent_mapping(tag, value) - value = [] # type: List[Any] - flow_style = setting.fa.flow_style(flow_style) - try: - anchor = setting.yaml_anchor() - except AttributeError: - anchor = None - node = MappingNode(tag, value, flow_style=flow_style, anchor=anchor) - if self.alias_key is not None: - self.represented_objects[self.alias_key] = node - best_style = True - # no sorting! !! - try: - comment = getattr(setting, comment_attrib) - node.comment = comment.comment - if node.comment and node.comment[1]: - for ct in node.comment[1]: - ct.reset() - item_comments = comment.items - for v in item_comments.values(): - if v and v[1]: - for ct in v[1]: - ct.reset() - try: - node.comment.append(comment.end) - except AttributeError: - pass - except AttributeError: - item_comments = {} - for item_key in setting.odict: - node_key = self.represent_key(item_key) - node_value = self.represent_data(None) - item_comment = item_comments.get(item_key) - if item_comment: - assert getattr(node_key, 'comment', None) is None - node_key.comment = item_comment[:2] - node_key.style = node_value.style = '?' - if not (isinstance(node_key, ScalarNode) and not node_key.style): - best_style = False - if not (isinstance(node_value, ScalarNode) and not node_value.style): - best_style = False - value.append((node_key, node_value)) - best_style = best_style - return node - - def represent_dict(self, data): - # type: (Any) -> Any - """write out tag if saved on loading""" - try: - t = data.tag.value - except AttributeError: - t = None - if t: - if t.startswith('!!'): - tag = 'tag:yaml.org,2002:' + t[2:] - else: - tag = t - else: - tag = u'tag:yaml.org,2002:map' - return self.represent_mapping(tag, data) - - def represent_list(self, data): - # type: (Any) -> Any - try: - t = data.tag.value - except AttributeError: - t = None - if t: - if t.startswith('!!'): - tag = 'tag:yaml.org,2002:' + t[2:] - else: - tag = t - else: - tag = u'tag:yaml.org,2002:seq' - return self.represent_sequence(tag, data) - - def represent_datetime(self, data): - # type: (Any) -> Any - inter = 'T' if data._yaml['t'] else ' ' - _yaml = data._yaml - if _yaml['delta']: - data += _yaml['delta'] - value = data.isoformat(inter) - else: - value = data.isoformat(inter) - if _yaml['tz']: - value += _yaml['tz'] - return self.represent_scalar(u'tag:yaml.org,2002:timestamp', to_unicode(value)) - - def represent_tagged_scalar(self, data): - # type: (Any) -> Any - try: - tag = data.tag.value - except AttributeError: - tag = None - try: - anchor = data.yaml_anchor() - except AttributeError: - anchor = None - return self.represent_scalar(tag, data.value, style=data.style, anchor=anchor) - - def represent_scalar_bool(self, data): - # type: (Any) -> Any - try: - anchor = data.yaml_anchor() - except AttributeError: - anchor = None - return SafeRepresenter.represent_bool(self, data, anchor=anchor) - - -RoundTripRepresenter.add_representer(type(None), RoundTripRepresenter.represent_none) - -RoundTripRepresenter.add_representer( - LiteralScalarString, RoundTripRepresenter.represent_literal_scalarstring -) - -RoundTripRepresenter.add_representer( - FoldedScalarString, RoundTripRepresenter.represent_folded_scalarstring -) - -RoundTripRepresenter.add_representer( - SingleQuotedScalarString, RoundTripRepresenter.represent_single_quoted_scalarstring -) - -RoundTripRepresenter.add_representer( - DoubleQuotedScalarString, RoundTripRepresenter.represent_double_quoted_scalarstring -) - -RoundTripRepresenter.add_representer( - PlainScalarString, RoundTripRepresenter.represent_plain_scalarstring -) - -RoundTripRepresenter.add_representer(ScalarInt, RoundTripRepresenter.represent_scalar_int) - -RoundTripRepresenter.add_representer(BinaryInt, RoundTripRepresenter.represent_binary_int) - -RoundTripRepresenter.add_representer(OctalInt, RoundTripRepresenter.represent_octal_int) - -RoundTripRepresenter.add_representer(HexInt, RoundTripRepresenter.represent_hex_int) - -RoundTripRepresenter.add_representer(HexCapsInt, RoundTripRepresenter.represent_hex_caps_int) - -RoundTripRepresenter.add_representer(ScalarFloat, RoundTripRepresenter.represent_scalar_float) - -RoundTripRepresenter.add_representer(ScalarBoolean, RoundTripRepresenter.represent_scalar_bool) - -RoundTripRepresenter.add_representer(CommentedSeq, RoundTripRepresenter.represent_list) - -RoundTripRepresenter.add_representer(CommentedMap, RoundTripRepresenter.represent_dict) - -RoundTripRepresenter.add_representer( - CommentedOrderedMap, RoundTripRepresenter.represent_ordereddict -) - -if sys.version_info >= (2, 7): - import collections - - RoundTripRepresenter.add_representer( - collections.OrderedDict, RoundTripRepresenter.represent_ordereddict - ) - -RoundTripRepresenter.add_representer(CommentedSet, RoundTripRepresenter.represent_set) - -RoundTripRepresenter.add_representer( - TaggedScalar, RoundTripRepresenter.represent_tagged_scalar -) - -RoundTripRepresenter.add_representer(TimeStamp, RoundTripRepresenter.represent_datetime)