looksist 0.2.4 → 0.2.5

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
  SHA1:
3
- metadata.gz: 3fb62a2a0b2778134b40201016d38980393ee389
4
- data.tar.gz: 6621c86b40473717e6e077c004506d0f79482d88
3
+ metadata.gz: d37e2dc990cb95ab09f7a065a226c2265808e1d7
4
+ data.tar.gz: 6e6886eca193e7b311b5c94ead38e098257d1821
5
5
  SHA512:
6
- metadata.gz: 2bca80bd21a7a699b332930bdc5396f52e60a23b8e61acee6df1b0f42e92685a64b0a7c1658710a4f9aa610b83db50ed7ebc9fb8b50fa1d4ace9a2a257d4414f
7
- data.tar.gz: 35937a98b7ff7e8e2edf52aa49424b04c8ec95eb0186b7c4e0b0bf3b8b2adce85374f69365ac3b5c261b907964eaa8ca84a24f9d937c728ff438c8fafc2ae080
6
+ metadata.gz: 82919b4456e2340f65119e66f7411051c9b5cccad412e2a150e2f03982542e1214ad4ad7f6c412567e7d447dfb722041c211bbaa6d25e8298ee899e195b285eb
7
+ data.tar.gz: 06003bbbc83e7499be00083848a16f97fc0d8db1e25c7376c16b0209807a172e712b444181e5c9cb0f8f9d24fcc968057df9fd64051f28448d5cfb728f82c2b8
data/lib/looksist/core.rb CHANGED
@@ -42,7 +42,7 @@ module Looksist
42
42
 
43
43
 
44
44
  def as_json(opts)
45
- Looksist.driver.json_opts(self, opts)
45
+ Looksist.driver.json_opts(self, self.class.lookup_attributes, opts)
46
46
  end
47
47
 
48
48
  end
@@ -50,8 +50,8 @@ module Looksist
50
50
  module Serializers
51
51
  class Her
52
52
  class << self
53
- def json_opts(obj, _)
54
- lookup_attributes = obj.class.lookup_attributes || {}
53
+ def json_opts(obj, lookup_attributes, _)
54
+ lookup_attributes ||= {}
55
55
  other_attributes = lookup_attributes.keys.each_with_object({}) do |a, acc|
56
56
  using = lookup_attributes[a]
57
57
  acc[a] = obj.send(a) if obj.respond_to?(using)
@@ -36,10 +36,10 @@ module Looksist
36
36
  keys = ids.collect { |id| redis_key(entity, id) }
37
37
  missed_keys = cache_op(proc_from { keys.uniq }) { (keys - @cache.keys).uniq }
38
38
  unless missed_keys.empty?
39
- values = @client.mget *missed_keys
40
- cache_op { @cache.merge!(Hash[*missed_keys.zip(values).flatten]) }
39
+ response = Hash[*missed_keys.zip(@client.mget *missed_keys).flatten]
40
+ cache_op { @cache.merge!(response) }
41
41
  end
42
- (cache_op(proc_from { values }) { @cache.mslice(keys) })
42
+ (cache_op(proc_from { keys.collect {|k| response[k] } }) { @cache.mslice(keys) })
43
43
  end
44
44
 
45
45
  def cache_op(computed = nil)
@@ -1,3 +1,3 @@
1
1
  module Lookist
2
- VERSION = '0.2.4'
2
+ VERSION = '0.2.5'
3
3
  end
@@ -1,334 +1,374 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Looksist::Hashed do
4
- before(:each) do
5
- @mock = {}
6
- Looksist.configure do |looksist|
7
- looksist.lookup_store = @mock
8
- looksist.cache_buffer_size = 10
4
+ context('with_l2_cache') do
5
+ before(:each) do
6
+ @mock = {}
7
+ Looksist.configure do |looksist|
8
+ looksist.lookup_store = @mock
9
+ looksist.cache_buffer_size = 10
10
+ end
9
11
  end
10
- end
11
12
 
12
- context 'inject ' do
13
- it 'should be capable to deep lookup and inject' do
14
- class Menu
15
- include Looksist
13
+ context 'inject ' do
14
+ it 'should be capable to deep lookup and inject' do
15
+ class Menu
16
+ include Looksist
17
+
18
+ def metrics
19
+ {
20
+ table: {
21
+ menu: [
22
+ {
23
+ item_id: 1
24
+ },
25
+ {
26
+ item_id: 2
27
+ }
28
+ ]
29
+ }
30
+ }
31
+ end
16
32
 
17
- def metrics
18
- {
19
- table: {
20
- menu: [
21
- {
22
- item_id: 1
23
- },
24
- {
25
- item_id: 2
26
- }
27
- ]
28
- }
29
- }
33
+ inject after: :metrics, at: '$.table.menu', using: :item_id, populate: :item_name
30
34
  end
31
35
 
32
- inject after: :metrics, at: '$.table.menu', using: :item_id, populate: :item_name
36
+ expect(@mock).to receive(:mget).once.with(*%w(items/1 items/2)).and_return(%w(Idly Pongal))
37
+
38
+ expect(Menu.new.metrics).to eq({
39
+ table: {
40
+ menu: [{
41
+ item_id: 1,
42
+ item_name: 'Idly'
43
+ },
44
+ {
45
+ item_id: 2,
46
+ item_name: 'Pongal'
47
+ }]
48
+ }
49
+ })
33
50
  end
34
51
 
35
- expect(@mock).to receive(:mget).once.with(*%w(items/1 items/2)).and_return(%w(Idly Pongal))
36
-
37
- expect(Menu.new.metrics).to eq({
38
- table: {
39
- menu: [{
40
- item_id: 1,
41
- item_name: 'Idly'
42
- },
43
- {
44
- item_id: 2,
45
- item_name: 'Pongal'
46
- }]
47
- }
48
- })
49
- end
52
+ it 'should be capable to deep lookup and inject from custom bucket' do
53
+ class CustomizedMenu
54
+ include Looksist
55
+
56
+ def metrics
57
+ {
58
+ table: {
59
+ menu: [
60
+ {
61
+ item_id: 1
62
+ },
63
+ {
64
+ item_id: 2
65
+ }
66
+ ]
67
+ }
68
+ }
69
+ end
50
70
 
51
- it 'should be capable to deep lookup and inject from custom bucket' do
52
- class CustomizedMenu
53
- include Looksist
71
+ inject after: :metrics, at: '$.table.menu', using: :item_id, populate: :item_name, bucket_name: 'menu_items'
72
+ end
54
73
 
55
- def metrics
56
- {
57
- table: {
58
- menu: [
59
- {
60
- item_id: 1
61
- },
62
- {
63
- item_id: 2
64
- }
65
- ]
66
- }
67
- }
74
+ expect(@mock).to receive(:mget).once.with(*%w(menu_items/1 menu_items/2)).and_return(%w(Idly Pongal))
75
+
76
+ expect(CustomizedMenu.new.metrics).to eq({
77
+ table: {
78
+ menu: [{
79
+ item_id: 1,
80
+ item_name: 'Idly'
81
+ },
82
+ {
83
+ item_id: 2,
84
+ item_name: 'Pongal'
85
+ }]
86
+ }
87
+ })
88
+ end
89
+
90
+ xit 'should be capable to deep lookup and inject - another example' do
91
+ class NewMenu
92
+ include Looksist
93
+
94
+ def metrics
95
+ {
96
+ table: {
97
+ menu: [
98
+ {
99
+ item_id: 4,
100
+ item_name: 'Idly'
101
+ },
102
+ {
103
+ item_id: 5
104
+ }
105
+ ]
106
+ }
107
+ }
108
+ end
109
+
110
+ inject after: :metrics, at: '$.table.menu[?(@.item_id=5)]', using: :item_id, populate: :item_name
68
111
  end
69
112
 
70
- inject after: :metrics, at: '$.table.menu', using: :item_id, populate: :item_name, bucket_name: 'menu_items'
113
+ expect(@mock).to receive(:get).with('items/5').and_return(OpenStruct.new(value: 'Pongal'))
114
+
115
+ expect(NewMenu.new.metrics).to eq(
116
+ {
117
+ table: {
118
+ menu: [
119
+ {
120
+ item_id: 4,
121
+ item_name: 'Idly'
122
+ },
123
+ {
124
+ item_id: 5,
125
+ item_name: 'Pongal'
126
+ }
127
+ ]
128
+ }
129
+ }
130
+ )
71
131
  end
72
132
 
73
- expect(@mock).to receive(:mget).once.with(*%w(menu_items/1 menu_items/2)).and_return(%w(Idly Pongal))
74
-
75
- expect(CustomizedMenu.new.metrics).to eq({
76
- table: {
77
- menu: [{
78
- item_id: 1,
79
- item_name: 'Idly'
80
- },
81
- {
82
- item_id: 2,
83
- item_name: 'Pongal'
84
- }]
85
- }
86
- })
87
- end
133
+ it 'should be capable to deep lookup and inject on columnar hashes' do
134
+ class DeepHash
135
+ include Looksist
88
136
 
89
- xit 'should be capable to deep lookup and inject - another example' do
90
- class NewMenu
91
- include Looksist
137
+ def metrics
138
+ {
139
+ table: {
140
+ inner_table: {
141
+ employee_id: [10, 20]
142
+ }
143
+ }
144
+ }
145
+ end
92
146
 
93
- def metrics
94
- {
95
- table: {
96
- menu: [
97
- {
98
- item_id: 4,
99
- item_name: 'Idly'
100
- },
101
- {
102
- item_id: 5
103
- }
104
- ]
105
- }
106
- }
147
+ inject after: :metrics, at: '$.table.inner_table', using: :employee_id, populate: :employee_name
107
148
  end
108
149
 
109
- inject after: :metrics, at: '$.table.menu[?(@.item_id=5)]', using: :item_id, populate: :item_name
150
+ expect(@mock).to receive(:mget).with(*%w(employees/10 employees/20)).and_return(['emp 1', 'emp 2'])
151
+
152
+ expect(DeepHash.new.metrics).to eq({table: {
153
+ inner_table: {
154
+ employee_id: [10, 20],
155
+ employee_name: ['emp 1', 'emp 2']
156
+ }
157
+ }})
110
158
  end
111
159
 
112
- expect(@mock).to receive(:get).with('items/5').and_return(OpenStruct.new(value: 'Pongal'))
113
-
114
- expect(NewMenu.new.metrics).to eq(
115
- {
116
- table: {
117
- menu: [
118
- {
119
- item_id: 4,
120
- item_name: 'Idly'
121
- },
122
- {
123
- item_id: 5,
124
- item_name: 'Pongal'
125
- }
126
- ]
127
- }
128
- }
129
- )
130
- end
160
+ it 'should inject single attribute to an existing hash' do
161
+ class HashService1
162
+ include Looksist
131
163
 
132
- it 'should be capable to deep lookup and inject on columnar hashes' do
133
- class DeepHash
134
- include Looksist
164
+ def metrics
165
+ {
166
+ table: {
167
+ employee_id: [1, 2]
168
+ }
169
+ }
170
+ end
135
171
 
136
- def metrics
137
- {
138
- table: {
139
- inner_table: {
140
- employee_id: [10, 20]
141
- }
142
- }
143
- }
172
+ inject after: :metrics, at: :table, using: :employee_id, populate: :employee_name
144
173
  end
145
174
 
146
- inject after: :metrics, at: '$.table.inner_table', using: :employee_id, populate: :employee_name
147
- end
175
+ expect(@mock).to receive(:mget).with(*%w(employees/1 employees/2)).and_return(['emp 1', 'emp 2'])
148
176
 
149
- expect(@mock).to receive(:mget).with(*%w(employees/10 employees/20)).and_return(['emp 1', 'emp 2'])
177
+ expect(HashService1.new.metrics).to eq({table: {
178
+ employee_id: [1, 2],
179
+ employee_name: ['emp 1', 'emp 2']
180
+ }})
181
+ end
150
182
 
151
- expect(DeepHash.new.metrics).to eq({table: {
152
- inner_table: {
153
- employee_id: [10, 20],
154
- employee_name: ['emp 1', 'emp 2']
155
- }
156
- }})
157
- end
183
+ it 'should inject multiple attribute to an existing hash' do
184
+ class HashService
185
+ include Looksist
158
186
 
159
- it 'should inject single attribute to an existing hash' do
160
- class HashService1
161
- include Looksist
187
+ def metrics
188
+ {
189
+ table: {
190
+ employee_id: [5, 6],
191
+ employer_id: [3, 4]
192
+ }
193
+ }
194
+ end
162
195
 
163
- def metrics
164
- {
165
- table: {
166
- employee_id: [1, 2]
167
- }
168
- }
196
+ inject after: :metrics, at: :table, using: :employee_id, populate: :employee_name
197
+ inject after: :metrics, at: :table, using: :employer_id, populate: :employer_name
169
198
  end
170
199
 
171
- inject after: :metrics, at: :table, using: :employee_id, populate: :employee_name
172
- end
200
+ expect(@mock).to receive(:mget).with(*%w(employees/5 employees/6)).and_return(['emp 5', 'emp 6'])
173
201
 
174
- expect(@mock).to receive(:mget).with(*%w(employees/1 employees/2)).and_return(['emp 1', 'emp 2'])
202
+ expect(@mock).to receive(:mget).with(*%w(employers/3 employers/4)).and_return(['empr 3', 'empr 4'])
175
203
 
176
- expect(HashService1.new.metrics).to eq({table: {
177
- employee_id: [1, 2],
178
- employee_name: ['emp 1', 'emp 2']
179
- }})
204
+ expect(HashService.new.metrics).to eq({table: {
205
+ employee_id: [5, 6],
206
+ employer_id: [3, 4],
207
+ employee_name: ['emp 5', 'emp 6'],
208
+ employer_name: ['empr 3', 'empr 4']
209
+ }})
210
+ end
180
211
  end
181
212
 
182
- it 'should inject multiple attribute to an existing hash' do
183
- class HashService
213
+ it 'should inject multiple attribute to an existing deep hash' do
214
+ class EmployeeHash
184
215
  include Looksist
185
216
 
186
217
  def metrics
187
218
  {
188
219
  table: {
189
- employee_id: [5, 6],
190
- employer_id: [3, 4]
220
+ database: {
221
+ employee_id: [15, 16],
222
+ employer_id: [13, 14]
223
+ }
191
224
  }
192
225
  }
193
226
  end
194
227
 
195
- inject after: :metrics, at: :table, using: :employee_id, populate: :employee_name
196
- inject after: :metrics, at: :table, using: :employer_id, populate: :employer_name
228
+ inject after: :metrics, at: '$.table.database', using: :employee_id, populate: :employee_name
229
+ inject after: :metrics, at: '$.table.database', using: :employer_id, populate: :employer_name
197
230
  end
198
231
 
199
- expect(@mock).to receive(:mget).with(*%w(employees/5 employees/6)).and_return(['emp 5', 'emp 6'])
232
+ expect(@mock).to receive(:mget).with(*%w(employees/15 employees/16)).and_return(['emp 15', 'emp 16'])
200
233
 
201
- expect(@mock).to receive(:mget).with(*%w(employers/3 employers/4)).and_return(['empr 3', 'empr 4'])
234
+ expect(@mock).to receive(:mget).with(*%w(employers/13 employers/14)).and_return(['empr 13', 'empr 14'])
202
235
 
203
- expect(HashService.new.metrics).to eq({table: {
204
- employee_id: [5, 6],
205
- employer_id: [3, 4],
206
- employee_name: ['emp 5', 'emp 6'],
207
- employer_name: ['empr 3', 'empr 4']
236
+ expect(EmployeeHash.new.metrics).to eq({table: {
237
+ database: {
238
+ employee_id: [15, 16],
239
+ employer_id: [13, 14],
240
+ employee_name: ['emp 15', 'emp 16'],
241
+ employer_name: ['empr 13', 'empr 14']
242
+ }
208
243
  }})
209
244
  end
210
- end
211
-
212
- it 'should inject multiple attribute to an existing deep hash' do
213
- class EmployeeHash
214
- include Looksist
215
-
216
- def metrics
217
- {
218
- table: {
219
- database: {
220
- employee_id: [15, 16],
221
- employer_id: [13, 14]
222
- }
223
- }
224
- }
225
- end
226
245
 
227
- inject after: :metrics, at: '$.table.database', using: :employee_id, populate: :employee_name
228
- inject after: :metrics, at: '$.table.database', using: :employer_id, populate: :employer_name
229
- end
246
+ context 'handle no data' do
247
+ it 'should not inject when data is not available' do
248
+ class EmptyResponse
249
+ include Looksist
230
250
 
231
- expect(@mock).to receive(:mget).with(*%w(employees/15 employees/16)).and_return(['emp 15', 'emp 16'])
251
+ def empty
252
+ {:high_stock => {}, :low_shelf_life => {}, :in_elimination => {}, :inactive_with_stock => {}}
253
+ end
232
254
 
233
- expect(@mock).to receive(:mget).with(*%w(employers/13 employers/14)).and_return(['empr 13', 'empr 14'])
255
+ inject after: :empty, at: :high_stock,
256
+ using: :sub_category_id, populate: :sub_category
234
257
 
235
- expect(EmployeeHash.new.metrics).to eq({table: {
236
- database: {
237
- employee_id: [15, 16],
238
- employer_id: [13, 14],
239
- employee_name: ['emp 15', 'emp 16'],
240
- employer_name: ['empr 13', 'empr 14']
241
- }
242
- }})
243
- end
258
+ inject after: :empty, at: '$.low_shelf_life',
259
+ using: :sub_category_id, populate: :sub_category
244
260
 
245
- context 'handle no data' do
246
- it 'should not inject when data is not available' do
247
- class EmptyResponse
248
- include Looksist
261
+ inject after: :empty, at: '$.in_elimination',
262
+ using: :sub_category_id, populate: :sub_category
249
263
 
250
- def empty
251
- {:high_stock => {}, :low_shelf_life => {}, :in_elimination => {}, :inactive_with_stock => {}}
264
+ inject after: :empty, at: '$.inactive_with_stock',
265
+ using: :sub_category_id, populate: :sub_category
252
266
  end
267
+ expected_response = {:high_stock => {}, :low_shelf_life => {}, :in_elimination => {}, :inactive_with_stock => {}}
268
+ expect(EmptyResponse.new.empty).to eq(expected_response)
269
+ end
253
270
 
254
- inject after: :empty, at: :high_stock,
255
- using: :sub_category_id, populate: :sub_category
271
+ it 'should be capable to deep lookup and inject' do
272
+ class EmptyMenu
273
+ include Looksist
256
274
 
257
- inject after: :empty, at: '$.low_shelf_life',
258
- using: :sub_category_id, populate: :sub_category
275
+ def metrics
276
+ {
277
+ table: {
278
+ menu: []
279
+ }
280
+ }
281
+ end
259
282
 
260
- inject after: :empty, at: '$.in_elimination',
261
- using: :sub_category_id, populate: :sub_category
283
+ inject after: :metrics, at: '$.table.menu', using: :item_id, populate: :item_name
284
+ end
262
285
 
263
- inject after: :empty, at: '$.inactive_with_stock',
264
- using: :sub_category_id, populate: :sub_category
286
+ expect(EmptyMenu.new.metrics).to eq({
287
+ table: {
288
+ menu: []
289
+ }
290
+ })
265
291
  end
266
- expected_response = {:high_stock => {}, :low_shelf_life => {}, :in_elimination => {}, :inactive_with_stock => {}}
267
- expect(EmptyResponse.new.empty).to eq(expected_response)
268
292
  end
269
293
 
270
- it 'should be capable to deep lookup and inject' do
271
- class EmptyMenu
272
- include Looksist
273
294
 
274
- def metrics
275
- {
276
- table: {
277
- menu: []
278
- }
279
- }
295
+ context 'multiple methods and injections' do
296
+ it 'should inject multiple attribute to an existing hash' do
297
+ class HashServiceSuper
298
+ include Looksist
299
+
300
+ def shrinkage
301
+ {
302
+ table: {
303
+ shrink_id: [1, 2]
304
+ }
305
+ }
306
+ end
307
+
308
+ def stock
309
+ {
310
+ table: {
311
+ dc_id: [7, 8]
312
+ }
313
+ }
314
+ end
315
+
316
+ inject after: :shrinkage, at: :table, using: :shrink_id, populate: :shrink_name
317
+ inject after: :stock, at: :table, using: :dc_id, populate: :dc_name
280
318
  end
281
319
 
282
- inject after: :metrics, at: '$.table.menu', using: :item_id, populate: :item_name
283
- end
320
+ expect(@mock).to receive(:mget).with(*%w(shrinks/1 shrinks/2)).and_return(['shrink 1', 'shrink 2'])
284
321
 
285
- expect(EmptyMenu.new.metrics).to eq({
286
- table: {
287
- menu: []
288
- }
289
- })
322
+ expect(@mock).to receive(:mget).with(*%w(dcs/7 dcs/8)).and_return(['dc 7', 'dc 8'])
323
+
324
+ hash_service_super = HashServiceSuper.new
325
+ expect(hash_service_super.shrinkage).to eq({table: {
326
+ shrink_id: [1, 2],
327
+ shrink_name: ['shrink 1', 'shrink 2']
328
+ }})
329
+
330
+ expect(hash_service_super.stock).to eq({table: {
331
+ dc_id: [7, 8],
332
+ dc_name: ['dc 7', 'dc 8']
333
+ }})
334
+ end
290
335
  end
291
336
  end
292
337
 
338
+ context('no l2 cache') do
339
+ before(:each) do
340
+ @mock = {}
341
+ Looksist.configure do |looksist|
342
+ looksist.lookup_store = @mock
343
+ looksist.cache_buffer_size = 10
344
+ looksist.l2_cache = :no_cache
345
+ end
346
+ end
293
347
 
294
- context 'multiple methods and injections' do
295
- it 'should inject multiple attribute to an existing hash' do
296
- class HashServiceSuper
348
+ it 'should be capable to deep lookup and inject on columnar hashes' do
349
+ class NoL2DeepHash
297
350
  include Looksist
298
351
 
299
- def shrinkage
300
- {
301
- table: {
302
- shrink_id: [1, 2]
303
- }
304
- }
305
- end
306
-
307
- def stock
352
+ def metrics
308
353
  {
309
354
  table: {
310
- dc_id: [7, 8]
355
+ inner_table: {
356
+ employee_id: [10, 10]
357
+ }
311
358
  }
312
359
  }
313
360
  end
314
361
 
315
- inject after: :shrinkage, at: :table, using: :shrink_id, populate: :shrink_name
316
- inject after: :stock, at: :table, using: :dc_id, populate: :dc_name
362
+ inject after: :metrics, at: '$.table.inner_table', using: :employee_id, populate: :employee_name
317
363
  end
318
364
 
319
- expect(@mock).to receive(:mget).with(*%w(shrinks/1 shrinks/2)).and_return(['shrink 1', 'shrink 2'])
365
+ expect(@mock).to receive(:mget).with(*%w(employees/10)).and_return(['emp 1'])
320
366
 
321
- expect(@mock).to receive(:mget).with(*%w(dcs/7 dcs/8)).and_return(['dc 7', 'dc 8'])
322
-
323
- hash_service_super = HashServiceSuper.new
324
- expect(hash_service_super.shrinkage).to eq({table: {
325
- shrink_id: [1, 2],
326
- shrink_name: ['shrink 1', 'shrink 2']
327
- }})
328
-
329
- expect(hash_service_super.stock).to eq({table: {
330
- dc_id: [7, 8],
331
- dc_name: ['dc 7', 'dc 8']
367
+ expect(NoL2DeepHash.new.metrics).to eq({table: {
368
+ inner_table: {
369
+ employee_id: [10, 10],
370
+ employee_name: ['emp 1', 'emp 1']
371
+ }
332
372
  }})
333
373
  end
334
374
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: looksist
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.4
4
+ version: 0.2.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - RC