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