예제 #1
0
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())
예제 #2
0
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
예제 #3
0
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
예제 #4
0
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__
예제 #5
0
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)
예제 #6
0
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()
예제 #7
0
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)
예제 #8
0
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')
예제 #9
0
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')
예제 #10
0
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()
예제 #11
0
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')
예제 #12
0
class NameQueryRootTwo(Object):
    name = CharField()
예제 #13
0
class Character(Object):
    name = CharField()
    friends = ManyRelatedField('self')
    appears_in = ManyRelatedField(Episode)
예제 #14
0
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
예제 #16
0
class EnumValueObject(Object):
    object_name = '__EnumValue'
    name = CharField()
    description = CharField()
    isDeprecated = BooleanField()
    deprecationReason = CharField()
예제 #17
0
class DirectiveObject(Object):
    object_name = '__Directive'
    name = CharField()
    description = CharField()
    locations = ManyEnumField(DirectiveLocationEnum)
    args = ManyRelatedField(InputValueObject)
예제 #18
0
class NameQueryRootOne(Object):
    name = CharField()

    def get_name(self):
        pass
예제 #19
0
class ThoughtQueryRoot(Object):
    thought = CharField()