graphql 1.7.14 → 1.8.0.pre1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (149) hide show
  1. checksums.yaml +5 -5
  2. data/lib/generators/graphql/function_generator.rb +1 -1
  3. data/lib/generators/graphql/loader_generator.rb +1 -1
  4. data/lib/generators/graphql/mutation_generator.rb +1 -6
  5. data/lib/generators/graphql/templates/function.erb +2 -2
  6. data/lib/generators/graphql/templates/loader.erb +2 -2
  7. data/lib/graphql.rb +2 -0
  8. data/lib/graphql/argument.rb +0 -1
  9. data/lib/graphql/backwards_compatibility.rb +2 -3
  10. data/lib/graphql/base_type.rb +18 -16
  11. data/lib/graphql/compatibility/query_parser_specification.rb +0 -117
  12. data/lib/graphql/compatibility/query_parser_specification/parse_error_specification.rb +0 -14
  13. data/lib/graphql/define/assign_object_field.rb +5 -12
  14. data/lib/graphql/deprecated_dsl.rb +28 -0
  15. data/lib/graphql/directive.rb +0 -1
  16. data/lib/graphql/enum_type.rb +1 -3
  17. data/lib/graphql/execution.rb +0 -1
  18. data/lib/graphql/execution/multiplex.rb +29 -12
  19. data/lib/graphql/field.rb +5 -20
  20. data/lib/graphql/function.rb +12 -0
  21. data/lib/graphql/input_object_type.rb +1 -3
  22. data/lib/graphql/internal_representation/node.rb +14 -26
  23. data/lib/graphql/internal_representation/visit.rb +6 -3
  24. data/lib/graphql/introspection/arguments_field.rb +0 -1
  25. data/lib/graphql/introspection/enum_values_field.rb +0 -1
  26. data/lib/graphql/introspection/fields_field.rb +0 -1
  27. data/lib/graphql/introspection/input_fields_field.rb +0 -1
  28. data/lib/graphql/introspection/interfaces_field.rb +0 -1
  29. data/lib/graphql/introspection/of_type_field.rb +0 -1
  30. data/lib/graphql/introspection/possible_types_field.rb +0 -1
  31. data/lib/graphql/introspection/schema_field.rb +0 -1
  32. data/lib/graphql/introspection/type_by_name_field.rb +0 -1
  33. data/lib/graphql/introspection/typename_field.rb +0 -1
  34. data/lib/graphql/language.rb +0 -3
  35. data/lib/graphql/language/generation.rb +182 -3
  36. data/lib/graphql/language/lexer.rb +69 -144
  37. data/lib/graphql/language/lexer.rl +4 -15
  38. data/lib/graphql/language/nodes.rb +76 -136
  39. data/lib/graphql/language/parser.rb +621 -668
  40. data/lib/graphql/language/parser.y +11 -17
  41. data/lib/graphql/language/token.rb +3 -10
  42. data/lib/graphql/object_type.rb +6 -1
  43. data/lib/graphql/query.rb +13 -8
  44. data/lib/graphql/query/arguments.rb +33 -48
  45. data/lib/graphql/query/context.rb +1 -0
  46. data/lib/graphql/query/literal_input.rb +1 -4
  47. data/lib/graphql/relay/connection_resolve.rb +3 -0
  48. data/lib/graphql/relay/global_id_resolve.rb +5 -1
  49. data/lib/graphql/relay/relation_connection.rb +19 -14
  50. data/lib/graphql/schema.rb +219 -12
  51. data/lib/graphql/schema/argument.rb +33 -0
  52. data/lib/graphql/schema/build_from_definition.rb +18 -64
  53. data/lib/graphql/schema/enum.rb +76 -0
  54. data/lib/graphql/schema/field.rb +127 -0
  55. data/lib/graphql/schema/field/dynamic_resolve.rb +63 -0
  56. data/lib/graphql/schema/field/unwrapped_resolve.rb +20 -0
  57. data/lib/graphql/schema/input_object.rb +61 -0
  58. data/lib/graphql/schema/interface.rb +32 -0
  59. data/lib/graphql/schema/loader.rb +2 -2
  60. data/lib/graphql/schema/member.rb +97 -0
  61. data/lib/graphql/schema/member/build_type.rb +106 -0
  62. data/lib/graphql/schema/member/has_fields.rb +56 -0
  63. data/lib/graphql/schema/member/instrumentation.rb +113 -0
  64. data/lib/graphql/schema/member/list_type_proxy.rb +21 -0
  65. data/lib/graphql/schema/member/non_null_type_proxy.rb +21 -0
  66. data/lib/graphql/schema/object.rb +65 -0
  67. data/lib/graphql/schema/printer.rb +266 -33
  68. data/lib/graphql/schema/scalar.rb +25 -0
  69. data/lib/graphql/schema/traversal.rb +26 -17
  70. data/lib/graphql/schema/union.rb +48 -0
  71. data/lib/graphql/static_validation/rules/fields_have_appropriate_selections.rb +1 -5
  72. data/lib/graphql/static_validation/rules/fields_will_merge.rb +8 -15
  73. data/lib/graphql/static_validation/rules/variables_are_used_and_defined.rb +1 -11
  74. data/lib/graphql/subscriptions/action_cable_subscriptions.rb +5 -7
  75. data/lib/graphql/tracing.rb +0 -1
  76. data/lib/graphql/tracing/platform_tracing.rb +7 -20
  77. data/lib/graphql/tracing/scout_tracing.rb +2 -2
  78. data/lib/graphql/unresolved_type_error.rb +2 -3
  79. data/lib/graphql/version.rb +1 -1
  80. data/readme.md +1 -1
  81. data/spec/dummy/app/channels/graphql_channel.rb +1 -22
  82. data/spec/dummy/log/development.log +0 -239
  83. data/spec/dummy/log/test.log +0 -204
  84. data/spec/dummy/test/system/action_cable_subscription_test.rb +0 -4
  85. data/spec/dummy/tmp/screenshots/failures_test_it_handles_subscriptions.png +0 -0
  86. data/spec/generators/graphql/function_generator_spec.rb +0 -26
  87. data/spec/generators/graphql/loader_generator_spec.rb +0 -24
  88. data/spec/graphql/analysis/max_query_complexity_spec.rb +3 -3
  89. data/spec/graphql/analysis/max_query_depth_spec.rb +3 -3
  90. data/spec/graphql/backtrace_spec.rb +0 -10
  91. data/spec/graphql/base_type_spec.rb +5 -19
  92. data/spec/graphql/boolean_type_spec.rb +3 -3
  93. data/spec/graphql/directive_spec.rb +1 -3
  94. data/spec/graphql/enum_type_spec.rb +5 -18
  95. data/spec/graphql/execution/execute_spec.rb +1 -1
  96. data/spec/graphql/execution/multiplex_spec.rb +2 -2
  97. data/spec/graphql/float_type_spec.rb +2 -2
  98. data/spec/graphql/id_type_spec.rb +1 -1
  99. data/spec/graphql/input_object_type_spec.rb +2 -15
  100. data/spec/graphql/int_type_spec.rb +2 -2
  101. data/spec/graphql/internal_representation/rewrite_spec.rb +2 -2
  102. data/spec/graphql/introspection/schema_type_spec.rb +0 -1
  103. data/spec/graphql/language/generation_spec.rb +186 -21
  104. data/spec/graphql/language/lexer_spec.rb +1 -21
  105. data/spec/graphql/language/nodes_spec.rb +12 -21
  106. data/spec/graphql/language/parser_spec.rb +1 -1
  107. data/spec/graphql/query/arguments_spec.rb +15 -37
  108. data/spec/graphql/query/serial_execution/value_resolution_spec.rb +2 -2
  109. data/spec/graphql/query/variables_spec.rb +1 -1
  110. data/spec/graphql/query_spec.rb +5 -31
  111. data/spec/graphql/rake_task_spec.rb +1 -3
  112. data/spec/graphql/relay/base_connection_spec.rb +1 -1
  113. data/spec/graphql/relay/connection_instrumentation_spec.rb +2 -2
  114. data/spec/graphql/relay/connection_resolve_spec.rb +1 -1
  115. data/spec/graphql/relay/connection_type_spec.rb +1 -1
  116. data/spec/graphql/relay/mutation_spec.rb +3 -3
  117. data/spec/graphql/relay/relation_connection_spec.rb +1 -65
  118. data/spec/graphql/schema/build_from_definition_spec.rb +4 -86
  119. data/spec/graphql/schema/enum_spec.rb +60 -0
  120. data/spec/graphql/schema/field_spec.rb +14 -0
  121. data/spec/graphql/schema/input_object_spec.rb +43 -0
  122. data/spec/graphql/schema/interface_spec.rb +98 -0
  123. data/spec/graphql/schema/object_spec.rb +119 -0
  124. data/spec/graphql/schema/printer_spec.rb +15 -92
  125. data/spec/graphql/schema/scalar_spec.rb +40 -0
  126. data/spec/graphql/schema/union_spec.rb +35 -0
  127. data/spec/graphql/schema/validation_spec.rb +1 -1
  128. data/spec/graphql/schema/warden_spec.rb +11 -11
  129. data/spec/graphql/schema_spec.rb +25 -23
  130. data/spec/graphql/static_validation/rules/fields_have_appropriate_selections_spec.rb +2 -10
  131. data/spec/graphql/static_validation/rules/fields_will_merge_spec.rb +2 -2
  132. data/spec/graphql/string_type_spec.rb +3 -3
  133. data/spec/graphql/subscriptions_spec.rb +1 -1
  134. data/spec/graphql/tracing/platform_tracing_spec.rb +1 -60
  135. data/spec/support/dummy/schema.rb +25 -39
  136. data/spec/support/jazz.rb +334 -0
  137. data/spec/support/lazy_helpers.rb +21 -23
  138. data/spec/support/star_wars/data.rb +7 -6
  139. data/spec/support/star_wars/schema.rb +109 -142
  140. metadata +39 -33
  141. data/lib/graphql/execution/instrumentation.rb +0 -82
  142. data/lib/graphql/language/block_string.rb +0 -47
  143. data/lib/graphql/language/document_from_schema_definition.rb +0 -277
  144. data/lib/graphql/language/printer.rb +0 -351
  145. data/lib/graphql/tracing/data_dog_tracing.rb +0 -49
  146. data/spec/graphql/execution/instrumentation_spec.rb +0 -165
  147. data/spec/graphql/language/block_string_spec.rb +0 -70
  148. data/spec/graphql/language/document_from_schema_definition_spec.rb +0 -770
  149. data/spec/graphql/language/printer_spec.rb +0 -203
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+ require "spec_helper"
3
+
4
+ describe GraphQL::Schema::Field do
5
+ describe "graphql definition" do
6
+ let(:object_class) { Jazz::Query }
7
+ let(:field) { object_class.fields.find { |f| f.name == "find" } }
8
+
9
+ it "uses the argument class" do
10
+ arg_defn = field.graphql_definition.arguments.values.first
11
+ assert_equal :ok, arg_defn.metadata[:custom]
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+ require "spec_helper"
3
+
4
+ describe GraphQL::Schema::InputObject do
5
+ let(:input_object) { Jazz::EnsembleInput }
6
+ describe "type info" do
7
+ it "has it" do
8
+ assert_equal "EnsembleInput", input_object.graphql_name
9
+ assert_equal nil, input_object.description
10
+ assert_equal 1, input_object.arguments.size
11
+ end
12
+ end
13
+
14
+ describe ".to_graphql" do
15
+ it "assigns itself as the arguments_class" do
16
+ assert_equal input_object, input_object.to_graphql.arguments_class
17
+ end
18
+ end
19
+
20
+ describe "in queries" do
21
+ it "is passed to the field method" do
22
+ query_str = <<-GRAPHQL
23
+ {
24
+ inspectInput(input: {
25
+ stringValue: "ABC",
26
+ legacyInput: { intValue: 4 },
27
+ nestedInput: { stringValue: "xyz"}
28
+ })
29
+ }
30
+ GRAPHQL
31
+
32
+ res = Jazz::Schema.execute(query_str, context: { message: "hi" })
33
+ expected_info = [
34
+ "Jazz::InspectableInput",
35
+ "hi, ABC, 4, (hi, xyz, -, (-))",
36
+ "ABC",
37
+ "ABC",
38
+ "ABC",
39
+ ]
40
+ assert_equal expected_info, res["data"]["inspectInput"]
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,98 @@
1
+ # frozen_string_literal: true
2
+ require "spec_helper"
3
+
4
+ describe GraphQL::Schema::Interface do
5
+ let(:interface) { Jazz::GloballyIdentifiableType }
6
+
7
+ describe "type info" do
8
+ it "tells its type info" do
9
+ assert_equal "GloballyIdentifiable", interface.graphql_name
10
+ assert_equal 2, interface.fields.size
11
+ end
12
+
13
+ class NewInterface1 < Jazz::GloballyIdentifiableType
14
+ end
15
+
16
+ class NewInterface2 < Jazz::GloballyIdentifiableType
17
+ module Implementation
18
+ def new_method
19
+ end
20
+ end
21
+ end
22
+
23
+ it "can override Implementation" do
24
+
25
+ new_object_1 = Class.new(GraphQL::Schema::Object) do
26
+ implements NewInterface1
27
+ end
28
+
29
+ assert_equal 2, new_object_1.fields.size
30
+ assert new_object_1.method_defined?(:id)
31
+
32
+ new_object_2 = Class.new(GraphQL::Schema::Object) do
33
+ implements NewInterface2
34
+ end
35
+
36
+ assert_equal 2, new_object_2.fields.size
37
+ # It got the new method
38
+ assert new_object_2.method_defined?(:new_method)
39
+ # But not the old method
40
+ refute new_object_2.method_defined?(:id)
41
+ end
42
+ end
43
+
44
+ describe ".to_graphql" do
45
+ it "creates an InterfaceType" do
46
+ interface_type = interface.to_graphql
47
+ assert_equal "GloballyIdentifiable", interface_type.name
48
+ field = interface_type.all_fields.first
49
+ assert_equal "id", field.name
50
+ assert_equal GraphQL::ID_TYPE.to_non_null_type, field.type
51
+ assert_equal "A unique identifier for this object", field.description
52
+ end
53
+ end
54
+
55
+ describe "in queries" do
56
+ it "works" do
57
+ query_str = <<-GRAPHQL
58
+ {
59
+ piano: find(id: "Instrument/Piano") {
60
+ id
61
+ upcasedId
62
+ ... on Instrument {
63
+ family
64
+ }
65
+ }
66
+ }
67
+ GRAPHQL
68
+
69
+ res = Jazz::Schema.execute(query_str)
70
+ expected_piano = {
71
+ "id" => "Instrument/Piano",
72
+ "upcasedId" => "INSTRUMENT/PIANO",
73
+ "family" => "KEYS",
74
+ }
75
+ assert_equal(expected_piano, res["data"]["piano"])
76
+ end
77
+
78
+ it "applies custom field attributes" do
79
+ query_str = <<-GRAPHQL
80
+ {
81
+ find(id: "Ensemble/Bela Fleck and the Flecktones") {
82
+ upcasedId
83
+ ... on Ensemble {
84
+ name
85
+ }
86
+ }
87
+ }
88
+ GRAPHQL
89
+
90
+ res = Jazz::Schema.execute(query_str)
91
+ expected_data = {
92
+ "upcasedId" => "ENSEMBLE/BELA FLECK AND THE FLECKTONES",
93
+ "name" => "Bela Fleck and the Flecktones"
94
+ }
95
+ assert_equal(expected_data, res["data"]["find"])
96
+ end
97
+ end
98
+ end
@@ -0,0 +1,119 @@
1
+ # frozen_string_literal: true
2
+ require "spec_helper"
3
+
4
+ describe GraphQL::Schema::Object do
5
+ describe "class attributes" do
6
+ let(:object_class) { Jazz::Ensemble }
7
+ it "tells type data" do
8
+ assert_equal "Ensemble", object_class.graphql_name
9
+ assert_equal "A group of musicians playing together", object_class.description
10
+ assert_equal 5, object_class.fields.size
11
+ assert_equal 2, object_class.interfaces.size
12
+ # Compatibility methods are delegated to the underlying BaseType
13
+ assert object_class.respond_to?(:connection_type)
14
+ end
15
+
16
+ it "inherits fields and interfaces" do
17
+ new_object_class = Class.new(object_class) do
18
+ field :newField, String, null: true
19
+ field :name, String, "The new description", null: true
20
+ end
21
+
22
+ # one more than the parent class
23
+ assert_equal 6, new_object_class.fields.size
24
+ # inherited interfaces are present
25
+ assert_equal 2, new_object_class.interfaces.size
26
+ # The new field is present
27
+ assert new_object_class.fields.find { |f| f.name == "newField" }
28
+ # The overridden field is present:
29
+ name_field = new_object_class.fields.find { |f| f.name == "name" }
30
+ assert_equal "The new description", name_field.description
31
+ end
32
+ end
33
+
34
+ describe ".to_graphql_type" do
35
+ let(:obj_type) { Jazz::Ensemble.to_graphql }
36
+ it "returns a matching GraphQL::ObjectType" do
37
+ assert_equal "Ensemble", obj_type.name
38
+ assert_equal "A group of musicians playing together", obj_type.description
39
+ assert_equal 5, obj_type.all_fields.size
40
+
41
+ name_field = obj_type.all_fields[2]
42
+ assert_equal "name", name_field.name
43
+ assert_equal GraphQL::STRING_TYPE.to_non_null_type, name_field.type
44
+ assert_equal nil, name_field.description
45
+ end
46
+
47
+ it "has a custom implementation" do
48
+ assert_equal obj_type.metadata[:config], :configged
49
+ end
50
+
51
+ it "uses the custom field class" do
52
+ query_str = <<-GRAPHQL
53
+ {
54
+ ensembles { upcaseName }
55
+ }
56
+ GRAPHQL
57
+
58
+ res = Jazz::Schema.execute(query_str)
59
+ assert_equal ["BELA FLECK AND THE FLECKTONES"], res["data"]["ensembles"].map { |e| e["upcaseName"] }
60
+ end
61
+ end
62
+
63
+
64
+ describe "in queries" do
65
+ after {
66
+ Jazz::Models.reset
67
+ }
68
+
69
+ it "returns data" do
70
+ query_str = <<-GRAPHQL
71
+ {
72
+ ensembles { name }
73
+ instruments { name }
74
+ }
75
+ GRAPHQL
76
+ res = Jazz::Schema.execute(query_str)
77
+ assert_equal [{"name" => "Bela Fleck and the Flecktones"}], res["data"]["ensembles"]
78
+ assert_equal({"name" => "Banjo"}, res["data"]["instruments"].first)
79
+ end
80
+
81
+ it "does mutations" do
82
+ mutation_str = <<-GRAPHQL
83
+ mutation AddEnsemble($name: String!) {
84
+ addEnsemble(input: { name: $name }) {
85
+ id
86
+ }
87
+ }
88
+ GRAPHQL
89
+
90
+ query_str = <<-GRAPHQL
91
+ query($id: ID!) {
92
+ find(id: $id) {
93
+ ... on Ensemble {
94
+ name
95
+ }
96
+ }
97
+ }
98
+ GRAPHQL
99
+
100
+ res = Jazz::Schema.execute(mutation_str, variables: { "name" => "Miles Davis Quartet" })
101
+ new_id = res["data"]["addEnsemble"]["id"]
102
+
103
+ res2 = Jazz::Schema.execute(query_str, variables: { "id" => new_id })
104
+ assert_equal "Miles Davis Quartet", res2["data"]["find"]["name"]
105
+ end
106
+
107
+ it "initializes root wrappers once" do
108
+ query_str = " { oid1: objectId oid2: objectId }"
109
+ res = Jazz::Schema.execute(query_str)
110
+ assert_equal res["data"]["oid1"], res["data"]["oid2"]
111
+ end
112
+
113
+ it "skips fields properly" do
114
+ query_str = "{ find(id: \"MagicalSkipId\") { __typename } }"
115
+ res = Jazz::Schema.execute(query_str)
116
+ assert_equal({"data" => nil }, res.to_h)
117
+ end
118
+ end
119
+ end
@@ -14,11 +14,7 @@ describe GraphQL::Schema::Printer do
14
14
 
15
15
  value "FOO", value: :foo
16
16
  value "BAR", value: :bar
17
- value "BAZ", deprecation_reason: <<-REASON
18
- Use "BAR" instead.
19
-
20
- It's the replacement for this value.
21
- REASON
17
+ value "BAZ", deprecation_reason: 'Use "BAR".'
22
18
  value "WOZ", deprecation_reason: GraphQL::Directive::DEFAULT_DEPRECATION_REASON
23
19
  end
24
20
 
@@ -140,14 +136,6 @@ schema {
140
136
  query: Root
141
137
  }
142
138
 
143
- # Marks an element of a GraphQL schema as no longer supported.
144
- directive @deprecated(
145
- # Explains why this element was deprecated, usually also including a suggestion
146
- # for how to access supported similar data. Formatted in
147
- # [Markdown](https://daringfireball.net/projects/markdown/).
148
- reason: String = "No longer supported"
149
- ) on FIELD_DEFINITION | ENUM_VALUE
150
-
151
139
  # Directs the executor to include this field or fragment only when the `if` argument is true.
152
140
  directive @include(
153
141
  # Included when true.
@@ -160,6 +148,14 @@ directive @skip(
160
148
  if: Boolean!
161
149
  ) on FIELD | FRAGMENT_SPREAD | INLINE_FRAGMENT
162
150
 
151
+ # Marks an element of a GraphQL schema as no longer supported.
152
+ directive @deprecated(
153
+ # Explains why this element was deprecated, usually also including a suggestion
154
+ # for how to access supported similar data. Formatted in
155
+ # [Markdown](https://daringfireball.net/projects/markdown/).
156
+ reason: String = "No longer supported"
157
+ ) on FIELD_DEFINITION | ENUM_VALUE
158
+
163
159
  # A Directive provides a way to describe alternate runtime execution and type validation behavior in a GraphQL document.
164
160
  #
165
161
  # In some cases, you need to provide options to alter GraphQL's execution behavior
@@ -349,6 +345,7 @@ schema {
349
345
  subscription: Subscription
350
346
  }
351
347
  SCHEMA
348
+
352
349
  assert_match expected, GraphQL::Schema::Printer.print_schema(custom_schema)
353
350
  end
354
351
 
@@ -356,6 +353,7 @@ SCHEMA
356
353
  custom_mutation = schema.mutation.redefine(name: "MyMutationRoot")
357
354
  custom_schema = schema.redefine(mutation: custom_mutation)
358
355
 
356
+
359
357
  expected = <<SCHEMA
360
358
  schema {
361
359
  query: Query
@@ -392,7 +390,7 @@ type Audio {
392
390
 
393
391
  enum Choice {
394
392
  BAR
395
- BAZ @deprecated(reason: "Use \\\"BAR\\\" instead.\\n\\nIt's the replacement for this value.\\n")
393
+ BAZ @deprecated(reason: "Use \\\"BAR\\\".")
396
394
  FOO
397
395
  WOZ @deprecated
398
396
  }
@@ -491,6 +489,7 @@ enum Choice {
491
489
  }
492
490
 
493
491
  type Subscription {
492
+
494
493
  }
495
494
 
496
495
  input Varied {
@@ -510,9 +509,7 @@ SCHEMA
510
509
  when GraphQL::Argument
511
510
  member.name != "id"
512
511
  else
513
- if member.respond_to?(:deprecation_reason)
514
- member.deprecation_reason.nil?
515
- end
512
+ member.deprecation_reason.nil?
516
513
  end
517
514
  }
518
515
 
@@ -603,86 +600,12 @@ SCHEMA
603
600
  type Post {
604
601
  body: String!
605
602
  comments: [Comment!]
606
- comments_count: Int! @deprecated(reason: "Use \\\"comments\\\".")
603
+ comments_count: Int! @deprecated(reason: \"Use \\\"comments\\\".\")
607
604
  id: ID!
608
605
  title: String!
609
606
  }
610
607
  SCHEMA
611
608
  assert_equal expected.chomp, GraphQL::Schema::Printer.new(schema).print_type(schema.types['Post'])
612
609
  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
647
- end
648
-
649
- describe "#print_directive" do
650
- it "prints the deprecation reason in a single line escaped string including line breaks" do
651
- expected = <<SCHEMA
652
- enum Choice {
653
- BAR
654
- BAZ @deprecated(reason: "Use \\\"BAR\\\" instead.\\n\\nIt's the replacement for this value.\\n")
655
- FOO
656
- WOZ @deprecated
657
- }
658
-
659
- type Subscription {
660
- }
661
-
662
- input Varied {
663
- bool: Boolean
664
- enum: Choice = FOO
665
- float: Float
666
- int: Int
667
- }
668
- SCHEMA
669
-
670
- only_filter = ->(member, ctx) {
671
- case member
672
- when GraphQL::ScalarType
673
- true
674
- when GraphQL::BaseType
675
- ctx[:names].include?(member.name)
676
- when GraphQL::Argument
677
- member.name != "id"
678
- else
679
- true
680
- end
681
- }
682
-
683
- context = { names: ["Varied", "Choice", "Subscription"] }
684
-
685
- assert_equal expected.chomp, GraphQL::Schema::Printer.new(schema, context: context, only: only_filter).print_schema
686
- end
687
610
  end
688
611
  end