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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6c1de406ab816861e6a42c542db02cddbc0f68f6aeca80bff9dba9e8c76ef81a
4
- data.tar.gz: 05dba8342aa073f8198c42d051ca9783396b40bc8a939edd64b3ddc42d35a868
3
+ metadata.gz: 7d792b73d0f067a0fc7e935ca257f79f4334afbbb811a060e94cb6de6f2f283c
4
+ data.tar.gz: 34fb81648b66cfb4e031650d6145556c05b454c0ca1f66f82ded0c3c774d97d6
5
5
  SHA512:
6
- metadata.gz: cf9b082920297cca214ab5a21ce389d77833936d12c5b6583f2edcc34b3e794b1ac7565a1ae9c66745f0cd43010658f1bf9fbdee9af23cf82b7d7537529bc58e
7
- data.tar.gz: ded7b6e245997cad79fbd20cfa8ad33f4b89b402985f9a133a0d55b6daee823764d5e0888cfed8eb0761f1d4108edeb176aaf61595864820d5562d516b907295
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.54)
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
- 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.54"
4
+ VERSION = "1.0.55"
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.54
4
+ version: 1.0.55
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ruslan Gatiyatov