graphql-core 3.3.1__tar.gz → 3.3.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (404) hide show
  1. {graphql_core-3.3.1 → graphql_core-3.3.2}/PKG-INFO +4 -4
  2. {graphql_core-3.3.1 → graphql_core-3.3.2}/README.md +3 -3
  3. {graphql_core-3.3.1 → graphql_core-3.3.2}/docs/conf.py +1 -1
  4. {graphql_core-3.3.1 → graphql_core-3.3.2}/docs/modules/pyutils.rst +2 -0
  5. {graphql_core-3.3.1 → graphql_core-3.3.2}/pyproject.toml +10 -10
  6. {graphql_core-3.3.1 → graphql_core-3.3.2}/pyproject.toml.orig +10 -10
  7. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/error/graphql_error.py +11 -6
  8. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/execution/collect_fields.py +64 -29
  9. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/execution/execute.py +18 -0
  10. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/execution/executor.py +39 -18
  11. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/execution/incremental/build_execution_plan.py +6 -11
  12. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/execution/incremental/incremental_executor.py +2 -2
  13. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/execution/incremental/incremental_publisher.py +19 -7
  14. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/execution/incremental/work_queue.py +87 -35
  15. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/execution/values.py +43 -2
  16. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/graphql.py +51 -20
  17. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/language/ast.py +4 -1
  18. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/language/block_string.py +7 -2
  19. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/language/lexer.py +31 -0
  20. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/language/location.py +38 -2
  21. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/language/parser.py +339 -66
  22. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/language/print_location.py +5 -1
  23. graphql_core-3.3.2/src/graphql/language/printer.py +544 -0
  24. graphql_core-3.3.2/src/graphql/language/reducer.py +83 -0
  25. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/language/source.py +9 -9
  26. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/language/visitor.py +69 -64
  27. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/pyutils/__init__.py +2 -0
  28. graphql_core-3.3.2/src/graphql/pyutils/set_map.py +102 -0
  29. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/type/definition.py +6 -4
  30. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/type/scalars.py +54 -12
  31. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/type/schema.py +18 -6
  32. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/utilities/build_ast_schema.py +18 -0
  33. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/utilities/type_info.py +8 -6
  34. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/utilities/validate_input_value.py +5 -5
  35. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/validation/rules/defer_stream_directive_on_root_field.py +37 -27
  36. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/validation/rules/defer_stream_directive_on_valid_operations_rule.py +44 -27
  37. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/validation/rules/known_argument_names.py +10 -10
  38. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/validation/rules/known_directives.py +4 -4
  39. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/validation/rules/known_type_names.py +21 -21
  40. graphql_core-3.3.2/src/graphql/validation/rules/max_introspection_depth_rule.py +151 -0
  41. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/validation/rules/no_undefined_variables.py +9 -27
  42. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/validation/rules/no_unused_fragments.py +8 -5
  43. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/validation/rules/no_unused_variables.py +4 -4
  44. graphql_core-3.3.2/src/graphql/validation/rules/overlapping_fields_can_be_merged.py +1633 -0
  45. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/validation/rules/provided_required_arguments.py +22 -10
  46. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/validation/rules/scalar_leafs.py +4 -1
  47. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/validation/rules/single_field_subscriptions.py +54 -9
  48. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/validation/validate.py +137 -4
  49. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/validation/validation_context.py +124 -42
  50. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/version.py +2 -2
  51. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/conftest.py +17 -0
  52. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/error/test_print_location.py +45 -0
  53. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/execution/incremental/test_defer.py +1035 -0
  54. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/execution/incremental/test_incremental_publisher.py +33 -0
  55. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/execution/incremental/test_stream.py +295 -0
  56. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/execution/incremental/test_work_queue.py +358 -11
  57. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/execution/test_collect_fields.py +40 -12
  58. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/execution/test_executor.py +21 -0
  59. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/execution/test_sync.py +71 -1
  60. graphql_core-3.3.2/tests/execution/test_too_deeply_nested_selections.py +130 -0
  61. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/execution/test_variables.py +170 -1
  62. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/language/test_block_string.py +6 -0
  63. graphql_core-3.3.2/tests/language/test_location.py +224 -0
  64. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/language/test_parser.py +478 -3
  65. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/language/test_printer.py +71 -0
  66. graphql_core-3.3.2/tests/language/test_reducer.py +101 -0
  67. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/language/test_source.py +12 -0
  68. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/language/test_visitor.py +6 -0
  69. graphql_core-3.3.2/tests/pyutils/test_set_map.py +129 -0
  70. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/test_graphql.py +108 -0
  71. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/type/test_introspection.py +60 -0
  72. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/type/test_scalars.py +81 -0
  73. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/type/test_validation.py +48 -0
  74. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/utilities/test_build_ast_schema.py +61 -0
  75. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/utilities/test_validate_input_value.py +22 -0
  76. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/validation/test_defer_stream_directive_on_root_field.py +18 -0
  77. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/validation/test_defer_stream_directive_on_valid_operations.py +19 -0
  78. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/validation/test_max_introspection_depth_rule.py +237 -1
  79. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/validation/test_no_undefined_variables.py +42 -1
  80. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/validation/test_no_unused_variables.py +40 -1
  81. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/validation/test_overlapping_fields_can_be_merged.py +1126 -81
  82. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/validation/test_provided_required_arguments.py +20 -0
  83. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/validation/test_scalar_leafs.py +48 -27
  84. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/validation/test_single_field_subscriptions.py +124 -1
  85. graphql_core-3.3.2/tests/validation/test_validation.py +531 -0
  86. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/validation/test_variables_in_allowed_position.py +30 -1
  87. {graphql_core-3.3.1 → graphql_core-3.3.2}/tox.ini +5 -4
  88. graphql_core-3.3.1/src/graphql/language/printer.py +0 -506
  89. graphql_core-3.3.1/src/graphql/validation/rules/max_introspection_depth_rule.py +0 -102
  90. graphql_core-3.3.1/src/graphql/validation/rules/overlapping_fields_can_be_merged.py +0 -1106
  91. graphql_core-3.3.1/tests/language/test_location.py +0 -50
  92. graphql_core-3.3.1/tests/validation/test_validation.py +0 -238
  93. {graphql_core-3.3.1 → graphql_core-3.3.2}/.editorconfig +0 -0
  94. {graphql_core-3.3.1 → graphql_core-3.3.2}/.readthedocs.yaml +0 -0
  95. {graphql_core-3.3.1 → graphql_core-3.3.2}/CODEOWNERS +0 -0
  96. {graphql_core-3.3.1 → graphql_core-3.3.2}/LICENSE +0 -0
  97. {graphql_core-3.3.1 → graphql_core-3.3.2}/SECURITY.md +0 -0
  98. {graphql_core-3.3.1 → graphql_core-3.3.2}/docs/Makefile +0 -0
  99. {graphql_core-3.3.1 → graphql_core-3.3.2}/docs/diffs.rst +0 -0
  100. {graphql_core-3.3.1 → graphql_core-3.3.2}/docs/index.rst +0 -0
  101. {graphql_core-3.3.1 → graphql_core-3.3.2}/docs/intro.rst +0 -0
  102. {graphql_core-3.3.1 → graphql_core-3.3.2}/docs/make.bat +0 -0
  103. {graphql_core-3.3.1 → graphql_core-3.3.2}/docs/modules/error.rst +0 -0
  104. {graphql_core-3.3.1 → graphql_core-3.3.2}/docs/modules/execution.rst +0 -0
  105. {graphql_core-3.3.1 → graphql_core-3.3.2}/docs/modules/graphql.rst +0 -0
  106. {graphql_core-3.3.1 → graphql_core-3.3.2}/docs/modules/language.rst +0 -0
  107. {graphql_core-3.3.1 → graphql_core-3.3.2}/docs/modules/type.rst +0 -0
  108. {graphql_core-3.3.1 → graphql_core-3.3.2}/docs/modules/utilities.rst +0 -0
  109. {graphql_core-3.3.1 → graphql_core-3.3.2}/docs/modules/validation.rst +0 -0
  110. {graphql_core-3.3.1 → graphql_core-3.3.2}/docs/usage/extension.rst +0 -0
  111. {graphql_core-3.3.1 → graphql_core-3.3.2}/docs/usage/index.rst +0 -0
  112. {graphql_core-3.3.1 → graphql_core-3.3.2}/docs/usage/introspection.rst +0 -0
  113. {graphql_core-3.3.1 → graphql_core-3.3.2}/docs/usage/methods.rst +0 -0
  114. {graphql_core-3.3.1 → graphql_core-3.3.2}/docs/usage/other.rst +0 -0
  115. {graphql_core-3.3.1 → graphql_core-3.3.2}/docs/usage/parser.rst +0 -0
  116. {graphql_core-3.3.1 → graphql_core-3.3.2}/docs/usage/queries.rst +0 -0
  117. {graphql_core-3.3.1 → graphql_core-3.3.2}/docs/usage/resolvers.rst +0 -0
  118. {graphql_core-3.3.1 → graphql_core-3.3.2}/docs/usage/schema.rst +0 -0
  119. {graphql_core-3.3.1 → graphql_core-3.3.2}/docs/usage/sdl.rst +0 -0
  120. {graphql_core-3.3.1 → graphql_core-3.3.2}/docs/usage/validator.rst +0 -0
  121. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/__init__.py +0 -0
  122. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/error/__init__.py +0 -0
  123. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/error/located_error.py +0 -0
  124. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/error/syntax_error.py +0 -0
  125. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/execution/__init__.py +0 -0
  126. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/execution/aborted_graphql_execution_error.py +0 -0
  127. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/execution/async_iterables.py +0 -0
  128. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/execution/executor_throwing_on_incremental.py +0 -0
  129. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/execution/get_variable_signature.py +0 -0
  130. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/execution/incremental/__init__.py +0 -0
  131. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/execution/incremental/computation.py +0 -0
  132. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/execution/incremental/stream_item_queue.py +0 -0
  133. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/execution/middleware.py +0 -0
  134. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/execution/types.py +0 -0
  135. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/harness.py +0 -0
  136. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/language/__init__.py +0 -0
  137. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/language/character_classes.py +0 -0
  138. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/language/directive_locations.py +0 -0
  139. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/language/predicates.py +0 -0
  140. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/language/print_string.py +0 -0
  141. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/language/schema_coordinate_lexer.py +0 -0
  142. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/language/token_kind.py +0 -0
  143. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/py.typed +0 -0
  144. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/pyutils/abort_signal.py +0 -0
  145. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/pyutils/async_reduce.py +0 -0
  146. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/pyutils/awaitable_or_value.py +0 -0
  147. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/pyutils/cached_property.py +0 -0
  148. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/pyutils/convert_case.py +0 -0
  149. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/pyutils/description.py +0 -0
  150. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/pyutils/did_you_mean.py +0 -0
  151. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/pyutils/format_list.py +0 -0
  152. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/pyutils/frozen_error.py +0 -0
  153. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/pyutils/gather_with_cancel.py +0 -0
  154. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/pyutils/group_by.py +0 -0
  155. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/pyutils/identity_func.py +0 -0
  156. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/pyutils/inspect.py +0 -0
  157. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/pyutils/is_awaitable.py +0 -0
  158. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/pyutils/is_iterable.py +0 -0
  159. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/pyutils/merge_kwargs.py +0 -0
  160. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/pyutils/natural_compare.py +0 -0
  161. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/pyutils/path.py +0 -0
  162. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/pyutils/print_path_list.py +0 -0
  163. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/pyutils/ref_map.py +0 -0
  164. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/pyutils/ref_set.py +0 -0
  165. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/pyutils/simple_pub_sub.py +0 -0
  166. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/pyutils/suggestion_list.py +0 -0
  167. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/pyutils/undefined.py +0 -0
  168. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/type/__init__.py +0 -0
  169. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/type/assert_name.py +0 -0
  170. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/type/directives.py +0 -0
  171. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/type/introspection.py +0 -0
  172. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/type/validate.py +0 -0
  173. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/utilities/__init__.py +0 -0
  174. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/utilities/ast_from_value.py +0 -0
  175. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/utilities/ast_to_dict.py +0 -0
  176. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/utilities/build_client_schema.py +0 -0
  177. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/utilities/coerce_input_value.py +0 -0
  178. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/utilities/concat_ast.py +0 -0
  179. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/utilities/extend_schema.py +0 -0
  180. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/utilities/find_schema_changes.py +0 -0
  181. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/utilities/get_default_value_ast.py +0 -0
  182. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/utilities/get_introspection_query.py +0 -0
  183. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/utilities/get_operation_ast.py +0 -0
  184. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/utilities/introspection_from_schema.py +0 -0
  185. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/utilities/lexicographic_sort_schema.py +0 -0
  186. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/utilities/map_schema_config.py +0 -0
  187. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/utilities/print_schema.py +0 -0
  188. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/utilities/replace_variables.py +0 -0
  189. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/utilities/resolve_schema_coordinate.py +0 -0
  190. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/utilities/separate_operations.py +0 -0
  191. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/utilities/sort_value_node.py +0 -0
  192. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/utilities/strip_ignored_characters.py +0 -0
  193. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/utilities/type_comparators.py +0 -0
  194. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/utilities/type_from_ast.py +0 -0
  195. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/utilities/value_from_ast.py +0 -0
  196. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/utilities/value_from_ast_untyped.py +0 -0
  197. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/utilities/value_to_literal.py +0 -0
  198. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/validation/__init__.py +0 -0
  199. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/validation/rules/__init__.py +0 -0
  200. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/validation/rules/custom/__init__.py +0 -0
  201. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/validation/rules/custom/no_deprecated.py +0 -0
  202. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/validation/rules/custom/no_schema_introspection.py +0 -0
  203. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/validation/rules/defer_stream_directive_label.py +0 -0
  204. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/validation/rules/executable_definitions.py +0 -0
  205. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/validation/rules/fields_on_correct_type.py +0 -0
  206. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/validation/rules/fragments_on_composite_types.py +0 -0
  207. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/validation/rules/known_fragment_names.py +0 -0
  208. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/validation/rules/known_operation_types.py +0 -0
  209. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/validation/rules/lone_anonymous_operation.py +0 -0
  210. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/validation/rules/lone_schema_definition.py +0 -0
  211. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/validation/rules/no_fragment_cycles.py +0 -0
  212. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/validation/rules/possible_fragment_spreads.py +0 -0
  213. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/validation/rules/possible_type_extensions.py +0 -0
  214. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/validation/rules/stream_directive_on_list_field.py +0 -0
  215. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/validation/rules/unique_argument_definition_names.py +0 -0
  216. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/validation/rules/unique_argument_names.py +0 -0
  217. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/validation/rules/unique_directive_names.py +0 -0
  218. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/validation/rules/unique_directives_per_location.py +0 -0
  219. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/validation/rules/unique_enum_value_names.py +0 -0
  220. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/validation/rules/unique_field_definition_names.py +0 -0
  221. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/validation/rules/unique_fragment_names.py +0 -0
  222. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/validation/rules/unique_input_field_names.py +0 -0
  223. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/validation/rules/unique_operation_names.py +0 -0
  224. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/validation/rules/unique_operation_types.py +0 -0
  225. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/validation/rules/unique_type_names.py +0 -0
  226. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/validation/rules/unique_variable_names.py +0 -0
  227. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/validation/rules/values_of_correct_type.py +0 -0
  228. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/validation/rules/variables_are_input_types.py +0 -0
  229. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/validation/rules/variables_in_allowed_position.py +0 -0
  230. {graphql_core-3.3.1 → graphql_core-3.3.2}/src/graphql/validation/specified_rules.py +0 -0
  231. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/__init__.py +0 -0
  232. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/benchmarks/__init__.py +0 -0
  233. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/benchmarks/test_async_iterable.py +0 -0
  234. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/benchmarks/test_build_ast_schema.py +0 -0
  235. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/benchmarks/test_build_client_schema.py +0 -0
  236. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/benchmarks/test_execution_arguments.py +0 -0
  237. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/benchmarks/test_execution_async.py +0 -0
  238. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/benchmarks/test_execution_sync.py +0 -0
  239. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/benchmarks/test_graphql_schema.py +0 -0
  240. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/benchmarks/test_introspection_from_schema.py +0 -0
  241. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/benchmarks/test_parser.py +0 -0
  242. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/benchmarks/test_print.py +0 -0
  243. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/benchmarks/test_repeated_fields.py +0 -0
  244. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/benchmarks/test_serialization.py +0 -0
  245. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/benchmarks/test_validate_gql.py +0 -0
  246. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/benchmarks/test_validate_invalid_gql.py +0 -0
  247. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/benchmarks/test_validate_sdl.py +0 -0
  248. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/benchmarks/test_visit.py +0 -0
  249. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/error/__init__.py +0 -0
  250. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/error/test_graphql_error.py +0 -0
  251. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/error/test_located_error.py +0 -0
  252. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/execution/__init__.py +0 -0
  253. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/execution/incremental/__init__.py +0 -0
  254. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/execution/incremental/test_computation.py +0 -0
  255. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/execution/incremental/test_incremental_executor.py +0 -0
  256. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/execution/incremental/test_stream_item_queue.py +0 -0
  257. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/execution/test_aborted_graphql_execution_error.py +0 -0
  258. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/execution/test_abstract.py +0 -0
  259. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/execution/test_cancellation.py +0 -0
  260. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/execution/test_customize.py +0 -0
  261. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/execution/test_directives.py +0 -0
  262. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/execution/test_error_propagation.py +0 -0
  263. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/execution/test_execution_result.py +0 -0
  264. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/execution/test_executor_throwing_on_incremental.py +0 -0
  265. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/execution/test_hooks.py +0 -0
  266. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/execution/test_lists.py +0 -0
  267. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/execution/test_map_async_iterable.py +0 -0
  268. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/execution/test_middleware.py +0 -0
  269. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/execution/test_mutations.py +0 -0
  270. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/execution/test_nonnull.py +0 -0
  271. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/execution/test_oneof.py +0 -0
  272. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/execution/test_parallel.py +0 -0
  273. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/execution/test_resolve.py +0 -0
  274. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/execution/test_schema.py +0 -0
  275. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/execution/test_subscribe.py +0 -0
  276. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/execution/test_union_interface.py +0 -0
  277. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/fixtures/__init__.py +0 -0
  278. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/fixtures/github_schema.graphql +0 -0
  279. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/fixtures/github_schema.json +0 -0
  280. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/fixtures/kitchen_sink.graphql +0 -0
  281. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/fixtures/large_query.graphql +0 -0
  282. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/fixtures/schema_kitchen_sink.graphql +0 -0
  283. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/language/__init__.py +0 -0
  284. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/language/test_ast.py +0 -0
  285. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/language/test_block_string_fuzz.py +0 -0
  286. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/language/test_character_classes.py +0 -0
  287. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/language/test_lexer.py +0 -0
  288. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/language/test_predicates.py +0 -0
  289. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/language/test_print_string.py +0 -0
  290. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/language/test_schema_coordinate_lexer.py +0 -0
  291. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/language/test_schema_parser.py +0 -0
  292. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/language/test_schema_printer.py +0 -0
  293. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/pyutils/__init__.py +0 -0
  294. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/pyutils/test_async_reduce.py +0 -0
  295. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/pyutils/test_cached_property.py +0 -0
  296. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/pyutils/test_convert_case.py +0 -0
  297. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/pyutils/test_description.py +0 -0
  298. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/pyutils/test_did_you_mean.py +0 -0
  299. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/pyutils/test_format_list.py +0 -0
  300. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/pyutils/test_frozen_error.py +0 -0
  301. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/pyutils/test_gather_with_cancel.py +0 -0
  302. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/pyutils/test_group_by.py +0 -0
  303. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/pyutils/test_identity_func.py +0 -0
  304. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/pyutils/test_inspect.py +0 -0
  305. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/pyutils/test_is_awaitable.py +0 -0
  306. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/pyutils/test_is_iterable.py +0 -0
  307. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/pyutils/test_merge_kwargs.py +0 -0
  308. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/pyutils/test_natural_compare.py +0 -0
  309. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/pyutils/test_path.py +0 -0
  310. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/pyutils/test_print_path_list.py +0 -0
  311. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/pyutils/test_ref_map.py +0 -0
  312. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/pyutils/test_ref_set.py +0 -0
  313. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/pyutils/test_simple_pub_sub.py +0 -0
  314. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/pyutils/test_suggestion_list.py +0 -0
  315. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/pyutils/test_undefined.py +0 -0
  316. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/star_wars_data.py +0 -0
  317. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/star_wars_schema.py +0 -0
  318. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/test_docs.py +0 -0
  319. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/test_star_wars_introspection.py +0 -0
  320. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/test_star_wars_query.py +0 -0
  321. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/test_star_wars_validation.py +0 -0
  322. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/test_user_registry.py +0 -0
  323. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/test_version.py +0 -0
  324. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/type/__init__.py +0 -0
  325. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/type/test_assert_name.py +0 -0
  326. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/type/test_custom_scalars.py +0 -0
  327. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/type/test_definition.py +0 -0
  328. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/type/test_directives.py +0 -0
  329. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/type/test_enum.py +0 -0
  330. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/type/test_extensions.py +0 -0
  331. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/type/test_predicate.py +0 -0
  332. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/type/test_schema.py +0 -0
  333. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/utilities/__init__.py +0 -0
  334. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/utilities/test_ast_from_value.py +0 -0
  335. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/utilities/test_ast_to_dict.py +0 -0
  336. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/utilities/test_build_client_schema.py +0 -0
  337. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/utilities/test_coerce_input_value.py +0 -0
  338. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/utilities/test_concat_ast.py +0 -0
  339. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/utilities/test_extend_schema.py +0 -0
  340. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/utilities/test_find_breaking_changes.py +0 -0
  341. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/utilities/test_find_schema_changes.py +0 -0
  342. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/utilities/test_get_introspection_query.py +0 -0
  343. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/utilities/test_get_operation_ast.py +0 -0
  344. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/utilities/test_introspection_from_schema.py +0 -0
  345. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/utilities/test_lexicographic_sort_schema.py +0 -0
  346. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/utilities/test_map_schema_config.py +0 -0
  347. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/utilities/test_print_schema.py +0 -0
  348. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/utilities/test_replace_variables.py +0 -0
  349. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/utilities/test_resolve_schema_coordinate.py +0 -0
  350. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/utilities/test_separate_operations.py +0 -0
  351. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/utilities/test_sort_value_node.py +0 -0
  352. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/utilities/test_strip_ignored_characters.py +0 -0
  353. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/utilities/test_strip_ignored_characters_fuzz.py +0 -0
  354. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/utilities/test_type_comparators.py +0 -0
  355. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/utilities/test_type_from_ast.py +0 -0
  356. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/utilities/test_type_info.py +0 -0
  357. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/utilities/test_value_from_ast.py +0 -0
  358. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/utilities/test_value_from_ast_untyped.py +0 -0
  359. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/utilities/test_value_to_literal.py +0 -0
  360. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/utils/__init__.py +0 -0
  361. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/utils/assert_equal_awaitables_or_values.py +0 -0
  362. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/utils/assert_matching_values.py +0 -0
  363. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/utils/dedent.py +0 -0
  364. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/utils/gen_fuzz_strings.py +0 -0
  365. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/utils/test_assert_equal_awaitables_or_values.py +0 -0
  366. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/utils/test_assert_matching_values.py +0 -0
  367. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/utils/test_dedent.py +0 -0
  368. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/utils/test_gen_fuzz_strings.py +0 -0
  369. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/utils/viral_schema.py +0 -0
  370. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/utils/viral_sdl.py +0 -0
  371. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/validation/__init__.py +0 -0
  372. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/validation/harness.py +0 -0
  373. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/validation/test_defer_stream_directive_label.py +0 -0
  374. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/validation/test_executable_definitions.py +0 -0
  375. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/validation/test_fields_on_correct_type.py +0 -0
  376. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/validation/test_fragments_on_composite_types.py +0 -0
  377. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/validation/test_known_argument_names.py +0 -0
  378. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/validation/test_known_directives.py +0 -0
  379. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/validation/test_known_fragment_names.py +0 -0
  380. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/validation/test_known_operation_types.py +0 -0
  381. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/validation/test_known_type_names.py +0 -0
  382. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/validation/test_lone_anonymous_operation.py +0 -0
  383. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/validation/test_lone_schema_definition.py +0 -0
  384. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/validation/test_no_deprecated.py +0 -0
  385. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/validation/test_no_fragment_cycles.py +0 -0
  386. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/validation/test_no_schema_introspection.py +0 -0
  387. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/validation/test_no_unused_fragments.py +0 -0
  388. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/validation/test_possible_fragment_spreads.py +0 -0
  389. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/validation/test_possible_type_extensions.py +0 -0
  390. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/validation/test_stream_directive_on_list_field.py +0 -0
  391. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/validation/test_unique_argument_definition_names.py +0 -0
  392. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/validation/test_unique_argument_names.py +0 -0
  393. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/validation/test_unique_directive_names.py +0 -0
  394. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/validation/test_unique_directives_per_location.py +0 -0
  395. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/validation/test_unique_enum_value_names.py +0 -0
  396. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/validation/test_unique_field_definition_names.py +0 -0
  397. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/validation/test_unique_fragment_names.py +0 -0
  398. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/validation/test_unique_input_field_names.py +0 -0
  399. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/validation/test_unique_operation_names.py +0 -0
  400. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/validation/test_unique_operation_types.py +0 -0
  401. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/validation/test_unique_type_names.py +0 -0
  402. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/validation/test_unique_variable_names.py +0 -0
  403. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/validation/test_values_of_correct_type.py +0 -0
  404. {graphql_core-3.3.1 → graphql_core-3.3.2}/tests/validation/test_variables_are_input_types.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: graphql-core
3
- Version: 3.3.1
3
+ Version: 3.3.2
4
4
  Summary: GraphQL-core is a Python port of GraphQL.js, the JavaScript reference implementation for GraphQL.
5
5
  Keywords: graphql
6
6
  Author: Christoph Zwerschke
@@ -40,11 +40,11 @@ An extensive test suite with over 3000 unit tests and 100% coverage replicates t
40
40
  complete test suite of GraphQL.js, ensuring that this port is reliable and compatible
41
41
  with GraphQL.js.
42
42
 
43
- The current stable version 3.3.1 of GraphQL-core is up-to-date with GraphQL.js
44
- version 17.0.2 and supports Python versions 3.10 to 3.15.
43
+ The current stable version 3.3.2 of GraphQL-core is up-to-date with GraphQL.js
44
+ version 17.1.0 and supports Python versions 3.10 to 3.15.
45
45
 
46
46
  If you need compatibility with GraphQL.js 16 or support for Python 3.7 to 3.9,
47
- you can use the latest version 3.2.13 from the 3.2 branch.
47
+ you can use the latest version 3.2.14 from the 3.2 branch.
48
48
 
49
49
  Note that for various reasons, GraphQL-core does not use SemVer like GraphQL.js.
50
50
  Changes in the major version of GraphQL.js are reflected in the minor version of
@@ -15,11 +15,11 @@ An extensive test suite with over 3000 unit tests and 100% coverage replicates t
15
15
  complete test suite of GraphQL.js, ensuring that this port is reliable and compatible
16
16
  with GraphQL.js.
17
17
 
18
- The current stable version 3.3.1 of GraphQL-core is up-to-date with GraphQL.js
19
- version 17.0.2 and supports Python versions 3.10 to 3.15.
18
+ The current stable version 3.3.2 of GraphQL-core is up-to-date with GraphQL.js
19
+ version 17.1.0 and supports Python versions 3.10 to 3.15.
20
20
 
21
21
  If you need compatibility with GraphQL.js 16 or support for Python 3.7 to 3.9,
22
- you can use the latest version 3.2.13 from the 3.2 branch.
22
+ you can use the latest version 3.2.14 from the 3.2 branch.
23
23
 
24
24
  Note that for various reasons, GraphQL-core does not use SemVer like GraphQL.js.
25
25
  Changes in the major version of GraphQL.js are reflected in the minor version of
@@ -52,7 +52,7 @@ author = "Christoph Zwerschke"
52
52
  # The short X.Y version.
53
53
  # version = '3.3'
54
54
  # The full version, including alpha/beta/rc tags.
55
- version = release = "3.3.1"
55
+ version = release = "3.3.2"
56
56
 
57
57
  # The language for content autogenerated by Sphinx. Refer to documentation
58
58
  # for a list of supported languages.
@@ -38,3 +38,5 @@ PyUtils
38
38
  :no-inherited-members:
39
39
  .. autoclass:: RefSet
40
40
  :no-inherited-members:
41
+ .. autoclass:: SetMap
42
+ :no-inherited-members:
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "graphql-core"
3
- version = "3.3.1"
3
+ version = "3.3.2"
4
4
  description = "GraphQL-core is a Python port of GraphQL.js, the JavaScript reference implementation for GraphQL."
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.10"
@@ -32,19 +32,19 @@ Changelog = "https://github.com/graphql-python/graphql-core/releases"
32
32
 
33
33
  [dependency-groups]
34
34
  test = [
35
- "anyio>=4.15,<5",
36
- "pytest>=9.1,<10",
37
- "pytest-benchmark>=5.3,<6",
35
+ "anyio>=4.16,<5",
36
+ "pytest>=9.2,<10",
37
+ "pytest-benchmark>=5.3.1,<6",
38
38
  "pytest-cov>=7.1,<8",
39
39
  "pytest-describe>=3.2,<4",
40
40
  "pytest-timeout>=2.4,<3",
41
41
  "pytest-codspeed>=5",
42
- "tox>=4.64,<5",
42
+ "tox>=4.65,<5",
43
43
  ]
44
44
  lint = [
45
- "ruff>=0.16.9,<0.17",
46
- "mypy>=2.3.1,<3",
47
- "bump-my-version>=1.5.1,<2",
45
+ "ruff>=0.17.4,<0.18",
46
+ "mypy>=2.4.1,<3",
47
+ "bump-my-version>=1.8.1,<2",
48
48
  "typing-extensions>=4.16; python_version<'3.11'",
49
49
  ]
50
50
  doc = [
@@ -312,7 +312,7 @@ filterwarnings = "ignore::pytest.PytestConfigWarning"
312
312
  testpaths = ["tests"]
313
313
 
314
314
  [tool.bumpversion]
315
- current_version = "3.3.1"
315
+ current_version = "3.3.2"
316
316
  commit = false
317
317
  tag = false
318
318
  parse = '''
@@ -356,5 +356,5 @@ search = '^version = "{current_version}"'
356
356
  replace = 'version = "{new_version}"'
357
357
 
358
358
  [build-system]
359
- requires = ["uv_build>=0.12,<0.13"]
359
+ requires = ["uv_build>=0.13,<0.14"]
360
360
  build-backend = "uv_build"
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "graphql-core"
3
- version = "3.3.1"
3
+ version = "3.3.2"
4
4
  description = "GraphQL-core is a Python port of GraphQL.js, the JavaScript reference implementation for GraphQL."
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.10"
@@ -29,19 +29,19 @@ Changelog = "https://github.com/graphql-python/graphql-core/releases"
29
29
 
30
30
  [dependency-groups]
31
31
  test = [
32
- "anyio>=4.15,<5",
33
- "pytest>=9.1,<10",
34
- "pytest-benchmark>=5.3,<6",
32
+ "anyio>=4.16,<5",
33
+ "pytest>=9.2,<10",
34
+ "pytest-benchmark>=5.3.1,<6",
35
35
  "pytest-cov>=7.1,<8",
36
36
  "pytest-describe>=3.2,<4",
37
37
  "pytest-timeout>=2.4,<3",
38
38
  "pytest-codspeed>=5",
39
- "tox>=4.64,<5",
39
+ "tox>=4.65,<5",
40
40
  ]
41
41
  lint = [
42
- "ruff>=0.16.9,<0.17",
43
- "mypy>=2.3.1,<3",
44
- "bump-my-version>=1.5.1,<2",
42
+ "ruff>=0.17.4,<0.18",
43
+ "mypy>=2.4.1,<3",
44
+ "bump-my-version>=1.8.1,<2",
45
45
  "typing-extensions>=4.16; python_version<'3.11'",
46
46
  ]
47
47
  doc = [
@@ -313,7 +313,7 @@ filterwarnings = "ignore::pytest.PytestConfigWarning"
313
313
  testpaths = ["tests"]
314
314
 
315
315
  [tool.bumpversion]
316
- current_version = "3.3.1"
316
+ current_version = "3.3.2"
317
317
  commit = false
318
318
  tag = false
319
319
  parse = '''(?x)
@@ -351,5 +351,5 @@ search = '^version = "{current_version}"'
351
351
  replace = 'version = "{new_version}"'
352
352
 
353
353
  [build-system]
354
- requires = ["uv_build>=0.12,<0.13"]
354
+ requires = ["uv_build>=0.13,<0.14"]
355
355
  build-backend = "uv_build"
@@ -287,13 +287,18 @@ class GraphQLError(Exception):
287
287
  if not positions and node_locations:
288
288
  positions = [loc.start for loc in node_locations]
289
289
  self.positions = positions or None
290
- if positions and source:
291
- locations: list[SourceLocation] | None = [
292
- source.get_location(pos) for pos in positions
293
- ]
290
+ source_positions = (
291
+ [(source, pos) for pos in positions]
292
+ if positions and source
293
+ else [(loc.source, loc.start) for loc in node_locations]
294
+ )
295
+ if source_positions:
296
+ # Lazy import to avoid a cyclic dependency between error and language
297
+ from ..language.location import get_locations
298
+
299
+ self.locations = get_locations(source_positions)
294
300
  else:
295
- locations = [loc.source.get_location(loc.start) for loc in node_locations]
296
- self.locations = locations or None
301
+ self.locations = None
297
302
 
298
303
  # Adopt the cause as the standard exception cause when it is one, so
299
304
  # that the cause chain is reported without duplicating the traceback.
@@ -14,6 +14,7 @@ from ..language import (
14
14
  OperationDefinitionNode,
15
15
  SelectionSetNode,
16
16
  )
17
+ from ..pyutils import RefSet
17
18
  from ..type import (
18
19
  GraphQLDeferDirective,
19
20
  GraphQLIncludeDirective,
@@ -27,11 +28,12 @@ from .values import (
27
28
  FragmentVariableValues,
28
29
  VariableValues,
29
30
  get_argument_values,
30
- get_directive_values,
31
31
  get_fragment_variable_values,
32
32
  )
33
33
 
34
34
  if TYPE_CHECKING:
35
+ from collections.abc import Callable
36
+
35
37
  from .get_variable_signature import GraphQLVariableSignature
36
38
 
37
39
  __all__ = [
@@ -44,12 +46,14 @@ __all__ = [
44
46
  "GroupedFieldSet",
45
47
  "collect_fields",
46
48
  "collect_subfields",
49
+ "visit_selection_sets",
47
50
  ]
48
51
 
49
52
 
50
53
  class DeferUsage(NamedTuple):
51
54
  """An optionally labelled linked list of defer usages."""
52
55
 
56
+ directive_node: DirectiveNode
53
57
  label: str | None
54
58
  parent_defer_usage: DeferUsage | None
55
59
 
@@ -72,6 +76,8 @@ class FragmentDetails(NamedTuple):
72
76
  FieldDetailsList: TypeAlias = list[FieldDetails]
73
77
  GroupedFieldSet: TypeAlias = dict[str, FieldDetailsList]
74
78
 
79
+ VisitedFragmentNames: TypeAlias = dict[str, RefSet[DirectiveNode | None]]
80
+
75
81
 
76
82
  class CollectFieldsContext(NamedTuple):
77
83
  """Context for collecting fields."""
@@ -81,10 +87,11 @@ class CollectFieldsContext(NamedTuple):
81
87
  variable_values: VariableValues
82
88
  operation: OperationDefinitionNode
83
89
  runtime_type: GraphQLObjectType
84
- visited_fragment_names: dict[str, bool]
90
+ visited_fragment_names: VisitedFragmentNames
85
91
  hide_suggestions: bool
86
92
  forbidden_directive_instances: list[DirectiveNode]
87
93
  forbid_skip_and_include: bool
94
+ on_selection_set: Callable[[SelectionSetNode], None] | None = None
88
95
 
89
96
 
90
97
  class CollectedFields(NamedTuple):
@@ -103,6 +110,7 @@ def collect_fields(
103
110
  operation: OperationDefinitionNode,
104
111
  hide_suggestions: bool = False,
105
112
  forbid_skip_and_include: bool = False,
113
+ on_selection_set: Callable[[SelectionSetNode], None] | None = None,
106
114
  ) -> CollectedFields:
107
115
  """Collect fields.
108
116
 
@@ -126,9 +134,10 @@ def collect_fields(
126
134
  hide_suggestions,
127
135
  [],
128
136
  forbid_skip_and_include,
137
+ on_selection_set,
129
138
  )
130
139
 
131
- collect_fields_impl(
140
+ visit_selection_sets(
132
141
  context, operation.selection_set, grouped_field_set, new_defer_usages
133
142
  )
134
143
  return CollectedFields(
@@ -173,7 +182,7 @@ def collect_subfields(
173
182
  for field_detail in field_details_list:
174
183
  node = field_detail.node
175
184
  if node.selection_set:
176
- collect_fields_impl(
185
+ visit_selection_sets(
177
186
  context,
178
187
  node.selection_set,
179
188
  sub_grouped_field_set,
@@ -187,7 +196,7 @@ def collect_subfields(
187
196
  )
188
197
 
189
198
 
190
- def collect_fields_impl(
199
+ def visit_selection_sets(
191
200
  context: CollectFieldsContext,
192
201
  selection_set: SelectionSetNode,
193
202
  grouped_field_set: dict[str, list[FieldDetails]],
@@ -195,7 +204,10 @@ def collect_fields_impl(
195
204
  defer_usage: DeferUsage | None = None,
196
205
  fragment_variable_values: FragmentVariableValues | None = None,
197
206
  ) -> None:
198
- """Collect fields (internal implementation)."""
207
+ """Collect the fields of a selection set and the selection sets it contains.
208
+
209
+ For internal use only.
210
+ """
199
211
  (
200
212
  schema,
201
213
  fragments,
@@ -206,8 +218,12 @@ def collect_fields_impl(
206
218
  hide_suggestions,
207
219
  _forbidden_directive_instances,
208
220
  _forbid_skip_and_include,
221
+ on_selection_set,
209
222
  ) = context
210
223
 
224
+ if on_selection_set:
225
+ on_selection_set(selection_set)
226
+
211
227
  for selection in selection_set.selections:
212
228
  if isinstance(selection, FieldNode):
213
229
  if not should_include_node(
@@ -232,7 +248,7 @@ def collect_fields_impl(
232
248
  )
233
249
 
234
250
  if new_defer_usage is None:
235
- collect_fields_impl(
251
+ visit_selection_sets(
236
252
  context,
237
253
  selection.selection_set,
238
254
  grouped_field_set,
@@ -242,7 +258,7 @@ def collect_fields_impl(
242
258
  )
243
259
  else:
244
260
  new_defer_usages.append(new_defer_usage)
245
- collect_fields_impl(
261
+ visit_selection_sets(
246
262
  context,
247
263
  selection.selection_set,
248
264
  grouped_field_set,
@@ -271,24 +287,27 @@ def collect_fields_impl(
271
287
  defer_usage,
272
288
  )
273
289
 
274
- visited_as_deferred = visited_fragment_names.get(frag_name)
290
+ maybe_new_defer_usage = (
291
+ defer_usage if new_defer_usage is None else new_defer_usage
292
+ )
293
+ visited_defer_set = visited_fragment_names.get(frag_name)
294
+ if visited_defer_set is None:
295
+ visited_defer_set = visited_fragment_names[frag_name] = RefSet()
275
296
 
276
- if new_defer_usage is None:
277
- # If this spread is not deferred, it may be skipped when already
278
- # visited as a non-deferred spread. If it was previously visited as
279
- # a deferred spread, it must be revisited.
280
- if visited_as_deferred is False:
281
- continue
282
- visited_fragment_names[frag_name] = False
283
- maybe_new_defer_usage = defer_usage
284
- else:
285
- # If this spread is deferred, it can be skipped if it has already
286
- # been visited.
287
- if visited_as_deferred is not None:
288
- continue
289
- visited_fragment_names[frag_name] = True
297
+ if None in visited_defer_set or (
298
+ maybe_new_defer_usage is not None
299
+ and maybe_new_defer_usage.directive_node in visited_defer_set
300
+ ):
301
+ continue
302
+
303
+ if new_defer_usage is not None:
290
304
  new_defer_usages.append(new_defer_usage)
291
- maybe_new_defer_usage = new_defer_usage
305
+
306
+ visited_defer_set.add(
307
+ None
308
+ if maybe_new_defer_usage is None
309
+ else maybe_new_defer_usage.directive_node
310
+ )
292
311
 
293
312
  fragment_variable_signatures = fragment.variable_signatures
294
313
  new_fragment_variable_values: FragmentVariableValues | None = None
@@ -301,7 +320,7 @@ def collect_fields_impl(
301
320
  hide_suggestions,
302
321
  )
303
322
 
304
- collect_fields_impl(
323
+ visit_selection_sets(
305
324
  context,
306
325
  fragment.definition.selection_set,
307
326
  grouped_field_set,
@@ -323,14 +342,30 @@ def get_defer_usage(
323
342
  deferred based on the experimental flag, defer directive present and
324
343
  not disabled by the "if" argument.
325
344
  """
326
- defer = get_directive_values(
327
- GraphQLDeferDirective, node, variable_values, fragment_variable_values
345
+ defer_name = GraphQLDeferDirective.name
346
+ directive_node = next(
347
+ (
348
+ directive
349
+ for directive in node.directives or ()
350
+ if directive.name.value == defer_name
351
+ ),
352
+ None,
353
+ )
354
+
355
+ if directive_node is None:
356
+ return None
357
+
358
+ defer = get_argument_values(
359
+ GraphQLDeferDirective,
360
+ directive_node,
361
+ variable_values,
362
+ fragment_variable_values,
328
363
  )
329
364
 
330
- if not defer or defer.get("if") is False:
365
+ if defer.get("if") is False:
331
366
  return None
332
367
 
333
- return DeferUsage(defer.get("label"), parent_defer_usage)
368
+ return DeferUsage(directive_node, defer.get("label"), parent_defer_usage)
334
369
 
335
370
 
336
371
  def should_include_node(
@@ -25,6 +25,7 @@ from ..pyutils.is_awaitable import (
25
25
  from .async_iterables import map_async_iterable
26
26
  from .collect_fields import collect_fields
27
27
  from .executor import (
28
+ SELECTIONS_NESTED_TOO_DEEPLY,
28
29
  UNEXPECTED_MULTIPLE_PAYLOADS,
29
30
  AsyncWorkFinishedInfo,
30
31
  ExecutionHooks,
@@ -465,6 +466,14 @@ def assume_not_awaitable(_value: Any) -> TypeGuard[Awaitable]:
465
466
  return False
466
467
 
467
468
 
469
+ def assume_not_async_iterable(_value: Any) -> TypeGuard[AsyncIterable]:
470
+ """Replacement for is_async_iterable if everything is assumed to be synchronous.
471
+
472
+ :meta private:
473
+ """
474
+ return False
475
+
476
+
468
477
  def execute_sync(
469
478
  schema: GraphQLSchema,
470
479
  document: DocumentNode,
@@ -549,6 +558,7 @@ def execute_sync(
549
558
  if callable(check_sync)
550
559
  else (None if check_sync else assume_not_awaitable)
551
560
  )
561
+ is_async_iterable = assume_not_async_iterable if not check_sync else None
552
562
 
553
563
  result = experimental_execute_incrementally(
554
564
  schema,
@@ -565,6 +575,7 @@ def execute_sync(
565
575
  middleware,
566
576
  executor_class,
567
577
  is_awaitable,
578
+ is_async_iterable,
568
579
  hide_suggestions=hide_suggestions,
569
580
  abort_signal=abort_signal,
570
581
  hooks=hooks,
@@ -988,6 +999,13 @@ def create_source_event_stream(
988
999
  event_stream = execute_subscription(executor)
989
1000
  except GraphQLError as error:
990
1001
  return ExecutionResult(None, errors=[error])
1002
+ except RecursionError:
1003
+ # This error is never raised, so it has no traceback or context
1004
+ # that would keep all the frames of the recursion alive.
1005
+ return ExecutionResult(
1006
+ None,
1007
+ errors=[GraphQLError(SELECTIONS_NESTED_TOO_DEEPLY, executor.operation)],
1008
+ )
991
1009
 
992
1010
  if executor.is_awaitable(event_stream):
993
1011
 
@@ -126,6 +126,8 @@ UNEXPECTED_MULTIPLE_PAYLOADS = (
126
126
  " (due to @defer or @stream directive)"
127
127
  )
128
128
 
129
+ SELECTIONS_NESTED_TOO_DEEPLY = "Selections are nested too deeply. Execution aborted."
130
+
129
131
  DEFER_NOT_SUPPORTED_ON_SUBSCRIPTIONS = (
130
132
  "`@defer` directive not supported on subscription operations."
131
133
  " Disable `@defer` by setting the `if` argument to `false`."
@@ -696,14 +698,21 @@ class Executor(Generic[TContext]):
696
698
  raise GraphQLError(msg, operation) # noqa: TRY301
697
699
  root_value = self.root_value
698
700
 
699
- collected_fields = collect_fields(
700
- schema,
701
- self.fragments,
702
- self.variable_values,
703
- root_type,
704
- operation,
705
- self.hide_suggestions,
706
- )
701
+ try:
702
+ collected_fields = collect_fields(
703
+ schema,
704
+ self.fragments,
705
+ self.variable_values,
706
+ root_type,
707
+ operation,
708
+ self.hide_suggestions,
709
+ )
710
+ except RecursionError:
711
+ collected_fields = None
712
+ # Leave the block above first, or the RecursionError would be kept as the
713
+ # context of this error and keep all the frames of the recursion alive.
714
+ if collected_fields is None:
715
+ raise GraphQLError(SELECTIONS_NESTED_TOO_DEEPLY, operation) # noqa: TRY301
707
716
 
708
717
  grouped_field_set, new_defer_usages, _forbidden = collected_fields
709
718
 
@@ -956,12 +965,16 @@ class Executor(Generic[TContext]):
956
965
  try:
957
966
  # Build a dictionary of arguments from the field.arguments AST, using the
958
967
  # variables scope to fulfill any variable references.
959
- args = get_argument_values(
960
- field_def,
961
- first_field_node,
962
- self.variable_values,
963
- first_field_details.fragment_variable_values,
964
- self.hide_suggestions,
968
+ args = (
969
+ get_argument_values(
970
+ field_def,
971
+ first_field_node,
972
+ self.variable_values,
973
+ first_field_details.fragment_variable_values,
974
+ self.hide_suggestions,
975
+ )
976
+ if field_def.args or first_field_node.arguments
977
+ else {}
965
978
  )
966
979
 
967
980
  # Note that contrary to the JavaScript implementation, we pass the context
@@ -988,11 +1001,17 @@ class Executor(Generic[TContext]):
988
1001
  )
989
1002
  if self.is_awaitable(completed):
990
1003
 
991
- async def await_completed() -> Any:
1004
+ async def await_completed(
1005
+ executor: Executor,
1006
+ completed: Awaitable[Any],
1007
+ return_type: GraphQLOutputType,
1008
+ field_details_list: FieldDetailsList,
1009
+ path: Path,
1010
+ ) -> Any:
992
1011
  try:
993
1012
  return await completed
994
1013
  except Exception as raw_error:
995
- self.handle_field_error(
1014
+ executor.handle_field_error(
996
1015
  raw_error,
997
1016
  return_type,
998
1017
  field_details_list,
@@ -1000,7 +1019,9 @@ class Executor(Generic[TContext]):
1000
1019
  )
1001
1020
  return None
1002
1021
 
1003
- return await_completed()
1022
+ return await_completed(
1023
+ self, completed, return_type, field_details_list, path
1024
+ )
1004
1025
 
1005
1026
  except Exception as raw_error:
1006
1027
  self.handle_field_error(
@@ -1024,7 +1045,7 @@ class Executor(Generic[TContext]):
1024
1045
 
1025
1046
  :meta private:
1026
1047
  """
1027
- # The resolve function's first argument is a collection of information about
1048
+ # The resolve function's second argument is a collection of information about
1028
1049
  # the current execution state.
1029
1050
  return GraphQLResolveInfo(
1030
1051
  field_nodes[0].name.value,
@@ -4,7 +4,7 @@ from __future__ import annotations
4
4
 
5
5
  from typing import NamedTuple, TypeAlias
6
6
 
7
- from ...pyutils import RefMap, RefSet
7
+ from ...pyutils import RefSet, SetMap
8
8
  from ..collect_fields import DeferUsage, FieldDetailsList, GroupedFieldSet
9
9
 
10
10
  __all__ = [
@@ -22,7 +22,7 @@ class ExecutionPlan(NamedTuple):
22
22
  """A plan for executing fields."""
23
23
 
24
24
  grouped_field_set: GroupedFieldSet
25
- new_grouped_field_sets: RefMap[DeferUsageSet, GroupedFieldSet]
25
+ new_grouped_field_sets: SetMap[DeferUsageSet, GroupedFieldSet]
26
26
 
27
27
 
28
28
  def build_execution_plan(
@@ -34,7 +34,7 @@ def build_execution_plan(
34
34
  parent_defer_usages = RefSet()
35
35
 
36
36
  grouped_field_set: GroupedFieldSet = {}
37
- new_grouped_field_sets: RefMap[DeferUsageSet, GroupedFieldSet] = RefMap()
37
+ new_grouped_field_sets: SetMap[DeferUsageSet, GroupedFieldSet] = SetMap()
38
38
 
39
39
  for response_key, field_details_list in original_grouped_field_set.items():
40
40
  filtered_defer_usage_set = get_filtered_defer_usage_set(field_details_list)
@@ -43,14 +43,9 @@ def build_execution_plan(
43
43
  grouped_field_set[response_key] = field_details_list
44
44
  continue
45
45
 
46
- for defer_usage_set in new_grouped_field_sets:
47
- if defer_usage_set == filtered_defer_usage_set:
48
- new_grouped_field_set = new_grouped_field_sets[defer_usage_set]
49
- break
50
- else:
51
- new_grouped_field_set = {}
52
- new_grouped_field_sets[filtered_defer_usage_set] = new_grouped_field_set
53
-
46
+ new_grouped_field_set = new_grouped_field_sets.get_or_insert_computed(
47
+ filtered_defer_usage_set, lambda _members: {}
48
+ )
54
49
  new_grouped_field_set[response_key] = field_details_list
55
50
 
56
51
  return ExecutionPlan(grouped_field_set, new_grouped_field_sets)
@@ -26,7 +26,7 @@ from .work_queue import Work, WorkResult, WorkTask
26
26
  if TYPE_CHECKING:
27
27
  from collections.abc import AsyncIterator, Iterator, Sequence
28
28
 
29
- from ...pyutils import AwaitableOrValue, Path
29
+ from ...pyutils import AwaitableOrValue, Path, SetMap
30
30
  from ...type import (
31
31
  GraphQLObjectType,
32
32
  GraphQLOutputType,
@@ -403,7 +403,7 @@ class IncrementalExecutor(Executor[DeliveryGroupMap]):
403
403
  parent_type: GraphQLObjectType,
404
404
  source_value: Any,
405
405
  path: Path | None,
406
- new_grouped_field_sets: RefMap[DeferUsageSet, GroupedFieldSet],
406
+ new_grouped_field_sets: SetMap[DeferUsageSet, GroupedFieldSet],
407
407
  delivery_group_map: DeliveryGroupMap,
408
408
  ) -> None:
409
409
  """Create execution groups for the new deferred grouped field sets."""