| Module | Puppet::Util::CollectionMerger |
| In: |
lib/puppet/util/rails/collection_merger.rb
|
# 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.
# 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