merb-cache 0.9.2 → 0.9.3

Sign up to get free protection for your applications and to get access to all the features.
data/Rakefile CHANGED
@@ -5,7 +5,8 @@ require "spec/rake/spectask"
5
5
 
6
6
  PLUGIN = "merb-cache"
7
7
  NAME = "merb-cache"
8
- MERB_CACHE_VERSION = Merb::MORE_VERSION rescue "0.9.2"
8
+ MERB_CACHE_VERSION = Merb::MORE_VERSION rescue "0.9.3"
9
+ VERSION = "0.9.3"
9
10
  AUTHOR = "Alex Boussinet"
10
11
  EMAIL = "alex.boussinet@gmail.com"
11
12
  HOMEPAGE = "http://www.merbivore.com"
@@ -22,10 +23,10 @@ spec = Gem::Specification.new do |s|
22
23
  s.author = AUTHOR
23
24
  s.email = EMAIL
24
25
  s.homepage = HOMEPAGE
25
- s.add_dependency('merb-core', '>= 0.9.2')
26
+ s.add_dependency('merb-core', '>= 0.9.3')
26
27
  s.require_path = 'lib'
27
28
  s.autorequire = PLUGIN
28
- s.files = %w(LICENSE README Rakefile TODO) + Dir.glob("{lib,specs}/**/*")
29
+ s.files = %w(LICENSE README Rakefile TODO) + Dir.glob("{lib,spec}/**/*")
29
30
 
30
31
  # rdoc
31
32
  s.has_rdoc = true
@@ -63,15 +64,17 @@ Rake::GemPackageTask.new(spec) do |pkg|
63
64
  pkg.gem_spec = spec
64
65
  end
65
66
 
67
+ install_home = ENV['GEM_HOME'] ? "-i #{ENV['GEM_HOME']}" : ""
68
+
66
69
  task :install => [:package] do
67
- sh %{sudo gem install pkg/#{NAME}-#{MERB_CACHE_VERSION} --no-update-sources}
70
+ sh %{sudo gem install #{install_home} pkg/#{NAME}-#{MERB_CACHE_VERSION} --no-update-sources}
68
71
  end
69
72
 
70
73
  namespace :jruby do
71
74
 
72
75
  desc "Run :package and install the resulting .gem with jruby"
73
76
  task :install => :package do
74
- sh %{#{SUDO} jruby -S gem install pkg/#{NAME}-#{Merb::VERSION}.gem --no-rdoc --no-ri}
77
+ sh %{#{SUDO} jruby -S gem install #{install_home} pkg/#{NAME}-#{Merb::VERSION}.gem --no-rdoc --no-ri}
75
78
  end
76
79
 
77
80
  end
@@ -28,7 +28,7 @@ module Merb::Cache::ControllerClassMethods
28
28
  # ==== Example
29
29
  # cache_actions :mostly_static, [:barely_dynamic, 10]
30
30
  def cache_actions(*actions)
31
- if actions.any? && Merb::Cache.cached_actions.empty?
31
+ if actions.any? && !Merb::Cache.cached_actions.key?(controller_name)
32
32
  before(:cache_action_before)
33
33
  after(:cache_action_after)
34
34
  end
@@ -29,7 +29,7 @@ module Merb::Cache::ControllerClassMethods
29
29
  # ==== Example
30
30
  # cache_pages :mostly_static, [:barely_dynamic, 10]
31
31
  def cache_pages(*pages)
32
- if pages.any? && Merb::Cache.cached_pages.empty?
32
+ if pages.any? && !Merb::Cache.cached_pages.key?(controller_name)
33
33
  before(:cache_page_before)
34
34
  after(:cache_page_after)
35
35
  end
@@ -44,6 +44,8 @@ end
44
44
  module Merb::Cache::ControllerInstanceMethods
45
45
  # Mixed in Merb::Controller. Provides methods related to page caching
46
46
 
47
+ DEFAULT_PAGE_EXTENSION = 'html'
48
+
47
49
  # Checks whether a cache entry exists
48
50
  #
49
51
  # ==== Parameter
@@ -54,9 +56,11 @@ module Merb::Cache::ControllerInstanceMethods
54
56
  #
55
57
  # ==== Example
56
58
  # cached_page?(:action => 'show', :params => [params[:page]])
59
+ # cached_page?(:action => 'show', :extension => 'js')
57
60
  def cached_page?(options)
58
61
  key = Merb::Controller._cache.key_for(options, controller_name, true)
59
- File.file?(Merb::Controller._cache.config[:cache_html_directory] / "#{key}.html")
62
+ extension = options[:extension] || DEFAULT_PAGE_EXTENSION
63
+ File.file?(Merb::Controller._cache.config[:cache_html_directory] / "#{key}.#{extension}")
60
64
  end
61
65
 
62
66
  # Expires the page identified by the key computed after the parameters
@@ -67,13 +71,15 @@ module Merb::Cache::ControllerInstanceMethods
67
71
  # ==== Examples
68
72
  # expire_page(:action => 'show', :controller => 'news')
69
73
  # expire_page(:action => 'show', :match => true)
74
+ # expire_page(:action => 'show', :extension => 'js')
70
75
  def expire_page(options)
71
76
  config_dir = Merb::Controller._cache.config[:cache_html_directory]
72
77
  Merb::Controller._cache.expire_key_for(options, controller_name, true) do |key, match|
73
78
  if match
74
79
  files = Dir.glob(config_dir / "#{key}*")
75
80
  else
76
- files = config_dir / "#{key}.html"
81
+ extension = options[:extension] || DEFAULT_PAGE_EXTENSION
82
+ files = config_dir / "#{key}.#{extension}"
77
83
  end
78
84
  FileUtils.rm_rf(files)
79
85
  end
@@ -106,14 +112,18 @@ module Merb::Cache::ControllerInstanceMethods
106
112
  # If request.path is "/", the name will be "/index.html"
107
113
  # If request.path is "/news/show/1", the name will be "/news/show/1.html"
108
114
  # If request.path is "/news/show/", the name will be "/news/show.html"
115
+ # If request.path is "/news/styles.css", the name will be "/news/styles.css"
109
116
  def _cache_page(data = nil)
117
+ return if Merb::Controller._cache.config[:disable_page_caching]
110
118
  controller = controller_name
111
119
  action = action_name.to_sym
112
120
  pages = Merb::Controller._cache.cached_pages[controller]
113
121
  return unless pages && pages.key?(action)
114
122
  path = request.path.chomp("/")
115
123
  path = "index" if path.empty?
116
- cache_file = Merb::Controller._cache.config[:cache_html_directory] / "#{path}.html"
124
+ ext = "." + (params[:format].empty? ? DEFAULT_PAGE_EXTENSION : params[:format])
125
+ ext = nil if File.extname(path) == ext
126
+ cache_file = Merb::Controller._cache.config[:cache_html_directory] / "#{path}#{ext}"
117
127
  if data
118
128
  cache_directory = File.dirname(cache_file)
119
129
  FileUtils.mkdir_p(cache_directory)
@@ -40,6 +40,7 @@ class Merb::Cache
40
40
  def start
41
41
  @config = DEFAULT_CONFIG.merge(Merb::Plugins.config[:merb_cache] || {})
42
42
  if @config[:disable] == true || Merb.environment == @config[:disable]
43
+ config[:disable_page_caching] = true
43
44
  config[:store] = "dummy"
44
45
  end
45
46
  @config[:cache_html_directory] ||= Merb.dir_for(:public) / "cache"
@@ -0,0 +1,14 @@
1
+ ---
2
+ :development: &defaults
3
+ :adapter: sqlite3
4
+ :database: tmp/merb-cache.sqlite3
5
+ :log_stream: log/sql.log
6
+ :log_level: 0
7
+
8
+ :test:
9
+ <<: *defaults
10
+ :database: tmp/merb-cache.sqlite3
11
+
12
+ :production:
13
+ <<: *defaults
14
+ :database: tmp/merb-cache.sqlite3
@@ -0,0 +1,58 @@
1
+ class CacheController < Merb::Controller
2
+ self._template_root = File.dirname(__FILE__) / "views"
3
+
4
+ cache_action :action3
5
+ cache_action :action4, 0.05
6
+ # or cache_actions :action3, [:action4, 0.05]
7
+
8
+ cache_page :action5
9
+ cache_page :action6, 0.05
10
+ # or cache_pages :action5, [:action6, 0.05]
11
+ cache_page :action7
12
+
13
+ def action1
14
+ render
15
+ end
16
+
17
+ def action2
18
+ render
19
+ end
20
+
21
+ def action3
22
+ "test action3"
23
+ end
24
+
25
+ def action4
26
+ "test action4"
27
+ end
28
+
29
+ def action5
30
+ "test action5"
31
+ end
32
+
33
+ def action6
34
+ Time.now.to_s
35
+ end
36
+
37
+ def action7
38
+ provides :js, :css, :html, :xml, :jpg
39
+ case params[:format]
40
+ when "css"
41
+ "CSS"
42
+ when "js"
43
+ "JS"
44
+ when "html"
45
+ "HTML"
46
+ when "xml"
47
+ "XML"
48
+ when "jpg"
49
+ "JPG"
50
+ else
51
+ raise "BAD FORMAT: #{params[:format].inspect}"
52
+ end
53
+ end
54
+
55
+ def index
56
+ "test index"
57
+ end
58
+ end
@@ -0,0 +1,106 @@
1
+ describe "merb-cache-action" do
2
+
3
+ it "should cache action (action3)" do
4
+ c = get("/cache_controller/action3")
5
+ c.body.strip.should == "test action3"
6
+ c.cached?("/cache_controller/action3").should be_true
7
+ c.cached_action?("action3").should be_true
8
+ c.cache_get("/cache_controller/action3").should == "test action3"
9
+ end
10
+
11
+ it "should expire action (action3)" do
12
+ CACHE.expire_action "action3"
13
+ CACHE.cache_get("/cache_controller/action3").should be_nil
14
+ end
15
+
16
+ it "should cache action (action3) with full path" do
17
+ c = get("/cache_controller/action3/abc/456/ghi")
18
+ c.body.strip.should == "test action3"
19
+ c.cached?(c.request.path).should be_true
20
+ c.cache_get(c.request.path).should == "test action3"
21
+ end
22
+
23
+ it "should expire action (action3) with full path" do
24
+ c = get("/cache_controller/action3/abc/456/ghi")
25
+ c.expire_action(:key => c.request.path)
26
+ c.cache_get(c.request.path).should be_nil
27
+ end
28
+
29
+ it "should expire action (action4) after 3 seconds" do
30
+ c = get("/cache_controller/action4")
31
+ c.body.strip.should == "test action4"
32
+ c.cached?("/cache_controller/action4").should be_true
33
+ c.cache_get("/cache_controller/action4").should == "test action4"
34
+ sleep 4
35
+ c.cache_get("/cache_controller/action4").should be_nil
36
+ c.cached_action?(:action => "action4").should be_false
37
+ end
38
+
39
+ it "should cache action with full path (action4) and expire in 3 seconds" do
40
+ CACHE.expire_action :match => true, :action => "action4"
41
+ CACHE.cached_action?(:action => "action4", :params => %w(path to nowhere)).should be_false
42
+ c = get("/cache_controller/action4/path/to/nowhere/")
43
+ c.cached_action?(:action => "action4", :params => %w(path to nowhere)).should be_true
44
+ sleep 3.5
45
+ c.cache_get("/cache_controller/action4/path/to/nowhere").should be_nil
46
+ c.cached_action?(:action => "action4", :params => %w(path to nowhere)).should be_false
47
+ end
48
+
49
+ it "should expire action in many ways" do
50
+ c = get("/cache_controller/action4")
51
+ CACHE.expire_action("action4")
52
+ CACHE.cached_action?("action4").should be_false
53
+
54
+ c = get("/cache_controller/action4")
55
+ CACHE.expire_action(:match => "/cache_control")
56
+ CACHE.cached_action?(:action => "action4").should be_false
57
+
58
+ c = get("/cache_controller/action4")
59
+ CACHE.expire_action(:action => "action4")
60
+ CACHE.cached_action?(:action => "action4").should be_false
61
+
62
+ c = get("/cache_controller/action4/id1/id2")
63
+ CACHE.expire_action(:action => "action4", :params => %w(id1 id2))
64
+ CACHE.cached_action?(:action => "action4", :params => %w(id1 id2)).should be_false
65
+
66
+ c = get("/cache_controller/action4/id1/id2")
67
+ CACHE.expire_action(:action => "action4", :match => true)
68
+ CACHE.cached_action?(:action => "action4", :params => %w(id1 id2)).should be_false
69
+
70
+ c = get("/cache_controller/action4")
71
+ CACHE.expire_action(:action => "action4", :controller => "cache_controller")
72
+ CACHE.cached_action?(:action => "action4", :controller => "cache_controller").should be_false
73
+
74
+ c = get("/cache_controller/action4/id1/id2")
75
+ CACHE.expire_action(:action => "action4", :params => %w(id1), :match => true)
76
+ CACHE.cached_action?(:action => "action4", :params => %w(id1 id2)).should be_false
77
+
78
+ c = get("/cache_controller/action4/id1/id2")
79
+ CACHE.expire_action(:action => "action4", :controller => "cache_controller", :match => true)
80
+ CACHE.cached_action?(:action => "action4", :params => %w(id1 id2)).should be_false
81
+
82
+ c = get("/cache_controller/action4/id1/id2")
83
+ CACHE.expire_action(:action => "action4", :controller => "cache_controller", :params => %w(id1), :match => true)
84
+ CACHE.cached_action?(:action => "action4", :params => %w(id1 id2)).should be_false
85
+
86
+ c = get("/cache_controller/action4/id1/id2")
87
+ CACHE.expire_action(:action => "action4", :controller => "cache_controller", :params => %w(id1 id2))
88
+ CACHE.cached_action?(:action => "action4", :controller => "cache_controller", :params => %w(id1 id2)).should be_false
89
+
90
+ c = get("/cache_controller/action4")
91
+ CACHE.expire_action(:key => "/cache_controller/action4")
92
+ CACHE.cached_action?(:key => "/cache_controller/action4").should be_false
93
+ c = get("/cache_controller/action4/id1/id2")
94
+ CACHE.expire_action(:key => "/cache_controller/action4", :params => %w(id1 id2))
95
+ CACHE.cached_action?(:key => "/cache_controller/action4", :params => %w(id1 id2)).should be_false
96
+
97
+ c = get("/cache_controller/action4/id1/id2")
98
+ CACHE.expire_action(:key => "/cache_controller/action4/id1", :match => true)
99
+ CACHE.cached_action?(:key => "/cache_controller/action4/id1/id2").should be_false
100
+
101
+ c = get("/cache_controller/action4/id1/id2")
102
+ CACHE.expire_action(:key => "/cache_controller/action4", :params => %w(id1), :match => true)
103
+ CACHE.cached_action?(:key => "/cache_controller/action4/id1/id2").should be_false
104
+ end
105
+
106
+ end
@@ -0,0 +1,100 @@
1
+ # TODO
2
+ # more specs for fragment caching:
3
+ # cache_get, cache_set, cached?, cache, expire
4
+
5
+ describe "merb-cache-fragment" do
6
+
7
+ it "should render index" do
8
+ c = dispatch_to(CacheController, :index)
9
+ c.body.should == "test index"
10
+ end
11
+
12
+ it "should cache the fragment (erb capture/concat)" do
13
+ c = dispatch_to(CacheController, :action1)
14
+ NOW = c.body.strip
15
+ c.cache_get("key1").strip.should == NOW
16
+ end
17
+
18
+ it "should cache the fragment (haml capture/concat)" do
19
+ c = dispatch_to(CacheController, :action2)
20
+ now = c.body.strip
21
+ c.cache_get("key11").strip.should == now
22
+ sleep 1
23
+ c = dispatch_to(CacheController, :action2)
24
+ c.cache_get("key11").strip.should == now
25
+ c.expire("key11")
26
+ c.cache_get("key11").should be_nil
27
+ end
28
+
29
+ it "should use the fragment" do
30
+ sleep 1
31
+ c = dispatch_to(CacheController, :action1)
32
+ c.body.strip.should == NOW
33
+ end
34
+
35
+ it "should expire the fragment" do
36
+ CACHE.expire("key1")
37
+ CACHE.cache_get("key1").should be_nil
38
+ end
39
+
40
+ it "should refresh the template" do
41
+ c = dispatch_to(CacheController, :action1)
42
+ c.body.strip.should_not == NOW
43
+ end
44
+
45
+ it "should return nil for unknown keys" do
46
+ CACHE.cache_get("unknown_key").should be_nil
47
+ end
48
+
49
+ it "should expire matching keys" do
50
+ CACHE.cache_set("test1", "test1")
51
+ CACHE.cache_get("test1").should == "test1"
52
+ CACHE.cache_set("test2", "test2")
53
+ CACHE.cache_get("test2").should == "test2"
54
+ CACHE.cache_set("test3", "test3")
55
+ CACHE.cache_get("test3").should == "test3"
56
+ CACHE.expire(:match => "test")
57
+ CACHE.cache_get("test1").should be_nil
58
+ CACHE.cache_get("test2").should be_nil
59
+ CACHE.cache_get("test3").should be_nil
60
+ end
61
+
62
+ it "should expire entry after 3 seconds" do
63
+ CACHE.cache_set("timed_key", "vanish in 3 seconds", 0.05)
64
+ CACHE.cache_get("timed_key").should == "vanish in 3 seconds"
65
+ sleep 3.5
66
+ CACHE.cache_get("timed_key").should be_nil
67
+ end
68
+
69
+ it "should expire in many ways" do
70
+ CACHE.cache_set("test1", "test1")
71
+ CACHE.expire("test1")
72
+ CACHE.cache_get("test1").should be_nil
73
+
74
+ CACHE.cache_set("test2/id1", "test2")
75
+ CACHE.expire(:key => "test2", :params => %w(id1))
76
+ CACHE.cache_get("test2/id1").should be_nil
77
+
78
+ CACHE.cache_set("test3", "test3")
79
+ CACHE.expire(:key => "test3")
80
+ CACHE.cache_get("test3").should be_nil
81
+
82
+ CACHE.cache_set("test4/id1", "test4")
83
+ CACHE.expire(:key => "test4", :params => %w(id1), :match => true)
84
+ CACHE.cache_get("test4/id1/id2").should be_nil
85
+ end
86
+
87
+ it "should expire all keys" do
88
+ CACHE.expire_all
89
+ CACHE.cache_get("key1").should be_nil
90
+ end
91
+
92
+ it "should cache/restore ruby objects" do
93
+ now = Time.now
94
+ data = {:key1 => "key1", :key2 => "key2", :now => Time.now }
95
+ CACHE.cache_set("key1", data)
96
+ _data = CACHE.cache_get("key1")
97
+ data.should == _data
98
+ end
99
+
100
+ end
@@ -0,0 +1,150 @@
1
+ describe "merb-cache-page" do
2
+
3
+ it "should cache page (action5)" do
4
+ c = get("/cache_controller/action5")
5
+ c.body.strip.should == "test action5"
6
+ c.cached_page?("action5").should be_true
7
+ end
8
+
9
+ it "should expire page (action5)" do
10
+ CACHE.expire_page("action5")
11
+ CACHE.cached_page?("action5").should be_false
12
+ end
13
+
14
+ it "should cache page (action5) with full path" do
15
+ c = get("/cache_controller/action5/this/is/a/test")
16
+ c.cached_page?(:action => "action5", :params => %w(this is a test)).should be_true
17
+ end
18
+
19
+ it "should expire page (action5) with full path" do
20
+ CACHE.expire_page(:action => "action5",
21
+ :controller => "cache_controller",
22
+ :params => %w(this is a test))
23
+ CACHE.cached_page?(:key => "/cache_controller/action5/this/is/a/test").should be_false
24
+ end
25
+
26
+ it "should cache page (action6), use it and expire 3 seconds after" do
27
+ CACHE.expire_page :match => true, :action => "action6"
28
+ c = get("/cache_controller/action6")
29
+ now = Time.now.to_s
30
+ c.body.strip.should == now
31
+ c.cached_page?("action6").should be_true
32
+ sleep 1
33
+ c = get("/cache_controller/action6")
34
+ c.body.strip.should == now
35
+ sleep 2
36
+ c = get("/cache_controller/action6")
37
+ c.body.strip.should == Time.now.to_s
38
+ end
39
+
40
+ it "should cache page with full path (action6) and expire in 3 seconds" do
41
+ CACHE.expire_page "action6"
42
+ CACHE.cached_page?(:action => "action6", :params => %w(path to nowhere)).should be_false
43
+ c = get("/cache_controller/action6/path/to/nowhere/")
44
+ now = Time.now.to_s
45
+ c.body.strip.should == now
46
+ c.cached_page?(:action => "action6", :params => %w(path to nowhere)).should be_true
47
+ sleep 1
48
+ c = get("/cache_controller/action6/path/to/nowhere")
49
+ c.body.strip.should == now
50
+ sleep 2
51
+ c = get("/cache_controller/action6/path/to/nowhere")
52
+ c.body.strip.should == Time.now.to_s
53
+ end
54
+
55
+ it "should expire page in many ways" do
56
+ c = get("/cache_controller/action6")
57
+ CACHE.expire_page("action6")
58
+ CACHE.cached_page?("action6").should be_false
59
+
60
+ c = get("/cache_controller/action6")
61
+ CACHE.expire_page(:match => "/cache_control")
62
+ CACHE.cached_page?(:action => "action6").should be_false
63
+
64
+ c = get("/cache_controller/action6")
65
+ CACHE.expire_page(:action => "action6")
66
+ CACHE.cached_page?(:action => "action6").should be_false
67
+
68
+ c = get("/cache_controller/action6/id1/id2")
69
+ CACHE.expire_page(:action => "action6", :params => %w(id1 id2))
70
+ CACHE.cached_page?(:action => "action6", :params => %w(id1 id2)).should be_false
71
+
72
+ c = get("/cache_controller/action6/id1/id2")
73
+ CACHE.expire_page(:action => "action6", :match => true)
74
+ CACHE.cached_page?(:action => "action6", :params => %w(id1 id2)).should be_false
75
+
76
+ c = get("/cache_controller/action6")
77
+ CACHE.expire_page(:action => "action6", :controller => "cache_controller")
78
+ CACHE.cached_page?(:action => "action6", :controller => "cache_controller").should be_false
79
+
80
+ c = get("/cache_controller/action6/id1/id2")
81
+ CACHE.expire_page(:action => "action6", :params => %w(id1), :match => true)
82
+ CACHE.cached_page?(:action => "action6", :params => %w(id1 id2)).should be_false
83
+
84
+ c = get("/cache_controller/action6/id1/id2")
85
+ CACHE.expire_page(:action => "action6", :controller => "cache_controller", :match => true)
86
+ CACHE.cached_page?(:action => "action6", :params => %w(id1 id2)).should be_false
87
+
88
+ c = get("/cache_controller/action6/id1/id2")
89
+ CACHE.expire_page(:action => "action6", :controller => "cache_controller", :params => %w(id1), :match => true)
90
+ CACHE.cached_page?(:action => "action6", :params => %w(id1 id2)).should be_false
91
+
92
+ c = get("/cache_controller/action6/id1/id2")
93
+ CACHE.expire_page(:action => "action6", :controller => "cache_controller", :params => %w(id1 id2))
94
+ CACHE.cached_page?(:action => "action6", :controller => "cache_controller", :params => %w(id1 id2)).should be_false
95
+
96
+ c = get("/cache_controller/action6")
97
+ CACHE.expire_page(:key => "/cache_controller/action6")
98
+ CACHE.cached_page?(:key => "/cache_controller/action6").should be_false
99
+ c = get("/cache_controller/action6/id1/id2")
100
+ CACHE.expire_page(:key => "/cache_controller/action6", :params => %w(id1 id2))
101
+ CACHE.cached_page?(:key => "/cache_controller/action6", :params => %w(id1 id2)).should be_false
102
+
103
+ c = get("/cache_controller/action6/id1/id2")
104
+ CACHE.expire_page(:key => "/cache_controller/action6/id1", :match => true)
105
+ CACHE.cached_page?(:key => "/cache_controller/action6/id1/id2").should be_false
106
+
107
+ c = get("/cache_controller/action6/id1/id2")
108
+ CACHE.expire_page(:key => "/cache_controller/action6", :params => %w(id1), :match => true)
109
+ CACHE.cached_page?(:key => "/cache_controller/action6/id1/id2").should be_false
110
+ end
111
+
112
+ it "should respect original content-type" do
113
+ c = get("/cache_controller/action7.css")
114
+ c.body.should == "CSS"
115
+ c = get("/cache_controller/action7.css")
116
+ c.params[:format].should == "css"
117
+ c.cached_page?(:action => "action7", :extension => 'css').should be_true
118
+
119
+ c = get("/cache_controller/action7.js")
120
+ c.body.should == "JS"
121
+ c = get("/cache_controller/action7.js")
122
+ c.params[:format].should == "js"
123
+ c.cached_page?(:action => "action7", :extension => 'js').should be_true
124
+
125
+ c = get("/cache_controller/action7.xml")
126
+ c.body.should == "XML"
127
+ c = get("/cache_controller/action7.xml")
128
+ c.params[:format].should == "xml"
129
+ c.cached_page?(:action => "action7", :extension => 'xml').should be_true
130
+
131
+ c = get("/cache_controller/action7.jpg")
132
+ c.body.should == "JPG"
133
+ c = get("/cache_controller/action7.jpg")
134
+ c.params[:format].should == "jpg"
135
+ c.cached_page?(:action => "action7", :extension => 'jpg').should be_true
136
+
137
+ c = get("/cache_controller/action7.html")
138
+ c.body.should == "HTML"
139
+ c = get("/cache_controller/action7.html")
140
+ c.params[:format].should == "html"
141
+ c.cached_page?(:action => "action7").should be_true
142
+ end
143
+
144
+ it "should expire all pages" do
145
+ CACHE.expire_all_pages
146
+ CACHE.cached_page?("action6").should be_false
147
+ Dir.glob(Merb::Controller._cache.config[:cache_html_directory] + '/*').should be_empty
148
+ end
149
+
150
+ end
@@ -0,0 +1,15 @@
1
+ require File.dirname(__FILE__) + "/spec_helper"
2
+
3
+ Merb::Router.prepare do |r|
4
+ r.default_routes
5
+ r.match("/").to(:controller => "cache_controller", :action =>"index")
6
+ end
7
+
8
+ CACHE = CacheController.new(Merb::Test::RequestHelper::FakeRequest.new)
9
+ CACHE.expire_all
10
+
11
+ puts "Using #{CACHE._cache.store.cache_store_type.inspect} store"
12
+
13
+ require File.dirname(__FILE__) + "/merb-cache-fragment_spec"
14
+ require File.dirname(__FILE__) + "/merb-cache-action_spec"
15
+ require File.dirname(__FILE__) + "/merb-cache-page_spec"
@@ -0,0 +1,83 @@
1
+ $TESTING=true
2
+ $:.unshift File.join(File.dirname(__FILE__), '..', 'lib')
3
+ require "rubygems"
4
+ require "merb-core"
5
+
6
+ require "merb-cache"
7
+ require File.dirname(__FILE__) / "controller"
8
+
9
+ require "merb-haml"
10
+
11
+ def set_database_adapter(adapter)
12
+ config_file = File.dirname(__FILE__) / "config/database.yml"
13
+ config = IO.read(config_file)
14
+ config.gsub!(/:adapter:\s+.*$/, ":adapter: #{adapter}")
15
+ File.open(config_file, "w+") do |c| c.write(config) end
16
+ end
17
+
18
+ def use_cache_store(store, orm = nil)
19
+ Merb::Plugins.config[:merb_cache] = {
20
+ :store => store,
21
+ :cache_directory => File.dirname(__FILE__) / "tmp/cache",
22
+ :cache_html_directory => File.dirname(__FILE__) / "tmp/html",
23
+ }
24
+ FileUtils.rm_rf(Dir.glob(File.dirname(__FILE__) / "/tmp"))
25
+ case store
26
+ when "dummy"
27
+ when "file"
28
+ when "memory"
29
+ when "memcache"
30
+ require "memcache"
31
+ when "database"
32
+ case orm
33
+ when "datamapper"
34
+ Merb.environment = "test"
35
+ Merb.logger = Merb::Logger.new("log/merb_test.log")
36
+ set_database_adapter("sqlite3")
37
+ require "merb_datamapper"
38
+ when "activerecord"
39
+ Merb.logger = Merb::Logger.new("log/merb_test.log")
40
+ set_database_adapter("sqlite3")
41
+ require "merb_activerecord"
42
+ when "sequel"
43
+ set_database_adapter("sqlite")
44
+ require "merb_sequel"
45
+ else
46
+ raise "Unknown orm: #{orm}"
47
+ end
48
+ else
49
+ raise "Unknown cache store: #{store}"
50
+ end
51
+ end
52
+
53
+ store = "file"
54
+ case ENV["STORE"] || store
55
+ when "file"
56
+ use_cache_store "file"
57
+ when "memory"
58
+ use_cache_store "memory"
59
+ when "memcache"
60
+ use_cache_store "memcache"
61
+ when "datamapper"
62
+ use_cache_store "database", "datamapper"
63
+ when "sequel"
64
+ use_cache_store "database", "sequel"
65
+ when "activerecord"
66
+ use_cache_store "database", "activerecord"
67
+ when "dummy"
68
+ use_cache_store "dummy"
69
+ else
70
+ puts "Invalid cache store: #{ENV["store"]}"
71
+ exit
72
+ end
73
+
74
+ require "fileutils"
75
+ FileUtils.mkdir_p(Merb::Plugins.config[:merb_cache][:cache_html_directory])
76
+ FileUtils.mkdir_p(Merb::Plugins.config[:merb_cache][:cache_directory])
77
+
78
+ Merb.start :environment => "test", :adapter => "runner"
79
+
80
+ require "merb-core/test"
81
+ Spec::Runner.configure do |config|
82
+ config.include Merb::Test::RequestHelper
83
+ end
@@ -0,0 +1,4 @@
1
+ <%- cache('key1') do -%>
2
+ <%= Time.now %>
3
+ <%- end -%>
4
+
@@ -0,0 +1,4 @@
1
+ - cache('key11') do
2
+ = Time.now
3
+ - end
4
+
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: merb-cache
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.2
4
+ version: 0.9.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alex Boussinet
@@ -9,7 +9,7 @@ autorequire: merb-cache
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2008-03-24 00:00:00 -05:00
12
+ date: 2008-05-04 00:00:00 -05:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -19,7 +19,7 @@ dependencies:
19
19
  requirements:
20
20
  - - ">="
21
21
  - !ruby/object:Gem::Version
22
- version: 0.9.2
22
+ version: 0.9.3
23
23
  version:
24
24
  description: Merb plugin that provides caching (page, action, fragment, object)
25
25
  email: alex.boussinet@gmail.com
@@ -52,6 +52,18 @@ files:
52
52
  - lib/merb-cache/merb-cache.rb
53
53
  - lib/merb-cache/merbtasks.rb
54
54
  - lib/merb-cache.rb
55
+ - spec/config
56
+ - spec/config/database.yml
57
+ - spec/controller.rb
58
+ - spec/merb-cache-action_spec.rb
59
+ - spec/merb-cache-fragment_spec.rb
60
+ - spec/merb-cache-page_spec.rb
61
+ - spec/merb-cache_spec.rb
62
+ - spec/spec_helper.rb
63
+ - spec/views
64
+ - spec/views/cache_controller
65
+ - spec/views/cache_controller/action1.html.erb
66
+ - spec/views/cache_controller/action2.html.haml
55
67
  has_rdoc: true
56
68
  homepage: http://www.merbivore.com
57
69
  post_install_message: