使用类似猫鼬的模式为石墨烯编写类似阿波罗的解析器。
graphene-resolver的Python项目详细描述
石墨烯分解器
用类猫鼬模式编写类阿波罗的解析器。在
安装
pip install graphene-resolver
使用
简单示例:
importgrapheneimportgraphene_resolverasresolverclassFoo(resolver.Resolver):schema={"args":{"key":'String!',"value":'String!',},"type":'String!',}defresolve(self,**kwargs):self.parent# parent fieldself.info# resolve infoself.context# resolve contextreturnkwargs['value']classQuery(graphene.ObjectType):foo=Foo.as_field()^{pr2}$
{"foo":"v"}
中继节点:
pets=[dict(id=1,name='pet1',age=1,)]classPet(resolver.Resolver):schema={'type':{'name':'String','age':'Int',},'interfaces':(graphene.Node,)}defget_node(self,id_):returnnext(iforiinpetsifi['id']==int(id_))defvalidate(self,value):return(isinstance(value,typing.Mapping)andisinstance(value.get('name'),str)andisinstance(value.get('age'),int))classQuery(graphene.ObjectType):node=graphene.Node.Field()schema=graphene.Schema(query=Query,types=[Pet.as_type()])
{ node(id: "UGV0OjE=") { id __typename ... on Pet { name age } } }
{"node":{"id":"UGV0OjE=","__typename":"Pet","name":"pet1","age":1}}
继电器连接:
classItem(resolver.Resolver):schema={'name':'String!'}classItems(resolver.Resolver):schema=resolver.connection.get_type(Item)defresolve(self,**kwargs):returnresolver.connection.resolve([{'name':'a'},{'name':'b'}],**kwargs)
{ items { edges { node { name } cursor } pageInfo { total hasNextPage hasPreviousPage startCursor endCursor } } }
{"items":{"edges":[{"node":{"name":"a"},"cursor":"YXJyYXljb25uZWN0aW9uOjA="},{"node":{"name":"b"},"cursor":"YXJyYXljb25uZWN0aW9uOjE="}],"pageInfo":{"total":2,"hasNextPage":false,"hasPreviousPage":false,"startCursor":"YXJyYXljb25uZWN0aW9uOjA=","endCursor":"YXJyYXljb25uZWN0aW9uOjE="}}}
枚举:
classFoo(resolver.Resolver):schema=('a','b')defresolve(self,**kwargs):return'a'classQuery(graphene.ObjectType):foo=Foo.as_field()schema=graphene.Schema(query=Query)assertstr(schema)=='''\schema { query: Query}enum Foo { a b}type Query { foo: Foo}'''
带说明的枚举:
classFoo(resolver.Resolver):schema={'type':[('a','this is a'),('b','this is b'),'c'],'description':'A enum',}defresolve(self,**kwargs):return'a'classQuery(graphene.ObjectType):foo=Foo.as_field()schema=graphene.Schema(query=Query)enum_type=schema.get_type('Foo')assertenum_type.description=='A enum'assertenum_type.get_value('a').value=='a'assertenum_type.get_value('a').description=='this is a'assertenum_type.get_value('b').value=='b'assertenum_type.get_value('b').description=='this is b'assertenum_type.get_value('c').value=='c'assertenum_type.get_value('c').descriptionisNone
工会:
classFoo(resolver.Resolver):schema=({'a':'String'},{'b':'Int'})defresolve(self,**kwargs):return{'__typename':'Foo0','a':'a'}classQuery(graphene.ObjectType):foo=Foo.as_field()schema=graphene.Schema(query=Query)assertstr(schema)=='''\schema { query: Query}union Foo = Foo0 | Foo1type Foo0 { a: String}type Foo1 { b: Int}type Query { foo: Foo}'''
{ foo { __typename ... on Foo0 { a } } }
{"foo":{"__typename":"Foo0","a":"a"}}
复杂的例子:
classFoo(resolver.Resolver):_input_schema={"type":{"type":'String'},"data":[{"type":{"key":{"type":'String',"required":True,"description":"<description>",},"value":'Int',"extra":{"type":['String!'],"deprecation_reason":"<deprecated>"},},"required":True},],}schema={"args":{"input":_input_schema},"type":_input_schema,"description":"description","deprecation_reason":None}defresolve(self,**kwargs):returnkwargs['input']
{ foo( input: { type: "type", data: [{ key: "key", value: 42, extra: ["extra"] }] } ) { type data { key value extra } } }
{"foo":{"type":"type","data":[{"key":"key","value":42,"extra":["extra"]}]}}
- 项目
标签: