In [1]:
import axon

In [3]:
#@axon.schema("person")
class SchemaPerson:
    #
    def mapping_factory(self, attrs):
        return Person(
                schema_profile.factory(attrs["profile"]),
                [schema_post.factory(p) for p in attrs["posts"]])
    #
    def reduce(self, obj):
        return axon.mapping("person", 
                    {"profile":schema_profile.reduce(obj.profile), 
                     "posts":[schema_post.reduce(p) for p in obj.posts]})
    
                            
#@axon.schema("post")
class SchemaPost:
    #
    def factory(self, args):
        return Post(*args)
    #
    def validate(self, post, context):
        return post["date"].year > 1900
    #
    def reduce(self, obj):
        return {"to":obj.to, "text":obj.text, "date":obj.date, "time":obj.time}
    #

#@axon.schema("profile")
class SchemaProfile:
    #
    def factory(self, name, age):
        return Profile(name, age)
    #
    def reduce(self, obj):
        return {"name": obj.name, "age":obj.age}
    #

In [4]:
text = """
person {
    profile: {
        name: "Alex"
        age: 27    
    }
    posts: [
        {to:"Frank" text:"Hello Frank" date:2015-04-20 time:12:23:24}
        {to:"Henry" text:"How are you" date:2015-04-20 time:12:26:38}
    ]
}
"""

In [ ]: