redrecord 0.2 → 0.3

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.
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: []