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
| @@ -0,0 +1,40 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
            require "spec_helper"
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            describe GraphQL::Schema::Scalar do
         | 
| 5 | 
            +
              describe "in queries" do
         | 
| 6 | 
            +
                it "becomes output" do
         | 
| 7 | 
            +
                  query_str = <<-GRAPHQL
         | 
| 8 | 
            +
                  {
         | 
| 9 | 
            +
                    find(id: "Musician/Herbie Hancock") {
         | 
| 10 | 
            +
                      ... on Musician {
         | 
| 11 | 
            +
                        name
         | 
| 12 | 
            +
                        favoriteKey
         | 
| 13 | 
            +
                      }
         | 
| 14 | 
            +
                    }
         | 
| 15 | 
            +
                  }
         | 
| 16 | 
            +
                  GRAPHQL
         | 
| 17 | 
            +
             | 
| 18 | 
            +
                  res = Jazz::Schema.execute(query_str)
         | 
| 19 | 
            +
                  assert_equal "B♭", res["data"]["find"]["favoriteKey"]
         | 
| 20 | 
            +
                end
         | 
| 21 | 
            +
             | 
| 22 | 
            +
                it "can be input" do
         | 
| 23 | 
            +
                  query_str = <<-GRAPHQL
         | 
| 24 | 
            +
                  {
         | 
| 25 | 
            +
                    inspectKey(key: "F♯") {
         | 
| 26 | 
            +
                      root
         | 
| 27 | 
            +
                      isSharp
         | 
| 28 | 
            +
                      isFlat
         | 
| 29 | 
            +
                    }
         | 
| 30 | 
            +
                  }
         | 
| 31 | 
            +
                  GRAPHQL
         | 
| 32 | 
            +
             | 
| 33 | 
            +
                  res = Jazz::Schema.execute(query_str)
         | 
| 34 | 
            +
                  key_info = res["data"]["inspectKey"]
         | 
| 35 | 
            +
                  assert_equal "F", key_info["root"]
         | 
| 36 | 
            +
                  assert_equal true, key_info["isSharp"]
         | 
| 37 | 
            +
                  assert_equal false, key_info["isFlat"]
         | 
| 38 | 
            +
                end
         | 
| 39 | 
            +
              end
         | 
| 40 | 
            +
            end
         | 
| @@ -0,0 +1,35 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
            require "spec_helper"
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            describe GraphQL::Schema::Union do
         | 
| 5 | 
            +
              let(:union) { Jazz::PerformingAct }
         | 
| 6 | 
            +
              describe "type info" do
         | 
| 7 | 
            +
                it "has some" do
         | 
| 8 | 
            +
                  assert_equal 2, union.possible_types.size
         | 
| 9 | 
            +
                end
         | 
| 10 | 
            +
              end
         | 
| 11 | 
            +
             | 
| 12 | 
            +
              describe "in queries" do
         | 
| 13 | 
            +
                it "works" do
         | 
| 14 | 
            +
                  query_str = <<-GRAPHQL
         | 
| 15 | 
            +
                  {
         | 
| 16 | 
            +
                    nowPlaying {
         | 
| 17 | 
            +
                      ... on Musician {
         | 
| 18 | 
            +
                        name
         | 
| 19 | 
            +
                        instrument {
         | 
| 20 | 
            +
                          family
         | 
| 21 | 
            +
                        }
         | 
| 22 | 
            +
                      }
         | 
| 23 | 
            +
                      ... on Ensemble {
         | 
| 24 | 
            +
                        name
         | 
| 25 | 
            +
                      }
         | 
| 26 | 
            +
                    }
         | 
| 27 | 
            +
                  }
         | 
| 28 | 
            +
                  GRAPHQL
         | 
| 29 | 
            +
             | 
| 30 | 
            +
                  res = Jazz::Schema.execute(query_str)
         | 
| 31 | 
            +
                  expected_data = { "name" => "Bela Fleck and the Flecktones" }
         | 
| 32 | 
            +
                  assert_equal expected_data, res["data"]["nowPlaying"]
         | 
| 33 | 
            +
                end
         | 
| 34 | 
            +
              end
         | 
| 35 | 
            +
            end
         | 
| @@ -333,7 +333,7 @@ describe GraphQL::Schema::Validation do | |
| 333 333 | 
             
                end
         | 
| 334 334 |  | 
| 335 335 | 
             
                it "allows null default value for nullable argument" do
         | 
| 336 | 
            -
                   | 
| 336 | 
            +
                  assert_equal nil, GraphQL::Schema::Validation.validate(null_default_value)
         | 
| 337 337 | 
             
                end
         | 
| 338 338 | 
             
              end
         | 
| 339 339 |  | 
| @@ -242,8 +242,8 @@ describe GraphQL::Schema::Warden do | |
| 242 242 | 
             
                  GRAPHQL
         | 
| 243 243 | 
             
                  res = MaskHelpers.query_with_mask(query_string, mask)
         | 
| 244 244 | 
             
                  assert_equal "Query", res["data"]["__schema"]["queryType"]["name"]
         | 
| 245 | 
            -
                   | 
| 246 | 
            -
                   | 
| 245 | 
            +
                  assert_equal nil, res["data"]["__schema"]["mutationType"]
         | 
| 246 | 
            +
                  assert_equal nil, res["data"]["__schema"]["subscriptionType"]
         | 
| 247 247 | 
             
                  type_names = res["data"]["__schema"]["types"].map { |t| t["name"] }
         | 
| 248 248 | 
             
                  refute type_names.include?("Mutation")
         | 
| 249 249 | 
             
                  refute type_names.include?("Subscription")
         | 
| @@ -344,7 +344,7 @@ describe GraphQL::Schema::Warden do | |
| 344 344 | 
             
                  res = MaskHelpers.run_query(query_string, only: whitelist)
         | 
| 345 345 |  | 
| 346 346 | 
             
                  # It's not visible by name
         | 
| 347 | 
            -
                   | 
| 347 | 
            +
                  assert_equal nil, res["data"]["Phoneme"]
         | 
| 348 348 |  | 
| 349 349 | 
             
                  # It's not visible in `__schema`
         | 
| 350 350 | 
             
                  all_type_names = type_names(res)
         | 
| @@ -423,7 +423,7 @@ describe GraphQL::Schema::Warden do | |
| 423 423 |  | 
| 424 424 | 
             
                    res = MaskHelpers.query_with_mask(query_string, mask)
         | 
| 425 425 | 
             
                    type = res["data"]["__type"]
         | 
| 426 | 
            -
                     | 
| 426 | 
            +
                    assert_equal nil, type
         | 
| 427 427 | 
             
                  end
         | 
| 428 428 | 
             
                end
         | 
| 429 429 | 
             
              end
         | 
| @@ -543,7 +543,7 @@ describe GraphQL::Schema::Warden do | |
| 543 543 |  | 
| 544 544 | 
             
                  res = MaskHelpers.query_with_mask(query_string, mask)
         | 
| 545 545 |  | 
| 546 | 
            -
                   | 
| 546 | 
            +
                  assert_equal nil, res["data"]["WithinInput"], "The type isn't accessible by name"
         | 
| 547 547 |  | 
| 548 548 | 
             
                  languages_arg_names = res["data"]["Query"]["fields"].find { |f| f["name"] == "languages" }["args"].map { |a| a["name"] }
         | 
| 549 549 | 
             
                  refute_includes languages_arg_names, "within", "Arguments that point to it are gone"
         | 
| @@ -666,7 +666,7 @@ describe GraphQL::Schema::Warden do | |
| 666 666 | 
             
                it "is additive with query filters" do
         | 
| 667 667 | 
             
                  query_except = ->(member, ctx) { member.metadata[:hidden_input_object_type] }
         | 
| 668 668 | 
             
                  res = schema.execute(query_str, except: query_except)
         | 
| 669 | 
            -
                   | 
| 669 | 
            +
                  assert_equal nil, res["data"]["input"]
         | 
| 670 670 | 
             
                  enum_values = res["data"]["enum"]["enumValues"].map { |v| v["name"] }
         | 
| 671 671 | 
             
                  refute_includes enum_values, "TRILL"
         | 
| 672 672 | 
             
                end
         | 
| @@ -695,13 +695,13 @@ describe GraphQL::Schema::Warden do | |
| 695 695 | 
             
                      only: [visible_enum_value, visible_abstract_type],
         | 
| 696 696 | 
             
                      except: [hidden_input_object, hidden_type],
         | 
| 697 697 | 
             
                    )
         | 
| 698 | 
            -
                     | 
| 698 | 
            +
                    assert_equal nil, res["data"]["input"]
         | 
| 699 699 | 
             
                    enum_values = res["data"]["enum"]["enumValues"].map { |v| v["name"] }
         | 
| 700 700 | 
             
                    assert_equal 5, enum_values.length
         | 
| 701 701 | 
             
                    refute_includes enum_values, "TRILL"
         | 
| 702 702 | 
             
                    # These are also filtered out:
         | 
| 703 703 | 
             
                    assert_equal 0, res["data"]["abstractType"]["interfaces"].length
         | 
| 704 | 
            -
                     | 
| 704 | 
            +
                    assert_equal nil, res["data"]["type"]
         | 
| 705 705 | 
             
                  end
         | 
| 706 706 | 
             
                end
         | 
| 707 707 |  | 
| @@ -712,7 +712,7 @@ describe GraphQL::Schema::Warden do | |
| 712 712 | 
             
                      except: hidden_input_object,
         | 
| 713 713 | 
             
                    }
         | 
| 714 714 | 
             
                    res = MaskHelpers.run_query(query_str, context: { filters: filters })
         | 
| 715 | 
            -
                     | 
| 715 | 
            +
                    assert_equal nil, res["data"]["input"]
         | 
| 716 716 | 
             
                    enum_values = res["data"]["enum"]["enumValues"].map { |v| v["name"] }
         | 
| 717 717 | 
             
                    assert_equal 5, enum_values.length
         | 
| 718 718 | 
             
                    refute_includes enum_values, "TRILL"
         | 
| @@ -727,13 +727,13 @@ describe GraphQL::Schema::Warden do | |
| 727 727 | 
             
                      except: [hidden_input_object, hidden_type],
         | 
| 728 728 | 
             
                    }
         | 
| 729 729 | 
             
                    res = MaskHelpers.run_query(query_str, context: { filters: filters })
         | 
| 730 | 
            -
                     | 
| 730 | 
            +
                    assert_equal nil, res["data"]["input"]
         | 
| 731 731 | 
             
                    enum_values = res["data"]["enum"]["enumValues"].map { |v| v["name"] }
         | 
| 732 732 | 
             
                    assert_equal 5, enum_values.length
         | 
| 733 733 | 
             
                    refute_includes enum_values, "TRILL"
         | 
| 734 734 | 
             
                    # These are also filtered out:
         | 
| 735 735 | 
             
                    assert_equal 0, res["data"]["abstractType"]["interfaces"].length
         | 
| 736 | 
            -
                     | 
| 736 | 
            +
                    assert_equal nil, res["data"]["type"]
         | 
| 737 737 | 
             
                  end
         | 
| 738 738 | 
             
                end
         | 
| 739 739 | 
             
              end
         | 
    
        data/spec/graphql/schema_spec.rb
    CHANGED
    
    | @@ -23,19 +23,12 @@ describe GraphQL::Schema do | |
| 23 23 | 
             
                end
         | 
| 24 24 | 
             
              end
         | 
| 25 25 |  | 
| 26 | 
            -
              describe "#to_document" do
         | 
| 27 | 
            -
                it "returns the AST for the schema IDL" do
         | 
| 28 | 
            -
                  expected = GraphQL::Language::DocumentFromSchemaDefinition.new(schema).document
         | 
| 29 | 
            -
                  assert expected.eql?(schema.to_document)
         | 
| 30 | 
            -
                end
         | 
| 31 | 
            -
              end
         | 
| 32 | 
            -
             | 
| 33 26 | 
             
              describe "#root_types" do
         | 
| 34 27 | 
             
                it "returns a list of the schema's root types" do
         | 
| 35 28 | 
             
                  assert_equal(
         | 
| 36 29 | 
             
                    [
         | 
| 37 30 | 
             
                      Dummy::DairyAppQueryType,
         | 
| 38 | 
            -
                      Dummy::DairyAppMutationType,
         | 
| 31 | 
            +
                      Dummy::DairyAppMutationType.graphql_definition,
         | 
| 39 32 | 
             
                      Dummy::SubscriptionType
         | 
| 40 33 | 
             
                    ],
         | 
| 41 34 | 
             
                    schema.root_types
         | 
| @@ -379,24 +372,25 @@ type Query { | |
| 379 372 | 
             
                  assert_equal true, schema.lazy?(LazyObj.new)
         | 
| 380 373 | 
             
                  assert_equal :dup, schema.lazy_method_name(LazyObjChild.new)
         | 
| 381 374 | 
             
                  assert_equal true, schema.lazy?(LazyObjChild.new)
         | 
| 382 | 
            -
                   | 
| 375 | 
            +
                  assert_equal nil, schema.lazy_method_name({})
         | 
| 383 376 | 
             
                  assert_equal false, schema.lazy?({})
         | 
| 384 377 | 
             
                end
         | 
| 385 378 | 
             
              end
         | 
| 386 379 |  | 
| 387 380 | 
             
              describe "#dup" do
         | 
| 388 381 | 
             
                it "copies internal state" do
         | 
| 389 | 
            -
                   | 
| 390 | 
            -
                   | 
| 382 | 
            +
                  schema_1 = schema.graphql_definition
         | 
| 383 | 
            +
                  schema_2 = schema_1.dup
         | 
| 384 | 
            +
                  refute schema_2.types.equal?(schema_1.types)
         | 
| 391 385 |  | 
| 392 | 
            -
                  refute schema_2.instrumenters.equal?( | 
| 393 | 
            -
                  assert_equal schema_2.instrumenters,  | 
| 386 | 
            +
                  refute schema_2.instrumenters.equal?(schema_1.instrumenters)
         | 
| 387 | 
            +
                  assert_equal schema_2.instrumenters, schema_1.instrumenters
         | 
| 394 388 |  | 
| 395 | 
            -
                  refute schema_2.middleware.equal?( | 
| 396 | 
            -
                  assert_equal schema_2.middleware,  | 
| 389 | 
            +
                  refute schema_2.middleware.equal?(schema_1.middleware)
         | 
| 390 | 
            +
                  assert_equal schema_2.middleware, schema_1.middleware
         | 
| 397 391 |  | 
| 398 392 | 
             
                  schema_2.middleware << ->(*args) { :noop }
         | 
| 399 | 
            -
                  refute_equal schema_2.middleware,  | 
| 393 | 
            +
                  refute_equal schema_2.middleware, schema_1.middleware
         | 
| 400 394 | 
             
                end
         | 
| 401 395 | 
             
              end
         | 
| 402 396 |  | 
| @@ -425,13 +419,6 @@ type Query { | |
| 425 419 | 
             
                end
         | 
| 426 420 | 
             
              end
         | 
| 427 421 |  | 
| 428 | 
            -
              describe "#as_json" do
         | 
| 429 | 
            -
                it "returns a hash" do
         | 
| 430 | 
            -
                  result = schema.execute(GraphQL::Introspection::INTROSPECTION_QUERY)
         | 
| 431 | 
            -
                  assert_equal result.as_json.class, Hash
         | 
| 432 | 
            -
                end
         | 
| 433 | 
            -
              end
         | 
| 434 | 
            -
             | 
| 435 422 | 
             
              describe "#get_field" do
         | 
| 436 423 | 
             
                it "returns fields by type or type name" do
         | 
| 437 424 | 
             
                  field = schema.get_field("Cheese", "id")
         | 
| @@ -440,4 +427,19 @@ type Query { | |
| 440 427 | 
             
                  assert_equal field, field_2
         | 
| 441 428 | 
             
                end
         | 
| 442 429 | 
             
              end
         | 
| 430 | 
            +
             | 
| 431 | 
            +
              describe "class-based schemas" do
         | 
| 432 | 
            +
                it "delegates to the graphql definition" do
         | 
| 433 | 
            +
                  # Not delegated:
         | 
| 434 | 
            +
                  assert_equal Jazz::Query.graphql_definition, Jazz::Schema.query
         | 
| 435 | 
            +
                  assert Jazz::Schema.respond_to?(:query)
         | 
| 436 | 
            +
                  # Delegated
         | 
| 437 | 
            +
                  assert_equal [], Jazz::Schema.tracers
         | 
| 438 | 
            +
                  assert Jazz::Schema.respond_to?(:tracers)
         | 
| 439 | 
            +
                end
         | 
| 440 | 
            +
             | 
| 441 | 
            +
                it "works with plugins" do
         | 
| 442 | 
            +
                  assert_equal "xyz", Jazz::Schema.metadata[:plugin_key]
         | 
| 443 | 
            +
                end
         | 
| 444 | 
            +
              end
         | 
| 443 445 | 
             
            end
         | 
| @@ -8,19 +8,18 @@ describe GraphQL::StaticValidation::FieldsHaveAppropriateSelections do | |
| 8 8 | 
             
                  okCheese: cheese(id: 1) { fatContent, similarCheese(source: YAK) { source } }
         | 
| 9 9 | 
             
                  missingFieldsCheese: cheese(id: 1)
         | 
| 10 10 | 
             
                  illegalSelectionCheese: cheese(id: 1) { id { something, ... someFields } }
         | 
| 11 | 
            -
                  incorrectFragmentSpread: cheese(id: 1) { flavor { ... on String { __typename } } }
         | 
| 12 11 | 
             
                }
         | 
| 13 12 | 
             
              "}
         | 
| 14 13 |  | 
| 15 14 | 
             
              it "adds errors for selections on scalars" do
         | 
| 16 | 
            -
                assert_equal( | 
| 15 | 
            +
                assert_equal(2, errors.length)
         | 
| 17 16 |  | 
| 18 17 | 
             
                illegal_selection_error = {
         | 
| 19 18 | 
             
                  "message"=>"Selections can't be made on scalars (field 'id' returns Int but has selections [something, someFields])",
         | 
| 20 19 | 
             
                  "locations"=>[{"line"=>5, "column"=>47}],
         | 
| 21 20 | 
             
                  "fields"=>["query getCheese", "illegalSelectionCheese", "id"],
         | 
| 22 21 | 
             
                }
         | 
| 23 | 
            -
                assert_includes(errors, illegal_selection_error, "finds illegal selections on  | 
| 22 | 
            +
                assert_includes(errors, illegal_selection_error, "finds illegal selections on scalarss")
         | 
| 24 23 |  | 
| 25 24 | 
             
                selection_required_error = {
         | 
| 26 25 | 
             
                  "message"=>"Objects must have selections (field 'cheese' returns Cheese but has no selections)",
         | 
| @@ -28,13 +27,6 @@ describe GraphQL::StaticValidation::FieldsHaveAppropriateSelections do | |
| 28 27 | 
             
                  "fields"=>["query getCheese", "missingFieldsCheese"],
         | 
| 29 28 | 
             
                }
         | 
| 30 29 | 
             
                assert_includes(errors, selection_required_error, "finds objects without selections")
         | 
| 31 | 
            -
             | 
| 32 | 
            -
                incorrect_fragment_error = {
         | 
| 33 | 
            -
                  "message"=>"Selections can't be made on scalars (field 'flavor' returns String but has inline fragments [String])",
         | 
| 34 | 
            -
                  "locations"=>[{"line"=>6, "column"=>48}],
         | 
| 35 | 
            -
                  "fields"=>["query getCheese", "incorrectFragmentSpread", "flavor"],
         | 
| 36 | 
            -
                }
         | 
| 37 | 
            -
                assert_includes(errors, incorrect_fragment_error, "finds scalar fields with selections")
         | 
| 38 30 | 
             
              end
         | 
| 39 31 |  | 
| 40 32 | 
             
              describe "anonymous operations" do
         | 
| @@ -515,7 +515,7 @@ describe GraphQL::StaticValidation::FieldsWillMerge do | |
| 515 515 | 
             
                      scalar: String!
         | 
| 516 516 | 
             
                    }
         | 
| 517 517 |  | 
| 518 | 
            -
                    type NonNullStringBox1Impl implements SomeBox  | 
| 518 | 
            +
                    type NonNullStringBox1Impl implements SomeBox, NonNullStringBox1 {
         | 
| 519 519 | 
             
                      scalar: String!
         | 
| 520 520 | 
             
                      unrelatedField: String
         | 
| 521 521 | 
             
                      deepBox: SomeBox
         | 
| @@ -525,7 +525,7 @@ describe GraphQL::StaticValidation::FieldsWillMerge do | |
| 525 525 | 
             
                      scalar: String!
         | 
| 526 526 | 
             
                    }
         | 
| 527 527 |  | 
| 528 | 
            -
                    type NonNullStringBox2Impl implements SomeBox  | 
| 528 | 
            +
                    type NonNullStringBox2Impl implements SomeBox, NonNullStringBox2 {
         | 
| 529 529 | 
             
                      scalar: String!
         | 
| 530 530 | 
             
                      unrelatedField: String
         | 
| 531 531 | 
             
                      deepBox: SomeBox
         | 
| @@ -72,9 +72,9 @@ describe GraphQL::STRING_TYPE do | |
| 72 72 | 
             
                end
         | 
| 73 73 |  | 
| 74 74 | 
             
                it "doesn't accept other types" do
         | 
| 75 | 
            -
                   | 
| 76 | 
            -
                   | 
| 77 | 
            -
                   | 
| 75 | 
            +
                  assert_equal nil, string_type.coerce_isolated_input(100)
         | 
| 76 | 
            +
                  assert_equal nil, string_type.coerce_isolated_input(true)
         | 
| 77 | 
            +
                  assert_equal nil, string_type.coerce_isolated_input(0.999)
         | 
| 78 78 | 
             
                end
         | 
| 79 79 | 
             
              end
         | 
| 80 80 | 
             
            end
         | 
| @@ -242,7 +242,7 @@ describe GraphQL::Subscriptions do | |
| 242 242 | 
             
                  schema.execute(query_str, context: { socket: "1" }, variables: { "id" => "8" }, root_value: root_object)
         | 
| 243 243 | 
             
                  schema.subscriptions.trigger("payload", { "id" => "8"}, OpenStruct.new(str: nil, int: nil))
         | 
| 244 244 | 
             
                  delivery = deliveries["1"].first
         | 
| 245 | 
            -
                   | 
| 245 | 
            +
                  assert_equal nil, delivery.fetch("data")
         | 
| 246 246 | 
             
                  assert_equal 1, delivery["errors"].length
         | 
| 247 247 | 
             
                end
         | 
| 248 248 |  | 
| @@ -41,72 +41,13 @@ describe GraphQL::Tracing::PlatformTracing do | |
| 41 41 | 
             
                  schema.execute(" { cheese(id: 1) { flavor } }")
         | 
| 42 42 | 
             
                  expected_trace = [
         | 
| 43 43 | 
             
                    "em",
         | 
| 44 | 
            -
                    "am",
         | 
| 45 44 | 
             
                    "l",
         | 
| 46 45 | 
             
                    "p",
         | 
| 47 46 | 
             
                    "v",
         | 
| 48 | 
            -
                    "aq",
         | 
| 49 | 
            -
                    "eq",
         | 
| 50 | 
            -
                    "Q.c", # notice that the flavor is skipped
         | 
| 51 | 
            -
                    "eql",
         | 
| 52 | 
            -
                  ]
         | 
| 53 | 
            -
                  assert_equal expected_trace, CustomPlatformTracer::TRACE
         | 
| 54 | 
            -
                end
         | 
| 55 | 
            -
              end
         | 
| 56 | 
            -
             | 
| 57 | 
            -
              describe "by default, scalar fields are not traced" do
         | 
| 58 | 
            -
                let(:schema) {
         | 
| 59 | 
            -
                  Dummy::Schema.redefine {
         | 
| 60 | 
            -
                    use(CustomPlatformTracer)
         | 
| 61 | 
            -
                  }
         | 
| 62 | 
            -
                }
         | 
| 63 | 
            -
             | 
| 64 | 
            -
                before do
         | 
| 65 | 
            -
                  CustomPlatformTracer::TRACE.clear
         | 
| 66 | 
            -
                end
         | 
| 67 | 
            -
             | 
| 68 | 
            -
                it "only traces traceTrue, not traceFalse or traceNil" do
         | 
| 69 | 
            -
                  schema.execute(" { tracingScalar { traceNil traceFalse traceTrue } }")
         | 
| 70 | 
            -
                  expected_trace = [
         | 
| 71 | 
            -
                    "em",
         | 
| 72 47 | 
             
                    "am",
         | 
| 73 | 
            -
                    "l",
         | 
| 74 | 
            -
                    "p",
         | 
| 75 | 
            -
                    "v",
         | 
| 76 48 | 
             
                    "aq",
         | 
| 77 49 | 
             
                    "eq",
         | 
| 78 | 
            -
                    "Q. | 
| 79 | 
            -
                    "T.t",
         | 
| 80 | 
            -
                    "eql",
         | 
| 81 | 
            -
                  ]
         | 
| 82 | 
            -
                  assert_equal expected_trace, CustomPlatformTracer::TRACE
         | 
| 83 | 
            -
                end
         | 
| 84 | 
            -
              end
         | 
| 85 | 
            -
             | 
| 86 | 
            -
              describe "when scalar fields are traced by default, they are unless specified" do
         | 
| 87 | 
            -
                let(:schema) {
         | 
| 88 | 
            -
                  Dummy::Schema.redefine {
         | 
| 89 | 
            -
                    use(CustomPlatformTracer, trace_scalars: true)
         | 
| 90 | 
            -
                  }
         | 
| 91 | 
            -
                }
         | 
| 92 | 
            -
             | 
| 93 | 
            -
                before do
         | 
| 94 | 
            -
                  CustomPlatformTracer::TRACE.clear
         | 
| 95 | 
            -
                end
         | 
| 96 | 
            -
             | 
| 97 | 
            -
                it "traces traceTrue and traceNil but not traceFalse" do
         | 
| 98 | 
            -
                  schema.execute(" { tracingScalar { traceNil traceFalse traceTrue } }")
         | 
| 99 | 
            -
                  expected_trace = [
         | 
| 100 | 
            -
                    "em",
         | 
| 101 | 
            -
                    "am",
         | 
| 102 | 
            -
                    "l",
         | 
| 103 | 
            -
                    "p",
         | 
| 104 | 
            -
                    "v",
         | 
| 105 | 
            -
                    "aq",
         | 
| 106 | 
            -
                    "eq",
         | 
| 107 | 
            -
                    "Q.t",
         | 
| 108 | 
            -
                    "T.t",
         | 
| 109 | 
            -
                    "T.t",
         | 
| 50 | 
            +
                    "Q.c", # notice that the flavor is skipped
         | 
| 110 51 | 
             
                    "eql",
         | 
| 111 52 | 
             
                  ]
         | 
| 112 53 | 
             
                  assert_equal expected_trace, CustomPlatformTracer::TRACE
         | 
| @@ -149,15 +149,6 @@ module Dummy | |
| 149 149 | 
             
                field :cheese, CheeseType
         | 
| 150 150 | 
             
              end
         | 
| 151 151 |  | 
| 152 | 
            -
              TracingScalarType = GraphQL::ObjectType.define do
         | 
| 153 | 
            -
                name "TracingScalar"
         | 
| 154 | 
            -
                description "An object which has traced scalars"
         | 
| 155 | 
            -
             | 
| 156 | 
            -
                field :traceNil, types.Int
         | 
| 157 | 
            -
                field :traceFalse, types.Int, trace: false
         | 
| 158 | 
            -
                field :traceTrue, types.Int, trace: true
         | 
| 159 | 
            -
              end
         | 
| 160 | 
            -
             | 
| 161 152 | 
             
              DairyProductUnion = GraphQL::UnionType.define do
         | 
| 162 153 | 
             
                name "DairyProduct"
         | 
| 163 154 | 
             
                description "Kinds of food made from milk"
         | 
| @@ -381,16 +372,6 @@ module Dummy | |
| 381 372 | 
             
                  resolve ->(t, a, c) { OpenStruct.new(cheese: nil) }
         | 
| 382 373 | 
             
                end
         | 
| 383 374 |  | 
| 384 | 
            -
                field :tracingScalar, TracingScalarType do
         | 
| 385 | 
            -
                  resolve ->(o, a, c) do
         | 
| 386 | 
            -
                    OpenStruct.new(
         | 
| 387 | 
            -
                      traceNil: 2,
         | 
| 388 | 
            -
                      traceFalse: 3,
         | 
| 389 | 
            -
                      tracetrue: 5,
         | 
| 390 | 
            -
                    )
         | 
| 391 | 
            -
                  end
         | 
| 392 | 
            -
                end
         | 
| 393 | 
            -
             | 
| 394 375 | 
             
                field :deepNonNull, !DeepNonNullType do
         | 
| 395 376 | 
             
                  resolve ->(o, a, c) { :deepNonNull }
         | 
| 396 377 | 
             
                end
         | 
| @@ -403,26 +384,31 @@ module Dummy | |
| 403 384 | 
             
                input_field :values, !types[!types.Int]
         | 
| 404 385 | 
             
              end
         | 
| 405 386 |  | 
| 406 | 
            -
               | 
| 407 | 
            -
                name  | 
| 387 | 
            +
              PushValueField = GraphQL::Field.define do
         | 
| 388 | 
            +
                name :pushValue
         | 
| 389 | 
            +
                type !types[!types.Int]
         | 
| 390 | 
            +
                description("Push a value onto a global array :D")
         | 
| 391 | 
            +
                argument :value, !types.Int, as: :val
         | 
| 392 | 
            +
                resolve ->(o, args, ctx) {
         | 
| 393 | 
            +
                  GLOBAL_VALUES << args.val
         | 
| 394 | 
            +
                  GLOBAL_VALUES
         | 
| 395 | 
            +
                }
         | 
| 396 | 
            +
              end
         | 
| 397 | 
            +
             | 
| 398 | 
            +
              class DairyAppMutationType < GraphQL::Schema::Object
         | 
| 399 | 
            +
                graphql_name "Mutation"
         | 
| 408 400 | 
             
                description "The root for mutations in this schema"
         | 
| 409 | 
            -
                field  | 
| 410 | 
            -
             | 
| 411 | 
            -
             | 
| 412 | 
            -
             | 
| 413 | 
            -
             | 
| 414 | 
            -
                    GLOBAL_VALUES
         | 
| 415 | 
            -
                  }
         | 
| 401 | 
            +
                # Test the `field:` compatibility option
         | 
| 402 | 
            +
                field :pushValue, field: PushValueField
         | 
| 403 | 
            +
             | 
| 404 | 
            +
                field :replaceValues, [Integer], "Replace the global array with new values", null: false do
         | 
| 405 | 
            +
                  argument :input, ReplaceValuesInputType, required: true
         | 
| 416 406 | 
             
                end
         | 
| 417 407 |  | 
| 418 | 
            -
                 | 
| 419 | 
            -
                   | 
| 420 | 
            -
                   | 
| 421 | 
            -
                   | 
| 422 | 
            -
                    GLOBAL_VALUES.clear
         | 
| 423 | 
            -
                    GLOBAL_VALUES.push(*args.input[:values])
         | 
| 424 | 
            -
                    GLOBAL_VALUES
         | 
| 425 | 
            -
                  }
         | 
| 408 | 
            +
                def replace_values(input:)
         | 
| 409 | 
            +
                  GLOBAL_VALUES.clear
         | 
| 410 | 
            +
                  GLOBAL_VALUES.concat(input["values"])
         | 
| 411 | 
            +
                  GLOBAL_VALUES
         | 
| 426 412 | 
             
                end
         | 
| 427 413 | 
             
              end
         | 
| 428 414 |  | 
| @@ -433,7 +419,7 @@ module Dummy | |
| 433 419 | 
             
                end
         | 
| 434 420 | 
             
              end
         | 
| 435 421 |  | 
| 436 | 
            -
              Schema  | 
| 422 | 
            +
              class Schema < GraphQL::Schema
         | 
| 437 423 | 
             
                query DairyAppQueryType
         | 
| 438 424 | 
             
                mutation DairyAppMutationType
         | 
| 439 425 | 
             
                subscription SubscriptionType
         | 
| @@ -442,8 +428,8 @@ module Dummy | |
| 442 428 |  | 
| 443 429 | 
             
                rescue_from(NoSuchDairyError) { |err| err.message  }
         | 
| 444 430 |  | 
| 445 | 
            -
                resolve_type | 
| 431 | 
            +
                def self.resolve_type(type, obj, ctx)
         | 
| 446 432 | 
             
                  Schema.types[obj.class.name.split("::").last]
         | 
| 447 | 
            -
                 | 
| 433 | 
            +
                end
         | 
| 448 434 | 
             
              end
         | 
| 449 435 | 
             
            end
         |