Sha256: f27eed09984aea056cd28e48ca684ceea7a8715632718a5fa527e526f2d2327d

Contents?: true

Size: 1.11 KB

Versions: 3

Compression:

Stored size: 1.11 KB

Contents

require 'digest'

module Patterns
  class Calculation
    class_attribute :cache_expiry_every

    def initialize(*args)
      @options = args.extract_options!
      @subject = args.first
    end

    def self.result(*args, &block)
      new(*args).cached_result(&block)
    end

    class << self
      alias_method :result_for, :result
      alias_method :calculate, :result
    end

    def self.set_cache_expiry_every(period)
      self.cache_expiry_every = period
    end

    def cached_result(&block)
      if cache_expiry_period.blank?
        result(&block)
      else
        Rails.cache.fetch(cache_key, expires_in: cache_expiry_period) do
          result(&block)
        end
      end
    end

    private

    attr_reader :subject, :options

    def result
      raise NotImplementedError
    end

    def cache_key
      "#{self.class.name}_#{hash_of(subject, options)}"
    end

    def self.hash_of(*args)
      Digest::SHA1.hexdigest(args.map(&:to_s).join(':'))
    end

    def hash_of(*args)
      self.class.hash_of(*args)
    end

    def cache_expiry_period
      self.class.cache_expiry_every
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
rails-patterns-0.11.0 lib/patterns/calculation.rb
rails-patterns-0.10.0 lib/patterns/calculation.rb
rails-patterns-0.9.0 lib/patterns/calculation.rb