aboutsummaryrefslogtreecommitdiffstats
path: root/activesupport
diff options
context:
space:
mode:
Diffstat (limited to 'activesupport')
-rw-r--r--activesupport/lib/active_support/cache.rb12
-rw-r--r--activesupport/lib/active_support/cache/file_store.rb14
-rw-r--r--activesupport/lib/active_support/cache/mem_cache_store.rb4
-rw-r--r--activesupport/lib/active_support/core_ext/module.rb1
-rw-r--r--activesupport/lib/active_support/core_ext/module/model_naming.rb25
-rw-r--r--activesupport/lib/active_support/json/decoding.rb1
-rw-r--r--activesupport/lib/active_support/json/encoding.rb5
-rw-r--r--activesupport/test/caching_test.rb16
-rw-r--r--activesupport/test/core_ext/module/model_naming_test.rb28
9 files changed, 45 insertions, 61 deletions
diff --git a/activesupport/lib/active_support/cache.rb b/activesupport/lib/active_support/cache.rb
index feb6b1f2cf..192a82e74f 100644
--- a/activesupport/lib/active_support/cache.rb
+++ b/activesupport/lib/active_support/cache.rb
@@ -129,8 +129,8 @@ module ActiveSupport
#
# For example, MemCacheStore's #write method supports the +:expires_in+
# option, which tells the memcached server to automatically expire the
- # cache item after a certain period. We can use this option with #fetch
- # too:
+ # cache item after a certain period. This options is also supported by
+ # FileStore's #read method. We can use this option with #fetch too:
#
# cache = ActiveSupport::Cache::MemCacheStore.new
# cache.fetch("foo", :force => true, :expires_in => 5.seconds) do
@@ -169,6 +169,10 @@ module ActiveSupport
# You may also specify additional options via the +options+ argument.
# The specific cache store implementation will decide what to do with
# +options+.
+ #
+ # For example, FileStore supports the +:expires_in+ option, which
+ # makes the method return nil for cache items older than the specified
+ # period.
def read(key, options = nil)
log("read", key, options)
end
@@ -223,6 +227,10 @@ module ActiveSupport
end
private
+ def expires_in(options)
+ (options && options[:expires_in]) || 0
+ end
+
def log(operation, key, options)
logger.debug("Cache #{operation}: #{key}#{options ? " (#{options.inspect})" : ""}") if logger && !@silence && !@logger_off
end
diff --git a/activesupport/lib/active_support/cache/file_store.rb b/activesupport/lib/active_support/cache/file_store.rb
index 3217350d58..75eed5ed94 100644
--- a/activesupport/lib/active_support/cache/file_store.rb
+++ b/activesupport/lib/active_support/cache/file_store.rb
@@ -10,11 +10,23 @@ module ActiveSupport
@cache_path = cache_path
end
+ # Reads a value from the cache.
+ #
+ # Possible options:
+ # - +:expires_in+ - the number of seconds that this value may stay in
+ # the cache.
def read(name, options = nil)
super
- File.open(real_file_path(name), 'rb') { |f| Marshal.load(f) } rescue nil
+
+ file_name = real_file_path(name)
+ expires = expires_in(options)
+
+ if File.exist?(file_name) && (expires <= 0 || Time.now - File.mtime(file_name) < expires)
+ File.open(file_name, 'rb') { |f| Marshal.load(f) }
+ end
end
+ # Writes a value to the cache.
def write(name, value, options = nil)
super
ensure_cache_path(File.dirname(real_file_path(name)))
diff --git a/activesupport/lib/active_support/cache/mem_cache_store.rb b/activesupport/lib/active_support/cache/mem_cache_store.rb
index 38b3409ca6..954d0f5423 100644
--- a/activesupport/lib/active_support/cache/mem_cache_store.rb
+++ b/activesupport/lib/active_support/cache/mem_cache_store.rb
@@ -130,10 +130,6 @@ module ActiveSupport
end
private
- def expires_in(options)
- (options && options[:expires_in]) || 0
- end
-
def raw?(options)
options && options[:raw]
end
diff --git a/activesupport/lib/active_support/core_ext/module.rb b/activesupport/lib/active_support/core_ext/module.rb
index 215c47b114..fbe89fe07c 100644
--- a/activesupport/lib/active_support/core_ext/module.rb
+++ b/activesupport/lib/active_support/core_ext/module.rb
@@ -7,5 +7,4 @@ require 'active_support/core_ext/module/attr_internal'
require 'active_support/core_ext/module/attr_accessor_with_default'
require 'active_support/core_ext/module/delegation'
require 'active_support/core_ext/module/loading'
-require 'active_support/core_ext/module/model_naming'
require 'active_support/core_ext/module/synchronization'
diff --git a/activesupport/lib/active_support/core_ext/module/model_naming.rb b/activesupport/lib/active_support/core_ext/module/model_naming.rb
deleted file mode 100644
index 13420bab07..0000000000
--- a/activesupport/lib/active_support/core_ext/module/model_naming.rb
+++ /dev/null
@@ -1,25 +0,0 @@
-require 'active_support/inflector'
-
-module ActiveSupport
- class ModelName < String
- attr_reader :singular, :plural, :element, :collection, :partial_path
- alias_method :cache_key, :collection
-
- def initialize(name)
- super
- @singular = ActiveSupport::Inflector.underscore(self).tr('/', '_').freeze
- @plural = ActiveSupport::Inflector.pluralize(@singular).freeze
- @element = ActiveSupport::Inflector.underscore(ActiveSupport::Inflector.demodulize(self)).freeze
- @collection = ActiveSupport::Inflector.tableize(self).freeze
- @partial_path = "#{@collection}/#{@element}".freeze
- end
- end
-end
-
-class Module
- # Returns an ActiveSupport::ModelName object for module. It can be
- # used to retrieve all kinds of naming-related information.
- def model_name
- @model_name ||= ActiveSupport::ModelName.new(name)
- end
-end
diff --git a/activesupport/lib/active_support/json/decoding.rb b/activesupport/lib/active_support/json/decoding.rb
index b4e4177724..356b6cebeb 100644
--- a/activesupport/lib/active_support/json/decoding.rb
+++ b/activesupport/lib/active_support/json/decoding.rb
@@ -1,4 +1,5 @@
require 'active_support/core_ext/module/attribute_accessors'
+require 'active_support/core_ext/module/delegation'
module ActiveSupport
# Look for and parse json strings that look like ISO 8601 times.
diff --git a/activesupport/lib/active_support/json/encoding.rb b/activesupport/lib/active_support/json/encoding.rb
index 907094a747..068b58b997 100644
--- a/activesupport/lib/active_support/json/encoding.rb
+++ b/activesupport/lib/active_support/json/encoding.rb
@@ -4,6 +4,11 @@ require 'active_support/core_ext/module/delegation'
require 'active_support/core_ext/object/instance_variables'
require 'active_support/deprecation'
+require 'active_support/core_ext/date_time/conversions'
+require 'active_support/core_ext/time/conversions'
+require 'active_support/time_with_zone'
+require 'active_support/values/time_zone'
+
# Hack to load json gem first so we can overwrite its to_json.
begin
require 'json'
diff --git a/activesupport/test/caching_test.rb b/activesupport/test/caching_test.rb
index 51d04d9388..c2a03818e1 100644
--- a/activesupport/test/caching_test.rb
+++ b/activesupport/test/caching_test.rb
@@ -146,6 +146,22 @@ class FileStoreTest < ActiveSupport::TestCase
end
include CacheStoreBehavior
+
+ def test_expires_in
+ time = Time.local(2008, 4, 24)
+ Time.stubs(:now).returns(time)
+ File.stubs(:mtime).returns(time)
+
+ @cache.write('foo', 'bar')
+ cache_read = lambda { @cache.read('foo', :expires_in => 1.minute) }
+ assert_equal 'bar', cache_read.call
+
+ Time.stubs(:now).returns(time + 30.seconds)
+ assert_equal 'bar', cache_read.call
+
+ Time.stubs(:now).returns(time + 2.minutes)
+ assert_nil cache_read.call
+ end
end
class MemoryStoreTest < ActiveSupport::TestCase
diff --git a/activesupport/test/core_ext/module/model_naming_test.rb b/activesupport/test/core_ext/module/model_naming_test.rb
deleted file mode 100644
index 37119f378a..0000000000
--- a/activesupport/test/core_ext/module/model_naming_test.rb
+++ /dev/null
@@ -1,28 +0,0 @@
-require 'abstract_unit'
-require 'active_support/core_ext/module/model_naming'
-
-class ModelNamingTest < Test::Unit::TestCase
- def setup
- @model_name = ActiveSupport::ModelName.new('Post::TrackBack')
- end
-
- def test_singular
- assert_equal 'post_track_back', @model_name.singular
- end
-
- def test_plural
- assert_equal 'post_track_backs', @model_name.plural
- end
-
- def test_element
- assert_equal 'track_back', @model_name.element
- end
-
- def test_collection
- assert_equal 'post/track_backs', @model_name.collection
- end
-
- def test_partial_path
- assert_equal 'post/track_backs/track_back', @model_name.partial_path
- end
-end