Skip to content

Commit 5c92f4f

Browse files
authored
Merge pull request #152 from ekohl/reuse-found-facts
Collect facts iteratively
2 parents 1c8a717 + 58fa0a4 commit 5c92f4f

File tree

2 files changed

+11
-15
lines changed

2 files changed

+11
-15
lines changed

lib/rspec-puppet-facts.rb

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -116,18 +116,18 @@ def on_supported_os_implementation(opts = {})
116116
strict_requirement = RspecPuppetFacts::facter_version_to_strict_requirement(facterversion)
117117

118118
loose_requirement = RspecPuppetFacts::facter_version_to_loose_requirement(facterversion)
119+
received_facts = []
119120

120121
# FacterDB may have newer versions of facter data for which it contains a subset of all possible
121122
# facter data (see FacterDB 0.5.2 for Facter releases 3.8 and 3.9). In this situation we need to
122123
# cycle through and downgrade Facter versions per platform type until we find matching Facter data.
123124
filter.each do |filter_spec|
124-
versions = FacterDB.get_facts(filter_spec).map { |facts| Gem::Version.new(facts[:facterversion]) }.sort.reverse
125-
next unless versions.any?
125+
versions = FacterDB.get_facts(filter_spec).to_h { |facts| [Gem::Version.new(facts[:facterversion]), facts] }
126126

127-
version = versions.detect { |v| strict_requirement =~ v }
127+
version, facts = versions.select { |v, _f| strict_requirement =~ v }.max_by { |v, _f| v }
128128

129129
unless version
130-
version = versions.detect { |v| loose_requirement =~ v } if loose_requirement
130+
version, facts = versions.select { |v, _f| loose_requirement =~ v }.max_by { |v, _f| v } if loose_requirement
131131
next unless version
132132

133133
if RspecPuppetFacts.spec_facts_strict?
@@ -137,10 +137,9 @@ def on_supported_os_implementation(opts = {})
137137
RspecPuppetFacts.warning "No facts were found in the FacterDB for Facter v#{facterversion} on #{filter_spec}, using v#{version} instead"
138138
end
139139

140-
filter_spec[:facterversion] = "/\\A#{Regexp.escape(version.to_s)}\\Z/"
140+
received_facts << facts
141141
end
142142

143-
received_facts = FacterDB::get_facts(filter)
144143
unless received_facts.any?
145144
RspecPuppetFacts.warning "No facts were found in the FacterDB for: #{filter.inspect}"
146145
return {}

spec/rspec_puppet_facts_spec.rb

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -662,19 +662,16 @@
662662

663663
before do
664664
allow(described_class).to receive(:warning).with(a_string_matching(/no facts were found/i))
665-
allow(FacterDB).to receive(:get_facts).and_call_original
666665
end
667666

668667
it 'escapes the parens in the filter' do
669-
filter = [
670-
include(
671-
:operatingsystem => "IOS",
672-
:operatingsystemrelease => "/^12\\.2\\(25\\)EWA9/",
673-
:hardwaremodel => "x86_64",
674-
),
675-
]
668+
filter = {
669+
:operatingsystem => "IOS",
670+
:operatingsystemrelease => "/^12\\.2\\(25\\)EWA9/",
671+
:hardwaremodel => "x86_64",
672+
}
676673

677-
expect(FacterDB).to receive(:get_facts).with(filter)
674+
expect(FacterDB).to receive(:get_facts).with(filter).once
678675
subject
679676
end
680677

0 commit comments

Comments
 (0)