redrecord 0.1 → 0.2

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG CHANGED
@@ -1 +1,4 @@
1
+
2
+ v0.2. Support disabling cache on timeout
3
+
1
4
  v0.1. First version
data/Manifest CHANGED
@@ -1,7 +1,7 @@
1
1
  CHANGELOG
2
+ Manifest
2
3
  README
3
4
  Rakefile
4
5
  lib/redrecord.rb
5
6
  test/test_all.rb
6
7
  test/test_helper.rb
7
- Manifest
data/README CHANGED
@@ -62,6 +62,33 @@ Other instance methods of interest:
62
62
 
63
63
 
64
64
 
65
+ If redis is down?
66
+ -----------------
67
+
68
+ To enable talking to a redis server, set Redrecord.enabled=true
69
+
70
+ If Redrecord can't access redis within a timeout (Redrecord.timeout=15 by
71
+ default) then it sets enabled=false, disabling all redis access so your
72
+ application can keep working without the cache.
73
+
74
+ For testing purposes, you can set Redrecord.write_only = true
75
+ This keeps the cache contents up to date but does not read back any cached
76
+ content.
77
+
78
+
79
+ Setup
80
+ -----
81
+
82
+ in your Gemfile:
83
+
84
+ gem 'redrecord'
85
+
86
+ in your rails app config/initializers/redrecord.rb:
87
+
88
+ $redis = Redis.new(:host => 'localhost', :port => 6379, :db => 1)
89
+ Redrecord.redis = $redis
90
+ Redrecord.enabled = true
91
+
65
92
 
66
93
 
67
94
  Contact the author
data/lib/redrecord.rb CHANGED
@@ -1,14 +1,27 @@
1
1
 
2
+ require 'timeout'
3
+
2
4
  class Redrecord
3
5
 
4
6
  class << self
5
- attr_accessor :redis
7
+ attr_accessor :redis, :enabled, :write_only, :timeout
6
8
  def update_queue
7
9
  Thread.current[:redrecord_update_queue] ||= []
8
10
  end
9
11
  def is_marshalled?(str)
10
12
  Marshal.dump(nil)[0,2] == str[0,2]
11
13
  end
14
+ def redis_op(op, *args)
15
+ if @enabled
16
+ begin
17
+ Timeout.timeout(@timeout || 15) do
18
+ redis.send(op, *args)
19
+ end
20
+ rescue Timeout::Error
21
+ @enabled = nil
22
+ end
23
+ end
24
+ end
12
25
  end
13
26
 
14
27
  module Model
@@ -92,11 +105,11 @@ class Redrecord
92
105
  end
93
106
 
94
107
  def remove_from_cache!
95
- Redrecord.redis.del redrecord_key
108
+ Redrecord.redis_op :del, redrecord_key
96
109
  end
97
110
 
98
111
  def add_to_cache!
99
- Redrecord.redis.hmset(redrecord_key,
112
+ Redrecord.redis_op(:hmset, redrecord_key,
100
113
  *(self.class.redrecord_cached_fields.map {|f|
101
114
  val = send("#{f}_without_cache")
102
115
  [f.to_s, String===val && !Redrecord.is_marshalled?(val) ? val : Marshal.dump(val)]
@@ -109,12 +122,12 @@ class Redrecord
109
122
  end
110
123
 
111
124
  def redrecord_redis_cache
112
- @redrecord_redis_cache ||= Redrecord.redis.hgetall(redrecord_key)
125
+ @redrecord_redis_cache ||= Redrecord.redis_op(:hgetall, redrecord_key) unless Redrecord.write_only
113
126
  end
114
127
 
115
128
  def redrecord_cached_attrib_hash
116
129
  @redrecord_cached_attrib_hash ||= Hash.new do |h,k|
117
- h[k.to_sym] = if(cached = (redrecord_redis_cache[k.to_s] unless new_record?))
130
+ h[k.to_sym] = if(cached = (redrecord_redis_cache && redrecord_redis_cache[k.to_s] unless new_record?))
118
131
  Redrecord.is_marshalled?(cached) ? Marshal.load(cached) : cached
119
132
  else
120
133
  send("#{k}_without_cache")
data/redrecord.gemspec CHANGED
@@ -2,15 +2,15 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = "redrecord"
5
- s.version = "0.1"
5
+ s.version = "0.2"
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-23"
9
+ s.date = "2012-01-25"
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"]
13
- s.files = ["CHANGELOG", "README", "Rakefile", "lib/redrecord.rb", "test/test_all.rb", "test/test_helper.rb", "Manifest", "redrecord.gemspec"]
13
+ s.files = ["CHANGELOG", "Manifest", "README", "Rakefile", "lib/redrecord.rb", "test/test_all.rb", "test/test_helper.rb", "redrecord.gemspec"]
14
14
  s.homepage = "http://github.com/andys/redrecord"
15
15
  s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Redrecord", "--main", "README"]
16
16
  s.require_paths = ["lib"]
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.enabled = true
12
13
  @user = TestUser.new(1, 'John', 'Smith')
13
14
  $saved = {}
14
15
  end
@@ -29,7 +30,6 @@ class TestRedrecord < Test::Unit::TestCase
29
30
  assert_nil u2.recalculated
30
31
  end
31
32
 
32
-
33
33
  def test_cached_nil_attribute_save
34
34
  @user.save
35
35
  assert_equal Marshal.dump(nil), $redis.hget('TestUser:1', 'nil')
@@ -103,5 +103,22 @@ class TestRedrecord < Test::Unit::TestCase
103
103
  @user.attribs_with_cached_fields)
104
104
  end
105
105
 
106
+ def test_write_only_mode
107
+ Redrecord.write_only = true
108
+ @user.save
109
+ assert_equal 'John Smith', $redis.hget('TestUser:1', 'full_name')
110
+
111
+ # different object should not get the value from redis
112
+ u2 = TestUser.new(1, 'Bob', 'Smith')
113
+ assert_equal 'Bob Smith', u2.full_name
114
+ assert u2.recalculated
115
+ end
116
+
117
+ def test_disabled_mode
118
+ Redrecord.enabled = nil
119
+ @user.save
120
+ assert_nil $redis.hget('TestUser:1', 'full_name')
121
+ end
122
+
106
123
 
107
124
  end
data/test/test_helper.rb CHANGED
@@ -1,5 +1,8 @@
1
- $redis = Redis.new(:host => 'localhost', :port => 6379) # TODO: dangerous!
1
+
2
+ # WARNING: The database specified here will be CLEARED of ALL DATA
3
+ $redis = Redis.new(:host => 'localhost', :port => 6379, :db => 15)
2
4
  Redrecord.redis = $redis
5
+ Redrecord.enabled = true
3
6
 
4
7
  class TestModel
5
8
  extend ActiveModel::Callbacks
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.1'
4
+ version: '0.2'
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-23 00:00:00.000000000 Z
12
+ date: 2012-01-25 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: redis
16
- requirement: &71893080 !ruby/object:Gem::Requirement
16
+ requirement: &81395770 !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: *71893080
24
+ version_requirements: *81395770
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: active_model
27
- requirement: &71892570 !ruby/object:Gem::Requirement
27
+ requirement: &81395260 !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: *71892570
35
+ version_requirements: *81395260
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: active_support
38
- requirement: &71891930 !ruby/object:Gem::Requirement
38
+ requirement: &81394630 !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: *71891930
46
+ version_requirements: *81394630
47
47
  description: Redis cacheing for ActiveRecord
48
48
  email: andrew@modulus.org
49
49
  executables: []
@@ -54,12 +54,12 @@ extra_rdoc_files:
54
54
  - lib/redrecord.rb
55
55
  files:
56
56
  - CHANGELOG
57
+ - Manifest
57
58
  - README
58
59
  - Rakefile
59
60
  - lib/redrecord.rb
60
61
  - test/test_all.rb
61
62
  - test/test_helper.rb
62
- - Manifest
63
63
  - redrecord.gemspec
64
64
  homepage: http://github.com/andys/redrecord
65
65
  licenses: []