pdk-akerl 1.8.0.1

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 (81) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +826 -0
  3. data/LICENSE +201 -0
  4. data/README.md +133 -0
  5. data/exe/pdk +10 -0
  6. data/lib/pdk.rb +10 -0
  7. data/lib/pdk/answer_file.rb +121 -0
  8. data/lib/pdk/cli.rb +113 -0
  9. data/lib/pdk/cli/build.rb +76 -0
  10. data/lib/pdk/cli/bundle.rb +42 -0
  11. data/lib/pdk/cli/convert.rb +41 -0
  12. data/lib/pdk/cli/errors.rb +23 -0
  13. data/lib/pdk/cli/exec.rb +246 -0
  14. data/lib/pdk/cli/exec_group.rb +67 -0
  15. data/lib/pdk/cli/module.rb +14 -0
  16. data/lib/pdk/cli/module/build.rb +14 -0
  17. data/lib/pdk/cli/module/generate.rb +45 -0
  18. data/lib/pdk/cli/new.rb +17 -0
  19. data/lib/pdk/cli/new/class.rb +32 -0
  20. data/lib/pdk/cli/new/defined_type.rb +30 -0
  21. data/lib/pdk/cli/new/module.rb +41 -0
  22. data/lib/pdk/cli/new/provider.rb +27 -0
  23. data/lib/pdk/cli/new/task.rb +31 -0
  24. data/lib/pdk/cli/test.rb +12 -0
  25. data/lib/pdk/cli/test/unit.rb +88 -0
  26. data/lib/pdk/cli/update.rb +32 -0
  27. data/lib/pdk/cli/util.rb +193 -0
  28. data/lib/pdk/cli/util/command_redirector.rb +26 -0
  29. data/lib/pdk/cli/util/interview.rb +63 -0
  30. data/lib/pdk/cli/util/option_normalizer.rb +53 -0
  31. data/lib/pdk/cli/util/option_validator.rb +56 -0
  32. data/lib/pdk/cli/validate.rb +124 -0
  33. data/lib/pdk/generate.rb +11 -0
  34. data/lib/pdk/generate/defined_type.rb +49 -0
  35. data/lib/pdk/generate/module.rb +318 -0
  36. data/lib/pdk/generate/provider.rb +82 -0
  37. data/lib/pdk/generate/puppet_class.rb +48 -0
  38. data/lib/pdk/generate/puppet_object.rb +288 -0
  39. data/lib/pdk/generate/task.rb +86 -0
  40. data/lib/pdk/i18n.rb +4 -0
  41. data/lib/pdk/logger.rb +28 -0
  42. data/lib/pdk/module.rb +21 -0
  43. data/lib/pdk/module/build.rb +214 -0
  44. data/lib/pdk/module/convert.rb +209 -0
  45. data/lib/pdk/module/metadata.rb +193 -0
  46. data/lib/pdk/module/templatedir.rb +313 -0
  47. data/lib/pdk/module/update.rb +111 -0
  48. data/lib/pdk/module/update_manager.rb +210 -0
  49. data/lib/pdk/report.rb +112 -0
  50. data/lib/pdk/report/event.rb +357 -0
  51. data/lib/pdk/template_file.rb +89 -0
  52. data/lib/pdk/tests/unit.rb +213 -0
  53. data/lib/pdk/util.rb +271 -0
  54. data/lib/pdk/util/bundler.rb +253 -0
  55. data/lib/pdk/util/filesystem.rb +12 -0
  56. data/lib/pdk/util/git.rb +74 -0
  57. data/lib/pdk/util/puppet_version.rb +242 -0
  58. data/lib/pdk/util/ruby_version.rb +147 -0
  59. data/lib/pdk/util/vendored_file.rb +88 -0
  60. data/lib/pdk/util/version.rb +42 -0
  61. data/lib/pdk/util/windows.rb +13 -0
  62. data/lib/pdk/util/windows/api_types.rb +57 -0
  63. data/lib/pdk/util/windows/file.rb +36 -0
  64. data/lib/pdk/util/windows/string.rb +16 -0
  65. data/lib/pdk/validate.rb +14 -0
  66. data/lib/pdk/validate/base_validator.rb +209 -0
  67. data/lib/pdk/validate/metadata/metadata_json_lint.rb +86 -0
  68. data/lib/pdk/validate/metadata/metadata_syntax.rb +109 -0
  69. data/lib/pdk/validate/metadata_validator.rb +30 -0
  70. data/lib/pdk/validate/puppet/puppet_lint.rb +67 -0
  71. data/lib/pdk/validate/puppet/puppet_syntax.rb +112 -0
  72. data/lib/pdk/validate/puppet_validator.rb +30 -0
  73. data/lib/pdk/validate/ruby/rubocop.rb +77 -0
  74. data/lib/pdk/validate/ruby_validator.rb +29 -0
  75. data/lib/pdk/validate/tasks/metadata_lint.rb +126 -0
  76. data/lib/pdk/validate/tasks/name.rb +88 -0
  77. data/lib/pdk/validate/tasks_validator.rb +33 -0
  78. data/lib/pdk/version.rb +4 -0
  79. data/locales/config.yaml +21 -0
  80. data/locales/pdk.pot +1283 -0
  81. metadata +304 -0
@@ -0,0 +1,67 @@
1
+ require 'tty-spinner'
2
+ require 'tty-which'
3
+
4
+ require 'pdk/util'
5
+
6
+ module PDK
7
+ module CLI
8
+ class ExecGroup
9
+ def initialize(message, opts = {})
10
+ @options = opts.merge(PDK::CLI::Util.spinner_opts_for_platform)
11
+
12
+ if PDK::CLI::Util.interactive?
13
+ @spinner = if parallel?
14
+ TTY::Spinner::Multi.new("[:spinner] #{message}", @options)
15
+ else
16
+ TTY::Spinner.new("[:spinner] #{message}", @options)
17
+ end
18
+ @spinner.auto_spin
19
+ end
20
+
21
+ @threads_or_procs = []
22
+ @exit_codes = []
23
+ end
24
+
25
+ def parallel?
26
+ @options[:parallel].nil? ? true : @options[:parallel]
27
+ end
28
+
29
+ def register(&block)
30
+ raise PDK::CLI::FatalError, 'No block registered' unless block_given?
31
+
32
+ @threads_or_procs << if parallel?
33
+ Thread.new do
34
+ GettextSetup.initialize(File.absolute_path('../../../locales', File.dirname(__FILE__)))
35
+ GettextSetup.negotiate_locale!(GettextSetup.candidate_locales)
36
+ @exit_codes << yield
37
+ end
38
+ else
39
+ block
40
+ end
41
+ end
42
+
43
+ def add_spinner(message, opts = {})
44
+ return unless PDK::CLI::Util.interactive?
45
+ @spinner.register("[:spinner] #{message}", @options.merge(opts).merge(PDK::CLI::Util.spinner_opts_for_platform))
46
+ end
47
+
48
+ def exit_code
49
+ if parallel?
50
+ @threads_or_procs.each(&:join)
51
+ else
52
+ @exit_codes = @threads_or_procs.map(&:call)
53
+ end
54
+
55
+ exit_code = @exit_codes.max
56
+
57
+ if exit_code.zero? && @spinner
58
+ @spinner.success
59
+ elsif @spinner
60
+ @spinner.error
61
+ end
62
+
63
+ exit_code
64
+ end
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,14 @@
1
+ module PDK::CLI
2
+ @module_cmd = @base_cmd.define_command do
3
+ name 'module'
4
+ usage _('module [options]')
5
+ summary _('Provide CLI-backwards compatibility to the puppet module tool.')
6
+ description _('This command is only for reminding you how to accomplish tasks with the PDK, when you were previously doing them with the puppet module command.')
7
+ default_subcommand 'help'
8
+ end
9
+
10
+ @module_cmd.add_command Cri::Command.new_basic_help
11
+ end
12
+
13
+ require 'pdk/cli/module/build'
14
+ require 'pdk/cli/module/generate'
@@ -0,0 +1,14 @@
1
+ require 'tty-prompt'
2
+
3
+ module PDK::CLI
4
+ @module_build_cmd = @module_cmd.define_command do
5
+ name 'build'
6
+ usage _('build')
7
+ summary _('This command is now \'pdk build\'.')
8
+
9
+ run do |_opts, _args, _cmd|
10
+ PDK.logger.warn(_('Modules are built using the ‘pdk build’ command.'))
11
+ exit 1
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,45 @@
1
+ require 'tty-prompt'
2
+
3
+ module PDK::CLI
4
+ @module_generate_cmd = @module_cmd.define_command do
5
+ name 'generate'
6
+ usage _('generate [options] <module_name>')
7
+ summary _('This command is now \'pdk new module\'.')
8
+
9
+ PDK::CLI.template_url_option(self)
10
+ PDK::CLI.skip_interview_option(self)
11
+
12
+ run do |opts, args, _cmd|
13
+ require 'pdk/generate/module'
14
+
15
+ module_name = args[0]
16
+
17
+ if module_name.nil? || module_name.empty?
18
+ puts command.help
19
+ exit 1
20
+ end
21
+
22
+ PDK.logger.info(_('New modules are created using the ‘pdk new module’ command.'))
23
+ prompt = TTY::Prompt.new(help_color: :cyan)
24
+ redirect = PDK::CLI::Util::CommandRedirector.new(prompt)
25
+ redirect.target_command('pdk new module')
26
+ answer = redirect.run
27
+
28
+ if answer
29
+ module_name_parts = module_name.split('-', 2)
30
+ if module_name_parts.size > 1
31
+ opts[:username] = module_name_parts[0]
32
+ opts[:module_name] = module_name_parts[1]
33
+ else
34
+ opts[:module_name] = module_name
35
+ end
36
+ opts[:target_dir] = opts[:module_name]
37
+
38
+ PDK.logger.info(_('Creating new module: %{modname}') % { modname: module_name })
39
+ PDK::Generate::Module.invoke(opts)
40
+ else
41
+ exit 1
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,17 @@
1
+ module PDK::CLI
2
+ @new_cmd = @base_cmd.define_command do
3
+ name 'new'
4
+ usage _('new <thing> [options]')
5
+ summary _('create a new module, etc.')
6
+ description _('Creates a new <thing> using relevant options.')
7
+ default_subcommand 'help'
8
+ end
9
+
10
+ @new_cmd.add_command Cri::Command.new_basic_help
11
+ end
12
+
13
+ require 'pdk/cli/new/class'
14
+ require 'pdk/cli/new/defined_type'
15
+ require 'pdk/cli/new/module'
16
+ require 'pdk/cli/new/provider'
17
+ require 'pdk/cli/new/task'
@@ -0,0 +1,32 @@
1
+ module PDK::CLI
2
+ @new_class_cmd = @new_cmd.define_command do
3
+ name 'class'
4
+ usage _('class [options] <class_name>')
5
+ summary _('Create a new class named <class_name> using given options')
6
+
7
+ PDK::CLI.template_url_option(self)
8
+
9
+ run do |opts, args, _cmd|
10
+ require 'pdk/generate/puppet_class'
11
+
12
+ PDK::CLI::Util.ensure_in_module!(
13
+ message: _('Classes can only be created from inside a valid module directory.'),
14
+ log_level: :info,
15
+ )
16
+
17
+ class_name = args[0]
18
+ module_dir = Dir.pwd
19
+
20
+ if class_name.nil? || class_name.empty?
21
+ puts command.help
22
+ exit 1
23
+ end
24
+
25
+ unless Util::OptionValidator.valid_class_name?(class_name)
26
+ raise PDK::CLI::ExitWithError, _("'%{name}' is not a valid class name") % { name: class_name }
27
+ end
28
+
29
+ PDK::Generate::PuppetClass.new(module_dir, class_name, opts).run
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,30 @@
1
+ module PDK::CLI
2
+ @new_define_cmd = @new_cmd.define_command do
3
+ name 'defined_type'
4
+ usage _('defined_type [options] <name>')
5
+ summary _('Create a new defined type named <name> using given options')
6
+
7
+ PDK::CLI.template_url_option(self)
8
+
9
+ run do |opts, args, _cmd|
10
+ PDK::CLI::Util.ensure_in_module!(
11
+ message: _('Defined types can only be created from inside a valid module directory.'),
12
+ log_level: :info,
13
+ )
14
+
15
+ defined_type_name = args[0]
16
+ module_dir = Dir.pwd
17
+
18
+ if defined_type_name.nil? || defined_type_name.empty?
19
+ puts command.help
20
+ exit 1
21
+ end
22
+
23
+ unless Util::OptionValidator.valid_defined_type_name?(defined_type_name)
24
+ raise PDK::CLI::ExitWithError, _("'%{name}' is not a valid defined type name") % { name: defined_type_name }
25
+ end
26
+
27
+ PDK::Generate::DefinedType.new(module_dir, defined_type_name, opts).run
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,41 @@
1
+ module PDK::CLI
2
+ @new_module_cmd = @new_cmd.define_command do
3
+ name 'module'
4
+ usage _('module [options] [module_name] [target_dir]')
5
+ summary _('Create a new module named [module_name] using given options')
6
+
7
+ PDK::CLI.template_url_option(self)
8
+ PDK::CLI.skip_interview_option(self)
9
+ PDK::CLI.full_interview_option(self)
10
+
11
+ option nil, 'license', _('Specifies the license this module is written under. ' \
12
+ "This should be a identifier from https://spdx.org/licenses/. Common values are 'Apache-2.0', 'MIT', or 'proprietary'."), argument: :required
13
+ option nil, 'skip-bundle-install', _('Do not automatically run `bundle install` after creating the module.'), hidden: true
14
+
15
+ run do |opts, args, _cmd|
16
+ require 'pdk/generate/module'
17
+
18
+ module_name = args[0]
19
+ target_dir = args[1]
20
+
21
+ if opts[:'skip-interview'] && opts[:'full-interview']
22
+ PDK.logger.info _('Ignoring --full-interview and continuing with --skip-interview.')
23
+ opts[:'full-interview'] = false
24
+ end
25
+
26
+ unless module_name.nil? || module_name.empty?
27
+ module_name_parts = module_name.split('-', 2)
28
+ if module_name_parts.size > 1
29
+ opts[:username] = module_name_parts[0]
30
+ opts[:module_name] = module_name_parts[1]
31
+ else
32
+ opts[:module_name] = module_name
33
+ end
34
+ opts[:target_dir] = target_dir.nil? ? opts[:module_name] : target_dir
35
+ end
36
+
37
+ PDK.logger.info(_('Creating new module: %{modname}') % { modname: module_name })
38
+ PDK::Generate::Module.invoke(opts)
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,27 @@
1
+ module PDK::CLI
2
+ @new_provider_cmd = @new_cmd.define_command do
3
+ name 'provider'
4
+ usage _('provider [options] <name>')
5
+ summary _('[experimental] Create a new ruby provider named <name> using given options')
6
+
7
+ PDK::CLI.template_url_option(self)
8
+
9
+ run do |opts, args, _cmd|
10
+ PDK::CLI::Util.ensure_in_module!
11
+
12
+ provider_name = args[0]
13
+ module_dir = Dir.pwd
14
+
15
+ if provider_name.nil? || provider_name.empty?
16
+ puts command.help
17
+ exit 1
18
+ end
19
+
20
+ unless Util::OptionValidator.valid_provider_name?(provider_name)
21
+ raise PDK::CLI::ExitWithError, _("'%{name}' is not a valid provider name") % { name: provider_name }
22
+ end
23
+
24
+ PDK::Generate::Provider.new(module_dir, provider_name, opts).run
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,31 @@
1
+ module PDK::CLI
2
+ @new_task_cmd = @new_cmd.define_command do
3
+ name 'task'
4
+ usage _('task [options] <name>')
5
+ summary _('Create a new task named <name> using given options')
6
+
7
+ PDK::CLI.template_url_option(self)
8
+ option nil, :description, _('A short description of the purpose of the task'), argument: :required
9
+
10
+ run do |opts, args, _cmd|
11
+ PDK::CLI::Util.ensure_in_module!(
12
+ message: _('Tasks can only be created from inside a valid module directory.'),
13
+ log_level: :info,
14
+ )
15
+
16
+ task_name = args[0]
17
+ module_dir = Dir.pwd
18
+
19
+ if task_name.nil? || task_name.empty?
20
+ puts command.help
21
+ exit 1
22
+ end
23
+
24
+ unless Util::OptionValidator.valid_task_name?(task_name)
25
+ raise PDK::CLI::ExitWithError, _("'%{name}' is not a valid task name") % { name: task_name }
26
+ end
27
+
28
+ PDK::Generate::Task.new(module_dir, task_name, opts).run
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,12 @@
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'
8
+ end
9
+ @test_cmd.add_command Cri::Command.new_basic_help
10
+ end
11
+
12
+ require 'pdk/cli/test/unit'
@@ -0,0 +1,88 @@
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'
26
+
27
+ PDK::CLI::Util.validate_puppet_version_opts(opts)
28
+
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
+ )
33
+
34
+ PDK::CLI::Util.module_version_check
35
+
36
+ report = nil
37
+
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)
47
+
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.
70
+ puppet_env = PDK::CLI::Util.puppet_from_opts_or_env(opts)
71
+ PDK::Util::PuppetVersion.fetch_puppet_dev if opts.key?(:'puppet-dev')
72
+ PDK::Util::RubyVersion.use(puppet_env[:ruby_version])
73
+
74
+ opts.merge!(puppet_env[:gemset])
75
+
76
+ PDK::Util::Bundler.ensure_bundle!(puppet_env[:gemset])
77
+
78
+ exit_code = PDK::Test::Unit.invoke(report, opts)
79
+
80
+ report_formats.each do |format|
81
+ report.send(format[:method], format[:target])
82
+ end
83
+
84
+ exit exit_code
85
+ end
86
+ end
87
+ end
88
+ end
@@ -0,0 +1,32 @@
1
+ require 'pdk/cli/util'
2
+ require 'pdk/util'
3
+
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.')
9
+
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.')
12
+
13
+ run do |opts, _args, _cmd|
14
+ require 'pdk/module/update'
15
+
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
+ )
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?
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
26
+
27
+ updater = PDK::Module::Update.new(opts)
28
+
29
+ updater.run
30
+ end
31
+ end
32
+ end