ree_lib 1.0.55 → 1.0.56

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7d792b73d0f067a0fc7e935ca257f79f4334afbbb811a060e94cb6de6f2f283c
4
- data.tar.gz: 34fb81648b66cfb4e031650d6145556c05b454c0ca1f66f82ded0c3c774d97d6
3
+ metadata.gz: 23c4603ab3ab820869ca4478b42b3d350c5484c8da7b21c99b469449f45764a1
4
+ data.tar.gz: 4293f4d083185f09f6098e11698b5f35981a748b00ff84e486389bab19445751
5
5
  SHA512:
6
- metadata.gz: 595ed040ab09ad6ff32283152de27cd85e4c4ec09c70777177817e5bc9fd2a19d178cc1caf3d1db35738331e71a3620dd81f3242c7c8d628e2cc36e073d6c47e
7
- data.tar.gz: f2f4ce7c621d154d1e71b0a6cb7426f5c152c0cb2d396b15b859b9fa3df38a979164e091f827279f2d187668e8b53cd181b7adc937b0b6d810bd35186e302945
6
+ metadata.gz: fe885988996c1f0b9aeba40c9f61e119ab4ffc02aa471afe3774b470192fc5601093c1b13673febebad76bf348baa0be61cb2e19a5abf81b1970b518d86ddc9d
7
+ data.tar.gz: acbdf84eacfa6c46c6997999af1e0eb5dc03eedc95b95d954927a3907048c9c28d924328041203d02db1bd5c9dc78310c2cc234db826c74e585a8701b7982ed9
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- ree_lib (1.0.55)
4
+ ree_lib (1.0.56)
5
5
  binding_of_caller (~> 1.0.0)
6
6
  i18n (~> 1.12.0)
7
7
  loofah (~> 2.18.0)
@@ -26,8 +26,12 @@ module ReeDao
26
26
  load_association(assoc_type, assoc_name, **opts, &block)
27
27
  end
28
28
 
29
+ def handle_field(assoc_name, proc)
30
+ proc.call
31
+ end
32
+
29
33
  contract(
30
- Or[:belongs_to, :has_one, :has_many, :field],
34
+ Or[:belongs_to, :has_one, :has_many],
31
35
  Symbol,
32
36
  Ksplat[RestKeys => Any],
33
37
  Optblock => Nilor[Array]
@@ -87,8 +91,7 @@ module ReeDao
87
91
  scope: opts[:scope],
88
92
  primary_key: opts[:primary_key],
89
93
  foreign_key: opts[:foreign_key],
90
- setter: opts[:setter],
91
- skip_dao: true
94
+ setter: opts[:setter]
92
95
  )
93
96
  end
94
97
  end
@@ -112,7 +115,7 @@ module ReeDao
112
115
  parent.local_vars,
113
116
  autoload_children,
114
117
  **global_opts
115
- ).instance_exec(assoc_list, &block).map(&:join)
118
+ ).instance_exec(assoc_list, &block)[:association_threads].map(&:join)
116
119
  end
117
120
  end
118
121
 
@@ -127,20 +130,11 @@ module ReeDao
127
130
  reverse: Bool
128
131
  ] => Or[Hash, Array]
129
132
  )
130
- def one_to_one(
131
- assoc_name,
132
- list,
133
- scope: nil,
134
- primary_key: :id,
135
- foreign_key: nil,
136
- setter: nil,
137
- reverse: true
138
- )
133
+ def one_to_one(assoc_name, list, scope: nil, primary_key: :id, foreign_key: nil, setter: nil, reverse: true)
139
134
  return {} if list.empty?
140
135
 
141
136
  primary_key ||= :id
142
137
 
143
- # TODO: refactor
144
138
  if scope.is_a?(Array)
145
139
  items = scope
146
140
  else
@@ -169,7 +163,9 @@ module ReeDao
169
163
  end
170
164
  end
171
165
 
172
- default_scope = assoc_dao&.where(foreign_key => root_ids)
166
+ default_scope = if !scope
167
+ assoc_dao&.where(foreign_key => root_ids)
168
+ end
173
169
 
174
170
  items = add_scopes(default_scope, scope, global_opts[assoc_name])
175
171
  end
@@ -199,35 +195,27 @@ module ReeDao
199
195
  foreign_key: Nilor[Symbol],
200
196
  primary_key: Nilor[Symbol],
201
197
  scope: Nilor[Sequel::Dataset, Array],
202
- setter: Nilor[Or[Symbol, Proc]],
203
- skip_dao: Bool
198
+ setter: Nilor[Or[Symbol, Proc]]
204
199
  ] => Or[Hash, Array]
205
200
  )
206
- def one_to_many(
207
- assoc_name,
208
- list,
209
- primary_key: nil,
210
- foreign_key: nil,
211
- scope: nil,
212
- setter: nil,
213
- skip_dao: false
214
- )
201
+ def one_to_many(assoc_name, list, primary_key: nil, foreign_key: nil, scope: nil, setter: nil)
215
202
  return {} if list.empty?
216
203
 
217
204
  primary_key ||= :id
218
205
 
219
- # TODO: refactor
220
206
  if scope.is_a?(Array)
221
207
  items = scope
222
208
  else
223
209
  assoc_dao = nil
224
- assoc_dao = find_dao(assoc_name, parent, scope) if !skip_dao
210
+ assoc_dao = find_dao(assoc_name, parent, scope)
225
211
 
226
212
  foreign_key ||= "#{underscore(demodulize(list.first.class.name))}_id".to_sym
227
213
 
228
214
  root_ids = list.map(&:"#{primary_key}")
229
215
 
230
- default_scope = assoc_dao&.where(foreign_key => root_ids)
216
+ default_scope = if !scope
217
+ assoc_dao&.where(foreign_key => root_ids)
218
+ end
231
219
 
232
220
  items = add_scopes(default_scope, scope, global_opts[assoc_name])
233
221
  end
@@ -259,14 +247,7 @@ module ReeDao
259
247
  setter: Nilor[Or[Symbol, Proc]]
260
248
  ] => Any
261
249
  )
262
- def populate_association(
263
- list,
264
- association_index,
265
- assoc_name,
266
- primary_key: nil,
267
- reverse: nil,
268
- setter: nil
269
- )
250
+ def populate_association(list, association_index, assoc_name, primary_key: nil, reverse: nil, setter: nil)
270
251
  assoc_setter = if setter
271
252
  setter
272
253
  else
@@ -296,23 +277,7 @@ module ReeDao
296
277
 
297
278
  contract(Nilor[Sequel::Dataset], Nilor[Sequel::Dataset], Nilor[Proc] => Array)
298
279
  def add_scopes(default_scope, scope, named_scope)
299
- if default_scope && !scope
300
- res = default_scope
301
- end
302
-
303
- if default_scope && scope
304
- if scope == []
305
- res = default_scope
306
- else
307
- res = merge_scopes(default_scope, scope)
308
- end
309
- end
310
-
311
- if !default_scope && scope
312
- return [] if scope.empty?
313
-
314
- res = scope
315
- end
280
+ res = scope || default_scope
316
281
 
317
282
  if named_scope
318
283
  res = named_scope.call(res)
@@ -321,22 +286,6 @@ module ReeDao
321
286
  res.all
322
287
  end
323
288
 
324
- def merge_scopes(s1, s2)
325
- if s2.opts[:where]
326
- s1 = s1.where(s2.opts[:where])
327
- end
328
-
329
- if s2.opts[:order]
330
- s1 = s1.order(*s2.opts[:order])
331
- end
332
-
333
- if s1.opts[:schema_mapper] != s2.opts[:schema_mapper]
334
- s1 = s1.with_mapper(s2.opts[:schema_mapper])
335
- end
336
-
337
- s1
338
- end
339
-
340
289
  def find_dao(assoc_name, parent, scope)
341
290
  dao_from_name = parent.instance_variable_get("@#{assoc_name}") || parent.instance_variable_get("@#{assoc_name}s")
342
291
  return dao_from_name if dao_from_name
@@ -8,14 +8,19 @@ module ReeDao
8
8
  @agg_caller = agg_caller
9
9
  @list = list
10
10
  @local_vars = local_vars
11
- @threads = [] if !self.class.sync_mode?
12
- @global_opts = opts
11
+ @global_opts = opts || {}
13
12
  @only = opts[:only] if opts[:only]
14
13
  @except = opts[:except] if opts[:except]
15
14
  @autoload_children = autoload_children
16
15
 
17
16
  raise ArgumentError.new("you can't use both :only and :except arguments at the same time") if @only && @except
18
17
 
18
+
19
+ if !self.class.sync_mode?
20
+ @assoc_threads = []
21
+ @field_threads = []
22
+ end
23
+
19
24
  local_vars.each do |k, v|
20
25
  instance_variable_set(k, v)
21
26
 
@@ -31,62 +36,34 @@ module ReeDao
31
36
 
32
37
  contract(
33
38
  Symbol,
34
- Ksplat[
35
- scope?: Or[Sequel::Dataset, Array],
36
- setter?: Or[Symbol, Proc],
37
- primary_key?: Symbol,
38
- foreign_key?: Symbol,
39
- autoload_children?: Bool
40
- ],
39
+ Nilor[Proc, Sequel::Dataset],
41
40
  Optblock => Any
42
41
  )
43
- def belongs_to(assoc_name, **opts, &block)
44
- association(__method__, assoc_name, **opts, &block)
42
+ def belongs_to(assoc_name, opts = nil, &block)
43
+ association(__method__, assoc_name, opts, &block)
45
44
  end
46
45
 
47
46
  contract(
48
47
  Symbol,
49
- Ksplat[
50
- scope?: Or[Sequel::Dataset, Array],
51
- setter?: Or[Symbol, Proc],
52
- primary_key?: Symbol,
53
- foreign_key?: Symbol,
54
- autoload_children?: Bool
55
- ],
48
+ Nilor[Proc, Sequel::Dataset],
56
49
  Optblock => Any
57
50
  )
58
- def has_one(assoc_name, **opts, &block)
59
- association(__method__, assoc_name, **opts, &block)
51
+ def has_one(assoc_name, opts = nil, &block)
52
+ association(__method__, assoc_name, opts, &block)
60
53
  end
61
54
 
62
55
  contract(
63
56
  Symbol,
64
- Ksplat[
65
- scope?: Or[Sequel::Dataset, Array],
66
- setter?: Or[Symbol, Proc],
67
- primary_key?: Symbol,
68
- foreign_key?: Symbol,
69
- autoload_children?: Bool
70
- ],
57
+ Nilor[Proc, Sequel::Dataset],
71
58
  Optblock => Any
72
59
  )
73
- def has_many(assoc_name, **opts, &block)
74
- association(__method__, assoc_name, **opts, &block)
60
+ def has_many(assoc_name, opts = nil, &block)
61
+ association(__method__, assoc_name, opts, &block)
75
62
  end
76
63
 
77
- contract(
78
- Symbol,
79
- Ksplat[
80
- scope?: Or[Sequel::Dataset, Array],
81
- setter?: Or[Symbol, Proc],
82
- primary_key?: Symbol,
83
- foreign_key?: Symbol,
84
- autoload_children?: Bool
85
- ],
86
- Optblock => Any
87
- )
88
- def field(assoc_name, **opts, &block)
89
- association(__method__, assoc_name, **opts, &block)
64
+ contract(Symbol, Proc => Any)
65
+ def field(assoc_name, proc)
66
+ association(__method__, assoc_name, proc)
90
67
  end
91
68
 
92
69
  private
@@ -99,27 +76,40 @@ module ReeDao
99
76
  :field
100
77
  ],
101
78
  Symbol,
102
- Ksplat[
103
- scope?: Or[Sequel::Dataset, Array],
104
- setter?: Or[Symbol, Proc],
105
- primary_key?: Symbol,
106
- foreign_key?: Symbol,
107
- autoload_children?: Bool
108
- ],
79
+ Nilor[Proc, Sequel::Dataset],
109
80
  Optblock => Any
110
81
  )
111
- def association(assoc_type, assoc_name, **assoc_opts, &block)
82
+ def association(assoc_type, assoc_name, opts, &block)
112
83
  if self.class.sync_mode?
113
84
  return if association_is_not_included?(assoc_name) || list.empty?
114
-
85
+
115
86
  association = Association.new(self, list, **global_opts)
116
- association.load(assoc_type, assoc_name, **assoc_opts, &block)
87
+ if assoc_type == :field
88
+ association.handle_field(assoc_name, opts)
89
+ else
90
+ association.load(assoc_type, assoc_name, **get_assoc_opts(opts), &block)
91
+ end
117
92
  else
118
- return @threads if association_is_not_included?(assoc_name) || list.empty?
93
+ if association_is_not_included?(assoc_name) || list.empty?
94
+ return { association_threads: @assoc_threads, field_threads: @field_threads }
95
+ end
96
+
97
+ association = Association.new(self, list, **global_opts)
119
98
 
120
- @threads << Thread.new do
121
- association = Association.new(self, list, **global_opts)
122
- association.load(assoc_type, assoc_name, **assoc_opts, &block)
99
+ if assoc_type == :field
100
+ {
101
+ association_threads: @assoc_threads,
102
+ field_threads: @field_threads << Thread.new do
103
+ association.handle_field(assoc_name, opts)
104
+ end
105
+ }
106
+ else
107
+ {
108
+ association_threads: @assoc_threads << Thread.new do
109
+ association.load(assoc_type, assoc_name, **get_assoc_opts(opts), &block)
110
+ end,
111
+ field_threads: @field_threads
112
+ }
123
113
  end
124
114
  end
125
115
  end
@@ -149,5 +139,13 @@ module ReeDao
149
139
 
150
140
  agg_caller.send(method, *args, &block)
151
141
  end
142
+
143
+ def get_assoc_opts(opts)
144
+ if opts.is_a?(Proc)
145
+ opts.call
146
+ else
147
+ {}
148
+ end
149
+ end
152
150
  end
153
151
  end
@@ -10,16 +10,17 @@ class ReeDao::LoadAgg
10
10
  end
11
11
 
12
12
  contract(
13
- Or[Sequel::Dataset, ArrayOf[Integer], ArrayOf[EntityContract], Integer],
14
13
  Nilor[DaoDatasetContract],
14
+ Or[Sequel::Dataset, ArrayOf[Integer], ArrayOf[EntityContract], Integer],
15
15
  Ksplat[
16
16
  only?: ArrayOf[Symbol],
17
17
  except?: ArrayOf[Symbol],
18
+ to_dto?: Proc,
18
19
  RestKeys => Any
19
20
  ],
20
21
  Optblock => ArrayOf[Any]
21
22
  )
22
- def call(ids_or_scope, dao = nil, **opts, &block)
23
+ def call(dao = nil, ids_or_scope, **opts, &block)
23
24
  scope = if ids_or_scope.is_a?(Array) && ids_or_scope.any? { _1.is_a?(Integer) }
24
25
  raise ArgumentError.new("Dao should be provided") if dao.nil?
25
26
  return [] if ids_or_scope.empty?
@@ -35,6 +36,10 @@ class ReeDao::LoadAgg
35
36
 
36
37
  list = scope.is_a?(Sequel::Dataset) ? scope.all : scope
37
38
 
39
+ if opts[:to_dto]
40
+ list = opts[:to_dto].call(list)
41
+ end
42
+
38
43
  load_associations(list, **opts, &block) if block_given?
39
44
 
40
45
  if ids_or_scope.is_a?(Array)
@@ -61,7 +66,8 @@ class ReeDao::LoadAgg
61
66
  if ReeDao.load_sync_associations_enabled?
62
67
  associations
63
68
  else
64
- associations.map(&:join)
69
+ associations[:association_threads].map(&:join)
70
+ associations[:field_threads].map(&:join)
65
71
  end
66
72
  end
67
73
  end
@@ -14,20 +14,20 @@
14
14
  ],
15
15
  "return": "ArrayOf[Any]",
16
16
  "args": [
17
- {
18
- "arg": "ids_or_scope",
19
- "arg_type": "req",
20
- "type": "Or[Sequel::Dataset, ArrayOf[Integer], ArrayOf[PackageName::Entity], Integer]"
21
- },
22
17
  {
23
18
  "arg": "dao",
24
19
  "arg_type": "opt",
25
20
  "type": "Nilor[PackageName::DaoName::Dao: \"SELECT * FROM `table`\"]"
26
21
  },
22
+ {
23
+ "arg": "ids_or_scope",
24
+ "arg_type": "req",
25
+ "type": "Or[Sequel::Dataset, ArrayOf[Integer], ArrayOf[PackageName::Entity], Integer]"
26
+ },
27
27
  {
28
28
  "arg": "opts",
29
29
  "arg_type": "keyrest",
30
- "type": "Ksplat[:only? => ArrayOf[Symbol], :except? => ArrayOf[Symbol], \"RestKeys\" => Any]"
30
+ "type": "Ksplat[:only? => ArrayOf[Symbol], :except? => ArrayOf[Symbol], :to_dto? => Proc, \"RestKeys\" => Any]"
31
31
  },
32
32
  {
33
33
  "arg": "block",
@@ -99,19 +99,67 @@ RSpec.describe :load_agg do
99
99
  end
100
100
 
101
101
  def call(ids_or_scope, **opts)
102
- load_agg(ids_or_scope, users, **opts) do
102
+ load_agg(users, ids_or_scope, **opts) do |users_list|
103
103
  belongs_to :organization
104
- has_many :books do
104
+ has_many :books do |books_list|
105
105
  has_one :author
106
106
  has_many :chapters
107
107
 
108
- has_many :reviews do
108
+ has_many :reviews do |reviews_list|
109
109
  has_one :review_author
110
+
111
+ field :review_calculatetable_field, -> { some_method(reviews_list) }
110
112
  end
113
+
114
+ field :book_calculatetable_field, -> { change_book_titles(books_list) }
111
115
  end
112
116
 
113
- has_one :passport, foreign_key: :user_id, scope: user_passports
114
- has_one :custom_field, scope: books.where(title: "1984")
117
+ has_one :passport, -> { passport_opts }
118
+ has_one :custom_field, -> { custom_field_opts }
119
+
120
+ field :user_calculatetable_field, -> { some_method(users_list) }
121
+ end
122
+ end
123
+
124
+ private
125
+
126
+ def change_book_titles(books_list)
127
+ books_list.each do |book|
128
+ book.title = "#{book.title.upcase} changed"
129
+ end
130
+ end
131
+
132
+ def some_method(list)
133
+ puts list.map(&:id)
134
+ puts list.map { _1.class.name }
135
+ end
136
+
137
+ def passport_opts
138
+ {
139
+ foreign_key: :user_id,
140
+ scope: user_passports
141
+ }
142
+ end
143
+
144
+ def custom_field_opts
145
+ {
146
+ scope: books.where(title: "1984")
147
+ }
148
+ end
149
+ end
150
+
151
+ class ReeDaoLoadAggTest::UsersAggWithDto
152
+ include ReeDao::AggregateDSL
153
+
154
+ aggregate :users_agg_with_dto do
155
+ link :users, from: :ree_dao_load_agg_test
156
+ link :organizations, from: :ree_dao_load_agg_test
157
+ link :load_agg, from: :ree_dao
158
+ end
159
+
160
+ def call(ids_or_scope, **opts)
161
+ load_agg(users, ids_or_scope, **opts) do
162
+ belongs_to :organization
115
163
  end
116
164
  end
117
165
  end
@@ -130,9 +178,9 @@ RSpec.describe :load_agg do
130
178
  end
131
179
 
132
180
  def call(ids_or_scope, **opts)
133
- load_agg(ids_or_scope, users, **opts) do
181
+ load_agg(users, ids_or_scope, **opts) do
134
182
  belongs_to :organization
135
- has_many :books, autoload_children: true do
183
+ has_many :books, -> { books_opts } do
136
184
  has_one :author
137
185
  has_many :chapters
138
186
 
@@ -142,6 +190,12 @@ RSpec.describe :load_agg do
142
190
  end
143
191
  end
144
192
  end
193
+
194
+ private
195
+
196
+ def books_opts
197
+ { autoload_children: true }
198
+ end
145
199
  end
146
200
 
147
201
  class ReeDaoLoadAggTest::UsersAggAutoloadReviewsChildren
@@ -158,18 +212,24 @@ RSpec.describe :load_agg do
158
212
  end
159
213
 
160
214
  def call(ids_or_scope, **opts)
161
- load_agg(ids_or_scope, users, **opts) do
215
+ load_agg(users, ids_or_scope, **opts) do
162
216
  belongs_to :organization
163
217
  has_many :books do
164
218
  has_one :author
165
219
  has_many :chapters
166
220
 
167
- has_many :reviews, autoload_children: true do
221
+ has_many :reviews, -> { { autoload_children: true } } do
168
222
  has_one :review_author
169
223
  end
170
224
  end
171
225
  end
172
226
  end
227
+
228
+ private
229
+
230
+ def reviews_opts
231
+ { autoload_children: true }
232
+ end
173
233
  end
174
234
 
175
235
  class ReeDaoLoadAggTest::UsersAggBlockTest
@@ -183,13 +243,21 @@ RSpec.describe :load_agg do
183
243
  end
184
244
 
185
245
  def call(ids_or_scope, **opts)
186
- load_agg(ids_or_scope, users, **opts) do
246
+ load_agg(users, ids_or_scope, **opts) do
187
247
  belongs_to :organization
188
- has_many :books, setter: -> (item, items_index) {
248
+ has_many :books, -> { books_opts }
249
+ end
250
+ end
251
+
252
+ private
253
+
254
+ def books_opts
255
+ {
256
+ setter: -> (item, items_index) {
189
257
  b = items_index[item.id].each { |b| b.title = "Changed" }
190
258
  item.set_books(b)
191
259
  }
192
- end
260
+ }
193
261
  end
194
262
  end
195
263
 
@@ -204,17 +272,21 @@ RSpec.describe :load_agg do
204
272
  end
205
273
 
206
274
  def call(ids_or_scope, **opts)
207
- load_agg(ids_or_scope, users, **opts) do |agg_list|
275
+ load_agg(users, ids_or_scope, **opts) do |agg_list|
208
276
  some_id = agg_list.first.id
209
277
  title = "1984"
210
278
  belongs_to :organization
211
279
 
212
- has_many :books, scope: books_scope(title)
280
+ has_many :books, -> { books_opts(title) }
213
281
  end
214
282
  end
215
283
 
216
284
  private
217
285
 
286
+ def books_opts(title)
287
+ { scope: books_scope(title) }
288
+ end
289
+
218
290
  def books_scope(title)
219
291
  books.where(title: title)
220
292
  end
@@ -231,7 +303,7 @@ RSpec.describe :load_agg do
231
303
  end
232
304
 
233
305
  def call(ids_or_scope, **opts)
234
- load_agg(ids_or_scope, users, **opts) do
306
+ load_agg(users, ids_or_scope, **opts) do
235
307
  has_many :something
236
308
  end
237
309
  end
@@ -243,6 +315,7 @@ RSpec.describe :load_agg do
243
315
  let(:users_agg_autoload_books_children) { ReeDaoLoadAggTest::UsersAggAutoloadBooksChildren.new }
244
316
  let(:users_agg_autoload_reviews_children) { ReeDaoLoadAggTest::UsersAggAutoloadReviewsChildren.new }
245
317
  let(:users_agg_without_dao) { ReeDaoLoadAggTest::UsersAggWithoutDao.new }
318
+ let(:users_agg_with_dto) { ReeDaoLoadAggTest::UsersAggWithDto.new }
246
319
  let(:organizations) { ReeDaoLoadAggTest::Organizations.new }
247
320
  let(:users) { ReeDaoLoadAggTest::Users.new }
248
321
  let(:user_passports) { ReeDaoLoadAggTest::UserPassports.new }
@@ -267,6 +340,37 @@ RSpec.describe :load_agg do
267
340
  }.to raise_error(ArgumentError)
268
341
  }
269
342
 
343
+ it {
344
+ organizations.delete_all
345
+ users.delete_all
346
+
347
+ organization = ReeDaoLoadAggTest::Organization.new(name: "Test Org")
348
+ organizations.put(organization)
349
+
350
+ user_1 = ReeDaoLoadAggTest::User.new(name: "John", age: 33, organization_id: organization.id)
351
+ user_2 = ReeDaoLoadAggTest::User.new(name: "Sam", age: 21, organization_id: organization.id)
352
+ users.put(user_1)
353
+ users.put(user_2)
354
+
355
+ res = users_agg_with_dto.call(
356
+ users.all,
357
+ to_dto: -> (users) {
358
+ users.map do |user|
359
+ ReeDaoLoadAggTest::UserDto.new(
360
+ id: user.id,
361
+ name: user.name,
362
+ organization_id: user.organization_id,
363
+ full_name: user.name
364
+ )
365
+ end
366
+ }
367
+ )
368
+
369
+ res_user = res[0]
370
+
371
+ expect(res_user.class).to eq(ReeDaoLoadAggTest::UserDto)
372
+ }
373
+
270
374
  it {
271
375
  organizations.delete_all
272
376
  users.delete_all
@@ -317,6 +421,7 @@ RSpec.describe :load_agg do
317
421
  expect(res_user.passport).to eq(passport_1)
318
422
  expect(res_user.passport.info).to eq("some info")
319
423
  expect(res_user.books.count).to eq(2)
424
+ expect(res_user.books.map(&:title)).to eq(["1984 changed", "1408 changed"])
320
425
  expect(res_user.books[0].author.name).to eq("George Orwell")
321
426
  expect(res_user.books[0].chapters.map(&:title)).to eq(["beginning"])
322
427
  expect(res_user.books[0].reviews[0].review_author.name).to eq("John Review")
@@ -595,7 +700,7 @@ RSpec.describe :load_agg do
595
700
 
596
701
  ids = [user_1, user_2].map(&:id)
597
702
 
598
- res = load_agg(ids, users)
703
+ res = load_agg(users, ids)
599
704
  expect(res.count).to eq(2)
600
705
  }
601
706
 
@@ -609,7 +714,7 @@ RSpec.describe :load_agg do
609
714
  user_1 = ReeDaoLoadAggTest::User.new(name: "John", age: 33, organization_id: organization.id)
610
715
  users.put(user_1)
611
716
 
612
- res = load_agg(user_1.id, users)
717
+ res = load_agg(users, user_1.id)
613
718
  expect(res.count).to eq(1)
614
719
  }
615
720
 
@@ -625,7 +730,7 @@ RSpec.describe :load_agg do
625
730
  users.put(user_1)
626
731
  users.put(user_2)
627
732
 
628
- res = load_agg(users.where(organization_id: organization.id), users)
733
+ res = load_agg(users, users.where(organization_id: organization.id))
629
734
  expect(res.count).to eq(2)
630
735
  }
631
736
  end
@@ -134,6 +134,25 @@ class ReeDaoLoadAggTest::User
134
134
  attr_accessor :name, :age, :organization_id
135
135
  end
136
136
 
137
+ class ReeDaoLoadAggTest::UserDto
138
+ include ReeDto::EntityDSL
139
+
140
+ properties(
141
+ id: Integer,
142
+ organization_id: Integer,
143
+ name: String,
144
+ full_name: String,
145
+ )
146
+
147
+ def set_organization(org)
148
+ @organization = org; nil
149
+ end
150
+
151
+ def organization
152
+ @organization
153
+ end
154
+ end
155
+
137
156
  class ReeDaoLoadAggTest::Organization
138
157
  include ReeDto::EntityDSL
139
158
 
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ReeLib
4
- VERSION = "1.0.55"
4
+ VERSION = "1.0.56"
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ree_lib
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.55
4
+ version: 1.0.56
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ruslan Gatiyatov
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2023-07-28 00:00:00.000000000 Z
11
+ date: 2023-07-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: ree