Skip to content

Commit ae76698

Browse files
committed
Use a single FacterDB.get_facts call
The major cost is FacterDB.get_facts. Instead of calling it once for every OS version this instead calls it once with a complex filter. It then uses JGrep to simulate another smaller DB and futher query that. In my non-scientific test this reduces the load time of puppet-example from 3.5 to 2.5 seconds.
1 parent 5c92f4f commit ae76698

File tree

1 file changed

+11
-1
lines changed

1 file changed

+11
-1
lines changed

lib/rspec-puppet-facts.rb

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,11 +118,21 @@ def on_supported_os_implementation(opts = {})
118118
loose_requirement = RspecPuppetFacts::facter_version_to_loose_requirement(facterversion)
119119
received_facts = []
120120

121+
db = FacterDB.get_facts(filter)
122+
unless db.any?
123+
RspecPuppetFacts.warning "No facts were found in the FacterDB for: #{filter.inspect}"
124+
return {}
125+
end
126+
121127
# FacterDB may have newer versions of facter data for which it contains a subset of all possible
122128
# facter data (see FacterDB 0.5.2 for Facter releases 3.8 and 3.9). In this situation we need to
123129
# cycle through and downgrade Facter versions per platform type until we find matching Facter data.
124130
filter.each do |filter_spec|
125-
versions = FacterDB.get_facts(filter_spec).to_h { |facts| [Gem::Version.new(facts[:facterversion]), facts] }
131+
versions = JGrep.jgrep(db.to_json, FacterDB.generate_filter_str(filter_spec)) \
132+
.to_h do |facts|
133+
result = facts.to_h { |k, v| [k.to_sym, v] }
134+
[Gem::Version.new(result[:facterversion]), result]
135+
end
126136

127137
version, facts = versions.select { |v, _f| strict_requirement =~ v }.max_by { |v, _f| v }
128138

0 commit comments

Comments
 (0)