aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--actionpack/lib/action_controller/caching/fragments.rb13
-rw-r--r--actionpack/test/controller/caching_test.rb42
-rw-r--r--activesupport/lib/active_support/cache.rb8
-rw-r--r--activesupport/lib/active_support/cache/file_store.rb7
-rw-r--r--activesupport/lib/active_support/cache/mem_cache_store.rb8
-rw-r--r--activesupport/lib/active_support/cache/memory_store.rb7
6 files changed, 59 insertions, 26 deletions
diff --git a/actionpack/lib/action_controller/caching/fragments.rb b/actionpack/lib/action_controller/caching/fragments.rb
index e4d8678a07..e4f5de44ab 100644
--- a/actionpack/lib/action_controller/caching/fragments.rb
+++ b/actionpack/lib/action_controller/caching/fragments.rb
@@ -98,6 +98,17 @@ module ActionController #:nodoc:
end
end
+ # Check if a cached fragment from the location signified by <tt>key</tt> exists (see <tt>expire_fragment</tt> for acceptable formats)
+ def fragment_exist?(key, options = nil)
+ return unless cache_configured?
+
+ key = fragment_cache_key(key)
+
+ self.class.benchmark "Cached fragment exists?: #{key}" do
+ cache_store.exist?(key, options)
+ end
+ end
+
# Name can take one of three forms:
# * String: This would normally take the form of a path like "pages/45/notes"
# * Hash: Is treated as an implicit call to url_for, like { :controller => "pages", :action => "notes", :id => 45 }
@@ -124,4 +135,4 @@ module ActionController #:nodoc:
end
end
end
-end \ No newline at end of file
+end
diff --git a/actionpack/test/controller/caching_test.rb b/actionpack/test/controller/caching_test.rb
index 4aacb4a78a..f9b6b87bc6 100644
--- a/actionpack/test/controller/caching_test.rb
+++ b/actionpack/test/controller/caching_test.rb
@@ -232,7 +232,7 @@ class ActionCacheTest < Test::Unit::TestCase
get :index
cached_time = content_to_cache
assert_equal cached_time, @response.body
- assert_cache_exists 'hostname.com/action_caching_test'
+ assert fragment_exist?('hostname.com/action_caching_test')
reset!
get :index
@@ -243,7 +243,7 @@ class ActionCacheTest < Test::Unit::TestCase
get :destroy
cached_time = content_to_cache
assert_equal cached_time, @response.body
- assert_cache_does_not_exist 'hostname.com/action_caching_test/destroy'
+ assert !fragment_exist?('hostname.com/action_caching_test/destroy')
reset!
get :destroy
@@ -254,7 +254,7 @@ class ActionCacheTest < Test::Unit::TestCase
get :with_layout
cached_time = content_to_cache
assert_not_equal cached_time, @response.body
- assert_cache_exists 'hostname.com/action_caching_test/with_layout'
+ assert fragment_exist?('hostname.com/action_caching_test/with_layout')
reset!
get :with_layout
@@ -266,14 +266,14 @@ class ActionCacheTest < Test::Unit::TestCase
def test_action_cache_conditional_options
@request.env['HTTP_ACCEPT'] = 'application/json'
get :index
- assert_cache_does_not_exist 'hostname.com/action_caching_test'
+ assert !fragment_exist?('hostname.com/action_caching_test')
end
def test_action_cache_with_custom_cache_path
get :show
cached_time = content_to_cache
assert_equal cached_time, @response.body
- assert_cache_exists 'test.host/custom/show'
+ assert fragment_exist?('test.host/custom/show')
reset!
get :show
@@ -282,11 +282,11 @@ class ActionCacheTest < Test::Unit::TestCase
def test_action_cache_with_custom_cache_path_in_block
get :edit
- assert_cache_exists 'test.host/edit'
+ assert fragment_exist?('test.host/edit')
reset!
get :edit, :id => 1
- assert_cache_exists 'test.host/1;edit'
+ assert fragment_exist?('test.host/1;edit')
end
def test_cache_expiration
@@ -395,18 +395,8 @@ class ActionCacheTest < Test::Unit::TestCase
@request.host = 'hostname.com'
end
- def assert_cache_exists(path)
- full_path = cache_path(path)
- assert File.exist?(full_path), "#{full_path.inspect} does not exist."
- end
-
- def assert_cache_does_not_exist(path)
- full_path = cache_path(path)
- assert !File.exist?(full_path), "#{full_path.inspect} should not exist."
- end
-
- def cache_path(path)
- File.join(FILE_STORE_PATH, 'views', path + '.cache')
+ def fragment_exist?(path)
+ @controller.fragment_exist?(path)
end
def read_fragment(path)
@@ -450,6 +440,19 @@ class FragmentCachingTest < Test::Unit::TestCase
assert_nil @controller.read_fragment('name')
end
+ def test_fragment_exist__with_caching_enabled
+ @store.write('views/name', 'value')
+ assert @controller.fragment_exist?('name')
+ assert !@controller.fragment_exist?('other_name')
+ end
+
+ def test_fragment_exist__with_caching_disabled
+ ActionController::Base.perform_caching = false
+ @store.write('views/name', 'value')
+ assert !@controller.fragment_exist?('name')
+ assert !@controller.fragment_exist?('other_name')
+ end
+
def test_write_fragment__with_caching_enabled
assert_nil @store.read('views/name')
assert_equal 'value', @controller.write_fragment('name', 'value')
@@ -494,7 +497,6 @@ class FragmentCachingTest < Test::Unit::TestCase
assert_equal 'generated till now -> ', buffer
end
-
def test_fragment_for
@store.write('views/expensive', 'fragment content')
fragment_computed = false
diff --git a/activesupport/lib/active_support/cache.rb b/activesupport/lib/active_support/cache.rb
index b3c9c23d9f..2f1143e610 100644
--- a/activesupport/lib/active_support/cache.rb
+++ b/activesupport/lib/active_support/cache.rb
@@ -87,8 +87,12 @@ module ActiveSupport
def delete_matched(matcher, options = nil)
log("delete matched", matcher.inspect, options)
- end
-
+ end
+
+ def exist?(key, options = nil)
+ log("exist?", key, options)
+ end
+
def increment(key, amount = 1)
log("incrementing", key, amount)
if num = read(key)
diff --git a/activesupport/lib/active_support/cache/file_store.rb b/activesupport/lib/active_support/cache/file_store.rb
index 16a2509ce2..5b771b1da0 100644
--- a/activesupport/lib/active_support/cache/file_store.rb
+++ b/activesupport/lib/active_support/cache/file_store.rb
@@ -40,13 +40,18 @@ module ActiveSupport
end
end
+ def exist?(name, options = nil)
+ super
+ File.exist?(real_file_path(name))
+ end
+
private
def real_file_path(name)
'%s/%s.cache' % [@cache_path, name.gsub('?', '.').gsub(':', '.')]
end
def ensure_cache_path(path)
- FileUtils.makedirs(path) unless File.exists?(path)
+ FileUtils.makedirs(path) unless File.exist?(path)
end
def search_dir(dir, &callback)
diff --git a/activesupport/lib/active_support/cache/mem_cache_store.rb b/activesupport/lib/active_support/cache/mem_cache_store.rb
index bfe7e2ccf3..b3769b812f 100644
--- a/activesupport/lib/active_support/cache/mem_cache_store.rb
+++ b/activesupport/lib/active_support/cache/mem_cache_store.rb
@@ -48,7 +48,13 @@ module ActiveSupport
rescue MemCache::MemCacheError => e
logger.error("MemCacheError (#{e}): #{e.message}")
false
- end
+ end
+
+ def exist?(key, options = nil)
+ # Doesn't call super, cause exist? in memcache is in fact a read
+ # But who cares? Reading is very fast anyway
+ !read(key, options).nil?
+ end
def increment(key, amount = 1)
log("incrementing", key, amount)
diff --git a/activesupport/lib/active_support/cache/memory_store.rb b/activesupport/lib/active_support/cache/memory_store.rb
index 4872e025cd..6f114273e4 100644
--- a/activesupport/lib/active_support/cache/memory_store.rb
+++ b/activesupport/lib/active_support/cache/memory_store.rb
@@ -24,7 +24,12 @@ module ActiveSupport
super
@data.delete_if { |k,v| k =~ matcher }
end
-
+
+ def exist?(name,options = nil)
+ super
+ @data.has_key?(name)
+ end
+
def clear
@data.clear
end