graphql 2.0.3 → 2.0.6

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.

Potentially problematic release.


This version of graphql might be problematic. Click here for more details.

checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 35d89f9a897b7897a59009d2b66b436750540da911e3c8e86e185f317d74b0e8
4
- data.tar.gz: 13c06d0144815bbafcdff091815fa939969e51d693e1e33138358131df509783
3
+ metadata.gz: c31ecaae04f8ea6bca65c031a2a41d124d8a1e1dade016decfb047cae3f900ae
4
+ data.tar.gz: af77a6ac50b38ca0d23a08da8f63fea1ca8f14ef11ccda56de55e678518380c1
5
5
  SHA512:
6
- metadata.gz: '063911bc20713d486f3dca9cec21a881a4558a300b8cf03a19f34a82f23cbcd808f3a9b0b51b886b795c3c42e6b559b954e64b6a2a3f69ddd009145ae09cee4f'
7
- data.tar.gz: cbe4c5cda73c9fcc7bfb6a0e2249ba8c8dbad4e26ad3c2baf7cc5775fac6f7f19ac036baaea25d80b2fbaa58e9cade521a26d7b3c5bdd936b63efc9971c28ce1
6
+ metadata.gz: a6038fd4fe140b2196011e14cc61ba8b0ad72008b3cbe9d317bc87996fe6b42f7f289e188cd0d8c22a9d5f08c558d9774fa3533690355a16258b8276ad885e53
7
+ data.tar.gz: ff7c5db4532240f9c11d7f3008441f27c5b3a6948cfe942eaf337711436fe9c678de913a849a2e627689a15a08bb2f90f9a345185945308669447ec31dd61027
@@ -47,7 +47,7 @@ module Graphql
47
47
  #
48
48
  # Accept a `--batch` option which adds `GraphQL::Batch` setup.
49
49
  #
50
- # Use `--no-graphiql` to skip `graphiql-rails` installation.
50
+ # Use `--skip-graphiql` to skip `graphiql-rails` installation.
51
51
  #
52
52
  # TODO: also add base classes
53
53
  class InstallGenerator < Rails::Generators::Base
@@ -27,7 +27,7 @@ module GraphQL
27
27
  end
28
28
  field :of_type, GraphQL::Schema::LateBoundType.new("__Type")
29
29
 
30
- field :specified_by_url, String
30
+ field :specifiedByURL, String, resolver_method: :specified_by_url
31
31
 
32
32
  def specified_by_url
33
33
  if object.kind.scalar?
@@ -29,7 +29,7 @@ fragment FullType on __Type {
29
29
  kind
30
30
  name
31
31
  description
32
- #{include_specified_by_url ? "specifiedByUrl" : ""}
32
+ #{include_specified_by_url ? "specifiedByURL" : ""}
33
33
  fields(includeDeprecated: true) {
34
34
  name
35
35
  description
@@ -35,9 +35,11 @@ module GraphQL
35
35
  def load_nodes
36
36
  @nodes ||= begin
37
37
  sliced_nodes = if before && after
38
- items[index_from_cursor(after)..index_from_cursor(before)-1] || []
38
+ end_idx = index_from_cursor(before)-1
39
+ end_idx < 0 ? [] : items[index_from_cursor(after)..end_idx] || []
39
40
  elsif before
40
- items[0..index_from_cursor(before)-2] || []
41
+ end_idx = index_from_cursor(before)-2
42
+ end_idx < 0 ? [] : items[0..end_idx] || []
41
43
  elsif after
42
44
  items[index_from_cursor(after)..-1] || []
43
45
  else
@@ -28,6 +28,9 @@ module GraphQL
28
28
  # @return [String] Method or hash key on the underlying object to look up
29
29
  attr_reader :method_str
30
30
 
31
+ attr_reader :hash_key
32
+ attr_reader :dig_keys
33
+
31
34
  # @return [Symbol] The method on the type to look up
32
35
  def resolver_method
33
36
  if @resolver_class
@@ -187,7 +190,7 @@ module GraphQL
187
190
  # @param name [Symbol] The underscore-cased version of this field name (will be camelized for the GraphQL API)
188
191
  # @param type [Class, GraphQL::BaseType, Array] The return type of this field
189
192
  # @param owner [Class] The type that this field belongs to
190
- # @param null [Boolean] `true` if this field may return `null`, `false` if it is never `null`
193
+ # @param null [Boolean] (defaults to `true`) `true` if this field may return `null`, `false` if it is never `null`
191
194
  # @param description [String] Field description
192
195
  # @param deprecation_reason [String] If present, the field is marked "deprecated" with this message
193
196
  # @param method [Symbol] The method to call on the underlying object to resolve this field (defaults to `name`)
@@ -211,7 +214,7 @@ module GraphQL
211
214
  # @param ast_node [Language::Nodes::FieldDefinition, nil] If this schema was parsed from definition, this AST node defined the field
212
215
  # @param method_conflict_warning [Boolean] If false, skip the warning if this field's method conflicts with a built-in method
213
216
  # @param validates [Array<Hash>] Configurations for validating this field
214
- def initialize(type: nil, name: nil, owner: nil, null: true, description: :not_given, deprecation_reason: nil, method: nil, hash_key: nil, dig: nil, resolver_method: nil, connection: nil, max_page_size: :not_given, scope: nil, introspection: false, camelize: true, trace: nil, complexity: nil, ast_node: nil, extras: EMPTY_ARRAY, extensions: EMPTY_ARRAY, connection_extension: self.class.connection_extension, resolver_class: nil, subscription_scope: nil, relay_node_field: false, relay_nodes_field: false, method_conflict_warning: true, broadcastable: nil, arguments: EMPTY_HASH, directives: EMPTY_HASH, validates: EMPTY_ARRAY, &definition_block)
217
+ def initialize(type: nil, name: nil, owner: nil, null: nil, description: :not_given, deprecation_reason: nil, method: nil, hash_key: nil, dig: nil, resolver_method: nil, connection: nil, max_page_size: :not_given, scope: nil, introspection: false, camelize: true, trace: nil, complexity: nil, ast_node: nil, extras: EMPTY_ARRAY, extensions: EMPTY_ARRAY, connection_extension: self.class.connection_extension, resolver_class: nil, subscription_scope: nil, relay_node_field: false, relay_nodes_field: false, method_conflict_warning: true, broadcastable: nil, arguments: EMPTY_HASH, directives: EMPTY_HASH, validates: EMPTY_ARRAY, &definition_block)
215
218
  if name.nil?
216
219
  raise ArgumentError, "missing first `name` argument or keyword `name:`"
217
220
  end
@@ -243,17 +246,22 @@ module GraphQL
243
246
  end
244
247
  end
245
248
 
246
- # TODO: I think non-string/symbol hash keys are wrongly normalized (eg `1` will not work)
247
- method_name = method || hash_key || name_s
249
+ method_name = method || name_s
248
250
  @dig_keys = dig
249
- resolver_method ||= name_s.to_sym
251
+ @hash_key = hash_key
250
252
 
251
253
  @method_str = -method_name.to_s
252
254
  @method_sym = method_name.to_sym
253
- @resolver_method = resolver_method
255
+ @resolver_method = (resolver_method || name_s).to_sym
254
256
  @complexity = complexity
255
257
  @return_type_expr = type
256
- @return_type_null = null
258
+ @return_type_null = if !null.nil?
259
+ null
260
+ elsif resolver_class
261
+ nil
262
+ else
263
+ true
264
+ end
257
265
  @connection = connection
258
266
  @has_max_page_size = max_page_size != :not_given
259
267
  @max_page_size = max_page_size == :not_given ? nil : max_page_size
@@ -530,17 +538,13 @@ module GraphQL
530
538
  attr_writer :type
531
539
 
532
540
  def type
533
- if @return_type_expr.nil?
534
- if @resolver_class && (t = @resolver_class.type)
535
- t
536
- else
537
- # Not enough info to determine type
538
- message = "Can't determine the return type for #{self.path}"
539
- if @resolver_class
540
- message += " (it has `resolver: #{@resolver_class}`, perhaps that class is missing a `type ...` declaration, or perhaps its type causes a cyclical loading issue)"
541
- end
542
- raise MissingReturnTypeError, message
541
+ if @resolver_class
542
+ return_type = @return_type_expr || @resolver_class.type_expr
543
+ if return_type.nil?
544
+ raise MissingReturnTypeError, "Can't determine the return type for #{self.path} (it has `resolver: #{@resolver_class}`, perhaps that class is missing a `type ...` declaration, or perhaps its type causes a cyclical loading issue)"
543
545
  end
546
+ nullable = @return_type_null.nil? ? @resolver_class.null : @return_type_null
547
+ Member::BuildType.parse_type(return_type, null: nullable)
544
548
  else
545
549
  @type ||= Member::BuildType.parse_type(@return_type_expr, null: @return_type_null)
546
550
  end
@@ -633,14 +637,13 @@ module GraphQL
633
637
  obj = @resolver_class.new(object: obj, context: query_ctx, field: self)
634
638
  end
635
639
 
636
- # Find a way to resolve this field, checking:
637
- #
638
- # - A method on the type instance;
639
- # - Hash keys, if the wrapped object is a hash;
640
- # - A method on the wrapped object;
641
- # - Or, raise not implemented.
642
- #
643
- if obj.respond_to?(resolver_method)
640
+ inner_object = obj.object
641
+
642
+ if @hash_key
643
+ inner_object[@hash_key]
644
+ elsif @dig_keys
645
+ inner_object.dig(*@dig_keys)
646
+ elsif obj.respond_to?(resolver_method)
644
647
  method_to_call = resolver_method
645
648
  method_receiver = obj
646
649
  # Call the method with kwargs, if there are any
@@ -649,30 +652,27 @@ module GraphQL
649
652
  else
650
653
  obj.public_send(resolver_method)
651
654
  end
652
- elsif obj.object.is_a?(Hash)
653
- inner_object = obj.object
654
- if @dig_keys
655
- inner_object.dig(*@dig_keys)
656
- elsif inner_object.key?(@method_sym)
655
+ elsif inner_object.is_a?(Hash)
656
+ if inner_object.key?(@method_sym)
657
657
  inner_object[@method_sym]
658
658
  else
659
659
  inner_object[@method_str]
660
660
  end
661
- elsif obj.object.respond_to?(@method_sym)
661
+ elsif inner_object.respond_to?(@method_sym)
662
662
  method_to_call = @method_sym
663
663
  method_receiver = obj.object
664
664
  if ruby_kwargs.any?
665
- obj.object.public_send(@method_sym, **ruby_kwargs)
665
+ inner_object.public_send(@method_sym, **ruby_kwargs)
666
666
  else
667
- obj.object.public_send(@method_sym)
667
+ inner_object.public_send(@method_sym)
668
668
  end
669
669
  else
670
670
  raise <<-ERR
671
671
  Failed to implement #{@owner.graphql_name}.#{@name}, tried:
672
672
 
673
673
  - `#{obj.class}##{resolver_method}`, which did not exist
674
- - `#{obj.object.class}##{@method_sym}`, which did not exist
675
- - Looking up hash key `#{@method_sym.inspect}` or `#{@method_str.inspect}` on `#{obj.object}`, but it wasn't a Hash
674
+ - `#{inner_object.class}##{@method_sym}`, which did not exist
675
+ - Looking up hash key `#{@method_sym.inspect}` or `#{@method_str.inspect}` on `#{inner_object}`, but it wasn't a Hash
676
676
 
677
677
  To implement this field, define one of the methods above (and check for typos)
678
678
  ERR
@@ -142,7 +142,7 @@ module GraphQL
142
142
  Class.new(GraphQL::Schema::Scalar) do
143
143
  graphql_name(type["name"])
144
144
  description(type["description"])
145
- specified_by_url(type["specifiedByUrl"])
145
+ specified_by_url(type["specifiedByURL"])
146
146
  end
147
147
  end
148
148
  when "UNION"
@@ -148,7 +148,19 @@ module GraphQL
148
148
  end
149
149
  elsif defined?(@resolver_class) && @resolver_class
150
150
  all_defns = {}
151
- all_defns.merge!(@resolver_class.own_field_arguments)
151
+ @resolver_class.all_field_argument_definitions.each do |arg_defn|
152
+ key = arg_defn.graphql_name
153
+ case (current_value = all_defns[key])
154
+ when nil
155
+ all_defns[key] = arg_defn
156
+ when Array
157
+ current_value << arg_defn
158
+ when GraphQL::Schema::Argument
159
+ all_defns[key] = [current_value, arg_defn]
160
+ else
161
+ raise "Invariant: Unexpected argument definition, #{current_value.class}: #{current_value.inspect}"
162
+ end
163
+ end
152
164
  all_defns.merge!(own_arguments)
153
165
  else
154
166
  all_defns = own_arguments
@@ -72,7 +72,7 @@ module GraphQL
72
72
  def add_field(field_defn, method_conflict_warning: field_defn.method_conflict_warning?)
73
73
  # Check that `field_defn.original_name` equals `resolver_method` and `method_sym` --
74
74
  # that shows that no override value was given manually.
75
- if method_conflict_warning && CONFLICT_FIELD_NAMES.include?(field_defn.resolver_method) && field_defn.original_name == field_defn.resolver_method && field_defn.original_name == field_defn.method_sym
75
+ if method_conflict_warning && CONFLICT_FIELD_NAMES.include?(field_defn.resolver_method) && field_defn.original_name == field_defn.resolver_method && field_defn.original_name == field_defn.method_sym && field_defn.hash_key.nil? && field_defn.dig_keys.nil?
76
76
  warn(conflict_field_name_warning(field_defn))
77
77
  end
78
78
  prev_defn = own_fields[field_defn.name]
@@ -92,6 +92,10 @@ module GraphQL
92
92
  dummy.own_arguments
93
93
  end
94
94
 
95
+ def all_field_argument_definitions
96
+ dummy.all_argument_definitions
97
+ end
98
+
95
99
  # Also apply this argument to the input type:
96
100
  def argument(*args, own_argument: false, **kwargs, &block)
97
101
  it = input_type # make sure any inherited arguments are already added to it
@@ -73,7 +73,7 @@ module GraphQL
73
73
  context.schema.after_lazy(ready_val) do |is_ready, ready_early_return|
74
74
  if ready_early_return
75
75
  if is_ready != false
76
- raise "Unexpected result from #ready? (expected `true`, `false` or `[false, {...}]`): [#{authorized_result.inspect}, #{ready_early_return.inspect}]"
76
+ raise "Unexpected result from #ready? (expected `true`, `false` or `[false, {...}]`): [#{is_ready.inspect}, #{ready_early_return.inspect}]"
77
77
  else
78
78
  ready_early_return
79
79
  end
@@ -216,8 +216,8 @@ module GraphQL
216
216
  get_argument(name, context)
217
217
  end
218
218
 
219
- def own_field_arguments
220
- own_arguments
219
+ def all_field_argument_definitions
220
+ all_argument_definitions
221
221
  end
222
222
 
223
223
  # Default `:resolve` set below.
@@ -932,6 +932,7 @@ module GraphQL
932
932
  {
933
933
  backtrace: ctx[:backtrace],
934
934
  tracers: ctx[:tracers],
935
+ dataloader: ctx[:dataloader],
935
936
  }
936
937
  else
937
938
  {}
@@ -14,6 +14,7 @@ module GraphQL
14
14
  # own Date type.
15
15
  class ISO8601Date < GraphQL::Schema::Scalar
16
16
  description "An ISO 8601-encoded date"
17
+ specified_by_url "https://tools.ietf.org/html/rfc3339"
17
18
 
18
19
  # @param value [Date,Time,DateTime,String]
19
20
  # @return [String]
@@ -22,7 +23,7 @@ module GraphQL
22
23
  end
23
24
 
24
25
  # @param str_value [String, Date, DateTime, Time]
25
- # @return [Date]
26
+ # @return [Date, nil]
26
27
  def self.coerce_input(value, ctx)
27
28
  if value.is_a?(::Date)
28
29
  value
@@ -30,6 +31,8 @@ module GraphQL
30
31
  value.to_date
31
32
  elsif value.is_a?(::Time)
32
33
  value.to_date
34
+ elsif value.nil?
35
+ nil
33
36
  else
34
37
  Date.iso8601(value)
35
38
  end
@@ -17,6 +17,7 @@ module GraphQL
17
17
  # own DateTime type.
18
18
  class ISO8601DateTime < GraphQL::Schema::Scalar
19
19
  description "An ISO 8601-encoded datetime"
20
+ specified_by_url "https://tools.ietf.org/html/rfc3339"
20
21
 
21
22
  # It's not compatible with Rails' default,
22
23
  # i.e. ActiveSupport::JSON::Encoder.time_precision (3 by default)
@@ -1,4 +1,4 @@
1
1
  # frozen_string_literal: true
2
2
  module GraphQL
3
- VERSION = "2.0.3"
3
+ VERSION = "2.0.6"
4
4
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: graphql
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.3
4
+ version: 2.0.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Robert Mosolgo
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-03-21 00:00:00.000000000 Z
11
+ date: 2022-04-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: benchmark-ips
@@ -596,7 +596,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
596
596
  - !ruby/object:Gem::Version
597
597
  version: '0'
598
598
  requirements: []
599
- rubygems_version: 3.3.3
599
+ rubygems_version: 3.2.32
600
600
  signing_key:
601
601
  specification_version: 4
602
602
  summary: A GraphQL language and runtime for Ruby