Module Puppet::Util::CollectionMerger
In: lib/puppet/util/rails/collection_merger.rb

Methods

Public Instance methods

[Source]

    # File lib/puppet/util/rails/collection_merger.rb, line 41
41:     def ar_hash_merge(db_hash, mem_hash, args)
42:         (db_hash.keys | mem_hash.keys).each do |key|
43:             if (db_hash[key] && mem_hash[key])
44:                 # in both, update value
45:                 args[:modify].call(db_hash[key], mem_hash[key])
46:             elsif (db_hash[key])
47:                 # in db, not memory, delete from database
48:                 args[:delete].call(db_hash[key])
49:             else
50:                 # in mem, not in db, insert into the database
51:                 args[:create].call(key, mem_hash[key])
52:             end
53:         end
54:     end

Merge new values with the old list. This is only necessary because deletion seems to mess things up on unsaved objects.

[Source]

    # File lib/puppet/util/rails/collection_merger.rb, line 4
 4:     def collection_merge(collection, args)
 5:         remove = []
 6:         list = args[:existing] || send(collection)
 7:         hash = args[:updates]
 8:         list.each do |object|
 9:             name = object.name
10:             if existing = hash[name]
11:                 hash.delete(name)
12:                 if existing.respond_to?(:to_rails)
13:                     existing.to_rails(self, object)
14:                 elsif args.include?(:modify)
15:                     args[:modify].call(object, name, existing)
16:                 else
17:                     raise ArgumentError, "Must pass :modify or the new objects must respond to :to_rails"
18:                 end
19:             else
20:                 remove << object
21:             end
22:         end
23: 
24:         # Make a new rails object for the rest of them
25:         hash.each do |name, object|
26:             if object.respond_to?(:to_rails)
27:                 object.to_rails(self)
28:             elsif args.include?(:create)
29:                 args[:create].call(name, object)
30:             else
31:                 raise ArgumentError, "Must pass :create or the new objects must respond to :to_rails"
32:             end
33:         end
34: 
35:         # Now remove anything necessary.
36:         remove.each do |object|
37:             send(collection).delete(object)
38:         end
39:     end

[Validate]