graphql 1.7.14 → 1.8.0.pre1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- data/lib/generators/graphql/function_generator.rb +1 -1
- data/lib/generators/graphql/loader_generator.rb +1 -1
- data/lib/generators/graphql/mutation_generator.rb +1 -6
- data/lib/generators/graphql/templates/function.erb +2 -2
- data/lib/generators/graphql/templates/loader.erb +2 -2
- data/lib/graphql.rb +2 -0
- data/lib/graphql/argument.rb +0 -1
- data/lib/graphql/backwards_compatibility.rb +2 -3
- data/lib/graphql/base_type.rb +18 -16
- data/lib/graphql/compatibility/query_parser_specification.rb +0 -117
- data/lib/graphql/compatibility/query_parser_specification/parse_error_specification.rb +0 -14
- data/lib/graphql/define/assign_object_field.rb +5 -12
- data/lib/graphql/deprecated_dsl.rb +28 -0
- data/lib/graphql/directive.rb +0 -1
- data/lib/graphql/enum_type.rb +1 -3
- data/lib/graphql/execution.rb +0 -1
- data/lib/graphql/execution/multiplex.rb +29 -12
- data/lib/graphql/field.rb +5 -20
- data/lib/graphql/function.rb +12 -0
- data/lib/graphql/input_object_type.rb +1 -3
- data/lib/graphql/internal_representation/node.rb +14 -26
- data/lib/graphql/internal_representation/visit.rb +6 -3
- data/lib/graphql/introspection/arguments_field.rb +0 -1
- data/lib/graphql/introspection/enum_values_field.rb +0 -1
- data/lib/graphql/introspection/fields_field.rb +0 -1
- data/lib/graphql/introspection/input_fields_field.rb +0 -1
- data/lib/graphql/introspection/interfaces_field.rb +0 -1
- data/lib/graphql/introspection/of_type_field.rb +0 -1
- data/lib/graphql/introspection/possible_types_field.rb +0 -1
- data/lib/graphql/introspection/schema_field.rb +0 -1
- data/lib/graphql/introspection/type_by_name_field.rb +0 -1
- data/lib/graphql/introspection/typename_field.rb +0 -1
- data/lib/graphql/language.rb +0 -3
- data/lib/graphql/language/generation.rb +182 -3
- data/lib/graphql/language/lexer.rb +69 -144
- data/lib/graphql/language/lexer.rl +4 -15
- data/lib/graphql/language/nodes.rb +76 -136
- data/lib/graphql/language/parser.rb +621 -668
- data/lib/graphql/language/parser.y +11 -17
- data/lib/graphql/language/token.rb +3 -10
- data/lib/graphql/object_type.rb +6 -1
- data/lib/graphql/query.rb +13 -8
- data/lib/graphql/query/arguments.rb +33 -48
- data/lib/graphql/query/context.rb +1 -0
- data/lib/graphql/query/literal_input.rb +1 -4
- data/lib/graphql/relay/connection_resolve.rb +3 -0
- data/lib/graphql/relay/global_id_resolve.rb +5 -1
- data/lib/graphql/relay/relation_connection.rb +19 -14
- data/lib/graphql/schema.rb +219 -12
- data/lib/graphql/schema/argument.rb +33 -0
- data/lib/graphql/schema/build_from_definition.rb +18 -64
- data/lib/graphql/schema/enum.rb +76 -0
- data/lib/graphql/schema/field.rb +127 -0
- data/lib/graphql/schema/field/dynamic_resolve.rb +63 -0
- data/lib/graphql/schema/field/unwrapped_resolve.rb +20 -0
- data/lib/graphql/schema/input_object.rb +61 -0
- data/lib/graphql/schema/interface.rb +32 -0
- data/lib/graphql/schema/loader.rb +2 -2
- data/lib/graphql/schema/member.rb +97 -0
- data/lib/graphql/schema/member/build_type.rb +106 -0
- data/lib/graphql/schema/member/has_fields.rb +56 -0
- data/lib/graphql/schema/member/instrumentation.rb +113 -0
- data/lib/graphql/schema/member/list_type_proxy.rb +21 -0
- data/lib/graphql/schema/member/non_null_type_proxy.rb +21 -0
- data/lib/graphql/schema/object.rb +65 -0
- data/lib/graphql/schema/printer.rb +266 -33
- data/lib/graphql/schema/scalar.rb +25 -0
- data/lib/graphql/schema/traversal.rb +26 -17
- data/lib/graphql/schema/union.rb +48 -0
- data/lib/graphql/static_validation/rules/fields_have_appropriate_selections.rb +1 -5
- data/lib/graphql/static_validation/rules/fields_will_merge.rb +8 -15
- data/lib/graphql/static_validation/rules/variables_are_used_and_defined.rb +1 -11
- data/lib/graphql/subscriptions/action_cable_subscriptions.rb +5 -7
- data/lib/graphql/tracing.rb +0 -1
- data/lib/graphql/tracing/platform_tracing.rb +7 -20
- data/lib/graphql/tracing/scout_tracing.rb +2 -2
- data/lib/graphql/unresolved_type_error.rb +2 -3
- data/lib/graphql/version.rb +1 -1
- data/readme.md +1 -1
- data/spec/dummy/app/channels/graphql_channel.rb +1 -22
- data/spec/dummy/log/development.log +0 -239
- data/spec/dummy/log/test.log +0 -204
- data/spec/dummy/test/system/action_cable_subscription_test.rb +0 -4
- data/spec/dummy/tmp/screenshots/failures_test_it_handles_subscriptions.png +0 -0
- data/spec/generators/graphql/function_generator_spec.rb +0 -26
- data/spec/generators/graphql/loader_generator_spec.rb +0 -24
- data/spec/graphql/analysis/max_query_complexity_spec.rb +3 -3
- data/spec/graphql/analysis/max_query_depth_spec.rb +3 -3
- data/spec/graphql/backtrace_spec.rb +0 -10
- data/spec/graphql/base_type_spec.rb +5 -19
- data/spec/graphql/boolean_type_spec.rb +3 -3
- data/spec/graphql/directive_spec.rb +1 -3
- data/spec/graphql/enum_type_spec.rb +5 -18
- data/spec/graphql/execution/execute_spec.rb +1 -1
- data/spec/graphql/execution/multiplex_spec.rb +2 -2
- data/spec/graphql/float_type_spec.rb +2 -2
- data/spec/graphql/id_type_spec.rb +1 -1
- data/spec/graphql/input_object_type_spec.rb +2 -15
- data/spec/graphql/int_type_spec.rb +2 -2
- data/spec/graphql/internal_representation/rewrite_spec.rb +2 -2
- data/spec/graphql/introspection/schema_type_spec.rb +0 -1
- data/spec/graphql/language/generation_spec.rb +186 -21
- data/spec/graphql/language/lexer_spec.rb +1 -21
- data/spec/graphql/language/nodes_spec.rb +12 -21
- data/spec/graphql/language/parser_spec.rb +1 -1
- data/spec/graphql/query/arguments_spec.rb +15 -37
- data/spec/graphql/query/serial_execution/value_resolution_spec.rb +2 -2
- data/spec/graphql/query/variables_spec.rb +1 -1
- data/spec/graphql/query_spec.rb +5 -31
- data/spec/graphql/rake_task_spec.rb +1 -3
- data/spec/graphql/relay/base_connection_spec.rb +1 -1
- data/spec/graphql/relay/connection_instrumentation_spec.rb +2 -2
- data/spec/graphql/relay/connection_resolve_spec.rb +1 -1
- data/spec/graphql/relay/connection_type_spec.rb +1 -1
- data/spec/graphql/relay/mutation_spec.rb +3 -3
- data/spec/graphql/relay/relation_connection_spec.rb +1 -65
- data/spec/graphql/schema/build_from_definition_spec.rb +4 -86
- data/spec/graphql/schema/enum_spec.rb +60 -0
- data/spec/graphql/schema/field_spec.rb +14 -0
- data/spec/graphql/schema/input_object_spec.rb +43 -0
- data/spec/graphql/schema/interface_spec.rb +98 -0
- data/spec/graphql/schema/object_spec.rb +119 -0
- data/spec/graphql/schema/printer_spec.rb +15 -92
- data/spec/graphql/schema/scalar_spec.rb +40 -0
- data/spec/graphql/schema/union_spec.rb +35 -0
- data/spec/graphql/schema/validation_spec.rb +1 -1
- data/spec/graphql/schema/warden_spec.rb +11 -11
- data/spec/graphql/schema_spec.rb +25 -23
- data/spec/graphql/static_validation/rules/fields_have_appropriate_selections_spec.rb +2 -10
- data/spec/graphql/static_validation/rules/fields_will_merge_spec.rb +2 -2
- data/spec/graphql/string_type_spec.rb +3 -3
- data/spec/graphql/subscriptions_spec.rb +1 -1
- data/spec/graphql/tracing/platform_tracing_spec.rb +1 -60
- data/spec/support/dummy/schema.rb +25 -39
- data/spec/support/jazz.rb +334 -0
- data/spec/support/lazy_helpers.rb +21 -23
- data/spec/support/star_wars/data.rb +7 -6
- data/spec/support/star_wars/schema.rb +109 -142
- metadata +39 -33
- data/lib/graphql/execution/instrumentation.rb +0 -82
- data/lib/graphql/language/block_string.rb +0 -47
- data/lib/graphql/language/document_from_schema_definition.rb +0 -277
- data/lib/graphql/language/printer.rb +0 -351
- data/lib/graphql/tracing/data_dog_tracing.rb +0 -49
- data/spec/graphql/execution/instrumentation_spec.rb +0 -165
- data/spec/graphql/language/block_string_spec.rb +0 -70
- data/spec/graphql/language/document_from_schema_definition_spec.rb +0 -770
- data/spec/graphql/language/printer_spec.rb +0 -203
    
        data/lib/graphql/schema.rb
    CHANGED
    
    | @@ -16,6 +16,17 @@ require "graphql/schema/validation" | |
| 16 16 | 
             
            require "graphql/schema/warden"
         | 
| 17 17 | 
             
            require "graphql/schema/build_from_definition"
         | 
| 18 18 |  | 
| 19 | 
            +
             | 
| 20 | 
            +
            require "graphql/schema/member"
         | 
| 21 | 
            +
            require "graphql/schema/argument"
         | 
| 22 | 
            +
            require "graphql/schema/enum"
         | 
| 23 | 
            +
            require "graphql/schema/field"
         | 
| 24 | 
            +
            require "graphql/schema/input_object"
         | 
| 25 | 
            +
            require "graphql/schema/interface"
         | 
| 26 | 
            +
            require "graphql/schema/object"
         | 
| 27 | 
            +
            require "graphql/schema/scalar"
         | 
| 28 | 
            +
            require "graphql/schema/union"
         | 
| 29 | 
            +
             | 
| 19 30 | 
             
            module GraphQL
         | 
| 20 31 | 
             
              # A GraphQL schema which may be queried with {GraphQL::Query}.
         | 
| 21 32 | 
             
              #
         | 
| @@ -80,7 +91,6 @@ module GraphQL | |
| 80 91 | 
             
                  :orphan_types, :directives,
         | 
| 81 92 | 
             
                  :query_analyzers, :multiplex_analyzers, :instrumenters, :lazy_methods,
         | 
| 82 93 | 
             
                  :cursor_encoder,
         | 
| 83 | 
            -
                  :ast_node,
         | 
| 84 94 | 
             
                  :raise_definition_error
         | 
| 85 95 |  | 
| 86 96 | 
             
                # Single, long-lived instance of the provided subscriptions class, if there is one.
         | 
| @@ -387,6 +397,18 @@ module GraphQL | |
| 387 397 | 
             
                # @param ctx [GraphQL::Query::Context] The context for the current query
         | 
| 388 398 | 
             
                # @return [GraphQL::ObjectType] The type for exposing `object` in GraphQL
         | 
| 389 399 | 
             
                def resolve_type(type, object, ctx = :__undefined__)
         | 
| 400 | 
            +
                  check_resolved_type(type, object, ctx) do |ok_type, ok_object, ok_ctx|
         | 
| 401 | 
            +
                    if @resolve_type_proc.nil?
         | 
| 402 | 
            +
                      raise(NotImplementedError, "Can't determine GraphQL type for: #{ok_object.inspect}, define `resolve_type (type, obj, ctx) -> { ... }` inside `Schema.define`.")
         | 
| 403 | 
            +
                    end
         | 
| 404 | 
            +
                    @resolve_type_proc.call(ok_type, ok_object, ok_ctx)
         | 
| 405 | 
            +
                  end
         | 
| 406 | 
            +
                end
         | 
| 407 | 
            +
             | 
| 408 | 
            +
                # This is a compatibility hack so that instance-level and class-level
         | 
| 409 | 
            +
                # methods can get correctness checks without calling one another
         | 
| 410 | 
            +
                # @api private
         | 
| 411 | 
            +
                def check_resolved_type(type, object, ctx = :__undefined__)
         | 
| 390 412 | 
             
                  if ctx == :__undefined__
         | 
| 391 413 | 
             
                    # Old method signature
         | 
| 392 414 | 
             
                    ctx = object
         | 
| @@ -394,15 +416,20 @@ module GraphQL | |
| 394 416 | 
             
                    type = nil
         | 
| 395 417 | 
             
                  end
         | 
| 396 418 |  | 
| 419 | 
            +
                  if object.is_a?(GraphQL::Schema::Object)
         | 
| 420 | 
            +
                    object = object.object
         | 
| 421 | 
            +
                  end
         | 
| 422 | 
            +
             | 
| 397 423 | 
             
                  # Prefer a type-local function; fall back to the schema-level function
         | 
| 398 424 | 
             
                  type_proc = type && type.resolve_type_proc
         | 
| 399 425 | 
             
                  type_result = if type_proc
         | 
| 400 426 | 
             
                    type_proc.call(object, ctx)
         | 
| 401 427 | 
             
                  else
         | 
| 402 | 
            -
                     | 
| 403 | 
            -
             | 
| 404 | 
            -
             | 
| 405 | 
            -
             | 
| 428 | 
            +
                    yield(type, object, ctx)
         | 
| 429 | 
            +
                  end
         | 
| 430 | 
            +
             | 
| 431 | 
            +
                  if type_result.respond_to?(:graphql_definition)
         | 
| 432 | 
            +
                    type_result = type_result.graphql_definition
         | 
| 406 433 | 
             
                  end
         | 
| 407 434 |  | 
| 408 435 | 
             
                  if type_result.nil?
         | 
| @@ -543,19 +570,13 @@ module GraphQL | |
| 543 570 | 
             
                  GraphQL::Schema::Printer.print_schema(self, only: only, except: except, context: context)
         | 
| 544 571 | 
             
                end
         | 
| 545 572 |  | 
| 546 | 
            -
                # Return the GraphQL::Language::Document IDL AST for the schema
         | 
| 547 | 
            -
                # @return [GraphQL::Language::Document]
         | 
| 548 | 
            -
                def to_document
         | 
| 549 | 
            -
                  GraphQL::Language::DocumentFromSchemaDefinition.new(self).document
         | 
| 550 | 
            -
                end
         | 
| 551 | 
            -
             | 
| 552 573 | 
             
                # Return the Hash response of {Introspection::INTROSPECTION_QUERY}.
         | 
| 553 574 | 
             
                # @param context [Hash]
         | 
| 554 575 | 
             
                # @param only [<#call(member, ctx)>]
         | 
| 555 576 | 
             
                # @param except [<#call(member, ctx)>]
         | 
| 556 577 | 
             
                # @return [Hash] GraphQL result
         | 
| 557 578 | 
             
                def as_json(only: nil, except: nil, context: {})
         | 
| 558 | 
            -
                  execute(Introspection::INTROSPECTION_QUERY, only: only, except: except, context: context) | 
| 579 | 
            +
                  execute(Introspection::INTROSPECTION_QUERY, only: only, except: except, context: context)
         | 
| 559 580 | 
             
                end
         | 
| 560 581 |  | 
| 561 582 | 
             
                # Returns the JSON response of {Introspection::INTROSPECTION_QUERY}.
         | 
| @@ -565,6 +586,191 @@ module GraphQL | |
| 565 586 | 
             
                  JSON.pretty_generate(as_json(*args))
         | 
| 566 587 | 
             
                end
         | 
| 567 588 |  | 
| 589 | 
            +
                class << self
         | 
| 590 | 
            +
                  extend GraphQL::Delegate
         | 
| 591 | 
            +
                  def_delegators :graphql_definition, :as_json, :to_json
         | 
| 592 | 
            +
             | 
| 593 | 
            +
                  def method_missing(method_name, *args, &block)
         | 
| 594 | 
            +
                    if graphql_definition.respond_to?(method_name)
         | 
| 595 | 
            +
                      graphql_definition.public_send(method_name, *args, &block)
         | 
| 596 | 
            +
                    else
         | 
| 597 | 
            +
                      super
         | 
| 598 | 
            +
                    end
         | 
| 599 | 
            +
                  end
         | 
| 600 | 
            +
             | 
| 601 | 
            +
                  def respond_to_missing?(method_name, incl_private = false)
         | 
| 602 | 
            +
                    graphql_definition.respond_to?(method_name, incl_private) || super
         | 
| 603 | 
            +
                  end
         | 
| 604 | 
            +
             | 
| 605 | 
            +
                  def graphql_definition
         | 
| 606 | 
            +
                    @graphql_definition ||= to_graphql
         | 
| 607 | 
            +
                  end
         | 
| 608 | 
            +
             | 
| 609 | 
            +
                  def use(plugin, options = {})
         | 
| 610 | 
            +
                    plugins << [plugin, options]
         | 
| 611 | 
            +
                  end
         | 
| 612 | 
            +
             | 
| 613 | 
            +
                  def plugins
         | 
| 614 | 
            +
                    @plugins ||= []
         | 
| 615 | 
            +
                  end
         | 
| 616 | 
            +
             | 
| 617 | 
            +
                  def to_graphql
         | 
| 618 | 
            +
                    schema_defn = self.new
         | 
| 619 | 
            +
                    schema_defn.query = query
         | 
| 620 | 
            +
                    schema_defn.mutation = mutation
         | 
| 621 | 
            +
                    schema_defn.subscription = subscription
         | 
| 622 | 
            +
                    schema_defn.max_depth = max_depth
         | 
| 623 | 
            +
                    schema_defn.default_max_page_size = default_max_page_size
         | 
| 624 | 
            +
                    schema_defn.orphan_types = orphan_types
         | 
| 625 | 
            +
                    if !directives
         | 
| 626 | 
            +
                      directives(DIRECTIVES)
         | 
| 627 | 
            +
                    end
         | 
| 628 | 
            +
                    schema_defn.directives = directives
         | 
| 629 | 
            +
                    schema_defn.resolve_type = method(:resolve_type)
         | 
| 630 | 
            +
                    schema_defn.object_from_id = method(:object_from_id)
         | 
| 631 | 
            +
                    schema_defn.id_from_object = method(:id_from_object)
         | 
| 632 | 
            +
                    instrumenters.each do |step, insts|
         | 
| 633 | 
            +
                      insts.each do |inst|
         | 
| 634 | 
            +
                        schema_defn.instrumenters[step] << inst
         | 
| 635 | 
            +
                      end
         | 
| 636 | 
            +
                    end
         | 
| 637 | 
            +
                    schema_defn.instrumenters[:query] << GraphQL::Schema::Member::Instrumentation
         | 
| 638 | 
            +
                    lazy_classes.each do |lazy_class, value_method|
         | 
| 639 | 
            +
                      schema_defn.lazy_methods.set(lazy_class, value_method)
         | 
| 640 | 
            +
                    end
         | 
| 641 | 
            +
                    if plugins.any?
         | 
| 642 | 
            +
                      schema_plugins = plugins
         | 
| 643 | 
            +
                      # TODO don't depend on .define
         | 
| 644 | 
            +
                      schema_defn = schema_defn.redefine do
         | 
| 645 | 
            +
                        schema_plugins.each do |plugin, options|
         | 
| 646 | 
            +
                          if options.any?
         | 
| 647 | 
            +
                            use(plugin, **options)
         | 
| 648 | 
            +
                          else
         | 
| 649 | 
            +
                            use(plugin)
         | 
| 650 | 
            +
                          end
         | 
| 651 | 
            +
                        end
         | 
| 652 | 
            +
                      end
         | 
| 653 | 
            +
                    end
         | 
| 654 | 
            +
                    schema_defn.send(:rebuild_artifacts)
         | 
| 655 | 
            +
             | 
| 656 | 
            +
                    schema_defn
         | 
| 657 | 
            +
                  end
         | 
| 658 | 
            +
             | 
| 659 | 
            +
                  def query(new_query_object = nil)
         | 
| 660 | 
            +
                    if new_query_object
         | 
| 661 | 
            +
                      @query_object = new_query_object
         | 
| 662 | 
            +
                    else
         | 
| 663 | 
            +
                      @query_object.respond_to?(:graphql_definition) ? @query_object.graphql_definition : @query_object
         | 
| 664 | 
            +
                    end
         | 
| 665 | 
            +
                  end
         | 
| 666 | 
            +
             | 
| 667 | 
            +
                  def mutation(new_mutation_object = nil)
         | 
| 668 | 
            +
                    if new_mutation_object
         | 
| 669 | 
            +
                      @mutation_object = new_mutation_object
         | 
| 670 | 
            +
                    else
         | 
| 671 | 
            +
                      @mutation_object.respond_to?(:graphql_definition) ? @mutation_object.graphql_definition : @mutation_object
         | 
| 672 | 
            +
                    end
         | 
| 673 | 
            +
                  end
         | 
| 674 | 
            +
             | 
| 675 | 
            +
                  def subscription(new_subscription_object = nil)
         | 
| 676 | 
            +
                    if new_subscription_object
         | 
| 677 | 
            +
                      @subscription_object = new_subscription_object
         | 
| 678 | 
            +
                    else
         | 
| 679 | 
            +
                      @subscription_object.respond_to?(:graphql_definition) ? @subscription_object.graphql_definition : @subscription_object
         | 
| 680 | 
            +
                    end
         | 
| 681 | 
            +
                  end
         | 
| 682 | 
            +
             | 
| 683 | 
            +
                  def default_max_page_size(new_default_max_page_size = nil)
         | 
| 684 | 
            +
                    if new_default_max_page_size
         | 
| 685 | 
            +
                      @default_max_page_size = new_default_max_page_size
         | 
| 686 | 
            +
                    else
         | 
| 687 | 
            +
                      @default_max_page_size
         | 
| 688 | 
            +
                    end
         | 
| 689 | 
            +
                  end
         | 
| 690 | 
            +
             | 
| 691 | 
            +
                  def max_depth(new_max_depth = nil)
         | 
| 692 | 
            +
                    if new_max_depth
         | 
| 693 | 
            +
                      @max_depth = new_max_depth
         | 
| 694 | 
            +
                    else
         | 
| 695 | 
            +
                      @max_depth
         | 
| 696 | 
            +
                    end
         | 
| 697 | 
            +
                  end
         | 
| 698 | 
            +
             | 
| 699 | 
            +
                  def orphan_types(new_orphan_types = nil)
         | 
| 700 | 
            +
                    if new_orphan_types
         | 
| 701 | 
            +
                      @orphan_types = new_orphan_types
         | 
| 702 | 
            +
                    else
         | 
| 703 | 
            +
                      @orphan_types || []
         | 
| 704 | 
            +
                    end
         | 
| 705 | 
            +
                  end
         | 
| 706 | 
            +
             | 
| 707 | 
            +
                  def default_execution_strategy
         | 
| 708 | 
            +
                    if superclass <= GraphQL::Schema
         | 
| 709 | 
            +
                      superclass.default_execution_strategy
         | 
| 710 | 
            +
                    else
         | 
| 711 | 
            +
                      @default_execution_strategy
         | 
| 712 | 
            +
                    end
         | 
| 713 | 
            +
                  end
         | 
| 714 | 
            +
             | 
| 715 | 
            +
                  def resolve_type(type, obj, ctx)
         | 
| 716 | 
            +
                    raise NotImplementedError, "#{self.name}.resolve_type(type, obj, ctx) must be implemented to use Union types or Interface types (tried to resolve: #{type.name})"
         | 
| 717 | 
            +
                  end
         | 
| 718 | 
            +
             | 
| 719 | 
            +
                  def object_from_id(node_id, ctx)
         | 
| 720 | 
            +
                    raise NotImplementedError, "#{self.name}.object_from_id(node_id, ctx) must be implemented to use the `node` field (tried to load from id `#{node_id}`)"
         | 
| 721 | 
            +
                  end
         | 
| 722 | 
            +
             | 
| 723 | 
            +
                  def id_from_object(object, type, ctx)
         | 
| 724 | 
            +
                    raise NotImplementedError, "#{self.name}.id_from_object(object, type, ctx) must be implemented to create global ids (tried to create an id for `#{object.inspect}`)"
         | 
| 725 | 
            +
                  end
         | 
| 726 | 
            +
             | 
| 727 | 
            +
                  def lazy_resolve(lazy_class, value_method)
         | 
| 728 | 
            +
                    lazy_classes[lazy_class] = value_method
         | 
| 729 | 
            +
                  end
         | 
| 730 | 
            +
             | 
| 731 | 
            +
                  def instrument(instrument_step, instrumenter, options = {})
         | 
| 732 | 
            +
                    step = if instrument_step == :field && options[:after_built_ins]
         | 
| 733 | 
            +
                      :field_after_built_ins
         | 
| 734 | 
            +
                    else
         | 
| 735 | 
            +
                      instrument_step
         | 
| 736 | 
            +
                    end
         | 
| 737 | 
            +
                    instrumenters[step] << instrumenter
         | 
| 738 | 
            +
                  end
         | 
| 739 | 
            +
             | 
| 740 | 
            +
                  def directives(new_directives = nil)
         | 
| 741 | 
            +
                    if new_directives
         | 
| 742 | 
            +
                      @directives = new_directives.reduce({}) { |m, d| m[d.name] = d; m }
         | 
| 743 | 
            +
                    end
         | 
| 744 | 
            +
                    @directives
         | 
| 745 | 
            +
                  end
         | 
| 746 | 
            +
             | 
| 747 | 
            +
                  private
         | 
| 748 | 
            +
             | 
| 749 | 
            +
                  def lazy_classes
         | 
| 750 | 
            +
                    @lazy_classes ||= {}
         | 
| 751 | 
            +
                  end
         | 
| 752 | 
            +
             | 
| 753 | 
            +
                  def instrumenters
         | 
| 754 | 
            +
                    @instrumenters ||= Hash.new { |h,k| h[k] = [] }
         | 
| 755 | 
            +
                  end
         | 
| 756 | 
            +
                end
         | 
| 757 | 
            +
             | 
| 758 | 
            +
             | 
| 759 | 
            +
                def self.inherited(child_class)
         | 
| 760 | 
            +
                  child_class.singleton_class.class_eval do
         | 
| 761 | 
            +
                    prepend(MethodWrappers)
         | 
| 762 | 
            +
                  end
         | 
| 763 | 
            +
                end
         | 
| 764 | 
            +
             | 
| 765 | 
            +
                module MethodWrappers
         | 
| 766 | 
            +
                  # Wrap the user-provided resolve-type in a correctness check
         | 
| 767 | 
            +
                  def resolve_type(type, obj, ctx = :__undefined__)
         | 
| 768 | 
            +
                    graphql_definition.check_resolved_type(type, obj, ctx) do |ok_type, ok_obj, ok_ctx|
         | 
| 769 | 
            +
                      super(ok_type, ok_obj, ok_ctx)
         | 
| 770 | 
            +
                    end
         | 
| 771 | 
            +
                  end
         | 
| 772 | 
            +
                end
         | 
| 773 | 
            +
             | 
| 568 774 | 
             
                protected
         | 
| 569 775 |  | 
| 570 776 | 
             
                def rescues?
         | 
| @@ -585,6 +791,7 @@ module GraphQL | |
| 585 791 | 
             
                  GraphQL::Relay::ConnectionInstrumentation,
         | 
| 586 792 | 
             
                  GraphQL::Relay::EdgesInstrumentation,
         | 
| 587 793 | 
             
                  GraphQL::Relay::Mutation::Instrumentation,
         | 
| 794 | 
            +
                  GraphQL::Schema::Member::Instrumentation,
         | 
| 588 795 | 
             
                ]
         | 
| 589 796 |  | 
| 590 797 | 
             
                def rebuild_artifacts
         | 
| @@ -0,0 +1,33 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
            module GraphQL
         | 
| 3 | 
            +
              class Schema
         | 
| 4 | 
            +
                class Argument
         | 
| 5 | 
            +
                  include GraphQL::Schema::Member::CachedGraphQLDefinition
         | 
| 6 | 
            +
             | 
| 7 | 
            +
                  NO_DEFAULT = :__no_default__
         | 
| 8 | 
            +
             | 
| 9 | 
            +
                  attr_reader :name
         | 
| 10 | 
            +
             | 
| 11 | 
            +
                  def initialize(arg_name, type_expr, desc = nil, required:, default_value: NO_DEFAULT)
         | 
| 12 | 
            +
                    @name = arg_name.to_s
         | 
| 13 | 
            +
                    @type_expr = type_expr
         | 
| 14 | 
            +
                    @description = desc
         | 
| 15 | 
            +
                    @null = !required
         | 
| 16 | 
            +
                    @default_value = default_value
         | 
| 17 | 
            +
                  end
         | 
| 18 | 
            +
             | 
| 19 | 
            +
                  def to_graphql
         | 
| 20 | 
            +
                    argument = GraphQL::Argument.new
         | 
| 21 | 
            +
                    argument.name = @name
         | 
| 22 | 
            +
                    argument.type = -> {
         | 
| 23 | 
            +
                      Member::BuildType.parse_type(@type_expr, null: @null)
         | 
| 24 | 
            +
                    }
         | 
| 25 | 
            +
                    argument.description = @description
         | 
| 26 | 
            +
                    if NO_DEFAULT != @default_value
         | 
| 27 | 
            +
                      argument.default_value = @default_value
         | 
| 28 | 
            +
                    end
         | 
| 29 | 
            +
                    argument
         | 
| 30 | 
            +
                  end
         | 
| 31 | 
            +
                end
         | 
| 32 | 
            +
              end
         | 
| 33 | 
            +
            end
         | 
| @@ -107,8 +107,6 @@ module GraphQL | |
| 107 107 | 
             
                        directives directives.values
         | 
| 108 108 | 
             
                      end
         | 
| 109 109 |  | 
| 110 | 
            -
                      schema.ast_node = schema_definition if schema_definition
         | 
| 111 | 
            -
             | 
| 112 110 | 
             
                      schema
         | 
| 113 111 | 
             
                    end
         | 
| 114 112 |  | 
| @@ -119,26 +117,18 @@ module GraphQL | |
| 119 117 | 
             
                    NullScalarCoerce = ->(val, _ctx) { val }
         | 
| 120 118 |  | 
| 121 119 | 
             
                    def build_enum_type(enum_type_definition, type_resolver)
         | 
| 122 | 
            -
                       | 
| 120 | 
            +
                      GraphQL::EnumType.define(
         | 
| 123 121 | 
             
                        name: enum_type_definition.name,
         | 
| 124 122 | 
             
                        description: enum_type_definition.description,
         | 
| 125 123 | 
             
                        values: enum_type_definition.values.map do |enum_value_definition|
         | 
| 126 | 
            -
                           | 
| 124 | 
            +
                          EnumType::EnumValue.define(
         | 
| 127 125 | 
             
                            name: enum_value_definition.name,
         | 
| 128 126 | 
             
                            value: enum_value_definition.name,
         | 
| 129 127 | 
             
                            deprecation_reason: build_deprecation_reason(enum_value_definition.directives),
         | 
| 130 128 | 
             
                            description: enum_value_definition.description,
         | 
| 131 129 | 
             
                          )
         | 
| 132 | 
            -
             | 
| 133 | 
            -
                          value.ast_node = enum_value_definition
         | 
| 134 | 
            -
             | 
| 135 | 
            -
                          value
         | 
| 136 130 | 
             
                        end
         | 
| 137 131 | 
             
                      )
         | 
| 138 | 
            -
             | 
| 139 | 
            -
                      enum.ast_node = enum_type_definition
         | 
| 140 | 
            -
             | 
| 141 | 
            -
                      enum
         | 
| 142 132 | 
             
                    end
         | 
| 143 133 |  | 
| 144 134 | 
             
                    def build_deprecation_reason(directives)
         | 
| @@ -158,8 +148,6 @@ module GraphQL | |
| 158 148 | 
             
                        coerce: NullScalarCoerce,
         | 
| 159 149 | 
             
                      )
         | 
| 160 150 |  | 
| 161 | 
            -
                      scalar_type.ast_node = scalar_type_definition
         | 
| 162 | 
            -
             | 
| 163 151 | 
             
                      if default_resolve.respond_to?(:coerce_input)
         | 
| 164 152 | 
             
                        scalar_type = scalar_type.redefine(
         | 
| 165 153 | 
             
                          coerce_input: ->(val, ctx) { default_resolve.coerce_input(scalar_type, val, ctx) },
         | 
| @@ -171,15 +159,11 @@ module GraphQL | |
| 171 159 | 
             
                    end
         | 
| 172 160 |  | 
| 173 161 | 
             
                    def build_union_type(union_type_definition, type_resolver)
         | 
| 174 | 
            -
                       | 
| 162 | 
            +
                      GraphQL::UnionType.define(
         | 
| 175 163 | 
             
                        name: union_type_definition.name,
         | 
| 176 164 | 
             
                        description: union_type_definition.description,
         | 
| 177 165 | 
             
                        possible_types: union_type_definition.types.map{ |type_name| type_resolver.call(type_name) },
         | 
| 178 166 | 
             
                      )
         | 
| 179 | 
            -
             | 
| 180 | 
            -
                      union.ast_node = union_type_definition
         | 
| 181 | 
            -
             | 
| 182 | 
            -
                      union
         | 
| 183 167 | 
             
                    end
         | 
| 184 168 |  | 
| 185 169 | 
             
                    def build_object_type(object_type_definition, type_resolver, default_resolve:)
         | 
| @@ -191,20 +175,14 @@ module GraphQL | |
| 191 175 | 
             
                        fields: Hash[build_fields(object_type_definition.fields, type_resolver, default_resolve: typed_resolve_fn)],
         | 
| 192 176 | 
             
                        interfaces: object_type_definition.interfaces.map{ |interface_name| type_resolver.call(interface_name) },
         | 
| 193 177 | 
             
                      )
         | 
| 194 | 
            -
                      type_def.ast_node = object_type_definition
         | 
| 195 | 
            -
                      type_def
         | 
| 196 178 | 
             
                    end
         | 
| 197 179 |  | 
| 198 180 | 
             
                    def build_input_object_type(input_object_type_definition, type_resolver)
         | 
| 199 | 
            -
                       | 
| 181 | 
            +
                      GraphQL::InputObjectType.define(
         | 
| 200 182 | 
             
                        name: input_object_type_definition.name,
         | 
| 201 183 | 
             
                        description: input_object_type_definition.description,
         | 
| 202 184 | 
             
                        arguments: Hash[build_input_arguments(input_object_type_definition, type_resolver)],
         | 
| 203 185 | 
             
                      )
         | 
| 204 | 
            -
             | 
| 205 | 
            -
                      input.ast_node = input_object_type_definition
         | 
| 206 | 
            -
             | 
| 207 | 
            -
                      input
         | 
| 208 186 | 
             
                    end
         | 
| 209 187 |  | 
| 210 188 | 
             
                    def build_default_value(default_value)
         | 
| @@ -213,10 +191,6 @@ module GraphQL | |
| 213 191 | 
             
                        default_value.name
         | 
| 214 192 | 
             
                      when GraphQL::Language::Nodes::NullValue
         | 
| 215 193 | 
             
                        nil
         | 
| 216 | 
            -
                      when GraphQL::Language::Nodes::InputObject
         | 
| 217 | 
            -
                        default_value.to_h
         | 
| 218 | 
            -
                      when Array
         | 
| 219 | 
            -
                        default_value.map { |v| build_default_value(v) }
         | 
| 220 194 | 
             
                      else
         | 
| 221 195 | 
             
                        default_value
         | 
| 222 196 | 
             
                      end
         | 
| @@ -230,33 +204,25 @@ module GraphQL | |
| 230 204 | 
             
                          kwargs[:default_value] = build_default_value(input_argument.default_value)
         | 
| 231 205 | 
             
                        end
         | 
| 232 206 |  | 
| 233 | 
            -
                        argument = GraphQL::Argument.define(
         | 
| 234 | 
            -
                          name: input_argument.name,
         | 
| 235 | 
            -
                          type: type_resolver.call(input_argument.type),
         | 
| 236 | 
            -
                          description: input_argument.description,
         | 
| 237 | 
            -
                          **kwargs,
         | 
| 238 | 
            -
                        )
         | 
| 239 | 
            -
             | 
| 240 | 
            -
                        argument.ast_node = input_object_type_definition
         | 
| 241 | 
            -
             | 
| 242 207 | 
             
                        [
         | 
| 243 208 | 
             
                          input_argument.name,
         | 
| 244 | 
            -
                           | 
| 209 | 
            +
                          GraphQL::Argument.define(
         | 
| 210 | 
            +
                            name: input_argument.name,
         | 
| 211 | 
            +
                            type: type_resolver.call(input_argument.type),
         | 
| 212 | 
            +
                            description: input_argument.description,
         | 
| 213 | 
            +
                            **kwargs,
         | 
| 214 | 
            +
                          )
         | 
| 245 215 | 
             
                        ]
         | 
| 246 216 | 
             
                      end
         | 
| 247 217 | 
             
                    end
         | 
| 248 218 |  | 
| 249 219 | 
             
                    def build_directive(directive_definition, type_resolver)
         | 
| 250 | 
            -
                       | 
| 220 | 
            +
                      GraphQL::Directive.define(
         | 
| 251 221 | 
             
                        name: directive_definition.name,
         | 
| 252 222 | 
             
                        description: directive_definition.description,
         | 
| 253 223 | 
             
                        arguments: Hash[build_directive_arguments(directive_definition, type_resolver)],
         | 
| 254 224 | 
             
                        locations: directive_definition.locations.map(&:to_sym),
         | 
| 255 225 | 
             
                      )
         | 
| 256 | 
            -
             | 
| 257 | 
            -
                      directive.ast_node = directive_definition
         | 
| 258 | 
            -
             | 
| 259 | 
            -
                      directive
         | 
| 260 226 | 
             
                    end
         | 
| 261 227 |  | 
| 262 228 | 
             
                    def build_directive_arguments(directive_definition, type_resolver)
         | 
| @@ -267,32 +233,24 @@ module GraphQL | |
| 267 233 | 
             
                          kwargs[:default_value] = build_default_value(directive_argument.default_value)
         | 
| 268 234 | 
             
                        end
         | 
| 269 235 |  | 
| 270 | 
            -
                        argument = GraphQL::Argument.define(
         | 
| 271 | 
            -
                          name: directive_argument.name,
         | 
| 272 | 
            -
                          type: type_resolver.call(directive_argument.type),
         | 
| 273 | 
            -
                          description: directive_argument.description,
         | 
| 274 | 
            -
                          **kwargs,
         | 
| 275 | 
            -
                        )
         | 
| 276 | 
            -
             | 
| 277 | 
            -
                        argument.ast_node = directive_argument
         | 
| 278 | 
            -
             | 
| 279 236 | 
             
                        [
         | 
| 280 237 | 
             
                          directive_argument.name,
         | 
| 281 | 
            -
                           | 
| 238 | 
            +
                          GraphQL::Argument.define(
         | 
| 239 | 
            +
                            name: directive_argument.name,
         | 
| 240 | 
            +
                            type: type_resolver.call(directive_argument.type),
         | 
| 241 | 
            +
                            description: directive_argument.description,
         | 
| 242 | 
            +
                            **kwargs,
         | 
| 243 | 
            +
                          )
         | 
| 282 244 | 
             
                        ]
         | 
| 283 245 | 
             
                      end
         | 
| 284 246 | 
             
                    end
         | 
| 285 247 |  | 
| 286 248 | 
             
                    def build_interface_type(interface_type_definition, type_resolver)
         | 
| 287 | 
            -
                       | 
| 249 | 
            +
                      GraphQL::InterfaceType.define(
         | 
| 288 250 | 
             
                        name: interface_type_definition.name,
         | 
| 289 251 | 
             
                        description: interface_type_definition.description,
         | 
| 290 252 | 
             
                        fields: Hash[build_fields(interface_type_definition.fields, type_resolver, default_resolve: nil)],
         | 
| 291 253 | 
             
                      )
         | 
| 292 | 
            -
             | 
| 293 | 
            -
                      interface.ast_node = interface_type_definition
         | 
| 294 | 
            -
             | 
| 295 | 
            -
                      interface
         | 
| 296 254 | 
             
                    end
         | 
| 297 255 |  | 
| 298 256 | 
             
                    def build_fields(field_definitions, type_resolver, default_resolve:)
         | 
| @@ -311,8 +269,6 @@ module GraphQL | |
| 311 269 | 
             
                            **kwargs,
         | 
| 312 270 | 
             
                          )
         | 
| 313 271 |  | 
| 314 | 
            -
                          arg.ast_node = argument
         | 
| 315 | 
            -
             | 
| 316 272 | 
             
                          [argument.name, arg]
         | 
| 317 273 | 
             
                        end]
         | 
| 318 274 |  | 
| @@ -325,8 +281,6 @@ module GraphQL | |
| 325 281 | 
             
                          deprecation_reason: build_deprecation_reason(field_definition.directives),
         | 
| 326 282 | 
             
                        )
         | 
| 327 283 |  | 
| 328 | 
            -
                        field.ast_node = field_definition
         | 
| 329 | 
            -
             | 
| 330 284 | 
             
                        type_name = resolve_type_name(field_definition.type)
         | 
| 331 285 | 
             
                        field.connection = type_name.end_with?("Connection")
         | 
| 332 286 | 
             
                        [field_definition.name, field]
         |