Changeset 51 for branches/pyyaml3000/tests/test_appliance.py
- Timestamp:
- 02/19/06 17:17:28 (7 years ago)
- File:
-
- 1 edited
-
branches/pyyaml3000/tests/test_appliance.py (modified) (13 diffs)
Legend:
- Unmodified
- Added
- Removed
-
branches/pyyaml3000/tests/test_appliance.py
r48 r51 1 1 2 2 import unittest, os 3 4 from yaml.tokens import * 5 from yaml.events import * 3 6 4 7 class TestAppliance(unittest.TestCase): … … 33 36 add_tests = classmethod(add_tests) 34 37 35 class Node:36 def __repr__(self):37 args = []38 for attribute in ['anchor', 'tag', 'value']:39 if hasattr(self, attribute):40 args.append(repr(getattr(self, attribute)))41 return "%s(%s)" % (self.__class__.__name__, ', '.join(args))42 43 class AliasNode(Node):44 def __init__(self, anchor):45 self.anchor = anchor46 47 class ScalarNode(Node):48 def __init__(self, anchor, tag, value):49 self.anchor = anchor50 self.tag = tag51 self.value = value52 53 class SequenceNode(Node):54 def __init__(self, anchor, tag, value):55 self.anchor = anchor56 self.tag = tag57 self.value = value58 59 class MappingNode(Node):60 def __init__(self, anchor, tag, value):61 self.anchor = anchor62 self.tag = tag63 self.value = value64 65 class Token:66 def __repr__(self):67 args = []68 if hasattr(self, 'value'):69 args.append(repr(self.value))70 return "%s(%s)" % (self.__class__.__name__, ''.join(args))71 72 class StreamEndToken(Token):73 pass74 75 class DirectiveToken(Token):76 pass77 78 class DocumentStartToken(Token):79 pass80 81 class SequenceStartToken(Token):82 pass83 84 class MappingStartToken(Token):85 pass86 87 class SequenceEndToken(Token):88 pass89 90 class MappingEndToken(Token):91 pass92 93 class KeyToken(Token):94 pass95 96 class ValueToken(Token):97 pass98 99 class EntryToken(Token):100 pass101 102 class AliasToken(Token):103 def __init__(self, value):104 self.value = value105 106 class AnchorToken(Token):107 def __init__(self, value):108 self.value = value109 110 class TagToken(Token):111 def __init__(self, value):112 self.value = value113 114 class ScalarToken(Token):115 def __init__(self, value):116 self.value = value117 118 38 class Error(Exception): 119 39 pass … … 121 41 class CanonicalScanner: 122 42 123 def __init__(self, source, data): 124 self.source = source 43 def __init__(self, data): 125 44 self.data = unicode(data, 'utf-8')+u'\0' 126 45 self.index = 0 … … 133 52 ch = self.data[self.index] 134 53 if ch == u'\0': 135 tokens.append(StreamEndToken( ))54 tokens.append(StreamEndToken(None, None)) 136 55 break 137 56 elif ch == u'%': … … 139 58 elif ch == u'-' and self.data[self.index:self.index+3] == u'---': 140 59 self.index += 3 141 tokens.append(DocumentStartToken( ))60 tokens.append(DocumentStartToken(None, None)) 142 61 elif ch == u'[': 143 62 self.index += 1 144 tokens.append( SequenceStartToken())63 tokens.append(FlowSequenceStartToken(None, None)) 145 64 elif ch == u'{': 146 65 self.index += 1 147 tokens.append( MappingStartToken())66 tokens.append(FlowMappingStartToken(None, None)) 148 67 elif ch == u']': 149 68 self.index += 1 150 tokens.append( SequenceEndToken())69 tokens.append(FlowSequenceEndToken(None, None)) 151 70 elif ch == u'}': 152 71 self.index += 1 153 tokens.append( MappingEndToken())72 tokens.append(FlowMappingEndToken(None, None)) 154 73 elif ch == u'?': 155 74 self.index += 1 156 tokens.append(KeyToken( ))75 tokens.append(KeyToken(None, None)) 157 76 elif ch == u':': 158 77 self.index += 1 159 tokens.append(ValueToken( ))78 tokens.append(ValueToken(None, None)) 160 79 elif ch == u',': 161 80 self.index += 1 162 tokens.append( EntryToken())81 tokens.append(FlowEntryToken(None, None)) 163 82 elif ch == u'*' or ch == u'&': 164 83 tokens.append(self.scan_alias()) … … 177 96 self.data[self.index+len(self.DIRECTIVE)] in u' \n\0': 178 97 self.index += len(self.DIRECTIVE) 179 return DirectiveToken( )98 return DirectiveToken('YAML', (1, 1), None, None) 180 99 181 100 def scan_alias(self): … … 189 108 self.index += 1 190 109 value = self.data[start:self.index] 191 return TokenClass(value )110 return TokenClass(value, None, None) 192 111 193 112 def scan_tag(self): … … 199 118 if value[0] == u'!': 200 119 value = 'tag:yaml.org,2002:'+value[1:] 120 elif value[0] == u'<' and value[-1] == u'>': 121 value = value[1:-1] 201 122 else: 202 value = value[1:-1]203 return TagToken(value )123 value = u'!'+value 124 return TagToken(value, None, None) 204 125 205 126 QUOTE_CODES = { … … 265 186 chunks.append(self.data[start:self.index]) 266 187 self.index += 1 267 return ScalarToken(u''.join(chunks) )188 return ScalarToken(u''.join(chunks), False, None, None) 268 189 269 190 def find_token(self): … … 282 203 class CanonicalParser: 283 204 284 def __init__(self, source, data): 285 self.scanner = CanonicalScanner(source, data) 205 def __init__(self, data): 206 self.scanner = CanonicalScanner(data) 207 self.events = [] 286 208 287 209 # stream: document* END 288 210 def parse_stream(self): 289 documents = []290 211 while not self.test_token(StreamEndToken): 291 212 if self.test_token(DirectiveToken, DocumentStartToken): 292 documents.append(self.parse_document())213 self.parse_document() 293 214 else: 294 215 raise Error("document is expected, got "+repr(self.tokens[self.index])) 295 return documents296 297 # document: DIRECTIVE? DOCUMENT-START node ?216 self.events.append(StreamEndEvent(None, None)) 217 218 # document: DIRECTIVE? DOCUMENT-START node 298 219 def parse_document(self): 299 220 node = None … … 301 222 self.consume_token(DirectiveToken) 302 223 self.consume_token(DocumentStartToken) 303 if self.test_token(TagToken, AliasToken, AnchorToken, TagToken, 304 SequenceStartToken, MappingStartToken, ScalarToken): 305 node = self.parse_node() 306 return node 224 self.parse_node() 307 225 308 226 # node: ALIAS | ANCHOR? TAG? (SCALAR|sequence|mapping) 309 227 def parse_node(self): 310 228 if self.test_token(AliasToken): 311 return AliasNode(self.get_value())229 self.events.append(AliasEvent(self.get_value(), None, None)) 312 230 else: 313 231 anchor = None 314 232 if self.test_token(AnchorToken): 315 233 anchor = self.get_value() 316 tag = None234 tag = u'!' 317 235 if self.test_token(TagToken): 318 236 tag = self.get_value() 319 237 if self.test_token(ScalarToken): 320 return ScalarNode(anchor, tag, self.get_value()) 321 elif self.test_token(SequenceStartToken): 322 return SequenceNode(anchor, tag, self.parse_sequence()) 323 elif self.test_token(MappingStartToken): 324 return MappingNode(anchor, tag, self.parse_mapping()) 238 self.events.append(ScalarEvent(anchor, tag, self.get_value(), None, None)) 239 elif self.test_token(FlowSequenceStartToken): 240 self.events.append(SequenceEvent(anchor, tag, None, None)) 241 self.parse_sequence() 242 elif self.test_token(FlowMappingStartToken): 243 self.events.append(MappingEvent(anchor, tag, None, None)) 244 self.parse_mapping() 325 245 else: 326 246 raise Error("SCALAR, '[', or '{' is expected, got "+repr(self.tokens[self.index])) … … 328 248 # sequence: SEQUENCE-START (node (ENTRY node)*)? ENTRY? SEQUENCE-END 329 249 def parse_sequence(self): 330 values = [] 331 self.consume_token(SequenceStartToken) 332 if not self.test_token(SequenceEndToken): 333 values.append(self.parse_node()) 334 while not self.test_token(SequenceEndToken): 335 self.consume_token(EntryToken) 336 if not self.test_token(SequenceEndToken): 337 values.append(self.parse_node()) 338 self.consume_token(SequenceEndToken) 339 return values 250 self.consume_token(FlowSequenceStartToken) 251 if not self.test_token(FlowSequenceEndToken): 252 self.parse_node() 253 while not self.test_token(FlowSequenceEndToken): 254 self.consume_token(FlowEntryToken) 255 if not self.test_token(FlowSequenceEndToken): 256 self.parse_node() 257 self.consume_token(FlowSequenceEndToken) 258 self.events.append(CollectionEndEvent(None, None)) 340 259 341 260 # mapping: MAPPING-START (map_entry (ENTRY map_entry)*)? ENTRY? MAPPING-END 342 261 def parse_mapping(self): 343 values = [] 344 self.consume_token(MappingStartToken) 345 if not self.test_token(MappingEndToken): 346 values.append(self.parse_map_entry()) 347 while not self.test_token(MappingEndToken): 348 self.consume_token(EntryToken) 349 if not self.test_token(MappingEndToken): 350 values.append(self.parse_map_entry()) 351 self.consume_token(MappingEndToken) 352 return values 262 self.consume_token(FlowMappingStartToken) 263 if not self.test_token(FlowMappingEndToken): 264 self.parse_map_entry() 265 while not self.test_token(FlowMappingEndToken): 266 self.consume_token(FlowEntryToken) 267 if not self.test_token(FlowMappingEndToken): 268 self.parse_map_entry() 269 self.consume_token(FlowMappingEndToken) 270 self.events.append(CollectionEndEvent(None, None)) 353 271 354 272 # map_entry: KEY node VALUE node 355 273 def parse_map_entry(self): 356 274 self.consume_token(KeyToken) 357 key =self.parse_node()275 self.parse_node() 358 276 self.consume_token(ValueToken) 359 value = self.parse_node() 360 return (key, value) 277 self.parse_node() 361 278 362 279 def test_token(self, *choices): … … 379 296 self.tokens = self.scanner.scan() 380 297 self.index = 0 381 return self.parse_stream() 382 298 self.parse_stream() 299 return self.events 300
Note: See TracChangeset
for help on using the changeset viewer.
