Changeset 133
- Timestamp:
- 04/10/06 20:34:16 (7 years ago)
- Location:
- pyyaml/trunk
- Files:
-
- 5 added
- 10 edited
-
lib/yaml/__init__.py (modified) (4 diffs)
-
lib/yaml/composer.py (modified) (3 diffs)
-
lib/yaml/constructor.py (modified) (3 diffs)
-
lib/yaml/detector.py (added)
-
lib/yaml/emitter.py (modified) (7 diffs)
-
lib/yaml/events.py (modified) (2 diffs)
-
lib/yaml/nodes.py (modified) (2 diffs)
-
lib/yaml/representer.py (added)
-
lib/yaml/resolver.py (modified) (4 diffs)
-
lib/yaml/serializer.py (added)
-
lib/yaml/yaml_object.py (added)
-
tests/data/scalars.events (modified) (1 diff)
-
tests/test_emitter.py (modified) (1 diff)
-
tests/test_representer.py (added)
-
tests/test_yaml.py (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
pyyaml/trunk/lib/yaml/__init__.py
r132 r133 1 1 2 2 from error import * 3 3 4 from reader import * 4 5 from scanner import * … … 7 8 from resolver import * 8 9 from constructor import * 10 9 11 from emitter import * 12 from serializer import * 13 from representer import * 14 15 from detector import * 10 16 11 17 from tokens import * 12 18 from events import * 13 19 from nodes import * 20 21 from yaml_object import * 14 22 15 23 def parse(data, Reader=Reader, Scanner=Scanner, Parser=Parser): … … 19 27 return parser 20 28 21 def load (data, Reader=Reader, Scanner=Scanner, Parser=Parser,29 def load_all(data, Reader=Reader, Scanner=Scanner, Parser=Parser, 22 30 Composer=Composer, Resolver=Resolver, Constructor=Constructor): 23 31 reader = Reader(data) … … 29 37 return constructor 30 38 31 def load_document(*args, **kwds): 32 for document in load(*args, **kwds): 39 def safe_load_all(data, Reader=Reader, Scanner=Scanner, Parser=Parser, 40 Composer=Composer, Resolver=Resolver, Constructor=SafeConstructor): 41 return load_all(data, Reader, Scanner, Parser, Composer, Resolver, 42 Constructor) 43 44 def load(data, *args, **kwds): 45 for document in load_all(data, *args, **kwds): 33 46 return document 34 47 48 def safe_load(data, *args, **kwds): 49 for document in safe_load_all(data, *args, **kwds): 50 return document 51 52 def emit(events, writer=None, Emitter=Emitter): 53 if writer is None: 54 try: 55 from cStringIO import StringIO 56 except ImportError: 57 from StringIO import StringIO 58 writer = StringIO() 59 return_value = True 60 else: 61 return_value = False 62 emitter = Emitter(writer) 63 for event in events: 64 emitter.emit(event) 65 if return_value: 66 return writer.getvalue() 67 68 def dump_all(natives, writer=None, Emitter=Emitter, 69 Serializer=Serializer, Representer=Representer, 70 encoding=None, line_break=None, canonical=None, 71 indent=None, width=None, allow_unicode=None): 72 if writer is None: 73 try: 74 from cStringIO import StringIO 75 except ImportError: 76 from StringIO import StringIO 77 writer = StringIO() 78 return_value = True 79 else: 80 return_value = False 81 emitter = Emitter(writer) 82 serializer = Serializer(emitter, encoding=encoding, line_break=line_break, 83 canonical=canonical, indent=indent, width=width, 84 allow_unicode=allow_unicode) 85 representer = Representer(serializer) 86 for native in natives: 87 representer.represent(native) 88 representer.close() 89 if return_value: 90 return writer.getvalue() 91 92 def safe_dump_all(natives, writer=None, Emitter=Emitter, 93 Serializer=Serializer, Representer=SafeRepresenter, 94 encoding=None, line_break=None, canonical=None, 95 indent=None, width=None, allow_unicode=None): 96 return dump_all(natives, writer, Emitter, Serializer, Representer, 97 encoding, line_break, canonical, indent, width, allow_unicode) 98 99 def dump(native, *args, **kwds): 100 return dump_all([native], *args, **kwds) 101 102 def safe_dump(native, *args, **kwds): 103 return safe_dump_all([native], *args, **kwds) 104 -
pyyaml/trunk/lib/yaml/composer.py
r132 r133 83 83 event = self.parser.get() 84 84 return ScalarNode(event.tag, event.value, event.implicit, 85 event.start_mark, event.end_mark )85 event.start_mark, event.end_mark, style=event.style) 86 86 87 87 def compose_sequence_node(self): … … 92 92 end_event = self.parser.get() 93 93 return SequenceNode(start_event.tag, value, 94 start_event.start_mark, end_event.end_mark) 94 start_event.start_mark, end_event.end_mark, 95 flow_style=start_event.flow_style) 95 96 96 97 def compose_mapping_node(self): … … 107 108 end_event = self.parser.get() 108 109 return MappingNode(start_event.tag, value, 109 start_event.start_mark, end_event.end_mark) 110 start_event.start_mark, end_event.end_mark, 111 flow_style=start_event.flow_style) 110 112 -
pyyaml/trunk/lib/yaml/constructor.py
r116 r133 1 1 2 __all__ = ['BaseConstructor', ' Constructor', 'ConstructorError',3 ' YAMLObject', 'YAMLObjectMetaclass']2 __all__ = ['BaseConstructor', 'SafeConstructor', 'Constructor', 3 'ConstructorError'] 4 4 5 5 from error import * … … 155 155 yaml_constructors = {} 156 156 157 class Constructor(BaseConstructor):157 class SafeConstructor(BaseConstructor): 158 158 159 159 def construct_yaml_null(self, node): … … 333 333 node.start_mark) 334 334 335 Constructor.add_constructor(335 SafeConstructor.add_constructor( 336 336 u'tag:yaml.org,2002:null', 337 Constructor.construct_yaml_null)338 339 Constructor.add_constructor(337 SafeConstructor.construct_yaml_null) 338 339 SafeConstructor.add_constructor( 340 340 u'tag:yaml.org,2002:bool', 341 Constructor.construct_yaml_bool)342 343 Constructor.add_constructor(341 SafeConstructor.construct_yaml_bool) 342 343 SafeConstructor.add_constructor( 344 344 u'tag:yaml.org,2002:int', 345 Constructor.construct_yaml_int)346 347 Constructor.add_constructor(345 SafeConstructor.construct_yaml_int) 346 347 SafeConstructor.add_constructor( 348 348 u'tag:yaml.org,2002:float', 349 Constructor.construct_yaml_float)350 351 Constructor.add_constructor(349 SafeConstructor.construct_yaml_float) 350 351 SafeConstructor.add_constructor( 352 352 u'tag:yaml.org,2002:binary', 353 Constructor.construct_yaml_binary)353 SafeConstructor.construct_yaml_binary) 354 354 355 355 if datetime_available: 356 Constructor.add_constructor(356 SafeConstructor.add_constructor( 357 357 u'tag:yaml.org,2002:timestamp', 358 Constructor.construct_yaml_timestamp)359 360 Constructor.add_constructor(358 SafeConstructor.construct_yaml_timestamp) 359 360 SafeConstructor.add_constructor( 361 361 u'tag:yaml.org,2002:omap', 362 Constructor.construct_yaml_omap)363 364 Constructor.add_constructor(362 SafeConstructor.construct_yaml_omap) 363 364 SafeConstructor.add_constructor( 365 365 u'tag:yaml.org,2002:pairs', 366 Constructor.construct_yaml_pairs)367 368 Constructor.add_constructor(366 SafeConstructor.construct_yaml_pairs) 367 368 SafeConstructor.add_constructor( 369 369 u'tag:yaml.org,2002:set', 370 Constructor.construct_yaml_set)371 372 Constructor.add_constructor(370 SafeConstructor.construct_yaml_set) 371 372 SafeConstructor.add_constructor( 373 373 u'tag:yaml.org,2002:str', 374 Constructor.construct_yaml_str)375 376 Constructor.add_constructor(374 SafeConstructor.construct_yaml_str) 375 376 SafeConstructor.add_constructor( 377 377 u'tag:yaml.org,2002:seq', 378 Constructor.construct_yaml_seq)379 380 Constructor.add_constructor(378 SafeConstructor.construct_yaml_seq) 379 380 SafeConstructor.add_constructor( 381 381 u'tag:yaml.org,2002:map', 382 Constructor.construct_yaml_map) 383 384 Constructor.add_constructor(None, 385 Constructor.construct_undefined) 386 387 class YAMLObjectMetaclass(type): 388 389 def __init__(cls, name, bases, kwds): 390 super(YAMLObjectMetaclass, cls).__init__(name, bases, kwds) 391 if 'yaml_tag' in kwds and kwds['yaml_tag'] is not None: 392 cls.yaml_constructor.add_constructor(cls.yaml_tag, cls.from_yaml) 393 394 class YAMLObject(object): 395 396 __metaclass__ = YAMLObjectMetaclass 397 398 yaml_constructor = Constructor 399 400 yaml_tag = None 401 402 def from_yaml(cls, constructor, node): 403 raise ConstructorError(None, None, 404 "found undefined constructor for the tag %r" 405 % node.tag.encode('utf-8'), node.start_mark) 406 from_yaml = classmethod(from_yaml) 407 408 def to_yaml(self): 409 assert False # needs dumper 410 382 SafeConstructor.construct_yaml_map) 383 384 SafeConstructor.add_constructor(None, 385 SafeConstructor.construct_undefined) 386 387 class Constructor(SafeConstructor): 388 pass 389 -
pyyaml/trunk/lib/yaml/emitter.py
r132 r133 77 77 # Formatting details. 78 78 self.canonical = False 79 self.allow_unicode = False 79 80 self.best_line_break = u'\n' 80 81 self.best_indent = 2 … … 141 142 self.encoding = self.event.encoding 142 143 self.canonical = self.event.canonical 144 self.allow_unicode = self.event.allow_unicode 143 145 if self.event.indent and self.event.indent > 1: 144 146 self.best_indent = self.event.indent … … 622 624 if followed_by_space or last: 623 625 contains_block_indicator = True 624 if ch == u'-' and followed_by_space or last:626 if ch == u'-' and (followed_by_space or last): 625 627 contains_flow_indicator = True 626 628 contains_block_indicator = True … … 632 634 if followed_by_space or last: 633 635 contains_block_indicator = True 634 if ch == u'#' and preceeded_by_space:636 if ch == u'#' and (preceeded_by_space or first): 635 637 contains_flow_indicator = True 636 638 contains_block_indicator = True … … 641 643 contains_special_characters = True 642 644 else: 643 contains_special_characters = True644 # TODO: We need an option to allow unescaped unicode645 # characters.646 645 contains_unicode_characters = True 647 646 if ch == u' ': … … 692 691 followed_by_space = (index+1 < len(scalar) and 693 692 scalar[index+1] in u'\0 \t\r\n\x85\u2028\u2029') 693 if contains_unicode_characters and not self.allow_unicode: 694 contains_special_characters = True 694 695 allow_flow_plain = not (contains_flow_indicator or contains_special_characters 695 696 or contains_leading_spaces or contains_leading_breaks … … 854 855 if end < len(text): 855 856 ch = text[end] 856 if ch is None or not (u'\x20' <= ch <= u'\x7E') or ch in u'"\\': 857 if ch is None or ch in u'"\\' \ 858 or not (u'\x20' <= ch <= u'\x7E' 859 or (self.allow_unicode and ch > u'\x7F' 860 and ch not in u'\x85\u2028\u2029')): 857 861 if start < end: 858 862 data = text[start:end] -
pyyaml/trunk/lib/yaml/events.py
r132 r133 36 36 def __init__(self, start_mark=None, end_mark=None, 37 37 encoding=None, line_break=None, canonical=None, 38 indent=None, width=None ):38 indent=None, width=None, allow_unicode=None): 39 39 self.start_mark = start_mark 40 40 self.end_mark = end_mark … … 44 44 self.indent = indent 45 45 self.width = width 46 self.allow_unicode = allow_unicode 46 47 47 48 class StreamEndEvent(Event): -
pyyaml/trunk/lib/yaml/nodes.py
r132 r133 24 24 class ScalarNode(Node): 25 25 id = 'scalar' 26 def __init__(self, tag, value, implicit, start_mark, end_mark): 26 def __init__(self, tag, value, implicit, 27 start_mark=None, end_mark=None, style=None): 27 28 self.tag = tag 28 29 self.value = value … … 30 31 self.start_mark = start_mark 31 32 self.end_mark = end_mark 33 self.style = style 32 34 33 35 class CollectionNode(Node): 34 pass 36 def __init__(self, tag, value, 37 start_mark=None, end_mark=None, flow_style=None): 38 self.tag = tag 39 self.value = value 40 self.start_mark = start_mark 41 self.end_mark = end_mark 42 self.flow_style = flow_style 35 43 36 44 class SequenceNode(CollectionNode): -
pyyaml/trunk/lib/yaml/resolver.py
r132 r133 1 1 2 __all__ = [' BaseResolver', 'Resolver', 'ResolverError']2 __all__ = ['Resolver', 'ResolverError'] 3 3 4 4 from error import MarkedYAMLError 5 from detector import Detector 5 6 from nodes import * 6 7 … … 11 12 pass 12 13 13 class BaseResolver:14 class Resolver(Detector): 14 15 15 16 DEFAULT_SCALAR_TAG = u'tag:yaml.org,2002:str' … … 58 59 def resolve_scalar(self, path, node): 59 60 if node.tag is None and node.implicit: 60 node.tag = self.detect _scalar(node.value)61 node.tag = self.detect(node.value) 61 62 if node.tag is None or node.tag == u'!': 62 63 node.tag = self.DEFAULT_SCALAR_TAG … … 70 71 node.tag = self.DEFAULT_MAPPING_TAG 71 72 72 def detect_scalar(self, value):73 if value == u'':74 detectors = self.yaml_detectors.get(u'', [])75 else:76 detectors = self.yaml_detectors.get(value[0], [])77 detectors += self.yaml_detectors.get(None, [])78 for tag, regexp in detectors:79 if regexp.match(value):80 return tag81 82 def add_detector(cls, tag, regexp, first):83 if not 'yaml_detectors' in cls.__dict__:84 cls.yaml_detectors = cls.yaml_detectors.copy()85 for ch in first:86 cls.yaml_detectors.setdefault(ch, []).append((tag, regexp))87 add_detector = classmethod(add_detector)88 89 yaml_detectors = {}90 91 class Resolver(BaseResolver):92 pass93 94 Resolver.add_detector(95 u'tag:yaml.org,2002:bool',96 re.compile(ur'''^(?:yes|Yes|YES|n|N|no|No|NO97 |true|True|TRUE|false|False|FALSE98 |on|On|ON|off|Off|OFF)$''', re.X),99 list(u'yYnNtTfFoO'))100 101 Resolver.add_detector(102 u'tag:yaml.org,2002:float',103 re.compile(ur'''^(?:[-+]?(?:[0-9][0-9_]*)?\.[0-9_]*(?:[eE][-+][0-9]+)?104 |[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\.[0-9_]*105 |[-+]?\.(?:inf|Inf|INF)106 |\.(?:nan|NaN|NAN))$''', re.X),107 list(u'-+0123456789.'))108 109 Resolver.add_detector(110 u'tag:yaml.org,2002:int',111 re.compile(ur'''^(?:[-+]?0b[0-1_]+112 |[-+]?0[0-7_]+113 |[-+]?(?:0|[1-9][0-9_]*)114 |[-+]?0x[0-9a-fA-F_]+115 |[-+]?[1-9][0-9_]*(?::[0-5]?[0-9])+)$''', re.X),116 list(u'-+0123456789'))117 118 Resolver.add_detector(119 u'tag:yaml.org,2002:merge',120 re.compile(ur'^(?:<<)$'),121 ['<'])122 123 Resolver.add_detector(124 u'tag:yaml.org,2002:null',125 re.compile(ur'''^(?: ~126 |null|Null|NULL127 | )$''', re.X),128 [u'~', u'n', u'N', u''])129 130 Resolver.add_detector(131 u'tag:yaml.org,2002:timestamp',132 re.compile(ur'''^(?:[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]133 |[0-9][0-9][0-9][0-9] -[0-9][0-9]? -[0-9][0-9]?134 (?:[Tt]|[ \t]+)[0-9][0-9]?135 :[0-9][0-9] :[0-9][0-9] (?:\.[0-9]*)?136 (?:[ \t]*(?:Z|[-+][0-9][0-9]?(?::[0-9][0-9])?))?)$''', re.X),137 list(u'0123456789'))138 139 Resolver.add_detector(140 u'tag:yaml.org,2002:value',141 re.compile(ur'^(?:=)$'),142 ['='])143 144 # The following detector is only for documentation purposes. It cannot work145 # because plain scalars cannot start with '!', '&', or '*'.146 Resolver.add_detector(147 u'tag:yaml.org,2002:yaml',148 re.compile(ur'^(?:!|&|\*)$'),149 list(u'!&*'))150 -
pyyaml/trunk/tests/data/scalars.events
r130 r133 19 19 - !Scalar { implicit: true, value: 'block scalar with tag' } 20 20 - !Scalar { value: 'data', style: '|', tag: '!mytag' } 21 - !Scalar { implicit: true, value: 'single character' } 22 - !Scalar { value: 'a', implicit: true } 23 - !Scalar { implicit: true, value: 'single digit' } 24 - !Scalar { value: '1', implicit: true } 21 25 - !MappingEnd 22 26 - !DocumentEnd -
pyyaml/trunk/tests/test_emitter.py
r132 r133 76 76 77 77 def _testEmitterEvents(self, test_name, events_filename): 78 events = list(load _document(file(events_filename, 'rb'), Constructor=EventsConstructor))78 events = list(load(file(events_filename, 'rb'), Constructor=EventsConstructor)) 79 79 #self._dump(events_filename, events) 80 80 writer = StringIO.StringIO() -
pyyaml/trunk/tests/test_yaml.py
r132 r133 11 11 from test_constructor import * 12 12 from test_emitter import * 13 from test_representer import * 13 14 from test_syck import * 14 15
Note: See TracChangeset
for help on using the changeset viewer.
