graphiti_gql 0.2.23 → 0.2.24
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/graphiti_gql/graphiti_hax.rb +110 -0
- data/lib/graphiti_gql/schema/fields/attribute.rb +5 -1
- data/lib/graphiti_gql/schema/fields/to_many.rb +1 -0
- data/lib/graphiti_gql/schema/query.rb +8 -0
- data/lib/graphiti_gql/schema/registry.rb +2 -1
- data/lib/graphiti_gql/schema/resource_type.rb +34 -1
- data/lib/graphiti_gql/schema.rb +36 -1
- data/lib/graphiti_gql/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: 696f200f2ac54b136b21b4b8f237cddfddf742d73da51b73c2513dbb7c0cc60a
|
4
|
+
data.tar.gz: 914867efbf89a58b33de2e28b65c253577852cedf146e8f2050e2330d9534cdf
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cfa86ca259696ca32ba303b5bf4abb8064c7d60b179ef106a136da1a292d0721ec81a12242d9a0ba993c69dae93c0367350354475b13132aead992380bf129af
|
7
|
+
data.tar.gz: 56a9db45d32242003eb8a9e9cb74f6efc96c92f9889abc93c8b038f6e07a3d5dbe836bfd84d4c4e053d3ff46bfbacf5676408ba95c10b357463a5e6034ac51c2
|
@@ -25,6 +25,10 @@ module GraphitiGql
|
|
25
25
|
end
|
26
26
|
end
|
27
27
|
|
28
|
+
def value_object?
|
29
|
+
self.class.value_object?
|
30
|
+
end
|
31
|
+
|
28
32
|
def filterings
|
29
33
|
@filterings ||= begin
|
30
34
|
if @params.key?(:filter)
|
@@ -67,6 +71,11 @@ module GraphitiGql
|
|
67
71
|
end
|
68
72
|
|
69
73
|
class_methods do
|
74
|
+
def config
|
75
|
+
return @config if @config
|
76
|
+
super
|
77
|
+
@config = @config.merge(value_objects: {}, is_value_object: false)
|
78
|
+
end
|
70
79
|
|
71
80
|
def attribute(*args)
|
72
81
|
super(*args).tap do
|
@@ -93,6 +102,40 @@ module GraphitiGql
|
|
93
102
|
super
|
94
103
|
end
|
95
104
|
end
|
105
|
+
|
106
|
+
def value_object?
|
107
|
+
!!config[:is_value_object]
|
108
|
+
end
|
109
|
+
|
110
|
+
def value_object!
|
111
|
+
config[:is_value_object] = true
|
112
|
+
self.adapter = ::Graphiti::Adapters::Null
|
113
|
+
config[:filters] = {}
|
114
|
+
config[:stats] = {}
|
115
|
+
config[:sorts] = {}
|
116
|
+
config[:attributes].delete(:id)
|
117
|
+
define_method :base_scope do
|
118
|
+
{}
|
119
|
+
end
|
120
|
+
define_method :resolve do |parent|
|
121
|
+
[parent]
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
def value_object(name, opts = {})
|
126
|
+
opts[:array] ||= false
|
127
|
+
opts[:null] ||= true
|
128
|
+
config[:value_objects][name] = Graphiti::ValueObjectAssociation.new(
|
129
|
+
name,
|
130
|
+
parent_resource_class: self,
|
131
|
+
resource_class: opts[:resource],
|
132
|
+
_alias: opts[:alias],
|
133
|
+
is_array: opts[:array],
|
134
|
+
null: opts[:null],
|
135
|
+
readable: opts[:readable],
|
136
|
+
deprecation_reason: opts[:deprecation_reason]
|
137
|
+
)
|
138
|
+
end
|
96
139
|
end
|
97
140
|
end
|
98
141
|
Graphiti::Resource.send(:prepend, ResourceExtras)
|
@@ -264,6 +307,20 @@ module GraphitiGql
|
|
264
307
|
description: 'Datetime with milliseconds'
|
265
308
|
}
|
266
309
|
|
310
|
+
[:string, :integer, :float, :datetime, :precise_datetime].each do |kind|
|
311
|
+
duped_hash = Graphiti::Util::Hash.deep_dup(Graphiti::Types[:hash])
|
312
|
+
type = Graphiti::Types[:"#{kind}_range"] = duped_hash
|
313
|
+
type[:canonical_name] = :"#{kind}_range"
|
314
|
+
Graphiti::Types[:"array_of_#{kind}_ranges"] = {
|
315
|
+
canonical_name: :"#{kind}_range",
|
316
|
+
params: Dry::Types["strict.array"].of(type[:params]),
|
317
|
+
read: Dry::Types["strict.array"].of(type[:read]),
|
318
|
+
write: Dry::Types["strict.array"].of(type[:write]),
|
319
|
+
kind: "array",
|
320
|
+
description: "Base Type."
|
321
|
+
}
|
322
|
+
end
|
323
|
+
|
267
324
|
module ActiveRecordAdapterExtras
|
268
325
|
extend ActiveSupport::Concern
|
269
326
|
|
@@ -363,6 +420,15 @@ module GraphitiGql
|
|
363
420
|
|
364
421
|
Graphiti::Query.send(:prepend, QueryExtras)
|
365
422
|
module ScopeExtras
|
423
|
+
def initialize(object, resource, query, opts = {})
|
424
|
+
if resource.value_object?
|
425
|
+
object = query.params[:parent]
|
426
|
+
super(object, resource, query, opts)
|
427
|
+
else
|
428
|
+
super
|
429
|
+
end
|
430
|
+
end
|
431
|
+
|
366
432
|
def resolve(*args)
|
367
433
|
results = super
|
368
434
|
results.reverse! if @query.hash[:reverse]
|
@@ -383,4 +449,48 @@ module GraphitiGql
|
|
383
449
|
::Graphiti::Adapters::ActiveRecord::ManyToManySideload
|
384
450
|
.send(:prepend, ActiveRecordManyToManyExtras)
|
385
451
|
end
|
452
|
+
end
|
453
|
+
|
454
|
+
class Graphiti::ValueObjectAssociation
|
455
|
+
attr_reader :name,
|
456
|
+
:parent_resource_class,
|
457
|
+
:alias,
|
458
|
+
:readable,
|
459
|
+
:null,
|
460
|
+
:deprecation_reason
|
461
|
+
|
462
|
+
def initialize(
|
463
|
+
name,
|
464
|
+
parent_resource_class:,
|
465
|
+
resource_class:,
|
466
|
+
is_array: false,
|
467
|
+
readable: nil,
|
468
|
+
null: true,
|
469
|
+
_alias: nil,
|
470
|
+
deprecation_reason: nil
|
471
|
+
)
|
472
|
+
@name = name
|
473
|
+
@parent_resource_class = parent_resource_class
|
474
|
+
@resource_class = resource_class
|
475
|
+
@readable = readable
|
476
|
+
@array = is_array
|
477
|
+
@alias = _alias
|
478
|
+
@null = null
|
479
|
+
@deprecation_reason = deprecation_reason
|
480
|
+
end
|
481
|
+
|
482
|
+
def array?
|
483
|
+
!!@array
|
484
|
+
end
|
485
|
+
|
486
|
+
def resource_class
|
487
|
+
@resource_class ||= Graphiti::Util::Class
|
488
|
+
.infer_resource_class(@parent_resource_class, name)
|
489
|
+
end
|
490
|
+
|
491
|
+
def build_resource(parent)
|
492
|
+
instance = resource_class.new
|
493
|
+
instance.parent = parent
|
494
|
+
instance
|
495
|
+
end
|
386
496
|
end
|
@@ -30,7 +30,11 @@ module GraphitiGql
|
|
30
30
|
value = if _config[:proc]
|
31
31
|
instance_eval(&_config[:proc])
|
32
32
|
else
|
33
|
-
object.
|
33
|
+
if object.is_a?(Hash)
|
34
|
+
object[_name] || object[_name.to_s]
|
35
|
+
else
|
36
|
+
object.send(_alias || _name)
|
37
|
+
end
|
34
38
|
end
|
35
39
|
return if value.nil?
|
36
40
|
Graphiti::Types[_config[:type]][:read].call(value)
|
@@ -10,6 +10,7 @@ module GraphitiGql
|
|
10
10
|
def build
|
11
11
|
@resources.each { |resource| ResourceType.new(resource).build }
|
12
12
|
define_entrypoints
|
13
|
+
add_value_objects
|
13
14
|
add_relationships
|
14
15
|
@query_class
|
15
16
|
end
|
@@ -35,6 +36,13 @@ module GraphitiGql
|
|
35
36
|
ResourceType.add_relationships(resource, type)
|
36
37
|
end
|
37
38
|
end
|
39
|
+
|
40
|
+
def add_value_objects
|
41
|
+
registry.resource_types.each do |registered|
|
42
|
+
resource, type = registered[:resource], registered[:type]
|
43
|
+
ResourceType.add_value_objects(resource, type)
|
44
|
+
end
|
45
|
+
end
|
38
46
|
end
|
39
47
|
end
|
40
48
|
end
|
@@ -52,7 +52,8 @@ module GraphitiGql
|
|
52
52
|
# When polymorphic parent, returns the Interface not the Class
|
53
53
|
def resource_types
|
54
54
|
values
|
55
|
-
.select { |v| v.key?(:resource)
|
55
|
+
.select { |v| v.key?(:resource) }
|
56
|
+
.reject { |v| v[:interface] || v[:resource].value_object? }
|
56
57
|
.map { |registered| get(registered[:resource]) }
|
57
58
|
end
|
58
59
|
|
@@ -14,7 +14,7 @@ module GraphitiGql
|
|
14
14
|
end
|
15
15
|
end
|
16
16
|
|
17
|
-
def self.add_fields(type, resource, id: true)
|
17
|
+
def self.add_fields(type, resource, id: true) # id: false for edges
|
18
18
|
resource.attributes.each_pair do |name, config|
|
19
19
|
next if name == :id && id == false
|
20
20
|
if config[:readable]
|
@@ -23,6 +23,39 @@ module GraphitiGql
|
|
23
23
|
end
|
24
24
|
end
|
25
25
|
|
26
|
+
def self.add_value_objects(resource, type)
|
27
|
+
resource.config[:value_objects].each_pair do |name, vo_association|
|
28
|
+
vo_resource_class = vo_association.resource_class
|
29
|
+
value_object_type = Schema.registry.get(vo_resource_class)[:type]
|
30
|
+
if vo_association.array?
|
31
|
+
value_object_type = [value_object_type]
|
32
|
+
end
|
33
|
+
|
34
|
+
_array = vo_association.array?
|
35
|
+
opts = { null: vo_association.null }
|
36
|
+
opts[:deprecation_reason] = vo_association.deprecation_reason if vo_association.deprecation_reason
|
37
|
+
type.field name, value_object_type, **opts
|
38
|
+
type.define_method name do
|
39
|
+
if (method_name = vo_association.readable)
|
40
|
+
unless vo_association.parent_resource_class.new.send(method_name)
|
41
|
+
raise ::Graphiti::Errors::UnreadableAttribute
|
42
|
+
.new(vo_association.parent_resource_class, name)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
result = vo_resource_class.all({ parent: object }).to_a
|
47
|
+
if result.is_a?(Array) && !_array
|
48
|
+
result = result.first
|
49
|
+
end
|
50
|
+
if result == object || result == [object]
|
51
|
+
method_name = vo_association.alias.presence || name
|
52
|
+
result = object.send(method_name)
|
53
|
+
end
|
54
|
+
result
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
26
59
|
def self.add_relationships(resource, type)
|
27
60
|
resource.sideloads.each do |name, sideload|
|
28
61
|
next unless sideload.readable?
|
data/lib/graphiti_gql/schema.rb
CHANGED
@@ -4,6 +4,31 @@ module GraphitiGql
|
|
4
4
|
self.time_precision = 6
|
5
5
|
end
|
6
6
|
|
7
|
+
class DatetimeRange < GraphQL::Schema::Object
|
8
|
+
field :from, GraphQL::Types::ISO8601DateTime
|
9
|
+
field :to, GraphQL::Types::ISO8601DateTime
|
10
|
+
end
|
11
|
+
|
12
|
+
class PreciseDatetimeRange < GraphQL::Schema::Object
|
13
|
+
field :from, PreciseDatetime
|
14
|
+
field :to, PreciseDatetime
|
15
|
+
end
|
16
|
+
|
17
|
+
class StringRange < GraphQL::Schema::Object
|
18
|
+
field :from, String
|
19
|
+
field :to, String
|
20
|
+
end
|
21
|
+
|
22
|
+
class IntegerRange < GraphQL::Schema::Object
|
23
|
+
field :from, Integer
|
24
|
+
field :to, Integer
|
25
|
+
end
|
26
|
+
|
27
|
+
class FloatRange < GraphQL::Schema::Object
|
28
|
+
field :from, Float
|
29
|
+
field :to, Float
|
30
|
+
end
|
31
|
+
|
7
32
|
GQL_TYPE_MAP = {
|
8
33
|
integer_id: String,
|
9
34
|
string: String,
|
@@ -16,13 +41,23 @@ module GraphitiGql
|
|
16
41
|
datetime: GraphQL::Types::ISO8601DateTime,
|
17
42
|
precise_datetime: PreciseDatetime,
|
18
43
|
hash: GraphQL::Types::JSON,
|
44
|
+
string_range: StringRange,
|
45
|
+
integer_range: IntegerRange,
|
46
|
+
float_range: FloatRange,
|
47
|
+
datetime_range: DatetimeRange,
|
48
|
+
precise_datetime_range: PreciseDatetimeRange,
|
19
49
|
array: [GraphQL::Types::JSON],
|
20
50
|
array_of_strings: [String],
|
21
51
|
array_of_integers: [Integer],
|
22
52
|
array_of_floats: [Float],
|
23
53
|
array_of_dates: [GraphQL::Types::ISO8601Date],
|
24
54
|
array_of_datetimes: [GraphQL::Types::ISO8601DateTime],
|
25
|
-
array_of_precise_datetimes: [PreciseDatetime]
|
55
|
+
array_of_precise_datetimes: [PreciseDatetime],
|
56
|
+
array_of_string_ranges: [StringRange],
|
57
|
+
array_of_integer_ranges: [IntegerRange],
|
58
|
+
array_of_float_ranges: [FloatRange],
|
59
|
+
array_of_datetime_ranges: [DatetimeRange],
|
60
|
+
array_of_precise_datetime_ranges: [PreciseDatetimeRange]
|
26
61
|
}
|
27
62
|
|
28
63
|
class RelayConnectionExtension < GraphQL::Schema::Field::ConnectionExtension
|
data/lib/graphiti_gql/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: graphiti_gql
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.24
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Lee Richmond
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-08-
|
11
|
+
date: 2022-08-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: graphql
|