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,177 +0,0 @@
1
- module GraphQL
2
- module InternalRepresentation
3
- # Convert an AST into a tree of {InternalRepresentation::Node}s
4
- #
5
- # This rides along with {StaticValidation}, building a tree of nodes.
6
- #
7
- # However, if any errors occurred during validation, the resulting tree is bogus.
8
- # (For example, `nil` could have been pushed instead of a type.)
9
- class Rewrite
10
- include GraphQL::Language
11
-
12
- # @return [Hash<String => InternalRepresentation::Node>] internal representation of each query root (operation, fragment)
13
- attr_reader :operations
14
-
15
- def initialize
16
- # { String => Node } Tracks the roots of the query
17
- @operations = {}
18
- @fragments = {}
19
- # [String...] fragments which don't have fragments inside them
20
- @independent_fragments = []
21
- # Tracks the current node during traversal
22
- # Stack<InternalRepresentation::Node>
23
- @nodes = []
24
- # This tracks dependencies from fragment to Node where it was used
25
- # { frag_name => [dependent_node, dependent_node]}
26
- @fragment_spreads = Hash.new { |h, k| h[k] = []}
27
- # [Nodes::Directive ... ] directive affecting the current scope
28
- @parent_directives = []
29
- end
30
-
31
- def validate(context)
32
- visitor = context.visitor
33
-
34
- visitor[Nodes::OperationDefinition].enter << -> (ast_node, prev_ast_node) {
35
- node = Node.new(
36
- return_type: context.type_definition.unwrap,
37
- ast_node: ast_node,
38
- )
39
- @nodes.push(node)
40
- @operations[ast_node.name] = node
41
- }
42
-
43
- visitor[Nodes::Field].enter << -> (ast_node, prev_ast_node) {
44
- parent_node = @nodes.last
45
- node_name = ast_node.alias || ast_node.name
46
- # This node might not be novel, eg inside an inline fragment
47
- # but it could contain new type information, which is captured below.
48
- # (StaticValidation ensures that merging fields is fair game)
49
- node = parent_node.children[node_name] ||= begin
50
- Node.new(
51
- return_type: context.type_definition && context.type_definition.unwrap,
52
- ast_node: ast_node,
53
- name: node_name,
54
- definition: context.field_definition,
55
- )
56
- end
57
- node.on_types.add(context.parent_type_definition.unwrap)
58
- @nodes.push(node)
59
- @parent_directives.push([])
60
- }
61
-
62
- visitor[Nodes::InlineFragment].enter << -> (ast_node, prev_ast_node) {
63
- @parent_directives.push([])
64
- }
65
-
66
- visitor[Nodes::Directive].enter << -> (ast_node, prev_ast_node) {
67
- # It could be a query error where a directive is somewhere it shouldn't be
68
- if @parent_directives.any?
69
- @parent_directives.last << Node.new(
70
- name: ast_node.name,
71
- ast_node: ast_node,
72
- definition: context.directive_definition,
73
- )
74
- end
75
- }
76
-
77
- visitor[Nodes::FragmentSpread].enter << -> (ast_node, prev_ast_node) {
78
- # Record _both sides_ of the dependency
79
- spread_node = Node.new(
80
- name: ast_node.name,
81
- ast_node: ast_node,
82
- )
83
- parent_node = @nodes.last
84
- # The parent node has a reference to the fragment
85
- parent_node.spreads.push(spread_node)
86
- # And keep a reference from the fragment to the parent node
87
- @fragment_spreads[ast_node.name].push(parent_node)
88
- @nodes.push(spread_node)
89
- @parent_directives.push([])
90
- }
91
-
92
- visitor[Nodes::FragmentDefinition].enter << -> (ast_node, prev_ast_node) {
93
- node = Node.new(
94
- name: ast_node.name,
95
- return_type: context.type_definition,
96
- ast_node: ast_node,
97
- )
98
- @nodes.push(node)
99
- @fragments[ast_node.name] = node
100
- }
101
-
102
- visitor[Nodes::InlineFragment].leave << -> (ast_node, prev_ast_node) {
103
- @parent_directives.pop
104
- }
105
-
106
- visitor[Nodes::FragmentSpread].leave << -> (ast_node, prev_ast_node) {
107
- # Capture any directives that apply to this spread
108
- # so that they can be applied to fields when
109
- # the fragment is merged in later
110
- spread_node = @nodes.pop
111
- spread_node.directives.merge(@parent_directives.flatten)
112
- @parent_directives.pop
113
- }
114
-
115
- visitor[Nodes::FragmentDefinition].leave << -> (ast_node, prev_ast_node) {
116
- # This fragment doesn't depend on any others,
117
- # we should save it as the starting point for dependency resolution
118
- frag_node = @nodes.pop
119
- if frag_node.spreads.none?
120
- @independent_fragments << frag_node
121
- end
122
- }
123
-
124
- visitor[Nodes::OperationDefinition].leave << -> (ast_node, prev_ast_node) {
125
- @nodes.pop
126
- }
127
-
128
- visitor[Nodes::Field].leave << -> (ast_node, prev_ast_node) {
129
- # Pop this field's node
130
- # and record any directives that were visited
131
- # during this field & before it (eg, inline fragments)
132
- field_node = @nodes.pop
133
- field_node.directives.merge(@parent_directives.flatten)
134
- @parent_directives.pop
135
- }
136
-
137
- visitor[Nodes::Document].leave << -> (ast_node, prev_ast_node) {
138
- # Resolve fragment dependencies. Start with fragments with no
139
- # dependencies and work along the spreads.
140
- while fragment_node = @independent_fragments.pop
141
- fragment_usages = @fragment_spreads[fragment_node.name]
142
- while dependent_node = fragment_usages.pop
143
- # remove self from dependent_node.spreads
144
- rejected_spread_nodes = dependent_node.spreads.select { |spr| spr.name == fragment_node.name }
145
- rejected_spread_nodes.each { |r_node| dependent_node.spreads.delete(r_node) }
146
-
147
- # resolve the dependency (merge into dependent node)
148
- deep_merge(dependent_node, fragment_node, rejected_spread_nodes.first.directives)
149
-
150
- if dependent_node.spreads.none? && dependent_node.ast_node.is_a?(Nodes::FragmentDefinition)
151
- @independent_fragments.push(dependent_node)
152
- end
153
- end
154
- end
155
- }
156
- end
157
-
158
- private
159
-
160
- # Merge the chilren from `fragment_node` into `parent_node`. Merge `directives` into each of those fields.
161
- def deep_merge(parent_node, fragment_node, directives)
162
- fragment_node.children.each do |name, child_node|
163
- deep_merge_child(parent_node, name, child_node, directives)
164
- end
165
- end
166
-
167
- # Merge `node` into `parent_node`'s children, as `name`, applying `extra_directives`
168
- def deep_merge_child(parent_node, name, node, extra_directives)
169
- child_node = parent_node.children[name] ||= node.dup
170
- node.children.each do |merge_child_name, merge_child_node|
171
- deep_merge_child(child_node, merge_child_name, merge_child_node, [])
172
- end
173
- child_node.directives.merge(extra_directives)
174
- end
175
- end
176
- end
177
- end
@@ -1,2 +0,0 @@
1
- require "graphql/internal_representation/node"
2
- require "graphql/internal_representation/rewrite"
@@ -1,5 +0,0 @@
1
- GraphQL::Introspection::ArgumentsField = GraphQL::Field.define do
2
- description "Arguments allowed to this object"
3
- type !GraphQL::ListType.new(of_type: !GraphQL::Introspection::InputValueType)
4
- resolve -> (target, a, c) { target.arguments.values }
5
- end
@@ -1,13 +0,0 @@
1
- GraphQL::Introspection::EnumValuesField = GraphQL::Field.define do
2
- description "Values for this enum"
3
- type types[!GraphQL::Introspection::EnumValueType]
4
- argument :includeDeprecated, types.Boolean, default_value: false
5
- resolve -> (object, arguments, context) do
6
- return nil if !object.kind.enum?
7
- fields = object.values.values
8
- if !arguments["includeDeprecated"]
9
- fields = fields.select {|f| !f.deprecation_reason }
10
- end
11
- fields
12
- end
13
- end
@@ -1,13 +0,0 @@
1
- GraphQL::Introspection::FieldsField = GraphQL::Field.define do
2
- description "List of fields on this object"
3
- type -> { types[!GraphQL::Introspection::FieldType] }
4
- argument :includeDeprecated, GraphQL::BOOLEAN_TYPE, default_value: false
5
- resolve -> (object, arguments, context) {
6
- return nil if !object.kind.fields?
7
- fields = object.all_fields
8
- if !arguments["includeDeprecated"]
9
- fields = fields.select {|f| !f.deprecation_reason }
10
- end
11
- fields.sort_by(&:name)
12
- }
13
- end
@@ -1,12 +0,0 @@
1
- GraphQL::Introspection::InputFieldsField = GraphQL::Field.define do
2
- name "inputFields"
3
- description "fields on this input object"
4
- type types[!GraphQL::Introspection::InputValueType]
5
- resolve -> (target, a, c) {
6
- if target.kind.input_object?
7
- target.input_fields.values
8
- else
9
- nil
10
- end
11
- }
12
- end
@@ -1,5 +0,0 @@
1
- GraphQL::Introspection::InterfacesField = GraphQL::Field.define do
2
- description "Interfaces which this object implements"
3
- type -> { types[!GraphQL::Introspection::TypeType] }
4
- resolve -> (target, a, c) { target.kind.object? ? target.interfaces : nil }
5
- end
@@ -1,6 +0,0 @@
1
- GraphQL::Introspection::OfTypeField = GraphQL::Field.define do
2
- name "ofType"
3
- description "The modified type of this type"
4
- type -> { GraphQL::Introspection::TypeType }
5
- resolve -> (obj, args, ctx) { obj.kind.wraps? ? obj.of_type : nil }
6
- end
@@ -1,11 +0,0 @@
1
- GraphQL::Introspection::PossibleTypesField = GraphQL::Field.define do
2
- description "Types which compose this Union or Interface"
3
- type -> { types[!GraphQL::Introspection::TypeType] }
4
- resolve -> (target, args, ctx) {
5
- if target.kind.resolves?
6
- ctx.schema.possible_types(target)
7
- else
8
- nil
9
- end
10
- }
11
- end
@@ -1,15 +0,0 @@
1
- module GraphQL
2
- module Introspection
3
- # A wrapper to implement `__schema`
4
- class SchemaField
5
- def self.create(wrapped_type)
6
- GraphQL::Field.define do
7
- name("__schema")
8
- description("This GraphQL schema")
9
- type(!GraphQL::Introspection::SchemaType)
10
- resolve -> (o, a, c) { wrapped_type }
11
- end
12
- end
13
- end
14
- end
15
- end
@@ -1,16 +0,0 @@
1
- module GraphQL
2
- module Introspection
3
- # A wrapper to create `__type(name: )` dynamically.
4
- class TypeByNameField
5
- def self.create(type_hash)
6
- GraphQL::Field.define do
7
- name("__type")
8
- description("A type in the GraphQL system")
9
- type(!GraphQL::Introspection::TypeType)
10
- argument :name, !types.String
11
- resolve -> (o, args, c) { type_hash[args["name"]] }
12
- end
13
- end
14
- end
15
- end
16
- end
@@ -1,15 +0,0 @@
1
- module GraphQL
2
- module Introspection
3
- # A wrapper to create `__typename`.
4
- class TypenameField
5
- def self.create(wrapped_type)
6
- GraphQL::Field.define do
7
- name "__typename"
8
- description "The name of this type"
9
- type -> { !GraphQL::STRING_TYPE }
10
- resolve -> (obj, a, c) { wrapped_type.name }
11
- end
12
- end
13
- end
14
- end
15
- end
@@ -1,46 +0,0 @@
1
- module GraphQL
2
- # A list type wraps another type.
3
- #
4
- # Get the underlying type with {#unwrap}
5
- class ListType < GraphQL::BaseType
6
- include GraphQL::BaseType::ModifiesAnotherType
7
- attr_reader :of_type, :name
8
- def initialize(of_type:)
9
- @name = "List"
10
- @of_type = of_type
11
- end
12
-
13
- def kind
14
- GraphQL::TypeKinds::LIST
15
- end
16
-
17
- def to_s
18
- "[#{of_type.to_s}]"
19
- end
20
-
21
- def validate_non_null_input(value)
22
- result = GraphQL::Query::InputValidationResult.new
23
-
24
- ensure_array(value).each_with_index do |item, index|
25
- item_result = of_type.validate_input(item)
26
- if !item_result.valid?
27
- result.merge_result!(index, item_result)
28
- end
29
- end
30
-
31
- result
32
- end
33
-
34
-
35
- def coerce_non_null_input(value)
36
- ensure_array(value).map{ |item| of_type.coerce_input(item) }
37
- end
38
-
39
-
40
- private
41
-
42
- def ensure_array(value)
43
- value.is_a?(Array) ? value : [value]
44
- end
45
- end
46
- end
@@ -1,43 +0,0 @@
1
- module GraphQL
2
- # A non-null type wraps another type.
3
- #
4
- # Get the underlying type with {#unwrap}
5
- class NonNullType < GraphQL::BaseType
6
- include GraphQL::BaseType::ModifiesAnotherType
7
-
8
- attr_reader :of_type
9
- def initialize(of_type:)
10
- @of_type = of_type
11
- end
12
-
13
- def name
14
- "Non-Null"
15
- end
16
-
17
- def valid_input?(value)
18
- validate_input(value).valid?
19
- end
20
-
21
- def validate_input(value)
22
- if value.nil?
23
- result = GraphQL::Query::InputValidationResult.new
24
- result.add_problem("Expected value to not be null")
25
- result
26
- else
27
- of_type.validate_input(value)
28
- end
29
- end
30
-
31
- def coerce_input(value)
32
- of_type.coerce_input(value)
33
- end
34
-
35
- def kind
36
- GraphQL::TypeKinds::NON_NULL
37
- end
38
-
39
- def to_s
40
- "#{of_type.to_s}!"
41
- end
42
- end
43
- end
@@ -1,93 +0,0 @@
1
- module GraphQL
2
- # This type exposes fields on an object.
3
- #
4
- # @example defining a type for your IMDB clone
5
- # MovieType = GraphQL::ObjectType.define do
6
- # name "Movie"
7
- # description "A full-length film or a short film"
8
- # interfaces [ProductionInterface, DurationInterface]
9
- #
10
- # field :runtimeMinutes, !types.Int, property: :runtime_minutes
11
- # field :director, PersonType
12
- # field :cast, CastType
13
- # field :starring, types[PersonType] do
14
- # arguments :limit, types.Int
15
- # resolve -> (object, args, ctx) {
16
- # stars = object.cast.stars
17
- # args[:limit] && stars = stars.limit(args[:limit])
18
- # stars
19
- # }
20
- # end
21
- # end
22
- #
23
- class ObjectType < GraphQL::BaseType
24
- accepts_definitions :interfaces, field: GraphQL::Define::AssignObjectField
25
- attr_accessor :name, :description
26
-
27
- # @return [Hash<String => GraphQL::Field>] Map String fieldnames to their {GraphQL::Field} implementations
28
- attr_accessor :fields
29
-
30
- def initialize
31
- @fields = {}
32
- @dirty_interfaces = []
33
- end
34
-
35
- # @param new_interfaces [Array<GraphQL::Interface>] interfaces that this type implements
36
- def interfaces=(new_interfaces)
37
- @clean_interfaces = nil
38
- @dirty_interfaces = new_interfaces
39
- end
40
-
41
- def interfaces
42
- @clean_interfaces ||= begin
43
- @dirty_interfaces.map { |i_type| GraphQL::BaseType.resolve_related_type(i_type) }
44
- rescue
45
- @dirty_interfaces
46
- end
47
- end
48
-
49
- def kind
50
- GraphQL::TypeKinds::OBJECT
51
- end
52
-
53
- # @return [GraphQL::Field] The field definition for `field_name` (may be inherited from interfaces)
54
- def get_field(field_name)
55
- fields[field_name] || interface_fields[field_name]
56
- end
57
-
58
- # @return [Array<GraphQL::Field>] All fields, including ones inherited from interfaces
59
- def all_fields
60
- interface_fields.merge(self.fields).values
61
- end
62
-
63
- private
64
-
65
- # Create a {name => defn} hash for fields inherited from interfaces
66
- def interface_fields
67
- interfaces.reduce({}) do |memo, iface|
68
- memo.merge!(iface.fields)
69
- end
70
- end
71
-
72
-
73
- # Error raised when the value provided for a field can't be resolved to one of the possible types
74
- # for the field.
75
- class UnresolvedTypeError < GraphQL::Error
76
- attr_reader :field_name, :field_type, :parent_type
77
-
78
- def initialize(field_name, field_type, parent_type)
79
- @field_name = field_name
80
- @field_type = field_type
81
- @parent_type = parent_type
82
- super(exception_message)
83
- end
84
-
85
- private
86
-
87
- def exception_message
88
- "The value returned for field #{field_name} on #{parent_type} could not be resolved "\
89
- "to one of the possible types for #{field_type}."
90
- end
91
- end
92
- end
93
- end
@@ -1,76 +0,0 @@
1
- module GraphQL
2
- class Query
3
- # Read-only access to values, normalizing all keys to strings
4
- #
5
- # {Arguments} recursively wraps the input in {Arguments} instances.
6
- class Arguments
7
- extend Forwardable
8
-
9
- def initialize(values)
10
- @original_values = values
11
- @argument_values = values.inject({}) do |memo, (inner_key, inner_value)|
12
- memo[inner_key.to_s] = wrap_value(inner_value)
13
- memo
14
- end
15
- end
16
-
17
- # @param [String, Symbol] name or index of value to access
18
- # @return [Object] the argument at that key
19
- def [](key)
20
- @argument_values[key.to_s]
21
- end
22
-
23
- # Get the original Ruby hash
24
- # @return [Hash] the original values hash
25
- def to_h
26
- @unwrapped_values ||= unwrap_value(@original_values)
27
- end
28
-
29
- def_delegators :string_key_values, :keys, :values, :each
30
-
31
- private
32
-
33
- def wrap_value(value)
34
- case value
35
- when Array
36
- value.map { |item| wrap_value(item) }
37
- when Hash
38
- self.class.new(value)
39
- else
40
- value
41
- end
42
- end
43
-
44
- def unwrap_value(value)
45
- case value
46
- when Array
47
- value.map { |item| unwrap_value(item) }
48
- when Hash
49
- value.inject({}) do |memo, (key, value)|
50
- memo[key] = unwrap_value(value)
51
- memo
52
- end
53
- when GraphQL::Query::Arguments
54
- value.to_h
55
- else
56
- value
57
- end
58
- end
59
-
60
- def string_key_values
61
- @string_key_values ||= stringify_keys(to_h)
62
- end
63
-
64
- def stringify_keys(value)
65
- case value
66
- when Hash
67
- value.inject({}) { |memo, (k, v)| memo[k.to_s] = stringify_keys(v); memo }
68
- when Array
69
- value.map { |v| stringify_keys(v) }
70
- else
71
- value
72
- end
73
- end
74
- end
75
- end
76
- end
@@ -1,16 +0,0 @@
1
- module GraphQL
2
- class Query
3
- module DirectiveResolution
4
- def self.include_node?(irep_node, query)
5
- irep_node.directives.each do |directive_node|
6
- directive_defn = directive_node.definition
7
- args = query.arguments_for(directive_node)
8
- if !directive_defn.include?(args)
9
- return false
10
- end
11
- end
12
- true
13
- end
14
- end
15
- end
16
- end
@@ -1,45 +0,0 @@
1
- module GraphQL
2
- class Query
3
- class Executor
4
- # @return [GraphQL::Query] the query being executed
5
- attr_reader :query
6
-
7
- def initialize(query)
8
- @query = query
9
- end
10
-
11
- # Evalute {operation_name} on {query}.
12
- # Handle {GraphQL::ExecutionError}s by putting them in the "errors" key.
13
- # @return [Hash] A GraphQL response, with either a "data" key or an "errors" key
14
- def result
15
- execute
16
- rescue GraphQL::ExecutionError => err
17
- query.context.errors << err
18
- {"errors" => [err.to_h]}
19
- end
20
-
21
- private
22
-
23
- def execute
24
- operation = query.selected_operation
25
- return {} if operation.nil?
26
-
27
- op_type = operation.operation_type
28
- root_type = query.schema.root_type_for_operation(op_type)
29
- execution_strategy_class = query.schema.execution_strategy_for_operation(op_type)
30
- execution_strategy = execution_strategy_class.new
31
-
32
- query.context.execution_strategy = execution_strategy
33
- data_result = execution_strategy.execute(operation, root_type, query)
34
- result = { "data" => data_result }
35
- error_result = query.context.errors.map(&:to_h)
36
-
37
- if error_result.any?
38
- result["errors"] = error_result
39
- end
40
-
41
- result
42
- end
43
- end
44
- end
45
- end