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,8 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module Rails # :nodoc:
4
- module GraphQL # :nodoc:
5
- module Helpers # :nodoc:
3
+ module Rails
4
+ module GraphQL
5
+ module Helpers
6
6
  # Helper module that allows other objects to hold events, either from a
7
7
  # singleton point-of-view, or for instances
8
8
  module WithEvents
@@ -19,7 +19,12 @@ module Rails # :nodoc:
19
19
  other.delegate(:event_types, to: :class)
20
20
 
21
21
  other.define_method(:events) { @events ||= Hash.new { |h, k| h[k] = [] } }
22
+ other.define_method(:all_events) { @events if defined?(@events) }
23
+ other.define_method(:events?) { defined?(@events) && @events.present? }
24
+
22
25
  other.define_method(:listeners) { @listeners ||= Set.new }
26
+ other.define_method(:all_listeners) { @listeners if defined?(@listeners) }
27
+ other.define_method(:listeners?) { defined?(@listeners) && @listeners.present? }
23
28
  end
24
29
 
25
30
  # Helper module to define static list of valid event types
@@ -27,10 +32,11 @@ module Rails # :nodoc:
27
32
  # Set or get the list of possible event types when attaching events
28
33
  def event_types(*list, append: false, expose: false)
29
34
  return (defined?(@event_types) && @event_types.presence) ||
30
- superclass.try(:event_types) || [] if list.blank?
35
+ superclass.try(:event_types) || EMPTY_ARRAY if list.blank?
36
+
37
+ new_list = list.flatten.compact.map(&:to_sym)
38
+ new_list = event_types + new_list if append
31
39
 
32
- new_list = append ? event_types : []
33
- new_list += list.flatten.compact.map(&:to_sym)
34
40
  @event_types = new_list.uniq.freeze
35
41
  expose_events!(*list) if expose
36
42
  @event_types
@@ -38,7 +44,7 @@ module Rails # :nodoc:
38
44
 
39
45
  protected
40
46
 
41
- # Auxiliar method that creates easy-accessible callback assignment
47
+ # Auxiliary method that creates easy-accessible callback assignment
42
48
  def expose_events!(*list)
43
49
  list.each do |event_name|
44
50
  next if method_defined?(event_name)
@@ -49,31 +55,23 @@ module Rails # :nodoc:
49
55
  end
50
56
  end
51
57
 
52
- # Mostly for correct inheritance on instances
53
- def all_events
54
- current = defined?(@events) ? @events : {}
55
- return current unless defined? super
56
- Helpers.merge_hash_array(current, super)
57
- end
58
-
59
- # Mostly for correct inheritance on instances
60
- def all_listeners
61
- current = (defined?(@listeners) && @listeners) || Set.new
62
- defined?(super) ? (current + super) : current
63
- end
64
-
65
58
  # Add a new event listener for the given +event_name+. It is possible
66
59
  # to prepend the event by setting +unshift: true+. This checks if the
67
60
  # event name is a valid one due to +event_types+.
68
- def on(event_name, unshift: false, &block)
61
+ def on(event_name, callback = nil, unshift: false, &block)
69
62
  event_name = event_name.to_sym
70
63
  valid = !event_types || event_types.include?(event_name)
71
- raise ArgumentError, <<~MSG.squish unless valid
64
+ raise ArgumentError, (+<<~MSG).squish unless valid
72
65
  The #{event_name} is not a valid event type.
73
66
  MSG
74
67
 
68
+ invalid_callback = callback.nil? || callback.is_a?(Callback)
69
+ raise ArgumentError, (+<<~MSG).squish unless invalid_callback
70
+ The provided #{callback.class.name} is not a valid callback.
71
+ MSG
72
+
75
73
  listeners << event_name
76
- events[event_name].send(unshift ? :unshift : :push, block)
74
+ events[event_name].send(unshift ? :unshift : :push, callback || block)
77
75
  end
78
76
  end
79
77
  end
@@ -1,8 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module Rails # :nodoc:
4
- module GraphQL # :nodoc:
5
- module Helpers # :nodoc:
3
+ module Rails
4
+ module GraphQL
5
+ module Helpers
6
6
  # Helper module that allows other objects to hold fields during the
7
7
  # definition process. Works very similar to Arguments, but it's more
8
8
  # flexible, since the type of the fields can be dynamic defined by the
@@ -12,19 +12,31 @@ module Rails # :nodoc:
12
12
  # related to the base type, but it's closer associated with the strategy
13
13
  # used to handle them.
14
14
  module WithFields
15
- module ClassMethods # :nodoc: all
15
+ module ClassMethods
16
16
  def inherited(subclass)
17
17
  super if defined? super
18
18
  return unless defined?(@fields)
19
19
  fields.each_value(&subclass.method(:proxy_field))
20
20
  end
21
+
22
+ # Return the list of fileds, only initialize when explicitly told
23
+ def fields(initialize = nil)
24
+ return @fields if defined?(@fields)
25
+ return unless initialize
26
+
27
+ @fields = Concurrent::Map.new
28
+ end
29
+
30
+ # Check if there are any fields defined
31
+ def fields?
32
+ defined?(@fields) && @fields.present?
33
+ end
21
34
  end
22
35
 
23
- def self.extended(other) # :nodoc:
36
+ def self.extended(other)
24
37
  other.extend(WithFields::ClassMethods)
25
- other.define_singleton_method(:fields) { @fields ||= Concurrent::Map.new }
26
- other.class_attribute(:field_type, instance_writer: false)
27
- other.class_attribute(:valid_field_types, instance_writer: false, default: [])
38
+ other.class_attribute(:field_type, instance_accessor: false)
39
+ other.class_attribute(:valid_field_types, instance_accessor: false, default: [])
28
40
  end
29
41
 
30
42
  # Check if the field is already defined before actually creating it
@@ -37,32 +49,31 @@ module Rails # :nodoc:
37
49
 
38
50
  # See {Field}[rdoc-ref:Rails::GraphQL::Field] class.
39
51
  def field(name, *args, **xargs, &block)
40
- xargs[:owner] = self
41
- object = field_type.new(name, *args, **xargs, &block)
52
+ object = field_type.new(name, *args, **xargs, owner: self, &block)
42
53
 
43
- raise DuplicatedError, <<~MSG.squish if field?(object.name)
54
+ raise DuplicatedError, (+<<~MSG).squish if field?(object.name)
44
55
  The #{name.inspect} field is already defined and can't be redefined.
45
56
  MSG
46
57
 
47
- fields[object.name] = object
58
+ fields(true)[object.name] = object
48
59
  rescue DefinitionError => e
49
- raise e.class, e.message + "\n Defined at: #{caller(2)[0]}"
60
+ raise e.class, +"#{e.message}\n Defined at: #{caller(2)[0]}"
50
61
  end
51
62
 
52
63
  # Add a new field to the list but use a proxy instead of a hard copy of
53
64
  # a given +field+
54
65
  def proxy_field(field, *args, **xargs, &block)
55
- raise ArgumentError, <<~MSG.squish unless field.is_a?(GraphQL::Field)
66
+ raise ArgumentError, (+<<~MSG).squish unless field.is_a?(field_type)
56
67
  The #{field.class.name} is not a valid field.
57
68
  MSG
58
69
 
59
70
  xargs[:owner] = self
60
71
  object = field.to_proxy(*args, **xargs, &block)
61
- raise DuplicatedError, <<~MSG.squish if field?(object.name)
72
+ raise DuplicatedError, (+<<~MSG).squish if field?(object.name)
62
73
  The #{field.name.inspect} field is already defined and can't be replaced.
63
74
  MSG
64
75
 
65
- fields[object.name] = object
76
+ fields(true)[object.name] = object
66
77
  end
67
78
 
68
79
  # Overwrite attributes of a given field named as +name+, it also allows
@@ -90,33 +101,65 @@ module Rails # :nodoc:
90
101
 
91
102
  # Check wheter a given field +object+ is defined in the list of fields
92
103
  def field?(object)
104
+ return false unless fields?
93
105
  object = object.name if object.is_a?(GraphQL::Field)
94
106
  fields.key?(object.is_a?(String) ? object.underscore.to_sym : object)
95
107
  end
96
108
 
97
109
  # Allow accessing fields using the hash notation
98
- def [](object)
110
+ def find_field(object)
111
+ return unless fields?
99
112
  object = object.name if object.is_a?(GraphQL::Field)
100
113
  fields[object.is_a?(String) ? object.underscore.to_sym : object]
101
114
  end
102
115
 
103
- alias find_field []
116
+ alias [] find_field
104
117
 
105
118
  # If the field is not found it will raise an exception
106
119
  def find_field!(object)
107
- find_field(object) || raise(::ArgumentError, <<~MSG.squish)
120
+ find_field(object) || raise(NotFoundError, (+<<~MSG).squish)
108
121
  The #{object.inspect} field is not defined yet.
109
122
  MSG
110
123
  end
111
124
 
112
125
  # Get the list of GraphQL names of all the fields difined
113
126
  def field_names(enabled_only = true)
114
- (enabled_only ? enabled_fields : fields.each_value).map(&:gql_name).compact
127
+ (enabled_only ? enabled_fields : lazy_each_field)&.map(&:gql_name)&.eager
115
128
  end
116
129
 
117
130
  # Return a lazy enumerator for enabled fields
118
131
  def enabled_fields
119
- fields.values.select(&:enabled?)
132
+ lazy_each_field&.select(&:enabled?)
133
+ end
134
+
135
+ # Import one or more field into the current list of fields
136
+ def import(klass, ignore_abstract: false)
137
+ return if ignore_abstract && klass.try(:abstract?)
138
+
139
+ if klass.is_a?(Module) && klass <= Alternative::Query
140
+ # Import an alternative declaration of a field
141
+ proxy_field(klass.field)
142
+ elsif klass.is_a?(Helpers::WithFields)
143
+ # Import a set of fields
144
+ klass.fields.each_value { |field| proxy_field(field) }
145
+ else
146
+ return if GraphQL.config.silence_import_warnings
147
+ GraphQL.logger.warn(+"Unable to import #{klass.inspect} into #{self.name}.")
148
+ end
149
+ end
150
+
151
+ # Import a module containing several classes to be imported
152
+ def import_all(mod, recursive: false, ignore_abstract: false)
153
+ mod.constants.each do |const_name|
154
+ object = mod.const_get(const_name)
155
+
156
+ if object.is_a?(Class)
157
+ import(object, ignore_abstract: ignore_abstract)
158
+ elsif object.is_a?(Module) && recursive
159
+ # TODO: Maybe add deepness into the recursive value
160
+ import_all(object, recursive: recursive, ignore_abstract: ignore_abstract)
161
+ end
162
+ end
120
163
  end
121
164
 
122
165
  # Validate all the fields to make sure the definition is valid
@@ -125,7 +168,12 @@ module Rails # :nodoc:
125
168
 
126
169
  # TODO: Maybe find a way to freeze the fields, since after validation
127
170
  # the best thing to do is block changes
128
- fields.each_value(&:validate!)
171
+ fields&.each_value(&:validate!)
172
+ end
173
+
174
+ # Find a specific field using its id as +gql_name.type+
175
+ def find_by_gid(gid)
176
+ find_field!(gid.name)
129
177
  end
130
178
 
131
179
  protected
@@ -135,6 +183,12 @@ module Rails # :nodoc:
135
183
  xargs[:owner] = self
136
184
  GraphQL::Argument.new(*args, **xargs, &block)
137
185
  end
186
+
187
+ private
188
+
189
+ def lazy_each_field
190
+ fields.each_pair.lazy.each_entry.map(&:last) if fields?
191
+ end
138
192
  end
139
193
  end
140
194
  end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Rails
4
+ module GraphQL
5
+ module Helpers
6
+ # Helper module that is a different implementation of the
7
+ # +GlobalID::Identification+, but instead of things being found by the
8
+ # class that they are, it uses owners and base classes.
9
+ module WithGlobalID
10
+ def to_global_id(options = nil) # :nodoc:
11
+ GlobalID.create(self, options)
12
+ end
13
+
14
+ alias to_gid to_global_id
15
+
16
+ def to_gid_param(options = nil) # :nodoc:
17
+ to_global_id(options).to_param
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'active_support/core_ext/module/anonymous'
4
+
5
+ module Rails
6
+ module GraphQL
7
+ module Helpers
8
+ # Helper module responsible for name stuff
9
+ module WithName
10
+ NAME_EXP = /GraphQL::(?:Type::\w+::|Directive::)?([:\w]+?)([A-Z][a-z]+)?\z/.freeze
11
+
12
+ # Here we define a couple of attributes used by registration
13
+ def self.extended(other)
14
+ # TODO: Move to registerable
15
+ # An abstract type won't appear in the introspection and will not be
16
+ # instantiated by requests
17
+ other.class_attribute :abstract, instance_accessor: false, default: false
18
+ end
19
+
20
+ # Return the name of the object as a GraphQL name
21
+ def gql_name
22
+ @gql_name ||= begin
23
+ name.match(NAME_EXP).try(:[], 1)&.tr(':', '')
24
+ end unless anonymous?
25
+ end
26
+
27
+ alias graphql_name gql_name
28
+
29
+ # Return the name of the object as a symbol
30
+ def to_sym
31
+ @gql_key ||= gql_name&.underscore&.to_sym
32
+ end
33
+
34
+ protected
35
+
36
+ # Change the gql name of the object
37
+ def rename!(name)
38
+ @gql_name = name.to_s
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
@@ -1,8 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module Rails # :nodoc:
4
- module GraphQL # :nodoc:
5
- module Helpers # :nodoc:
3
+ module Rails
4
+ module GraphQL
5
+ module Helpers
6
6
  # Helper module that allows other objects to hold namespaces. It can
7
7
  # either work as an extension of the superclass using +add_namespace+ or
8
8
  # it can be reset then set using +namespace+.
@@ -10,7 +10,10 @@ module Rails # :nodoc:
10
10
  # Returns the list of defined namespaces
11
11
  def namespaces
12
12
  return @namespaces if defined?(@namespaces)
13
- superclass.try(:namespaces) || Set.new
13
+ superclass.try(:namespaces) || begin
14
+ value = GraphQL.type_map.associated_namespace_of(self)
15
+ @namespaces = value unless value.nil?
16
+ end
14
17
  end
15
18
 
16
19
  # Set or overwrite the list of namespaces
@@ -1,16 +1,17 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module Rails # :nodoc:
4
- module GraphQL # :nodoc:
5
- module Helpers # :nodoc:
6
- # Helper module that allows other objects to hold an +assigned_to+ object
3
+ module Rails
4
+ module GraphQL
5
+ module Helpers
6
+ # Helper focus on event execution when objects have a owner property,
7
+ # pratically allowing resolvers and similar to be called in the owner
7
8
  module WithOwner
8
9
  def self.included(other)
9
10
  other.extend(WithOwner::ClassMethods)
10
11
  other.class_attribute(:owner, instance_writer: false)
11
12
  end
12
13
 
13
- module ClassMethods # :nodoc: all
14
+ module ClassMethods
14
15
  def method_defined?(method_name)
15
16
  super || owner&.method_defined?(method_name)
16
17
  end
@@ -18,11 +19,11 @@ module Rails # :nodoc:
18
19
 
19
20
  private
20
21
 
21
- def respond_to_missing?(*args) # :nodoc:
22
+ def respond_to_missing?(*args)
22
23
  owner_respond_to?(*args) || super
23
24
  end
24
25
 
25
- def method_missing(method_name, *args, **xargs, &block) # :nodoc:
26
+ def method_missing(method_name, *args, **xargs, &block)
26
27
  return super unless owner_respond_to?(method_name)
27
28
  event.on_instance(owner) do |obj|
28
29
  obj.public_send(method_name, *args, **xargs, &block)