Exemple #1
0
 def construct_mapping(self, node, maptyp, deep=False):
     if not isinstance(node, MappingNode):
         raise ConstructorError(
             None, None, "expected a mapping node, but found %s" % node.id,
             node.start_mark)
     merge_map = self.flatten_mapping(node)
     # mapping = {}
     if node.comment:
         maptyp._yaml_add_comment(node.comment[:2])
         if len(node.comment) > 2:
             maptyp.yaml_end_comment_extend(node.comment[2], clear=True)
     if node.anchor:
         from ruamel.yaml.serializer import templated_id
         if not templated_id(node.anchor):
             maptyp.yaml_set_anchor(node.anchor)
     for key_node, value_node in node.value:
         # keys can be list -> deep
         key = self.construct_object(key_node, deep=True)
         # lists are not hashable, but tuples are
         if not isinstance(key, collections.Hashable):
             if isinstance(key, list):
                 key = tuple(key)
         if PY2:
             try:
                 hash(key)
             except TypeError as exc:
                 raise ConstructorError("while constructing a mapping",
                                        node.start_mark,
                                        "found unacceptable key (%s)" % exc,
                                        key_node.start_mark)
         else:
             if not isinstance(key, collections.Hashable):
                 raise ConstructorError("while constructing a mapping",
                                        node.start_mark,
                                        "found unhashable key",
                                        key_node.start_mark)
         value = self.construct_object(value_node, deep=deep)
         if key_node.comment:
             maptyp._yaml_add_comment(key_node.comment, key=key)
         if value_node.comment:
             maptyp._yaml_add_comment(value_node.comment, value=key)
         maptyp._yaml_set_kv_line_col(key, [
             key_node.start_mark.line, key_node.start_mark.column,
             value_node.start_mark.line, value_node.start_mark.column
         ])
         if key in maptyp:
             raise exceptions.DuplicateKeysDisallowed(
                 "While parsing",
                 key_node.start_mark,
                 "Duplicate key '{0}' found".format(key),
                 key_node.end_mark,
             )
         maptyp[key] = value
     # do this last, or <<: before a key will prevent insertion in instances
     # of collections.OrderedDict (as they have no __contains__
     if merge_map:
         maptyp.add_yaml_merge(merge_map)
Exemple #2
0
 def test_template_matcher(self):
     """test if id matches the anchor template"""
     from ruamel.yaml.serializer import templated_id
     assert templated_id(u'id001')
     assert templated_id(u'id999')
     assert templated_id(u'id1000')
     assert templated_id(u'id0001')
     assert templated_id(u'id0000')
     assert not templated_id(u'id02')
     assert not templated_id(u'id000')
     assert not templated_id(u'x000')
 def construct_mapping(self, node, maptyp, deep=False):
     if not isinstance(node, MappingNode):
         raise ConstructorError(
             None, None,
             "expected a mapping node, but found %s" % node.id,
             node.start_mark)
     merge_map = self.flatten_mapping(node)
     # mapping = {}
     if node.comment:
         maptyp._yaml_add_comment(node.comment[:2])
         if len(node.comment) > 2:
             maptyp.yaml_end_comment_extend(node.comment[2], clear=True)
     if node.anchor:
         from ruamel.yaml.serializer import templated_id
         if not templated_id(node.anchor):
             maptyp.yaml_set_anchor(node.anchor)
     for key_node, value_node in node.value:
         # keys can be list -> deep
         key = self.construct_object(key_node, deep=True)
         # lists are not hashable, but tuples are
         if not isinstance(key, collections.Hashable):
             if isinstance(key, list):
                 key = CommentedKeySeq(key)
                 if key_node.flow_style is True:
                     key.fa.set_flow_style()
                 elif key_node.flow_style is False:
                     key.fa.set_block_style()
                 # key = tuple(key)
         if PY2:
             try:
                 hash(key)
             except TypeError as exc:
                 raise ConstructorError(
                     "while constructing a mapping", node.start_mark,
                     "found unacceptable key (%s)" %
                     exc, key_node.start_mark)
         else:
             if not isinstance(key, collections.Hashable):
                 raise ConstructorError(
                     "while constructing a mapping", node.start_mark,
                     "found unhashable key", key_node.start_mark)
         value = self.construct_object(value_node, deep=deep)
         if key_node.comment:
             maptyp._yaml_add_comment(key_node.comment, key=key)
         if value_node.comment:
             maptyp._yaml_add_comment(value_node.comment, value=key)
         maptyp._yaml_set_kv_line_col(
             key, [key_node.start_mark.line, key_node.start_mark.column,
                   value_node.start_mark.line, value_node.start_mark.column])
         maptyp[key] = value
     # do this last, or <<: before a key will prevent insertion in instances
     # of collections.OrderedDict (as they have no __contains__
     if merge_map:
         maptyp.add_yaml_merge(merge_map)
 def construct_mapping(self, node, maptyp, deep=False):
     if not isinstance(node, MappingNode):
         raise ConstructorError(
             None, None, "expected a mapping node, but found %s" % node.id,
             node.start_mark)
     merge_map = self.flatten_mapping(node)
     if merge_map:
         maptyp.add_yaml_merge(merge_map)
     # mapping = {}
     if node.comment:
         maptyp._yaml_add_comment(node.comment[:2])
         if len(node.comment) > 2:
             maptyp.yaml_end_comment_extend(node.comment[2], clear=True)
     if node.anchor:
         from ruamel.yaml.serializer import templated_id
         if not templated_id(node.anchor):
             maptyp.yaml_set_anchor(node.anchor)
     for key_node, value_node in node.value:
         # keys can be list -> deep
         key = self.construct_object(key_node, deep=True)
         # lists are not hashable, but tuples are
         if not isinstance(key, collections.Hashable):
             if isinstance(key, list):
                 key = tuple(key)
         if PY2:
             try:
                 hash(key)
             except TypeError as exc:
                 raise ConstructorError("while constructing a mapping",
                                        node.start_mark,
                                        "found unacceptable key (%s)" % exc,
                                        key_node.start_mark)
         else:
             if not isinstance(key, collections.Hashable):
                 raise ConstructorError("while constructing a mapping",
                                        node.start_mark,
                                        "found unhashable key",
                                        key_node.start_mark)
         value = self.construct_object(value_node, deep=deep)
         if key_node.comment:
             maptyp._yaml_add_comment(key_node.comment, key=key)
         if value_node.comment:
             maptyp._yaml_add_comment(value_node.comment, value=key)
         maptyp._yaml_set_kv_line_col(key, [
             key_node.start_mark.line, key_node.start_mark.column,
             value_node.start_mark.line, value_node.start_mark.column
         ])
         maptyp[key] = value
Exemple #5
0
 def construct_sequence(self, node, seqtyp, deep=False):
     if not isinstance(node, SequenceNode):
         raise ConstructorError(
             None, None, "expected a sequence node, but found %s" % node.id,
             node.start_mark)
     ret_val = []
     if node.comment:
         seqtyp._yaml_add_comment(node.comment[:2])
         if len(node.comment) > 2:
             seqtyp.yaml_end_comment_extend(node.comment[2], clear=True)
     if node.anchor:
         from ruamel.yaml.serializer import templated_id
         if not templated_id(node.anchor):
             seqtyp.yaml_set_anchor(node.anchor)
     for idx, child in enumerate(node.value):
         ret_val.append(self.construct_object(child, deep=deep))
         if child.comment:
             seqtyp._yaml_add_comment(child.comment, key=idx)
         seqtyp._yaml_set_idx_line_col(
             idx, [child.start_mark.line, child.start_mark.column])
     return ret_val
Exemple #6
0
 def construct_setting(self, node, typ, deep=False):
     if not isinstance(node, MappingNode):
         raise ConstructorError(
             None, None,
             "expected a mapping node, but found %s" % node.id,
             node.start_mark)
     if node.comment:
         typ._yaml_add_comment(node.comment[:2])
         if len(node.comment) > 2:
             typ.yaml_end_comment_extend(node.comment[2], clear=True)
     if node.anchor:
         from ruamel.yaml.serializer import templated_id
         if not templated_id(node.anchor):
             typ.yaml_set_anchor(node.anchor)
     for key_node, value_node in node.value:
         # keys can be list -> deep
         key = self.construct_object(key_node, deep=True)
         # lists are not hashable, but tuples are
         if not isinstance(key, collections.Hashable):
             if isinstance(key, list):
                 key = tuple(key)
         if PY2:
             try:
                 hash(key)
             except TypeError as exc:
                 raise ConstructorError(
                     "while constructing a mapping", node.start_mark,
                     "found unacceptable key (%s)" %
                     exc, key_node.start_mark)
         else:
             if not isinstance(key, collections.Hashable):
                 raise ConstructorError(
                     "while constructing a mapping", node.start_mark,
                     "found unhashable key", key_node.start_mark)
         value = self.construct_object(value_node, deep=deep)  # NOQA
         if key_node.comment:
             typ._yaml_add_comment(key_node.comment, key=key)
         if value_node.comment:
             typ._yaml_add_comment(value_node.comment, value=key)
         typ.add(key)
Exemple #7
0
 def construct_sequence(self, node, seqtyp, deep=False):
     if not isinstance(node, SequenceNode):
         raise ConstructorError(
             None, None,
             "expected a sequence node, but found %s" % node.id,
             node.start_mark)
     ret_val = []
     if node.comment:
         seqtyp._yaml_add_comment(node.comment[:2])
         if len(node.comment) > 2:
             seqtyp.yaml_end_comment_extend(node.comment[2], clear=True)
     if node.anchor:
         from ruamel.yaml.serializer import templated_id
         if not templated_id(node.anchor):
             seqtyp.yaml_set_anchor(node.anchor)
     for idx, child in enumerate(node.value):
         ret_val.append(self.construct_object(child, deep=deep))
         if child.comment:
             seqtyp._yaml_add_comment(child.comment, key=idx)
         seqtyp._yaml_set_idx_line_col(
             idx, [child.start_mark.line, child.start_mark.column])
     return ret_val
Exemple #8
0
    def construct_mapping(self, node, maptyp, deep=False):
        if not isinstance(node, MappingNode):
            raise ConstructorError(
                None,
                None,
                "expected a mapping node, but found %s" % node.id,
                node.start_mark,
            )
        merge_map = self.flatten_mapping(node)

        # mapping = {}
        if node.comment:
            maptyp._yaml_add_comment(node.comment[:2])
            if len(node.comment) > 2:
                maptyp.yaml_end_comment_extend(node.comment[2], clear=True)
        if node.anchor:
            from ruamel.yaml.serializer import templated_id

            if not templated_id(node.anchor):
                maptyp.yaml_set_anchor(node.anchor)
        for key_node, value_node in node.value:
            # keys can be list -> deep
            key = self.construct_object(key_node, deep=True)
            # lists are not hashable, but tuples are
            if not isinstance(key, Hashable):
                if isinstance(key, list):
                    key = tuple(key)
            if PY2:
                try:
                    hash(key)
                except TypeError as exc:
                    raise ConstructorError(
                        "while constructing a mapping",
                        node.start_mark,
                        "found unacceptable key (%s)" % exc,
                        key_node.start_mark,
                    )
            else:
                if not isinstance(key, Hashable):
                    raise ConstructorError(
                        "while constructing a mapping",
                        node.start_mark,
                        "found unhashable key",
                        key_node.start_mark,
                    )
            value = self.construct_object(value_node, deep=deep)
            if key_node.comment:
                maptyp._yaml_add_comment(key_node.comment, key=key)
            if value_node.comment:
                maptyp._yaml_add_comment(value_node.comment, value=key)
            maptyp._yaml_set_kv_line_col(
                key,
                [
                    key_node.start_mark.line,
                    key_node.start_mark.column,
                    value_node.start_mark.line,
                    value_node.start_mark.column,
                ],
            )
            if key in maptyp:
                key_node.start_mark.name = self.label
                key_node.end_mark.name = self.label

                raise exceptions.DuplicateKeysDisallowed(
                    "While parsing",
                    key_node.start_mark,
                    "Duplicate key '{0}' found".format(key),
                    key_node.end_mark,
                )
            maptyp[key] = value
        # do this last, or <<: before a key will prevent insertion in instances
        # of collections.OrderedDict (as they have no __contains__
        if merge_map:
            maptyp.add_yaml_merge(merge_map)

        # Don't verify Mapping indentation when allowing flow,
        # as that disallows:
        #   short_key: { x = 1 }
        #   very_long_key: { x = 1 }
        if not self.allow_flow_style:
            previous_indentation = None

            for node in [
                nodegroup[1]
                for nodegroup in node.value
                if isinstance(nodegroup[1], ruamelyaml.nodes.MappingNode)
            ]:
                if previous_indentation is None:
                    previous_indentation = node.start_mark.column
                if node.start_mark.column != previous_indentation:
                    raise exceptions.InconsistentIndentationDisallowed(
                        "While parsing",
                        node.start_mark,
                        "Found mapping with indentation "
                        "inconsistent with previous mapping",
                        node.end_mark,
                    )
 def construct_mapping(self, node, maptyp, deep=False):
     if not isinstance(node, MappingNode):
         raise ConstructorError(
             None, None,
             "expected a mapping node, but found %s" % node.id,
             node.start_mark)
     merge_map = self.flatten_mapping(node)
     # mapping = {}
     if node.comment:
         maptyp._yaml_add_comment(node.comment[:2])
         if len(node.comment) > 2:
             maptyp.yaml_end_comment_extend(node.comment[2], clear=True)
     if node.anchor:
         from ruamel.yaml.serializer import templated_id
         if not templated_id(node.anchor):
             maptyp.yaml_set_anchor(node.anchor)
     last_key, last_value = None, self._sentinel
     for key_node, value_node in node.value:
         # keys can be list -> deep
         key = self.construct_object(key_node, deep=True)
         # lists are not hashable, but tuples are
         if not isinstance(key, collections.Hashable):
             if isinstance(key, list):
                 key = CommentedKeySeq(key)
                 if key_node.flow_style is True:
                     key.fa.set_flow_style()
                 elif key_node.flow_style is False:
                     key.fa.set_block_style()
                 # key = tuple(key)
         if PY2:
             try:
                 hash(key)
             except TypeError as exc:
                 raise ConstructorError(
                     "while constructing a mapping", node.start_mark,
                     "found unacceptable key (%s)" %
                     exc, key_node.start_mark)
         else:
             if not isinstance(key, collections.Hashable):
                 raise ConstructorError(
                     "while constructing a mapping", node.start_mark,
                     "found unhashable key", key_node.start_mark)
         value = self.construct_object(value_node, deep=deep)
         if key_node.comment and len(key_node.comment) > 4 and \
            key_node.comment[4]:
             if last_value is None:
                 key_node.comment[0] = key_node.comment.pop(4)
                 maptyp._yaml_add_comment(key_node.comment, value=last_key)
             else:
                 key_node.comment[2] = key_node.comment.pop(4)
                 maptyp._yaml_add_comment(key_node.comment, key=key)
             key_node.comment = None
         if key_node.comment:
             maptyp._yaml_add_comment(key_node.comment, key=key)
         if value_node.comment:
             maptyp._yaml_add_comment(value_node.comment, value=key)
         maptyp._yaml_set_kv_line_col(
             key, [key_node.start_mark.line, key_node.start_mark.column,
                   value_node.start_mark.line, value_node.start_mark.column])
         maptyp[key] = value
         last_key, last_value = key, value  # could use indexing
     # do this last, or <<: before a key will prevent insertion in instances
     # of collections.OrderedDict (as they have no __contains__
     if merge_map:
         maptyp.add_yaml_merge(merge_map)
Exemple #10
0
    def construct_mapping(self, node, maptyp, deep=False):
        if not isinstance(node, MappingNode):
            raise ConstructorError(
                None,
                None,
                "expected a mapping node, but found %s" % node.id,
                node.start_mark,
            )
        merge_map = self.flatten_mapping(node)

        # mapping = {}
        if node.comment:
            maptyp._yaml_add_comment(node.comment[:2])
            if len(node.comment) > 2:
                maptyp.yaml_end_comment_extend(node.comment[2], clear=True)
        if node.anchor:
            from ruamel.yaml.serializer import templated_id

            if not templated_id(node.anchor):
                maptyp.yaml_set_anchor(node.anchor)
        for key_node, value_node in node.value:
            # keys can be list -> deep
            key = self.construct_object(key_node, deep=True)
            # lists are not hashable, but tuples are
            if not isinstance(key, collections.Hashable):
                if isinstance(key, list):
                    key = tuple(key)
            if PY2:
                try:
                    hash(key)
                except TypeError as exc:
                    raise ConstructorError(
                        "while constructing a mapping",
                        node.start_mark,
                        "found unacceptable key (%s)" % exc,
                        key_node.start_mark,
                    )
            else:
                if not isinstance(key, collections.Hashable):
                    raise ConstructorError(
                        "while constructing a mapping",
                        node.start_mark,
                        "found unhashable key",
                        key_node.start_mark,
                    )
            value = self.construct_object(value_node, deep=deep)
            if key_node.comment:
                maptyp._yaml_add_comment(key_node.comment, key=key)
            if value_node.comment:
                maptyp._yaml_add_comment(value_node.comment, value=key)
            maptyp._yaml_set_kv_line_col(
                key,
                [
                    key_node.start_mark.line,
                    key_node.start_mark.column,
                    value_node.start_mark.line,
                    value_node.start_mark.column,
                ],
            )
            if key in maptyp:
                key_node.start_mark.name = self.label
                key_node.end_mark.name = self.label

                raise exceptions.DuplicateKeysDisallowed(
                    "While parsing",
                    key_node.start_mark,
                    "Duplicate key '{0}' found".format(key),
                    key_node.end_mark,
                )
            maptyp[key] = value
        # do this last, or <<: before a key will prevent insertion in instances
        # of collections.OrderedDict (as they have no __contains__
        if merge_map:
            maptyp.add_yaml_merge(merge_map)

        previous_indentation = None

        for node in [
            nodegroup[1]
            for nodegroup in node.value
            if isinstance(nodegroup[1], ruamelyaml.nodes.MappingNode)
        ]:
            if previous_indentation is None:
                previous_indentation = node.start_mark.column
            if node.start_mark.column != previous_indentation:
                raise exceptions.InconsistentIndentationDisallowed(
                    "While parsing",
                    node.start_mark,
                    "Found mapping with indentation "
                    "inconsistent with previous mapping",
                    node.end_mark,
                )