Changeset 142


Ignore:
Timestamp:
04/18/06 13:15:54 (9 years ago)
Author:
xi
Message:

Add support for recursive nodes to Composer. Constructor does not support recursive objects though.

Location:
pyyaml/trunk
Files:
1 added
3 edited

Legend:

Unmodified
Added
Removed
  • pyyaml/trunk/lib/yaml/composer.py

    r137 r142  
    1212 
    1313    def __init__(self): 
    14         self.all_anchors = {} 
    15         self.complete_anchors = {} 
     14        self.anchors = {} 
    1615 
    1716    def check_node(self): 
     
    4443        self.get_event() 
    4544 
    46         self.all_anchors = {} 
    4745        self.complete_anchors = {} 
    4846        return node 
     
    5250            event = self.get_event() 
    5351            anchor = event.anchor 
    54             if anchor not in self.all_anchors: 
     52            if anchor not in self.anchors: 
    5553                raise ComposerError(None, None, "found undefined alias %r" 
    5654                        % anchor.encode('utf-8'), event.start_mark) 
    57             if anchor not in self.complete_anchors: 
    58                 collection_event = self.all_anchors[anchor] 
    59                 raise ComposerError("while composing a collection", 
    60                         collection_event.start_mark, 
    61                         "found recursive anchor %r" % anchor.encode('utf-8'), 
    62                         event.start_mark) 
    63             return self.complete_anchors[anchor] 
     55            return self.anchors[anchor] 
    6456        event = self.peek_event() 
    6557        anchor = event.anchor 
    6658        if anchor is not None: 
    67             if anchor in self.all_anchors: 
     59            if anchor in self.anchors: 
    6860                raise ComposerError("found duplicate anchor %r; first occurence" 
    69                         % anchor.encode('utf-8'), self.all_anchors[anchor].start_mark, 
     61                        % anchor.encode('utf-8'), self.anchors[anchor].start_mark, 
    7062                        "second occurence", event.start_mark) 
    71             self.all_anchors[anchor] = event 
    7263        self.descend_resolver(parent, index) 
    7364        if self.check_event(ScalarEvent): 
    74             node = self.compose_scalar_node() 
     65            node = self.compose_scalar_node(anchor) 
    7566        elif self.check_event(SequenceStartEvent): 
    76             node = self.compose_sequence_node() 
     67            node = self.compose_sequence_node(anchor) 
    7768        elif self.check_event(MappingStartEvent): 
    78             node = self.compose_mapping_node() 
    79         if anchor is not None: 
    80             self.complete_anchors[anchor] = node 
     69            node = self.compose_mapping_node(anchor) 
    8170        self.ascend_resolver() 
    8271        return node 
    8372 
    84     def compose_scalar_node(self): 
     73    def compose_scalar_node(self, anchor): 
    8574        event = self.get_event() 
    8675        tag = event.tag 
    8776        if tag is None or tag == u'!': 
    8877            tag = self.resolve(ScalarNode, event.value, event.implicit) 
    89         return ScalarNode(tag, event.value, 
     78        node = ScalarNode(tag, event.value, 
    9079                event.start_mark, event.end_mark, style=event.style) 
     80        if anchor is not None: 
     81            self.anchors[anchor] = node 
     82        return node 
    9183 
    92     def compose_sequence_node(self): 
     84    def compose_sequence_node(self, anchor): 
    9385        start_event = self.get_event() 
    9486        tag = start_event.tag 
     
    9890                start_event.start_mark, None, 
    9991                flow_style=start_event.flow_style) 
     92        if anchor is not None: 
     93            self.anchors[anchor] = node 
    10094        index = 0 
    10195        while not self.check_event(SequenceEndEvent): 
     
    106100        return node 
    107101 
    108     def compose_mapping_node(self): 
     102    def compose_mapping_node(self, anchor): 
    109103        start_event = self.get_event() 
    110104        tag = start_event.tag 
     
    114108                start_event.start_mark, None, 
    115109                flow_style=start_event.flow_style) 
     110        if anchor is not None: 
     111            self.anchors[anchor] = node 
    116112        while not self.check_event(MappingEndEvent): 
    117113            key_event = self.peek_event() 
  • pyyaml/trunk/lib/yaml/constructor.py

    r139 r142  
    3030    def __init__(self): 
    3131        self.constructed_objects = {} 
     32        self.recursive_objects = {} 
    3233 
    3334    def check_data(self): 
     
    4849        data = self.construct_object(node) 
    4950        self.constructed_objects = {} 
     51        self.recursive_objects = {} 
    5052        return data 
    5153 
     
    5355        if node in self.constructed_objects: 
    5456            return self.constructed_objects[node] 
     57        if node in self.recursive_objects: 
     58            raise ConstructorError(None, None, 
     59                    "found recursive node", node.start_mark) 
     60        self.recursive_objects[node] = None 
    5561        constructor = None 
    5662        if node.tag in self.yaml_constructors: 
     
    8086        data = constructor(node) 
    8187        self.constructed_objects[node] = data 
     88        del self.recursive_objects[node] 
    8289        return data 
    8390 
  • pyyaml/trunk/tests/test_yaml.py

    r137 r142  
    1212from test_emitter import * 
    1313from test_representer import * 
     14from test_recursive import * 
    1415from test_syck import * 
    1516 
Note: See TracChangeset for help on using the changeset viewer.