105 lines
4.3 KiB
Python
105 lines
4.3 KiB
Python
|
|
import yaml
|
|
|
|
def _compare_events(events1, events2):
|
|
assert len(events1) == len(events2), (events1, events2)
|
|
for event1, event2 in zip(events1, events2):
|
|
assert event1.__class__ == event2.__class__, (event1, event2)
|
|
if isinstance(event1, yaml.NodeEvent):
|
|
assert event1.anchor == event2.anchor, (event1, event2)
|
|
if isinstance(event1, yaml.CollectionStartEvent):
|
|
assert event1.tag == event2.tag, (event1, event2)
|
|
if isinstance(event1, yaml.ScalarEvent):
|
|
if True not in event1.implicit+event2.implicit:
|
|
assert event1.tag == event2.tag, (event1, event2)
|
|
assert event1.value == event2.value, (event1, event2)
|
|
|
|
def test_emitter_on_data(data_filename, canonical_filename, verbose=False):
|
|
with open(data_filename, 'rb') as file:
|
|
events = list(yaml.parse(file))
|
|
output = yaml.emit(events)
|
|
if verbose:
|
|
print("OUTPUT:")
|
|
print(output)
|
|
new_events = list(yaml.parse(output))
|
|
_compare_events(events, new_events)
|
|
|
|
test_emitter_on_data.unittest = ['.data', '.canonical']
|
|
|
|
def test_emitter_on_canonical(canonical_filename, verbose=False):
|
|
with open(canonical_filename, 'rb') as file:
|
|
events = list(yaml.parse(file))
|
|
for canonical in [False, True]:
|
|
output = yaml.emit(events, canonical=canonical)
|
|
if verbose:
|
|
print("OUTPUT (canonical=%s):" % canonical)
|
|
print(output)
|
|
new_events = list(yaml.parse(output))
|
|
_compare_events(events, new_events)
|
|
|
|
test_emitter_on_canonical.unittest = ['.canonical']
|
|
|
|
def test_emitter_styles(data_filename, canonical_filename, verbose=False):
|
|
for filename in [data_filename, canonical_filename]:
|
|
with open(filename, 'rb') as file:
|
|
events = list(yaml.parse(file))
|
|
for flow_style in [False, True]:
|
|
for style in ['|', '>', '"', '\'', '']:
|
|
styled_events = []
|
|
for event in events:
|
|
if isinstance(event, yaml.ScalarEvent):
|
|
event = yaml.ScalarEvent(event.anchor, event.tag,
|
|
event.implicit, event.value, style=style)
|
|
elif isinstance(event, yaml.SequenceStartEvent):
|
|
event = yaml.SequenceStartEvent(event.anchor, event.tag,
|
|
event.implicit, flow_style=flow_style)
|
|
elif isinstance(event, yaml.MappingStartEvent):
|
|
event = yaml.MappingStartEvent(event.anchor, event.tag,
|
|
event.implicit, flow_style=flow_style)
|
|
styled_events.append(event)
|
|
output = yaml.emit(styled_events)
|
|
if verbose:
|
|
print("OUTPUT (filename=%r, flow_style=%r, style=%r)" % (filename, flow_style, style))
|
|
print(output)
|
|
new_events = list(yaml.parse(output))
|
|
_compare_events(events, new_events)
|
|
|
|
test_emitter_styles.unittest = ['.data', '.canonical']
|
|
|
|
class EventsLoader(yaml.Loader):
|
|
|
|
def construct_event(self, node):
|
|
if isinstance(node, yaml.ScalarNode):
|
|
mapping = {}
|
|
else:
|
|
mapping = self.construct_mapping(node)
|
|
class_name = str(node.tag[1:])+'Event'
|
|
if class_name in ['AliasEvent', 'ScalarEvent', 'SequenceStartEvent', 'MappingStartEvent']:
|
|
mapping.setdefault('anchor', None)
|
|
if class_name in ['ScalarEvent', 'SequenceStartEvent', 'MappingStartEvent']:
|
|
mapping.setdefault('tag', None)
|
|
if class_name in ['SequenceStartEvent', 'MappingStartEvent']:
|
|
mapping.setdefault('implicit', True)
|
|
if class_name == 'ScalarEvent':
|
|
mapping.setdefault('implicit', (False, True))
|
|
mapping.setdefault('value', '')
|
|
value = getattr(yaml, class_name)(**mapping)
|
|
return value
|
|
|
|
EventsLoader.add_constructor(None, EventsLoader.construct_event)
|
|
|
|
def test_emitter_events(events_filename, verbose=False):
|
|
with open(events_filename, 'rb') as file:
|
|
events = list(yaml.load(file, Loader=EventsLoader))
|
|
output = yaml.emit(events)
|
|
if verbose:
|
|
print("OUTPUT:")
|
|
print(output)
|
|
new_events = list(yaml.parse(output))
|
|
_compare_events(events, new_events)
|
|
|
|
if __name__ == '__main__':
|
|
import test_appliance
|
|
test_appliance.run(globals())
|
|
|