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
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 | 
            -
             | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 2 | 
            +
            SHA1:
         | 
| 3 | 
            +
              metadata.gz: 909c3eda6b9624635a5901ceddee57a8e714a96c
         | 
| 4 | 
            +
              data.tar.gz: 7cc0f7c57d20b6979fba3156077e7989d55d6646
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: d94639f25409ba6fb4504fd9cd5fba087e717c36f88ef6329202c3f286050927ca73d67bba12313368f0aa8080af408611184b6f7bb2a4f0e24a327a76e124e7
         | 
| 7 | 
            +
              data.tar.gz: d84a84ad71225d052113c863b69ff25cb724fc97d31db680b8eee1befe7252ee94e50ff5b4cf23018fc8460c20dc80c60075dc00f42af5138c01f1f7342af9d3
         | 
| @@ -11,7 +11,7 @@ module Graphql | |
| 11 11 | 
             
                  source_root File.expand_path('../templates', __FILE__)
         | 
| 12 12 |  | 
| 13 13 | 
             
                  def create_function_file
         | 
| 14 | 
            -
                    template "function.erb", "#{options[:directory]}/functions/#{ | 
| 14 | 
            +
                    template "function.erb", "#{options[:directory]}/functions/#{file_name}.rb"
         | 
| 15 15 | 
             
                  end
         | 
| 16 16 | 
             
                end
         | 
| 17 17 | 
             
              end
         | 
| @@ -13,7 +13,7 @@ module Graphql | |
| 13 13 | 
             
                  source_root File.expand_path('../templates', __FILE__)
         | 
| 14 14 |  | 
| 15 15 | 
             
                  def create_loader_file
         | 
| 16 | 
            -
                    template "loader.erb", "#{options[:directory]}/loaders/#{ | 
| 16 | 
            +
                    template "loader.erb", "#{options[:directory]}/loaders/#{file_name}.rb"
         | 
| 17 17 | 
             
                  end
         | 
| 18 18 | 
             
                end
         | 
| 19 19 | 
             
              end
         | 
| @@ -27,12 +27,7 @@ module Graphql | |
| 27 27 | 
             
                  attr_reader :file_name, :mutation_name, :field_name
         | 
| 28 28 |  | 
| 29 29 | 
             
                  def create_mutation_file
         | 
| 30 | 
            -
                     | 
| 31 | 
            -
                      create_mutation_root_type
         | 
| 32 | 
            -
                    else
         | 
| 33 | 
            -
                      log :gsub, "#{options[:directory]}/types/mutation_type.rb"
         | 
| 34 | 
            -
                    end
         | 
| 35 | 
            -
                    
         | 
| 30 | 
            +
                    create_mutation_root_type
         | 
| 36 31 | 
             
                    template "mutation.erb", "#{options[:directory]}/mutations/#{file_name}.rb"
         | 
| 37 32 |  | 
| 38 33 | 
             
                    sentinel = /name "Mutation"\s*\n/m
         | 
| @@ -1,7 +1,7 @@ | |
| 1 | 
            -
            class Functions::<%=  | 
| 1 | 
            +
            class Functions::<%= name %> < GraphQL::Function
         | 
| 2 2 | 
             
              # Define `initialize` to store field-level options, eg
         | 
| 3 3 | 
             
              #
         | 
| 4 | 
            -
              #     field :myField, function: Functions::<%=  | 
| 4 | 
            +
              #     field :myField, function: Functions::<%= name %>.new(type: MyType)
         | 
| 5 5 | 
             
              #
         | 
| 6 6 | 
             
              # attr_reader :type
         | 
| 7 7 | 
             
              # def initialize(type:)
         | 
| @@ -1,7 +1,7 @@ | |
| 1 | 
            -
            class Loaders::<%=  | 
| 1 | 
            +
            class Loaders::<%= name %> < GraphQL::Batch::Loader
         | 
| 2 2 | 
             
              # Define `initialize` to store grouping arguments, eg
         | 
| 3 3 | 
             
              #
         | 
| 4 | 
            -
              #     Loaders::<%=  | 
| 4 | 
            +
              #     Loaders::<%= name %>.for(group).load(value)
         | 
| 5 5 | 
             
              #
         | 
| 6 6 | 
             
              # def initialize()
         | 
| 7 7 | 
             
              # end
         | 
    
        data/lib/graphql.rb
    CHANGED
    
    
    
        data/lib/graphql/argument.rb
    CHANGED
    
    | @@ -37,7 +37,6 @@ module GraphQL | |
| 37 37 | 
             
                include GraphQL::Define::InstanceDefinable
         | 
| 38 38 | 
             
                accepts_definitions :name, :type, :description, :default_value, :as, :prepare
         | 
| 39 39 | 
             
                attr_accessor :type, :description, :default_value, :name, :as
         | 
| 40 | 
            -
                attr_accessor :ast_node
         | 
| 41 40 |  | 
| 42 41 | 
             
                ensure_defined(:name, :description, :default_value, :type=, :type, :as, :expose_as, :prepare)
         | 
| 43 42 |  | 
| @@ -12,11 +12,10 @@ module GraphQL | |
| 12 12 | 
             
                # If `last`, then use the last arguments to call the function.
         | 
| 13 13 | 
             
                def wrap_arity(callable, from:, to:, name:, last: false)
         | 
| 14 14 | 
             
                  arity = get_arity(callable)
         | 
| 15 | 
            -
                   | 
| 16 | 
            -
                  when to
         | 
| 15 | 
            +
                  if arity == to || arity < 0
         | 
| 17 16 | 
             
                    # It already matches, return it as is
         | 
| 18 17 | 
             
                    callable
         | 
| 19 | 
            -
                   | 
| 18 | 
            +
                  elsif arity == from
         | 
| 20 19 | 
             
                    # It has the old arity, so wrap it with an arity converter
         | 
| 21 20 | 
             
                    message ="#{name} with #{from} arguments is deprecated, it now accepts #{to} arguments, see:"
         | 
| 22 21 | 
             
                    backtrace = caller(0, 20)
         | 
    
        data/lib/graphql/base_type.rb
    CHANGED
    
    | @@ -15,8 +15,6 @@ module GraphQL | |
| 15 15 |  | 
| 16 16 | 
             
                ensure_defined(:name, :description, :introspection?, :default_scalar?)
         | 
| 17 17 |  | 
| 18 | 
            -
                attr_accessor :ast_node
         | 
| 19 | 
            -
             | 
| 20 18 | 
             
                def initialize
         | 
| 21 19 | 
             
                  @introspection = false
         | 
| 22 20 | 
             
                  @default_scalar = false
         | 
| @@ -32,11 +30,12 @@ module GraphQL | |
| 32 30 |  | 
| 33 31 | 
             
                # @return [String] the name of this type, must be unique within a Schema
         | 
| 34 32 | 
             
                attr_accessor :name
         | 
| 35 | 
            -
             | 
| 36 | 
            -
                 | 
| 37 | 
            -
             | 
| 38 | 
            -
             | 
| 39 | 
            -
                 | 
| 33 | 
            +
                # Future-compatible alias
         | 
| 34 | 
            +
                # @see {GraphQL::SchemaMember}
         | 
| 35 | 
            +
                alias :graphql_name :name
         | 
| 36 | 
            +
                # Future-compatible alias
         | 
| 37 | 
            +
                # @see {GraphQL::SchemaMember}
         | 
| 38 | 
            +
                alias :graphql_definition :itself
         | 
| 40 39 |  | 
| 41 40 | 
             
                # @return [String, nil] a description for this type
         | 
| 42 41 | 
             
                attr_accessor :description
         | 
| @@ -61,9 +60,12 @@ module GraphQL | |
| 61 60 |  | 
| 62 61 | 
             
                # @param other [GraphQL::BaseType] compare to this object
         | 
| 63 62 | 
             
                # @return [Boolean] are these types equivalent? (incl. non-null, list)
         | 
| 64 | 
            -
                # @see {ModifiesAnotherType#==} for override on List & NonNull types
         | 
| 65 63 | 
             
                def ==(other)
         | 
| 66 | 
            -
                  other.is_a?(GraphQL::BaseType) | 
| 64 | 
            +
                  if other.is_a?(GraphQL::BaseType)
         | 
| 65 | 
            +
                    self.to_s == other.to_s
         | 
| 66 | 
            +
                  else
         | 
| 67 | 
            +
                    super
         | 
| 68 | 
            +
                  end
         | 
| 67 69 | 
             
                end
         | 
| 68 70 |  | 
| 69 71 | 
             
                # If this type is modifying an underlying type,
         | 
| @@ -86,10 +88,6 @@ module GraphQL | |
| 86 88 | 
             
                  def unwrap
         | 
| 87 89 | 
             
                    self.of_type.unwrap
         | 
| 88 90 | 
             
                  end
         | 
| 89 | 
            -
             | 
| 90 | 
            -
                  def ==(other)
         | 
| 91 | 
            -
                    other.is_a?(ModifiesAnotherType) && other.of_type == of_type
         | 
| 92 | 
            -
                  end
         | 
| 93 91 | 
             
                end
         | 
| 94 92 |  | 
| 95 93 | 
             
                # Find out which possible type to use for `value`.
         | 
| @@ -172,13 +170,17 @@ module GraphQL | |
| 172 170 | 
             
                def self.resolve_related_type(type_arg)
         | 
| 173 171 | 
             
                  case type_arg
         | 
| 174 172 | 
             
                  when Proc
         | 
| 175 | 
            -
                    # lazy-eval it
         | 
| 176 | 
            -
                    type_arg.call
         | 
| 173 | 
            +
                    # lazy-eval it, then try again
         | 
| 174 | 
            +
                    resolve_related_type(type_arg.call)
         | 
| 177 175 | 
             
                  when String
         | 
| 178 176 | 
             
                    # Get a constant by this name
         | 
| 179 177 | 
             
                    Object.const_get(type_arg)
         | 
| 180 178 | 
             
                  else
         | 
| 181 | 
            -
                    type_arg
         | 
| 179 | 
            +
                    if type_arg.respond_to?(:graphql_definition)
         | 
| 180 | 
            +
                      type_arg.graphql_definition
         | 
| 181 | 
            +
                    else
         | 
| 182 | 
            +
                      type_arg
         | 
| 183 | 
            +
                    end
         | 
| 182 184 | 
             
                  end
         | 
| 183 185 | 
             
                end
         | 
| 184 186 |  | 
| @@ -67,10 +67,6 @@ module GraphQL | |
| 67 67 | 
             
                              nullValue: null
         | 
| 68 68 | 
             
                              nullValueInObject: {a: null, b: "b"}
         | 
| 69 69 | 
             
                              nullValueInArray: ["a", null, "b"]
         | 
| 70 | 
            -
                              blockString: """
         | 
| 71 | 
            -
                              Hello,
         | 
| 72 | 
            -
                                World
         | 
| 73 | 
            -
                              """
         | 
| 74 70 | 
             
                            )
         | 
| 75 71 | 
             
                          }
         | 
| 76 72 | 
             
                        |
         | 
| @@ -104,9 +100,6 @@ module GraphQL | |
| 104 100 | 
             
                        assert_equal 'a', values[0]
         | 
| 105 101 | 
             
                        assert_instance_of GraphQL::Language::Nodes::NullValue, values[1]
         | 
| 106 102 | 
             
                        assert_equal 'b', values[2]
         | 
| 107 | 
            -
             | 
| 108 | 
            -
                        block_str_value = inputs[12].value
         | 
| 109 | 
            -
                        assert_equal "Hello,\n  World", block_str_value
         | 
| 110 103 | 
             
                      end
         | 
| 111 104 |  | 
| 112 105 | 
             
                      def test_it_doesnt_parse_nonsense_variables
         | 
| @@ -123,116 +116,6 @@ module GraphQL | |
| 123 116 | 
             
                        end
         | 
| 124 117 | 
             
                        assert_equal [1,26], [err_2.line, err_2.col]
         | 
| 125 118 | 
             
                      end
         | 
| 126 | 
            -
             | 
| 127 | 
            -
                      def test_enum_value_definitions_have_a_position
         | 
| 128 | 
            -
                        document = parse("""
         | 
| 129 | 
            -
                          enum Enum {
         | 
| 130 | 
            -
                            VALUE
         | 
| 131 | 
            -
                          }
         | 
| 132 | 
            -
                        """)
         | 
| 133 | 
            -
             | 
| 134 | 
            -
                        assert_equal [3, 17], document.definitions[0].values[0].position
         | 
| 135 | 
            -
                      end
         | 
| 136 | 
            -
             | 
| 137 | 
            -
                      def test_field_definitions_have_a_position
         | 
| 138 | 
            -
                        document = parse("""
         | 
| 139 | 
            -
                          type A {
         | 
| 140 | 
            -
                            field: String
         | 
| 141 | 
            -
                          }
         | 
| 142 | 
            -
                        """)
         | 
| 143 | 
            -
             | 
| 144 | 
            -
                        assert_equal [3, 17], document.definitions[0].fields[0].position
         | 
| 145 | 
            -
                      end
         | 
| 146 | 
            -
             | 
| 147 | 
            -
                      def test_input_value_definitions_have_a_position
         | 
| 148 | 
            -
                        document = parse("""
         | 
| 149 | 
            -
                          input A {
         | 
| 150 | 
            -
                            field: String
         | 
| 151 | 
            -
                          }
         | 
| 152 | 
            -
                        """)
         | 
| 153 | 
            -
             | 
| 154 | 
            -
                        assert_equal [3, 17], document.definitions[0].fields[0].position
         | 
| 155 | 
            -
                      end
         | 
| 156 | 
            -
             | 
| 157 | 
            -
                      def test_parses_when_there_are_no_interfaces
         | 
| 158 | 
            -
                        schema = "
         | 
| 159 | 
            -
                          type A {
         | 
| 160 | 
            -
                            a: String
         | 
| 161 | 
            -
                          }
         | 
| 162 | 
            -
                        "
         | 
| 163 | 
            -
             | 
| 164 | 
            -
                        document = parse(schema)
         | 
| 165 | 
            -
             | 
| 166 | 
            -
                        assert_equal [], document.definitions[0].interfaces.map(&:name)
         | 
| 167 | 
            -
                      end
         | 
| 168 | 
            -
             | 
| 169 | 
            -
                      def test_parses_implements_with_leading_ampersand
         | 
| 170 | 
            -
                        schema = "
         | 
| 171 | 
            -
                          type A implements & B {
         | 
| 172 | 
            -
                            a: String
         | 
| 173 | 
            -
                          }
         | 
| 174 | 
            -
                        "
         | 
| 175 | 
            -
             | 
| 176 | 
            -
                        document = parse(schema)
         | 
| 177 | 
            -
             | 
| 178 | 
            -
                        assert_equal ["B"], document.definitions[0].interfaces.map(&:name)
         | 
| 179 | 
            -
                        assert_equal [2, 35], document.definitions[0].interfaces[0].position
         | 
| 180 | 
            -
                      end
         | 
| 181 | 
            -
             | 
| 182 | 
            -
                      def test_parses_implements_with_leading_ampersand_and_multiple_interfaces
         | 
| 183 | 
            -
                        schema = "
         | 
| 184 | 
            -
                          type A implements & B & C {
         | 
| 185 | 
            -
                            a: String
         | 
| 186 | 
            -
                          }
         | 
| 187 | 
            -
                        "
         | 
| 188 | 
            -
             | 
| 189 | 
            -
                        document = parse(schema)
         | 
| 190 | 
            -
             | 
| 191 | 
            -
                        assert_equal ["B", "C"], document.definitions[0].interfaces.map(&:name)
         | 
| 192 | 
            -
                        assert_equal [2, 35], document.definitions[0].interfaces[0].position
         | 
| 193 | 
            -
                        assert_equal [2, 39], document.definitions[0].interfaces[1].position
         | 
| 194 | 
            -
                      end
         | 
| 195 | 
            -
             | 
| 196 | 
            -
                      def test_parses_implements_without_leading_ampersand
         | 
| 197 | 
            -
                        schema = "
         | 
| 198 | 
            -
                          type A implements B {
         | 
| 199 | 
            -
                            a: String
         | 
| 200 | 
            -
                          }
         | 
| 201 | 
            -
                        "
         | 
| 202 | 
            -
             | 
| 203 | 
            -
                        document = parse(schema)
         | 
| 204 | 
            -
             | 
| 205 | 
            -
                        assert_equal ["B"], document.definitions[0].interfaces.map(&:name)
         | 
| 206 | 
            -
                        assert_equal [2, 33], document.definitions[0].interfaces[0].position
         | 
| 207 | 
            -
                      end
         | 
| 208 | 
            -
             | 
| 209 | 
            -
                      def test_parses_implements_without_leading_ampersand_and_multiple_interfaces
         | 
| 210 | 
            -
                        schema = "
         | 
| 211 | 
            -
                          type A implements B & C {
         | 
| 212 | 
            -
                            a: String
         | 
| 213 | 
            -
                          }
         | 
| 214 | 
            -
                        "
         | 
| 215 | 
            -
             | 
| 216 | 
            -
                        document = parse(schema)
         | 
| 217 | 
            -
             | 
| 218 | 
            -
                        assert_equal ["B", "C"], document.definitions[0].interfaces.map(&:name)
         | 
| 219 | 
            -
                        assert_equal [2, 33], document.definitions[0].interfaces[0].position
         | 
| 220 | 
            -
                        assert_equal [2, 37], document.definitions[0].interfaces[1].position
         | 
| 221 | 
            -
                      end
         | 
| 222 | 
            -
             | 
| 223 | 
            -
                      def test_supports_old_syntax_for_parsing_multiple_interfaces
         | 
| 224 | 
            -
                        schema = "
         | 
| 225 | 
            -
                          type A implements B, C {
         | 
| 226 | 
            -
                            a: String
         | 
| 227 | 
            -
                          }
         | 
| 228 | 
            -
                        "
         | 
| 229 | 
            -
             | 
| 230 | 
            -
                        document = parse(schema)
         | 
| 231 | 
            -
             | 
| 232 | 
            -
                        assert_equal ["B", "C"], document.definitions[0].interfaces.map(&:name)
         | 
| 233 | 
            -
                        assert_equal [2, 33], document.definitions[0].interfaces[0].position
         | 
| 234 | 
            -
                        assert_equal [2, 36], document.definitions[0].interfaces[1].position
         | 
| 235 | 
            -
                      end
         | 
| 236 119 | 
             
                    end
         | 
| 237 120 | 
             
                  end
         | 
| 238 121 |  | 
| @@ -56,20 +56,6 @@ module GraphQL | |
| 56 56 | 
             
                      assert_raises_parse_error(%|{ field(arg:"\\uXXXF") }|)
         | 
| 57 57 | 
             
                    end
         | 
| 58 58 |  | 
| 59 | 
            -
                    def test_it_rejects_empty_inline_fragments
         | 
| 60 | 
            -
                      assert_raises_parse_error("
         | 
| 61 | 
            -
                        query {
         | 
| 62 | 
            -
                          viewer {
         | 
| 63 | 
            -
                            login {
         | 
| 64 | 
            -
                              ... on String {
         | 
| 65 | 
            -
             | 
| 66 | 
            -
                              }
         | 
| 67 | 
            -
                            }
         | 
| 68 | 
            -
                          }
         | 
| 69 | 
            -
                        }
         | 
| 70 | 
            -
                      ")
         | 
| 71 | 
            -
                    end
         | 
| 72 | 
            -
             | 
| 73 59 | 
             
                    def assert_empty_document(query_string)
         | 
| 74 60 | 
             
                      doc = parse(query_string)
         | 
| 75 61 | 
             
                      assert_equal 0, doc.definitions.length
         | 
| @@ -18,23 +18,16 @@ module GraphQL | |
| 18 18 | 
             
                    base_field = if type_or_field.is_a?(GraphQL::Field)
         | 
| 19 19 | 
             
                      type_or_field.redefine(name: name_s)
         | 
| 20 20 | 
             
                    elsif function
         | 
| 21 | 
            -
                      GraphQL:: | 
| 22 | 
            -
             | 
| 23 | 
            -
             | 
| 24 | 
            -
                        name: name_s,
         | 
| 25 | 
            -
                        type: function.type,
         | 
| 26 | 
            -
                        resolve: function,
         | 
| 27 | 
            -
                        description: function.description,
         | 
| 28 | 
            -
                        function: function,
         | 
| 29 | 
            -
                        deprecation_reason: function.deprecation_reason,
         | 
| 30 | 
            -
                      )
         | 
| 21 | 
            +
                      func_field = GraphQL::Function.build_field(function)
         | 
| 22 | 
            +
                      func_field.name = name_s
         | 
| 23 | 
            +
                      func_field
         | 
| 31 24 | 
             
                    elsif field.is_a?(GraphQL::Field)
         | 
| 32 25 | 
             
                      field.redefine(name: name_s)
         | 
| 33 26 | 
             
                    else
         | 
| 34 27 | 
             
                      nil
         | 
| 35 28 | 
             
                    end
         | 
| 36 29 |  | 
| 37 | 
            -
                     | 
| 30 | 
            +
                    obj_field = if base_field
         | 
| 38 31 | 
             
                      base_field.redefine(kwargs, &block)
         | 
| 39 32 | 
             
                    else
         | 
| 40 33 | 
             
                      GraphQL::Field.define(kwargs, &block)
         | 
| @@ -42,7 +35,7 @@ module GraphQL | |
| 42 35 |  | 
| 43 36 |  | 
| 44 37 | 
             
                    # Attach the field to the type
         | 
| 45 | 
            -
                    owner_type.fields[name_s] =  | 
| 38 | 
            +
                    owner_type.fields[name_s] = obj_field
         | 
| 46 39 | 
             
                  end
         | 
| 47 40 | 
             
                end
         | 
| 48 41 | 
             
              end
         | 
| @@ -0,0 +1,28 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
            module GraphQL
         | 
| 3 | 
            +
              # There are two ways to apply the deprecated `!` DSL to class-style schema definitions:
         | 
| 4 | 
            +
              #
         | 
| 5 | 
            +
              # 1. Scoped by file (CRuby only), add to the top of the file:
         | 
| 6 | 
            +
              #
         | 
| 7 | 
            +
              #      using GraphQL::DeprecatedDSL
         | 
| 8 | 
            +
              #
         | 
| 9 | 
            +
              #   (This is a "refinement", there are also other ways to scope it.)
         | 
| 10 | 
            +
              #
         | 
| 11 | 
            +
              # 2. Global application, add before schema definition:
         | 
| 12 | 
            +
              #
         | 
| 13 | 
            +
              #      GraphQL::DeprecatedDSL.activate
         | 
| 14 | 
            +
              #
         | 
| 15 | 
            +
              module DeprecatedDSL
         | 
| 16 | 
            +
                def self.activate
         | 
| 17 | 
            +
                  GraphQL::Schema::Member.extend(Methods)
         | 
| 18 | 
            +
                end
         | 
| 19 | 
            +
                module Methods
         | 
| 20 | 
            +
                  def !
         | 
| 21 | 
            +
                    to_non_null_type
         | 
| 22 | 
            +
                  end
         | 
| 23 | 
            +
                end
         | 
| 24 | 
            +
                refine GraphQL::Schema::Member.singleton_class do
         | 
| 25 | 
            +
                  include Methods
         | 
| 26 | 
            +
                end
         | 
| 27 | 
            +
              end
         | 
| 28 | 
            +
            end
         | 
    
        data/lib/graphql/directive.rb
    CHANGED
    
    | @@ -11,7 +11,6 @@ module GraphQL | |
| 11 11 | 
             
                accepts_definitions :locations, :name, :description, :arguments, :default_directive, argument: GraphQL::Define::AssignArgument
         | 
| 12 12 |  | 
| 13 13 | 
             
                attr_accessor :locations, :arguments, :name, :description, :arguments_class
         | 
| 14 | 
            -
                attr_accessor :ast_node
         | 
| 15 14 | 
             
                # @api private
         | 
| 16 15 | 
             
                attr_writer :default_directive
         | 
| 17 16 | 
             
                ensure_defined(:locations, :arguments, :name, :description, :default_directive?)
         | 
    
        data/lib/graphql/enum_type.rb
    CHANGED
    
    | @@ -74,7 +74,6 @@ module GraphQL | |
| 74 74 | 
             
              class EnumType < GraphQL::BaseType
         | 
| 75 75 | 
             
                accepts_definitions :values, value: GraphQL::Define::AssignEnumValue
         | 
| 76 76 | 
             
                ensure_defined(:values, :validate_non_null_input, :coerce_non_null_input, :coerce_result)
         | 
| 77 | 
            -
                attr_accessor :ast_node
         | 
| 78 77 |  | 
| 79 78 | 
             
                def initialize
         | 
| 80 79 | 
             
                  super
         | 
| @@ -122,7 +121,7 @@ module GraphQL | |
| 122 121 | 
             
                  if enum_value
         | 
| 123 122 | 
             
                    enum_value.name
         | 
| 124 123 | 
             
                  else
         | 
| 125 | 
            -
                    raise(UnresolvedValueError, "Can't resolve enum #{name} for #{value | 
| 124 | 
            +
                    raise(UnresolvedValueError, "Can't resolve enum #{name} for #{value}")
         | 
| 126 125 | 
             
                  end
         | 
| 127 126 | 
             
                end
         | 
| 128 127 |  | 
| @@ -138,7 +137,6 @@ module GraphQL | |
| 138 137 | 
             
                  ATTRIBUTES = [:name, :description, :deprecation_reason, :value]
         | 
| 139 138 | 
             
                  accepts_definitions(*ATTRIBUTES)
         | 
| 140 139 | 
             
                  attr_accessor(*ATTRIBUTES)
         | 
| 141 | 
            -
                  attr_accessor :ast_node
         | 
| 142 140 | 
             
                  ensure_defined(*ATTRIBUTES)
         | 
| 143 141 |  | 
| 144 142 | 
             
                  def name=(new_name)
         | 
    
        data/lib/graphql/execution.rb
    CHANGED
    
    | @@ -2,7 +2,6 @@ | |
| 2 2 | 
             
            require "graphql/execution/directive_checks"
         | 
| 3 3 | 
             
            require "graphql/execution/execute"
         | 
| 4 4 | 
             
            require "graphql/execution/flatten"
         | 
| 5 | 
            -
            require "graphql/execution/instrumentation"
         | 
| 6 5 | 
             
            require "graphql/execution/lazy"
         | 
| 7 6 | 
             
            require "graphql/execution/multiplex"
         | 
| 8 7 | 
             
            require "graphql/execution/typecast"
         | 
| @@ -60,12 +60,12 @@ module GraphQL | |
| 60 60 | 
             
                          if queries.length != 1
         | 
| 61 61 | 
             
                            raise ArgumentError, "Multiplexing doesn't support custom execution strategies, run one query at a time instead"
         | 
| 62 62 | 
             
                          else
         | 
| 63 | 
            -
                             | 
| 63 | 
            +
                            with_instrumentation(multiplex, max_complexity: max_complexity) do
         | 
| 64 64 | 
             
                              [run_one_legacy(schema, queries.first)]
         | 
| 65 65 | 
             
                            end
         | 
| 66 66 | 
             
                          end
         | 
| 67 67 | 
             
                        else
         | 
| 68 | 
            -
                           | 
| 68 | 
            +
                          with_instrumentation(multiplex, max_complexity: max_complexity) do
         | 
| 69 69 | 
             
                            run_as_multiplex(multiplex)
         | 
| 70 70 | 
             
                          end
         | 
| 71 71 | 
             
                        end
         | 
| @@ -93,7 +93,7 @@ module GraphQL | |
| 93 93 | 
             
                      end
         | 
| 94 94 | 
             
                    rescue StandardError
         | 
| 95 95 | 
             
                      # Assign values here so that the query's `@executed` becomes true
         | 
| 96 | 
            -
                      queries.map { |q| q.result_values ||=  | 
| 96 | 
            +
                      queries.map { |q| q.result_values ||= nil }
         | 
| 97 97 | 
             
                      raise
         | 
| 98 98 | 
             
                    end
         | 
| 99 99 |  | 
| @@ -162,17 +162,34 @@ module GraphQL | |
| 162 162 | 
             
                    # Apply multiplex & query instrumentation to `queries`.
         | 
| 163 163 | 
             
                    #
         | 
| 164 164 | 
             
                    # It yields when the queries should be executed, then runs teardown.
         | 
| 165 | 
            -
                    def  | 
| 166 | 
            -
                       | 
| 167 | 
            -
             | 
| 168 | 
            -
             | 
| 169 | 
            -
             | 
| 170 | 
            -
             | 
| 171 | 
            -
             | 
| 165 | 
            +
                    def with_instrumentation(multiplex, max_complexity:)
         | 
| 166 | 
            +
                      schema = multiplex.schema
         | 
| 167 | 
            +
                      queries = multiplex.queries
         | 
| 168 | 
            +
                      query_instrumenters = schema.instrumenters[:query]
         | 
| 169 | 
            +
                      multiplex_instrumenters = schema.instrumenters[:multiplex]
         | 
| 170 | 
            +
             | 
| 171 | 
            +
                      # First, run multiplex instrumentation, then query instrumentation for each query
         | 
| 172 | 
            +
                      multiplex_instrumenters.each { |i| i.before_multiplex(multiplex) }
         | 
| 173 | 
            +
                      queries.each do |query|
         | 
| 174 | 
            +
                        query_instrumenters.each { |i| i.before_query(query) }
         | 
| 175 | 
            +
                      end
         | 
| 176 | 
            +
             | 
| 177 | 
            +
                      multiplex_analyzers = schema.multiplex_analyzers
         | 
| 178 | 
            +
                      if max_complexity
         | 
| 179 | 
            +
                        multiplex_analyzers += [GraphQL::Analysis::MaxQueryComplexity.new(max_complexity)]
         | 
| 180 | 
            +
                      end
         | 
| 181 | 
            +
             | 
| 182 | 
            +
                      GraphQL::Analysis.analyze_multiplex(multiplex, multiplex_analyzers)
         | 
| 172 183 |  | 
| 173 | 
            -
             | 
| 174 | 
            -
             | 
| 184 | 
            +
                      # Let them be executed
         | 
| 185 | 
            +
                      yield
         | 
| 186 | 
            +
                    ensure
         | 
| 187 | 
            +
                      # Finally, run teardown instrumentation for each query + the multiplex
         | 
| 188 | 
            +
                      # Use `reverse_each` so instrumenters are treated like a stack
         | 
| 189 | 
            +
                      queries.each do |query|
         | 
| 190 | 
            +
                        query_instrumenters.reverse_each { |i| i.after_query(query) }
         | 
| 175 191 | 
             
                      end
         | 
| 192 | 
            +
                      multiplex_instrumenters.reverse_each { |i| i.after_multiplex(multiplex) }
         | 
| 176 193 | 
             
                    end
         | 
| 177 194 | 
             
                  end
         | 
| 178 195 | 
             
                end
         |