graphql 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
 - data/lib/graph_ql/directive.rb +9 -5
 - data/lib/graph_ql/directives/include_directive.rb +2 -2
 - data/lib/graph_ql/directives/skip_directive.rb +2 -2
 - data/lib/graph_ql/enum.rb +5 -8
 - data/lib/graph_ql/field.rb +50 -0
 - data/lib/graph_ql/interface.rb +4 -0
 - data/lib/graph_ql/introspection/arguments_field.rb +2 -2
 - data/lib/graph_ql/introspection/directive_type.rb +10 -10
 - data/lib/graph_ql/introspection/enum_value_type.rb +11 -8
 - data/lib/graph_ql/introspection/enum_values_field.rb +5 -5
 - data/lib/graph_ql/introspection/field_type.rb +14 -10
 - data/lib/graph_ql/introspection/fields_field.rb +4 -4
 - data/lib/graph_ql/introspection/input_fields_field.rb +3 -3
 - data/lib/graph_ql/introspection/input_value_type.rb +8 -8
 - data/lib/graph_ql/introspection/interfaces_field.rb +5 -0
 - data/lib/graph_ql/introspection/of_type_field.rb +3 -9
 - data/lib/graph_ql/introspection/possible_types_field.rb +3 -10
 - data/lib/graph_ql/introspection/schema_type.rb +8 -14
 - data/lib/graph_ql/introspection/type_kind_enum.rb +1 -1
 - data/lib/graph_ql/introspection/type_type.rb +17 -19
 - data/lib/graph_ql/introspection/typename_field.rb +15 -0
 - data/lib/graph_ql/parser.rb +9 -0
 - data/lib/graph_ql/parser/nodes.rb +17 -7
 - data/lib/graph_ql/parser/parser.rb +7 -7
 - data/lib/graph_ql/parser/transform.rb +23 -20
 - data/lib/graph_ql/parser/visitor.rb +29 -13
 - data/lib/graph_ql/query.rb +39 -16
 - data/lib/graph_ql/query/field_resolution_strategy.rb +15 -11
 - data/lib/graph_ql/query/type_resolver.rb +4 -2
 - data/lib/graph_ql/repl.rb +1 -1
 - data/lib/graph_ql/schema.rb +19 -7
 - data/lib/graph_ql/schema/each_item_validator.rb +12 -0
 - data/lib/graph_ql/schema/field_validator.rb +13 -0
 - data/lib/graph_ql/schema/implementation_validator.rb +21 -0
 - data/lib/graph_ql/schema/schema_validator.rb +10 -0
 - data/lib/graph_ql/schema/type_reducer.rb +6 -6
 - data/lib/graph_ql/schema/type_validator.rb +47 -0
 - data/lib/graph_ql/static_validation.rb +18 -0
 - data/lib/graph_ql/static_validation/argument_literals_are_compatible.rb +13 -0
 - data/lib/graph_ql/static_validation/arguments_are_defined.rb +10 -0
 - data/lib/graph_ql/static_validation/arguments_validator.rb +16 -0
 - data/lib/graph_ql/static_validation/directives_are_defined.rb +18 -0
 - data/lib/graph_ql/static_validation/fields_are_defined_on_type.rb +29 -0
 - data/lib/graph_ql/static_validation/fields_have_appropriate_selections.rb +31 -0
 - data/lib/graph_ql/static_validation/fields_will_merge.rb +93 -0
 - data/lib/graph_ql/static_validation/fragment_types_exist.rb +24 -0
 - data/lib/graph_ql/static_validation/fragments_are_used.rb +30 -0
 - data/lib/graph_ql/static_validation/literal_validator.rb +27 -0
 - data/lib/graph_ql/static_validation/message.rb +29 -0
 - data/lib/graph_ql/static_validation/required_arguments_are_present.rb +13 -0
 - data/lib/graph_ql/static_validation/type_stack.rb +87 -0
 - data/lib/graph_ql/static_validation/validator.rb +48 -0
 - data/lib/graph_ql/type_kinds.rb +50 -12
 - data/lib/graph_ql/types/argument_definer.rb +7 -0
 - data/lib/graph_ql/types/boolean_type.rb +3 -3
 - data/lib/graph_ql/types/field_definer.rb +19 -0
 - data/lib/graph_ql/types/float_type.rb +3 -3
 - data/lib/graph_ql/types/input_object_type.rb +4 -0
 - data/lib/graph_ql/types/input_value.rb +1 -1
 - data/lib/graph_ql/types/int_type.rb +4 -4
 - data/lib/graph_ql/types/list_type.rb +5 -1
 - data/lib/graph_ql/types/non_null_type.rb +4 -0
 - data/lib/graph_ql/types/object_type.rb +9 -20
 - data/lib/graph_ql/types/scalar_type.rb +4 -0
 - data/lib/graph_ql/types/string_type.rb +3 -3
 - data/lib/graph_ql/types/type_definer.rb +5 -9
 - data/lib/graph_ql/union.rb +6 -17
 - data/lib/graph_ql/version.rb +1 -1
 - data/lib/graphql.rb +58 -78
 - data/readme.md +80 -7
 - data/spec/graph_ql/interface_spec.rb +15 -1
 - data/spec/graph_ql/introspection/directive_type_spec.rb +2 -2
 - data/spec/graph_ql/introspection/schema_type_spec.rb +2 -1
 - data/spec/graph_ql/introspection/type_type_spec.rb +16 -1
 - data/spec/graph_ql/parser/parser_spec.rb +3 -1
 - data/spec/graph_ql/parser/transform_spec.rb +12 -2
 - data/spec/graph_ql/parser/visitor_spec.rb +13 -5
 - data/spec/graph_ql/query_spec.rb +25 -13
 - data/spec/graph_ql/schema/field_validator_spec.rb +21 -0
 - data/spec/graph_ql/schema/type_reducer_spec.rb +2 -2
 - data/spec/graph_ql/schema/type_validator_spec.rb +54 -0
 - data/spec/graph_ql/static_validation/argument_literals_are_compatible_spec.rb +41 -0
 - data/spec/graph_ql/static_validation/arguments_are_defined_spec.rb +40 -0
 - data/spec/graph_ql/static_validation/directives_are_defined_spec.rb +33 -0
 - data/spec/graph_ql/static_validation/fields_are_defined_on_type_spec.rb +59 -0
 - data/spec/graph_ql/static_validation/fields_have_appropriate_selections_spec.rb +30 -0
 - data/spec/graph_ql/{validations → static_validation}/fields_will_merge_spec.rb +24 -17
 - data/spec/graph_ql/static_validation/fragment_types_exist_spec.rb +38 -0
 - data/spec/graph_ql/static_validation/fragments_are_used_spec.rb +24 -0
 - data/spec/graph_ql/static_validation/required_arguments_are_present_spec.rb +41 -0
 - data/spec/graph_ql/static_validation/type_stack_spec.rb +35 -0
 - data/spec/graph_ql/static_validation/validator_spec.rb +28 -0
 - data/spec/graph_ql/types/object_type_spec.rb +1 -1
 - data/spec/graph_ql/union_spec.rb +1 -14
 - data/spec/support/dummy_app.rb +75 -53
 - metadata +53 -31
 - data/lib/graph_ql/fields/abstract_field.rb +0 -37
 - data/lib/graph_ql/fields/access_field.rb +0 -24
 - data/lib/graph_ql/fields/field.rb +0 -34
 - data/lib/graph_ql/types/abstract_type.rb +0 -14
 - data/lib/graph_ql/validations/fields_are_defined_on_type.rb +0 -44
 - data/lib/graph_ql/validations/fields_will_merge.rb +0 -80
 - data/lib/graph_ql/validations/fragments_are_used.rb +0 -24
 - data/lib/graph_ql/validator.rb +0 -29
 - data/spec/graph_ql/validations/fields_are_defined_on_type_spec.rb +0 -28
 - data/spec/graph_ql/validations/fragments_are_used_spec.rb +0 -28
 - data/spec/graph_ql/validator_spec.rb +0 -24
 
| 
         @@ -0,0 +1,38 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require 'spec_helper'
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            describe GraphQL::StaticValidation::FragmentTypesExist do
         
     | 
| 
      
 4 
     | 
    
         
            +
              let(:document) { GraphQL.parse("
         
     | 
| 
      
 5 
     | 
    
         
            +
                query getCheese {
         
     | 
| 
      
 6 
     | 
    
         
            +
                  cheeese(id: 1) {
         
     | 
| 
      
 7 
     | 
    
         
            +
                    ... on Cheese { source }
         
     | 
| 
      
 8 
     | 
    
         
            +
                    ... on Nothing { whatever }
         
     | 
| 
      
 9 
     | 
    
         
            +
                    ... somethingFields
         
     | 
| 
      
 10 
     | 
    
         
            +
                    ... cheeseFields
         
     | 
| 
      
 11 
     | 
    
         
            +
                  }
         
     | 
| 
      
 12 
     | 
    
         
            +
                }
         
     | 
| 
      
 13 
     | 
    
         
            +
             
     | 
| 
      
 14 
     | 
    
         
            +
                fragment somethingFields on Something {
         
     | 
| 
      
 15 
     | 
    
         
            +
                  something
         
     | 
| 
      
 16 
     | 
    
         
            +
                }
         
     | 
| 
      
 17 
     | 
    
         
            +
                fragment cheeseFields on Cheese {
         
     | 
| 
      
 18 
     | 
    
         
            +
                  fatContent
         
     | 
| 
      
 19 
     | 
    
         
            +
                }
         
     | 
| 
      
 20 
     | 
    
         
            +
              ")}
         
     | 
| 
      
 21 
     | 
    
         
            +
             
     | 
| 
      
 22 
     | 
    
         
            +
              let(:validator) { GraphQL::StaticValidation::Validator.new(schema: DummySchema, validators: [GraphQL::StaticValidation::FragmentTypesExist]) }
         
     | 
| 
      
 23 
     | 
    
         
            +
              let(:errors) { validator.validate(document) }
         
     | 
| 
      
 24 
     | 
    
         
            +
             
     | 
| 
      
 25 
     | 
    
         
            +
              it 'finds non-existent types on fragments' do
         
     | 
| 
      
 26 
     | 
    
         
            +
                assert_equal(2, errors.length)
         
     | 
| 
      
 27 
     | 
    
         
            +
                inline_fragment_error =  {
         
     | 
| 
      
 28 
     | 
    
         
            +
                  "message"=>"No such type Something, so it can't be a fragment condition",
         
     | 
| 
      
 29 
     | 
    
         
            +
                  "locations"=>[{"line"=>11, "column"=>5}]
         
     | 
| 
      
 30 
     | 
    
         
            +
                }
         
     | 
| 
      
 31 
     | 
    
         
            +
                assert_includes(errors, inline_fragment_error, "on inline fragments")
         
     | 
| 
      
 32 
     | 
    
         
            +
                fragment_def_error = {
         
     | 
| 
      
 33 
     | 
    
         
            +
                  "message"=>"No such type Nothing, so it can't be a fragment condition",
         
     | 
| 
      
 34 
     | 
    
         
            +
                  "locations"=>[{"line"=>5, "column"=>9}]
         
     | 
| 
      
 35 
     | 
    
         
            +
                }
         
     | 
| 
      
 36 
     | 
    
         
            +
                assert_includes(errors, fragment_def_error, "on fragment definitions")
         
     | 
| 
      
 37 
     | 
    
         
            +
              end
         
     | 
| 
      
 38 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,24 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require 'spec_helper'
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            describe GraphQL::StaticValidation::FragmentsAreUsed do
         
     | 
| 
      
 4 
     | 
    
         
            +
              let(:document) { GraphQL.parse("
         
     | 
| 
      
 5 
     | 
    
         
            +
                query getCheese {
         
     | 
| 
      
 6 
     | 
    
         
            +
                  name,
         
     | 
| 
      
 7 
     | 
    
         
            +
                  ...cheeseFields
         
     | 
| 
      
 8 
     | 
    
         
            +
                  ...undefinedFields
         
     | 
| 
      
 9 
     | 
    
         
            +
                }
         
     | 
| 
      
 10 
     | 
    
         
            +
                fragment cheeseFields on Cheese { fatContent }
         
     | 
| 
      
 11 
     | 
    
         
            +
                fragment unusedFields on Cheese { is, not, used }
         
     | 
| 
      
 12 
     | 
    
         
            +
              ")}
         
     | 
| 
      
 13 
     | 
    
         
            +
             
     | 
| 
      
 14 
     | 
    
         
            +
              let(:validator) { GraphQL::StaticValidation::Validator.new(schema: DummySchema, validators: [GraphQL::StaticValidation::FragmentsAreUsed]) }
         
     | 
| 
      
 15 
     | 
    
         
            +
              let(:errors) { validator.validate(document) }
         
     | 
| 
      
 16 
     | 
    
         
            +
             
     | 
| 
      
 17 
     | 
    
         
            +
              it 'adds errors for unused fragment definitions' do
         
     | 
| 
      
 18 
     | 
    
         
            +
                assert_includes(errors, {"message"=>"Fragment unusedFields was defined, but not used", "locations"=>[{"line"=>8, "column"=>5}]})
         
     | 
| 
      
 19 
     | 
    
         
            +
              end
         
     | 
| 
      
 20 
     | 
    
         
            +
             
     | 
| 
      
 21 
     | 
    
         
            +
              it 'adds errors for undefined fragment spreads' do
         
     | 
| 
      
 22 
     | 
    
         
            +
                assert_includes(errors, {"message"=>"Fragment undefinedFields was used, but not defined", "locations"=>[{"line"=>5, "column"=>7}]})
         
     | 
| 
      
 23 
     | 
    
         
            +
              end
         
     | 
| 
      
 24 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,41 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require 'spec_helper'
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            describe GraphQL::StaticValidation::RequiredArgumentsArePresent do
         
     | 
| 
      
 4 
     | 
    
         
            +
              let(:document) { GraphQL.parse("
         
     | 
| 
      
 5 
     | 
    
         
            +
                query getCheese {
         
     | 
| 
      
 6 
     | 
    
         
            +
                  cheese(id: 1) { source }
         
     | 
| 
      
 7 
     | 
    
         
            +
                  cheese { source }
         
     | 
| 
      
 8 
     | 
    
         
            +
                }
         
     | 
| 
      
 9 
     | 
    
         
            +
             
     | 
| 
      
 10 
     | 
    
         
            +
                fragment cheeseFields on Cheese {
         
     | 
| 
      
 11 
     | 
    
         
            +
                  similarCheeses(id: 1)
         
     | 
| 
      
 12 
     | 
    
         
            +
                  flavor @include(if: true)
         
     | 
| 
      
 13 
     | 
    
         
            +
                  id @skip
         
     | 
| 
      
 14 
     | 
    
         
            +
                }
         
     | 
| 
      
 15 
     | 
    
         
            +
              ")}
         
     | 
| 
      
 16 
     | 
    
         
            +
             
     | 
| 
      
 17 
     | 
    
         
            +
              let(:validator) { GraphQL::StaticValidation::Validator.new(schema: DummySchema, validators: [GraphQL::StaticValidation::RequiredArgumentsArePresent]) }
         
     | 
| 
      
 18 
     | 
    
         
            +
              let(:errors) { validator.validate(document) }
         
     | 
| 
      
 19 
     | 
    
         
            +
             
     | 
| 
      
 20 
     | 
    
         
            +
              it 'finds undefined arguments to fields and directives' do
         
     | 
| 
      
 21 
     | 
    
         
            +
                assert_equal(3, errors.length)
         
     | 
| 
      
 22 
     | 
    
         
            +
             
     | 
| 
      
 23 
     | 
    
         
            +
                query_root_error = {
         
     | 
| 
      
 24 
     | 
    
         
            +
                  "message"=>"Field 'cheese' is missing required arguments: id",
         
     | 
| 
      
 25 
     | 
    
         
            +
                  "locations"=>[{"line"=>4, "column"=>7}]
         
     | 
| 
      
 26 
     | 
    
         
            +
                }
         
     | 
| 
      
 27 
     | 
    
         
            +
                assert_includes(errors, query_root_error)
         
     | 
| 
      
 28 
     | 
    
         
            +
             
     | 
| 
      
 29 
     | 
    
         
            +
                fragment_error = {
         
     | 
| 
      
 30 
     | 
    
         
            +
                  "message"=>"Field 'similarCheeses' is missing required arguments: source",
         
     | 
| 
      
 31 
     | 
    
         
            +
                  "locations"=>[{"line"=>8, "column"=>7}]
         
     | 
| 
      
 32 
     | 
    
         
            +
                }
         
     | 
| 
      
 33 
     | 
    
         
            +
                assert_includes(errors, fragment_error)
         
     | 
| 
      
 34 
     | 
    
         
            +
             
     | 
| 
      
 35 
     | 
    
         
            +
                directive_error = {
         
     | 
| 
      
 36 
     | 
    
         
            +
                  "message"=>"Directive 'skip' is missing required arguments: if",
         
     | 
| 
      
 37 
     | 
    
         
            +
                  "locations"=>[{"line"=>10, "column"=>11}]
         
     | 
| 
      
 38 
     | 
    
         
            +
                }
         
     | 
| 
      
 39 
     | 
    
         
            +
                assert_includes(errors, directive_error)
         
     | 
| 
      
 40 
     | 
    
         
            +
              end
         
     | 
| 
      
 41 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,35 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require 'spec_helper'
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            class TypeCheckValidator
         
     | 
| 
      
 4 
     | 
    
         
            +
              def self.checks
         
     | 
| 
      
 5 
     | 
    
         
            +
                @checks ||= []
         
     | 
| 
      
 6 
     | 
    
         
            +
              end
         
     | 
| 
      
 7 
     | 
    
         
            +
             
     | 
| 
      
 8 
     | 
    
         
            +
              def validate(context)
         
     | 
| 
      
 9 
     | 
    
         
            +
                self.class.checks.clear
         
     | 
| 
      
 10 
     | 
    
         
            +
                context.visitor[GraphQL::Nodes::Field] << -> (node, parent) {
         
     | 
| 
      
 11 
     | 
    
         
            +
                  self.class.checks << context.object_types.map(&:name)
         
     | 
| 
      
 12 
     | 
    
         
            +
                }
         
     | 
| 
      
 13 
     | 
    
         
            +
              end
         
     | 
| 
      
 14 
     | 
    
         
            +
            end
         
     | 
| 
      
 15 
     | 
    
         
            +
             
     | 
| 
      
 16 
     | 
    
         
            +
            describe GraphQL::StaticValidation::TypeStack do
         
     | 
| 
      
 17 
     | 
    
         
            +
              let(:query_string) {%|
         
     | 
| 
      
 18 
     | 
    
         
            +
                query getCheese {
         
     | 
| 
      
 19 
     | 
    
         
            +
                  cheese(id: 1) { id, ... edibleFields }
         
     | 
| 
      
 20 
     | 
    
         
            +
                }
         
     | 
| 
      
 21 
     | 
    
         
            +
                fragment edibleFields on Edible { fatContent }
         
     | 
| 
      
 22 
     | 
    
         
            +
              |}
         
     | 
| 
      
 23 
     | 
    
         
            +
              let(:document) { GraphQL.parse(query_string) }
         
     | 
| 
      
 24 
     | 
    
         
            +
              let(:validator) { GraphQL::StaticValidation::Validator.new(schema: DummySchema, validators: [TypeCheckValidator]) }
         
     | 
| 
      
 25 
     | 
    
         
            +
             
     | 
| 
      
 26 
     | 
    
         
            +
              it 'stores up types' do
         
     | 
| 
      
 27 
     | 
    
         
            +
                validator.validate(document)
         
     | 
| 
      
 28 
     | 
    
         
            +
                expected = [
         
     | 
| 
      
 29 
     | 
    
         
            +
                  ["Query", "Cheese"],
         
     | 
| 
      
 30 
     | 
    
         
            +
                  ["Query", "Cheese", "Non-Null"],
         
     | 
| 
      
 31 
     | 
    
         
            +
                  ["Edible", "Non-Null"]
         
     | 
| 
      
 32 
     | 
    
         
            +
                ]
         
     | 
| 
      
 33 
     | 
    
         
            +
                assert_equal(expected, TypeCheckValidator.checks)
         
     | 
| 
      
 34 
     | 
    
         
            +
              end
         
     | 
| 
      
 35 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,28 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require 'spec_helper'
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            class SchemaErrorValidator
         
     | 
| 
      
 4 
     | 
    
         
            +
              def validate(context)
         
     | 
| 
      
 5 
     | 
    
         
            +
                context.errors << GraphQL::StaticValidation::Message.new("Something is wrong: #{context.schema}", line: 100, col: 4)
         
     | 
| 
      
 6 
     | 
    
         
            +
              end
         
     | 
| 
      
 7 
     | 
    
         
            +
            end
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
      
 9 
     | 
    
         
            +
            class DocumentErrorValidator
         
     | 
| 
      
 10 
     | 
    
         
            +
              include
         
     | 
| 
      
 11 
     | 
    
         
            +
              def validate(context)
         
     | 
| 
      
 12 
     | 
    
         
            +
                context.errors << GraphQL::StaticValidation::Message.new("Something is wrong: #{context.document.name}", line: 1, col: 1)
         
     | 
| 
      
 13 
     | 
    
         
            +
              end
         
     | 
| 
      
 14 
     | 
    
         
            +
            end
         
     | 
| 
      
 15 
     | 
    
         
            +
             
     | 
| 
      
 16 
     | 
    
         
            +
            describe GraphQL::StaticValidation::Validator do
         
     | 
| 
      
 17 
     | 
    
         
            +
              let(:document)  { OpenStruct.new(name: "This is not a document", children: []) }
         
     | 
| 
      
 18 
     | 
    
         
            +
              let(:validator) { GraphQL::StaticValidation::Validator.new(schema: "This is not a schema", validators: [SchemaErrorValidator, DocumentErrorValidator]) }
         
     | 
| 
      
 19 
     | 
    
         
            +
             
     | 
| 
      
 20 
     | 
    
         
            +
              it 'uses validators' do
         
     | 
| 
      
 21 
     | 
    
         
            +
                errors = validator.validate(document)
         
     | 
| 
      
 22 
     | 
    
         
            +
                expected_errors = [
         
     | 
| 
      
 23 
     | 
    
         
            +
                  {"message" => "Something is wrong: This is not a schema", "locations" => [{"line" => 100, "column" => 4}]},
         
     | 
| 
      
 24 
     | 
    
         
            +
                  {"message" => "Something is wrong: This is not a document", "locations" => [{"line" => 1, "column" => 1}]}
         
     | 
| 
      
 25 
     | 
    
         
            +
                ]
         
     | 
| 
      
 26 
     | 
    
         
            +
                assert_equal(expected_errors, errors)
         
     | 
| 
      
 27 
     | 
    
         
            +
              end
         
     | 
| 
      
 28 
     | 
    
         
            +
            end
         
     | 
    
        data/spec/graph_ql/union_spec.rb
    CHANGED
    
    | 
         @@ -3,24 +3,11 @@ require 'spec_helper' 
     | 
|
| 
       3 
3 
     | 
    
         
             
            describe GraphQL::Union do
         
     | 
| 
       4 
4 
     | 
    
         
             
              let(:type_1) { OpenStruct.new(kind: GraphQL::TypeKinds::OBJECT)}
         
     | 
| 
       5 
5 
     | 
    
         
             
              let(:type_2) { OpenStruct.new(kind: GraphQL::TypeKinds::OBJECT)}
         
     | 
| 
       6 
     | 
    
         
            -
              let(:union) { GraphQL::Union.new("MyUnion", [type_1, type_2]) }
         
     | 
| 
      
 6 
     | 
    
         
            +
              let(:union) { GraphQL::Union.new("MyUnion", "Some items", [type_1, type_2]) }
         
     | 
| 
       7 
7 
     | 
    
         
             
              it 'has a name' do
         
     | 
| 
       8 
8 
     | 
    
         
             
                assert_equal("MyUnion", union.name)
         
     | 
| 
       9 
9 
     | 
    
         
             
              end
         
     | 
| 
       10 
10 
     | 
    
         | 
| 
       11 
     | 
    
         
            -
              it 'identifies members' do
         
     | 
| 
       12 
     | 
    
         
            -
                assert(union.include?(type_1))
         
     | 
| 
       13 
     | 
    
         
            -
                assert(!union.include?(:type_3))
         
     | 
| 
       14 
     | 
    
         
            -
              end
         
     | 
| 
       15 
     | 
    
         
            -
             
     | 
| 
       16 
     | 
    
         
            -
              it 'must be 2+ types' do
         
     | 
| 
       17 
     | 
    
         
            -
                assert_raises(ArgumentError) { GraphQL::Union.new("Something", [type_1])}
         
     | 
| 
       18 
     | 
    
         
            -
              end
         
     | 
| 
       19 
     | 
    
         
            -
             
     | 
| 
       20 
     | 
    
         
            -
              it 'must be all object types' do
         
     | 
| 
       21 
     | 
    
         
            -
                assert_raises(ArgumentError) { GraphQL::Union.new("Something", [type_1, type_2, union])}
         
     | 
| 
       22 
     | 
    
         
            -
              end
         
     | 
| 
       23 
     | 
    
         
            -
             
     | 
| 
       24 
11 
     | 
    
         
             
              it 'infers type from an object' do
         
     | 
| 
       25 
12 
     | 
    
         
             
                assert_equal(CheeseType, DairyProductUnion.resolve_type(CHEESES[1]))
         
     | 
| 
       26 
13 
     | 
    
         
             
              end
         
     | 
    
        data/spec/support/dummy_app.rb
    CHANGED
    
    | 
         @@ -1,18 +1,21 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            require_relative './dummy_data'
         
     | 
| 
       2 
2 
     | 
    
         | 
| 
       3 
     | 
    
         
            -
             
     | 
| 
       4 
     | 
    
         
            -
              name "Edible"
         
     | 
| 
       5 
     | 
    
         
            -
              description "Something you can eat, yum"
         
     | 
| 
       6 
     | 
    
         
            -
              fields({
         
     | 
| 
       7 
     | 
    
         
            -
                fatContent: field( 
     | 
| 
      
 3 
     | 
    
         
            +
            EdibleInterface = GraphQL::Interface.new do |i, type, field|
         
     | 
| 
      
 4 
     | 
    
         
            +
              i.name "Edible"
         
     | 
| 
      
 5 
     | 
    
         
            +
              i.description "Something you can eat, yum"
         
     | 
| 
      
 6 
     | 
    
         
            +
              i.fields({
         
     | 
| 
      
 7 
     | 
    
         
            +
                fatContent: field.build(
         
     | 
| 
      
 8 
     | 
    
         
            +
                  type: !type.Float,
         
     | 
| 
      
 9 
     | 
    
         
            +
                  property: :non_existent_field_that_should_never_be_called,
         
     | 
| 
      
 10 
     | 
    
         
            +
                  desc: "Percentage which is fat"),
         
     | 
| 
       8 
11 
     | 
    
         
             
              })
         
     | 
| 
       9 
12 
     | 
    
         
             
            end
         
     | 
| 
       10 
13 
     | 
    
         | 
| 
       11 
     | 
    
         
            -
             
     | 
| 
       12 
     | 
    
         
            -
              name "AnimalProduct"
         
     | 
| 
       13 
     | 
    
         
            -
              description "Comes from an animal, no joke"
         
     | 
| 
       14 
     | 
    
         
            -
              fields({
         
     | 
| 
       15 
     | 
    
         
            -
                source: field(type: !type.String, desc: "Animal which produced this product"),
         
     | 
| 
      
 14 
     | 
    
         
            +
            AnimalProductInterface = GraphQL::Interface.new do |i, type, field|
         
     | 
| 
      
 15 
     | 
    
         
            +
              i.name "AnimalProduct"
         
     | 
| 
      
 16 
     | 
    
         
            +
              i.description "Comes from an animal, no joke"
         
     | 
| 
      
 17 
     | 
    
         
            +
              i.fields({
         
     | 
| 
      
 18 
     | 
    
         
            +
                source: field.build(type: !type.String, desc: "Animal which produced this product"),
         
     | 
| 
       16 
19 
     | 
    
         
             
              })
         
     | 
| 
       17 
20 
     | 
    
         
             
            end
         
     | 
| 
       18 
21 
     | 
    
         | 
| 
         @@ -25,52 +28,64 @@ DairyAnimalEnum = GraphQL::Enum.new do |e| 
     | 
|
| 
       25 
28 
     | 
    
         
             
              e.value("YAK",    "Animal with long hair", deprecation_reason: "Out of fashion")
         
     | 
| 
       26 
29 
     | 
    
         
             
            end
         
     | 
| 
       27 
30 
     | 
    
         | 
| 
       28 
     | 
    
         
            -
            CheeseType = GraphQL::ObjectType.new do
         
     | 
| 
       29 
     | 
    
         
            -
              name "Cheese"
         
     | 
| 
       30 
     | 
    
         
            -
              description "Cultured dairy product"
         
     | 
| 
       31 
     | 
    
         
            -
              interfaces [ 
     | 
| 
       32 
     | 
    
         
            -
               
     | 
| 
       33 
     | 
    
         
            -
                id:           field(type: !type.Int, desc: "Unique identifier"),
         
     | 
| 
       34 
     | 
    
         
            -
                flavor:       field(type: !type.String, desc: "Kind of cheese"),
         
     | 
| 
       35 
     | 
    
         
            -
                source:       field(type: !DairyAnimalEnum, desc: "Animal which produced the milk for this cheese"),
         
     | 
| 
       36 
     | 
    
         
            -
                 
     | 
| 
      
 31 
     | 
    
         
            +
            CheeseType = GraphQL::ObjectType.new do |t, type, field, arg|
         
     | 
| 
      
 32 
     | 
    
         
            +
              t.name "Cheese"
         
     | 
| 
      
 33 
     | 
    
         
            +
              t.description "Cultured dairy product"
         
     | 
| 
      
 34 
     | 
    
         
            +
              t.interfaces [EdibleInterface, AnimalProductInterface]
         
     | 
| 
      
 35 
     | 
    
         
            +
              t.fields = {
         
     | 
| 
      
 36 
     | 
    
         
            +
                id:           field.build(type: !type.Int, desc: "Unique identifier"),
         
     | 
| 
      
 37 
     | 
    
         
            +
                flavor:       field.build(type: !type.String, desc: "Kind of cheese"),
         
     | 
| 
      
 38 
     | 
    
         
            +
                source:       field.build(type: !DairyAnimalEnum, desc: "Animal which produced the milk for this cheese"),
         
     | 
| 
      
 39 
     | 
    
         
            +
                similarCheeses: GraphQL::Field.new do |f|
         
     | 
| 
      
 40 
     | 
    
         
            +
                  f.description "Cheeses like this one"
         
     | 
| 
      
 41 
     | 
    
         
            +
                  f.type(t)
         
     | 
| 
      
 42 
     | 
    
         
            +
                  f.arguments({source: arg.build(type: !type[!DairyAnimalEnum])})
         
     | 
| 
      
 43 
     | 
    
         
            +
                  f.resolve -> (t, a, c) { CHEESES.values.find { |c| c.source == a["source"] } }
         
     | 
| 
      
 44 
     | 
    
         
            +
                end,
         
     | 
| 
      
 45 
     | 
    
         
            +
                fatContent:   field.build(type: !type.Float, desc: "Percentage which is milkfat", deprecation_reason: "Diet fashion has changed"),
         
     | 
| 
       37 
46 
     | 
    
         
             
              }
         
     | 
| 
       38 
47 
     | 
    
         
             
            end
         
     | 
| 
       39 
48 
     | 
    
         | 
| 
       40 
     | 
    
         
            -
            MilkType = GraphQL::ObjectType.new do
         
     | 
| 
       41 
     | 
    
         
            -
              name 'Milk'
         
     | 
| 
       42 
     | 
    
         
            -
              description "Dairy beverage"
         
     | 
| 
       43 
     | 
    
         
            -
              interfaces [ 
     | 
| 
       44 
     | 
    
         
            -
               
     | 
| 
       45 
     | 
    
         
            -
                id:           field(type: !type.Int, desc: "Unique identifier"),
         
     | 
| 
       46 
     | 
    
         
            -
                source:       field(type: DairyAnimalEnum, desc: "Animal which produced this milk"),
         
     | 
| 
       47 
     | 
    
         
            -
                fatContent:   field(type: !type.Float, desc: "Percentage which is milkfat"),
         
     | 
| 
       48 
     | 
    
         
            -
                flavors:      field(
         
     | 
| 
      
 49 
     | 
    
         
            +
             MilkType = GraphQL::ObjectType.new do |t, type, field, arg|
         
     | 
| 
      
 50 
     | 
    
         
            +
              t.name 'Milk'
         
     | 
| 
      
 51 
     | 
    
         
            +
              t.description "Dairy beverage"
         
     | 
| 
      
 52 
     | 
    
         
            +
              t.interfaces [EdibleInterface, AnimalProductInterface]
         
     | 
| 
      
 53 
     | 
    
         
            +
              t.fields = {
         
     | 
| 
      
 54 
     | 
    
         
            +
                id:           field.build(type: !type.Int, desc: "Unique identifier"),
         
     | 
| 
      
 55 
     | 
    
         
            +
                source:       field.build(type: DairyAnimalEnum, desc: "Animal which produced this milk"),
         
     | 
| 
      
 56 
     | 
    
         
            +
                fatContent:   field.build(type: !type.Float, desc: "Percentage which is milkfat"),
         
     | 
| 
      
 57 
     | 
    
         
            +
                flavors:      field.build(
         
     | 
| 
       49 
58 
     | 
    
         
             
                      type: type[type.String],
         
     | 
| 
       50 
59 
     | 
    
         
             
                      desc: "Chocolate, Strawberry, etc",
         
     | 
| 
       51 
     | 
    
         
            -
                      args: {limit: {type: type.Int}}
         
     | 
| 
      
 60 
     | 
    
         
            +
                      args: {limit: arg.build({type: type.Int})}
         
     | 
| 
       52 
61 
     | 
    
         
             
                    ),
         
     | 
| 
       53 
62 
     | 
    
         
             
              }
         
     | 
| 
       54 
63 
     | 
    
         
             
            end
         
     | 
| 
       55 
64 
     | 
    
         | 
| 
       56 
     | 
    
         
            -
            DairyProductUnion = GraphQL::Union.new( 
     | 
| 
       57 
     | 
    
         
            -
             
     | 
| 
       58 
     | 
    
         
            -
             
     | 
| 
       59 
     | 
    
         
            -
               
     | 
| 
       60 
     | 
    
         
            -
             
     | 
| 
       61 
     | 
    
         
            -
             
     | 
| 
       62 
     | 
    
         
            -
             
     | 
| 
       63 
     | 
    
         
            -
             
     | 
| 
      
 65 
     | 
    
         
            +
            DairyProductUnion = GraphQL::Union.new(
         
     | 
| 
      
 66 
     | 
    
         
            +
              "DairyProduct",
         
     | 
| 
      
 67 
     | 
    
         
            +
              "Kinds of food made from milk",
         
     | 
| 
      
 68 
     | 
    
         
            +
              [MilkType, CheeseType]
         
     | 
| 
      
 69 
     | 
    
         
            +
            )
         
     | 
| 
      
 70 
     | 
    
         
            +
             
     | 
| 
      
 71 
     | 
    
         
            +
            DairyProductInputType = GraphQL::InputObjectType.new {|t, type, field, arg|
         
     | 
| 
      
 72 
     | 
    
         
            +
              t.name "DairyProductInput"
         
     | 
| 
      
 73 
     | 
    
         
            +
              t.description "Properties for finding a dairy product"
         
     | 
| 
      
 74 
     | 
    
         
            +
              t.input_fields({
         
     | 
| 
      
 75 
     | 
    
         
            +
                source:     arg.build({type: DairyAnimalEnum}),
         
     | 
| 
      
 76 
     | 
    
         
            +
                fatContent: arg.build({type: type.Float}),
         
     | 
| 
       64 
77 
     | 
    
         
             
              })
         
     | 
| 
       65 
78 
     | 
    
         
             
            }
         
     | 
| 
       66 
79 
     | 
    
         | 
| 
       67 
80 
     | 
    
         | 
| 
       68 
     | 
    
         
            -
            class FetchField 
     | 
| 
       69 
     | 
    
         
            -
              attr_reader :type
         
     | 
| 
      
 81 
     | 
    
         
            +
            class FetchField
         
     | 
| 
      
 82 
     | 
    
         
            +
              attr_reader :type, :arguments, :deprecation_reason
         
     | 
| 
       70 
83 
     | 
    
         
             
              attr_accessor :name
         
     | 
| 
       71 
84 
     | 
    
         
             
              def initialize(type:, data:)
         
     | 
| 
       72 
85 
     | 
    
         
             
                @type = type
         
     | 
| 
       73 
86 
     | 
    
         
             
                @data = data
         
     | 
| 
      
 87 
     | 
    
         
            +
                @arguments = {"id" => GraphQL::InputValue.new(type: !GraphQL::INT_TYPE, name: "id")}
         
     | 
| 
      
 88 
     | 
    
         
            +
                @deprecation_reason = nil
         
     | 
| 
       74 
89 
     | 
    
         
             
              end
         
     | 
| 
       75 
90 
     | 
    
         | 
| 
       76 
91 
     | 
    
         
             
              def description
         
     | 
| 
         @@ -82,9 +97,10 @@ class FetchField < GraphQL::AbstractField 
     | 
|
| 
       82 
97 
     | 
    
         
             
              end
         
     | 
| 
       83 
98 
     | 
    
         
             
            end
         
     | 
| 
       84 
99 
     | 
    
         | 
| 
       85 
     | 
    
         
            -
            SourceField = GraphQL::Field.new do |f|
         
     | 
| 
      
 100 
     | 
    
         
            +
            SourceField = GraphQL::Field.new do |f, type, field, arg|
         
     | 
| 
       86 
101 
     | 
    
         
             
              f.type GraphQL::ListType.new(of_type: CheeseType)
         
     | 
| 
       87 
102 
     | 
    
         
             
              f.description "Cheese from source"
         
     | 
| 
      
 103 
     | 
    
         
            +
              f.arguments(source: arg.build(type: !DairyAnimalEnum))
         
     | 
| 
       88 
104 
     | 
    
         
             
              f.resolve -> (target, arguments, context) {
         
     | 
| 
       89 
105 
     | 
    
         
             
                CHEESES.values.select{ |c| c.source == arguments["source"] }
         
     | 
| 
       90 
106 
     | 
    
         
             
              }
         
     | 
| 
         @@ -92,23 +108,23 @@ end 
     | 
|
| 
       92 
108 
     | 
    
         | 
| 
       93 
109 
     | 
    
         
             
            FavoriteField = GraphQL::Field.new do |f|
         
     | 
| 
       94 
110 
     | 
    
         
             
              f.description "My favorite food"
         
     | 
| 
       95 
     | 
    
         
            -
              f.type  
     | 
| 
      
 111 
     | 
    
         
            +
              f.type EdibleInterface
         
     | 
| 
       96 
112 
     | 
    
         
             
              f.resolve -> (t, a, c) { MILKS[1] }
         
     | 
| 
       97 
113 
     | 
    
         
             
            end
         
     | 
| 
       98 
114 
     | 
    
         | 
| 
       99 
115 
     | 
    
         | 
| 
       100 
     | 
    
         
            -
            QueryType = GraphQL::ObjectType.new do
         
     | 
| 
       101 
     | 
    
         
            -
              name "Query"
         
     | 
| 
       102 
     | 
    
         
            -
              description "Query root of the system"
         
     | 
| 
       103 
     | 
    
         
            -
              fields({
         
     | 
| 
      
 116 
     | 
    
         
            +
            QueryType = GraphQL::ObjectType.new do |t, types, field, arg|
         
     | 
| 
      
 117 
     | 
    
         
            +
              t.name "Query"
         
     | 
| 
      
 118 
     | 
    
         
            +
              t.description "Query root of the system"
         
     | 
| 
      
 119 
     | 
    
         
            +
              t.fields({
         
     | 
| 
       104 
120 
     | 
    
         
             
                cheese: FetchField.new(type: CheeseType, data: CHEESES),
         
     | 
| 
       105 
121 
     | 
    
         
             
                fromSource: SourceField,
         
     | 
| 
       106 
122 
     | 
    
         
             
                favoriteEdible: FavoriteField,
         
     | 
| 
       107 
123 
     | 
    
         
             
                searchDairy: GraphQL::Field.new { |f|
         
     | 
| 
       108 
124 
     | 
    
         
             
                  f.name "searchDairy"
         
     | 
| 
       109 
125 
     | 
    
         
             
                  f.description "Find dairy products matching a description"
         
     | 
| 
       110 
     | 
    
         
            -
                  f.type DairyProductUnion
         
     | 
| 
       111 
     | 
    
         
            -
                  f.arguments({product: {type: DairyProductInputType}})
         
     | 
| 
      
 126 
     | 
    
         
            +
                  f.type !DairyProductUnion
         
     | 
| 
      
 127 
     | 
    
         
            +
                  f.arguments({product: arg.build({type: DairyProductInputType})})
         
     | 
| 
       112 
128 
     | 
    
         
             
                  f.resolve -> (t, a, c) {
         
     | 
| 
       113 
129 
     | 
    
         
             
                    products = CHEESES.values + MILKS.values
         
     | 
| 
       114 
130 
     | 
    
         
             
                    source =  a["product"]["source"]
         
     | 
| 
         @@ -117,20 +133,25 @@ QueryType = GraphQL::ObjectType.new do 
     | 
|
| 
       117 
133 
     | 
    
         
             
                    end
         
     | 
| 
       118 
134 
     | 
    
         
             
                    products.first
         
     | 
| 
       119 
135 
     | 
    
         
             
                  }
         
     | 
| 
       120 
     | 
    
         
            -
                }
         
     | 
| 
      
 136 
     | 
    
         
            +
                },
         
     | 
| 
      
 137 
     | 
    
         
            +
                error: GraphQL::Field.new { |f|
         
     | 
| 
      
 138 
     | 
    
         
            +
                  f.description "Raise an error"
         
     | 
| 
      
 139 
     | 
    
         
            +
                  f.type GraphQL::STRING_TYPE
         
     | 
| 
      
 140 
     | 
    
         
            +
                  f.resolve -> (t, a, c) { raise("This error was raised on purpose") }
         
     | 
| 
      
 141 
     | 
    
         
            +
                },
         
     | 
| 
       121 
142 
     | 
    
         
             
              })
         
     | 
| 
       122 
143 
     | 
    
         
             
            end
         
     | 
| 
       123 
144 
     | 
    
         | 
| 
       124 
145 
     | 
    
         
             
            GLOBAL_VALUES = []
         
     | 
| 
       125 
146 
     | 
    
         | 
| 
       126 
     | 
    
         
            -
            MutationType = GraphQL::ObjectType.new do
         
     | 
| 
       127 
     | 
    
         
            -
              name "Mutation"
         
     | 
| 
       128 
     | 
    
         
            -
              description "The root for mutations in this schema"
         
     | 
| 
       129 
     | 
    
         
            -
              fields({
         
     | 
| 
      
 147 
     | 
    
         
            +
            MutationType = GraphQL::ObjectType.new do |t, type, field, arg|
         
     | 
| 
      
 148 
     | 
    
         
            +
              t.name "Mutation"
         
     | 
| 
      
 149 
     | 
    
         
            +
              t.description "The root for mutations in this schema"
         
     | 
| 
      
 150 
     | 
    
         
            +
              t.fields({
         
     | 
| 
       130 
151 
     | 
    
         
             
                pushValue: GraphQL::Field.new { |f|
         
     | 
| 
       131 
152 
     | 
    
         
             
                  f.description("Push a value onto a global array :D")
         
     | 
| 
       132 
153 
     | 
    
         
             
                  f.type(!type[!type.Int])
         
     | 
| 
       133 
     | 
    
         
            -
                  f.arguments(value: arg(type: !type.Int))
         
     | 
| 
      
 154 
     | 
    
         
            +
                  f.arguments(value: arg.build(type: !type.Int))
         
     | 
| 
       134 
155 
     | 
    
         
             
                  f.resolve -> (o, args, ctx) {
         
     | 
| 
       135 
156 
     | 
    
         
             
                    GLOBAL_VALUES << args["value"]
         
     | 
| 
       136 
157 
     | 
    
         
             
                    GLOBAL_VALUES
         
     | 
| 
         @@ -138,4 +159,5 @@ MutationType = GraphQL::ObjectType.new do 
     | 
|
| 
       138 
159 
     | 
    
         
             
                }
         
     | 
| 
       139 
160 
     | 
    
         
             
              })
         
     | 
| 
       140 
161 
     | 
    
         
             
            end
         
     | 
| 
      
 162 
     | 
    
         
            +
             
     | 
| 
       141 
163 
     | 
    
         
             
            DummySchema = GraphQL::Schema.new(query: QueryType, mutation: MutationType)
         
     | 
    
        metadata
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            --- !ruby/object:Gem::Specification
         
     | 
| 
       2 
2 
     | 
    
         
             
            name: graphql
         
     | 
| 
       3 
3 
     | 
    
         
             
            version: !ruby/object:Gem::Version
         
     | 
| 
       4 
     | 
    
         
            -
              version: 0. 
     | 
| 
      
 4 
     | 
    
         
            +
              version: 0.2.0
         
     | 
| 
       5 
5 
     | 
    
         
             
            platform: ruby
         
     | 
| 
       6 
6 
     | 
    
         
             
            authors:
         
     | 
| 
       7 
7 
     | 
    
         
             
            - Robert Mosolgo
         
     | 
| 
         @@ -10,20 +10,6 @@ bindir: bin 
     | 
|
| 
       10 
10 
     | 
    
         
             
            cert_chain: []
         
     | 
| 
       11 
11 
     | 
    
         
             
            date: 2015-03-06 00:00:00.000000000 Z
         
     | 
| 
       12 
12 
     | 
    
         
             
            dependencies:
         
     | 
| 
       13 
     | 
    
         
            -
            - !ruby/object:Gem::Dependency
         
     | 
| 
       14 
     | 
    
         
            -
              name: activesupport
         
     | 
| 
       15 
     | 
    
         
            -
              requirement: !ruby/object:Gem::Requirement
         
     | 
| 
       16 
     | 
    
         
            -
                requirements:
         
     | 
| 
       17 
     | 
    
         
            -
                - - "~>"
         
     | 
| 
       18 
     | 
    
         
            -
                  - !ruby/object:Gem::Version
         
     | 
| 
       19 
     | 
    
         
            -
                    version: '4'
         
     | 
| 
       20 
     | 
    
         
            -
              type: :runtime
         
     | 
| 
       21 
     | 
    
         
            -
              prerelease: false
         
     | 
| 
       22 
     | 
    
         
            -
              version_requirements: !ruby/object:Gem::Requirement
         
     | 
| 
       23 
     | 
    
         
            -
                requirements:
         
     | 
| 
       24 
     | 
    
         
            -
                - - "~>"
         
     | 
| 
       25 
     | 
    
         
            -
                  - !ruby/object:Gem::Version
         
     | 
| 
       26 
     | 
    
         
            -
                    version: '4'
         
     | 
| 
       27 
13 
     | 
    
         
             
            - !ruby/object:Gem::Dependency
         
     | 
| 
       28 
14 
     | 
    
         
             
              name: parslet
         
     | 
| 
       29 
15 
     | 
    
         
             
              requirement: !ruby/object:Gem::Requirement
         
     | 
| 
         @@ -177,9 +163,7 @@ files: 
     | 
|
| 
       177 
163 
     | 
    
         
             
            - lib/graph_ql/directives/include_directive.rb
         
     | 
| 
       178 
164 
     | 
    
         
             
            - lib/graph_ql/directives/skip_directive.rb
         
     | 
| 
       179 
165 
     | 
    
         
             
            - lib/graph_ql/enum.rb
         
     | 
| 
       180 
     | 
    
         
            -
            - lib/graph_ql/ 
     | 
| 
       181 
     | 
    
         
            -
            - lib/graph_ql/fields/access_field.rb
         
     | 
| 
       182 
     | 
    
         
            -
            - lib/graph_ql/fields/field.rb
         
     | 
| 
      
 166 
     | 
    
         
            +
            - lib/graph_ql/field.rb
         
     | 
| 
       183 
167 
     | 
    
         
             
            - lib/graph_ql/interface.rb
         
     | 
| 
       184 
168 
     | 
    
         
             
            - lib/graph_ql/introspection/arguments_field.rb
         
     | 
| 
       185 
169 
     | 
    
         
             
            - lib/graph_ql/introspection/directive_type.rb
         
     | 
| 
         @@ -189,11 +173,14 @@ files: 
     | 
|
| 
       189 
173 
     | 
    
         
             
            - lib/graph_ql/introspection/fields_field.rb
         
     | 
| 
       190 
174 
     | 
    
         
             
            - lib/graph_ql/introspection/input_fields_field.rb
         
     | 
| 
       191 
175 
     | 
    
         
             
            - lib/graph_ql/introspection/input_value_type.rb
         
     | 
| 
      
 176 
     | 
    
         
            +
            - lib/graph_ql/introspection/interfaces_field.rb
         
     | 
| 
       192 
177 
     | 
    
         
             
            - lib/graph_ql/introspection/of_type_field.rb
         
     | 
| 
       193 
178 
     | 
    
         
             
            - lib/graph_ql/introspection/possible_types_field.rb
         
     | 
| 
       194 
179 
     | 
    
         
             
            - lib/graph_ql/introspection/schema_type.rb
         
     | 
| 
       195 
180 
     | 
    
         
             
            - lib/graph_ql/introspection/type_kind_enum.rb
         
     | 
| 
       196 
181 
     | 
    
         
             
            - lib/graph_ql/introspection/type_type.rb
         
     | 
| 
      
 182 
     | 
    
         
            +
            - lib/graph_ql/introspection/typename_field.rb
         
     | 
| 
      
 183 
     | 
    
         
            +
            - lib/graph_ql/parser.rb
         
     | 
| 
       197 
184 
     | 
    
         
             
            - lib/graph_ql/parser/nodes.rb
         
     | 
| 
       198 
185 
     | 
    
         
             
            - lib/graph_ql/parser/parser.rb
         
     | 
| 
       199 
186 
     | 
    
         
             
            - lib/graph_ql/parser/transform.rb
         
     | 
| 
         @@ -208,10 +195,31 @@ files: 
     | 
|
| 
       208 
195 
     | 
    
         
             
            - lib/graph_ql/query/type_resolver.rb
         
     | 
| 
       209 
196 
     | 
    
         
             
            - lib/graph_ql/repl.rb
         
     | 
| 
       210 
197 
     | 
    
         
             
            - lib/graph_ql/schema.rb
         
     | 
| 
      
 198 
     | 
    
         
            +
            - lib/graph_ql/schema/each_item_validator.rb
         
     | 
| 
      
 199 
     | 
    
         
            +
            - lib/graph_ql/schema/field_validator.rb
         
     | 
| 
      
 200 
     | 
    
         
            +
            - lib/graph_ql/schema/implementation_validator.rb
         
     | 
| 
      
 201 
     | 
    
         
            +
            - lib/graph_ql/schema/schema_validator.rb
         
     | 
| 
       211 
202 
     | 
    
         
             
            - lib/graph_ql/schema/type_reducer.rb
         
     | 
| 
      
 203 
     | 
    
         
            +
            - lib/graph_ql/schema/type_validator.rb
         
     | 
| 
      
 204 
     | 
    
         
            +
            - lib/graph_ql/static_validation.rb
         
     | 
| 
      
 205 
     | 
    
         
            +
            - lib/graph_ql/static_validation/argument_literals_are_compatible.rb
         
     | 
| 
      
 206 
     | 
    
         
            +
            - lib/graph_ql/static_validation/arguments_are_defined.rb
         
     | 
| 
      
 207 
     | 
    
         
            +
            - lib/graph_ql/static_validation/arguments_validator.rb
         
     | 
| 
      
 208 
     | 
    
         
            +
            - lib/graph_ql/static_validation/directives_are_defined.rb
         
     | 
| 
      
 209 
     | 
    
         
            +
            - lib/graph_ql/static_validation/fields_are_defined_on_type.rb
         
     | 
| 
      
 210 
     | 
    
         
            +
            - lib/graph_ql/static_validation/fields_have_appropriate_selections.rb
         
     | 
| 
      
 211 
     | 
    
         
            +
            - lib/graph_ql/static_validation/fields_will_merge.rb
         
     | 
| 
      
 212 
     | 
    
         
            +
            - lib/graph_ql/static_validation/fragment_types_exist.rb
         
     | 
| 
      
 213 
     | 
    
         
            +
            - lib/graph_ql/static_validation/fragments_are_used.rb
         
     | 
| 
      
 214 
     | 
    
         
            +
            - lib/graph_ql/static_validation/literal_validator.rb
         
     | 
| 
      
 215 
     | 
    
         
            +
            - lib/graph_ql/static_validation/message.rb
         
     | 
| 
      
 216 
     | 
    
         
            +
            - lib/graph_ql/static_validation/required_arguments_are_present.rb
         
     | 
| 
      
 217 
     | 
    
         
            +
            - lib/graph_ql/static_validation/type_stack.rb
         
     | 
| 
      
 218 
     | 
    
         
            +
            - lib/graph_ql/static_validation/validator.rb
         
     | 
| 
       212 
219 
     | 
    
         
             
            - lib/graph_ql/type_kinds.rb
         
     | 
| 
       213 
     | 
    
         
            -
            - lib/graph_ql/types/ 
     | 
| 
      
 220 
     | 
    
         
            +
            - lib/graph_ql/types/argument_definer.rb
         
     | 
| 
       214 
221 
     | 
    
         
             
            - lib/graph_ql/types/boolean_type.rb
         
     | 
| 
      
 222 
     | 
    
         
            +
            - lib/graph_ql/types/field_definer.rb
         
     | 
| 
       215 
223 
     | 
    
         
             
            - lib/graph_ql/types/float_type.rb
         
     | 
| 
       216 
224 
     | 
    
         
             
            - lib/graph_ql/types/input_object_type.rb
         
     | 
| 
       217 
225 
     | 
    
         
             
            - lib/graph_ql/types/input_value.rb
         
     | 
| 
         @@ -224,10 +232,6 @@ files: 
     | 
|
| 
       224 
232 
     | 
    
         
             
            - lib/graph_ql/types/string_type.rb
         
     | 
| 
       225 
233 
     | 
    
         
             
            - lib/graph_ql/types/type_definer.rb
         
     | 
| 
       226 
234 
     | 
    
         
             
            - lib/graph_ql/union.rb
         
     | 
| 
       227 
     | 
    
         
            -
            - lib/graph_ql/validations/fields_are_defined_on_type.rb
         
     | 
| 
       228 
     | 
    
         
            -
            - lib/graph_ql/validations/fields_will_merge.rb
         
     | 
| 
       229 
     | 
    
         
            -
            - lib/graph_ql/validations/fragments_are_used.rb
         
     | 
| 
       230 
     | 
    
         
            -
            - lib/graph_ql/validator.rb
         
     | 
| 
       231 
235 
     | 
    
         
             
            - lib/graph_ql/version.rb
         
     | 
| 
       232 
236 
     | 
    
         
             
            - lib/graphql.rb
         
     | 
| 
       233 
237 
     | 
    
         
             
            - readme.md
         
     | 
| 
         @@ -243,14 +247,23 @@ files: 
     | 
|
| 
       243 
247 
     | 
    
         
             
            - spec/graph_ql/parser/visitor_spec.rb
         
     | 
| 
       244 
248 
     | 
    
         
             
            - spec/graph_ql/query/operation_resolver_spec.rb
         
     | 
| 
       245 
249 
     | 
    
         
             
            - spec/graph_ql/query_spec.rb
         
     | 
| 
      
 250 
     | 
    
         
            +
            - spec/graph_ql/schema/field_validator_spec.rb
         
     | 
| 
       246 
251 
     | 
    
         
             
            - spec/graph_ql/schema/type_reducer_spec.rb
         
     | 
| 
      
 252 
     | 
    
         
            +
            - spec/graph_ql/schema/type_validator_spec.rb
         
     | 
| 
      
 253 
     | 
    
         
            +
            - spec/graph_ql/static_validation/argument_literals_are_compatible_spec.rb
         
     | 
| 
      
 254 
     | 
    
         
            +
            - spec/graph_ql/static_validation/arguments_are_defined_spec.rb
         
     | 
| 
      
 255 
     | 
    
         
            +
            - spec/graph_ql/static_validation/directives_are_defined_spec.rb
         
     | 
| 
      
 256 
     | 
    
         
            +
            - spec/graph_ql/static_validation/fields_are_defined_on_type_spec.rb
         
     | 
| 
      
 257 
     | 
    
         
            +
            - spec/graph_ql/static_validation/fields_have_appropriate_selections_spec.rb
         
     | 
| 
      
 258 
     | 
    
         
            +
            - spec/graph_ql/static_validation/fields_will_merge_spec.rb
         
     | 
| 
      
 259 
     | 
    
         
            +
            - spec/graph_ql/static_validation/fragment_types_exist_spec.rb
         
     | 
| 
      
 260 
     | 
    
         
            +
            - spec/graph_ql/static_validation/fragments_are_used_spec.rb
         
     | 
| 
      
 261 
     | 
    
         
            +
            - spec/graph_ql/static_validation/required_arguments_are_present_spec.rb
         
     | 
| 
      
 262 
     | 
    
         
            +
            - spec/graph_ql/static_validation/type_stack_spec.rb
         
     | 
| 
      
 263 
     | 
    
         
            +
            - spec/graph_ql/static_validation/validator_spec.rb
         
     | 
| 
       247 
264 
     | 
    
         
             
            - spec/graph_ql/types/input_object_type_spec.rb
         
     | 
| 
       248 
265 
     | 
    
         
             
            - spec/graph_ql/types/object_type_spec.rb
         
     | 
| 
       249 
266 
     | 
    
         
             
            - spec/graph_ql/union_spec.rb
         
     | 
| 
       250 
     | 
    
         
            -
            - spec/graph_ql/validations/fields_are_defined_on_type_spec.rb
         
     | 
| 
       251 
     | 
    
         
            -
            - spec/graph_ql/validations/fields_will_merge_spec.rb
         
     | 
| 
       252 
     | 
    
         
            -
            - spec/graph_ql/validations/fragments_are_used_spec.rb
         
     | 
| 
       253 
     | 
    
         
            -
            - spec/graph_ql/validator_spec.rb
         
     | 
| 
       254 
267 
     | 
    
         
             
            - spec/spec_helper.rb
         
     | 
| 
       255 
268 
     | 
    
         
             
            - spec/support/dummy_app.rb
         
     | 
| 
       256 
269 
     | 
    
         
             
            - spec/support/dummy_data.rb
         
     | 
| 
         @@ -291,14 +304,23 @@ test_files: 
     | 
|
| 
       291 
304 
     | 
    
         
             
            - spec/graph_ql/parser/visitor_spec.rb
         
     | 
| 
       292 
305 
     | 
    
         
             
            - spec/graph_ql/query/operation_resolver_spec.rb
         
     | 
| 
       293 
306 
     | 
    
         
             
            - spec/graph_ql/query_spec.rb
         
     | 
| 
      
 307 
     | 
    
         
            +
            - spec/graph_ql/schema/field_validator_spec.rb
         
     | 
| 
       294 
308 
     | 
    
         
             
            - spec/graph_ql/schema/type_reducer_spec.rb
         
     | 
| 
      
 309 
     | 
    
         
            +
            - spec/graph_ql/schema/type_validator_spec.rb
         
     | 
| 
      
 310 
     | 
    
         
            +
            - spec/graph_ql/static_validation/argument_literals_are_compatible_spec.rb
         
     | 
| 
      
 311 
     | 
    
         
            +
            - spec/graph_ql/static_validation/arguments_are_defined_spec.rb
         
     | 
| 
      
 312 
     | 
    
         
            +
            - spec/graph_ql/static_validation/directives_are_defined_spec.rb
         
     | 
| 
      
 313 
     | 
    
         
            +
            - spec/graph_ql/static_validation/fields_are_defined_on_type_spec.rb
         
     | 
| 
      
 314 
     | 
    
         
            +
            - spec/graph_ql/static_validation/fields_have_appropriate_selections_spec.rb
         
     | 
| 
      
 315 
     | 
    
         
            +
            - spec/graph_ql/static_validation/fields_will_merge_spec.rb
         
     | 
| 
      
 316 
     | 
    
         
            +
            - spec/graph_ql/static_validation/fragment_types_exist_spec.rb
         
     | 
| 
      
 317 
     | 
    
         
            +
            - spec/graph_ql/static_validation/fragments_are_used_spec.rb
         
     | 
| 
      
 318 
     | 
    
         
            +
            - spec/graph_ql/static_validation/required_arguments_are_present_spec.rb
         
     | 
| 
      
 319 
     | 
    
         
            +
            - spec/graph_ql/static_validation/type_stack_spec.rb
         
     | 
| 
      
 320 
     | 
    
         
            +
            - spec/graph_ql/static_validation/validator_spec.rb
         
     | 
| 
       295 
321 
     | 
    
         
             
            - spec/graph_ql/types/input_object_type_spec.rb
         
     | 
| 
       296 
322 
     | 
    
         
             
            - spec/graph_ql/types/object_type_spec.rb
         
     | 
| 
       297 
323 
     | 
    
         
             
            - spec/graph_ql/union_spec.rb
         
     | 
| 
       298 
     | 
    
         
            -
            - spec/graph_ql/validations/fields_are_defined_on_type_spec.rb
         
     | 
| 
       299 
     | 
    
         
            -
            - spec/graph_ql/validations/fields_will_merge_spec.rb
         
     | 
| 
       300 
     | 
    
         
            -
            - spec/graph_ql/validations/fragments_are_used_spec.rb
         
     | 
| 
       301 
     | 
    
         
            -
            - spec/graph_ql/validator_spec.rb
         
     | 
| 
       302 
324 
     | 
    
         
             
            - spec/spec_helper.rb
         
     | 
| 
       303 
325 
     | 
    
         
             
            - spec/support/dummy_app.rb
         
     | 
| 
       304 
326 
     | 
    
         
             
            - spec/support/dummy_data.rb
         
     |