rspec-puppet-facts 2.0.4 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.github/dependabot.yml +10 -1
- data/.github/workflows/release.yml +4 -4
- data/.github/workflows/test.yml +31 -7
- data/.rubocop.yml +16 -0
- data/.rubocop_todo.yml +76 -0
- data/CHANGELOG.md +66 -0
- data/Gemfile +4 -7
- data/README.md +24 -2
- data/Rakefile +11 -5
- data/ext/puppet_agent_components.json +1 -1
- data/lib/rspec-puppet-facts/version.rb +1 -1
- data/lib/rspec-puppet-facts.rb +75 -31
- data/rspec-puppet-facts.gemspec +12 -10
- data/spec/rspec_puppet_facts_spec.rb +323 -196
- metadata +75 -27
data/lib/rspec-puppet-facts.rb
CHANGED
@@ -2,6 +2,7 @@ require 'puppet'
|
|
2
2
|
require 'facter'
|
3
3
|
require 'facterdb'
|
4
4
|
require 'json'
|
5
|
+
require 'deep_merge'
|
5
6
|
|
6
7
|
# The purpose of this module is to simplify the Puppet
|
7
8
|
# module's RSpec tests by looping through all supported
|
@@ -56,7 +57,7 @@ module RspecPuppetFacts
|
|
56
57
|
#
|
57
58
|
# @api private
|
58
59
|
def on_supported_os_implementation(opts = {})
|
59
|
-
unless
|
60
|
+
unless /\A\d+\.\d+(?:\.\d+)*\z/.match?((facterversion = opts[:facterversion]))
|
60
61
|
raise ArgumentError, ":facterversion must be in the format 'n.n' or " \
|
61
62
|
"'n.n.n' (n is numeric), not '#{facterversion}'"
|
62
63
|
end
|
@@ -68,19 +69,20 @@ module RspecPuppetFacts
|
|
68
69
|
opts[:hardwaremodels].each do |hardwaremodel|
|
69
70
|
|
70
71
|
os_release_filter = "/^#{Regexp.escape(operatingsystemmajrelease.split(' ')[0])}/"
|
71
|
-
|
72
|
+
case os_sup['operatingsystem']
|
73
|
+
when /BSD/i
|
72
74
|
hardwaremodel = 'amd64'
|
73
|
-
|
75
|
+
when /Solaris/i
|
74
76
|
hardwaremodel = 'i86pc'
|
75
|
-
|
77
|
+
when /AIX/i
|
76
78
|
hardwaremodel = '/^IBM,.*/'
|
77
79
|
os_release_filter = if operatingsystemmajrelease =~ /\A(\d+)\.(\d+)\Z/
|
78
80
|
"/^#{$~[1]}#{$~[2]}00-/"
|
79
81
|
else
|
80
82
|
"/^#{operatingsystemmajrelease}-/"
|
81
83
|
end
|
82
|
-
|
83
|
-
hardwaremodel =
|
84
|
+
when /Windows/i
|
85
|
+
hardwaremodel = /^[12]\./.match?(facterversion) ? 'x64' : 'x86_64'
|
84
86
|
os_sup['operatingsystem'] = os_sup['operatingsystem'].downcase
|
85
87
|
operatingsystemmajrelease = operatingsystemmajrelease[/\A(?:Server )?(.+)/i, 1]
|
86
88
|
|
@@ -90,7 +92,7 @@ module RspecPuppetFacts
|
|
90
92
|
if operatingsystemmajrelease == '2016' && Puppet::Util::Package.versioncmp(facterversion, '3.4') < 0
|
91
93
|
os_release_filter = '/^10\\.0\\./'
|
92
94
|
end
|
93
|
-
|
95
|
+
when /Amazon/i
|
94
96
|
# Tighten the regex for Amazon Linux 2 so that we don't pick up Amazon Linux 2016 or 2017 facts
|
95
97
|
os_release_filter = "/^2$/" if operatingsystemmajrelease == '2'
|
96
98
|
end
|
@@ -112,35 +114,33 @@ module RspecPuppetFacts
|
|
112
114
|
end
|
113
115
|
end
|
114
116
|
|
115
|
-
|
117
|
+
strict_requirement = RspecPuppetFacts::facter_version_to_strict_requirement(facterversion)
|
118
|
+
|
119
|
+
loose_requirement = RspecPuppetFacts::facter_version_to_loose_requirement(facterversion)
|
120
|
+
received_facts = []
|
116
121
|
|
117
122
|
# FacterDB may have newer versions of facter data for which it contains a subset of all possible
|
118
123
|
# facter data (see FacterDB 0.5.2 for Facter releases 3.8 and 3.9). In this situation we need to
|
119
124
|
# cycle through and downgrade Facter versions per platform type until we find matching Facter data.
|
120
125
|
filter.each do |filter_spec|
|
121
|
-
|
122
|
-
db = FacterDB.get_facts(filter_spec.merge({ :facterversion => facter_version_filter }))
|
123
|
-
|
124
|
-
if db.empty?
|
125
|
-
if RspecPuppetFacts.spec_facts_strict?
|
126
|
-
raise ArgumentError, "No facts were found in the FacterDB for Facter v#{facterversion} on #{filter_spec}, aborting"
|
127
|
-
end
|
126
|
+
versions = FacterDB.get_facts(filter_spec).to_h { |facts| [Gem::Version.new(facts[:facterversion]), facts] }
|
128
127
|
|
129
|
-
|
128
|
+
version, facts = versions.select { |v, _f| strict_requirement =~ v }.max_by { |v, _f| v }
|
130
129
|
|
130
|
+
unless version
|
131
|
+
version, facts = versions.select { |v, _f| loose_requirement =~ v }.max_by { |v, _f| v } if loose_requirement
|
131
132
|
next unless version
|
132
|
-
version = version.to_s
|
133
|
-
facter_version_filter = "/\\A#{Regexp.escape(version)}/"
|
134
133
|
|
135
|
-
|
136
|
-
|
134
|
+
if RspecPuppetFacts.spec_facts_strict?
|
135
|
+
raise ArgumentError, "No facts were found in the FacterDB for Facter v#{facterversion} on #{filter_spec}, aborting"
|
137
136
|
end
|
137
|
+
|
138
|
+
RspecPuppetFacts.warning "No facts were found in the FacterDB for Facter v#{facterversion} on #{filter_spec}, using v#{version} instead"
|
138
139
|
end
|
139
140
|
|
140
|
-
|
141
|
+
received_facts << facts
|
141
142
|
end
|
142
143
|
|
143
|
-
received_facts = FacterDB::get_facts(filter)
|
144
144
|
unless received_facts.any?
|
145
145
|
RspecPuppetFacts.warning "No facts were found in the FacterDB for: #{filter.inspect}"
|
146
146
|
return {}
|
@@ -158,6 +158,8 @@ module RspecPuppetFacts
|
|
158
158
|
operatingsystemmajrelease = '2016'
|
159
159
|
elsif facts.dig(:os, 'release', 'major')
|
160
160
|
operatingsystemmajrelease = facts[:os]['release']['major']
|
161
|
+
elsif facts.dig(:os, 'distro', 'release', 'major')
|
162
|
+
operatingsystemmajrelease = facts[:os]['distro']['release']['major']
|
161
163
|
else
|
162
164
|
if facts[:operatingsystemmajrelease].nil?
|
163
165
|
operatingsystemmajrelease = facts[:operatingsystemrelease].split('.')[0]
|
@@ -176,8 +178,9 @@ module RspecPuppetFacts
|
|
176
178
|
os_facts_hash
|
177
179
|
end
|
178
180
|
|
181
|
+
# @api private
|
179
182
|
def stringify_keys(hash)
|
180
|
-
|
183
|
+
hash.to_h { |k, v| [k.to_s, v.is_a?(Hash) ? stringify_keys(v) : v] }
|
181
184
|
end
|
182
185
|
|
183
186
|
# Register a custom fact that will be included in the facts hash.
|
@@ -208,7 +211,8 @@ module RspecPuppetFacts
|
|
208
211
|
# @api private
|
209
212
|
def self.register_custom_fact(name, value, options)
|
210
213
|
@custom_facts ||= {}
|
211
|
-
|
214
|
+
name = RSpec.configuration.facterdb_string_keys ? name.to_s : name.to_sym
|
215
|
+
@custom_facts[name] = {:options => options, :value => value}
|
212
216
|
end
|
213
217
|
|
214
218
|
# Adds any custom facts according to the rules defined for the operating
|
@@ -224,7 +228,13 @@ module RspecPuppetFacts
|
|
224
228
|
next if fact[:options][:confine] && !fact[:options][:confine].include?(os)
|
225
229
|
next if fact[:options][:exclude] && fact[:options][:exclude].include?(os)
|
226
230
|
|
227
|
-
|
231
|
+
value = fact[:value].respond_to?(:call) ? fact[:value].call(os, facts) : fact[:value]
|
232
|
+
# if merge_facts passed, merge supplied facts into facts hash
|
233
|
+
if fact[:options][:merge_facts]
|
234
|
+
facts.deep_merge!({name => value})
|
235
|
+
else
|
236
|
+
facts[name] = value
|
237
|
+
end
|
228
238
|
end
|
229
239
|
|
230
240
|
facts
|
@@ -350,13 +360,47 @@ module RspecPuppetFacts
|
|
350
360
|
@metadata = nil
|
351
361
|
end
|
352
362
|
|
353
|
-
#
|
354
|
-
# @return [
|
355
|
-
# @param version [String] the Facter version
|
363
|
+
# Construct the strict facter version requirement
|
364
|
+
# @return [Gem::Requirement] The version requirement to match
|
356
365
|
# @api private
|
357
|
-
def self.
|
358
|
-
|
359
|
-
|
366
|
+
def self.facter_version_to_strict_requirement(version)
|
367
|
+
Gem::Requirement.new(facter_version_to_strict_requirement_string(version))
|
368
|
+
end
|
369
|
+
|
370
|
+
# Construct the strict facter version requirement string
|
371
|
+
# @return [String] The version requirement to match
|
372
|
+
# @api private
|
373
|
+
def self.facter_version_to_strict_requirement_string(version)
|
374
|
+
if /\A[0-9]+(\.[0-9]+)*\Z/.match?(version)
|
375
|
+
# Interpret 3 as ~> 3.0
|
376
|
+
"~> #{version}.0"
|
377
|
+
else
|
378
|
+
version
|
379
|
+
end
|
380
|
+
end
|
381
|
+
|
382
|
+
# Construct the loose facter version requirement
|
383
|
+
# @return [Optional[Gem::Requirement]] The version requirement to match
|
384
|
+
# @api private
|
385
|
+
def self.facter_version_to_loose_requirement(version)
|
386
|
+
string = facter_version_to_loose_requirement_string(version)
|
387
|
+
Gem::Requirement.new(string) if string
|
388
|
+
end
|
389
|
+
|
390
|
+
# Construct the facter version requirement string
|
391
|
+
# @return [String] The version requirement to match
|
392
|
+
# @api private
|
393
|
+
def self.facter_version_to_loose_requirement_string(version)
|
394
|
+
if (m = /\A(?<major>[0-9]+)\.(?<minor>[0-9]+)(?:\.(?<patch>[0-9]+))?\Z/.match(version))
|
395
|
+
# Interpret 3.1 as < 3.2 and 3.2.1 as < 3.3
|
396
|
+
"< #{m[:major]}.#{m[:minor].to_i + 1}"
|
397
|
+
elsif /\A[0-9]+\Z/.match?(version)
|
398
|
+
# Interpret 3 as < 4
|
399
|
+
"< #{version.to_i + 1}"
|
400
|
+
else
|
401
|
+
# This would be the same as the strict requirement
|
402
|
+
nil
|
403
|
+
end
|
360
404
|
end
|
361
405
|
|
362
406
|
def self.facter_version_for_puppet_version(puppet_version)
|
data/rspec-puppet-facts.gemspec
CHANGED
@@ -13,18 +13,20 @@ Gem::Specification.new do |s|
|
|
13
13
|
s.description = 'Contains facts from many Facter version on many Operating Systems'
|
14
14
|
s.licenses = 'Apache-2.0'
|
15
15
|
|
16
|
-
|
17
|
-
s.required_ruby_version = '>= 2.4.0'
|
16
|
+
s.required_ruby_version = '>= 2.7.0'
|
18
17
|
|
19
18
|
s.files = `git ls-files`.split("\n")
|
20
|
-
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
21
19
|
s.executables = `git ls-files -- bin/*`.split("\n").map { |f| File.basename(f) }
|
22
20
|
|
23
|
-
s.add_development_dependency 'mime-types'
|
24
|
-
s.add_development_dependency 'rake'
|
25
|
-
s.add_development_dependency 'rspec'
|
26
|
-
s.add_development_dependency 'yard'
|
27
|
-
|
28
|
-
s.
|
29
|
-
|
21
|
+
s.add_development_dependency 'mime-types', '~> 3.5', '>= 3.5.2'
|
22
|
+
s.add_development_dependency 'rake', '~> 13.1'
|
23
|
+
s.add_development_dependency 'rspec', '~> 3.12'
|
24
|
+
s.add_development_dependency 'yard', '~> 0.9.34'
|
25
|
+
|
26
|
+
s.add_development_dependency 'voxpupuli-rubocop', '~> 2.6.0'
|
27
|
+
|
28
|
+
s.add_runtime_dependency 'deep_merge', '~> 1.2'
|
29
|
+
s.add_runtime_dependency 'facter', '< 5'
|
30
|
+
s.add_runtime_dependency 'facterdb', '>= 0.5.0', '< 2'
|
31
|
+
s.add_runtime_dependency 'puppet', '>= 7', '< 9'
|
30
32
|
end
|