diff --git a/README.md b/README.md index 3f177212..4ae77878 100644 --- a/README.md +++ b/README.md @@ -443,6 +443,28 @@ To do this, pass a lambda as the value for the custom fact. The lambda is passed add_custom_fact :root_home, lambda { |os,facts| "/tmp/#{facts['hostname']}" } ``` +#### Merge into existing facts + +You can also supply an optional input `:merge_facts` to the `add_custom_fact` method. + +This allows you to merge facts values into a fact, if the fact is already present in the facts hash as oppose to overwriting the fact value. + +```ruby +add_custom_fact :identity, { 'user' => 'test_user' }, :merge_facts => true +``` + +Will result in a hash of the identity fact like the below: + +```ruby +{ + "gid"=>0, + "group"=>"root", + "privileged"=>true, + "uid"=>0, + "user"=>"test_user" +} +``` + ### Supplying Custom External Facts through FacterDB Rspec-puppet-facts uses a gem called facterdb that contains many fact sets of various combinations that are pre generated. Rspec-puppet-facts queries facterdb to pull out a specific fact set to use when testing. diff --git a/lib/rspec-puppet-facts.rb b/lib/rspec-puppet-facts.rb index 87d3e3f6..defb353a 100644 --- a/lib/rspec-puppet-facts.rb +++ b/lib/rspec-puppet-facts.rb @@ -229,7 +229,13 @@ def self.with_custom_facts(os, facts) next if fact[:options][:confine] && !fact[:options][:confine].include?(os) next if fact[:options][:exclude] && fact[:options][:exclude].include?(os) - facts[name] = fact[:value].respond_to?(:call) ? fact[:value].call(os, facts) : fact[:value] + value = fact[:value].respond_to?(:call) ? fact[:value].call(os, facts) : fact[:value] + # if merge_facts passed, merge supplied facts into facts hash + if fact[:options][:merge_facts] + facts.deep_merge!({name => value}) + else + facts[name] = value + end end facts