Hello community, here is the log from the commit of package python-ruamel.yaml for openSUSE:Factory checked in at 2018-12-03 10:09:46 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/python-ruamel.yaml (Old) and /work/SRC/openSUSE:Factory/.python-ruamel.yaml.new.19453 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-ruamel.yaml" Mon Dec 3 10:09:46 2018 rev:10 rq:653087 version:0.15.78 Changes: -------- --- /work/SRC/openSUSE:Factory/python-ruamel.yaml/python-ruamel.yaml.changes 2018-10-02 19:48:58.161734608 +0200 +++ /work/SRC/openSUSE:Factory/.python-ruamel.yaml.new.19453/python-ruamel.yaml.changes 2018-12-03 10:09:51.675738327 +0100 @@ -1,0 +2,15 @@ +Fri Nov 30 07:43:33 UTC 2018 - Adrian Schröter <adr...@suse.de> + +- update to 0.15.78 + * setup issue for 3.8 (reported by Sidney Kuyateh) + * setting yaml.sort_base_mapping_type_on_output = False, will prevent explicit sorting by keys in the base representer of mappings. Roundtrip already did not do this. Usage only makes real sense for Python 3.6+ (feature request by Sebastian Gerber). + * implement Python version check in YAML metadata in _test/test_z_data.py + * fix issue with empty mapping and sequence loaded as flow-style (mapping reported by Min RK, sequence by Maged Ahmed) + * fix issue with single '?' scalar (reported by Terrance) + * fix issue with duplicate merge keys (prompted by answering a StackOverflow question by math) + * fix dropping of comment on rt before sequence item that is sequence item (reported by Thorsten Kampe) + * fix irregular output on pre-comment in sequence within sequence (reported by Thorsten Kampe) + * allow non-compact (i.e. next line) dumping sequence/mapping within sequence. + * fix regression on explicit 1.1 loading with the C based scanner/parser (reported by Tomas Vavra) + +------------------------------------------------------------------- Old: ---- ruamel.yaml-0.15.71.tar.gz New: ---- ruamel.yaml-0.15.78.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ python-ruamel.yaml.spec ++++++ --- /var/tmp/diff_new_pack.d6xGVq/_old 2018-12-03 10:09:52.191737850 +0100 +++ /var/tmp/diff_new_pack.d6xGVq/_new 2018-12-03 10:09:52.191737850 +0100 @@ -18,7 +18,7 @@ %{?!python_module:%define python_module() python-%{**} python3-%{**}} Name: python-ruamel.yaml -Version: 0.15.71 +Version: 0.15.78 Release: 0 Summary: Python YAML parser License: MIT ++++++ ruamel.yaml-0.15.71.tar.gz -> ruamel.yaml-0.15.78.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ruamel.yaml-0.15.71/CHANGES new/ruamel.yaml-0.15.78/CHANGES --- old/ruamel.yaml-0.15.71/CHANGES 2018-09-26 22:55:47.000000000 +0200 +++ new/ruamel.yaml-0.15.78/CHANGES 2018-11-15 17:41:48.000000000 +0100 @@ -1,3 +1,52 @@ +[0, 15, 78]: 2018-11-15 + - fix setup issue for 3.8 (reported by `Sidney Kuyateh + <https://bitbucket.org/autinerd/>`__) + +[0, 15, 77]: 2018-11-09 + - setting `yaml.sort_base_mapping_type_on_output = False`, will prevent + explicit sorting by keys in the base representer of mappings. Roundtrip + already did not do this. Usage only makes real sense for Python 3.6+ + (feature request by `Sebastian Gerber <https://bitbucket.org/spacemanspiff2007/>`__). + - implement Python version check in YAML metadata in ``_test/test_z_data.py`` + +[0, 15, 76]: 2018-11-01 + - fix issue with empty mapping and sequence loaded as flow-style + (mapping reported by `Min RK <https://bitbucket.org/minrk/>`__, sequence + by `Maged Ahmed <https://bitbucket.org/maged2/>`__) + +[0, 15, 75]: 2018-10-27 + - fix issue with single '?' scalar (reported by `Terrance + <https://bitbucket.org/OllieTerrance/>`__) + - fix issue with duplicate merge keys (prompted by `answering + <https://stackoverflow.com/a/52852106/1307905>`__ a + `StackOverflow question <https://stackoverflow.com/q/52851168/1307905>`__ + by `math <https://stackoverflow.com/users/1355634/math>`__) + +[0, 15, 75]: 2018-10-27 + - fix issue with single '?' scalar (reported by `Terrance + <https://bitbucket.org/OllieTerrance/>`__) + - fix issue with duplicate merge keys (prompted by `answering + <https://stackoverflow.com/a/52852106/1307905>`__ a + `StackOverflow question <https://stackoverflow.com/q/52851168/1307905>`__ + by `math <https://stackoverflow.com/users/1355634/math>`__) + +[0, 15, 74]: 2018-10-17 + - fix dropping of comment on rt before sequence item that is sequence item + (reported by `Thorsten Kampe <https://bitbucket.org/thorstenkampe/>`__) + +[0, 15, 73]: 2018-10-16 + - fix irregular output on pre-comment in sequence within sequence (reported + by `Thorsten Kampe <https://bitbucket.org/thorstenkampe/>`__) + - allow non-compact (i.e. next line) dumping sequence/mapping within sequence. + +[0, 15, 72]: 2018-10-06 + - fix regression on explicit 1.1 loading with the C based scanner/parser + (reported by `Tomas Vavra <https://bitbucket.org/xtomik/>`__) + +[0, 15, 72]: 2018-10-06 + - fix regression on explicit 1.1 loading with the C based scanner/parser + (reported by `Tomas Vavra <https://bitbucket.org/xtomik/>`__) + [0, 15, 71]: 2018-09-26 - fix regression where handcrafted CommentedMaps could not be initiated (reported by `Dan Helfman <https://bitbucket.org/dhelfman/>`__) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ruamel.yaml-0.15.71/PKG-INFO new/ruamel.yaml-0.15.78/PKG-INFO --- old/ruamel.yaml-0.15.71/PKG-INFO 2018-09-26 23:05:18.000000000 +0200 +++ new/ruamel.yaml-0.15.78/PKG-INFO 2018-11-15 17:57:44.000000000 +0100 @@ -1,6 +1,6 @@ Metadata-Version: 1.1 Name: ruamel.yaml -Version: 0.15.71 +Version: 0.15.78 Summary: ruamel.yaml is a YAML parser/emitter that supports roundtrip preservation of comments, seq/map flow style, and map key order Home-page: https://bitbucket.org/ruamel/yaml Author: Anthon van der Neut @@ -12,8 +12,8 @@ ``ruamel.yaml`` is a YAML 1.2 loader/dumper package for Python. - :version: 0.15.71 - :updated: 2018-09-26 + :version: 0.15.78 + :updated: 2018-11-15 :documentation: http://yaml.readthedocs.io :repository: https://bitbucket.org/ruamel/ :pypi: https://pypi.org/project/ruamel.yaml/ @@ -27,7 +27,7 @@ but new functionality is likely only to be available via the new API. If your package uses ``ruamel.yaml`` and is not listed on PyPI, drop - me an email, preferably with some infomormation on how you use the + me an email, preferably with some information on how you use the package (or a link to bitbucket/github) and I'll keep you informed when the status of the API is stable enough to make the transition. @@ -62,6 +62,43 @@ .. should insert NEXT: at the beginning of line for next key (with empty line) + 0.15.78 (2018-11-15): + - fix setup issue for 3.8 (reported by `Sidney Kuyateh + <https://bitbucket.org/autinerd/>`__) + + 0.15.77 (2018-11-09): + - setting `yaml.sort_base_mapping_type_on_output = False`, will prevent + explicit sorting by keys in the base representer of mappings. Roundtrip + already did not do this. Usage only makes real sense for Python 3.6+ + (feature request by `Sebastian Gerber <https://bitbucket.org/spacemanspiff2007/>`__). + - implement Python version check in YAML metadata in ``_test/test_z_data.py`` + + 0.15.76 (2018-11-01): + - fix issue with empty mapping and sequence loaded as flow-style + (mapping reported by `Min RK <https://bitbucket.org/minrk/>`__, sequence + by `Maged Ahmed <https://bitbucket.org/maged2/>`__) + + 0.15.75 (2018-10-27): + - fix issue with single '?' scalar (reported by `Terrance + <https://bitbucket.org/OllieTerrance/>`__) + - fix issue with duplicate merge keys (prompted by `answering + <https://stackoverflow.com/a/52852106/1307905>`__ a + `StackOverflow question <https://stackoverflow.com/q/52851168/1307905>`__ + by `math <https://stackoverflow.com/users/1355634/math>`__) + + 0.15.74 (2018-10-17): + - fix dropping of comment on rt before sequence item that is sequence item + (reported by `Thorsten Kampe <https://bitbucket.org/thorstenkampe/>`__) + + 0.15.73 (2018-10-16): + - fix irregular output on pre-comment in sequence within sequence (reported + by `Thorsten Kampe <https://bitbucket.org/thorstenkampe/>`__) + - allow non-compact (i.e. next line) dumping sequence/mapping within sequence. + + 0.15.72 (2018-10-06): + - fix regression on explicit 1.1 loading with the C based scanner/parser + (reported by `Tomas Vavra <https://bitbucket.org/xtomik/>`__) + 0.15.71 (2018-09-26): - some of the tests now live in YAML files in the `yaml.data <https://bitbucket.org/ruamel/yaml.data>`__ repository. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ruamel.yaml-0.15.71/README.rst new/ruamel.yaml-0.15.78/README.rst --- old/ruamel.yaml-0.15.71/README.rst 2018-09-26 23:04:41.000000000 +0200 +++ new/ruamel.yaml-0.15.78/README.rst 2018-11-15 17:41:48.000000000 +0100 @@ -4,8 +4,8 @@ ``ruamel.yaml`` is a YAML 1.2 loader/dumper package for Python. -:version: 0.15.71 -:updated: 2018-09-26 +:version: 0.15.78 +:updated: 2018-11-15 :documentation: http://yaml.readthedocs.io :repository: https://bitbucket.org/ruamel/ :pypi: https://pypi.org/project/ruamel.yaml/ @@ -19,7 +19,7 @@ but new functionality is likely only to be available via the new API. If your package uses ``ruamel.yaml`` and is not listed on PyPI, drop -me an email, preferably with some infomormation on how you use the +me an email, preferably with some information on how you use the package (or a link to bitbucket/github) and I'll keep you informed when the status of the API is stable enough to make the transition. @@ -54,6 +54,43 @@ .. should insert NEXT: at the beginning of line for next key (with empty line) +0.15.78 (2018-11-15): + - fix setup issue for 3.8 (reported by `Sidney Kuyateh + <https://bitbucket.org/autinerd/>`__) + +0.15.77 (2018-11-09): + - setting `yaml.sort_base_mapping_type_on_output = False`, will prevent + explicit sorting by keys in the base representer of mappings. Roundtrip + already did not do this. Usage only makes real sense for Python 3.6+ + (feature request by `Sebastian Gerber <https://bitbucket.org/spacemanspiff2007/>`__). + - implement Python version check in YAML metadata in ``_test/test_z_data.py`` + +0.15.76 (2018-11-01): + - fix issue with empty mapping and sequence loaded as flow-style + (mapping reported by `Min RK <https://bitbucket.org/minrk/>`__, sequence + by `Maged Ahmed <https://bitbucket.org/maged2/>`__) + +0.15.75 (2018-10-27): + - fix issue with single '?' scalar (reported by `Terrance + <https://bitbucket.org/OllieTerrance/>`__) + - fix issue with duplicate merge keys (prompted by `answering + <https://stackoverflow.com/a/52852106/1307905>`__ a + `StackOverflow question <https://stackoverflow.com/q/52851168/1307905>`__ + by `math <https://stackoverflow.com/users/1355634/math>`__) + +0.15.74 (2018-10-17): + - fix dropping of comment on rt before sequence item that is sequence item + (reported by `Thorsten Kampe <https://bitbucket.org/thorstenkampe/>`__) + +0.15.73 (2018-10-16): + - fix irregular output on pre-comment in sequence within sequence (reported + by `Thorsten Kampe <https://bitbucket.org/thorstenkampe/>`__) + - allow non-compact (i.e. next line) dumping sequence/mapping within sequence. + +0.15.72 (2018-10-06): + - fix regression on explicit 1.1 loading with the C based scanner/parser + (reported by `Tomas Vavra <https://bitbucket.org/xtomik/>`__) + 0.15.71 (2018-09-26): - some of the tests now live in YAML files in the `yaml.data <https://bitbucket.org/ruamel/yaml.data>`__ repository. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ruamel.yaml-0.15.71/__init__.py new/ruamel.yaml-0.15.78/__init__.py --- old/ruamel.yaml-0.15.71/__init__.py 2018-09-26 22:55:47.000000000 +0200 +++ new/ruamel.yaml-0.15.78/__init__.py 2018-11-15 17:41:48.000000000 +0100 @@ -7,8 +7,8 @@ _package_data = dict( full_package_name='ruamel.yaml', - version_info=(0, 15, 71), - __version__='0.15.71', + version_info=(0, 15, 78), + __version__='0.15.78', author='Anthon van der Neut', author_email='a.van.der.n...@ruamel.eu', description='ruamel.yaml is a YAML parser/emitter that supports roundtrip preservation of comments, seq/map flow style, and map key order', # NOQA diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ruamel.yaml-0.15.71/anchor.py new/ruamel.yaml-0.15.78/anchor.py --- old/ruamel.yaml-0.15.71/anchor.py 1970-01-01 01:00:00.000000000 +0100 +++ new/ruamel.yaml-0.15.78/anchor.py 2018-11-15 15:46:06.000000000 +0100 @@ -0,0 +1,13 @@ + + +anchor_attrib = '_yaml_anchor' + + +class Anchor(object): + __slots__ = 'value', 'always_dump' + attrib = anchor_attrib + + def __init__(self): + # type: () -> None + self.value = None + self.always_dump = False diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ruamel.yaml-0.15.71/comments.py new/ruamel.yaml-0.15.78/comments.py --- old/ruamel.yaml-0.15.71/comments.py 2018-09-26 08:56:18.000000000 +0200 +++ new/ruamel.yaml-0.15.78/comments.py 2018-11-15 15:46:06.000000000 +0100 @@ -14,6 +14,7 @@ from ruamel.yaml.compat import ordereddict, PY2, string_types, MutableSliceableSequence from ruamel.yaml.scalarstring import ScalarString +from ruamel.yaml.anchor import Anchor if PY2: from collections import MutableSet, Sized, Set, MutableMapping, Mapping @@ -24,15 +25,14 @@ from typing import Any, Dict, Optional, List, Union, Optional, Iterator # NOQA # fmt: off -__all__ = ["CommentedSeq", "CommentedKeySeq", - "CommentedMap", "CommentedOrderedMap", - "CommentedSet", 'comment_attrib', 'merge_attrib'] +__all__ = ['CommentedSeq', 'CommentedKeySeq', + 'CommentedMap', 'CommentedOrderedMap', + 'CommentedSet', 'comment_attrib', 'merge_attrib'] # fmt: on comment_attrib = '_yaml_comment' format_attrib = '_yaml_format' line_col_attrib = '_yaml_line_col' -anchor_attrib = '_yaml_anchor' merge_attrib = '_yaml_merge' tag_attrib = '_yaml_tag' @@ -163,16 +163,6 @@ self.data[key] = data -class Anchor(object): - __slots__ = 'value', 'always_dump' - attrib = anchor_attrib - - def __init__(self): - # type: () -> None - self.value = None - self.always_dump = False - - class Tag(object): """store tag information for roundtripping""" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ruamel.yaml-0.15.71/compat.py new/ruamel.yaml-0.15.78/compat.py --- old/ruamel.yaml-0.15.71/compat.py 2018-09-21 20:01:48.000000000 +0200 +++ new/ruamel.yaml-0.15.78/compat.py 2018-11-15 15:46:06.000000000 +0100 @@ -186,18 +186,22 @@ class Nprint(object): - def __init__(self): - # type: () -> None + def __init__(self, file_name=None): + # type: (Any) -> None self._max_print = None # type: Any self._count = None # type: Any + self._file_name = file_name def __call__(self, *args, **kw): # type: (Any, Any) -> None if not bool(_debug): return + out = sys.stdout if self._file_name is None else open(self._file_name, 'a') dbgprint = print # to fool checking for print statements by dv utility - dbgprint(*args, **kw) - sys.stdout.flush() + kw1 = kw.copy() + kw1['file'] = out + dbgprint(*args, **kw1) + out.flush() if self._max_print is not None: if self._count is None: self._count = self._max_print @@ -205,8 +209,10 @@ if self._count == 0: dbgprint('forced exit\n') traceback.print_stack() - sys.stdout.flush() + out.flush() sys.exit(0) + if self._file_name: + out.close() def set_max_print(self, i): # type: (int) -> None @@ -215,7 +221,7 @@ nprint = Nprint() - +nprintf = Nprint('/var/tmp/ruamel.yaml.log') # char checkers following production rules diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ruamel.yaml-0.15.71/composer.py new/ruamel.yaml-0.15.78/composer.py --- old/ruamel.yaml-0.15.71/composer.py 2018-09-21 11:00:21.000000000 +0200 +++ new/ruamel.yaml-0.15.78/composer.py 2018-11-15 15:46:06.000000000 +0100 @@ -5,7 +5,7 @@ import warnings from ruamel.yaml.error import MarkedYAMLError, ReusedAnchorWarning -from ruamel.yaml.compat import utf8, nprint +from ruamel.yaml.compat import utf8, nprint, nprintf # NOQA from ruamel.yaml.events import ( StreamStartEvent, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ruamel.yaml-0.15.71/constructor.py new/ruamel.yaml-0.15.78/constructor.py --- old/ruamel.yaml-0.15.71/constructor.py 2018-09-26 22:43:46.000000000 +0200 +++ new/ruamel.yaml-0.15.78/constructor.py 2018-11-15 15:46:06.000000000 +0100 @@ -16,8 +16,8 @@ from ruamel.yaml.nodes import * # NOQA from ruamel.yaml.nodes import (SequenceNode, MappingNode, ScalarNode) from ruamel.yaml.compat import (utf8, builtins_module, to_str, PY2, PY3, # NOQA - ordereddict, text_type, nprint, version_tnf, Hashable, - MutableSequence, MutableMapping) + ordereddict, text_type, nprint, nprintf, version_tnf, + Hashable, MutableSequence, MutableMapping) from ruamel.yaml.comments import * # NOQA from ruamel.yaml.comments import (CommentedMap, CommentedOrderedMap, CommentedSet, CommentedKeySeq, CommentedSeq, TaggedScalar, @@ -353,6 +353,25 @@ while index < len(node.value): key_node, value_node = node.value[index] if key_node.tag == u'tag:yaml.org,2002:merge': + if merge: # double << key + args = [ + 'while constructing a mapping', + node.start_mark, + 'found duplicate key "{}"'.format(key_node.value), + key_node.start_mark, + """ + To suppress this check see: + http://yaml.readthedocs.io/en/latest/api.html#duplicate-keys + """, + """\ + Duplicate keys will become an error in future releases, and are errors + by default when using the new API. + """, + ] + if self.allow_duplicate_keys is None: + warnings.warn(DuplicateKeyFutureWarning(*args)) + else: + raise DuplicateKeyError(*args) del node.value[index] if isinstance(value_node, MappingNode): self.flatten_mapping(value_node) @@ -820,7 +839,7 @@ __import__(module_name) # object_name = '.'.join(object_name) break - except ImportError as exc: + except ImportError: continue else: module_name = builtins_module @@ -1270,11 +1289,30 @@ return value # merge = [] - merge_map_list = [] + merge_map_list = [] # type: List[Any] index = 0 while index < len(node.value): key_node, value_node = node.value[index] if key_node.tag == u'tag:yaml.org,2002:merge': + if merge_map_list: # double << key + args = [ + 'while constructing a mapping', + node.start_mark, + 'found duplicate key "{}"'.format(key_node.value), + key_node.start_mark, + """ + To suppress this check see: + http://yaml.readthedocs.io/en/latest/api.html#duplicate-keys + """, + """\ + Duplicate keys will become an error in future releases, and are errors + by default when using the new API. + """, + ] + if self.allow_duplicate_keys is None: + warnings.warn(DuplicateKeyFutureWarning(*args)) + else: + raise DuplicateKeyError(*args) del node.value[index] if isinstance(value_node, MappingNode): merge_map_list.append((index, constructed(value_node))) @@ -1456,25 +1494,28 @@ # type: (Any) -> Any data = CommentedSeq() data._yaml_set_line_col(node.start_mark.line, node.start_mark.column) - if node.flow_style is True: - data.fa.set_flow_style() - elif node.flow_style is False: - data.fa.set_block_style() if node.comment: data._yaml_add_comment(node.comment) yield data data.extend(self.construct_rt_sequence(node, data)) + self.set_collection_style(data, node) def construct_yaml_map(self, node): # type: (Any) -> Any data = CommentedMap() data._yaml_set_line_col(node.start_mark.line, node.start_mark.column) + yield data + self.construct_mapping(node, data) + self.set_collection_style(data, node) + + def set_collection_style(self, data, node): + # type: (Any, Any) -> None + if len(data) == 0: + return if node.flow_style is True: data.fa.set_flow_style() elif node.flow_style is False: data.fa.set_block_style() - yield data - self.construct_mapping(node, data) def construct_yaml_object(self, node, cls): # type: (Any, Any) -> Any diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ruamel.yaml-0.15.71/emitter.py new/ruamel.yaml-0.15.78/emitter.py --- old/ruamel.yaml-0.15.71/emitter.py 2018-09-26 22:01:33.000000000 +0200 +++ new/ruamel.yaml-0.15.78/emitter.py 2018-11-15 15:46:06.000000000 +0100 @@ -156,6 +156,9 @@ self.column = 0 self.whitespace = True self.indention = True + self.compact_seq_seq = True # dash after dash + self.compact_seq_map = True # key after dash + # self.compact_ms = False # dash after key, only when excplicit key with ? self.no_newline = None # type: Optional[bool] # set if directly after `- ` # Whether the document requires an explicit document indicator @@ -404,14 +407,17 @@ if isinstance(self.event, ScalarEvent): self.expect_scalar() elif isinstance(self.event, SequenceStartEvent): + # nprintf('@', self.indention, self.no_newline, self.column) + i2, n2 = self.indention, self.no_newline # NOQA if self.event.comment: if self.event.flow_style is False and self.event.comment: if self.write_post_comment(self.event): self.indention = False self.no_newline = True if self.write_pre_comment(self.event): - self.indention = False - self.no_newline = True + pass + self.indention = i2 + self.no_newline = not self.indention if ( self.flow_level or self.canonical @@ -593,7 +599,12 @@ def expect_block_sequence(self): # type: () -> None - indentless = self.mapping_context and not self.indention + if self.mapping_context: + indentless = not self.indention + else: + indentless = False + if not self.compact_seq_seq and self.column != 0: + self.write_line_break() self.increase_indent(flow=False, sequence=True, indentless=indentless) self.state = self.expect_first_block_sequence_item @@ -626,6 +637,8 @@ def expect_block_mapping(self): # type: () -> None + if not self.mapping_context and not (self.compact_seq_map or self.column == 0): + self.write_line_break() self.increase_indent(flow=False, sequence=False) self.state = self.expect_first_block_mapping_key @@ -1011,6 +1024,8 @@ if ch in u'?:': # ToDo if self.serializer.use_version == (1, 1): flow_indicators = True + elif len(scalar) == 1: # single character + flow_indicators = True if followed_by_whitespace: block_indicators = True if ch == u'-' and followed_by_whitespace: @@ -1574,11 +1589,11 @@ breaks = ch in u'\n\x85\u2028\u2029' end += 1 - def write_comment(self, comment): - # type: (Any) -> None + def write_comment(self, comment, pre=False): + # type: (Any, bool) -> None value = comment.value - # nprint('{:02d} {:02d} {!r}'.format(self.column, comment.start_mark.column, value)) - if value[-1] == '\n': + # nprintf('{:02d} {:02d} {!r}'.format(self.column, comment.start_mark.column, value)) + if not pre and value[-1] == '\n': value = value[:-1] try: # get original column position @@ -1607,7 +1622,8 @@ self.stream.write(value) except TypeError: raise - self.write_line_break() + if not pre: + self.write_line_break() def write_pre_comment(self, event): # type: (Any) -> bool @@ -1621,7 +1637,7 @@ continue if self.column != 0: self.write_line_break() - self.write_comment(comment) + self.write_comment(comment, pre=True) if isinstance(event, start_events): comment.pre_done = True except TypeError: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ruamel.yaml-0.15.71/main.py new/ruamel.yaml-0.15.78/main.py --- old/ruamel.yaml-0.15.71/main.py 2018-09-21 11:00:21.000000000 +0200 +++ new/ruamel.yaml-0.15.78/main.py 2018-11-15 15:46:06.000000000 +0100 @@ -146,6 +146,9 @@ self.map_indent = None self.sequence_indent = None self.sequence_dash_offset = 0 + self.compact_seq_seq = None + self.compact_seq_map = None + self.sort_base_mapping_type_on_output = None # default: sort self.top_level_colon_align = None self.prefix_colon = None @@ -252,6 +255,10 @@ if self.sequence_dash_offset is not None: _emitter.sequence_dash_offset = self.sequence_dash_offset # _emitter.block_seq_indent = self.sequence_dash_offset + if self.compact_seq_seq is not None: + _emitter.compact_seq_seq = self.compact_seq_seq + if self.compact_seq_map is not None: + _emitter.compact_seq_map = self.compact_seq_map else: if getattr(self, '_stream', None) is None: # wait for the stream @@ -283,15 +290,14 @@ # type: () -> Any attr = '_' + sys._getframe().f_code.co_name if not hasattr(self, attr): - setattr( - self, - attr, - self.Representer( - default_style=self.default_style, - default_flow_style=self.default_flow_style, - dumper=self, - ), + repres = self.Representer( + default_style=self.default_style, + default_flow_style=self.default_flow_style, + dumper=self, ) + if self.sort_base_mapping_type_on_output is not None: + repres.sort_base_mapping_type_on_output = self.sort_base_mapping_type_on_output + setattr(self, attr, repres) return getattr(self, attr) # separate output resolver? @@ -394,17 +400,17 @@ # if you just initialise the CParser, to much of resolver.py # is actually used rslvr = self.Resolver - if rslvr is ruamel.yaml.resolver.VersionedResolver: - rslvr = ruamel.yaml.resolver.Resolver + # if rslvr is ruamel.yaml.resolver.VersionedResolver: + # rslvr = ruamel.yaml.resolver.Resolver class XLoader(self.Parser, self.Constructor, rslvr): # type: ignore - def __init__(selfx, stream, version=None, preserve_quotes=None): + def __init__(selfx, stream, version=self.version, preserve_quotes=None): # type: (StreamTextType, Optional[VersionType], Optional[bool]) -> None # NOQA CParser.__init__(selfx, stream) selfx._parser = selfx._composer = selfx self.Constructor.__init__(selfx, loader=selfx) selfx.allow_duplicate_keys = self.allow_duplicate_keys - rslvr.__init__(selfx, loadumper=selfx) + rslvr.__init__(selfx, version=version, loadumper=selfx) self._stream = stream loader = XLoader(stream) @@ -709,6 +715,11 @@ # type: (Any) -> None self.sequence_dash_offset = val + def compact(self, seq_seq=None, seq_map=None): + # type: (Any, Any) -> None + self.compact_seq_seq = seq_seq + self.compact_seq_map = seq_map + class YAMLContextManager(object): def __init__(self, yaml, transform=None): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ruamel.yaml-0.15.71/nodes.py new/ruamel.yaml-0.15.78/nodes.py --- old/ruamel.yaml-0.15.71/nodes.py 2018-09-21 11:00:21.000000000 +0200 +++ new/ruamel.yaml-0.15.78/nodes.py 2018-11-15 15:46:06.000000000 +0100 @@ -12,14 +12,14 @@ class Node(object): __slots__ = 'tag', 'value', 'start_mark', 'end_mark', 'comment', 'anchor' - def __init__(self, tag, value, start_mark, end_mark, comment=None): - # type: (Any, Any, Any, Any, Any) -> None + def __init__(self, tag, value, start_mark, end_mark, comment=None, anchor=None): + # type: (Any, Any, Any, Any, Any, Any) -> None self.tag = tag self.value = value self.start_mark = start_mark self.end_mark = end_mark self.comment = comment - self.anchor = None + self.anchor = anchor def __repr__(self): # type: () -> str @@ -78,14 +78,15 @@ __slots__ = ('style',) id = 'scalar' - def __init__(self, tag, value, start_mark=None, end_mark=None, style=None, comment=None): - # type: (Any, Any, Any, Any, Any, Any) -> None - Node.__init__(self, tag, value, start_mark, end_mark, comment=comment) + def __init__(self, tag, value, start_mark=None, end_mark=None, style=None, comment=None, + anchor=None): + # type: (Any, Any, Any, Any, Any, Any, Any) -> None + Node.__init__(self, tag, value, start_mark, end_mark, comment=comment, anchor=anchor) self.style = style class CollectionNode(Node): - __slots__ = 'flow_style', 'anchor' + __slots__ = ('flow_style', ) def __init__( self, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ruamel.yaml-0.15.71/parser.py new/ruamel.yaml-0.15.78/parser.py --- old/ruamel.yaml-0.15.71/parser.py 2018-09-21 11:00:21.000000000 +0200 +++ new/ruamel.yaml-0.15.78/parser.py 2018-11-15 15:46:06.000000000 +0100 @@ -80,7 +80,7 @@ from ruamel.yaml.tokens import * # NOQA from ruamel.yaml.events import * # NOQA from ruamel.yaml.scanner import Scanner, RoundTripScanner, ScannerError # NOQA -from ruamel.yaml.compat import utf8, nprint # NOQA +from ruamel.yaml.compat import utf8, nprint, nprintf # NOQA if False: # MYPY from typing import Any, Dict, Optional, List # NOQA diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ruamel.yaml-0.15.71/representer.py new/ruamel.yaml-0.15.78/representer.py --- old/ruamel.yaml-0.15.71/representer.py 2018-09-26 22:25:27.000000000 +0200 +++ new/ruamel.yaml-0.15.78/representer.py 2018-11-15 15:46:06.000000000 +0100 @@ -6,6 +6,7 @@ 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, @@ -64,6 +65,7 @@ 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): @@ -208,10 +210,11 @@ best_style = True if hasattr(mapping, 'items'): mapping = list(mapping.items()) - try: - mapping = sorted(mapping) - except TypeError: - pass + 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) @@ -889,17 +892,33 @@ item_comments = {} for idx, item in enumerate(sequence): node_item = self.represent_data(item) - node_item.comment = item_comments.get(idx) + 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 self.default_flow_style is not 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): @@ -944,11 +963,13 @@ except AttributeError: item_comments = {} merge_list = [m[1] for m in getattr(mapping, merge_attrib, [])] + 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) @@ -967,7 +988,7 @@ best_style = False value.append((node_key, node_value)) if flow_style is None: - if self.default_flow_style is not 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 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ruamel.yaml-0.15.71/resolver.py new/ruamel.yaml-0.15.78/resolver.py --- old/ruamel.yaml-0.15.71/resolver.py 2018-09-21 11:00:21.000000000 +0200 +++ new/ruamel.yaml-0.15.78/resolver.py 2018-11-15 15:46:06.000000000 +0100 @@ -316,8 +316,10 @@ and Yes/No/On/Off booleans. """ - def __init__(self, version=None, loader=None): - # type: (Optional[VersionType], Any) -> None + def __init__(self, version=None, loader=None, loadumper=None): + # type: (Optional[VersionType], Any, Any) -> None + if loader is None and loadumper is not None: + loader = loadumper BaseResolver.__init__(self, loader) self._loader_version = self.get_loader_version(version) self._version_implicit_resolver = {} # type: Dict[Any, Any] @@ -383,10 +385,13 @@ try: version = self.parser.yaml_version except AttributeError: - if hasattr(self.loadumper, 'typ'): - version = self.loadumper.version - else: - version = self.loadumper._serializer.use_version # dumping + try: + if hasattr(self.loadumper, 'typ'): + version = self.loadumper.version + else: + version = self.loadumper._serializer.use_version # dumping + except AttributeError: + version = None if version is None: version = self._loader_version if version is None: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ruamel.yaml-0.15.71/ruamel.yaml.egg-info/PKG-INFO new/ruamel.yaml-0.15.78/ruamel.yaml.egg-info/PKG-INFO --- old/ruamel.yaml-0.15.71/ruamel.yaml.egg-info/PKG-INFO 2018-09-26 23:05:18.000000000 +0200 +++ new/ruamel.yaml-0.15.78/ruamel.yaml.egg-info/PKG-INFO 2018-11-15 17:57:41.000000000 +0100 @@ -1,6 +1,6 @@ Metadata-Version: 1.1 Name: ruamel.yaml -Version: 0.15.71 +Version: 0.15.78 Summary: ruamel.yaml is a YAML parser/emitter that supports roundtrip preservation of comments, seq/map flow style, and map key order Home-page: https://bitbucket.org/ruamel/yaml Author: Anthon van der Neut @@ -12,8 +12,8 @@ ``ruamel.yaml`` is a YAML 1.2 loader/dumper package for Python. - :version: 0.15.71 - :updated: 2018-09-26 + :version: 0.15.78 + :updated: 2018-11-15 :documentation: http://yaml.readthedocs.io :repository: https://bitbucket.org/ruamel/ :pypi: https://pypi.org/project/ruamel.yaml/ @@ -27,7 +27,7 @@ but new functionality is likely only to be available via the new API. If your package uses ``ruamel.yaml`` and is not listed on PyPI, drop - me an email, preferably with some infomormation on how you use the + me an email, preferably with some information on how you use the package (or a link to bitbucket/github) and I'll keep you informed when the status of the API is stable enough to make the transition. @@ -62,6 +62,43 @@ .. should insert NEXT: at the beginning of line for next key (with empty line) + 0.15.78 (2018-11-15): + - fix setup issue for 3.8 (reported by `Sidney Kuyateh + <https://bitbucket.org/autinerd/>`__) + + 0.15.77 (2018-11-09): + - setting `yaml.sort_base_mapping_type_on_output = False`, will prevent + explicit sorting by keys in the base representer of mappings. Roundtrip + already did not do this. Usage only makes real sense for Python 3.6+ + (feature request by `Sebastian Gerber <https://bitbucket.org/spacemanspiff2007/>`__). + - implement Python version check in YAML metadata in ``_test/test_z_data.py`` + + 0.15.76 (2018-11-01): + - fix issue with empty mapping and sequence loaded as flow-style + (mapping reported by `Min RK <https://bitbucket.org/minrk/>`__, sequence + by `Maged Ahmed <https://bitbucket.org/maged2/>`__) + + 0.15.75 (2018-10-27): + - fix issue with single '?' scalar (reported by `Terrance + <https://bitbucket.org/OllieTerrance/>`__) + - fix issue with duplicate merge keys (prompted by `answering + <https://stackoverflow.com/a/52852106/1307905>`__ a + `StackOverflow question <https://stackoverflow.com/q/52851168/1307905>`__ + by `math <https://stackoverflow.com/users/1355634/math>`__) + + 0.15.74 (2018-10-17): + - fix dropping of comment on rt before sequence item that is sequence item + (reported by `Thorsten Kampe <https://bitbucket.org/thorstenkampe/>`__) + + 0.15.73 (2018-10-16): + - fix irregular output on pre-comment in sequence within sequence (reported + by `Thorsten Kampe <https://bitbucket.org/thorstenkampe/>`__) + - allow non-compact (i.e. next line) dumping sequence/mapping within sequence. + + 0.15.72 (2018-10-06): + - fix regression on explicit 1.1 loading with the C based scanner/parser + (reported by `Tomas Vavra <https://bitbucket.org/xtomik/>`__) + 0.15.71 (2018-09-26): - some of the tests now live in YAML files in the `yaml.data <https://bitbucket.org/ruamel/yaml.data>`__ repository. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ruamel.yaml-0.15.71/ruamel.yaml.egg-info/SOURCES.txt new/ruamel.yaml-0.15.78/ruamel.yaml.egg-info/SOURCES.txt --- old/ruamel.yaml-0.15.71/ruamel.yaml.egg-info/SOURCES.txt 2018-09-26 23:05:18.000000000 +0200 +++ new/ruamel.yaml-0.15.78/ruamel.yaml.egg-info/SOURCES.txt 2018-11-15 17:57:41.000000000 +0100 @@ -5,6 +5,7 @@ setup.py ./LICENSE ./__init__.py +./anchor.py ./comments.py ./compat.py ./composer.py diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ruamel.yaml-0.15.71/scalarstring.py new/ruamel.yaml-0.15.78/scalarstring.py --- old/ruamel.yaml-0.15.71/scalarstring.py 2018-09-21 11:00:21.000000000 +0200 +++ new/ruamel.yaml-0.15.78/scalarstring.py 2018-11-15 15:46:06.000000000 +0100 @@ -3,6 +3,7 @@ from __future__ import print_function, absolute_import, division, unicode_literals from ruamel.yaml.compat import text_type +from ruamel.yaml.anchor import Anchor if False: # MYPY from typing import Text, Any, Dict, List # NOQA @@ -20,7 +21,7 @@ class ScalarString(text_type): - __slots__ = () + __slots__ = (Anchor.attrib) def __new__(cls, *args, **kw): # type: (Any, Any) -> Any @@ -30,6 +31,26 @@ # type: (Any, Any, int) -> Any return type(self)((text_type.replace(self, old, new, maxreplace))) + @property + def anchor(self): + # type: () -> Any + if not hasattr(self, Anchor.attrib): + setattr(self, Anchor.attrib, Anchor()) + return getattr(self, Anchor.attrib) + + def yaml_anchor(self): + # type: () -> Any + if not hasattr(self, Anchor.attrib): + return None + if not self.anchor.always_dump: + return None + return self.anchor + + def yaml_set_anchor(self, value, always_dump=False): + # type: (Any, bool) -> None + self.anchor.value = value + self.anchor.always_dump = always_dump + class LiteralScalarString(ScalarString): __slots__ = 'comment' # the comment after the | on the first line diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ruamel.yaml-0.15.71/serializer.py new/ruamel.yaml-0.15.78/serializer.py --- old/ruamel.yaml-0.15.71/serializer.py 2018-09-21 11:00:21.000000000 +0200 +++ new/ruamel.yaml-0.15.78/serializer.py 2018-11-15 15:46:06.000000000 +0100 @@ -3,7 +3,7 @@ from __future__ import absolute_import from ruamel.yaml.error import YAMLError -from ruamel.yaml.compat import nprint, DBG_NODE, dbg, string_types +from ruamel.yaml.compat import nprint, DBG_NODE, dbg, string_types, nprintf # NOQA from ruamel.yaml.util import RegExp from ruamel.yaml.events import ( diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ruamel.yaml-0.15.71/setup.py new/ruamel.yaml-0.15.78/setup.py --- old/ruamel.yaml-0.15.71/setup.py 2018-09-26 09:06:04.000000000 +0200 +++ new/ruamel.yaml-0.15.78/setup.py 2018-11-15 17:41:33.000000000 +0100 @@ -44,6 +44,10 @@ class NameConstant: pass +if sys.version_info >= (3, 8): + + from ast import Str, Num, Bytes, NameConstant # NOQA + if sys.version_info < (3,): open_kw = dict() @@ -830,7 +834,7 @@ sources=[self.pn(x) for x in target['src']], libraries=[self.pn(x) for x in target.get('lib')], ) - # debug('test in target', 'test' in target, target) + # debug('test1 in target', 'test' in target, target) if 'test' not in target: # no test, just hope it works self._ext_modules.append(ext) continue @@ -871,8 +875,8 @@ print('compile error:', file_name) continue except LinkError: - debug('libyaml link error', file_name) - print('libyaml link error', file_name) + debug('link error', file_name) + print('link error', file_name) continue self._ext_modules.append(ext) except Exception as e: # NOQA @@ -893,10 +897,10 @@ https://bitbucket.org/pypa/wheel/issues/47 """ if 'bdist_wheel' not in sys.argv: - return + return False file_name = 'setup.cfg' if os.path.exists(file_name): # add it if not in there? - return + return False with open(file_name, 'w') as fp: if os.path.exists('LICENSE'): fp.write('[metadata]\nlicense-file = LICENSE\n') @@ -964,6 +968,8 @@ for k in sorted(kw): v = kw[k] print(' "{0}": "{1}",'.format(k, v)) + # if '--record' in sys.argv: + # return if dump_kw in sys.argv: sys.argv.remove(dump_kw) try: @@ -971,7 +977,26 @@ kw['long_description'] = fp.read() except Exception: pass + if nsp.wheel(kw, setup): + if nsp.nested and 'bdist_wheel' in sys.argv: + try: + d = sys.argv[sys.argv.index('-d') + 1] + except ValueError: + dist_base = os.environ.get('PYDISTBASE') + if dist_base: + d = os.path.join(dist_base, nsp.full_package_name) + else: + d = 'dist' + for x in os.listdir(d): + dashed_vs = '-' + version_str + '-' + if x.endswith('.whl') and dashed_vs in x: + # remove .pth file from the wheel + full_name = os.path.join(d, x) + print('patching .pth from', full_name) + with InMemoryZipFile(full_name) as imz: + imz.delete_from_zip_file(nsp.full_package_name + '.*.pth') + break return for x in ['-c', 'egg_info', '--egg-base', 'pip-egg-info']: if x not in sys.argv: @@ -1002,6 +1027,7 @@ if x.endswith('.whl'): # remove .pth file from the wheel full_name = os.path.join(d, x) + print('patching .pth from', full_name) with InMemoryZipFile(full_name) as imz: imz.delete_from_zip_file(nsp.full_package_name + '.*.pth') break