From a97aa636df41fcdebd18df8aa10614114b8210da Mon Sep 17 00:00:00 2001 From: "James A. Rosen" Date: Sun, 3 Mar 2013 14:10:55 -0800 Subject: [PATCH] [Fix #30] FeatureCaching: cache nils as :NO_SUCH_FEATURE to avoid re-reads --- lib/arturo/feature_caching.rb | 14 ++++++++++---- test/dummy_app/test/unit/cache_test.rb | 7 +++++++ 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/lib/arturo/feature_caching.rb b/lib/arturo/feature_caching.rb index d4d88d7..14643ea 100644 --- a/lib/arturo/feature_caching.rb +++ b/lib/arturo/feature_caching.rb @@ -16,6 +16,10 @@ module Arturo # to use a shared cache like Memcached. module FeatureCaching + # A marker in the cache to record the fact that the feature with the + # given symbol doesn't exist. + NO_SUCH_FEATURE = :NO_SUCH_FEATURE + def self.extended(base) class < cache_ttl) feature_or_symbol elsif (cached_feature = feature_cache.read(feature_or_symbol.to_sym)) - cached_feature - elsif (f = to_feature_without_caching(feature_or_symbol)) - feature_cache.write(f.symbol.to_sym, f, :expires_in => cache_ttl) - f + cached_feature == NO_SUCH_FEATURE ? nil : cached_feature + else + symbol = feature_or_symbol.to_sym + feature = to_feature_without_caching(symbol) || NO_SUCH_FEATURE + feature_cache.write(symbol, feature, :expires_in => cache_ttl) + feature end end diff --git a/test/dummy_app/test/unit/cache_test.rb b/test/dummy_app/test/unit/cache_test.rb index 2d5bb41..5a3ca94 100644 --- a/test/dummy_app/test/unit/cache_test.rb +++ b/test/dummy_app/test/unit/cache_test.rb @@ -42,6 +42,13 @@ def test_subsequent_loads_within_ttl_hit_cache Arturo::Feature.to_feature(@feature.symbol) end + def test_nils_are_cached + Arturo::Feature.expects(:where).once.returns([]) + Arturo::Feature.to_feature(:ramen) + Arturo::Feature.to_feature(:ramen) + Arturo::Feature.to_feature(:ramen) + end + def test_works_with_other_cache_backend Arturo::Feature.feature_cache = StupidCache.new Arturo::Feature.expects(:where).once.returns([@feature.reload])