graphlient 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 +5 -0
- data/README.md +18 -8
- data/lib/graphlient/adapters/http/faraday_adapter.rb +1 -1
- data/lib/graphlient/query.rb +49 -13
- data/lib/graphlient/version.rb +1 -1
- data/spec/graphlient/client_query_spec.rb +11 -11
- data/spec/graphlient/query_spec.rb +14 -1
- data/spec/graphlient/static_client_query_spec.rb +3 -3
- data/spec/support/dummy_app.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cd0db2077a31028524926bedc3c7ac54c5f3e6eb
|
4
|
+
data.tar.gz: d78c92a97b670680fc056c0996c975ee7a9df80c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c00966fb20008a0b9524c46b24a249d4551aef3d8543855e923ce6f2c40b71fefa8cb68874fbc660e90d7c8fd196b8c1dc3376a2e641968f83de271629ce016d
|
7
|
+
data.tar.gz: 183d86c88b7344be098af445c96504dc866271cd1210b7d4e1b57da446dff1c919be8cebe79592c936792952d42257a1c23a9506442bdf1302e8e63b120c1501
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,8 @@
|
|
1
|
+
### 0.2.0 (11/09/2017)
|
2
|
+
|
3
|
+
* [#33](https://github.com/ashkan18/graphlient/pull/33): Added dsl for supporting parametrized queries/mutations - [@ashkan18](https://github.com/ashkan18).
|
4
|
+
* [#34](https://github.com/ashkan18/graphlient/issues/34): Fix: don't convert variables to `String` - [@dblock](https://github.com/dblock).
|
5
|
+
|
1
6
|
### 0.1.0 (10/27/2017)
|
2
7
|
|
3
8
|
* [#31](https://github.com/ashkan18/graphlient/issues/31): Fix: catch execution errors that don't contain field names - [@dblock](https://github.com/dblock).
|
data/README.md
CHANGED
@@ -144,21 +144,31 @@ With a block.
|
|
144
144
|
|
145
145
|
```ruby
|
146
146
|
client.query(ids: [42]) do
|
147
|
-
query(
|
148
|
-
invoices(ids:
|
147
|
+
query(ids: [:int]) do
|
148
|
+
invoices(ids: :ids) do
|
149
149
|
id
|
150
150
|
fee_in_cents
|
151
151
|
end
|
152
152
|
end
|
153
153
|
end
|
154
154
|
```
|
155
|
+
Graphlient supports following Scalar types for parameterized queries by default:
|
156
|
+
- `:id` maps to `ID`
|
157
|
+
- `:boolean` maps to `Boolean`
|
158
|
+
- `:float` maps to `Float`
|
159
|
+
- `:int` maps to `Int`
|
160
|
+
- `:string` maps to `String`
|
161
|
+
|
162
|
+
You can use any of the above types with `!` to make it required or use them in `[]` for array parameters.
|
163
|
+
|
164
|
+
For any other costume types, graphlient will simply use `to_s` of the symbol provided for the type, so `query(ids: [:InvoiceType!])` will result in `query($ids: [InvoiceType!])`.
|
155
165
|
|
156
166
|
The following mutation accepts a custom type that requires `fee_in_cents`.
|
157
167
|
|
158
168
|
```ruby
|
159
169
|
client.query(input: { fee_in_cents: 12_345 }) do
|
160
|
-
mutation(
|
161
|
-
createInvoice(input:
|
170
|
+
mutation(input: :createInvoiceInput!) do
|
171
|
+
createInvoice(input: :input) do
|
162
172
|
id
|
163
173
|
fee_in_cents
|
164
174
|
end
|
@@ -174,8 +184,8 @@ You can `parse` and `execute` queries separately with optional variables. This i
|
|
174
184
|
```ruby
|
175
185
|
# parse a query, returns a GraphQL::Client::OperationDefinition
|
176
186
|
query = client.parse do
|
177
|
-
query(
|
178
|
-
invoices(ids:
|
187
|
+
query(ids: [:int]) do
|
188
|
+
invoices(ids: :ids) do
|
179
189
|
id
|
180
190
|
fee_in_cents
|
181
191
|
end
|
@@ -214,8 +224,8 @@ Define a query.
|
|
214
224
|
```ruby
|
215
225
|
module SWAPI
|
216
226
|
InvoiceQuery = Client.parse do
|
217
|
-
query(
|
218
|
-
invoice(id:
|
227
|
+
query(id: :int) do
|
228
|
+
invoice(id: :id) do
|
219
229
|
id
|
220
230
|
fee_in_cents
|
221
231
|
end
|
data/lib/graphlient/query.rb
CHANGED
@@ -1,15 +1,32 @@
|
|
1
1
|
module Graphlient
|
2
2
|
class Query
|
3
|
+
SCALAR_TYPES = {
|
4
|
+
int: 'Int',
|
5
|
+
float: 'Float',
|
6
|
+
string: 'String',
|
7
|
+
boolean: 'Boolean'
|
8
|
+
}.freeze
|
9
|
+
|
10
|
+
ROOT_NODES = %w(query mutation subscription).freeze
|
11
|
+
|
3
12
|
attr_accessor :query_str
|
4
13
|
|
5
14
|
def initialize(&block)
|
6
15
|
@indents = 0
|
7
16
|
@query_str = ''
|
17
|
+
@variables = []
|
8
18
|
instance_eval(&block)
|
9
19
|
end
|
10
20
|
|
11
21
|
def method_missing(m, *args, &block)
|
12
|
-
|
22
|
+
append_node(m, args, &block)
|
23
|
+
end
|
24
|
+
|
25
|
+
ROOT_NODES.each do |root_node|
|
26
|
+
define_method(root_node) do |*args, &block|
|
27
|
+
@variables = args.first unless args.empty?
|
28
|
+
append_node(root_node, args, arg_processor: ->(k, v) { "$#{k}: #{variable_string(v)}" }, &block)
|
29
|
+
end
|
13
30
|
end
|
14
31
|
|
15
32
|
def respond_to_missing?(m, include_private = false)
|
@@ -22,11 +39,12 @@ module Graphlient
|
|
22
39
|
|
23
40
|
private
|
24
41
|
|
25
|
-
def
|
42
|
+
def append_node(node, args, arg_processor: nil, &block)
|
26
43
|
# add field
|
27
|
-
@query_str << "\n#{indent}#{
|
44
|
+
@query_str << "\n#{indent}#{node}"
|
28
45
|
# add filter
|
29
|
-
|
46
|
+
hash_arguments = hash_arg(args)
|
47
|
+
@query_str << "(#{args_str(hash_arguments, arg_processor: arg_processor)})" if hash_arguments
|
30
48
|
|
31
49
|
if block_given?
|
32
50
|
@indents += 1
|
@@ -43,28 +61,46 @@ module Graphlient
|
|
43
61
|
' ' * @indents
|
44
62
|
end
|
45
63
|
|
46
|
-
def
|
47
|
-
|
64
|
+
def hash_arg(args)
|
65
|
+
args.detect { |arg| arg.is_a? Hash }
|
66
|
+
end
|
67
|
+
|
68
|
+
def args_str(hash_args, arg_processor: nil)
|
69
|
+
hash_args.map do |k, v|
|
70
|
+
arg_processor ? arg_processor.call(k, v) : argument_string(k, v)
|
71
|
+
end.join(', ')
|
48
72
|
end
|
49
73
|
|
50
|
-
def
|
51
|
-
|
74
|
+
def argument_string(k, v)
|
75
|
+
"#{k}: #{argument_value_string(v)}"
|
52
76
|
end
|
53
77
|
|
54
|
-
def
|
55
|
-
|
78
|
+
def variable_string(v)
|
79
|
+
case v
|
80
|
+
when :id, :id!
|
81
|
+
v.to_s.upcase
|
82
|
+
when ->(value) { SCALAR_TYPES.key?(value.to_s.delete('!').to_sym) }
|
83
|
+
# scalar types
|
84
|
+
v.to_s.camelize
|
85
|
+
when Array
|
86
|
+
"[#{variable_string(v.first)}]"
|
87
|
+
else
|
88
|
+
v.to_s
|
89
|
+
end
|
56
90
|
end
|
57
91
|
|
58
|
-
def
|
92
|
+
def argument_value_string(value)
|
59
93
|
case value
|
60
94
|
when String
|
61
95
|
"\"#{value}\""
|
62
96
|
when Numeric
|
63
97
|
value.to_s
|
64
98
|
when Array
|
65
|
-
"[#{value.map { |v|
|
99
|
+
"[#{value.map { |v| argument_value_string(v) }.join(', ')}]"
|
66
100
|
when Hash
|
67
|
-
"{ #{
|
101
|
+
"{ #{value.map { |k, v| "#{k}: #{argument_value_string(v)}" }.join(', ')} }"
|
102
|
+
when Symbol
|
103
|
+
@variables.keys.include?(value) ? "$#{value}" : value.to_s.camelize(:lower)
|
68
104
|
else
|
69
105
|
value
|
70
106
|
end
|
data/lib/graphlient/version.rb
CHANGED
@@ -30,8 +30,8 @@ describe Graphlient::Client do
|
|
30
30
|
context 'parameterized query' do
|
31
31
|
let(:query) do
|
32
32
|
client.parse do
|
33
|
-
query(
|
34
|
-
invoices(ids:
|
33
|
+
query(some_ids: [:int]) do
|
34
|
+
invoices(ids: :some_ids) do
|
35
35
|
id
|
36
36
|
fee_in_cents
|
37
37
|
end
|
@@ -44,7 +44,7 @@ describe Graphlient::Client do
|
|
44
44
|
end
|
45
45
|
|
46
46
|
it '#execute' do
|
47
|
-
response = client.execute(query,
|
47
|
+
response = client.execute(query, some_ids: [42])
|
48
48
|
invoices = response.data.invoices
|
49
49
|
expect(invoices.first.id).to eq 42
|
50
50
|
expect(invoices.first.fee_in_cents).to eq 20_000
|
@@ -162,8 +162,8 @@ describe Graphlient::Client do
|
|
162
162
|
it 'fails when missing input' do
|
163
163
|
expect do
|
164
164
|
client.query do
|
165
|
-
mutation(
|
166
|
-
createInvoice(input:
|
165
|
+
mutation(input: :createInvoiceInput!) do
|
166
|
+
createInvoice(input: :input) do
|
167
167
|
id
|
168
168
|
fee_in_cents
|
169
169
|
end
|
@@ -175,8 +175,8 @@ describe Graphlient::Client do
|
|
175
175
|
|
176
176
|
it 'returns a response from a query' do
|
177
177
|
response = client.query(ids: [42]) do
|
178
|
-
query(
|
179
|
-
invoices(ids:
|
178
|
+
query(ids: [:int]) do
|
179
|
+
invoices(ids: :ids) do
|
180
180
|
id
|
181
181
|
fee_in_cents
|
182
182
|
end
|
@@ -190,8 +190,8 @@ describe Graphlient::Client do
|
|
190
190
|
|
191
191
|
it 'executes the mutation' do
|
192
192
|
response = client.query(input: { fee_in_cents: 12_345 }) do
|
193
|
-
mutation(
|
194
|
-
createInvoice(input:
|
193
|
+
mutation(input: :createInvoiceInput!) do
|
194
|
+
createInvoice(input: :input) do
|
195
195
|
id
|
196
196
|
fee_in_cents
|
197
197
|
end
|
@@ -206,8 +206,8 @@ describe Graphlient::Client do
|
|
206
206
|
it 'fails when mutation missing a field' do
|
207
207
|
expect do
|
208
208
|
client.query(input: {}) do
|
209
|
-
mutation(
|
210
|
-
createInvoice(input:
|
209
|
+
mutation(input: :createInvoiceInput!) do
|
210
|
+
createInvoice(input: :input) do
|
211
211
|
id
|
212
212
|
fee_in_cents
|
213
213
|
end
|
@@ -51,7 +51,7 @@ describe Graphlient::Query do
|
|
51
51
|
expect(query.to_s).to eq "query{\n invoice(id: 10, threshold: 10.3, item_list: [\"str_item\", 2]){\n line_items(name: \"new name\")\n }\n }"
|
52
52
|
end
|
53
53
|
|
54
|
-
it 'returns proper query
|
54
|
+
it 'returns proper query' do
|
55
55
|
query = Graphlient::Query.new do
|
56
56
|
query do
|
57
57
|
invoice(id: 10) do
|
@@ -63,6 +63,19 @@ describe Graphlient::Query do
|
|
63
63
|
end
|
64
64
|
expect(query.to_s).to eq "query{\n invoice(id: 10){\n line_items{\n line_item_type\n }\n }\n }"
|
65
65
|
end
|
66
|
+
|
67
|
+
it 'returns proper query with query variables' do
|
68
|
+
query = Graphlient::Query.new do
|
69
|
+
query(invoice_id: :int, names: [:string!]) do
|
70
|
+
invoice(id: :invoice_id, name: :names) do
|
71
|
+
line_items do
|
72
|
+
line_item_type
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
expect(query.to_s).to eq "query($invoice_id: Int, $names: [String!]){\n invoice(id: $invoice_id, name: $names){\n line_items{\n line_item_type\n }\n }\n }"
|
78
|
+
end
|
66
79
|
end
|
67
80
|
|
68
81
|
context 'mutation' do
|
@@ -16,8 +16,8 @@ describe Graphlient::Client do
|
|
16
16
|
end
|
17
17
|
|
18
18
|
Query = Client.parse do
|
19
|
-
query(
|
20
|
-
invoices(ids:
|
19
|
+
query(some_ids: [:int]) do
|
20
|
+
invoices(ids: :some_ids) do
|
21
21
|
id
|
22
22
|
fee_in_cents
|
23
23
|
end
|
@@ -30,7 +30,7 @@ describe Graphlient::Client do
|
|
30
30
|
end
|
31
31
|
|
32
32
|
it '#execute' do
|
33
|
-
response = Graphlient::Client::Spec::Client.execute(Graphlient::Client::Spec::Query,
|
33
|
+
response = Graphlient::Client::Spec::Client.execute(Graphlient::Client::Spec::Query, some_ids: [42])
|
34
34
|
invoices = response.data.invoices
|
35
35
|
expect(invoices.first.id).to eq 42
|
36
36
|
expect(invoices.first.fee_in_cents).to eq 20_000
|
data/spec/support/dummy_app.rb
CHANGED
@@ -12,7 +12,7 @@ post '/graphql' do
|
|
12
12
|
headers['Content-Type'] = 'application/json'
|
13
13
|
DummySchema.execute(
|
14
14
|
params[:query],
|
15
|
-
variables: params[:variables]
|
15
|
+
variables: params[:variables] || {},
|
16
16
|
context: {},
|
17
17
|
operation_name: params[:operationName]
|
18
18
|
).to_json
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: graphlient
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ashkan Nasseri
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-11-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: graphql-client
|