pdk 1.16.0 → 1.17.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.
Files changed (68) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +24 -0
  3. data/lib/pdk.rb +25 -18
  4. data/lib/pdk/answer_file.rb +2 -93
  5. data/lib/pdk/cli.rb +1 -5
  6. data/lib/pdk/cli/config.rb +3 -1
  7. data/lib/pdk/cli/config/get.rb +3 -1
  8. data/lib/pdk/cli/convert.rb +1 -1
  9. data/lib/pdk/cli/exec/command.rb +13 -0
  10. data/lib/pdk/cli/exec_group.rb +78 -43
  11. data/lib/pdk/cli/get.rb +20 -0
  12. data/lib/pdk/cli/get/config.rb +24 -0
  13. data/lib/pdk/cli/util.rb +6 -3
  14. data/lib/pdk/cli/validate.rb +26 -44
  15. data/lib/pdk/config.rb +178 -4
  16. data/lib/pdk/config/ini_file.rb +183 -0
  17. data/lib/pdk/config/ini_file_setting.rb +39 -0
  18. data/lib/pdk/config/namespace.rb +25 -5
  19. data/lib/pdk/config/setting.rb +3 -2
  20. data/lib/pdk/context.rb +96 -0
  21. data/lib/pdk/context/control_repo.rb +60 -0
  22. data/lib/pdk/context/module.rb +28 -0
  23. data/lib/pdk/context/none.rb +22 -0
  24. data/lib/pdk/control_repo.rb +40 -0
  25. data/lib/pdk/generate/module.rb +8 -12
  26. data/lib/pdk/module/release.rb +2 -8
  27. data/lib/pdk/util.rb +35 -5
  28. data/lib/pdk/util/bundler.rb +1 -0
  29. data/lib/pdk/util/changelog_generator.rb +6 -1
  30. data/lib/pdk/util/template_uri.rb +4 -3
  31. data/lib/pdk/validate.rb +72 -25
  32. data/lib/pdk/validate/external_command_validator.rb +208 -0
  33. data/lib/pdk/validate/internal_ruby_validator.rb +100 -0
  34. data/lib/pdk/validate/invokable_validator.rb +216 -0
  35. data/lib/pdk/validate/metadata/metadata_json_lint_validator.rb +86 -0
  36. data/lib/pdk/validate/metadata/metadata_syntax_validator.rb +78 -0
  37. data/lib/pdk/validate/metadata/metadata_validator_group.rb +20 -0
  38. data/lib/pdk/validate/puppet/puppet_epp_validator.rb +133 -0
  39. data/lib/pdk/validate/puppet/puppet_lint_validator.rb +66 -0
  40. data/lib/pdk/validate/puppet/puppet_syntax_validator.rb +137 -0
  41. data/lib/pdk/validate/puppet/puppet_validator_group.rb +21 -0
  42. data/lib/pdk/validate/ruby/ruby_rubocop_validator.rb +80 -0
  43. data/lib/pdk/validate/ruby/ruby_validator_group.rb +19 -0
  44. data/lib/pdk/validate/tasks/tasks_metadata_lint_validator.rb +88 -0
  45. data/lib/pdk/validate/tasks/tasks_name_validator.rb +50 -0
  46. data/lib/pdk/validate/tasks/tasks_validator_group.rb +20 -0
  47. data/lib/pdk/validate/validator.rb +111 -0
  48. data/lib/pdk/validate/validator_group.rb +103 -0
  49. data/lib/pdk/validate/yaml/yaml_syntax_validator.rb +95 -0
  50. data/lib/pdk/validate/yaml/yaml_validator_group.rb +19 -0
  51. data/lib/pdk/version.rb +1 -1
  52. data/locales/pdk.pot +161 -125
  53. metadata +29 -17
  54. data/lib/pdk/validate/base_validator.rb +0 -215
  55. data/lib/pdk/validate/metadata/metadata_json_lint.rb +0 -82
  56. data/lib/pdk/validate/metadata/metadata_syntax.rb +0 -111
  57. data/lib/pdk/validate/metadata_validator.rb +0 -26
  58. data/lib/pdk/validate/puppet/puppet_epp.rb +0 -135
  59. data/lib/pdk/validate/puppet/puppet_lint.rb +0 -64
  60. data/lib/pdk/validate/puppet/puppet_syntax.rb +0 -135
  61. data/lib/pdk/validate/puppet_validator.rb +0 -26
  62. data/lib/pdk/validate/ruby/rubocop.rb +0 -72
  63. data/lib/pdk/validate/ruby_validator.rb +0 -26
  64. data/lib/pdk/validate/tasks/metadata_lint.rb +0 -130
  65. data/lib/pdk/validate/tasks/name.rb +0 -90
  66. data/lib/pdk/validate/tasks_validator.rb +0 -29
  67. data/lib/pdk/validate/yaml/syntax.rb +0 -125
  68. data/lib/pdk/validate/yaml_validator.rb +0 -28
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pdk
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.16.0
4
+ version: 1.17.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Puppet, Inc.
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-02-05 00:00:00.000000000 Z
11
+ date: 2020-02-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -299,6 +299,8 @@ files:
299
299
  - lib/pdk/cli/exec/command.rb
300
300
  - lib/pdk/cli/exec/interactive_command.rb
301
301
  - lib/pdk/cli/exec_group.rb
302
+ - lib/pdk/cli/get.rb
303
+ - lib/pdk/cli/get/config.rb
302
304
  - lib/pdk/cli/module.rb
303
305
  - lib/pdk/cli/module/build.rb
304
306
  - lib/pdk/cli/module/generate.rb
@@ -326,6 +328,8 @@ files:
326
328
  - lib/pdk/config.rb
327
329
  - lib/pdk/config/analytics_schema.json
328
330
  - lib/pdk/config/errors.rb
331
+ - lib/pdk/config/ini_file.rb
332
+ - lib/pdk/config/ini_file_setting.rb
329
333
  - lib/pdk/config/json.rb
330
334
  - lib/pdk/config/json_schema_namespace.rb
331
335
  - lib/pdk/config/json_schema_setting.rb
@@ -335,6 +339,10 @@ files:
335
339
  - lib/pdk/config/validator.rb
336
340
  - lib/pdk/config/yaml.rb
337
341
  - lib/pdk/config/yaml_with_schema.rb
342
+ - lib/pdk/context.rb
343
+ - lib/pdk/context/control_repo.rb
344
+ - lib/pdk/context/module.rb
345
+ - lib/pdk/context/none.rb
338
346
  - lib/pdk/control_repo.rb
339
347
  - lib/pdk/generate.rb
340
348
  - lib/pdk/generate/defined_type.rb
@@ -379,21 +387,25 @@ files:
379
387
  - lib/pdk/util/windows/process.rb
380
388
  - lib/pdk/util/windows/string.rb
381
389
  - lib/pdk/validate.rb
382
- - lib/pdk/validate/base_validator.rb
383
- - lib/pdk/validate/metadata/metadata_json_lint.rb
384
- - lib/pdk/validate/metadata/metadata_syntax.rb
385
- - lib/pdk/validate/metadata_validator.rb
386
- - lib/pdk/validate/puppet/puppet_epp.rb
387
- - lib/pdk/validate/puppet/puppet_lint.rb
388
- - lib/pdk/validate/puppet/puppet_syntax.rb
389
- - lib/pdk/validate/puppet_validator.rb
390
- - lib/pdk/validate/ruby/rubocop.rb
391
- - lib/pdk/validate/ruby_validator.rb
392
- - lib/pdk/validate/tasks/metadata_lint.rb
393
- - lib/pdk/validate/tasks/name.rb
394
- - lib/pdk/validate/tasks_validator.rb
395
- - lib/pdk/validate/yaml/syntax.rb
396
- - lib/pdk/validate/yaml_validator.rb
390
+ - lib/pdk/validate/external_command_validator.rb
391
+ - lib/pdk/validate/internal_ruby_validator.rb
392
+ - lib/pdk/validate/invokable_validator.rb
393
+ - lib/pdk/validate/metadata/metadata_json_lint_validator.rb
394
+ - lib/pdk/validate/metadata/metadata_syntax_validator.rb
395
+ - lib/pdk/validate/metadata/metadata_validator_group.rb
396
+ - lib/pdk/validate/puppet/puppet_epp_validator.rb
397
+ - lib/pdk/validate/puppet/puppet_lint_validator.rb
398
+ - lib/pdk/validate/puppet/puppet_syntax_validator.rb
399
+ - lib/pdk/validate/puppet/puppet_validator_group.rb
400
+ - lib/pdk/validate/ruby/ruby_rubocop_validator.rb
401
+ - lib/pdk/validate/ruby/ruby_validator_group.rb
402
+ - lib/pdk/validate/tasks/tasks_metadata_lint_validator.rb
403
+ - lib/pdk/validate/tasks/tasks_name_validator.rb
404
+ - lib/pdk/validate/tasks/tasks_validator_group.rb
405
+ - lib/pdk/validate/validator.rb
406
+ - lib/pdk/validate/validator_group.rb
407
+ - lib/pdk/validate/yaml/yaml_syntax_validator.rb
408
+ - lib/pdk/validate/yaml/yaml_validator_group.rb
397
409
  - lib/pdk/version.rb
398
410
  - locales/config.yaml
399
411
  - locales/pdk.pot
@@ -1,215 +0,0 @@
1
- require 'pdk'
2
-
3
- module PDK
4
- module Validate
5
- class BaseValidator
6
- # Controls how many times the validator is invoked.
7
- #
8
- # :once - The validator will be invoked once and passed all the
9
- # targets.
10
- # :per_target - The validator will be invoked for each target
11
- # separately.
12
- INVOKE_STYLE = :once
13
-
14
- # Controls how the validator behaves if not passed any targets.
15
- #
16
- # true - PDK will not pass the globbed targets to the validator command
17
- # and it will instead rely on the underlying tool to find its
18
- # own default targets.
19
- # false - PDK will pass the globbed targets to the validator command.
20
- ALLOW_EMPTY_TARGETS = false
21
-
22
- IGNORE_DOTFILES = true
23
-
24
- def self.cmd_path
25
- File.join(PDK::Util.module_root, 'bin', cmd)
26
- end
27
-
28
- # Parses the target strings provided from the CLI
29
- #
30
- # @param options [Hash] A Hash containing the input options from the CLI.
31
- #
32
- # @return targets [Array] An Array of Strings containing target file paths
33
- # for the validator to validate.
34
- # @return skipped [Array] An Array of Strings containing targets
35
- # that are skipped due to target not containing
36
- # any files that can be validated by the validator.
37
- # @return invalid [Array] An Array of Strings containing targets that do
38
- # not exist, and will not be run by validator.
39
- def self.parse_targets(options)
40
- # If no targets are specified, then we will run validations from the
41
- # base module directory.
42
-
43
- targets = options.fetch(:targets, []).empty? ? [PDK::Util.module_root] : options[:targets]
44
-
45
- targets.map! { |r| r.gsub(File::ALT_SEPARATOR, File::SEPARATOR) } if File::ALT_SEPARATOR
46
- skipped = []
47
- invalid = []
48
- matched = targets.map { |target|
49
- if respond_to?(:pattern)
50
- if PDK::Util::Filesystem.directory?(target)
51
- target_root = PDK::Util.module_root
52
- pattern_glob = Array(pattern).map { |p| PDK::Util::Filesystem.glob(File.join(target_root, p), File::FNM_DOTMATCH) }
53
- target_list = pattern_glob.flatten
54
- .select { |glob| PDK::Util::Filesystem.fnmatch(File.join(PDK::Util::Filesystem.expand_path(PDK::Util.canonical_path(target)), '*'), glob, File::FNM_DOTMATCH) }
55
- .map { |glob| Pathname.new(glob).relative_path_from(Pathname.new(PDK::Util.module_root)).to_s }
56
-
57
- ignore_list = ignore_pathspec
58
- target_list = target_list.reject { |file| ignore_list.match(file) }
59
-
60
- skipped << target if target_list.flatten.empty?
61
- target_list
62
- elsif PDK::Util::Filesystem.file?(target)
63
- if Array(pattern).include? target
64
- target
65
- elsif Array(pattern).any? { |p| PDK::Util::Filesystem.fnmatch(PDK::Util::Filesystem.expand_path(p), PDK::Util::Filesystem.expand_path(target), File::FNM_DOTMATCH) }
66
- target
67
- else
68
- skipped << target
69
- next
70
- end
71
- else
72
- invalid << target
73
- next
74
- end
75
- else
76
- target
77
- end
78
- }.compact.flatten
79
- [matched, skipped, invalid]
80
- end
81
-
82
- def self.ignore_pathspec
83
- require 'pdk/module'
84
-
85
- ignore_pathspec = PDK::Module.default_ignored_pathspec(ignore_dotfiles?)
86
-
87
- if respond_to?(:pattern_ignore)
88
- Array(pattern_ignore).each do |pattern|
89
- ignore_pathspec.add(pattern)
90
- end
91
- end
92
-
93
- ignore_pathspec
94
- end
95
-
96
- def self.ignore_dotfiles?
97
- self::IGNORE_DOTFILES
98
- end
99
-
100
- def self.parse_options(_options, targets)
101
- targets
102
- end
103
-
104
- def self.spinner_text(_targets = nil)
105
- _('Invoking %{cmd}') % { cmd: cmd }
106
- end
107
-
108
- def self.process_skipped(report, skipped = [])
109
- skipped.each do |skipped_target|
110
- PDK.logger.debug(_('%{validator}: Skipped \'%{target}\'. Target does not contain any files to validate (%{pattern}).') % { validator: name, target: skipped_target, pattern: pattern })
111
- report.add_event(
112
- file: skipped_target,
113
- source: name,
114
- message: _('Target does not contain any files to validate (%{pattern}).') % { pattern: pattern },
115
- severity: :info,
116
- state: :skipped,
117
- )
118
- end
119
- end
120
-
121
- def self.process_invalid(report, invalid = [])
122
- invalid.each do |invalid_target|
123
- PDK.logger.debug(_('%{validator}: Skipped \'%{target}\'. Target file not found.') % { validator: name, target: invalid_target })
124
- report.add_event(
125
- file: invalid_target,
126
- source: name,
127
- message: _('File does not exist.'),
128
- severity: :error,
129
- state: :error,
130
- )
131
- end
132
- end
133
-
134
- def self.allow_empty_targets?
135
- self::ALLOW_EMPTY_TARGETS == true
136
- end
137
-
138
- def self.invoke(report, options = {})
139
- require 'pdk/cli/exec/command'
140
-
141
- targets, skipped, invalid = parse_targets(options)
142
-
143
- process_skipped(report, skipped)
144
- process_invalid(report, invalid)
145
-
146
- return 0 if targets.empty?
147
-
148
- PDK::Util::Bundler.ensure_binstubs!(cmd)
149
-
150
- # If invoking :per_target, split the targets array into an array of
151
- # single element arrays (one per target). If invoking :once, wrap the
152
- # targets array in another array. This is so we can loop through the
153
- # invokes with the same logic, regardless of which invoke style is
154
- # needed.
155
- #
156
- if self::INVOKE_STYLE == :per_target
157
- targets = targets.combination(1).to_a
158
- else
159
- require 'pdk/cli/exec_group'
160
- targets = targets.each_slice(1000).to_a
161
- options[:split_exec] = PDK::CLI::ExecGroup.new(spinner_text(targets), parallel: false)
162
- end
163
-
164
- if options.fetch(:targets, []).empty? && allow_empty_targets?
165
- targets = [[]]
166
- end
167
-
168
- exit_codes = []
169
-
170
- targets.each do |invokation_targets|
171
- cmd_argv = parse_options(options, invokation_targets).unshift(cmd_path).compact
172
- cmd_argv.unshift(File.join(PDK::Util::RubyVersion.bin_path, 'ruby.exe'), '-W0') if Gem.win_platform?
173
-
174
- command = PDK::CLI::Exec::Command.new(*cmd_argv).tap do |c|
175
- c.context = :module
176
- c.environment = { 'PUPPET_GEM_VERSION' => options[:puppet] } if options[:puppet]
177
- unless options[:split_exec]
178
- exec_group = options[:exec_group]
179
- if exec_group
180
- sub_spinner = exec_group.add_spinner(spinner_text(invokation_targets))
181
- c.register_spinner(sub_spinner)
182
- else
183
- c.add_spinner(spinner_text(invokation_targets))
184
- end
185
- end
186
- end
187
-
188
- if options[:split_exec]
189
- options[:split_exec].register do
190
- result = command.execute!
191
-
192
- begin
193
- parse_output(report, result, invokation_targets.compact)
194
- rescue PDK::Validate::ParseOutputError => e
195
- $stderr.puts e.message
196
- end
197
- result[:exit_code]
198
- end
199
- else
200
- result = command.execute!
201
- exit_codes << result[:exit_code]
202
-
203
- begin
204
- parse_output(report, result, invokation_targets.compact)
205
- rescue PDK::Validate::ParseOutputError => e
206
- $stderr.puts e.message
207
- end
208
- end
209
- end
210
-
211
- options.key?(:split_exec) ? options[:split_exec].exit_code : exit_codes.max
212
- end
213
- end
214
- end
215
- end
@@ -1,82 +0,0 @@
1
- require 'pdk'
2
-
3
- module PDK
4
- module Validate
5
- class MetadataJSONLint < BaseValidator
6
- # Validate each metadata file separately, as metadata-json-lint does not
7
- # support multiple targets.
8
- INVOKE_STYLE = :per_target
9
-
10
- def self.name
11
- 'metadata-json-lint'
12
- end
13
-
14
- def self.cmd
15
- 'metadata-json-lint'
16
- end
17
-
18
- def self.spinner_text(targets = [])
19
- _('Checking module metadata style (%{targets}).') % {
20
- targets: PDK::Util.targets_relative_to_pwd(targets).join(' '),
21
- }
22
- end
23
-
24
- def self.pattern
25
- 'metadata.json'
26
- end
27
-
28
- def self.parse_options(_options, targets)
29
- cmd_options = ['--format', 'json']
30
- cmd_options << '--strict-dependencies'
31
-
32
- cmd_options.concat(targets)
33
- end
34
-
35
- def self.parse_output(report, result, targets)
36
- raise ArgumentError, _('More than 1 target provided to PDK::Validate::MetadataJSONLint.') if targets.count > 1
37
-
38
- if result[:stdout].strip.empty?
39
- # metadata-json-lint will print nothing if there are no problems with
40
- # the file being linted. This should be handled separately to
41
- # metadata-json-lint generating output that can not be parsed as JSON
42
- # (unhandled exception in metadata-json-lint).
43
- json_data = {}
44
- else
45
- begin
46
- json_data = JSON.parse(result[:stdout])
47
- rescue JSON::ParserError
48
- raise PDK::Validate::ParseOutputError, result[:stdout]
49
- end
50
- end
51
-
52
- if json_data.empty?
53
- report.add_event(
54
- file: targets.first,
55
- source: name,
56
- state: :passed,
57
- severity: :ok,
58
- )
59
- else
60
- json_data.delete('result')
61
- json_data.keys.each do |type|
62
- json_data[type].each do |offense|
63
- # metadata-json-lint groups the offenses by type, so the type ends
64
- # up being `warnings` or `errors`. We want to convert that to the
65
- # singular noun for the event.
66
- event_type = type[%r{\A(.+?)s?\Z}, 1]
67
-
68
- report.add_event(
69
- file: targets.first,
70
- source: name,
71
- message: offense['msg'],
72
- test: offense['check'],
73
- severity: event_type,
74
- state: :failure,
75
- )
76
- end
77
- end
78
- end
79
- end
80
- end
81
- end
82
- end
@@ -1,111 +0,0 @@
1
- require 'pdk'
2
-
3
- module PDK
4
- module Validate
5
- class MetadataSyntax < BaseValidator
6
- def self.name
7
- 'metadata-syntax'
8
- end
9
-
10
- def self.pattern
11
- ['metadata.json', 'tasks/*.json']
12
- end
13
-
14
- def self.spinner_text(_targets = [])
15
- _('Checking metadata syntax (%{targets}).') % {
16
- targets: pattern.join(' '),
17
- }
18
- end
19
-
20
- def self.create_spinner(targets = [], options = {})
21
- require 'pdk/cli/util'
22
-
23
- return unless PDK::CLI::Util.interactive?
24
-
25
- options = options.merge(PDK::CLI::Util.spinner_opts_for_platform)
26
-
27
- exec_group = options[:exec_group]
28
- @spinner = if exec_group
29
- exec_group.add_spinner(spinner_text(targets), options)
30
- else
31
- require 'pdk/cli/util/spinner'
32
-
33
- TTY::Spinner.new("[:spinner] #{spinner_text(targets)}", options)
34
- end
35
- @spinner.auto_spin
36
- end
37
-
38
- def self.stop_spinner(exit_code)
39
- if exit_code.zero? && @spinner
40
- @spinner.success
41
- elsif @spinner
42
- @spinner.error
43
- end
44
- end
45
-
46
- def self.invoke(report, options = {})
47
- targets, skipped, invalid = parse_targets(options)
48
-
49
- process_skipped(report, skipped)
50
- process_invalid(report, invalid)
51
-
52
- return 0 if targets.empty?
53
-
54
- return_val = 0
55
- create_spinner(targets, options)
56
-
57
- # The pure ruby JSON parser gives much nicer parse error messages than
58
- # the C extension at the cost of slightly slower parsing. We require it
59
- # here and restore the C extension at the end of the method (if it was
60
- # being used).
61
- require 'json/pure'
62
- JSON.parser = JSON::Pure::Parser
63
-
64
- targets.each do |target|
65
- unless PDK::Util::Filesystem.readable?(target)
66
- report.add_event(
67
- file: target,
68
- source: name,
69
- state: :failure,
70
- severity: 'error',
71
- message: _('Could not be read.'),
72
- )
73
- return_val = 1
74
- next
75
- end
76
-
77
- begin
78
- JSON.parse(PDK::Util::Filesystem.read_file(target))
79
-
80
- report.add_event(
81
- file: target,
82
- source: name,
83
- state: :passed,
84
- severity: 'ok',
85
- )
86
- rescue JSON::ParserError => e
87
- # Because the message contains a raw segment of the file, we use
88
- # String#dump here to unescape any escape characters like newlines.
89
- # We then strip out the surrounding quotes and the exclaimation
90
- # point that json_pure likes to put in exception messages.
91
- sane_message = e.message.dump[%r{\A"(.+?)!?"\Z}, 1]
92
-
93
- report.add_event(
94
- file: target,
95
- source: name,
96
- state: :failure,
97
- severity: 'error',
98
- message: sane_message,
99
- )
100
- return_val = 1
101
- end
102
- end
103
-
104
- stop_spinner(return_val)
105
- return_val
106
- ensure
107
- JSON.parser = JSON::Ext::Parser if defined?(JSON::Ext::Parser)
108
- end
109
- end
110
- end
111
- end