puppetlabs_spec_helper 4.0.1 → 5.0.1
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/.rubocop.yml +481 -116
- data/README.md +5 -19
- data/lib/puppetlabs_spec_helper/module_spec_helper.rb +8 -10
- data/lib/puppetlabs_spec_helper/puppet_spec_helper.rb +2 -86
- data/lib/puppetlabs_spec_helper/puppetlabs_spec/files.rb +3 -1
- data/lib/puppetlabs_spec_helper/puppetlabs_spec/fixtures.rb +3 -3
- data/lib/puppetlabs_spec_helper/puppetlabs_spec/matchers.rb +0 -17
- data/lib/puppetlabs_spec_helper/puppetlabs_spec/puppet_internals.rb +35 -68
- data/lib/puppetlabs_spec_helper/rake_tasks.rb +44 -63
- data/lib/puppetlabs_spec_helper/tasks/check_symlinks.rb +1 -3
- data/lib/puppetlabs_spec_helper/tasks/fixtures.rb +14 -12
- data/lib/puppetlabs_spec_helper/version.rb +1 -6
- data/spec/acceptance/fixtures/Rakefile +3 -0
- data/spec/acceptance/smoke_spec.rb +14 -0
- data/spec/spec_helper.rb +53 -0
- data/spec/unit/puppetlabs_spec_helper/puppetlabs_spec/puppet_internals_spec.rb +71 -0
- data/spec/unit/puppetlabs_spec_helper/tasks/check_symlinks_spec.rb +162 -0
- data/spec/unit/puppetlabs_spec_helper/tasks/check_test_file_spec.rb +45 -0
- data/spec/unit/puppetlabs_spec_helper/tasks/fixtures_spec.rb +262 -0
- data/spec/watchr.rb +81 -0
- metadata +32 -146
- data/.github/dependabot.yml +0 -15
- data/.gitignore +0 -9
- data/.noexec.yaml +0 -4
- data/.rspec +0 -2
- data/.rubocop_todo.yml +0 -119
- data/.travis.yml +0 -23
- data/CHANGELOG.md +0 -727
- data/CODEOWNERS +0 -2
- data/CONTRIBUTING.md +0 -14
- data/Gemfile +0 -42
- data/HISTORY.md +0 -498
- data/Rakefile +0 -45
- data/puppet_spec_helper.rb +0 -7
- data/puppetlabs_spec_helper.gemspec +0 -38
- data/puppetlabs_spec_helper.rb +0 -7
@@ -53,19 +53,22 @@ if ENV['SIMPLECOV'] == 'yes'
|
|
53
53
|
end
|
54
54
|
|
55
55
|
# Add all spec lib dirs to LOAD_PATH
|
56
|
-
components = module_path.split(File::PATH_SEPARATOR).
|
56
|
+
components = module_path.split(File::PATH_SEPARATOR).map do |dir|
|
57
57
|
next unless Dir.exist? dir
|
58
|
-
Dir.entries(dir).reject { |f| f =~ %r{^\.} }.
|
58
|
+
Dir.entries(dir).reject { |f| f =~ %r{^\.} }.map { |f| File.join(dir, f, 'spec', 'lib') }
|
59
59
|
end
|
60
60
|
components.flatten.each do |d|
|
61
61
|
$LOAD_PATH << d if FileTest.directory?(d) && !$LOAD_PATH.include?(d)
|
62
62
|
end
|
63
63
|
|
64
64
|
RSpec.configure do |c|
|
65
|
-
|
65
|
+
if ENV['GITHUB_ACTIONS'] == 'true'
|
66
|
+
c.formatter = 'RSpec::Github::Formatter'
|
67
|
+
end
|
68
|
+
|
69
|
+
c.environmentpath = spec_path
|
66
70
|
c.module_path = module_path
|
67
71
|
c.manifest_dir = File.join(fixture_path, 'manifests')
|
68
|
-
c.parser = 'future' if ENV['FUTURE_PARSER'] == 'yes'
|
69
72
|
|
70
73
|
c.before :each do
|
71
74
|
if c.mock_framework.framework_name == :rspec
|
@@ -74,12 +77,7 @@ RSpec.configure do |c|
|
|
74
77
|
Puppet.features.stubs(:root?).returns(true)
|
75
78
|
end
|
76
79
|
|
77
|
-
|
78
|
-
if Puppet.version.to_f < 4.0
|
79
|
-
Puppet.settings[:stringify_facts] = false if ENV['STRINGIFY_FACTS'] == 'no'
|
80
|
-
Puppet.settings[:trusted_node_data] = true if ENV['TRUSTED_NODE_DATA'] == 'yes'
|
81
|
-
end
|
82
|
-
Puppet.settings[:strict_variables] = true if ENV['STRICT_VARIABLES'] == 'yes' || (Puppet.version.to_f >= 4.0 && ENV['STRICT_VARIABLES'] != 'no')
|
80
|
+
Puppet.settings[:strict_variables] = true if ENV['STRICT_VARIABLES'] == 'yes' || ENV['STRICT_VARIABLES'] != 'no'
|
83
81
|
Puppet.settings[:ordering] = ENV['ORDERING'] if ENV['ORDERING']
|
84
82
|
end
|
85
83
|
end
|
@@ -48,83 +48,7 @@ require 'puppetlabs_spec_helper/puppetlabs_spec/files'
|
|
48
48
|
begin
|
49
49
|
require 'puppet/test/test_helper'
|
50
50
|
rescue LoadError
|
51
|
-
|
52
|
-
|
53
|
-
# This is just a utility class to allow us to isolate the various version-specific
|
54
|
-
# branches of initialization logic into methods without polluting the global namespace.#
|
55
|
-
module Puppet
|
56
|
-
class PuppetSpecInitializer
|
57
|
-
# This method is for initializing puppet state for testing for older versions
|
58
|
-
# of puppet that do not support the new TestHelper API. As you can see,
|
59
|
-
# this involves explicitly modifying global variables, directly manipulating
|
60
|
-
# Puppet's Settings singleton object, and other fun implementation details
|
61
|
-
# that code external to puppet should really never know about.
|
62
|
-
def self.initialize_via_fallback_compatibility(config)
|
63
|
-
warn('Warning: you appear to be using an older version of puppet; spec_helper will use fallback compatibility mode.')
|
64
|
-
config.before :all do
|
65
|
-
# nothing to do for now
|
66
|
-
end
|
67
|
-
|
68
|
-
config.after :all do
|
69
|
-
# nothing to do for now
|
70
|
-
end
|
71
|
-
|
72
|
-
config.before :each do
|
73
|
-
# these globals are set by Application
|
74
|
-
$puppet_application_mode = nil
|
75
|
-
$puppet_application_name = nil
|
76
|
-
|
77
|
-
# REVISIT: I think this conceals other bad tests, but I don't have time to
|
78
|
-
# fully diagnose those right now. When you read this, please come tell me
|
79
|
-
# I suck for letting this float. --daniel 2011-04-21
|
80
|
-
Signal.stubs(:trap)
|
81
|
-
|
82
|
-
# Set the confdir and vardir to gibberish so that tests
|
83
|
-
# have to be correctly mocked.
|
84
|
-
Puppet[:confdir] = '/dev/null'
|
85
|
-
Puppet[:vardir] = '/dev/null'
|
86
|
-
|
87
|
-
# Avoid opening ports to the outside world
|
88
|
-
Puppet.settings[:bindaddress] = '127.0.0.1'
|
89
|
-
end
|
90
|
-
|
91
|
-
config.after :each do
|
92
|
-
Puppet.settings.clear
|
93
|
-
|
94
|
-
Puppet::Node::Environment.clear
|
95
|
-
Puppet::Util::Storage.clear
|
96
|
-
Puppet::Util::ExecutionStub.reset if Puppet::Util.constants.include? 'ExecutionStub'
|
97
|
-
|
98
|
-
PuppetlabsSpec::Files.cleanup
|
99
|
-
end
|
100
|
-
end
|
101
|
-
end
|
102
|
-
end
|
103
|
-
|
104
|
-
# JJM Hack to make the stdlib tests run in Puppet 2.6 (See puppet commit cf183534)
|
105
|
-
unless Puppet.constants.include? 'Test'
|
106
|
-
module Puppet::Test
|
107
|
-
class LogCollector
|
108
|
-
def initialize(logs)
|
109
|
-
@logs = logs
|
110
|
-
end
|
111
|
-
|
112
|
-
def <<(value)
|
113
|
-
@logs << value
|
114
|
-
end
|
115
|
-
end
|
116
|
-
end
|
117
|
-
Puppet::Util::Log.newdesttype :log_collector do
|
118
|
-
match 'Puppet::Test::LogCollector'
|
119
|
-
|
120
|
-
def initialize(messages)
|
121
|
-
@messages = messages
|
122
|
-
end
|
123
|
-
|
124
|
-
def handle(msg)
|
125
|
-
@messages << msg
|
126
|
-
end
|
127
|
-
end
|
51
|
+
# Continue gracefully
|
128
52
|
end
|
129
53
|
|
130
54
|
# And here is where we do the main rspec configuration / setup.
|
@@ -134,15 +58,7 @@ RSpec.configure do |config|
|
|
134
58
|
# `mock_framework`'s autoloading to distinguish between the default, and
|
135
59
|
# the module's choice.
|
136
60
|
if config.instance_variable_get(:@mock_framework).nil?
|
137
|
-
|
138
|
-
config.mock_with :mocha
|
139
|
-
end
|
140
|
-
|
141
|
-
# determine whether we can use the new API or not, and call the appropriate initializer method.
|
142
|
-
if defined?(Puppet::Test::TestHelper)
|
143
|
-
# This case is handled by rspec-puppet since v1.0.0 (via 41257b33cb1f9ade4426b044f70be511b0c89112)
|
144
|
-
else
|
145
|
-
Puppet::PuppetSpecInitializer.initialize_via_fallback_compatibility(config)
|
61
|
+
config.mock_with :rspec
|
146
62
|
end
|
147
63
|
|
148
64
|
# Here we do some general setup that is relevant to all initialization modes, regardless
|
@@ -1,5 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
# rubocop:disable Style/GlobalVars # TODO: investigate the use of instance variables
|
4
|
+
|
3
5
|
require 'fileutils'
|
4
6
|
require 'tempfile'
|
5
7
|
require 'pathname'
|
@@ -20,7 +22,7 @@ module PuppetlabsSpec::Files
|
|
20
22
|
|
21
23
|
def self.cleanup
|
22
24
|
$global_tempfiles ||= []
|
23
|
-
while path = $global_tempfiles.pop
|
25
|
+
while (path = $global_tempfiles.pop)
|
24
26
|
raise "Not deleting tmpfile #{path} outside regular tmpdir" unless in_tmp(path)
|
25
27
|
|
26
28
|
begin
|
@@ -14,8 +14,8 @@ module PuppetlabsSpec::Fixtures
|
|
14
14
|
# <project>/spec/fixture/unit/facter/foo
|
15
15
|
def my_fixture_dir
|
16
16
|
callers = caller
|
17
|
-
while line = callers.shift
|
18
|
-
next unless found = line.match(%r{/spec/(.*)_spec\.rb:})
|
17
|
+
while (line = callers.shift)
|
18
|
+
next unless (found = line.match(%r{/spec/(.*)_spec\.rb:}))
|
19
19
|
|
20
20
|
return fixtures(found[1])
|
21
21
|
end
|
@@ -47,7 +47,7 @@ module PuppetlabsSpec::Fixtures
|
|
47
47
|
raise "fixture '#{glob}' for #{my_fixture_dir} had no files!"
|
48
48
|
end
|
49
49
|
|
50
|
-
|
50
|
+
block && files.each(&block)
|
51
51
|
files
|
52
52
|
end
|
53
53
|
end
|
@@ -3,23 +3,6 @@
|
|
3
3
|
require 'stringio'
|
4
4
|
require 'rspec/expectations'
|
5
5
|
|
6
|
-
########################################################################
|
7
|
-
# Backward compatibility for Jenkins outdated environment.
|
8
|
-
module RSpec
|
9
|
-
module Matchers
|
10
|
-
module BlockAliases
|
11
|
-
if method_defined?(:should) && !method_defined?(:to)
|
12
|
-
alias to should
|
13
|
-
end
|
14
|
-
if method_defined? :should_not
|
15
|
-
alias to_not should_not unless method_defined? :to_not
|
16
|
-
alias not_to should_not unless method_defined? :not_to
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
########################################################################
|
23
6
|
# Custom matchers...
|
24
7
|
RSpec::Matchers.define :have_matching_element do |expected|
|
25
8
|
match do |actual|
|
@@ -4,74 +4,41 @@
|
|
4
4
|
# 'puppetlabs_spec_helper/puppet_spec_helper' library
|
5
5
|
require 'puppetlabs_spec_helper/puppet_spec_helper'
|
6
6
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
# loadall should only be necessary prior to 3.x
|
17
|
-
# Please note, loadall needs to happen first when creating a scope, otherwise
|
18
|
-
# you might receive undefined method `function_*' errors
|
19
|
-
Puppet::Parser::Functions.autoloader.loadall
|
20
|
-
end
|
21
|
-
|
22
|
-
scope_compiler = parts[:compiler] || compiler
|
23
|
-
scope_parent = parts[:parent] || scope_compiler.topscope
|
24
|
-
scope_resource = parts[:resource] || resource(type: :node, title: scope_compiler.node.name)
|
25
|
-
|
26
|
-
scope = if %r{^2\.[67]}.match?(Puppet.version)
|
27
|
-
Puppet::Parser::Scope.new(compiler: scope_compiler)
|
28
|
-
else
|
29
|
-
Puppet::Parser::Scope.new(scope_compiler)
|
30
|
-
end
|
31
|
-
|
32
|
-
scope.source = Puppet::Resource::Type.new(:node, 'foo')
|
33
|
-
scope.parent = scope_parent
|
34
|
-
scope
|
35
|
-
end
|
36
|
-
module_function :scope
|
37
|
-
|
38
|
-
def resource(parts = {})
|
39
|
-
resource_type = parts[:type] || :hostclass
|
40
|
-
resource_name = parts[:name] || 'testing'
|
41
|
-
Puppet::Resource::Type.new(resource_type, resource_name)
|
42
|
-
end
|
43
|
-
module_function :resource
|
44
|
-
|
45
|
-
def compiler(parts = {})
|
46
|
-
compiler_node = parts[:node] || node
|
47
|
-
Puppet::Parser::Compiler.new(compiler_node)
|
48
|
-
end
|
49
|
-
module_function :compiler
|
50
|
-
|
51
|
-
def node(parts = {})
|
52
|
-
node_name = parts[:name] || 'testinghost'
|
53
|
-
options = parts[:options] || {}
|
54
|
-
node_environment = if Puppet.version.to_f >= 4.0
|
55
|
-
Puppet::Node::Environment.create(parts[:environment] || 'test', [])
|
56
|
-
else
|
57
|
-
Puppet::Node::Environment.new(parts[:environment] || 'test')
|
58
|
-
end
|
59
|
-
options[:environment] = node_environment
|
60
|
-
Puppet::Node.new(node_name, options)
|
61
|
-
end
|
62
|
-
module_function :node
|
63
|
-
|
64
|
-
# Return a method instance for a given function. This is primarily useful
|
65
|
-
# for rspec-puppet
|
66
|
-
def function_method(name, parts = {})
|
67
|
-
scope = parts[:scope] || scope()
|
68
|
-
# Ensure the method instance is defined by side-effect of checking if it
|
69
|
-
# exists. This is a hack, but at least it's a hidden hack and not an
|
70
|
-
# exposed hack.
|
71
|
-
return nil unless Puppet::Parser::Functions.function(name)
|
7
|
+
# PuppetInternals provides a set of methods that interface
|
8
|
+
# with internal puppet implementations.
|
9
|
+
module PuppetlabsSpec::PuppetInternals
|
10
|
+
def resource(parts = {})
|
11
|
+
resource_type = parts[:type] || :hostclass
|
12
|
+
resource_name = parts[:name] || 'testing'
|
13
|
+
Puppet::Resource::Type.new(resource_type, resource_name)
|
14
|
+
end
|
15
|
+
module_function :resource
|
72
16
|
|
73
|
-
|
74
|
-
|
75
|
-
|
17
|
+
def compiler(parts = {})
|
18
|
+
compiler_node = parts[:node] || node
|
19
|
+
Puppet::Parser::Compiler.new(compiler_node)
|
20
|
+
end
|
21
|
+
module_function :compiler
|
22
|
+
|
23
|
+
def node(parts = {})
|
24
|
+
node_name = parts[:name] || 'testinghost'
|
25
|
+
options = parts[:options] || {}
|
26
|
+
node_environment = Puppet::Node::Environment.create(parts[:environment] || 'test', [])
|
27
|
+
options[:environment] = node_environment
|
28
|
+
Puppet::Node.new(node_name, options)
|
29
|
+
end
|
30
|
+
module_function :node
|
31
|
+
|
32
|
+
# Return a method instance for a given function. This is primarily useful
|
33
|
+
# for rspec-puppet
|
34
|
+
def function_method(name, parts = {})
|
35
|
+
scope = parts[:scope] || scope()
|
36
|
+
# Ensure the method instance is defined by side-effect of checking if it
|
37
|
+
# exists. This is a hack, but at least it's a hidden hack and not an
|
38
|
+
# exposed hack.
|
39
|
+
return nil unless Puppet::Parser::Functions.function(name)
|
40
|
+
|
41
|
+
scope.method("function_#{name}".to_sym)
|
76
42
|
end
|
43
|
+
module_function :function_method
|
77
44
|
end
|
@@ -79,13 +79,11 @@ end
|
|
79
79
|
|
80
80
|
desc 'Run spec tests and clean the fixtures directory if successful'
|
81
81
|
task :spec do |_t, args|
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
Rake::Task[:spec_clean_symlinks].invoke
|
88
|
-
end
|
82
|
+
Rake::Task[:spec_prep].invoke
|
83
|
+
Rake::Task[:spec_standalone].invoke(*args.extras)
|
84
|
+
Rake::Task[:spec_clean].invoke
|
85
|
+
ensure
|
86
|
+
Rake::Task[:spec_clean_symlinks].invoke
|
89
87
|
end
|
90
88
|
|
91
89
|
desc 'Run spec tests with ruby simplecov code coverage'
|
@@ -98,13 +96,11 @@ end
|
|
98
96
|
|
99
97
|
desc 'Run spec tests in parallel and clean the fixtures directory if successful'
|
100
98
|
task :parallel_spec do |_t, args|
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
Rake::Task[:spec_clean_symlinks].invoke
|
107
|
-
end
|
99
|
+
Rake::Task[:spec_prep].invoke
|
100
|
+
Rake::Task[:parallel_spec_standalone].invoke(*args.extras)
|
101
|
+
Rake::Task[:spec_clean].invoke
|
102
|
+
ensure
|
103
|
+
Rake::Task[:spec_clean_symlinks].invoke
|
108
104
|
end
|
109
105
|
|
110
106
|
desc 'Parallel spec tests'
|
@@ -126,39 +122,25 @@ end
|
|
126
122
|
|
127
123
|
desc 'Build puppet module package'
|
128
124
|
task :build do
|
129
|
-
|
130
|
-
Rake::Task['build:pmt'].invoke
|
131
|
-
else
|
132
|
-
Rake::Task['build:pdk'].invoke
|
133
|
-
end
|
125
|
+
Rake::Task['build:pdk'].invoke
|
134
126
|
end
|
135
127
|
|
136
128
|
namespace :build do
|
137
|
-
desc 'Build Puppet module package with PMT (Puppet < 6.0.0 only)'
|
138
|
-
task :pmt do
|
139
|
-
require 'puppet/face'
|
140
|
-
|
141
|
-
pmod = Puppet::Face['module', :current]
|
142
|
-
pmod.build('./')
|
143
|
-
end
|
144
|
-
|
145
129
|
desc 'Build Puppet module with PDK'
|
146
130
|
task :pdk do
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
abort
|
158
|
-
end
|
159
|
-
|
160
|
-
system('pdk build --force')
|
131
|
+
require 'pdk/util'
|
132
|
+
require 'pdk/module/build'
|
133
|
+
|
134
|
+
path = PDK::Module::Build.invoke(force: true, 'target-dir': File.join(Dir.pwd, 'pkg'))
|
135
|
+
puts "Module built: #{path}"
|
136
|
+
rescue LoadError
|
137
|
+
_ = `pdk --version`
|
138
|
+
unless $CHILD_STATUS.success?
|
139
|
+
warn 'Unable to build module. Please install PDK or add the `pdk` gem to your Gemfile.'
|
140
|
+
abort
|
161
141
|
end
|
142
|
+
|
143
|
+
system('pdk build --force')
|
162
144
|
end
|
163
145
|
end
|
164
146
|
|
@@ -171,6 +153,7 @@ require 'puppet-lint/tasks/puppet-lint'
|
|
171
153
|
# Must clear as it will not override the existing puppet-lint rake task since we require to import for
|
172
154
|
# the PuppetLint::RakeTask
|
173
155
|
Rake::Task[:lint].clear
|
156
|
+
PuppetLint.configuration.fail_on_warnings = true
|
174
157
|
# Utilize PuppetLint global configuration so that these settings can be tweaked by
|
175
158
|
# spec_helper.rb in an individual module
|
176
159
|
PuppetLint.configuration.relative = true
|
@@ -182,15 +165,16 @@ PuppetLint.configuration.ignore_paths << 'spec/**/*.pp'
|
|
182
165
|
PuppetLint.configuration.ignore_paths << 'tests/**/*.pp'
|
183
166
|
PuppetLint.configuration.ignore_paths << 'types/**/*.pp'
|
184
167
|
PuppetLint.configuration.ignore_paths << 'vendor/**/*.pp'
|
185
|
-
puppet_lint_disable_checks =
|
186
|
-
80chars
|
187
|
-
140chars
|
188
|
-
class_inherits_from_params_class
|
189
|
-
class_parameter_defaults
|
190
|
-
disable_autoloader_layout
|
191
|
-
documentation
|
192
|
-
single_quote_string_with_variables
|
168
|
+
puppet_lint_disable_checks = [
|
169
|
+
'80chars',
|
170
|
+
'140chars',
|
171
|
+
'class_inherits_from_params_class',
|
172
|
+
'class_parameter_defaults',
|
173
|
+
'disable_autoloader_layout',
|
174
|
+
'documentation',
|
175
|
+
'single_quote_string_with_variables',
|
193
176
|
]
|
177
|
+
|
194
178
|
puppet_lint_disable_checks.each do |check|
|
195
179
|
PuppetLint.configuration.send("disable_#{check}")
|
196
180
|
end
|
@@ -208,10 +192,6 @@ PuppetSyntax.exclude_paths << 'pkg/**/*'
|
|
208
192
|
PuppetSyntax.exclude_paths << 'vendor/**/*'
|
209
193
|
PuppetSyntax.exclude_paths << '.vendor/**/*'
|
210
194
|
PuppetSyntax.exclude_paths << 'plans/**/*'
|
211
|
-
if Puppet.version.to_f < 4.0
|
212
|
-
PuppetSyntax.exclude_paths << 'types/**/*'
|
213
|
-
end
|
214
|
-
PuppetSyntax.future_parser = true if ENV['FUTURE_PARSER'] == 'yes'
|
215
195
|
|
216
196
|
desc 'Check syntax of Ruby files and call :syntax and :metadata_lint'
|
217
197
|
task :validate do
|
@@ -227,14 +207,13 @@ task :validate do
|
|
227
207
|
warn 'Skipping metadata validation; the metadata-json-lint gem was not found'
|
228
208
|
end
|
229
209
|
end
|
230
|
-
end
|
231
210
|
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
211
|
+
if File.exist?('REFERENCE.md')
|
212
|
+
if Rake::Task.task_defined?('strings:validate:reference')
|
213
|
+
Rake::Task['strings:validate:reference'].invoke
|
214
|
+
else
|
215
|
+
warn 'Skipping reference documentation validation; the puppet-strings gem was not found'
|
216
|
+
end
|
238
217
|
end
|
239
218
|
end
|
240
219
|
|
@@ -260,7 +239,7 @@ task :compute_dev_version do
|
|
260
239
|
# If the branch is a release branch we append an 'r' into the new_version,
|
261
240
|
# this is due to the release branch buildID conflicting with main branch when trying to push to the staging forge.
|
262
241
|
# More info can be found at https://tickets.puppetlabs.com/browse/FM-6170
|
263
|
-
new_version = if build =
|
242
|
+
new_version = if (build = ENV['BUILD_NUMBER'])
|
264
243
|
if branch.eql? 'release'
|
265
244
|
'%s-%s%04d-%s' % [version, 'r', build, sha] # legacy support code # rubocop:disable Style/FormatStringToken
|
266
245
|
else
|
@@ -315,7 +294,9 @@ namespace :check do
|
|
315
294
|
|
316
295
|
desc 'Fails if directories contain the files specified in .gitignore'
|
317
296
|
task :git_ignore do
|
318
|
-
matched = `git ls-files --ignored --exclude-standard`
|
297
|
+
matched = `git ls-files --ignored --exclude-standard --cached`
|
298
|
+
raise 'git ls-files failed' unless $CHILD_STATUS.success?
|
299
|
+
|
319
300
|
unless matched == ''
|
320
301
|
puts matched
|
321
302
|
raise 'File specified in .gitignore has been committed'
|
@@ -406,7 +387,7 @@ def create_gch_task(changelog_user = nil, changelog_project = nil, changelog_sin
|
|
406
387
|
},
|
407
388
|
'Added' => {
|
408
389
|
'prefix' => '### Added',
|
409
|
-
'labels' =>
|
390
|
+
'labels' => ['feature', 'enhancement'],
|
410
391
|
},
|
411
392
|
'Fixed' => {
|
412
393
|
'prefix' => '### Fixed',
|
@@ -4,9 +4,10 @@ require 'yaml'
|
|
4
4
|
require 'open3'
|
5
5
|
require 'json'
|
6
6
|
|
7
|
-
|
8
|
-
module PuppetlabsSpecHelper::Tasks
|
7
|
+
# Top level namespace for spec helper tasks.
|
8
|
+
module PuppetlabsSpecHelper::Tasks end
|
9
9
|
|
10
|
+
# Helpers for workfing with fixtures.
|
10
11
|
module PuppetlabsSpecHelper::Tasks::FixtureHelpers
|
11
12
|
# This is a helper for the self-symlink entry of fixtures.yml
|
12
13
|
def source_dir
|
@@ -136,6 +137,8 @@ module PuppetlabsSpecHelper::Tasks::FixtureHelpers
|
|
136
137
|
|
137
138
|
next unless include_repo?(opts['puppet_version'])
|
138
139
|
|
140
|
+
# rubocop:disable Security/Eval
|
141
|
+
# TODO: Remove eval
|
139
142
|
real_target = eval("\"#{opts['target']}\"", binding, __FILE__, __LINE__) # evaluating target reference in this context (see auto_symlink)
|
140
143
|
real_source = eval("\"#{opts['repo']}\"", binding, __FILE__, __LINE__) # evaluating repo reference in this context (see auto_symlink)
|
141
144
|
|
@@ -157,7 +160,7 @@ module PuppetlabsSpecHelper::Tasks::FixtureHelpers
|
|
157
160
|
return hash unless hash['scm'] == 'git'
|
158
161
|
|
159
162
|
# Forward slashes in the ref aren't allowed. And is probably a branch name.
|
160
|
-
raise ArgumentError, "The ref for #{hash['target']} is invalid (Contains a forward slash). If this is a branch name, please use the 'branch' setting instead." if hash['ref']
|
163
|
+
raise ArgumentError, "The ref for #{hash['target']} is invalid (Contains a forward slash). If this is a branch name, please use the 'branch' setting instead." if hash['ref'].include?('/')
|
161
164
|
|
162
165
|
hash
|
163
166
|
end
|
@@ -248,12 +251,11 @@ module PuppetlabsSpecHelper::Tasks::FixtureHelpers
|
|
248
251
|
end
|
249
252
|
|
250
253
|
def remove_subdirectory(target, subdir)
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
end
|
254
|
+
return if subdir.nil?
|
255
|
+
Dir.mktmpdir do |tmpdir|
|
256
|
+
FileUtils.mv(Dir.glob("#{target}/#{subdir}/{.[^\.]*,*}"), tmpdir)
|
257
|
+
FileUtils.rm_rf("#{target}/#{subdir}")
|
258
|
+
FileUtils.mv(Dir.glob("#{tmpdir}/{.[^\.]*,*}"), target.to_s)
|
257
259
|
end
|
258
260
|
end
|
259
261
|
|
@@ -284,7 +286,7 @@ module PuppetlabsSpecHelper::Tasks::FixtureHelpers
|
|
284
286
|
# so when anything else we count that as a active thread
|
285
287
|
# @return [Integer] - current thread count
|
286
288
|
def current_thread_count(items)
|
287
|
-
active_threads = items.
|
289
|
+
active_threads = items.select do |_item, opts|
|
288
290
|
if opts[:thread]
|
289
291
|
opts[:thread].status
|
290
292
|
else
|
@@ -316,7 +318,7 @@ module PuppetlabsSpecHelper::Tasks::FixtureHelpers
|
|
316
318
|
end
|
317
319
|
else
|
318
320
|
# the last thread started should be the longest wait
|
319
|
-
item, item_opts = items.
|
321
|
+
item, item_opts = items.reverse.find { |_i, o| o.key?(:thread) }
|
320
322
|
logger.debug "Waiting on #{item}"
|
321
323
|
item_opts[:thread].join # wait for the thread to finish
|
322
324
|
# now that we waited lets try again
|
@@ -405,7 +407,7 @@ module PuppetlabsSpecHelper::Tasks::FixtureHelpers
|
|
405
407
|
end
|
406
408
|
end
|
407
409
|
|
408
|
-
include PuppetlabsSpecHelper::Tasks::FixtureHelpers # DSL include
|
410
|
+
include PuppetlabsSpecHelper::Tasks::FixtureHelpers # DSL include
|
409
411
|
|
410
412
|
desc 'Create the fixtures directory'
|
411
413
|
task :spec_prep do
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
require 'open3'
|
5
|
+
|
6
|
+
# some smoke tests to verify overall sanity
|
7
|
+
RSpec.describe 'rake' do
|
8
|
+
let(:output) do
|
9
|
+
Open3.capture2e('rake', '--rakefile', 'spec/acceptance/fixtures/Rakefile', '-T')
|
10
|
+
end
|
11
|
+
|
12
|
+
it { expect(output[0]).to match %r{spec_prep} }
|
13
|
+
it { expect(output[1]).to be_success }
|
14
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,53 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
if ENV['COVERAGE'] == 'yes'
|
4
|
+
require 'simplecov'
|
5
|
+
require 'simplecov-console'
|
6
|
+
require 'codecov'
|
7
|
+
|
8
|
+
SimpleCov.formatters = [
|
9
|
+
SimpleCov::Formatter::HTMLFormatter,
|
10
|
+
SimpleCov::Formatter::Console,
|
11
|
+
SimpleCov::Formatter::Codecov,
|
12
|
+
]
|
13
|
+
SimpleCov.start do
|
14
|
+
track_files 'lib/**/*.rb'
|
15
|
+
|
16
|
+
add_filter 'lib/puppetlabs_spec_helper/version.rb'
|
17
|
+
|
18
|
+
add_filter '/spec'
|
19
|
+
|
20
|
+
# do not track vendored files
|
21
|
+
add_filter '/vendor'
|
22
|
+
add_filter '/.vendor'
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
require 'fakefs/spec_helpers'
|
27
|
+
|
28
|
+
FakeFS::Pathname.class_eval do
|
29
|
+
def symlink?
|
30
|
+
File.symlink?(@path)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
require 'puppetlabs_spec_helper/puppet_spec_helper'
|
35
|
+
require 'puppetlabs_spec_helper/puppetlabs_spec/puppet_internals'
|
36
|
+
require 'puppetlabs_spec_helper/rake_tasks'
|
37
|
+
|
38
|
+
RSpec.shared_context 'with a rake task', type: :task do
|
39
|
+
subject(:task) { Rake::Task[task_name] }
|
40
|
+
|
41
|
+
include FakeFS::SpecHelpers
|
42
|
+
|
43
|
+
let(:task_name) { self.class.top_level_description.sub(%r{\Arake }, '') }
|
44
|
+
end
|
45
|
+
|
46
|
+
# configure RSpec after including all the code
|
47
|
+
RSpec.configure do |config|
|
48
|
+
config.expect_with :rspec do |c|
|
49
|
+
c.syntax = :expect
|
50
|
+
end
|
51
|
+
|
52
|
+
config.include_context 'with a rake task', type: :task
|
53
|
+
end
|