pdk 1.9.0 → 3.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (163) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +744 -711
  3. data/README.md +23 -21
  4. data/lib/pdk/answer_file.rb +3 -112
  5. data/lib/pdk/bolt.rb +20 -0
  6. data/lib/pdk/cli/build.rb +51 -54
  7. data/lib/pdk/cli/bundle.rb +33 -29
  8. data/lib/pdk/cli/console.rb +148 -0
  9. data/lib/pdk/cli/convert.rb +46 -37
  10. data/lib/pdk/cli/env.rb +51 -0
  11. data/lib/pdk/cli/errors.rb +4 -3
  12. data/lib/pdk/cli/exec/command.rb +285 -0
  13. data/lib/pdk/cli/exec/interactive_command.rb +109 -0
  14. data/lib/pdk/cli/exec.rb +32 -201
  15. data/lib/pdk/cli/exec_group.rb +79 -43
  16. data/lib/pdk/cli/get/config.rb +26 -0
  17. data/lib/pdk/cli/get.rb +22 -0
  18. data/lib/pdk/cli/new/class.rb +20 -22
  19. data/lib/pdk/cli/new/defined_type.rb +21 -21
  20. data/lib/pdk/cli/new/fact.rb +27 -0
  21. data/lib/pdk/cli/new/function.rb +27 -0
  22. data/lib/pdk/cli/new/module.rb +40 -29
  23. data/lib/pdk/cli/new/provider.rb +18 -18
  24. data/lib/pdk/cli/new/task.rb +23 -22
  25. data/lib/pdk/cli/new/test.rb +52 -0
  26. data/lib/pdk/cli/new/transport.rb +27 -0
  27. data/lib/pdk/cli/new.rb +15 -9
  28. data/lib/pdk/cli/release/prep.rb +39 -0
  29. data/lib/pdk/cli/release/publish.rb +46 -0
  30. data/lib/pdk/cli/release.rb +185 -0
  31. data/lib/pdk/cli/remove/config.rb +83 -0
  32. data/lib/pdk/cli/remove.rb +22 -0
  33. data/lib/pdk/cli/set/config.rb +121 -0
  34. data/lib/pdk/cli/set.rb +22 -0
  35. data/lib/pdk/cli/test/unit.rb +71 -69
  36. data/lib/pdk/cli/test.rb +9 -8
  37. data/lib/pdk/cli/update.rb +38 -21
  38. data/lib/pdk/cli/util/command_redirector.rb +13 -3
  39. data/lib/pdk/cli/util/interview.rb +25 -9
  40. data/lib/pdk/cli/util/option_normalizer.rb +6 -6
  41. data/lib/pdk/cli/util/option_validator.rb +19 -9
  42. data/lib/pdk/cli/util/spinner.rb +13 -0
  43. data/lib/pdk/cli/util/update_manager_printer.rb +82 -0
  44. data/lib/pdk/cli/util.rb +105 -48
  45. data/lib/pdk/cli/validate.rb +96 -111
  46. data/lib/pdk/cli.rb +134 -87
  47. data/lib/pdk/config/errors.rb +5 -0
  48. data/lib/pdk/config/ini_file.rb +184 -0
  49. data/lib/pdk/config/ini_file_setting.rb +35 -0
  50. data/lib/pdk/config/json.rb +35 -0
  51. data/lib/pdk/config/json_schema_namespace.rb +137 -0
  52. data/lib/pdk/config/json_schema_setting.rb +51 -0
  53. data/lib/pdk/config/json_with_schema.rb +47 -0
  54. data/lib/pdk/config/namespace.rb +362 -0
  55. data/lib/pdk/config/setting.rb +134 -0
  56. data/lib/pdk/config/task_schema.json +116 -0
  57. data/lib/pdk/config/validator.rb +31 -0
  58. data/lib/pdk/config/yaml.rb +41 -0
  59. data/lib/pdk/config/yaml_with_schema.rb +51 -0
  60. data/lib/pdk/config.rb +304 -0
  61. data/lib/pdk/context/control_repo.rb +61 -0
  62. data/lib/pdk/context/module.rb +28 -0
  63. data/lib/pdk/context/none.rb +22 -0
  64. data/lib/pdk/context.rb +98 -0
  65. data/lib/pdk/control_repo.rb +89 -0
  66. data/lib/pdk/generate/defined_type.rb +27 -33
  67. data/lib/pdk/generate/fact.rb +26 -0
  68. data/lib/pdk/generate/function.rb +49 -0
  69. data/lib/pdk/generate/module.rb +160 -153
  70. data/lib/pdk/generate/provider.rb +16 -69
  71. data/lib/pdk/generate/puppet_class.rb +27 -32
  72. data/lib/pdk/generate/puppet_object.rb +100 -159
  73. data/lib/pdk/generate/task.rb +34 -51
  74. data/lib/pdk/generate/transport.rb +34 -0
  75. data/lib/pdk/generate.rb +21 -8
  76. data/lib/pdk/logger.rb +24 -6
  77. data/lib/pdk/module/build.rb +125 -37
  78. data/lib/pdk/module/convert.rb +146 -65
  79. data/lib/pdk/module/metadata.rb +72 -71
  80. data/lib/pdk/module/release.rb +255 -0
  81. data/lib/pdk/module/update.rb +48 -37
  82. data/lib/pdk/module/update_manager.rb +75 -39
  83. data/lib/pdk/module.rb +10 -2
  84. data/lib/pdk/monkey_patches.rb +268 -0
  85. data/lib/pdk/report/event.rb +36 -48
  86. data/lib/pdk/report.rb +35 -22
  87. data/lib/pdk/template/fetcher/git.rb +84 -0
  88. data/lib/pdk/template/fetcher/local.rb +29 -0
  89. data/lib/pdk/template/fetcher.rb +100 -0
  90. data/lib/pdk/template/renderer/v1/legacy_template_dir.rb +108 -0
  91. data/lib/pdk/template/renderer/v1/renderer.rb +131 -0
  92. data/lib/pdk/template/renderer/v1/template_file.rb +100 -0
  93. data/lib/pdk/template/renderer/v1.rb +25 -0
  94. data/lib/pdk/template/renderer.rb +97 -0
  95. data/lib/pdk/template/template_dir.rb +67 -0
  96. data/lib/pdk/template.rb +52 -0
  97. data/lib/pdk/tests/unit.rb +101 -51
  98. data/lib/pdk/util/bundler.rb +44 -42
  99. data/lib/pdk/util/changelog_generator.rb +138 -0
  100. data/lib/pdk/util/env.rb +48 -0
  101. data/lib/pdk/util/filesystem.rb +139 -2
  102. data/lib/pdk/util/git.rb +108 -8
  103. data/lib/pdk/util/json_finder.rb +86 -0
  104. data/lib/pdk/util/puppet_strings.rb +125 -0
  105. data/lib/pdk/util/puppet_version.rb +71 -87
  106. data/lib/pdk/util/ruby_version.rb +49 -25
  107. data/lib/pdk/util/template_uri.rb +283 -0
  108. data/lib/pdk/util/vendored_file.rb +34 -42
  109. data/lib/pdk/util/version.rb +11 -10
  110. data/lib/pdk/util/windows/api_types.rb +74 -44
  111. data/lib/pdk/util/windows/file.rb +31 -27
  112. data/lib/pdk/util/windows/process.rb +74 -0
  113. data/lib/pdk/util/windows/string.rb +19 -12
  114. data/lib/pdk/util/windows.rb +2 -0
  115. data/lib/pdk/util.rb +111 -124
  116. data/lib/pdk/validate/control_repo/control_repo_validator_group.rb +23 -0
  117. data/lib/pdk/validate/control_repo/environment_conf_validator.rb +98 -0
  118. data/lib/pdk/validate/external_command_validator.rb +213 -0
  119. data/lib/pdk/validate/internal_ruby_validator.rb +101 -0
  120. data/lib/pdk/validate/invokable_validator.rb +238 -0
  121. data/lib/pdk/validate/metadata/metadata_json_lint_validator.rb +84 -0
  122. data/lib/pdk/validate/metadata/metadata_syntax_validator.rb +76 -0
  123. data/lib/pdk/validate/metadata/metadata_validator_group.rb +20 -0
  124. data/lib/pdk/validate/puppet/puppet_epp_validator.rb +131 -0
  125. data/lib/pdk/validate/puppet/puppet_lint_validator.rb +66 -0
  126. data/lib/pdk/validate/puppet/puppet_plan_syntax_validator.rb +38 -0
  127. data/lib/pdk/validate/puppet/puppet_syntax_validator.rb +135 -0
  128. data/lib/pdk/validate/puppet/puppet_validator_group.rb +22 -0
  129. data/lib/pdk/validate/ruby/ruby_rubocop_validator.rb +79 -0
  130. data/lib/pdk/validate/ruby/ruby_validator_group.rb +19 -0
  131. data/lib/pdk/validate/tasks/tasks_metadata_lint_validator.rb +83 -0
  132. data/lib/pdk/validate/tasks/tasks_name_validator.rb +45 -0
  133. data/lib/pdk/validate/tasks/tasks_validator_group.rb +20 -0
  134. data/lib/pdk/validate/validator.rb +120 -0
  135. data/lib/pdk/validate/validator_group.rb +107 -0
  136. data/lib/pdk/validate/yaml/yaml_syntax_validator.rb +86 -0
  137. data/lib/pdk/validate/yaml/yaml_validator_group.rb +19 -0
  138. data/lib/pdk/validate.rb +86 -12
  139. data/lib/pdk/version.rb +2 -2
  140. data/lib/pdk.rb +60 -10
  141. metadata +138 -100
  142. data/lib/pdk/cli/module/build.rb +0 -14
  143. data/lib/pdk/cli/module/generate.rb +0 -45
  144. data/lib/pdk/cli/module.rb +0 -14
  145. data/lib/pdk/i18n.rb +0 -4
  146. data/lib/pdk/module/templatedir.rb +0 -321
  147. data/lib/pdk/template_file.rb +0 -95
  148. data/lib/pdk/validate/base_validator.rb +0 -215
  149. data/lib/pdk/validate/metadata/metadata_json_lint.rb +0 -86
  150. data/lib/pdk/validate/metadata/metadata_syntax.rb +0 -109
  151. data/lib/pdk/validate/metadata_validator.rb +0 -30
  152. data/lib/pdk/validate/puppet/puppet_lint.rb +0 -67
  153. data/lib/pdk/validate/puppet/puppet_syntax.rb +0 -112
  154. data/lib/pdk/validate/puppet_validator.rb +0 -30
  155. data/lib/pdk/validate/ruby/rubocop.rb +0 -77
  156. data/lib/pdk/validate/ruby_validator.rb +0 -29
  157. data/lib/pdk/validate/tasks/metadata_lint.rb +0 -126
  158. data/lib/pdk/validate/tasks/name.rb +0 -88
  159. data/lib/pdk/validate/tasks_validator.rb +0 -33
  160. data/lib/pdk/validate/yaml/syntax.rb +0 -109
  161. data/lib/pdk/validate/yaml_validator.rb +0 -31
  162. data/locales/config.yaml +0 -21
  163. data/locales/pdk.pot +0 -1291
@@ -0,0 +1,22 @@
1
+ module PDK
2
+ module CLI
3
+ @remove_cmd = @base_cmd.define_command do
4
+ name 'remove'
5
+ usage 'remove [subcommand] [options]'
6
+ summary 'Remove or delete information about the PDK or current project.'
7
+ default_subcommand 'help'
8
+
9
+ run do |_opts, args, _cmd|
10
+ if args == ['help']
11
+ PDK::CLI.run(['remove', '--help'])
12
+ exit 0
13
+ end
14
+
15
+ PDK::CLI.run(['remove', 'help']) if args.empty?
16
+ end
17
+ end
18
+ @remove_cmd.add_command Cri::Command.new_basic_help
19
+ end
20
+ end
21
+
22
+ require 'pdk/cli/remove/config'
@@ -0,0 +1,121 @@
1
+ module PDK
2
+ module CLI
3
+ module Set
4
+ module Config
5
+ ALLOWED_TYPE_NAMES = ['array', 'boolean', 'number', 'string'].freeze
6
+
7
+ # :nocov:
8
+ def self.pretty_allowed_names
9
+ ALLOWED_TYPE_NAMES.map { |name| "'#{name}'" }.join(', ')
10
+ end
11
+ # :nocov:
12
+
13
+ def self.transform_value(type_name, value)
14
+ normalized_name = type_name.downcase.strip
15
+ unless ALLOWED_TYPE_NAMES.include?(normalized_name)
16
+ raise PDK::CLI::ExitWithError, format('Unknown type %{type_name}. Expected one of %{allowed}', type_name: type_name, allowed: pretty_allowed_names)
17
+ end
18
+
19
+ # Short circuit string conversions as it's trivial
20
+ if normalized_name == 'string'
21
+ raise PDK::CLI::ExitWithError, format('An error occured converting \'%{value}\' into a %{type_name}', value: value.nil? ? 'nil' : value, type_name: type_name) unless value.is_a?(String)
22
+
23
+ return value
24
+ end
25
+
26
+ begin
27
+ case normalized_name
28
+ when 'array'
29
+ convert_to_array(value)
30
+ when 'boolean'
31
+ convert_to_boolean(value)
32
+ when 'number'
33
+ convert_to_number(value)
34
+ else
35
+ value
36
+ end
37
+ rescue ArgumentError, TypeError
38
+ raise PDK::CLI::ExitWithError, format('An error occured converting \'%{value}\' into a %{type_name}', value: value.nil? ? 'nil' : value, type_name: type_name)
39
+ end
40
+ end
41
+
42
+ def self.convert_to_array(value)
43
+ return [] if value.nil?
44
+
45
+ value.is_a?(Array) ? value : [value]
46
+ end
47
+ private_class_method :convert_to_array
48
+
49
+ def self.convert_to_boolean(value)
50
+ string_val = value.to_s.strip.downcase
51
+
52
+ return true if ['yes', 'true', '-1', '1'].include?(string_val)
53
+ return false if ['no', 'false', '0'].include?(string_val)
54
+
55
+ raise ArgumentError
56
+ end
57
+ private_class_method :convert_to_boolean
58
+
59
+ def self.convert_to_number(value)
60
+ float_val = Float(value)
61
+ # Return an Integer if this is actually and Integer, otherwise return the float
62
+ float_val.truncate == float_val ? float_val.truncate : float_val
63
+ end
64
+ private_class_method :convert_to_number
65
+
66
+ def self.run(opts, args)
67
+ item_name = args.count.positive? ? args[0] : nil
68
+ item_value = args.count > 1 ? args[1] : nil
69
+
70
+ opts[:type] = opts[:as] if opts[:type].nil? && !opts[:as].nil?
71
+ force = opts[:force] || false
72
+
73
+ # Transform the value if we need to
74
+ item_value = PDK::CLI::Set::Config.transform_value(opts[:type], item_value) unless opts[:type].nil?
75
+
76
+ raise PDK::CLI::ExitWithError, 'Configuration name is required' if item_name.nil?
77
+ raise PDK::CLI::ExitWithError, 'Configuration value is required. If you wish to remove a value use \'pdk remove config\'' if item_value.nil?
78
+
79
+ current_value = PDK.config.get(item_name)
80
+ raise PDK::CLI::ExitWithError, format("The configuration item '%{name}' can not have a value set.", name: item_name) if current_value.is_a?(PDK::Config::Namespace)
81
+
82
+ # If we're forcing the value, don't do any munging
83
+ # Check if the setting already exists
84
+ if !force && (current_value.is_a?(Array) && current_value.include?(item_value))
85
+ PDK.logger.info(format("No changes made to '%{name}' as it already contains value '%{to}'", name: item_name, to: item_value))
86
+ return 0
87
+ end
88
+
89
+ new_value = PDK.config.set(item_name, item_value, force: opts[:force])
90
+ if current_value.nil? || force
91
+ PDK.logger.info(format("Set initial value of '%{name}' to '%{to}'", name: item_name, to: new_value))
92
+ elsif current_value.is_a?(Array)
93
+ # Arrays have a special output format
94
+ PDK.logger.info(format("Added new value '%{to}' to '%{name}'", name: item_name, to: item_value))
95
+ else
96
+ PDK.logger.info(format("Changed existing value of '%{name}' from '%{from}' to '%{to}'", name: item_name, from: current_value, to: new_value))
97
+ end
98
+
99
+ # Same output as `get config`
100
+ $stdout.puts format('%{name}=%{value}', name: item_name, value: PDK.config.get(item_name))
101
+ 0
102
+ end
103
+ end
104
+ end
105
+
106
+ @set_config_cmd = @set_cmd.define_command do
107
+ name 'config'
108
+ usage 'config [name] [value]'
109
+ summary 'Set or update the configuration for <name>'
110
+
111
+ option :f, :force, 'Force the configuration setting to be overwitten.', argument: :forbidden
112
+
113
+ option :t, :type, format('The type of value to set. Acceptable values: %{values}', values: PDK::CLI::Set::Config.pretty_allowed_names), argument: :required
114
+ option nil, :as, 'Alias of --type', argument: :required
115
+
116
+ run do |opts, args, _cmd|
117
+ exit PDK::CLI::Set::Config.run(opts, args)
118
+ end
119
+ end
120
+ end
121
+ end
@@ -0,0 +1,22 @@
1
+ module PDK
2
+ module CLI
3
+ @set_cmd = @base_cmd.define_command do
4
+ name 'set'
5
+ usage 'set [subcommand] [options]'
6
+ summary 'Set or update information about the PDK or current project.'
7
+ default_subcommand 'help'
8
+
9
+ run do |_opts, args, _cmd|
10
+ if args == ['help']
11
+ PDK::CLI.run(['set', '--help'])
12
+ exit 0
13
+ end
14
+
15
+ PDK::CLI.run(['set', 'help']) if args.empty?
16
+ end
17
+ end
18
+ @set_cmd.add_command Cri::Command.new_basic_help
19
+ end
20
+ end
21
+
22
+ require 'pdk/cli/set/config'
@@ -1,87 +1,89 @@
1
- require 'pdk/cli/util/option_validator'
2
- require 'pdk/report'
3
-
4
- module PDK::CLI
5
- @test_unit_cmd = @test_cmd.define_command do
6
- name 'unit'
7
- usage _('unit [options]')
8
- summary _('Run unit tests.')
9
-
10
- PDK::CLI.puppet_version_options(self)
11
- PDK::CLI.puppet_dev_option(self)
12
- flag nil, :list, _('List all available unit test files.')
13
- flag nil, :parallel, _('Run unit tests in parallel.')
14
- flag :v, :verbose, _('More verbose --list output. Displays a list of examples in each unit test file.')
15
- flag :c, 'clean-fixtures', _('Clean up downloaded fixtures after the test run.')
16
-
17
- option nil, :tests, _('Specify a comma-separated list of unit test files to run.'), argument: :required, default: '' do |values|
18
- PDK::CLI::Util::OptionValidator.comma_separated_list?(values)
19
- end
20
-
21
- # TODO
22
- # option nil, :runner_options, _("options to pass through to the actual test-runner"), argument: :required
23
-
24
- run do |opts, _args, _cmd|
25
- require 'pdk/tests/unit'
1
+ module PDK
2
+ module CLI
3
+ @test_unit_cmd = @test_cmd.define_command do
4
+ name 'unit'
5
+ usage 'unit [options]'
6
+ summary 'Run unit tests.'
7
+
8
+ PDK::CLI.puppet_version_options(self)
9
+ PDK::CLI.puppet_dev_option(self)
10
+ flag nil, :list, 'List all available unit test files.'
11
+ flag nil, :parallel, 'Run unit tests in parallel.'
12
+ flag :v, :verbose, 'More verbose --list output. Displays a list of examples in each unit test file.'
13
+ flag :c, 'clean-fixtures', 'Clean up downloaded fixtures after the test run.'
14
+
15
+ option nil, :tests, 'Specify a comma-separated list of unit test files to run.', argument: :required, default: '' do |values|
16
+ require 'pdk/cli/util/option_validator'
17
+ PDK::CLI::Util::OptionValidator.comma_separated_list?(values)
18
+ end
26
19
 
27
- PDK::CLI::Util.validate_puppet_version_opts(opts)
20
+ # TODO
21
+ # option nil, :runner_options, "options to pass through to the actual test-runner", argument: :required
28
22
 
29
- PDK::CLI::Util.ensure_in_module!(
30
- message: _('Unit tests can only be run from inside a valid module directory.'),
31
- log_level: :info,
32
- )
23
+ run do |opts, _args, _cmd|
24
+ require 'pdk/tests/unit'
25
+ require 'pdk/report'
26
+ require 'pdk/util/bundler'
33
27
 
34
- PDK::CLI::Util.module_version_check
28
+ PDK::CLI::Util.validate_puppet_version_opts(opts)
35
29
 
36
- report = nil
30
+ PDK::CLI::Util.ensure_in_module!(
31
+ message: 'Unit tests can only be run from inside a valid module directory.',
32
+ log_level: :info
33
+ )
37
34
 
38
- if opts[:list]
39
- examples = PDK::Test::Unit.list
40
- if examples.empty?
41
- puts _('No unit test files with examples were found.')
42
- else
43
- puts _('Unit Test Files:')
44
- files = examples.map { |example| example[:file_path] }
45
- files.uniq.each do |file|
46
- puts _(file)
35
+ PDK::CLI::Util.module_version_check
47
36
 
48
- next unless opts[:verbose]
49
-
50
- file_examples = examples.select { |example| example[:file_path] == file }
51
- file_examples.each do |file_example|
52
- puts _("\t%{id}\t%{description}" % { id: file_example[:id], description: file_example[:full_description] })
53
- end
54
- end
55
- end
56
- else
57
- PDK.logger.info _('--verbose has no effect when not used with --list') if opts[:verbose]
58
-
59
- report = PDK::Report.new
60
- report_formats = if opts[:format]
61
- PDK::CLI::Util::OptionNormalizer.report_formats(opts[:format])
62
- else
63
- [{
64
- method: PDK::Report.default_format,
65
- target: PDK::Report.default_target,
66
- }]
67
- end
68
-
69
- # Ensure that the bundled gems are up to date and correct Ruby is activated before running tests.
37
+ # Ensure that the bundled gems are up to date and correct Ruby is activated before running or listing tests.
70
38
  puppet_env = PDK::CLI::Util.puppet_from_opts_or_env(opts)
71
- PDK::Util::PuppetVersion.fetch_puppet_dev if opts.key?(:'puppet-dev')
72
39
  PDK::Util::RubyVersion.use(puppet_env[:ruby_version])
73
40
 
74
41
  opts.merge!(puppet_env[:gemset])
75
42
 
76
43
  PDK::Util::Bundler.ensure_bundle!(puppet_env[:gemset])
77
44
 
78
- exit_code = PDK::Test::Unit.invoke(report, opts)
45
+ report = nil
79
46
 
80
- report_formats.each do |format|
81
- report.send(format[:method], format[:target])
82
- end
47
+ if opts[:list]
48
+ examples = PDK::Test::Unit.list(opts)
49
+
50
+ if examples.empty?
51
+ puts 'No unit test files with examples were found.'
52
+ else
53
+ puts 'Unit Test Files:'
54
+ files = examples.map { |example| example[:file_path] }
55
+ files.uniq.each do |file|
56
+ puts file
57
+
58
+ next unless opts[:verbose]
83
59
 
84
- exit exit_code
60
+ file_examples = examples.select { |example| example[:file_path] == file }
61
+ file_examples.each do |file_example|
62
+ puts format("\t%{id}\t%{description}", id: file_example[:id], description: file_example[:full_description])
63
+ end
64
+ end
65
+ end
66
+ else
67
+ report = PDK::Report.new
68
+ report_formats = if opts[:format]
69
+ opts[:interactive] = false
70
+ PDK::CLI::Util::OptionNormalizer.report_formats(opts[:format])
71
+ else
72
+ opts[:interactive] = true
73
+ [{
74
+ method: PDK::Report.default_format,
75
+ target: PDK::Report.default_target
76
+ }]
77
+ end
78
+
79
+ exit_code = PDK::Test::Unit.invoke(report, opts)
80
+
81
+ report_formats.each do |format|
82
+ report.send(format[:method], format[:target])
83
+ end
84
+
85
+ exit exit_code
86
+ end
85
87
  end
86
88
  end
87
89
  end
data/lib/pdk/cli/test.rb CHANGED
@@ -1,12 +1,13 @@
1
-
2
- module PDK::CLI
3
- @test_cmd = @base_cmd.define_command do
4
- name 'test'
5
- usage _('test [subcommand] [options]')
6
- summary _('Run tests.')
7
- default_subcommand 'help'
1
+ module PDK
2
+ module CLI
3
+ @test_cmd = @base_cmd.define_command do
4
+ name 'test'
5
+ usage 'test [subcommand] [options]'
6
+ summary 'Run tests.'
7
+ default_subcommand 'help'
8
+ end
9
+ @test_cmd.add_command Cri::Command.new_basic_help
8
10
  end
9
- @test_cmd.add_command Cri::Command.new_basic_help
10
11
  end
11
12
 
12
13
  require 'pdk/cli/test/unit'
@@ -1,32 +1,49 @@
1
- require 'pdk/cli/util'
2
- require 'pdk/util'
1
+ module PDK
2
+ module CLI
3
+ @update_cmd = @base_cmd.define_command do
4
+ name 'update'
5
+ usage 'update [options]'
6
+ summary 'Update a module that has been created by or converted for use by PDK.'
3
7
 
4
- module PDK::CLI
5
- @update_cmd = @base_cmd.define_command do
6
- name 'update'
7
- usage _('update [options]')
8
- summary _('Update a module that has been created by or converted for use by PDK.')
8
+ flag nil, :noop, 'Do not update the module, just output what would be done.'
9
+ flag nil, :force, 'Update the module automatically, with no prompts.'
9
10
 
10
- flag nil, :noop, _('Do not update the module, just output what would be done.')
11
- flag nil, :force, _('Update the module automatically, with no prompts.')
11
+ PDK::CLI.template_ref_option(self)
12
12
 
13
- run do |opts, _args, _cmd|
14
- require 'pdk/module/update'
13
+ run do |opts, _args, _cmd|
14
+ # Write the context information to the debug log
15
+ PDK.context.to_debug_log
15
16
 
16
- PDK::CLI::Util.ensure_in_module!(
17
- message: _('`pdk update` can only be run from inside a valid module directory.'),
18
- log_level: :info,
19
- )
17
+ unless PDK.context.is_a?(PDK::Context::Module) || PDK.context.is_a?(PDK::Context::ControlRepo)
18
+ raise PDK::CLI::ExitWithError, '`pdk update` can only be run from inside a valid module directory.'
19
+ end
20
20
 
21
- raise PDK::CLI::ExitWithError, _('This module does not appear to be PDK compatible. To make the module compatible with PDK, run `pdk convert`.') unless PDK::Util.module_pdk_compatible?
21
+ raise PDK::CLI::ExitWithError, 'This module does not appear to be PDK compatible. To make the module compatible with PDK, run `pdk convert`.' unless PDK::Util.module_pdk_compatible?
22
22
 
23
- if opts[:noop] && opts[:force]
24
- raise PDK::CLI::ExitWithError, _('You can not specify --noop and --force when updating a module')
25
- end
23
+ raise PDK::CLI::ExitWithError, 'You can not specify --noop and --force when updating a module' if opts[:noop] && opts[:force]
24
+
25
+ if Gem::Version.new(PDK::VERSION) < Gem::Version.new(PDK::Util.module_pdk_version)
26
+ PDK.logger.warn "This module has been updated to PDK #{PDK::Util.module_pdk_version} which is newer than your PDK version (#{PDK::VERSION}), proceed with caution!"
27
+
28
+ unless opts[:force]
29
+ raise PDK::CLI::ExitWithError,
30
+ 'Please update your PDK installation and try again. ' \
31
+ 'You may also use the --force flag to override this and ' \
32
+ 'continue at your own risk.'
33
+ end
34
+ end
26
35
 
27
- updater = PDK::Module::Update.new(opts)
36
+ updater = PDK::Module::Update.new(PDK.context.root_path, opts)
28
37
 
29
- updater.run
38
+ if updater.pinned_to_puppetlabs_template_tag?
39
+ PDK.logger.info format('This module is currently pinned to version %{current_version} ' \
40
+ 'of the default template. If you would like to update your ' \
41
+ 'module to the latest version of the template, please run `pdk ' \
42
+ 'update --template-ref %{new_version}`.', current_version: updater.template_uri.uri_fragment, new_version: PDK::TEMPLATE_REF)
43
+ end
44
+
45
+ updater.run
46
+ end
30
47
  end
31
48
  end
32
49
  end
@@ -1,4 +1,5 @@
1
- require 'tty-prompt'
1
+ require 'pdk'
2
+ require 'tty/prompt'
2
3
 
3
4
  module PDK
4
5
  module CLI
@@ -6,6 +7,15 @@ module PDK
6
7
  class CommandRedirector < TTY::Prompt::AnswersCollector
7
8
  attr_accessor :command
8
9
 
10
+ # Override the initialize method because the original one
11
+ # doesn't work with Ruby 3.
12
+ # rubocop:disable Lint/MissingSuper
13
+ def initialize(prompt, options = {})
14
+ @prompt = prompt
15
+ @answers = options.fetch(:answers) { {} }
16
+ end
17
+ # rubocop:enable Lint/MissingSuper
18
+
9
19
  def pastel
10
20
  @pastel ||= Pastel.new
11
21
  end
@@ -15,9 +25,9 @@ module PDK
15
25
  end
16
26
 
17
27
  def run
18
- @prompt.puts _('Did you mean \'%{command}\'?') % { command: pastel.bold(@command) }
28
+ @prompt.puts "Did you mean '#{pastel.bold(@command)}'?"
19
29
  @prompt.yes?('-->')
20
- rescue TTY::Prompt::Reader::InputInterrupt
30
+ rescue PDK::CLI::Util::Interview::READER::InputInterrupt
21
31
  nil
22
32
  end
23
33
  end
@@ -1,9 +1,21 @@
1
- require 'tty-prompt'
1
+ require 'tty/prompt'
2
+ require 'pdk'
2
3
 
3
4
  module PDK
4
5
  module CLI
5
6
  module Util
6
7
  class Interview < TTY::Prompt::AnswersCollector
8
+ READER = defined?(TTY::Reader) ? TTY::Reader : TTY::Prompt::Reader
9
+
10
+ # Override the initialize method because the original one
11
+ # doesn't work with Ruby 3.
12
+ # rubocop:disable Lint/MissingSuper
13
+ def initialize(prompt, options = {})
14
+ @prompt = prompt
15
+ @answers = options.fetch(:answers) { {} }
16
+ end
17
+ # rubocop:enable Lint/MissingSuper
18
+
7
19
  def pastel
8
20
  @pastel ||= Pastel.new
9
21
  end
@@ -27,11 +39,17 @@ module PDK
27
39
  num_questions = @questions.count
28
40
  @questions.each do |question_name, question|
29
41
  @name = question_name
30
- @prompt.print pastel.bold(_('[Q %{current_number}/%{questions_total}]') % { current_number: i, questions_total: num_questions }) + ' '
42
+ @prompt.print "#{pastel.bold(format('[Q %{current_number}/%{questions_total}]', current_number: i, questions_total: num_questions))} "
31
43
  @prompt.puts pastel.bold(question[:question])
32
44
  @prompt.puts question[:help] if question.key?(:help)
33
- if question.key?(:choices)
34
- multi_select(_('-->'), per_page: question[:choices].count) do |q|
45
+
46
+ case question[:type]
47
+ when :yes
48
+ yes?('-->') do |q|
49
+ q.default(question[:default]) if question.key?(:default)
50
+ end
51
+ when :multi_select
52
+ multi_select('-->', per_page: question[:choices].count) do |q|
35
53
  q.enum ')'
36
54
  q.default(*question[:default]) if question.key?(:default)
37
55
 
@@ -40,12 +58,10 @@ module PDK
40
58
  end
41
59
  end
42
60
  else
43
- ask(_('-->')) do |q|
61
+ ask('-->') do |q|
44
62
  q.required(question.fetch(:required, false))
45
63
 
46
- if question.key?(:validate_pattern)
47
- q.validate(question[:validate_pattern], question[:validate_message])
48
- end
64
+ q.validate(question[:validate_pattern], question[:validate_message]) if question.key?(:validate_pattern)
49
65
 
50
66
  q.default(question[:default]) if question.key?(:default)
51
67
  end
@@ -54,7 +70,7 @@ module PDK
54
70
  @prompt.puts ''
55
71
  end
56
72
  @answers
57
- rescue TTY::Prompt::Reader::InputInterrupt
73
+ rescue READER::InputInterrupt
58
74
  nil
59
75
  end
60
76
  end
@@ -1,9 +1,12 @@
1
+ require 'pdk'
2
+
1
3
  module PDK
2
4
  module CLI
3
5
  module Util
4
6
  class OptionNormalizer
5
7
  def self.comma_separated_list_to_array(list, _options = {})
6
- raise _('Error: expected comma separated list') unless OptionValidator.comma_separated_list?(list)
8
+ raise 'Error: expected comma separated list' unless OptionValidator.comma_separated_list?(list)
9
+
7
10
  list.split(',').compact
8
11
  end
9
12
 
@@ -29,10 +32,7 @@ module PDK
29
32
  begin
30
33
  OptionValidator.enum(format, PDK::Report.formats)
31
34
  rescue ArgumentError
32
- raise PDK::CLI::ExitWithError, _("'%{name}' is not a valid report format (%{valid})") % {
33
- name: format,
34
- valid: PDK::Report.formats.join(', '),
35
- }
35
+ raise PDK::CLI::ExitWithError, format("'%{name}' is not a valid report format (%{valid})", name: format, valid: PDK::Report.formats.join(', '))
36
36
  end
37
37
 
38
38
  case target
@@ -44,7 +44,7 @@ module PDK
44
44
  target = PDK::Report.default_target
45
45
  end
46
46
 
47
- { method: "write_#{format}".to_sym, target: target }
47
+ { method: :"write_#{format}", target: target }
48
48
  end
49
49
  end
50
50
  end
@@ -1,18 +1,23 @@
1
+ require 'pdk'
2
+
1
3
  module PDK
2
4
  module CLI
3
5
  module Util
4
6
  class OptionValidator
5
7
  def self.comma_separated_list?(list, _options = {})
6
- (list =~ %r{^[\w\-]+(?:,[\w\-]+)+$}) ? true : false
8
+ /^[\w-]+(?:,[\w-]+)+$/.match?(list)
9
+ end
10
+
11
+ # @return [Boolean] true if the fact name is valid
12
+ def self.valid_fact_name?(name)
13
+ name.length > 1
7
14
  end
8
15
 
9
16
  def self.enum(val, valid_entries, _options = {})
10
17
  vals = val.is_a?(Array) ? val : [val]
11
18
  invalid_entries = vals.reject { |e| valid_entries.include?(e) }
12
19
 
13
- unless invalid_entries.empty?
14
- raise ArgumentError, _('Error: the following values are invalid: %{invalid_entries}') % { invalid_entries: invalid_entries }
15
- end
20
+ raise ArgumentError, format('Error: the following values are invalid: %{invalid_entries}', invalid_entries: invalid_entries) unless invalid_entries.empty?
16
21
 
17
22
  val
18
23
  end
@@ -20,7 +25,7 @@ module PDK
20
25
  # Validate the module name against the regular expression in the
21
26
  # documentation: https://docs.puppet.com/puppet/4.10/modules_fundamentals.html#allowed-module-names
22
27
  def self.valid_module_name?(string)
23
- !(string =~ %r{\A[a-z][a-z0-9_]*\Z}).nil?
28
+ !(string =~ /\A[a-z][a-z0-9_]*\Z/).nil?
24
29
  end
25
30
  singleton_class.send(:alias_method, :valid_task_name?, :valid_module_name?)
26
31
 
@@ -28,13 +33,18 @@ module PDK
28
33
  # Let's assume that only strings similar to module names can actually be resolved by the puppet language.
29
34
  singleton_class.send(:alias_method, :valid_provider_name?, :valid_module_name?)
30
35
 
36
+ # The name has to be a ruby symbol.
37
+ # While overly strict, let's apply the provider and module name rules for consistency.
38
+ singleton_class.send(:alias_method, :valid_transport_name?, :valid_provider_name?)
39
+
31
40
  # Validate a Puppet namespace against the regular expression in the
32
41
  # documentation: https://docs.puppet.com/puppet/4.10/lang_reserved.html#classes-and-defined-resource-types
33
42
  def self.valid_namespace?(string)
34
43
  return false if (string || '').split('::').last == 'init'
35
44
 
36
- !(string =~ %r{\A([a-z][a-z0-9_]*)(::[a-z][a-z0-9_]*)*\Z}).nil?
45
+ !(string =~ /\A([a-z][a-z0-9_]*)(::[a-z][a-z0-9_]*)*\Z/).nil?
37
46
  end
47
+ singleton_class.send(:alias_method, :valid_function_name?, :valid_namespace?)
38
48
 
39
49
  singleton_class.send(:alias_method, :valid_class_name?, :valid_namespace?)
40
50
  singleton_class.send(:alias_method, :valid_defined_type_name?, :valid_namespace?)
@@ -44,11 +54,11 @@ module PDK
44
54
  # The parameter should also not be a reserved word or overload
45
55
  # a metaparameter.
46
56
  def self.valid_param_name?(string)
47
- reserved_words = %w[trusted facts server_facts title name].freeze
48
- metaparams = %w[alias audit before loglevel noop notify require schedule stage subscribe tag].freeze
57
+ reserved_words = ['trusted', 'facts', 'server_facts', 'title', 'name'].freeze
58
+ metaparams = ['alias', 'audit', 'before', 'loglevel', 'noop', 'notify', 'require', 'schedule', 'stage', 'subscribe', 'tag'].freeze
49
59
  return false if reserved_words.include?(string) || metaparams.include?(string)
50
60
 
51
- !(string =~ %r{\A[a-z][a-zA-Z0-9_]*\Z}).nil?
61
+ !(string =~ /\A[a-z][a-zA-Z0-9_]*\Z/).nil?
52
62
  end
53
63
  end
54
64
  end
@@ -0,0 +1,13 @@
1
+ require 'tty-spinner'
2
+
3
+ # Replace the built-in tty check in tty-spinner with our own implementation
4
+ # that allows us to mock the behaviour during acceptance tests.
5
+ module TTY
6
+ class Spinner
7
+ def tty?
8
+ require 'pdk/cli/util'
9
+
10
+ PDK::CLI::Util.interactive?
11
+ end
12
+ end
13
+ end