graphql 1.8.8 → 1.8.9
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/lib/graphql/base_type.rb +1 -1
 - data/lib/graphql/compatibility/execution_specification/specification_schema.rb +1 -2
 - data/lib/graphql/enum_type.rb +4 -0
 - data/lib/graphql/execution/execute.rb +2 -2
 - data/lib/graphql/field.rb +1 -7
 - data/lib/graphql/schema.rb +25 -3
 - data/lib/graphql/schema/argument.rb +3 -4
 - data/lib/graphql/schema/field.rb +19 -4
 - data/lib/graphql/types/iso_8601_date_time.rb +15 -1
 - data/lib/graphql/version.rb +1 -1
 - data/readme.md +1 -1
 - data/spec/graphql/analysis/analyze_query_spec.rb +1 -1
 - data/spec/graphql/base_type_spec.rb +3 -3
 - data/spec/graphql/enum_type_spec.rb +1 -1
 - data/spec/graphql/execution/lazy_spec.rb +18 -1
 - data/spec/graphql/execution/typecast_spec.rb +20 -20
 - data/spec/graphql/field_spec.rb +1 -1
 - data/spec/graphql/input_object_type_spec.rb +25 -0
 - data/spec/graphql/interface_type_spec.rb +4 -4
 - data/spec/graphql/introspection/input_value_type_spec.rb +1 -1
 - data/spec/graphql/object_type_spec.rb +32 -27
 - data/spec/graphql/query/executor_spec.rb +2 -2
 - data/spec/graphql/schema/argument_spec.rb +27 -0
 - data/spec/graphql/schema/field_spec.rb +16 -0
 - data/spec/graphql/schema/interface_spec.rb +2 -2
 - data/spec/graphql/schema/relay_classic_mutation_spec.rb +36 -0
 - data/spec/graphql/schema/traversal_spec.rb +10 -10
 - data/spec/graphql/schema/type_expression_spec.rb +2 -2
 - data/spec/graphql/schema/validation_spec.rb +1 -1
 - data/spec/graphql/types/iso_8601_date_time_spec.rb +25 -0
 - data/spec/graphql/union_type_spec.rb +2 -2
 - data/spec/integration/rails/graphql/input_object_type_spec.rb +4 -4
 - data/spec/integration/rails/graphql/query/variables_spec.rb +7 -7
 - data/spec/integration/rails/graphql/schema_spec.rb +6 -5
 - data/spec/integration/tmp/app/graphql/types/page_type.rb +4 -0
 - data/spec/support/dummy/data.rb +20 -17
 - data/spec/support/dummy/schema.rb +271 -281
 - data/spec/support/jazz.rb +45 -0
 - data/spec/support/lazy_helpers.rb +13 -4
 - metadata +216 -212
 
    
        checksums.yaml
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            ---
         
     | 
| 
       2 
2 
     | 
    
         
             
            SHA1:
         
     | 
| 
       3 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       4 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 3 
     | 
    
         
            +
              metadata.gz: 4378912bdbb59ceaa6006848e6eda269f1185df1
         
     | 
| 
      
 4 
     | 
    
         
            +
              data.tar.gz: 5dd1788b97f608a67ffa5c27f6848a575f996daa
         
     | 
| 
       5 
5 
     | 
    
         
             
            SHA512:
         
     | 
| 
       6 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       7 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 6 
     | 
    
         
            +
              metadata.gz: 3f9e4c341f98a13ad1018c0ae9b5c1f1063f5c5cbf8485b29c164f485f79257b8dc148db9fb959fdad9e8aa9f3d4eb05648a27b9a2168387ca3649b994f200ab
         
     | 
| 
      
 7 
     | 
    
         
            +
              data.tar.gz: e5cbe104fb2f6d06f4fdf0cf51f931367845f933440e8143897207af1bfb7302c6ae7fca0d823cc3b593bb5f83545c3c030a00c6c5a9d008b9f545a1666a52dd
         
     | 
    
        data/lib/graphql/base_type.rb
    CHANGED
    
    | 
         @@ -187,7 +187,7 @@ module GraphQL 
     | 
|
| 
       187 
187 
     | 
    
         
             
                    resolve_related_type(type_arg.call)
         
     | 
| 
       188 
188 
     | 
    
         
             
                  when String
         
     | 
| 
       189 
189 
     | 
    
         
             
                    # Get a constant by this name
         
     | 
| 
       190 
     | 
    
         
            -
                    Object.const_get(type_arg)
         
     | 
| 
      
 190 
     | 
    
         
            +
                    resolve_related_type(Object.const_get(type_arg))
         
     | 
| 
       191 
191 
     | 
    
         
             
                  else
         
     | 
| 
       192 
192 
     | 
    
         
             
                    if type_arg.respond_to?(:graphql_definition)
         
     | 
| 
       193 
193 
     | 
    
         
             
                      type_arg.graphql_definition
         
     | 
| 
         @@ -49,8 +49,7 @@ module GraphQL 
     | 
|
| 
       49 
49 
     | 
    
         
             
                    end
         
     | 
| 
       50 
50 
     | 
    
         | 
| 
       51 
51 
     | 
    
         
             
                    module TestMiddleware
         
     | 
| 
       52 
     | 
    
         
            -
                       
     | 
| 
       53 
     | 
    
         
            -
                      def self.call(parent_type, parent_object, field_definition, field_args, query_context, next_middleware)
         
     | 
| 
      
 52 
     | 
    
         
            +
                      def self.call(parent_type, parent_object, field_definition, field_args, query_context, &next_middleware)
         
     | 
| 
       54 
53 
     | 
    
         
             
                        query_context[:middleware_log] && query_context[:middleware_log] << field_definition.name
         
     | 
| 
       55 
54 
     | 
    
         
             
                        next_middleware.call
         
     | 
| 
       56 
55 
     | 
    
         
             
                      end
         
     | 
    
        data/lib/graphql/enum_type.rb
    CHANGED
    
    | 
         @@ -169,6 +169,10 @@ module GraphQL 
     | 
|
| 
       169 
169 
     | 
    
         
             
                def coerce_non_null_input(value_name, ctx)
         
     | 
| 
       170 
170 
     | 
    
         
             
                  if @values_by_name.key?(value_name)
         
     | 
| 
       171 
171 
     | 
    
         
             
                    @values_by_name.fetch(value_name).value
         
     | 
| 
      
 172 
     | 
    
         
            +
                  elsif match_by_value = @values_by_name.find { |k, v| v.value == value_name }
         
     | 
| 
      
 173 
     | 
    
         
            +
                    # this is for matching default values, which are "inputs", but they're
         
     | 
| 
      
 174 
     | 
    
         
            +
                    # the Ruby value, not the GraphQL string.
         
     | 
| 
      
 175 
     | 
    
         
            +
                    match_by_value[1].value
         
     | 
| 
       172 
176 
     | 
    
         
             
                  else
         
     | 
| 
       173 
177 
     | 
    
         
             
                    nil
         
     | 
| 
       174 
178 
     | 
    
         
             
                  end
         
     | 
| 
         @@ -142,11 +142,11 @@ module GraphQL 
     | 
|
| 
       142 
142 
     | 
    
         
             
                    # If the returned object is finished, continue to coerce
         
     | 
| 
       143 
143 
     | 
    
         
             
                    # and resolve child fields
         
     | 
| 
       144 
144 
     | 
    
         
             
                    def continue_or_wait(raw_value, field_type, field_ctx)
         
     | 
| 
       145 
     | 
    
         
            -
                      if  
     | 
| 
      
 145 
     | 
    
         
            +
                      if field_ctx.schema.lazy?(raw_value)
         
     | 
| 
       146 
146 
     | 
    
         
             
                        field_ctx.value = Execution::Lazy.new {
         
     | 
| 
       147 
147 
     | 
    
         
             
                          inner_value = begin
         
     | 
| 
       148 
148 
     | 
    
         
             
                              begin
         
     | 
| 
       149 
     | 
    
         
            -
                                 
     | 
| 
      
 149 
     | 
    
         
            +
                                field_ctx.schema.sync_lazy(raw_value)
         
     | 
| 
       150 
150 
     | 
    
         
             
                              rescue GraphQL::UnauthorizedError => err
         
     | 
| 
       151 
151 
     | 
    
         
             
                                field_ctx.schema.unauthorized_object(err)
         
     | 
| 
       152 
152 
     | 
    
         
             
                              end
         
     | 
    
        data/lib/graphql/field.rb
    CHANGED
    
    | 
         @@ -323,13 +323,7 @@ module GraphQL 
     | 
|
| 
       323 
323 
     | 
    
         | 
| 
       324 
324 
     | 
    
         
             
                module DefaultLazyResolve
         
     | 
| 
       325 
325 
     | 
    
         
             
                  def self.call(obj, args, ctx)
         
     | 
| 
       326 
     | 
    
         
            -
                     
     | 
| 
       327 
     | 
    
         
            -
                    next_obj = obj.public_send(method_name)
         
     | 
| 
       328 
     | 
    
         
            -
                    if ctx.schema.lazy?(next_obj)
         
     | 
| 
       329 
     | 
    
         
            -
                      call(next_obj, args, ctx)
         
     | 
| 
       330 
     | 
    
         
            -
                    else
         
     | 
| 
       331 
     | 
    
         
            -
                      next_obj
         
     | 
| 
       332 
     | 
    
         
            -
                    end
         
     | 
| 
      
 326 
     | 
    
         
            +
                    ctx.schema.sync_lazy(obj)
         
     | 
| 
       333 
327 
     | 
    
         
             
                  end
         
     | 
| 
       334 
328 
     | 
    
         
             
                end
         
     | 
| 
       335 
329 
     | 
    
         
             
              end
         
     | 
    
        data/lib/graphql/schema.rb
    CHANGED
    
    | 
         @@ -657,7 +657,7 @@ module GraphQL 
     | 
|
| 
       657 
657 
     | 
    
         
             
                    :static_validator, :introspection_system,
         
     | 
| 
       658 
658 
     | 
    
         
             
                    :query_analyzers, :tracers, :instrumenters,
         
     | 
| 
       659 
659 
     | 
    
         
             
                    :query_execution_strategy, :mutation_execution_strategy, :subscription_execution_strategy,
         
     | 
| 
       660 
     | 
    
         
            -
                    :validate, :multiplex_analyzers, :lazy?, :lazy_method_name, :after_lazy,
         
     | 
| 
      
 660 
     | 
    
         
            +
                    :validate, :multiplex_analyzers, :lazy?, :lazy_method_name, :after_lazy, :sync_lazy,
         
     | 
| 
       661 
661 
     | 
    
         
             
                    # Configuration
         
     | 
| 
       662 
662 
     | 
    
         
             
                    :max_complexity=, :max_depth=,
         
     | 
| 
       663 
663 
     | 
    
         
             
                    :metadata,
         
     | 
| 
         @@ -1001,9 +1001,9 @@ module GraphQL 
     | 
|
| 
       1001 
1001 
     | 
    
         
             
                # - After resolving `value`, if it's registered with `lazy_resolve` (eg, `Promise`)
         
     | 
| 
       1002 
1002 
     | 
    
         
             
                # @api private
         
     | 
| 
       1003 
1003 
     | 
    
         
             
                def after_lazy(value)
         
     | 
| 
       1004 
     | 
    
         
            -
                  if ( 
     | 
| 
      
 1004 
     | 
    
         
            +
                  if lazy?(value)
         
     | 
| 
       1005 
1005 
     | 
    
         
             
                    GraphQL::Execution::Lazy.new do
         
     | 
| 
       1006 
     | 
    
         
            -
                      result = value 
     | 
| 
      
 1006 
     | 
    
         
            +
                      result = sync_lazy(value)
         
     | 
| 
       1007 
1007 
     | 
    
         
             
                      # The returned result might also be lazy, so check it, too
         
     | 
| 
       1008 
1008 
     | 
    
         
             
                      after_lazy(result) do |final_result|
         
     | 
| 
       1009 
1009 
     | 
    
         
             
                        yield(final_result) if block_given?
         
     | 
| 
         @@ -1014,6 +1014,28 @@ module GraphQL 
     | 
|
| 
       1014 
1014 
     | 
    
         
             
                  end
         
     | 
| 
       1015 
1015 
     | 
    
         
             
                end
         
     | 
| 
       1016 
1016 
     | 
    
         | 
| 
      
 1017 
     | 
    
         
            +
                # Override this method to handle lazy objects in a custom way.
         
     | 
| 
      
 1018 
     | 
    
         
            +
                # @param value [Object] an instance of a class registered with {.lazy_resolve}
         
     | 
| 
      
 1019 
     | 
    
         
            +
                # @param ctx [GraphQL::Query::Context] the context for this query
         
     | 
| 
      
 1020 
     | 
    
         
            +
                # @return [Object] A GraphQL-ready (non-lazy) object
         
     | 
| 
      
 1021 
     | 
    
         
            +
                def self.sync_lazy(value)
         
     | 
| 
      
 1022 
     | 
    
         
            +
                  yield(value)
         
     | 
| 
      
 1023 
     | 
    
         
            +
                end
         
     | 
| 
      
 1024 
     | 
    
         
            +
             
     | 
| 
      
 1025 
     | 
    
         
            +
                # @see Schema.sync_lazy for a hook to override
         
     | 
| 
      
 1026 
     | 
    
         
            +
                # @api private
         
     | 
| 
      
 1027 
     | 
    
         
            +
                def sync_lazy(value)
         
     | 
| 
      
 1028 
     | 
    
         
            +
                  self.class.sync_lazy(value) { |v|
         
     | 
| 
      
 1029 
     | 
    
         
            +
                    lazy_method = lazy_method_name(v)
         
     | 
| 
      
 1030 
     | 
    
         
            +
                    if lazy_method
         
     | 
| 
      
 1031 
     | 
    
         
            +
                      synced_value = value.public_send(lazy_method)
         
     | 
| 
      
 1032 
     | 
    
         
            +
                      sync_lazy(synced_value)
         
     | 
| 
      
 1033 
     | 
    
         
            +
                    else
         
     | 
| 
      
 1034 
     | 
    
         
            +
                      v
         
     | 
| 
      
 1035 
     | 
    
         
            +
                    end
         
     | 
| 
      
 1036 
     | 
    
         
            +
                  }
         
     | 
| 
      
 1037 
     | 
    
         
            +
                end
         
     | 
| 
      
 1038 
     | 
    
         
            +
             
     | 
| 
       1017 
1039 
     | 
    
         
             
                protected
         
     | 
| 
       1018 
1040 
     | 
    
         | 
| 
       1019 
1041 
     | 
    
         
             
                def rescues?
         
     | 
| 
         @@ -97,12 +97,11 @@ module GraphQL 
     | 
|
| 
       97 
97 
     | 
    
         
             
                  # Used by the runtime.
         
     | 
| 
       98 
98 
     | 
    
         
             
                  # @api private
         
     | 
| 
       99 
99 
     | 
    
         
             
                  def prepare_value(obj, value)
         
     | 
| 
       100 
     | 
    
         
            -
                     
     | 
| 
       101 
     | 
    
         
            -
                    when nil
         
     | 
| 
      
 100 
     | 
    
         
            +
                    if @prepare.nil?
         
     | 
| 
       102 
101 
     | 
    
         
             
                      value
         
     | 
| 
       103 
     | 
    
         
            -
                     
     | 
| 
      
 102 
     | 
    
         
            +
                    elsif @prepare.is_a?(String) || @prepare.is_a?(Symbol)
         
     | 
| 
       104 
103 
     | 
    
         
             
                      obj.public_send(@prepare, value)
         
     | 
| 
       105 
     | 
    
         
            -
                     
     | 
| 
      
 104 
     | 
    
         
            +
                    elsif @prepare.respond_to?(:call)
         
     | 
| 
       106 
105 
     | 
    
         
             
                      @prepare.call(value, obj.context)
         
     | 
| 
       107 
106 
     | 
    
         
             
                    else
         
     | 
| 
       108 
107 
     | 
    
         
             
                      raise "Invalid prepare for #{@owner.name}.name: #{@prepare.inspect}"
         
     | 
    
        data/lib/graphql/schema/field.rb
    CHANGED
    
    | 
         @@ -126,7 +126,7 @@ module GraphQL 
     | 
|
| 
       126 
126 
     | 
    
         
             
                  # @param complexity [Numeric] When provided, set the complexity for this field
         
     | 
| 
       127 
127 
     | 
    
         
             
                  # @param scope [Boolean] If true, the return type's `.scope_items` method will be called on the return value
         
     | 
| 
       128 
128 
     | 
    
         
             
                  # @param subscription_scope [Symbol, String] A key in `context` which will be used to scope subscription payloads
         
     | 
| 
       129 
     | 
    
         
            -
                  def initialize(type: nil, name: nil, owner: nil, null: nil, field: nil, function: nil, description: nil, deprecation_reason: nil, method: nil, connection: nil, max_page_size: nil, scope: nil, resolve: nil, introspection: false, hash_key: nil, camelize: true, complexity: 1, extras: [], resolver_class: nil, subscription_scope: nil, arguments: {}, &definition_block)
         
     | 
| 
      
 129 
     | 
    
         
            +
                  def initialize(type: nil, name: nil, owner: nil, null: nil, field: nil, function: nil, description: nil, deprecation_reason: nil, method: nil, connection: nil, max_page_size: nil, scope: nil, resolve: nil, introspection: false, hash_key: nil, camelize: true, trace: nil, complexity: 1, extras: [], resolver_class: nil, subscription_scope: nil, arguments: {}, &definition_block)
         
     | 
| 
       130 
130 
     | 
    
         | 
| 
       131 
131 
     | 
    
         
             
                    if name.nil?
         
     | 
| 
       132 
132 
     | 
    
         
             
                      raise ArgumentError, "missing first `name` argument or keyword `name:`"
         
     | 
| 
         @@ -170,6 +170,7 @@ module GraphQL 
     | 
|
| 
       170 
170 
     | 
    
         
             
                    @extras = extras
         
     | 
| 
       171 
171 
     | 
    
         
             
                    @resolver_class = resolver_class
         
     | 
| 
       172 
172 
     | 
    
         
             
                    @scope = scope
         
     | 
| 
      
 173 
     | 
    
         
            +
                    @trace = trace
         
     | 
| 
       173 
174 
     | 
    
         | 
| 
       174 
175 
     | 
    
         
             
                    # Override the default from HasArguments
         
     | 
| 
       175 
176 
     | 
    
         
             
                    @own_arguments = {}
         
     | 
| 
         @@ -186,7 +187,7 @@ module GraphQL 
     | 
|
| 
       186 
187 
     | 
    
         | 
| 
       187 
188 
     | 
    
         
             
                    if definition_block
         
     | 
| 
       188 
189 
     | 
    
         
             
                      if definition_block.arity == 1
         
     | 
| 
       189 
     | 
    
         
            -
                         
     | 
| 
      
 190 
     | 
    
         
            +
                        yield self
         
     | 
| 
       190 
191 
     | 
    
         
             
                      else
         
     | 
| 
       191 
192 
     | 
    
         
             
                        instance_eval(&definition_block)
         
     | 
| 
       192 
193 
     | 
    
         
             
                      end
         
     | 
| 
         @@ -258,6 +259,10 @@ module GraphQL 
     | 
|
| 
       258 
259 
     | 
    
         
             
                      field_defn.metadata[:resolver] = @resolver_class
         
     | 
| 
       259 
260 
     | 
    
         
             
                    end
         
     | 
| 
       260 
261 
     | 
    
         | 
| 
      
 262 
     | 
    
         
            +
                    if !@trace.nil?
         
     | 
| 
      
 263 
     | 
    
         
            +
                      field_defn.trace = @trace
         
     | 
| 
      
 264 
     | 
    
         
            +
                    end
         
     | 
| 
      
 265 
     | 
    
         
            +
             
     | 
| 
       261 
266 
     | 
    
         
             
                    field_defn.resolve = self.method(:resolve_field)
         
     | 
| 
       262 
267 
     | 
    
         
             
                    field_defn.connection = connection?
         
     | 
| 
       263 
268 
     | 
    
         
             
                    field_defn.connection_max_page_size = @max_page_size
         
     | 
| 
         @@ -401,6 +406,17 @@ module GraphQL 
     | 
|
| 
       401 
406 
     | 
    
         
             
                    end
         
     | 
| 
       402 
407 
     | 
    
         
             
                  end
         
     | 
| 
       403 
408 
     | 
    
         | 
| 
      
 409 
     | 
    
         
            +
                  # @param ctx [GraphQL::Query::Context::FieldResolutionContext]
         
     | 
| 
      
 410 
     | 
    
         
            +
                  def fetch_extra(extra_name, ctx)
         
     | 
| 
      
 411 
     | 
    
         
            +
                    if respond_to?(extra_name)
         
     | 
| 
      
 412 
     | 
    
         
            +
                      self.public_send(extra_name)
         
     | 
| 
      
 413 
     | 
    
         
            +
                    elsif ctx.respond_to?(extra_name)
         
     | 
| 
      
 414 
     | 
    
         
            +
                      ctx.public_send(extra_name)
         
     | 
| 
      
 415 
     | 
    
         
            +
                    else
         
     | 
| 
      
 416 
     | 
    
         
            +
                      raise NotImplementedError, "Unknown field extra for #{self.path}: #{extra_name.inspect}"
         
     | 
| 
      
 417 
     | 
    
         
            +
                    end
         
     | 
| 
      
 418 
     | 
    
         
            +
                  end
         
     | 
| 
      
 419 
     | 
    
         
            +
             
     | 
| 
       404 
420 
     | 
    
         
             
                  NO_ARGS = {}.freeze
         
     | 
| 
       405 
421 
     | 
    
         | 
| 
       406 
422 
     | 
    
         
             
                  def public_send_field(obj, graphql_args, field_ctx)
         
     | 
| 
         @@ -424,8 +440,7 @@ module GraphQL 
     | 
|
| 
       424 
440 
     | 
    
         
             
                      end
         
     | 
| 
       425 
441 
     | 
    
         | 
| 
       426 
442 
     | 
    
         
             
                      @extras.each do |extra_arg|
         
     | 
| 
       427 
     | 
    
         
            -
                         
     | 
| 
       428 
     | 
    
         
            -
                        ruby_kwargs[extra_arg] = field_ctx.public_send(extra_arg)
         
     | 
| 
      
 443 
     | 
    
         
            +
                        ruby_kwargs[extra_arg] = fetch_extra(extra_arg, field_ctx)
         
     | 
| 
       429 
444 
     | 
    
         
             
                      end
         
     | 
| 
       430 
445 
     | 
    
         
             
                    else
         
     | 
| 
       431 
446 
     | 
    
         
             
                      ruby_kwargs = NO_ARGS
         
     | 
| 
         @@ -15,10 +15,24 @@ module GraphQL 
     | 
|
| 
       15 
15 
     | 
    
         
             
                class ISO8601DateTime < GraphQL::Schema::Scalar
         
     | 
| 
       16 
16 
     | 
    
         
             
                  description "An ISO 8601-encoded datetime"
         
     | 
| 
       17 
17 
     | 
    
         | 
| 
      
 18 
     | 
    
         
            +
                  # It's not compatible with Rails' default,
         
     | 
| 
      
 19 
     | 
    
         
            +
                  # i.e. ActiveSupport::JSON::Encoder.time_precision (3 by default)
         
     | 
| 
      
 20 
     | 
    
         
            +
                  DEFAULT_TIME_PRECISION = 0
         
     | 
| 
      
 21 
     | 
    
         
            +
             
     | 
| 
      
 22 
     | 
    
         
            +
                  # @return [Integer]
         
     | 
| 
      
 23 
     | 
    
         
            +
                  def self.time_precision
         
     | 
| 
      
 24 
     | 
    
         
            +
                    @time_precision || DEFAULT_TIME_PRECISION
         
     | 
| 
      
 25 
     | 
    
         
            +
                  end
         
     | 
| 
      
 26 
     | 
    
         
            +
             
     | 
| 
      
 27 
     | 
    
         
            +
                  # @param [Integer] value
         
     | 
| 
      
 28 
     | 
    
         
            +
                  def self.time_precision=(value)
         
     | 
| 
      
 29 
     | 
    
         
            +
                    @time_precision = value
         
     | 
| 
      
 30 
     | 
    
         
            +
                  end
         
     | 
| 
      
 31 
     | 
    
         
            +
             
     | 
| 
       18 
32 
     | 
    
         
             
                  # @param value [DateTime]
         
     | 
| 
       19 
33 
     | 
    
         
             
                  # @return [String]
         
     | 
| 
       20 
34 
     | 
    
         
             
                  def self.coerce_result(value, _ctx)
         
     | 
| 
       21 
     | 
    
         
            -
                    value.iso8601
         
     | 
| 
      
 35 
     | 
    
         
            +
                    value.iso8601(time_precision)
         
     | 
| 
       22 
36 
     | 
    
         
             
                  end
         
     | 
| 
       23 
37 
     | 
    
         | 
| 
       24 
38 
     | 
    
         
             
                  # @param str_value [String]
         
     | 
    
        data/lib/graphql/version.rb
    CHANGED
    
    
    
        data/readme.md
    CHANGED
    
    | 
         @@ -37,7 +37,7 @@ Or, see ["Getting Started"](https://rmosolgo.github.io/graphql-ruby/). 
     | 
|
| 
       37 
37 
     | 
    
         | 
| 
       38 
38 
     | 
    
         
             
            ## Upgrade
         
     | 
| 
       39 
39 
     | 
    
         | 
| 
       40 
     | 
    
         
            -
            I also sell [GraphQL::Pro](http://graphql.pro) which provides several features on top of the GraphQL runtime, including [authorization](http://rmosolgo.github.io/graphql-ruby/ 
     | 
| 
      
 40 
     | 
    
         
            +
            I also sell [GraphQL::Pro](http://graphql.pro) which provides several features on top of the GraphQL runtime, including [Pundit authorization](http://rmosolgo.github.io/graphql-ruby/authorization/pundit_integration), [CanCan authorization](http://rmosolgo.github.io/graphql-ruby/authorization/can_can_integration), [Pusher-based subscriptions](http://graphql-ruby.org/subscriptions/pusher_implementation) and [persisted queries](http://rmosolgo.github.io/graphql-ruby/operation_store/overview). Besides that, Pro customers get email support and an opportunity to support graphql-ruby's development!
         
     | 
| 
       41 
41 
     | 
    
         | 
| 
       42 
42 
     | 
    
         
             
            ## Goals
         
     | 
| 
       43 
43 
     | 
    
         | 
| 
         @@ -78,7 +78,7 @@ describe GraphQL::Analysis do 
     | 
|
| 
       78 
78 
     | 
    
         | 
| 
       79 
79 
     | 
    
         
             
                it "calls the defined analyzers" do
         
     | 
| 
       80 
80 
     | 
    
         
             
                  collected_types, node_counts = reduce_result
         
     | 
| 
       81 
     | 
    
         
            -
                  expected_visited_types = [Dummy:: 
     | 
| 
      
 81 
     | 
    
         
            +
                  expected_visited_types = [Dummy::DairyAppQuery.graphql_definition, Dummy::Cheese.graphql_definition, GraphQL::INT_TYPE, GraphQL::STRING_TYPE]
         
     | 
| 
       82 
82 
     | 
    
         
             
                  assert_equal expected_visited_types, collected_types
         
     | 
| 
       83 
83 
     | 
    
         
             
                  expected_node_counts = {
         
     | 
| 
       84 
84 
     | 
    
         
             
                    GraphQL::Language::Nodes::OperationDefinition => 1,
         
     | 
| 
         @@ -11,7 +11,7 @@ describe GraphQL::BaseType do 
     | 
|
| 
       11 
11 
     | 
    
         
             
              end
         
     | 
| 
       12 
12 
     | 
    
         | 
| 
       13 
13 
     | 
    
         
             
              it "can be compared" do
         
     | 
| 
       14 
     | 
    
         
            -
                obj_type = Dummy:: 
     | 
| 
      
 14 
     | 
    
         
            +
                obj_type = Dummy::Milk.graphql_definition
         
     | 
| 
       15 
15 
     | 
    
         
             
                assert_equal(!GraphQL::INT_TYPE, !GraphQL::INT_TYPE)
         
     | 
| 
       16 
16 
     | 
    
         
             
                refute_equal(!GraphQL::FLOAT_TYPE, GraphQL::FLOAT_TYPE)
         
     | 
| 
       17 
17 
     | 
    
         
             
                assert_equal(
         
     | 
| 
         @@ -25,7 +25,7 @@ describe GraphQL::BaseType do 
     | 
|
| 
       25 
25 
     | 
    
         
             
              end
         
     | 
| 
       26 
26 
     | 
    
         | 
| 
       27 
27 
     | 
    
         
             
              it "Accepts arbitrary metadata" do
         
     | 
| 
       28 
     | 
    
         
            -
                assert_equal ["Cheese"], Dummy:: 
     | 
| 
      
 28 
     | 
    
         
            +
                assert_equal ["Cheese"], Dummy::Cheese.graphql_definition.metadata[:class_names]
         
     | 
| 
       29 
29 
     | 
    
         
             
              end
         
     | 
| 
       30 
30 
     | 
    
         | 
| 
       31 
31 
     | 
    
         
             
              describe "#name" do
         
     | 
| 
         @@ -63,7 +63,7 @@ describe GraphQL::BaseType do 
     | 
|
| 
       63 
63 
     | 
    
         
             
              end
         
     | 
| 
       64 
64 
     | 
    
         | 
| 
       65 
65 
     | 
    
         
             
              describe "forwards-compat with new api" do
         
     | 
| 
       66 
     | 
    
         
            -
                let(:type_defn) { Dummy:: 
     | 
| 
      
 66 
     | 
    
         
            +
                let(:type_defn) { Dummy::Cheese.graphql_definition }
         
     | 
| 
       67 
67 
     | 
    
         
             
                it "responds to new methods" do
         
     | 
| 
       68 
68 
     | 
    
         
             
                  assert_equal "Cheese", type_defn.graphql_name
         
     | 
| 
       69 
69 
     | 
    
         
             
                  assert_equal type_defn, type_defn.graphql_definition
         
     | 
| 
         @@ -155,6 +155,23 @@ describe GraphQL::Execution::Lazy do 
     | 
|
| 
       155 
155 
     | 
    
         
             
                end
         
     | 
| 
       156 
156 
     | 
    
         
             
              end
         
     | 
| 
       157 
157 
     | 
    
         | 
| 
      
 158 
     | 
    
         
            +
              describe "Schema#sync_lazy(object)" do
         
     | 
| 
      
 159 
     | 
    
         
            +
                it "Passes objects to that hook at runtime" do
         
     | 
| 
      
 160 
     | 
    
         
            +
                  res = run_query <<-GRAPHQL
         
     | 
| 
      
 161 
     | 
    
         
            +
                  {
         
     | 
| 
      
 162 
     | 
    
         
            +
                    a: nullableNestedSum(value: 1001) { value }
         
     | 
| 
      
 163 
     | 
    
         
            +
                    b: nullableNestedSum(value: 1013) { value }
         
     | 
| 
      
 164 
     | 
    
         
            +
                    c: nullableNestedSum(value: 1002) { value }
         
     | 
| 
      
 165 
     | 
    
         
            +
                  }
         
     | 
| 
      
 166 
     | 
    
         
            +
                  GRAPHQL
         
     | 
| 
      
 167 
     | 
    
         
            +
             
     | 
| 
      
 168 
     | 
    
         
            +
                  # This odd, non-adding behavior is hacked into `#sync_lazy`
         
     | 
| 
      
 169 
     | 
    
         
            +
                  assert_equal 101, res["data"]["a"]["value"]
         
     | 
| 
      
 170 
     | 
    
         
            +
                  assert_equal 113, res["data"]["b"]["value"]
         
     | 
| 
      
 171 
     | 
    
         
            +
                  assert_equal 102, res["data"]["c"]["value"]
         
     | 
| 
      
 172 
     | 
    
         
            +
                end
         
     | 
| 
      
 173 
     | 
    
         
            +
              end
         
     | 
| 
      
 174 
     | 
    
         
            +
             
     | 
| 
       158 
175 
     | 
    
         
             
              describe "LazyMethodMap" do
         
     | 
| 
       159 
176 
     | 
    
         
             
                class SubWrapper < LazyHelpers::Wrapper; end
         
     | 
| 
       160 
177 
     | 
    
         | 
| 
         @@ -165,7 +182,7 @@ describe GraphQL::Execution::Lazy do 
     | 
|
| 
       165 
182 
     | 
    
         
             
                  map.set(LazyHelpers::SumAll, :value)
         
     | 
| 
       166 
183 
     | 
    
         
             
                  b = LazyHelpers::Wrapper.new(1)
         
     | 
| 
       167 
184 
     | 
    
         
             
                  sub_b = LazyHelpers::Wrapper.new(2)
         
     | 
| 
       168 
     | 
    
         
            -
                  s = LazyHelpers::SumAll.new( 
     | 
| 
      
 185 
     | 
    
         
            +
                  s = LazyHelpers::SumAll.new(3)
         
     | 
| 
       169 
186 
     | 
    
         
             
                  assert_equal(:item, map.get(b))
         
     | 
| 
       170 
187 
     | 
    
         
             
                  assert_equal(:item, map.get(sub_b))
         
     | 
| 
       171 
188 
     | 
    
         
             
                  assert_equal(:value, map.get(s))
         
     | 
| 
         @@ -8,36 +8,36 @@ describe GraphQL::Execution::Typecast do 
     | 
|
| 
       8 
8 
     | 
    
         
             
                end
         
     | 
| 
       9 
9 
     | 
    
         | 
| 
       10 
10 
     | 
    
         
             
                it "counts the same type as a subtype" do
         
     | 
| 
       11 
     | 
    
         
            -
                  assert subtype?(Dummy:: 
     | 
| 
       12 
     | 
    
         
            -
                  assert !subtype?(Dummy:: 
     | 
| 
       13 
     | 
    
         
            -
                  assert subtype?(Dummy:: 
     | 
| 
      
 11 
     | 
    
         
            +
                  assert subtype?(Dummy::Milk.graphql_definition, Dummy::Milk.graphql_definition)
         
     | 
| 
      
 12 
     | 
    
         
            +
                  assert !subtype?(Dummy::Milk.graphql_definition, Dummy::Cheese.graphql_definition)
         
     | 
| 
      
 13 
     | 
    
         
            +
                  assert subtype?(Dummy::Milk.graphql_definition.to_list_type.to_non_null_type, Dummy::Milk.graphql_definition.to_list_type.to_non_null_type)
         
     | 
| 
       14 
14 
     | 
    
         
             
                end
         
     | 
| 
       15 
15 
     | 
    
         | 
| 
       16 
16 
     | 
    
         
             
                it "counts member types as subtypes" do
         
     | 
| 
       17 
     | 
    
         
            -
                  assert subtype?(Dummy:: 
     | 
| 
       18 
     | 
    
         
            -
                  assert subtype?(Dummy:: 
     | 
| 
       19 
     | 
    
         
            -
                  assert subtype?(Dummy:: 
     | 
| 
       20 
     | 
    
         
            -
                  assert subtype?(Dummy:: 
     | 
| 
      
 17 
     | 
    
         
            +
                  assert subtype?(Dummy::Edible.graphql_definition, Dummy::Cheese.graphql_definition)
         
     | 
| 
      
 18 
     | 
    
         
            +
                  assert subtype?(Dummy::Edible.graphql_definition, Dummy::Milk.graphql_definition)
         
     | 
| 
      
 19 
     | 
    
         
            +
                  assert subtype?(Dummy::DairyProduct.graphql_definition, Dummy::Milk.graphql_definition)
         
     | 
| 
      
 20 
     | 
    
         
            +
                  assert subtype?(Dummy::DairyProduct.graphql_definition, Dummy::Cheese.graphql_definition)
         
     | 
| 
       21 
21 
     | 
    
         | 
| 
       22 
     | 
    
         
            -
                  assert !subtype?(Dummy:: 
     | 
| 
       23 
     | 
    
         
            -
                  assert !subtype?(Dummy:: 
     | 
| 
       24 
     | 
    
         
            -
                  assert !subtype?(Dummy:: 
     | 
| 
       25 
     | 
    
         
            -
                  assert !subtype?(Dummy:: 
     | 
| 
       26 
     | 
    
         
            -
                  assert !subtype?(Dummy:: 
     | 
| 
      
 22 
     | 
    
         
            +
                  assert !subtype?(Dummy::DairyAppQuery.graphql_definition, Dummy::DairyProduct.graphql_definition)
         
     | 
| 
      
 23 
     | 
    
         
            +
                  assert !subtype?(Dummy::Cheese.graphql_definition, Dummy::DairyProduct.graphql_definition)
         
     | 
| 
      
 24 
     | 
    
         
            +
                  assert !subtype?(Dummy::Edible.graphql_definition, Dummy::DairyProduct.graphql_definition)
         
     | 
| 
      
 25 
     | 
    
         
            +
                  assert !subtype?(Dummy::Edible.graphql_definition, GraphQL::STRING_TYPE)
         
     | 
| 
      
 26 
     | 
    
         
            +
                  assert !subtype?(Dummy::Edible.graphql_definition, Dummy::DairyProductInput.graphql_definition)
         
     | 
| 
       27 
27 
     | 
    
         
             
                end
         
     | 
| 
       28 
28 
     | 
    
         | 
| 
       29 
29 
     | 
    
         
             
                it "counts lists as subtypes if their inner types are subtypes" do
         
     | 
| 
       30 
     | 
    
         
            -
                  assert subtype?(Dummy:: 
     | 
| 
       31 
     | 
    
         
            -
                  assert subtype?(Dummy:: 
     | 
| 
       32 
     | 
    
         
            -
                  assert !subtype?(Dummy:: 
     | 
| 
       33 
     | 
    
         
            -
                  assert !subtype?(Dummy:: 
     | 
| 
       34 
     | 
    
         
            -
                  assert !subtype?(Dummy:: 
     | 
| 
      
 30 
     | 
    
         
            +
                  assert subtype?(Dummy::Edible.graphql_definition.to_list_type, Dummy::Milk.graphql_definition.to_list_type)
         
     | 
| 
      
 31 
     | 
    
         
            +
                  assert subtype?(Dummy::DairyProduct.graphql_definition.to_list_type, Dummy::Milk.graphql_definition.to_list_type)
         
     | 
| 
      
 32 
     | 
    
         
            +
                  assert !subtype?(Dummy::Cheese.graphql_definition.to_list_type, Dummy::DairyProduct.graphql_definition.to_list_type)
         
     | 
| 
      
 33 
     | 
    
         
            +
                  assert !subtype?(Dummy::Edible.graphql_definition.to_list_type, Dummy::DairyProduct.graphql_definition.to_list_type)
         
     | 
| 
      
 34 
     | 
    
         
            +
                  assert !subtype?(Dummy::Edible.graphql_definition.to_list_type, GraphQL::STRING_TYPE.to_list_type)
         
     | 
| 
       35 
35 
     | 
    
         
             
                end
         
     | 
| 
       36 
36 
     | 
    
         | 
| 
       37 
37 
     | 
    
         
             
                it "counts non-null types as subtypes of nullable parent types" do
         
     | 
| 
       38 
     | 
    
         
            -
                  assert subtype?(Dummy:: 
     | 
| 
       39 
     | 
    
         
            -
                  assert subtype?(Dummy:: 
     | 
| 
       40 
     | 
    
         
            -
                  assert subtype?(Dummy:: 
     | 
| 
      
 38 
     | 
    
         
            +
                  assert subtype?(Dummy::Milk.graphql_definition, Dummy::Milk.graphql_definition.to_non_null_type)
         
     | 
| 
      
 39 
     | 
    
         
            +
                  assert subtype?(Dummy::Edible.graphql_definition, Dummy::Milk.graphql_definition.to_non_null_type)
         
     | 
| 
      
 40 
     | 
    
         
            +
                  assert subtype?(Dummy::Edible.graphql_definition.to_non_null_type, Dummy::Milk.graphql_definition.to_non_null_type)
         
     | 
| 
       41 
41 
     | 
    
         
             
                  assert subtype?(
         
     | 
| 
       42 
42 
     | 
    
         
             
                    GraphQL::STRING_TYPE.to_non_null_type.to_list_type,
         
     | 
| 
       43 
43 
     | 
    
         
             
                    GraphQL::STRING_TYPE.to_non_null_type.to_list_type.to_non_null_type,
         
     | 
    
        data/spec/graphql/field_spec.rb
    CHANGED
    
    | 
         @@ -116,7 +116,7 @@ describe GraphQL::Field do 
     | 
|
| 
       116 
116 
     | 
    
         | 
| 
       117 
117 
     | 
    
         
             
              describe "#metadata" do
         
     | 
| 
       118 
118 
     | 
    
         
             
                it "accepts user-defined metadata" do
         
     | 
| 
       119 
     | 
    
         
            -
                  similar_cheese_field = Dummy:: 
     | 
| 
      
 119 
     | 
    
         
            +
                  similar_cheese_field = Dummy::Cheese.graphql_definition.get_field("similarCheese")
         
     | 
| 
       120 
120 
     | 
    
         
             
                  assert_equal [:cheeses, :milks], similar_cheese_field.metadata[:joins]
         
     | 
| 
       121 
121 
     | 
    
         
             
                end
         
     | 
| 
       122 
122 
     | 
    
         
             
              end
         
     | 
| 
         @@ -0,0 +1,25 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # frozen_string_literal: true
         
     | 
| 
      
 2 
     | 
    
         
            +
            require 'spec_helper'
         
     | 
| 
      
 3 
     | 
    
         
            +
             
     | 
| 
      
 4 
     | 
    
         
            +
            describe GraphQL::InputObjectType do
         
     | 
| 
      
 5 
     | 
    
         
            +
              describe 'default values' do
         
     | 
| 
      
 6 
     | 
    
         
            +
                describe 'when the type is an enum with underlying ruby values' do
         
     | 
| 
      
 7 
     | 
    
         
            +
                  it 'provides the default value' do
         
     | 
| 
      
 8 
     | 
    
         
            +
                    TestEnum = GraphQL::EnumType.define do
         
     | 
| 
      
 9 
     | 
    
         
            +
                      name 'Test'
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
      
 11 
     | 
    
         
            +
                      value 'A', 'Represents an authorized agent in our system.', value: 'a'
         
     | 
| 
      
 12 
     | 
    
         
            +
                      value 'B', 'Agent is disabled, web app access is denied.', value: 'b'
         
     | 
| 
      
 13 
     | 
    
         
            +
                    end
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
                    class TestInput < GraphQL::Schema::InputObject
         
     | 
| 
      
 16 
     | 
    
         
            +
                      argument :foo, TestEnum, 'TestEnum', required: false, default_value: 'a'
         
     | 
| 
      
 17 
     | 
    
         
            +
                    end
         
     | 
| 
      
 18 
     | 
    
         
            +
             
     | 
| 
      
 19 
     | 
    
         
            +
                    test_input_type = TestInput.to_graphql
         
     | 
| 
      
 20 
     | 
    
         
            +
                    default_test_input_value = test_input_type.coerce_isolated_input({})
         
     | 
| 
      
 21 
     | 
    
         
            +
                    assert_equal default_test_input_value[:foo], 'a'
         
     | 
| 
      
 22 
     | 
    
         
            +
                  end
         
     | 
| 
      
 23 
     | 
    
         
            +
                end
         
     | 
| 
      
 24 
     | 
    
         
            +
              end
         
     | 
| 
      
 25 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -2,11 +2,11 @@ 
     | 
|
| 
       2 
2 
     | 
    
         
             
            require "spec_helper"
         
     | 
| 
       3 
3 
     | 
    
         | 
| 
       4 
4 
     | 
    
         
             
            describe GraphQL::InterfaceType do
         
     | 
| 
       5 
     | 
    
         
            -
              let(:interface) { Dummy:: 
     | 
| 
      
 5 
     | 
    
         
            +
              let(:interface) { Dummy::Edible.graphql_definition }
         
     | 
| 
       6 
6 
     | 
    
         
             
              let(:dummy_query_context) { OpenStruct.new(schema: Dummy::Schema) }
         
     | 
| 
       7 
7 
     | 
    
         | 
| 
       8 
8 
     | 
    
         
             
              it "has possible types" do
         
     | 
| 
       9 
     | 
    
         
            -
                assert_equal([Dummy:: 
     | 
| 
      
 9 
     | 
    
         
            +
                assert_equal([Dummy::Cheese.graphql_definition, Dummy::Honey.graphql_definition, Dummy::Milk.graphql_definition], Dummy::Schema.possible_types(interface))
         
     | 
| 
       10 
10 
     | 
    
         
             
              end
         
     | 
| 
       11 
11 
     | 
    
         | 
| 
       12 
12 
     | 
    
         
             
              describe "query evaluation" do
         
     | 
| 
         @@ -96,11 +96,11 @@ describe GraphQL::InterfaceType do 
     | 
|
| 
       96 
96 
     | 
    
         
             
                it "copies orphan types without affecting the original" do
         
     | 
| 
       97 
97 
     | 
    
         
             
                  interface = GraphQL::InterfaceType.define do
         
     | 
| 
       98 
98 
     | 
    
         
             
                    name "AInterface"
         
     | 
| 
       99 
     | 
    
         
            -
                    orphan_types [Dummy:: 
     | 
| 
      
 99 
     | 
    
         
            +
                    orphan_types [Dummy::Honey]
         
     | 
| 
       100 
100 
     | 
    
         
             
                  end
         
     | 
| 
       101 
101 
     | 
    
         | 
| 
       102 
102 
     | 
    
         
             
                  interface_2 = interface.dup
         
     | 
| 
       103 
     | 
    
         
            -
                  interface_2.orphan_types << Dummy:: 
     | 
| 
      
 103 
     | 
    
         
            +
                  interface_2.orphan_types << Dummy::Cheese
         
     | 
| 
       104 
104 
     | 
    
         
             
                  assert_equal 1, interface.orphan_types.size
         
     | 
| 
       105 
105 
     | 
    
         
             
                  assert_equal 2, interface_2.orphan_types.size
         
     | 
| 
       106 
106 
     | 
    
         
             
                end
         
     |