redrecord 0.1 → 0.2

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