Module: Arturo::FeatureCaching

Defined in:
lib/arturo/feature_caching.rb

Overview

To be extended by Arturo::Feature if you want to enable in-memory caching. NB: Arturo’s feature caching only works when using Arturo::Feature.to_feature or when using the helper methods in Arturo and Arturo::FeatureAvailability. NB: if you have multiple application servers, you almost certainly want to clear this cache after each request:

class ApplicationController < ActionController::Base
  after_filter { Arturo::Feature.clear_feature_cache }
end

Alternatively, you could redefine Arturo::Feature.feature_cache to use a shared cache like Memcached.

Defined Under Namespace

Classes: Cache

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.extended(base) ⇒ Object



21
22
23
24
25
26
27
28
# File 'lib/arturo/feature_caching.rb', line 21

def self.extended(base)
  class <<base
    alias_method_chain :to_feature, :caching
    attr_accessor :cache_ttl, :feature_cache
  end
  base.cache_ttl = 0
  base.feature_cache = Arturo::FeatureCaching::Cache.new
end

Instance Method Details

#caches_features?Boolean

Returns:

  • (Boolean)


30
31
32
# File 'lib/arturo/feature_caching.rb', line 30

def caches_features?
  self.cache_ttl.to_i > 0
end

#to_feature_with_caching(feature_or_symbol) ⇒ Object

Wraps Arturo::Feature.to_feature with in-memory caching.



35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
# File 'lib/arturo/feature_caching.rb', line 35

def to_feature_with_caching(feature_or_symbol)
  if !caches_features?
    to_feature_without_caching(feature_or_symbol)
  elsif (feature_or_symbol.kind_of?(Arturo::Feature))
    feature_cache.write(feature_or_symbol.symbol.to_sym, feature_or_symbol, :expires_in => cache_ttl)
    feature_or_symbol
  elsif (cached_feature = feature_cache.read(feature_or_symbol.to_sym))
    cached_feature
  else
    symbol = feature_or_symbol.to_sym
    feature = to_feature_without_caching(symbol)
    feature_cache.write(symbol, feature, :expires_in => cache_ttl)
    feature
  end
end

#warm_cache!Object

Warms the cache by fetching all ‘Feature`s and caching them. This is perfect for use in an initializer.



53
54
55
56
57
58
59
# File 'lib/arturo/feature_caching.rb', line 53

def warm_cache!
  raise "Cannot warm Feature Cache; caching is disabled" unless caches_features?

  all.each do |feature|
    feature_cache.write(feature.symbol.to_sym, feature, :expires_in => cache_ttl)
  end
end