@@ -183,13 +183,15 @@ class GraphQLNamedType(GraphQLType):
|
183 | 183 |
|
184 | 184 | name: str
|
185 | 185 | description: Optional[str]
|
| 186 | +extensions: Optional[Dict[str, Any]] |
186 | 187 | ast_node: Optional[TypeDefinitionNode]
|
187 | 188 | extension_ast_nodes: Optional[FrozenList[TypeExtensionNode]]
|
188 | 189 |
|
189 | 190 | def __init__(
|
190 | 191 | self,
|
191 | 192 | name: str,
|
192 | 193 | description: str = None,
|
| 194 | +extensions: Dict[str, Any] = None, |
193 | 195 | ast_node: TypeDefinitionNode = None,
|
194 | 196 | extension_ast_nodes: Sequence[TypeExtensionNode] = None,
|
195 | 197 | ) -> None:
|
@@ -199,6 +201,11 @@ def __init__(
|
199 | 201 | raise TypeError("The name must be a string.")
|
200 | 202 | if description is not None and not isinstance(description, str):
|
201 | 203 | raise TypeError("The description must be a string.")
|
| 204 | +if extensions is not None and ( |
| 205 | +not isinstance(extensions, dict) |
| 206 | +or not all(isinstance(key, str) for key in extensions) |
| 207 | +): |
| 208 | +raise TypeError(f"{name} extensions must be a dictionary with string keys.") |
202 | 209 | if ast_node and not isinstance(ast_node, TypeDefinitionNode):
|
203 | 210 | raise TypeError(f"{name} AST node must be a TypeDefinitionNode.")
|
204 | 211 | if extension_ast_nodes:
|
@@ -215,6 +222,7 @@ def __init__(
|
215 | 222 | extension_ast_nodes = None
|
216 | 223 | self.name = name
|
217 | 224 | self.description = description
|
| 225 | +self.extensions = extensions |
218 | 226 | self.ast_node = ast_node
|
219 | 227 | self.extension_ast_nodes = extension_ast_nodes
|
220 | 228 |
|
@@ -228,6 +236,7 @@ def to_kwargs(self) -> Dict[str, Any]:
|
228 | 236 | return dict(
|
229 | 237 | name=self.name,
|
230 | 238 | description=self.description,
|
| 239 | +extensions=self.extensions, |
231 | 240 | ast_node=self.ast_node,
|
232 | 241 | extension_ast_nodes=self.extension_ast_nodes or FrozenList(),
|
233 | 242 | )
|
@@ -306,15 +315,17 @@ def __init__(
|
306 | 315 | self,
|
307 | 316 | name: str,
|
308 | 317 | serialize: GraphQLScalarSerializer = None,
|
309 |
| -description: str = None, |
310 | 318 | parse_value: GraphQLScalarValueParser = None,
|
311 | 319 | parse_literal: GraphQLScalarLiteralParser = None,
|
| 320 | +description: str = None, |
| 321 | +extensions: Dict[str, Any] = None, |
312 | 322 | ast_node: ScalarTypeDefinitionNode = None,
|
313 | 323 | extension_ast_nodes: Sequence[ScalarTypeExtensionNode] = None,
|
314 | 324 | ) -> None:
|
315 | 325 | super().__init__(
|
316 | 326 | name=name,
|
317 | 327 | description=description,
|
| 328 | +extensions=extensions, |
318 | 329 | ast_node=ast_node,
|
319 | 330 | extension_ast_nodes=extension_ast_nodes,
|
320 | 331 | )
|
@@ -415,12 +426,13 @@ def assert_scalar_type(type_: Any) -> GraphQLScalarType:
|
415 | 426 | class GraphQLField:
|
416 | 427 | """Definition of a GraphQL field"""
|
417 | 428 |
|
418 |
| -description: Optional[str] |
419 | 429 | type: "GraphQLOutputType"
|
420 | 430 | args: GraphQLArgumentMap
|
421 | 431 | resolve: Optional["GraphQLFieldResolver"]
|
422 | 432 | subscribe: Optional["GraphQLFieldResolver"]
|
| 433 | +description: Optional[str] |
423 | 434 | deprecation_reason: Optional[str]
|
| 435 | +extensions: Optional[Dict[str, Any]] |
424 | 436 | ast_node: Optional[FieldDefinitionNode]
|
425 | 437 |
|
426 | 438 | def __init__(
|
@@ -431,6 +443,7 @@ def __init__(
|
431 | 443 | subscribe: "GraphQLFieldResolver" = None,
|
432 | 444 | description: str = None,
|
433 | 445 | deprecation_reason: str = None,
|
| 446 | +extensions: Dict[str, Any] = None, |
434 | 447 | ast_node: FieldDefinitionNode = None,
|
435 | 448 | ) -> None:
|
436 | 449 | if not is_output_type(type_):
|
@@ -462,14 +475,20 @@ def __init__(
|
462 | 475 | raise TypeError("The description must be a string.")
|
463 | 476 | if deprecation_reason is not None and not isinstance(deprecation_reason, str):
|
464 | 477 | raise TypeError("The deprecation reason must be a string.")
|
| 478 | +if extensions is not None and ( |
| 479 | +not isinstance(extensions, dict) |
| 480 | +or not all(isinstance(key, str) for key in extensions) |
| 481 | +): |
| 482 | +raise TypeError("Field extensions must be a dictionary with string keys.") |
465 | 483 | if ast_node and not isinstance(ast_node, FieldDefinitionNode):
|
466 | 484 | raise TypeError("Field AST node must be a FieldDefinitionNode.")
|
467 | 485 | self.type = type_
|
468 | 486 | self.args = args or {}
|
469 | 487 | self.resolve = resolve
|
470 | 488 | self.subscribe = subscribe
|
471 |
| -self.deprecation_reason = deprecation_reason |
472 | 489 | self.description = description
|
| 490 | +self.deprecation_reason = deprecation_reason |
| 491 | +self.extensions = extensions |
473 | 492 | self.ast_node = ast_node
|
474 | 493 |
|
475 | 494 | def __repr__(self):
|
@@ -486,16 +505,18 @@ def __eq__(self, other):
|
486 | 505 | and self.resolve == other.resolve
|
487 | 506 | and self.description == other.description
|
488 | 507 | and self.deprecation_reason == other.deprecation_reason
|
| 508 | +and self.extensions == other.extensions |
489 | 509 | )
|
490 | 510 |
|
491 | 511 | def to_kwargs(self) -> Dict[str, Any]:
|
492 | 512 | return dict(
|
493 |
| -description=self.description, |
494 | 513 | type_=self.type,
|
495 | 514 | args=self.args.copy() if self.args else None,
|
496 | 515 | resolve=self.resolve,
|
497 | 516 | subscribe=self.subscribe,
|
498 | 517 | deprecation_reason=self.deprecation_reason,
|
| 518 | +description=self.description, |
| 519 | +extensions=self.extensions, |
499 | 520 | ast_node=self.ast_node,
|
500 | 521 | )
|
501 | 522 |
|
@@ -550,10 +571,11 @@ class GraphQLResolveInfo(NamedTuple):
|
550 | 571 | class GraphQLArgument:
|
551 | 572 | """Definition of a GraphQL argument"""
|
552 | 573 |
|
553 |
| -description: Optional[str] |
554 | 574 | type: "GraphQLInputType"
|
555 | 575 | default_value: Any
|
| 576 | +description: Optional[str] |
556 | 577 | out_name: Optional[str] # for transforming names (extension of GraphQL.js)
|
| 578 | +extensions: Optional[Dict[str, Any]] |
557 | 579 | ast_node: Optional[InputValueDefinitionNode]
|
558 | 580 |
|
559 | 581 | def __init__(
|
@@ -562,6 +584,7 @@ def __init__(
|
562 | 584 | default_value: Any = INVALID,
|
563 | 585 | description: str = None,
|
564 | 586 | out_name: str = None,
|
| 587 | +extensions: Dict[str, Any] = None, |
565 | 588 | ast_node: InputValueDefinitionNode = None,
|
566 | 589 | ) -> None:
|
567 | 590 | if not is_input_type(type_):
|
@@ -570,12 +593,20 @@ def __init__(
|
570 | 593 | raise TypeError("Argument description must be a string.")
|
571 | 594 | if out_name is not None and not isinstance(out_name, str):
|
572 | 595 | raise TypeError("Argument out name must be a string.")
|
| 596 | +if extensions is not None and ( |
| 597 | +not isinstance(extensions, dict) |
| 598 | +or not all(isinstance(key, str) for key in extensions) |
| 599 | +): |
| 600 | +raise TypeError( |
| 601 | +"Argument extensions must be a dictionary with string keys." |
| 602 | +) |
573 | 603 | if ast_node and not isinstance(ast_node, InputValueDefinitionNode):
|
574 | 604 | raise TypeError("Argument AST node must be an InputValueDefinitionNode.")
|
575 | 605 | self.type = type_
|
576 | 606 | self.default_value = default_value
|
577 | 607 | self.description = description
|
578 | 608 | self.out_name = out_name
|
| 609 | +self.extensions = extensions |
579 | 610 | self.ast_node = ast_node
|
580 | 611 |
|
581 | 612 | def __eq__(self, other):
|
@@ -585,14 +616,16 @@ def __eq__(self, other):
|
585 | 616 | and self.default_value == other.default_value
|
586 | 617 | and self.description == other.description
|
587 | 618 | and self.out_name == other.out_name
|
| 619 | +and self.extensions == other.extensions |
588 | 620 | )
|
589 | 621 |
|
590 | 622 | def to_kwargs(self) -> Dict[str, Any]:
|
591 | 623 | return dict(
|
592 |
| -description=self.description, |
593 | 624 | type_=self.type,
|
594 | 625 | default_value=self.default_value,
|
| 626 | +description=self.description, |
595 | 627 | out_name=self.out_name,
|
| 628 | +extensions=self.extensions, |
596 | 629 | ast_node=self.ast_node,
|
597 | 630 | )
|
598 | 631 |
|
@@ -645,13 +678,15 @@ def __init__(
|
645 | 678 | fields: Thunk[GraphQLFieldMap],
|
646 | 679 | interfaces: Thunk[Sequence["GraphQLInterfaceType"]] = None,
|
647 | 680 | is_type_of: GraphQLIsTypeOfFn = None,
|
| 681 | +extensions: Dict[str, Any] = None, |
648 | 682 | description: str = None,
|
649 | 683 | ast_node: ObjectTypeDefinitionNode = None,
|
650 | 684 | extension_ast_nodes: Sequence[ObjectTypeExtensionNode] = None,
|
651 | 685 | ) -> None:
|
652 | 686 | super().__init__(
|
653 | 687 | name=name,
|
654 | 688 | description=description,
|
| 689 | +extensions=extensions, |
655 | 690 | ast_node=ast_node,
|
656 | 691 | extension_ast_nodes=extension_ast_nodes,
|
657 | 692 | )
|
@@ -763,12 +798,14 @@ def __init__(
|
763 | 798 | fields: Thunk[GraphQLFieldMap] = None,
|
764 | 799 | resolve_type: GraphQLTypeResolver = None,
|
765 | 800 | description: str = None,
|
| 801 | +extensions: Dict[str, Any] = None, |
766 | 802 | ast_node: InterfaceTypeDefinitionNode = None,
|
767 | 803 | extension_ast_nodes: Sequence[InterfaceTypeExtensionNode] = None,
|
768 | 804 | ) -> None:
|
769 | 805 | super().__init__(
|
770 | 806 | name=name,
|
771 | 807 | description=description,
|
| 808 | +extensions=extensions, |
772 | 809 | ast_node=ast_node,
|
773 | 810 | extension_ast_nodes=extension_ast_nodes,
|
774 | 811 | )
|
@@ -788,7 +825,6 @@ def __init__(
|
788 | 825 | )
|
789 | 826 | self._fields = fields
|
790 | 827 | self.resolve_type = resolve_type
|
791 |
| -self.description = description |
792 | 828 |
|
793 | 829 | def to_kwargs(self) -> Dict[str, Any]:
|
794 | 830 | return dict(
|
@@ -864,12 +900,14 @@ def __init__(
|
864 | 900 | types: Thunk[Sequence[GraphQLObjectType]],
|
865 | 901 | resolve_type: GraphQLTypeResolver = None,
|
866 | 902 | description: str = None,
|
| 903 | +extensions: Dict[str, Any] = None, |
867 | 904 | ast_node: UnionTypeDefinitionNode = None,
|
868 | 905 | extension_ast_nodes: Sequence[UnionTypeExtensionNode] = None,
|
869 | 906 | ) -> None:
|
870 | 907 | super().__init__(
|
871 | 908 | name=name,
|
872 | 909 | description=description,
|
| 910 | +extensions=extensions, |
873 | 911 | ast_node=ast_node,
|
874 | 912 | extension_ast_nodes=extension_ast_nodes,
|
875 | 913 | )
|
@@ -967,12 +1005,14 @@ def __init__(
|
967 | 1005 | name: str,
|
968 | 1006 | values: Union[GraphQLEnumValueMap, Dict[str, Any], Type[Enum]],
|
969 | 1007 | description: str = None,
|
| 1008 | +extensions: Dict[str, Any] = None, |
970 | 1009 | ast_node: EnumTypeDefinitionNode = None,
|
971 | 1010 | extension_ast_nodes: Sequence[EnumTypeExtensionNode] = None,
|
972 | 1011 | ) -> None:
|
973 | 1012 | super().__init__(
|
974 | 1013 | name=name,
|
975 | 1014 | description=description,
|
| 1015 | +extensions=extensions, |
976 | 1016 | ast_node=ast_node,
|
977 | 1017 | extension_ast_nodes=extension_ast_nodes,
|
978 | 1018 | )
|
@@ -1080,13 +1120,15 @@ class GraphQLEnumValue:
|
1080 | 1120 | value: Any
|
1081 | 1121 | description: Optional[str]
|
1082 | 1122 | deprecation_reason: Optional[str]
|
| 1123 | +extensions: Optional[Dict[str, Any]] |
1083 | 1124 | ast_node: Optional[EnumValueDefinitionNode]
|
1084 | 1125 |
|
1085 | 1126 | def __init__(
|
1086 | 1127 | self,
|
1087 | 1128 | value: Any = None,
|
1088 | 1129 | description: str = None,
|
1089 | 1130 | deprecation_reason: str = None,
|
| 1131 | +extensions: Dict[str, Any] = None, |
1090 | 1132 | ast_node: EnumValueDefinitionNode = None,
|
1091 | 1133 | ) -> None:
|
1092 | 1134 | if description is not None and not isinstance(description, str):
|
@@ -1095,11 +1137,19 @@ def __init__(
|
1095 | 1137 | raise TypeError(
|
1096 | 1138 | "The deprecation reason for the enum value must be a string."
|
1097 | 1139 | )
|
| 1140 | +if extensions is not None and ( |
| 1141 | +not isinstance(extensions, dict) |
| 1142 | +or not all(isinstance(key, str) for key in extensions) |
| 1143 | +): |
| 1144 | +raise TypeError( |
| 1145 | +"Enum value extensions must be a dictionary with string keys." |
| 1146 | +) |
1098 | 1147 | if ast_node and not isinstance(ast_node, EnumValueDefinitionNode):
|
1099 | 1148 | raise TypeError("AST node must be an EnumValueDefinitionNode.")
|
1100 | 1149 | self.value = value
|
1101 | 1150 | self.description = description
|
1102 | 1151 | self.deprecation_reason = deprecation_reason
|
| 1152 | +self.extensions = extensions |
1103 | 1153 | self.ast_node = ast_node
|
1104 | 1154 |
|
1105 | 1155 | def __eq__(self, other):
|
@@ -1108,13 +1158,15 @@ def __eq__(self, other):
|
1108 | 1158 | and self.value == other.value
|
1109 | 1159 | and self.description == other.description
|
1110 | 1160 | and self.deprecation_reason == other.deprecation_reason
|
| 1161 | +and self.extensions == other.extensions |
1111 | 1162 | )
|
1112 | 1163 |
|
1113 | 1164 | def to_kwargs(self) -> Dict[str, Any]:
|
1114 | 1165 | return dict(
|
1115 | 1166 | value=self.value,
|
1116 | 1167 | description=self.description,
|
1117 | 1168 | deprecation_reason=self.deprecation_reason,
|
| 1169 | +extensions=self.extensions, |
1118 | 1170 | ast_node=self.ast_node,
|
1119 | 1171 | )
|
1120 | 1172 |
|
@@ -1161,12 +1213,14 @@ def __init__(
|
1161 | 1213 | fields: Thunk[GraphQLInputFieldMap],
|
1162 | 1214 | description: str = None,
|
1163 | 1215 | out_type: GraphQLInputFieldOutType = None,
|
| 1216 | +extensions: Dict[str, Any] = None, |
1164 | 1217 | ast_node: InputObjectTypeDefinitionNode = None,
|
1165 | 1218 | extension_ast_nodes: Sequence[InputObjectTypeExtensionNode] = None,
|
1166 | 1219 | ) -> None:
|
1167 | 1220 | super().__init__(
|
1168 | 1221 | name=name,
|
1169 | 1222 | description=description,
|
| 1223 | +extensions=extensions, |
1170 | 1224 | ast_node=ast_node,
|
1171 | 1225 | extension_ast_nodes=extension_ast_nodes,
|
1172 | 1226 | )
|
@@ -1252,6 +1306,7 @@ class GraphQLInputField:
|
1252 | 1306 | default_value: Any
|
1253 | 1307 | description: Optional[str]
|
1254 | 1308 | out_name: Optional[str] # for transforming names (extension of GraphQL.js)
|
| 1309 | +extensions: Optional[Dict[str, Any]] |
1255 | 1310 | ast_node: Optional[InputValueDefinitionNode]
|
1256 | 1311 |
|
1257 | 1312 | def __init__(
|
@@ -1260,6 +1315,7 @@ def __init__(
|
1260 | 1315 | default_value: Any = INVALID,
|
1261 | 1316 | description: str = None,
|
1262 | 1317 | out_name: str = None,
|
| 1318 | +extensions: Dict[str, Any] = None, |
1263 | 1319 | ast_node: InputValueDefinitionNode = None,
|
1264 | 1320 | ) -> None:
|
1265 | 1321 | if not is_input_type(type_):
|
@@ -1268,12 +1324,20 @@ def __init__(
|
1268 | 1324 | raise TypeError("Input field description must be a string.")
|
1269 | 1325 | if out_name is not None and not isinstance(out_name, str):
|
1270 | 1326 | raise TypeError("Input field out name must be a string.")
|
| 1327 | +if extensions is not None and ( |
| 1328 | +not isinstance(extensions, dict) |
| 1329 | +or not all(isinstance(key, str) for key in extensions) |
| 1330 | +): |
| 1331 | +raise TypeError( |
| 1332 | +"Input field extensions must be a dictionary with string keys." |
| 1333 | +) |
1271 | 1334 | if ast_node and not isinstance(ast_node, InputValueDefinitionNode):
|
1272 | 1335 | raise TypeError("Input field AST node must be an InputValueDefinitionNode.")
|
1273 | 1336 | self.type = type_
|
1274 | 1337 | self.default_value = default_value
|
1275 | 1338 | self.description = description
|
1276 | 1339 | self.out_name = out_name
|
| 1340 | +self.extensions = extensions |
1277 | 1341 | self.ast_node = ast_node
|
1278 | 1342 |
|
1279 | 1343 | def __eq__(self, other):
|
@@ -1282,15 +1346,17 @@ def __eq__(self, other):
|
1282 | 1346 | and self.type == other.type
|
1283 | 1347 | and self.default_value == other.default_value
|
1284 | 1348 | and self.description == other.description
|
| 1349 | +and self.extensions == other.extensions |
1285 | 1350 | and self.out_name == other.out_name
|
1286 | 1351 | )
|
1287 | 1352 |
|
1288 | 1353 | def to_kwargs(self) -> Dict[str, Any]:
|
1289 | 1354 | return dict(
|
1290 | 1355 | type_=self.type,
|
1291 |
| -description=self.description, |
1292 | 1356 | default_value=self.default_value,
|
| 1357 | +description=self.description, |
1293 | 1358 | out_name=self.out_name,
|
| 1359 | +extensions=self.extensions, |
1294 | 1360 | ast_node=self.ast_node,
|
1295 | 1361 | )
|
1296 | 1362 |
|
|
0 commit comments