redrecord 0.2 → 0.3

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG CHANGED
@@ -1,4 +1,6 @@
1
1
 
2
+ v0.3. Support bang and question mark method rewrites
3
+
2
4
  v0.2. Support disabling cache on timeout
3
5
 
4
6
  v0.1. First version
data/lib/redrecord.rb CHANGED
@@ -17,8 +17,9 @@ class Redrecord
17
17
  Timeout.timeout(@timeout || 15) do
18
18
  redis.send(op, *args)
19
19
  end
20
- rescue Timeout::Error
21
- @enabled = nil
20
+ rescue Exception => e
21
+ STDERR.puts "Redrecord: Disabling redis due to exception (#{e})"
22
+ @enabled = false
22
23
  end
23
24
  end
24
25
  end
@@ -44,7 +45,8 @@ class Redrecord
44
45
  end
45
46
  redrecord_cached_fields.push(*fields)
46
47
  fields.each do |f|
47
- define_method "#{f}_with_cache" do
48
+ aliased_target, punctuation = f.to_s.sub(/([?!=])$/, ''), $1
49
+ define_method("#{aliased_target}_with_cache#{punctuation}") do
48
50
  cached_method(f)
49
51
  end
50
52
  alias_method_chain f, :cache
@@ -95,6 +97,7 @@ class Redrecord
95
97
  record.remove_from_cache!
96
98
  elsif command == :save
97
99
  record.add_to_cache!
100
+ # possible todo: cascade invalidation (but avoid loops)
98
101
  end
99
102
  end
100
103
  Redrecord.update_queue.clear
@@ -111,7 +114,8 @@ class Redrecord
111
114
  def add_to_cache!
112
115
  Redrecord.redis_op(:hmset, redrecord_key,
113
116
  *(self.class.redrecord_cached_fields.map {|f|
114
- val = send("#{f}_without_cache")
117
+ aliased_target, punctuation = f.to_s.sub(/([?!=])$/, ''), $1
118
+ val = send("#{aliased_target}_without_cache#{punctuation}")
115
119
  [f.to_s, String===val && !Redrecord.is_marshalled?(val) ? val : Marshal.dump(val)]
116
120
  }.flatten)
117
121
  )
@@ -130,7 +134,8 @@ class Redrecord
130
134
  h[k.to_sym] = if(cached = (redrecord_redis_cache && redrecord_redis_cache[k.to_s] unless new_record?))
131
135
  Redrecord.is_marshalled?(cached) ? Marshal.load(cached) : cached
132
136
  else
133
- send("#{k}_without_cache")
137
+ aliased_target, punctuation = k.to_s.sub(/([?!=])$/, ''), $1
138
+ send("#{aliased_target}_without_cache#{punctuation}")
134
139
  end
135
140
  end
136
141
  end
data/redrecord.gemspec CHANGED
@@ -2,11 +2,11 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = "redrecord"
5
- s.version = "0.2"
5
+ s.version = "0.3"
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"]
9
- s.date = "2012-01-25"
9
+ s.date = "2012-01-26"
10
10
  s.description = "Redis cacheing for ActiveRecord"
11
11
  s.email = "andrew@modulus.org"
12
12
  s.extra_rdoc_files = ["CHANGELOG", "README", "lib/redrecord.rb"]
data/test/test_all.rb CHANGED
@@ -9,6 +9,7 @@ require "#{File.dirname(__FILE__)}/test_helper"
9
9
  class TestRedrecord < Test::Unit::TestCase
10
10
  def setup
11
11
  $redis.flushdb
12
+ Redrecord.redis = $redis
12
13
  Redrecord.enabled = true
13
14
  @user = TestUser.new(1, 'John', 'Smith')
14
15
  $saved = {}
@@ -88,6 +89,7 @@ class TestRedrecord < Test::Unit::TestCase
88
89
  assert_equal({
89
90
  :nil => nil,
90
91
  :group_names => [],
92
+ :valid? => true,
91
93
  :full_name => 'John Smith'},
92
94
  @user.cached_fields)
93
95
  end
@@ -99,6 +101,7 @@ class TestRedrecord < Test::Unit::TestCase
99
101
  :id => 1,
100
102
  :nil => nil,
101
103
  :group_names => [],
104
+ :valid? => true,
102
105
  :full_name => 'John Smith'},
103
106
  @user.attribs_with_cached_fields)
104
107
  end
@@ -120,5 +123,17 @@ class TestRedrecord < Test::Unit::TestCase
120
123
  assert_nil $redis.hget('TestUser:1', 'full_name')
121
124
  end
122
125
 
126
+ def test_question_marked_method
127
+ @user.save
128
+ u2 = TestUser.new(1, 'Bob', 'Smith')
129
+ assert_equal true, u2.valid?
130
+ assert !u2.recalculated
131
+ end
123
132
 
133
+ def test_disable_due_to_exception
134
+ Redrecord.redis = nil
135
+ @user.save
136
+ assert_equal false, Redrecord.enabled
137
+ end
138
+
124
139
  end
data/test/test_helper.rb CHANGED
@@ -1,8 +1,6 @@
1
1
 
2
2
  # WARNING: The database specified here will be CLEARED of ALL DATA
3
3
  $redis = Redis.new(:host => 'localhost', :port => 6379, :db => 15)
4
- Redrecord.redis = $redis
5
- Redrecord.enabled = true
6
4
 
7
5
  class TestModel
8
6
  extend ActiveModel::Callbacks
@@ -67,5 +65,8 @@ class TestUser < TestModel
67
65
  def group_names
68
66
  $saved.values.select {|v| TestGroup===v && v.user.id == self.id }.map(&:name).sort
69
67
  end
68
+ def valid?
69
+ true
70
+ end
70
71
  end
71
72
  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.2'
4
+ version: '0.3'
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-01-25 00:00:00.000000000 Z
12
+ date: 2012-01-26 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: redis
16
- requirement: &81395770 !ruby/object:Gem::Requirement
16
+ requirement: &71491920 !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: *81395770
24
+ version_requirements: *71491920
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: active_model
27
- requirement: &81395260 !ruby/object:Gem::Requirement
27
+ requirement: &71490960 !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: *81395260
35
+ version_requirements: *71490960
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: active_support
38
- requirement: &81394630 !ruby/object:Gem::Requirement
38
+ requirement: &71490120 !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: *81394630
46
+ version_requirements: *71490120
47
47
  description: Redis cacheing for ActiveRecord
48
48
  email: andrew@modulus.org
49
49
  executables: []