artemis 0.8.0 → 1.0.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/.github/workflows/ruby.yml +21 -6
- data/Appraisals +21 -3
- data/CHANGELOG.md +35 -4
- data/artemis.gemspec +1 -1
- data/bin/console +3 -3
- data/gemfiles/graphql_2_0.gemfile +15 -0
- data/gemfiles/rails_60.gemfile +3 -3
- data/gemfiles/rails_71.gemfile +14 -0
- data/gemfiles/rails_edge.gemfile +1 -0
- data/lib/artemis/adapters/net_http_persistent_adapter.rb +6 -0
- data/lib/artemis/railtie.rb +1 -1
- data/lib/artemis/version.rb +1 -1
- data/spec/adapters_spec.rb +9 -2
- data/spec/autoloading_spec.rb +55 -49
- data/spec/callbacks_spec.rb +6 -6
- data/spec/client_spec.rb +84 -78
- data/spec/endpoint_spec.rb +11 -7
- data/spec/fixtures/github/_repository_fields.graphql +12 -0
- data/spec/fixtures/github/repository.graphql +6 -0
- data/spec/fixtures/github/schema.json +165225 -0
- data/spec/fixtures/github/user.graphql +6 -0
- data/spec/fixtures/github/user_repositories.graphql +13 -0
- data/spec/fixtures/github.rb +2 -0
- data/spec/fixtures/responses/github/repository.yml +17 -0
- data/spec/fixtures/responses/github/user.json +10 -0
- data/spec/spec_helper.rb +3 -3
- data/spec/test_helper_spec.rb +32 -32
- metadata +15 -13
- data/spec/fixtures/metaphysics/_artist_fields.graphql +0 -4
- data/spec/fixtures/metaphysics/artist.graphql +0 -7
- data/spec/fixtures/metaphysics/artists.graphql +0 -8
- data/spec/fixtures/metaphysics/artwork.graphql +0 -8
- data/spec/fixtures/metaphysics/schema.json +0 -49811
- data/spec/fixtures/metaphysics.rb +0 -2
- data/spec/fixtures/responses/metaphysics/artist.yml +0 -24
- data/spec/fixtures/responses/metaphysics/artwork.json +0 -12
data/spec/client_spec.rb
CHANGED
@@ -5,119 +5,128 @@ describe GraphQL::Client do
|
|
5
5
|
|
6
6
|
describe ".lookup_graphql_file" do
|
7
7
|
it "returns the path to the matching graph file" do
|
8
|
-
expect(
|
8
|
+
expect(Github.resolve_graphql_file_path("user")).to eq("#{PROJECT_DIR}/spec/fixtures/github/user.graphql")
|
9
9
|
end
|
10
10
|
|
11
11
|
it "returns nil if the file is missing" do
|
12
|
-
expect(
|
12
|
+
expect(Github.resolve_graphql_file_path("does_not_exist")).to be_nil
|
13
13
|
end
|
14
14
|
end
|
15
15
|
|
16
16
|
describe ".graphql_file_paths" do
|
17
17
|
it "returns a list of GraphQL files (*.graphql) in the query_paths" do
|
18
|
-
|
19
|
-
original =
|
18
|
+
Github.instance_variable_set :@graphql_file_paths, nil
|
19
|
+
original = Github.query_paths
|
20
20
|
|
21
|
-
|
21
|
+
Github.query_paths = [File.join(PROJECT_DIR, 'tmp')]
|
22
22
|
|
23
23
|
begin
|
24
|
-
FileUtils.mkdir "./tmp/
|
24
|
+
FileUtils.mkdir "./tmp/github" if !Dir.exist?("./tmp/github")
|
25
25
|
|
26
|
-
with_files "./tmp/
|
27
|
-
expect(
|
26
|
+
with_files "./tmp/github/text.txt", "./tmp/github/sale.graphql" do
|
27
|
+
expect(Github.graphql_file_paths).to eq(["#{PROJECT_DIR}/tmp/github/sale.graphql"])
|
28
28
|
end
|
29
29
|
ensure
|
30
|
-
|
31
|
-
|
30
|
+
Github.instance_variable_set :@graphql_file_paths, nil
|
31
|
+
Github.query_paths = original
|
32
32
|
end
|
33
33
|
end
|
34
34
|
end
|
35
35
|
|
36
36
|
it "can make a GraphQL request without variables" do
|
37
|
-
|
37
|
+
Github.user
|
38
38
|
|
39
39
|
request = requests[0]
|
40
40
|
|
41
|
-
expect(request.operation_name).to eq('
|
41
|
+
expect(request.operation_name).to eq('Github__User')
|
42
42
|
expect(request.variables).to be_empty
|
43
43
|
expect(request.context).to eq({})
|
44
44
|
expect(request.document.to_query_string).to eq(<<~GRAPHQL.strip)
|
45
|
-
query
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
name
|
50
|
-
}
|
45
|
+
query Github__User {
|
46
|
+
user(login: "yuki24") {
|
47
|
+
id
|
48
|
+
name
|
51
49
|
}
|
52
50
|
}
|
53
51
|
GRAPHQL
|
54
52
|
end
|
55
53
|
|
56
54
|
it "can make a GraphQL request with variables" do
|
57
|
-
|
55
|
+
Github.repository(owner: "yuki24", name: "artemis")
|
58
56
|
|
59
57
|
request = requests[0]
|
60
58
|
|
61
|
-
expect(request.operation_name).to eq('
|
62
|
-
expect(request.variables).to eq(
|
59
|
+
expect(request.operation_name).to eq('Github__Repository')
|
60
|
+
expect(request.variables).to eq("owner" => "yuki24", "name" => "artemis")
|
63
61
|
expect(request.context).to eq({})
|
64
62
|
expect(request.document.to_query_string).to eq(<<~GRAPHQL.strip)
|
65
|
-
query
|
66
|
-
|
63
|
+
query Github__Repository($owner: String!, $name: String!) {
|
64
|
+
repository(owner: $owner, name: $name) {
|
67
65
|
name
|
68
|
-
|
69
|
-
birthday
|
66
|
+
nameWithOwner
|
70
67
|
}
|
71
68
|
}
|
72
69
|
GRAPHQL
|
73
70
|
end
|
74
71
|
|
75
72
|
it "can make a GraphQL request with a query that contains fragments" do
|
76
|
-
|
73
|
+
Github.user_repositories(login: "yuki24", size: 10)
|
77
74
|
|
78
75
|
request = requests[0]
|
79
76
|
|
80
|
-
expect(request.operation_name).to eq('
|
81
|
-
expect(request.variables).to eq('size' => 10)
|
77
|
+
expect(request.operation_name).to eq('Github__UserRepositories')
|
78
|
+
expect(request.variables).to eq('login' => 'yuki24', 'size' => 10)
|
82
79
|
expect(request.context).to eq({})
|
83
80
|
expect(request.document.to_query_string).to eq(<<~GRAPHQL.strip)
|
84
|
-
query
|
85
|
-
|
81
|
+
query Github__UserRepositories($login: String!, $size: Int!) {
|
82
|
+
user(login: $login) {
|
83
|
+
id
|
86
84
|
name
|
87
|
-
|
88
|
-
|
89
|
-
|
85
|
+
repositories(first: $size) {
|
86
|
+
nodes {
|
87
|
+
name
|
88
|
+
description
|
89
|
+
...Github__RepositoryFields
|
90
|
+
}
|
91
|
+
}
|
90
92
|
}
|
91
93
|
}
|
92
94
|
|
93
|
-
fragment
|
94
|
-
|
95
|
-
|
95
|
+
fragment Github__RepositoryFields on Repository {
|
96
|
+
name
|
97
|
+
nameWithOwner
|
98
|
+
url
|
99
|
+
updatedAt
|
100
|
+
languages(first: 1) {
|
101
|
+
nodes {
|
102
|
+
name
|
103
|
+
color
|
104
|
+
}
|
105
|
+
}
|
96
106
|
}
|
97
107
|
GRAPHQL
|
98
108
|
end
|
99
109
|
|
100
110
|
it "can make a GraphQL request with #execute" do
|
101
|
-
|
111
|
+
Github.execute(:repository, owner: "yuki24", name: "artemis")
|
102
112
|
|
103
113
|
request = requests[0]
|
104
114
|
|
105
|
-
expect(request.operation_name).to eq('
|
106
|
-
expect(request.variables).to eq(
|
115
|
+
expect(request.operation_name).to eq('Github__Repository')
|
116
|
+
expect(request.variables).to eq("owner" => "yuki24", "name" => "artemis")
|
107
117
|
expect(request.context).to eq({})
|
108
118
|
expect(request.document.to_query_string).to eq(<<~GRAPHQL.strip)
|
109
|
-
query
|
110
|
-
|
119
|
+
query Github__Repository($owner: String!, $name: String!) {
|
120
|
+
repository(owner: $owner, name: $name) {
|
111
121
|
name
|
112
|
-
|
113
|
-
birthday
|
122
|
+
nameWithOwner
|
114
123
|
}
|
115
124
|
}
|
116
125
|
GRAPHQL
|
117
126
|
end
|
118
127
|
|
119
|
-
it "
|
120
|
-
expect {
|
128
|
+
it "raises an error when the specified graphql file does not exist" do
|
129
|
+
expect { Github.execute(:does_not_exist) }
|
121
130
|
.to raise_error(Artemis::GraphQLFileNotFound)
|
122
131
|
.with_message(/Query does_not_exist\.graphql not found/)
|
123
132
|
end
|
@@ -125,17 +134,17 @@ describe GraphQL::Client do
|
|
125
134
|
it "assigns context to the request when provided as an argument" do
|
126
135
|
context = { headers: { Authorization: 'bearer ...' } }
|
127
136
|
|
128
|
-
|
137
|
+
Github.repository(owner: "yuki24", name: "artemis", context: context)
|
129
138
|
|
130
139
|
expect(requests[0].context).to eq(context)
|
131
140
|
end
|
132
141
|
|
133
142
|
it "can create a client that always assigns the provided context to the request" do
|
134
143
|
context = { headers: { Authorization: 'bearer ...' } }
|
135
|
-
client =
|
144
|
+
client = Github.with_context(context)
|
136
145
|
|
137
|
-
client.
|
138
|
-
client.
|
146
|
+
client.repository(owner: "yuki24", name: "artemis")
|
147
|
+
client.repository(owner: "yuki24", name: "artemis")
|
139
148
|
|
140
149
|
expect(requests[0].context).to eq(context)
|
141
150
|
expect(requests[1].context).to eq(context)
|
@@ -143,21 +152,21 @@ describe GraphQL::Client do
|
|
143
152
|
|
144
153
|
it "assigns the default context to a GraphQL request if present" do
|
145
154
|
begin
|
146
|
-
|
147
|
-
|
155
|
+
Github.default_context = { headers: { Authorization: 'bearer ...' } }
|
156
|
+
Github.repository(owner: "yuki24", name: "artemis")
|
148
157
|
|
149
158
|
expect(requests[0].context).to eq(headers: { Authorization: 'bearer ...' })
|
150
159
|
ensure
|
151
|
-
|
160
|
+
Github.default_context = { }
|
152
161
|
end
|
153
162
|
end
|
154
163
|
|
155
164
|
it "can make a GraphQL request with all of .default_context, with_context(...) and the :context argument" do
|
156
165
|
begin
|
157
|
-
|
158
|
-
|
166
|
+
Github.default_context = { headers: { 'User-Agent': 'Artemis', 'X-key': 'value', Authorization: 'token ...' } }
|
167
|
+
Github
|
159
168
|
.with_context({ headers: { 'X-key': 'overridden' } })
|
160
|
-
.
|
169
|
+
.repository(owner: "yuki24", name: "artemis", context: { headers: { Authorization: 'bearer ...' } })
|
161
170
|
|
162
171
|
expect(requests[0].context).to eq(
|
163
172
|
headers: {
|
@@ -167,41 +176,38 @@ describe GraphQL::Client do
|
|
167
176
|
}
|
168
177
|
)
|
169
178
|
ensure
|
170
|
-
|
179
|
+
Github.default_context = { }
|
171
180
|
end
|
172
181
|
end
|
173
182
|
|
174
183
|
it "can batch multiple requests using Multiplex" do
|
175
|
-
|
176
|
-
queue.
|
177
|
-
queue.
|
184
|
+
Github.multiplex do |queue|
|
185
|
+
queue.repository(owner: "yuki24", name: "artemis", context: { headers: { Authorization: 'bearer ...' } })
|
186
|
+
queue.user
|
178
187
|
end
|
179
188
|
|
180
|
-
|
189
|
+
repository_query, user_query = requests[0].queries
|
181
190
|
|
182
|
-
expect(
|
183
|
-
expect(
|
184
|
-
expect(
|
185
|
-
expect(
|
186
|
-
query
|
187
|
-
|
191
|
+
expect(repository_query[:operationName]).to eq('Github__Repository')
|
192
|
+
expect(repository_query[:variables]).to eq("owner" => "yuki24", "name" => "artemis")
|
193
|
+
expect(repository_query[:context]).to eq({ headers: { Authorization: 'bearer ...' } })
|
194
|
+
expect(repository_query[:query]).to eq(<<~GRAPHQL.strip)
|
195
|
+
query Github__Repository($owner: String!, $name: String!) {
|
196
|
+
repository(owner: $owner, name: $name) {
|
188
197
|
name
|
189
|
-
|
190
|
-
birthday
|
198
|
+
nameWithOwner
|
191
199
|
}
|
192
200
|
}
|
193
201
|
GRAPHQL
|
194
202
|
|
195
|
-
expect(
|
196
|
-
expect(
|
197
|
-
expect(
|
198
|
-
expect(
|
199
|
-
query
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
name
|
204
|
-
}
|
203
|
+
expect(user_query[:operationName]).to eq('Github__User')
|
204
|
+
expect(user_query[:variables]).to be_empty
|
205
|
+
expect(user_query[:context]).to eq({})
|
206
|
+
expect(user_query[:query]).to eq(<<~GRAPHQL.strip)
|
207
|
+
query Github__User {
|
208
|
+
user(login: "yuki24") {
|
209
|
+
id
|
210
|
+
name
|
205
211
|
}
|
206
212
|
}
|
207
213
|
GRAPHQL
|
data/spec/endpoint_spec.rb
CHANGED
@@ -1,4 +1,8 @@
|
|
1
1
|
describe Artemis::GraphQLEndpoint do
|
2
|
+
after do
|
3
|
+
Artemis::GraphQLEndpoint.const_get(:ENDPOINT_INSTANCES).delete("gitlab")
|
4
|
+
end
|
5
|
+
|
2
6
|
describe ".lookup" do
|
3
7
|
it "raises an exception when the service is missing" do
|
4
8
|
expect { Artemis::GraphQLEndpoint.lookup(:does_not_exit) }.to raise_error(Artemis::EndpointNotFound)
|
@@ -6,18 +10,18 @@ describe Artemis::GraphQLEndpoint do
|
|
6
10
|
end
|
7
11
|
|
8
12
|
it "can register an endpoint" do
|
9
|
-
endpoint = Artemis::GraphQLEndpoint.register!(:
|
13
|
+
endpoint = Artemis::GraphQLEndpoint.register!(:gitlab, url: "https://api.gitlab.com/graphql")
|
10
14
|
|
11
|
-
expect(endpoint.url).to eq("https://api.
|
15
|
+
expect(endpoint.url).to eq("https://api.gitlab.com/graphql")
|
12
16
|
expect(endpoint.connection).to be_instance_of(Artemis::Adapters::NetHttpAdapter)
|
13
17
|
end
|
14
18
|
|
15
19
|
it "can look up a registered endpoint" do
|
16
|
-
Artemis::GraphQLEndpoint.register!(:
|
20
|
+
Artemis::GraphQLEndpoint.register!(:gitlab, url: "https://api.gitlab.com/graphql")
|
17
21
|
|
18
|
-
endpoint = Artemis::GraphQLEndpoint.lookup(:
|
22
|
+
endpoint = Artemis::GraphQLEndpoint.lookup(:gitlab)
|
19
23
|
|
20
|
-
expect(endpoint.url).to eq("https://api.
|
24
|
+
expect(endpoint.url).to eq("https://api.gitlab.com/graphql")
|
21
25
|
expect(endpoint.connection).to be_instance_of(Artemis::Adapters::NetHttpAdapter) # Not a fan of this test but for now
|
22
26
|
|
23
27
|
# FIXME: This #schema method makes a network call.
|
@@ -32,9 +36,9 @@ describe Artemis::GraphQLEndpoint do
|
|
32
36
|
pool_size: 25,
|
33
37
|
}
|
34
38
|
|
35
|
-
endpoint = Artemis::GraphQLEndpoint.register!(:
|
39
|
+
endpoint = Artemis::GraphQLEndpoint.register!(:gitlab, url: "https://api.gitlab.com/graphql", **options)
|
36
40
|
|
37
|
-
expect(endpoint.url).to eq("https://api.
|
41
|
+
expect(endpoint.url).to eq("https://api.gitlab.com/graphql")
|
38
42
|
expect(endpoint.timeout).to eq(10)
|
39
43
|
expect(endpoint.pool_size).to eq(25)
|
40
44
|
expect(endpoint.connection).to be_instance_of(Artemis::Adapters::TestAdapter) # Not a fan of this test but for now
|