graphql 1.7.13 → 1.7.14

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.
Files changed (35) hide show
  1. checksums.yaml +4 -4
  2. data/lib/graphql/argument.rb +1 -0
  3. data/lib/graphql/base_type.rb +7 -0
  4. data/lib/graphql/compatibility/query_parser_specification.rb +110 -0
  5. data/lib/graphql/directive.rb +1 -0
  6. data/lib/graphql/enum_type.rb +2 -0
  7. data/lib/graphql/execution/multiplex.rb +1 -1
  8. data/lib/graphql/field.rb +2 -0
  9. data/lib/graphql/language/document_from_schema_definition.rb +1 -1
  10. data/lib/graphql/language/lexer.rb +65 -51
  11. data/lib/graphql/language/lexer.rl +2 -0
  12. data/lib/graphql/language/nodes.rb +118 -71
  13. data/lib/graphql/language/parser.rb +701 -654
  14. data/lib/graphql/language/parser.y +14 -8
  15. data/lib/graphql/language/printer.rb +2 -2
  16. data/lib/graphql/object_type.rb +0 -5
  17. data/lib/graphql/relay/relation_connection.rb +1 -1
  18. data/lib/graphql/schema.rb +1 -0
  19. data/lib/graphql/schema/build_from_definition.rb +60 -18
  20. data/lib/graphql/subscriptions/action_cable_subscriptions.rb +1 -1
  21. data/lib/graphql/unresolved_type_error.rb +3 -2
  22. data/lib/graphql/version.rb +1 -1
  23. data/spec/graphql/base_type_spec.rb +22 -0
  24. data/spec/graphql/enum_type_spec.rb +18 -5
  25. data/spec/graphql/execution/multiplex_spec.rb +1 -1
  26. data/spec/graphql/input_object_type_spec.rb +13 -0
  27. data/spec/graphql/language/nodes_spec.rb +0 -12
  28. data/spec/graphql/language/printer_spec.rb +1 -1
  29. data/spec/graphql/query/serial_execution/value_resolution_spec.rb +2 -2
  30. data/spec/graphql/query_spec.rb +26 -0
  31. data/spec/graphql/relay/relation_connection_spec.rb +7 -1
  32. data/spec/graphql/schema/build_from_definition_spec.rb +59 -0
  33. data/spec/graphql/schema/printer_spec.rb +34 -0
  34. data/spec/graphql/static_validation/rules/fields_will_merge_spec.rb +2 -2
  35. metadata +2 -2
@@ -253,6 +253,32 @@ describe GraphQL::Query do
253
253
  assert_equal [nil], Instrumenter::ERROR_LOG
254
254
  end
255
255
  end
256
+
257
+ describe "when an error propagated through execution" do
258
+ module ExtensionsInstrumenter
259
+ LOG = []
260
+ def self.before_query(q); end;
261
+
262
+ def self.after_query(q)
263
+ q.result["extensions"] = { "a" => 1 }
264
+ LOG << :ok
265
+ end
266
+ end
267
+
268
+ let(:schema) {
269
+ Dummy::Schema.redefine {
270
+ instrument(:query, ExtensionsInstrumenter)
271
+ }
272
+ }
273
+
274
+ it "can add to extensions" do
275
+ ExtensionsInstrumenter::LOG.clear
276
+ assert_raises(RuntimeError) do
277
+ schema.execute "{ error }"
278
+ end
279
+ assert_equal [:ok], ExtensionsInstrumenter::LOG
280
+ end
281
+ end
256
282
  end
257
283
 
258
284
  it "uses root_value as the object for the root type" do
@@ -117,6 +117,13 @@ describe GraphQL::Relay::RelationConnection do
117
117
  assert_equal true, get_page_info(result)["hasNextPage"]
118
118
  assert_equal true, get_page_info(result)["hasPreviousPage"]
119
119
 
120
+ last_cursor = get_last_cursor(result)
121
+ result = with_bidirectional_pagination {
122
+ star_wars_query(query_string, "last" => 1, "before" => last_cursor)
123
+ }
124
+ assert_equal true, get_page_info(result)["hasNextPage"]
125
+ assert_equal false, get_page_info(result)["hasPreviousPage"]
126
+
120
127
  result = star_wars_query(query_string, "first" => 100)
121
128
  last_cursor = get_last_cursor(result)
122
129
 
@@ -129,7 +136,6 @@ describe GraphQL::Relay::RelationConnection do
129
136
  }
130
137
  assert_equal true, get_page_info(result)["hasNextPage"]
131
138
  assert_equal true, get_page_info(result)["hasPreviousPage"]
132
-
133
139
  end
134
140
 
135
141
  it 'slices the result' do
@@ -612,6 +612,65 @@ type Query {
612
612
 
613
613
  build_schema_and_compare_output(schema.chop)
614
614
  end
615
+
616
+ it "tracks original AST node" do
617
+ schema_definition = <<-GRAPHQL
618
+ schema {
619
+ query: Query
620
+ }
621
+
622
+ enum Enum {
623
+ VALUE
624
+ }
625
+
626
+ type Query {
627
+ field(argument: String): String
628
+ deprecatedField(argument: String): String @deprecated(reason: "Test")
629
+ }
630
+
631
+ interface Interface {
632
+ field(argument: String): String
633
+ }
634
+
635
+ union Union = Query
636
+
637
+ scalar Scalar
638
+
639
+ input Input {
640
+ argument: String
641
+ }
642
+
643
+ directive @Directive (
644
+ # Argument
645
+ argument: String
646
+ ) on SCHEMA
647
+
648
+ type Type implements Interface {
649
+ field(argument: String): String
650
+ }
651
+ GRAPHQL
652
+
653
+ schema = GraphQL::Schema.from_definition(schema_definition)
654
+
655
+ assert_equal [1, 1], schema.ast_node.position
656
+ assert_equal [5, 1], schema.types["Enum"].ast_node.position
657
+ assert_equal [6, 3], schema.types["Enum"].values["VALUE"].ast_node.position
658
+ assert_equal [9, 1], schema.types["Query"].ast_node.position
659
+ assert_equal [10, 3], schema.types["Query"].fields["field"].ast_node.position
660
+ assert_equal [10, 9], schema.types["Query"].fields["field"].arguments["argument"].ast_node.position
661
+ assert_equal [11, 45], schema.types["Query"].fields["deprecatedField"].ast_node.directives[0].position
662
+ assert_equal [11, 57], schema.types["Query"].fields["deprecatedField"].ast_node.directives[0].arguments[0].position
663
+ assert_equal [14, 1], schema.types["Interface"].ast_node.position
664
+ assert_equal [15, 3], schema.types["Interface"].fields["field"].ast_node.position
665
+ assert_equal [15, 9], schema.types["Interface"].fields["field"].arguments["argument"].ast_node.position
666
+ assert_equal [18, 1], schema.types["Union"].ast_node.position
667
+ assert_equal [20, 1], schema.types["Scalar"].ast_node.position
668
+ assert_equal [22, 1], schema.types["Input"].ast_node.position
669
+ assert_equal [22, 1], schema.types["Input"].arguments["argument"].ast_node.position
670
+ assert_equal [26, 1], schema.directives["Directive"].ast_node.position
671
+ assert_equal [28, 3], schema.directives["Directive"].arguments["argument"].ast_node.position
672
+ assert_equal [31, 22], schema.types["Type"].ast_node.interfaces[0].position
673
+ end
615
674
  end
616
675
 
617
676
  describe 'Failures' do
@@ -610,6 +610,40 @@ type Post {
610
610
  SCHEMA
611
611
  assert_equal expected.chomp, GraphQL::Schema::Printer.new(schema).print_type(schema.types['Post'])
612
612
  end
613
+
614
+ it "can print arguments that use non-standard Ruby objects as default values" do
615
+ backing_object = Struct.new(:value)
616
+
617
+ scalar_type = GraphQL::ScalarType.define do
618
+ name "SomeType"
619
+ coerce_input ->(value, ctx) { backing_object.new(value) }
620
+ coerce_result ->(obj, ctx) { obj.value }
621
+ end
622
+
623
+ query_root = GraphQL::ObjectType.define do
624
+ name "Query"
625
+ description "The query root of this schema"
626
+
627
+ field :example do
628
+ type scalar_type
629
+ argument :input, scalar_type, default_value: backing_object.new("Howdy")
630
+ resolve ->(obj, args, ctx) { args[:input] }
631
+ end
632
+ end
633
+
634
+ schema = GraphQL::Schema.define do
635
+ query query_root
636
+ end
637
+
638
+ expected = <<SCHEMA
639
+ # The query root of this schema
640
+ type Query {
641
+ example(input: SomeType = "Howdy"): SomeType
642
+ }
643
+ SCHEMA
644
+
645
+ assert_equal expected.chomp, GraphQL::Schema::Printer.new(schema).print_type(query_root)
646
+ end
613
647
  end
614
648
 
615
649
  describe "#print_directive" do
@@ -515,7 +515,7 @@ describe GraphQL::StaticValidation::FieldsWillMerge do
515
515
  scalar: String!
516
516
  }
517
517
 
518
- type NonNullStringBox1Impl implements SomeBox, NonNullStringBox1 {
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, NonNullStringBox2 {
528
+ type NonNullStringBox2Impl implements SomeBox & NonNullStringBox2 {
529
529
  scalar: String!
530
530
  unrelatedField: String
531
531
  deepBox: SomeBox
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: graphql
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.7.13
4
+ version: 1.7.14
5
5
  platform: ruby
6
6
  authors:
7
7
  - Robert Mosolgo
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-02-28 00:00:00.000000000 Z
11
+ date: 2018-04-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: benchmark-ips