pdk 2.7.1 → 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (144) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +25 -0
  3. data/README.md +2 -48
  4. data/lib/pdk/analytics/client/google_analytics.rb +22 -26
  5. data/lib/pdk/analytics/util.rb +0 -1
  6. data/lib/pdk/analytics.rb +1 -1
  7. data/lib/pdk/bolt.rb +1 -0
  8. data/lib/pdk/cli/build.rb +53 -56
  9. data/lib/pdk/cli/bundle.rb +34 -33
  10. data/lib/pdk/cli/console.rb +136 -134
  11. data/lib/pdk/cli/convert.rb +39 -41
  12. data/lib/pdk/cli/env.rb +49 -47
  13. data/lib/pdk/cli/errors.rb +1 -2
  14. data/lib/pdk/cli/exec/command.rb +23 -29
  15. data/lib/pdk/cli/exec/interactive_command.rb +7 -12
  16. data/lib/pdk/cli/exec.rb +4 -11
  17. data/lib/pdk/cli/exec_group.rb +3 -2
  18. data/lib/pdk/cli/get/config.rb +21 -19
  19. data/lib/pdk/cli/get.rb +15 -13
  20. data/lib/pdk/cli/new/class.rb +22 -22
  21. data/lib/pdk/cli/new/defined_type.rb +22 -22
  22. data/lib/pdk/cli/new/fact.rb +19 -19
  23. data/lib/pdk/cli/new/function.rb +20 -20
  24. data/lib/pdk/cli/new/module.rb +40 -38
  25. data/lib/pdk/cli/new/provider.rb +19 -19
  26. data/lib/pdk/cli/new/task.rb +23 -23
  27. data/lib/pdk/cli/new/test.rb +50 -48
  28. data/lib/pdk/cli/new/transport.rb +18 -18
  29. data/lib/pdk/cli/new.rb +11 -9
  30. data/lib/pdk/cli/release/prep.rb +27 -25
  31. data/lib/pdk/cli/release/publish.rb +39 -37
  32. data/lib/pdk/cli/release.rb +152 -149
  33. data/lib/pdk/cli/remove/config.rb +63 -60
  34. data/lib/pdk/cli/remove.rb +15 -13
  35. data/lib/pdk/cli/set/config.rb +91 -89
  36. data/lib/pdk/cli/set.rb +15 -13
  37. data/lib/pdk/cli/test/unit.rb +71 -69
  38. data/lib/pdk/cli/test.rb +9 -7
  39. data/lib/pdk/cli/update.rb +33 -38
  40. data/lib/pdk/cli/util/command_redirector.rb +10 -1
  41. data/lib/pdk/cli/util/interview.rb +11 -4
  42. data/lib/pdk/cli/util/option_normalizer.rb +2 -4
  43. data/lib/pdk/cli/util/option_validator.rb +7 -9
  44. data/lib/pdk/cli/util/update_manager_printer.rb +4 -4
  45. data/lib/pdk/cli/util.rb +32 -48
  46. data/lib/pdk/cli/validate.rb +98 -96
  47. data/lib/pdk/cli.rb +124 -120
  48. data/lib/pdk/config/ini_file.rb +4 -3
  49. data/lib/pdk/config/ini_file_setting.rb +6 -10
  50. data/lib/pdk/config/json.rb +1 -0
  51. data/lib/pdk/config/json_schema_namespace.rb +5 -10
  52. data/lib/pdk/config/json_schema_setting.rb +3 -5
  53. data/lib/pdk/config/json_with_schema.rb +2 -4
  54. data/lib/pdk/config/namespace.rb +19 -13
  55. data/lib/pdk/config/setting.rb +5 -6
  56. data/lib/pdk/config/task_schema.json +116 -0
  57. data/lib/pdk/config/validator.rb +4 -4
  58. data/lib/pdk/config/yaml.rb +3 -8
  59. data/lib/pdk/config/yaml_with_schema.rb +4 -12
  60. data/lib/pdk/config.rb +47 -51
  61. data/lib/pdk/context/control_repo.rb +3 -2
  62. data/lib/pdk/context/module.rb +2 -2
  63. data/lib/pdk/context/none.rb +2 -2
  64. data/lib/pdk/context.rb +4 -5
  65. data/lib/pdk/control_repo.rb +3 -4
  66. data/lib/pdk/generate/defined_type.rb +3 -3
  67. data/lib/pdk/generate/fact.rb +3 -2
  68. data/lib/pdk/generate/function.rb +5 -4
  69. data/lib/pdk/generate/module.rb +91 -106
  70. data/lib/pdk/generate/provider.rb +5 -4
  71. data/lib/pdk/generate/puppet_class.rb +3 -3
  72. data/lib/pdk/generate/puppet_object.rb +9 -12
  73. data/lib/pdk/generate/task.rb +11 -10
  74. data/lib/pdk/generate/transport.rb +8 -7
  75. data/lib/pdk/generate.rb +1 -1
  76. data/lib/pdk/logger.rb +3 -2
  77. data/lib/pdk/module/build.rb +34 -49
  78. data/lib/pdk/module/convert.rb +13 -22
  79. data/lib/pdk/module/metadata.rb +53 -61
  80. data/lib/pdk/module/release.rb +19 -25
  81. data/lib/pdk/module/update.rb +4 -13
  82. data/lib/pdk/module/update_manager.rb +18 -25
  83. data/lib/pdk/module.rb +1 -1
  84. data/lib/pdk/monkey_patches.rb +268 -0
  85. data/lib/pdk/report/event.rb +12 -37
  86. data/lib/pdk/report.rb +4 -4
  87. data/lib/pdk/template/fetcher/git.rb +7 -8
  88. data/lib/pdk/template/fetcher/local.rb +1 -0
  89. data/lib/pdk/template/fetcher.rb +4 -2
  90. data/lib/pdk/template/renderer/v1/legacy_template_dir.rb +4 -9
  91. data/lib/pdk/template/renderer/v1/renderer.rb +19 -20
  92. data/lib/pdk/template/renderer/v1/template_file.rb +4 -8
  93. data/lib/pdk/template/renderer/v1.rb +1 -1
  94. data/lib/pdk/template/renderer.rb +1 -0
  95. data/lib/pdk/template/template_dir.rb +3 -3
  96. data/lib/pdk/template.rb +2 -6
  97. data/lib/pdk/tests/unit.rb +36 -25
  98. data/lib/pdk/util/bundler.rb +10 -14
  99. data/lib/pdk/util/changelog_generator.rb +15 -12
  100. data/lib/pdk/util/env.rb +1 -0
  101. data/lib/pdk/util/filesystem.rb +18 -17
  102. data/lib/pdk/util/git.rb +16 -21
  103. data/lib/pdk/util/json_finder.rb +7 -6
  104. data/lib/pdk/util/puppet_strings.rb +1 -1
  105. data/lib/pdk/util/puppet_version.rb +16 -67
  106. data/lib/pdk/util/ruby_version.rb +9 -13
  107. data/lib/pdk/util/template_uri.rb +17 -29
  108. data/lib/pdk/util/vendored_file.rb +5 -18
  109. data/lib/pdk/util/windows/api_types.rb +70 -64
  110. data/lib/pdk/util/windows/file.rb +31 -27
  111. data/lib/pdk/util/windows/process.rb +59 -61
  112. data/lib/pdk/util/windows/string.rb +19 -12
  113. data/lib/pdk/util.rb +12 -20
  114. data/lib/pdk/validate/control_repo/control_repo_validator_group.rb +1 -1
  115. data/lib/pdk/validate/control_repo/environment_conf_validator.rb +25 -25
  116. data/lib/pdk/validate/external_command_validator.rb +6 -1
  117. data/lib/pdk/validate/internal_ruby_validator.rb +5 -4
  118. data/lib/pdk/validate/invokable_validator.rb +30 -20
  119. data/lib/pdk/validate/metadata/metadata_json_lint_validator.rb +12 -14
  120. data/lib/pdk/validate/metadata/metadata_syntax_validator.rb +13 -15
  121. data/lib/pdk/validate/metadata/metadata_validator_group.rb +1 -1
  122. data/lib/pdk/validate/puppet/puppet_epp_validator.rb +16 -18
  123. data/lib/pdk/validate/puppet/puppet_lint_validator.rb +14 -14
  124. data/lib/pdk/validate/puppet/puppet_plan_syntax_validator.rb +1 -1
  125. data/lib/pdk/validate/puppet/puppet_syntax_validator.rb +16 -18
  126. data/lib/pdk/validate/puppet/puppet_validator_group.rb +1 -1
  127. data/lib/pdk/validate/ruby/ruby_rubocop_validator.rb +10 -11
  128. data/lib/pdk/validate/ruby/ruby_validator_group.rb +1 -1
  129. data/lib/pdk/validate/tasks/tasks_metadata_lint_validator.rb +19 -24
  130. data/lib/pdk/validate/tasks/tasks_name_validator.rb +11 -13
  131. data/lib/pdk/validate/tasks/tasks_validator_group.rb +1 -1
  132. data/lib/pdk/validate/validator.rb +4 -2
  133. data/lib/pdk/validate/validator_group.rb +6 -3
  134. data/lib/pdk/validate/yaml/yaml_syntax_validator.rb +27 -36
  135. data/lib/pdk/validate/yaml/yaml_validator_group.rb +1 -1
  136. data/lib/pdk/validate.rb +6 -6
  137. data/lib/pdk/version.rb +2 -2
  138. data/lib/pdk.rb +12 -12
  139. metadata +27 -35
  140. data/lib/pdk/cli/config/get.rb +0 -26
  141. data/lib/pdk/cli/config.rb +0 -22
  142. data/lib/pdk/cli/module/build.rb +0 -12
  143. data/lib/pdk/cli/module/generate.rb +0 -47
  144. data/lib/pdk/cli/module.rb +0 -14
@@ -7,8 +7,7 @@ module PDK
7
7
  new(options).build
8
8
  end
9
9
 
10
- attr_reader :module_dir
11
- attr_reader :target_dir
10
+ attr_reader :module_dir, :target_dir
12
11
 
13
12
  def initialize(options = {})
14
13
  @module_dir = PDK::Util::Filesystem.expand_path(options[:module_dir] || Dir.pwd)
@@ -86,7 +85,7 @@ module PDK
86
85
  def release_name
87
86
  @release_name ||= [
88
87
  metadata['name'],
89
- metadata['version'],
88
+ metadata['version']
90
89
  ].join('-')
91
90
  end
92
91
 
@@ -126,8 +125,8 @@ module PDK
126
125
  PDK::Util::Filesystem.cp(path, dest_path, preserve: true)
127
126
  end
128
127
  rescue ArgumentError => e
129
- raise PDK::CLI::ExitWithError, '%{message} Rename the file or exclude it from the package ' \
130
- 'by adding it to the .pdkignore file in your module.' % { message: e.message }
128
+ raise PDK::CLI::ExitWithError, format('%{message} Rename the file or exclude it from the package ' \
129
+ 'by adding it to the .pdkignore file in your module.', message: e.message)
131
130
  end
132
131
 
133
132
  # Check if the given path matches one of the patterns listed in the
@@ -137,7 +136,7 @@ module PDK
137
136
  #
138
137
  # @return [Boolean] true if the path matches and should be ignored.
139
138
  def ignored_path?(path)
140
- path = path.to_s + '/' if PDK::Util::Filesystem.directory?(path)
139
+ path = "#{path}/" if PDK::Util::Filesystem.directory?(path)
141
140
 
142
141
  !ignored_files.match_paths([path], module_dir).empty?
143
142
  end
@@ -154,10 +153,8 @@ module PDK
154
153
  symlink_path = Pathname.new(path)
155
154
  module_path = Pathname.new(module_dir)
156
155
 
157
- PDK.logger.warn 'Symlinks in modules are not supported and will not be included in the package. Please investigate symlink %{from} -> %{to}.' % {
158
- from: symlink_path.relative_path_from(module_path),
159
- to: symlink_path.realpath.relative_path_from(module_path),
160
- }
156
+ PDK.logger.warn format('Symlinks in modules are not supported and will not be included in the package. Please investigate symlink %{from} -> %{to}.',
157
+ from: symlink_path.relative_path_from(module_path), to: symlink_path.realpath.relative_path_from(module_path))
161
158
  end
162
159
 
163
160
  # Checks if the path length will fit into the POSIX.1-1998 (ustar) tar
@@ -180,11 +177,7 @@ module PDK
180
177
  #
181
178
  # @return [nil]
182
179
  def validate_ustar_path!(path)
183
- if path.bytesize > 256
184
- raise ArgumentError, "The path '%{path}' is longer than 256 bytes." % {
185
- path: path,
186
- }
187
- end
180
+ raise ArgumentError, format("The path '%{path}' is longer than 256 bytes.", path: path) if path.bytesize > 256
188
181
 
189
182
  if path.bytesize <= 100
190
183
  prefix = ''
@@ -196,6 +189,7 @@ module PDK
196
189
  loop do
197
190
  nxt = parts.pop || ''
198
191
  break if newpath.bytesize + 1 + nxt.bytesize >= 100
192
+
199
193
  newpath = File.join(nxt, newpath)
200
194
  end
201
195
 
@@ -206,9 +200,9 @@ module PDK
206
200
  return unless path.bytesize > 100 || prefix.bytesize > 155
207
201
 
208
202
  raise ArgumentError,
209
- "'%{path}' could not be split at a directory separator into two " \
210
- 'parts, the first having a maximum length of 155 bytes and the ' \
211
- 'second having a maximum length of 100 bytes.' % { path: path }
203
+ format("'%{path}' could not be split at a directory separator into two " \
204
+ 'parts, the first having a maximum length of 155 bytes and the ' \
205
+ 'second having a maximum length of 100 bytes.', path: path)
212
206
  end
213
207
 
214
208
  # Checks if the path contains any non-ASCII characters.
@@ -224,10 +218,10 @@ module PDK
224
218
  #
225
219
  # @return [nil]
226
220
  def validate_path_encoding!(path)
227
- return unless path =~ %r{[^\x00-\x7F]}
221
+ return unless /[^\x00-\x7F]/.match?(path)
228
222
 
229
- raise ArgumentError, "'%{path}' can only include ASCII characters in its path or " \
230
- 'filename in order to be compatible with a wide range of hosts.' % { path: path }
223
+ raise ArgumentError, format("'%{path}' can only include ASCII characters in its path or " \
224
+ 'filename in order to be compatible with a wide range of hosts.', path: path)
231
225
  end
232
226
 
233
227
  # Creates a gzip compressed tarball of the build directory.
@@ -244,31 +238,24 @@ module PDK
244
238
  PDK::Util::Filesystem.rm_f(package_file)
245
239
 
246
240
  Dir.chdir(target_dir) do
247
- begin
248
- gz = Zlib::GzipWriter.new(File.open(package_file, 'wb')) # rubocop:disable PDK/FileOpen
249
- tar = Minitar::Output.new(gz)
250
- Find.find(release_name) do |entry|
251
- entry_meta = {
252
- name: entry,
253
- }
254
-
255
- orig_mode = PDK::Util::Filesystem.stat(entry).mode
256
- min_mode = Minitar.dir?(entry) ? 0o755 : 0o644
257
-
258
- entry_meta[:mode] = orig_mode | min_mode
259
-
260
- if entry_meta[:mode] != orig_mode
261
- PDK.logger.debug('Updated permissions of packaged \'%{entry}\' to %{new_mode}' % {
262
- entry: entry,
263
- new_mode: (entry_meta[:mode] & 0o7777).to_s(8),
264
- })
265
- end
266
-
267
- Minitar.pack_file(entry_meta, tar)
268
- end
269
- ensure
270
- tar.close
241
+ gz = Zlib::GzipWriter.new(File.open(package_file, 'wb')) # rubocop:disable PDK/FileOpen
242
+ tar = Minitar::Output.new(gz)
243
+ Find.find(release_name) do |entry|
244
+ entry_meta = {
245
+ name: entry
246
+ }
247
+
248
+ orig_mode = PDK::Util::Filesystem.stat(entry).mode
249
+ min_mode = Minitar.dir?(entry) ? 0o755 : 0o644
250
+
251
+ entry_meta[:mode] = orig_mode | min_mode
252
+
253
+ PDK.logger.debug(format('Updated permissions of packaged \'%{entry}\' to %{new_mode}', entry: entry, new_mode: (entry_meta[:mode] & 0o7777).to_s(8))) if entry_meta[:mode] != orig_mode
254
+
255
+ Minitar.pack_file(entry_meta, tar)
271
256
  end
257
+ ensure
258
+ tar.close
272
259
  end
273
260
  end
274
261
 
@@ -283,7 +270,7 @@ module PDK
283
270
  @ignore_file ||= [
284
271
  File.join(module_dir, '.pdkignore'),
285
272
  File.join(module_dir, '.pmtignore'),
286
- File.join(module_dir, '.gitignore'),
273
+ File.join(module_dir, '.gitignore')
287
274
  ].find { |file| PDK::Util::Filesystem.file?(file) && PDK::Util::Filesystem.readable?(file) }
288
275
  end
289
276
 
@@ -303,9 +290,7 @@ module PDK
303
290
  PathSpec.new(PDK::Util::Filesystem.read_file(ignore_file, open_args: 'rb:UTF-8'))
304
291
  end
305
292
 
306
- if File.realdirpath(target_dir).start_with?(File.realdirpath(module_dir))
307
- ignored = ignored.add("\/#{File.basename(target_dir)}\/")
308
- end
293
+ ignored = ignored.add("/#{File.basename(target_dir)}/") if File.realdirpath(target_dir).start_with?(File.realdirpath(module_dir))
309
294
 
310
295
  PDK::Module::DEFAULT_IGNORED.each { |r| ignored.add(r) }
311
296
 
@@ -7,9 +7,7 @@ module PDK
7
7
  new(module_dir, options).run
8
8
  end
9
9
 
10
- attr_reader :module_dir
11
-
12
- attr_reader :options
10
+ attr_reader :module_dir, :options
13
11
 
14
12
  def initialize(module_dir, options = {})
15
13
  @module_dir = module_dir
@@ -100,6 +98,7 @@ module PDK
100
98
 
101
99
  def test_generators(context = PDK.context)
102
100
  return @test_generators unless @test_generators.nil?
101
+
103
102
  require 'pdk/util/puppet_strings'
104
103
 
105
104
  test_gens = PDK::Util::PuppetStrings.all_objects.map do |generator, objects|
@@ -153,13 +152,11 @@ module PDK
153
152
  absolute_file_path = File.join(module_dir, relative_file_path)
154
153
  case file_status
155
154
  when :unmanage
156
- PDK.logger.debug("skipping '%{path}'" % { path: absolute_file_path })
155
+ PDK.logger.debug(format("skipping '%{path}'", path: absolute_file_path))
157
156
  when :delete
158
157
  update_manager.remove_file(absolute_file_path)
159
158
  when :init
160
- if convert? && !PDK::Util::Filesystem.exist?(absolute_file_path)
161
- update_manager.add_file(absolute_file_path, file_content)
162
- end
159
+ update_manager.add_file(absolute_file_path, file_content) if convert? && !PDK::Util::Filesystem.exist?(absolute_file_path)
163
160
  when :manage
164
161
  if PDK::Util::Filesystem.exist?(absolute_file_path)
165
162
  update_manager.modify_file(absolute_file_path, file_content)
@@ -191,11 +188,7 @@ module PDK
191
188
  require 'pdk/module/metadata'
192
189
 
193
190
  if PDK::Util::Filesystem.file?(metadata_path)
194
- unless PDK::Util::Filesystem.readable?(metadata_path)
195
- raise PDK::CLI::ExitWithError, 'Unable to update module metadata; %{path} exists but it is not readable.' % {
196
- path: metadata_path,
197
- }
198
- end
191
+ raise PDK::CLI::ExitWithError, format('Unable to update module metadata; %{path} exists but it is not readable.', path: metadata_path) unless PDK::Util::Filesystem.readable?(metadata_path)
199
192
 
200
193
  begin
201
194
  metadata = PDK::Module::Metadata.from_file(metadata_path)
@@ -208,9 +201,7 @@ module PDK
208
201
  metadata = PDK::Generate::Module.prepare_metadata(options) unless options[:noop]
209
202
  end
210
203
  elsif PDK::Util::Filesystem.exist?(metadata_path)
211
- raise PDK::CLI::ExitWithError, 'Unable to update module metadata; %{path} exists but it is not a file.' % {
212
- path: metadata_path,
213
- }
204
+ raise PDK::CLI::ExitWithError, format('Unable to update module metadata; %{path} exists but it is not a file.', path: metadata_path)
214
205
  else
215
206
  return if options[:noop]
216
207
 
@@ -250,23 +241,23 @@ module PDK
250
241
 
251
242
  footer = false
252
243
 
253
- summary.keys.each do |category|
244
+ summary.each_key do |category|
254
245
  next if summary[category].empty?
255
246
 
256
- PDK::Report.default_target.puts("\n%{banner}" % { banner: generate_banner("Files to be #{category}", 40) })
247
+ PDK::Report.default_target.puts(format("\n%{banner}", banner: generate_banner("Files to be #{category}", 40)))
257
248
  PDK::Report.default_target.puts(summary[category])
258
249
  footer = true
259
250
  end
260
251
 
261
- PDK::Report.default_target.puts("\n%{banner}" % { banner: generate_banner('', 40) }) if footer
252
+ PDK::Report.default_target.puts(format("\n%{banner}", banner: generate_banner('', 40))) if footer
262
253
  end
263
254
 
264
255
  def print_result(banner_text)
265
256
  require 'pdk/report'
266
257
 
267
- PDK::Report.default_target.puts("\n%{banner}" % { banner: generate_banner(banner_text, 40) })
268
- summary_to_print = summary.map { |k, v| "#{v.length} files #{k}" unless v.empty? }.compact
269
- PDK::Report.default_target.puts("\n%{summary}\n\n" % { summary: "#{summary_to_print.join(', ')}." })
258
+ PDK::Report.default_target.puts(format("\n%{banner}", banner: generate_banner(banner_text, 40)))
259
+ summary_to_print = summary.filter_map { |k, v| "#{v.length} files #{k}" unless v.empty? }
260
+ PDK::Report.default_target.puts(format("\n%{summary}\n\n", summary: "#{summary_to_print.join(', ')}."))
270
261
  end
271
262
 
272
263
  def full_report(path)
@@ -275,7 +266,7 @@ module PDK
275
266
  report = ["/* Report generated by PDK at #{Time.now} */"]
276
267
  report.concat(update_manager.changes[:modified].map { |_, diff| "\n\n\n#{diff}" })
277
268
  PDK::Util::Filesystem.write_file(path, report.join)
278
- PDK::Report.default_target.puts("\nYou can find a report of differences in %{path}.\n\n" % { path: path })
269
+ PDK::Report.default_target.puts(format("\nYou can find a report of differences in %{path}.\n\n", path: path))
279
270
  end
280
271
 
281
272
  def generate_banner(text, width = 80)
@@ -8,81 +8,79 @@ module PDK
8
8
  OPERATING_SYSTEMS = {
9
9
  'RedHat based Linux' => [
10
10
  {
11
- 'operatingsystem' => 'CentOS',
12
- 'operatingsystemrelease' => ['7'],
11
+ 'operatingsystem' => 'CentOS',
12
+ 'operatingsystemrelease' => ['7']
13
13
  },
14
14
  {
15
- 'operatingsystem' => 'OracleLinux',
16
- 'operatingsystemrelease' => ['7'],
15
+ 'operatingsystem' => 'OracleLinux',
16
+ 'operatingsystemrelease' => ['7']
17
17
  },
18
18
  {
19
- 'operatingsystem' => 'RedHat',
20
- 'operatingsystemrelease' => ['8'],
19
+ 'operatingsystem' => 'RedHat',
20
+ 'operatingsystemrelease' => ['8']
21
21
  },
22
22
  {
23
- 'operatingsystem' => 'Scientific',
24
- 'operatingsystemrelease' => ['7'],
25
- },
23
+ 'operatingsystem' => 'Scientific',
24
+ 'operatingsystemrelease' => ['7']
25
+ }
26
26
  ],
27
27
  'Debian based Linux' => [
28
28
  {
29
- 'operatingsystem' => 'Debian',
30
- 'operatingsystemrelease' => ['10'],
29
+ 'operatingsystem' => 'Debian',
30
+ 'operatingsystemrelease' => ['10']
31
31
  },
32
32
  {
33
- 'operatingsystem' => 'Ubuntu',
34
- 'operatingsystemrelease' => ['18.04'],
35
- },
33
+ 'operatingsystem' => 'Ubuntu',
34
+ 'operatingsystemrelease' => ['18.04']
35
+ }
36
36
  ],
37
37
  'Fedora' => {
38
- 'operatingsystem' => 'Fedora',
39
- 'operatingsystemrelease' => ['29'],
38
+ 'operatingsystem' => 'Fedora',
39
+ 'operatingsystemrelease' => ['29']
40
40
  },
41
41
  'OSX' => {
42
- 'operatingsystem' => 'Darwin',
43
- 'operatingsystemrelease' => ['16'],
42
+ 'operatingsystem' => 'Darwin',
43
+ 'operatingsystemrelease' => ['16']
44
44
  },
45
45
  'SLES' => {
46
- 'operatingsystem' => 'SLES',
47
- 'operatingsystemrelease' => ['15'],
46
+ 'operatingsystem' => 'SLES',
47
+ 'operatingsystemrelease' => ['15']
48
48
  },
49
49
  'Solaris' => {
50
- 'operatingsystem' => 'Solaris',
51
- 'operatingsystemrelease' => ['11'],
50
+ 'operatingsystem' => 'Solaris',
51
+ 'operatingsystemrelease' => ['11']
52
52
  },
53
53
  'Windows' => {
54
- 'operatingsystem' => 'windows',
55
- 'operatingsystemrelease' => %w[2019 10],
54
+ 'operatingsystem' => 'windows',
55
+ 'operatingsystemrelease' => ['2019', '10']
56
56
  },
57
57
  'AIX' => {
58
- 'operatingsystem' => 'AIX',
59
- 'operatingsystemrelease' => %w[6.1 7.1 7.2],
60
- },
58
+ 'operatingsystem' => 'AIX',
59
+ 'operatingsystemrelease' => ['6.1', '7.1', '7.2']
60
+ }
61
61
  }.freeze
62
62
 
63
63
  DEFAULT_OPERATING_SYSTEMS = [
64
64
  'RedHat based Linux',
65
65
  'Debian based Linux',
66
- 'Windows',
66
+ 'Windows'
67
67
  ].freeze
68
68
 
69
69
  DEFAULTS = {
70
- 'name' => nil,
71
- 'version' => '0.1.0',
72
- 'author' => nil,
73
- 'summary' => '',
74
- 'license' => 'Apache-2.0',
75
- 'source' => '',
76
- 'project_page' => nil,
77
- 'issues_url' => nil,
78
- 'dependencies' => [],
70
+ 'name' => nil,
71
+ 'version' => '0.1.0',
72
+ 'author' => nil,
73
+ 'summary' => '',
74
+ 'license' => 'Apache-2.0',
75
+ 'source' => '',
76
+ 'project_page' => nil,
77
+ 'issues_url' => nil,
78
+ 'dependencies' => [],
79
79
  'data_provider' => nil,
80
- 'operatingsystem_support' => DEFAULT_OPERATING_SYSTEMS.map { |os_name|
81
- OPERATING_SYSTEMS[os_name]
82
- }.flatten,
80
+ 'operatingsystem_support' => DEFAULT_OPERATING_SYSTEMS.dup,
83
81
  'requirements' => [
84
- { 'name' => 'puppet', 'version_requirement' => '>= 6.21.0 < 8.0.0' },
85
- ],
82
+ { 'name' => 'puppet', 'version_requirement' => '>= 7.24 < 9.0.0' }
83
+ ]
86
84
  }.freeze
87
85
 
88
86
  def initialize(params = {})
@@ -91,23 +89,17 @@ module PDK
91
89
  end
92
90
 
93
91
  def self.from_file(metadata_json_path)
94
- if metadata_json_path.nil?
95
- raise ArgumentError, 'Cannot read metadata from file: no path to file was given.'
96
- end
92
+ raise ArgumentError, 'Cannot read metadata from file: no path to file was given.' if metadata_json_path.nil?
97
93
 
98
- unless PDK::Util::Filesystem.file?(metadata_json_path)
99
- raise ArgumentError, "'%{file}' does not exist or is not a file." % { file: metadata_json_path }
100
- end
94
+ raise ArgumentError, format("'%{file}' does not exist or is not a file.", file: metadata_json_path) unless PDK::Util::Filesystem.file?(metadata_json_path)
101
95
 
102
- unless PDK::Util::Filesystem.readable?(metadata_json_path)
103
- raise ArgumentError, "Unable to open '%{file}' for reading." % { file: metadata_json_path }
104
- end
96
+ raise ArgumentError, format("Unable to open '%{file}' for reading.", file: metadata_json_path) unless PDK::Util::Filesystem.readable?(metadata_json_path)
105
97
 
106
98
  require 'json'
107
99
  begin
108
100
  data = JSON.parse(PDK::Util::Filesystem.read_file(metadata_json_path))
109
101
  rescue JSON::JSONError => e
110
- raise ArgumentError, 'Invalid JSON in metadata.json: %{msg}' % { msg: e.message }
102
+ raise ArgumentError, format('Invalid JSON in metadata.json: %{msg}', msg: e.message)
111
103
  end
112
104
 
113
105
  require 'pdk/util'
@@ -122,10 +114,10 @@ module PDK
122
114
  self
123
115
  end
124
116
 
125
- def to_json
117
+ def to_json(*_args)
126
118
  require 'json'
127
119
 
128
- JSON.pretty_generate(@data.dup.delete_if { |_key, value| value.nil? })
120
+ JSON.pretty_generate(@data.dup.delete_if { |_key, value| value.nil? }) # rubocop:disable Style/CollectionCompact
129
121
  end
130
122
 
131
123
  def write!(path)
@@ -144,9 +136,9 @@ module PDK
144
136
 
145
137
  def validate_puppet_version_requirement!
146
138
  msgs = {
147
- no_reqs: 'Module metadata does not contain any requirements.',
139
+ no_reqs: 'Module metadata does not contain any requirements.',
148
140
  no_puppet_req: 'Module metadata does not contain a "puppet" requirement.',
149
- no_puppet_ver: 'The "puppet" requirement in module metadata does not specify a "version_requirement".',
141
+ no_puppet_ver: 'The "puppet" requirement in module metadata does not specify a "version_requirement".'
150
142
  }
151
143
 
152
144
  raise ArgumentError, msgs[:no_reqs] unless @data.key?('requirements')
@@ -162,7 +154,7 @@ module PDK
162
154
  end
163
155
 
164
156
  def missing_fields
165
- fields = DEFAULTS.keys - %w[data_provider requirements dependencies]
157
+ fields = DEFAULTS.keys - ['data_provider', 'requirements', 'dependencies']
166
158
  fields.select { |key| @data[key].nil? || @data[key].empty? }
167
159
  end
168
160
 
@@ -179,7 +171,7 @@ module PDK
179
171
 
180
172
  # Validates that the given module name is both namespaced and well-formed.
181
173
  def validate_name(name)
182
- return if name =~ %r{\A[a-z0-9]+[-\/][a-z][a-z0-9_]*\Z}i
174
+ return if %r{\A[a-z0-9]+[-/][a-z][a-z0-9_]*\Z}i.match?(name)
183
175
 
184
176
  namespace, modname = name.split(%r{[-/]}, 2)
185
177
  modname = :namespace_missing if namespace == ''
@@ -187,15 +179,15 @@ module PDK
187
179
  err = case modname
188
180
  when nil, '', :namespace_missing
189
181
  'Field must be a dash-separated user name and module name.'
190
- when %r{[^a-z0-9_]}i
182
+ when /[^a-z0-9_]/i
191
183
  'Module name must contain only alphanumeric or underscore characters.'
192
- when %r{^[^a-z]}i
184
+ when /^[^a-z]/i
193
185
  'Module name must begin with a letter.'
194
186
  else
195
187
  'Namespace must contain only alphanumeric characters.'
196
188
  end
197
189
 
198
- raise ArgumentError, "Invalid 'name' field in metadata.json: %{err}" % { err: err }
190
+ raise ArgumentError, format("Invalid 'name' field in metadata.json: %{err}", err: err)
199
191
  end
200
192
  end
201
193
  end
@@ -8,9 +8,7 @@ module PDK
8
8
  new(module_path, options).run
9
9
  end
10
10
 
11
- attr_reader :options
12
-
13
- attr_reader :module_path
11
+ attr_reader :options, :module_path
14
12
 
15
13
  def initialize(module_path, options = {})
16
14
  @options = options
@@ -21,9 +19,10 @@ module PDK
21
19
 
22
20
  if module_path.nil?
23
21
  module_path = PDK::Util.module_root
24
- raise PDK::CLI::ExitWithError, 'The module release process requires a valid module path' % { module_path: module_path } if module_path.nil?
22
+ raise PDK::CLI::ExitWithError, 'The module release process requires a valid module path' if module_path.nil?
25
23
  end
26
- raise PDK::CLI::ExitWithError, '%{module_path} is not a valid module' % { module_path: module_path } unless PDK::Util.in_module_root?(module_path)
24
+ raise PDK::CLI::ExitWithError, format('%{module_path} is not a valid module', module_path: module_path) unless PDK::Util.in_module_root?(module_path)
25
+
27
26
  @module_path = module_path
28
27
  end
29
28
 
@@ -41,24 +40,17 @@ module PDK
41
40
 
42
41
  run_validations(options) unless skip_validation?
43
42
 
44
- PDK.logger.info 'Releasing %{module_name} - from version %{module_version}' % {
45
- module_name: module_metadata.data['name'],
46
- module_version: module_metadata.data['version'],
47
- }
43
+ PDK.logger.info format('Releasing %{module_name} - from version %{module_version}', module_name: module_metadata.data['name'], module_version: module_metadata.data['version'])
48
44
 
49
45
  PDK::Util::ChangelogGenerator.generate_changelog unless skip_changelog?
50
46
 
51
47
  # Calculate the new module version
52
48
  new_version = specified_version
53
- if new_version.nil? && !skip_changelog?
54
- new_version = PDK::Util::ChangelogGenerator.compute_next_version(module_metadata.data['version'])
55
- end
49
+ new_version = PDK::Util::ChangelogGenerator.compute_next_version(module_metadata.data['version']) if new_version.nil? && !skip_changelog?
56
50
  new_version = module_metadata.data['version'] if new_version.nil?
57
51
 
58
52
  if new_version != module_metadata.data['version']
59
- PDK.logger.info 'Updating version to %{module_version}' % {
60
- module_version: new_version,
61
- }
53
+ PDK.logger.info format('Updating version to %{module_version}', module_version: new_version)
62
54
 
63
55
  # Set the new version in metadata file
64
56
  module_metadata.data['version'] = new_version
@@ -69,8 +61,8 @@ module PDK
69
61
 
70
62
  # Check if the versions match
71
63
  latest_version = PDK::Util::ChangelogGenerator.latest_version
72
- unless latest_version
73
- raise PDK::CLI::ExitWithError, '%{new_version} does not match %{latest_version}' % { new_version: new_version, latest_version: latest_version } if new_version != latest_version
64
+ if !latest_version && (new_version != latest_version)
65
+ raise PDK::CLI::ExitWithError, format('%{new_version} does not match %{latest_version}', new_version: new_version, latest_version: latest_version)
74
66
  end
75
67
  end
76
68
 
@@ -102,6 +94,7 @@ module PDK
102
94
 
103
95
  def default_package_filename
104
96
  return @default_tarball_filename unless @default_tarball_filename.nil?
97
+
105
98
  builder = PDK::Module::Build.new(module_dir: module_path)
106
99
  @default_tarball_filename = builder.package_file
107
100
  end
@@ -127,7 +120,7 @@ module PDK
127
120
  docs_command = PDK::CLI::Exec::InteractiveCommand.new(PDK::CLI::Exec.bundle_bin, 'exec', 'puppet', 'strings', 'generate', '--format', 'markdown', '--out', 'REFERENCE.md')
128
121
  docs_command.context = :module
129
122
  result = docs_command.execute!
130
- raise PDK::CLI::ExitWithError, 'An error occured generating the module documentation: %{stdout}' % { stdout: result[:stdout] } unless result[:exit_code].zero?
123
+ raise PDK::CLI::ExitWithError, format('An error occured generating the module documentation: %{stdout}', stdout: result[:stdout]) unless result[:exit_code].zero?
131
124
  end
132
125
 
133
126
  def run_dependency_checker(_opts)
@@ -138,7 +131,7 @@ module PDK
138
131
  dep_command.context = :module
139
132
  result = dep_command.execute!
140
133
 
141
- raise PDK::CLI::ExitWithError, 'An error occured checking the module dependencies: %{stdout}' % { stdout: result[:stdout] } unless result[:exit_code].zero?
134
+ raise PDK::CLI::ExitWithError, format('An error occured checking the module dependencies: %{stdout}', stdout: result[:stdout]) unless result[:exit_code].zero?
142
135
  end
143
136
 
144
137
  # @return [String] Path to the built tarball
@@ -148,7 +141,7 @@ module PDK
148
141
 
149
142
  def run_publish(_opts, tarball_path)
150
143
  validate_publish_options!
151
- raise PDK::CLI::ExitWithError, 'Module tarball %{tarball_path} does not exist' % { tarball_path: tarball_path } unless PDK::Util::Filesystem.file?(tarball_path)
144
+ raise PDK::CLI::ExitWithError, format('Module tarball %{tarball_path} does not exist', tarball_path: tarball_path) unless PDK::Util::Filesystem.file?(tarball_path)
152
145
 
153
146
  # TODO: Replace this code when the upload functionality is added to the forge ruby gem
154
147
  require 'base64'
@@ -158,19 +151,20 @@ module PDK
158
151
  uri = URI(forge_upload_url)
159
152
  require 'net/http'
160
153
  request = Net::HTTP::Post.new(uri.path)
161
- request['Authorization'] = 'Bearer ' + forge_token
154
+ request['Authorization'] = "Bearer #{forge_token}"
162
155
  request['Content-Type'] = 'application/json'
163
156
  data = { file: file_data }
164
157
 
165
158
  request.body = data.to_json
166
159
 
167
160
  require 'openssl'
168
- use_ssl = uri.class == URI::HTTPS
161
+ use_ssl = uri.instance_of?(URI::HTTPS)
169
162
  response = Net::HTTP.start(uri.host, uri.port, use_ssl: use_ssl) do |http|
170
163
  http.request(request)
171
164
  end
172
165
 
173
- raise PDK::CLI::ExitWithError, 'Error uploading to Puppet Forge: %{result}' % { result: response.body } unless response.is_a?(Net::HTTPSuccess)
166
+ raise PDK::CLI::ExitWithError, format('Error uploading to Puppet Forge: %{result}', result: response.body) unless response.is_a?(Net::HTTPSuccess)
167
+
174
168
  PDK.logger.info 'Publish to Forge was successful'
175
169
  end
176
170
 
@@ -235,7 +229,7 @@ module PDK
235
229
  !skip_publish?
236
230
  end
237
231
 
238
- #:nocov:
232
+ # :nocov:
239
233
  # These are just convenience methods and are tested elsewhere
240
234
  def forge_compatible?
241
235
  module_metadata.forge_ready?
@@ -247,7 +241,7 @@ module PDK
247
241
  builder = PDK::Module::Build.new(module_dir: module_path)
248
242
  @pdk_compatible = builder.module_pdk_compatible?
249
243
  end
250
- #:nocov:
244
+ # :nocov:
251
245
 
252
246
  private
253
247
 
@@ -3,18 +3,14 @@ require 'pdk'
3
3
  module PDK
4
4
  module Module
5
5
  class Update < Convert
6
- GIT_DESCRIBE_PATTERN = %r{\A(?<base>.+?)-(?<additional_commits>\d+)-g(?<sha>.+)\Z}
6
+ GIT_DESCRIBE_PATTERN = /\A(?<base>.+?)-(?<additional_commits>\d+)-g(?<sha>.+)\Z/.freeze
7
7
 
8
8
  def run
9
9
  template_uri.uri_fragment = new_template_version
10
10
 
11
11
  stage_changes!
12
12
 
13
- if current_version == new_version
14
- PDK.logger.debug 'This module is already up to date with version %{version} of the template.' % {
15
- version: new_version,
16
- }
17
- end
13
+ PDK.logger.debug format('This module is already up to date with version %{version} of the template.', version: new_version) if current_version == new_version
18
14
 
19
15
  unless update_manager.changes?
20
16
  PDK::Report.default_target.puts('No changes required.')
@@ -97,7 +93,7 @@ module PDK
97
93
 
98
94
  return data if data.nil?
99
95
 
100
- if data[:base] =~ %r{^(?:heads|remotes)/}
96
+ if %r{^(?:heads|remotes)/}.match?(data[:base])
101
97
  "#{data[:base].gsub(%r{^(heads/|remotes/\w+?/)}, '')}@#{data[:sha]}"
102
98
  else
103
99
  data[:base]
@@ -119,12 +115,7 @@ module PDK
119
115
  'Updating %{module_name} using the template at %{template_url}, from %{current_version} to %{new_version}'
120
116
  end
121
117
 
122
- format_string % {
123
- module_name: module_metadata.data['name'],
124
- template_url: template_uri.bare_uri,
125
- current_version: current_version,
126
- new_version: new_version,
127
- }
118
+ format(format_string, module_name: module_metadata.data['name'], template_url: template_uri.bare_uri, current_version: current_version, new_version: new_version)
128
119
  end
129
120
  end
130
121
  end