pdk 2.7.1 → 3.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +25 -0
- data/README.md +2 -48
- data/lib/pdk/analytics/client/google_analytics.rb +22 -26
- data/lib/pdk/analytics/util.rb +0 -1
- data/lib/pdk/analytics.rb +1 -1
- data/lib/pdk/bolt.rb +1 -0
- data/lib/pdk/cli/build.rb +53 -56
- data/lib/pdk/cli/bundle.rb +34 -33
- data/lib/pdk/cli/console.rb +136 -134
- data/lib/pdk/cli/convert.rb +39 -41
- data/lib/pdk/cli/env.rb +49 -47
- data/lib/pdk/cli/errors.rb +1 -2
- data/lib/pdk/cli/exec/command.rb +23 -29
- data/lib/pdk/cli/exec/interactive_command.rb +7 -12
- data/lib/pdk/cli/exec.rb +4 -11
- data/lib/pdk/cli/exec_group.rb +3 -2
- data/lib/pdk/cli/get/config.rb +21 -19
- data/lib/pdk/cli/get.rb +15 -13
- data/lib/pdk/cli/new/class.rb +22 -22
- data/lib/pdk/cli/new/defined_type.rb +22 -22
- data/lib/pdk/cli/new/fact.rb +19 -19
- data/lib/pdk/cli/new/function.rb +20 -20
- data/lib/pdk/cli/new/module.rb +40 -38
- data/lib/pdk/cli/new/provider.rb +19 -19
- data/lib/pdk/cli/new/task.rb +23 -23
- data/lib/pdk/cli/new/test.rb +50 -48
- data/lib/pdk/cli/new/transport.rb +18 -18
- data/lib/pdk/cli/new.rb +11 -9
- data/lib/pdk/cli/release/prep.rb +27 -25
- data/lib/pdk/cli/release/publish.rb +39 -37
- data/lib/pdk/cli/release.rb +152 -149
- data/lib/pdk/cli/remove/config.rb +63 -60
- data/lib/pdk/cli/remove.rb +15 -13
- data/lib/pdk/cli/set/config.rb +91 -89
- data/lib/pdk/cli/set.rb +15 -13
- data/lib/pdk/cli/test/unit.rb +71 -69
- data/lib/pdk/cli/test.rb +9 -7
- data/lib/pdk/cli/update.rb +33 -38
- data/lib/pdk/cli/util/command_redirector.rb +10 -1
- data/lib/pdk/cli/util/interview.rb +11 -4
- data/lib/pdk/cli/util/option_normalizer.rb +2 -4
- data/lib/pdk/cli/util/option_validator.rb +7 -9
- data/lib/pdk/cli/util/update_manager_printer.rb +4 -4
- data/lib/pdk/cli/util.rb +32 -48
- data/lib/pdk/cli/validate.rb +98 -96
- data/lib/pdk/cli.rb +124 -120
- data/lib/pdk/config/ini_file.rb +4 -3
- data/lib/pdk/config/ini_file_setting.rb +6 -10
- data/lib/pdk/config/json.rb +1 -0
- data/lib/pdk/config/json_schema_namespace.rb +5 -10
- data/lib/pdk/config/json_schema_setting.rb +3 -5
- data/lib/pdk/config/json_with_schema.rb +2 -4
- data/lib/pdk/config/namespace.rb +19 -13
- data/lib/pdk/config/setting.rb +5 -6
- data/lib/pdk/config/task_schema.json +116 -0
- data/lib/pdk/config/validator.rb +4 -4
- data/lib/pdk/config/yaml.rb +3 -8
- data/lib/pdk/config/yaml_with_schema.rb +4 -12
- data/lib/pdk/config.rb +47 -51
- data/lib/pdk/context/control_repo.rb +3 -2
- data/lib/pdk/context/module.rb +2 -2
- data/lib/pdk/context/none.rb +2 -2
- data/lib/pdk/context.rb +4 -5
- data/lib/pdk/control_repo.rb +3 -4
- data/lib/pdk/generate/defined_type.rb +3 -3
- data/lib/pdk/generate/fact.rb +3 -2
- data/lib/pdk/generate/function.rb +5 -4
- data/lib/pdk/generate/module.rb +91 -106
- data/lib/pdk/generate/provider.rb +5 -4
- data/lib/pdk/generate/puppet_class.rb +3 -3
- data/lib/pdk/generate/puppet_object.rb +9 -12
- data/lib/pdk/generate/task.rb +11 -10
- data/lib/pdk/generate/transport.rb +8 -7
- data/lib/pdk/generate.rb +1 -1
- data/lib/pdk/logger.rb +3 -2
- data/lib/pdk/module/build.rb +34 -49
- data/lib/pdk/module/convert.rb +13 -22
- data/lib/pdk/module/metadata.rb +53 -61
- data/lib/pdk/module/release.rb +19 -25
- data/lib/pdk/module/update.rb +4 -13
- data/lib/pdk/module/update_manager.rb +18 -25
- data/lib/pdk/module.rb +1 -1
- data/lib/pdk/monkey_patches.rb +268 -0
- data/lib/pdk/report/event.rb +12 -37
- data/lib/pdk/report.rb +4 -4
- data/lib/pdk/template/fetcher/git.rb +7 -8
- data/lib/pdk/template/fetcher/local.rb +1 -0
- data/lib/pdk/template/fetcher.rb +4 -2
- data/lib/pdk/template/renderer/v1/legacy_template_dir.rb +4 -9
- data/lib/pdk/template/renderer/v1/renderer.rb +19 -20
- data/lib/pdk/template/renderer/v1/template_file.rb +4 -8
- data/lib/pdk/template/renderer/v1.rb +1 -1
- data/lib/pdk/template/renderer.rb +1 -0
- data/lib/pdk/template/template_dir.rb +3 -3
- data/lib/pdk/template.rb +2 -6
- data/lib/pdk/tests/unit.rb +36 -25
- data/lib/pdk/util/bundler.rb +10 -14
- data/lib/pdk/util/changelog_generator.rb +15 -12
- data/lib/pdk/util/env.rb +1 -0
- data/lib/pdk/util/filesystem.rb +18 -17
- data/lib/pdk/util/git.rb +16 -21
- data/lib/pdk/util/json_finder.rb +7 -6
- data/lib/pdk/util/puppet_strings.rb +1 -1
- data/lib/pdk/util/puppet_version.rb +16 -67
- data/lib/pdk/util/ruby_version.rb +9 -13
- data/lib/pdk/util/template_uri.rb +17 -29
- data/lib/pdk/util/vendored_file.rb +5 -18
- data/lib/pdk/util/windows/api_types.rb +70 -64
- data/lib/pdk/util/windows/file.rb +31 -27
- data/lib/pdk/util/windows/process.rb +59 -61
- data/lib/pdk/util/windows/string.rb +19 -12
- data/lib/pdk/util.rb +12 -20
- data/lib/pdk/validate/control_repo/control_repo_validator_group.rb +1 -1
- data/lib/pdk/validate/control_repo/environment_conf_validator.rb +25 -25
- data/lib/pdk/validate/external_command_validator.rb +6 -1
- data/lib/pdk/validate/internal_ruby_validator.rb +5 -4
- data/lib/pdk/validate/invokable_validator.rb +30 -20
- data/lib/pdk/validate/metadata/metadata_json_lint_validator.rb +12 -14
- data/lib/pdk/validate/metadata/metadata_syntax_validator.rb +13 -15
- data/lib/pdk/validate/metadata/metadata_validator_group.rb +1 -1
- data/lib/pdk/validate/puppet/puppet_epp_validator.rb +16 -18
- data/lib/pdk/validate/puppet/puppet_lint_validator.rb +14 -14
- data/lib/pdk/validate/puppet/puppet_plan_syntax_validator.rb +1 -1
- data/lib/pdk/validate/puppet/puppet_syntax_validator.rb +16 -18
- data/lib/pdk/validate/puppet/puppet_validator_group.rb +1 -1
- data/lib/pdk/validate/ruby/ruby_rubocop_validator.rb +10 -11
- data/lib/pdk/validate/ruby/ruby_validator_group.rb +1 -1
- data/lib/pdk/validate/tasks/tasks_metadata_lint_validator.rb +19 -24
- data/lib/pdk/validate/tasks/tasks_name_validator.rb +11 -13
- data/lib/pdk/validate/tasks/tasks_validator_group.rb +1 -1
- data/lib/pdk/validate/validator.rb +4 -2
- data/lib/pdk/validate/validator_group.rb +6 -3
- data/lib/pdk/validate/yaml/yaml_syntax_validator.rb +27 -36
- data/lib/pdk/validate/yaml/yaml_validator_group.rb +1 -1
- data/lib/pdk/validate.rb +6 -6
- data/lib/pdk/version.rb +2 -2
- data/lib/pdk.rb +12 -12
- metadata +27 -35
- data/lib/pdk/cli/config/get.rb +0 -26
- data/lib/pdk/cli/config.rb +0 -22
- data/lib/pdk/cli/module/build.rb +0 -12
- data/lib/pdk/cli/module/generate.rb +0 -47
- data/lib/pdk/cli/module.rb +0 -14
@@ -21,7 +21,7 @@ module PDK
|
|
21
21
|
template_file = single_item_path(relative_file_path)
|
22
22
|
return nil unless PDK::Util::Filesystem.file?(template_file) && PDK::Util::Filesystem.readable?(template_file)
|
23
23
|
|
24
|
-
PDK.logger.debug("Rendering '%{template}'..."
|
24
|
+
PDK.logger.debug(format("Rendering '%{template}'...", template: template_file))
|
25
25
|
new_template_file(template_file, template_data_hash).render
|
26
26
|
end
|
27
27
|
|
@@ -30,34 +30,34 @@ module PDK
|
|
30
30
|
# @param item_path [String] The path of the single item to render
|
31
31
|
# @return [String]
|
32
32
|
# @api private
|
33
|
-
|
33
|
+
# :nocov:
|
34
34
|
def single_item_path(item_path)
|
35
35
|
File.join(template_root, 'object_templates', item_path)
|
36
36
|
end
|
37
|
-
|
37
|
+
# :nocov:
|
38
38
|
|
39
39
|
# Helper method used during testing
|
40
|
-
|
40
|
+
# :nocov:
|
41
41
|
# @api private
|
42
42
|
def new_template_file(template_file, template_data_hash)
|
43
43
|
TemplateFile.new(template_file, template_data_hash)
|
44
44
|
end
|
45
|
-
|
45
|
+
# :nocov:
|
46
46
|
|
47
47
|
# Helper method used during testing
|
48
|
-
|
48
|
+
# :nocov:
|
49
49
|
# @api private
|
50
50
|
def new_legacy_template_dir(context, uri, path, module_metadata = {})
|
51
51
|
LegacyTemplateDir.new(context, uri, path, module_metadata)
|
52
52
|
end
|
53
|
-
|
53
|
+
# :nocov:
|
54
54
|
|
55
55
|
# Renders a new module
|
56
56
|
#
|
57
57
|
# @param options [Hash{Object => Object}] A list of options to pass through to the renderer. See PDK::Template::TemplateDir helper methods for other options
|
58
58
|
# @see #render
|
59
59
|
# @api private
|
60
|
-
|
60
|
+
# :nocov: This is tested in acceptance and packaging tests
|
61
61
|
def render_module(options = {})
|
62
62
|
require 'pdk/template/renderer/v1/template_file'
|
63
63
|
|
@@ -71,8 +71,8 @@ module PDK
|
|
71
71
|
|
72
72
|
files_in_template(dirs).each do |template_file, template_loc|
|
73
73
|
template_file = template_file.to_s
|
74
|
-
PDK.logger.debug("Rendering '%{template}'..."
|
75
|
-
dest_path = template_file.sub(
|
74
|
+
PDK.logger.debug(format("Rendering '%{template}'...", template: template_file))
|
75
|
+
dest_path = template_file.sub(/\.erb\Z/, '')
|
76
76
|
config = legacy_template_dir.config_for(dest_path)
|
77
77
|
|
78
78
|
dest_status = if template_loc.start_with?(moduleroot_init)
|
@@ -88,9 +88,9 @@ module PDK
|
|
88
88
|
else
|
89
89
|
begin
|
90
90
|
dest_content = new_template_file(File.join(template_loc, template_file), configs: config, template_dir: legacy_template_dir).render
|
91
|
-
rescue =>
|
92
|
-
error_msg = "Failed to render template '%{template}'\n" \
|
93
|
-
|
91
|
+
rescue StandardError => e
|
92
|
+
error_msg = format("Failed to render template '%{template}'\n" \
|
93
|
+
'%{exception}: %{message}', template: template_file, exception: e.class, message: e.message)
|
94
94
|
raise PDK::CLI::FatalError, error_msg
|
95
95
|
end
|
96
96
|
end
|
@@ -98,7 +98,7 @@ module PDK
|
|
98
98
|
yield dest_path, dest_content, dest_status
|
99
99
|
end
|
100
100
|
end
|
101
|
-
|
101
|
+
# :nocov:
|
102
102
|
|
103
103
|
# Returns all files in the given template directories
|
104
104
|
#
|
@@ -111,17 +111,16 @@ module PDK
|
|
111
111
|
temp_paths = []
|
112
112
|
dirlocs = []
|
113
113
|
dirs.each do |dir|
|
114
|
-
raise ArgumentError, "The directory '%{dir}' doesn't exist"
|
114
|
+
raise ArgumentError, format("The directory '%{dir}' doesn't exist", dir: dir) unless PDK::Util::Filesystem.directory?(dir)
|
115
|
+
|
115
116
|
temp_paths += PDK::Util::Filesystem.glob(File.join(dir, *glob_suffix), File::FNM_DOTMATCH).select do |template_path|
|
116
|
-
if PDK::Util::Filesystem.file?(template_path) && !PDK::Util::Filesystem.symlink?(template_path)
|
117
|
-
dirlocs << dir
|
118
|
-
end
|
117
|
+
dirlocs << dir if PDK::Util::Filesystem.file?(template_path) && !PDK::Util::Filesystem.symlink?(template_path)
|
119
118
|
end
|
120
119
|
temp_paths.map do |template_path|
|
121
|
-
template_path.sub!(
|
120
|
+
template_path.sub!(/\A#{Regexp.escape(dir)}#{Regexp.escape(File::SEPARATOR)}/, '')
|
122
121
|
end
|
123
122
|
end
|
124
|
-
|
123
|
+
(temp_paths.zip dirlocs).to_h
|
125
124
|
end
|
126
125
|
end
|
127
126
|
end
|
@@ -20,9 +20,7 @@ module PDK
|
|
20
20
|
def initialize(template_file, data = {})
|
21
21
|
@template_file = template_file
|
22
22
|
|
23
|
-
if data.key?(:configs)
|
24
|
-
@configs = data[:configs]
|
25
|
-
end
|
23
|
+
@configs = data[:configs] if data.key?(:configs)
|
26
24
|
|
27
25
|
super(data)
|
28
26
|
end
|
@@ -65,11 +63,9 @@ module PDK
|
|
65
63
|
#
|
66
64
|
# @api private
|
67
65
|
def template_content
|
68
|
-
if PDK::Util::Filesystem.file?(@template_file) && PDK::Util::Filesystem.readable?(@template_file)
|
69
|
-
return PDK::Util::Filesystem.read_file(@template_file)
|
70
|
-
end
|
66
|
+
return PDK::Util::Filesystem.read_file(@template_file) if PDK::Util::Filesystem.file?(@template_file) && PDK::Util::Filesystem.readable?(@template_file)
|
71
67
|
|
72
|
-
raise ArgumentError, "'%{template}' is not a readable file"
|
68
|
+
raise ArgumentError, format("'%{template}' is not a readable file", template: @template_file)
|
73
69
|
end
|
74
70
|
|
75
71
|
# Renders the content of the template file as an ERB template.
|
@@ -82,7 +78,7 @@ module PDK
|
|
82
78
|
def render_erb
|
83
79
|
require 'erb'
|
84
80
|
|
85
|
-
renderer = ERB.new(template_content,
|
81
|
+
renderer = ERB.new(template_content, trim_mode: '-')
|
86
82
|
renderer.filename = @template_file
|
87
83
|
renderer.result(binding)
|
88
84
|
end
|
@@ -11,7 +11,7 @@ module PDK
|
|
11
11
|
# Whether the template directory and context are valid for the V1 renderer
|
12
12
|
# @see PDK::Template::Renderer.instance
|
13
13
|
def self.compatible?(template_root, _context)
|
14
|
-
|
14
|
+
['moduleroot', 'moduleroot_init'].all? { |dir| PDK::Util::Filesystem.directory?(File.join(template_root, dir)) }
|
15
15
|
end
|
16
16
|
|
17
17
|
# Creates an instance of the V1 Renderer
|
@@ -14,6 +14,7 @@ module PDK
|
|
14
14
|
# @return [AbstractRenderer, nil] An instance of an AbstractRenderer subclass. Returns nil if no renderer could be found
|
15
15
|
def self.instance(template_uri, template_root, context)
|
16
16
|
return V1.instance(template_root, template_uri, context) if V1.compatible?(template_root, context)
|
17
|
+
|
17
18
|
nil
|
18
19
|
end
|
19
20
|
|
@@ -36,7 +36,7 @@ module PDK
|
|
36
36
|
@metadata = {}
|
37
37
|
|
38
38
|
@renderer = renderer.nil? ? Renderer.instance(uri, path, context) : renderer
|
39
|
-
raise 'Could not find a compatible template renderer for %{path}'
|
39
|
+
raise format('Could not find a compatible template renderer for %{path}', path: path) if @renderer.nil?
|
40
40
|
end
|
41
41
|
|
42
42
|
# Later additions may include Control Repo rendering, for example
|
@@ -48,7 +48,7 @@ module PDK
|
|
48
48
|
# def render_new_control_repo(name, repo_metadata = {}, options = {})
|
49
49
|
# render(CONTROL_REPO_TEMPLATE_TYPE, name, options.merge(include_first_time: true, control_repo_metadata: repo_metadata)) { |*args| yield(*args) }
|
50
50
|
# end
|
51
|
-
|
51
|
+
# :nocov: These are just helper methods and are tested elsewhere.
|
52
52
|
|
53
53
|
# Render an existing module
|
54
54
|
# @see PDK::Template::Renderer::AbstractRenderer.render
|
@@ -61,7 +61,7 @@ module PDK
|
|
61
61
|
def render_new_module(module_name, module_metadata = {}, options = {})
|
62
62
|
@renderer.render(MODULE_TEMPLATE_TYPE, module_name, options.merge(include_first_time: true, module_metadata: module_metadata)) { |*args| yield(*args) }
|
63
63
|
end
|
64
|
-
|
64
|
+
# :nocov:
|
65
65
|
end
|
66
66
|
end
|
67
67
|
end
|
data/lib/pdk/template.rb
CHANGED
@@ -37,12 +37,8 @@ module PDK
|
|
37
37
|
#
|
38
38
|
# @api public
|
39
39
|
def self.with(uri, context)
|
40
|
-
unless block_given?
|
41
|
-
|
42
|
-
end
|
43
|
-
unless uri.is_a? PDK::Util::TemplateURI
|
44
|
-
raise ArgumentError, '%{class_name}.with must be passed a PDK::Util::TemplateURI, got a %{uri_type}' % { uri_type: uri.class, class_name: name }
|
45
|
-
end
|
40
|
+
raise ArgumentError, format('%{class_name}.with must be passed a block.', class_name: name) unless block_given?
|
41
|
+
raise ArgumentError, format('%{class_name}.with must be passed a PDK::Util::TemplateURI, got a %{uri_type}', uri_type: uri.class, class_name: name) unless uri.is_a? PDK::Util::TemplateURI
|
46
42
|
|
47
43
|
Fetcher.with(uri) do |fetcher|
|
48
44
|
template_dir = TemplateDir.instance(uri, fetcher.path, context)
|
data/lib/pdk/tests/unit.rb
CHANGED
@@ -48,14 +48,14 @@ module PDK
|
|
48
48
|
|
49
49
|
def self.parallel_with_no_tests?(ran_in_parallel, json_result, result)
|
50
50
|
ran_in_parallel && json_result.empty? &&
|
51
|
-
((!result[:exit_code].zero? && result[:stderr].strip =~
|
52
|
-
result[:stderr].strip =~
|
51
|
+
((!result[:exit_code].zero? && result[:stderr].strip =~ /Pass files or folders to run$/) ||
|
52
|
+
result[:stderr].strip =~ /No files for parallel_spec to run against$/)
|
53
53
|
end
|
54
54
|
|
55
55
|
def self.print_failure(result, exception)
|
56
56
|
$stderr.puts ''
|
57
|
-
result[:stdout]
|
58
|
-
result[:stderr]
|
57
|
+
result[:stdout]&.each_line { |line| $stderr.puts line.rstrip }
|
58
|
+
result[:stderr]&.each_line { |line| $stderr.puts line.rstrip }
|
59
59
|
$stderr.puts ''
|
60
60
|
raise PDK::CLI::FatalError, exception
|
61
61
|
end
|
@@ -95,7 +95,7 @@ module PDK
|
|
95
95
|
# Ref - https://github.com/puppetlabs/pdk/issues/828
|
96
96
|
tests = tests.tr('\\', '/') unless tests.nil?
|
97
97
|
|
98
|
-
environment = {
|
98
|
+
environment = {}
|
99
99
|
environment['PUPPET_GEM_VERSION'] = options[:puppet] if options[:puppet]
|
100
100
|
spinner_msg = options[:parallel] ? 'Running unit tests in parallel.' : 'Running unit tests.'
|
101
101
|
|
@@ -109,6 +109,17 @@ module PDK
|
|
109
109
|
return result[:exit_code]
|
110
110
|
end
|
111
111
|
|
112
|
+
# Run interactive_rake for documentation output when utilising verbose option.
|
113
|
+
if (options[:verbose]) && (options[:format])
|
114
|
+
environment['CI_SPEC_OPTIONS'] = '--format documentation'
|
115
|
+
result = interactive_rake(cmd(tests, options), environment)
|
116
|
+
# Caveat: Report will not be written to format option(s) file(s) when there are event failures.
|
117
|
+
return result[:exit_code] unless (result[:exit_code]).zero?
|
118
|
+
|
119
|
+
spinner_msg = "Exporting unit tests -> #{options[:format]}"
|
120
|
+
end
|
121
|
+
|
122
|
+
environment['CI_SPEC_OPTIONS'] = '--format j'
|
112
123
|
result = rake(cmd(tests, options), spinner_msg, environment)
|
113
124
|
|
114
125
|
json_result = if options[:parallel]
|
@@ -122,7 +133,7 @@ module PDK
|
|
122
133
|
result[:exit_code] = 0
|
123
134
|
end
|
124
135
|
|
125
|
-
raise PDK::CLI::FatalError, 'Unit test output did not contain a valid JSON result: %{output}'
|
136
|
+
raise PDK::CLI::FatalError, format('Unit test output did not contain a valid JSON result: %{output}', output: result[:stdout]) if json_result.nil? || json_result.empty?
|
126
137
|
|
127
138
|
json_result = merge_json_results(json_result) if options[:parallel]
|
128
139
|
|
@@ -135,38 +146,38 @@ module PDK
|
|
135
146
|
|
136
147
|
def self.parse_output(report, json_data, duration)
|
137
148
|
# Output messages to stderr.
|
138
|
-
json_data['messages']
|
149
|
+
json_data['messages']&.each { |msg| $stderr.puts msg }
|
139
150
|
|
140
151
|
example_results = {
|
141
152
|
# Only possibilities are passed, failed, pending:
|
142
153
|
# https://github.com/rspec/rspec-core/blob/main/lib/rspec/core/example.rb#L548
|
143
154
|
'passed' => [],
|
144
155
|
'failed' => [],
|
145
|
-
'pending' => []
|
156
|
+
'pending' => []
|
146
157
|
}
|
147
158
|
|
148
|
-
json_data['examples']
|
159
|
+
json_data['examples']&.each do |ex|
|
149
160
|
example_results[ex['status']] << ex if example_results.key?(ex['status'])
|
150
161
|
end
|
151
162
|
|
152
163
|
example_results.each do |result, examples|
|
153
164
|
# Translate rspec example results to JUnit XML testcase results
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
165
|
+
state_map = {
|
166
|
+
'passed' => :passed,
|
167
|
+
'failed' => :failure,
|
168
|
+
'pending' => :skipped
|
169
|
+
}
|
159
170
|
|
160
171
|
examples.each do |ex|
|
161
172
|
report.add_event(
|
162
173
|
source: 'rspec',
|
163
|
-
state:
|
174
|
+
state: state_map[result],
|
164
175
|
file: ex['file_path'],
|
165
176
|
line: ex['line_number'],
|
166
177
|
test: ex['full_description'],
|
167
178
|
severity: ex['status'],
|
168
179
|
message: ex['pending_message'] || (ex['exception'] && ex['exception']['message']) || nil,
|
169
|
-
trace: (ex['exception'] && ex['exception']['backtrace']) || nil
|
180
|
+
trace: (ex['exception'] && ex['exception']['backtrace']) || nil
|
170
181
|
)
|
171
182
|
end
|
172
183
|
end
|
@@ -174,12 +185,8 @@ module PDK
|
|
174
185
|
return unless json_data['summary']
|
175
186
|
|
176
187
|
# TODO: standardize summary output
|
177
|
-
$stderr.puts ' ' << 'Evaluated %{total} tests in %{duration} seconds: %{failures} failures, %{pending} pending.'
|
178
|
-
|
179
|
-
duration: duration,
|
180
|
-
failures: json_data['summary']['failure_count'],
|
181
|
-
pending: json_data['summary']['pending_count'],
|
182
|
-
}
|
188
|
+
$stderr.puts ' ' << (format('Evaluated %{total} tests in %{duration} seconds: %{failures} failures, %{pending} pending.', total: json_data['summary']['example_count'], duration: duration,
|
189
|
+
failures: json_data['summary']['failure_count'], pending: json_data['summary']['pending_count'])) # rubocop:disable Layout/LineLength
|
183
190
|
end
|
184
191
|
|
185
192
|
def self.merge_json_results(json_data)
|
@@ -191,6 +198,7 @@ module PDK
|
|
191
198
|
message_set = Set.new
|
192
199
|
json_data.each do |json|
|
193
200
|
next unless json['messages']
|
201
|
+
|
194
202
|
message_set |= json['messages']
|
195
203
|
end
|
196
204
|
merged_json_result['messages'] = message_set.to_a
|
@@ -199,6 +207,7 @@ module PDK
|
|
199
207
|
all_examples = []
|
200
208
|
json_data.each do |json|
|
201
209
|
next unless json['examples']
|
210
|
+
|
202
211
|
all_examples.concat json['examples']
|
203
212
|
end
|
204
213
|
merged_json_result['examples'] = all_examples
|
@@ -207,10 +216,11 @@ module PDK
|
|
207
216
|
summary_hash = {
|
208
217
|
'example_count' => 0,
|
209
218
|
'failure_count' => 0,
|
210
|
-
'pending_count' => 0
|
219
|
+
'pending_count' => 0
|
211
220
|
}
|
212
221
|
json_data.each do |json|
|
213
222
|
next unless json['summary']
|
223
|
+
|
214
224
|
summary_hash['example_count'] += json['summary']['example_count']
|
215
225
|
summary_hash['failure_count'] += json['summary']['failure_count']
|
216
226
|
summary_hash['pending_count'] += json['summary']['pending_count']
|
@@ -233,12 +243,13 @@ module PDK
|
|
233
243
|
output = rake('spec_list_json', 'Finding unit tests.', environment)
|
234
244
|
|
235
245
|
rspec_json = PDK::Util.find_first_json_in(output[:stdout])
|
236
|
-
raise PDK::CLI::FatalError, 'Failed to find valid JSON in output from rspec: %{output}'
|
246
|
+
raise PDK::CLI::FatalError, format('Failed to find valid JSON in output from rspec: %{output}', output: output[:stdout]) unless rspec_json
|
247
|
+
|
237
248
|
if rspec_json['examples'].empty?
|
238
249
|
rspec_message = rspec_json['messages'][0]
|
239
250
|
return [] if rspec_message == 'No examples found.'
|
240
251
|
|
241
|
-
raise PDK::CLI::FatalError, 'Unable to enumerate examples. rspec reported: %{message}'
|
252
|
+
raise PDK::CLI::FatalError, format('Unable to enumerate examples. rspec reported: %{message}', message: rspec_message)
|
242
253
|
else
|
243
254
|
examples = []
|
244
255
|
rspec_json['examples'].each do |example|
|
data/lib/pdk/util/bundler.rb
CHANGED
@@ -3,9 +3,9 @@ require 'pdk'
|
|
3
3
|
module PDK
|
4
4
|
module Util
|
5
5
|
module Bundler
|
6
|
-
class BundleHelper; end
|
6
|
+
# class BundleHelper; end
|
7
7
|
|
8
|
-
def self.ensure_bundle!(gem_overrides =
|
8
|
+
def self.ensure_bundle!(gem_overrides = {})
|
9
9
|
bundle = BundleHelper.new
|
10
10
|
|
11
11
|
# This will default ensure_bundle! to re-resolving everything to latest
|
@@ -17,7 +17,7 @@ module PDK
|
|
17
17
|
end
|
18
18
|
|
19
19
|
unless bundle.gemfile?
|
20
|
-
PDK.logger.debug("No Gemfile found in '%{cwd}'. Skipping bundler management."
|
20
|
+
PDK.logger.debug(format("No Gemfile found in '%{cwd}'. Skipping bundler management.", cwd: Dir.pwd))
|
21
21
|
return
|
22
22
|
end
|
23
23
|
|
@@ -44,9 +44,7 @@ module PDK
|
|
44
44
|
# If there are missing dependencies after updating the lockfile, let `bundle install`
|
45
45
|
# go out and get them. If the specified puppet gem version points to a remote location
|
46
46
|
# or local filepath, then run bundle install as well.
|
47
|
-
if !bundle.installed?(gem_overrides) ||
|
48
|
-
bundle.install!(gem_overrides)
|
49
|
-
end
|
47
|
+
bundle.install!(gem_overrides) if !bundle.installed?(gem_overrides) || gem_overrides[:puppet]&.start_with?('file://', 'git://', 'https://')
|
50
48
|
|
51
49
|
mark_as_bundled!(bundle.gemfile, gem_overrides)
|
52
50
|
end
|
@@ -81,6 +79,7 @@ module PDK
|
|
81
79
|
|
82
80
|
def gemfile_lock
|
83
81
|
return if gemfile.nil?
|
82
|
+
|
84
83
|
@gemfile_lock ||= File.join(File.dirname(gemfile), 'Gemfile.lock')
|
85
84
|
end
|
86
85
|
|
@@ -115,20 +114,16 @@ module PDK
|
|
115
114
|
# Subsequent 'bundle install' will still pick up any new dependencies.
|
116
115
|
vendored_lockfiles = [
|
117
116
|
File.join(PDK::Util.package_cachedir, "Gemfile-#{PDK::Util::RubyVersion.active_ruby_version}.lock"),
|
118
|
-
File.join(PDK::Util.package_cachedir, 'Gemfile.lock')
|
117
|
+
File.join(PDK::Util.package_cachedir, 'Gemfile.lock')
|
119
118
|
]
|
120
119
|
|
121
120
|
vendored_gemfile_lock = vendored_lockfiles.find do |lockfile|
|
122
121
|
PDK::Util::Filesystem.exist?(lockfile)
|
123
122
|
end
|
124
123
|
|
125
|
-
unless vendored_gemfile_lock
|
126
|
-
raise PDK::CLI::FatalError, 'Vendored Gemfile.lock (%{source}) not found.' % {
|
127
|
-
source: vendored_gemfile_lock,
|
128
|
-
}
|
129
|
-
end
|
124
|
+
raise PDK::CLI::FatalError, format('Vendored Gemfile.lock (%{source}) not found.', source: vendored_gemfile_lock) unless vendored_gemfile_lock
|
130
125
|
|
131
|
-
PDK.logger.debug('Using vendored Gemfile.lock from %{source}.'
|
126
|
+
PDK.logger.debug(format('Using vendored Gemfile.lock from %{source}.', source: vendored_gemfile_lock))
|
132
127
|
PDK::Util::Filesystem.cp(vendored_gemfile_lock, File.join(PDK::Util.module_root, 'Gemfile.lock'))
|
133
128
|
else
|
134
129
|
argv = ['lock']
|
@@ -211,6 +206,7 @@ module PDK
|
|
211
206
|
|
212
207
|
def binstubs!(gems)
|
213
208
|
raise PDK::CLI::FatalError, 'Unable to install requested binstubs as the Gemfile is missing' if gemfile.nil?
|
209
|
+
|
214
210
|
binstub_dir = File.join(File.dirname(gemfile), 'bin')
|
215
211
|
return true if gems.all? { |gem| PDK::Util::Filesystem.file?(File.join(binstub_dir, gem)) }
|
216
212
|
|
@@ -218,7 +214,7 @@ module PDK
|
|
218
214
|
result = cmd.execute!
|
219
215
|
|
220
216
|
unless result[:exit_code].zero?
|
221
|
-
PDK.logger.fatal("Failed to generate binstubs for '%{gems}':\n%{output}"
|
217
|
+
PDK.logger.fatal(format("Failed to generate binstubs for '%{gems}':\n%{output}", gems: gems.join(' '), output: result.values_at(:stdout, :stderr).join("\n"))) unless PDK.logger.debug?
|
222
218
|
raise PDK::CLI::FatalError, 'Unable to install requested binstubs.'
|
223
219
|
end
|
224
220
|
|
@@ -4,7 +4,7 @@ module PDK
|
|
4
4
|
module Util
|
5
5
|
module ChangelogGenerator
|
6
6
|
# Taken from the version regex in https://forgeapi.puppet.com/schemas/module.json
|
7
|
-
VERSION_REGEX =
|
7
|
+
VERSION_REGEX = /^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(-(0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(\.(0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*)?(\+[0-9a-zA-Z-]+(\.[0-9a-zA-Z-]+)*)?$/.freeze
|
8
8
|
GEM = 'github_changelog_generator'.freeze
|
9
9
|
|
10
10
|
# Raises if the github_changelog_generator is not available
|
@@ -16,7 +16,7 @@ module PDK
|
|
16
16
|
|
17
17
|
return if result[:exit_code].zero?
|
18
18
|
|
19
|
-
raise PDK::CLI::ExitWithError, 'Unable to generate the changelog as the %{gem} gem is not included in this module\'s Gemfile'
|
19
|
+
raise PDK::CLI::ExitWithError, format('Unable to generate the changelog as the %{gem} gem is not included in this module\'s Gemfile', gem: GEM)
|
20
20
|
end
|
21
21
|
|
22
22
|
# Runs the Changelog Generator gem (in the module's context) to automatically create a CHANGLELOG.MD file
|
@@ -29,11 +29,12 @@ module PDK
|
|
29
29
|
changelog_command.context = :module
|
30
30
|
|
31
31
|
result = changelog_command.execute!
|
32
|
-
raise PDK::CLI::ExitWithError, 'Error generating changelog: %{stdout}'
|
32
|
+
raise PDK::CLI::ExitWithError, format('Error generating changelog: %{stdout}', stdout: result[:stdout]) unless result[:exit_code].zero?
|
33
33
|
|
34
34
|
output = changelog_content
|
35
35
|
|
36
|
-
raise PDK::CLI::ExitWithError, 'The generated changelog contains uncategorized Pull Requests. Please label them and try again. See %{changelog_file} for more details'
|
36
|
+
raise PDK::CLI::ExitWithError, format('The generated changelog contains uncategorized Pull Requests. Please label them and try again. See %{changelog_file} for more details', changelog_file: changelog_file) if output.include?('UNCATEGORIZED PRS; GO LABEL THEM') # rubocop:disable Metrics/LineLength
|
37
|
+
|
37
38
|
output
|
38
39
|
end
|
39
40
|
|
@@ -42,9 +43,10 @@ module PDK
|
|
42
43
|
# @param current_version [String, Gem::Version] The current version of the module
|
43
44
|
# @return [String] The new version. May be the same as the current version if there are no notable changes
|
44
45
|
def self.compute_next_version(current_version)
|
45
|
-
raise PDK::CLI::ExitWithError, 'Invalid version string %{version}'
|
46
|
+
raise PDK::CLI::ExitWithError, format('Invalid version string %{version}', version: current_version) unless VERSION_REGEX.match?(current_version)
|
47
|
+
|
46
48
|
version = Gem::Version.create(current_version).segments
|
47
|
-
PDK.logger.info 'Determing the target version from \'%{file}\''
|
49
|
+
PDK.logger.info format('Determing the target version from \'%{file}\'', file: changelog_file)
|
48
50
|
|
49
51
|
# Grab all lines that start with ## between from the latest changes
|
50
52
|
# For example given the changelog below
|
@@ -83,24 +85,24 @@ module PDK
|
|
83
85
|
if line.start_with?('[')
|
84
86
|
# We're leaving the latest changes so we can break
|
85
87
|
break if in_changelog_entry
|
88
|
+
|
86
89
|
in_changelog_entry = true
|
87
90
|
end
|
88
|
-
if in_changelog_entry && line.start_with?('##')
|
89
|
-
data += line
|
90
|
-
end
|
91
|
+
data += line if in_changelog_entry && line.start_with?('##')
|
91
92
|
end
|
92
93
|
|
93
94
|
# Check for meta headers in first two header line matches
|
94
|
-
|
95
|
+
case data
|
96
|
+
when /^### Changed/
|
95
97
|
# Major Version bump
|
96
98
|
version[0] += 1
|
97
99
|
version[1] = 0
|
98
100
|
version[2] = 0
|
99
|
-
|
101
|
+
when /^### Added/
|
100
102
|
# Minor Version bump
|
101
103
|
version[1] += 1
|
102
104
|
version[2] = 0
|
103
|
-
|
105
|
+
when /^### Fixed/
|
104
106
|
# Patch Version bump
|
105
107
|
version[2] += 1
|
106
108
|
end
|
@@ -128,6 +130,7 @@ module PDK
|
|
128
130
|
|
129
131
|
def self.changelog_content
|
130
132
|
return '' if changelog_file.nil?
|
133
|
+
|
131
134
|
PDK::Util::Filesystem.read_file(changelog_file, open_args: 'rb:utf-8')
|
132
135
|
end
|
133
136
|
end
|
data/lib/pdk/util/env.rb
CHANGED
data/lib/pdk/util/filesystem.rb
CHANGED
@@ -14,19 +14,20 @@ module PDK
|
|
14
14
|
# Make sure all written files have a trailing newline.
|
15
15
|
content += "\n" unless content[-1] == "\n"
|
16
16
|
|
17
|
-
File.
|
17
|
+
File.binwrite(path, content)
|
18
18
|
end
|
19
19
|
module_function :write_file
|
20
20
|
|
21
21
|
def read_file(file, nil_on_error: false, open_args: 'r')
|
22
22
|
File.read(file, open_args: Array(open_args))
|
23
|
-
rescue => e
|
23
|
+
rescue StandardError => e
|
24
24
|
raise e unless nil_on_error
|
25
|
+
|
25
26
|
nil
|
26
27
|
end
|
27
28
|
module_function :read_file
|
28
29
|
|
29
|
-
|
30
|
+
# :nocov:
|
30
31
|
# These methods just wrap core Ruby functionality and
|
31
32
|
# can be ignored for code coverage
|
32
33
|
def directory?(*args)
|
@@ -34,8 +35,8 @@ module PDK
|
|
34
35
|
end
|
35
36
|
module_function :directory?
|
36
37
|
|
37
|
-
def mkdir_p(*args)
|
38
|
-
FileUtils.mkdir_p(*args)
|
38
|
+
def mkdir_p(*args, **kwargs)
|
39
|
+
FileUtils.mkdir_p(*args, **kwargs)
|
39
40
|
end
|
40
41
|
module_function :mkdir_p
|
41
42
|
|
@@ -74,18 +75,18 @@ module PDK
|
|
74
75
|
end
|
75
76
|
module_function :exist?
|
76
77
|
|
77
|
-
def rm(*args)
|
78
|
-
FileUtils.rm(*args)
|
78
|
+
def rm(*args, **kwargs)
|
79
|
+
FileUtils.rm(*args, **kwargs)
|
79
80
|
end
|
80
81
|
module_function :rm
|
81
82
|
|
82
|
-
def rm_f(*args)
|
83
|
-
FileUtils.rm_f(*args)
|
83
|
+
def rm_f(*args, **kwargs)
|
84
|
+
FileUtils.rm_f(*args, **kwargs)
|
84
85
|
end
|
85
86
|
module_function :rm_f
|
86
87
|
|
87
|
-
def rm_rf(*args)
|
88
|
-
FileUtils.rm_rf(*args)
|
88
|
+
def rm_rf(*args, **kwargs)
|
89
|
+
FileUtils.rm_rf(*args, **kwargs)
|
89
90
|
end
|
90
91
|
module_function :rm_rf
|
91
92
|
|
@@ -95,7 +96,7 @@ module PDK
|
|
95
96
|
module_function :remove_entry_secure
|
96
97
|
|
97
98
|
def zero?(*args)
|
98
|
-
File.
|
99
|
+
File.empty?(*args)
|
99
100
|
end
|
100
101
|
module_function :zero?
|
101
102
|
|
@@ -109,13 +110,13 @@ module PDK
|
|
109
110
|
end
|
110
111
|
module_function :symlink?
|
111
112
|
|
112
|
-
def cp(*args)
|
113
|
-
FileUtils.cp(*args)
|
113
|
+
def cp(*args, **kwargs)
|
114
|
+
FileUtils.cp(*args, **kwargs)
|
114
115
|
end
|
115
116
|
module_function :cp
|
116
117
|
|
117
|
-
def mv(*args)
|
118
|
-
FileUtils.mv(*args)
|
118
|
+
def mv(*args, **kwargs)
|
119
|
+
FileUtils.mv(*args, **kwargs)
|
119
120
|
rescue Errno::ENOENT
|
120
121
|
# PDK-1169 - FileUtils.mv raises Errno::ENOENT when moving files inside
|
121
122
|
# VMWare shared folders on Windows. So we need to catch this
|
@@ -132,7 +133,7 @@ module PDK
|
|
132
133
|
end
|
133
134
|
end
|
134
135
|
module_function :mv
|
135
|
-
|
136
|
+
# :nocov:
|
136
137
|
end
|
137
138
|
end
|
138
139
|
end
|