graphql 1.9.21 → 2.0.0

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 (397) hide show
  1. checksums.yaml +4 -4
  2. data/lib/generators/graphql/core.rb +21 -10
  3. data/lib/generators/graphql/enum_generator.rb +4 -10
  4. data/lib/generators/graphql/field_extractor.rb +31 -0
  5. data/lib/generators/graphql/input_generator.rb +50 -0
  6. data/lib/generators/graphql/install/mutation_root_generator.rb +34 -0
  7. data/lib/generators/graphql/{templates → install/templates}/base_mutation.erb +2 -0
  8. data/lib/generators/graphql/{templates → install/templates}/mutation_type.erb +2 -0
  9. data/lib/generators/graphql/install_generator.rb +44 -7
  10. data/lib/generators/graphql/interface_generator.rb +7 -7
  11. data/lib/generators/graphql/loader_generator.rb +1 -0
  12. data/lib/generators/graphql/mutation_create_generator.rb +22 -0
  13. data/lib/generators/graphql/mutation_delete_generator.rb +22 -0
  14. data/lib/generators/graphql/mutation_generator.rb +6 -30
  15. data/lib/generators/graphql/mutation_update_generator.rb +22 -0
  16. data/lib/generators/graphql/object_generator.rb +28 -12
  17. data/lib/generators/graphql/orm_mutations_base.rb +40 -0
  18. data/lib/generators/graphql/relay.rb +63 -0
  19. data/lib/generators/graphql/relay_generator.rb +21 -0
  20. data/lib/generators/graphql/scalar_generator.rb +4 -2
  21. data/lib/generators/graphql/templates/base_argument.erb +2 -0
  22. data/lib/generators/graphql/templates/base_connection.erb +8 -0
  23. data/lib/generators/graphql/templates/base_edge.erb +8 -0
  24. data/lib/generators/graphql/templates/base_enum.erb +2 -0
  25. data/lib/generators/graphql/templates/base_field.erb +2 -0
  26. data/lib/generators/graphql/templates/base_input_object.erb +2 -0
  27. data/lib/generators/graphql/templates/base_interface.erb +2 -0
  28. data/lib/generators/graphql/templates/base_object.erb +2 -0
  29. data/lib/generators/graphql/templates/base_scalar.erb +2 -0
  30. data/lib/generators/graphql/templates/base_union.erb +2 -0
  31. data/lib/generators/graphql/templates/enum.erb +7 -1
  32. data/lib/generators/graphql/templates/graphql_controller.erb +16 -12
  33. data/lib/generators/graphql/templates/input.erb +9 -0
  34. data/lib/generators/graphql/templates/interface.erb +6 -2
  35. data/lib/generators/graphql/templates/loader.erb +2 -0
  36. data/lib/generators/graphql/templates/mutation.erb +3 -1
  37. data/lib/generators/graphql/templates/mutation_create.erb +20 -0
  38. data/lib/generators/graphql/templates/mutation_delete.erb +20 -0
  39. data/lib/generators/graphql/templates/mutation_update.erb +21 -0
  40. data/lib/generators/graphql/templates/node_type.erb +9 -0
  41. data/lib/generators/graphql/templates/object.erb +7 -3
  42. data/lib/generators/graphql/templates/query_type.erb +3 -3
  43. data/lib/generators/graphql/templates/scalar.erb +5 -1
  44. data/lib/generators/graphql/templates/schema.erb +22 -27
  45. data/lib/generators/graphql/templates/union.erb +6 -2
  46. data/lib/generators/graphql/type_generator.rb +47 -10
  47. data/lib/generators/graphql/union_generator.rb +5 -5
  48. data/lib/graphql/analysis/ast/field_usage.rb +29 -2
  49. data/lib/graphql/analysis/ast/query_complexity.rb +175 -68
  50. data/lib/graphql/analysis/ast/query_depth.rb +0 -1
  51. data/lib/graphql/analysis/ast/visitor.rb +17 -8
  52. data/lib/graphql/analysis/ast.rb +14 -14
  53. data/lib/graphql/analysis.rb +0 -7
  54. data/lib/graphql/backtrace/inspect_result.rb +0 -1
  55. data/lib/graphql/backtrace/table.rb +37 -16
  56. data/lib/graphql/backtrace/traced_error.rb +0 -1
  57. data/lib/graphql/backtrace/tracer.rb +39 -9
  58. data/lib/graphql/backtrace.rb +20 -17
  59. data/lib/graphql/dataloader/null_dataloader.rb +22 -0
  60. data/lib/graphql/dataloader/request.rb +19 -0
  61. data/lib/graphql/dataloader/request_all.rb +19 -0
  62. data/lib/graphql/dataloader/source.rb +155 -0
  63. data/lib/graphql/dataloader.rb +308 -0
  64. data/lib/graphql/date_encoding_error.rb +16 -0
  65. data/lib/graphql/deprecation.rb +9 -0
  66. data/lib/graphql/dig.rb +1 -1
  67. data/lib/graphql/execution/directive_checks.rb +2 -2
  68. data/lib/graphql/execution/errors.rb +108 -14
  69. data/lib/graphql/execution/instrumentation.rb +1 -1
  70. data/lib/graphql/execution/interpreter/argument_value.rb +28 -0
  71. data/lib/graphql/execution/interpreter/arguments.rb +88 -0
  72. data/lib/graphql/execution/interpreter/arguments_cache.rb +105 -0
  73. data/lib/graphql/execution/interpreter/handles_raw_value.rb +18 -0
  74. data/lib/graphql/execution/interpreter/resolve.rb +37 -25
  75. data/lib/graphql/execution/interpreter/runtime.rb +715 -387
  76. data/lib/graphql/execution/interpreter.rb +32 -31
  77. data/lib/graphql/execution/lazy/lazy_method_map.rb +4 -0
  78. data/lib/graphql/execution/lazy.rb +5 -1
  79. data/lib/graphql/execution/lookahead.rb +32 -114
  80. data/lib/graphql/execution/multiplex.rb +60 -92
  81. data/lib/graphql/execution.rb +11 -3
  82. data/lib/graphql/filter.rb +1 -1
  83. data/lib/graphql/integer_decoding_error.rb +17 -0
  84. data/lib/graphql/integer_encoding_error.rb +18 -2
  85. data/lib/graphql/introspection/base_object.rb +2 -5
  86. data/lib/graphql/introspection/directive_location_enum.rb +2 -2
  87. data/lib/graphql/introspection/directive_type.rb +11 -5
  88. data/lib/graphql/introspection/dynamic_fields.rb +3 -8
  89. data/lib/graphql/introspection/entry_points.rb +5 -18
  90. data/lib/graphql/introspection/enum_value_type.rb +2 -2
  91. data/lib/graphql/introspection/field_type.rb +9 -5
  92. data/lib/graphql/introspection/input_value_type.rb +41 -11
  93. data/lib/graphql/introspection/introspection_query.rb +6 -92
  94. data/lib/graphql/introspection/schema_type.rb +10 -10
  95. data/lib/graphql/introspection/type_type.rb +27 -17
  96. data/lib/graphql/introspection.rb +99 -0
  97. data/lib/graphql/invalid_null_error.rb +18 -0
  98. data/lib/graphql/language/block_string.rb +20 -5
  99. data/lib/graphql/language/cache.rb +37 -0
  100. data/lib/graphql/language/definition_slice.rb +21 -10
  101. data/lib/graphql/language/document_from_schema_definition.rb +99 -63
  102. data/lib/graphql/language/lexer.rb +53 -27
  103. data/lib/graphql/language/lexer.rl +5 -3
  104. data/lib/graphql/language/nodes.rb +64 -93
  105. data/lib/graphql/language/parser.rb +929 -896
  106. data/lib/graphql/language/parser.y +125 -102
  107. data/lib/graphql/language/printer.rb +11 -2
  108. data/lib/graphql/language/sanitized_printer.rb +222 -0
  109. data/lib/graphql/language/token.rb +0 -4
  110. data/lib/graphql/language/visitor.rb +2 -2
  111. data/lib/graphql/language.rb +3 -1
  112. data/lib/graphql/name_validator.rb +2 -7
  113. data/lib/graphql/pagination/active_record_relation_connection.rb +85 -0
  114. data/lib/graphql/pagination/array_connection.rb +77 -0
  115. data/lib/graphql/pagination/connection.rb +226 -0
  116. data/lib/graphql/pagination/connections.rb +134 -0
  117. data/lib/graphql/pagination/mongoid_relation_connection.rb +25 -0
  118. data/lib/graphql/pagination/relation_connection.rb +226 -0
  119. data/lib/graphql/pagination/sequel_dataset_connection.rb +28 -0
  120. data/lib/graphql/pagination.rb +6 -0
  121. data/lib/graphql/parse_error.rb +0 -1
  122. data/lib/graphql/query/context.rb +51 -190
  123. data/lib/graphql/query/fingerprint.rb +26 -0
  124. data/lib/graphql/query/input_validation_result.rb +23 -6
  125. data/lib/graphql/query/literal_input.rb +26 -11
  126. data/lib/graphql/query/null_context.rb +24 -8
  127. data/lib/graphql/query/validation_pipeline.rb +12 -38
  128. data/lib/graphql/query/variable_validation_error.rb +2 -2
  129. data/lib/graphql/query/variables.rb +26 -9
  130. data/lib/graphql/query.rb +62 -32
  131. data/lib/graphql/railtie.rb +6 -102
  132. data/lib/graphql/rake_task/validate.rb +3 -0
  133. data/lib/graphql/rake_task.rb +12 -9
  134. data/lib/graphql/relay/range_add.rb +23 -9
  135. data/lib/graphql/relay.rb +0 -15
  136. data/lib/graphql/rubocop/graphql/base_cop.rb +36 -0
  137. data/lib/graphql/rubocop/graphql/default_null_true.rb +43 -0
  138. data/lib/graphql/rubocop/graphql/default_required_true.rb +43 -0
  139. data/lib/graphql/rubocop.rb +4 -0
  140. data/lib/graphql/schema/addition.rb +240 -0
  141. data/lib/graphql/schema/argument.rb +262 -28
  142. data/lib/graphql/schema/base_64_encoder.rb +2 -0
  143. data/lib/graphql/schema/build_from_definition/resolve_map/default_resolve.rb +1 -1
  144. data/lib/graphql/schema/build_from_definition/resolve_map.rb +13 -5
  145. data/lib/graphql/schema/build_from_definition.rb +319 -220
  146. data/lib/graphql/schema/built_in_types.rb +5 -5
  147. data/lib/graphql/schema/directive/deprecated.rb +18 -0
  148. data/lib/graphql/schema/directive/feature.rb +1 -1
  149. data/lib/graphql/schema/directive/flagged.rb +57 -0
  150. data/lib/graphql/schema/directive/include.rb +2 -2
  151. data/lib/graphql/schema/directive/skip.rb +2 -2
  152. data/lib/graphql/schema/directive/transform.rb +14 -2
  153. data/lib/graphql/schema/directive.rb +117 -14
  154. data/lib/graphql/schema/enum.rb +115 -22
  155. data/lib/graphql/schema/enum_value.rb +16 -21
  156. data/lib/graphql/schema/field/connection_extension.rb +46 -20
  157. data/lib/graphql/schema/field/scope_extension.rb +1 -1
  158. data/lib/graphql/schema/field.rb +376 -291
  159. data/lib/graphql/schema/field_extension.rb +89 -2
  160. data/lib/graphql/schema/find_inherited_value.rb +17 -1
  161. data/lib/graphql/schema/finder.rb +16 -14
  162. data/lib/graphql/schema/input_object.rb +147 -60
  163. data/lib/graphql/schema/interface.rb +28 -43
  164. data/lib/graphql/schema/introspection_system.rb +101 -38
  165. data/lib/graphql/schema/late_bound_type.rb +3 -2
  166. data/lib/graphql/schema/list.rb +46 -3
  167. data/lib/graphql/schema/loader.rb +144 -102
  168. data/lib/graphql/schema/member/base_dsl_methods.rb +33 -32
  169. data/lib/graphql/schema/member/build_type.rb +23 -14
  170. data/lib/graphql/schema/member/has_arguments.rb +212 -23
  171. data/lib/graphql/schema/member/has_ast_node.rb +20 -0
  172. data/lib/graphql/schema/member/has_deprecation_reason.rb +25 -0
  173. data/lib/graphql/schema/member/has_directives.rb +98 -0
  174. data/lib/graphql/schema/member/has_fields.rb +99 -34
  175. data/lib/graphql/schema/member/has_interfaces.rb +88 -0
  176. data/lib/graphql/schema/member/has_unresolved_type_error.rb +15 -0
  177. data/lib/graphql/schema/member/has_validators.rb +31 -0
  178. data/lib/graphql/schema/member/type_system_helpers.rb +3 -3
  179. data/lib/graphql/schema/member/validates_input.rb +33 -0
  180. data/lib/graphql/schema/member.rb +11 -6
  181. data/lib/graphql/schema/mutation.rb +4 -9
  182. data/lib/graphql/schema/non_null.rb +34 -4
  183. data/lib/graphql/schema/object.rb +38 -65
  184. data/lib/graphql/schema/printer.rb +16 -35
  185. data/lib/graphql/schema/relay_classic_mutation.rb +57 -32
  186. data/lib/graphql/schema/resolver/has_payload_type.rb +34 -4
  187. data/lib/graphql/schema/resolver.rb +133 -79
  188. data/lib/graphql/schema/scalar.rb +40 -15
  189. data/lib/graphql/schema/subscription.rb +57 -21
  190. data/lib/graphql/schema/timeout.rb +29 -15
  191. data/lib/graphql/schema/type_expression.rb +21 -13
  192. data/lib/graphql/schema/type_membership.rb +19 -5
  193. data/lib/graphql/schema/union.rb +39 -14
  194. data/lib/graphql/schema/unique_within_type.rb +1 -2
  195. data/lib/graphql/schema/validator/allow_blank_validator.rb +29 -0
  196. data/lib/graphql/schema/validator/allow_null_validator.rb +26 -0
  197. data/lib/graphql/schema/validator/exclusion_validator.rb +33 -0
  198. data/lib/graphql/schema/validator/format_validator.rb +48 -0
  199. data/lib/graphql/schema/validator/inclusion_validator.rb +35 -0
  200. data/lib/graphql/schema/validator/length_validator.rb +59 -0
  201. data/lib/graphql/schema/validator/numericality_validator.rb +82 -0
  202. data/lib/graphql/schema/validator/required_validator.rb +82 -0
  203. data/lib/graphql/schema/validator.rb +171 -0
  204. data/lib/graphql/schema/warden.rb +182 -32
  205. data/lib/graphql/schema/wrapper.rb +0 -5
  206. data/lib/graphql/schema.rb +687 -891
  207. data/lib/graphql/static_validation/all_rules.rb +2 -0
  208. data/lib/graphql/static_validation/base_visitor.rb +21 -31
  209. data/lib/graphql/static_validation/definition_dependencies.rb +0 -1
  210. data/lib/graphql/static_validation/error.rb +3 -1
  211. data/lib/graphql/static_validation/literal_validator.rb +51 -26
  212. data/lib/graphql/static_validation/rules/argument_literals_are_compatible.rb +45 -83
  213. data/lib/graphql/static_validation/rules/argument_literals_are_compatible_error.rb +22 -6
  214. data/lib/graphql/static_validation/rules/arguments_are_defined.rb +35 -26
  215. data/lib/graphql/static_validation/rules/arguments_are_defined_error.rb +4 -2
  216. data/lib/graphql/static_validation/rules/directives_are_defined.rb +1 -1
  217. data/lib/graphql/static_validation/rules/directives_are_in_valid_locations.rb +14 -14
  218. data/lib/graphql/static_validation/rules/fields_are_defined_on_type.rb +4 -4
  219. data/lib/graphql/static_validation/rules/fields_have_appropriate_selections.rb +5 -5
  220. data/lib/graphql/static_validation/rules/fields_will_merge.rb +94 -51
  221. data/lib/graphql/static_validation/rules/fields_will_merge_error.rb +25 -4
  222. data/lib/graphql/static_validation/rules/fragment_spreads_are_possible.rb +3 -3
  223. data/lib/graphql/static_validation/rules/fragments_are_finite.rb +2 -2
  224. data/lib/graphql/static_validation/rules/input_object_names_are_unique.rb +30 -0
  225. data/lib/graphql/static_validation/rules/input_object_names_are_unique_error.rb +30 -0
  226. data/lib/graphql/static_validation/rules/query_root_exists.rb +17 -0
  227. data/lib/graphql/static_validation/rules/query_root_exists_error.rb +26 -0
  228. data/lib/graphql/static_validation/rules/required_arguments_are_present.rb +4 -2
  229. data/lib/graphql/static_validation/rules/required_input_object_attributes_are_present.rb +9 -10
  230. data/lib/graphql/static_validation/rules/unique_directives_per_location.rb +1 -1
  231. data/lib/graphql/static_validation/rules/variable_default_values_are_correctly_typed.rb +12 -13
  232. data/lib/graphql/static_validation/rules/variable_usages_are_allowed.rb +19 -14
  233. data/lib/graphql/static_validation/rules/variables_are_input_types.rb +1 -1
  234. data/lib/graphql/static_validation/rules/variables_are_used_and_defined.rb +5 -3
  235. data/lib/graphql/static_validation/type_stack.rb +2 -2
  236. data/lib/graphql/static_validation/validation_context.rb +13 -3
  237. data/lib/graphql/static_validation/validation_timeout_error.rb +25 -0
  238. data/lib/graphql/static_validation/validator.rb +31 -19
  239. data/lib/graphql/static_validation.rb +1 -2
  240. data/lib/graphql/string_encoding_error.rb +13 -3
  241. data/lib/graphql/subscriptions/action_cable_subscriptions.rb +123 -22
  242. data/lib/graphql/subscriptions/broadcast_analyzer.rb +81 -0
  243. data/lib/graphql/subscriptions/default_subscription_resolve_extension.rb +58 -0
  244. data/lib/graphql/subscriptions/event.rb +85 -31
  245. data/lib/graphql/subscriptions/instrumentation.rb +0 -47
  246. data/lib/graphql/subscriptions/serialize.rb +53 -6
  247. data/lib/graphql/subscriptions.rb +111 -52
  248. data/lib/graphql/tracing/active_support_notifications_tracing.rb +8 -17
  249. data/lib/graphql/tracing/appoptics_tracing.rb +173 -0
  250. data/lib/graphql/tracing/appsignal_tracing.rb +23 -0
  251. data/lib/graphql/tracing/data_dog_tracing.rb +14 -1
  252. data/lib/graphql/tracing/new_relic_tracing.rb +9 -12
  253. data/lib/graphql/tracing/notifications_tracing.rb +59 -0
  254. data/lib/graphql/tracing/platform_tracing.rb +57 -29
  255. data/lib/graphql/tracing/prometheus_tracing/graphql_collector.rb +4 -1
  256. data/lib/graphql/tracing/prometheus_tracing.rb +8 -0
  257. data/lib/graphql/tracing/scout_tracing.rb +19 -0
  258. data/lib/graphql/tracing/statsd_tracing.rb +42 -0
  259. data/lib/graphql/tracing.rb +15 -36
  260. data/lib/graphql/types/big_int.rb +5 -1
  261. data/lib/graphql/types/int.rb +10 -3
  262. data/lib/graphql/types/iso_8601_date.rb +16 -8
  263. data/lib/graphql/types/iso_8601_date_time.rb +32 -10
  264. data/lib/graphql/types/relay/base_connection.rb +6 -88
  265. data/lib/graphql/types/relay/base_edge.rb +2 -34
  266. data/lib/graphql/types/relay/connection_behaviors.rb +170 -0
  267. data/lib/graphql/types/relay/default_relay.rb +21 -0
  268. data/lib/graphql/types/relay/edge_behaviors.rb +64 -0
  269. data/lib/graphql/types/relay/has_node_field.rb +41 -0
  270. data/lib/graphql/types/relay/has_nodes_field.rb +41 -0
  271. data/lib/graphql/types/relay/node.rb +2 -4
  272. data/lib/graphql/types/relay/node_behaviors.rb +19 -0
  273. data/lib/graphql/types/relay/page_info.rb +2 -14
  274. data/lib/graphql/types/relay/page_info_behaviors.rb +25 -0
  275. data/lib/graphql/types/relay.rb +11 -5
  276. data/lib/graphql/types/string.rb +8 -2
  277. data/lib/graphql/unauthorized_error.rb +2 -2
  278. data/lib/graphql/unresolved_type_error.rb +2 -2
  279. data/lib/graphql/version.rb +1 -1
  280. data/lib/graphql.rb +41 -58
  281. data/readme.md +3 -6
  282. metadata +97 -231
  283. data/lib/graphql/analysis/analyze_query.rb +0 -91
  284. data/lib/graphql/analysis/field_usage.rb +0 -45
  285. data/lib/graphql/analysis/max_query_complexity.rb +0 -26
  286. data/lib/graphql/analysis/max_query_depth.rb +0 -26
  287. data/lib/graphql/analysis/query_complexity.rb +0 -88
  288. data/lib/graphql/analysis/query_depth.rb +0 -43
  289. data/lib/graphql/analysis/reducer_state.rb +0 -48
  290. data/lib/graphql/argument.rb +0 -159
  291. data/lib/graphql/authorization.rb +0 -82
  292. data/lib/graphql/backwards_compatibility.rb +0 -60
  293. data/lib/graphql/base_type.rb +0 -226
  294. data/lib/graphql/boolean_type.rb +0 -2
  295. data/lib/graphql/compatibility/execution_specification/counter_schema.rb +0 -53
  296. data/lib/graphql/compatibility/execution_specification/specification_schema.rb +0 -200
  297. data/lib/graphql/compatibility/execution_specification.rb +0 -435
  298. data/lib/graphql/compatibility/lazy_execution_specification/lazy_schema.rb +0 -111
  299. data/lib/graphql/compatibility/lazy_execution_specification.rb +0 -213
  300. data/lib/graphql/compatibility/query_parser_specification/parse_error_specification.rb +0 -91
  301. data/lib/graphql/compatibility/query_parser_specification/query_assertions.rb +0 -79
  302. data/lib/graphql/compatibility/query_parser_specification.rb +0 -264
  303. data/lib/graphql/compatibility/schema_parser_specification.rb +0 -680
  304. data/lib/graphql/compatibility.rb +0 -5
  305. data/lib/graphql/define/assign_argument.rb +0 -12
  306. data/lib/graphql/define/assign_connection.rb +0 -13
  307. data/lib/graphql/define/assign_enum_value.rb +0 -18
  308. data/lib/graphql/define/assign_global_id_field.rb +0 -11
  309. data/lib/graphql/define/assign_mutation_function.rb +0 -34
  310. data/lib/graphql/define/assign_object_field.rb +0 -42
  311. data/lib/graphql/define/defined_object_proxy.rb +0 -53
  312. data/lib/graphql/define/instance_definable.rb +0 -311
  313. data/lib/graphql/define/no_definition_error.rb +0 -7
  314. data/lib/graphql/define/non_null_with_bang.rb +0 -16
  315. data/lib/graphql/define/type_definer.rb +0 -31
  316. data/lib/graphql/define.rb +0 -31
  317. data/lib/graphql/deprecated_dsl.rb +0 -42
  318. data/lib/graphql/directive/deprecated_directive.rb +0 -13
  319. data/lib/graphql/directive/include_directive.rb +0 -2
  320. data/lib/graphql/directive/skip_directive.rb +0 -2
  321. data/lib/graphql/directive.rb +0 -104
  322. data/lib/graphql/enum_type.rb +0 -193
  323. data/lib/graphql/execution/execute.rb +0 -326
  324. data/lib/graphql/execution/flatten.rb +0 -40
  325. data/lib/graphql/execution/interpreter/hash_response.rb +0 -46
  326. data/lib/graphql/execution/typecast.rb +0 -50
  327. data/lib/graphql/field/resolve.rb +0 -59
  328. data/lib/graphql/field.rb +0 -330
  329. data/lib/graphql/float_type.rb +0 -2
  330. data/lib/graphql/function.rb +0 -153
  331. data/lib/graphql/id_type.rb +0 -2
  332. data/lib/graphql/input_object_type.rb +0 -154
  333. data/lib/graphql/int_type.rb +0 -2
  334. data/lib/graphql/interface_type.rb +0 -86
  335. data/lib/graphql/internal_representation/document.rb +0 -27
  336. data/lib/graphql/internal_representation/node.rb +0 -206
  337. data/lib/graphql/internal_representation/print.rb +0 -51
  338. data/lib/graphql/internal_representation/rewrite.rb +0 -184
  339. data/lib/graphql/internal_representation/scope.rb +0 -88
  340. data/lib/graphql/internal_representation/visit.rb +0 -36
  341. data/lib/graphql/internal_representation.rb +0 -7
  342. data/lib/graphql/list_type.rb +0 -80
  343. data/lib/graphql/literal_validation_error.rb +0 -6
  344. data/lib/graphql/non_null_type.rb +0 -81
  345. data/lib/graphql/object_type.rb +0 -141
  346. data/lib/graphql/query/arguments.rb +0 -187
  347. data/lib/graphql/query/arguments_cache.rb +0 -25
  348. data/lib/graphql/query/executor.rb +0 -53
  349. data/lib/graphql/query/serial_execution/field_resolution.rb +0 -92
  350. data/lib/graphql/query/serial_execution/operation_resolution.rb +0 -19
  351. data/lib/graphql/query/serial_execution/selection_resolution.rb +0 -23
  352. data/lib/graphql/query/serial_execution/value_resolution.rb +0 -87
  353. data/lib/graphql/query/serial_execution.rb +0 -39
  354. data/lib/graphql/relay/array_connection.rb +0 -85
  355. data/lib/graphql/relay/base_connection.rb +0 -172
  356. data/lib/graphql/relay/connection_instrumentation.rb +0 -54
  357. data/lib/graphql/relay/connection_resolve.rb +0 -43
  358. data/lib/graphql/relay/connection_type.rb +0 -40
  359. data/lib/graphql/relay/edge.rb +0 -27
  360. data/lib/graphql/relay/edge_type.rb +0 -18
  361. data/lib/graphql/relay/edges_instrumentation.rb +0 -40
  362. data/lib/graphql/relay/global_id_resolve.rb +0 -18
  363. data/lib/graphql/relay/mongo_relation_connection.rb +0 -50
  364. data/lib/graphql/relay/mutation/instrumentation.rb +0 -23
  365. data/lib/graphql/relay/mutation/resolve.rb +0 -56
  366. data/lib/graphql/relay/mutation/result.rb +0 -38
  367. data/lib/graphql/relay/mutation.rb +0 -190
  368. data/lib/graphql/relay/node.rb +0 -36
  369. data/lib/graphql/relay/page_info.rb +0 -7
  370. data/lib/graphql/relay/relation_connection.rb +0 -190
  371. data/lib/graphql/relay/type_extensions.rb +0 -30
  372. data/lib/graphql/scalar_type.rb +0 -133
  373. data/lib/graphql/schema/catchall_middleware.rb +0 -35
  374. data/lib/graphql/schema/default_parse_error.rb +0 -10
  375. data/lib/graphql/schema/default_type_error.rb +0 -15
  376. data/lib/graphql/schema/member/accepts_definition.rb +0 -152
  377. data/lib/graphql/schema/member/cached_graphql_definition.rb +0 -26
  378. data/lib/graphql/schema/member/instrumentation.rb +0 -132
  379. data/lib/graphql/schema/middleware_chain.rb +0 -82
  380. data/lib/graphql/schema/possible_types.rb +0 -39
  381. data/lib/graphql/schema/rescue_middleware.rb +0 -60
  382. data/lib/graphql/schema/timeout_middleware.rb +0 -86
  383. data/lib/graphql/schema/traversal.rb +0 -228
  384. data/lib/graphql/schema/validation.rb +0 -303
  385. data/lib/graphql/static_validation/default_visitor.rb +0 -15
  386. data/lib/graphql/static_validation/no_validate_visitor.rb +0 -10
  387. data/lib/graphql/string_type.rb +0 -2
  388. data/lib/graphql/subscriptions/subscription_root.rb +0 -74
  389. data/lib/graphql/tracing/skylight_tracing.rb +0 -62
  390. data/lib/graphql/types/relay/base_field.rb +0 -22
  391. data/lib/graphql/types/relay/base_interface.rb +0 -29
  392. data/lib/graphql/types/relay/base_object.rb +0 -26
  393. data/lib/graphql/types/relay/node_field.rb +0 -43
  394. data/lib/graphql/types/relay/nodes_field.rb +0 -45
  395. data/lib/graphql/union_type.rb +0 -135
  396. data/lib/graphql/upgrader/member.rb +0 -936
  397. data/lib/graphql/upgrader/schema.rb +0 -37
@@ -2,47 +2,46 @@
2
2
  module GraphQL
3
3
  class Schema
4
4
  class IntrospectionSystem
5
- attr_reader :schema_type, :type_type, :typename_field
5
+ attr_reader :types, :possible_types
6
6
 
7
7
  def initialize(schema)
8
8
  @schema = schema
9
+ @class_based = !!@schema.is_a?(Class)
9
10
  @built_in_namespace = GraphQL::Introspection
10
- @custom_namespace = schema.introspection_namespace || @built_in_namespace
11
-
12
- # Use to-graphql to avoid sharing with any previous instantiations
13
- @schema_type = load_constant(:SchemaType).to_graphql
14
- @type_type = load_constant(:TypeType).to_graphql
15
- @field_type = load_constant(:FieldType).to_graphql
16
- @directive_type = load_constant(:DirectiveType).to_graphql
17
- @enum_value_type = load_constant(:EnumValueType).to_graphql
18
- @input_value_type = load_constant(:InputValueType).to_graphql
19
- @type_kind_enum = load_constant(:TypeKindEnum).to_graphql
20
- @directive_location_enum = load_constant(:DirectiveLocationEnum).to_graphql
11
+ @custom_namespace = if @class_based
12
+ schema.introspection || @built_in_namespace
13
+ else
14
+ schema.introspection_namespace || @built_in_namespace
15
+ end
16
+
17
+ type_defns = [
18
+ load_constant(:SchemaType),
19
+ load_constant(:TypeType),
20
+ load_constant(:FieldType),
21
+ load_constant(:DirectiveType),
22
+ load_constant(:EnumValueType),
23
+ load_constant(:InputValueType),
24
+ load_constant(:TypeKindEnum),
25
+ load_constant(:DirectiveLocationEnum)
26
+ ]
27
+ @types = {}
28
+ @possible_types = {}
29
+ type_defns.each do |t|
30
+ @types[t.graphql_name] = t
31
+ @possible_types[t.graphql_name] = [t]
32
+ end
21
33
  @entry_point_fields =
22
- if schema.disable_introspection_entry_points
34
+ if schema.disable_introspection_entry_points?
23
35
  {}
24
36
  else
25
37
  entry_point_fields = get_fields_from_class(class_sym: :EntryPoints)
26
- entry_point_fields.delete('__schema') if schema.disable_schema_introspection_entry_point
27
- entry_point_fields.delete('__type') if schema.disable_type_introspection_entry_point
38
+ entry_point_fields.delete('__schema') if schema.disable_schema_introspection_entry_point?
39
+ entry_point_fields.delete('__type') if schema.disable_type_introspection_entry_point?
28
40
  entry_point_fields
29
41
  end
30
42
  @dynamic_fields = get_fields_from_class(class_sym: :DynamicFields)
31
43
  end
32
44
 
33
- def object_types
34
- [
35
- @schema_type,
36
- @type_type,
37
- @field_type,
38
- @directive_type,
39
- @enum_value_type,
40
- @input_value_type,
41
- @type_kind_enum,
42
- @directive_location_enum,
43
- ]
44
- end
45
-
46
45
  def entry_points
47
46
  @entry_point_fields.values
48
47
  end
@@ -59,25 +58,89 @@ module GraphQL
59
58
  @dynamic_fields[name]
60
59
  end
61
60
 
61
+ # The introspection system is prepared with a bunch of LateBoundTypes.
62
+ # Replace those with the objects that they refer to, since LateBoundTypes
63
+ # aren't handled at runtime.
64
+ #
65
+ # @api private
66
+ # @return void
67
+ def resolve_late_bindings
68
+ @types.each do |name, t|
69
+ if t.kind.fields?
70
+ t.fields.each do |_name, field_defn|
71
+ field_defn.type = resolve_late_binding(field_defn.type)
72
+ end
73
+ end
74
+ end
75
+
76
+ @entry_point_fields.each do |name, f|
77
+ f.type = resolve_late_binding(f.type)
78
+ end
79
+
80
+ @dynamic_fields.each do |name, f|
81
+ f.type = resolve_late_binding(f.type)
82
+ end
83
+ nil
84
+ end
85
+
62
86
  private
63
87
 
88
+ def resolve_late_binding(late_bound_type)
89
+ case late_bound_type
90
+ when GraphQL::Schema::LateBoundType
91
+ @schema.get_type(late_bound_type.name)
92
+ when GraphQL::Schema::List
93
+ resolve_late_binding(late_bound_type.of_type).to_list_type
94
+ when GraphQL::Schema::NonNull
95
+ resolve_late_binding(late_bound_type.of_type).to_non_null_type
96
+ when Module
97
+ # It's a normal type -- no change required
98
+ late_bound_type
99
+ else
100
+ raise "Invariant: unexpected type: #{late_bound_type} (#{late_bound_type.class})"
101
+ end
102
+ end
103
+
64
104
  def load_constant(class_name)
65
- @custom_namespace.const_get(class_name)
105
+ const = @custom_namespace.const_get(class_name)
106
+ dup_type_class(const)
66
107
  rescue NameError
67
108
  # Dup the built-in so that the cached fields aren't shared
68
- @built_in_namespace.const_get(class_name)
109
+ dup_type_class(@built_in_namespace.const_get(class_name))
69
110
  end
70
111
 
71
112
  def get_fields_from_class(class_sym:)
72
- object_class = load_constant(class_sym)
73
- object_type_defn = object_class.to_graphql
74
- extracted_field_defns = {}
75
- object_type_defn.all_fields.each do |field_defn|
76
- inner_resolve = field_defn.resolve_proc
77
- resolve_with_instantiate = PerFieldProxyResolve.new(object_class: object_class, inner_resolve: inner_resolve)
78
- extracted_field_defns[field_defn.name] = field_defn.redefine(resolve: resolve_with_instantiate)
113
+ object_type_defn = load_constant(class_sym)
114
+
115
+ if object_type_defn.is_a?(Module)
116
+ object_type_defn.fields
117
+ else
118
+ extracted_field_defns = {}
119
+ object_class = object_type_defn.metadata[:type_class]
120
+ object_type_defn.all_fields.each do |field_defn|
121
+ inner_resolve = field_defn.resolve_proc
122
+ resolve_with_instantiate = PerFieldProxyResolve.new(object_class: object_class, inner_resolve: inner_resolve)
123
+ extracted_field_defns[field_defn.name] = field_defn.redefine(resolve: resolve_with_instantiate)
124
+ end
125
+ extracted_field_defns
126
+ end
127
+ end
128
+
129
+ # This is probably not 100% robust -- but it has to be good enough to avoid modifying the built-in introspection types
130
+ def dup_type_class(type_class)
131
+ type_name = type_class.graphql_name
132
+ Class.new(type_class) do
133
+ # This won't be inherited like other things will
134
+ graphql_name(type_name)
135
+
136
+ if type_class.kind.fields?
137
+ type_class.fields.each do |_name, field_defn|
138
+ dup_field = field_defn.dup
139
+ dup_field.owner = self
140
+ add_field(dup_field)
141
+ end
142
+ end
79
143
  end
80
- extracted_field_defns
81
144
  end
82
145
 
83
146
  class PerFieldProxyResolve
@@ -6,6 +6,7 @@ module GraphQL
6
6
  # @api Private
7
7
  class LateBoundType
8
8
  attr_reader :name
9
+ alias :graphql_name :name
9
10
  def initialize(local_name)
10
11
  @name = local_name
11
12
  end
@@ -15,11 +16,11 @@ module GraphQL
15
16
  end
16
17
 
17
18
  def to_non_null_type
18
- GraphQL::NonNullType.new(of_type: self)
19
+ @to_non_null_type ||= GraphQL::Schema::NonNull.new(self)
19
20
  end
20
21
 
21
22
  def to_list_type
22
- GraphQL::ListType.new(of_type: self)
23
+ @to_list_type ||= GraphQL::Schema::List.new(self)
23
24
  end
24
25
 
25
26
  def inspect
@@ -6,9 +6,7 @@ module GraphQL
6
6
  # Wraps a {Schema::Member} as a list type.
7
7
  # @see {Schema::Member::TypeSystemHelpers#to_list_type}
8
8
  class List < GraphQL::Schema::Wrapper
9
- def to_graphql
10
- @of_type.graphql_definition.to_list_type
11
- end
9
+ include Schema::Member::ValidatesInput
12
10
 
13
11
  # @return [GraphQL::TypeKinds::LIST]
14
12
  def kind
@@ -23,6 +21,51 @@ module GraphQL
23
21
  def to_type_signature
24
22
  "[#{@of_type.to_type_signature}]"
25
23
  end
24
+
25
+ # This is for introspection, where it's expected the name will be `null`
26
+ def graphql_name
27
+ nil
28
+ end
29
+
30
+ # Also for implementing introspection
31
+ def description
32
+ nil
33
+ end
34
+
35
+ def coerce_result(value, ctx)
36
+ value.map { |i| i.nil? ? nil : of_type.coerce_result(i, ctx) }
37
+ end
38
+
39
+ def coerce_input(value, ctx)
40
+ if value.nil?
41
+ nil
42
+ else
43
+ coerced = ensure_array(value).map { |item| item.nil? ? item : of_type.coerce_input(item, ctx) }
44
+ ctx.schema.after_any_lazies(coerced, &:itself)
45
+ end
46
+ end
47
+
48
+ def validate_non_null_input(value, ctx)
49
+ result = GraphQL::Query::InputValidationResult.new
50
+ ensure_array(value).each_with_index do |item, index|
51
+ item_result = of_type.validate_input(item, ctx)
52
+ if !item_result.valid?
53
+ result.merge_result!(index, item_result)
54
+ end
55
+ end
56
+ result
57
+ end
58
+
59
+ private
60
+
61
+ def ensure_array(value)
62
+ # `Array({ a: 1 })` makes `[[:a, 1]]`, so do it manually
63
+ if value.is_a?(Array)
64
+ value
65
+ else
66
+ [value]
67
+ end
68
+ end
26
69
  end
27
70
  end
28
71
  end
@@ -5,37 +5,50 @@ module GraphQL
5
5
  # to make a schema. This schema is missing some important details like
6
6
  # `resolve` functions, but it does include the full type system,
7
7
  # so you can use it to validate queries.
8
+ #
9
+ # @see GraphQL::Schema.from_introspection for a public API
8
10
  module Loader
9
11
  extend self
10
12
 
11
13
  # Create schema with the result of an introspection query.
12
14
  # @param introspection_result [Hash] A response from {GraphQL::Introspection::INTROSPECTION_QUERY}
13
- # @return [GraphQL::Schema] the schema described by `input`
14
- # @deprecated Use {GraphQL::Schema.from_introspection} instead
15
+ # @return [Class] the schema described by `input`
15
16
  def load(introspection_result)
16
17
  schema = introspection_result.fetch("data").fetch("__schema")
17
18
 
18
19
  types = {}
19
- type_resolver = ->(type) { -> { resolve_type(types, type) } }
20
+ type_resolver = ->(type) { resolve_type(types, type) }
20
21
 
21
22
  schema.fetch("types").each do |type|
22
23
  next if type.fetch("name").start_with?("__")
23
24
  type_object = define_type(type, type_resolver)
24
- types[type_object.name] = type_object
25
+ types[type["name"]] = type_object
25
26
  end
26
27
 
27
- kargs = { orphan_types: types.values, resolve_type: NullResolveType }
28
- [:query, :mutation, :subscription].each do |root|
29
- type = schema["#{root}Type"]
30
- kargs[root] = types.fetch(type.fetch("name")) if type
28
+ directives = []
29
+ schema.fetch("directives", []).each do |directive|
30
+ next if GraphQL::Schema.default_directives.include?(directive.fetch("name"))
31
+ directives << define_directive(directive, type_resolver)
31
32
  end
32
33
 
33
- Schema.define(**kargs, raise_definition_error: true)
34
- end
34
+ Class.new(GraphQL::Schema) do
35
+ orphan_types(types.values)
36
+ directives(directives)
37
+ description(schema["description"])
38
+
39
+ def self.resolve_type(*)
40
+ raise(GraphQL::RequiredImplementationMissingError, "This schema was loaded from string, so it can't resolve types for objects")
41
+ end
35
42
 
36
- NullResolveType = ->(type, obj, ctx) {
37
- raise(GraphQL::RequiredImplementationMissingError, "This schema was loaded from string, so it can't resolve types for objects")
38
- }
43
+ [:query, :mutation, :subscription].each do |root|
44
+ type = schema["#{root}Type"]
45
+ if type
46
+ type_defn = types.fetch(type.fetch("name"))
47
+ self.public_send(root, type_defn)
48
+ end
49
+ end
50
+ end
51
+ end
39
52
 
40
53
  NullScalarCoerce = ->(val, _ctx) { val }
41
54
 
@@ -45,11 +58,17 @@ module GraphQL
45
58
  def resolve_type(types, type)
46
59
  case kind = type.fetch("kind")
47
60
  when "ENUM", "INTERFACE", "INPUT_OBJECT", "OBJECT", "SCALAR", "UNION"
48
- types.fetch(type.fetch("name"))
61
+ type_name = type.fetch("name")
62
+ type = types[type_name] || Schema::BUILT_IN_TYPES[type_name]
63
+ if type.nil?
64
+ GraphQL::Schema::LateBoundType.new(type_name)
65
+ else
66
+ type
67
+ end
49
68
  when "LIST"
50
- ListType.new(of_type: resolve_type(types, type.fetch("ofType")))
69
+ Schema::List.new(resolve_type(types, type.fetch("ofType")))
51
70
  when "NON_NULL"
52
- NonNullType.new(of_type: resolve_type(types, type.fetch("ofType")))
71
+ Schema::NonNull.new(resolve_type(types, type.fetch("ofType")))
53
72
  else
54
73
  fail GraphQL::RequiredImplementationMissingError, "#{kind} not implemented"
55
74
  end
@@ -77,109 +96,132 @@ module GraphQL
77
96
  end
78
97
 
79
98
  def define_type(type, type_resolver)
99
+ loader = self
80
100
  case type.fetch("kind")
81
101
  when "ENUM"
82
- EnumType.define(
83
- name: type["name"],
84
- description: type["description"],
85
- values: type["enumValues"].map { |enum|
86
- EnumType::EnumValue.define(
87
- name: enum["name"],
88
- description: enum["description"],
89
- deprecation_reason: enum["deprecationReason"],
90
- value: enum["name"]
102
+ Class.new(GraphQL::Schema::Enum) do
103
+ graphql_name(type["name"])
104
+ description(type["description"])
105
+ type["enumValues"].each do |enum_value|
106
+ value(
107
+ enum_value["name"],
108
+ description: enum_value["description"],
109
+ deprecation_reason: enum_value["deprecationReason"],
91
110
  )
92
- })
111
+ end
112
+ end
93
113
  when "INTERFACE"
94
- InterfaceType.define(
95
- name: type["name"],
96
- description: type["description"],
97
- fields: Hash[(type["fields"] || []).map { |field|
98
- [field["name"], define_type(field.merge("kind" => "FIELD"), type_resolver)]
99
- }]
100
- )
114
+ Module.new do
115
+ include GraphQL::Schema::Interface
116
+ graphql_name(type["name"])
117
+ description(type["description"])
118
+ loader.build_fields(self, type["fields"] || [], type_resolver)
119
+ end
101
120
  when "INPUT_OBJECT"
102
- InputObjectType.define(
103
- name: type["name"],
104
- description: type["description"],
105
- arguments: Hash[type["inputFields"].map { |arg|
106
- [arg["name"], define_type(arg.merge("kind" => "ARGUMENT"), type_resolver)]
107
- }]
108
- )
109
- when "OBJECT"
110
- ObjectType.define(
111
- name: type["name"],
112
- description: type["description"],
113
- interfaces: (type["interfaces"] || []).map { |interface|
114
- type_resolver.call(interface)
115
- },
116
- fields: Hash[type["fields"].map { |field|
117
- [field["name"], define_type(field.merge("kind" => "FIELD"), type_resolver)]
118
- }]
119
- )
120
- when "FIELD"
121
- defns = {
122
- name: type["name"],
123
- type: type_resolver.call(type["type"]),
124
- description: type["description"],
125
- }
126
-
127
- # Avoid passing an empty hash, which warns on Ruby 2.7
128
- if type["args"].any?
129
- defns[:arguments] = Hash[type["args"].map { |arg|
130
- [arg["name"], define_type(arg.merge("kind" => "ARGUMENT"), type_resolver)]
131
- }]
121
+ Class.new(GraphQL::Schema::InputObject) do
122
+ graphql_name(type["name"])
123
+ description(type["description"])
124
+ loader.build_arguments(self, type["inputFields"], type_resolver)
132
125
  end
133
-
134
- GraphQL::Field.define(**defns)
135
- when "ARGUMENT"
136
- kwargs = {}
137
- if type["defaultValue"]
138
- kwargs[:default_value] = begin
139
- default_value_str = type["defaultValue"]
140
-
141
- dummy_query_str = "query getStuff($var: InputObj = #{default_value_str}) { __typename }"
142
-
143
- # Returns a `GraphQL::Language::Nodes::Document`:
144
- dummy_query_ast = GraphQL.parse(dummy_query_str)
145
-
146
- # Reach into the AST for the default value:
147
- input_value_ast = dummy_query_ast.definitions.first.variables.first.default_value
148
-
149
- extract_default_value(default_value_str, input_value_ast)
126
+ when "OBJECT"
127
+ Class.new(GraphQL::Schema::Object) do
128
+ graphql_name(type["name"])
129
+ description(type["description"])
130
+ if type["interfaces"]
131
+ type["interfaces"].each do |interface_type|
132
+ implements(type_resolver.call(interface_type))
133
+ end
150
134
  end
135
+ loader.build_fields(self, type["fields"], type_resolver)
151
136
  end
152
-
153
- GraphQL::Argument.define(
154
- name: type["name"],
155
- type: type_resolver.call(type["type"]),
156
- description: type["description"],
157
- method_access: false,
158
- **kwargs
159
- )
160
137
  when "SCALAR"
161
138
  type_name = type.fetch("name")
162
- if GraphQL::Schema::BUILT_IN_TYPES[type_name]
163
- GraphQL::Schema::BUILT_IN_TYPES[type_name]
139
+ if (builtin = GraphQL::Schema::BUILT_IN_TYPES[type_name])
140
+ builtin
164
141
  else
165
- ScalarType.define(
166
- name: type["name"],
167
- description: type["description"],
168
- coerce: NullScalarCoerce,
169
- )
142
+ Class.new(GraphQL::Schema::Scalar) do
143
+ graphql_name(type["name"])
144
+ description(type["description"])
145
+ specified_by_url(type["specifiedByUrl"])
146
+ end
170
147
  end
171
148
  when "UNION"
172
- UnionType.define(
173
- name: type["name"],
174
- description: type["description"],
175
- possible_types: type["possibleTypes"].map { |possible_type|
176
- type_resolver.call(possible_type)
177
- }
178
- )
149
+ Class.new(GraphQL::Schema::Union) do
150
+ graphql_name(type["name"])
151
+ description(type["description"])
152
+ possible_types(*(type["possibleTypes"].map { |pt| type_resolver.call(pt) }))
153
+ end
179
154
  else
180
155
  fail GraphQL::RequiredImplementationMissingError, "#{type["kind"]} not implemented"
181
156
  end
182
157
  end
158
+
159
+ def define_directive(directive, type_resolver)
160
+ loader = self
161
+ Class.new(GraphQL::Schema::Directive) do
162
+ graphql_name(directive["name"])
163
+ description(directive["description"])
164
+ locations(*directive["locations"].map(&:to_sym))
165
+ repeatable(directive["isRepeatable"])
166
+ loader.build_arguments(self, directive["args"], type_resolver)
167
+ end
168
+ end
169
+
170
+ public
171
+
172
+ def build_fields(type_defn, fields, type_resolver)
173
+ loader = self
174
+ fields.each do |field_hash|
175
+ unwrapped_field_hash = field_hash
176
+ while (of_type = unwrapped_field_hash["ofType"])
177
+ unwrapped_field_hash = of_type
178
+ end
179
+ type_name = unwrapped_field_hash["name"]
180
+
181
+ type_defn.field(
182
+ field_hash["name"],
183
+ type: type_resolver.call(field_hash["type"]),
184
+ description: field_hash["description"],
185
+ deprecation_reason: field_hash["deprecationReason"],
186
+ null: true,
187
+ camelize: false,
188
+ connection_extension: nil,
189
+ connection: type_name.end_with?("Connection"),
190
+ ) do
191
+ if field_hash["args"].any?
192
+ loader.build_arguments(self, field_hash["args"], type_resolver)
193
+ end
194
+ end
195
+ end
196
+ end
197
+
198
+ def build_arguments(arg_owner, args, type_resolver)
199
+ args.each do |arg|
200
+ kwargs = {
201
+ type: type_resolver.call(arg["type"]),
202
+ description: arg["description"],
203
+ deprecation_reason: arg["deprecationReason"],
204
+ required: false,
205
+ camelize: false,
206
+ }
207
+
208
+ if arg["defaultValue"]
209
+ default_value_str = arg["defaultValue"]
210
+
211
+ dummy_query_str = "query getStuff($var: InputObj = #{default_value_str}) { __typename }"
212
+
213
+ # Returns a `GraphQL::Language::Nodes::Document`:
214
+ dummy_query_ast = GraphQL.parse(dummy_query_str)
215
+
216
+ # Reach into the AST for the default value:
217
+ input_value_ast = dummy_query_ast.definitions.first.variables.first.default_value
218
+
219
+ kwargs[:default_value] = extract_default_value(default_value_str, input_value_ast)
220
+ end
221
+
222
+ arg_owner.argument(arg["name"], **kwargs)
223
+ end
224
+ end
183
225
  end
184
226
  end
185
227
  end
@@ -18,16 +18,18 @@ module GraphQL
18
18
  # @param new_name [String]
19
19
  # @return [String]
20
20
  def graphql_name(new_name = nil)
21
- case
22
- when new_name
21
+ if new_name
22
+ GraphQL::NameValidator.validate!(new_name)
23
23
  @graphql_name = new_name
24
- when overridden = overridden_graphql_name
25
- overridden
26
24
  else
27
- default_graphql_name
25
+ overridden_graphql_name || default_graphql_name
28
26
  end
29
27
  end
30
28
 
29
+ def overridden_graphql_name
30
+ defined?(@graphql_name) ? @graphql_name : nil
31
+ end
32
+
31
33
  # Just a convenience method to point out that people should use graphql_name instead
32
34
  def name(new_name = nil)
33
35
  return super() if new_name.nil?
@@ -45,8 +47,23 @@ module GraphQL
45
47
  def description(new_description = nil)
46
48
  if new_description
47
49
  @description = new_description
50
+ elsif defined?(@description)
51
+ @description
48
52
  else
49
- @description || find_inherited_value(:description)
53
+ nil
54
+ end
55
+ end
56
+
57
+ # This pushes some configurations _down_ the inheritance tree,
58
+ # in order to prevent repetitive lookups at runtime.
59
+ module ConfigurationExtension
60
+ def inherited(child_class)
61
+ child_class.introspection(introspection)
62
+ child_class.description(description)
63
+ if overridden_graphql_name
64
+ child_class.graphql_name(overridden_graphql_name)
65
+ end
66
+ super
50
67
  end
51
68
  end
52
69
 
@@ -54,8 +71,10 @@ module GraphQL
54
71
  def introspection(new_introspection = nil)
55
72
  if !new_introspection.nil?
56
73
  @introspection = new_introspection
74
+ elsif defined?(@introspection)
75
+ @introspection
57
76
  else
58
- @introspection || find_inherited_value(:introspection, false)
77
+ false
59
78
  end
60
79
  end
61
80
 
@@ -68,21 +87,15 @@ module GraphQL
68
87
  def mutation(mutation_class = nil)
69
88
  if mutation_class
70
89
  @mutation = mutation_class
90
+ elsif defined?(@mutation)
91
+ @mutation
92
+ else
93
+ nil
71
94
  end
72
- @mutation
73
- end
74
-
75
- # @return [GraphQL::BaseType] Convert this type to a legacy-style object.
76
- def to_graphql
77
- raise GraphQL::RequiredImplementationMissingError
78
95
  end
79
96
 
80
97
  alias :unwrap :itself
81
98
 
82
- def overridden_graphql_name
83
- @graphql_name || find_inherited_value(:overridden_graphql_name)
84
- end
85
-
86
99
  # Creates the default name for a schema member.
87
100
  # The default name is the Ruby constant name,
88
101
  # without any namespaces and with any `-Type` suffix removed
@@ -95,27 +108,15 @@ module GraphQL
95
108
  end
96
109
 
97
110
  def visible?(context)
98
- if @mutation
99
- @mutation.visible?(context)
100
- else
101
- true
102
- end
111
+ true
103
112
  end
104
113
 
105
114
  def accessible?(context)
106
- if @mutation
107
- @mutation.accessible?(context)
108
- else
109
- true
110
- end
115
+ true
111
116
  end
112
117
 
113
118
  def authorized?(object, context)
114
- if @mutation
115
- @mutation.authorized?(object, context)
116
- else
117
- true
118
- end
119
+ true
119
120
  end
120
121
  end
121
122
  end