graphql 2.3.3 → 2.3.4
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 +4 -4
- data/lib/graphql/dataloader/async_dataloader.rb +1 -0
- data/lib/graphql/dataloader.rb +6 -3
- data/lib/graphql/execution/interpreter/runtime.rb +12 -4
- data/lib/graphql/language/nodes.rb +44 -5
- data/lib/graphql/language/parser.rb +2 -2
- data/lib/graphql/query.rb +1 -1
- data/lib/graphql/tracing/prometheus_trace.rb +8 -8
- data/lib/graphql/tracing/sentry_trace.rb +10 -10
- data/lib/graphql/version.rb +1 -1
- metadata +2 -2
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA256:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: c8f2d38dd0c349521f7f22050bb70cee1f06a7832de74d5afe523a35310ed318
         | 
| 4 | 
            +
              data.tar.gz: da047a5e11a1441060411c47468daad16300db1dc7064ab1b1a76d2e519e76fd
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 73bd380530a4183241587083beb2ef6c96709657fb18e702a294a37c22f26e2141b2111b96c79570b9588d330e9c8d851fd532cdaf6d6fbd55f9dd5b30c6fe4e
         | 
| 7 | 
            +
              data.tar.gz: 917e88d0cec3cbc760ec89714cf31325088f94f0a93094b3fcbf1cc3c07f52a99e30f0e418e561518c0a7deef0358dfa0ae457b8bad88fb50883aacb9d7dae7f
         | 
    
        data/lib/graphql/dataloader.rb
    CHANGED
    
    | @@ -88,6 +88,11 @@ module GraphQL | |
| 88 88 | 
             
                  nil
         | 
| 89 89 | 
             
                end
         | 
| 90 90 |  | 
| 91 | 
            +
                # This method is called when Dataloader is finished using a fiber.
         | 
| 92 | 
            +
                # Use it to perform any cleanup, such as releasing database connections (if required manually)
         | 
| 93 | 
            +
                def cleanup_fiber
         | 
| 94 | 
            +
                end
         | 
| 95 | 
            +
             | 
| 91 96 | 
             
                # Get a Source instance from this dataloader, for calling `.load(...)` or `.request(...)` on.
         | 
| 92 97 | 
             
                #
         | 
| 93 98 | 
             
                # @param source_class [Class<GraphQL::Dataloader::Source]
         | 
| @@ -231,9 +236,7 @@ module GraphQL | |
| 231 236 | 
             
                  Fiber.new(blocking: !@nonblocking) {
         | 
| 232 237 | 
             
                    set_fiber_variables(fiber_vars)
         | 
| 233 238 | 
             
                    yield
         | 
| 234 | 
            -
                     | 
| 235 | 
            -
                    # if the fiber is allowed to terminate normally, control is passed to the main fiber instead.
         | 
| 236 | 
            -
                    true
         | 
| 239 | 
            +
                    cleanup_fiber
         | 
| 237 240 | 
             
                  }
         | 
| 238 241 | 
             
                end
         | 
| 239 242 |  | 
| @@ -127,7 +127,6 @@ module GraphQL | |
| 127 127 | 
             
                    end
         | 
| 128 128 |  | 
| 129 129 | 
             
                    def gather_selections(owner_object, owner_type, selections, selections_to_run = nil, selections_by_name = {})
         | 
| 130 | 
            -
             | 
| 131 130 | 
             
                      selections.each do |node|
         | 
| 132 131 | 
             
                        # Skip gathering this if the directive says so
         | 
| 133 132 | 
             
                        if !directives_include?(node, owner_object, owner_type)
         | 
| @@ -172,17 +171,26 @@ module GraphQL | |
| 172 171 | 
             
                              type_defn = schema.get_type(node.type.name, context)
         | 
| 173 172 |  | 
| 174 173 | 
             
                              if query.warden.possible_types(type_defn).include?(owner_type)
         | 
| 175 | 
            -
                                gather_selections(owner_object, owner_type, node.selections, selections_to_run, next_selections)
         | 
| 174 | 
            +
                                result = gather_selections(owner_object, owner_type, node.selections, selections_to_run, next_selections)
         | 
| 175 | 
            +
                                if !result.equal?(next_selections)
         | 
| 176 | 
            +
                                  selections_to_run = result
         | 
| 177 | 
            +
                                end
         | 
| 176 178 | 
             
                              end
         | 
| 177 179 | 
             
                            else
         | 
| 178 180 | 
             
                              # it's an untyped fragment, definitely continue
         | 
| 179 | 
            -
                              gather_selections(owner_object, owner_type, node.selections, selections_to_run, next_selections)
         | 
| 181 | 
            +
                              result = gather_selections(owner_object, owner_type, node.selections, selections_to_run, next_selections)
         | 
| 182 | 
            +
                              if !result.equal?(next_selections)
         | 
| 183 | 
            +
                                selections_to_run = result
         | 
| 184 | 
            +
                              end
         | 
| 180 185 | 
             
                            end
         | 
| 181 186 | 
             
                          when GraphQL::Language::Nodes::FragmentSpread
         | 
| 182 187 | 
             
                            fragment_def = query.fragments[node.name]
         | 
| 183 188 | 
             
                            type_defn = query.get_type(fragment_def.type.name)
         | 
| 184 189 | 
             
                            if query.warden.possible_types(type_defn).include?(owner_type)
         | 
| 185 | 
            -
                              gather_selections(owner_object, owner_type, fragment_def.selections, selections_to_run, next_selections)
         | 
| 190 | 
            +
                              result = gather_selections(owner_object, owner_type, fragment_def.selections, selections_to_run, next_selections)
         | 
| 191 | 
            +
                              if !result.equal?(next_selections)
         | 
| 192 | 
            +
                                selections_to_run = result
         | 
| 193 | 
            +
                              end
         | 
| 186 194 | 
             
                            end
         | 
| 187 195 | 
             
                          else
         | 
| 188 196 | 
             
                            raise "Invariant: unexpected selection class: #{node.class}"
         | 
| @@ -20,6 +20,15 @@ module GraphQL | |
| 20 20 | 
             
                        @definition_line = definition_line
         | 
| 21 21 | 
             
                        super(**_rest)
         | 
| 22 22 | 
             
                      end
         | 
| 23 | 
            +
             | 
| 24 | 
            +
                      def marshal_dump
         | 
| 25 | 
            +
                        super << @definition_line
         | 
| 26 | 
            +
                      end
         | 
| 27 | 
            +
             | 
| 28 | 
            +
                      def marshal_load(values)
         | 
| 29 | 
            +
                        @definition_line = values.pop
         | 
| 30 | 
            +
                        super
         | 
| 31 | 
            +
                      end
         | 
| 23 32 | 
             
                    end
         | 
| 24 33 |  | 
| 25 34 | 
             
                    attr_reader :filename
         | 
| @@ -273,18 +282,20 @@ module GraphQL | |
| 273 282 | 
             
                          end
         | 
| 274 283 | 
             
                        end
         | 
| 275 284 |  | 
| 276 | 
            -
                         | 
| 285 | 
            +
                        children_method_names = @children_methods.keys
         | 
| 286 | 
            +
             | 
| 287 | 
            +
                        all_method_names = scalar_method_names + children_method_names
         | 
| 277 288 | 
             
                        if all_method_names.include?(:alias)
         | 
| 278 289 | 
             
                          # Rather than complicating this special case,
         | 
| 279 290 | 
             
                          # let it be overridden (in field)
         | 
| 280 291 | 
             
                          return
         | 
| 281 292 | 
             
                        else
         | 
| 282 293 | 
             
                          arguments = scalar_method_names.map { |m| "#{m}: nil"} +
         | 
| 283 | 
            -
                             | 
| 294 | 
            +
                            children_method_names.map { |m| "#{m}: NO_CHILDREN" } +
         | 
| 284 295 | 
             
                            DEFAULT_INITIALIZE_OPTIONS
         | 
| 285 296 |  | 
| 286 297 | 
             
                          assignments = scalar_method_names.map { |m| "@#{m} = #{m}"} +
         | 
| 287 | 
            -
                             | 
| 298 | 
            +
                            children_method_names.map { |m| "@#{m} = #{m}.freeze" }
         | 
| 288 299 |  | 
| 289 300 | 
             
                          if name.end_with?("Definition") && name != "FragmentDefinition"
         | 
| 290 301 | 
             
                            arguments << "definition_pos: nil"
         | 
| @@ -292,7 +303,7 @@ module GraphQL | |
| 292 303 | 
             
                          end
         | 
| 293 304 |  | 
| 294 305 | 
             
                          keywords = scalar_method_names.map { |m| "#{m}: #{m}"} +
         | 
| 295 | 
            -
                             | 
| 306 | 
            +
                            children_method_names.map { |m| "#{m}: #{m}" }
         | 
| 296 307 |  | 
| 297 308 | 
             
                          module_eval <<-RUBY, __FILE__, __LINE__
         | 
| 298 309 | 
             
                            def initialize(#{arguments.join(", ")})
         | 
| @@ -304,9 +315,21 @@ module GraphQL | |
| 304 315 | 
             
                              #{assignments.join("\n")}
         | 
| 305 316 | 
             
                            end
         | 
| 306 317 |  | 
| 307 | 
            -
                            def self.from_a(filename, line, col, #{ | 
| 318 | 
            +
                            def self.from_a(filename, line, col, #{all_method_names.join(", ")})
         | 
| 308 319 | 
             
                              self.new(filename: filename, line: line, col: col, #{keywords.join(", ")})
         | 
| 309 320 | 
             
                            end
         | 
| 321 | 
            +
             | 
| 322 | 
            +
                            def marshal_dump
         | 
| 323 | 
            +
                              [
         | 
| 324 | 
            +
                                line, col, # use methods here to force them to be calculated
         | 
| 325 | 
            +
                                @filename,
         | 
| 326 | 
            +
                                #{all_method_names.map { |n| "@#{n}," }.join}
         | 
| 327 | 
            +
                              ]
         | 
| 328 | 
            +
                            end
         | 
| 329 | 
            +
             | 
| 330 | 
            +
                            def marshal_load(values)
         | 
| 331 | 
            +
                              @line, @col, @filename #{all_method_names.map { |n| ", @#{n}"}.join} = values
         | 
| 332 | 
            +
                            end
         | 
| 310 333 | 
             
                          RUBY
         | 
| 311 334 | 
             
                        end
         | 
| 312 335 | 
             
                      end
         | 
| @@ -397,6 +420,14 @@ module GraphQL | |
| 397 420 | 
             
                      self.new(filename: filename, line: line, col: col, field_alias: field_alias, name: name, arguments: arguments, directives: directives, selections: selections)
         | 
| 398 421 | 
             
                    end
         | 
| 399 422 |  | 
| 423 | 
            +
                    def marshal_dump
         | 
| 424 | 
            +
                      [line, col, @filename, @name, @arguments, @directives, @selections, @alias]
         | 
| 425 | 
            +
                    end
         | 
| 426 | 
            +
             | 
| 427 | 
            +
                    def marshal_load(values)
         | 
| 428 | 
            +
                      @line, @col, @filename, @name, @arguments, @directives, @selections, @alias = values
         | 
| 429 | 
            +
                    end
         | 
| 430 | 
            +
             | 
| 400 431 | 
             
                    # Override this because default is `:fields`
         | 
| 401 432 | 
             
                    self.children_method_name = :selections
         | 
| 402 433 | 
             
                  end
         | 
| @@ -430,6 +461,14 @@ module GraphQL | |
| 430 461 | 
             
                    def self.from_a(filename, line, col, name, type, directives, selections)
         | 
| 431 462 | 
             
                      self.new(filename: filename, line: line, col: col, name: name, type: type, directives: directives, selections: selections)
         | 
| 432 463 | 
             
                    end
         | 
| 464 | 
            +
             | 
| 465 | 
            +
                    def marshal_dump
         | 
| 466 | 
            +
                      [line, col, @filename, @name, @type, @directives, @selections]
         | 
| 467 | 
            +
                    end
         | 
| 468 | 
            +
             | 
| 469 | 
            +
                    def marshal_load(values)
         | 
| 470 | 
            +
                      @line, @col, @filename, @name, @type, @directives, @selections = values
         | 
| 471 | 
            +
                    end
         | 
| 433 472 | 
             
                  end
         | 
| 434 473 |  | 
| 435 474 | 
             
                  # Application of a named fragment in a selection
         | 
| @@ -478,7 +478,7 @@ module GraphQL | |
| 478 478 | 
             
                    end
         | 
| 479 479 |  | 
| 480 480 | 
             
                    if at?(:BANG)
         | 
| 481 | 
            -
                      type = Nodes::NonNullType.new(pos: pos, of_type: type)
         | 
| 481 | 
            +
                      type = Nodes::NonNullType.new(pos: pos, of_type: type, source: self)
         | 
| 482 482 | 
             
                      expect_token(:BANG)
         | 
| 483 483 | 
             
                    end
         | 
| 484 484 | 
             
                    type
         | 
| @@ -487,7 +487,7 @@ module GraphQL | |
| 487 487 | 
             
                  def list_type
         | 
| 488 488 | 
             
                    loc = pos
         | 
| 489 489 | 
             
                    expect_token(:LBRACKET)
         | 
| 490 | 
            -
                    type = Nodes::ListType.new(pos: loc, of_type: self.type)
         | 
| 490 | 
            +
                    type = Nodes::ListType.new(pos: loc, of_type: self.type, source: self)
         | 
| 491 491 | 
             
                    expect_token(:RBRACKET)
         | 
| 492 492 | 
             
                    type
         | 
| 493 493 | 
             
                  end
         | 
    
        data/lib/graphql/query.rb
    CHANGED
    
    | @@ -304,7 +304,7 @@ module GraphQL | |
| 304 304 |  | 
| 305 305 | 
             
                # @return [String] An opaque hash for identifying this query's given query string and selected operation
         | 
| 306 306 | 
             
                def operation_fingerprint
         | 
| 307 | 
            -
                  @operation_fingerprint ||= "#{selected_operation_name || "anonymous"}/#{Fingerprint.generate(query_string)}"
         | 
| 307 | 
            +
                  @operation_fingerprint ||= "#{selected_operation_name || "anonymous"}/#{Fingerprint.generate(query_string || "")}"
         | 
| 308 308 | 
             
                end
         | 
| 309 309 |  | 
| 310 310 | 
             
                # @return [String] An opaque hash for identifying this query's given a variable values (not including defaults)
         | 
| @@ -25,33 +25,33 @@ module GraphQL | |
| 25 25 | 
             
                  }.each do |trace_method, platform_key|
         | 
| 26 26 | 
             
                    module_eval <<-RUBY, __FILE__, __LINE__
         | 
| 27 27 | 
             
                      def #{trace_method}(**data)
         | 
| 28 | 
            -
                         | 
| 28 | 
            +
                        instrument_prometheus_execution("#{platform_key}", "#{trace_method}") { super }
         | 
| 29 29 | 
             
                      end
         | 
| 30 30 | 
             
                    RUBY
         | 
| 31 31 | 
             
                  end
         | 
| 32 32 |  | 
| 33 33 | 
             
                  def platform_execute_field(platform_key, &block)
         | 
| 34 | 
            -
                     | 
| 34 | 
            +
                    instrument_prometheus_execution(platform_key, "execute_field", &block)
         | 
| 35 35 | 
             
                  end
         | 
| 36 36 |  | 
| 37 37 | 
             
                  def platform_execute_field_lazy(platform_key, &block)
         | 
| 38 | 
            -
                     | 
| 38 | 
            +
                    instrument_prometheus_execution(platform_key, "execute_field_lazy", &block)
         | 
| 39 39 | 
             
                  end
         | 
| 40 40 |  | 
| 41 41 | 
             
                  def platform_authorized(platform_key, &block)
         | 
| 42 | 
            -
                     | 
| 42 | 
            +
                    instrument_prometheus_execution(platform_key, "authorized", &block)
         | 
| 43 43 | 
             
                  end
         | 
| 44 44 |  | 
| 45 45 | 
             
                  def platform_authorized_lazy(platform_key, &block)
         | 
| 46 | 
            -
                     | 
| 46 | 
            +
                    instrument_prometheus_execution(platform_key, "authorized_lazy", &block)
         | 
| 47 47 | 
             
                  end
         | 
| 48 48 |  | 
| 49 49 | 
             
                  def platform_resolve_type(platform_key, &block)
         | 
| 50 | 
            -
                     | 
| 50 | 
            +
                    instrument_prometheus_execution(platform_key, "resolve_type", &block)
         | 
| 51 51 | 
             
                  end
         | 
| 52 52 |  | 
| 53 53 | 
             
                  def platform_resolve_type_lazy(platform_key, &block)
         | 
| 54 | 
            -
                     | 
| 54 | 
            +
                    instrument_prometheus_execution(platform_key, "resolve_type_lazy", &block)
         | 
| 55 55 | 
             
                  end
         | 
| 56 56 |  | 
| 57 57 | 
             
                  def platform_field_key(field)
         | 
| @@ -68,7 +68,7 @@ module GraphQL | |
| 68 68 |  | 
| 69 69 | 
             
                  private
         | 
| 70 70 |  | 
| 71 | 
            -
                  def  | 
| 71 | 
            +
                  def instrument_prometheus_execution(platform_key, key, &block)
         | 
| 72 72 | 
             
                    if @keys_whitelist.include?(key)
         | 
| 73 73 | 
             
                      start = ::Process.clock_gettime ::Process::CLOCK_MONOTONIC
         | 
| 74 74 | 
             
                      result = block.call
         | 
| @@ -12,7 +12,7 @@ module GraphQL | |
| 12 12 | 
             
                    @set_transaction_name = set_transaction_name
         | 
| 13 13 | 
             
                    super
         | 
| 14 14 | 
             
                  end
         | 
| 15 | 
            -
             | 
| 15 | 
            +
             | 
| 16 16 | 
             
                  def execute_query(**data)
         | 
| 17 17 | 
             
                    set_this_txn_name = data[:query].context[:set_sentry_transaction_name]
         | 
| 18 18 | 
             
                    if set_this_txn_name == true || (set_this_txn_name.nil? && @set_transaction_name)
         | 
| @@ -20,7 +20,7 @@ module GraphQL | |
| 20 20 | 
             
                        scope.set_transaction_name(transaction_name(data[:query]))
         | 
| 21 21 | 
             
                      end
         | 
| 22 22 | 
             
                    end
         | 
| 23 | 
            -
                     | 
| 23 | 
            +
                    instrument_sentry_execution("graphql.execute", "execute_query", data) { super }
         | 
| 24 24 | 
             
                  end
         | 
| 25 25 |  | 
| 26 26 | 
             
                  {
         | 
| @@ -34,33 +34,33 @@ module GraphQL | |
| 34 34 | 
             
                  }.each do |trace_method, platform_key|
         | 
| 35 35 | 
             
                    module_eval <<-RUBY, __FILE__, __LINE__
         | 
| 36 36 | 
             
                    def #{trace_method}(**data)
         | 
| 37 | 
            -
                       | 
| 37 | 
            +
                      instrument_sentry_execution("#{platform_key}", "#{trace_method}", data) { super }
         | 
| 38 38 | 
             
                    end
         | 
| 39 39 | 
             
                    RUBY
         | 
| 40 40 | 
             
                  end
         | 
| 41 41 |  | 
| 42 42 | 
             
                  def platform_execute_field(platform_key, &block)
         | 
| 43 | 
            -
                     | 
| 43 | 
            +
                    instrument_sentry_execution(platform_key, "execute_field", &block)
         | 
| 44 44 | 
             
                  end
         | 
| 45 45 |  | 
| 46 46 | 
             
                  def platform_execute_field_lazy(platform_key, &block)
         | 
| 47 | 
            -
                     | 
| 47 | 
            +
                    instrument_sentry_execution(platform_key, "execute_field_lazy", &block)
         | 
| 48 48 | 
             
                  end
         | 
| 49 49 |  | 
| 50 50 | 
             
                  def platform_authorized(platform_key, &block)
         | 
| 51 | 
            -
                     | 
| 51 | 
            +
                    instrument_sentry_execution(platform_key, "authorized", &block)
         | 
| 52 52 | 
             
                  end
         | 
| 53 53 |  | 
| 54 54 | 
             
                  def platform_authorized_lazy(platform_key, &block)
         | 
| 55 | 
            -
                     | 
| 55 | 
            +
                    instrument_sentry_execution(platform_key, "authorized_lazy", &block)
         | 
| 56 56 | 
             
                  end
         | 
| 57 57 |  | 
| 58 58 | 
             
                  def platform_resolve_type(platform_key, &block)
         | 
| 59 | 
            -
                     | 
| 59 | 
            +
                    instrument_sentry_execution(platform_key, "resolve_type", &block)
         | 
| 60 60 | 
             
                  end
         | 
| 61 61 |  | 
| 62 62 | 
             
                  def platform_resolve_type_lazy(platform_key, &block)
         | 
| 63 | 
            -
                     | 
| 63 | 
            +
                    instrument_sentry_execution(platform_key, "resolve_type_lazy", &block)
         | 
| 64 64 | 
             
                  end
         | 
| 65 65 |  | 
| 66 66 | 
             
                  def platform_field_key(field)
         | 
| @@ -77,7 +77,7 @@ module GraphQL | |
| 77 77 |  | 
| 78 78 | 
             
                  private
         | 
| 79 79 |  | 
| 80 | 
            -
                  def  | 
| 80 | 
            +
                  def instrument_sentry_execution(platform_key, trace_method, data=nil, &block)
         | 
| 81 81 | 
             
                    return yield unless Sentry.initialized?
         | 
| 82 82 |  | 
| 83 83 | 
             
                    Sentry.with_child_span(op: platform_key, start_timestamp: Sentry.utc_now.to_f) do |span|
         | 
    
        data/lib/graphql/version.rb
    CHANGED
    
    
    
        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.3. | 
| 4 | 
            +
              version: 2.3.4
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Robert Mosolgo
         | 
| 8 8 | 
             
            autorequire:
         | 
| 9 9 | 
             
            bindir: bin
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date: 2024-05- | 
| 11 | 
            +
            date: 2024-05-21 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: base64
         |