rails-graphql 0.2.1 → 1.0.0.beta

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (297) hide show
  1. checksums.yaml +4 -4
  2. data/ext/console.rb +18 -0
  3. data/ext/extconf.h +3 -0
  4. data/ext/extconf.rb +1 -54
  5. data/ext/gql_parser.c +646 -0
  6. data/ext/shared.c +482 -0
  7. data/ext/shared.h +177 -0
  8. data/lib/gql_parser.so +0 -0
  9. data/lib/rails/graphql/adapters/mysql_adapter.rb +59 -0
  10. data/lib/rails/graphql/adapters/pg_adapter.rb +25 -22
  11. data/lib/rails/graphql/adapters/sqlite_adapter.rb +17 -14
  12. data/lib/rails/graphql/alternative/field_set.rb +36 -0
  13. data/lib/rails/graphql/alternative/mutation.rb +17 -0
  14. data/lib/rails/graphql/alternative/query.rb +93 -0
  15. data/lib/rails/graphql/alternative/subscription.rb +17 -0
  16. data/lib/rails/graphql/alternative.rb +20 -0
  17. data/lib/rails/graphql/argument.rb +21 -24
  18. data/lib/rails/graphql/callback.rb +24 -9
  19. data/lib/rails/graphql/collectors/hash_collector.rb +14 -6
  20. data/lib/rails/graphql/collectors/idented_collector.rb +10 -7
  21. data/lib/rails/graphql/collectors/json_collector.rb +22 -17
  22. data/lib/rails/graphql/collectors.rb +4 -4
  23. data/lib/rails/graphql/config.rb +130 -15
  24. data/lib/rails/graphql/directive/cached_directive.rb +33 -0
  25. data/lib/rails/graphql/directive/deprecated_directive.rb +10 -10
  26. data/lib/rails/graphql/directive/include_directive.rb +5 -4
  27. data/lib/rails/graphql/directive/skip_directive.rb +5 -4
  28. data/lib/rails/graphql/directive.rb +118 -63
  29. data/lib/rails/graphql/errors.rb +33 -4
  30. data/lib/rails/graphql/event.rb +16 -5
  31. data/lib/rails/graphql/field/authorized_field.rb +19 -3
  32. data/lib/rails/graphql/field/input_field.rb +11 -10
  33. data/lib/rails/graphql/field/mutation_field.rb +42 -7
  34. data/lib/rails/graphql/field/output_field.rb +102 -13
  35. data/lib/rails/graphql/field/proxied_field.rb +31 -22
  36. data/lib/rails/graphql/field/resolved_field.rb +26 -24
  37. data/lib/rails/graphql/field/scoped_config.rb +10 -4
  38. data/lib/rails/graphql/field/subscription_field.rb +140 -0
  39. data/lib/rails/graphql/field/typed_field.rb +43 -22
  40. data/lib/rails/graphql/field.rb +70 -56
  41. data/lib/rails/graphql/global_id.rb +85 -0
  42. data/lib/rails/graphql/helpers/attribute_delegator.rb +5 -5
  43. data/lib/rails/graphql/helpers/inherited_collection/array.rb +50 -0
  44. data/lib/rails/graphql/helpers/inherited_collection/base.rb +43 -0
  45. data/lib/rails/graphql/helpers/inherited_collection/hash.rb +87 -0
  46. data/lib/rails/graphql/helpers/inherited_collection.rb +25 -76
  47. data/lib/rails/graphql/helpers/instantiable.rb +15 -0
  48. data/lib/rails/graphql/helpers/leaf_from_ar.rb +7 -7
  49. data/lib/rails/graphql/helpers/registerable.rb +44 -62
  50. data/lib/rails/graphql/helpers/unregisterable.rb +16 -0
  51. data/lib/rails/graphql/helpers/with_arguments.rb +31 -27
  52. data/lib/rails/graphql/helpers/with_assignment.rb +6 -6
  53. data/lib/rails/graphql/helpers/with_callbacks.rb +25 -8
  54. data/lib/rails/graphql/helpers/with_description.rb +71 -0
  55. data/lib/rails/graphql/helpers/with_directives.rb +54 -30
  56. data/lib/rails/graphql/helpers/with_events.rb +21 -23
  57. data/lib/rails/graphql/helpers/with_fields.rb +76 -22
  58. data/lib/rails/graphql/helpers/with_global_id.rb +22 -0
  59. data/lib/rails/graphql/helpers/with_name.rb +43 -0
  60. data/lib/rails/graphql/helpers/with_namespace.rb +7 -4
  61. data/lib/rails/graphql/helpers/with_owner.rb +8 -7
  62. data/lib/rails/graphql/helpers/with_schema_fields.rb +137 -55
  63. data/lib/rails/graphql/helpers/with_validator.rb +9 -9
  64. data/lib/rails/graphql/helpers.rb +10 -3
  65. data/lib/rails/graphql/introspection.rb +43 -36
  66. data/lib/rails/graphql/railtie.rb +88 -33
  67. data/lib/rails/graphql/railties/base_generator.rb +3 -9
  68. data/lib/rails/graphql/railties/channel.rb +157 -0
  69. data/lib/rails/graphql/railties/controller.rb +62 -17
  70. data/lib/rails/graphql/railties/controller_runtime.rb +5 -5
  71. data/lib/rails/graphql/railties/log_subscriber.rb +81 -14
  72. data/lib/rails/graphql/request/arguments.rb +24 -49
  73. data/lib/rails/graphql/request/backtrace.rb +191 -0
  74. data/lib/rails/graphql/request/component/field.rb +86 -65
  75. data/lib/rails/graphql/request/component/fragment.rb +72 -24
  76. data/lib/rails/graphql/request/component/operation/subscription.rb +164 -4
  77. data/lib/rails/graphql/request/component/operation.rb +63 -31
  78. data/lib/rails/graphql/request/component/spread.rb +68 -25
  79. data/lib/rails/graphql/request/component/typename.rb +27 -12
  80. data/lib/rails/graphql/request/component.rb +75 -36
  81. data/lib/rails/graphql/request/context.rb +18 -8
  82. data/lib/rails/graphql/request/errors.rb +16 -6
  83. data/lib/rails/graphql/request/event.rb +19 -8
  84. data/lib/rails/graphql/request/helpers/directives.rb +68 -27
  85. data/lib/rails/graphql/request/helpers/selection_set.rb +51 -25
  86. data/lib/rails/graphql/request/helpers/value_writers.rb +18 -16
  87. data/lib/rails/graphql/request/prepared_data.rb +98 -0
  88. data/lib/rails/graphql/request/steps/authorizable.rb +24 -14
  89. data/lib/rails/graphql/request/steps/organizable.rb +110 -48
  90. data/lib/rails/graphql/request/steps/{prepareable.rb → preparable.rb} +20 -7
  91. data/lib/rails/graphql/request/steps/{resolveable.rb → resolvable.rb} +15 -6
  92. data/lib/rails/graphql/request/strategy/cached_strategy.rb +64 -0
  93. data/lib/rails/graphql/request/strategy/dynamic_instance.rb +6 -6
  94. data/lib/rails/graphql/request/strategy/multi_query_strategy.rb +6 -13
  95. data/lib/rails/graphql/request/strategy/sequenced_strategy.rb +9 -9
  96. data/lib/rails/graphql/request/strategy.rb +131 -75
  97. data/lib/rails/graphql/request/subscription.rb +80 -0
  98. data/lib/rails/graphql/request.rb +305 -86
  99. data/lib/rails/graphql/schema.rb +240 -48
  100. data/lib/rails/graphql/shortcuts.rb +22 -3
  101. data/lib/rails/graphql/source/active_record/builders.rb +49 -35
  102. data/lib/rails/graphql/source/active_record_source.rb +70 -54
  103. data/lib/rails/graphql/source/base.rb +111 -0
  104. data/lib/rails/graphql/source/builder.rb +128 -0
  105. data/lib/rails/graphql/source/scoped_arguments.rb +31 -19
  106. data/lib/rails/graphql/source.rb +89 -213
  107. data/lib/rails/graphql/subscription/provider/action_cable.rb +112 -0
  108. data/lib/rails/graphql/subscription/provider/base.rb +191 -0
  109. data/lib/rails/graphql/subscription/provider.rb +18 -0
  110. data/lib/rails/graphql/subscription/store/base.rb +145 -0
  111. data/lib/rails/graphql/subscription/store/memory.rb +127 -0
  112. data/lib/rails/graphql/subscription/store.rb +19 -0
  113. data/lib/rails/graphql/subscription.rb +17 -0
  114. data/lib/rails/graphql/to_gql.rb +29 -32
  115. data/lib/rails/graphql/type/enum/directive_location_enum.rb +11 -11
  116. data/lib/rails/graphql/type/enum/type_kind_enum.rb +3 -3
  117. data/lib/rails/graphql/type/enum.rb +34 -48
  118. data/lib/rails/graphql/type/input.rb +74 -23
  119. data/lib/rails/graphql/type/interface.rb +16 -26
  120. data/lib/rails/graphql/type/object/directive_object.rb +4 -4
  121. data/lib/rails/graphql/type/object/enum_value_object.rb +3 -3
  122. data/lib/rails/graphql/type/object/field_object.rb +24 -6
  123. data/lib/rails/graphql/type/object/input_value_object.rb +3 -3
  124. data/lib/rails/graphql/type/object/schema_object.rb +5 -8
  125. data/lib/rails/graphql/type/object/type_object.rb +29 -19
  126. data/lib/rails/graphql/type/object.rb +26 -23
  127. data/lib/rails/graphql/type/scalar/any_scalar.rb +30 -0
  128. data/lib/rails/graphql/type/scalar/bigint_scalar.rb +5 -5
  129. data/lib/rails/graphql/type/scalar/binary_scalar.rb +3 -3
  130. data/lib/rails/graphql/type/scalar/boolean_scalar.rb +8 -8
  131. data/lib/rails/graphql/type/scalar/date_scalar.rb +3 -3
  132. data/lib/rails/graphql/type/scalar/date_time_scalar.rb +3 -3
  133. data/lib/rails/graphql/type/scalar/decimal_scalar.rb +3 -3
  134. data/lib/rails/graphql/type/scalar/float_scalar.rb +5 -5
  135. data/lib/rails/graphql/type/scalar/id_scalar.rb +6 -5
  136. data/lib/rails/graphql/type/scalar/int_scalar.rb +6 -5
  137. data/lib/rails/graphql/type/scalar/json_scalar.rb +39 -0
  138. data/lib/rails/graphql/type/scalar/string_scalar.rb +18 -4
  139. data/lib/rails/graphql/type/scalar/time_scalar.rb +5 -5
  140. data/lib/rails/graphql/type/scalar.rb +25 -22
  141. data/lib/rails/graphql/type/union.rb +14 -16
  142. data/lib/rails/graphql/type.rb +34 -25
  143. data/lib/rails/graphql/type_map.rb +256 -164
  144. data/lib/rails/graphql/uri.rb +166 -0
  145. data/lib/rails/graphql/version.rb +15 -3
  146. data/lib/rails/graphql.rake +3 -0
  147. data/lib/rails/graphql.rb +85 -52
  148. data/lib/rails-graphql.rb +1 -1
  149. data/test/assets/en.yml +29 -0
  150. data/test/assets/introspection-mem.txt +1 -1
  151. data/test/assets/mem.gql +18 -45
  152. data/test/assets/mysql.gql +392 -0
  153. data/test/assets/sqlite.gql +21 -12
  154. data/test/assets/translate.gql +335 -0
  155. data/test/config.rb +18 -8
  156. data/test/graphql/schema_test.rb +12 -19
  157. data/test/graphql/source_test.rb +8 -75
  158. data/test/graphql/type/enum_test.rb +207 -203
  159. data/test/graphql/type/input_test.rb +14 -9
  160. data/test/graphql/type/interface_test.rb +4 -4
  161. data/test/graphql/type/scalar/any_scalar_test.rb +38 -0
  162. data/test/graphql/type/scalar/boolean_scalar_test.rb +6 -3
  163. data/test/graphql/type/scalar/json_scalar_test.rb +23 -0
  164. data/test/graphql/type_map_test.rb +51 -66
  165. data/test/graphql/type_test.rb +0 -19
  166. data/test/graphql_test.rb +1 -1
  167. data/test/integration/{authorization/authorization_test.rb → authorization_test.rb} +40 -14
  168. data/test/integration/config.rb +36 -3
  169. data/test/integration/customization_test.rb +39 -0
  170. data/test/integration/global_id_test.rb +99 -0
  171. data/test/integration/memory/star_wars_introspection_test.rb +24 -16
  172. data/test/integration/memory/star_wars_query_test.rb +54 -3
  173. data/test/integration/memory/star_wars_validation_test.rb +1 -1
  174. data/test/integration/mysql/star_wars_introspection_test.rb +25 -0
  175. data/test/integration/persisted_query_test.rb +87 -0
  176. data/test/integration/resolver_precedence_test.rb +154 -0
  177. data/test/integration/schemas/memory.rb +22 -7
  178. data/test/integration/schemas/mysql.rb +62 -0
  179. data/test/integration/schemas/sqlite.rb +21 -12
  180. data/test/integration/sqlite/star_wars_global_id_test.rb +83 -0
  181. data/test/integration/sqlite/star_wars_introspection_test.rb +10 -0
  182. data/test/integration/sqlite/star_wars_query_test.rb +14 -1
  183. data/test/integration/translate_test.rb +61 -0
  184. data/test/test_ext.rb +16 -13
  185. metadata +108 -157
  186. data/ext/depend +0 -3
  187. data/ext/graphqlparser/Ast.cpp +0 -346
  188. data/ext/graphqlparser/Ast.h +0 -1214
  189. data/ext/graphqlparser/AstNode.h +0 -36
  190. data/ext/graphqlparser/AstVisitor.h +0 -137
  191. data/ext/graphqlparser/GraphQLParser.cpp +0 -76
  192. data/ext/graphqlparser/GraphQLParser.h +0 -55
  193. data/ext/graphqlparser/JsonVisitor.cpp +0 -161
  194. data/ext/graphqlparser/JsonVisitor.cpp.inc +0 -456
  195. data/ext/graphqlparser/JsonVisitor.h +0 -121
  196. data/ext/graphqlparser/JsonVisitor.h.inc +0 -110
  197. data/ext/graphqlparser/VERSION +0 -1
  198. data/ext/graphqlparser/c/GraphQLAst.cpp +0 -324
  199. data/ext/graphqlparser/c/GraphQLAst.h +0 -180
  200. data/ext/graphqlparser/c/GraphQLAstForEachConcreteType.h +0 -44
  201. data/ext/graphqlparser/c/GraphQLAstNode.cpp +0 -25
  202. data/ext/graphqlparser/c/GraphQLAstNode.h +0 -33
  203. data/ext/graphqlparser/c/GraphQLAstToJSON.cpp +0 -21
  204. data/ext/graphqlparser/c/GraphQLAstToJSON.h +0 -24
  205. data/ext/graphqlparser/c/GraphQLAstVisitor.cpp +0 -55
  206. data/ext/graphqlparser/c/GraphQLAstVisitor.h +0 -53
  207. data/ext/graphqlparser/c/GraphQLParser.cpp +0 -35
  208. data/ext/graphqlparser/c/GraphQLParser.h +0 -54
  209. data/ext/graphqlparser/dump_json_ast.cpp +0 -48
  210. data/ext/graphqlparser/lexer.lpp +0 -324
  211. data/ext/graphqlparser/parser.ypp +0 -693
  212. data/ext/graphqlparser/parsergen/lexer.cpp +0 -2633
  213. data/ext/graphqlparser/parsergen/lexer.h +0 -528
  214. data/ext/graphqlparser/parsergen/location.hh +0 -189
  215. data/ext/graphqlparser/parsergen/parser.tab.cpp +0 -3300
  216. data/ext/graphqlparser/parsergen/parser.tab.hpp +0 -646
  217. data/ext/graphqlparser/parsergen/position.hh +0 -179
  218. data/ext/graphqlparser/parsergen/stack.hh +0 -156
  219. data/ext/graphqlparser/syntaxdefs.h +0 -19
  220. data/ext/libgraphqlparser/AstNode.h +0 -36
  221. data/ext/libgraphqlparser/CMakeLists.txt +0 -148
  222. data/ext/libgraphqlparser/CONTRIBUTING.md +0 -23
  223. data/ext/libgraphqlparser/GraphQLParser.cpp +0 -76
  224. data/ext/libgraphqlparser/GraphQLParser.h +0 -55
  225. data/ext/libgraphqlparser/JsonVisitor.cpp +0 -161
  226. data/ext/libgraphqlparser/JsonVisitor.h +0 -121
  227. data/ext/libgraphqlparser/LICENSE +0 -22
  228. data/ext/libgraphqlparser/README.clang-tidy +0 -7
  229. data/ext/libgraphqlparser/README.md +0 -84
  230. data/ext/libgraphqlparser/ast/ast.ast +0 -203
  231. data/ext/libgraphqlparser/ast/ast.py +0 -61
  232. data/ext/libgraphqlparser/ast/c.py +0 -100
  233. data/ext/libgraphqlparser/ast/c.pyc +0 -0
  234. data/ext/libgraphqlparser/ast/c_impl.py +0 -61
  235. data/ext/libgraphqlparser/ast/c_impl.pyc +0 -0
  236. data/ext/libgraphqlparser/ast/c_visitor_impl.py +0 -39
  237. data/ext/libgraphqlparser/ast/c_visitor_impl.pyc +0 -0
  238. data/ext/libgraphqlparser/ast/casing.py +0 -26
  239. data/ext/libgraphqlparser/ast/casing.pyc +0 -0
  240. data/ext/libgraphqlparser/ast/cxx.py +0 -197
  241. data/ext/libgraphqlparser/ast/cxx.pyc +0 -0
  242. data/ext/libgraphqlparser/ast/cxx_impl.py +0 -61
  243. data/ext/libgraphqlparser/ast/cxx_impl.pyc +0 -0
  244. data/ext/libgraphqlparser/ast/cxx_json_visitor_header.py +0 -42
  245. data/ext/libgraphqlparser/ast/cxx_json_visitor_header.pyc +0 -0
  246. data/ext/libgraphqlparser/ast/cxx_json_visitor_impl.py +0 -80
  247. data/ext/libgraphqlparser/ast/cxx_json_visitor_impl.pyc +0 -0
  248. data/ext/libgraphqlparser/ast/cxx_visitor.py +0 -64
  249. data/ext/libgraphqlparser/ast/cxx_visitor.pyc +0 -0
  250. data/ext/libgraphqlparser/ast/js.py +0 -65
  251. data/ext/libgraphqlparser/ast/license.py +0 -10
  252. data/ext/libgraphqlparser/ast/license.pyc +0 -0
  253. data/ext/libgraphqlparser/c/GraphQLAstNode.cpp +0 -25
  254. data/ext/libgraphqlparser/c/GraphQLAstNode.h +0 -33
  255. data/ext/libgraphqlparser/c/GraphQLAstToJSON.cpp +0 -21
  256. data/ext/libgraphqlparser/c/GraphQLAstToJSON.h +0 -24
  257. data/ext/libgraphqlparser/c/GraphQLAstVisitor.cpp +0 -55
  258. data/ext/libgraphqlparser/c/GraphQLAstVisitor.h +0 -53
  259. data/ext/libgraphqlparser/c/GraphQLParser.cpp +0 -35
  260. data/ext/libgraphqlparser/c/GraphQLParser.h +0 -54
  261. data/ext/libgraphqlparser/clang-tidy-all.sh +0 -3
  262. data/ext/libgraphqlparser/cmake/version.cmake +0 -16
  263. data/ext/libgraphqlparser/dump_json_ast.cpp +0 -48
  264. data/ext/libgraphqlparser/go/README.md +0 -20
  265. data/ext/libgraphqlparser/go/callbacks.go +0 -18
  266. data/ext/libgraphqlparser/go/gotest.go +0 -64
  267. data/ext/libgraphqlparser/lexer.lpp +0 -324
  268. data/ext/libgraphqlparser/libgraphqlparser.pc.in +0 -11
  269. data/ext/libgraphqlparser/parser.ypp +0 -693
  270. data/ext/libgraphqlparser/parsergen/lexer.cpp +0 -2633
  271. data/ext/libgraphqlparser/parsergen/lexer.h +0 -528
  272. data/ext/libgraphqlparser/parsergen/location.hh +0 -189
  273. data/ext/libgraphqlparser/parsergen/parser.tab.cpp +0 -3300
  274. data/ext/libgraphqlparser/parsergen/parser.tab.hpp +0 -646
  275. data/ext/libgraphqlparser/parsergen/position.hh +0 -179
  276. data/ext/libgraphqlparser/parsergen/stack.hh +0 -156
  277. data/ext/libgraphqlparser/python/CMakeLists.txt +0 -14
  278. data/ext/libgraphqlparser/python/README.md +0 -5
  279. data/ext/libgraphqlparser/python/example.py +0 -31
  280. data/ext/libgraphqlparser/syntaxdefs.h +0 -19
  281. data/ext/libgraphqlparser/test/BuildCAPI.c +0 -5
  282. data/ext/libgraphqlparser/test/CMakeLists.txt +0 -25
  283. data/ext/libgraphqlparser/test/JsonVisitorTests.cpp +0 -28
  284. data/ext/libgraphqlparser/test/ParserTests.cpp +0 -352
  285. data/ext/libgraphqlparser/test/kitchen-sink.graphql +0 -59
  286. data/ext/libgraphqlparser/test/kitchen-sink.json +0 -1
  287. data/ext/libgraphqlparser/test/schema-kitchen-sink.graphql +0 -78
  288. data/ext/libgraphqlparser/test/schema-kitchen-sink.json +0 -1
  289. data/ext/libgraphqlparser/test/valgrind.supp +0 -33
  290. data/ext/version.cpp +0 -21
  291. data/lib/graphqlparser.so +0 -0
  292. data/lib/rails/graphql/native/functions.rb +0 -38
  293. data/lib/rails/graphql/native/location.rb +0 -41
  294. data/lib/rails/graphql/native/pointers.rb +0 -23
  295. data/lib/rails/graphql/native/visitor.rb +0 -349
  296. data/lib/rails/graphql/native.rb +0 -56
  297. data/test/integration/schemas/authorization.rb +0 -12
@@ -1,10 +1,12 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module Rails # :nodoc:
4
- module GraphQL # :nodoc:
5
- class Type # :nodoc:
3
+ module Rails
4
+ module GraphQL
5
+ class Type
6
6
  # The introspection object for any kind of type
7
7
  class Object::TypeObject < Object
8
+ # List and not null are not actually types, but they still need to
9
+ # some how exist for introspection purposes
8
10
  FAKE_TYPES = {
9
11
  list: {
10
12
  kind: :list,
@@ -88,47 +90,55 @@ module Rails # :nodoc:
88
90
  desc: 'NON_NULL and LIST only'
89
91
 
90
92
  def fields(include_deprecated:)
91
- return [] unless current.object? || current.interface?
93
+ return EMPTY_ARRAY unless current.object? || current.interface?
92
94
 
93
- list = current.fields.enum_for(:each_value)
94
- list = list.reject { |field| field.using?(deprecated_directive) } \
95
- unless include_deprecated
95
+ list =
96
+ if current.respond_to?(:enabled_fields)
97
+ current.enabled_fields
98
+ else
99
+ current.fields.values.select(&:enabled?)
100
+ end
96
101
 
97
- list
102
+ unless include_deprecated
103
+ list = list.reject { |field| field.using?(deprecated_directive) }
104
+ end
105
+
106
+ list.reject(&:internal?).sort_by do |field|
107
+ (field.name == :id) ? '' : field.gql_name
108
+ end
98
109
  end
99
110
 
100
111
  def enum_values(include_deprecated:)
101
- return [] unless current.enum?
112
+ return EMPTY_ARRAY unless current.enum?
102
113
 
103
- descs = all_value_description
114
+ descriptions = all_value_description
104
115
  deprecated = all_deprecated_values
105
116
 
106
117
  list = all_values.lazy
107
118
  list = list.reject { |value| deprecated.key?(value) } \
108
- unless include_deprecated
119
+ unless include_deprecated || deprecated.nil?
109
120
 
110
121
  list.map do |value|
111
122
  OpenStruct.new(
112
123
  name: value,
113
- description: descs[value],
114
- is_deprecated: deprecated.key?(value),
115
- deprecation_reason: deprecated[value],
124
+ description: descriptions[value],
125
+ is_deprecated: (deprecated.nil? ? false : deprecated.key?(value)),
126
+ deprecation_reason: deprecated.try(:[], value),
116
127
  )
117
128
  end
118
129
  end
119
130
 
120
131
  def interfaces
121
- return [] unless current.object?
122
- current.all_interfaces || []
132
+ (current.object? && current.all_interfaces) || EMPTY_ARRAY
123
133
  end
124
134
 
125
135
  def possible_types
126
- return all_types if current.interface?
127
- current.union? ? all_members : []
136
+ (current.interface? && current.all_types) ||
137
+ (current.union? && current.all_members) || EMPTY_ARRAY
128
138
  end
129
139
 
130
140
  def input_fields
131
- current.input? ? current.fields.enum_for(:each_value) : []
141
+ (current.input? && current.enabled_fields) || EMPTY_ARRAY
132
142
  end
133
143
  end
134
144
  end
@@ -1,8 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module Rails # :nodoc:
4
- module GraphQL # :nodoc:
5
- class Type # :nodoc:
3
+ module Rails
4
+ module GraphQL
5
+ class Type
6
6
  # = GraphQL ObjectType
7
7
  #
8
8
  # Objects represent a list of named fields, each of which yield a value of
@@ -13,6 +13,8 @@ module Rails # :nodoc:
13
13
  extend Helpers::WithAssignment
14
14
  extend Helpers::WithFields
15
15
 
16
+ include Helpers::Instantiable
17
+
16
18
  setup! output: true
17
19
 
18
20
  self.field_type = Field::OutputField
@@ -24,30 +26,22 @@ module Rails # :nodoc:
24
26
  Type::Union,
25
27
  ].freeze
26
28
 
27
- eager_autoload do
28
- autoload :DirectiveObject
29
- autoload :EnumValueObject
30
- autoload :FieldObject
31
- autoload :InputValueObject
32
- autoload :SchemaObject
33
- autoload :TypeObject
34
- end
29
+ autoload :DirectiveObject
30
+ autoload :EnumValueObject
31
+ autoload :FieldObject
32
+ autoload :InputValueObject
33
+ autoload :SchemaObject
34
+ autoload :TypeObject
35
35
 
36
36
  # Define the methods for accessing the interfaces of the object
37
37
  inherited_collection :interfaces, instance_reader: false
38
38
 
39
- # The purpose of instantiating an object is to have access to its
40
- # public methods. It then runs from the strategy perspective, pointing
41
- # out any other methods to the manually set event
42
- delegate_missing_to :event
43
- attr_reader :event
44
-
45
39
  class << self
46
40
  # Plain objects can check if a given value is a valid member
47
41
  def valid_member?(value)
48
42
  return true if valid_assignment?(value)
49
- checker = value.is_a?(Hash) ? :key? : :respond_to?
50
- value = value.with_indifferent_access if value.is_a?(Hash)
43
+ checker = value.is_a?(::Hash) ? :key? : :respond_to?
44
+ value = value.with_indifferent_access if value.is_a?(::Hash)
51
45
  fields.values.all? { |field| value.public_send(checker, field.method_name) }
52
46
  end
53
47
 
@@ -61,14 +55,13 @@ module Rails # :nodoc:
61
55
  def implements(*others)
62
56
  return if others.blank?
63
57
 
64
- cache = all_interfaces.dup
58
+ current = all_interfaces&.dup
65
59
  others.flat_map do |item|
66
60
  item = find_interface!(item)
67
- next if cache.include?(item)
61
+ next if current&.include?(item) || interfaces.include?(item)
68
62
 
69
63
  item.implemented(self)
70
64
  interfaces << item
71
- cache << item
72
65
  end
73
66
  end
74
67
 
@@ -77,6 +70,16 @@ module Rails # :nodoc:
77
70
  (object = find_interface(interface)).present? && all_interfaces.include?(object)
78
71
  end
79
72
 
73
+ def inspect
74
+ return super if self.eql?(Type::Object)
75
+ fields = @fields.values.map(&:inspect)
76
+ fields = fields.presence && +" {#{fields.join(', ')}}"
77
+
78
+ directives = inspect_directives
79
+ directives.prepend(' ') if directives.present?
80
+ +"#<GraphQL::Object #{gql_name}#{fields}#{directives}>"
81
+ end
82
+
80
83
  private
81
84
 
82
85
  # Soft find an object as an +interface+
@@ -94,7 +97,7 @@ module Rails # :nodoc:
94
97
  ) unless object.is_a?(Module) && object < Type::Interface
95
98
 
96
99
  return object if object.try(:interface?)
97
- raise ArgumentError, <<~MSG.squish
100
+ raise ArgumentError, (+<<~MSG).squish
98
101
  The given "#{object}" is not a valid interface.
99
102
  MSG
100
103
  end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Rails
4
+ module GraphQL
5
+ class Type
6
+ # Handles any type of data for both input and output
7
+ class Scalar::AnyScalar < Scalar
8
+ desc 'The Any scalar type allows anything for both input and output.'
9
+
10
+ class << self
11
+ def valid_input?(value)
12
+ true
13
+ end
14
+
15
+ def valid_output?(value)
16
+ true
17
+ end
18
+
19
+ def to_json(value)
20
+ value.to_json
21
+ end
22
+
23
+ def as_json(value)
24
+ value.as_json
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -1,14 +1,14 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module Rails # :nodoc:
4
- module GraphQL # :nodoc:
5
- class Type # :nodoc:
3
+ module Rails
4
+ module GraphQL
5
+ class Type
6
6
  # Bigint basically removes the limit of the value, but it serializes as
7
7
  # a string so it won't go against the spec
8
8
  class Scalar::BigintScalar < Scalar
9
9
  desc <<~DESC
10
- The Bigint scalar type represents a signed numeric nonfractional value.
11
- It can go beyond the Int 32bit limit, but it's exchanged as a string.
10
+ The Bigint scalar type represents a signed numeric non-fractional value.
11
+ It can go beyond the Int 32-bit limit, but it's exchanged as a string.
12
12
  DESC
13
13
 
14
14
  class << self
@@ -1,8 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module Rails # :nodoc:
4
- module GraphQL # :nodoc:
5
- class Type # :nodoc:
3
+ module Rails
4
+ module GraphQL
5
+ class Type
6
6
  # Binary basically allows binary data to be shared using Base64 strings,
7
7
  # ensuring the UTF-8 encoding and performing the necessary conversion.
8
8
  #
@@ -1,8 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module Rails # :nodoc:
4
- module GraphQL # :nodoc:
5
- class Type # :nodoc:
3
+ module Rails
4
+ module GraphQL
5
+ class Type
6
6
  # The Boolean scalar type represents +true+ or +false+.
7
7
  #
8
8
  # See http://spec.graphql.org/June2018/#sec-Boolean
@@ -16,19 +16,19 @@ module Rails # :nodoc:
16
16
 
17
17
  class << self
18
18
  def valid_input?(value)
19
- value === true || value === false
19
+ valid_token?(value) || value === true || value === false
20
20
  end
21
21
 
22
- def valid_output?(value)
23
- value.respond_to?(:present?)
22
+ def valid_output?(*)
23
+ true # Pretty much anything can be turned into a boolean
24
24
  end
25
25
 
26
26
  def as_json(value)
27
- value.present?
27
+ !(value.nil? || FALSE_VALUES.include?(value))
28
28
  end
29
29
 
30
30
  def deserialize(value)
31
- !FALSE_VALUES.include?(value)
31
+ as_json(value)
32
32
  end
33
33
  end
34
34
  end
@@ -1,8 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module Rails # :nodoc:
4
- module GraphQL # :nodoc:
5
- class Type # :nodoc:
3
+ module Rails
4
+ module GraphQL
5
+ class Type
6
6
  # Date uses a ISO 8601 string to exchange the value.
7
7
  class Scalar::DateScalar < Scalar
8
8
  desc 'The Date scalar type represents a ISO 8601 string value.'
@@ -1,8 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module Rails # :nodoc:
4
- module GraphQL # :nodoc:
5
- class Type # :nodoc:
3
+ module Rails
4
+ module GraphQL
5
+ class Type
6
6
  # DateTime uses a ISO 8601 string to exchange the value.
7
7
  class Scalar::DateTimeScalar < Scalar
8
8
  aliases :datetime
@@ -1,8 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module Rails # :nodoc:
4
- module GraphQL # :nodoc:
5
- class Type # :nodoc:
3
+ module Rails
4
+ module GraphQL
5
+ class Type
6
6
  # Similar to float, but implies extra precision, making sure that all the
7
7
  # decimal-point numbers are kept. As Bigint, it uses a string so it won't
8
8
  # go against the spec.
@@ -1,8 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module Rails # :nodoc:
4
- module GraphQL # :nodoc:
5
- class Type # :nodoc:
3
+ module Rails
4
+ module GraphQL
5
+ class Type
6
6
  # The Float scalar type represents signed double-precision fractional
7
7
  # values as specified by
8
8
  # {IEEE 754}[http://en.wikipedia.org/wiki/IEEE_floating_point].
@@ -11,11 +11,11 @@ module Rails # :nodoc:
11
11
  class Scalar::FloatScalar < Scalar
12
12
  self.spec_object = true
13
13
 
14
- desc 'The Float scalar type represents signed doubleprecision fractional values.'
14
+ desc 'The Float scalar type represents signed double-precision fractional values.'
15
15
 
16
16
  class << self
17
17
  def valid_input?(value)
18
- value.is_a?(Float)
18
+ valid_token?(value) || value.is_a?(Float)
19
19
  end
20
20
 
21
21
  def valid_output?(value)
@@ -1,8 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module Rails # :nodoc:
4
- module GraphQL # :nodoc:
5
- class Type # :nodoc:
3
+ module Rails
4
+ module GraphQL
5
+ class Type
6
6
  # The ID scalar type represents a unique identifier, often used to
7
7
  # refetch an object or as the key for a cache. The ID type is serialized
8
8
  # in the same way as a +StringScalar+.
@@ -20,7 +20,8 @@ module Rails # :nodoc:
20
20
 
21
21
  class << self
22
22
  def valid_input?(value)
23
- super || value.is_a?(Integer)
23
+ valid_token?(value, :string) || valid_token?(value, :int) ||
24
+ value.is_a?(String) || value.is_a?(Integer)
24
25
  end
25
26
 
26
27
  def as_json(value)
@@ -30,7 +31,7 @@ module Rails # :nodoc:
30
31
  end
31
32
 
32
33
  def deserialize(value)
33
- value.to_s
34
+ valid_token?(value, :string) ? value[1..-2] : value
34
35
  end
35
36
  end
36
37
  end
@@ -1,8 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module Rails # :nodoc:
4
- module GraphQL # :nodoc:
5
- class Type # :nodoc:
3
+ module Rails
4
+ module GraphQL
5
+ class Type
6
6
  # The Int scalar type represents a signed 32-bit numeric
7
7
  # non-fractional value.
8
8
  #
@@ -11,14 +11,15 @@ module Rails # :nodoc:
11
11
  self.spec_object = true
12
12
  aliases :integer
13
13
 
14
- desc 'The Int scalar type represents a signed 32bit numeric nonfractional value.'
14
+ desc 'The Int scalar type represents a signed 32-bit numeric non-fractional value.'
15
15
 
16
16
  max_value = (1 << 31)
17
17
  RANGE = (-max_value...max_value).freeze
18
18
 
19
19
  class << self
20
20
  def valid_input?(value)
21
- value.is_a?(Integer) && RANGE.cover?(value)
21
+ (valid_token?(value) && RANGE.cover?(value.to_i)) ||
22
+ (value.is_a?(Integer) && RANGE.cover?(value))
22
23
  end
23
24
 
24
25
  def valid_output?(value)
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Rails
4
+ module GraphQL
5
+ class Type
6
+ # Handles an unstructured JSON data
7
+ class Scalar::JsonScalar < Scalar
8
+ rename! 'JSON'
9
+
10
+ desc <<~DESC
11
+ The JSON scalar type represents an unstructured JSON data
12
+ with all its available kyes and values.
13
+ DESC
14
+
15
+ class << self
16
+ def valid_input?(value)
17
+ valid_token?(value, :hash) || value.is_a?(::Hash)
18
+ end
19
+
20
+ def valid_output?(value)
21
+ value.is_a?(::Hash)
22
+ end
23
+
24
+ def to_json(value)
25
+ value.to_json
26
+ end
27
+
28
+ def as_json(value)
29
+ value.as_json
30
+ end
31
+
32
+ def deserialize(value)
33
+ value.is_a?(::GQLParser::Token) ? JSON.parse(value) : value
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
@@ -1,8 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module Rails # :nodoc:
4
- module GraphQL # :nodoc:
5
- class Type # :nodoc:
3
+ module Rails
4
+ module GraphQL
5
+ class Type
6
6
  # The String scalar type represents textual data, represented as UTF-8
7
7
  # character sequences.
8
8
  #
@@ -11,16 +11,30 @@ module Rails # :nodoc:
11
11
  self.spec_object = true
12
12
 
13
13
  desc <<~DESC
14
- The String scalar type represents textual data, represented as UTF8 character
14
+ The String scalar type represents textual data, represented as UTF-8 character
15
15
  sequences.
16
16
  DESC
17
17
 
18
18
  class << self
19
+ def valid_input?(value)
20
+ super || valid_token?(value, :heredoc)
21
+ end
22
+
19
23
  def as_json(value)
20
24
  value = value.to_s unless value.is_a?(String)
21
25
  value = value.encode(Encoding::UTF_8) unless value.encoding.eql?(Encoding::UTF_8)
22
26
  value
23
27
  end
28
+
29
+ def deserialize(value)
30
+ if valid_token?(value, :string)
31
+ value[1..-2] # Remove the quotes
32
+ elsif valid_token?(value, :heredoc)
33
+ value[3..-4].strip_heredoc # Remove the quotes and fix indentation
34
+ else
35
+ value
36
+ end
37
+ end
24
38
  end
25
39
  end
26
40
  end
@@ -1,8 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module Rails # :nodoc:
4
- module GraphQL # :nodoc:
5
- class Type # :nodoc:
3
+ module Rails
4
+ module GraphQL
5
+ class Type
6
6
  # Uses as a float extension in order to transmit times (hours, minutes,
7
7
  # and seconds) as a numeric representation of seconds and milliseconds.
8
8
  class Scalar::TimeScalar < Scalar::FloatScalar
@@ -15,7 +15,7 @@ module Rails # :nodoc:
15
15
 
16
16
  # A +base_object+ helps to identify what methods are actually available
17
17
  # to work as resolvers
18
- class_attribute :precision, instance_writer: false, default: 6
18
+ class_attribute :precision, instance_accessor: false, default: 6
19
19
 
20
20
  class << self
21
21
  def valid_input?(value)
@@ -31,7 +31,7 @@ module Rails # :nodoc:
31
31
  end
32
32
 
33
33
  def deserialize(value)
34
- "#{EPOCH.to_date.iso8601} #{value} UTC".to_time
34
+ (+"#{EPOCH.to_date.iso8601} #{value} UTC").to_time
35
35
  end
36
36
  end
37
37
  end
@@ -1,8 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module Rails # :nodoc:
4
- module GraphQL # :nodoc:
5
- class Type # :nodoc:
3
+ module Rails
4
+ module GraphQL
5
+ class Type
6
6
  # = GraphQL ScalarType
7
7
  #
8
8
  # Scalar types represent primitive leaf values in a GraphQL type system.
@@ -18,27 +18,27 @@ module Rails # :nodoc:
18
18
 
19
19
  setup! leaf: true, input: true, output: true
20
20
 
21
- eager_autoload do
22
- # Load all the default scalar types
23
- autoload :IntScalar
24
- autoload :FloatScalar
25
- autoload :StringScalar
26
- autoload :BooleanScalar
27
- autoload :IdScalar
21
+ # Load all the default scalar types
22
+ autoload :IntScalar
23
+ autoload :FloatScalar
24
+ autoload :StringScalar
25
+ autoload :BooleanScalar
26
+ autoload :IdScalar
28
27
 
29
- # Load all additional scalar types
30
- autoload :BigintScalar
31
- autoload :BinaryScalar
32
- autoload :DateScalar
33
- autoload :DateTimeScalar
34
- autoload :DecimalScalar
35
- autoload :TimeScalar
36
- end
28
+ # Load all additional scalar types
29
+ autoload :AnyScalar
30
+ autoload :BigintScalar
31
+ autoload :BinaryScalar
32
+ autoload :DateScalar
33
+ autoload :DateTimeScalar
34
+ autoload :DecimalScalar
35
+ autoload :JsonScalar
36
+ autoload :TimeScalar
37
37
 
38
38
  class << self
39
39
  # Check if a given value is a valid non-deserialized input
40
40
  def valid_input?(value)
41
- value.is_a?(String)
41
+ valid_token?(value) || value.is_a?(String)
42
42
  end
43
43
 
44
44
  # Check if a given value is a valid non-serialized output
@@ -58,11 +58,14 @@ module Rails # :nodoc:
58
58
 
59
59
  # Turn a user input of this given type into an ruby object
60
60
  def deserialize(value)
61
- value
61
+ value.is_a?(::GQLParser::Token) ? as_json(value) : value
62
62
  end
63
63
 
64
- def inspect # :nodoc:
65
- "#<GraphQL::Scalar #{gql_name}>"
64
+ def inspect
65
+ return super if self.eql?(Type::Scalar)
66
+ directives = inspect_directives
67
+ directives.prepend(' ') if directives.present?
68
+ +"#<GraphQL::Scalar #{gql_name}#{directives}>"
66
69
  end
67
70
  end
68
71
  end