class FieldObject(Object): # self.data will be an item from a declared fields dict object_name = '__Field' name = CharField() description = CharField() type = RelatedField(lambda: TypeObject) args = ManyRelatedField(InputValueObject) isDeprecated = BooleanField() deprecationReason = CharField() def get_name(self): return self.data[0] def get_description(self): return getattr(self.data[1], 'description', None) def get_type(self): field = self.data[1] if isinstance(field, RelatedField): type_ = field.object_type if isinstance(field.type_, List): type_ = List(type_) else: type_ = field.type_ return type_ def get_args(self): return tuple(self.data[1].arguments.items())
class Type(Object): # self.data will be an object or scalar object_name = '__Type' kind = EnumField(TypeKindEnum) name = CharField() description = CharField() fields = ManyRelatedField(Field) inputFields = ManyRelatedField(InputValue) interfaces = ManyRelatedField('self') possibleTypes = ManyRelatedField('self') enumValues = ManyRelatedField(EnumValue) ofType = RelatedField('self') def get_name(self): if self.data.kind in [LIST, NON_NULL]: return None return self.data.object_name def get_fields(self): if self.data.kind != OBJECT: return None return sorted( ((name, field) for name, field in self.data._declared_fields.items() if name[:2] != '__'), key=lambda item: item[0], ) def get_inputFields(self): if self.data.kind != INPUT_OBJECT: return None return [] def get_interfaces(self): if self.data.kind != OBJECT: return None return [] def get_possibleTypes(self): return None def get_enumValues(self): if self.data.kind != ENUM: return None return self.data.values def get_ofType(self): if self.data.kind in [NON_NULL, LIST]: type_ = self.data.type_ # Don't return NonNull if self is already NonNull if self.data.kind is not NON_NULL and not getattr( type_, 'null', True): return NonNull(type_) return type_ return None
class TypeObject(Object): # self.data will be an object or scalar object_name = '__Type' kind = EnumField(TypeKindEnum) name = CharField() description = CharField() fields = ManyRelatedField(FieldObject) inputFields = ManyRelatedField(InputValueObject) interfaces = ManyRelatedField('self') possibleTypes = ManyRelatedField('self') enumValues = ManyRelatedField(EnumValueObject) ofType = RelatedField('self') def get_name(self): if self.data.kind == LIST: return None return self.data.object_name def get_fields(self): if self.data.kind != OBJECT: return None return sorted( ((name, field) for name, field in self.data._declared_fields.items() if name[:2] != '__'), key=lambda item: item[0], ) def get_inputFields(self): if self.data.kind != INPUT_OBJECT: return None return [] def get_interfaces(self): if self.data.kind != OBJECT: return None return [] def get_possibleTypes(self): return None def get_enumValues(self): if self.data.kind != ENUM: return None return self.data.values def get_ofType(self): if self.data.kind == LIST: return self.data.type_ return None
class InputValueObject(Object): object_name = '__InputValue' name = CharField() description = CharField() type = RelatedField(lambda: TypeObject) defaultValue = CharField() def get_name(self): return self.data[0] def get_type(self): type_ = self.data[1] if isinstance(type_, List): return type_ return type_.__class__
def test_field__get_type(): field_object = FieldObject( None, ('name', CharField()), None, ) assert field_object.get_type() == String field_object = FieldObject( None, ('characters', RelatedField('self')), None, ) field_object.data[1]._self_object_type = Character assert field_object.get_type() == Character field_object = FieldObject( None, ('characters', RelatedField(Character)), None, ) assert field_object.get_type() == Character field_object = FieldObject( None, ('characters', ManyRelatedField(Character)), None, ) assert field_object.get_type() == List(Character)
class Character(Object): id = IntegerField() name = CharField() friends = ManyRelatedField('self') best_friend = RelatedField('self') appears_in = ManyRelatedField(Episode) def get_best_friend(self): return self.data.friends.order_by('pk').first()
def test_field__get_type(): field_object = Field( None, ('name', CharField()), None, ) assert field_object.get_type() == String field_object = Field( None, ('characters', RelatedField('self')), None, ) field_object.data[1]._self_object_type = Character assert field_object.get_type() == Character field_object = Field( None, ('characters', RelatedField(Character)), None, ) assert field_object.get_type() == Character field_object = Field( None, ('characters', RelatedField(lambda: Character)), None, ) assert field_object.get_type() == Character field_object = Field( None, ('characters', RelatedField('test_app.schema.Character')), None, ) assert field_object.get_type() == Character field_object = Field( None, ('characters', ManyRelatedField(Character)), None, ) assert field_object.get_type() == List(Character) field_object = Field( None, ('characters', ManyRelatedField(Character, null=False)), None, ) assert field_object.get_type() == NonNull(List(Character)) field_object = Field( None, ('id', IntegerField(null=False)), None, ) assert field_object.get_type() == NonNull(Int)
class Episode(Object): name = CharField(description='The name of an episode') number = IntegerField() characters = ManyRelatedField(lambda: Character, types=List(String)) next = RelatedField('self') def get_next(self): return EpisodeModel.objects.filter(number=self.data.number + 1).first() def get_characters(self, types): q = Q() if types is not None: if 'human' not in types: q &= Q(human=None) if 'droid' not in types: q &= Q(droid=None) return self.data.characters.filter(q).order_by('pk')
def test_field_get_resolver_args_calls_coerce_input(coerce_input_mock): field = CharField(arguments={'foo': Boolean()}) selection = mock.MagicMock() argument = mock.Mock() argument.name = 'foo' argument.value = 'bar' selection.arguments = [argument] obj = mock.MagicMock() field.bind(selection, obj) field.get_resolver_args() coerce_input_mock.assert_called_once_with('bar')
def test_get_resolver_args_coercion_error(): field = CharField(arguments={'foo': Int()}) selection = mock.MagicMock() argument = mock.Mock() argument.name = 'foo' argument.value = 'bar' selection.arguments = [argument] obj = mock.MagicMock() field.bind(selection, obj) with pytest.raises(GraphQLError): field.get_resolver_args()
class Episode(Object): name = CharField(description='The name of an episode') number = IntegerField() characters = ManyRelatedField( 'test_app.schema.Character', arguments={ 'types': List(String(null=False)), }, ) next = RelatedField('self') def get_next(self): return EpisodeModel.objects.filter(number=self.data.number + 1).first() def get_characters(self, types): q = Q() if types is not None: if 'human' not in types: q &= Q(human=None) if 'droid' not in types: q &= Q(droid=None) return self.data.characters.filter(q).order_by('pk')
class NameQueryRootTwo(Object): name = CharField()
class Character(Object): name = CharField() friends = ManyRelatedField('self') appears_in = ManyRelatedField(Episode)
class Episode(Object): name = CharField() number = IntegerField()
class QueryRootWithNestedArgs(Object): nested = CharField( arguments={'arg': List(List(Int(null=False), null=False), null=False)}) def get_nested(self, arg): return 1
class EnumValueObject(Object): object_name = '__EnumValue' name = CharField() description = CharField() isDeprecated = BooleanField() deprecationReason = CharField()
class DirectiveObject(Object): object_name = '__Directive' name = CharField() description = CharField() locations = ManyEnumField(DirectiveLocationEnum) args = ManyRelatedField(InputValueObject)
class NameQueryRootOne(Object): name = CharField() def get_name(self): pass
class ThoughtQueryRoot(Object): thought = CharField()