shadow_model 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 +4 -4
- data/README.md +9 -3
- data/lib/shadow_model/model_extension.rb +61 -56
- data/lib/shadow_model/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e255572a7b0b5d218d46279a38b089b0b5f6558b
|
4
|
+
data.tar.gz: 6d1886e2e310991e52706e123f84efd87efb61c7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9849e048bd70790ec511a96b3bc4a90f0e7241bffc11464832fd4eb56886e79b156398ea6af164ecc2fa38d57533970b6faba7a0f8e298d6a07c27fecb83a911
|
7
|
+
data.tar.gz: 32b0e4c220f0554258aa7739db64c6e92d38b9ae429f87e5b59ac1ef66584c207ef37be4e7e0f1ab3a022ad16b74298fa3adf81e619a2129ebb94a79ebe09dd1
|
data/README.md
CHANGED
@@ -24,9 +24,6 @@ And use this to retrieve the model from redis.
|
|
24
24
|
|
25
25
|
model = YourModelClass.find_by_shadow(primary_key)
|
26
26
|
|
27
|
-
model.is_a?(YourModelClass) # true
|
28
|
-
model.readonly? # true
|
29
|
-
|
30
27
|
### options
|
31
28
|
|
32
29
|
<table>
|
@@ -61,6 +58,15 @@ And use this to retrieve the model from redis.
|
|
61
58
|
end
|
62
59
|
end
|
63
60
|
|
61
|
+
player = Player.create(name: "player one")
|
62
|
+
shadow = Player.find_by_shadow(player.id)
|
63
|
+
shadow.is_a?(Player) # true
|
64
|
+
shadow.shadow_model? # true
|
65
|
+
shadow.readonly? # true
|
66
|
+
shadow.reload # reload from database
|
67
|
+
shadow.shadow_model? # false
|
68
|
+
shadow.readonly? # false
|
69
|
+
|
64
70
|
## Associations
|
65
71
|
|
66
72
|
### has_many
|
@@ -9,60 +9,6 @@ module ShadowModel
|
|
9
9
|
RUBY
|
10
10
|
end
|
11
11
|
|
12
|
-
def shadow_model?
|
13
|
-
@shadow_model
|
14
|
-
end
|
15
|
-
|
16
|
-
def shadow_model=(value)
|
17
|
-
@shadow_model = value
|
18
|
-
end
|
19
|
-
|
20
|
-
def shadow_cache_key
|
21
|
-
@shadow_cache_key ||= self.class.build_shadow_cache_key(self[self.class.primary_key])
|
22
|
-
end
|
23
|
-
|
24
|
-
def shadow_data
|
25
|
-
@shadow_data ||= self.class.find_shadow_data(self[self.class.primary_key])
|
26
|
-
end
|
27
|
-
|
28
|
-
def shadow_data=(data)
|
29
|
-
@shadow_data = data
|
30
|
-
self.class.attribute_names.each do |attribute_name|
|
31
|
-
attribute_name = attribute_name.to_sym
|
32
|
-
if value = data[attribute_name]
|
33
|
-
self[attribute_name] = value
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
def clear_shadow_data
|
39
|
-
Redis.current.del(shadow_cache_key)
|
40
|
-
end
|
41
|
-
|
42
|
-
def build_shadow_data
|
43
|
-
Marshal.dump(self.class.shadow_keys.inject({}) { |data, attr| data[attr] = send(attr); data })
|
44
|
-
end
|
45
|
-
|
46
|
-
def update_shadow_cache
|
47
|
-
return if shadow_options[:association_only]
|
48
|
-
Redis.current.set(shadow_cache_key, build_shadow_data)
|
49
|
-
update_expiration(shadow_cache_key)
|
50
|
-
end
|
51
|
-
|
52
|
-
def update_expiration(cache_key)
|
53
|
-
if expiration = self.class.shadow_options[:expiration]
|
54
|
-
if self.class.shadow_options[:update_expiration] || shadow_ttl < 0
|
55
|
-
Redis.current.expire(cache_key, expiration)
|
56
|
-
end
|
57
|
-
elsif expireat = self.class.shadow_options[:expireat]
|
58
|
-
Redis.current.expireat(cache_key, expireat.to_i) if shadow_ttl < 0
|
59
|
-
end
|
60
|
-
end
|
61
|
-
|
62
|
-
def shadow_ttl
|
63
|
-
Redis.current.ttl(shadow_cache_key)
|
64
|
-
end
|
65
|
-
|
66
12
|
module ClassMethods
|
67
13
|
def set_shadow_keys(args, options = {})
|
68
14
|
@shadow_attributes ||= []
|
@@ -111,6 +57,7 @@ module ShadowModel
|
|
111
57
|
end
|
112
58
|
|
113
59
|
def find_by_shadow(id)
|
60
|
+
raise "Cannot find seperate shadow cache with association_only option set" if shadow_options[:association_only]
|
114
61
|
if shadow_data = find_shadow_data(id)
|
115
62
|
instantiate_shadow_model(shadow_data)
|
116
63
|
else
|
@@ -127,8 +74,8 @@ module ShadowModel
|
|
127
74
|
|
128
75
|
def instantiate_shadow_model(shadow_data)
|
129
76
|
instance = self.new
|
130
|
-
instance.shadow_model
|
131
|
-
instance.shadow_data
|
77
|
+
instance.instance_variable_set(:@shadow_model, true)
|
78
|
+
instance.send(:shadow_data=, shadow_data)
|
132
79
|
instance.readonly!
|
133
80
|
instance
|
134
81
|
end
|
@@ -137,5 +84,63 @@ module ShadowModel
|
|
137
84
|
"#{self.name.tableize}:Shadow:#{id}"
|
138
85
|
end
|
139
86
|
end
|
87
|
+
|
88
|
+
def shadow_model?
|
89
|
+
@shadow_model
|
90
|
+
end
|
91
|
+
|
92
|
+
def reload
|
93
|
+
self.instance_variable_set(:@readonly, false)
|
94
|
+
@shadow_model = false
|
95
|
+
super
|
96
|
+
end
|
97
|
+
|
98
|
+
def shadow_cache_key
|
99
|
+
@shadow_cache_key ||= self.class.build_shadow_cache_key(self[self.class.primary_key])
|
100
|
+
end
|
101
|
+
|
102
|
+
def shadow_data
|
103
|
+
@shadow_data ||= self.class.find_shadow_data(self[self.class.primary_key])
|
104
|
+
end
|
105
|
+
|
106
|
+
def clear_shadow_data
|
107
|
+
Redis.current.del(shadow_cache_key)
|
108
|
+
end
|
109
|
+
|
110
|
+
def build_shadow_data
|
111
|
+
Marshal.dump(self.class.shadow_keys.inject({}) { |data, attr| data[attr] = send(attr); data })
|
112
|
+
end
|
113
|
+
|
114
|
+
def update_shadow_cache
|
115
|
+
return if shadow_options[:association_only]
|
116
|
+
Redis.current.set(shadow_cache_key, build_shadow_data)
|
117
|
+
update_expiration(shadow_cache_key)
|
118
|
+
end
|
119
|
+
|
120
|
+
def update_expiration(cache_key)
|
121
|
+
if expiration = shadow_options[:expiration]
|
122
|
+
if shadow_options[:update_expiration] || shadow_ttl < 0
|
123
|
+
Redis.current.expire(cache_key, expiration)
|
124
|
+
end
|
125
|
+
elsif expireat = shadow_options[:expireat]
|
126
|
+
Redis.current.expireat(cache_key, expireat.to_i) if shadow_ttl < 0
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
def shadow_ttl
|
131
|
+
Redis.current.ttl(shadow_cache_key)
|
132
|
+
end
|
133
|
+
|
134
|
+
private
|
135
|
+
|
136
|
+
def shadow_data=(data)
|
137
|
+
@shadow_data = data
|
138
|
+
self.class.attribute_names.each do |attribute_name|
|
139
|
+
attribute_name = attribute_name.to_sym
|
140
|
+
if value = data[attribute_name]
|
141
|
+
self[attribute_name] = value
|
142
|
+
end
|
143
|
+
end
|
144
|
+
end
|
140
145
|
end
|
141
146
|
end
|
data/lib/shadow_model/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: shadow_model
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Weihu Chen
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-10-
|
11
|
+
date: 2013-10-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|