looksist 0.1.3 → 0.1.4
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 +4 -4
- data/lib/looksist.rb +1 -2
- data/lib/looksist/common.rb +7 -0
- data/lib/looksist/core.rb +4 -29
- data/lib/looksist/hashed.rb +1 -3
- data/lib/looksist/version.rb +1 -1
- data/spec/looksist/looksist_spec.rb +23 -53
- metadata +2 -2
- data/lib/looksist/her_collection.rb +0 -13
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 46c6ea1a931ae0e7367b6448d23c37cb12d73cf2
|
4
|
+
data.tar.gz: 0d6ff0d198ece2ec4a3b8f4cdf1e60e7748e3ff5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 11993fd0f01590a1ad5cc85f64d1cda21608cc8a74f380501dd1b935aa43ce810cee112167dc36b9c3f7e176de65263ceb487386c7a1e654963af2fd01c5cdde
|
7
|
+
data.tar.gz: 4fd89a0710c78b8626886d67fc15f6455a9f1e7b8b5545e8252075c789d7958820298273820614bdc804c093edcbb34ca97d0bf3dc63ee02e6c5ef14eb578409
|
data/lib/looksist.rb
CHANGED
data/lib/looksist/core.rb
CHANGED
@@ -1,48 +1,23 @@
|
|
1
1
|
module Looksist
|
2
2
|
module Core
|
3
3
|
extend ActiveSupport::Concern
|
4
|
+
include Looksist::Common
|
4
5
|
|
5
6
|
module ClassMethods
|
6
|
-
|
7
|
-
def bucket_name(entity_id)
|
8
|
-
entity = entity_id.to_s.gsub('_id', '')
|
9
|
-
entity.pluralize
|
10
|
-
end
|
11
|
-
|
12
|
-
def memoized(key)
|
13
|
-
self.storage ||= OpenStruct.new
|
14
|
-
self.storage[key] = self.storage[key] || Looksist.lookup_store.get(key)
|
15
|
-
end
|
16
|
-
|
17
|
-
def mmemoized(key, values)
|
18
|
-
key_and_bucket = id_and_buckets.find{|h| h[:id] == key}
|
19
|
-
return if key_and_bucket.nil?
|
20
|
-
redis_keys = values.collect{|v| redis_key(key_and_bucket[:bucket], v)}
|
21
|
-
left_keys_to_lookup = redis_keys.select{|k| self.storage[k].nil?}
|
22
|
-
Looksist.lookup_store.mapped_mget(left_keys_to_lookup).each do |key, value|
|
23
|
-
self.storage[key] = value
|
24
|
-
end
|
25
|
-
|
26
|
-
end
|
27
|
-
|
28
|
-
def redis_key bucket, value
|
29
|
-
[bucket, '/', value].join('')
|
30
|
-
end
|
31
|
-
|
32
|
-
def lookup(what, using, bucket = bucket_name(using))
|
7
|
+
def lookup(what, using, bucket = using)
|
33
8
|
self.lookup_attributes ||= []
|
34
9
|
self.id_and_buckets ||= []
|
35
10
|
self.id_and_buckets << {id: using, bucket: bucket}
|
36
11
|
if what.is_a? Array
|
37
12
|
what.each do |method_name|
|
38
13
|
define_method(method_name) do
|
39
|
-
JSON.parse(
|
14
|
+
JSON.parse(Looksist.redis_service.send("#{entity(bucket)}_for", self.send(using).try(:to_s)) || '{}')[method_name.to_s]
|
40
15
|
end
|
41
16
|
self.lookup_attributes << method_name
|
42
17
|
end
|
43
18
|
else
|
44
19
|
define_method(what) do
|
45
|
-
|
20
|
+
Looksist.redis_service.send("#{entity(bucket)}_for", self.send(using).try(:to_s))
|
46
21
|
end
|
47
22
|
self.lookup_attributes << what.to_sym
|
48
23
|
end
|
data/lib/looksist/hashed.rb
CHANGED
@@ -4,6 +4,7 @@ require 'json'
|
|
4
4
|
module Looksist
|
5
5
|
module Hashed
|
6
6
|
extend ActiveSupport::Concern
|
7
|
+
include Looksist::Common
|
7
8
|
|
8
9
|
module ClassMethods
|
9
10
|
def inject(opts)
|
@@ -38,9 +39,6 @@ module Looksist
|
|
38
39
|
end
|
39
40
|
|
40
41
|
private
|
41
|
-
def entity(entity_id)
|
42
|
-
entity_id.to_s.gsub('_id', '')
|
43
|
-
end
|
44
42
|
|
45
43
|
def inject_attributes_at(hash_offset, opts)
|
46
44
|
return nil unless hash_offset
|
data/lib/looksist/version.rb
CHANGED
@@ -2,10 +2,11 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
|
4
4
|
describe Looksist do
|
5
|
-
before
|
5
|
+
before(:each) do
|
6
|
+
@mock = {}
|
6
7
|
Looksist.configure do |looksist|
|
7
|
-
looksist.lookup_store =
|
8
|
-
looksist.driver =
|
8
|
+
looksist.lookup_store = @mock
|
9
|
+
looksist.driver = Looksist::Serializers::Her
|
9
10
|
end
|
10
11
|
end
|
11
12
|
|
@@ -24,7 +25,7 @@ describe Looksist do
|
|
24
25
|
end
|
25
26
|
end
|
26
27
|
end
|
27
|
-
expect(
|
28
|
+
expect(@mock).to receive(:get).once.with('employees/1').and_return('Employee Name')
|
28
29
|
e = Her::Employee.new({employee_id: 1})
|
29
30
|
expect(e.name).to eq('Employee Name')
|
30
31
|
expect(e.to_json).to eq({:employee_id => 1, :name => 'Employee Name', :another_attr => 'Hello World'}.to_json)
|
@@ -44,7 +45,7 @@ describe Looksist do
|
|
44
45
|
end
|
45
46
|
end
|
46
47
|
end
|
47
|
-
expect(
|
48
|
+
expect(@mock).to receive(:get).once.with('employees/1').and_return('Employee Name')
|
48
49
|
e = ExplicitBucket::Employee.new(1)
|
49
50
|
expect(e.name).to eq('Employee Name')
|
50
51
|
end
|
@@ -63,7 +64,7 @@ describe Looksist do
|
|
63
64
|
end
|
64
65
|
end
|
65
66
|
it 'should not eager evaluate' do
|
66
|
-
expect(
|
67
|
+
expect(@mock).to_not receive(:get)
|
67
68
|
LazyEval::Employee.new(1)
|
68
69
|
end
|
69
70
|
end
|
@@ -83,8 +84,8 @@ describe Looksist do
|
|
83
84
|
end
|
84
85
|
end
|
85
86
|
|
86
|
-
expect(
|
87
|
-
expect(
|
87
|
+
expect(@mock).to receive(:get).once.with('ids/1').and_return('Employee Name')
|
88
|
+
expect(@mock).to receive(:get).once.with('employees/1').and_return(nil)
|
88
89
|
e = SimpleLookup::Employee.new(1)
|
89
90
|
expect(e.name).to eq('Employee Name')
|
90
91
|
expect(e.unavailable).to be(nil)
|
@@ -94,28 +95,31 @@ describe Looksist do
|
|
94
95
|
module CompositeLookup
|
95
96
|
class Employee
|
96
97
|
include Looksist
|
97
|
-
attr_accessor :id, :employee_id
|
98
|
+
attr_accessor :id, :employee_id, :contact_id
|
98
99
|
|
99
100
|
lookup [:name, :location], using=:id
|
100
101
|
lookup [:age, :sex], using=:employee_id
|
102
|
+
lookup [:pager, :cell], using=:contact_id
|
101
103
|
|
102
104
|
def initialize(id)
|
103
|
-
@id = @employee_id = id
|
105
|
+
@contact_id = @id = @employee_id = id
|
104
106
|
end
|
105
107
|
end
|
106
108
|
end
|
107
109
|
|
108
|
-
expect(
|
109
|
-
|
110
|
-
expect(
|
111
|
-
.and_return(nil)
|
110
|
+
expect(@mock).to receive(:get).once.with('ids/1').and_return({name: 'Employee Name', location: 'Chennai'}.to_json)
|
111
|
+
expect(@mock).to receive(:get).once.with('contacts/1').and_return({pager: 'pager', cell: 'cell'}.to_json)
|
112
|
+
expect(@mock).to receive(:get).twice.with('employees/1').and_return(nil)
|
112
113
|
e = CompositeLookup::Employee.new(1)
|
113
114
|
|
114
115
|
expect(e.name).to eq('Employee Name')
|
115
116
|
expect(e.location).to eq('Chennai')
|
116
117
|
|
117
|
-
expect(e.age).to
|
118
|
-
expect(e.sex).to
|
118
|
+
expect(e.age).to eq(nil)
|
119
|
+
expect(e.sex).to eq(nil)
|
120
|
+
|
121
|
+
expect(e.pager).to eq('pager')
|
122
|
+
expect(e.cell).to eq('cell')
|
119
123
|
end
|
120
124
|
end
|
121
125
|
|
@@ -132,48 +136,14 @@ describe Looksist do
|
|
132
136
|
end
|
133
137
|
it 'should share storage between instances to improve performance' do
|
134
138
|
employee_first_instance = Employee.new(1)
|
135
|
-
expect(
|
136
|
-
|
139
|
+
expect(@mock).to receive(:get).once.with('ids/1')
|
140
|
+
.and_return({name: 'Employee Name', location: 'Chennai'}.to_json)
|
137
141
|
employee_first_instance.name
|
138
142
|
|
139
143
|
employee_second_instance = Employee.new(1)
|
140
|
-
expect(
|
144
|
+
expect(@mock).not_to receive(:get).with('ids/1')
|
141
145
|
|
142
146
|
employee_second_instance.name
|
143
147
|
end
|
144
148
|
end
|
145
|
-
|
146
|
-
context '.id_and_buckets' do
|
147
|
-
class Developer
|
148
|
-
include Looksist
|
149
|
-
lookup [:city], using=:city_id
|
150
|
-
lookup [:role], using=:role_id
|
151
|
-
end
|
152
|
-
it 'should hold all the id and buckets' do
|
153
|
-
expect(Developer.id_and_buckets).to eq([{id: :city_id, bucket: 'cities'}, {id: :role_id, bucket: 'roles'}])
|
154
|
-
end
|
155
|
-
end
|
156
|
-
|
157
|
-
context '.mmemoized' do
|
158
|
-
class AnotherDeveloperClass
|
159
|
-
include Looksist
|
160
|
-
lookup [:city], using=:city_id
|
161
|
-
lookup [:role], using=:role_id
|
162
|
-
end
|
163
|
-
|
164
|
-
AnotherDeveloperClass.storage = OpenStruct.new
|
165
|
-
AnotherDeveloperClass.storage['cities/1'] = 'Chennai'
|
166
|
-
AnotherDeveloperClass.storage['cities/2'] = 'Delhi'
|
167
|
-
|
168
|
-
it 'make single request for multiple values' do
|
169
|
-
expect(Looksist.lookup_store).to receive(:mapped_mget).with(%w(cities/4 cities/5))
|
170
|
-
.and_return({'cities/4' => 'Bangalore', 'cities/5' => 'Kolkata'})
|
171
|
-
AnotherDeveloperClass.mmemoized(:city_id, [1, 4, 5])
|
172
|
-
|
173
|
-
expect(AnotherDeveloperClass.storage.to_h.length).to eq(4)
|
174
|
-
expect(AnotherDeveloperClass.storage['cities/5']).to eq('Kolkata')
|
175
|
-
expect(AnotherDeveloperClass.storage['cities/4']).to eq('Bangalore')
|
176
|
-
|
177
|
-
end
|
178
|
-
end
|
179
149
|
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.1.
|
4
|
+
version: 0.1.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- RC
|
@@ -169,9 +169,9 @@ files:
|
|
169
169
|
- README.md
|
170
170
|
- Rakefile
|
171
171
|
- lib/looksist.rb
|
172
|
+
- lib/looksist/common.rb
|
172
173
|
- lib/looksist/core.rb
|
173
174
|
- lib/looksist/hashed.rb
|
174
|
-
- lib/looksist/her_collection.rb
|
175
175
|
- lib/looksist/redis_service.rb
|
176
176
|
- lib/looksist/safe_lru_cache.rb
|
177
177
|
- lib/looksist/version.rb
|
@@ -1,13 +0,0 @@
|
|
1
|
-
module Her
|
2
|
-
class Collection
|
3
|
-
def load_all_meta
|
4
|
-
klass = a.first.class
|
5
|
-
return unless klass.respond_to?(:id_and_buckets)
|
6
|
-
id_attributes = klass.id_and_buckets.collect{|h| h[:id]}
|
7
|
-
id_attributes.each do |attribute|
|
8
|
-
id_attribute_values = self.collect(&attribute.to_sym)
|
9
|
-
klass.mmemoized(attribute, id_attribute_values)
|
10
|
-
end
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|