rails-graphql 0.1.0

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 (266) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.rdoc +19 -0
  4. data/Rakefile +31 -0
  5. data/ext/depend +3 -0
  6. data/ext/extconf.rb +57 -0
  7. data/ext/graphqlparser/Ast.cpp +346 -0
  8. data/ext/graphqlparser/Ast.h +1214 -0
  9. data/ext/graphqlparser/AstNode.h +36 -0
  10. data/ext/graphqlparser/AstVisitor.h +137 -0
  11. data/ext/graphqlparser/GraphQLParser.cpp +76 -0
  12. data/ext/graphqlparser/GraphQLParser.h +55 -0
  13. data/ext/graphqlparser/JsonVisitor.cpp +161 -0
  14. data/ext/graphqlparser/JsonVisitor.cpp.inc +456 -0
  15. data/ext/graphqlparser/JsonVisitor.h +121 -0
  16. data/ext/graphqlparser/JsonVisitor.h.inc +110 -0
  17. data/ext/graphqlparser/VERSION +1 -0
  18. data/ext/graphqlparser/c/GraphQLAst.cpp +324 -0
  19. data/ext/graphqlparser/c/GraphQLAst.h +180 -0
  20. data/ext/graphqlparser/c/GraphQLAstForEachConcreteType.h +44 -0
  21. data/ext/graphqlparser/c/GraphQLAstNode.cpp +25 -0
  22. data/ext/graphqlparser/c/GraphQLAstNode.h +33 -0
  23. data/ext/graphqlparser/c/GraphQLAstToJSON.cpp +21 -0
  24. data/ext/graphqlparser/c/GraphQLAstToJSON.h +24 -0
  25. data/ext/graphqlparser/c/GraphQLAstVisitor.cpp +55 -0
  26. data/ext/graphqlparser/c/GraphQLAstVisitor.h +53 -0
  27. data/ext/graphqlparser/c/GraphQLParser.cpp +35 -0
  28. data/ext/graphqlparser/c/GraphQLParser.h +54 -0
  29. data/ext/graphqlparser/dump_json_ast.cpp +48 -0
  30. data/ext/graphqlparser/lexer.lpp +324 -0
  31. data/ext/graphqlparser/parser.ypp +693 -0
  32. data/ext/graphqlparser/parsergen/lexer.cpp +2633 -0
  33. data/ext/graphqlparser/parsergen/lexer.h +528 -0
  34. data/ext/graphqlparser/parsergen/location.hh +189 -0
  35. data/ext/graphqlparser/parsergen/parser.tab.cpp +3300 -0
  36. data/ext/graphqlparser/parsergen/parser.tab.hpp +646 -0
  37. data/ext/graphqlparser/parsergen/position.hh +179 -0
  38. data/ext/graphqlparser/parsergen/stack.hh +156 -0
  39. data/ext/graphqlparser/syntaxdefs.h +19 -0
  40. data/ext/libgraphqlparser/AstNode.h +36 -0
  41. data/ext/libgraphqlparser/CMakeLists.txt +148 -0
  42. data/ext/libgraphqlparser/CONTRIBUTING.md +23 -0
  43. data/ext/libgraphqlparser/GraphQLParser.cpp +76 -0
  44. data/ext/libgraphqlparser/GraphQLParser.h +55 -0
  45. data/ext/libgraphqlparser/JsonVisitor.cpp +161 -0
  46. data/ext/libgraphqlparser/JsonVisitor.h +121 -0
  47. data/ext/libgraphqlparser/LICENSE +22 -0
  48. data/ext/libgraphqlparser/README.clang-tidy +7 -0
  49. data/ext/libgraphqlparser/README.md +84 -0
  50. data/ext/libgraphqlparser/ast/ast.ast +203 -0
  51. data/ext/libgraphqlparser/ast/ast.py +61 -0
  52. data/ext/libgraphqlparser/ast/c.py +100 -0
  53. data/ext/libgraphqlparser/ast/c.pyc +0 -0
  54. data/ext/libgraphqlparser/ast/c_impl.py +61 -0
  55. data/ext/libgraphqlparser/ast/c_impl.pyc +0 -0
  56. data/ext/libgraphqlparser/ast/c_visitor_impl.py +39 -0
  57. data/ext/libgraphqlparser/ast/c_visitor_impl.pyc +0 -0
  58. data/ext/libgraphqlparser/ast/casing.py +26 -0
  59. data/ext/libgraphqlparser/ast/casing.pyc +0 -0
  60. data/ext/libgraphqlparser/ast/cxx.py +197 -0
  61. data/ext/libgraphqlparser/ast/cxx.pyc +0 -0
  62. data/ext/libgraphqlparser/ast/cxx_impl.py +61 -0
  63. data/ext/libgraphqlparser/ast/cxx_impl.pyc +0 -0
  64. data/ext/libgraphqlparser/ast/cxx_json_visitor_header.py +42 -0
  65. data/ext/libgraphqlparser/ast/cxx_json_visitor_header.pyc +0 -0
  66. data/ext/libgraphqlparser/ast/cxx_json_visitor_impl.py +80 -0
  67. data/ext/libgraphqlparser/ast/cxx_json_visitor_impl.pyc +0 -0
  68. data/ext/libgraphqlparser/ast/cxx_visitor.py +64 -0
  69. data/ext/libgraphqlparser/ast/cxx_visitor.pyc +0 -0
  70. data/ext/libgraphqlparser/ast/js.py +65 -0
  71. data/ext/libgraphqlparser/ast/license.py +10 -0
  72. data/ext/libgraphqlparser/ast/license.pyc +0 -0
  73. data/ext/libgraphqlparser/c/GraphQLAstNode.cpp +25 -0
  74. data/ext/libgraphqlparser/c/GraphQLAstNode.h +33 -0
  75. data/ext/libgraphqlparser/c/GraphQLAstToJSON.cpp +21 -0
  76. data/ext/libgraphqlparser/c/GraphQLAstToJSON.h +24 -0
  77. data/ext/libgraphqlparser/c/GraphQLAstVisitor.cpp +55 -0
  78. data/ext/libgraphqlparser/c/GraphQLAstVisitor.h +53 -0
  79. data/ext/libgraphqlparser/c/GraphQLParser.cpp +35 -0
  80. data/ext/libgraphqlparser/c/GraphQLParser.h +54 -0
  81. data/ext/libgraphqlparser/clang-tidy-all.sh +3 -0
  82. data/ext/libgraphqlparser/cmake/version.cmake +16 -0
  83. data/ext/libgraphqlparser/dump_json_ast.cpp +48 -0
  84. data/ext/libgraphqlparser/go/README.md +20 -0
  85. data/ext/libgraphqlparser/go/callbacks.go +18 -0
  86. data/ext/libgraphqlparser/go/gotest.go +64 -0
  87. data/ext/libgraphqlparser/lexer.lpp +324 -0
  88. data/ext/libgraphqlparser/libgraphqlparser.pc.in +11 -0
  89. data/ext/libgraphqlparser/parser.ypp +693 -0
  90. data/ext/libgraphqlparser/parsergen/lexer.cpp +2633 -0
  91. data/ext/libgraphqlparser/parsergen/lexer.h +528 -0
  92. data/ext/libgraphqlparser/parsergen/location.hh +189 -0
  93. data/ext/libgraphqlparser/parsergen/parser.tab.cpp +3300 -0
  94. data/ext/libgraphqlparser/parsergen/parser.tab.hpp +646 -0
  95. data/ext/libgraphqlparser/parsergen/position.hh +179 -0
  96. data/ext/libgraphqlparser/parsergen/stack.hh +156 -0
  97. data/ext/libgraphqlparser/python/CMakeLists.txt +14 -0
  98. data/ext/libgraphqlparser/python/README.md +5 -0
  99. data/ext/libgraphqlparser/python/example.py +31 -0
  100. data/ext/libgraphqlparser/syntaxdefs.h +19 -0
  101. data/ext/libgraphqlparser/test/BuildCAPI.c +5 -0
  102. data/ext/libgraphqlparser/test/CMakeLists.txt +25 -0
  103. data/ext/libgraphqlparser/test/JsonVisitorTests.cpp +28 -0
  104. data/ext/libgraphqlparser/test/ParserTests.cpp +352 -0
  105. data/ext/libgraphqlparser/test/kitchen-sink.graphql +59 -0
  106. data/ext/libgraphqlparser/test/kitchen-sink.json +1 -0
  107. data/ext/libgraphqlparser/test/schema-kitchen-sink.graphql +78 -0
  108. data/ext/libgraphqlparser/test/schema-kitchen-sink.json +1 -0
  109. data/ext/libgraphqlparser/test/valgrind.supp +33 -0
  110. data/ext/version.cpp +21 -0
  111. data/lib/generators/graphql/controller_generator.rb +22 -0
  112. data/lib/generators/graphql/schema_generator.rb +22 -0
  113. data/lib/generators/graphql/templates/controller.erb +5 -0
  114. data/lib/generators/graphql/templates/schema.erb +6 -0
  115. data/lib/graphqlparser.so +0 -0
  116. data/lib/rails-graphql.rb +2 -0
  117. data/lib/rails/graphql.rake +1 -0
  118. data/lib/rails/graphql.rb +185 -0
  119. data/lib/rails/graphql/adapters/mysql_adapter.rb +0 -0
  120. data/lib/rails/graphql/adapters/pg_adapter.rb +50 -0
  121. data/lib/rails/graphql/adapters/sqlite_adapter.rb +39 -0
  122. data/lib/rails/graphql/argument.rb +220 -0
  123. data/lib/rails/graphql/callback.rb +124 -0
  124. data/lib/rails/graphql/collectors.rb +14 -0
  125. data/lib/rails/graphql/collectors/hash_collector.rb +83 -0
  126. data/lib/rails/graphql/collectors/idented_collector.rb +73 -0
  127. data/lib/rails/graphql/collectors/json_collector.rb +114 -0
  128. data/lib/rails/graphql/config.rb +61 -0
  129. data/lib/rails/graphql/directive.rb +203 -0
  130. data/lib/rails/graphql/directive/deprecated_directive.rb +59 -0
  131. data/lib/rails/graphql/directive/include_directive.rb +24 -0
  132. data/lib/rails/graphql/directive/skip_directive.rb +24 -0
  133. data/lib/rails/graphql/errors.rb +42 -0
  134. data/lib/rails/graphql/event.rb +141 -0
  135. data/lib/rails/graphql/field.rb +318 -0
  136. data/lib/rails/graphql/field/input_field.rb +92 -0
  137. data/lib/rails/graphql/field/mutation_field.rb +52 -0
  138. data/lib/rails/graphql/field/output_field.rb +96 -0
  139. data/lib/rails/graphql/field/proxied_field.rb +131 -0
  140. data/lib/rails/graphql/field/resolved_field.rb +96 -0
  141. data/lib/rails/graphql/field/scoped_config.rb +22 -0
  142. data/lib/rails/graphql/field/typed_field.rb +104 -0
  143. data/lib/rails/graphql/helpers.rb +40 -0
  144. data/lib/rails/graphql/helpers/attribute_delegator.rb +39 -0
  145. data/lib/rails/graphql/helpers/inherited_collection.rb +152 -0
  146. data/lib/rails/graphql/helpers/leaf_from_ar.rb +141 -0
  147. data/lib/rails/graphql/helpers/registerable.rb +103 -0
  148. data/lib/rails/graphql/helpers/with_arguments.rb +125 -0
  149. data/lib/rails/graphql/helpers/with_assignment.rb +113 -0
  150. data/lib/rails/graphql/helpers/with_callbacks.rb +55 -0
  151. data/lib/rails/graphql/helpers/with_directives.rb +126 -0
  152. data/lib/rails/graphql/helpers/with_events.rb +81 -0
  153. data/lib/rails/graphql/helpers/with_fields.rb +141 -0
  154. data/lib/rails/graphql/helpers/with_namespace.rb +40 -0
  155. data/lib/rails/graphql/helpers/with_owner.rb +35 -0
  156. data/lib/rails/graphql/helpers/with_schema_fields.rb +230 -0
  157. data/lib/rails/graphql/helpers/with_validator.rb +52 -0
  158. data/lib/rails/graphql/introspection.rb +53 -0
  159. data/lib/rails/graphql/native.rb +56 -0
  160. data/lib/rails/graphql/native/functions.rb +38 -0
  161. data/lib/rails/graphql/native/location.rb +41 -0
  162. data/lib/rails/graphql/native/pointers.rb +23 -0
  163. data/lib/rails/graphql/native/visitor.rb +349 -0
  164. data/lib/rails/graphql/railtie.rb +85 -0
  165. data/lib/rails/graphql/railties/base_generator.rb +35 -0
  166. data/lib/rails/graphql/railties/controller.rb +101 -0
  167. data/lib/rails/graphql/railties/controller_runtime.rb +40 -0
  168. data/lib/rails/graphql/railties/log_subscriber.rb +62 -0
  169. data/lib/rails/graphql/request.rb +343 -0
  170. data/lib/rails/graphql/request/arguments.rb +93 -0
  171. data/lib/rails/graphql/request/component.rb +100 -0
  172. data/lib/rails/graphql/request/component/field.rb +225 -0
  173. data/lib/rails/graphql/request/component/fragment.rb +118 -0
  174. data/lib/rails/graphql/request/component/operation.rb +178 -0
  175. data/lib/rails/graphql/request/component/operation/subscription.rb +16 -0
  176. data/lib/rails/graphql/request/component/spread.rb +119 -0
  177. data/lib/rails/graphql/request/component/typename.rb +82 -0
  178. data/lib/rails/graphql/request/context.rb +51 -0
  179. data/lib/rails/graphql/request/errors.rb +54 -0
  180. data/lib/rails/graphql/request/event.rb +112 -0
  181. data/lib/rails/graphql/request/helpers/directives.rb +64 -0
  182. data/lib/rails/graphql/request/helpers/selection_set.rb +87 -0
  183. data/lib/rails/graphql/request/helpers/value_writers.rb +115 -0
  184. data/lib/rails/graphql/request/steps/organizable.rb +146 -0
  185. data/lib/rails/graphql/request/steps/prepareable.rb +33 -0
  186. data/lib/rails/graphql/request/steps/resolveable.rb +32 -0
  187. data/lib/rails/graphql/request/strategy.rb +249 -0
  188. data/lib/rails/graphql/request/strategy/dynamic_instance.rb +41 -0
  189. data/lib/rails/graphql/request/strategy/multi_query_strategy.rb +36 -0
  190. data/lib/rails/graphql/request/strategy/sequenced_strategy.rb +28 -0
  191. data/lib/rails/graphql/schema.rb +272 -0
  192. data/lib/rails/graphql/shortcuts.rb +77 -0
  193. data/lib/rails/graphql/source.rb +371 -0
  194. data/lib/rails/graphql/source/active_record/builders.rb +154 -0
  195. data/lib/rails/graphql/source/active_record_source.rb +231 -0
  196. data/lib/rails/graphql/source/scoped_arguments.rb +87 -0
  197. data/lib/rails/graphql/to_gql.rb +368 -0
  198. data/lib/rails/graphql/type.rb +138 -0
  199. data/lib/rails/graphql/type/enum.rb +206 -0
  200. data/lib/rails/graphql/type/enum/directive_location_enum.rb +30 -0
  201. data/lib/rails/graphql/type/enum/type_kind_enum.rb +57 -0
  202. data/lib/rails/graphql/type/input.rb +134 -0
  203. data/lib/rails/graphql/type/interface.rb +82 -0
  204. data/lib/rails/graphql/type/object.rb +111 -0
  205. data/lib/rails/graphql/type/object/directive_object.rb +34 -0
  206. data/lib/rails/graphql/type/object/enum_value_object.rb +25 -0
  207. data/lib/rails/graphql/type/object/field_object.rb +54 -0
  208. data/lib/rails/graphql/type/object/input_value_object.rb +49 -0
  209. data/lib/rails/graphql/type/object/schema_object.rb +40 -0
  210. data/lib/rails/graphql/type/object/type_object.rb +136 -0
  211. data/lib/rails/graphql/type/scalar.rb +71 -0
  212. data/lib/rails/graphql/type/scalar/bigint_scalar.rb +34 -0
  213. data/lib/rails/graphql/type/scalar/binary_scalar.rb +30 -0
  214. data/lib/rails/graphql/type/scalar/boolean_scalar.rb +37 -0
  215. data/lib/rails/graphql/type/scalar/date_scalar.rb +34 -0
  216. data/lib/rails/graphql/type/scalar/date_time_scalar.rb +32 -0
  217. data/lib/rails/graphql/type/scalar/decimal_scalar.rb +35 -0
  218. data/lib/rails/graphql/type/scalar/float_scalar.rb +32 -0
  219. data/lib/rails/graphql/type/scalar/id_scalar.rb +39 -0
  220. data/lib/rails/graphql/type/scalar/int_scalar.rb +36 -0
  221. data/lib/rails/graphql/type/scalar/string_scalar.rb +28 -0
  222. data/lib/rails/graphql/type/scalar/time_scalar.rb +40 -0
  223. data/lib/rails/graphql/type/union.rb +87 -0
  224. data/lib/rails/graphql/type_map.rb +347 -0
  225. data/lib/rails/graphql/version.rb +7 -0
  226. data/test/assets/introspection-db.json +0 -0
  227. data/test/assets/introspection-mem.txt +1 -0
  228. data/test/assets/introspection.gql +91 -0
  229. data/test/assets/luke.jpg +0 -0
  230. data/test/assets/mem.gql +428 -0
  231. data/test/assets/sqlite.gql +423 -0
  232. data/test/config.rb +80 -0
  233. data/test/graphql/request/context_test.rb +70 -0
  234. data/test/graphql/schema_test.rb +190 -0
  235. data/test/graphql/source_test.rb +237 -0
  236. data/test/graphql/type/enum_test.rb +203 -0
  237. data/test/graphql/type/input_test.rb +138 -0
  238. data/test/graphql/type/interface_test.rb +72 -0
  239. data/test/graphql/type/object_test.rb +104 -0
  240. data/test/graphql/type/scalar/bigint_scalar_test.rb +42 -0
  241. data/test/graphql/type/scalar/binary_scalar_test.rb +17 -0
  242. data/test/graphql/type/scalar/boolean_scalar_test.rb +40 -0
  243. data/test/graphql/type/scalar/date_scalar_test.rb +29 -0
  244. data/test/graphql/type/scalar/date_time_scalar_test.rb +29 -0
  245. data/test/graphql/type/scalar/decimal_scalar_test.rb +28 -0
  246. data/test/graphql/type/scalar/float_scalar_test.rb +22 -0
  247. data/test/graphql/type/scalar/id_scalar_test.rb +26 -0
  248. data/test/graphql/type/scalar/int_scalar_test.rb +26 -0
  249. data/test/graphql/type/scalar/string_scalar_test.rb +17 -0
  250. data/test/graphql/type/scalar/time_scalar_test.rb +36 -0
  251. data/test/graphql/type/scalar_test.rb +45 -0
  252. data/test/graphql/type/union_test.rb +82 -0
  253. data/test/graphql/type_map_test.rb +362 -0
  254. data/test/graphql/type_test.rb +68 -0
  255. data/test/graphql_test.rb +55 -0
  256. data/test/integration/config.rb +56 -0
  257. data/test/integration/memory/star_wars_introspection_test.rb +144 -0
  258. data/test/integration/memory/star_wars_query_test.rb +184 -0
  259. data/test/integration/memory/star_wars_validation_test.rb +99 -0
  260. data/test/integration/schemas/memory.rb +232 -0
  261. data/test/integration/schemas/sqlite.rb +82 -0
  262. data/test/integration/sqlite/star_wars_introspection_test.rb +15 -0
  263. data/test/integration/sqlite/star_wars_mutation_test.rb +82 -0
  264. data/test/integration/sqlite/star_wars_query_test.rb +71 -0
  265. data/test/test_ext.rb +48 -0
  266. metadata +509 -0
@@ -0,0 +1,71 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Rails # :nodoc:
4
+ module GraphQL # :nodoc:
5
+ class Type # :nodoc:
6
+ # = GraphQL ScalarType
7
+ #
8
+ # Scalar types represent primitive leaf values in a GraphQL type system.
9
+ # See http://spec.graphql.org/June2018/#ScalarTypeDefinition
10
+ #
11
+ # This class works very similarly to ActiveModel::Type::Value, but instead
12
+ # of working with instances, we operate in the singleton way.
13
+ #
14
+ # The +ar_type+ defines to which ActiveRecord type the value is casted
15
+ # when serializing to hash, which indicates if a cast is necessary or not.
16
+ class Scalar < Type
17
+ extend ActiveSupport::Autoload
18
+
19
+ setup! leaf: true, input: true, output: true
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
28
+
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
37
+
38
+ class << self
39
+ # Check if a given value is a valid non-deserialized input
40
+ def valid_input?(value)
41
+ value.is_a?(String)
42
+ end
43
+
44
+ # Check if a given value is a valid non-serialized output
45
+ def valid_output?(value)
46
+ value.respond_to?(:to_s)
47
+ end
48
+
49
+ # Transforms the given value to its representation in a JSON string
50
+ def to_json(value)
51
+ as_json(value)&.inspect
52
+ end
53
+
54
+ # Transforms the given value to its representation in a Hash object
55
+ def as_json(value)
56
+ value.to_s
57
+ end
58
+
59
+ # Turn a user input of this given type into an ruby object
60
+ def deserialize(value)
61
+ value
62
+ end
63
+
64
+ def inspect # :nodoc:
65
+ "#<GraphQL::Scalar #{gql_name}>"
66
+ end
67
+ end
68
+ end
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Rails # :nodoc:
4
+ module GraphQL # :nodoc:
5
+ class Type # :nodoc:
6
+ # Bigint basically removes the limit of the value, but it serializes as
7
+ # a string so it won't go against the spec
8
+ class Scalar::BigintScalar < Scalar
9
+ desc <<~DESC
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
+ DESC
13
+
14
+ class << self
15
+ def valid_input?(value)
16
+ super && value.match?(/\A[+-]?\d+\z/)
17
+ end
18
+
19
+ def valid_output?(value)
20
+ value.respond_to?(:to_i)
21
+ end
22
+
23
+ def as_json(value)
24
+ value.to_i.to_s
25
+ end
26
+
27
+ def deserialize(value)
28
+ value.to_i
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Rails # :nodoc:
4
+ module GraphQL # :nodoc:
5
+ class Type # :nodoc:
6
+ # Binary basically allows binary data to be shared using Base64 strings,
7
+ # ensuring the UTF-8 encoding and performing the necessary conversion.
8
+ #
9
+ # It also rely on ActiveModel so it can easily share the same Data object.
10
+ class Scalar::BinaryScalar < Scalar
11
+ aliases :file
12
+
13
+ desc <<~DESC
14
+ The Binary scalar type represents a Base64 string.
15
+ Normally used to share files and uploads.
16
+ DESC
17
+
18
+ class << self
19
+ def as_json(value)
20
+ Base64.encode64(value.to_s).chomp
21
+ end
22
+
23
+ def deserialize(value)
24
+ ActiveModel::Type::Binary::Data.new(Base64.decode64(value))
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Rails # :nodoc:
4
+ module GraphQL # :nodoc:
5
+ class Type # :nodoc:
6
+ # The Boolean scalar type represents +true+ or +false+.
7
+ #
8
+ # See http://spec.graphql.org/June2018/#sec-Boolean
9
+ class Scalar::BooleanScalar < Scalar
10
+ self.spec_object = true
11
+ aliases :bool
12
+
13
+ desc 'The Boolean scalar type represents true or false.'
14
+
15
+ FALSE_VALUES = ::ActiveModel::Type::Boolean::FALSE_VALUES
16
+
17
+ class << self
18
+ def valid_input?(value)
19
+ value === true || value === false
20
+ end
21
+
22
+ def valid_output?(value)
23
+ value.respond_to?(:present?)
24
+ end
25
+
26
+ def as_json(value)
27
+ value.present?
28
+ end
29
+
30
+ def deserialize(value)
31
+ !FALSE_VALUES.include?(value)
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Rails # :nodoc:
4
+ module GraphQL # :nodoc:
5
+ class Type # :nodoc:
6
+ # Date uses a ISO 8601 string to exchange the value.
7
+ class Scalar::DateScalar < Scalar
8
+ desc 'The Date scalar type represents a ISO 8601 string value.'
9
+
10
+ class << self
11
+ def valid_input?(value)
12
+ super && !!Date.iso8601(value)
13
+ rescue Date::Error
14
+ false
15
+ end
16
+
17
+ def valid_output?(value)
18
+ value.respond_to?(:to_date) && !!value.to_date
19
+ rescue Date::Error
20
+ false
21
+ end
22
+
23
+ def as_json(value)
24
+ value.to_date.iso8601
25
+ end
26
+
27
+ def deserialize(value)
28
+ Date.iso8601(value)
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Rails # :nodoc:
4
+ module GraphQL # :nodoc:
5
+ class Type # :nodoc:
6
+ # DateTime uses a ISO 8601 string to exchange the value.
7
+ class Scalar::DateTimeScalar < Scalar
8
+ aliases :datetime
9
+
10
+ desc 'The DateTime scalar type represents a ISO 8601 string value.'
11
+
12
+ class << self
13
+ def valid_input?(value)
14
+ super && !!(Time.iso8601(value) rescue false)
15
+ end
16
+
17
+ def valid_output?(value)
18
+ value.respond_to?(:to_time) && !!value.to_time
19
+ end
20
+
21
+ def as_json(value)
22
+ value.to_time.iso8601
23
+ end
24
+
25
+ def deserialize(value)
26
+ Time.iso8601(value)
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Rails # :nodoc:
4
+ module GraphQL # :nodoc:
5
+ class Type # :nodoc:
6
+ # Similar to float, but implies extra precision, making sure that all the
7
+ # decimal-point numbers are kept. As Bigint, it uses a string so it won't
8
+ # go against the spec.
9
+ class Scalar::DecimalScalar < Scalar
10
+ desc <<~DESC
11
+ The Decimal scalar type represents signed fractional values with extra precision.
12
+ The values are exchange as string.
13
+ DESC
14
+
15
+ class << self
16
+ def valid_input?(value)
17
+ super && value.match?(/\A[+-]?\d+\.\d+\z/)
18
+ end
19
+
20
+ def valid_output?(value)
21
+ value.respond_to?(:to_d)
22
+ end
23
+
24
+ def as_json(value)
25
+ value.to_d.to_s
26
+ end
27
+
28
+ def deserialize(value)
29
+ value.to_d
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Rails # :nodoc:
4
+ module GraphQL # :nodoc:
5
+ class Type # :nodoc:
6
+ # The Float scalar type represents signed double-precision fractional
7
+ # values as specified by
8
+ # {IEEE 754}[http://en.wikipedia.org/wiki/IEEE_floating_point].
9
+ #
10
+ # See http://spec.graphql.org/June2018/#sec-Float
11
+ class Scalar::FloatScalar < Scalar
12
+ self.spec_object = true
13
+
14
+ desc 'The Float scalar type represents signed double‐precision fractional values.'
15
+
16
+ class << self
17
+ def valid_input?(value)
18
+ value.is_a?(Float)
19
+ end
20
+
21
+ def valid_output?(value)
22
+ value.respond_to?(:to_f)
23
+ end
24
+
25
+ def as_json(value)
26
+ value.to_f
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Rails # :nodoc:
4
+ module GraphQL # :nodoc:
5
+ class Type # :nodoc:
6
+ # The ID scalar type represents a unique identifier, often used to
7
+ # refetch an object or as the key for a cache. The ID type is serialized
8
+ # in the same way as a +StringScalar+.
9
+ #
10
+ # See http://spec.graphql.org/June2018/#sec-ID
11
+ class Scalar::IdScalar < Scalar
12
+ self.spec_object = true
13
+
14
+ rename! 'ID'
15
+
16
+ desc <<~DESC
17
+ The ID scalar type represents a unique identifier and it is serialized in the same
18
+ way as a String but it accepts both numeric and string based values as input.
19
+ DESC
20
+
21
+ class << self
22
+ def valid_input?(value)
23
+ super || value.is_a?(Integer)
24
+ end
25
+
26
+ def as_json(value)
27
+ value = value.to_s unless value.is_a?(String)
28
+ value = value.encode(Encoding::UTF_8) unless value.encoding.eql?(Encoding::UTF_8)
29
+ value
30
+ end
31
+
32
+ def deserialize(value)
33
+ value.to_s
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Rails # :nodoc:
4
+ module GraphQL # :nodoc:
5
+ class Type # :nodoc:
6
+ # The Int scalar type represents a signed 32-bit numeric
7
+ # non-fractional value.
8
+ #
9
+ # See http://spec.graphql.org/June2018/#sec-Int
10
+ class Scalar::IntScalar < Scalar
11
+ self.spec_object = true
12
+ aliases :integer
13
+
14
+ desc 'The Int scalar type represents a signed 32‐bit numeric non‐fractional value.'
15
+
16
+ max_value = (1 << 31)
17
+ RANGE = (-max_value...max_value).freeze
18
+
19
+ class << self
20
+ def valid_input?(value)
21
+ value.is_a?(Integer) && RANGE.cover?(value)
22
+ end
23
+
24
+ def valid_output?(value)
25
+ value.respond_to?(:to_i) && RANGE.cover?(value.to_i)
26
+ end
27
+
28
+ def as_json(value)
29
+ value = value.to_i
30
+ value if RANGE.cover?(value)
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Rails # :nodoc:
4
+ module GraphQL # :nodoc:
5
+ class Type # :nodoc:
6
+ # The String scalar type represents textual data, represented as UTF-8
7
+ # character sequences.
8
+ #
9
+ # See http://spec.graphql.org/June2018/#sec-String
10
+ class Scalar::StringScalar < Scalar
11
+ self.spec_object = true
12
+
13
+ desc <<~DESC
14
+ The String scalar type represents textual data, represented as UTF‐8 character
15
+ sequences.
16
+ DESC
17
+
18
+ class << self
19
+ def as_json(value)
20
+ value = value.to_s unless value.is_a?(String)
21
+ value = value.encode(Encoding::UTF_8) unless value.encoding.eql?(Encoding::UTF_8)
22
+ value
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Rails # :nodoc:
4
+ module GraphQL # :nodoc:
5
+ class Type # :nodoc:
6
+ # Uses as a float extension in order to transmit times (hours, minutes,
7
+ # and seconds) as a numeric representation of seconds and milliseconds.
8
+ class Scalar::TimeScalar < Scalar::FloatScalar
9
+ EPOCH = Time.utc(2000, 1, 1)
10
+
11
+ desc <<~MSG
12
+ The Time scalar type that represents a distance in time using hours,
13
+ minutes, seconds, and miliseconds.
14
+ MSG
15
+
16
+ # A +base_object+ helps to identify what methods are actually available
17
+ # to work as resolvers
18
+ class_attribute :precision, instance_writer: false, default: 6
19
+
20
+ class << self
21
+ def valid_input?(value)
22
+ value.match?(/\d+:\d\d(:\d\d(\.\d+)?)?/)
23
+ end
24
+
25
+ def valid_output?(value)
26
+ value.respond_to?(:to_time)
27
+ end
28
+
29
+ def as_json(value)
30
+ value.to_time.strftime(format('%%T.%%%dN', precision))
31
+ end
32
+
33
+ def deserialize(value)
34
+ "#{EPOCH.to_date.iso8601} #{value} UTC".to_time
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end