Sha256: a37703ce90b8658d16ade57f6a38d3a96c959b70ac8b9d9b767003a396efc05e

Contents?: true

Size: 1.87 KB

Versions: 5

Compression:

Stored size: 1.87 KB

Contents

require "infopark_component_cache/volatile_cache"
require "infopark_component_cache/key_generator"

module InfoparkComponentCache
  # @author Tomasz Przedmojski <tomasz.przedmojski@infopark.de>
  #
  # This module provides an easy way to create delayed guards
  # by using meta programming.
  #
  # @example Delaying an ObjectCount which guards on :object_count
  #   class DelayedObjectCount < ObjectCount
  #     include DelayedGuard
  #     delay :object_count, for: 10.minutes
  #   end
  #
  # @note Including classes must implement options method which
  #   completely described the object state and returns a hash.
  module DelayedGuard
    def self.included(base)
      base.send(:extend, ClassMethods)
    end

    protected
    include VolatileCache

    def delayed_value(method_name)
      volatile_cache.read(delayed_value_key(method_name))
    end

    def still_delayed?(method_name)
      volatile_cache.exist?(delayed_value_key(method_name))
    end
    
    def delay_value(method_name, value, expiration)
      volatile_cache.write(delayed_value_key(method_name), value, expires_in: expiration)
      value
    end

    def delayed_value_key(method_name)
      KeyGenerator.generate_key(self.options.merge({
        delayed_method_name: method_name,
        delayed_class_name: self.class.name
      }))
    end

    module ClassMethods
      def delay(method_name, options)
        expiration = options[:for]
        return unless expiration

        # allow to overwrite the delays
        alias_method :"delayed_#{method_name}", method_name unless method_defined?(:"delayed_#{method_name}")
        define_method method_name do
          value = delayed_value(method_name)
          if still_delayed?(method_name)
            value
          else
            delay_value(method_name, self.send(:"delayed_#{method_name}"), expiration)
          end
        end
      end
    end

  end
end

Version data entries

5 entries across 5 versions & 1 rubygems

Version Path
infopark_component_cache-3.2.0 lib/infopark_component_cache/delayed_guard.rb
infopark_component_cache-3.1.1 lib/infopark_component_cache/delayed_guard.rb
infopark_component_cache-3.1.0 lib/infopark_component_cache/delayed_guard.rb
infopark_component_cache-3.0.0 lib/infopark_component_cache/delayed_guard.rb
infopark_component_cache-2.0.0 lib/infopark_component_cache/delayed_guard.rb