graphql 1.7.7 → 1.7.8

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/enum_type.rb +1 -1
  3. data/lib/graphql/field.rb +10 -1
  4. data/lib/graphql/input_object_type.rb +3 -1
  5. data/lib/graphql/introspection/arguments_field.rb +1 -0
  6. data/lib/graphql/introspection/enum_values_field.rb +1 -0
  7. data/lib/graphql/introspection/fields_field.rb +1 -0
  8. data/lib/graphql/introspection/input_fields_field.rb +1 -0
  9. data/lib/graphql/introspection/interfaces_field.rb +1 -0
  10. data/lib/graphql/introspection/of_type_field.rb +1 -0
  11. data/lib/graphql/introspection/possible_types_field.rb +1 -0
  12. data/lib/graphql/introspection/schema_field.rb +1 -0
  13. data/lib/graphql/introspection/type_by_name_field.rb +1 -0
  14. data/lib/graphql/introspection/typename_field.rb +1 -0
  15. data/lib/graphql/language.rb +1 -0
  16. data/lib/graphql/language/document_from_schema_definition.rb +129 -37
  17. data/lib/graphql/language/generation.rb +3 -182
  18. data/lib/graphql/language/nodes.rb +12 -2
  19. data/lib/graphql/language/parser.rb +63 -55
  20. data/lib/graphql/language/parser.y +2 -1
  21. data/lib/graphql/language/printer.rb +351 -0
  22. data/lib/graphql/object_type.rb +1 -1
  23. data/lib/graphql/query/arguments.rb +27 -9
  24. data/lib/graphql/query/literal_input.rb +4 -1
  25. data/lib/graphql/schema/printer.rb +33 -266
  26. data/lib/graphql/tracing/scout_tracing.rb +2 -2
  27. data/lib/graphql/version.rb +1 -1
  28. data/spec/graphql/language/document_from_schema_definition_spec.rb +729 -296
  29. data/spec/graphql/language/generation_spec.rb +21 -186
  30. data/spec/graphql/language/nodes_spec.rb +21 -0
  31. data/spec/graphql/language/printer_spec.rb +203 -0
  32. data/spec/graphql/query/arguments_spec.rb +33 -11
  33. data/spec/graphql/schema/build_from_definition_spec.rb +13 -4
  34. data/spec/graphql/schema/printer_spec.rb +14 -14
  35. metadata +5 -2
@@ -2,200 +2,35 @@
2
2
  require "spec_helper"
3
3
 
4
4
  describe GraphQL::Language::Generation do
5
- let(:document) { GraphQL::Language::Parser.parse(query_string) }
6
- let(:query_string) {%|
7
- query getStuff($someVar: Int = 1, $anotherVar: [String!], $skipNested: Boolean! = false) @skip(if: false) {
8
- myField: someField(someArg: $someVar, ok: 1.4) @skip(if: $anotherVar) @thing(or: "Whatever")
9
- anotherField(someArg: [1, 2, 3]) {
10
- nestedField
11
- ...moreNestedFields @skip(if: $skipNested)
12
- }
13
- ... on OtherType @include(unless: false) {
14
- field(arg: [{key: "value", anotherKey: 0.9, anotherAnotherKey: WHATEVER}])
15
- anotherField
16
- }
17
- ... {
18
- id
19
- }
5
+ describe "#to_query_tring" do
6
+ let(:document) {
7
+ GraphQL.parse('type Query { a: String! }')
20
8
  }
21
9
 
22
- fragment moreNestedFields on NestedType @or(something: "ok") {
23
- anotherNestedField
24
- }
25
- |}
26
-
27
- describe ".generate" do
28
- it "generates query string" do
29
- assert_equal query_string.gsub(/^ /, "").strip, document.to_query_string
30
- end
31
-
32
- describe "inputs" do
33
- let(:query_string) {%|
34
- query {
35
- field(null_value: null, null_in_array: [1, null, 3], int: 3, float: 4.7e-24, bool: false, string: "☀︎🏆\\n escaped \\" unicode ¶ /", enum: ENUM_NAME, array: [7, 8, 9], object: {a: [1, 2, 3], b: {c: "4"}}, unicode_bom: "\xef\xbb\xbfquery")
36
- }
37
- |}
38
-
39
- it "generate" do
40
- assert_equal query_string.gsub(/^ /, "").strip, document.to_query_string
10
+ class CustomPrinter < GraphQL::Language::Printer
11
+ def print_field_definition(print_field_definition)
12
+ "<Field Hidden>"
41
13
  end
42
14
  end
43
15
 
44
- describe "schema" do
45
- describe "schema with convention names for root types" do
46
- let(:query_string) {<<-schema
47
- schema {
48
- query: Query
49
- mutation: Mutation
50
- subscription: Subscription
51
- }
52
- schema
53
- }
54
-
55
- it 'omits schema definition' do
56
- refute document.to_query_string =~ /schema/
57
- end
58
- end
59
-
60
- describe "schema with custom query root name" do
61
- let(:query_string) {<<-schema
62
- schema {
63
- query: MyQuery
64
- mutation: Mutation
65
- subscription: Subscription
66
- }
67
- schema
68
- }
69
-
70
- it 'includes schema definition' do
71
- assert_equal query_string.gsub(/^ /, "").strip, document.to_query_string
72
- end
73
- end
74
-
75
- describe "schema with custom mutation root name" do
76
- let(:query_string) {<<-schema
77
- schema {
78
- query: Query
79
- mutation: MyMutation
80
- subscription: Subscription
81
- }
82
- schema
83
- }
84
-
85
- it 'includes schema definition' do
86
- assert_equal query_string.gsub(/^ /, "").strip, document.to_query_string
87
- end
88
- end
89
-
90
- describe "schema with custom subscription root name" do
91
- let(:query_string) {<<-schema
92
- schema {
93
- query: Query
94
- mutation: Mutation
95
- subscription: MySubscription
96
- }
97
- schema
98
- }
99
-
100
- it 'includes schema definition' do
101
- assert_equal query_string.gsub(/^ /, "").strip, document.to_query_string
102
- end
103
- end
104
-
105
- describe "full featured schema" do
106
- # From: https://github.com/graphql/graphql-js/blob/bc96406ab44453a120da25a0bd6e2b0237119ddf/src/language/__tests__/schema-kitchen-sink.graphql
107
- let(:query_string) {<<-schema
108
- schema {
109
- query: QueryType
110
- mutation: MutationType
111
- }
112
-
113
- # Union description
114
- union AnnotatedUnion @onUnion = A | B
115
-
116
- type Foo implements Bar {
117
- one: Type
118
- two(argument: InputType!): Type
119
- three(argument: InputType, other: String): Int
120
- four(argument: String = "string"): String
121
- five(argument: [String] = ["string", "string"]): String
122
- six(argument: InputType = {key: "value"}): Type
123
- seven(argument: String = null): Type
124
- }
16
+ it "accepts a custom printer" do
17
+ expected = <<-SCHEMA
18
+ type Query {
19
+ a: String!
20
+ }
21
+ SCHEMA
125
22
 
126
- # Scalar description
127
- scalar CustomScalar
128
-
129
- type AnnotatedObject @onObject(arg: "value") {
130
- annotatedField(arg: Type = "default" @onArg): Type @onField
131
- }
132
-
133
- interface Bar {
134
- one: Type
135
- four(argument: String = "string"): String
136
- }
137
-
138
- # Enum description
139
- enum Site {
140
- # Enum value description
141
- DESKTOP
142
- MOBILE
143
- }
144
-
145
- interface AnnotatedInterface @onInterface {
146
- annotatedField(arg: Type @onArg): Type @onField
147
- }
148
-
149
- union Feed = Story | Article | Advert
150
-
151
- # Input description
152
- input InputType {
153
- key: String!
154
- answer: Int = 42
155
- }
156
-
157
- union AnnotatedUnion @onUnion = A | B
158
-
159
- scalar CustomScalar
160
-
161
- # Directive description
162
- directive @skip(if: Boolean!) on FIELD | FRAGMENT_SPREAD | INLINE_FRAGMENT
163
-
164
- scalar AnnotatedScalar @onScalar
165
-
166
- enum Site {
167
- DESKTOP
168
- MOBILE
169
- }
170
-
171
- enum AnnotatedEnum @onEnum {
172
- ANNOTATED_VALUE @onEnumValue
173
- OTHER_VALUE
174
- }
175
-
176
- input InputType {
177
- key: String!
178
- answer: Int = 42
179
- }
180
-
181
- input AnnotatedInput @onInputObjectType {
182
- annotatedField: Type @onField
183
- }
184
-
185
- directive @skip(if: Boolean!) on FIELD | FRAGMENT_SPREAD | INLINE_FRAGMENT
186
-
187
- directive @include(if: Boolean!) on FIELD | FRAGMENT_SPREAD | INLINE_FRAGMENT
188
- schema
189
- }
23
+ assert_equal expected.chomp, GraphQL::Language::Generation.generate(document)
24
+ end
190
25
 
191
- it "generate" do
192
- assert_equal query_string.gsub(/^ /, "").strip, document.to_query_string
193
- end
26
+ it "accepts a custom printer" do
27
+ expected = <<-SCHEMA
28
+ type Query {
29
+ <Field Hidden>
30
+ }
31
+ SCHEMA
194
32
 
195
- it "doesn't mutate the document" do
196
- assert_equal document.to_query_string, document.to_query_string
197
- end
198
- end
33
+ assert_equal expected.chomp, GraphQL::Language::Generation.generate(document, printer: CustomPrinter.new)
199
34
  end
200
35
  end
201
36
  end
@@ -33,4 +33,25 @@ describe GraphQL::Language::Nodes::AbstractNode do
33
33
  assert_nil doc.filename
34
34
  end
35
35
  end
36
+
37
+ describe "#to_query_tring" do
38
+ let(:document) {
39
+ GraphQL.parse('type Query { a: String! }')
40
+ }
41
+
42
+ class CustomPrinter < GraphQL::Language::Printer
43
+ def print_field_definition(print_field_definition)
44
+ "<Field Hidden>"
45
+ end
46
+ end
47
+
48
+ it "accepts a custom printer" do
49
+ expected = <<-SCHEMA
50
+ type Query {
51
+ <Field Hidden>
52
+ }
53
+ SCHEMA
54
+ assert_equal expected.chomp, document.to_query_string(printer: CustomPrinter.new)
55
+ end
56
+ end
36
57
  end
@@ -0,0 +1,203 @@
1
+ # frozen_string_literal: true
2
+ require "spec_helper"
3
+
4
+ describe GraphQL::Language::Printer do
5
+ let(:document) { GraphQL::Language::Parser.parse(query_string) }
6
+ let(:query_string) {%|
7
+ query getStuff($someVar: Int = 1, $anotherVar: [String!], $skipNested: Boolean! = false) @skip(if: false) {
8
+ myField: someField(someArg: $someVar, ok: 1.4) @skip(if: $anotherVar) @thing(or: "Whatever")
9
+ anotherField(someArg: [1, 2, 3]) {
10
+ nestedField
11
+ ...moreNestedFields @skip(if: $skipNested)
12
+ }
13
+ ... on OtherType @include(unless: false) {
14
+ field(arg: [{key: "value", anotherKey: 0.9, anotherAnotherKey: WHATEVER}])
15
+ anotherField
16
+ }
17
+ ... {
18
+ id
19
+ }
20
+ }
21
+
22
+ fragment moreNestedFields on NestedType @or(something: "ok") {
23
+ anotherNestedField
24
+ }
25
+ |}
26
+
27
+ let(:printer) { GraphQL::Language::Printer.new }
28
+
29
+ describe "#print" do
30
+ it "prints the query string" do
31
+ assert_equal query_string.gsub(/^ /, "").strip, printer.print(document)
32
+ end
33
+
34
+ describe "inputs" do
35
+ let(:query_string) {%|
36
+ query {
37
+ field(null_value: null, null_in_array: [1, null, 3], int: 3, float: 4.7e-24, bool: false, string: "☀︎🏆\\n escaped \\" unicode ¶ /", enum: ENUM_NAME, array: [7, 8, 9], object: {a: [1, 2, 3], b: {c: "4"}}, unicode_bom: "\xef\xbb\xbfquery")
38
+ }
39
+ |}
40
+
41
+ it "prints the query string" do
42
+ assert_equal query_string.gsub(/^ /, "").strip, printer.print(document)
43
+ end
44
+ end
45
+
46
+ describe "schema" do
47
+ describe "schema with convention names for root types" do
48
+ let(:query_string) {<<-schema
49
+ schema {
50
+ query: Query
51
+ mutation: Mutation
52
+ subscription: Subscription
53
+ }
54
+ schema
55
+ }
56
+
57
+ it 'omits schema definition' do
58
+ refute printer.print(document) =~ /schema/
59
+ end
60
+ end
61
+
62
+ describe "schema with custom query root name" do
63
+ let(:query_string) {<<-schema
64
+ schema {
65
+ query: MyQuery
66
+ mutation: Mutation
67
+ subscription: Subscription
68
+ }
69
+ schema
70
+ }
71
+
72
+ it 'includes schema definition' do
73
+ assert_equal query_string.gsub(/^ /, "").strip, printer.print(document)
74
+ end
75
+ end
76
+
77
+ describe "schema with custom mutation root name" do
78
+ let(:query_string) {<<-schema
79
+ schema {
80
+ query: Query
81
+ mutation: MyMutation
82
+ subscription: Subscription
83
+ }
84
+ schema
85
+ }
86
+
87
+ it 'includes schema definition' do
88
+ assert_equal query_string.gsub(/^ /, "").strip, printer.print(document)
89
+ end
90
+ end
91
+
92
+ describe "schema with custom subscription root name" do
93
+ let(:query_string) {<<-schema
94
+ schema {
95
+ query: Query
96
+ mutation: Mutation
97
+ subscription: MySubscription
98
+ }
99
+ schema
100
+ }
101
+
102
+ it 'includes schema definition' do
103
+ assert_equal query_string.gsub(/^ /, "").strip, printer.print(document)
104
+ end
105
+ end
106
+
107
+ describe "full featured schema" do
108
+ # From: https://github.com/graphql/graphql-js/blob/bc96406ab44453a120da25a0bd6e2b0237119ddf/src/language/__tests__/schema-kitchen-sink.graphql
109
+ let(:query_string) {<<-schema
110
+ schema {
111
+ query: QueryType
112
+ mutation: MutationType
113
+ }
114
+
115
+ # Union description
116
+ union AnnotatedUnion @onUnion = A | B
117
+
118
+ type Foo implements Bar {
119
+ one: Type
120
+ two(argument: InputType!): Type
121
+ three(argument: InputType, other: String): Int
122
+ four(argument: String = "string"): String
123
+ five(argument: [String] = ["string", "string"]): String
124
+ six(argument: InputType = {key: "value"}): Type
125
+ seven(argument: String = null): Type
126
+ }
127
+
128
+ # Scalar description
129
+ scalar CustomScalar
130
+
131
+ type AnnotatedObject @onObject(arg: "value") {
132
+ annotatedField(arg: Type = "default" @onArg): Type @onField
133
+ }
134
+
135
+ interface Bar {
136
+ one: Type
137
+ four(argument: String = "string"): String
138
+ }
139
+
140
+ # Enum description
141
+ enum Site {
142
+ # Enum value description
143
+ DESKTOP
144
+ MOBILE
145
+ }
146
+
147
+ interface AnnotatedInterface @onInterface {
148
+ annotatedField(arg: Type @onArg): Type @onField
149
+ }
150
+
151
+ union Feed = Story | Article | Advert
152
+
153
+ # Input description
154
+ input InputType {
155
+ key: String!
156
+ answer: Int = 42
157
+ }
158
+
159
+ union AnnotatedUnion @onUnion = A | B
160
+
161
+ scalar CustomScalar
162
+
163
+ # Directive description
164
+ directive @skip(if: Boolean!) on FIELD | FRAGMENT_SPREAD | INLINE_FRAGMENT
165
+
166
+ scalar AnnotatedScalar @onScalar
167
+
168
+ enum Site {
169
+ DESKTOP
170
+ MOBILE
171
+ }
172
+
173
+ enum AnnotatedEnum @onEnum {
174
+ ANNOTATED_VALUE @onEnumValue
175
+ OTHER_VALUE
176
+ }
177
+
178
+ input InputType {
179
+ key: String!
180
+ answer: Int = 42
181
+ }
182
+
183
+ input AnnotatedInput @onInputObjectType {
184
+ annotatedField: Type @onField
185
+ }
186
+
187
+ directive @skip(if: Boolean!) on FIELD | FRAGMENT_SPREAD | INLINE_FRAGMENT
188
+
189
+ directive @include(if: Boolean!) on FIELD | FRAGMENT_SPREAD | INLINE_FRAGMENT
190
+ schema
191
+ }
192
+
193
+ it "generate" do
194
+ assert_equal query_string.gsub(/^ /, "").strip, printer.print(document)
195
+ end
196
+
197
+ it "doesn't mutate the document" do
198
+ assert_equal printer.print(document), printer.print(document)
199
+ end
200
+ end
201
+ end
202
+ end
203
+ end