rails-graphql 0.2.1 → 1.0.0.rc1

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 (315) 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 +631 -0
  6. data/ext/gql_parser.h +21 -0
  7. data/ext/shared.c +477 -0
  8. data/ext/shared.h +177 -0
  9. data/lib/generators/graphql/channel_generator.rb +27 -0
  10. data/lib/generators/graphql/controller_generator.rb +9 -4
  11. data/lib/generators/graphql/install_generator.rb +49 -0
  12. data/lib/generators/graphql/schema_generator.rb +9 -4
  13. data/lib/generators/graphql/templates/channel.erb +7 -0
  14. data/lib/generators/graphql/templates/config.rb +97 -0
  15. data/lib/generators/graphql/templates/controller.erb +2 -0
  16. data/lib/generators/graphql/templates/schema.erb +5 -3
  17. data/lib/gql_parser.so +0 -0
  18. data/lib/rails/graphql/adapters/mysql_adapter.rb +59 -0
  19. data/lib/rails/graphql/adapters/pg_adapter.rb +25 -22
  20. data/lib/rails/graphql/adapters/sqlite_adapter.rb +17 -14
  21. data/lib/rails/graphql/alternative/field_set.rb +48 -0
  22. data/lib/rails/graphql/alternative/mutation.rb +17 -0
  23. data/lib/rails/graphql/alternative/query.rb +98 -0
  24. data/lib/rails/graphql/alternative/subscription.rb +18 -0
  25. data/lib/rails/graphql/alternative.rb +20 -0
  26. data/lib/rails/graphql/argument.rb +25 -26
  27. data/lib/rails/graphql/callback.rb +30 -14
  28. data/lib/rails/graphql/collectors/hash_collector.rb +26 -7
  29. data/lib/rails/graphql/collectors/idented_collector.rb +10 -7
  30. data/lib/rails/graphql/collectors/json_collector.rb +43 -17
  31. data/lib/rails/graphql/collectors.rb +4 -4
  32. data/lib/rails/graphql/config.rb +154 -23
  33. data/lib/rails/graphql/directive/cached_directive.rb +33 -0
  34. data/lib/rails/graphql/directive/deprecated_directive.rb +10 -10
  35. data/lib/rails/graphql/directive/include_directive.rb +4 -4
  36. data/lib/rails/graphql/directive/skip_directive.rb +4 -4
  37. data/lib/rails/graphql/directive/specified_by_directive.rb +24 -0
  38. data/lib/rails/graphql/directive.rb +134 -73
  39. data/lib/rails/graphql/errors.rb +33 -4
  40. data/lib/rails/graphql/event.rb +21 -9
  41. data/lib/rails/graphql/field/authorized_field.rb +17 -6
  42. data/lib/rails/graphql/field/input_field.rb +8 -12
  43. data/lib/rails/graphql/field/mutation_field.rb +43 -9
  44. data/lib/rails/graphql/field/output_field.rb +112 -12
  45. data/lib/rails/graphql/field/proxied_field.rb +35 -26
  46. data/lib/rails/graphql/field/resolved_field.rb +27 -25
  47. data/lib/rails/graphql/field/scoped_config.rb +10 -4
  48. data/lib/rails/graphql/field/subscription_field.rb +123 -0
  49. data/lib/rails/graphql/field/typed_field.rb +69 -24
  50. data/lib/rails/graphql/field.rb +89 -74
  51. data/lib/rails/graphql/global_id.rb +89 -0
  52. data/lib/rails/graphql/helpers/attribute_delegator.rb +5 -5
  53. data/lib/rails/graphql/helpers/inherited_collection/array.rb +51 -0
  54. data/lib/rails/graphql/helpers/inherited_collection/base.rb +45 -0
  55. data/lib/rails/graphql/helpers/inherited_collection/hash.rb +88 -0
  56. data/lib/rails/graphql/helpers/inherited_collection.rb +25 -76
  57. data/lib/rails/graphql/helpers/instantiable.rb +15 -0
  58. data/lib/rails/graphql/helpers/leaf_from_ar.rb +7 -7
  59. data/lib/rails/graphql/helpers/registerable.rb +44 -62
  60. data/lib/rails/graphql/helpers/unregisterable.rb +16 -0
  61. data/lib/rails/graphql/helpers/with_arguments.rb +33 -28
  62. data/lib/rails/graphql/helpers/with_assignment.rb +6 -6
  63. data/lib/rails/graphql/helpers/with_callbacks.rb +28 -11
  64. data/lib/rails/graphql/helpers/with_description.rb +73 -0
  65. data/lib/rails/graphql/helpers/with_directives.rb +58 -30
  66. data/lib/rails/graphql/helpers/with_events.rb +22 -23
  67. data/lib/rails/graphql/helpers/with_fields.rb +86 -26
  68. data/lib/rails/graphql/helpers/with_global_id.rb +22 -0
  69. data/lib/rails/graphql/helpers/with_name.rb +44 -0
  70. data/lib/rails/graphql/helpers/with_namespace.rb +7 -4
  71. data/lib/rails/graphql/helpers/with_owner.rb +8 -7
  72. data/lib/rails/graphql/helpers/with_schema_fields.rb +162 -56
  73. data/lib/rails/graphql/helpers/with_validator.rb +9 -9
  74. data/lib/rails/graphql/helpers.rb +10 -3
  75. data/lib/rails/graphql/introspection.rb +43 -36
  76. data/lib/rails/graphql/railtie.rb +89 -33
  77. data/lib/rails/graphql/railties/app/base_channel.rb +10 -0
  78. data/lib/rails/graphql/railties/app/base_controller.rb +12 -0
  79. data/lib/rails/graphql/railties/app/views/_cable.js.erb +56 -0
  80. data/lib/rails/graphql/railties/app/views/_fetch.js.erb +20 -0
  81. data/lib/rails/graphql/railties/app/views/graphiql.html.erb +101 -0
  82. data/lib/rails/graphql/railties/base_generator.rb +5 -17
  83. data/lib/rails/graphql/railties/channel.rb +157 -0
  84. data/lib/rails/graphql/railties/controller.rb +91 -25
  85. data/lib/rails/graphql/railties/controller_runtime.rb +5 -5
  86. data/lib/rails/graphql/railties/log_subscriber.rb +81 -14
  87. data/lib/rails/graphql/request/arguments.rb +26 -50
  88. data/lib/rails/graphql/request/backtrace.rb +212 -0
  89. data/lib/rails/graphql/request/component/field.rb +98 -70
  90. data/lib/rails/graphql/request/component/fragment.rb +80 -26
  91. data/lib/rails/graphql/request/component/operation/subscription.rb +162 -4
  92. data/lib/rails/graphql/request/component/operation.rb +73 -34
  93. data/lib/rails/graphql/request/component/spread.rb +79 -27
  94. data/lib/rails/graphql/request/component/typename.rb +28 -13
  95. data/lib/rails/graphql/request/component.rb +77 -36
  96. data/lib/rails/graphql/request/context.rb +19 -9
  97. data/lib/rails/graphql/request/errors.rb +16 -6
  98. data/lib/rails/graphql/request/event.rb +23 -8
  99. data/lib/rails/graphql/request/helpers/directives.rb +69 -27
  100. data/lib/rails/graphql/request/helpers/selection_set.rb +57 -25
  101. data/lib/rails/graphql/request/helpers/value_writers.rb +24 -19
  102. data/lib/rails/graphql/request/prepared_data.rb +100 -0
  103. data/lib/rails/graphql/request/steps/authorizable.rb +24 -14
  104. data/lib/rails/graphql/request/steps/organizable.rb +111 -49
  105. data/lib/rails/graphql/request/steps/{prepareable.rb → preparable.rb} +21 -8
  106. data/lib/rails/graphql/request/steps/{resolveable.rb → resolvable.rb} +16 -7
  107. data/lib/rails/graphql/request/strategy/cached_strategy.rb +64 -0
  108. data/lib/rails/graphql/request/strategy/dynamic_instance.rb +6 -6
  109. data/lib/rails/graphql/request/strategy/multi_query_strategy.rb +6 -13
  110. data/lib/rails/graphql/request/strategy/sequenced_strategy.rb +9 -9
  111. data/lib/rails/graphql/request/strategy.rb +147 -77
  112. data/lib/rails/graphql/request/subscription.rb +82 -0
  113. data/lib/rails/graphql/request.rb +353 -104
  114. data/lib/rails/graphql/schema.rb +251 -106
  115. data/lib/rails/graphql/shortcuts.rb +33 -8
  116. data/lib/rails/graphql/source/active_record/builders.rb +64 -51
  117. data/lib/rails/graphql/source/active_record_source.rb +158 -82
  118. data/lib/rails/graphql/source/base.rb +83 -0
  119. data/lib/rails/graphql/source/builder.rb +115 -0
  120. data/lib/rails/graphql/source/scoped_arguments.rb +39 -21
  121. data/lib/rails/graphql/source.rb +90 -228
  122. data/lib/rails/graphql/subscription/provider/action_cable.rb +113 -0
  123. data/lib/rails/graphql/subscription/provider/base.rb +192 -0
  124. data/lib/rails/graphql/subscription/provider.rb +18 -0
  125. data/lib/rails/graphql/subscription/store/base.rb +141 -0
  126. data/lib/rails/graphql/subscription/store/memory.rb +136 -0
  127. data/lib/rails/graphql/subscription/store.rb +19 -0
  128. data/lib/rails/graphql/subscription.rb +17 -0
  129. data/lib/rails/graphql/to_gql.rb +29 -32
  130. data/lib/rails/graphql/type/creator.rb +196 -0
  131. data/lib/rails/graphql/type/enum/directive_location_enum.rb +11 -11
  132. data/lib/rails/graphql/type/enum/type_kind_enum.rb +3 -3
  133. data/lib/rails/graphql/type/enum.rb +44 -50
  134. data/lib/rails/graphql/type/input.rb +92 -25
  135. data/lib/rails/graphql/type/interface.rb +29 -28
  136. data/lib/rails/graphql/type/object/directive_object.rb +10 -9
  137. data/lib/rails/graphql/type/object/enum_value_object.rb +3 -3
  138. data/lib/rails/graphql/type/object/field_object.rb +24 -6
  139. data/lib/rails/graphql/type/object/input_value_object.rb +6 -7
  140. data/lib/rails/graphql/type/object/schema_object.rb +5 -8
  141. data/lib/rails/graphql/type/object/type_object.rb +62 -25
  142. data/lib/rails/graphql/type/object.rb +34 -26
  143. data/lib/rails/graphql/type/scalar/any_scalar.rb +30 -0
  144. data/lib/rails/graphql/type/scalar/bigint_scalar.rb +5 -5
  145. data/lib/rails/graphql/type/scalar/binary_scalar.rb +5 -3
  146. data/lib/rails/graphql/type/scalar/boolean_scalar.rb +8 -8
  147. data/lib/rails/graphql/type/scalar/date_scalar.rb +5 -3
  148. data/lib/rails/graphql/type/scalar/date_time_scalar.rb +5 -3
  149. data/lib/rails/graphql/type/scalar/decimal_scalar.rb +5 -3
  150. data/lib/rails/graphql/type/scalar/float_scalar.rb +5 -5
  151. data/lib/rails/graphql/type/scalar/id_scalar.rb +6 -5
  152. data/lib/rails/graphql/type/scalar/int_scalar.rb +6 -5
  153. data/lib/rails/graphql/type/scalar/json_scalar.rb +41 -0
  154. data/lib/rails/graphql/type/scalar/string_scalar.rb +18 -4
  155. data/lib/rails/graphql/type/scalar/time_scalar.rb +8 -6
  156. data/lib/rails/graphql/type/scalar.rb +26 -23
  157. data/lib/rails/graphql/type/union.rb +21 -18
  158. data/lib/rails/graphql/type.rb +43 -26
  159. data/lib/rails/graphql/type_map.rb +268 -165
  160. data/lib/rails/graphql/uri.rb +167 -0
  161. data/lib/rails/graphql/version.rb +19 -3
  162. data/lib/rails/graphql.rake +3 -0
  163. data/lib/rails/graphql.rb +91 -56
  164. data/lib/rails-graphql.rb +1 -1
  165. data/test/assets/en.yml +29 -0
  166. data/test/assets/introspection-mem.txt +1 -1
  167. data/test/assets/introspection.gql +2 -0
  168. data/test/assets/mem.gql +86 -99
  169. data/test/assets/mysql.gql +406 -0
  170. data/test/assets/sqlite.gql +96 -73
  171. data/test/assets/translate.gql +346 -0
  172. data/test/config.rb +19 -8
  173. data/test/graphql/schema_test.rb +14 -50
  174. data/test/graphql/source_test.rb +8 -85
  175. data/test/graphql/type/enum_test.rb +207 -203
  176. data/test/graphql/type/input_test.rb +14 -9
  177. data/test/graphql/type/interface_test.rb +12 -9
  178. data/test/graphql/type/object_test.rb +8 -2
  179. data/test/graphql/type/scalar/any_scalar_test.rb +38 -0
  180. data/test/graphql/type/scalar/boolean_scalar_test.rb +6 -3
  181. data/test/graphql/type/scalar/json_scalar_test.rb +23 -0
  182. data/test/graphql/type_map_test.rb +63 -81
  183. data/test/graphql/type_test.rb +0 -19
  184. data/test/graphql_test.rb +1 -1
  185. data/test/integration/{authorization/authorization_test.rb → authorization_test.rb} +40 -14
  186. data/test/integration/config.rb +36 -3
  187. data/test/integration/customization_test.rb +39 -0
  188. data/test/integration/global_id_test.rb +99 -0
  189. data/test/integration/memory/star_wars_introspection_test.rb +24 -16
  190. data/test/integration/memory/star_wars_query_test.rb +54 -3
  191. data/test/integration/memory/star_wars_validation_test.rb +3 -3
  192. data/test/integration/mysql/star_wars_introspection_test.rb +25 -0
  193. data/test/integration/persisted_query_test.rb +87 -0
  194. data/test/integration/resolver_precedence_test.rb +154 -0
  195. data/test/integration/schemas/memory.rb +24 -10
  196. data/test/integration/schemas/mysql.rb +62 -0
  197. data/test/integration/schemas/sqlite.rb +21 -12
  198. data/test/integration/sqlite/star_wars_global_id_test.rb +89 -0
  199. data/test/integration/sqlite/star_wars_introspection_test.rb +10 -0
  200. data/test/integration/sqlite/star_wars_query_test.rb +14 -1
  201. data/test/integration/translate_test.rb +73 -0
  202. data/test/test_ext.rb +16 -13
  203. metadata +125 -161
  204. data/ext/depend +0 -3
  205. data/ext/graphqlparser/Ast.cpp +0 -346
  206. data/ext/graphqlparser/Ast.h +0 -1214
  207. data/ext/graphqlparser/AstNode.h +0 -36
  208. data/ext/graphqlparser/AstVisitor.h +0 -137
  209. data/ext/graphqlparser/GraphQLParser.cpp +0 -76
  210. data/ext/graphqlparser/GraphQLParser.h +0 -55
  211. data/ext/graphqlparser/JsonVisitor.cpp +0 -161
  212. data/ext/graphqlparser/JsonVisitor.cpp.inc +0 -456
  213. data/ext/graphqlparser/JsonVisitor.h +0 -121
  214. data/ext/graphqlparser/JsonVisitor.h.inc +0 -110
  215. data/ext/graphqlparser/VERSION +0 -1
  216. data/ext/graphqlparser/c/GraphQLAst.cpp +0 -324
  217. data/ext/graphqlparser/c/GraphQLAst.h +0 -180
  218. data/ext/graphqlparser/c/GraphQLAstForEachConcreteType.h +0 -44
  219. data/ext/graphqlparser/c/GraphQLAstNode.cpp +0 -25
  220. data/ext/graphqlparser/c/GraphQLAstNode.h +0 -33
  221. data/ext/graphqlparser/c/GraphQLAstToJSON.cpp +0 -21
  222. data/ext/graphqlparser/c/GraphQLAstToJSON.h +0 -24
  223. data/ext/graphqlparser/c/GraphQLAstVisitor.cpp +0 -55
  224. data/ext/graphqlparser/c/GraphQLAstVisitor.h +0 -53
  225. data/ext/graphqlparser/c/GraphQLParser.cpp +0 -35
  226. data/ext/graphqlparser/c/GraphQLParser.h +0 -54
  227. data/ext/graphqlparser/dump_json_ast.cpp +0 -48
  228. data/ext/graphqlparser/lexer.lpp +0 -324
  229. data/ext/graphqlparser/parser.ypp +0 -693
  230. data/ext/graphqlparser/parsergen/lexer.cpp +0 -2633
  231. data/ext/graphqlparser/parsergen/lexer.h +0 -528
  232. data/ext/graphqlparser/parsergen/location.hh +0 -189
  233. data/ext/graphqlparser/parsergen/parser.tab.cpp +0 -3300
  234. data/ext/graphqlparser/parsergen/parser.tab.hpp +0 -646
  235. data/ext/graphqlparser/parsergen/position.hh +0 -179
  236. data/ext/graphqlparser/parsergen/stack.hh +0 -156
  237. data/ext/graphqlparser/syntaxdefs.h +0 -19
  238. data/ext/libgraphqlparser/AstNode.h +0 -36
  239. data/ext/libgraphqlparser/CMakeLists.txt +0 -148
  240. data/ext/libgraphqlparser/CONTRIBUTING.md +0 -23
  241. data/ext/libgraphqlparser/GraphQLParser.cpp +0 -76
  242. data/ext/libgraphqlparser/GraphQLParser.h +0 -55
  243. data/ext/libgraphqlparser/JsonVisitor.cpp +0 -161
  244. data/ext/libgraphqlparser/JsonVisitor.h +0 -121
  245. data/ext/libgraphqlparser/LICENSE +0 -22
  246. data/ext/libgraphqlparser/README.clang-tidy +0 -7
  247. data/ext/libgraphqlparser/README.md +0 -84
  248. data/ext/libgraphqlparser/ast/ast.ast +0 -203
  249. data/ext/libgraphqlparser/ast/ast.py +0 -61
  250. data/ext/libgraphqlparser/ast/c.py +0 -100
  251. data/ext/libgraphqlparser/ast/c.pyc +0 -0
  252. data/ext/libgraphqlparser/ast/c_impl.py +0 -61
  253. data/ext/libgraphqlparser/ast/c_impl.pyc +0 -0
  254. data/ext/libgraphqlparser/ast/c_visitor_impl.py +0 -39
  255. data/ext/libgraphqlparser/ast/c_visitor_impl.pyc +0 -0
  256. data/ext/libgraphqlparser/ast/casing.py +0 -26
  257. data/ext/libgraphqlparser/ast/casing.pyc +0 -0
  258. data/ext/libgraphqlparser/ast/cxx.py +0 -197
  259. data/ext/libgraphqlparser/ast/cxx.pyc +0 -0
  260. data/ext/libgraphqlparser/ast/cxx_impl.py +0 -61
  261. data/ext/libgraphqlparser/ast/cxx_impl.pyc +0 -0
  262. data/ext/libgraphqlparser/ast/cxx_json_visitor_header.py +0 -42
  263. data/ext/libgraphqlparser/ast/cxx_json_visitor_header.pyc +0 -0
  264. data/ext/libgraphqlparser/ast/cxx_json_visitor_impl.py +0 -80
  265. data/ext/libgraphqlparser/ast/cxx_json_visitor_impl.pyc +0 -0
  266. data/ext/libgraphqlparser/ast/cxx_visitor.py +0 -64
  267. data/ext/libgraphqlparser/ast/cxx_visitor.pyc +0 -0
  268. data/ext/libgraphqlparser/ast/js.py +0 -65
  269. data/ext/libgraphqlparser/ast/license.py +0 -10
  270. data/ext/libgraphqlparser/ast/license.pyc +0 -0
  271. data/ext/libgraphqlparser/c/GraphQLAstNode.cpp +0 -25
  272. data/ext/libgraphqlparser/c/GraphQLAstNode.h +0 -33
  273. data/ext/libgraphqlparser/c/GraphQLAstToJSON.cpp +0 -21
  274. data/ext/libgraphqlparser/c/GraphQLAstToJSON.h +0 -24
  275. data/ext/libgraphqlparser/c/GraphQLAstVisitor.cpp +0 -55
  276. data/ext/libgraphqlparser/c/GraphQLAstVisitor.h +0 -53
  277. data/ext/libgraphqlparser/c/GraphQLParser.cpp +0 -35
  278. data/ext/libgraphqlparser/c/GraphQLParser.h +0 -54
  279. data/ext/libgraphqlparser/clang-tidy-all.sh +0 -3
  280. data/ext/libgraphqlparser/cmake/version.cmake +0 -16
  281. data/ext/libgraphqlparser/dump_json_ast.cpp +0 -48
  282. data/ext/libgraphqlparser/go/README.md +0 -20
  283. data/ext/libgraphqlparser/go/callbacks.go +0 -18
  284. data/ext/libgraphqlparser/go/gotest.go +0 -64
  285. data/ext/libgraphqlparser/lexer.lpp +0 -324
  286. data/ext/libgraphqlparser/libgraphqlparser.pc.in +0 -11
  287. data/ext/libgraphqlparser/parser.ypp +0 -693
  288. data/ext/libgraphqlparser/parsergen/lexer.cpp +0 -2633
  289. data/ext/libgraphqlparser/parsergen/lexer.h +0 -528
  290. data/ext/libgraphqlparser/parsergen/location.hh +0 -189
  291. data/ext/libgraphqlparser/parsergen/parser.tab.cpp +0 -3300
  292. data/ext/libgraphqlparser/parsergen/parser.tab.hpp +0 -646
  293. data/ext/libgraphqlparser/parsergen/position.hh +0 -179
  294. data/ext/libgraphqlparser/parsergen/stack.hh +0 -156
  295. data/ext/libgraphqlparser/python/CMakeLists.txt +0 -14
  296. data/ext/libgraphqlparser/python/README.md +0 -5
  297. data/ext/libgraphqlparser/python/example.py +0 -31
  298. data/ext/libgraphqlparser/syntaxdefs.h +0 -19
  299. data/ext/libgraphqlparser/test/BuildCAPI.c +0 -5
  300. data/ext/libgraphqlparser/test/CMakeLists.txt +0 -25
  301. data/ext/libgraphqlparser/test/JsonVisitorTests.cpp +0 -28
  302. data/ext/libgraphqlparser/test/ParserTests.cpp +0 -352
  303. data/ext/libgraphqlparser/test/kitchen-sink.graphql +0 -59
  304. data/ext/libgraphqlparser/test/kitchen-sink.json +0 -1
  305. data/ext/libgraphqlparser/test/schema-kitchen-sink.graphql +0 -78
  306. data/ext/libgraphqlparser/test/schema-kitchen-sink.json +0 -1
  307. data/ext/libgraphqlparser/test/valgrind.supp +0 -33
  308. data/ext/version.cpp +0 -21
  309. data/lib/graphqlparser.so +0 -0
  310. data/lib/rails/graphql/native/functions.rb +0 -38
  311. data/lib/rails/graphql/native/location.rb +0 -41
  312. data/lib/rails/graphql/native/pointers.rb +0 -23
  313. data/lib/rails/graphql/native/visitor.rb +0 -349
  314. data/lib/rails/graphql/native.rb +0 -56
  315. data/test/integration/schemas/authorization.rb +0 -12
@@ -0,0 +1,49 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rails/generators/base'
4
+
5
+ module GraphQL
6
+ module Generators
7
+ class InstallGenerator < Rails::Generators::Base # :nodoc:
8
+ include Rails::GraphQL::BaseGenerator
9
+
10
+ desc 'Add an initial setup to your application'
11
+
12
+ argument :schema, type: :string, optional: true,
13
+ default: "#{APP_MODULE_NAME}Schema",
14
+ desc: 'A name for the schema'
15
+
16
+ class_option :skip_routes, type: :boolean,
17
+ default: false,
18
+ desc: 'Add some initial routes'
19
+
20
+ class_option :skip_keeps, type: :boolean,
21
+ default: false,
22
+ desc: 'Skip .keep files'
23
+
24
+ def create_config_file
25
+ template 'config.rb', 'config/initializers/graphql.rb'
26
+ end
27
+
28
+ def create_schema
29
+ invoke 'graphql:schema'
30
+ end
31
+
32
+ def create_keep_files
33
+ return if options[:skip_keeps]
34
+
35
+ %w[
36
+ directives fields sources enums inputs interfaces object
37
+ scalars unions queries mutations subscriptions
38
+ ].each { |folder| create_file("#{options[:directory]}/#{folder}/.keep") }
39
+ end
40
+
41
+ def add_routes
42
+ return if options[:skip_routes]
43
+ route('get "/graphql/describe", to: "graphql/base#describe"')
44
+ route('get "/graphiql", to: "graphql/base#graphiql"')
45
+ route('post "/graphql", to: "graphql/base#execute"')
46
+ end
47
+ end
48
+ end
49
+ end
@@ -8,15 +8,20 @@ module GraphQL
8
8
  include Rails::GraphQL::BaseGenerator
9
9
 
10
10
  desc 'Add a new GraphQL schema'
11
- argument :name, type: :string, optional: true
11
+
12
+ argument :schema, type: :string, optional: true,
13
+ default: "#{APP_MODULE_NAME}Schema",
14
+ desc: 'A name for the schema'
12
15
 
13
16
  def create_schema_file
14
17
  template 'schema.erb', "#{options[:directory]}/#{schema_name.underscore}.rb"
15
18
  end
16
19
 
17
- def schema_name
18
- @schema_name ||= options[:name].presence || "#{app_module_name}Schema"
19
- end
20
+ private
21
+
22
+ def schema_name
23
+ @schema_name ||= options.fetch(:schema, "#{APP_MODULE_NAME}Schema")
24
+ end
20
25
  end
21
26
  end
22
27
  end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ <% module_namespacing do -%>
4
+ class <%= channel_name %> < ApplicationCable::Channel
5
+ include GraphQL::Channel
6
+ end
7
+ <% end -%>
@@ -0,0 +1,97 @@
1
+ # frozen_string_literal: true
2
+
3
+ Rails::GraphQL.configure do |config|
4
+ # This helps to keep track of when things were cached and registered. Cached
5
+ # objects with mismatching versions need to be upgraded or simply reloaded.
6
+ # An excellent way to use this is to set it to the commit hash. TypePap will
7
+ # always use only the first 8 characters for simplicity.
8
+ # config.version = nil
9
+
10
+ # The instance responsible for caching all the information generated by
11
+ # requests and all the other components. Manually setting this property
12
+ # means that the object in it complies with `ActiveSupport::Cache::Store`.
13
+ # This will map automatically to `Rails.cache` if kept as `nil`. This can
14
+ # also be set per Schema.
15
+ # config.cache = nil
16
+
17
+ # This is the prefix key of all the cache entries for the GraphQL cached
18
+ # things.
19
+ # config.cache_prefix = 'graphql/'
20
+
21
+ # This is very similar to `ActiveRecord` verbose logs, which simply show the
22
+ # path of the file that started a GraphQL request.
23
+ # config.verbose_logs = true
24
+
25
+ # The list of parameters to omit from the logger when running a GraphQL
26
+ # request. Those values are displayed better in the internal runtime logger
27
+ # controller.
28
+ # config.omit_parameters = %w[query operationName operation_name variables graphql]
29
+
30
+ # Identical to the one available on a Rails application, but exclusive for
31
+ # GraphQL operations. The list of parameters to display as filtered in the
32
+ # logs. When it is nil, it will use the same as the Rails application.
33
+ # config.filter_parameters = nil
34
+
35
+ # The suffix that is added automatically to all the Input type objects. This
36
+ # prevents situations like `PointInputInput`. If your inputs have a
37
+ # different suffix, change this value to it.
38
+ # config.auto_suffix_input_objects = 'Input'
39
+
40
+ # Introspection is enabled by default. It is recommended to only use
41
+ # introspection during development and tests, never in production.
42
+ # This can also be set per schema level.
43
+ config.enable_introspection = true
44
+
45
+ # Define the names of the schema/operations types. The single "_" is a
46
+ # suggestion. In an application that has a Subscription object, it will
47
+ # prevent the conflict. Plus, it is easy to spot that it is something
48
+ # internal. This can also be set per Schema.
49
+ # config.schema_type_names = {
50
+ # query: '_Query',
51
+ # mutation: '_Mutation',
52
+ # subscription: '_Subscription',
53
+ # }
54
+
55
+ # For performance purposes, this gem implements a
56
+ # {JsonCollector}[rdoc-ref:Rails::GraphQL::Collectors::JsonCollector].
57
+ # You can disable this option if you prefer to use the standard
58
+ # hash-to-string serialization provided by `ActiveSupport`.
59
+ # This can also be set per Schema.
60
+ # config.enable_string_collector = true
61
+
62
+ # Set what is de default expected output type of GraphQL requests. String
63
+ # combined with the previous setting has the best performance. On the
64
+ # console, it will automatically shift to Hash. This can also be set per
65
+ # Schema.
66
+ # config.default_response_format = :string
67
+
68
+ # Specifies if the results of operations should be encoded with
69
+ # +ActiveSupport::JSON#encode+ instead of the default +JSON#generate+.
70
+ # See also https://github.com/rails/rails/blob/master/activesupport/lib/active_support/json/encoding.rb
71
+ # config.encode_with_active_support = false
72
+
73
+ # Enable the ability of a callback to inject arguments dynamically into the
74
+ # calling method.
75
+ # config.callback_inject_arguments = true
76
+
77
+ # Enable the ability of a callback to inject named arguments dynamically
78
+ # into the calling method.
79
+ # config.callback_inject_named_arguments = true
80
+
81
+ # When importing fields from modules or other objects, a warning is
82
+ # displayed for any given element that was not able to be correctly
83
+ # imported. You can silence such warnings by changing this option.
84
+ # config.silence_import_warnings = false
85
+
86
+ # Enable the ability to define the description of any object, field, or
87
+ # argument using I18n. It is recommended for multi-language documentation.
88
+ config.enable_i18n_descriptions = true
89
+
90
+ # The method that should be used to parse literal input values when they are
91
+ # provided as Hash. `JSON.parse` only supports keys wrapped in quotes. You
92
+ # can use `Psych.method(:safe_load)` to support keys without quotes, which
93
+ # behaves closer to YAML. The received value is ensured to be wrapped in
94
+ # "{}". If that produces unexpected results, you can assign a proc and then
95
+ # parse the value in any other way.
96
+ # config.literal_input_parser = JSON.method(:parse)
97
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  <% module_namespacing do -%>
2
4
  class <%= controller_name %> < ApplicationController
3
5
  include GraphQL::Controller
@@ -1,6 +1,8 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module GraphQL
2
- <% module_namespacing do -%>
3
- class <%= schema_name %> < Schema
4
+ <%- module_namespacing do -%>
5
+ class <%= schema_name %> < GraphQL::Schema
4
6
  end
5
- <% end -%>
7
+ <%- end -%>
6
8
  end
data/lib/gql_parser.so ADDED
Binary file
@@ -0,0 +1,59 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Rails
4
+ module GraphQL
5
+ # Based on:
6
+ # SELECT DISTINCT data_type FROM information_schema.columns;
7
+ # And https://www.mysqltutorial.org/mysql-data-types.aspx
8
+ type_map.register_alias 'mysql:varchar', :string
9
+ type_map.register_alias 'mysql:bit', :bool
10
+ type_map.register_alias 'mysql:int', :int
11
+ type_map.register_alias 'mysql:bigint', :bigint
12
+ type_map.register_alias 'mysql:json', :json
13
+ type_map.register_alias 'mysql:date', :date
14
+ type_map.register_alias 'mysql:timestamp', :date_time
15
+ type_map.register_alias 'mysql:binary', :binary
16
+ type_map.register_alias 'mysql:float', :float
17
+ type_map.register_alias 'mysql:decimal', :decimal
18
+ type_map.register_alias 'mysql:time', :time
19
+
20
+ type_map.register_alias 'mysql:set', 'mysql:varchar'
21
+ type_map.register_alias 'mysql:text', 'mysql:varchar'
22
+ type_map.register_alias 'mysql:enum', 'mysql:varchar'
23
+ type_map.register_alias 'mysql:char', 'mysql:varchar'
24
+ type_map.register_alias 'mysql:tinytext', 'mysql:text'
25
+ type_map.register_alias 'mysql:mediumtext', 'mysql:text'
26
+ type_map.register_alias 'mysql:longtext', 'mysql:text'
27
+ type_map.register_alias 'mysql:datetime', 'mysql:timestamp'
28
+ type_map.register_alias 'mysql:varbinary', 'mysql:binary'
29
+ type_map.register_alias 'mysql:blob', 'mysql:binary'
30
+ type_map.register_alias 'mysql:tinyblob', 'mysql:blob'
31
+ type_map.register_alias 'mysql:mediumblob', 'mysql:blob'
32
+ type_map.register_alias 'mysql:longblob', 'mysql:blob'
33
+ type_map.register_alias 'mysql:tinyint', 'mysql:int'
34
+ type_map.register_alias 'mysql:smallint', 'mysql:int'
35
+ type_map.register_alias 'mysql:mediumint', 'mysql:int'
36
+ type_map.register_alias 'mysql:double', 'mysql:float'
37
+
38
+ module MySQL
39
+ module SourceMethods
40
+ protected
41
+
42
+ def mysql_attributes
43
+ model.columns_hash.each_value do |column|
44
+ next yield(column.name, find_type!(:id)) if id_columns.include?(column.name)
45
+
46
+ base_type, size = column.sql_type_metadata.sql_type.split(/(\(\d+\))/)
47
+ type_name = base_type.end_with?('int') && size == '(1)' ? 'bit' : base_type
48
+
49
+ type = find_type!("mysql:#{type_name}", fallback: :string)
50
+
51
+ yield(column.name, type, array: (base_type == 'set'))
52
+ end
53
+ end
54
+ end
55
+ end
56
+
57
+ Source::ActiveRecordSource.extend(MySQL::SourceMethods)
58
+ end
59
+ end
@@ -1,45 +1,48 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module Rails # :nodoc:
4
- module GraphQL # :nodoc:
3
+ module Rails
4
+ module GraphQL
5
5
  # Based on:
6
6
  # SELECT t.oid, t.typname, format_type(t.oid, NULL) AS sql_type
7
7
  # FROM pg_type t
8
8
  # WHERE typtype = 'b'
9
- # AND typcategory IN ('B', 'D', 'G', 'I', 'N', 'S', 'T', 'V')
9
+ # AND typcategory IN ('B', 'D', 'G', 'I', 'N', 'S', 'T', 'U', 'V')
10
10
  # AND typowner = 10;
11
- type_map.register_alias 'pg:boolean', :boolean
12
- type_map.register_alias 'pg:integer', :int
13
- type_map.register_alias 'pg:date', :date
14
-
15
- type_map.register_alias 'pg:char', :string
16
11
  type_map.register_alias 'pg:bigint', :bigint
17
- type_map.register_alias 'pg:smallint', :int
12
+ type_map.register_alias 'pg:boolean', :boolean
18
13
  type_map.register_alias 'pg:text', :string
19
- type_map.register_alias 'pg:oid', :int
14
+ type_map.register_alias 'pg:date', :date
15
+ type_map.register_alias 'pg:integer', :int
16
+ type_map.register_alias 'pg:json', :json
17
+ type_map.register_alias 'pg:numeric', :decimal
20
18
  type_map.register_alias 'pg:real', :float
21
- type_map.register_alias 'pg:double precision', :float
22
- type_map.register_alias 'pg:money', :decimal
23
- type_map.register_alias 'pg:character', :string
24
- type_map.register_alias 'pg:character varying', :string
25
- type_map.register_alias 'pg:timestamp', :date_time
26
- type_map.register_alias 'pg:timestamp without time zone', :date_time
27
- type_map.register_alias 'pg:timestamp with time zone', :date_time
28
19
  type_map.register_alias 'pg:time without time zone', :time
29
- type_map.register_alias 'pg:time with time zone', :time
30
- type_map.register_alias 'pg:numeric', :decimal
20
+ type_map.register_alias 'pg:timestamp', :date_time
21
+
22
+ type_map.register_alias 'pg:char', 'pg:text'
23
+ type_map.register_alias 'pg:smallint', 'pg:integer'
24
+ type_map.register_alias 'pg:oid', 'pg:integer'
25
+ type_map.register_alias 'pg:double precision', 'pg:real'
26
+ type_map.register_alias 'pg:money', 'pg:numeric'
27
+ type_map.register_alias 'pg:character', 'pg:text'
28
+ type_map.register_alias 'pg:character varying', 'pg:text'
29
+ type_map.register_alias 'pg:timestamp without time zone', 'pg:timestamp'
30
+ type_map.register_alias 'pg:timestamp with time zone', 'pg:timestamp'
31
+ type_map.register_alias 'pg:time with time zone', 'pg:time without time zone'
32
+ type_map.register_alias 'pg:jsonb', 'pg:json'
31
33
 
32
- module PG # :nodoc: all
34
+ module PG
33
35
  module SourceMethods
34
36
  protected
35
37
 
36
38
  def pg_attributes
37
39
  model.columns_hash.each_value do |column|
40
+ next yield(column.name, find_type!(:id)) if id_columns.include?(column.name)
41
+
38
42
  type_name = column.sql_type_metadata.sql_type
39
43
  type = find_type!('pg:' + type_name.gsub(/(\(|\[).*/, ''), fallback: :string)
40
44
 
41
- options = { array: type_name.include?('[]') }
42
- yield column.name, type, options
45
+ yield(column.name, type, array: type_name.include?('[]'))
43
46
  end
44
47
  end
45
48
  end
@@ -1,34 +1,37 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module Rails # :nodoc:
4
- module GraphQL # :nodoc:
3
+ module Rails
4
+ module GraphQL
5
5
 
6
6
  # Based on:
7
7
  # https://github.com/rails/rails/blob/v6.0.0/activerecord/lib/active_record/
8
8
  # connection_adapters/sqlite3_adapter.rb#L64
9
+ type_map.register_alias 'sqlite:binary', :binary
10
+ type_map.register_alias 'sqlite:boolean', :boolean
11
+ type_map.register_alias 'sqlite:date', :date
12
+ type_map.register_alias 'sqlite:datetime', :date_time
13
+ type_map.register_alias 'sqlite:decimal', :decimal
14
+ type_map.register_alias 'sqlite:float', :float
15
+ type_map.register_alias 'sqlite:integer', :int
16
+ type_map.register_alias 'sqlite:json', :json
9
17
  type_map.register_alias 'sqlite:primary_key', :id
10
18
  type_map.register_alias 'sqlite:string', :string
11
- type_map.register_alias 'sqlite:text', :string
12
- type_map.register_alias 'sqlite:integer', :int
13
- type_map.register_alias 'sqlite:float', :float
14
- type_map.register_alias 'sqlite:decimal', :decimal
15
- type_map.register_alias 'sqlite:datetime', :date_time
16
19
  type_map.register_alias 'sqlite:time', :time
17
- type_map.register_alias 'sqlite:date', :date
18
- type_map.register_alias 'sqlite:binary', :binary
19
- type_map.register_alias 'sqlite:boolean', :boolean
20
- # TODO: Add support to JSON type
21
- # type_map.register_alias 'pg:json', :json
22
20
 
23
- module SQLite # :nodoc: all
21
+ type_map.register_alias 'sqlite:varchar', 'sqlite:string'
22
+ type_map.register_alias 'sqlite:text', 'sqlite:string'
23
+
24
+ module SQLite
24
25
  module SourceMethods
25
26
  protected
26
27
 
27
28
  def sqlite_attributes
28
29
  model.columns_hash.each_value do |column|
30
+ next yield(column.name, find_type!(:id)) if id_columns.include?(column.name)
31
+
29
32
  type_name = column.sql_type_metadata.sql_type
30
33
  type = find_type!("sqlite:#{type_name}", fallback: :string)
31
- yield column.name, type
34
+ yield(column.name, type)
32
35
  end
33
36
  end
34
37
  end
@@ -0,0 +1,48 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Rails
4
+ module GraphQL
5
+ module Alternative
6
+ # = GraphQL Alternative Field Set
7
+ #
8
+ # A simple way to store fields that share some logic with each other
9
+ class FieldSet
10
+ extend Helpers::WithNamespace
11
+ extend Helpers::WithFields
12
+
13
+ include Helpers::Instantiable
14
+
15
+ self.field_type = Field::OutputField
16
+ self.valid_field_types = Type::Object.valid_field_types
17
+
18
+ def self.i18n_scope
19
+ :query
20
+ end
21
+
22
+ def self.inspect
23
+ +"#<#{self.class.name} @fields=#{fields.inspect}>"
24
+ end
25
+ end
26
+
27
+ # = GraphQL Alternative Query Set
28
+ #
29
+ # Exact the same as a +FieldSet+
30
+ QuerySet = FieldSet
31
+
32
+ # = GraphQL Alternative Mutation Set
33
+ #
34
+ # Same as a +FieldSet+ but for mutation fields
35
+ MutationSet = Class.new(FieldSet)
36
+ MutationSet.field_type = Field::MutationField
37
+ MutationSet.redefine_singleton_method(:i18n_scope) { :mutation }
38
+
39
+
40
+ # = GraphQL Alternative Subscription Set
41
+ #
42
+ # Same as a +FieldSet+ but for subscription fields
43
+ SubscriptionSet = Class.new(FieldSet)
44
+ SubscriptionSet.field_type = Field::SubscriptionField
45
+ SubscriptionSet.redefine_singleton_method(:i18n_scope) { :subscription }
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Rails
4
+ module GraphQL
5
+ # = GraphQL Alternative Mutation
6
+ #
7
+ # Same as it's parent class, but for mutations
8
+ class Alternative::Mutation < Alternative::Query
9
+ redefine_singleton_method(:type_field_class) { :mutation }
10
+ self.abstract = true
11
+
12
+ class << self
13
+ delegate :perform, to: :@field, allow_nil: true
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,98 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Rails
4
+ module GraphQL
5
+ # = GraphQL Alternative Query
6
+ #
7
+ # This object acts like a field, but is organized as an object for extended
8
+ # resolvers or really complex fields.
9
+ class Alternative::Query
10
+ extend Helpers::WithNamespace
11
+ include Helpers::Instantiable
12
+
13
+ # An abstract class will not have its field imported
14
+ class_attribute :abstract, instance_accessor: false, default: false
15
+ self.abstract = true
16
+
17
+ class << self
18
+ delegate :gql_name, :to_sym, :desc, :argument, :ref_argument, :id_argument,
19
+ :use, :internal?, :disabled?, :enabled?, :disable!, :enable!, :rename!,
20
+ :authorize, :on, :description=, :description, to: :field
21
+
22
+ # Returns the type of the field class
23
+ def type_field_class
24
+ :query
25
+ end
26
+
27
+ # Alias does not work because of the override
28
+ def i18n_scope(*)
29
+ type_field_class
30
+ end
31
+
32
+ # Stores the underlying field of the object
33
+ def field
34
+ return @field if defined?(@field)
35
+ return define_field unless superclass.instance_variable_defined?(:@field)
36
+ import_field(superclass.field)
37
+ end
38
+
39
+ def inspect
40
+ defined?(@field) ? @field.inspect : super
41
+ end
42
+
43
+ protected
44
+
45
+ # Mark the given class to be pending of registration
46
+ def inherited(subclass)
47
+ subclass.abstract = false
48
+ super if defined? super
49
+ end
50
+
51
+ # Create a new field for the class
52
+ def define_field(field_name = nil, type = :any, **xargs, &block)
53
+ field_name ||= anonymous? ? '_anonymous' : begin
54
+ type_module = type_field_class.to_s.classify.pluralize
55
+ user_name = name.split(+"#{type_module}::")[1]
56
+ user_name ||= name.delete_prefix('GraphQL::')
57
+ user_name.tr(':', '')
58
+ end
59
+
60
+ # Save the generated field ensuring the owner
61
+ @field = field_class.new(field_name, type, **xargs, owner: self, &block)
62
+ end
63
+
64
+ # Import the field from a given source
65
+ def import_field(other_field, **xargs, &block)
66
+ @field = other_field.to_proxy(**xargs, owner: self, &block)
67
+ end
68
+
69
+ # Change the return type of the field
70
+ def returns(type, **xargs)
71
+ full = xargs.fetch(:full, false)
72
+ null = full ? false : xargs.fetch(:null, true)
73
+ array = full ? true : xargs.fetch(:array, false)
74
+ nullable = full ? false : xargs.fetch(:nullable, true)
75
+
76
+ field.send(:assign_type, type)
77
+ field.instance_variable_set(:@null, null)
78
+ field.instance_variable_set(:@array, array)
79
+ field.instance_variable_set(:@nullable, nullable)
80
+ end
81
+
82
+ private
83
+
84
+ # Return the class of the underlying field
85
+ def field_class
86
+ return @field.class if defined?(@field)
87
+ list = Helpers::WithSchemaFields::TYPE_FIELD_CLASS
88
+ GraphQL::Field.const_get(list[type_field_class])
89
+ end
90
+ end
91
+ end
92
+
93
+ # = GraphQL Alternative Field
94
+ #
95
+ # Just an alias, since query fields are the same as output fields
96
+ Alternative.const_set(:Field, Alternative::Query)
97
+ end
98
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Rails
4
+ module GraphQL
5
+ # = GraphQL Alternative Subscription
6
+ #
7
+ # Same as it's parent class, but for subscription
8
+ class Alternative::Subscription < Alternative::Query
9
+ redefine_singleton_method(:type_field_class) { :subscription }
10
+ self.abstract = true
11
+
12
+ class << self
13
+ delegate :scope, :trigger_for, :trigger, :unsubscribe_from, :unsubscribe,
14
+ to: :@field, allow_nil: true
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Rails
4
+ module GraphQL
5
+ # Several alternatives to declare GraphQL objects
6
+ module Alternative
7
+ extend ActiveSupport::Autoload
8
+
9
+ autoload :Query
10
+ autoload :Mutation
11
+ autoload :Subscription
12
+
13
+ autoload_at "#{__dir__}/alternative/field_set" do
14
+ autoload :FieldSet
15
+ autoload :MutationSet
16
+ autoload :SubscriptionSet
17
+ end
18
+ end
19
+ end
20
+ end