ree_lib 1.0.59 → 1.0.61

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ae96c3d6f51872601ad8c4a282cc8119e069a49a2942e624a3eed02817bbf450
4
- data.tar.gz: 962693ff78a273ff60ab20f1e704759038e0402619c84ce2da5735f16cca28ad
3
+ metadata.gz: a16fe3f260e9c08dfa590a34ffeafce9413115416aaedc37bcb4ee50fbd5ae67
4
+ data.tar.gz: d93566783538e0ea2eb9aba94938a3eccdb34901197d5e38afa9f03da9e5f826
5
5
  SHA512:
6
- metadata.gz: 562c425026b16d0389287831ea2da44c08e79818c4f238e52f8e3ee0bb62bf36bc8e4bbfc75e3dbe658706a0b735c4c3e0e572287048e9a3095055e7183bfa62
7
- data.tar.gz: 54c6f30b6c62de9a43284fc76fcf432e9b0c70691de5d0aaf074c8b4cdb9b889f816ee8219c2ba4e660684899793db9a1c3cd7f502f5567fbe32d9df105b7a67
6
+ metadata.gz: d1b98f584c71eb035a29a411161a9556aef71ce4b2d9e292e219e767e335ba9cbfa3c8b7fa49e776d846732f84af7c7f6cc5ce91bcfe5a975bd7cf91a843ad83
7
+ data.tar.gz: b4106abe1f03951c28959f8b9edc4c5f66ff05dcc1788bd2c1e268dd02f0487350ba5074c62eafd73244435dd42a3e034d87e873aaf5c5e11f3791b4884a83f4
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- ree_lib (1.0.59)
4
+ ree_lib (1.0.61)
5
5
  binding_of_caller (~> 1.0.0)
6
6
  i18n (~> 1.12.0)
7
7
  loofah (~> 2.18.0)
@@ -2,16 +2,15 @@ module ReeDao
2
2
  class Association
3
3
  include Ree::LinkDSL
4
4
 
5
- link :demodulize, from: :ree_string
6
5
  link :group_by, from: :ree_array
7
6
  link :index_by, from: :ree_array
8
- link :underscore, from: :ree_string
9
7
 
10
- attr_reader :parent, :list, :global_opts
8
+ attr_reader :parent, :parent_dao_name, :list, :global_opts
11
9
 
12
- contract(ReeDao::Associations, Array, Ksplat[RestKeys => Any] => Any)
13
- def initialize(parent, list, **global_opts)
10
+ contract(ReeDao::Associations, Symbol, Array, Ksplat[RestKeys => Any] => Any)
11
+ def initialize(parent, parent_dao_name, list, **global_opts)
14
12
  @parent = parent
13
+ @parent_dao_name = parent_dao_name
15
14
  @list = list
16
15
  @global_opts = global_opts
17
16
  end
@@ -37,13 +36,18 @@ module ReeDao
37
36
  Optblock => Nilor[Array]
38
37
  )
39
38
  def load_association(assoc_type, assoc_name, **opts, &block)
39
+ opts[:autoload_children] ||= false
40
+
40
41
  assoc_index = load_association_by_type(
41
42
  assoc_type,
42
43
  assoc_name,
43
44
  **opts
44
45
  )
45
46
 
46
- process_block(assoc_index, opts[:autoload_children] ||= false, &block) if block_given?
47
+ dao = find_dao(assoc_name, parent, opts[:scope])
48
+ dao_name = dao.first_source_table
49
+
50
+ process_block(assoc_index, opts[:autoload_children], opts[:to_dto], dao_name, &block) if block_given?
47
51
 
48
52
  list
49
53
  end
@@ -57,6 +61,7 @@ module ReeDao
57
61
  case type
58
62
  when :belongs_to
59
63
  one_to_one(
64
+ parent_dao_name,
60
65
  assoc_name,
61
66
  list,
62
67
  scope: opts[:scope],
@@ -67,44 +72,46 @@ module ReeDao
67
72
  )
68
73
  when :has_one
69
74
  one_to_one(
75
+ parent_dao_name,
70
76
  assoc_name,
71
77
  list,
72
78
  scope: opts[:scope],
73
79
  primary_key: opts[:primary_key],
74
80
  foreign_key: opts[:foreign_key],
81
+ to_dto: opts[:to_dto],
75
82
  setter: opts[:setter],
76
83
  reverse: true
77
84
  )
78
85
  when :has_many
79
86
  one_to_many(
87
+ parent_dao_name,
80
88
  assoc_name,
81
89
  list,
82
90
  scope: opts[:scope],
83
91
  primary_key: opts[:primary_key],
84
92
  foreign_key: opts[:foreign_key],
85
- setter: opts[:setter]
86
- )
87
- else
88
- one_to_many(
89
- assoc_name,
90
- list,
91
- scope: opts[:scope],
92
- primary_key: opts[:primary_key],
93
- foreign_key: opts[:foreign_key],
93
+ to_dto: opts[:to_dto],
94
94
  setter: opts[:setter]
95
95
  )
96
96
  end
97
97
  end
98
98
 
99
- contract(Or[Hash, Array], Bool, Block => Any)
100
- def process_block(assoc, autoload_children, &block)
99
+ contract(Or[Hash, Array], Bool, Nilor[Proc], Symbol, Block => Any)
100
+ def process_block(assoc, autoload_children, to_dto, parent_dao_name, &block)
101
101
  assoc_list = assoc.is_a?(Array) ? assoc : assoc.values.flatten
102
102
 
103
+ if to_dto
104
+ assoc_list = assoc_list.map do |item|
105
+ to_dto.call(item)
106
+ end
107
+ end
108
+
103
109
  if ReeDao::Associations.sync_mode?
104
110
  ReeDao::Associations.new(
105
111
  parent.agg_caller,
106
112
  assoc_list,
107
113
  parent.local_vars,
114
+ parent_dao_name,
108
115
  autoload_children,
109
116
  **global_opts
110
117
  ).instance_exec(assoc_list, &block)
@@ -113,6 +120,7 @@ module ReeDao
113
120
  parent.agg_caller,
114
121
  assoc_list,
115
122
  parent.local_vars,
123
+ parent_dao_name,
116
124
  autoload_children,
117
125
  **global_opts
118
126
  ).instance_exec(assoc_list, &block)
@@ -131,6 +139,7 @@ module ReeDao
131
139
  end
132
140
 
133
141
  contract(
142
+ Symbol,
134
143
  Symbol,
135
144
  Array,
136
145
  Kwargs[
@@ -138,10 +147,11 @@ module ReeDao
138
147
  foreign_key: Nilor[Symbol],
139
148
  scope: Nilor[Sequel::Dataset, Array],
140
149
  setter: Nilor[Or[Symbol, Proc]],
150
+ to_dto: Nilor[Proc],
141
151
  reverse: Bool
142
152
  ] => Or[Hash, Array]
143
153
  )
144
- def one_to_one(assoc_name, list, scope: nil, primary_key: :id, foreign_key: nil, setter: nil, reverse: true)
154
+ def one_to_one(parent_assoc_name, assoc_name, list, scope: nil, primary_key: :id, foreign_key: nil, setter: nil, to_dto: nil, reverse: true)
145
155
  return {} if list.empty?
146
156
 
147
157
  primary_key ||= :id
@@ -153,39 +163,26 @@ module ReeDao
153
163
 
154
164
  if reverse
155
165
  if !foreign_key
156
- name = underscore(demodulize(list.first.class.name))
157
- foreign_key = "#{name}_id".to_sym
166
+ foreign_key = "#{parent_assoc_name.to_s.gsub(/e?s$/,'')}_id".to_sym
158
167
  end
159
168
 
160
169
  root_ids = list.map(&:id).uniq
161
170
  else
162
171
  if !foreign_key
163
- dto_class = assoc_dao
164
- .opts[:schema_mapper]
165
- .dto(:db_load)
166
-
167
- name = underscore(demodulize(dto_class.name))
168
-
169
- root_ids = list.map(&:"#{"#{name}_id".to_sym}").uniq
170
- foreign_key = :id
171
- else
172
- root_ids = list.map(&:"#{foreign_key}")
173
- foreign_key = :id
172
+ foreign_key = :"#{assoc_name}_id"
174
173
  end
174
+
175
+ root_ids = list.map(&:"#{foreign_key}").compact
175
176
  end
176
177
 
177
- default_scope = if !scope
178
- assoc_dao&.where(foreign_key => root_ids)
179
- end
180
-
181
- items = add_scopes(default_scope, scope, global_opts[assoc_name])
178
+ scope ||= assoc_dao
179
+ scope = scope.where((reverse ? foreign_key : :id) => root_ids)
180
+
181
+ items = add_scopes(scope, global_opts[assoc_name])
182
182
  end
183
183
 
184
- assoc = if foreign_key
185
- index_by(items) { _1.send(foreign_key) }
186
- else
187
- items
188
- end
184
+
185
+ assoc = index_by(items) { _1.send(reverse ? foreign_key : :id) }
189
186
 
190
187
  populate_association(
191
188
  list,
@@ -193,23 +190,26 @@ module ReeDao
193
190
  assoc_name,
194
191
  setter: setter,
195
192
  reverse: reverse,
196
- primary_key: primary_key
193
+ primary_key: primary_key,
194
+ to_dto: to_dto
197
195
  )
198
196
 
199
197
  assoc
200
198
  end
201
199
 
202
200
  contract(
201
+ Symbol,
203
202
  Symbol,
204
203
  Array,
205
204
  Kwargs[
206
205
  foreign_key: Nilor[Symbol],
207
206
  primary_key: Nilor[Symbol],
208
207
  scope: Nilor[Sequel::Dataset, Array],
209
- setter: Nilor[Or[Symbol, Proc]]
208
+ setter: Nilor[Or[Symbol, Proc]],
209
+ to_dto: Nilor[Proc]
210
210
  ] => Or[Hash, Array]
211
211
  )
212
- def one_to_many(assoc_name, list, primary_key: nil, foreign_key: nil, scope: nil, setter: nil)
212
+ def one_to_many(parent_assoc_name, assoc_name, list, primary_key: nil, foreign_key: nil, scope: nil, setter: nil, to_dto: nil)
213
213
  return {} if list.empty?
214
214
 
215
215
  primary_key ||= :id
@@ -220,15 +220,14 @@ module ReeDao
220
220
  assoc_dao = nil
221
221
  assoc_dao = find_dao(assoc_name, parent, scope)
222
222
 
223
- foreign_key ||= "#{underscore(demodulize(list.first.class.name))}_id".to_sym
223
+ foreign_key ||= "#{parent_assoc_name.to_s.gsub(/e?s$/,'')}_id".to_sym
224
224
 
225
225
  root_ids = list.map(&:"#{primary_key}")
226
226
 
227
- default_scope = if !scope
228
- assoc_dao&.where(foreign_key => root_ids)
229
- end
227
+ scope ||= assoc_dao
228
+ scope = scope.where(foreign_key => root_ids)
230
229
 
231
- items = add_scopes(default_scope, scope, global_opts[assoc_name])
230
+ items = add_scopes(scope, global_opts[assoc_name])
232
231
  end
233
232
 
234
233
  assoc = if foreign_key
@@ -243,6 +242,7 @@ module ReeDao
243
242
  assoc_name,
244
243
  setter: setter,
245
244
  primary_key: primary_key,
245
+ to_dto: to_dto,
246
246
  multiple: true
247
247
  )
248
248
 
@@ -257,10 +257,11 @@ module ReeDao
257
257
  primary_key: Nilor[Symbol],
258
258
  reverse: Nilor[Bool],
259
259
  setter: Nilor[Or[Symbol, Proc]],
260
+ to_dto: Nilor[Proc],
260
261
  multiple: Bool
261
262
  ] => Any
262
263
  )
263
- def populate_association(list, association_index, assoc_name, primary_key: nil, reverse: nil, setter: nil, multiple: false)
264
+ def populate_association(list, association_index, assoc_name, primary_key: nil, reverse: nil, setter: nil, to_dto: nil, multiple: false)
264
265
  assoc_setter = if setter
265
266
  setter
266
267
  else
@@ -278,7 +279,17 @@ module ReeDao
278
279
  end
279
280
  value = association_index[item.send(key)]
280
281
 
281
- value = [] if value.nil? && multiple
282
+ if to_dto && !value.nil?
283
+ if value.is_a?(Array)
284
+ value = value.map { to_dto.call(_1) }
285
+ else
286
+ value = to_dto.call(value)
287
+ end
288
+ end
289
+
290
+ if value.nil? && multiple
291
+ value = []
292
+ end
282
293
 
283
294
  begin
284
295
  item.send(assoc_setter, value)
@@ -289,12 +300,12 @@ module ReeDao
289
300
  end
290
301
  end
291
302
 
292
- contract(Nilor[Sequel::Dataset], Nilor[Sequel::Dataset], Nilor[Proc] => Array)
293
- def add_scopes(default_scope, scope, named_scope)
294
- res = scope || default_scope
295
-
296
- if named_scope
297
- res = named_scope.call(res)
303
+ contract(Nilor[Sequel::Dataset], Nilor[Proc] => Array)
304
+ def add_scopes(scope, named_scope)
305
+ res = if named_scope
306
+ named_scope.call(scope)
307
+ else
308
+ scope
298
309
  end
299
310
 
300
311
  res.all
@@ -2,15 +2,16 @@ module ReeDao
2
2
  class Associations
3
3
  include Ree::LinkDSL
4
4
 
5
- attr_reader :agg_caller, :list, :local_vars, :only, :except, :autoload_children, :global_opts
5
+ attr_reader :agg_caller, :list, :local_vars, :only, :except, :parent_dao_name, :autoload_children, :global_opts
6
6
 
7
- def initialize(agg_caller, list, local_vars, autoload_children = false, **opts)
7
+ def initialize(agg_caller, list, local_vars, parent_dao_name, autoload_children = false, **opts)
8
8
  @agg_caller = agg_caller
9
9
  @list = list
10
10
  @local_vars = local_vars
11
11
  @global_opts = opts || {}
12
12
  @only = opts[:only] if opts[:only]
13
13
  @except = opts[:except] if opts[:except]
14
+ @parent_dao_name = parent_dao_name
14
15
  @autoload_children = autoload_children
15
16
 
16
17
  raise ArgumentError.new("you can't use both :only and :except arguments at the same time") if @only && @except
@@ -83,7 +84,7 @@ module ReeDao
83
84
  if self.class.sync_mode?
84
85
  return if association_is_not_included?(assoc_name) || list.empty?
85
86
 
86
- association = Association.new(self, list, **global_opts)
87
+ association = Association.new(self, parent_dao_name, list, **global_opts)
87
88
  if assoc_type == :field
88
89
  association.handle_field(assoc_name, opts)
89
90
  else
@@ -94,7 +95,7 @@ module ReeDao
94
95
  return { association_threads: @assoc_threads, field_threads: @field_threads }
95
96
  end
96
97
 
97
- association = Association.new(self, list, **global_opts)
98
+ association = Association.new(self, parent_dao_name, list, **global_opts)
98
99
 
99
100
  if assoc_type == :field
100
101
  field_proc = opts
@@ -4,6 +4,8 @@ class ReeDao::LoadAgg
4
4
  include Ree::FnDSL
5
5
 
6
6
  fn :load_agg do
7
+ link :demodulize, from: :ree_string
8
+ link :underscore, from: :ree_string
7
9
  link "ree_dao/associations", -> { Associations }
8
10
  link "ree_dao/contract/dao_dataset_contract", -> { DaoDatasetContract }
9
11
  link "ree_dao/contract/entity_contract", -> { EntityContract }
@@ -34,6 +36,12 @@ class ReeDao::LoadAgg
34
36
  ids_or_scope
35
37
  end
36
38
 
39
+ if dao
40
+ dao_name = dao.first_source_table
41
+ else
42
+ dao_name = underscore(demodulize(scope.first.class.name)).to_sym
43
+ end
44
+
37
45
  list = scope.is_a?(Sequel::Dataset) ? scope.all : scope
38
46
 
39
47
  if opts[:to_dto]
@@ -42,7 +50,7 @@ class ReeDao::LoadAgg
42
50
  end
43
51
  end
44
52
 
45
- load_associations(list, **opts, &block) if block_given?
53
+ load_associations(dao_name, list, **opts, &block) if block_given?
46
54
 
47
55
  if ids_or_scope.is_a?(Array)
48
56
  list.sort_by { ids_or_scope.index(_1.id) }
@@ -53,7 +61,7 @@ class ReeDao::LoadAgg
53
61
 
54
62
  private
55
63
 
56
- def load_associations(list, **opts, &block)
64
+ def load_associations(dao_name, list, **opts, &block)
57
65
  return if list.empty?
58
66
 
59
67
  local_vars = block.binding.eval(<<-CODE, __FILE__, __LINE__ + 1)
@@ -63,7 +71,7 @@ class ReeDao::LoadAgg
63
71
 
64
72
  agg_caller = block.binding.eval("self")
65
73
 
66
- associations = Associations.new(agg_caller, list, local_vars, **opts).instance_exec(list, &block)
74
+ associations = Associations.new(agg_caller, list, local_vars, dao_name, **opts).instance_exec(list, &block)
67
75
 
68
76
  if ReeDao.load_sync_associations_enabled?
69
77
  associations
@@ -38,6 +38,21 @@
38
38
  }
39
39
  ],
40
40
  "links": [
41
+ {
42
+ "target": "demodulize",
43
+ "package_name": "ree_string",
44
+ "as": "demodulize",
45
+ "imports": [
46
+
47
+ ]
48
+ },
49
+ {
50
+ "target": "underscore",
51
+ "package_name": "ree_string",
52
+ "as": "underscore",
53
+ "imports": [
41
54
 
55
+ ]
56
+ }
42
57
  ]
43
58
  }
@@ -153,6 +153,9 @@ RSpec.describe :load_agg do
153
153
 
154
154
  aggregate :users_agg_with_dto do
155
155
  link :users, from: :ree_dao_load_agg_test
156
+ link :books, from: :ree_dao_load_agg_test
157
+ link :authors, from: :ree_dao_load_agg_test
158
+ link :chapters, from: :ree_dao_load_agg_test
156
159
  link :organizations, from: :ree_dao_load_agg_test
157
160
  link :load_agg, from: :ree_dao
158
161
  end
@@ -160,8 +163,27 @@ RSpec.describe :load_agg do
160
163
  def call(ids_or_scope, **opts)
161
164
  load_agg(users, ids_or_scope, **opts) do
162
165
  belongs_to :organization
166
+
167
+ has_many :books, -> { books_opts } do
168
+ has_one :author, -> { author_opts }
169
+ has_many :chapters, -> { chapters_opts }
170
+ end
163
171
  end
164
172
  end
173
+
174
+ private
175
+
176
+ def books_opts
177
+ { to_dto: -> (book) { ReeDaoLoadAggTest::BookDto.new(book) }}
178
+ end
179
+
180
+ def author_opts
181
+ { to_dto: -> (author) { ReeDaoLoadAggTest::AuthorDto.new(author) }}
182
+ end
183
+
184
+ def chapters_opts
185
+ { to_dto: -> (chapter) { ReeDaoLoadAggTest::ChapterDto.new(chapter) }}
186
+ end
165
187
  end
166
188
 
167
189
  class ReeDaoLoadAggTest::UsersAggAutoloadBooksChildren
@@ -278,6 +300,7 @@ RSpec.describe :load_agg do
278
300
  belongs_to :organization
279
301
 
280
302
  has_many :books, -> { books_opts(title) }
303
+ has_many :active_books, books
281
304
  end
282
305
  end
283
306
 
@@ -369,6 +392,12 @@ RSpec.describe :load_agg do
369
392
  users.put(user_1)
370
393
  users.put(user_2)
371
394
 
395
+ book_1 = ReeDaoLoadAggTest::Book.new(user_id: user_1.id, title: "1984")
396
+ books.put(book_1)
397
+
398
+ authors.put(ReeDaoLoadAggTest::Author.new(book_id: book_1.id, name: "George Orwell"))
399
+ chapters.put(ReeDaoLoadAggTest::Chapter.new(book_id: book_1.id, title: "interlude"))
400
+
372
401
  res = users_agg_with_dto.call(
373
402
  users.all,
374
403
  to_dto: -> (user) {
@@ -381,7 +410,12 @@ RSpec.describe :load_agg do
381
410
  }
382
411
  )
383
412
 
413
+ book = res.first.books.first
414
+
384
415
  expect(res.first.class).to eq(ReeDaoLoadAggTest::UserDto)
416
+ expect(book.class).to eq(ReeDaoLoadAggTest::BookDto)
417
+ expect(book.author.class).to eq(ReeDaoLoadAggTest::AuthorDto)
418
+ expect(book.chapters.first.class).to eq(ReeDaoLoadAggTest::ChapterDto)
385
419
  }
386
420
 
387
421
  it {
@@ -508,6 +542,45 @@ RSpec.describe :load_agg do
508
542
  expect(res[0].books[1].author).to eq(nil)
509
543
  }
510
544
 
545
+ it {
546
+ organizations.delete_all
547
+ users.delete_all
548
+ user_passports.delete_all
549
+ books.delete_all
550
+ chapters.delete_all
551
+
552
+ organization = ReeDaoLoadAggTest::Organization.new(name: "Test Org")
553
+ organizations.put(organization)
554
+
555
+ user_1 = ReeDaoLoadAggTest::User.new(name: "John", age: 33, organization_id: organization.id)
556
+ user_2 = ReeDaoLoadAggTest::User.new(name: "Sam", age: 21, organization_id: organization.id)
557
+ users.put(user_1)
558
+ users.put(user_2)
559
+
560
+ book_1 = ReeDaoLoadAggTest::Book.new(user_id: user_1.id, title: "1984")
561
+ book_2 = ReeDaoLoadAggTest::Book.new(user_id: user_1.id, title: "1408")
562
+
563
+ books.put(book_1)
564
+ books.put(book_2)
565
+
566
+ res = users_agg.call(
567
+ users.all
568
+ )
569
+
570
+ expect(res[0].books).to_not eq([])
571
+ expect(res[1].books).to eq([])
572
+
573
+ books.delete(book_1)
574
+ books.delete(book_2)
575
+
576
+ res = users_agg.call(
577
+ users.all
578
+ )
579
+
580
+ expect(res[0].books).to eq([])
581
+ expect(res[1].books).to eq([])
582
+ }
583
+
511
584
  it {
512
585
  organizations.delete_all
513
586
  users.delete_all
@@ -533,6 +606,7 @@ RSpec.describe :load_agg do
533
606
  expect(res_user.id).to eq(user_1.id)
534
607
  expect(res_user.organization).to eq(organization)
535
608
  expect(res_user.books.count).to eq(1)
609
+ expect(res_user.active_books.count).to eq(2)
536
610
  }
537
611
 
538
612
  it {
@@ -75,6 +75,9 @@ class ReeDaoLoadAggTest::Book
75
75
  attr_accessor :title, :user_id
76
76
  end
77
77
 
78
+ class ReeDaoLoadAggTest::BookDto < SimpleDelegator
79
+ end
80
+
78
81
  class ReeDaoLoadAggTest::User
79
82
  include ReeDto::EntityDSL
80
83
 
@@ -105,6 +108,14 @@ class ReeDaoLoadAggTest::User
105
108
  @books
106
109
  end
107
110
 
111
+ def set_active_books(books)
112
+ @active_books = books
113
+ end
114
+
115
+ def active_books
116
+ @active_books
117
+ end
118
+
108
119
  contract(ArrayOf[ReeDaoLoadAggTest::Book] => nil)
109
120
  def set_books(books)
110
121
  @books = books; nil
@@ -151,6 +162,14 @@ class ReeDaoLoadAggTest::UserDto
151
162
  def organization
152
163
  @organization
153
164
  end
165
+
166
+ def set_books(books)
167
+ @books = books; nil
168
+ end
169
+
170
+ def books
171
+ @books
172
+ end
154
173
  end
155
174
 
156
175
  class ReeDaoLoadAggTest::Organization
@@ -268,6 +287,9 @@ class ReeDaoLoadAggTest::Chapter
268
287
  attr_accessor :title, :book_id
269
288
  end
270
289
 
290
+ class ReeDaoLoadAggTest::ChapterDto < SimpleDelegator
291
+ end
292
+
271
293
  class ReeDaoLoadAggTest::Author
272
294
  include ReeDto::EntityDSL
273
295
 
@@ -280,6 +302,9 @@ class ReeDaoLoadAggTest::Author
280
302
  attr_accessor :name, :book_id
281
303
  end
282
304
 
305
+ class ReeDaoLoadAggTest::AuthorDto < SimpleDelegator
306
+ end
307
+
283
308
  class ReeDaoLoadAggTest::Review
284
309
  include ReeDto::EntityDSL
285
310
 
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ReeLib
4
- VERSION = "1.0.59"
4
+ VERSION = "1.0.61"
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ree_lib
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.59
4
+ version: 1.0.61
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ruslan Gatiyatov