Sha256: f534113e880c6ebd8870f082eb62126e03f4ec56759a0dc4ced149ea4dc217db

Contents?: true

Size: 1.4 KB

Versions: 170

Compression:

Stored size: 1.4 KB

Contents

require 'puppet/util'

module Puppet::Util::CacheAccumulator
  def self.included(klass)
    klass.extend ClassMethods
  end

  class Base
    attr_reader :klass, :attribute

    def initialize(klass, attribute)
      @klass = klass
      @attribute = attribute
      @find_or_create = "find_or_create_by_#{@attribute.to_s}".intern
    end

    def store
      @store || reset
    end

    def reset
      @store = {}
    end

    def find(*keys)
      result = nil
      if keys.length == 1
        result = store[keys[0]] ||= @klass.send(@find_or_create, *keys)
      else
        found, missing = keys.partition {|k| store.include? k}
        result = found.length
        result += do_multi_find(missing) if missing.length > 0
      end
      result
    end

    def do_multi_find(keys)
      result = 0
      @klass.find(:all, :conditions => {@attribute => keys}).each do |obj|
        store[obj.send(@attribute)] = obj
        result += 1
      end
      result
    end
  end

  module ClassMethods
    def accumulates(*attributes)
      attributes.each {|attrib| install_accumulator(attrib)}
    end

    def accumulators
      @accumulators ||= {}
    end

    def install_accumulator(attribute)
      self.accumulators[attribute] = Base.new(self, attribute)
      module_eval %{
        def self.accumulate_by_#{attribute.to_s}(*keys)
          accumulators[:#{attribute.to_s}].find(*keys)
        end
      }
    end
  end
end

Version data entries

170 entries across 170 versions & 5 rubygems

Version Path
puppet-retrospec-0.12.2 vendor/gems/puppet-3.7.3/lib/puppet/util/rails/cache_accumulator.rb
puppet-3.8.7 lib/puppet/util/rails/cache_accumulator.rb
puppet-3.8.7-x86-mingw32 lib/puppet/util/rails/cache_accumulator.rb
puppet-3.8.7-x64-mingw32 lib/puppet/util/rails/cache_accumulator.rb
puppet-3.8.6 lib/puppet/util/rails/cache_accumulator.rb
puppet-3.8.6-x86-mingw32 lib/puppet/util/rails/cache_accumulator.rb
puppet-retrospec-0.12.1 vendor/gems/puppet-3.7.3/lib/puppet/util/rails/cache_accumulator.rb
puppet-3.8.6-x64-mingw32 lib/puppet/util/rails/cache_accumulator.rb
puppet-retrospec-0.12.0 vendor/gems/puppet-3.7.3/lib/puppet/util/rails/cache_accumulator.rb
puppet-3.8.5 lib/puppet/util/rails/cache_accumulator.rb
puppet-3.8.5-x86-mingw32 lib/puppet/util/rails/cache_accumulator.rb
puppet-3.8.5-x64-mingw32 lib/puppet/util/rails/cache_accumulator.rb
puppet-3.8.4 lib/puppet/util/rails/cache_accumulator.rb
puppet-3.8.4-x86-mingw32 lib/puppet/util/rails/cache_accumulator.rb
puppet-3.8.4-x64-mingw32 lib/puppet/util/rails/cache_accumulator.rb
puppet-retrospec-0.11.0 vendor/gems/puppet-3.7.3/lib/puppet/util/rails/cache_accumulator.rb
puppet-retrospec-0.10.0 vendor/gems/puppet-3.7.3/lib/puppet/util/rails/cache_accumulator.rb
puppet-retrospec-0.9.1 vendor/gems/puppet-3.7.3/lib/puppet/util/rails/cache_accumulator.rb
puppet-retrospec-0.9.0 vendor/gems/puppet-3.7.3/lib/puppet/util/rails/cache_accumulator.rb
puppet-retrospec-0.8.1 vendor/gems/puppet-3.7.3/lib/puppet/util/rails/cache_accumulator.rb