Changeset 136 for pyyaml/trunk/lib/yaml/representer.py
- Timestamp:
- 04/15/06 19:54:52 (7 years ago)
- File:
-
- 1 edited
-
pyyaml/trunk/lib/yaml/representer.py (modified) (5 diffs)
Legend:
- Unmodified
- Added
- Removed
-
pyyaml/trunk/lib/yaml/representer.py
r135 r136 21 21 pass 22 22 23 class BaseRepresenter(BaseDetector): 24 25 DEFAULT_SCALAR_TAG = u'tag:yaml.org,2002:str' 26 DEFAULT_SEQUENCE_TAG = u'tag:yaml.org,2002:seq' 27 DEFAULT_MAPPING_TAG = u'tag:yaml.org,2002:map' 28 29 def __init__(self, serializer): 30 self.serializer = serializer 23 class BaseRepresenter: 24 25 yaml_representers = {} 26 27 def __init__(self): 31 28 self.represented_objects = {} 32 29 33 def close(self): 34 self.serializer.close() 35 36 def represent(self, native): 37 node = self.represent_object(native) 38 self.serializer.serialize(node) 30 def represent(self, data): 31 node = self.represent_object(data) 32 self.serialize(node) 39 33 self.represented_objects = {} 40 34 41 def represent_object(self, native):42 if self.ignore_aliases( native):35 def represent_object(self, data): 36 if self.ignore_aliases(data): 43 37 alias_key = None 44 38 else: 45 alias_key = id( native)39 alias_key = id(data) 46 40 if alias_key is not None: 47 41 if alias_key in self.represented_objects: 48 42 node = self.represented_objects[alias_key] 49 43 if node is None: 50 raise RepresenterError("recursive objects are not allowed: %r" % native)44 raise RepresenterError("recursive objects are not allowed: %r" % data) 51 45 return node 52 46 self.represented_objects[alias_key] = None 53 for native_type in type(native).__mro__:54 if native_type in self.yaml_representers:55 node = self.yaml_representers[ native_type](self, native)47 for data_type in type(data).__mro__: 48 if data_type in self.yaml_representers: 49 node = self.yaml_representers[data_type](self, data) 56 50 break 57 51 else: 58 52 if None in self.yaml_representers: 59 node = self.yaml_representers[None](self, native)53 node = self.yaml_representers[None](self, data) 60 54 else: 61 node = ScalarNode(None, unicode( native))55 node = ScalarNode(None, unicode(data)) 62 56 if alias_key is not None: 63 57 self.represented_objects[alias_key] = node 64 58 return node 65 59 66 def add_representer(cls, native_type, representer):60 def add_representer(cls, data_type, representer): 67 61 if not 'yaml_representers' in cls.__dict__: 68 62 cls.yaml_representers = cls.yaml_representers.copy() 69 cls.yaml_representers[ native_type] = representer63 cls.yaml_representers[data_type] = representer 70 64 add_representer = classmethod(add_representer) 71 65 72 yaml_representers = {}73 74 66 def represent_scalar(self, tag, value, style=None): 75 detected_tag = self.detect(value) 76 if detected_tag is None: 77 detected_tag = self.DEFAULT_SCALAR_TAG 78 implicit = (tag == detected_tag) 79 if tag == self.DEFAULT_SCALAR_TAG: 80 tag = None 81 return ScalarNode(tag, value, implicit=implicit, style=style) 67 return ScalarNode(tag, value, style=style) 82 68 83 69 def represent_sequence(self, tag, sequence, flow_style=None): 84 if tag == self.DEFAULT_SEQUENCE_TAG:85 tag = None86 70 value = [] 87 71 for item in sequence: … … 90 74 91 75 def represent_mapping(self, tag, mapping, flow_style=None): 92 if tag == self.DEFAULT_MAPPING_TAG:93 tag = None94 76 value = {} 95 77 if hasattr(mapping, 'keys'): … … 104 86 return MappingNode(tag, value, flow_style=flow_style) 105 87 106 def ignore_aliases(self, native):88 def ignore_aliases(self, data): 107 89 return False 108 90 109 class SafeRepresenter( Detector,BaseRepresenter):110 111 def ignore_aliases(self, native):112 if nativein [None, ()]:91 class SafeRepresenter(BaseRepresenter): 92 93 def ignore_aliases(self, data): 94 if data in [None, ()]: 113 95 return True 114 if isinstance( native, (str, unicode, bool, int, float)):96 if isinstance(data, (str, unicode, bool, int, float)): 115 97 return True 116 98 117 def represent_none(self, native):99 def represent_none(self, data): 118 100 return self.represent_scalar(u'tag:yaml.org,2002:null', 119 101 u'null') 120 102 121 def represent_str(self, native):103 def represent_str(self, data): 122 104 encoding = None 123 105 try: 124 unicode( native, 'ascii')106 unicode(data, 'ascii') 125 107 encoding = 'ascii' 126 108 except UnicodeDecodeError: 127 109 try: 128 unicode( native, 'utf-8')110 unicode(data, 'utf-8') 129 111 encoding = 'utf-8' 130 112 except UnicodeDecodeError: … … 132 114 if encoding: 133 115 return self.represent_scalar(u'tag:yaml.org,2002:str', 134 unicode( native, encoding))116 unicode(data, encoding)) 135 117 else: 136 118 return self.represent_scalar(u'tag:yaml.org,2002:binary', 137 unicode( native.encode('base64')), style='|')138 139 def represent_unicode(self, native):140 return self.represent_scalar(u'tag:yaml.org,2002:str', native)141 142 def represent_bool(self, native):143 if native:119 unicode(data.encode('base64')), style='|') 120 121 def represent_unicode(self, data): 122 return self.represent_scalar(u'tag:yaml.org,2002:str', data) 123 124 def represent_bool(self, data): 125 if data: 144 126 value = u'true' 145 127 else: … … 147 129 return self.represent_scalar(u'tag:yaml.org,2002:bool', value) 148 130 149 def represent_int(self, native):150 return self.represent_scalar(u'tag:yaml.org,2002:int', unicode( native))151 152 def represent_long(self, native):153 return self.represent_scalar(u'tag:yaml.org,2002:int', unicode( native))131 def represent_int(self, data): 132 return self.represent_scalar(u'tag:yaml.org,2002:int', unicode(data)) 133 134 def represent_long(self, data): 135 return self.represent_scalar(u'tag:yaml.org,2002:int', unicode(data)) 154 136 155 137 inf_value = 1e300000 156 138 nan_value = inf_value/inf_value 157 139 158 def represent_float(self, native):159 if native== self.inf_value:140 def represent_float(self, data): 141 if data == self.inf_value: 160 142 value = u'.inf' 161 elif native== -self.inf_value:143 elif data == -self.inf_value: 162 144 value = u'-.inf' 163 elif native == self.nan_value or native != native:145 elif data == self.nan_value or data != data: 164 146 value = u'.nan' 165 147 else: 166 value = unicode( native)148 value = unicode(data) 167 149 return self.represent_scalar(u'tag:yaml.org,2002:float', value) 168 150 169 def represent_list(self, native):170 pairs = (len( native) > 0)171 for item in native:151 def represent_list(self, data): 152 pairs = (len(data) > 0) 153 for item in data: 172 154 if not isinstance(item, tuple) or len(item) != 2: 173 155 pairs = False 174 156 break 175 157 if not pairs: 176 return self.represent_sequence(u'tag:yaml.org,2002:seq', native)158 return self.represent_sequence(u'tag:yaml.org,2002:seq', data) 177 159 value = [] 178 for item_key, item_value in native:160 for item_key, item_value in data: 179 161 value.append(self.represent_mapping(u'tag:yaml.org,2002:map', 180 162 [(item_key, item_value)])) 181 163 return SequenceNode(u'tag:yaml.org,2002:pairs', value) 182 164 183 def represent_dict(self, native):184 return self.represent_mapping(u'tag:yaml.org,2002:map', native)185 186 def represent_set(self, native):165 def represent_dict(self, data): 166 return self.represent_mapping(u'tag:yaml.org,2002:map', data) 167 168 def represent_set(self, data): 187 169 value = {} 188 for key in native:170 for key in data: 189 171 value[key] = None 190 172 return self.represent_mapping(u'tag:yaml.org,2002:set', value) 191 173 192 def represent_date(self, native):193 value = u'%04d-%02d-%02d' % ( native.year, native.month, native.day)174 def represent_date(self, data): 175 value = u'%04d-%02d-%02d' % (data.year, data.month, data.day) 194 176 return self.represent_scalar(u'tag:yaml.org,2002:timestamp', value) 195 177 196 def represent_datetime(self, native):178 def represent_datetime(self, data): 197 179 value = u'%04d-%02d-%02d %02d:%02d:%02d' \ 198 % ( native.year, native.month, native.day,199 native.hour, native.minute, native.second)200 if native.microsecond:201 value += u'.' + unicode( native.microsecond/1000000.0).split(u'.')[1]202 if native.utcoffset():203 value += unicode( native.utcoffset())180 % (data.year, data.month, data.day, 181 data.hour, data.minute, data.second) 182 if data.microsecond: 183 value += u'.' + unicode(data.microsecond/1000000.0).split(u'.')[1] 184 if data.utcoffset(): 185 value += unicode(data.utcoffset()) 204 186 return self.represent_scalar(u'tag:yaml.org,2002:timestamp', value) 205 187 206 def represent_undefined(self, native): 207 raise RepresenterError("cannot represent an object: %s" % native) 188 def represent_yaml_object(self, tag, data, cls, flow_style=None): 189 if hasattr(data, '__getstate__'): 190 state = data.__getstate__() 191 else: 192 state = data.__dict__.copy() 193 mapping = state 194 if hasattr(state, 'keys'): 195 mapping = [] 196 keys = state.keys() 197 keys.sort() 198 for key in keys: 199 mapping.append((key.replace('_', '-'), state[key])) 200 return self.represent_mapping(tag, mapping, flow_style=flow_style) 201 202 def represent_undefined(self, data): 203 raise RepresenterError("cannot represent an object: %s" % data) 208 204 209 205 SafeRepresenter.add_representer(type(None),
Note: See TracChangeset
for help on using the changeset viewer.
