redrecord 0.5 → 0.6

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG CHANGED
@@ -1,3 +1,4 @@
1
+ v0.6. Don't bother marshalling when storing integers
1
2
 
2
3
  v0.5. Support cache verify method
3
4
 
data/lib/redrecord.rb CHANGED
@@ -11,6 +11,22 @@ class Redrecord
11
11
  def is_marshalled?(str)
12
12
  Marshal.dump(nil)[0,2] == str[0,2]
13
13
  end
14
+ def unmarshal(str)
15
+ if(is_marshalled?(str))
16
+ Marshal.load(str)
17
+ elsif(str =~ /^\d+$/)
18
+ str.to_i
19
+ else
20
+ str
21
+ end
22
+ end
23
+ def marshal(obj)
24
+ if Integer===obj || String===obj && obj !~ /^\d+$/ && !is_marshalled?(obj)
25
+ obj.to_s
26
+ else
27
+ Marshal.dump(obj)
28
+ end
29
+ end
14
30
  def redis_op(op, *args)
15
31
  if @enabled
16
32
  begin
@@ -18,7 +34,7 @@ class Redrecord
18
34
  redis.send(op, *args)
19
35
  end
20
36
  rescue Exception => e
21
- STDERR.puts "Redrecord: Disabling redis due to exception (#{e})"
37
+ $stderr.puts "Redrecord: Disabling redis due to exception (#{e})"
22
38
  @enabled = false
23
39
  end
24
40
  end
@@ -116,13 +132,13 @@ class Redrecord
116
132
  *(self.class.redrecord_cached_fields.map {|f|
117
133
  aliased_target, punctuation = f.to_s.sub(/([?!=])$/, ''), $1
118
134
  val = send("#{aliased_target}_without_cache#{punctuation}")
119
- [f.to_s, String===val && !Redrecord.is_marshalled?(val) ? val : Marshal.dump(val)]
135
+ [f.to_s, Redrecord.marshal(val)]
120
136
  }.flatten)
121
137
  )
122
138
  end
123
139
 
124
140
  def verify_cache!
125
- redrecord_redis_cache && redrecord_redis_cache.keys.each do |key|
141
+ (redis_cached_keys = Redrecord.redis_op(:hkeys, redrecord_key)) && redis_cached_keys.each do |key|
126
142
  calculated = redrecord_uncached_value(key)
127
143
  if(redrecord_cached_attrib_hash[key] != calculated)
128
144
  raise "#{redrecord_key}.#{key}: expected <#{calculated}> but got <#{redrecord_cached_attrib_hash[key]}> from redis cache"
@@ -141,7 +157,7 @@ class Redrecord
141
157
  def redrecord_cached_attrib_hash
142
158
  @redrecord_cached_attrib_hash ||= Hash.new do |h,k|
143
159
  h[k.to_sym] = if(cached = (redrecord_redis_cache && redrecord_redis_cache[k.to_s] unless new_record?))
144
- Redrecord.is_marshalled?(cached) ? Marshal.load(cached) : cached
160
+ Redrecord.unmarshal(cached)
145
161
  else
146
162
  redrecord_uncached_value(k)
147
163
  end
data/redrecord.gemspec CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = "redrecord"
5
- s.version = "0.5"
5
+ s.version = "0.6"
6
6
 
7
7
  s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
8
8
  s.authors = ["Andrew Snow"]
data/test/test_all.rb CHANGED
@@ -37,6 +37,12 @@ class TestRedrecord < Test::Unit::TestCase
37
37
  u2 = TestUser.new(1, 'John', 'Smith')
38
38
  assert_nil u2.nil
39
39
  end
40
+
41
+ def test_number
42
+ @user.save
43
+ assert_equal '12345', $redis.hget('TestUser:1', 'number')
44
+ assert_equal 12345, @user.number_with_cache
45
+ end
40
46
 
41
47
  def test_invalidation_on_save
42
48
  @user.save
@@ -90,6 +96,7 @@ class TestRedrecord < Test::Unit::TestCase
90
96
  :nil => nil,
91
97
  :group_names => [],
92
98
  :valid? => true,
99
+ :number => 12345,
93
100
  :full_name => 'John Smith'},
94
101
  @user.cached_fields)
95
102
  end
@@ -102,6 +109,7 @@ class TestRedrecord < Test::Unit::TestCase
102
109
  :nil => nil,
103
110
  :group_names => [],
104
111
  :valid? => true,
112
+ :number => 12345,
105
113
  :full_name => 'John Smith'},
106
114
  @user.attribs_with_cached_fields)
107
115
  end
@@ -132,15 +140,17 @@ class TestRedrecord < Test::Unit::TestCase
132
140
 
133
141
  def test_disable_due_to_exception
134
142
  Redrecord.redis = nil
143
+ old = $stderr ; $stderr = StringIO.new
135
144
  @user.save
145
+ $stderr = old
136
146
  assert_equal false, Redrecord.enabled
137
147
  end
138
148
 
139
149
  def test_verify_ok
140
150
  @user.save
141
- assert_equal ["full_name", "nil", "group_names", "valid?"].sort, @user.verify_cache!.sort
151
+ assert_equal ["full_name", "nil", "group_names", "valid?", "number"].sort, @user.verify_cache!.sort
142
152
  end
143
-
153
+
144
154
  def test_verify_fail
145
155
  @user.save
146
156
  assert_raises RuntimeError do
data/test/test_helper.rb CHANGED
@@ -68,5 +68,8 @@ class TestUser < TestModel
68
68
  def valid?
69
69
  true
70
70
  end
71
+ def number
72
+ 12345
73
+ end
71
74
  end
72
75
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: redrecord
3
3
  version: !ruby/object:Gem::Version
4
- version: '0.5'
4
+ version: '0.6'
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -13,7 +13,7 @@ date: 2012-02-08 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: redis
16
- requirement: &72362980 !ruby/object:Gem::Requirement
16
+ requirement: &73055740 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '0'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *72362980
24
+ version_requirements: *73055740
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: active_model
27
- requirement: &72361840 !ruby/object:Gem::Requirement
27
+ requirement: &73054380 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: '0'
33
33
  type: :development
34
34
  prerelease: false
35
- version_requirements: *72361840
35
+ version_requirements: *73054380
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: active_support
38
- requirement: &72474170 !ruby/object:Gem::Requirement
38
+ requirement: &73053190 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,7 +43,7 @@ dependencies:
43
43
  version: '0'
44
44
  type: :development
45
45
  prerelease: false
46
- version_requirements: *72474170
46
+ version_requirements: *73053190
47
47
  description: Redis cacheing for ActiveRecord
48
48
  email: andrew@modulus.org
49
49
  executables: []