Skip to content

Commit 2420a68

Browse files
committed
[WIP] Implement Schema Parser
* Adds the schema type definitions to ast.ast to have generate_ast() generate classes for them. * parse_type_definition will now parse schema types. * Implement parsers for each schema type. * Improve error message in `Executor.complete_value` when runtime type doesn't match. * Implement more missing executor tests.
1 parent 55dcd92 commit 2420a68

File tree

7 files changed

+804
-67
lines changed

7 files changed

+804
-67
lines changed

graphql/core/execution/executor.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -272,7 +272,7 @@ def complete_value(self, ctx, return_type, field_asts, info, result):
272272

273273
if not runtime_type.is_type_of(result, info):
274274
raise GraphQLError(
275-
u'Expected value of type "{}" but got {}.'.format(return_type, result),
275+
u'Expected value of type "{}" but got {}.'.format(return_type, type(result).__name__),
276276
field_asts
277277
)
278278

graphql/core/language/ast.py

Lines changed: 294 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -675,3 +675,297 @@ def __repr__(self):
675675

676676
def __hash__(self):
677677
return id(self)
678+
679+
680+
class TypeDefinition(Node):
681+
pass
682+
683+
684+
class ObjectTypeDefinition(TypeDefinition):
685+
__slots__ = ('loc', 'name', 'interfaces', 'fields',)
686+
_fields = ('name', 'interfaces', 'fields',)
687+
688+
def __init__(self, name, fields, interfaces=None, loc=None):
689+
self.loc = loc
690+
self.name = name
691+
self.interfaces = interfaces
692+
self.fields = fields
693+
694+
def __eq__(self, other):
695+
return (
696+
self is other or (
697+
isinstance(other, ObjectTypeDefinition) and
698+
self.loc == other.loc and
699+
self.name == other.name and
700+
self.interfaces == other.interfaces and
701+
self.fields == other.fields
702+
)
703+
)
704+
705+
def __repr__(self):
706+
return ('ObjectTypeDefinition('
707+
'name={self.name!r}'
708+
', interfaces={self.interfaces!r}'
709+
', fields={self.fields!r}'
710+
')').format(self=self)
711+
712+
def __hash__(self):
713+
return id(self)
714+
715+
716+
class FieldDefinition(Node):
717+
__slots__ = ('loc', 'name', 'arguments', 'type',)
718+
_fields = ('name', 'arguments', 'type',)
719+
720+
def __init__(self, name, arguments, type, loc=None):
721+
self.loc = loc
722+
self.name = name
723+
self.arguments = arguments
724+
self.type = type
725+
726+
def __eq__(self, other):
727+
return (
728+
self is other or (
729+
isinstance(other, FieldDefinition) and
730+
self.loc == other.loc and
731+
self.name == other.name and
732+
self.arguments == other.arguments and
733+
self.type == other.type
734+
)
735+
)
736+
737+
def __repr__(self):
738+
return ('FieldDefinition('
739+
'name={self.name!r}'
740+
', arguments={self.arguments!r}'
741+
', type={self.type!r}'
742+
')').format(self=self)
743+
744+
def __hash__(self):
745+
return id(self)
746+
747+
748+
class InputValueDefinition(Node):
749+
__slots__ = ('loc', 'name', 'type', 'default_value',)
750+
_fields = ('name', 'type', 'default_value',)
751+
752+
def __init__(self, name, type, default_value=None, loc=None):
753+
self.loc = loc
754+
self.name = name
755+
self.type = type
756+
self.default_value = default_value
757+
758+
def __eq__(self, other):
759+
return (
760+
self is other or (
761+
isinstance(other, InputValueDefinition) and
762+
self.loc == other.loc and
763+
self.name == other.name and
764+
self.type == other.type and
765+
self.default_value == other.default_value
766+
)
767+
)
768+
769+
def __repr__(self):
770+
return ('InputValueDefinition('
771+
'name={self.name!r}'
772+
', type={self.type!r}'
773+
', default_value={self.default_value!r}'
774+
')').format(self=self)
775+
776+
def __hash__(self):
777+
return id(self)
778+
779+
780+
class InterfaceTypeDefinition(TypeDefinition):
781+
__slots__ = ('loc', 'name', 'fields',)
782+
_fields = ('name', 'fields',)
783+
784+
def __init__(self, name, fields, loc=None):
785+
self.loc = loc
786+
self.name = name
787+
self.fields = fields
788+
789+
def __eq__(self, other):
790+
return (
791+
self is other or (
792+
isinstance(other, InterfaceTypeDefinition) and
793+
self.loc == other.loc and
794+
self.name == other.name and
795+
self.fields == other.fields
796+
)
797+
)
798+
799+
def __repr__(self):
800+
return ('InterfaceTypeDefinition('
801+
'name={self.name!r}'
802+
', fields={self.fields!r}'
803+
')').format(self=self)
804+
805+
def __hash__(self):
806+
return id(self)
807+
808+
809+
class UnionTypeDefinition(TypeDefinition):
810+
__slots__ = ('loc', 'name', 'types',)
811+
_fields = ('name', 'types',)
812+
813+
def __init__(self, name, types, loc=None):
814+
self.loc = loc
815+
self.name = name
816+
self.types = types
817+
818+
def __eq__(self, other):
819+
return (
820+
self is other or (
821+
isinstance(other, UnionTypeDefinition) and
822+
self.loc == other.loc and
823+
self.name == other.name and
824+
self.types == other.types
825+
)
826+
)
827+
828+
def __repr__(self):
829+
return ('UnionTypeDefinition('
830+
'name={self.name!r}'
831+
', types={self.types!r}'
832+
')').format(self=self)
833+
834+
def __hash__(self):
835+
return id(self)
836+
837+
838+
class ScalarTypeDefinition(TypeDefinition):
839+
__slots__ = ('loc', 'name',)
840+
_fields = ('name',)
841+
842+
def __init__(self, name, loc=None):
843+
self.loc = loc
844+
self.name = name
845+
846+
def __eq__(self, other):
847+
return (
848+
self is other or (
849+
isinstance(other, ScalarTypeDefinition) and
850+
self.loc == other.loc and
851+
self.name == other.name
852+
)
853+
)
854+
855+
def __repr__(self):
856+
return ('ScalarTypeDefinition('
857+
'name={self.name!r}'
858+
')').format(self=self)
859+
860+
def __hash__(self):
861+
return id(self)
862+
863+
864+
class EnumTypeDefinition(TypeDefinition):
865+
__slots__ = ('loc', 'name', 'values',)
866+
_fields = ('name', 'values',)
867+
868+
def __init__(self, name, values, loc=None):
869+
self.loc = loc
870+
self.name = name
871+
self.values = values
872+
873+
def __eq__(self, other):
874+
return (
875+
self is other or (
876+
isinstance(other, EnumTypeDefinition) and
877+
self.loc == other.loc and
878+
self.name == other.name and
879+
self.values == other.values
880+
)
881+
)
882+
883+
def __repr__(self):
884+
return ('EnumTypeDefinition('
885+
'name={self.name!r}'
886+
', values={self.values!r}'
887+
')').format(self=self)
888+
889+
def __hash__(self):
890+
return id(self)
891+
892+
893+
class EnumValueDefinition(Node):
894+
__slots__ = ('loc', 'name',)
895+
_fields = ('name',)
896+
897+
def __init__(self, name, loc=None):
898+
self.loc = loc
899+
self.name = name
900+
901+
def __eq__(self, other):
902+
return (
903+
self is other or (
904+
isinstance(other, EnumValueDefinition) and
905+
self.loc == other.loc and
906+
self.name == other.name
907+
)
908+
)
909+
910+
def __repr__(self):
911+
return ('EnumValueDefinition('
912+
'name={self.name!r}'
913+
')').format(self=self)
914+
915+
def __hash__(self):
916+
return id(self)
917+
918+
919+
class InputObjectTypeDefinition(TypeDefinition):
920+
__slots__ = ('loc', 'name', 'fields',)
921+
_fields = ('name', 'fields',)
922+
923+
def __init__(self, name, fields, loc=None):
924+
self.loc = loc
925+
self.name = name
926+
self.fields = fields
927+
928+
def __eq__(self, other):
929+
return (
930+
self is other or (
931+
isinstance(other, InputObjectTypeDefinition) and
932+
self.loc == other.loc and
933+
self.name == other.name and
934+
self.fields == other.fields
935+
)
936+
)
937+
938+
def __repr__(self):
939+
return ('InputObjectTypeDefinition('
940+
'name={self.name!r}'
941+
', fields={self.fields!r}'
942+
')').format(self=self)
943+
944+
def __hash__(self):
945+
return id(self)
946+
947+
948+
class TypeExtensionDefinition(TypeDefinition):
949+
__slots__ = ('loc', 'definition',)
950+
_fields = ('definition',)
951+
952+
def __init__(self, definition, loc=None):
953+
self.loc = loc
954+
self.definition = definition
955+
956+
def __eq__(self, other):
957+
return (
958+
self is other or (
959+
isinstance(other, TypeExtensionDefinition) and
960+
self.loc == other.loc and
961+
self.definition == other.definition
962+
)
963+
)
964+
965+
def __repr__(self):
966+
return ('TypeExtensionDefinition('
967+
'definition={self.definition!r}'
968+
')').format(self=self)
969+
970+
def __hash__(self):
971+
return id(self)

0 commit comments

Comments
 (0)