7 __all__ = [
'BaseConstructor',
'SafeConstructor',
'Constructor',
18 from sets
import Set
as set
20 import binascii, re, sys, types
27 yaml_constructors = {}
28 yaml_multi_constructors = {}
38 return self.check_node()
50 for generator
in state_generators:
51 for dummy
in generator:
66 "found unconstructable recursive node", node.start_mark)
69 state_constructor =
None
75 if node.tag.startswith(tag_prefix):
76 tag_suffix = node.tag[
len(tag_prefix):]
85 elif isinstance(node, ScalarNode):
86 constructor = self.__class__.construct_scalar
87 elif isinstance(node, SequenceNode):
88 constructor = self.__class__.construct_sequence
89 elif isinstance(node, MappingNode):
90 constructor = self.__class__.construct_mapping
91 if tag_suffix
is None:
92 data = constructor(self, node)
94 data = constructor(self, tag_suffix, node)
95 if isinstance(data, types.GeneratorType):
97 data = generator.next()
99 for dummy
in generator:
102 self.state_generators.append(generator)
110 if not isinstance(node, ScalarNode):
112 "expected a scalar node, but found %s" % node.id,
117 if not isinstance(node, SequenceNode):
119 "expected a sequence node, but found %s" % node.id,
122 for child
in node.value]
125 if not isinstance(node, MappingNode):
127 "expected a mapping node, but found %s" % node.id,
130 for key_node, value_node
in node.value:
134 except TypeError, exc:
136 "found unacceptable key (%s)" % exc, key_node.start_mark)
142 if not isinstance(node, MappingNode):
144 "expected a mapping node, but found %s" % node.id,
147 for key_node, value_node
in node.value:
150 pairs.append((key, value))
154 if not 'yaml_constructors' in cls.__dict__:
155 cls.yaml_constructors = cls.yaml_constructors.copy()
156 cls.yaml_constructors[tag] = constructor
157 add_constructor = classmethod(add_constructor)
160 if not 'yaml_multi_constructors' in cls.__dict__:
161 cls.yaml_multi_constructors = cls.yaml_multi_constructors.copy()
162 cls.yaml_multi_constructors[tag_prefix] = multi_constructor
163 add_multi_constructor = classmethod(add_multi_constructor)
168 if isinstance(node, MappingNode):
169 for key_node, value_node
in node.value:
170 if key_node.tag ==
u'tag:yaml.org,2002:value':
172 return BaseConstructor.construct_scalar(self, node)
177 while index <
len(node.value):
178 key_node, value_node = node.value[index]
179 if key_node.tag ==
u'tag:yaml.org,2002:merge':
180 del node.value[index]
181 if isinstance(value_node, MappingNode):
183 merge.extend(value_node.value)
184 elif isinstance(value_node, SequenceNode):
186 for subnode
in value_node.value:
187 if not isinstance(subnode, MappingNode):
190 "expected a mapping for merging, but found %s"
191 % subnode.id, subnode.start_mark)
193 submerge.append(subnode.value)
195 for value
in submerge:
199 "expected a mapping or list of mappings for merging, but found %s"
200 % value_node.id, value_node.start_mark)
201 elif key_node.tag ==
u'tag:yaml.org,2002:value':
202 key_node.tag =
u'tag:yaml.org,2002:str'
207 node.value = merge + node.value
210 if isinstance(node, MappingNode):
212 return BaseConstructor.construct_mapping(self, node, deep=deep)
233 value = value.replace(
'_',
'')
241 elif value.startswith(
'0b'):
242 return sign*
int(value[2:], 2)
243 elif value.startswith(
'0x'):
244 return sign*
int(value[2:], 16)
245 elif value[0] ==
'0':
246 return sign*
int(value, 8)
248 digits = [
int(part)
for part
in value.split(
':')]
257 return sign*
int(value)
260 while inf_value != inf_value*inf_value:
261 inf_value *= inf_value
262 nan_value = -inf_value/inf_value
266 value = value.replace(
'_',
'').lower()
274 elif value ==
'.nan':
277 digits = [
float(part)
for part
in value.split(
':')]
286 return sign*
float(value)
291 return str(value).decode(
'base64')
292 except (binascii.Error, UnicodeEncodeError), exc:
294 "failed to decode base64 data: %s" % exc, node.start_mark)
296 timestamp_regexp = re.compile(
297 ur'''^(?P<year>[0-9][0-9][0-9][0-9])
298 -(?P<month>[0-9][0-9]?)
299 -(?P<day>[0-9][0-9]?)
301 (?P<hour>[0-9][0-9]?)
302 :(?P<minute>[0-9][0-9])
303 :(?P<second>[0-9][0-9])
304 (?:\.(?P<fraction>[0-9]*))?
305 (?:[ \t]*(?P<tz>Z|(?P<tz_sign>[-+])(?P<tz_hour>[0-9][0-9]?)
306 (?::(?P<tz_minute>[0-9][0-9]))?))?)?$''', re.X)
310 match = self.timestamp_regexp.match(node.value)
311 values = match.groupdict()
312 year =
int(values[
'year'])
313 month =
int(values[
'month'])
314 day =
int(values[
'day'])
315 if not values[
'hour']:
316 return datetime.date(year, month, day)
317 hour =
int(values[
'hour'])
318 minute =
int(values[
'minute'])
319 second =
int(values[
'second'])
321 if values[
'fraction']:
322 fraction =
int(values[
'fraction'][:6].
ljust(6,
'0'))
324 if values[
'tz_sign']:
325 tz_hour =
int(values[
'tz_hour'])
326 tz_minute =
int(values[
'tz_minute']
or 0)
327 delta = datetime.timedelta(hours=tz_hour, minutes=tz_minute)
328 if values[
'tz_sign'] ==
'-':
330 data = datetime.datetime(year, month, day, hour, minute, second, fraction)
340 if not isinstance(node, SequenceNode):
341 raise ConstructorError(
"while constructing an ordered map", node.start_mark,
342 "expected a sequence, but found %s" % node.id, node.start_mark)
343 for subnode
in node.value:
344 if not isinstance(subnode, MappingNode):
345 raise ConstructorError(
"while constructing an ordered map", node.start_mark,
346 "expected a mapping of length 1, but found %s" % subnode.id,
348 if len(subnode.value) != 1:
349 raise ConstructorError(
"while constructing an ordered map", node.start_mark,
350 "expected a single mapping item, but found %d items" %
len(subnode.value),
352 key_node, value_node = subnode.value[0]
355 omap.append((key, value))
361 if not isinstance(node, SequenceNode):
363 "expected a sequence, but found %s" % node.id, node.start_mark)
364 for subnode
in node.value:
365 if not isinstance(subnode, MappingNode):
367 "expected a mapping of length 1, but found %s" % subnode.id,
369 if len(subnode.value) != 1:
371 "expected a single mapping item, but found %d items" %
len(subnode.value),
373 key_node, value_node = subnode.value[0]
376 pairs.append((key, value))
387 return value.encode(
'ascii')
388 except UnicodeEncodeError:
403 data = cls.__new__(cls)
405 if hasattr(data,
'__setstate__'):
407 data.__setstate__(state)
410 data.__dict__.update(state)
414 "could not determine a constructor for the tag %r" % node.tag.encode(
'utf-8'),
417 SafeConstructor.add_constructor(
418 u'tag:yaml.org,2002:null',
419 SafeConstructor.construct_yaml_null)
421 SafeConstructor.add_constructor(
422 u'tag:yaml.org,2002:bool',
423 SafeConstructor.construct_yaml_bool)
425 SafeConstructor.add_constructor(
426 u'tag:yaml.org,2002:int',
427 SafeConstructor.construct_yaml_int)
429 SafeConstructor.add_constructor(
430 u'tag:yaml.org,2002:float',
431 SafeConstructor.construct_yaml_float)
433 SafeConstructor.add_constructor(
434 u'tag:yaml.org,2002:binary',
435 SafeConstructor.construct_yaml_binary)
437 SafeConstructor.add_constructor(
438 u'tag:yaml.org,2002:timestamp',
439 SafeConstructor.construct_yaml_timestamp)
441 SafeConstructor.add_constructor(
442 u'tag:yaml.org,2002:omap',
443 SafeConstructor.construct_yaml_omap)
445 SafeConstructor.add_constructor(
446 u'tag:yaml.org,2002:pairs',
447 SafeConstructor.construct_yaml_pairs)
449 SafeConstructor.add_constructor(
450 u'tag:yaml.org,2002:set',
451 SafeConstructor.construct_yaml_set)
453 SafeConstructor.add_constructor(
454 u'tag:yaml.org,2002:str',
455 SafeConstructor.construct_yaml_str)
457 SafeConstructor.add_constructor(
458 u'tag:yaml.org,2002:seq',
459 SafeConstructor.construct_yaml_seq)
461 SafeConstructor.add_constructor(
462 u'tag:yaml.org,2002:map',
463 SafeConstructor.construct_yaml_map)
465 SafeConstructor.add_constructor(
None,
466 SafeConstructor.construct_undefined)
488 "expected non-empty name appended to the tag", mark)
491 except ImportError, exc:
493 "cannot find module %r (%s)" % (name.encode(
'utf-8'), exc), mark)
494 return sys.modules[name]
499 "expected non-empty name appended to the tag", mark)
503 items = name.split(
'.')
504 object_name = items.pop()
505 module_name =
'.'.
join(items)
507 module_name =
'__builtin__'
510 __import__(module_name)
511 except ImportError, exc:
513 "cannot find module %r (%s)" % (module_name.encode(
'utf-8'), exc), mark)
514 module = sys.modules[module_name]
515 if not hasattr(module, object_name):
517 "cannot find %r in the module %r" % (object_name.encode(
'utf-8'),
518 module.__name__), mark)
519 return getattr(module, object_name)
525 "expected the empty value, but found %r" % value.encode(
'utf-8'),
532 raise ConstructorError(
"while constructing a Python module", node.start_mark,
533 "expected the empty value, but found %r" % value.encode(
'utf-8'),
540 args=
None, kwds=
None, newobj=
False):
547 and not args
and not kwds:
549 instance.__class__ = cls
551 elif newobj
and isinstance(cls, type):
552 return cls.__new__(cls, *args, **kwds)
554 return cls(*args, **kwds)
557 if hasattr(instance,
'__setstate__'):
558 instance.__setstate__(state)
561 if isinstance(state, tuple)
and len(state) == 2:
562 state, slotstate = state
563 if hasattr(instance,
'__dict__'):
564 instance.__dict__.update(state)
566 slotstate.update(state)
567 for key, value
in slotstate.items():
568 setattr(object, key, value)
575 deep = hasattr(instance,
'__setstate__')
591 if isinstance(node, SequenceNode):
599 args = value.get(
'args', [])
600 kwds = value.get(
'kwds', {})
601 state = value.get(
'state', {})
602 listitems = value.get(
'listitems', [])
603 dictitems = value.get(
'dictitems', {})
608 instance.extend(listitems)
610 for key
in dictitems:
611 instance[key] = dictitems[key]
617 Constructor.add_constructor(
618 u'tag:yaml.org,2002:python/none',
619 Constructor.construct_yaml_null)
621 Constructor.add_constructor(
622 u'tag:yaml.org,2002:python/bool',
623 Constructor.construct_yaml_bool)
625 Constructor.add_constructor(
626 u'tag:yaml.org,2002:python/str',
627 Constructor.construct_python_str)
629 Constructor.add_constructor(
630 u'tag:yaml.org,2002:python/unicode',
631 Constructor.construct_python_unicode)
633 Constructor.add_constructor(
634 u'tag:yaml.org,2002:python/int',
635 Constructor.construct_yaml_int)
637 Constructor.add_constructor(
638 u'tag:yaml.org,2002:python/long',
639 Constructor.construct_python_long)
641 Constructor.add_constructor(
642 u'tag:yaml.org,2002:python/float',
643 Constructor.construct_yaml_float)
645 Constructor.add_constructor(
646 u'tag:yaml.org,2002:python/complex',
647 Constructor.construct_python_complex)
649 Constructor.add_constructor(
650 u'tag:yaml.org,2002:python/list',
651 Constructor.construct_yaml_seq)
653 Constructor.add_constructor(
654 u'tag:yaml.org,2002:python/tuple',
655 Constructor.construct_python_tuple)
657 Constructor.add_constructor(
658 u'tag:yaml.org,2002:python/dict',
659 Constructor.construct_yaml_map)
661 Constructor.add_multi_constructor(
662 u'tag:yaml.org,2002:python/name:',
663 Constructor.construct_python_name)
665 Constructor.add_multi_constructor(
666 u'tag:yaml.org,2002:python/module:',
667 Constructor.construct_python_module)
669 Constructor.add_multi_constructor(
670 u'tag:yaml.org,2002:python/object:',
671 Constructor.construct_python_object)
673 Constructor.add_multi_constructor(
674 u'tag:yaml.org,2002:python/object/apply:',
675 Constructor.construct_python_object_apply)
677 Constructor.add_multi_constructor(
678 u'tag:yaml.org,2002:python/object/new:',
679 Constructor.construct_python_object_new)
def construct_python_module
def construct_python_object_new
dictionary yaml_multi_constructors
def construct_python_object_apply
Fstring::size_type len(Fstring const &s)
Length.
def construct_yaml_timestamp
def construct_python_tuple
def construct_python_complex
def construct_python_long
tuple add_multi_constructor
def set_python_instance_state
def construct_python_object
def construct_python_unicode
Fstring ljust(Fstring const &s)
Left-Justified Copy.
def construct_yaml_binary
dictionary yaml_constructors
def construct_yaml_object
def construct_python_name