graphql 0.18.15 → 0.19.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/graphql/define/assign_global_id_field.rb +1 -2
- data/lib/graphql/directive.rb +41 -7
- data/lib/graphql/directive/deprecated_directive.rb +11 -0
- data/lib/graphql/directive/include_directive.rb +2 -2
- data/lib/graphql/directive/skip_directive.rb +2 -2
- data/lib/graphql/input_object_type.rb +14 -0
- data/lib/graphql/internal_representation/node.rb +8 -4
- data/lib/graphql/introspection/arguments_field.rb +0 -1
- data/lib/graphql/introspection/directive_location_enum.rb +3 -2
- data/lib/graphql/introspection/directive_type.rb +12 -7
- data/lib/graphql/introspection/enum_value_type.rb +4 -2
- data/lib/graphql/introspection/enum_values_field.rb +0 -1
- data/lib/graphql/introspection/field_type.rb +8 -7
- data/lib/graphql/introspection/fields_field.rb +0 -1
- data/lib/graphql/introspection/input_fields_field.rb +0 -1
- data/lib/graphql/introspection/input_value_type.rb +8 -10
- data/lib/graphql/introspection/interfaces_field.rb +0 -1
- data/lib/graphql/introspection/of_type_field.rb +0 -1
- data/lib/graphql/introspection/possible_types_field.rb +0 -1
- data/lib/graphql/introspection/schema_type.rb +11 -9
- data/lib/graphql/introspection/type_kind_enum.rb +3 -3
- data/lib/graphql/introspection/type_type.rb +9 -6
- data/lib/graphql/language/generation.rb +4 -1
- data/lib/graphql/language/lexer.rb +353 -316
- data/lib/graphql/language/lexer.rl +8 -6
- data/lib/graphql/language/nodes.rb +12 -0
- data/lib/graphql/language/parser.rb +553 -501
- data/lib/graphql/language/parser.y +26 -16
- data/lib/graphql/language/parser_tests.rb +20 -1
- data/lib/graphql/list_type.rb +5 -1
- data/lib/graphql/non_null_type.rb +4 -0
- data/lib/graphql/object_type.rb +1 -1
- data/lib/graphql/query/literal_input.rb +1 -1
- data/lib/graphql/relay.rb +1 -1
- data/lib/graphql/relay/global_id_resolve.rb +3 -5
- data/lib/graphql/relay/node.rb +34 -0
- data/lib/graphql/scalar_type.rb +1 -1
- data/lib/graphql/schema.rb +43 -15
- data/lib/graphql/schema/loader.rb +2 -2
- data/lib/graphql/schema/printer.rb +50 -8
- data/lib/graphql/schema/unique_within_type.rb +28 -0
- data/lib/graphql/schema/validation.rb +10 -3
- data/lib/graphql/static_validation/rules/fields_will_merge.rb +9 -1
- data/lib/graphql/static_validation/rules/fragment_spreads_are_possible.rb +8 -2
- data/lib/graphql/type_kinds.rb +12 -12
- data/lib/graphql/version.rb +1 -1
- data/readme.md +6 -5
- data/spec/graphql/argument_spec.rb +1 -1
- data/spec/graphql/execution_error_spec.rb +53 -0
- data/spec/graphql/introspection/directive_type_spec.rb +10 -0
- data/spec/graphql/introspection/input_value_type_spec.rb +23 -0
- data/spec/graphql/language/generation_spec.rb +4 -0
- data/spec/graphql/query/executor_spec.rb +2 -2
- data/spec/graphql/relay/mutation_spec.rb +1 -1
- data/spec/graphql/relay/node_spec.rb +87 -0
- data/spec/graphql/schema/catchall_middleware_spec.rb +1 -1
- data/spec/graphql/schema/loader_spec.rb +37 -4
- data/spec/graphql/schema/printer_spec.rb +30 -7
- data/spec/graphql/schema/unique_within_type_spec.rb +27 -0
- data/spec/graphql/schema/validation_spec.rb +7 -11
- data/spec/graphql/schema_spec.rb +32 -2
- data/spec/graphql/static_validation/rules/argument_literals_are_compatible_spec.rb +14 -15
- data/spec/graphql/static_validation/rules/arguments_are_defined_spec.rb +10 -10
- data/spec/graphql/static_validation/rules/directives_are_defined_spec.rb +1 -5
- data/spec/graphql/static_validation/rules/directives_are_in_valid_locations_spec.rb +3 -5
- data/spec/graphql/static_validation/rules/fields_are_defined_on_type_spec.rb +7 -11
- data/spec/graphql/static_validation/rules/fields_have_appropriate_selections_spec.rb +1 -4
- data/spec/graphql/static_validation/rules/fields_will_merge_spec.rb +10 -13
- data/spec/graphql/static_validation/rules/fragment_spreads_are_possible_spec.rb +3 -5
- data/spec/graphql/static_validation/rules/fragment_types_exist_spec.rb +2 -4
- data/spec/graphql/static_validation/rules/fragments_are_finite_spec.rb +4 -6
- data/spec/graphql/static_validation/rules/fragments_are_named_spec.rb +2 -4
- data/spec/graphql/static_validation/rules/fragments_are_on_composite_types_spec.rb +7 -7
- data/spec/graphql/static_validation/rules/fragments_are_used_spec.rb +1 -4
- data/spec/graphql/static_validation/rules/mutation_root_exists_spec.rb +2 -4
- data/spec/graphql/static_validation/rules/required_arguments_are_present_spec.rb +3 -6
- data/spec/graphql/static_validation/rules/subscription_root_exists_spec.rb +2 -4
- data/spec/graphql/static_validation/rules/variable_default_values_are_correctly_typed_spec.rb +12 -14
- data/spec/graphql/static_validation/rules/variable_usages_are_allowed_spec.rb +7 -9
- data/spec/graphql/static_validation/rules/variables_are_input_types_spec.rb +20 -22
- data/spec/graphql/static_validation/rules/variables_are_used_and_defined_spec.rb +27 -23
- data/spec/spec_helper.rb +1 -0
- data/spec/support/dairy_app.rb +2 -2
- data/spec/support/star_wars_schema.rb +15 -18
- data/spec/support/static_validation_helpers.rb +27 -0
- metadata +25 -5
- data/lib/graphql/relay/global_node_identification.rb +0 -138
- data/spec/graphql/relay/global_node_identification_spec.rb +0 -153
data/spec/spec_helper.rb
CHANGED
data/spec/support/dairy_app.rb
CHANGED
@@ -62,7 +62,7 @@ CheeseType = GraphQL::ObjectType.define do
|
|
62
62
|
field :similarCheese, CheeseType, "Cheeses like this one", property: :this_should_be_overriden do
|
63
63
|
# metadata test
|
64
64
|
joins [:cheeses, :milks]
|
65
|
-
argument :source, !types[!DairyAnimalEnum]
|
65
|
+
argument :source, !types[!DairyAnimalEnum], default_value: [1]
|
66
66
|
resolve -> (t, a, c) {
|
67
67
|
# get the strings out:
|
68
68
|
sources = a["source"]
|
@@ -235,7 +235,7 @@ end
|
|
235
235
|
SourceFieldDefn = Proc.new {
|
236
236
|
type GraphQL::ListType.new(of_type: CheeseType)
|
237
237
|
description "Cheese from source"
|
238
|
-
argument :source, DairyAnimalEnum, default_value:
|
238
|
+
argument :source, DairyAnimalEnum, default_value: 1
|
239
239
|
resolve -> (target, arguments, context) {
|
240
240
|
CHEESES.values.select{ |c| c.source == arguments["source"] }
|
241
241
|
}
|
@@ -1,28 +1,16 @@
|
|
1
1
|
# Adapted from graphql-relay-js
|
2
2
|
# https://github.com/graphql/graphql-relay-js/blob/master/src/__tests__/starWarsSchema.js
|
3
3
|
|
4
|
-
# This object exposes helpers for working with global IDs:
|
5
|
-
# - global id creation & "decrypting"
|
6
|
-
# - a find-object-by-global ID field
|
7
|
-
# - an interface for Relay ObjectTypes to implement
|
8
|
-
# See global_node_identification.rb for the full API.
|
9
|
-
NodeIdentification = GraphQL::Relay::GlobalNodeIdentification.define do
|
10
|
-
object_from_id -> (node_id, ctx) do
|
11
|
-
type_name, id = NodeIdentification.from_global_id(node_id)
|
12
|
-
STAR_WARS_DATA[type_name][id]
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
4
|
Ship = GraphQL::ObjectType.define do
|
17
5
|
name "Ship"
|
18
|
-
interfaces [
|
6
|
+
interfaces [GraphQL::Relay::Node.interface]
|
19
7
|
global_id_field :id
|
20
8
|
field :name, types.String
|
21
9
|
end
|
22
10
|
|
23
11
|
BaseType = GraphQL::ObjectType.define do
|
24
12
|
name "Base"
|
25
|
-
interfaces [
|
13
|
+
interfaces [GraphQL::Relay::Node.interface]
|
26
14
|
global_id_field :id
|
27
15
|
field :name, types.String
|
28
16
|
field :planet, types.String
|
@@ -69,9 +57,9 @@ end
|
|
69
57
|
|
70
58
|
Faction = GraphQL::ObjectType.define do
|
71
59
|
name "Faction"
|
72
|
-
interfaces [
|
60
|
+
interfaces [GraphQL::Relay::Node.interface]
|
73
61
|
|
74
|
-
field :id, !types.ID, resolve: GraphQL::Relay::GlobalIdResolve.new(
|
62
|
+
field :id, !types.ID, resolve: GraphQL::Relay::GlobalIdResolve.new(type: Faction)
|
75
63
|
field :name, types.String
|
76
64
|
connection :ships, Ship.connection_type do
|
77
65
|
resolve -> (obj, args, ctx) {
|
@@ -192,7 +180,7 @@ QueryType = GraphQL::ObjectType.define do
|
|
192
180
|
resolve -> (obj, args, ctx) { Base.find(3) }
|
193
181
|
end
|
194
182
|
|
195
|
-
field :node,
|
183
|
+
field :node, GraphQL::Relay::Node.field
|
196
184
|
end
|
197
185
|
|
198
186
|
MutationType = GraphQL::ObjectType.define do
|
@@ -204,7 +192,7 @@ end
|
|
204
192
|
StarWarsSchema = GraphQL::Schema.define do
|
205
193
|
query(QueryType)
|
206
194
|
mutation(MutationType)
|
207
|
-
|
195
|
+
|
208
196
|
resolve_type -> (object, ctx) {
|
209
197
|
if object == :test_error
|
210
198
|
:not_a_type
|
@@ -218,4 +206,13 @@ StarWarsSchema = GraphQL::Schema.define do
|
|
218
206
|
nil
|
219
207
|
end
|
220
208
|
}
|
209
|
+
|
210
|
+
object_from_id -> (node_id, ctx) do
|
211
|
+
type_name, id = GraphQL::Schema::UniqueWithinType.decode(node_id)
|
212
|
+
STAR_WARS_DATA[type_name][id]
|
213
|
+
end
|
214
|
+
|
215
|
+
id_from_object -> (object, type, ctx) do
|
216
|
+
GraphQL::Schema::UniqueWithinType.encode(type.name, object.id)
|
217
|
+
end
|
221
218
|
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# This module assumes you have `let(:query_string)` in your spec.
|
2
|
+
# It provides `errors` which are the validation errors for that string,
|
3
|
+
# as validated against `DummySchema`.
|
4
|
+
# You can override `schema` to provide another schema
|
5
|
+
# @example testing static validation
|
6
|
+
# include StaticValidationHelpers
|
7
|
+
# let(:query_string) { " ... " }
|
8
|
+
# it "validates" do
|
9
|
+
# assert_equal(errors, [ ... ])
|
10
|
+
# assert_equal(error_messages, [ ... ])
|
11
|
+
# end
|
12
|
+
module StaticValidationHelpers
|
13
|
+
def errors
|
14
|
+
target_schema = schema
|
15
|
+
validator = GraphQL::StaticValidation::Validator.new(schema: target_schema)
|
16
|
+
query = GraphQL::Query.new(target_schema, query_string)
|
17
|
+
validator.validate(query)[:errors]
|
18
|
+
end
|
19
|
+
|
20
|
+
def error_messages
|
21
|
+
errors.map { |e| e["message"] }
|
22
|
+
end
|
23
|
+
|
24
|
+
def schema
|
25
|
+
DummySchema
|
26
|
+
end
|
27
|
+
end
|
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: 0.
|
4
|
+
version: 0.19.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Robert Mosolgo
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-09-
|
11
|
+
date: 2016-09-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: codeclimate-test-reporter
|
@@ -38,6 +38,20 @@ dependencies:
|
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0.10'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: pry-stack_explorer
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
41
55
|
- !ruby/object:Gem::Dependency
|
42
56
|
name: guard
|
43
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -295,6 +309,7 @@ files:
|
|
295
309
|
- lib/graphql/define/non_null_with_bang.rb
|
296
310
|
- lib/graphql/define/type_definer.rb
|
297
311
|
- lib/graphql/directive.rb
|
312
|
+
- lib/graphql/directive/deprecated_directive.rb
|
298
313
|
- lib/graphql/directive/include_directive.rb
|
299
314
|
- lib/graphql/directive/skip_directive.rb
|
300
315
|
- lib/graphql/enum_type.rb
|
@@ -370,8 +385,8 @@ files:
|
|
370
385
|
- lib/graphql/relay/edge.rb
|
371
386
|
- lib/graphql/relay/edge_type.rb
|
372
387
|
- lib/graphql/relay/global_id_resolve.rb
|
373
|
-
- lib/graphql/relay/global_node_identification.rb
|
374
388
|
- lib/graphql/relay/mutation.rb
|
389
|
+
- lib/graphql/relay/node.rb
|
375
390
|
- lib/graphql/relay/page_info.rb
|
376
391
|
- lib/graphql/relay/relation_connection.rb
|
377
392
|
- lib/graphql/scalar_type.rb
|
@@ -387,6 +402,7 @@ files:
|
|
387
402
|
- lib/graphql/schema/timeout_middleware.rb
|
388
403
|
- lib/graphql/schema/type_expression.rb
|
389
404
|
- lib/graphql/schema/type_map.rb
|
405
|
+
- lib/graphql/schema/unique_within_type.rb
|
390
406
|
- lib/graphql/schema/validation.rb
|
391
407
|
- lib/graphql/static_validation.rb
|
392
408
|
- lib/graphql/static_validation/all_rules.rb
|
@@ -466,8 +482,8 @@ files:
|
|
466
482
|
- spec/graphql/relay/array_connection_spec.rb
|
467
483
|
- spec/graphql/relay/connection_field_spec.rb
|
468
484
|
- spec/graphql/relay/connection_type_spec.rb
|
469
|
-
- spec/graphql/relay/global_node_identification_spec.rb
|
470
485
|
- spec/graphql/relay/mutation_spec.rb
|
486
|
+
- spec/graphql/relay/node_spec.rb
|
471
487
|
- spec/graphql/relay/page_info_spec.rb
|
472
488
|
- spec/graphql/relay/relation_connection_spec.rb
|
473
489
|
- spec/graphql/scalar_type_spec.rb
|
@@ -479,6 +495,7 @@ files:
|
|
479
495
|
- spec/graphql/schema/rescue_middleware_spec.rb
|
480
496
|
- spec/graphql/schema/timeout_middleware_spec.rb
|
481
497
|
- spec/graphql/schema/type_expression_spec.rb
|
498
|
+
- spec/graphql/schema/unique_within_type_spec.rb
|
482
499
|
- spec/graphql/schema/validation_spec.rb
|
483
500
|
- spec/graphql/schema_spec.rb
|
484
501
|
- spec/graphql/static_validation/rules/argument_literals_are_compatible_spec.rb
|
@@ -511,6 +528,7 @@ files:
|
|
511
528
|
- spec/support/minimum_input_object.rb
|
512
529
|
- spec/support/star_wars_data.rb
|
513
530
|
- spec/support/star_wars_schema.rb
|
531
|
+
- spec/support/static_validation_helpers.rb
|
514
532
|
homepage: http://github.com/rmosolgo/graphql-ruby
|
515
533
|
licenses:
|
516
534
|
- MIT
|
@@ -581,8 +599,8 @@ test_files:
|
|
581
599
|
- spec/graphql/relay/array_connection_spec.rb
|
582
600
|
- spec/graphql/relay/connection_field_spec.rb
|
583
601
|
- spec/graphql/relay/connection_type_spec.rb
|
584
|
-
- spec/graphql/relay/global_node_identification_spec.rb
|
585
602
|
- spec/graphql/relay/mutation_spec.rb
|
603
|
+
- spec/graphql/relay/node_spec.rb
|
586
604
|
- spec/graphql/relay/page_info_spec.rb
|
587
605
|
- spec/graphql/relay/relation_connection_spec.rb
|
588
606
|
- spec/graphql/scalar_type_spec.rb
|
@@ -594,6 +612,7 @@ test_files:
|
|
594
612
|
- spec/graphql/schema/rescue_middleware_spec.rb
|
595
613
|
- spec/graphql/schema/timeout_middleware_spec.rb
|
596
614
|
- spec/graphql/schema/type_expression_spec.rb
|
615
|
+
- spec/graphql/schema/unique_within_type_spec.rb
|
597
616
|
- spec/graphql/schema/validation_spec.rb
|
598
617
|
- spec/graphql/schema_spec.rb
|
599
618
|
- spec/graphql/static_validation/rules/argument_literals_are_compatible_spec.rb
|
@@ -626,3 +645,4 @@ test_files:
|
|
626
645
|
- spec/support/minimum_input_object.rb
|
627
646
|
- spec/support/star_wars_data.rb
|
628
647
|
- spec/support/star_wars_schema.rb
|
648
|
+
- spec/support/static_validation_helpers.rb
|
@@ -1,138 +0,0 @@
|
|
1
|
-
require 'singleton'
|
2
|
-
module GraphQL
|
3
|
-
module Relay
|
4
|
-
# This object provides helpers for working with global IDs.
|
5
|
-
# It's assumed you'll only have 1!
|
6
|
-
#
|
7
|
-
# GlobalIdField depends on that, since it calls class methods
|
8
|
-
# which delegate to the singleton instance.
|
9
|
-
#
|
10
|
-
class GlobalNodeIdentification
|
11
|
-
include GraphQL::Define::InstanceDefinable
|
12
|
-
accepts_definitions(:object_from_id, :type_from_object, :to_global_id, :from_global_id, :description)
|
13
|
-
lazy_defined_attr_accessor :description
|
14
|
-
|
15
|
-
# Memoize the schema to support deprecated node_ident-level resolve functions
|
16
|
-
# TODO: remove after Schema.resolve_type is required
|
17
|
-
attr_accessor :schema
|
18
|
-
|
19
|
-
class << self
|
20
|
-
attr_accessor :id_separator
|
21
|
-
end
|
22
|
-
|
23
|
-
self.id_separator = "-"
|
24
|
-
|
25
|
-
def initialize
|
26
|
-
@to_global_id_proc = DEFAULT_TO_GLOBAL_ID
|
27
|
-
@from_global_id_proc = DEFAULT_FROM_GLOBAL_ID
|
28
|
-
end
|
29
|
-
|
30
|
-
# Returns `NodeInterface`, which all Relay types must implement
|
31
|
-
def interface
|
32
|
-
@interface ||= begin
|
33
|
-
ensure_defined
|
34
|
-
ident = self
|
35
|
-
if @type_from_object_proc
|
36
|
-
# TODO: remove after Schema.resolve_type is required
|
37
|
-
GraphQL::InterfaceType.define do
|
38
|
-
name "Node"
|
39
|
-
field :id, !types.ID
|
40
|
-
resolve_type -> (obj, ctx) {
|
41
|
-
ident.type_from_object(obj)
|
42
|
-
}
|
43
|
-
end
|
44
|
-
else
|
45
|
-
GraphQL::InterfaceType.define do
|
46
|
-
name "Node"
|
47
|
-
field :id, !types.ID
|
48
|
-
end
|
49
|
-
end
|
50
|
-
end
|
51
|
-
end
|
52
|
-
|
53
|
-
# Returns a field for finding objects from a global ID, which Relay needs
|
54
|
-
def field
|
55
|
-
ensure_defined
|
56
|
-
ident = self
|
57
|
-
GraphQL::Field.define do
|
58
|
-
type(ident.interface)
|
59
|
-
argument :id, !types.ID
|
60
|
-
resolve -> (obj, args, ctx) {
|
61
|
-
ctx.query.schema.node_identification.object_from_id(args[:id], ctx)
|
62
|
-
}
|
63
|
-
description ident.description
|
64
|
-
end
|
65
|
-
end
|
66
|
-
|
67
|
-
DEFAULT_TO_GLOBAL_ID = -> (type_name, id) {
|
68
|
-
id_str = id.to_s
|
69
|
-
if type_name.include?(self.id_separator) || id_str.include?(self.id_separator)
|
70
|
-
raise "to_global_id(#{type_name}, #{id}) contains reserved characters `#{self.id_separator}`"
|
71
|
-
end
|
72
|
-
Base64.strict_encode64([type_name, id_str].join(self.id_separator))
|
73
|
-
}
|
74
|
-
|
75
|
-
DEFAULT_FROM_GLOBAL_ID = -> (global_id) {
|
76
|
-
Base64.decode64(global_id).split(self.id_separator)
|
77
|
-
}
|
78
|
-
|
79
|
-
# Create a global ID for type-name & ID
|
80
|
-
# (This is an opaque transform)
|
81
|
-
def to_global_id(type_name, id)
|
82
|
-
ensure_defined
|
83
|
-
@to_global_id_proc.call(type_name, id)
|
84
|
-
end
|
85
|
-
|
86
|
-
def to_global_id=(proc)
|
87
|
-
ensure_defined
|
88
|
-
@to_global_id_proc = proc
|
89
|
-
end
|
90
|
-
|
91
|
-
# Get type-name & ID from global ID
|
92
|
-
# (This reverts the opaque transform)
|
93
|
-
def from_global_id(global_id)
|
94
|
-
ensure_defined
|
95
|
-
@from_global_id_proc.call(global_id)
|
96
|
-
end
|
97
|
-
|
98
|
-
def from_global_id=(proc)
|
99
|
-
ensure_defined
|
100
|
-
@from_global_id_proc = proc
|
101
|
-
end
|
102
|
-
|
103
|
-
# Use the provided config to
|
104
|
-
# get a type for a given object
|
105
|
-
# TODO: remove after Schema.resolve_type is required
|
106
|
-
def type_from_object(object)
|
107
|
-
ensure_defined
|
108
|
-
warn("type_from_object(object) is deprecated; use Schema.resolve_type(object) instead")
|
109
|
-
|
110
|
-
if @type_from_object_proc
|
111
|
-
type_from_obj = @type_from_object_proc
|
112
|
-
schema.resolve_type = -> (obj, ctx) { type_from_obj.call(obj) }
|
113
|
-
@type_from_object_proc = nil
|
114
|
-
end
|
115
|
-
|
116
|
-
schema.resolve_type(object, nil)
|
117
|
-
end
|
118
|
-
|
119
|
-
def type_from_object=(new_type_from_object_proc)
|
120
|
-
ensure_defined
|
121
|
-
warn("type_from_object(object) is deprecated; use Schema.resolve_type(object) instead")
|
122
|
-
@type_from_object_proc = new_type_from_object_proc
|
123
|
-
end
|
124
|
-
|
125
|
-
# Use the provided config to
|
126
|
-
# get an object from a UUID
|
127
|
-
def object_from_id(id, ctx)
|
128
|
-
ensure_defined
|
129
|
-
@object_from_id_proc.call(id, ctx)
|
130
|
-
end
|
131
|
-
|
132
|
-
def object_from_id=(proc)
|
133
|
-
ensure_defined
|
134
|
-
@object_from_id_proc = proc
|
135
|
-
end
|
136
|
-
end
|
137
|
-
end
|
138
|
-
end
|
@@ -1,153 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe GraphQL::Relay::GlobalNodeIdentification do
|
4
|
-
let(:node_identification) { StarWarsSchema.node_identification }
|
5
|
-
describe 'NodeField' do
|
6
|
-
it 'finds objects by id' do
|
7
|
-
global_id = node_identification.to_global_id("Faction", "1")
|
8
|
-
result = star_wars_query(%|{
|
9
|
-
node(id: "#{global_id}") {
|
10
|
-
id,
|
11
|
-
... on Faction {
|
12
|
-
name
|
13
|
-
ships(first: 1) {
|
14
|
-
edges {
|
15
|
-
node {
|
16
|
-
name
|
17
|
-
}
|
18
|
-
}
|
19
|
-
}
|
20
|
-
}
|
21
|
-
}
|
22
|
-
}|)
|
23
|
-
expected = {"data" => {
|
24
|
-
"node"=>{
|
25
|
-
"id"=>"RmFjdGlvbi0x",
|
26
|
-
"name"=>"Alliance to Restore the Republic",
|
27
|
-
"ships"=>{
|
28
|
-
"edges"=>[
|
29
|
-
{"node"=>{
|
30
|
-
"name" => "X-Wing"
|
31
|
-
}
|
32
|
-
}
|
33
|
-
]
|
34
|
-
}
|
35
|
-
}
|
36
|
-
}}
|
37
|
-
assert_equal(expected, result)
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
after do
|
42
|
-
# Set the id_separator back to it's default after each spec, since some of
|
43
|
-
# them change it at runtime
|
44
|
-
GraphQL::Relay::GlobalNodeIdentification.id_separator = "-"
|
45
|
-
end
|
46
|
-
|
47
|
-
describe 'id_separator' do
|
48
|
-
it "allows you to change it at runtime" do
|
49
|
-
GraphQL::Relay::GlobalNodeIdentification.id_separator = "-zomg-"
|
50
|
-
|
51
|
-
assert_equal("-zomg-", GraphQL::Relay::GlobalNodeIdentification.id_separator)
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
|
-
describe "type_from_object" do
|
56
|
-
it "works even though it's deprecated" do
|
57
|
-
thing_type = GraphQL::ObjectType.define do
|
58
|
-
name "Thing"
|
59
|
-
global_id_field :id
|
60
|
-
field :object_id, types.Int
|
61
|
-
end
|
62
|
-
|
63
|
-
node_ident = GraphQL::Relay::GlobalNodeIdentification.define do
|
64
|
-
type_from_object -> (obj) { thing_type }
|
65
|
-
end
|
66
|
-
|
67
|
-
schema = GraphQL::Schema.define do
|
68
|
-
node_identification(node_ident)
|
69
|
-
end
|
70
|
-
|
71
|
-
schema.send(:ensure_defined)
|
72
|
-
assert_equal thing_type, node_ident.type_from_object(nil)
|
73
|
-
assert_equal thing_type, schema.resolve_type(nil, nil)
|
74
|
-
end
|
75
|
-
end
|
76
|
-
|
77
|
-
describe 'to_global_id / from_global_id ' do
|
78
|
-
it 'Converts typename and ID to and from ID' do
|
79
|
-
global_id = node_identification.to_global_id("SomeType", 123)
|
80
|
-
type_name, id = node_identification.from_global_id(global_id)
|
81
|
-
assert_equal("SomeType", type_name)
|
82
|
-
assert_equal("123", id)
|
83
|
-
end
|
84
|
-
|
85
|
-
it "allows you to change the id_separator" do
|
86
|
-
GraphQL::Relay::GlobalNodeIdentification.id_separator = "---"
|
87
|
-
|
88
|
-
global_id = node_identification.to_global_id("Type-With-UUID", "250cda0e-a89d-41cf-99e1-2872d89f1100")
|
89
|
-
type_name, id = node_identification.from_global_id(global_id)
|
90
|
-
assert_equal("Type-With-UUID", type_name)
|
91
|
-
assert_equal("250cda0e-a89d-41cf-99e1-2872d89f1100", id)
|
92
|
-
end
|
93
|
-
|
94
|
-
it "raises an error if you try and use a reserved character in the ID" do
|
95
|
-
err = assert_raises(RuntimeError) {
|
96
|
-
node_identification.to_global_id("Best-Thing", "234")
|
97
|
-
}
|
98
|
-
assert_includes err.message, "to_global_id(Best-Thing, 234) contains reserved characters `-`"
|
99
|
-
end
|
100
|
-
|
101
|
-
describe "custom definitions" do
|
102
|
-
let(:custom_node_identification) {
|
103
|
-
ident = GraphQL::Relay::GlobalNodeIdentification.define do
|
104
|
-
to_global_id -> (type_name, id) {
|
105
|
-
"#{type_name}/#{id}"
|
106
|
-
}
|
107
|
-
|
108
|
-
from_global_id -> (global_id) {
|
109
|
-
global_id.split("/")
|
110
|
-
}
|
111
|
-
|
112
|
-
object_from_id -> (node_id, ctx) do
|
113
|
-
type_name, id = ident.from_global_id(node_id)
|
114
|
-
STAR_WARS_DATA[type_name][id]
|
115
|
-
end
|
116
|
-
|
117
|
-
description "Hello, World!"
|
118
|
-
end
|
119
|
-
}
|
120
|
-
|
121
|
-
before do
|
122
|
-
@prev_node_identification = StarWarsSchema.node_identification
|
123
|
-
StarWarsSchema.node_identification = custom_node_identification
|
124
|
-
end
|
125
|
-
|
126
|
-
after do
|
127
|
-
StarWarsSchema.node_identification = @prev_node_identification
|
128
|
-
end
|
129
|
-
|
130
|
-
describe "generating IDs" do
|
131
|
-
it "Applies custom-defined ID generation" do
|
132
|
-
result = star_wars_query(%| { largestBase { id } }|)
|
133
|
-
generated_id = result["data"]["largestBase"]["id"]
|
134
|
-
assert_equal "Base/3", generated_id
|
135
|
-
end
|
136
|
-
end
|
137
|
-
|
138
|
-
describe "fetching by ID" do
|
139
|
-
it "Deconstructs the ID by the custom proc" do
|
140
|
-
result = star_wars_query(%| { node(id: "Base/1") { ... on Base { name } } }|)
|
141
|
-
base_name = result["data"]["node"]["name"]
|
142
|
-
assert_equal "Yavin", base_name
|
143
|
-
end
|
144
|
-
end
|
145
|
-
|
146
|
-
describe "setting a description" do
|
147
|
-
it "allows you to set a description" do
|
148
|
-
assert_equal "Hello, World!", custom_node_identification.field.description
|
149
|
-
end
|
150
|
-
end
|
151
|
-
end
|
152
|
-
end
|
153
|
-
end
|