Ignore:
Timestamp:
07/19/05 15:14:45 (8 years ago)
Author:
xi
Message:

Implement most YAML types, except default (value) and yaml (closes #9).

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/lib/syck/parsers.py

    r7 r8  
    11 
    2 import _syck, re, datetime 
     2import _syck, re, datetime, sets 
     3 
     4__all__ = ['error', 'GenericParser', 'Parser'] 
     5 
     6error = _syck.error 
    37 
    48class GenericParser: 
     
    2630            yield value 
    2731 
     32class Merge: 
     33    pass 
     34 
     35class Default: 
     36    pass 
     37 
    2838class Parser(GenericParser): 
    2939 
     
    3949            r')?') 
    4050 
     51    merge_key = Merge() 
     52    default_key = Default() 
     53 
    4154    def __init__(self): 
    4255        self.tags = {} 
    43         self.add_scalar_builtin_types() 
    44         self.add_collection_builtin_types() 
     56        self.add_builtin_types() 
    4557 
    46     def add_scalar_builtin_types(self): 
     58    def add_builtin_types(self): 
    4759        self.add_builtin_type('null', lambda node: None) 
    4860        self.add_builtin_type('bool#yes', lambda node: True) 
     
    6375        self.add_builtin_type('timestamp#spaced', self.transfer_timestamp) 
    6476        self.add_builtin_type('timestamp', self.transfer_timestamp) 
    65  
    66     def add_collection_builtin_types(self): 
    67         pass 
     77        self.add_builtin_type('merge', self.transfer_merge) 
     78        self.add_builtin_type('default', self.transfer_default) 
     79        self.add_builtin_type('omap', self.transfer_omap) 
     80        self.add_builtin_type('pairs', self.transfer_pairs) 
     81        self.add_builtin_type('set', self.transfer_set) 
    6882 
    6983    def add_type(self, type_tag, transfer): 
     
    8397 
    8498    def resolve(self, node): 
     99        if node.kind == 'map' and self.merge_key in node.value: 
     100            self.merge_maps(node) 
    85101        if node.type_id in self.tags: 
    86102            return self.tags[node.type_id](node) 
     
    123139                values['hour'], values['minute'], values['second'], micro) 
    124140        diff = datetime.timedelta(hours=values['zhour'], minutes=values['zminute']) 
    125         print "DIFF =", diff 
    126141        return stamp-diff 
    127142 
     143    def transfer_merge(self, node): 
     144        return self.merge_key 
     145 
     146    def transfer_default(self, node): 
     147        return self.default_key 
     148 
     149    def merge_maps(self, node): 
     150        maps = node.value[self.merge_key] 
     151        del node.value[self.merge_key] 
     152        if not isinstance(maps, list): 
     153            maps = [maps] 
     154        maps.reverse() 
     155        maps.append(node.value.copy()) 
     156        for item in maps: 
     157            node.value.update(item) 
     158 
     159    def transfer_omap(self, node): 
     160        omap = [] 
     161        for mapping in node.value: 
     162            for key in mapping: 
     163                omap.append((key, mapping[key])) 
     164        return omap 
     165 
     166    def transfer_pairs(self, node): # Same as transfer_omap. 
     167        pairs = [] 
     168        for mapping in node.value: 
     169            for key in mapping: 
     170                pairs.append((key, mapping[key])) 
     171        return pairs 
     172 
     173    def transfer_set(self, node): 
     174        return sets.Set(node.value) 
     175 
Note: See TracChangeset for help on using the changeset viewer.