graphql_connector 1.3.1 → 1.4.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/ISSUE_TEMPLATE/bug_report.md +38 -0
- data/.github/ISSUE_TEMPLATE/feature_request.md +20 -0
- data/.github/workflows/ci.yaml +1 -1
- data/.rubocop.yml +2 -0
- data/CHANGELOG.md +4 -0
- data/Gemfile.lock +14 -14
- data/README.md +62 -23
- data/lib/graphql_connector/base_server_type.rb +9 -6
- data/lib/graphql_connector/configuration.rb +2 -2
- data/lib/graphql_connector/http_client.rb +19 -15
- data/lib/graphql_connector/service_classable/queryable.rb +49 -67
- data/lib/graphql_connector/version.rb +1 -1
- metadata +4 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 99e1add1eb99f9dd85020d90caf9b0cc73e9c8aca660fb8e56f425aa059254f3
|
|
4
|
+
data.tar.gz: 7300a5b796cfd0f0ecba9d5af17d365504e722b759bd97bb2914c2623dfdaa32
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 9a46cbb39e8f3ccc7a79dbf47bd1437e1bc775f6a4b592dc1b52dec21a9ebca72e1ebb4a78c781ce2ed69ef35702f725480b20ba22765da9aea4a965a9f99700
|
|
7
|
+
data.tar.gz: 4ae66cde11f69d1f4c8c4bab379a8251516f4b63562c427246b62044c2a26bc9e31be6bb13fd41435879c4693260f4b653b25b98f78dc88f5e2c52fc7a69ccd1
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Bug report
|
|
3
|
+
about: Create a report to help us improve
|
|
4
|
+
title: ''
|
|
5
|
+
labels: ''
|
|
6
|
+
assignees: ''
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
**Describe the bug**
|
|
11
|
+
A clear and concise description of what the bug is.
|
|
12
|
+
|
|
13
|
+
**To Reproduce**
|
|
14
|
+
Steps to reproduce the behavior:
|
|
15
|
+
1. Go to '...'
|
|
16
|
+
2. Click on '....'
|
|
17
|
+
3. Scroll down to '....'
|
|
18
|
+
4. See error
|
|
19
|
+
|
|
20
|
+
**Expected behavior**
|
|
21
|
+
A clear and concise description of what you expected to happen.
|
|
22
|
+
|
|
23
|
+
**Screenshots**
|
|
24
|
+
If applicable, add screenshots to help explain your problem.
|
|
25
|
+
|
|
26
|
+
**Desktop (please complete the following information):**
|
|
27
|
+
- OS: [e.g. iOS]
|
|
28
|
+
- Browser [e.g. chrome, safari]
|
|
29
|
+
- Version [e.g. 22]
|
|
30
|
+
|
|
31
|
+
**Smartphone (please complete the following information):**
|
|
32
|
+
- Device: [e.g. iPhone6]
|
|
33
|
+
- OS: [e.g. iOS8.1]
|
|
34
|
+
- Browser [e.g. stock browser, safari]
|
|
35
|
+
- Version [e.g. 22]
|
|
36
|
+
|
|
37
|
+
**Additional context**
|
|
38
|
+
Add any other context about the problem here.
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Feature request
|
|
3
|
+
about: Suggest an idea for this project
|
|
4
|
+
title: ''
|
|
5
|
+
labels: ''
|
|
6
|
+
assignees: ''
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
**Is your feature request related to a problem? Please describe.**
|
|
11
|
+
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
|
|
12
|
+
|
|
13
|
+
**Describe the solution you'd like**
|
|
14
|
+
A clear and concise description of what you want to happen.
|
|
15
|
+
|
|
16
|
+
**Describe alternatives you've considered**
|
|
17
|
+
A clear and concise description of any alternative solutions or features you've considered.
|
|
18
|
+
|
|
19
|
+
**Additional context**
|
|
20
|
+
Add any other context or screenshots about the feature request here.
|
data/.github/workflows/ci.yaml
CHANGED
data/.rubocop.yml
CHANGED
data/CHANGELOG.md
CHANGED
data/Gemfile.lock
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
PATH
|
|
2
2
|
remote: .
|
|
3
3
|
specs:
|
|
4
|
-
graphql_connector (1.
|
|
4
|
+
graphql_connector (1.4.0)
|
|
5
5
|
httparty (~> 0.16)
|
|
6
6
|
|
|
7
7
|
GEM
|
|
@@ -9,7 +9,7 @@ GEM
|
|
|
9
9
|
specs:
|
|
10
10
|
ast (2.4.0)
|
|
11
11
|
coderay (1.1.2)
|
|
12
|
-
diff-lcs (1.
|
|
12
|
+
diff-lcs (1.5.0)
|
|
13
13
|
httparty (0.18.1)
|
|
14
14
|
mime-types (~> 3.0)
|
|
15
15
|
multi_xml (>= 0.5.2)
|
|
@@ -27,19 +27,19 @@ GEM
|
|
|
27
27
|
method_source (~> 1.0)
|
|
28
28
|
rainbow (3.0.0)
|
|
29
29
|
rexml (3.2.5)
|
|
30
|
-
rspec (3.
|
|
31
|
-
rspec-core (~> 3.
|
|
32
|
-
rspec-expectations (~> 3.
|
|
33
|
-
rspec-mocks (~> 3.
|
|
34
|
-
rspec-core (3.
|
|
35
|
-
rspec-support (~> 3.
|
|
36
|
-
rspec-expectations (3.
|
|
30
|
+
rspec (3.11.0)
|
|
31
|
+
rspec-core (~> 3.11.0)
|
|
32
|
+
rspec-expectations (~> 3.11.0)
|
|
33
|
+
rspec-mocks (~> 3.11.0)
|
|
34
|
+
rspec-core (3.11.0)
|
|
35
|
+
rspec-support (~> 3.11.0)
|
|
36
|
+
rspec-expectations (3.11.0)
|
|
37
37
|
diff-lcs (>= 1.2.0, < 2.0)
|
|
38
|
-
rspec-support (~> 3.
|
|
39
|
-
rspec-mocks (3.
|
|
38
|
+
rspec-support (~> 3.11.0)
|
|
39
|
+
rspec-mocks (3.11.0)
|
|
40
40
|
diff-lcs (>= 1.2.0, < 2.0)
|
|
41
|
-
rspec-support (~> 3.
|
|
42
|
-
rspec-support (3.
|
|
41
|
+
rspec-support (~> 3.11.0)
|
|
42
|
+
rspec-support (3.11.0)
|
|
43
43
|
rubocop (0.82.0)
|
|
44
44
|
jaro_winkler (~> 1.5.1)
|
|
45
45
|
parallel (~> 1.10)
|
|
@@ -62,4 +62,4 @@ DEPENDENCIES
|
|
|
62
62
|
rubocop (~> 0.75)
|
|
63
63
|
|
|
64
64
|
BUNDLED WITH
|
|
65
|
-
2.
|
|
65
|
+
2.3.9
|
data/README.md
CHANGED
|
@@ -30,20 +30,21 @@ Or install it yourself as:
|
|
|
30
30
|
You need to configure the `graphql_connector` first:
|
|
31
31
|
``` ruby
|
|
32
32
|
GraphqlConnector.configure do |config|
|
|
33
|
-
config.add_server(name: 'Foo', uri: 'http://foo.com/api/graphql', headers: {}, connector: {})
|
|
33
|
+
config.add_server(name: 'Foo', uri: 'http://foo.com/api/graphql', headers: {}, connector: {}, httparty_adapter_options: {})
|
|
34
34
|
end
|
|
35
35
|
```
|
|
36
36
|
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
37
|
+
* `name` (**mandatory**): Add a namespace under which the API is reachable. In the above example `'Foo'` means that `GraphqlConnector::Foo` provides API functionality for the configured `add_server`
|
|
38
|
+
|
|
39
|
+
* `uri` (**mandatory**): Add uri of grapqhl API server that accepts **POST** requests.
|
|
40
|
+
|
|
41
|
+
* `connector` (**optionally**): Add a **Authentication Token class** in the following format:
|
|
40
42
|
```ruby
|
|
41
|
-
{ base:
|
|
43
|
+
connector: { base: AuthTokenAgent.instance, method: 'get_authorization_header' }
|
|
42
44
|
```
|
|
43
|
-
|
|
44
|
-
Your method should return a hash like this:
|
|
45
|
+
`base` is an instance of Authentication Token class and `method` represents the function where it gets the token.
|
|
45
46
|
```ruby
|
|
46
|
-
class
|
|
47
|
+
class AuthTokenAgent
|
|
47
48
|
[...]
|
|
48
49
|
def get_authorization_header
|
|
49
50
|
[...]
|
|
@@ -51,9 +52,12 @@ class TokenAgent
|
|
|
51
52
|
end
|
|
52
53
|
end
|
|
53
54
|
```
|
|
55
|
+
:warning: The function under `method` must be a public one in your connector class.<br />
|
|
56
|
+
:warning: When you set a connector, it will override the setting in the headers for Authorization.
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
* `httparty_adapter_options` (**optionally**): Add any [`connection_adapter`](https://github.com/jnunemaker/httparty/blob/master/lib/httparty/connection_adapter.rb) options that `httparty` supports in a hash format e.g. `{ timeout: 4 }`
|
|
54
60
|
|
|
55
|
-
When you set a connector, it will override the setting in the headers for
|
|
56
|
-
Authorization.
|
|
57
61
|
|
|
58
62
|
For each graphql server you wish to query use `add_server`.
|
|
59
63
|
|
|
@@ -71,9 +75,23 @@ See the following sub sections for details
|
|
|
71
75
|
|
|
72
76
|
You can call your graphql_endpoint via:
|
|
73
77
|
```ruby
|
|
74
|
-
GraphqlConnector::<name>.raw_query(
|
|
78
|
+
GraphqlConnector::<name>.raw_query('query { products { id name } }')
|
|
79
|
+
|
|
80
|
+
GraphqlConnector::<name>.raw_query('query { products($id: [ID!]) { products(id: $id) { id name } } }', variables: { id: 1 })
|
|
81
|
+
|
|
82
|
+
GraphqlConnector::<name>.raw_query('mutation { createProduct(name: "Coca-Cola") { id name } }')
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
Or if you want to **override**/**set** any `httparty_adapter_options` it is also possible to pass them in:
|
|
86
|
+
```ruby
|
|
87
|
+
GraphqlConnector::<name>.raw_query('query { products { id name } }', httparty_adapter_options: { timeout: 3, verify: true })
|
|
88
|
+
|
|
89
|
+
GraphqlConnector::<name>.raw_query('query { products($id: [ID!]) { products(id: $id) { id name } } }', variables: { id: 1 }, httparty_adapter_options: { timeout: 3, verify: true })
|
|
90
|
+
|
|
91
|
+
GraphqlConnector::<name>.raw_query('mutation { createProduct(name: "Coca-Cola") { id name } }', httparty_adapter_options: { timeout: 3, verify: true })
|
|
75
92
|
```
|
|
76
93
|
|
|
94
|
+
|
|
77
95
|
Note that `<name>` has to be replaced by any of the ones added via `add_server`
|
|
78
96
|
|
|
79
97
|
See also [here](examples/raw_query_examples.rb) for example usage
|
|
@@ -83,16 +101,24 @@ See also [here](examples/raw_query_examples.rb) for example usage
|
|
|
83
101
|
|
|
84
102
|
You can also use the more comfortable `query`:
|
|
85
103
|
```ruby
|
|
86
|
-
GraphqlConnector::<name>.query(
|
|
104
|
+
GraphqlConnector::<name>.query('products', { id: [1,2] } , ['id','name'])
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
Or if you want to **override**/**set** any `httparty` adapter_options, it is also possible
|
|
108
|
+
to pass them in:
|
|
109
|
+
|
|
110
|
+
```ruby
|
|
111
|
+
GraphqlConnector::<name>.query('products', { id: [1,2] } , ['id','name'], httparty_adapter_options: { timeout: 3 })
|
|
87
112
|
```
|
|
88
113
|
|
|
89
|
-
| Variable
|
|
90
|
-
|
|
91
|
-
| model
|
|
92
|
-
| condition
|
|
93
|
-
| selected_fields | Array of Strings/Hashes | ['id', 'name', productCategory: ['id']] |
|
|
114
|
+
| Variable | Required | DataType | Example |
|
|
115
|
+
|--------------------------|-------------------------------|-------------------------|-----------------------------------------|
|
|
116
|
+
| model | Yes | String | 'product' |
|
|
117
|
+
| condition | Yes (but can be empty) | Hash(key, value) | { id: 1 } |
|
|
118
|
+
| selected_fields | Yes | Array of Strings/Hashes | ['id', 'name', productCategory: ['id']] |
|
|
119
|
+
| httparty_adapter_options | No | Hash | { timeout: 3 } |
|
|
94
120
|
|
|
95
|
-
|
|
121
|
+
:warning:
|
|
96
122
|
> You get an OpenStruct back. Currently only the first level attributes are
|
|
97
123
|
> supported with OpenStruct, associated objects are still a normal array of
|
|
98
124
|
> hashes.
|
|
@@ -129,14 +155,25 @@ so that it has re-usable graphql `query` and `mutation` **class methods**.
|
|
|
129
155
|
* Then you can aliases as many graphql server types via `add_query` and/or `add_raw_query` and/or `add_mutation`:
|
|
130
156
|
|
|
131
157
|
```ruby
|
|
132
|
-
add_query
|
|
158
|
+
add_query products_by: :products, params: [:id], returns: [:id, :name]
|
|
133
159
|
|
|
134
|
-
add_raw_query
|
|
160
|
+
add_raw_query products_raw_by: 'query { products(($id: [ID!]) products { id name } }', params: [:id]
|
|
135
161
|
|
|
136
|
-
add_mutation
|
|
162
|
+
add_mutation create: :createProduct, params: [:name], returns: [:id, :name]
|
|
137
163
|
```
|
|
138
164
|
* :grey_exclamation: If not needed omit `params`
|
|
139
165
|
|
|
166
|
+
Or if you want to **override**/**set** any `httparty` adapter_options, it is also possible
|
|
167
|
+
to pass them in:
|
|
168
|
+
|
|
169
|
+
```ruby
|
|
170
|
+
add_query products_by: :products, params: [:id], returns: [:id, :name], httparty_adapter_options: { timeout: 3 }
|
|
171
|
+
|
|
172
|
+
add_raw_query products_raw_by: 'query { products(($id: [ID!]) products { id name } }', params: [:id], httparty_adapter_options: { verify: true }
|
|
173
|
+
|
|
174
|
+
add_mutation create: :createProduct, params: [:name], returns: [:id, :name], httparty_adapter_options: { timeout: 5, verify: false }
|
|
175
|
+
```
|
|
176
|
+
|
|
140
177
|
See also [here](examples/departments_service_class_examples.rb) and also here for complete example usage:
|
|
141
178
|
|
|
142
179
|
```ruby
|
|
@@ -153,7 +190,8 @@ class Product
|
|
|
153
190
|
|
|
154
191
|
add_query by_id: :products,
|
|
155
192
|
params: :id,
|
|
156
|
-
returns: [:name, product_category: [:id, :name]]
|
|
193
|
+
returns: [:name, product_category: [:id, :name]],
|
|
194
|
+
httparty_adapter_options: { timeout: 3 }
|
|
157
195
|
|
|
158
196
|
add_query by_names: :products,
|
|
159
197
|
params: :names,
|
|
@@ -169,7 +207,8 @@ class Product
|
|
|
169
207
|
|
|
170
208
|
add_mutation create: :createProduct,
|
|
171
209
|
params: [:name, :catgetoryId],
|
|
172
|
-
returns: [:id, :name]
|
|
210
|
+
returns: [:id, :name],
|
|
211
|
+
httparty_adapter_options: { verify: false }
|
|
173
212
|
end
|
|
174
213
|
|
|
175
214
|
Product.all
|
|
@@ -5,9 +5,9 @@ module GraphqlConnector
|
|
|
5
5
|
# Class to wrap http_client calls under a specific namespaced class
|
|
6
6
|
class BaseServerType
|
|
7
7
|
class << self
|
|
8
|
-
def build(name, uri, headers = {}, connector = {})
|
|
8
|
+
def build(name, uri, headers = {}, connector = {}, httparty_adapter_options = {})
|
|
9
9
|
verify_new_client_type_for!(name)
|
|
10
|
-
base_class = class_with(uri, headers, connector)
|
|
10
|
+
base_class = class_with(uri, headers, connector, httparty_adapter_options)
|
|
11
11
|
base_object = GraphqlConnector.const_set(name, base_class)
|
|
12
12
|
inject_http_client_delegations(base_object)
|
|
13
13
|
create_service_class_module(base_object)
|
|
@@ -39,12 +39,13 @@ module GraphqlConnector
|
|
|
39
39
|
METHOD
|
|
40
40
|
end
|
|
41
41
|
|
|
42
|
-
def class_with(uri, headers = {}, connector = {})
|
|
42
|
+
def class_with(uri, headers = {}, connector = {}, httparty_adapter_options = {})
|
|
43
43
|
Class.new do
|
|
44
|
-
attr_accessor :uri, :headers, :connector
|
|
44
|
+
attr_accessor :uri, :headers, :connector, :httparty_adapter_options
|
|
45
45
|
@uri = uri
|
|
46
46
|
@headers = headers
|
|
47
47
|
@connector = connector
|
|
48
|
+
@httparty_adapter_options = httparty_adapter_options
|
|
48
49
|
end
|
|
49
50
|
end
|
|
50
51
|
|
|
@@ -54,8 +55,10 @@ module GraphqlConnector
|
|
|
54
55
|
def_delegators :http_client, :query, :raw_query, :mutation
|
|
55
56
|
|
|
56
57
|
def http_client
|
|
57
|
-
@http_client ||=
|
|
58
|
-
|
|
58
|
+
@http_client ||= GraphqlConnector::HttpClient.new(@uri,
|
|
59
|
+
@headers,
|
|
60
|
+
@connector,
|
|
61
|
+
@httparty_adapter_options)
|
|
59
62
|
end
|
|
60
63
|
end
|
|
61
64
|
end
|
|
@@ -9,9 +9,9 @@ module GraphqlConnector
|
|
|
9
9
|
@base_server_types = {}
|
|
10
10
|
end
|
|
11
11
|
|
|
12
|
-
def add_server(name:, uri:, headers: {}, connector: {})
|
|
12
|
+
def add_server(name:, uri:, headers: {}, connector: {}, httparty_adapter_options: {})
|
|
13
13
|
@base_server_types[name] =
|
|
14
|
-
BaseServerType.build(name, uri, headers, connector)
|
|
14
|
+
BaseServerType.build(name, uri, headers, connector, httparty_adapter_options)
|
|
15
15
|
end
|
|
16
16
|
|
|
17
17
|
def reset!
|
|
@@ -3,31 +3,29 @@
|
|
|
3
3
|
module GraphqlConnector
|
|
4
4
|
# Wrapper class for HTTParty post query
|
|
5
5
|
class HttpClient
|
|
6
|
-
def initialize(uri, headers = {}, connector = {})
|
|
6
|
+
def initialize(uri, headers = {}, connector = {}, httparty_adapter_options = {})
|
|
7
7
|
@uri = uri
|
|
8
8
|
@headers = headers
|
|
9
9
|
@connector = connector
|
|
10
|
+
@httparty_adapter_options = httparty_adapter_options
|
|
10
11
|
end
|
|
11
12
|
|
|
12
|
-
def query(model, conditions, selected_fields)
|
|
13
|
-
query_string =
|
|
14
|
-
|
|
15
|
-
parsed_body = raw_query(query_string)
|
|
16
|
-
format_body(parsed_body['data'][model.to_s])
|
|
13
|
+
def query(model, conditions, selected_fields, httparty_adapter_options: {})
|
|
14
|
+
query_string = Formatters::QueryFormat.new(model, conditions, selected_fields).create
|
|
15
|
+
format_body(query_string, model, httparty_adapter_options)
|
|
17
16
|
end
|
|
18
17
|
|
|
19
|
-
def mutation(model, inputs, selected_fields)
|
|
20
|
-
query_string =
|
|
21
|
-
|
|
22
|
-
parsed_body = raw_query(query_string)
|
|
23
|
-
format_body(parsed_body['data'][model.to_s])
|
|
18
|
+
def mutation(model, inputs, selected_fields, httparty_adapter_options: {})
|
|
19
|
+
query_string = Formatters::MutationFormat.new(model, inputs, selected_fields).create
|
|
20
|
+
format_body(query_string, model, httparty_adapter_options)
|
|
24
21
|
end
|
|
25
22
|
|
|
26
|
-
def raw_query(query_string, variables: {})
|
|
23
|
+
def raw_query(query_string, variables: {}, httparty_adapter_options: {})
|
|
24
|
+
adapter_options = combined_adapter_options(httparty_adapter_options)
|
|
27
25
|
response = HTTParty.post(@uri,
|
|
28
26
|
headers: handle_headers,
|
|
29
|
-
body: { query: query_string,
|
|
30
|
-
|
|
27
|
+
body: { query: query_string, variables: variables },
|
|
28
|
+
**adapter_options)
|
|
31
29
|
parsed_body = JSON.parse(response.body)
|
|
32
30
|
verify_response!(parsed_body)
|
|
33
31
|
parsed_body
|
|
@@ -35,6 +33,10 @@ module GraphqlConnector
|
|
|
35
33
|
|
|
36
34
|
private
|
|
37
35
|
|
|
36
|
+
def combined_adapter_options(options)
|
|
37
|
+
@httparty_adapter_options.merge(options)
|
|
38
|
+
end
|
|
39
|
+
|
|
38
40
|
def handle_headers
|
|
39
41
|
return @headers if @connector.empty?
|
|
40
42
|
|
|
@@ -42,7 +44,9 @@ module GraphqlConnector
|
|
|
42
44
|
.merge(@connector[:base].public_send(@connector[:method]))
|
|
43
45
|
end
|
|
44
46
|
|
|
45
|
-
def format_body(
|
|
47
|
+
def format_body(query_string, model, httparty_adapter_options)
|
|
48
|
+
parsed_body = raw_query(query_string, httparty_adapter_options: httparty_adapter_options)
|
|
49
|
+
response_body = parsed_body['data'][model.to_s]
|
|
46
50
|
return OpenStruct.new(response_body) unless response_body.is_a? Array
|
|
47
51
|
|
|
48
52
|
response_body.map { |entry| OpenStruct.new(entry) }
|
|
@@ -5,101 +5,83 @@ module GraphqlConnector
|
|
|
5
5
|
# Module that allows to build query methods within the context of
|
|
6
6
|
# service class
|
|
7
7
|
module Queryable
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
8
|
+
BINDINGS = 'binding.local_variables.map do |var|
|
|
9
|
+
[var, binding.local_variable_get(var)]
|
|
10
|
+
end.to_h'
|
|
11
11
|
|
|
12
|
-
def add_query(params: [], returns:, **method_to_query)
|
|
13
|
-
class_method_name = method_to_query
|
|
14
|
-
query_type = method_to_query.first[1]
|
|
15
|
-
ReturnFieldsValidator.validate(returns)
|
|
16
|
-
ClassMethodValidator.validate_class_method(class_method_name, self)
|
|
17
|
-
ClassMethodValidator.validate_element_class_type(query_type, Symbol)
|
|
12
|
+
def add_query(params: [], httparty_adapter_options: {}, returns:, **method_to_query)
|
|
13
|
+
class_method_name, query_type = parse_variables(method_to_query)
|
|
18
14
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
end
|
|
15
|
+
ensure_params_format!(returns, class_method_name, query_type)
|
|
16
|
+
ParamsValidator.validate(params) unless params.empty?
|
|
22
17
|
|
|
23
|
-
|
|
24
|
-
|
|
18
|
+
signature = method_signature(class_method_name, params)
|
|
19
|
+
signature[:graphql_method_type] = :query
|
|
20
|
+
create_method(signature, query_type, returns, httparty_adapter_options)
|
|
25
21
|
end
|
|
26
22
|
|
|
27
|
-
def add_raw_query(params: [], **method_to_raw_query)
|
|
28
|
-
class_method_name = method_to_raw_query
|
|
29
|
-
|
|
23
|
+
def add_raw_query(params: [], httparty_adapter_options: {}, **method_to_raw_query)
|
|
24
|
+
class_method_name, query_string = parse_variables(method_to_raw_query)
|
|
25
|
+
|
|
30
26
|
ClassMethodValidator.validate_class_method(class_method_name, self)
|
|
31
27
|
ClassMethodValidator.validate_element_class_type(query_string, String)
|
|
28
|
+
ParamsValidator.validate(params) unless params.empty?
|
|
32
29
|
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
end
|
|
36
|
-
|
|
37
|
-
ParamsValidator.validate(params)
|
|
38
|
-
raw_query_keyword_method(class_method_name, query_string, params)
|
|
30
|
+
signature = method_signature(class_method_name, params)
|
|
31
|
+
raw_query_method(signature, query_string, httparty_adapter_options)
|
|
39
32
|
end
|
|
40
33
|
|
|
41
|
-
def add_mutation(params: [], returns:, **method_to_query)
|
|
42
|
-
class_method_name = method_to_query
|
|
43
|
-
query_type = method_to_query.first[1]
|
|
44
|
-
ReturnFieldsValidator.validate(returns)
|
|
45
|
-
ClassMethodValidator.validate_class_method(class_method_name, self)
|
|
46
|
-
ClassMethodValidator.validate_element_class_type(query_type, Symbol)
|
|
34
|
+
def add_mutation(params: [], httparty_adapter_options: {}, returns:, **method_to_query)
|
|
35
|
+
class_method_name, query_type = parse_variables(method_to_query)
|
|
47
36
|
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
end
|
|
37
|
+
ensure_params_format!(returns, class_method_name, query_type)
|
|
38
|
+
ParamsValidator.validate(params) unless params.empty?
|
|
51
39
|
|
|
52
|
-
|
|
53
|
-
|
|
40
|
+
signature = method_signature(class_method_name, params)
|
|
41
|
+
signature[:graphql_method_type] = :mutation
|
|
42
|
+
create_method(signature, query_type, returns, httparty_adapter_options)
|
|
54
43
|
end
|
|
55
44
|
|
|
56
45
|
private
|
|
57
46
|
|
|
58
|
-
def
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
47
|
+
def parse_variables(method_to_query)
|
|
48
|
+
class_method_name = method_to_query.first[0]
|
|
49
|
+
query_type = method_to_query.first[1]
|
|
50
|
+
[class_method_name, query_type]
|
|
62
51
|
end
|
|
63
52
|
|
|
64
|
-
def
|
|
65
|
-
|
|
66
|
-
http_client.raw_query(query_string)
|
|
67
|
-
end
|
|
68
|
-
end
|
|
53
|
+
def method_signature(name, keywords)
|
|
54
|
+
return { head: name, bindings: {} } if keywords.empty?
|
|
69
55
|
|
|
70
|
-
def query_keyword_method(name, query_type, keywords, return_fields)
|
|
71
56
|
keywords = [keywords].flatten
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
http_client.query("#{query_type}",
|
|
75
|
-
#{CONDITIONS},
|
|
76
|
-
#{return_fields.to_a})
|
|
77
|
-
end
|
|
78
|
-
METHOD
|
|
57
|
+
{ head: "#{name}(#{keywords.map { |keyword| "#{keyword}:" }.join(', ')})",
|
|
58
|
+
bindings: BINDINGS }
|
|
79
59
|
end
|
|
80
60
|
|
|
81
|
-
def
|
|
82
|
-
|
|
61
|
+
def ensure_params_format!(returns, class_method_name, query_type)
|
|
62
|
+
ReturnFieldsValidator.validate(returns)
|
|
63
|
+
ClassMethodValidator.validate_class_method(class_method_name, self)
|
|
64
|
+
ClassMethodValidator.validate_element_class_type(query_type, Symbol)
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
def raw_query_method(signature, query_string, httparty_adapter_options)
|
|
83
68
|
instance_eval <<-METHOD, __FILE__, __LINE__ + 1
|
|
84
|
-
def #{
|
|
85
|
-
http_client.raw_query("#{query_string}",
|
|
69
|
+
def #{signature[:head]}
|
|
70
|
+
http_client.raw_query("#{query_string}",
|
|
71
|
+
variables: #{signature[:bindings]},
|
|
72
|
+
httparty_adapter_options: #{httparty_adapter_options})
|
|
86
73
|
end
|
|
87
74
|
METHOD
|
|
88
75
|
end
|
|
89
76
|
|
|
90
|
-
def
|
|
91
|
-
define_singleton_method class_method_name do
|
|
92
|
-
http_client.mutation(query_type, {}, return_fields.to_a)
|
|
93
|
-
end
|
|
94
|
-
end
|
|
95
|
-
|
|
96
|
-
def mutation_keyword_method(name, query_type, keywords, return_fields)
|
|
97
|
-
keywords = [keywords].flatten
|
|
77
|
+
def create_method(signature, query_type, return_fields, httparty_adapter_options)
|
|
98
78
|
instance_eval <<-METHOD, __FILE__, __LINE__ + 1
|
|
99
|
-
def #{
|
|
100
|
-
http_client
|
|
101
|
-
|
|
102
|
-
|
|
79
|
+
def #{signature[:head]}
|
|
80
|
+
http_client.#{signature[:graphql_method_type]}(
|
|
81
|
+
"#{query_type}",
|
|
82
|
+
#{signature[:bindings]},
|
|
83
|
+
#{return_fields.to_a},
|
|
84
|
+
httparty_adapter_options: #{httparty_adapter_options})
|
|
103
85
|
end
|
|
104
86
|
METHOD
|
|
105
87
|
end
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: graphql_connector
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 1.
|
|
4
|
+
version: 1.4.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Garllon
|
|
@@ -9,7 +9,7 @@ authors:
|
|
|
9
9
|
autorequire:
|
|
10
10
|
bindir: exe
|
|
11
11
|
cert_chain: []
|
|
12
|
-
date:
|
|
12
|
+
date: 2022-04-08 00:00:00.000000000 Z
|
|
13
13
|
dependencies:
|
|
14
14
|
- !ruby/object:Gem::Dependency
|
|
15
15
|
name: httparty
|
|
@@ -90,6 +90,8 @@ executables: []
|
|
|
90
90
|
extensions: []
|
|
91
91
|
extra_rdoc_files: []
|
|
92
92
|
files:
|
|
93
|
+
- ".github/ISSUE_TEMPLATE/bug_report.md"
|
|
94
|
+
- ".github/ISSUE_TEMPLATE/feature_request.md"
|
|
93
95
|
- ".github/workflows/ci.yaml"
|
|
94
96
|
- ".gitignore"
|
|
95
97
|
- ".rspec"
|