ree_lib 1.0.54 → 1.0.55
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/Gemfile.lock +3 -1
- data/lib/ree_lib/packages/ree_dao/package/ree_dao/association.rb +93 -45
- data/lib/ree_lib/packages/ree_dao/package/ree_dao/associations.rb +10 -5
- data/lib/ree_lib/packages/ree_dao/package/ree_dao/dataset_extensions.rb +20 -20
- data/lib/ree_lib/packages/ree_dao/spec/ree_dao/functions/load_agg/load_agg_spec.rb +4 -3
- data/lib/ree_lib/packages/ree_dao/spec/ree_dao/functions/load_agg/ree_dao_load_agg_test.rb +57 -45
- data/lib/ree_lib/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7d792b73d0f067a0fc7e935ca257f79f4334afbbb811a060e94cb6de6f2f283c
|
4
|
+
data.tar.gz: 34fb81648b66cfb4e031650d6145556c05b454c0ca1f66f82ded0c3c774d97d6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 595ed040ab09ad6ff32283152de27cd85e4c4ec09c70777177817e5bc9fd2a19d178cc1caf3d1db35738331e71a3620dd81f3242c7c8d628e2cc36e073d6c47e
|
7
|
+
data.tar.gz: f2f4ce7c621d154d1e71b0a6cb7426f5c152c0cb2d396b15b859b9fa3df38a979164e091f827279f2d187668e8b53cd181b7adc937b0b6d810bd35186e302945
|
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
ree_lib (1.0.
|
4
|
+
ree_lib (1.0.55)
|
5
5
|
binding_of_caller (~> 1.0.0)
|
6
6
|
i18n (~> 1.12.0)
|
7
7
|
loofah (~> 2.18.0)
|
@@ -38,6 +38,8 @@ GEM
|
|
38
38
|
crass (~> 1.0.2)
|
39
39
|
nokogiri (>= 1.5.9)
|
40
40
|
msgpack (1.6.0)
|
41
|
+
nokogiri (1.15.3-x86_64-darwin)
|
42
|
+
racc (~> 1.4)
|
41
43
|
nokogiri (1.15.3-x86_64-linux)
|
42
44
|
racc (~> 1.4)
|
43
45
|
oj (3.13.23)
|
@@ -56,6 +56,7 @@ module ReeDao
|
|
56
56
|
assoc_name,
|
57
57
|
list,
|
58
58
|
scope: opts[:scope],
|
59
|
+
primary_key: opts[:primary_key],
|
59
60
|
foreign_key: opts[:foreign_key],
|
60
61
|
setter: opts[:setter],
|
61
62
|
reverse: false
|
@@ -65,6 +66,7 @@ module ReeDao
|
|
65
66
|
assoc_name,
|
66
67
|
list,
|
67
68
|
scope: opts[:scope],
|
69
|
+
primary_key: opts[:primary_key],
|
68
70
|
foreign_key: opts[:foreign_key],
|
69
71
|
setter: opts[:setter],
|
70
72
|
reverse: true
|
@@ -74,6 +76,7 @@ module ReeDao
|
|
74
76
|
assoc_name,
|
75
77
|
list,
|
76
78
|
scope: opts[:scope],
|
79
|
+
primary_key: opts[:primary_key],
|
77
80
|
foreign_key: opts[:foreign_key],
|
78
81
|
setter: opts[:setter]
|
79
82
|
)
|
@@ -82,6 +85,7 @@ module ReeDao
|
|
82
85
|
assoc_name,
|
83
86
|
list,
|
84
87
|
scope: opts[:scope],
|
88
|
+
primary_key: opts[:primary_key],
|
85
89
|
foreign_key: opts[:foreign_key],
|
86
90
|
setter: opts[:setter],
|
87
91
|
skip_dao: true
|
@@ -89,9 +93,9 @@ module ReeDao
|
|
89
93
|
end
|
90
94
|
end
|
91
95
|
|
92
|
-
contract(Hash, Bool, Block => Any)
|
96
|
+
contract(Or[Hash, Array], Bool, Block => Any)
|
93
97
|
def process_block(assoc, autoload_children, &block)
|
94
|
-
assoc_list = assoc.values.flatten
|
98
|
+
assoc_list = assoc.is_a?(Array) ? assoc : assoc.values.flatten
|
95
99
|
|
96
100
|
if ReeDao::Associations.sync_mode?
|
97
101
|
ReeDao::Associations.new(
|
@@ -116,59 +120,73 @@ module ReeDao
|
|
116
120
|
Symbol,
|
117
121
|
Array,
|
118
122
|
Kwargs[
|
123
|
+
primary_key: Nilor[Symbol],
|
119
124
|
foreign_key: Nilor[Symbol],
|
120
|
-
scope: Nilor[Sequel::Dataset],
|
125
|
+
scope: Nilor[Sequel::Dataset, Array],
|
121
126
|
setter: Nilor[Or[Symbol, Proc]],
|
122
127
|
reverse: Bool
|
123
|
-
] => Hash
|
128
|
+
] => Or[Hash, Array]
|
124
129
|
)
|
125
130
|
def one_to_one(
|
126
131
|
assoc_name,
|
127
132
|
list,
|
128
133
|
scope: nil,
|
134
|
+
primary_key: :id,
|
129
135
|
foreign_key: nil,
|
130
136
|
setter: nil,
|
131
137
|
reverse: true
|
132
138
|
)
|
133
139
|
return {} if list.empty?
|
134
140
|
|
135
|
-
|
141
|
+
primary_key ||= :id
|
136
142
|
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
foreign_key = "#{name}_id".to_sym
|
141
|
-
end
|
142
|
-
|
143
|
-
root_ids = list.map(&:id).uniq
|
143
|
+
# TODO: refactor
|
144
|
+
if scope.is_a?(Array)
|
145
|
+
items = scope
|
144
146
|
else
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
147
|
+
assoc_dao = find_dao(assoc_name, parent, scope)
|
148
|
+
|
149
|
+
if reverse
|
150
|
+
if !foreign_key
|
151
|
+
name = underscore(demodulize(list.first.class.name))
|
152
|
+
foreign_key = "#{name}_id".to_sym
|
153
|
+
end
|
149
154
|
|
150
|
-
|
151
|
-
|
152
|
-
root_ids = list.map(&:"#{"#{name}_id".to_sym}").uniq
|
153
|
-
foreign_key = :id
|
155
|
+
root_ids = list.map(&:id).uniq
|
154
156
|
else
|
155
|
-
|
156
|
-
|
157
|
+
if !foreign_key
|
158
|
+
dto_class = assoc_dao
|
159
|
+
.opts[:schema_mapper]
|
160
|
+
.dto(:db_load)
|
161
|
+
|
162
|
+
name = underscore(demodulize(dto_class.name))
|
163
|
+
|
164
|
+
root_ids = list.map(&:"#{"#{name}_id".to_sym}").uniq
|
165
|
+
foreign_key = :id
|
166
|
+
else
|
167
|
+
root_ids = list.map(&:"#{foreign_key}")
|
168
|
+
foreign_key = :id
|
169
|
+
end
|
157
170
|
end
|
171
|
+
|
172
|
+
default_scope = assoc_dao&.where(foreign_key => root_ids)
|
173
|
+
|
174
|
+
items = add_scopes(default_scope, scope, global_opts[assoc_name])
|
158
175
|
end
|
159
176
|
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
177
|
+
assoc = if foreign_key
|
178
|
+
index_by(items) { _1.send(foreign_key) }
|
179
|
+
else
|
180
|
+
items
|
181
|
+
end
|
165
182
|
|
166
183
|
populate_association(
|
167
184
|
list,
|
168
185
|
assoc,
|
169
186
|
assoc_name,
|
170
187
|
setter: setter,
|
171
|
-
reverse: reverse
|
188
|
+
reverse: reverse,
|
189
|
+
primary_key: primary_key
|
172
190
|
)
|
173
191
|
|
174
192
|
assoc
|
@@ -179,14 +197,16 @@ module ReeDao
|
|
179
197
|
Array,
|
180
198
|
Kwargs[
|
181
199
|
foreign_key: Nilor[Symbol],
|
182
|
-
|
200
|
+
primary_key: Nilor[Symbol],
|
201
|
+
scope: Nilor[Sequel::Dataset, Array],
|
183
202
|
setter: Nilor[Or[Symbol, Proc]],
|
184
203
|
skip_dao: Bool
|
185
|
-
] => Hash
|
204
|
+
] => Or[Hash, Array]
|
186
205
|
)
|
187
206
|
def one_to_many(
|
188
207
|
assoc_name,
|
189
208
|
list,
|
209
|
+
primary_key: nil,
|
190
210
|
foreign_key: nil,
|
191
211
|
scope: nil,
|
192
212
|
setter: nil,
|
@@ -194,24 +214,36 @@ module ReeDao
|
|
194
214
|
)
|
195
215
|
return {} if list.empty?
|
196
216
|
|
197
|
-
|
198
|
-
assoc_dao = find_dao(assoc_name, parent, scope) if !skip_dao
|
199
|
-
|
200
|
-
foreign_key ||= "#{underscore(demodulize(list.first.class.name))}_id".to_sym
|
217
|
+
primary_key ||= :id
|
201
218
|
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
219
|
+
# TODO: refactor
|
220
|
+
if scope.is_a?(Array)
|
221
|
+
items = scope
|
222
|
+
else
|
223
|
+
assoc_dao = nil
|
224
|
+
assoc_dao = find_dao(assoc_name, parent, scope) if !skip_dao
|
225
|
+
|
226
|
+
foreign_key ||= "#{underscore(demodulize(list.first.class.name))}_id".to_sym
|
227
|
+
|
228
|
+
root_ids = list.map(&:"#{primary_key}")
|
229
|
+
|
230
|
+
default_scope = assoc_dao&.where(foreign_key => root_ids)
|
231
|
+
|
232
|
+
items = add_scopes(default_scope, scope, global_opts[assoc_name])
|
233
|
+
end
|
207
234
|
|
208
|
-
assoc =
|
235
|
+
assoc = if foreign_key
|
236
|
+
group_by(items) { _1.send(foreign_key) }
|
237
|
+
else
|
238
|
+
items
|
239
|
+
end
|
209
240
|
|
210
241
|
populate_association(
|
211
242
|
list,
|
212
243
|
assoc,
|
213
244
|
assoc_name,
|
214
|
-
setter: setter
|
245
|
+
setter: setter,
|
246
|
+
primary_key: primary_key
|
215
247
|
)
|
216
248
|
|
217
249
|
assoc
|
@@ -219,9 +251,10 @@ module ReeDao
|
|
219
251
|
|
220
252
|
contract(
|
221
253
|
Array,
|
222
|
-
Hash,
|
254
|
+
Or[Hash, Array],
|
223
255
|
Symbol,
|
224
256
|
Kwargs[
|
257
|
+
primary_key: Nilor[Symbol],
|
225
258
|
reverse: Nilor[Bool],
|
226
259
|
setter: Nilor[Or[Symbol, Proc]]
|
227
260
|
] => Any
|
@@ -230,6 +263,7 @@ module ReeDao
|
|
230
263
|
list,
|
231
264
|
association_index,
|
232
265
|
assoc_name,
|
266
|
+
primary_key: nil,
|
233
267
|
reverse: nil,
|
234
268
|
setter: nil
|
235
269
|
)
|
@@ -244,14 +278,18 @@ module ReeDao
|
|
244
278
|
self.instance_exec(item, association_index, &assoc_setter)
|
245
279
|
else
|
246
280
|
key = if reverse.nil?
|
247
|
-
|
281
|
+
primary_key
|
248
282
|
else
|
249
|
-
reverse ?
|
283
|
+
reverse ? primary_key : "#{assoc_name}_id"
|
250
284
|
end
|
251
285
|
value = association_index[item.send(key)]
|
252
286
|
next if value.nil?
|
253
287
|
|
254
|
-
|
288
|
+
begin
|
289
|
+
item.send(assoc_setter, value)
|
290
|
+
rescue NoMethodError
|
291
|
+
item.send("#{assoc_name}=", value)
|
292
|
+
end
|
255
293
|
end
|
256
294
|
end
|
257
295
|
end
|
@@ -292,6 +330,10 @@ module ReeDao
|
|
292
330
|
s1 = s1.order(*s2.opts[:order])
|
293
331
|
end
|
294
332
|
|
333
|
+
if s1.opts[:schema_mapper] != s2.opts[:schema_mapper]
|
334
|
+
s1 = s1.with_mapper(s2.opts[:schema_mapper])
|
335
|
+
end
|
336
|
+
|
295
337
|
s1
|
296
338
|
end
|
297
339
|
|
@@ -307,5 +349,11 @@ module ReeDao
|
|
307
349
|
|
308
350
|
raise ArgumentError, "can't find DAO for :#{assoc_name}, provide correct scope or association name"
|
309
351
|
end
|
352
|
+
|
353
|
+
def method_missing(method, *args, &block)
|
354
|
+
return super if !parent.agg_caller.private_methods(false).include?(method)
|
355
|
+
|
356
|
+
parent.agg_caller.send(method, *args, &block)
|
357
|
+
end
|
310
358
|
end
|
311
359
|
end
|
@@ -32,8 +32,9 @@ module ReeDao
|
|
32
32
|
contract(
|
33
33
|
Symbol,
|
34
34
|
Ksplat[
|
35
|
-
scope?: Sequel::Dataset,
|
35
|
+
scope?: Or[Sequel::Dataset, Array],
|
36
36
|
setter?: Or[Symbol, Proc],
|
37
|
+
primary_key?: Symbol,
|
37
38
|
foreign_key?: Symbol,
|
38
39
|
autoload_children?: Bool
|
39
40
|
],
|
@@ -46,8 +47,9 @@ module ReeDao
|
|
46
47
|
contract(
|
47
48
|
Symbol,
|
48
49
|
Ksplat[
|
49
|
-
scope?: Sequel::Dataset,
|
50
|
+
scope?: Or[Sequel::Dataset, Array],
|
50
51
|
setter?: Or[Symbol, Proc],
|
52
|
+
primary_key?: Symbol,
|
51
53
|
foreign_key?: Symbol,
|
52
54
|
autoload_children?: Bool
|
53
55
|
],
|
@@ -60,8 +62,9 @@ module ReeDao
|
|
60
62
|
contract(
|
61
63
|
Symbol,
|
62
64
|
Ksplat[
|
63
|
-
scope?: Sequel::Dataset,
|
65
|
+
scope?: Or[Sequel::Dataset, Array],
|
64
66
|
setter?: Or[Symbol, Proc],
|
67
|
+
primary_key?: Symbol,
|
65
68
|
foreign_key?: Symbol,
|
66
69
|
autoload_children?: Bool
|
67
70
|
],
|
@@ -74,8 +77,9 @@ module ReeDao
|
|
74
77
|
contract(
|
75
78
|
Symbol,
|
76
79
|
Ksplat[
|
77
|
-
scope?: Sequel::Dataset,
|
80
|
+
scope?: Or[Sequel::Dataset, Array],
|
78
81
|
setter?: Or[Symbol, Proc],
|
82
|
+
primary_key?: Symbol,
|
79
83
|
foreign_key?: Symbol,
|
80
84
|
autoload_children?: Bool
|
81
85
|
],
|
@@ -96,8 +100,9 @@ module ReeDao
|
|
96
100
|
],
|
97
101
|
Symbol,
|
98
102
|
Ksplat[
|
99
|
-
scope?: Sequel::Dataset,
|
103
|
+
scope?: Or[Sequel::Dataset, Array],
|
100
104
|
setter?: Or[Symbol, Proc],
|
105
|
+
primary_key?: Symbol,
|
101
106
|
foreign_key?: Symbol,
|
102
107
|
autoload_children?: Bool
|
103
108
|
],
|
@@ -151,6 +151,26 @@ module ReeDao
|
|
151
151
|
for_update
|
152
152
|
end
|
153
153
|
|
154
|
+
def with_mapper(mapper)
|
155
|
+
clone(
|
156
|
+
schema_mapper: mapper || opts[:schema_mapper],
|
157
|
+
).with_row_proc(
|
158
|
+
Proc.new { |hash|
|
159
|
+
m = mapper || opts[:schema_mapper]
|
160
|
+
|
161
|
+
if m
|
162
|
+
entity = m.db_load(hash)
|
163
|
+
|
164
|
+
self.set_entity_cache(entity, hash)
|
165
|
+
|
166
|
+
entity
|
167
|
+
else
|
168
|
+
hash
|
169
|
+
end
|
170
|
+
}
|
171
|
+
)
|
172
|
+
end
|
173
|
+
|
154
174
|
private
|
155
175
|
|
156
176
|
def __ree_dao_cache
|
@@ -179,26 +199,6 @@ module ReeDao
|
|
179
199
|
end
|
180
200
|
end
|
181
201
|
|
182
|
-
def with_mapper(mapper)
|
183
|
-
clone(
|
184
|
-
schema_mapper: mapper || opts[:schema_mapper],
|
185
|
-
).with_row_proc(
|
186
|
-
Proc.new { |hash|
|
187
|
-
m = mapper || opts[:schema_mapper]
|
188
|
-
|
189
|
-
if m
|
190
|
-
entity = m.db_load(hash)
|
191
|
-
|
192
|
-
self.set_entity_cache(entity, hash)
|
193
|
-
|
194
|
-
entity
|
195
|
-
else
|
196
|
-
hash
|
197
|
-
end
|
198
|
-
}
|
199
|
-
)
|
200
|
-
end
|
201
|
-
|
202
202
|
def extract_primary_key(entity)
|
203
203
|
if primary_key.is_a?(Array)
|
204
204
|
primary_key.map do |key|
|
@@ -111,7 +111,7 @@ RSpec.describe :load_agg do
|
|
111
111
|
end
|
112
112
|
|
113
113
|
has_one :passport, foreign_key: :user_id, scope: user_passports
|
114
|
-
|
114
|
+
has_one :custom_field, scope: books.where(title: "1984")
|
115
115
|
end
|
116
116
|
end
|
117
117
|
end
|
@@ -186,7 +186,8 @@ RSpec.describe :load_agg do
|
|
186
186
|
load_agg(ids_or_scope, users, **opts) do
|
187
187
|
belongs_to :organization
|
188
188
|
has_many :books, setter: -> (item, items_index) {
|
189
|
-
item.
|
189
|
+
b = items_index[item.id].each { |b| b.title = "Changed" }
|
190
|
+
item.set_books(b)
|
190
191
|
}
|
191
192
|
end
|
192
193
|
end
|
@@ -540,7 +541,7 @@ RSpec.describe :load_agg do
|
|
540
541
|
res = users_agg_block.call(user_1.id)
|
541
542
|
|
542
543
|
u = res[0]
|
543
|
-
expect(u.books).to eq([
|
544
|
+
expect(u.books.map(&:title)).to eq(["Changed"])
|
544
545
|
}
|
545
546
|
|
546
547
|
it {
|
@@ -35,25 +35,45 @@ class ReeDaoLoadAggTest::Db
|
|
35
35
|
end
|
36
36
|
end
|
37
37
|
|
38
|
-
class ReeDaoLoadAggTest::
|
38
|
+
class ReeDaoLoadAggTest::Book
|
39
39
|
include ReeDto::EntityDSL
|
40
40
|
|
41
41
|
properties(
|
42
42
|
id: Nilor[Integer],
|
43
|
-
|
43
|
+
user_id: Integer,
|
44
|
+
title: Nilor[String]
|
44
45
|
)
|
45
46
|
|
46
|
-
def
|
47
|
-
@
|
47
|
+
def set_chapters(chapters)
|
48
|
+
@chapters = chapters; nil
|
48
49
|
end
|
49
50
|
|
50
|
-
def
|
51
|
-
@
|
51
|
+
def chapters
|
52
|
+
@chapters
|
52
53
|
end
|
53
54
|
|
54
|
-
|
55
|
-
|
55
|
+
def set_author(author)
|
56
|
+
@author = author
|
57
|
+
end
|
56
58
|
|
59
|
+
def author
|
60
|
+
@author
|
61
|
+
end
|
62
|
+
|
63
|
+
def set_reviews(reviews)
|
64
|
+
@reviews = reviews; nil
|
65
|
+
end
|
66
|
+
|
67
|
+
def reviews
|
68
|
+
@reviews
|
69
|
+
end
|
70
|
+
|
71
|
+
def title=(t)
|
72
|
+
@title = t
|
73
|
+
end
|
74
|
+
|
75
|
+
attr_accessor :title, :user_id
|
76
|
+
end
|
57
77
|
|
58
78
|
class ReeDaoLoadAggTest::User
|
59
79
|
include ReeDto::EntityDSL
|
@@ -81,10 +101,18 @@ class ReeDaoLoadAggTest::User
|
|
81
101
|
@passport
|
82
102
|
end
|
83
103
|
|
104
|
+
def books
|
105
|
+
@books
|
106
|
+
end
|
107
|
+
|
108
|
+
contract(ArrayOf[ReeDaoLoadAggTest::Book] => nil)
|
109
|
+
def set_books(books)
|
110
|
+
@books = books; nil
|
111
|
+
end
|
112
|
+
|
84
113
|
[
|
85
114
|
:organization,
|
86
115
|
:passport,
|
87
|
-
:books,
|
88
116
|
:movies,
|
89
117
|
:videogames,
|
90
118
|
:hobbies,
|
@@ -106,6 +134,26 @@ class ReeDaoLoadAggTest::User
|
|
106
134
|
attr_accessor :name, :age, :organization_id
|
107
135
|
end
|
108
136
|
|
137
|
+
class ReeDaoLoadAggTest::Organization
|
138
|
+
include ReeDto::EntityDSL
|
139
|
+
|
140
|
+
properties(
|
141
|
+
id: Nilor[Integer],
|
142
|
+
name: String
|
143
|
+
)
|
144
|
+
|
145
|
+
contract(Array[ReeDaoLoadAggTest::User] => nil)
|
146
|
+
def set_users(users)
|
147
|
+
@users = users; nil
|
148
|
+
end
|
149
|
+
|
150
|
+
def users
|
151
|
+
@users ||= []
|
152
|
+
end
|
153
|
+
|
154
|
+
attr_accessor :name
|
155
|
+
end
|
156
|
+
|
109
157
|
|
110
158
|
class ReeDaoLoadAggTest::UserPassport
|
111
159
|
include ReeDto::EntityDSL
|
@@ -189,42 +237,6 @@ class ReeDaoLoadAggTest::Dream
|
|
189
237
|
)
|
190
238
|
end
|
191
239
|
|
192
|
-
class ReeDaoLoadAggTest::Book
|
193
|
-
include ReeDto::EntityDSL
|
194
|
-
|
195
|
-
properties(
|
196
|
-
id: Nilor[Integer],
|
197
|
-
user_id: Integer,
|
198
|
-
title: Nilor[String]
|
199
|
-
)
|
200
|
-
|
201
|
-
def set_chapters(chapters)
|
202
|
-
@chapters = chapters; nil
|
203
|
-
end
|
204
|
-
|
205
|
-
def chapters
|
206
|
-
@chapters
|
207
|
-
end
|
208
|
-
|
209
|
-
def set_author(author)
|
210
|
-
@author = author
|
211
|
-
end
|
212
|
-
|
213
|
-
def author
|
214
|
-
@author
|
215
|
-
end
|
216
|
-
|
217
|
-
def set_reviews(reviews)
|
218
|
-
@reviews = reviews; nil
|
219
|
-
end
|
220
|
-
|
221
|
-
def reviews
|
222
|
-
@reviews
|
223
|
-
end
|
224
|
-
|
225
|
-
attr_accessor :title, :user_id
|
226
|
-
end
|
227
|
-
|
228
240
|
class ReeDaoLoadAggTest::Chapter
|
229
241
|
include ReeDto::EntityDSL
|
230
242
|
|
data/lib/ree_lib/version.rb
CHANGED