graphql 0.16.0 → 2.0.15

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 (490) hide show
  1. checksums.yaml +5 -5
  2. data/.yardopts +5 -0
  3. data/lib/generators/graphql/core.rb +69 -0
  4. data/lib/generators/graphql/enum_generator.rb +27 -0
  5. data/lib/generators/graphql/field_extractor.rb +31 -0
  6. data/lib/generators/graphql/input_generator.rb +50 -0
  7. data/lib/generators/graphql/install/mutation_root_generator.rb +34 -0
  8. data/lib/generators/graphql/install/templates/base_mutation.erb +10 -0
  9. data/lib/generators/graphql/install/templates/mutation_type.erb +12 -0
  10. data/lib/generators/graphql/install_generator.rb +197 -0
  11. data/lib/generators/graphql/interface_generator.rb +27 -0
  12. data/lib/generators/graphql/loader_generator.rb +21 -0
  13. data/lib/generators/graphql/mutation_create_generator.rb +22 -0
  14. data/lib/generators/graphql/mutation_delete_generator.rb +22 -0
  15. data/lib/generators/graphql/mutation_generator.rb +30 -0
  16. data/lib/generators/graphql/mutation_update_generator.rb +22 -0
  17. data/lib/generators/graphql/object_generator.rb +50 -0
  18. data/lib/generators/graphql/orm_mutations_base.rb +40 -0
  19. data/lib/generators/graphql/relay.rb +49 -0
  20. data/lib/generators/graphql/relay_generator.rb +21 -0
  21. data/lib/generators/graphql/scalar_generator.rb +22 -0
  22. data/lib/generators/graphql/templates/base_argument.erb +6 -0
  23. data/lib/generators/graphql/templates/base_connection.erb +8 -0
  24. data/lib/generators/graphql/templates/base_edge.erb +8 -0
  25. data/lib/generators/graphql/templates/base_enum.erb +6 -0
  26. data/lib/generators/graphql/templates/base_field.erb +7 -0
  27. data/lib/generators/graphql/templates/base_input_object.erb +7 -0
  28. data/lib/generators/graphql/templates/base_interface.erb +9 -0
  29. data/lib/generators/graphql/templates/base_object.erb +7 -0
  30. data/lib/generators/graphql/templates/base_scalar.erb +6 -0
  31. data/lib/generators/graphql/templates/base_union.erb +6 -0
  32. data/lib/generators/graphql/templates/enum.erb +11 -0
  33. data/lib/generators/graphql/templates/graphql_controller.erb +52 -0
  34. data/lib/generators/graphql/templates/input.erb +9 -0
  35. data/lib/generators/graphql/templates/interface.erb +10 -0
  36. data/lib/generators/graphql/templates/loader.erb +19 -0
  37. data/lib/generators/graphql/templates/mutation.erb +16 -0
  38. data/lib/generators/graphql/templates/mutation_create.erb +20 -0
  39. data/lib/generators/graphql/templates/mutation_delete.erb +20 -0
  40. data/lib/generators/graphql/templates/mutation_update.erb +21 -0
  41. data/lib/generators/graphql/templates/node_type.erb +9 -0
  42. data/lib/generators/graphql/templates/object.erb +10 -0
  43. data/lib/generators/graphql/templates/query_type.erb +15 -0
  44. data/lib/generators/graphql/templates/scalar.erb +17 -0
  45. data/lib/generators/graphql/templates/schema.erb +30 -0
  46. data/lib/generators/graphql/templates/union.erb +9 -0
  47. data/lib/generators/graphql/type_generator.rb +135 -0
  48. data/lib/generators/graphql/union_generator.rb +33 -0
  49. data/lib/graphql/analysis/ast/analyzer.rb +84 -0
  50. data/lib/graphql/analysis/ast/field_usage.rb +57 -0
  51. data/lib/graphql/analysis/ast/max_query_complexity.rb +22 -0
  52. data/lib/graphql/analysis/ast/max_query_depth.rb +22 -0
  53. data/lib/graphql/analysis/ast/query_complexity.rb +230 -0
  54. data/lib/graphql/analysis/ast/query_depth.rb +55 -0
  55. data/lib/graphql/analysis/ast/visitor.rb +269 -0
  56. data/lib/graphql/analysis/ast.rb +81 -0
  57. data/lib/graphql/analysis.rb +2 -5
  58. data/lib/graphql/analysis_error.rb +1 -0
  59. data/lib/graphql/backtrace/inspect_result.rb +50 -0
  60. data/lib/graphql/backtrace/table.rb +141 -0
  61. data/lib/graphql/backtrace/traced_error.rb +54 -0
  62. data/lib/graphql/backtrace/tracer.rb +80 -0
  63. data/lib/graphql/backtrace.rb +58 -0
  64. data/lib/graphql/coercion_error.rb +13 -0
  65. data/lib/graphql/dataloader/null_dataloader.rb +24 -0
  66. data/lib/graphql/dataloader/request.rb +19 -0
  67. data/lib/graphql/dataloader/request_all.rb +19 -0
  68. data/lib/graphql/dataloader/source.rb +164 -0
  69. data/lib/graphql/dataloader.rb +311 -0
  70. data/lib/graphql/date_encoding_error.rb +16 -0
  71. data/lib/graphql/deprecation.rb +9 -0
  72. data/lib/graphql/dig.rb +19 -0
  73. data/lib/graphql/execution/directive_checks.rb +37 -0
  74. data/lib/graphql/execution/errors.rb +93 -0
  75. data/lib/graphql/execution/interpreter/argument_value.rb +28 -0
  76. data/lib/graphql/execution/interpreter/arguments.rb +88 -0
  77. data/lib/graphql/execution/interpreter/arguments_cache.rb +105 -0
  78. data/lib/graphql/execution/interpreter/execution_errors.rb +29 -0
  79. data/lib/graphql/execution/interpreter/handles_raw_value.rb +18 -0
  80. data/lib/graphql/execution/interpreter/resolve.rb +77 -0
  81. data/lib/graphql/execution/interpreter/runtime.rb +994 -0
  82. data/lib/graphql/execution/interpreter.rb +226 -0
  83. data/lib/graphql/execution/lazy/lazy_method_map.rb +98 -0
  84. data/lib/graphql/execution/lazy.rb +75 -0
  85. data/lib/graphql/execution/lookahead.rb +311 -0
  86. data/lib/graphql/execution/multiplex.rb +45 -0
  87. data/lib/graphql/execution.rb +18 -0
  88. data/lib/graphql/execution_error.rb +34 -1
  89. data/lib/graphql/filter.rb +53 -0
  90. data/lib/graphql/integer_decoding_error.rb +17 -0
  91. data/lib/graphql/integer_encoding_error.rb +36 -0
  92. data/lib/graphql/introspection/base_object.rb +13 -0
  93. data/lib/graphql/introspection/directive_location_enum.rb +12 -5
  94. data/lib/graphql/introspection/directive_type.rb +30 -10
  95. data/lib/graphql/introspection/dynamic_fields.rb +12 -0
  96. data/lib/graphql/introspection/entry_points.rb +22 -0
  97. data/lib/graphql/introspection/enum_value_type.rb +21 -8
  98. data/lib/graphql/introspection/field_type.rb +26 -10
  99. data/lib/graphql/introspection/input_value_type.rb +64 -14
  100. data/lib/graphql/introspection/introspection_query.rb +7 -76
  101. data/lib/graphql/introspection/schema_type.rb +42 -17
  102. data/lib/graphql/introspection/type_kind_enum.rb +11 -5
  103. data/lib/graphql/introspection/type_type.rb +104 -16
  104. data/lib/graphql/introspection.rb +104 -13
  105. data/lib/graphql/invalid_name_error.rb +11 -0
  106. data/lib/graphql/invalid_null_error.rb +36 -8
  107. data/lib/graphql/language/block_string.rb +99 -0
  108. data/lib/graphql/language/cache.rb +37 -0
  109. data/lib/graphql/language/definition_slice.rb +41 -0
  110. data/lib/graphql/language/document_from_schema_definition.rb +335 -0
  111. data/lib/graphql/language/generation.rb +16 -86
  112. data/lib/graphql/language/lexer.rb +1436 -705
  113. data/lib/graphql/language/lexer.rl +172 -64
  114. data/lib/graphql/language/nodes.rb +617 -105
  115. data/lib/graphql/language/parser.rb +1524 -430
  116. data/lib/graphql/language/parser.y +348 -73
  117. data/lib/graphql/language/printer.rb +386 -0
  118. data/lib/graphql/language/sanitized_printer.rb +222 -0
  119. data/lib/graphql/language/token.rb +16 -3
  120. data/lib/graphql/language/visitor.rb +169 -25
  121. data/lib/graphql/language.rb +30 -0
  122. data/lib/graphql/load_application_object_failed_error.rb +22 -0
  123. data/lib/graphql/name_validator.rb +11 -0
  124. data/lib/graphql/pagination/active_record_relation_connection.rb +85 -0
  125. data/lib/graphql/pagination/array_connection.rb +79 -0
  126. data/lib/graphql/pagination/connection.rb +253 -0
  127. data/lib/graphql/pagination/connections.rb +135 -0
  128. data/lib/graphql/pagination/mongoid_relation_connection.rb +25 -0
  129. data/lib/graphql/pagination/relation_connection.rb +228 -0
  130. data/lib/graphql/pagination/sequel_dataset_connection.rb +28 -0
  131. data/lib/graphql/pagination.rb +6 -0
  132. data/lib/graphql/parse_error.rb +24 -0
  133. data/lib/graphql/query/context.rb +266 -12
  134. data/lib/graphql/query/fingerprint.rb +26 -0
  135. data/lib/graphql/query/input_validation_result.rb +34 -7
  136. data/lib/graphql/query/null_context.rb +52 -0
  137. data/lib/graphql/query/result.rb +63 -0
  138. data/lib/graphql/query/validation_pipeline.rb +114 -0
  139. data/lib/graphql/query/variable_validation_error.rb +27 -3
  140. data/lib/graphql/query/variables.rb +75 -24
  141. data/lib/graphql/query.rb +359 -92
  142. data/lib/graphql/railtie.rb +13 -0
  143. data/lib/graphql/rake_task/validate.rb +63 -0
  144. data/lib/graphql/rake_task.rb +146 -0
  145. data/lib/graphql/relay/range_add.rb +52 -0
  146. data/lib/graphql/relay.rb +3 -0
  147. data/lib/graphql/rubocop/graphql/base_cop.rb +36 -0
  148. data/lib/graphql/rubocop/graphql/default_null_true.rb +43 -0
  149. data/lib/graphql/rubocop/graphql/default_required_true.rb +43 -0
  150. data/lib/graphql/rubocop.rb +4 -0
  151. data/lib/graphql/runtime_type_error.rb +5 -0
  152. data/lib/graphql/schema/addition.rb +245 -0
  153. data/lib/graphql/schema/argument.rb +395 -0
  154. data/lib/graphql/schema/base_64_bp.rb +26 -0
  155. data/lib/graphql/schema/base_64_encoder.rb +21 -0
  156. data/lib/graphql/schema/build_from_definition/resolve_map/default_resolve.rb +47 -0
  157. data/lib/graphql/schema/build_from_definition/resolve_map.rb +78 -0
  158. data/lib/graphql/schema/build_from_definition.rb +492 -0
  159. data/lib/graphql/schema/built_in_types.rb +12 -0
  160. data/lib/graphql/schema/directive/deprecated.rb +18 -0
  161. data/lib/graphql/schema/directive/feature.rb +66 -0
  162. data/lib/graphql/schema/directive/flagged.rb +57 -0
  163. data/lib/graphql/schema/directive/include.rb +25 -0
  164. data/lib/graphql/schema/directive/one_of.rb +12 -0
  165. data/lib/graphql/schema/directive/skip.rb +25 -0
  166. data/lib/graphql/schema/directive/transform.rb +60 -0
  167. data/lib/graphql/schema/directive.rb +212 -0
  168. data/lib/graphql/schema/enum.rb +176 -0
  169. data/lib/graphql/schema/enum_value.rb +77 -0
  170. data/lib/graphql/schema/field/connection_extension.rb +80 -0
  171. data/lib/graphql/schema/field/scope_extension.rb +22 -0
  172. data/lib/graphql/schema/field.rb +862 -0
  173. data/lib/graphql/schema/field_extension.rb +156 -0
  174. data/lib/graphql/schema/find_inherited_value.rb +36 -0
  175. data/lib/graphql/schema/finder.rb +155 -0
  176. data/lib/graphql/schema/input_object.rb +258 -0
  177. data/lib/graphql/schema/interface.rb +113 -0
  178. data/lib/graphql/schema/introspection_system.rb +164 -0
  179. data/lib/graphql/schema/invalid_type_error.rb +1 -0
  180. data/lib/graphql/schema/late_bound_type.rb +37 -0
  181. data/lib/graphql/schema/list.rb +86 -0
  182. data/lib/graphql/schema/loader.rb +228 -0
  183. data/lib/graphql/schema/member/base_dsl_methods.rb +124 -0
  184. data/lib/graphql/schema/member/build_type.rb +178 -0
  185. data/lib/graphql/schema/member/graphql_type_names.rb +21 -0
  186. data/lib/graphql/schema/member/has_arguments.rb +376 -0
  187. data/lib/graphql/schema/member/has_ast_node.rb +20 -0
  188. data/lib/graphql/schema/member/has_deprecation_reason.rb +25 -0
  189. data/lib/graphql/schema/member/has_directives.rb +113 -0
  190. data/lib/graphql/schema/member/has_fields.rb +163 -0
  191. data/lib/graphql/schema/member/has_interfaces.rb +88 -0
  192. data/lib/graphql/schema/member/has_path.rb +25 -0
  193. data/lib/graphql/schema/member/has_unresolved_type_error.rb +15 -0
  194. data/lib/graphql/schema/member/has_validators.rb +31 -0
  195. data/lib/graphql/schema/member/relay_shortcuts.rb +73 -0
  196. data/lib/graphql/schema/member/scoped.rb +21 -0
  197. data/lib/graphql/schema/member/type_system_helpers.rb +38 -0
  198. data/lib/graphql/schema/member/validates_input.rb +33 -0
  199. data/lib/graphql/schema/member.rb +39 -0
  200. data/lib/graphql/schema/mutation.rb +85 -0
  201. data/lib/graphql/schema/non_null.rb +67 -0
  202. data/lib/graphql/schema/null_mask.rb +11 -0
  203. data/lib/graphql/schema/object.rb +117 -0
  204. data/lib/graphql/schema/printer.rb +72 -128
  205. data/lib/graphql/schema/relay_classic_mutation.rb +179 -0
  206. data/lib/graphql/schema/resolver/has_payload_type.rb +106 -0
  207. data/lib/graphql/schema/resolver.rb +402 -0
  208. data/lib/graphql/schema/scalar.rb +68 -0
  209. data/lib/graphql/schema/subscription.rb +148 -0
  210. data/lib/graphql/schema/timeout.rb +123 -0
  211. data/lib/graphql/schema/type_expression.rb +29 -5
  212. data/lib/graphql/schema/type_membership.rb +51 -0
  213. data/lib/graphql/schema/union.rb +81 -0
  214. data/lib/graphql/schema/unique_within_type.rb +34 -0
  215. data/lib/graphql/schema/validator/allow_blank_validator.rb +29 -0
  216. data/lib/graphql/schema/validator/allow_null_validator.rb +26 -0
  217. data/lib/graphql/schema/validator/exclusion_validator.rb +33 -0
  218. data/lib/graphql/schema/validator/format_validator.rb +48 -0
  219. data/lib/graphql/schema/validator/inclusion_validator.rb +35 -0
  220. data/lib/graphql/schema/validator/length_validator.rb +59 -0
  221. data/lib/graphql/schema/validator/numericality_validator.rb +82 -0
  222. data/lib/graphql/schema/validator/required_validator.rb +82 -0
  223. data/lib/graphql/schema/validator.rb +171 -0
  224. data/lib/graphql/schema/warden.rb +413 -0
  225. data/lib/graphql/schema/wrapper.rb +24 -0
  226. data/lib/graphql/schema.rb +1179 -104
  227. data/lib/graphql/static_validation/all_rules.rb +14 -0
  228. data/lib/graphql/static_validation/base_visitor.rb +200 -0
  229. data/lib/graphql/static_validation/definition_dependencies.rb +198 -0
  230. data/lib/graphql/static_validation/error.rb +46 -0
  231. data/lib/graphql/static_validation/interpreter_visitor.rb +14 -0
  232. data/lib/graphql/static_validation/literal_validator.rb +113 -22
  233. data/lib/graphql/static_validation/rules/argument_literals_are_compatible.rb +59 -11
  234. data/lib/graphql/static_validation/rules/argument_literals_are_compatible_error.rb +48 -0
  235. data/lib/graphql/static_validation/rules/argument_names_are_unique.rb +31 -0
  236. data/lib/graphql/static_validation/rules/argument_names_are_unique_error.rb +30 -0
  237. data/lib/graphql/static_validation/rules/arguments_are_defined.rb +62 -8
  238. data/lib/graphql/static_validation/rules/arguments_are_defined_error.rb +37 -0
  239. data/lib/graphql/static_validation/rules/directives_are_defined.rb +20 -13
  240. data/lib/graphql/static_validation/rules/directives_are_defined_error.rb +29 -0
  241. data/lib/graphql/static_validation/rules/directives_are_in_valid_locations.rb +32 -26
  242. data/lib/graphql/static_validation/rules/directives_are_in_valid_locations_error.rb +31 -0
  243. data/lib/graphql/static_validation/rules/fields_are_defined_on_type.rb +21 -23
  244. data/lib/graphql/static_validation/rules/fields_are_defined_on_type_error.rb +32 -0
  245. data/lib/graphql/static_validation/rules/fields_have_appropriate_selections.rb +55 -18
  246. data/lib/graphql/static_validation/rules/fields_have_appropriate_selections_error.rb +31 -0
  247. data/lib/graphql/static_validation/rules/fields_will_merge.rb +390 -70
  248. data/lib/graphql/static_validation/rules/fields_will_merge_error.rb +53 -0
  249. data/lib/graphql/static_validation/rules/fragment_names_are_unique.rb +30 -0
  250. data/lib/graphql/static_validation/rules/fragment_names_are_unique_error.rb +29 -0
  251. data/lib/graphql/static_validation/rules/fragment_spreads_are_possible.rb +54 -37
  252. data/lib/graphql/static_validation/rules/fragment_spreads_are_possible_error.rb +35 -0
  253. data/lib/graphql/static_validation/rules/fragment_types_exist.rb +26 -16
  254. data/lib/graphql/static_validation/rules/fragment_types_exist_error.rb +29 -0
  255. data/lib/graphql/static_validation/rules/fragments_are_finite.rb +13 -19
  256. data/lib/graphql/static_validation/rules/fragments_are_finite_error.rb +29 -0
  257. data/lib/graphql/static_validation/rules/fragments_are_named.rb +16 -0
  258. data/lib/graphql/static_validation/rules/fragments_are_named_error.rb +26 -0
  259. data/lib/graphql/static_validation/rules/fragments_are_on_composite_types.rb +25 -20
  260. data/lib/graphql/static_validation/rules/fragments_are_on_composite_types_error.rb +30 -0
  261. data/lib/graphql/static_validation/rules/fragments_are_used.rb +22 -33
  262. data/lib/graphql/static_validation/rules/fragments_are_used_error.rb +29 -0
  263. data/lib/graphql/static_validation/rules/input_object_names_are_unique.rb +30 -0
  264. data/lib/graphql/static_validation/rules/input_object_names_are_unique_error.rb +30 -0
  265. data/lib/graphql/static_validation/rules/mutation_root_exists.rb +17 -0
  266. data/lib/graphql/static_validation/rules/mutation_root_exists_error.rb +26 -0
  267. data/lib/graphql/static_validation/rules/no_definitions_are_present.rb +41 -0
  268. data/lib/graphql/static_validation/rules/no_definitions_are_present_error.rb +25 -0
  269. data/lib/graphql/static_validation/rules/one_of_input_objects_are_valid.rb +66 -0
  270. data/lib/graphql/static_validation/rules/one_of_input_objects_are_valid_error.rb +29 -0
  271. data/lib/graphql/static_validation/rules/operation_names_are_valid.rb +36 -0
  272. data/lib/graphql/static_validation/rules/operation_names_are_valid_error.rb +28 -0
  273. data/lib/graphql/static_validation/rules/query_root_exists.rb +17 -0
  274. data/lib/graphql/static_validation/rules/query_root_exists_error.rb +26 -0
  275. data/lib/graphql/static_validation/rules/required_arguments_are_present.rb +22 -21
  276. data/lib/graphql/static_validation/rules/required_arguments_are_present_error.rb +35 -0
  277. data/lib/graphql/static_validation/rules/required_input_object_attributes_are_present.rb +59 -0
  278. data/lib/graphql/static_validation/rules/required_input_object_attributes_are_present_error.rb +35 -0
  279. data/lib/graphql/static_validation/rules/subscription_root_exists.rb +17 -0
  280. data/lib/graphql/static_validation/rules/subscription_root_exists_error.rb +26 -0
  281. data/lib/graphql/static_validation/rules/unique_directives_per_location.rb +56 -0
  282. data/lib/graphql/static_validation/rules/unique_directives_per_location_error.rb +29 -0
  283. data/lib/graphql/static_validation/rules/variable_default_values_are_correctly_typed.rb +36 -18
  284. data/lib/graphql/static_validation/rules/variable_default_values_are_correctly_typed_error.rb +39 -0
  285. data/lib/graphql/static_validation/rules/variable_names_are_unique.rb +24 -0
  286. data/lib/graphql/static_validation/rules/variable_names_are_unique_error.rb +29 -0
  287. data/lib/graphql/static_validation/rules/variable_usages_are_allowed.rb +103 -39
  288. data/lib/graphql/static_validation/rules/variable_usages_are_allowed_error.rb +38 -0
  289. data/lib/graphql/static_validation/rules/variables_are_input_types.rb +22 -14
  290. data/lib/graphql/static_validation/rules/variables_are_input_types_error.rb +32 -0
  291. data/lib/graphql/static_validation/rules/variables_are_used_and_defined.rb +92 -70
  292. data/lib/graphql/static_validation/rules/variables_are_used_and_defined_error.rb +37 -0
  293. data/lib/graphql/static_validation/type_stack.rb +85 -24
  294. data/lib/graphql/static_validation/validation_context.rb +25 -46
  295. data/lib/graphql/static_validation/validation_timeout_error.rb +25 -0
  296. data/lib/graphql/static_validation/validator.rb +46 -15
  297. data/lib/graphql/static_validation.rb +6 -3
  298. data/lib/graphql/string_encoding_error.rb +20 -0
  299. data/lib/graphql/subscriptions/action_cable_subscriptions.rb +247 -0
  300. data/lib/graphql/subscriptions/broadcast_analyzer.rb +81 -0
  301. data/lib/graphql/subscriptions/default_subscription_resolve_extension.rb +58 -0
  302. data/lib/graphql/subscriptions/event.rb +144 -0
  303. data/lib/graphql/subscriptions/instrumentation.rb +28 -0
  304. data/lib/graphql/subscriptions/serialize.rb +158 -0
  305. data/lib/graphql/subscriptions.rb +306 -0
  306. data/lib/graphql/tracing/active_support_notifications_tracing.rb +21 -0
  307. data/lib/graphql/tracing/appoptics_tracing.rb +173 -0
  308. data/lib/graphql/tracing/appsignal_tracing.rb +51 -0
  309. data/lib/graphql/tracing/data_dog_tracing.rb +100 -0
  310. data/lib/graphql/tracing/instrumentation_tracing.rb +83 -0
  311. data/lib/graphql/tracing/new_relic_tracing.rb +51 -0
  312. data/lib/graphql/tracing/notifications_tracing.rb +59 -0
  313. data/lib/graphql/tracing/platform_tracing.rb +122 -0
  314. data/lib/graphql/tracing/prometheus_tracing/graphql_collector.rb +32 -0
  315. data/lib/graphql/tracing/prometheus_tracing.rb +67 -0
  316. data/lib/graphql/tracing/scout_tracing.rb +54 -0
  317. data/lib/graphql/tracing/statsd_tracing.rb +42 -0
  318. data/lib/graphql/tracing.rb +94 -0
  319. data/lib/graphql/type_kinds.rb +50 -22
  320. data/lib/graphql/types/big_int.rb +23 -0
  321. data/lib/graphql/types/boolean.rb +18 -0
  322. data/lib/graphql/types/float.rb +19 -0
  323. data/lib/graphql/types/id.rb +24 -0
  324. data/lib/graphql/types/int.rb +36 -0
  325. data/lib/graphql/types/iso_8601_date.rb +45 -0
  326. data/lib/graphql/types/iso_8601_date_time.rb +76 -0
  327. data/lib/graphql/types/json.rb +25 -0
  328. data/lib/graphql/types/relay/base_connection.rb +49 -0
  329. data/lib/graphql/types/relay/base_edge.rb +29 -0
  330. data/lib/graphql/types/relay/connection_behaviors.rb +154 -0
  331. data/lib/graphql/types/relay/default_relay.rb +21 -0
  332. data/lib/graphql/types/relay/edge_behaviors.rb +64 -0
  333. data/lib/graphql/types/relay/has_node_field.rb +41 -0
  334. data/lib/graphql/types/relay/has_nodes_field.rb +41 -0
  335. data/lib/graphql/types/relay/node.rb +15 -0
  336. data/lib/graphql/types/relay/node_behaviors.rb +19 -0
  337. data/lib/graphql/types/relay/page_info.rb +11 -0
  338. data/lib/graphql/types/relay/page_info_behaviors.rb +25 -0
  339. data/lib/graphql/types/relay.rb +39 -0
  340. data/lib/graphql/types/string.rb +29 -0
  341. data/lib/graphql/types.rb +11 -0
  342. data/lib/graphql/unauthorized_error.rb +29 -0
  343. data/lib/graphql/unauthorized_field_error.rb +23 -0
  344. data/lib/graphql/unresolved_type_error.rb +35 -0
  345. data/lib/graphql/version.rb +2 -1
  346. data/lib/graphql.rb +86 -41
  347. data/readme.md +15 -101
  348. metadata +394 -279
  349. data/lib/graphql/analysis/analyze_query.rb +0 -73
  350. data/lib/graphql/analysis/max_query_complexity.rb +0 -25
  351. data/lib/graphql/analysis/max_query_depth.rb +0 -25
  352. data/lib/graphql/analysis/query_complexity.rb +0 -122
  353. data/lib/graphql/analysis/query_depth.rb +0 -54
  354. data/lib/graphql/argument.rb +0 -25
  355. data/lib/graphql/base_type.rb +0 -115
  356. data/lib/graphql/boolean_type.rb +0 -9
  357. data/lib/graphql/define/assign_argument.rb +0 -20
  358. data/lib/graphql/define/assign_enum_value.rb +0 -16
  359. data/lib/graphql/define/assign_object_field.rb +0 -21
  360. data/lib/graphql/define/assignment_dictionary.rb +0 -26
  361. data/lib/graphql/define/defined_object_proxy.rb +0 -32
  362. data/lib/graphql/define/instance_definable.rb +0 -79
  363. data/lib/graphql/define/non_null_with_bang.rb +0 -15
  364. data/lib/graphql/define/type_definer.rb +0 -30
  365. data/lib/graphql/define.rb +0 -8
  366. data/lib/graphql/directive/include_directive.rb +0 -10
  367. data/lib/graphql/directive/skip_directive.rb +0 -11
  368. data/lib/graphql/directive.rb +0 -49
  369. data/lib/graphql/enum_type.rb +0 -95
  370. data/lib/graphql/field.rb +0 -131
  371. data/lib/graphql/float_type.rb +0 -5
  372. data/lib/graphql/id_type.rb +0 -12
  373. data/lib/graphql/input_object_type.rb +0 -71
  374. data/lib/graphql/int_type.rb +0 -5
  375. data/lib/graphql/interface_type.rb +0 -38
  376. data/lib/graphql/internal_representation/node.rb +0 -81
  377. data/lib/graphql/internal_representation/rewrite.rb +0 -177
  378. data/lib/graphql/internal_representation.rb +0 -2
  379. data/lib/graphql/introspection/arguments_field.rb +0 -5
  380. data/lib/graphql/introspection/enum_values_field.rb +0 -13
  381. data/lib/graphql/introspection/fields_field.rb +0 -13
  382. data/lib/graphql/introspection/input_fields_field.rb +0 -12
  383. data/lib/graphql/introspection/interfaces_field.rb +0 -5
  384. data/lib/graphql/introspection/of_type_field.rb +0 -6
  385. data/lib/graphql/introspection/possible_types_field.rb +0 -11
  386. data/lib/graphql/introspection/schema_field.rb +0 -15
  387. data/lib/graphql/introspection/type_by_name_field.rb +0 -16
  388. data/lib/graphql/introspection/typename_field.rb +0 -15
  389. data/lib/graphql/list_type.rb +0 -46
  390. data/lib/graphql/non_null_type.rb +0 -43
  391. data/lib/graphql/object_type.rb +0 -93
  392. data/lib/graphql/query/arguments.rb +0 -76
  393. data/lib/graphql/query/directive_resolution.rb +0 -16
  394. data/lib/graphql/query/executor.rb +0 -45
  395. data/lib/graphql/query/literal_input.rb +0 -90
  396. data/lib/graphql/query/serial_execution/execution_context.rb +0 -31
  397. data/lib/graphql/query/serial_execution/field_resolution.rb +0 -82
  398. data/lib/graphql/query/serial_execution/operation_resolution.rb +0 -27
  399. data/lib/graphql/query/serial_execution/selection_resolution.rb +0 -42
  400. data/lib/graphql/query/serial_execution/value_resolution.rb +0 -107
  401. data/lib/graphql/query/serial_execution.rb +0 -41
  402. data/lib/graphql/query/type_resolver.rb +0 -25
  403. data/lib/graphql/scalar_type.rb +0 -53
  404. data/lib/graphql/schema/catchall_middleware.rb +0 -34
  405. data/lib/graphql/schema/middleware_chain.rb +0 -28
  406. data/lib/graphql/schema/possible_types.rb +0 -34
  407. data/lib/graphql/schema/reduce_types.rb +0 -68
  408. data/lib/graphql/schema/rescue_middleware.rb +0 -53
  409. data/lib/graphql/schema/timeout_middleware.rb +0 -67
  410. data/lib/graphql/schema/type_map.rb +0 -30
  411. data/lib/graphql/schema/validation.rb +0 -164
  412. data/lib/graphql/static_validation/arguments_validator.rb +0 -48
  413. data/lib/graphql/static_validation/message.rb +0 -36
  414. data/lib/graphql/string_type.rb +0 -5
  415. data/lib/graphql/union_type.rb +0 -38
  416. data/spec/graphql/analysis/analyze_query_spec.rb +0 -50
  417. data/spec/graphql/analysis/max_query_complexity_spec.rb +0 -62
  418. data/spec/graphql/analysis/max_query_depth_spec.rb +0 -100
  419. data/spec/graphql/analysis/query_complexity_spec.rb +0 -235
  420. data/spec/graphql/analysis/query_depth_spec.rb +0 -80
  421. data/spec/graphql/argument_spec.rb +0 -20
  422. data/spec/graphql/base_type_spec.rb +0 -24
  423. data/spec/graphql/boolean_type_spec.rb +0 -20
  424. data/spec/graphql/define/instance_definable_spec.rb +0 -55
  425. data/spec/graphql/directive_spec.rb +0 -77
  426. data/spec/graphql/enum_type_spec.rb +0 -31
  427. data/spec/graphql/execution_error_spec.rb +0 -61
  428. data/spec/graphql/field_spec.rb +0 -92
  429. data/spec/graphql/float_type_spec.rb +0 -15
  430. data/spec/graphql/id_type_spec.rb +0 -32
  431. data/spec/graphql/input_object_type_spec.rb +0 -162
  432. data/spec/graphql/int_type_spec.rb +0 -15
  433. data/spec/graphql/interface_type_spec.rb +0 -56
  434. data/spec/graphql/internal_representation/rewrite_spec.rb +0 -120
  435. data/spec/graphql/introspection/directive_type_spec.rb +0 -50
  436. data/spec/graphql/introspection/input_value_type_spec.rb +0 -42
  437. data/spec/graphql/introspection/introspection_query_spec.rb +0 -10
  438. data/spec/graphql/introspection/schema_type_spec.rb +0 -45
  439. data/spec/graphql/introspection/type_type_spec.rb +0 -122
  440. data/spec/graphql/language/generation_spec.rb +0 -42
  441. data/spec/graphql/language/parser_spec.rb +0 -442
  442. data/spec/graphql/language/visitor_spec.rb +0 -49
  443. data/spec/graphql/list_type_spec.rb +0 -32
  444. data/spec/graphql/non_null_type_spec.rb +0 -31
  445. data/spec/graphql/object_type_spec.rb +0 -42
  446. data/spec/graphql/query/arguments_spec.rb +0 -25
  447. data/spec/graphql/query/context_spec.rb +0 -83
  448. data/spec/graphql/query/executor_spec.rb +0 -273
  449. data/spec/graphql/query/serial_execution/execution_context_spec.rb +0 -53
  450. data/spec/graphql/query/serial_execution/value_resolution_spec.rb +0 -66
  451. data/spec/graphql/query/type_resolver_spec.rb +0 -8
  452. data/spec/graphql/query/variables_spec.rb +0 -28
  453. data/spec/graphql/query_spec.rb +0 -363
  454. data/spec/graphql/scalar_type_spec.rb +0 -61
  455. data/spec/graphql/schema/catchall_middleware_spec.rb +0 -32
  456. data/spec/graphql/schema/middleware_chain_spec.rb +0 -42
  457. data/spec/graphql/schema/printer_spec.rb +0 -190
  458. data/spec/graphql/schema/reduce_types_spec.rb +0 -102
  459. data/spec/graphql/schema/rescue_middleware_spec.rb +0 -33
  460. data/spec/graphql/schema/timeout_middleware_spec.rb +0 -180
  461. data/spec/graphql/schema/type_expression_spec.rb +0 -38
  462. data/spec/graphql/schema/validation_spec.rb +0 -219
  463. data/spec/graphql/schema_spec.rb +0 -23
  464. data/spec/graphql/static_validation/rules/argument_literals_are_compatible_spec.rb +0 -63
  465. data/spec/graphql/static_validation/rules/arguments_are_defined_spec.rb +0 -48
  466. data/spec/graphql/static_validation/rules/directives_are_defined_spec.rb +0 -34
  467. data/spec/graphql/static_validation/rules/directives_are_in_valid_locations_spec.rb +0 -39
  468. data/spec/graphql/static_validation/rules/fields_are_defined_on_type_spec.rb +0 -60
  469. data/spec/graphql/static_validation/rules/fields_have_appropriate_selections_spec.rb +0 -31
  470. data/spec/graphql/static_validation/rules/fields_will_merge_spec.rb +0 -48
  471. data/spec/graphql/static_validation/rules/fragment_spreads_are_possible_spec.rb +0 -47
  472. data/spec/graphql/static_validation/rules/fragment_types_exist_spec.rb +0 -39
  473. data/spec/graphql/static_validation/rules/fragments_are_finite_spec.rb +0 -44
  474. data/spec/graphql/static_validation/rules/fragments_are_on_composite_types_spec.rb +0 -49
  475. data/spec/graphql/static_validation/rules/fragments_are_used_spec.rb +0 -25
  476. data/spec/graphql/static_validation/rules/required_arguments_are_present_spec.rb +0 -42
  477. data/spec/graphql/static_validation/rules/variable_default_values_are_correctly_typed_spec.rb +0 -44
  478. data/spec/graphql/static_validation/rules/variable_usages_are_allowed_spec.rb +0 -63
  479. data/spec/graphql/static_validation/rules/variables_are_input_types_spec.rb +0 -37
  480. data/spec/graphql/static_validation/rules/variables_are_used_and_defined_spec.rb +0 -53
  481. data/spec/graphql/static_validation/type_stack_spec.rb +0 -37
  482. data/spec/graphql/static_validation/validator_spec.rb +0 -69
  483. data/spec/graphql/string_type_spec.rb +0 -15
  484. data/spec/graphql/union_type_spec.rb +0 -31
  485. data/spec/spec_helper.rb +0 -18
  486. data/spec/support/dairy_app.rb +0 -309
  487. data/spec/support/dairy_data.rb +0 -23
  488. data/spec/support/minimum_input_object.rb +0 -16
  489. data/spec/support/star_wars_data.rb +0 -71
  490. data/spec/support/star_wars_schema.rb +0 -76
@@ -1,10 +1,23 @@
1
- GraphQL::Introspection::EnumValueType = GraphQL::ObjectType.define do
2
- name "__EnumValue"
3
- description "A possible value for an Enum"
4
- field :name, !types.String
5
- field :description, types.String
6
- field :deprecationReason, types.String, property: :deprecation_reason
7
- field :isDeprecated, !types.Boolean do
8
- resolve -> (obj, a, c) { !!obj.deprecation_reason }
1
+ # frozen_string_literal: true
2
+ module GraphQL
3
+ module Introspection
4
+ class EnumValueType < Introspection::BaseObject
5
+ graphql_name "__EnumValue"
6
+ description "One possible value for a given Enum. Enum values are unique values, not a "\
7
+ "placeholder for a string or numeric value. However an Enum value is returned in "\
8
+ "a JSON response as a string."
9
+ field :name, String, null: false
10
+ field :description, String
11
+ field :is_deprecated, Boolean, null: false
12
+ field :deprecation_reason, String
13
+
14
+ def name
15
+ object.graphql_name
16
+ end
17
+
18
+ def is_deprecated
19
+ !!@object.deprecation_reason
20
+ end
21
+ end
9
22
  end
10
23
  end
@@ -1,12 +1,28 @@
1
- GraphQL::Introspection::FieldType = GraphQL::ObjectType.define do
2
- name "__Field"
3
- description "Field on a GraphQL type"
4
- field :name, !types.String, "The name for accessing this field"
5
- field :description, types.String, "The description of this field"
6
- field :type, !GraphQL::Introspection::TypeType, "The return type of this field"
7
- field :isDeprecated, !types.Boolean, "Is this field deprecated?" do
8
- resolve -> (obj, a, c) { !!obj.deprecation_reason }
1
+ # frozen_string_literal: true
2
+ module GraphQL
3
+ module Introspection
4
+ class FieldType < Introspection::BaseObject
5
+ graphql_name "__Field"
6
+ description "Object and Interface types are described by a list of Fields, each of which has "\
7
+ "a name, potentially a list of arguments, and a return type."
8
+ field :name, String, null: false
9
+ field :description, String
10
+ field :args, [GraphQL::Schema::LateBoundType.new("__InputValue")], null: false do
11
+ argument :include_deprecated, Boolean, required: false, default_value: false
12
+ end
13
+ field :type, GraphQL::Schema::LateBoundType.new("__Type"), null: false
14
+ field :is_deprecated, Boolean, null: false
15
+ field :deprecation_reason, String
16
+
17
+ def is_deprecated
18
+ !!@object.deprecation_reason
19
+ end
20
+
21
+ def args(include_deprecated:)
22
+ args = @context.warden.arguments(@object)
23
+ args = args.reject(&:deprecation_reason) unless include_deprecated
24
+ args
25
+ end
26
+ end
9
27
  end
10
- field :args, field: GraphQL::Introspection::ArgumentsField
11
- field :deprecationReason, types.String, "Why this field was deprecated", property: :deprecation_reason
12
28
  end
@@ -1,17 +1,67 @@
1
- GraphQL::Introspection::InputValueType = GraphQL::ObjectType.define do
2
- name "__InputValue"
3
- description "An input for a field or InputObject"
4
- field :name, !types.String, "The key for this value"
5
- field :description, types.String, "What this value is used for"
6
- field :type, -> { !GraphQL::Introspection::TypeType }, "The expected type for this value"
7
- field :defaultValue, types.String, "The value applied if no other value is provided" do
8
- resolve -> (obj, args, ctx) {
9
- value = obj.default_value
10
- if value.is_a?(String)
11
- "\"#{value}\""
12
- else
13
- value
1
+ # frozen_string_literal: true
2
+ module GraphQL
3
+ module Introspection
4
+ class InputValueType < Introspection::BaseObject
5
+ graphql_name "__InputValue"
6
+ description "Arguments provided to Fields or Directives and the input fields of an "\
7
+ "InputObject are represented as Input Values which describe their type and "\
8
+ "optionally a default value."
9
+ field :name, String, null: false
10
+ field :description, String
11
+ field :type, GraphQL::Schema::LateBoundType.new("__Type"), null: false
12
+ field :default_value, String, "A GraphQL-formatted string representing the default value for this input value."
13
+ field :is_deprecated, Boolean, null: false
14
+ field :deprecation_reason, String
15
+
16
+ def is_deprecated
17
+ !!@object.deprecation_reason
14
18
  end
15
- }
19
+
20
+ def default_value
21
+ if @object.default_value?
22
+ value = @object.default_value
23
+ if value.nil?
24
+ 'null'
25
+ else
26
+ if (@object.type.kind.list? || (@object.type.kind.non_null? && @object.type.of_type.kind.list?)) && !value.respond_to?(:map)
27
+ # This is a bit odd -- we expect the default value to be an application-style value, so we use coerce result below.
28
+ # But coerce_result doesn't wrap single-item lists, which are valid inputs to list types.
29
+ # So, apply that wrapper here if needed.
30
+ value = [value]
31
+ end
32
+ coerced_default_value = @object.type.coerce_result(value, @context)
33
+ serialize_default_value(coerced_default_value, @object.type)
34
+ end
35
+ else
36
+ nil
37
+ end
38
+ end
39
+
40
+
41
+ private
42
+
43
+ # Recursively serialize, taking care not to add quotes to enum values
44
+ def serialize_default_value(value, type)
45
+ if value.nil?
46
+ 'null'
47
+ elsif type.kind.list?
48
+ inner_type = type.of_type
49
+ "[" + value.map { |v| serialize_default_value(v, inner_type) }.join(", ") + "]"
50
+ elsif type.kind.non_null?
51
+ serialize_default_value(value, type.of_type)
52
+ elsif type.kind.enum?
53
+ value
54
+ elsif type.kind.input_object?
55
+ "{" +
56
+ value.map do |k, v|
57
+ arg_defn = type.get_argument(k, context)
58
+ "#{k}: #{serialize_default_value(v, arg_defn.type)}"
59
+ end.join(", ") +
60
+ "}"
61
+ else
62
+ GraphQL::Language.serialize(value)
63
+ end
64
+ end
65
+ end
16
66
  end
17
67
  end
@@ -1,76 +1,7 @@
1
- # The introspection query to end all introspection queries, copied from
2
- # https://github.com/graphql/graphql-js/blob/master/src/utilities/introspectionQuery.js
3
- GraphQL::Introspection::INTROSPECTION_QUERY = "
4
- query IntrospectionQuery {
5
- __schema {
6
- queryType { name }
7
- mutationType { name }
8
- subscriptionType { name }
9
- types {
10
- ...FullType
11
- }
12
- directives {
13
- name
14
- description
15
- locations
16
- args {
17
- ...InputValue
18
- }
19
- }
20
- }
21
- }
22
- fragment FullType on __Type {
23
- kind
24
- name
25
- description
26
- fields(includeDeprecated: true) {
27
- name
28
- description
29
- args {
30
- ...InputValue
31
- }
32
- type {
33
- ...TypeRef
34
- }
35
- isDeprecated
36
- deprecationReason
37
- }
38
- inputFields {
39
- ...InputValue
40
- }
41
- interfaces {
42
- ...TypeRef
43
- }
44
- enumValues(includeDeprecated: true) {
45
- name
46
- description
47
- isDeprecated
48
- deprecationReason
49
- }
50
- possibleTypes {
51
- ...TypeRef
52
- }
53
- }
54
- fragment InputValue on __InputValue {
55
- name
56
- description
57
- type { ...TypeRef }
58
- defaultValue
59
- }
60
- fragment TypeRef on __Type {
61
- kind
62
- name
63
- ofType {
64
- kind
65
- name
66
- ofType {
67
- kind
68
- name
69
- ofType {
70
- kind
71
- name
72
- }
73
- }
74
- }
75
- }
76
- "
1
+ # frozen_string_literal: true
2
+
3
+ # This query is used by graphql-client so don't add the includeDeprecated
4
+ # argument for inputFields since the server may not support it. Two stage
5
+ # introspection queries will be required to handle this in clients.
6
+ GraphQL::Introspection::INTROSPECTION_QUERY = GraphQL::Introspection.query
7
+
@@ -1,24 +1,49 @@
1
- GraphQL::Introspection::SchemaType = GraphQL::ObjectType.define do
2
- name "__Schema"
3
- description "A GraphQL schema"
1
+ # frozen_string_literal: true
4
2
 
5
- field :types, !types[!GraphQL::Introspection::TypeType], "Types in this schema" do
6
- resolve -> (obj, arg, ctx) { obj.types.values }
7
- end
3
+ module GraphQL
4
+ module Introspection
5
+ class SchemaType < Introspection::BaseObject
6
+ graphql_name "__Schema"
7
+ description "A GraphQL Schema defines the capabilities of a GraphQL server. It exposes all "\
8
+ "available types and directives on the server, as well as the entry points for "\
9
+ "query, mutation, and subscription operations."
8
10
 
9
- field :directives, !types[!GraphQL::Introspection::DirectiveType], "Directives in this schema" do
10
- resolve -> (obj, arg, ctx) { obj.directives.values }
11
- end
11
+ field :types, [GraphQL::Schema::LateBoundType.new("__Type")], "A list of all types supported by this server.", null: false
12
+ field :query_type, GraphQL::Schema::LateBoundType.new("__Type"), "The type that query operations will be rooted at.", null: false
13
+ field :mutation_type, GraphQL::Schema::LateBoundType.new("__Type"), "If this server supports mutation, the type that mutation operations will be rooted at."
14
+ field :subscription_type, GraphQL::Schema::LateBoundType.new("__Type"), "If this server support subscription, the type that subscription operations will be rooted at."
15
+ field :directives, [GraphQL::Schema::LateBoundType.new("__Directive")], "A list of all directives supported by this server.", null: false
16
+ field :description, String, resolver_method: :schema_description
12
17
 
13
- field :queryType, !GraphQL::Introspection::TypeType, "The query root of this schema" do
14
- resolve -> (obj, arg, ctx) { obj.query }
15
- end
18
+ def schema_description
19
+ context.schema.description
20
+ end
16
21
 
17
- field :mutationType, GraphQL::Introspection::TypeType, "The mutation root of this schema" do
18
- resolve -> (obj, arg, ctx) { obj.mutation }
19
- end
22
+ def types
23
+ @context.warden.reachable_types.sort_by(&:graphql_name)
24
+ end
25
+
26
+ def query_type
27
+ permitted_root_type("query")
28
+ end
29
+
30
+ def mutation_type
31
+ permitted_root_type("mutation")
32
+ end
33
+
34
+ def subscription_type
35
+ permitted_root_type("subscription")
36
+ end
37
+
38
+ def directives
39
+ @context.warden.directives
40
+ end
41
+
42
+ private
20
43
 
21
- field :subscriptionType, GraphQL::Introspection::TypeType, "The subscription root of this schema" do
22
- resolve -> (obj, arg, ctx) { obj.subscription }
44
+ def permitted_root_type(op_type)
45
+ @context.warden.root_type_for_operation(op_type)
46
+ end
47
+ end
23
48
  end
24
49
  end
@@ -1,7 +1,13 @@
1
- GraphQL::Introspection::TypeKindEnum = GraphQL::EnumType.define do
2
- name "__TypeKind"
3
- description "The kinds of types in this GraphQL system"
4
- GraphQL::TypeKinds::KIND_NAMES.each do |kind_name|
5
- value(kind_name)
1
+ # frozen_string_literal: true
2
+ module GraphQL
3
+ module Introspection
4
+ class TypeKindEnum < GraphQL::Schema::Enum
5
+ graphql_name "__TypeKind"
6
+ description "An enum describing what kind of type a given `__Type` is."
7
+ GraphQL::TypeKinds::TYPE_KINDS.each do |type_kind|
8
+ value(type_kind.name, type_kind.description)
9
+ end
10
+ introspection true
11
+ end
6
12
  end
7
13
  end
@@ -1,20 +1,108 @@
1
- GraphQL::Introspection::TypeType = GraphQL::ObjectType.define do
2
- name "__Type"
3
- description "A type in the GraphQL schema"
1
+ # frozen_string_literal: true
2
+ module GraphQL
3
+ module Introspection
4
+ class TypeType < Introspection::BaseObject
5
+ graphql_name "__Type"
6
+ description "The fundamental unit of any GraphQL Schema is the type. There are many kinds of types in "\
7
+ "GraphQL as represented by the `__TypeKind` enum.\n\n"\
8
+ "Depending on the kind of a type, certain fields describe information about that type. "\
9
+ "Scalar types provide no information beyond a name and description, while "\
10
+ "Enum types provide their values. Object and Interface types provide the fields "\
11
+ "they describe. Abstract types, Union and Interface, provide the Object types "\
12
+ "possible at runtime. List and NonNull types compose other types."
4
13
 
5
- field :name, types.String, "The name of this type"
6
- field :description, types.String, "What this type represents"
14
+ field :kind, GraphQL::Schema::LateBoundType.new("__TypeKind"), null: false
15
+ field :name, String, method: :graphql_name
16
+ field :description, String
17
+ field :fields, [GraphQL::Schema::LateBoundType.new("__Field")] do
18
+ argument :include_deprecated, Boolean, required: false, default_value: false
19
+ end
20
+ field :interfaces, [GraphQL::Schema::LateBoundType.new("__Type")]
21
+ field :possible_types, [GraphQL::Schema::LateBoundType.new("__Type")]
22
+ field :enum_values, [GraphQL::Schema::LateBoundType.new("__EnumValue")] do
23
+ argument :include_deprecated, Boolean, required: false, default_value: false
24
+ end
25
+ field :input_fields, [GraphQL::Schema::LateBoundType.new("__InputValue")] do
26
+ argument :include_deprecated, Boolean, required: false, default_value: false
27
+ end
28
+ field :of_type, GraphQL::Schema::LateBoundType.new("__Type")
7
29
 
8
- field :kind do
9
- type !GraphQL::Introspection::TypeKindEnum
10
- description "The kind of this type"
11
- resolve -> (target, a, c) { target.kind.name }
12
- end
30
+ field :specifiedByURL, String, resolver_method: :specified_by_url
31
+
32
+ field :is_one_of, Boolean, null: false
33
+
34
+ def is_one_of
35
+ object.kind.input_object? &&
36
+ object.directives.any? { |d| d.graphql_name == "oneOf" }
37
+ end
38
+
39
+ def specified_by_url
40
+ if object.kind.scalar?
41
+ object.specified_by_url
42
+ else
43
+ nil
44
+ end
45
+ end
46
+
47
+ def kind
48
+ @object.kind.name
49
+ end
50
+
51
+ def enum_values(include_deprecated:)
52
+ if !@object.kind.enum?
53
+ nil
54
+ else
55
+ enum_values = @context.warden.enum_values(@object)
56
+
57
+ if !include_deprecated
58
+ enum_values = enum_values.select {|f| !f.deprecation_reason }
59
+ end
13
60
 
14
- field :fields, field: GraphQL::Introspection::FieldsField
15
- field :ofType, field: GraphQL::Introspection::OfTypeField
16
- field :inputFields, field: GraphQL::Introspection::InputFieldsField
17
- field :possibleTypes, field: GraphQL::Introspection::PossibleTypesField
18
- field :enumValues, field: GraphQL::Introspection::EnumValuesField
19
- field :interfaces, field: GraphQL::Introspection::InterfacesField
61
+ enum_values
62
+ end
63
+ end
64
+
65
+ def interfaces
66
+ if @object.kind.object? || @object.kind.interface?
67
+ @context.warden.interfaces(@object).sort_by(&:graphql_name)
68
+ else
69
+ nil
70
+ end
71
+ end
72
+
73
+ def input_fields(include_deprecated:)
74
+ if @object.kind.input_object?
75
+ args = @context.warden.arguments(@object)
76
+ args = args.reject(&:deprecation_reason) unless include_deprecated
77
+ args
78
+ else
79
+ nil
80
+ end
81
+ end
82
+
83
+ def possible_types
84
+ if @object.kind.abstract?
85
+ @context.warden.possible_types(@object).sort_by(&:graphql_name)
86
+ else
87
+ nil
88
+ end
89
+ end
90
+
91
+ def fields(include_deprecated:)
92
+ if !@object.kind.fields?
93
+ nil
94
+ else
95
+ fields = @context.warden.fields(@object)
96
+ if !include_deprecated
97
+ fields = fields.select {|f| !f.deprecation_reason }
98
+ end
99
+ fields.sort_by(&:name)
100
+ end
101
+ end
102
+
103
+ def of_type
104
+ @object.kind.wraps? ? @object.of_type : nil
105
+ end
106
+ end
107
+ end
20
108
  end
@@ -1,27 +1,118 @@
1
+ # frozen_string_literal: true
1
2
  module GraphQL
2
3
  module Introspection
4
+ def self.query(include_deprecated_args: false, include_schema_description: false, include_is_repeatable: false, include_specified_by_url: false, include_is_one_of: false)
5
+ # The introspection query to end all introspection queries, copied from
6
+ # https://github.com/graphql/graphql-js/blob/master/src/utilities/introspectionQuery.js
7
+ <<-QUERY.gsub(/\n{2,}/, "\n")
8
+ query IntrospectionQuery {
9
+ __schema {
10
+ #{include_schema_description ? "description" : ""}
11
+ queryType { name }
12
+ mutationType { name }
13
+ subscriptionType { name }
14
+ types {
15
+ ...FullType
16
+ }
17
+ directives {
18
+ name
19
+ description
20
+ locations
21
+ #{include_is_repeatable ? "isRepeatable" : ""}
22
+ args#{include_deprecated_args ? '(includeDeprecated: true)' : ''} {
23
+ ...InputValue
24
+ }
25
+ }
26
+ }
27
+ }
28
+ fragment FullType on __Type {
29
+ kind
30
+ name
31
+ description
32
+ #{include_specified_by_url ? "specifiedByURL" : ""}
33
+ #{include_is_one_of ? "isOneOf" : ""}
34
+ fields(includeDeprecated: true) {
35
+ name
36
+ description
37
+ args#{include_deprecated_args ? '(includeDeprecated: true)' : ''} {
38
+ ...InputValue
39
+ }
40
+ type {
41
+ ...TypeRef
42
+ }
43
+ isDeprecated
44
+ deprecationReason
45
+ }
46
+ inputFields#{include_deprecated_args ? '(includeDeprecated: true)' : ''} {
47
+ ...InputValue
48
+ }
49
+ interfaces {
50
+ ...TypeRef
51
+ }
52
+ enumValues(includeDeprecated: true) {
53
+ name
54
+ description
55
+ isDeprecated
56
+ deprecationReason
57
+ }
58
+ possibleTypes {
59
+ ...TypeRef
60
+ }
61
+ }
62
+ fragment InputValue on __InputValue {
63
+ name
64
+ description
65
+ type { ...TypeRef }
66
+ defaultValue
67
+ #{include_deprecated_args ? 'isDeprecated' : ''}
68
+ #{include_deprecated_args ? 'deprecationReason' : ''}
69
+ }
70
+ fragment TypeRef on __Type {
71
+ kind
72
+ name
73
+ ofType {
74
+ kind
75
+ name
76
+ ofType {
77
+ kind
78
+ name
79
+ ofType {
80
+ kind
81
+ name
82
+ ofType {
83
+ kind
84
+ name
85
+ ofType {
86
+ kind
87
+ name
88
+ ofType {
89
+ kind
90
+ name
91
+ ofType {
92
+ kind
93
+ name
94
+ }
95
+ }
96
+ }
97
+ }
98
+ }
99
+ }
100
+ }
101
+ }
102
+ QUERY
103
+ end
3
104
  end
4
105
  end
5
106
 
6
- require "graphql/introspection/typename_field"
107
+ require "graphql/introspection/base_object"
7
108
  require "graphql/introspection/input_value_type"
8
109
  require "graphql/introspection/enum_value_type"
9
110
  require "graphql/introspection/type_kind_enum"
10
-
11
- require "graphql/introspection/fields_field"
12
- require "graphql/introspection/of_type_field"
13
- require "graphql/introspection/input_fields_field"
14
- require "graphql/introspection/possible_types_field"
15
- require "graphql/introspection/enum_values_field"
16
- require "graphql/introspection/interfaces_field"
17
-
18
111
  require "graphql/introspection/type_type"
19
- require "graphql/introspection/arguments_field"
20
112
  require "graphql/introspection/field_type"
21
-
22
113
  require "graphql/introspection/directive_location_enum"
23
114
  require "graphql/introspection/directive_type"
24
115
  require "graphql/introspection/schema_type"
25
- require "graphql/introspection/schema_field"
26
- require "graphql/introspection/type_by_name_field"
27
116
  require "graphql/introspection/introspection_query"
117
+ require "graphql/introspection/dynamic_fields"
118
+ require "graphql/introspection/entry_points"
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+ module GraphQL
3
+ class InvalidNameError < GraphQL::ExecutionError
4
+ attr_reader :name, :valid_regex
5
+ def initialize(name, valid_regex)
6
+ @name = name
7
+ @valid_regex = valid_regex
8
+ super("Names must match #{@valid_regex.inspect} but '#{@name}' does not")
9
+ end
10
+ end
11
+ end
@@ -1,22 +1,50 @@
1
+ # frozen_string_literal: true
1
2
  module GraphQL
2
3
  # Raised automatically when a field's resolve function returns `nil`
3
4
  # for a non-null field.
4
- class InvalidNullError < GraphQL::Error
5
- def initialize(field_name, value)
6
- @field_name = field_name
5
+ class InvalidNullError < GraphQL::RuntimeTypeError
6
+ # @return [GraphQL::BaseType] The owner of {#field}
7
+ attr_reader :parent_type
8
+
9
+ # @return [GraphQL::Field] The field which failed to return a value
10
+ attr_reader :field
11
+
12
+ # @return [nil, GraphQL::ExecutionError] The invalid value for this field
13
+ attr_reader :value
14
+
15
+ def initialize(parent_type, field, value)
16
+ @parent_type = parent_type
17
+ @field = field
7
18
  @value = value
19
+ super("Cannot return null for non-nullable field #{@parent_type.graphql_name}.#{@field.graphql_name}")
8
20
  end
9
21
 
10
22
  # @return [Hash] An entry for the response's "errors" key
11
23
  def to_h
12
- {
13
- "message" => "Cannot return null for non-nullable field #{@field_name}"
14
- }
24
+ { "message" => message }
15
25
  end
16
26
 
17
- # @return [Boolean] Whether the null in question was caused by another error
27
+ # @deprecated always false
18
28
  def parent_error?
19
- @value.is_a?(GraphQL::ExecutionError)
29
+ false
30
+ end
31
+
32
+ class << self
33
+ attr_accessor :parent_class
34
+
35
+ def subclass_for(parent_class)
36
+ subclass = Class.new(self)
37
+ subclass.parent_class = parent_class
38
+ subclass
39
+ end
40
+
41
+ def inspect
42
+ if (name.nil? || parent_class.name.nil?) && parent_class.respond_to?(:mutation) && (mutation = parent_class.mutation)
43
+ "#{mutation.inspect}::#{parent_class.graphql_name}::InvalidNullError"
44
+ else
45
+ super
46
+ end
47
+ end
20
48
  end
21
49
  end
22
50
  end