graphql 1.7.14 → 1.8.0.pre1
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 +5 -5
- data/lib/generators/graphql/function_generator.rb +1 -1
- data/lib/generators/graphql/loader_generator.rb +1 -1
- data/lib/generators/graphql/mutation_generator.rb +1 -6
- data/lib/generators/graphql/templates/function.erb +2 -2
- data/lib/generators/graphql/templates/loader.erb +2 -2
- data/lib/graphql.rb +2 -0
- data/lib/graphql/argument.rb +0 -1
- data/lib/graphql/backwards_compatibility.rb +2 -3
- data/lib/graphql/base_type.rb +18 -16
- data/lib/graphql/compatibility/query_parser_specification.rb +0 -117
- data/lib/graphql/compatibility/query_parser_specification/parse_error_specification.rb +0 -14
- data/lib/graphql/define/assign_object_field.rb +5 -12
- data/lib/graphql/deprecated_dsl.rb +28 -0
- data/lib/graphql/directive.rb +0 -1
- data/lib/graphql/enum_type.rb +1 -3
- data/lib/graphql/execution.rb +0 -1
- data/lib/graphql/execution/multiplex.rb +29 -12
- data/lib/graphql/field.rb +5 -20
- data/lib/graphql/function.rb +12 -0
- data/lib/graphql/input_object_type.rb +1 -3
- data/lib/graphql/internal_representation/node.rb +14 -26
- data/lib/graphql/internal_representation/visit.rb +6 -3
- data/lib/graphql/introspection/arguments_field.rb +0 -1
- data/lib/graphql/introspection/enum_values_field.rb +0 -1
- data/lib/graphql/introspection/fields_field.rb +0 -1
- data/lib/graphql/introspection/input_fields_field.rb +0 -1
- data/lib/graphql/introspection/interfaces_field.rb +0 -1
- data/lib/graphql/introspection/of_type_field.rb +0 -1
- data/lib/graphql/introspection/possible_types_field.rb +0 -1
- data/lib/graphql/introspection/schema_field.rb +0 -1
- data/lib/graphql/introspection/type_by_name_field.rb +0 -1
- data/lib/graphql/introspection/typename_field.rb +0 -1
- data/lib/graphql/language.rb +0 -3
- data/lib/graphql/language/generation.rb +182 -3
- data/lib/graphql/language/lexer.rb +69 -144
- data/lib/graphql/language/lexer.rl +4 -15
- data/lib/graphql/language/nodes.rb +76 -136
- data/lib/graphql/language/parser.rb +621 -668
- data/lib/graphql/language/parser.y +11 -17
- data/lib/graphql/language/token.rb +3 -10
- data/lib/graphql/object_type.rb +6 -1
- data/lib/graphql/query.rb +13 -8
- data/lib/graphql/query/arguments.rb +33 -48
- data/lib/graphql/query/context.rb +1 -0
- data/lib/graphql/query/literal_input.rb +1 -4
- data/lib/graphql/relay/connection_resolve.rb +3 -0
- data/lib/graphql/relay/global_id_resolve.rb +5 -1
- data/lib/graphql/relay/relation_connection.rb +19 -14
- data/lib/graphql/schema.rb +219 -12
- data/lib/graphql/schema/argument.rb +33 -0
- data/lib/graphql/schema/build_from_definition.rb +18 -64
- data/lib/graphql/schema/enum.rb +76 -0
- data/lib/graphql/schema/field.rb +127 -0
- data/lib/graphql/schema/field/dynamic_resolve.rb +63 -0
- data/lib/graphql/schema/field/unwrapped_resolve.rb +20 -0
- data/lib/graphql/schema/input_object.rb +61 -0
- data/lib/graphql/schema/interface.rb +32 -0
- data/lib/graphql/schema/loader.rb +2 -2
- data/lib/graphql/schema/member.rb +97 -0
- data/lib/graphql/schema/member/build_type.rb +106 -0
- data/lib/graphql/schema/member/has_fields.rb +56 -0
- data/lib/graphql/schema/member/instrumentation.rb +113 -0
- data/lib/graphql/schema/member/list_type_proxy.rb +21 -0
- data/lib/graphql/schema/member/non_null_type_proxy.rb +21 -0
- data/lib/graphql/schema/object.rb +65 -0
- data/lib/graphql/schema/printer.rb +266 -33
- data/lib/graphql/schema/scalar.rb +25 -0
- data/lib/graphql/schema/traversal.rb +26 -17
- data/lib/graphql/schema/union.rb +48 -0
- data/lib/graphql/static_validation/rules/fields_have_appropriate_selections.rb +1 -5
- data/lib/graphql/static_validation/rules/fields_will_merge.rb +8 -15
- data/lib/graphql/static_validation/rules/variables_are_used_and_defined.rb +1 -11
- data/lib/graphql/subscriptions/action_cable_subscriptions.rb +5 -7
- data/lib/graphql/tracing.rb +0 -1
- data/lib/graphql/tracing/platform_tracing.rb +7 -20
- data/lib/graphql/tracing/scout_tracing.rb +2 -2
- data/lib/graphql/unresolved_type_error.rb +2 -3
- data/lib/graphql/version.rb +1 -1
- data/readme.md +1 -1
- data/spec/dummy/app/channels/graphql_channel.rb +1 -22
- data/spec/dummy/log/development.log +0 -239
- data/spec/dummy/log/test.log +0 -204
- data/spec/dummy/test/system/action_cable_subscription_test.rb +0 -4
- data/spec/dummy/tmp/screenshots/failures_test_it_handles_subscriptions.png +0 -0
- data/spec/generators/graphql/function_generator_spec.rb +0 -26
- data/spec/generators/graphql/loader_generator_spec.rb +0 -24
- data/spec/graphql/analysis/max_query_complexity_spec.rb +3 -3
- data/spec/graphql/analysis/max_query_depth_spec.rb +3 -3
- data/spec/graphql/backtrace_spec.rb +0 -10
- data/spec/graphql/base_type_spec.rb +5 -19
- data/spec/graphql/boolean_type_spec.rb +3 -3
- data/spec/graphql/directive_spec.rb +1 -3
- data/spec/graphql/enum_type_spec.rb +5 -18
- data/spec/graphql/execution/execute_spec.rb +1 -1
- data/spec/graphql/execution/multiplex_spec.rb +2 -2
- data/spec/graphql/float_type_spec.rb +2 -2
- data/spec/graphql/id_type_spec.rb +1 -1
- data/spec/graphql/input_object_type_spec.rb +2 -15
- data/spec/graphql/int_type_spec.rb +2 -2
- data/spec/graphql/internal_representation/rewrite_spec.rb +2 -2
- data/spec/graphql/introspection/schema_type_spec.rb +0 -1
- data/spec/graphql/language/generation_spec.rb +186 -21
- data/spec/graphql/language/lexer_spec.rb +1 -21
- data/spec/graphql/language/nodes_spec.rb +12 -21
- data/spec/graphql/language/parser_spec.rb +1 -1
- data/spec/graphql/query/arguments_spec.rb +15 -37
- data/spec/graphql/query/serial_execution/value_resolution_spec.rb +2 -2
- data/spec/graphql/query/variables_spec.rb +1 -1
- data/spec/graphql/query_spec.rb +5 -31
- data/spec/graphql/rake_task_spec.rb +1 -3
- data/spec/graphql/relay/base_connection_spec.rb +1 -1
- data/spec/graphql/relay/connection_instrumentation_spec.rb +2 -2
- data/spec/graphql/relay/connection_resolve_spec.rb +1 -1
- data/spec/graphql/relay/connection_type_spec.rb +1 -1
- data/spec/graphql/relay/mutation_spec.rb +3 -3
- data/spec/graphql/relay/relation_connection_spec.rb +1 -65
- data/spec/graphql/schema/build_from_definition_spec.rb +4 -86
- data/spec/graphql/schema/enum_spec.rb +60 -0
- data/spec/graphql/schema/field_spec.rb +14 -0
- data/spec/graphql/schema/input_object_spec.rb +43 -0
- data/spec/graphql/schema/interface_spec.rb +98 -0
- data/spec/graphql/schema/object_spec.rb +119 -0
- data/spec/graphql/schema/printer_spec.rb +15 -92
- data/spec/graphql/schema/scalar_spec.rb +40 -0
- data/spec/graphql/schema/union_spec.rb +35 -0
- data/spec/graphql/schema/validation_spec.rb +1 -1
- data/spec/graphql/schema/warden_spec.rb +11 -11
- data/spec/graphql/schema_spec.rb +25 -23
- data/spec/graphql/static_validation/rules/fields_have_appropriate_selections_spec.rb +2 -10
- data/spec/graphql/static_validation/rules/fields_will_merge_spec.rb +2 -2
- data/spec/graphql/string_type_spec.rb +3 -3
- data/spec/graphql/subscriptions_spec.rb +1 -1
- data/spec/graphql/tracing/platform_tracing_spec.rb +1 -60
- data/spec/support/dummy/schema.rb +25 -39
- data/spec/support/jazz.rb +334 -0
- data/spec/support/lazy_helpers.rb +21 -23
- data/spec/support/star_wars/data.rb +7 -6
- data/spec/support/star_wars/schema.rb +109 -142
- metadata +39 -33
- data/lib/graphql/execution/instrumentation.rb +0 -82
- data/lib/graphql/language/block_string.rb +0 -47
- data/lib/graphql/language/document_from_schema_definition.rb +0 -277
- data/lib/graphql/language/printer.rb +0 -351
- data/lib/graphql/tracing/data_dog_tracing.rb +0 -49
- data/spec/graphql/execution/instrumentation_spec.rb +0 -165
- data/spec/graphql/language/block_string_spec.rb +0 -70
- data/spec/graphql/language/document_from_schema_definition_spec.rb +0 -770
- data/spec/graphql/language/printer_spec.rb +0 -203
@@ -82,7 +82,8 @@ rule
|
|
82
82
|
| EQUALS literal_value { return val[1] }
|
83
83
|
|
84
84
|
selection_set:
|
85
|
-
LCURLY
|
85
|
+
LCURLY RCURLY { return [] }
|
86
|
+
| LCURLY selection_list RCURLY { return val[1] }
|
86
87
|
|
87
88
|
selection_set_opt:
|
88
89
|
/* none */ { return [] }
|
@@ -152,8 +153,12 @@ rule
|
|
152
153
|
| operation_type
|
153
154
|
| schema_keyword
|
154
155
|
|
156
|
+
name_list:
|
157
|
+
name { return [make_node(:TypeName, name: val[0])] }
|
158
|
+
| name_list name { val[0] << make_node(:TypeName, name: val[1]) }
|
159
|
+
|
155
160
|
enum_value_definition:
|
156
|
-
enum_name directives_list_opt { return make_node(:EnumValueDefinition, name: val[0], directives: val[1], description: get_description(val[0])
|
161
|
+
enum_name directives_list_opt { return make_node(:EnumValueDefinition, name: val[0], directives: val[1], description: get_description(val[0])) }
|
157
162
|
|
158
163
|
enum_value_definitions:
|
159
164
|
enum_value_definition { return [val[0]] }
|
@@ -302,21 +307,11 @@ rule
|
|
302
307
|
|
303
308
|
implements_opt:
|
304
309
|
/* none */ { return [] }
|
305
|
-
| IMPLEMENTS
|
306
|
-
| IMPLEMENTS interfaces_list { return val[1] }
|
307
|
-
| IMPLEMENTS legacy_interfaces_list { return val[1] }
|
308
|
-
|
309
|
-
interfaces_list:
|
310
|
-
name { return [make_node(:TypeName, name: val[0], position_source: val[0])] }
|
311
|
-
| interfaces_list AMP name { val[0] << make_node(:TypeName, name: val[2], position_source: val[2]) }
|
312
|
-
|
313
|
-
legacy_interfaces_list:
|
314
|
-
name { return [make_node(:TypeName, name: val[0], position_source: val[0])] }
|
315
|
-
| legacy_interfaces_list name { val[0] << make_node(:TypeName, name: val[1], position_source: val[1]) }
|
310
|
+
| IMPLEMENTS name_list { return val[1] }
|
316
311
|
|
317
312
|
input_value_definition:
|
318
313
|
name COLON type default_value_opt directives_list_opt {
|
319
|
-
return make_node(:InputValueDefinition, name: val[0], type: val[2], default_value: val[3], directives: val[4], description: get_description(val[0])
|
314
|
+
return make_node(:InputValueDefinition, name: val[0], type: val[2], default_value: val[3], directives: val[4], description: get_description(val[0]))
|
320
315
|
}
|
321
316
|
|
322
317
|
input_value_definition_list:
|
@@ -329,12 +324,11 @@ rule
|
|
329
324
|
|
330
325
|
field_definition:
|
331
326
|
name arguments_definitions_opt COLON type directives_list_opt {
|
332
|
-
return make_node(:FieldDefinition, name: val[0], arguments: val[1], type: val[3], directives: val[4], description: get_description(val[0])
|
327
|
+
return make_node(:FieldDefinition, name: val[0], arguments: val[1], type: val[3], directives: val[4], description: get_description(val[0]))
|
333
328
|
}
|
334
329
|
|
335
330
|
field_definition_list:
|
336
|
-
|
337
|
-
| field_definition { return [val[0]] }
|
331
|
+
field_definition { return [val[0]] }
|
338
332
|
| field_definition_list field_definition { val[0] << val[1] }
|
339
333
|
|
340
334
|
interface_type_definition:
|
@@ -5,30 +5,23 @@ module GraphQL
|
|
5
5
|
# Contains type, value and position data.
|
6
6
|
class Token
|
7
7
|
# @return [Symbol] The kind of token this is
|
8
|
-
attr_reader :name
|
9
|
-
# @return [String] The text of this token
|
10
|
-
attr_reader :value
|
11
|
-
attr_reader :prev_token, :line, :col
|
8
|
+
attr_reader :name, :prev_token, :line
|
12
9
|
|
13
10
|
def initialize(value:, name:, line:, col:, prev_token:)
|
14
11
|
@name = name
|
15
|
-
@value = value
|
12
|
+
@value = value
|
16
13
|
@line = line
|
17
14
|
@col = col
|
18
15
|
@prev_token = prev_token
|
19
16
|
end
|
20
17
|
|
21
|
-
|
18
|
+
def to_s; @value; end
|
22
19
|
def to_i; @value.to_i; end
|
23
20
|
def to_f; @value.to_f; end
|
24
21
|
|
25
22
|
def line_and_column
|
26
23
|
[@line, @col]
|
27
24
|
end
|
28
|
-
|
29
|
-
def inspect
|
30
|
-
"(#{@name} #{@value.inspect} [#{@line}:#{@col}])"
|
31
|
-
end
|
32
25
|
end
|
33
26
|
end
|
34
27
|
end
|
data/lib/graphql/object_type.rb
CHANGED
@@ -32,7 +32,7 @@ module GraphQL
|
|
32
32
|
# @return [Hash<String => GraphQL::Field>] Map String fieldnames to their {GraphQL::Field} implementations
|
33
33
|
|
34
34
|
# @!attribute mutation
|
35
|
-
# @return [GraphQL::Relay::Mutation, nil] The mutation this
|
35
|
+
# @return [GraphQL::Relay::Mutation, nil] The mutation this field was derived from, if it was derived from a mutation
|
36
36
|
|
37
37
|
def initialize
|
38
38
|
super
|
@@ -102,6 +102,11 @@ module GraphQL
|
|
102
102
|
dirty_ifaces.concat(interfaces)
|
103
103
|
end
|
104
104
|
|
105
|
+
def name=(name)
|
106
|
+
GraphQL::NameValidator.validate!(name)
|
107
|
+
@name = name
|
108
|
+
end
|
109
|
+
|
105
110
|
protected
|
106
111
|
|
107
112
|
attr_reader :dirty_interfaces, :dirty_inherited_interfaces
|
data/lib/graphql/query.rb
CHANGED
@@ -29,7 +29,10 @@ module GraphQL
|
|
29
29
|
end
|
30
30
|
end
|
31
31
|
|
32
|
-
attr_reader :schema, :context, :
|
32
|
+
attr_reader :schema, :context, :warden, :provided_variables
|
33
|
+
|
34
|
+
# The value for root types
|
35
|
+
attr_accessor :root_value
|
33
36
|
|
34
37
|
# @return [nil, String] The operation name provided by client or the one inferred from the document. Used to determine which operation to run.
|
35
38
|
attr_accessor :operation_name
|
@@ -44,10 +47,6 @@ module GraphQL
|
|
44
47
|
with_prepared_ast { @document }
|
45
48
|
end
|
46
49
|
|
47
|
-
def inspect
|
48
|
-
"query ..."
|
49
|
-
end
|
50
|
-
|
51
50
|
# @return [String, nil] The name of the operation to run (may be inferred)
|
52
51
|
def selected_operation_name
|
53
52
|
return nil unless selected_operation
|
@@ -157,7 +156,7 @@ module GraphQL
|
|
157
156
|
def result
|
158
157
|
if !@executed
|
159
158
|
with_prepared_ast {
|
160
|
-
Execution::Multiplex.run_queries(@schema, [self]
|
159
|
+
Execution::Multiplex.run_queries(@schema, [self])
|
161
160
|
}
|
162
161
|
end
|
163
162
|
@result ||= Query::Result.new(query: self, values: @result_values)
|
@@ -194,8 +193,11 @@ module GraphQL
|
|
194
193
|
|
195
194
|
def irep_selection
|
196
195
|
@selection ||= begin
|
197
|
-
|
198
|
-
|
196
|
+
if selected_operation && internal_representation
|
197
|
+
internal_representation.operation_definitions[selected_operation.name]
|
198
|
+
else
|
199
|
+
nil
|
200
|
+
end
|
199
201
|
end
|
200
202
|
end
|
201
203
|
|
@@ -238,6 +240,9 @@ module GraphQL
|
|
238
240
|
value = abstract_type
|
239
241
|
abstract_type = nil
|
240
242
|
end
|
243
|
+
if value.is_a?(GraphQL::Schema::Object)
|
244
|
+
value = value.object
|
245
|
+
end
|
241
246
|
@resolved_types_cache[abstract_type][value]
|
242
247
|
end
|
243
248
|
|
@@ -12,40 +12,36 @@ module GraphQL
|
|
12
12
|
argument_owner.arguments_class = Class.new(self) do
|
13
13
|
self.argument_definitions = argument_definitions
|
14
14
|
|
15
|
-
def initialize(values, defaults_used)
|
16
|
-
super(values, argument_definitions: self.class.argument_definitions, defaults_used: defaults_used)
|
17
|
-
end
|
18
|
-
|
19
15
|
argument_definitions.each do |_arg_name, arg_definition|
|
20
16
|
expose_as = arg_definition.expose_as.to_s
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
17
|
+
expose_as_underscored = GraphQL::Schema::Member::BuildType.underscore(expose_as)
|
18
|
+
method_names = [expose_as, expose_as_underscored].uniq
|
19
|
+
method_names.each do |method_name|
|
20
|
+
# Don't define a helper method if it would override something.
|
21
|
+
if instance_methods.include?(method_name)
|
22
|
+
warn(
|
23
|
+
"Unable to define a helper for argument with name '#{method_name}' "\
|
24
|
+
"as this is a reserved name. If you're using an argument such as "\
|
25
|
+
"`argument #{method_name}`, consider renaming this argument.`"
|
26
|
+
)
|
27
|
+
else
|
28
|
+
define_method(method_name) do
|
29
|
+
# Always use `expose_as` here, since #[] doesn't accept underscored names
|
30
|
+
self[expose_as]
|
31
|
+
end
|
32
|
+
end
|
34
33
|
end
|
35
34
|
end
|
36
35
|
end
|
37
36
|
end
|
38
37
|
|
39
|
-
def initialize(values,
|
38
|
+
def initialize(values, context:)
|
40
39
|
@argument_values = values.inject({}) do |memo, (inner_key, inner_value)|
|
41
|
-
|
40
|
+
arg_defn = self.class.argument_definitions[inner_key.to_s]
|
42
41
|
|
43
|
-
|
44
|
-
arg_default_used = defaults_used.include?(arg_name)
|
45
|
-
|
46
|
-
arg_value = wrap_value(inner_value, arg_defn.type)
|
42
|
+
arg_value = wrap_value(inner_value, arg_defn.type, context)
|
47
43
|
string_key = arg_defn.expose_as
|
48
|
-
memo[string_key] = ArgumentValue.new(string_key, arg_value, arg_defn
|
44
|
+
memo[string_key] = ArgumentValue.new(string_key, arg_value, arg_defn)
|
49
45
|
memo
|
50
46
|
end
|
51
47
|
end
|
@@ -64,13 +60,6 @@ module GraphQL
|
|
64
60
|
@argument_values.key?(key_s)
|
65
61
|
end
|
66
62
|
|
67
|
-
# @param key [String, Symbol] name of value to access
|
68
|
-
# @return [Boolean] true if the argument default was passed as the argument value to the resolver
|
69
|
-
def default_used?(key)
|
70
|
-
key_s = key.is_a?(String) ? key : key.to_s
|
71
|
-
@argument_values.fetch(key_s, NULL_ARGUMENT_VALUE).default_used?
|
72
|
-
end
|
73
|
-
|
74
63
|
# Get the hash of all values, with stringified keys
|
75
64
|
# @return [Hash] the stringified hash
|
76
65
|
def to_h
|
@@ -84,7 +73,7 @@ module GraphQL
|
|
84
73
|
end
|
85
74
|
end
|
86
75
|
|
87
|
-
def_delegators :to_h, :keys, :values, :each
|
76
|
+
def_delegators :to_h, :keys, :values, :each, :any?
|
88
77
|
|
89
78
|
# Access each key, value and type for the arguments in this set.
|
90
79
|
# @yield [argument_value] The {ArgumentValue} for each argument
|
@@ -95,45 +84,41 @@ module GraphQL
|
|
95
84
|
end
|
96
85
|
end
|
97
86
|
|
98
|
-
NO_ARGS = self.new({}, argument_definitions: [], defaults_used: Set.new)
|
99
|
-
|
100
87
|
class << self
|
101
88
|
attr_accessor :argument_definitions
|
102
89
|
end
|
103
90
|
|
91
|
+
NoArguments = Class.new(self) do
|
92
|
+
self.argument_definitions = []
|
93
|
+
end
|
94
|
+
|
95
|
+
NO_ARGS = NoArguments.new({}, context: nil)
|
96
|
+
|
104
97
|
private
|
105
98
|
|
106
99
|
class ArgumentValue
|
107
100
|
attr_reader :key, :value, :definition
|
108
|
-
|
109
|
-
|
110
|
-
def initialize(key, value, definition, default_used)
|
101
|
+
def initialize(key, value, definition)
|
111
102
|
@key = key
|
112
103
|
@value = value
|
113
104
|
@definition = definition
|
114
|
-
@default_used = default_used
|
115
|
-
end
|
116
|
-
|
117
|
-
# @return [Boolean] true if the argument default was passed as the argument value to the resolver
|
118
|
-
def default_used?
|
119
|
-
@default_used
|
120
105
|
end
|
121
106
|
end
|
122
107
|
|
123
|
-
NULL_ARGUMENT_VALUE = ArgumentValue.new(nil, nil, nil
|
108
|
+
NULL_ARGUMENT_VALUE = ArgumentValue.new(nil, nil, nil)
|
124
109
|
|
125
|
-
def wrap_value(value, arg_defn_type)
|
110
|
+
def wrap_value(value, arg_defn_type, context)
|
126
111
|
if value.nil?
|
127
112
|
nil
|
128
113
|
else
|
129
114
|
case arg_defn_type
|
130
115
|
when GraphQL::ListType
|
131
|
-
value.map { |item| wrap_value(item, arg_defn_type.of_type) }
|
116
|
+
value.map { |item| wrap_value(item, arg_defn_type.of_type, context) }
|
132
117
|
when GraphQL::NonNullType
|
133
|
-
wrap_value(value, arg_defn_type.of_type)
|
118
|
+
wrap_value(value, arg_defn_type.of_type, context)
|
134
119
|
when GraphQL::InputObjectType
|
135
120
|
if value.is_a?(Hash)
|
136
|
-
arg_defn_type.arguments_class.new(value,
|
121
|
+
arg_defn_type.arguments_class.new(value, context: context)
|
137
122
|
else
|
138
123
|
value
|
139
124
|
end
|
@@ -49,8 +49,6 @@ module GraphQL
|
|
49
49
|
def self.from_arguments(ast_arguments, argument_owner, variables)
|
50
50
|
context = variables ? variables.context : nil
|
51
51
|
values_hash = {}
|
52
|
-
defaults_used = Set.new
|
53
|
-
|
54
52
|
indexed_arguments = case ast_arguments
|
55
53
|
when Hash
|
56
54
|
ast_arguments
|
@@ -95,7 +93,6 @@ module GraphQL
|
|
95
93
|
# then add the default value.
|
96
94
|
if arg_defn.default_value? && !values_hash.key?(arg_name)
|
97
95
|
value = arg_defn.default_value
|
98
|
-
defaults_used << arg_name
|
99
96
|
# `context` isn't present when pre-calculating defaults
|
100
97
|
if context
|
101
98
|
value = arg_defn.prepare(value, context)
|
@@ -108,7 +105,7 @@ module GraphQL
|
|
108
105
|
end
|
109
106
|
end
|
110
107
|
|
111
|
-
argument_owner.arguments_class.new(values_hash,
|
108
|
+
argument_owner.arguments_class.new(values_hash, context: context)
|
112
109
|
end
|
113
110
|
end
|
114
111
|
end
|
@@ -41,6 +41,9 @@ module GraphQL
|
|
41
41
|
ctx.add_error(nodes)
|
42
42
|
nil
|
43
43
|
else
|
44
|
+
if parent.is_a?(GraphQL::Schema::Object)
|
45
|
+
parent = parent.object
|
46
|
+
end
|
44
47
|
connection_class = GraphQL::Relay::BaseConnection.connection_for_nodes(nodes)
|
45
48
|
connection_class.new(nodes, args, field: @field, max_page_size: @max_page_size, parent: parent, context: ctx)
|
46
49
|
end
|
@@ -7,7 +7,11 @@ module GraphQL
|
|
7
7
|
end
|
8
8
|
|
9
9
|
def call(obj, args, ctx)
|
10
|
-
|
10
|
+
if obj.is_a?(GraphQL::Schema::Object)
|
11
|
+
obj = obj.object
|
12
|
+
end
|
13
|
+
type = @type.respond_to?(:graphql_definition) ? @type.graphql_definition : @type
|
14
|
+
ctx.query.schema.id_from_object(obj, type, ctx)
|
11
15
|
end
|
12
16
|
end
|
13
17
|
end
|
@@ -7,11 +7,11 @@ module GraphQL
|
|
7
7
|
# - `Sequel::Dataset`
|
8
8
|
class RelationConnection < BaseConnection
|
9
9
|
def cursor_from_node(item)
|
10
|
-
item_index =
|
10
|
+
item_index = paged_nodes_array.index(item)
|
11
11
|
if item_index.nil?
|
12
12
|
raise("Can't generate cursor, item not found in connection: #{item}")
|
13
13
|
else
|
14
|
-
offset = item_index + 1 + ((
|
14
|
+
offset = item_index + 1 + ((relation_offset(paged_nodes) || 0) - (relation_offset(sliced_nodes) || 0))
|
15
15
|
|
16
16
|
if after
|
17
17
|
offset += offset_from_cursor(after)
|
@@ -25,9 +25,9 @@ module GraphQL
|
|
25
25
|
|
26
26
|
def has_next_page
|
27
27
|
if first
|
28
|
-
|
28
|
+
paged_nodes_length >= first && sliced_nodes_count > first
|
29
29
|
elsif GraphQL::Relay::ConnectionType.bidirectional_pagination && last
|
30
|
-
sliced_nodes_count
|
30
|
+
sliced_nodes_count > last
|
31
31
|
else
|
32
32
|
false
|
33
33
|
end
|
@@ -35,7 +35,7 @@ module GraphQL
|
|
35
35
|
|
36
36
|
def has_previous_page
|
37
37
|
if last
|
38
|
-
|
38
|
+
paged_nodes_length >= last && sliced_nodes_count > last
|
39
39
|
elsif GraphQL::Relay::ConnectionType.bidirectional_pagination && after
|
40
40
|
# We've already paginated through the collection a bit,
|
41
41
|
# there are nodes behind us
|
@@ -64,7 +64,6 @@ module GraphQL
|
|
64
64
|
private
|
65
65
|
|
66
66
|
# apply first / last limit results
|
67
|
-
# @return [Array]
|
68
67
|
def paged_nodes
|
69
68
|
return @paged_nodes if defined? @paged_nodes
|
70
69
|
|
@@ -95,14 +94,7 @@ module GraphQL
|
|
95
94
|
end
|
96
95
|
end
|
97
96
|
|
98
|
-
|
99
|
-
# (this avoids an extra DB call on Sequel)
|
100
|
-
@paged_nodes_offset = relation_offset(items)
|
101
|
-
@paged_nodes = items.to_a
|
102
|
-
end
|
103
|
-
|
104
|
-
def paged_nodes_offset
|
105
|
-
paged_nodes && @paged_nodes_offset
|
97
|
+
@paged_nodes = items
|
106
98
|
end
|
107
99
|
|
108
100
|
def relation_offset(relation)
|
@@ -174,6 +166,19 @@ module GraphQL
|
|
174
166
|
def offset_from_cursor(cursor)
|
175
167
|
decode(cursor).to_i
|
176
168
|
end
|
169
|
+
|
170
|
+
def paged_nodes_array
|
171
|
+
return @paged_nodes_array if defined?(@paged_nodes_array)
|
172
|
+
@paged_nodes_array = paged_nodes.to_a
|
173
|
+
end
|
174
|
+
|
175
|
+
def paged_nodes_length
|
176
|
+
if paged_nodes.respond_to?(:length)
|
177
|
+
paged_nodes.length
|
178
|
+
else
|
179
|
+
paged_nodes_array.length
|
180
|
+
end
|
181
|
+
end
|
177
182
|
end
|
178
183
|
|
179
184
|
if defined?(ActiveRecord::Relation)
|