Makoto Kuwata | 7 Jan 2008 21:59

Re: [Q] How to compose, serialize, and emit in PyYAML?

> Q1. How to compose nodes from event list?

The following code can compose nodes from event list.

--------------------
import yaml
from yaml.events import StreamStartEvent, StreamEndEvent, DocumentStartEvent
from yaml.composer import Composer, ComposerError

class MyComposer(Composer):

    def __init__(self):
        resolver = yaml.resolver.Resolver()
        self.descend_resolver = resolver.descend_resolver
        self.ascend_resolver  = resolver.ascend_resolver
        self.resolve          = resolver.resolve

    def _set_events(self, events):
        self._events = events
        self._index = 0

    def peek_event(self):
        if self._index >= len(self._events):
            return None
        return self._events[self._index]

    def check_event(self, event_class):
        return isinstance(self.peek_event(), event_class)

    def get_event(self):
        event = self.peek_event()
        self._index += 1
        return event

    def compose(self, events):
        self._set_events(events)
        if self.check_event(StreamStartEvent):
            self.get_event()
        node = self.compose_document()
        self._confirm_event((StreamEndEvent, DocumentStartEvent, ))
        return node

    def compose_all(self, events):
        self._set_events(events)
        if self.check_event(StreamStartEvent):
            self.get_event()
        node = self.compose_document()
        yield node
        while self.check_event(DocumentStartEvent):
            node = self.compose_document()
            yield node
        self._confirm_event(StreamEndEvent)

    def _confirm_event(self, event_class):
        if not self.check_event(event_class):
            name = self.peek_event().__class__.__name__
            raise ComposerError("%s: unexteced event" % name)

if __name__ == '__main__':
    string = """
- abc
- 123
- yes
"""
    ## parse input into event list
    events = [ event for event in yaml.parse(string) ]
    ## compose nodes from event list
    composer = MyComposer()
    #node = composer.compose(events)
    #print node
    for node in composer.compose_all(events):
        print node
--------------------

If there is more simple way, please tell me.

--
regards,
makoto kuwata

On Jan 7, 2008 10:00 PM, Makoto Kuwata <kwa@...> wrote:
> Hi,
> I'm investigating PyYAML 3.05 and have some questions.
>
> Q1. How to compose nodes from event list?
> Q2. How to serialize node into event list?
> Q3. How to emit event list into stram?
>
> example:
> --------------------
> import yaml
>
> string = """
> - abc
> - 123
> - yes
> """
>
> ## parse string and get event list
> events = [ event for event in yaml.parse(string) ]
>
> ### compose nodes from event list
> node = ??????   # yaml.compose(string) is not what I want
>
> ## construct Python data from nodes
> constructor = yaml.constructor.Constructor()
> data = constructor.construct_document(node)
>
> ## convert data into node
> representer = yaml.representer.Representer()
> node = representer.represent_data(data)
>
> ## convert node into event list
> events = ??????
>
> ## convert event list into string
> string = ??????
> --------------------
>
> --
> regards,
> makoto kuwata
>

-------------------------------------------------------------------------
Check out the new SourceForge.net Marketplace.
It's the best place to buy or sell services for
just about anything Open Source.
http://ad.doubleclick.net/clk;164216239;13503038;w?http://sf.net/marketplace

Gmane