pdk 1.13.0 → 1.14.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 (82) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +25 -0
  3. data/README.md +41 -0
  4. data/lib/pdk.rb +0 -13
  5. data/lib/pdk/analytics.rb +18 -2
  6. data/lib/pdk/analytics/client/google_analytics.rb +3 -0
  7. data/lib/pdk/answer_file.rb +4 -1
  8. data/lib/pdk/cli.rb +7 -2
  9. data/lib/pdk/cli/build.rb +2 -2
  10. data/lib/pdk/cli/bundle.rb +7 -1
  11. data/lib/pdk/cli/console.rb +148 -0
  12. data/lib/pdk/cli/convert.rb +2 -2
  13. data/lib/pdk/cli/exec.rb +14 -14
  14. data/lib/pdk/cli/exec/command.rb +16 -11
  15. data/lib/pdk/cli/exec/interactive_command.rb +4 -0
  16. data/lib/pdk/cli/exec_group.rb +5 -5
  17. data/lib/pdk/cli/module/build.rb +0 -2
  18. data/lib/pdk/cli/module/generate.rb +1 -2
  19. data/lib/pdk/cli/new.rb +1 -1
  20. data/lib/pdk/cli/new/defined_type.rb +2 -0
  21. data/lib/pdk/cli/new/provider.rb +2 -0
  22. data/lib/pdk/cli/new/task.rb +2 -0
  23. data/lib/pdk/cli/new/{unit_test.rb → test.rb} +16 -12
  24. data/lib/pdk/cli/new/transport.rb +2 -0
  25. data/lib/pdk/cli/test/unit.rb +5 -3
  26. data/lib/pdk/cli/update.rb +2 -3
  27. data/lib/pdk/cli/util.rb +45 -14
  28. data/lib/pdk/cli/util/spinner.rb +2 -2
  29. data/lib/pdk/cli/validate.rb +6 -2
  30. data/lib/pdk/config.rb +20 -8
  31. data/lib/pdk/config/analytics_schema.json +26 -0
  32. data/lib/pdk/config/json.rb +14 -3
  33. data/lib/pdk/config/json_schema_namespace.rb +143 -0
  34. data/lib/pdk/config/json_schema_setting.rb +53 -0
  35. data/lib/pdk/config/json_with_schema.rb +50 -0
  36. data/lib/pdk/config/namespace.rb +84 -76
  37. data/lib/pdk/config/setting.rb +132 -0
  38. data/lib/pdk/config/yaml.rb +15 -3
  39. data/lib/pdk/config/yaml_with_schema.rb +59 -0
  40. data/lib/pdk/generate.rb +0 -2
  41. data/lib/pdk/generate/module.rb +29 -16
  42. data/lib/pdk/generate/puppet_object.rb +31 -28
  43. data/lib/pdk/module.rb +2 -2
  44. data/lib/pdk/module/build.rb +21 -8
  45. data/lib/pdk/module/convert.rb +64 -7
  46. data/lib/pdk/module/metadata.rb +5 -1
  47. data/lib/pdk/module/templatedir.rb +24 -7
  48. data/lib/pdk/module/update.rb +5 -1
  49. data/lib/pdk/module/update_manager.rb +21 -13
  50. data/lib/pdk/report.rb +4 -3
  51. data/lib/pdk/report/event.rb +5 -3
  52. data/lib/pdk/tests/unit.rb +36 -7
  53. data/lib/pdk/util.rb +20 -8
  54. data/lib/pdk/util/bundler.rb +14 -6
  55. data/lib/pdk/util/filesystem.rb +5 -0
  56. data/lib/pdk/util/git.rb +6 -0
  57. data/lib/pdk/util/puppet_strings.rb +24 -2
  58. data/lib/pdk/util/puppet_version.rb +25 -10
  59. data/lib/pdk/util/ruby_version.rb +13 -1
  60. data/lib/pdk/util/template_uri.rb +23 -2
  61. data/lib/pdk/util/vendored_file.rb +28 -24
  62. data/lib/pdk/util/version.rb +5 -5
  63. data/lib/pdk/validate/base_validator.rb +5 -4
  64. data/lib/pdk/validate/metadata/metadata_json_lint.rb +0 -4
  65. data/lib/pdk/validate/metadata/metadata_syntax.rb +5 -3
  66. data/lib/pdk/validate/metadata_validator.rb +0 -2
  67. data/lib/pdk/validate/puppet/puppet_epp.rb +4 -4
  68. data/lib/pdk/validate/puppet/puppet_lint.rb +0 -3
  69. data/lib/pdk/validate/puppet/puppet_syntax.rb +4 -4
  70. data/lib/pdk/validate/puppet_validator.rb +0 -2
  71. data/lib/pdk/validate/ruby/rubocop.rb +0 -5
  72. data/lib/pdk/validate/ruby_validator.rb +0 -2
  73. data/lib/pdk/validate/tasks/metadata_lint.rb +9 -5
  74. data/lib/pdk/validate/tasks/name.rb +4 -2
  75. data/lib/pdk/validate/tasks_validator.rb +0 -2
  76. data/lib/pdk/validate/yaml/syntax.rb +4 -4
  77. data/lib/pdk/validate/yaml_validator.rb +0 -2
  78. data/lib/pdk/version.rb +1 -1
  79. data/locales/pdk.pot +351 -311
  80. metadata +11 -7
  81. data/lib/pdk/config/validator.rb +0 -31
  82. data/lib/pdk/config/value.rb +0 -94
@@ -1,5 +1,3 @@
1
- require 'pathspec'
2
-
3
1
  module PDK
4
2
  module Module
5
3
  DEFAULT_IGNORED = [
@@ -13,6 +11,8 @@ module PDK
13
11
  ].freeze
14
12
 
15
13
  def default_ignored_pathspec(ignore_dotfiles = true)
14
+ require 'pathspec'
15
+
16
16
  PathSpec.new(DEFAULT_IGNORED).tap do |ps|
17
17
  ps.add('.*') if ignore_dotfiles
18
18
  end
@@ -1,11 +1,3 @@
1
- require 'fileutils'
2
- require 'minitar'
3
- require 'zlib'
4
- require 'pathspec'
5
- require 'find'
6
- require 'pdk/module'
7
- require 'pdk/tests/unit'
8
-
9
1
  module PDK
10
2
  module Module
11
3
  class Build
@@ -26,6 +18,8 @@ module PDK
26
18
  #
27
19
  # @return [Hash{String => Object}] The hash of metadata values.
28
20
  def metadata
21
+ require 'pdk/module/metadata'
22
+
29
23
  @metadata ||= PDK::Module::Metadata.from_file(File.join(module_dir, 'metadata.json')).data
30
24
  end
31
25
 
@@ -71,6 +65,8 @@ module PDK
71
65
  #
72
66
  # If the directory already exists, remove it first.
73
67
  def create_build_dir
68
+ require 'fileutils'
69
+
74
70
  cleanup_build_dir
75
71
 
76
72
  FileUtils.mkdir_p(build_dir)
@@ -80,6 +76,8 @@ module PDK
80
76
  #
81
77
  # @return nil.
82
78
  def cleanup_build_dir
79
+ require 'fileutils'
80
+
83
81
  FileUtils.rm_rf(build_dir, secure: true)
84
82
  end
85
83
 
@@ -99,6 +97,8 @@ module PDK
99
97
  #
100
98
  # @return nil
101
99
  def stage_module_in_build_dir
100
+ require 'find'
101
+
102
102
  Find.find(module_dir) do |path|
103
103
  next if path == module_dir
104
104
 
@@ -112,6 +112,9 @@ module PDK
112
112
  #
113
113
  # @return nil.
114
114
  def stage_path(path)
115
+ require 'pathname'
116
+ require 'fileutils'
117
+
115
118
  relative_path = Pathname.new(path).relative_path_from(Pathname.new(module_dir))
116
119
  dest_path = File.join(build_dir, relative_path)
117
120
 
@@ -149,6 +152,8 @@ module PDK
149
152
  #
150
153
  # @return nil.
151
154
  def warn_symlink(path)
155
+ require 'pathname'
156
+
152
157
  symlink_path = Pathname.new(path)
153
158
  module_path = Pathname.new(module_dir)
154
159
 
@@ -217,6 +222,11 @@ module PDK
217
222
  #
218
223
  # @return nil.
219
224
  def build_package
225
+ require 'fileutils'
226
+ require 'zlib'
227
+ require 'minitar'
228
+ require 'find'
229
+
220
230
  FileUtils.rm_f(package_file)
221
231
 
222
232
  Dir.chdir(target_dir) do
@@ -268,6 +278,9 @@ module PDK
268
278
  #
269
279
  # @return [PathSpec] The populated ignore path matcher.
270
280
  def ignored_files
281
+ require 'pdk/module'
282
+ require 'pathspec'
283
+
271
284
  @ignored_files ||=
272
285
  begin
273
286
  ignored = if ignore_file.nil?
@@ -1,8 +1,3 @@
1
- require 'pdk/generate/module'
2
- require 'pdk/module/update_manager'
3
- require 'pdk/util'
4
- require 'pdk/report'
5
-
6
1
  module PDK
7
2
  module Module
8
3
  class Convert
@@ -24,7 +19,14 @@ module PDK
24
19
  stage_changes!
25
20
 
26
21
  unless update_manager.changes?
27
- PDK::Report.default_target.puts(_('No changes required.'))
22
+ if adding_tests?
23
+ add_tests!
24
+ else
25
+ require 'pdk/report'
26
+
27
+ PDK::Report.default_target.puts(_('No changes required.'))
28
+ end
29
+
28
30
  return
29
31
  end
30
32
 
@@ -35,6 +37,8 @@ module PDK
35
37
  return if noop?
36
38
 
37
39
  unless force?
40
+ require 'pdk/cli/util'
41
+
38
42
  PDK.logger.info _(
39
43
  'Module conversion is a potentially destructive action. ' \
40
44
  'Ensure that you have committed your module to a version control ' \
@@ -52,7 +56,12 @@ module PDK
52
56
 
53
57
  update_manager.sync_changes!
54
58
 
55
- PDK::Util::Bundler.ensure_bundle! if needs_bundle_update?
59
+ if needs_bundle_update?
60
+ require 'pdk/util/bundler'
61
+ PDK::Util::Bundler.ensure_bundle!
62
+ end
63
+
64
+ add_tests! if adding_tests?
56
65
 
57
66
  print_result 'Convert completed'
58
67
  end
@@ -65,11 +74,45 @@ module PDK
65
74
  options[:force]
66
75
  end
67
76
 
77
+ def add_tests?
78
+ options[:'add-tests']
79
+ end
80
+
81
+ def adding_tests?
82
+ add_tests? && missing_tests?
83
+ end
84
+
85
+ def missing_tests?
86
+ test_generators.any? { |gen| gen.can_run? }
87
+ end
88
+
89
+ def test_generators
90
+ return @test_generators unless @test_generators.nil?
91
+ require 'pdk/util/puppet_strings'
92
+
93
+ test_gens = PDK::Util::PuppetStrings.all_objects.map do |generator, objects|
94
+ (objects || []).map do |obj|
95
+ generator.new(Dir.pwd, obj['name'], spec_only: true)
96
+ end
97
+ end
98
+
99
+ @test_generators = test_gens.flatten
100
+ end
101
+
102
+ def add_tests!
103
+ test_generators.each do |gen|
104
+ gen.run if gen.can_run?
105
+ end
106
+ end
107
+
68
108
  def needs_bundle_update?
69
109
  update_manager.changed?('Gemfile')
70
110
  end
71
111
 
72
112
  def stage_changes!
113
+ require 'pdk/module/templatedir'
114
+ require 'pdk/util/filesystem'
115
+
73
116
  metadata_path = 'metadata.json'
74
117
 
75
118
  PDK::Module::TemplateDir.new(template_uri, nil, true) do |templates|
@@ -108,14 +151,22 @@ module PDK
108
151
  end
109
152
 
110
153
  def update_manager
154
+ require 'pdk/module/update_manager'
155
+
111
156
  @update_manager ||= PDK::Module::UpdateManager.new
112
157
  end
113
158
 
114
159
  def template_uri
160
+ require 'pdk/util/template_uri'
161
+
115
162
  @template_uri ||= PDK::Util::TemplateURI.new(options)
116
163
  end
117
164
 
118
165
  def update_metadata(metadata_path, template_metadata)
166
+ require 'pdk/generate/module'
167
+ require 'pdk/util/filesystem'
168
+ require 'pdk/module/metadata'
169
+
119
170
  if PDK::Util::Filesystem.file?(metadata_path)
120
171
  unless PDK::Util::Filesystem.readable?(metadata_path)
121
172
  raise PDK::CLI::ExitWithError, _('Unable to update module metadata; %{path} exists but it is not readable.') % {
@@ -172,6 +223,8 @@ module PDK
172
223
  end
173
224
 
174
225
  def print_summary
226
+ require 'pdk/report'
227
+
175
228
  footer = false
176
229
 
177
230
  summary.keys.each do |category|
@@ -186,12 +239,16 @@ module PDK
186
239
  end
187
240
 
188
241
  def print_result(banner_text)
242
+ require 'pdk/report'
243
+
189
244
  PDK::Report.default_target.puts(_("\n%{banner}") % { banner: generate_banner(banner_text, 40) })
190
245
  summary_to_print = summary.map { |k, v| "#{v.length} files #{k}" unless v.empty? }.compact
191
246
  PDK::Report.default_target.puts(_("\n%{summary}\n\n") % { summary: "#{summary_to_print.join(', ')}." })
192
247
  end
193
248
 
194
249
  def full_report(path)
250
+ require 'pdk/report'
251
+
195
252
  File.open(path, 'w') do |f|
196
253
  f.write("/* Report generated by PDK at #{Time.now} */")
197
254
  update_manager.changes[:modified].each do |_, diff|
@@ -1,4 +1,3 @@
1
- require 'json'
2
1
  require 'pdk/util/filesystem'
3
2
 
4
3
  module PDK
@@ -102,6 +101,7 @@ module PDK
102
101
  raise ArgumentError, _("Unable to open '%{file}' for reading.") % { file: metadata_json_path }
103
102
  end
104
103
 
104
+ require 'json'
105
105
  begin
106
106
  data = JSON.parse(PDK::Util::Filesystem.read_file(metadata_json_path))
107
107
  rescue JSON::JSONError => e
@@ -120,6 +120,8 @@ module PDK
120
120
  end
121
121
 
122
122
  def to_json
123
+ require 'json'
124
+
123
125
  JSON.pretty_generate(@data.dup.delete_if { |_key, value| value.nil? })
124
126
  end
125
127
 
@@ -132,6 +134,8 @@ module PDK
132
134
  end
133
135
 
134
136
  def interview_for_forge!
137
+ require 'pdk/generate/module'
138
+
135
139
  PDK::Generate::Module.module_interview(self, only_ask: missing_fields)
136
140
  end
137
141
 
@@ -1,10 +1,3 @@
1
- require 'yaml'
2
- require 'deep_merge'
3
- require 'pdk/util'
4
- require 'pdk/util/git'
5
- require 'pdk/cli/errors'
6
- require 'pdk/template_file'
7
-
8
1
  module PDK
9
2
  module Module
10
3
  class TemplateDir
@@ -39,6 +32,10 @@ module PDK
39
32
  #
40
33
  # @api public
41
34
  def initialize(uri, module_metadata = {}, init = false)
35
+ require 'pdk/analytics'
36
+ require 'pdk/util/template_uri'
37
+ require 'pdk/util/git'
38
+
42
39
  unless block_given?
43
40
  raise ArgumentError, _('%{class_name} must be initialized with a block.') % { class_name: self.class.name }
44
41
  end
@@ -83,6 +80,7 @@ module PDK
83
80
  # If we cloned a git repo to get the template, remove the clone once
84
81
  # we're done with it.
85
82
  if temp_dir_clone
83
+ require 'fileutils'
86
84
  FileUtils.remove_dir(@path)
87
85
  end
88
86
  end
@@ -96,6 +94,8 @@ module PDK
96
94
  #
97
95
  # @api public
98
96
  def metadata
97
+ require 'pdk/util/version'
98
+
99
99
  {
100
100
  'pdk-version' => PDK::Util::Version.version_string,
101
101
  'template-url' => uri.metadata_format,
@@ -117,6 +117,8 @@ module PDK
117
117
  #
118
118
  # @api public
119
119
  def render
120
+ require 'pdk/template_file'
121
+
120
122
  PDK::Module::TemplateDir.files_in_template(@dirs).each do |template_file, template_loc|
121
123
  template_file = template_file.to_s
122
124
  PDK.logger.debug(_("Rendering '%{template}'...") % { template: template_file })
@@ -207,6 +209,8 @@ module PDK
207
209
  def validate_module_template!
208
210
  # rubocop:disable Style/GuardClause
209
211
  unless File.directory?(@path)
212
+ require 'pdk/util'
213
+
210
214
  if PDK::Util.package_install? && File.fnmatch?(File.join(PDK::Util.package_cachedir, '*'), @path)
211
215
  raise ArgumentError, _('The built-in template has substantially changed. Please run "pdk convert" on your module to continue.')
212
216
  else
@@ -260,11 +264,15 @@ module PDK
260
264
  #
261
265
  # @api private
262
266
  def config_for(dest_path, sync_config_path = nil)
267
+ require 'pdk/util'
268
+ require 'pdk/analytics'
269
+
263
270
  module_root = PDK::Util.module_root
264
271
  sync_config_path ||= File.join(module_root, '.sync.yml') unless module_root.nil?
265
272
  config_path = File.join(@path, 'config_defaults.yml')
266
273
 
267
274
  if @config.nil?
275
+ require 'deep_merge'
268
276
  conf_defaults = read_config(config_path)
269
277
  @sync_config = read_config(sync_config_path) unless sync_config_path.nil?
270
278
  @config = conf_defaults
@@ -302,6 +310,8 @@ module PDK
302
310
  # @api private
303
311
  def read_config(loc)
304
312
  if File.file?(loc) && File.readable?(loc)
313
+ require 'yaml'
314
+
305
315
  begin
306
316
  YAML.safe_load(File.read(loc), [], [], true)
307
317
  rescue Psych::SyntaxError => e
@@ -329,6 +339,9 @@ module PDK
329
339
  # @todo When switching this over to using rugged, cache the cloned
330
340
  # template repo in `%AppData%` or `$XDG_CACHE_DIR` and update before
331
341
  # use.
342
+ require 'pdk/util'
343
+ require 'pdk/util/git'
344
+
332
345
  temp_dir = PDK::Util.make_tmpdir_name('pdk-templates')
333
346
  origin_repo = uri.git_remote
334
347
  git_ref = uri.git_ref
@@ -348,6 +361,8 @@ module PDK
348
361
 
349
362
  # @api private
350
363
  def checkout_template_ref(path, ref)
364
+ require 'pdk/util/git'
365
+
351
366
  if PDK::Util::Git.work_dir_clean?(path)
352
367
  Dir.chdir(path) do
353
368
  full_ref = PDK::Util::Git.ls_remote(path, ref)
@@ -365,6 +380,8 @@ module PDK
365
380
  end
366
381
 
367
382
  def cache_template_ref(path, ref = nil)
383
+ require 'pdk/util/git'
384
+
368
385
  @template_ref ||= PDK::Util::Git.describe(File.join(path, '.git'), ref)
369
386
  end
370
387
  end
@@ -41,7 +41,11 @@ module PDK
41
41
 
42
42
  update_manager.sync_changes!
43
43
 
44
- PDK::Util::Bundler.ensure_bundle! if needs_bundle_update?
44
+ if needs_bundle_update?
45
+ require 'pdk/util/bundler'
46
+
47
+ PDK::Util::Bundler.ensure_bundle!
48
+ end
45
49
 
46
50
  print_result 'Update completed'
47
51
  end
@@ -1,16 +1,11 @@
1
- require 'diff/lcs'
2
- require 'diff/lcs/hunk'
3
- require 'English'
4
- require 'fileutils'
5
- require 'set'
6
- require 'pdk/util/filesystem'
7
-
8
1
  module PDK
9
2
  module Module
10
3
  class UpdateManager
11
4
  # Initialises a blank UpdateManager object, which is used to store and
12
5
  # process file additions/removals/modifications.
13
6
  def initialize
7
+ require 'set'
8
+
14
9
  @modified_files = Set.new
15
10
  @added_files = Set.new
16
11
  @removed_files = Set.new
@@ -45,11 +40,13 @@ module PDK
45
40
  # @raise (see #calculate_diffs)
46
41
  # @return [Hash{Symbol => Set,Hash}] the summary of the pending changes.
47
42
  def changes
43
+ require 'pdk/util/filesystem'
44
+
48
45
  calculate_diffs
49
46
 
50
47
  {
51
48
  added: @added_files,
52
- removed: @removed_files.select { |f| File.exist?(f) },
49
+ removed: @removed_files.select { |f| PDK::Util::Filesystem.exist?(f) },
53
50
  modified: @diff_cache.reject { |_, value| value.nil? },
54
51
  }
55
52
  end
@@ -106,9 +103,11 @@ module PDK
106
103
  #
107
104
  # @raise [PDK::CLI::ExitWithError] if the file could not be removed.
108
105
  def unlink_file(path)
109
- if File.file?(path)
106
+ require 'pdk/util/filesystem'
107
+
108
+ if PDK::Util::Filesystem.file?(path)
110
109
  PDK.logger.debug(_("unlinking '%{path}'") % { path: path })
111
- FileUtils.rm(path)
110
+ PDK::Util::Filesystem.rm(path)
112
111
  else
113
112
  PDK.logger.debug(_("'%{path}': already gone") % { path: path })
114
113
  end
@@ -127,14 +126,16 @@ module PDK
127
126
  # @raise [PDK::CLI::ExitWithError] if a file being modified isn't
128
127
  # readable.
129
128
  def calculate_diffs
129
+ require 'pdk/util/filesystem'
130
+
130
131
  @modified_files.each do |file|
131
132
  next if @diff_cache.key?(file[:path])
132
133
 
133
- unless File.readable?(file[:path])
134
+ unless PDK::Util::Filesystem.readable?(file[:path])
134
135
  raise PDK::CLI::ExitWithError, _("Unable to open '%{path}' for reading") % { path: file[:path] }
135
136
  end
136
137
 
137
- old_content = File.read(file[:path])
138
+ old_content = PDK::Util::Filesystem.read_file(file[:path])
138
139
  file_diff = unified_diff(file[:path], old_content, file[:content])
139
140
  @diff_cache[file[:path]] = file_diff
140
141
  end
@@ -147,7 +148,9 @@ module PDK
147
148
  #
148
149
  # @raise [PDK::CLI::ExitWithError] if the file is not writeable.
149
150
  def write_file(path, content)
150
- FileUtils.mkdir_p(File.dirname(path))
151
+ require 'pdk/util/filesystem'
152
+
153
+ PDK::Util::Filesystem.mkdir_p(File.dirname(path))
151
154
  PDK.logger.debug(_("writing '%{path}'") % { path: path })
152
155
  PDK::Util::Filesystem.write_file(path, content)
153
156
  rescue Errno::EACCES
@@ -167,6 +170,9 @@ module PDK
167
170
  #
168
171
  # @return [String] The unified diff of the pending changes to the file.
169
172
  def unified_diff(path, old_content, new_content, lines_of_context = 3)
173
+ require 'diff/lcs'
174
+ require 'English'
175
+
170
176
  output = []
171
177
 
172
178
  old_lines = old_content.split($INPUT_RECORD_SEPARATOR).map(&:chomp)
@@ -176,6 +182,8 @@ module PDK
176
182
 
177
183
  return if diffs.empty?
178
184
 
185
+ require 'diff/lcs/hunk'
186
+
179
187
  file_mtime = File.stat(path).mtime.localtime.strftime('%Y-%m-%d %H:%M:%S.%N %z')
180
188
  now = Time.now.localtime.strftime('%Y-%m-%d %H:%M:%S.%N %z')
181
189