apollo-federation 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/CHANGELOG.md +10 -0
- data/README.md +6 -2
- data/lib/apollo-federation.rb +2 -0
- data/lib/apollo-federation/any.rb +7 -3
- data/lib/apollo-federation/entities_field.rb +9 -4
- data/lib/apollo-federation/entity.rb +2 -0
- data/lib/apollo-federation/federated_document_from_schema_definition.rb +8 -4
- data/lib/apollo-federation/field.rb +2 -0
- data/lib/apollo-federation/has_directives.rb +1 -0
- data/lib/apollo-federation/object.rb +2 -0
- data/lib/apollo-federation/schema.rb +5 -4
- data/lib/apollo-federation/service.rb +5 -0
- data/lib/apollo-federation/service_field.rb +2 -0
- data/lib/apollo-federation/version.rb +3 -1
- metadata +58 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4cb2c9ccf550442d466468618bc9656f3fcdd11dc945583ad8fcf4ffd9ab2101
|
4
|
+
data.tar.gz: ee79a0157e41dd292ab53d39a8edae5f220aac31abf9d69bfb6711c9dd16b7d4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5004bc11baa692fc1a900f30ada8210bdaef68ea55eb40b22c67db11257bd2890c186958e411f3fea7fc678ee3556301ab606de1a67b5a6f64e5ac165e180c3d
|
7
|
+
data.tar.gz: 1e2fa18db2eb2f92997724a7c60fafec104fad63d0e3ad84ba72202c70221d32f342e3df96164b6c5619cb02b42c231912407ce17591de72856385a77f000b79
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,13 @@
|
|
1
|
+
## 0.2.0 (Aug 1, 2019)
|
2
|
+
|
3
|
+
### Features
|
4
|
+
|
5
|
+
* Add a description to the `_Service` type ([#10](https://github.com/Gusto/apollo-federation-ruby/pull/10))
|
6
|
+
|
7
|
+
### Bug fixes
|
8
|
+
|
9
|
+
* Fix an issue coercing the `_Any` scalar in a Rails app ([#13](https://github.com/Gusto/apollo-federation-ruby/pull/13))
|
10
|
+
|
1
11
|
## 0.1.0 (Jun 21, 2019)
|
2
12
|
|
3
13
|
* First release
|
data/README.md
CHANGED
@@ -147,6 +147,10 @@ class User < BaseObject
|
|
147
147
|
end
|
148
148
|
```
|
149
149
|
|
150
|
-
## Known
|
150
|
+
## Known Issues and Limitations
|
151
151
|
- Currently only works with class-based schemas
|
152
|
-
- Does add directives to the output of `Schema.to_definition`. Since `graphql-ruby` doesn't natively support schema directives, the directives will only be visible to the [Apollo Gateway](https://www.apollographql.com/docs/apollo-server/api/apollo-gateway/) through the `Query._service` field (see the [Apollo Federation specification](https://www.apollographql.com/docs/apollo-server/federation/federation-spec/))
|
152
|
+
- Does not add directives to the output of `Schema.to_definition`. Since `graphql-ruby` doesn't natively support schema directives, the directives will only be visible to the [Apollo Gateway](https://www.apollographql.com/docs/apollo-server/api/apollo-gateway/) through the `Query._service` field (see the [Apollo Federation specification](https://www.apollographql.com/docs/apollo-server/federation/federation-spec/))
|
153
|
+
|
154
|
+
## Maintainers
|
155
|
+
* [Rylan Collins](https://github.com/rylanc)
|
156
|
+
* [Noa Elad](https://github.com/noaelad)
|
data/lib/apollo-federation.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'graphql'
|
2
4
|
|
3
5
|
module ApolloFederation
|
@@ -6,9 +8,11 @@ module ApolloFederation
|
|
6
8
|
|
7
9
|
def self.coerce_input(value, _ctx)
|
8
10
|
# TODO: Should we convert it to a Mash-like object?
|
9
|
-
result =
|
10
|
-
|
11
|
-
|
11
|
+
result = {}
|
12
|
+
|
13
|
+
# `value` can be an ActionController::Parameters instance
|
14
|
+
value.each_pair do |key, val|
|
15
|
+
result[key.to_sym] = val
|
12
16
|
end
|
13
17
|
|
14
18
|
result
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'graphql'
|
2
4
|
require 'apollo-federation/any'
|
3
5
|
|
@@ -24,14 +26,17 @@ module ApolloFederation
|
|
24
26
|
type = context.warden.get_type(typename)
|
25
27
|
if type.nil? || type.kind != GraphQL::TypeKinds::OBJECT
|
26
28
|
# TODO: Raise a specific error class?
|
27
|
-
raise "The _entities resolver tried to load an entity for type \"#{typename}\",
|
29
|
+
raise "The _entities resolver tried to load an entity for type \"#{typename}\"," \
|
30
|
+
' but no object type of that name was found in the schema'
|
28
31
|
end
|
29
32
|
|
30
33
|
# TODO: Handle non-class types?
|
31
34
|
type_class = type.metadata[:type_class]
|
32
|
-
|
33
|
-
type_class.resolve_reference(reference, context)
|
34
|
-
|
35
|
+
if type_class.respond_to?(:resolve_reference)
|
36
|
+
result = type_class.resolve_reference(reference, context)
|
37
|
+
else
|
38
|
+
result = reference
|
39
|
+
end
|
35
40
|
|
36
41
|
# TODO: This isn't 100% correct: if (for some reason) 2 different resolve_reference calls
|
37
42
|
# return the same object, it might not have the right type
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'graphql'
|
2
4
|
require 'apollo-federation/service'
|
3
5
|
|
@@ -7,16 +9,18 @@ module ApolloFederation
|
|
7
9
|
'_Any',
|
8
10
|
'_Entity',
|
9
11
|
'_Service',
|
10
|
-
]
|
12
|
+
].freeze
|
11
13
|
FEDERATION_QUERY_FIELDS = [
|
12
14
|
'_entities',
|
13
15
|
'_service',
|
14
|
-
]
|
16
|
+
].freeze
|
15
17
|
|
16
18
|
def build_object_type_node(object_type)
|
17
19
|
object_node = super
|
18
20
|
if query_type?(object_type)
|
19
|
-
federation_fields = object_node.fields.select
|
21
|
+
federation_fields = object_node.fields.select do |field|
|
22
|
+
FEDERATION_QUERY_FIELDS.include?(field.name)
|
23
|
+
end
|
20
24
|
federation_fields.each { |field| object_node = object_node.delete_child(field) }
|
21
25
|
end
|
22
26
|
merge_directives(object_node, object_type.metadata[:federation_directives])
|
@@ -48,7 +52,7 @@ module ApolloFederation
|
|
48
52
|
(directives || []).each do |directive|
|
49
53
|
node = node.merge_directive(
|
50
54
|
name: directive[:name],
|
51
|
-
arguments: build_arguments_node(directive[:arguments])
|
55
|
+
arguments: build_arguments_node(directive[:arguments]),
|
52
56
|
)
|
53
57
|
end
|
54
58
|
node
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'apollo-federation/entities_field'
|
2
4
|
require 'apollo-federation/service_field'
|
3
5
|
require 'apollo-federation/entity'
|
@@ -28,10 +30,10 @@ module ApolloFederation
|
|
28
30
|
|
29
31
|
possible_entities = orig_defn.types.values.select do |type|
|
30
32
|
!type.introspection? && !type.default_scalar? &&
|
31
|
-
type.metadata[:federation_directives]&.any? {|directive| directive[:name] == 'key'}
|
33
|
+
type.metadata[:federation_directives]&.any? { |directive| directive[:name] == 'key' }
|
32
34
|
end
|
33
35
|
|
34
|
-
if possible_entities.
|
36
|
+
if !possible_entities.empty?
|
35
37
|
entity_type = Class.new(Entity) do
|
36
38
|
possible_types(*possible_entities)
|
37
39
|
end
|
@@ -46,7 +48,7 @@ module ApolloFederation
|
|
46
48
|
end
|
47
49
|
|
48
50
|
def federation_sdl
|
49
|
-
@
|
51
|
+
@federation_sdl ||= begin
|
50
52
|
document_from_schema = FederatedDocumentFromSchemaDefinition.new(self)
|
51
53
|
GraphQL::Language::Printer.new.print(document_from_schema.document)
|
52
54
|
end
|
@@ -54,4 +56,3 @@ module ApolloFederation
|
|
54
56
|
end
|
55
57
|
end
|
56
58
|
end
|
57
|
-
|
@@ -1,8 +1,13 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'graphql'
|
2
4
|
|
3
5
|
module ApolloFederation
|
4
6
|
class Service < GraphQL::Schema::Object
|
5
7
|
graphql_name '_Service'
|
8
|
+
description 'The sdl representing the federated service capabilities. Includes federation ' \
|
9
|
+
'directives, removes federation types, and includes rest of full schema after schema ' \
|
10
|
+
'directives have been applied'
|
6
11
|
|
7
12
|
field(:sdl, String, null: true)
|
8
13
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: apollo-federation
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Noa Elad
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2019-
|
12
|
+
date: 2019-08-01 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: graphql
|
@@ -25,6 +25,20 @@ dependencies:
|
|
25
25
|
- - ">="
|
26
26
|
- !ruby/object:Gem::Version
|
27
27
|
version: '0'
|
28
|
+
- !ruby/object:Gem::Dependency
|
29
|
+
name: actionpack
|
30
|
+
requirement: !ruby/object:Gem::Requirement
|
31
|
+
requirements:
|
32
|
+
- - ">="
|
33
|
+
- !ruby/object:Gem::Version
|
34
|
+
version: '0'
|
35
|
+
type: :development
|
36
|
+
prerelease: false
|
37
|
+
version_requirements: !ruby/object:Gem::Requirement
|
38
|
+
requirements:
|
39
|
+
- - ">="
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
version: '0'
|
28
42
|
- !ruby/object:Gem::Dependency
|
29
43
|
name: pry-byebug
|
30
44
|
requirement: !ruby/object:Gem::Requirement
|
@@ -53,6 +67,20 @@ dependencies:
|
|
53
67
|
- - ">="
|
54
68
|
- !ruby/object:Gem::Version
|
55
69
|
version: '0'
|
70
|
+
- !ruby/object:Gem::Dependency
|
71
|
+
name: rake
|
72
|
+
requirement: !ruby/object:Gem::Requirement
|
73
|
+
requirements:
|
74
|
+
- - ">="
|
75
|
+
- !ruby/object:Gem::Version
|
76
|
+
version: '0'
|
77
|
+
type: :development
|
78
|
+
prerelease: false
|
79
|
+
version_requirements: !ruby/object:Gem::Requirement
|
80
|
+
requirements:
|
81
|
+
- - ">="
|
82
|
+
- !ruby/object:Gem::Version
|
83
|
+
version: '0'
|
56
84
|
- !ruby/object:Gem::Dependency
|
57
85
|
name: rspec
|
58
86
|
requirement: !ruby/object:Gem::Requirement
|
@@ -67,6 +95,34 @@ dependencies:
|
|
67
95
|
- - ">="
|
68
96
|
- !ruby/object:Gem::Version
|
69
97
|
version: '0'
|
98
|
+
- !ruby/object:Gem::Dependency
|
99
|
+
name: rubocop
|
100
|
+
requirement: !ruby/object:Gem::Requirement
|
101
|
+
requirements:
|
102
|
+
- - "~>"
|
103
|
+
- !ruby/object:Gem::Version
|
104
|
+
version: 0.72.0
|
105
|
+
type: :development
|
106
|
+
prerelease: false
|
107
|
+
version_requirements: !ruby/object:Gem::Requirement
|
108
|
+
requirements:
|
109
|
+
- - "~>"
|
110
|
+
- !ruby/object:Gem::Version
|
111
|
+
version: 0.72.0
|
112
|
+
- !ruby/object:Gem::Dependency
|
113
|
+
name: rubocop-rspec
|
114
|
+
requirement: !ruby/object:Gem::Requirement
|
115
|
+
requirements:
|
116
|
+
- - ">="
|
117
|
+
- !ruby/object:Gem::Version
|
118
|
+
version: '0'
|
119
|
+
type: :development
|
120
|
+
prerelease: false
|
121
|
+
version_requirements: !ruby/object:Gem::Requirement
|
122
|
+
requirements:
|
123
|
+
- - ">="
|
124
|
+
- !ruby/object:Gem::Version
|
125
|
+
version: '0'
|
70
126
|
description: A Ruby implementation of Apollo Federation
|
71
127
|
email:
|
72
128
|
- noa.elad@gusto.com
|