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 +3 -0
- data/Manifest +1 -1
- data/README +27 -0
- data/lib/redrecord.rb +18 -5
- data/redrecord.gemspec +3 -3
- data/test/test_all.rb +18 -1
- data/test/test_helper.rb +4 -1
- metadata +9 -9
data/CHANGELOG
CHANGED
data/Manifest
CHANGED
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.
|
108
|
+
Redrecord.redis_op :del, redrecord_key
|
96
109
|
end
|
97
110
|
|
98
111
|
def add_to_cache!
|
99
|
-
Redrecord.
|
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.
|
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.
|
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-
|
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", "
|
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
|
-
|
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.
|
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-
|
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: &
|
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: *
|
24
|
+
version_requirements: *81395770
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: active_model
|
27
|
-
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: *
|
35
|
+
version_requirements: *81395260
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: active_support
|
38
|
-
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: *
|
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: []
|