graphql 1.9.17 → 1.11.7

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.

Potentially problematic release.


This version of graphql might be problematic. Click here for more details.

Files changed (230) hide show
  1. checksums.yaml +4 -4
  2. data/lib/generators/graphql/core.rb +18 -2
  3. data/lib/generators/graphql/install_generator.rb +27 -0
  4. data/lib/generators/graphql/object_generator.rb +52 -8
  5. data/lib/generators/graphql/templates/base_argument.erb +2 -0
  6. data/lib/generators/graphql/templates/base_enum.erb +2 -0
  7. data/lib/generators/graphql/templates/base_field.erb +2 -0
  8. data/lib/generators/graphql/templates/base_input_object.erb +2 -0
  9. data/lib/generators/graphql/templates/base_interface.erb +2 -0
  10. data/lib/generators/graphql/templates/base_mutation.erb +2 -0
  11. data/lib/generators/graphql/templates/base_object.erb +2 -0
  12. data/lib/generators/graphql/templates/base_scalar.erb +2 -0
  13. data/lib/generators/graphql/templates/base_union.erb +2 -0
  14. data/lib/generators/graphql/templates/enum.erb +2 -0
  15. data/lib/generators/graphql/templates/graphql_controller.erb +14 -10
  16. data/lib/generators/graphql/templates/interface.erb +2 -0
  17. data/lib/generators/graphql/templates/loader.erb +2 -0
  18. data/lib/generators/graphql/templates/mutation.erb +2 -0
  19. data/lib/generators/graphql/templates/mutation_type.erb +2 -0
  20. data/lib/generators/graphql/templates/object.erb +2 -0
  21. data/lib/generators/graphql/templates/query_type.erb +2 -0
  22. data/lib/generators/graphql/templates/scalar.erb +2 -0
  23. data/lib/generators/graphql/templates/schema.erb +10 -0
  24. data/lib/generators/graphql/templates/union.erb +3 -1
  25. data/lib/graphql/analysis/ast/field_usage.rb +1 -1
  26. data/lib/graphql/analysis/ast/query_complexity.rb +178 -67
  27. data/lib/graphql/analysis/ast/visitor.rb +3 -3
  28. data/lib/graphql/analysis/ast.rb +12 -11
  29. data/lib/graphql/argument.rb +10 -38
  30. data/lib/graphql/backtrace/table.rb +10 -2
  31. data/lib/graphql/backtrace/tracer.rb +2 -1
  32. data/lib/graphql/base_type.rb +4 -0
  33. data/lib/graphql/compatibility/execution_specification/specification_schema.rb +2 -2
  34. data/lib/graphql/compatibility/query_parser_specification/parse_error_specification.rb +5 -9
  35. data/lib/graphql/define/assign_enum_value.rb +1 -1
  36. data/lib/graphql/define/assign_global_id_field.rb +2 -2
  37. data/lib/graphql/define/assign_object_field.rb +3 -3
  38. data/lib/graphql/define/defined_object_proxy.rb +3 -0
  39. data/lib/graphql/define/instance_definable.rb +18 -108
  40. data/lib/graphql/directive/deprecated_directive.rb +1 -12
  41. data/lib/graphql/directive.rb +8 -1
  42. data/lib/graphql/enum_type.rb +5 -71
  43. data/lib/graphql/execution/directive_checks.rb +2 -2
  44. data/lib/graphql/execution/errors.rb +2 -3
  45. data/lib/graphql/execution/execute.rb +1 -1
  46. data/lib/graphql/execution/instrumentation.rb +1 -1
  47. data/lib/graphql/execution/interpreter/argument_value.rb +28 -0
  48. data/lib/graphql/execution/interpreter/arguments.rb +51 -0
  49. data/lib/graphql/execution/interpreter/arguments_cache.rb +79 -0
  50. data/lib/graphql/execution/interpreter/handles_raw_value.rb +25 -0
  51. data/lib/graphql/execution/interpreter/runtime.rb +227 -254
  52. data/lib/graphql/execution/interpreter.rb +34 -11
  53. data/lib/graphql/execution/lazy/lazy_method_map.rb +4 -0
  54. data/lib/graphql/execution/lookahead.rb +39 -114
  55. data/lib/graphql/execution/multiplex.rb +14 -5
  56. data/lib/graphql/field.rb +14 -118
  57. data/lib/graphql/filter.rb +1 -1
  58. data/lib/graphql/function.rb +1 -30
  59. data/lib/graphql/input_object_type.rb +6 -24
  60. data/lib/graphql/integer_decoding_error.rb +17 -0
  61. data/lib/graphql/interface_type.rb +7 -23
  62. data/lib/graphql/internal_representation/scope.rb +2 -2
  63. data/lib/graphql/internal_representation/visit.rb +2 -2
  64. data/lib/graphql/introspection/base_object.rb +2 -5
  65. data/lib/graphql/introspection/directive_type.rb +1 -1
  66. data/lib/graphql/introspection/entry_points.rb +7 -7
  67. data/lib/graphql/introspection/field_type.rb +7 -3
  68. data/lib/graphql/introspection/input_value_type.rb +33 -9
  69. data/lib/graphql/introspection/introspection_query.rb +6 -92
  70. data/lib/graphql/introspection/schema_type.rb +4 -9
  71. data/lib/graphql/introspection/type_type.rb +11 -7
  72. data/lib/graphql/introspection.rb +96 -0
  73. data/lib/graphql/invalid_null_error.rb +18 -0
  74. data/lib/graphql/language/block_string.rb +24 -5
  75. data/lib/graphql/language/definition_slice.rb +21 -10
  76. data/lib/graphql/language/document_from_schema_definition.rb +89 -64
  77. data/lib/graphql/language/lexer.rb +7 -3
  78. data/lib/graphql/language/lexer.rl +7 -3
  79. data/lib/graphql/language/nodes.rb +52 -91
  80. data/lib/graphql/language/parser.rb +719 -717
  81. data/lib/graphql/language/parser.y +104 -98
  82. data/lib/graphql/language/printer.rb +1 -1
  83. data/lib/graphql/language/sanitized_printer.rb +222 -0
  84. data/lib/graphql/language/visitor.rb +2 -2
  85. data/lib/graphql/language.rb +2 -1
  86. data/lib/graphql/name_validator.rb +6 -7
  87. data/lib/graphql/non_null_type.rb +0 -10
  88. data/lib/graphql/object_type.rb +45 -56
  89. data/lib/graphql/pagination/active_record_relation_connection.rb +41 -0
  90. data/lib/graphql/pagination/array_connection.rb +77 -0
  91. data/lib/graphql/pagination/connection.rb +208 -0
  92. data/lib/graphql/pagination/connections.rb +145 -0
  93. data/lib/graphql/pagination/mongoid_relation_connection.rb +25 -0
  94. data/lib/graphql/pagination/relation_connection.rb +185 -0
  95. data/lib/graphql/pagination/sequel_dataset_connection.rb +28 -0
  96. data/lib/graphql/pagination.rb +6 -0
  97. data/lib/graphql/query/arguments.rb +4 -2
  98. data/lib/graphql/query/context.rb +36 -9
  99. data/lib/graphql/query/fingerprint.rb +26 -0
  100. data/lib/graphql/query/input_validation_result.rb +23 -6
  101. data/lib/graphql/query/literal_input.rb +30 -10
  102. data/lib/graphql/query/null_context.rb +5 -1
  103. data/lib/graphql/query/validation_pipeline.rb +4 -1
  104. data/lib/graphql/query/variable_validation_error.rb +1 -1
  105. data/lib/graphql/query/variables.rb +16 -7
  106. data/lib/graphql/query.rb +64 -15
  107. data/lib/graphql/rake_task/validate.rb +3 -0
  108. data/lib/graphql/rake_task.rb +9 -9
  109. data/lib/graphql/relay/array_connection.rb +10 -12
  110. data/lib/graphql/relay/base_connection.rb +23 -13
  111. data/lib/graphql/relay/connection_type.rb +2 -1
  112. data/lib/graphql/relay/edge_type.rb +1 -0
  113. data/lib/graphql/relay/edges_instrumentation.rb +1 -1
  114. data/lib/graphql/relay/mutation.rb +1 -86
  115. data/lib/graphql/relay/node.rb +2 -2
  116. data/lib/graphql/relay/range_add.rb +14 -5
  117. data/lib/graphql/relay/relation_connection.rb +8 -10
  118. data/lib/graphql/scalar_type.rb +15 -59
  119. data/lib/graphql/schema/argument.rb +113 -11
  120. data/lib/graphql/schema/base_64_encoder.rb +2 -0
  121. data/lib/graphql/schema/build_from_definition/resolve_map/default_resolve.rb +1 -1
  122. data/lib/graphql/schema/build_from_definition/resolve_map.rb +13 -5
  123. data/lib/graphql/schema/build_from_definition.rb +212 -190
  124. data/lib/graphql/schema/built_in_types.rb +5 -5
  125. data/lib/graphql/schema/default_type_error.rb +2 -0
  126. data/lib/graphql/schema/directive/deprecated.rb +18 -0
  127. data/lib/graphql/schema/directive/include.rb +1 -1
  128. data/lib/graphql/schema/directive/skip.rb +1 -1
  129. data/lib/graphql/schema/directive.rb +34 -3
  130. data/lib/graphql/schema/enum.rb +52 -4
  131. data/lib/graphql/schema/enum_value.rb +6 -1
  132. data/lib/graphql/schema/field/connection_extension.rb +44 -20
  133. data/lib/graphql/schema/field/scope_extension.rb +1 -1
  134. data/lib/graphql/schema/field.rb +200 -129
  135. data/lib/graphql/schema/find_inherited_value.rb +13 -0
  136. data/lib/graphql/schema/finder.rb +13 -11
  137. data/lib/graphql/schema/input_object.rb +131 -22
  138. data/lib/graphql/schema/interface.rb +26 -8
  139. data/lib/graphql/schema/introspection_system.rb +108 -37
  140. data/lib/graphql/schema/late_bound_type.rb +3 -2
  141. data/lib/graphql/schema/list.rb +47 -0
  142. data/lib/graphql/schema/loader.rb +134 -96
  143. data/lib/graphql/schema/member/base_dsl_methods.rb +29 -12
  144. data/lib/graphql/schema/member/build_type.rb +19 -5
  145. data/lib/graphql/schema/member/cached_graphql_definition.rb +5 -0
  146. data/lib/graphql/schema/member/has_arguments.rb +105 -5
  147. data/lib/graphql/schema/member/has_ast_node.rb +20 -0
  148. data/lib/graphql/schema/member/has_fields.rb +20 -10
  149. data/lib/graphql/schema/member/has_unresolved_type_error.rb +15 -0
  150. data/lib/graphql/schema/member/type_system_helpers.rb +2 -2
  151. data/lib/graphql/schema/member/validates_input.rb +33 -0
  152. data/lib/graphql/schema/member.rb +6 -0
  153. data/lib/graphql/schema/mutation.rb +5 -1
  154. data/lib/graphql/schema/non_null.rb +30 -0
  155. data/lib/graphql/schema/object.rb +65 -12
  156. data/lib/graphql/schema/possible_types.rb +9 -4
  157. data/lib/graphql/schema/printer.rb +0 -15
  158. data/lib/graphql/schema/relay_classic_mutation.rb +5 -3
  159. data/lib/graphql/schema/resolver/has_payload_type.rb +5 -2
  160. data/lib/graphql/schema/resolver.rb +26 -18
  161. data/lib/graphql/schema/scalar.rb +27 -3
  162. data/lib/graphql/schema/subscription.rb +8 -18
  163. data/lib/graphql/schema/timeout.rb +29 -15
  164. data/lib/graphql/schema/traversal.rb +1 -1
  165. data/lib/graphql/schema/type_expression.rb +21 -13
  166. data/lib/graphql/schema/type_membership.rb +2 -2
  167. data/lib/graphql/schema/union.rb +37 -3
  168. data/lib/graphql/schema/unique_within_type.rb +1 -2
  169. data/lib/graphql/schema/validation.rb +10 -2
  170. data/lib/graphql/schema/warden.rb +115 -29
  171. data/lib/graphql/schema.rb +903 -195
  172. data/lib/graphql/static_validation/all_rules.rb +1 -0
  173. data/lib/graphql/static_validation/base_visitor.rb +10 -6
  174. data/lib/graphql/static_validation/literal_validator.rb +52 -27
  175. data/lib/graphql/static_validation/rules/argument_literals_are_compatible.rb +43 -83
  176. data/lib/graphql/static_validation/rules/argument_literals_are_compatible_error.rb +17 -5
  177. data/lib/graphql/static_validation/rules/arguments_are_defined.rb +33 -25
  178. data/lib/graphql/static_validation/rules/directives_are_in_valid_locations.rb +1 -1
  179. data/lib/graphql/static_validation/rules/fields_are_defined_on_type.rb +4 -4
  180. data/lib/graphql/static_validation/rules/fields_have_appropriate_selections.rb +5 -5
  181. data/lib/graphql/static_validation/rules/fields_will_merge.rb +29 -21
  182. data/lib/graphql/static_validation/rules/fragment_spreads_are_possible.rb +3 -3
  183. data/lib/graphql/static_validation/rules/input_object_names_are_unique.rb +30 -0
  184. data/lib/graphql/static_validation/rules/input_object_names_are_unique_error.rb +30 -0
  185. data/lib/graphql/static_validation/rules/required_arguments_are_present.rb +2 -2
  186. data/lib/graphql/static_validation/rules/required_input_object_attributes_are_present.rb +4 -5
  187. data/lib/graphql/static_validation/rules/variable_default_values_are_correctly_typed.rb +12 -13
  188. data/lib/graphql/static_validation/rules/variable_usages_are_allowed.rb +5 -6
  189. data/lib/graphql/static_validation/rules/variables_are_input_types.rb +1 -1
  190. data/lib/graphql/static_validation/rules/variables_are_used_and_defined.rb +5 -3
  191. data/lib/graphql/static_validation/type_stack.rb +2 -2
  192. data/lib/graphql/static_validation/validation_context.rb +1 -1
  193. data/lib/graphql/static_validation/validation_timeout_error.rb +25 -0
  194. data/lib/graphql/static_validation/validator.rb +30 -8
  195. data/lib/graphql/static_validation.rb +1 -0
  196. data/lib/graphql/subscriptions/action_cable_subscriptions.rb +89 -19
  197. data/lib/graphql/subscriptions/broadcast_analyzer.rb +84 -0
  198. data/lib/graphql/subscriptions/default_subscription_resolve_extension.rb +21 -0
  199. data/lib/graphql/subscriptions/event.rb +23 -5
  200. data/lib/graphql/subscriptions/instrumentation.rb +10 -5
  201. data/lib/graphql/subscriptions/serialize.rb +22 -4
  202. data/lib/graphql/subscriptions/subscription_root.rb +15 -5
  203. data/lib/graphql/subscriptions.rb +108 -35
  204. data/lib/graphql/tracing/active_support_notifications_tracing.rb +14 -10
  205. data/lib/graphql/tracing/appoptics_tracing.rb +171 -0
  206. data/lib/graphql/tracing/appsignal_tracing.rb +8 -0
  207. data/lib/graphql/tracing/data_dog_tracing.rb +8 -0
  208. data/lib/graphql/tracing/new_relic_tracing.rb +9 -12
  209. data/lib/graphql/tracing/platform_tracing.rb +53 -9
  210. data/lib/graphql/tracing/prometheus_tracing/graphql_collector.rb +4 -1
  211. data/lib/graphql/tracing/prometheus_tracing.rb +8 -0
  212. data/lib/graphql/tracing/scout_tracing.rb +19 -0
  213. data/lib/graphql/tracing/skylight_tracing.rb +8 -0
  214. data/lib/graphql/tracing/statsd_tracing.rb +42 -0
  215. data/lib/graphql/tracing.rb +14 -34
  216. data/lib/graphql/types/big_int.rb +1 -1
  217. data/lib/graphql/types/int.rb +9 -2
  218. data/lib/graphql/types/iso_8601_date.rb +3 -3
  219. data/lib/graphql/types/iso_8601_date_time.rb +25 -10
  220. data/lib/graphql/types/relay/base_connection.rb +11 -7
  221. data/lib/graphql/types/relay/base_edge.rb +2 -1
  222. data/lib/graphql/types/string.rb +7 -1
  223. data/lib/graphql/unauthorized_error.rb +1 -1
  224. data/lib/graphql/union_type.rb +13 -28
  225. data/lib/graphql/unresolved_type_error.rb +2 -2
  226. data/lib/graphql/version.rb +1 -1
  227. data/lib/graphql.rb +31 -6
  228. data/readme.md +1 -1
  229. metadata +34 -9
  230. data/lib/graphql/literal_validation_error.rb +0 -6
@@ -23,10 +23,16 @@ module GraphQL
23
23
  @include_built_in_scalars = include_built_in_scalars
24
24
  @include_built_in_directives = include_built_in_directives
25
25
 
26
+ filter = GraphQL::Filter.new(only: only, except: except)
27
+ if @schema.respond_to?(:visible?)
28
+ filter = filter.merge(only: @schema.method(:visible?))
29
+ end
30
+
31
+ schema_context = schema.context_class.new(query: nil, object: nil, schema: schema, values: context)
26
32
  @warden = GraphQL::Schema::Warden.new(
27
- GraphQL::Filter.new(only: only, except: except),
33
+ filter,
28
34
  schema: @schema,
29
- context: context,
35
+ context: schema_context,
30
36
  )
31
37
  end
32
38
 
@@ -38,88 +44,77 @@ module GraphQL
38
44
 
39
45
  def build_schema_node
40
46
  GraphQL::Language::Nodes::SchemaDefinition.new(
41
- query: warden.root_type_for_operation("query"),
42
- mutation: warden.root_type_for_operation("mutation"),
43
- subscription: warden.root_type_for_operation("subscription"),
47
+ query: (q = warden.root_type_for_operation("query")) && q.graphql_name,
48
+ mutation: (m = warden.root_type_for_operation("mutation")) && m.graphql_name,
49
+ subscription: (s = warden.root_type_for_operation("subscription")) && s.graphql_name,
44
50
  # This only supports directives from parsing,
45
51
  # use a custom printer to add to this list.
46
- directives: @schema.ast_node ? @schema.ast_node.directives : [],
52
+ directives: ast_directives(@schema),
47
53
  )
48
54
  end
49
55
 
50
56
  def build_object_type_node(object_type)
51
57
  GraphQL::Language::Nodes::ObjectTypeDefinition.new(
52
- name: object_type.name,
53
- interfaces: warden.interfaces(object_type).sort_by(&:name).map { |iface| build_type_name_node(iface) },
58
+ name: object_type.graphql_name,
59
+ interfaces: warden.interfaces(object_type).sort_by(&:graphql_name).map { |iface| build_type_name_node(iface) },
54
60
  fields: build_field_nodes(warden.fields(object_type)),
55
61
  description: object_type.description,
62
+ directives: ast_directives(object_type),
56
63
  )
57
64
  end
58
65
 
59
66
  def build_field_node(field)
60
- field_node = GraphQL::Language::Nodes::FieldDefinition.new(
61
- name: field.name,
67
+ GraphQL::Language::Nodes::FieldDefinition.new(
68
+ name: field.graphql_name,
62
69
  arguments: build_argument_nodes(warden.arguments(field)),
63
70
  type: build_type_name_node(field.type),
64
71
  description: field.description,
72
+ directives: ast_directives(field),
65
73
  )
66
-
67
- if field.deprecation_reason
68
- field_node = field_node.merge_directive(
69
- name: GraphQL::Directive::DeprecatedDirective.name,
70
- arguments: [GraphQL::Language::Nodes::Argument.new(name: "reason", value: field.deprecation_reason)]
71
- )
72
- end
73
-
74
- field_node
75
74
  end
76
75
 
77
76
  def build_union_type_node(union_type)
78
77
  GraphQL::Language::Nodes::UnionTypeDefinition.new(
79
- name: union_type.name,
78
+ name: union_type.graphql_name,
80
79
  description: union_type.description,
81
- types: warden.possible_types(union_type).sort_by(&:name).map { |type| build_type_name_node(type) }
80
+ types: warden.possible_types(union_type).sort_by(&:graphql_name).map { |type| build_type_name_node(type) },
81
+ directives: ast_directives(union_type),
82
82
  )
83
83
  end
84
84
 
85
85
  def build_interface_type_node(interface_type)
86
86
  GraphQL::Language::Nodes::InterfaceTypeDefinition.new(
87
- name: interface_type.name,
87
+ name: interface_type.graphql_name,
88
88
  description: interface_type.description,
89
- fields: build_field_nodes(warden.fields(interface_type))
89
+ fields: build_field_nodes(warden.fields(interface_type)),
90
+ directives: ast_directives(interface_type),
90
91
  )
91
92
  end
92
93
 
93
94
  def build_enum_type_node(enum_type)
94
95
  GraphQL::Language::Nodes::EnumTypeDefinition.new(
95
- name: enum_type.name,
96
- values: warden.enum_values(enum_type).sort_by(&:name).map do |enum_value|
96
+ name: enum_type.graphql_name,
97
+ values: warden.enum_values(enum_type).sort_by(&:graphql_name).map do |enum_value|
97
98
  build_enum_value_node(enum_value)
98
99
  end,
99
100
  description: enum_type.description,
101
+ directives: ast_directives(enum_type),
100
102
  )
101
103
  end
102
104
 
103
105
  def build_enum_value_node(enum_value)
104
- enum_value_node = GraphQL::Language::Nodes::EnumValueDefinition.new(
105
- name: enum_value.name,
106
+ GraphQL::Language::Nodes::EnumValueDefinition.new(
107
+ name: enum_value.graphql_name,
106
108
  description: enum_value.description,
109
+ directives: ast_directives(enum_value),
107
110
  )
108
-
109
- if enum_value.deprecation_reason
110
- enum_value_node = enum_value_node.merge_directive(
111
- name: GraphQL::Directive::DeprecatedDirective.name,
112
- arguments: [GraphQL::Language::Nodes::Argument.new(name: "reason", value: enum_value.deprecation_reason)]
113
- )
114
- end
115
-
116
- enum_value_node
117
111
  end
118
112
 
119
113
  def build_scalar_type_node(scalar_type)
120
114
  GraphQL::Language::Nodes::ScalarTypeDefinition.new(
121
- name: scalar_type.name,
115
+ name: scalar_type.graphql_name,
122
116
  description: scalar_type.description,
117
+ directives: ast_directives(scalar_type),
123
118
  )
124
119
  end
125
120
 
@@ -131,10 +126,11 @@ module GraphQL
131
126
  end
132
127
 
133
128
  argument_node = GraphQL::Language::Nodes::InputValueDefinition.new(
134
- name: argument.name,
129
+ name: argument.graphql_name,
135
130
  description: argument.description,
136
131
  type: build_type_name_node(argument.type),
137
132
  default_value: default_value,
133
+ directives: ast_directives(argument),
138
134
  )
139
135
 
140
136
  argument_node
@@ -142,15 +138,16 @@ module GraphQL
142
138
 
143
139
  def build_input_object_node(input_object)
144
140
  GraphQL::Language::Nodes::InputObjectTypeDefinition.new(
145
- name: input_object.name,
141
+ name: input_object.graphql_name,
146
142
  fields: build_argument_nodes(warden.arguments(input_object)),
147
143
  description: input_object.description,
144
+ directives: ast_directives(input_object),
148
145
  )
149
146
  end
150
147
 
151
148
  def build_directive_node(directive)
152
149
  GraphQL::Language::Nodes::DirectiveDefinition.new(
153
- name: directive.name,
150
+ name: directive.graphql_name,
154
151
  arguments: build_argument_nodes(warden.arguments(directive)),
155
152
  locations: build_directive_location_nodes(directive.locations),
156
153
  description: directive.description,
@@ -168,17 +165,17 @@ module GraphQL
168
165
  end
169
166
 
170
167
  def build_type_name_node(type)
171
- case type
172
- when GraphQL::ListType
168
+ case type.kind.name
169
+ when "LIST"
173
170
  GraphQL::Language::Nodes::ListType.new(
174
171
  of_type: build_type_name_node(type.of_type)
175
172
  )
176
- when GraphQL::NonNullType
173
+ when "NON_NULL"
177
174
  GraphQL::Language::Nodes::NonNullType.new(
178
175
  of_type: build_type_name_node(type.of_type)
179
176
  )
180
177
  else
181
- GraphQL::Language::Nodes::TypeName.new(name: type.name)
178
+ GraphQL::Language::Nodes::TypeName.new(name: type.graphql_name)
182
179
  end
183
180
  end
184
181
 
@@ -187,24 +184,24 @@ module GraphQL
187
184
  return GraphQL::Language::Nodes::NullValue.new(name: "null")
188
185
  end
189
186
 
190
- case type
191
- when GraphQL::ScalarType
187
+ case type.kind.name
188
+ when "SCALAR"
192
189
  type.coerce_isolated_result(default_value)
193
- when EnumType
190
+ when "ENUM"
194
191
  GraphQL::Language::Nodes::Enum.new(name: type.coerce_isolated_result(default_value))
195
- when InputObjectType
192
+ when "INPUT_OBJECT"
196
193
  GraphQL::Language::Nodes::InputObject.new(
197
194
  arguments: default_value.to_h.map do |arg_name, arg_value|
198
- arg_type = type.input_fields.fetch(arg_name.to_s).type
195
+ arg_type = type.arguments.fetch(arg_name.to_s).type
199
196
  GraphQL::Language::Nodes::Argument.new(
200
- name: arg_name,
197
+ name: arg_name.to_s,
201
198
  value: build_default_value(arg_value, arg_type)
202
199
  )
203
200
  end
204
201
  )
205
- when NonNullType
202
+ when "NON_NULL"
206
203
  build_default_value(default_value, type.of_type)
207
- when ListType
204
+ when "LIST"
208
205
  default_value.to_a.map { |v| build_default_value(v, type.of_type) }
209
206
  else
210
207
  raise GraphQL::RequiredImplementationMissingError, "Unexpected default value type #{type.inspect}"
@@ -212,18 +209,18 @@ module GraphQL
212
209
  end
213
210
 
214
211
  def build_type_definition_node(type)
215
- case type
216
- when GraphQL::ObjectType
212
+ case type.kind.name
213
+ when "OBJECT"
217
214
  build_object_type_node(type)
218
- when GraphQL::UnionType
215
+ when "UNION"
219
216
  build_union_type_node(type)
220
- when GraphQL::InterfaceType
217
+ when "INTERFACE"
221
218
  build_interface_type_node(type)
222
- when GraphQL::ScalarType
219
+ when "SCALAR"
223
220
  build_scalar_type_node(type)
224
- when GraphQL::EnumType
221
+ when "ENUM"
225
222
  build_enum_type_node(type)
226
- when GraphQL::InputObjectType
223
+ when "INPUT_OBJECT"
227
224
  build_input_object_node(type)
228
225
  else
229
226
  raise TypeError
@@ -250,7 +247,7 @@ module GraphQL
250
247
  definitions = []
251
248
  definitions << build_schema_node if include_schema_node?
252
249
  definitions += build_directive_nodes(warden.directives)
253
- definitions += build_type_definition_nodes(warden.types)
250
+ definitions += build_type_definition_nodes(warden.reachable_types)
254
251
  definitions
255
252
  end
256
253
 
@@ -260,7 +257,7 @@ module GraphQL
260
257
  end
261
258
 
262
259
  if !include_built_in_scalars
263
- types = types.reject { |type| type.default_scalar? }
260
+ types = types.reject { |type| type.kind.scalar? && type.default_scalar? }
264
261
  end
265
262
 
266
263
  types
@@ -281,9 +278,37 @@ module GraphQL
281
278
  end
282
279
 
283
280
  def schema_respects_root_name_conventions?(schema)
284
- (schema.query.nil? || schema.query.name == 'Query') &&
285
- (schema.mutation.nil? || schema.mutation.name == 'Mutation') &&
286
- (schema.subscription.nil? || schema.subscription.name == 'Subscription')
281
+ (schema.query.nil? || schema.query.graphql_name == 'Query') &&
282
+ (schema.mutation.nil? || schema.mutation.graphql_name == 'Mutation') &&
283
+ (schema.subscription.nil? || schema.subscription.graphql_name == 'Subscription')
284
+ end
285
+
286
+ def ast_directives(member)
287
+ ast_directives = member.ast_node ? member.ast_node.directives : []
288
+
289
+ # If this schema was built from IDL, it will already have `@deprecated` in `ast_node.directives`
290
+ if member.respond_to?(:deprecation_reason) &&
291
+ (reason = member.deprecation_reason) &&
292
+ ast_directives.none? { |d| d.name == "deprecated" }
293
+
294
+ arguments = []
295
+
296
+ if reason != GraphQL::Schema::Directive::DEFAULT_DEPRECATION_REASON
297
+ arguments << GraphQL::Language::Nodes::Argument.new(
298
+ name: "reason",
299
+ value: reason
300
+ )
301
+ end
302
+
303
+ ast_directives += [
304
+ GraphQL::Language::Nodes::Directive.new(
305
+ name: GraphQL::Directive::DeprecatedDirective.graphql_name,
306
+ arguments: arguments
307
+ )
308
+ ]
309
+ end
310
+
311
+ ast_directives
287
312
  end
288
313
 
289
314
  attr_reader :schema, :warden, :always_include_schema,
@@ -3,6 +3,10 @@
3
3
  module GraphQL
4
4
  module Language
5
5
  module Lexer
6
+ if !String.method_defined?(:match?)
7
+ using GraphQL::StringMatchBackport
8
+ end
9
+
6
10
  def self.tokenize(query_string)
7
11
  run_lexer(query_string)
8
12
  end
@@ -163,7 +167,7 @@ end
163
167
  self.graphql_lexer_en_main = 23;
164
168
 
165
169
  def self.run_lexer(query_string)
166
- data = query_string.unpack("c*")
170
+ data = query_string.unpack(PACK_DIRECTIVE)
167
171
  eof = data.length
168
172
 
169
173
  # Since `Lexer` is a module, store all lexer state
@@ -1421,13 +1425,13 @@ def self.emit_string(ts, te, meta, block:)
1421
1425
  quotes_length = block ? 3 : 1
1422
1426
  value = meta[:data][ts + quotes_length, te - ts - 2 * quotes_length].pack(PACK_DIRECTIVE).force_encoding(UTF_8_ENCODING) || ''
1423
1427
  line_incr = 0
1424
- if block && !value.length.zero?
1428
+ if block && !value.empty?
1425
1429
  line_incr = value.count("\n")
1426
1430
  value = GraphQL::Language::BlockString.trim_whitespace(value)
1427
1431
  end
1428
1432
  # TODO: replace with `String#match?` when we support only Ruby 2.4+
1429
1433
  # (It's faster: https://bugs.ruby-lang.org/issues/8110)
1430
- if !value.valid_encoding? || value !~ VALID_STRING
1434
+ if !value.valid_encoding? || !value.match?(VALID_STRING)
1431
1435
  meta[:tokens] << token = GraphQL::Language::Token.new(
1432
1436
  :BAD_UNICODE_ESCAPE,
1433
1437
  value,
@@ -121,6 +121,10 @@
121
121
  module GraphQL
122
122
  module Language
123
123
  module Lexer
124
+ if !String.method_defined?(:match?)
125
+ using GraphQL::StringMatchBackport
126
+ end
127
+
124
128
  def self.tokenize(query_string)
125
129
  run_lexer(query_string)
126
130
  end
@@ -138,7 +142,7 @@ module GraphQL
138
142
  %% write data;
139
143
 
140
144
  def self.run_lexer(query_string)
141
- data = query_string.unpack("c*")
145
+ data = query_string.unpack(PACK_DIRECTIVE)
142
146
  eof = data.length
143
147
 
144
148
  # Since `Lexer` is a module, store all lexer state
@@ -213,13 +217,13 @@ module GraphQL
213
217
  quotes_length = block ? 3 : 1
214
218
  value = meta[:data][ts + quotes_length, te - ts - 2 * quotes_length].pack(PACK_DIRECTIVE).force_encoding(UTF_8_ENCODING) || ''
215
219
  line_incr = 0
216
- if block && !value.length.zero?
220
+ if block && !value.empty?
217
221
  line_incr = value.count("\n")
218
222
  value = GraphQL::Language::BlockString.trim_whitespace(value)
219
223
  end
220
224
  # TODO: replace with `String#match?` when we support only Ruby 2.4+
221
225
  # (It's faster: https://bugs.ruby-lang.org/issues/8110)
222
- if !value.valid_encoding? || value !~ VALID_STRING
226
+ if !value.valid_encoding? || !value.match?(VALID_STRING)
223
227
  meta[:tokens] << token = GraphQL::Language::Token.new(
224
228
  :BAD_UNICODE_ESCAPE,
225
229
  value,