graphiform 0.1.4 → 0.2.4
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/graphiform/core.rb +5 -4
- data/lib/graphiform/fields.rb +89 -51
- data/lib/graphiform/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ad1663df91a2cb043ecca554ce73964f977b6a5af2878334df72105177bddb04
|
4
|
+
data.tar.gz: f70a256ef76ce3ba4d91d25d2194bc1481d3c89e601a1b48a9f1ef6fe09bafd4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2e77bbf7632faeb956acd2f7aa067428b7d2375f3c96b1ca71af95bd1d5ac12b5a8aa2d4229a9718c5dce7b566cd077f1018c84b5a251969a6a6579654cf07bb
|
7
|
+
data.tar.gz: 8ecfa9e57aa9b7692236114ff695aa5fad197a7c608127e93fca500b1a94a7ff7156cd093f1ac2a5d28438f93b86e4d1cdda4deb61186a5802212df216434d29
|
data/lib/graphiform/core.rb
CHANGED
@@ -136,7 +136,7 @@ module Graphiform
|
|
136
136
|
Helpers.get_const_or_create(demodulized_name, ::Resolvers::Queries) do
|
137
137
|
local_graphql_type = graphql_type
|
138
138
|
Class.new(graphql_base_resolver) do
|
139
|
-
type local_graphql_type, null:
|
139
|
+
type local_graphql_type, null: true
|
140
140
|
|
141
141
|
def base_resolve(**args)
|
142
142
|
@value = model.all
|
@@ -161,14 +161,15 @@ module Graphiform
|
|
161
161
|
end
|
162
162
|
end
|
163
163
|
|
164
|
-
def graphql_create_resolver(method_name, resolver_type = graphql_type, read_prepare: nil, **)
|
164
|
+
def graphql_create_resolver(method_name, resolver_type = graphql_type, read_prepare: nil, read_resolve: nil, null: true, **)
|
165
165
|
Class.new(graphql_base_resolver) do
|
166
|
-
type resolver_type, null:
|
166
|
+
type resolver_type, null: null
|
167
167
|
|
168
168
|
define_method :base_resolve do |**args|
|
169
169
|
@value = object
|
170
170
|
|
171
|
-
@value = @value
|
171
|
+
@value = instance_exec(@value, context, &read_resolve) if read_resolve
|
172
|
+
@value = @value.public_send(method_name) if !read_resolve && @value.respond_to?(method_name)
|
172
173
|
@value = instance_exec(@value, context, &read_prepare) if read_prepare
|
173
174
|
|
174
175
|
apply_built_ins(**args)
|
data/lib/graphiform/fields.rb
CHANGED
@@ -9,17 +9,18 @@ module Graphiform
|
|
9
9
|
module ClassMethods
|
10
10
|
def graphql_readable_field(
|
11
11
|
name,
|
12
|
+
as: nil,
|
12
13
|
**options
|
13
14
|
)
|
14
|
-
column_def = column(name)
|
15
|
-
association_def = association(name)
|
15
|
+
column_def = column(as || name)
|
16
|
+
association_def = association(as || name)
|
16
17
|
|
17
|
-
graphql_add_column_field(name, column_def, **options) if column_def.present?
|
18
|
-
graphql_add_association_field(name, association_def, **options) if association_def.present?
|
19
|
-
graphql_add_method_field(name, **options) unless column_def.present? || association_def.present?
|
18
|
+
graphql_add_column_field(name, column_def, as: as, **options) if column_def.present?
|
19
|
+
graphql_add_association_field(name, association_def, as: as, **options) if association_def.present?
|
20
|
+
graphql_add_method_field(name, as: as, **options) unless column_def.present? || association_def.present?
|
20
21
|
|
21
|
-
graphql_add_scopes_to_filter(name)
|
22
|
-
graphql_field_to_sort(name)
|
22
|
+
graphql_add_scopes_to_filter(name, as || name)
|
23
|
+
graphql_field_to_sort(name, as || name)
|
23
24
|
end
|
24
25
|
|
25
26
|
def graphql_writable_field(
|
@@ -31,25 +32,30 @@ module Graphiform
|
|
31
32
|
description: nil,
|
32
33
|
default_value: ::GraphQL::Schema::Argument::NO_DEFAULT,
|
33
34
|
as: nil,
|
34
|
-
**
|
35
|
+
**
|
35
36
|
)
|
36
37
|
name = name.to_sym
|
37
|
-
|
38
|
-
|
38
|
+
has_nested_attributes_method = instance_methods.include?("#{as || name}_attributes=".to_sym)
|
39
|
+
|
40
|
+
argument_name = has_nested_attributes_method ? "#{name}_attributes".to_sym : name
|
41
|
+
argument_type = graphql_resolve_argument_type(as || name, type)
|
42
|
+
as = has_nested_attributes_method ? "#{as}_attributes".to_sym : as.to_sym if as
|
39
43
|
|
40
|
-
return Helpers.logger.warn "Graphiform: Missing `type` for argument
|
44
|
+
return Helpers.logger.warn "Graphiform: Missing `type` for argument `#{name}` in model `#{self.name}`" if argument_type.nil?
|
41
45
|
|
42
46
|
prepare = write_prepare || prepare
|
43
47
|
|
44
48
|
graphql_input.class_eval do
|
45
|
-
argument
|
49
|
+
argument(
|
46
50
|
argument_name,
|
47
51
|
argument_type,
|
48
52
|
required: required,
|
49
53
|
prepare: prepare,
|
50
54
|
description: description,
|
51
55
|
default_value: default_value,
|
52
|
-
as: as
|
56
|
+
as: as,
|
57
|
+
method_access: false
|
58
|
+
)
|
53
59
|
end
|
54
60
|
end
|
55
61
|
|
@@ -84,14 +90,6 @@ module Graphiform
|
|
84
90
|
|
85
91
|
private
|
86
92
|
|
87
|
-
def graphql_resolve_argument_name(name)
|
88
|
-
attributes_name = "#{name}_attributes"
|
89
|
-
|
90
|
-
return attributes_name.to_sym if instance_methods.include?("#{attributes_name}=".to_sym)
|
91
|
-
|
92
|
-
name
|
93
|
-
end
|
94
|
-
|
95
93
|
def graphql_resolve_argument_type(name, type)
|
96
94
|
type = graphql_create_enum(name) if type.blank? && enum_attribute?(name)
|
97
95
|
|
@@ -109,12 +107,12 @@ module Graphiform
|
|
109
107
|
has_many ? [association_def.klass.graphql_input] : association_def.klass.graphql_input
|
110
108
|
end
|
111
109
|
|
112
|
-
def graphql_add_scopes_to_filter(name)
|
113
|
-
added_scopes = auto_scopes_by_attribute(
|
110
|
+
def graphql_add_scopes_to_filter(name, as)
|
111
|
+
added_scopes = auto_scopes_by_attribute(as)
|
114
112
|
|
115
113
|
return if added_scopes.empty?
|
116
114
|
|
117
|
-
association_def = association(
|
115
|
+
association_def = association(as)
|
118
116
|
|
119
117
|
if association_def.present?
|
120
118
|
return unless Helpers.association_arguments_valid?(association_def, :graphql_filter)
|
@@ -130,19 +128,18 @@ module Graphiform
|
|
130
128
|
enum = graphql_create_enum(name)
|
131
129
|
scope_argument_type = scope_argument_type.is_a?(Array) ? [enum] : enum
|
132
130
|
end
|
133
|
-
add_scope_def_to_filter(added_scope, scope_argument_type)
|
131
|
+
add_scope_def_to_filter(name, added_scope, scope_argument_type)
|
134
132
|
end
|
135
133
|
end
|
136
134
|
|
137
|
-
def add_scope_def_to_filter(scope_def, argument_type)
|
135
|
+
def add_scope_def_to_filter(name, scope_def, argument_type)
|
138
136
|
return unless argument_type
|
139
137
|
|
140
138
|
argument_type = Helpers.graphql_type(argument_type)
|
141
|
-
|
139
|
+
argument_attribute = name
|
142
140
|
argument_prefix = scope_def.prefix
|
143
|
-
argument_suffix = scope_def.suffix
|
144
|
-
|
145
|
-
argument_name = "#{argument_prefix}#{camelized_attribute}#{argument_suffix}"
|
141
|
+
argument_suffix = scope_def.suffix == '_is' ? '' : scope_def.suffix
|
142
|
+
argument_name = "#{argument_prefix}#{argument_attribute}#{argument_suffix}".underscore
|
146
143
|
scope_name = scope_def.name
|
147
144
|
|
148
145
|
graphql_filter.class_eval do
|
@@ -150,15 +147,15 @@ module Graphiform
|
|
150
147
|
argument_name,
|
151
148
|
argument_type,
|
152
149
|
required: false,
|
153
|
-
|
154
|
-
|
150
|
+
as: scope_name,
|
151
|
+
method_access: false
|
155
152
|
)
|
156
153
|
end
|
157
154
|
end
|
158
155
|
|
159
|
-
def graphql_field_to_sort(name)
|
160
|
-
column_def = column(name)
|
161
|
-
association_def = association(name)
|
156
|
+
def graphql_field_to_sort(name, as)
|
157
|
+
column_def = column(as || name)
|
158
|
+
association_def = association(as || name)
|
162
159
|
|
163
160
|
type = ::Enums::Sort if column_def.present?
|
164
161
|
type = association_def.klass.graphql_sort if Helpers.association_arguments_valid?(association_def, :graphql_sort)
|
@@ -171,7 +168,9 @@ module Graphiform
|
|
171
168
|
argument(
|
172
169
|
name,
|
173
170
|
type,
|
174
|
-
required: false
|
171
|
+
required: false,
|
172
|
+
as: as,
|
173
|
+
method_access: false
|
175
174
|
)
|
176
175
|
end
|
177
176
|
end
|
@@ -183,18 +182,21 @@ module Graphiform
|
|
183
182
|
description: nil,
|
184
183
|
deprecation_reason: nil,
|
185
184
|
method: nil,
|
185
|
+
as: nil,
|
186
186
|
read_prepare: nil,
|
187
|
-
|
187
|
+
read_resolve: nil,
|
188
|
+
**
|
188
189
|
)
|
190
|
+
type = Helpers.graphql_type(type)
|
191
|
+
is_resolver = Helpers.resolver?(type)
|
192
|
+
|
189
193
|
field_name = field_name.to_sym
|
190
194
|
field_options = {
|
191
195
|
description: description,
|
192
196
|
deprecation_reason: deprecation_reason,
|
193
|
-
method: method,
|
197
|
+
method: is_resolver ? nil : method || as,
|
194
198
|
}
|
195
199
|
|
196
|
-
type = Helpers.graphql_type(type)
|
197
|
-
|
198
200
|
if Helpers.resolver?(type)
|
199
201
|
field_options[:resolver] = type
|
200
202
|
else
|
@@ -205,28 +207,42 @@ module Graphiform
|
|
205
207
|
graphql_type.class_eval do
|
206
208
|
added_field = field(field_name, **field_options)
|
207
209
|
|
208
|
-
if read_prepare
|
210
|
+
if read_prepare || read_resolve
|
209
211
|
define_method(
|
210
212
|
added_field.method_sym,
|
211
|
-
|
213
|
+
lambda do
|
214
|
+
value = read_resolve ? instance_exec(object, context, &read_resolve) : object.public_send(added_field.method_sym)
|
215
|
+
value = instance_exec(value, context, &read_prepare) if read_prepare
|
216
|
+
|
217
|
+
value
|
218
|
+
end
|
212
219
|
)
|
213
220
|
end
|
214
221
|
end
|
215
222
|
end
|
216
223
|
|
217
|
-
def graphql_add_column_field(field_name, column_def, type: nil, null: nil, **options)
|
218
|
-
is_enum = type.blank? && enum_attribute?(field_name)
|
224
|
+
def graphql_add_column_field(field_name, column_def, type: nil, null: nil, as: nil, **options)
|
225
|
+
is_enum = type.blank? && enum_attribute?(as || field_name)
|
219
226
|
if is_enum
|
220
|
-
enum = graphql_create_enum(field_name)
|
227
|
+
enum = graphql_create_enum(as || field_name)
|
221
228
|
type = enum
|
222
229
|
end
|
223
230
|
type ||= column_def.type
|
224
231
|
null = column_def.null if null.nil?
|
225
232
|
|
226
|
-
graphql_add_field_to_type(field_name, type, null, **options)
|
233
|
+
graphql_add_field_to_type(field_name, type, null, as: as, **options)
|
227
234
|
end
|
228
235
|
|
229
|
-
def graphql_add_association_field(
|
236
|
+
def graphql_add_association_field(
|
237
|
+
field_name,
|
238
|
+
association_def,
|
239
|
+
type: nil,
|
240
|
+
null: nil,
|
241
|
+
include_connection: true,
|
242
|
+
read_prepare: nil,
|
243
|
+
read_resolve: nil,
|
244
|
+
**options
|
245
|
+
)
|
230
246
|
unless association_def.klass.respond_to?(:graphql_type)
|
231
247
|
return Helpers.logger.warn(
|
232
248
|
"Graphiform: `#{name}` trying to add association `#{field_name}` - `#{association_def.klass.name}` does not include Graphiform"
|
@@ -245,20 +261,42 @@ module Graphiform
|
|
245
261
|
if include_connection && has_many
|
246
262
|
graphql_add_field_to_type(
|
247
263
|
"#{field_name}_connection",
|
248
|
-
klass.graphql_create_resolver(
|
264
|
+
klass.graphql_create_resolver(
|
265
|
+
association_def.name,
|
266
|
+
klass.graphql_connection,
|
267
|
+
read_prepare: read_prepare,
|
268
|
+
read_resolve: read_resolve,
|
269
|
+
null: false
|
270
|
+
),
|
249
271
|
false,
|
250
272
|
**options
|
251
273
|
)
|
252
274
|
end
|
253
275
|
|
254
276
|
if type.nil?
|
255
|
-
type =
|
256
|
-
|
277
|
+
type = (
|
278
|
+
if has_many
|
279
|
+
klass.graphql_create_resolver(
|
280
|
+
association_def.name,
|
281
|
+
[klass.graphql_type],
|
282
|
+
read_prepare: read_prepare,
|
283
|
+
read_resolve: read_resolve,
|
284
|
+
null: false
|
285
|
+
)
|
286
|
+
else
|
287
|
+
klass.graphql_type
|
288
|
+
end
|
289
|
+
)
|
290
|
+
|
291
|
+
if has_many
|
292
|
+
read_prepare = nil
|
293
|
+
read_resolve = nil
|
294
|
+
end
|
257
295
|
end
|
258
296
|
|
259
297
|
null = association_def.macro != :has_many if null.nil?
|
260
298
|
|
261
|
-
graphql_add_field_to_type(field_name, type, null, read_prepare: read_prepare, **options)
|
299
|
+
graphql_add_field_to_type(field_name, type, null, read_prepare: read_prepare, read_resolve: read_resolve, **options)
|
262
300
|
end
|
263
301
|
|
264
302
|
def graphql_add_method_field(field_name, type: nil, null: true, **options)
|
data/lib/graphiform/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: graphiform
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- jayce.pulsipher
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-07-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|