ree_lib 1.0.53 → 1.0.55

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: 0b6642f50a4c801c07b2e56366a2c44c39b7d6bb5e32bd63adc77dca9122b9c6
4
- data.tar.gz: 2f54df5fdbb0d46018098c79bdf16ba35f885506120d84bbb9a6154d3b75f1e2
3
+ metadata.gz: 7d792b73d0f067a0fc7e935ca257f79f4334afbbb811a060e94cb6de6f2f283c
4
+ data.tar.gz: 34fb81648b66cfb4e031650d6145556c05b454c0ca1f66f82ded0c3c774d97d6
5
5
  SHA512:
6
- metadata.gz: 4f3362bffb26dd9e26b82f9de59e4ea6b3bb538c336bac8263f55bfdf1f7ed279aa6d379b5d86f2f0c19c86a129f2741b5e12b1c4ede738109ef737bbd56e994
7
- data.tar.gz: 38f70aec42604a5cdd1b906e846cfddb230dd527cefdbe67fee994282d2c35573de9d75a5b7052ec75292fc38a5c13fb44b2ea61a76f95f911502e2a481dd039
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.53)
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)
@@ -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
- assoc_dao = find_dao(assoc_name, parent, scope)
141
+ primary_key ||= :id
136
142
 
137
- if reverse
138
- if !foreign_key
139
- name = underscore(demodulize(list.first.class.name))
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
- if !foreign_key
146
- dto_class = assoc_dao
147
- .opts[:schema_mapper]
148
- .dto(:db_load)
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
- name = underscore(demodulize(dto_class.name))
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
- root_ids = list.map(&:"#{foreign_key}")
156
- foreign_key = :id
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
- default_scope = assoc_dao&.where(foreign_key => root_ids)
161
-
162
- items = add_scopes(default_scope, scope, global_opts[assoc_name])
163
-
164
- assoc = index_by(items) { _1.send(foreign_key) }
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
- scope: Nilor[Sequel::Dataset],
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
- assoc_dao = nil
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
- root_ids = list.map(&:id)
203
-
204
- default_scope = assoc_dao&.where(foreign_key => root_ids)
205
-
206
- items = add_scopes(default_scope, scope, global_opts[assoc_name])
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 = group_by(items) { _1.send(foreign_key) }
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
- :id
281
+ primary_key
248
282
  else
249
- reverse ? :id : "#{assoc_name}_id"
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
- item.send(assoc_setter, value)
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
- field :custom_field, scope: books.where(title: "1984")
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.set_books([1337, 1337])
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([1337, 1337])
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::Organization
38
+ class ReeDaoLoadAggTest::Book
39
39
  include ReeDto::EntityDSL
40
40
 
41
41
  properties(
42
42
  id: Nilor[Integer],
43
- name: String
43
+ user_id: Integer,
44
+ title: Nilor[String]
44
45
  )
45
46
 
46
- def set_users(users)
47
- @users = users
47
+ def set_chapters(chapters)
48
+ @chapters = chapters; nil
48
49
  end
49
50
 
50
- def users
51
- @users ||= []
51
+ def chapters
52
+ @chapters
52
53
  end
53
54
 
54
- attr_accessor :name
55
- end
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
 
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ReeLib
4
- VERSION = "1.0.53"
4
+ VERSION = "1.0.55"
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.53
4
+ version: 1.0.55
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-14 00:00:00.000000000 Z
11
+ date: 2023-07-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: ree