acts_as_cached 0.1.1 → 0.1.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/lib/view_extensions.rb +65 -12
- data/test/acts_as_cached_test.rb +79 -4
- metadata +49 -41
data/lib/view_extensions.rb
CHANGED
@@ -31,14 +31,45 @@ ActionView::Base.class_eval do
|
|
31
31
|
|
32
32
|
end
|
33
33
|
|
34
|
-
|
34
|
+
# Will render and cache a partial
|
35
|
+
# If the object has been removed or doesn't exists nothing will be rendered
|
35
36
|
|
36
|
-
|
37
|
+
def render_object(object, view, options={})
|
38
|
+
options[:object] = object
|
39
|
+
do_render_object(view, options)
|
40
|
+
end
|
41
|
+
|
42
|
+
|
43
|
+
def render_object_klass_id(klass, id, view, options = {})
|
44
|
+
options[:klass] = klass
|
45
|
+
options[:id] = id
|
46
|
+
do_render_object(view, options)
|
47
|
+
end
|
48
|
+
|
49
|
+
private
|
50
|
+
|
51
|
+
|
52
|
+
def do_render_object(view, options={})
|
53
|
+
|
54
|
+
klass, id =
|
55
|
+
if options[:object]
|
56
|
+
[options[:object].class, options[:object].id]
|
57
|
+
else
|
58
|
+
[options[:klass], options[:id]]
|
59
|
+
end
|
60
|
+
|
61
|
+
unless klass && id
|
62
|
+
raise "options[:object] or options[:id] and options[:klass] must be specified"
|
63
|
+
end
|
64
|
+
|
65
|
+
id = id.to_i
|
66
|
+
|
67
|
+
logger.info "render_cached: class: #{klass.name} :id #{id} view: #{view} options #{options.inspect}"
|
37
68
|
|
38
69
|
|
39
70
|
# XXX validate that object is an acts_as_cached FIXME
|
40
71
|
|
41
|
-
namespace = "#{
|
72
|
+
namespace = "#{klass.name}:#{id}"
|
42
73
|
if render_options = options[:options]
|
43
74
|
key = "#{view}:#{render_options.to_key}"
|
44
75
|
else
|
@@ -48,7 +79,7 @@ ActionView::Base.class_eval do
|
|
48
79
|
|
49
80
|
fragment_proc = Proc.new do
|
50
81
|
partial = options[:partial]
|
51
|
-
class_lower =
|
82
|
+
class_lower = klass.name.underscore
|
52
83
|
unless partial
|
53
84
|
if directory = options[:directory]
|
54
85
|
partial = "#{directory}/#{class_lower}_#{view}"
|
@@ -56,7 +87,13 @@ ActionView::Base.class_eval do
|
|
56
87
|
partial = "#{class_lower}_#{view}"
|
57
88
|
end
|
58
89
|
end
|
59
|
-
|
90
|
+
begin
|
91
|
+
|
92
|
+
object = view_extensions_fetch_object(options)
|
93
|
+
render :partial => partial, :locals => { class_lower.to_sym => object, :options => render_options }
|
94
|
+
rescue ActiveRecord::RecordNotFound => e
|
95
|
+
''
|
96
|
+
end
|
60
97
|
end
|
61
98
|
|
62
99
|
unless options[:cache] == false
|
@@ -66,18 +103,34 @@ ActionView::Base.class_eval do
|
|
66
103
|
end
|
67
104
|
|
68
105
|
if transformer = options[:transform]
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
106
|
+
|
107
|
+
begin
|
108
|
+
object = view_extensions_fetch_object(options)
|
109
|
+
|
110
|
+
case transformer
|
111
|
+
when Symbol
|
112
|
+
return send(transformer, object, fragment)
|
113
|
+
when Proc
|
114
|
+
return transformer.call(object, fragment)
|
115
|
+
else
|
116
|
+
raise TypeError, "Transformer must be either symbol or proc"
|
117
|
+
end
|
118
|
+
rescue ActiveRecord::RecordNotFound => e
|
119
|
+
''
|
76
120
|
end
|
77
121
|
else
|
78
122
|
return fragment
|
79
123
|
end
|
80
124
|
|
81
125
|
end
|
126
|
+
|
127
|
+
def view_extensions_fetch_object(options)
|
128
|
+
if options[:object]
|
129
|
+
options[:object]
|
130
|
+
else
|
131
|
+
options[:klass].find(options[:id].to_i)
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
82
135
|
end
|
83
136
|
|
data/test/acts_as_cached_test.rb
CHANGED
@@ -1,8 +1,83 @@
|
|
1
1
|
require 'test/unit'
|
2
|
-
|
2
|
+
require 'rubygems'
|
3
|
+
require 'action_pack'
|
4
|
+
require 'mocha'
|
5
|
+
require 'action_controller'
|
6
|
+
require 'action_view'
|
7
|
+
require 'view_extensions'
|
8
|
+
require 'active_record'
|
3
9
|
class ActsAsCachedTest < Test::Unit::TestCase
|
4
|
-
|
5
|
-
|
6
|
-
|
10
|
+
|
11
|
+
class MockActiveRecord
|
12
|
+
attr_accessor :id
|
13
|
+
def initialize(id)
|
14
|
+
@id = id
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
18
|
+
|
19
|
+
def setup
|
20
|
+
@action_view = ActionView::Base.new
|
21
|
+
@action_view.stubs(:render).returns("yoyo")
|
22
|
+
@action_view.stubs(:logger).returns(stub_everything)
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_render_object_cached
|
26
|
+
obj = MockActiveRecord.new(1)
|
27
|
+
MockActiveRecord.expects(:find).never
|
28
|
+
cached_value(@action_view, 'yoyo')
|
29
|
+
|
30
|
+
assert_equal "yoyo", @action_view.render_object(obj, 'view')
|
31
|
+
end
|
32
|
+
|
33
|
+
def test_render_object_uncached
|
34
|
+
obj = MockActiveRecord.new(1)
|
35
|
+
MockActiveRecord.expects(:find).never
|
36
|
+
uncached_value(@action_view)
|
37
|
+
|
38
|
+
assert_equal "yoyo", @action_view.render_object(obj, 'view')
|
39
|
+
end
|
40
|
+
|
41
|
+
|
42
|
+
def test_render_object_klass_id_cached
|
43
|
+
obj = MockActiveRecord.new(1)
|
44
|
+
MockActiveRecord.expects(:find).never
|
45
|
+
cached_value(@action_view, 'yoyo')
|
46
|
+
assert_equal "yoyo", @action_view.render_object_klass_id(MockActiveRecord, 1, 'view')
|
47
|
+
end
|
48
|
+
|
49
|
+
def test_render_object_klass_id_cached_uncached
|
50
|
+
obj = MockActiveRecord.new(1)
|
51
|
+
MockActiveRecord.expects(:find).with(1).once.returns(obj)
|
52
|
+
uncached_value(@action_view)
|
53
|
+
|
54
|
+
assert_equal "yoyo", @action_view.render_object_klass_id(MockActiveRecord, 1, 'view')
|
55
|
+
|
56
|
+
end
|
57
|
+
|
58
|
+
def test_render_object_klass_id_missing_object
|
59
|
+
obj = MockActiveRecord.new(1)
|
60
|
+
MockActiveRecord.expects(:find).with(1).once.raises(ActiveRecord::RecordNotFound)
|
61
|
+
uncached_value(@action_view)
|
62
|
+
|
63
|
+
assert_equal "", @action_view.render_object_klass_id(MockActiveRecord, 1, 'view')
|
64
|
+
|
65
|
+
end
|
66
|
+
|
67
|
+
def cached_value(obj, value)
|
68
|
+
obj.class.class_eval <<-EOS
|
69
|
+
def cache_value(*args)
|
70
|
+
'#{value}'
|
71
|
+
end
|
72
|
+
EOS
|
7
73
|
end
|
74
|
+
|
75
|
+
def uncached_value(obj)
|
76
|
+
obj.class.class_eval do
|
77
|
+
def cache_value(namespace, expire, &proc)
|
78
|
+
proc.call
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
8
83
|
end
|
metadata
CHANGED
@@ -1,57 +1,65 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
|
-
rubygems_version: 0.8.11
|
3
|
-
specification_version: 1
|
4
2
|
name: acts_as_cached
|
5
3
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.1.
|
7
|
-
date: 2006-12-22 00:00:00 +01:00
|
8
|
-
summary: Caching helpers for Rails
|
9
|
-
require_paths:
|
10
|
-
- lib
|
11
|
-
email:
|
12
|
-
homepage:
|
13
|
-
rubyforge_project:
|
14
|
-
description:
|
15
|
-
autorequire: acts_as_cached
|
16
|
-
default_executable:
|
17
|
-
bindir: bin
|
18
|
-
has_rdoc: true
|
19
|
-
required_ruby_version: !ruby/object:Gem::Version::Requirement
|
20
|
-
requirements:
|
21
|
-
- - ">"
|
22
|
-
- !ruby/object:Gem::Version
|
23
|
-
version: 0.0.0
|
24
|
-
version:
|
4
|
+
version: 0.1.2
|
25
5
|
platform: ruby
|
26
|
-
signing_key:
|
27
|
-
cert_chain:
|
28
6
|
authors:
|
29
7
|
- Adocca Entertainment AB
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
- test/acts_as_cached_test.rb
|
34
|
-
- README
|
35
|
-
test_files: []
|
36
|
-
|
37
|
-
rdoc_options:
|
38
|
-
- --line-numbers
|
39
|
-
- --inline-source
|
40
|
-
extra_rdoc_files:
|
41
|
-
- README
|
42
|
-
executables: []
|
43
|
-
|
44
|
-
extensions: []
|
45
|
-
|
46
|
-
requirements: []
|
8
|
+
autorequire: acts_as_cached
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
47
11
|
|
12
|
+
date: 2008-05-27 00:00:00 +02:00
|
13
|
+
default_executable:
|
48
14
|
dependencies:
|
49
15
|
- !ruby/object:Gem::Dependency
|
50
16
|
name: AdoccaMemcache
|
51
17
|
version_requirement:
|
52
|
-
version_requirements: !ruby/object:Gem::
|
18
|
+
version_requirements: !ruby/object:Gem::Requirement
|
53
19
|
requirements:
|
54
20
|
- - ">="
|
55
21
|
- !ruby/object:Gem::Version
|
56
22
|
version: 0.1.0
|
57
23
|
version:
|
24
|
+
description:
|
25
|
+
email:
|
26
|
+
executables: []
|
27
|
+
|
28
|
+
extensions: []
|
29
|
+
|
30
|
+
extra_rdoc_files:
|
31
|
+
- README
|
32
|
+
files:
|
33
|
+
- lib/acts_as_cached.rb
|
34
|
+
- lib/view_extensions.rb
|
35
|
+
- test/acts_as_cached_test.rb
|
36
|
+
- README
|
37
|
+
has_rdoc: true
|
38
|
+
homepage:
|
39
|
+
post_install_message:
|
40
|
+
rdoc_options:
|
41
|
+
- --line-numbers
|
42
|
+
- --inline-source
|
43
|
+
require_paths:
|
44
|
+
- lib
|
45
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
46
|
+
requirements:
|
47
|
+
- - ">="
|
48
|
+
- !ruby/object:Gem::Version
|
49
|
+
version: "0"
|
50
|
+
version:
|
51
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
52
|
+
requirements:
|
53
|
+
- - ">="
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
version: "0"
|
56
|
+
version:
|
57
|
+
requirements: []
|
58
|
+
|
59
|
+
rubyforge_project:
|
60
|
+
rubygems_version: 1.1.1
|
61
|
+
signing_key:
|
62
|
+
specification_version: 2
|
63
|
+
summary: Caching helpers for Rails
|
64
|
+
test_files: []
|
65
|
+
|