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

"Makoto Kuwata" <[email protected]>
Newsgroups gmane.text.yaml.general
Message-ID <[email protected]>
> 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 <[email protected]> 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
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.