pdk 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +50 -0
- data/README.md +3 -9
- data/exe/pdk +1 -1
- data/lib/pdk.rb +5 -4
- data/lib/pdk/cli.rb +62 -59
- data/lib/pdk/cli/errors.rb +1 -1
- data/lib/pdk/cli/exec.rb +154 -29
- data/lib/pdk/cli/input.rb +2 -2
- data/lib/pdk/cli/new.rb +12 -27
- data/lib/pdk/cli/new/class.rb +28 -41
- data/lib/pdk/cli/new/module.rb +30 -41
- data/lib/pdk/cli/test.rb +9 -20
- data/lib/pdk/cli/test/unit.rb +38 -0
- data/lib/pdk/cli/util/option_normalizer.rb +45 -19
- data/lib/pdk/cli/util/option_validator.rb +24 -20
- data/lib/pdk/cli/validate.rb +65 -65
- data/lib/pdk/generate.rb +5 -0
- data/lib/pdk/generators/module.rb +37 -33
- data/lib/pdk/generators/puppet_class.rb +1 -1
- data/lib/pdk/generators/puppet_object.rb +19 -20
- data/lib/pdk/logger.rb +1 -1
- data/lib/pdk/module/metadata.rb +35 -18
- data/lib/pdk/module/templatedir.rb +40 -33
- data/lib/pdk/report.rb +76 -19
- data/lib/pdk/report/event.rb +276 -0
- data/lib/pdk/template_file.rb +8 -6
- data/lib/pdk/tests/unit.rb +8 -3
- data/lib/pdk/util.rb +65 -0
- data/lib/pdk/util/bundler.rb +167 -0
- data/lib/pdk/util/version.rb +34 -0
- data/lib/pdk/validate.rb +3 -4
- data/lib/pdk/validators/base_validator.rb +60 -4
- data/lib/pdk/validators/metadata.rb +29 -0
- data/lib/pdk/validators/puppet/puppet_lint.rb +47 -0
- data/lib/pdk/validators/puppet/puppet_parser.rb +34 -0
- data/lib/pdk/validators/puppet_validator.rb +30 -0
- data/lib/pdk/validators/ruby/rubocop.rb +59 -0
- data/lib/pdk/validators/ruby_validator.rb +29 -0
- data/lib/pdk/version.rb +1 -1
- data/lib/puppet/util/windows.rb +14 -0
- data/lib/puppet/util/windows/api_types.rb +278 -0
- data/lib/puppet/util/windows/file.rb +488 -0
- data/lib/puppet/util/windows/string.rb +16 -0
- data/locales/de/pdk.po +263 -78
- data/locales/pdk.pot +224 -65
- metadata +60 -8
- data/lib/pdk/cli/tests/unit.rb +0 -52
- data/lib/pdk/validators/puppet_lint.rb +0 -17
- data/lib/pdk/validators/puppet_parser.rb +0 -17
- data/lib/pdk/validators/ruby_lint.rb +0 -17
data/lib/pdk/cli/input.rb
CHANGED
@@ -10,10 +10,10 @@ module PDK
|
|
10
10
|
#
|
11
11
|
# @return [String] The value provided by the user (or the supplied
|
12
12
|
# default value).
|
13
|
-
def self.get(message, default=nil)
|
13
|
+
def self.get(message, default = nil)
|
14
14
|
print message
|
15
15
|
if default.nil?
|
16
|
-
print
|
16
|
+
print ' [(none)]'
|
17
17
|
else
|
18
18
|
print " [#{default}]"
|
19
19
|
end
|
data/lib/pdk/cli/new.rb
CHANGED
@@ -1,30 +1,15 @@
|
|
1
|
-
require 'cri'
|
2
|
-
require 'pdk/cli/new/module'
|
3
|
-
require 'pdk/cli/new/class'
|
4
|
-
|
5
|
-
module PDK
|
6
|
-
module CLI
|
7
|
-
module New
|
8
|
-
def self.command
|
9
|
-
@new ||= Cri::Command.new.tap do |cmd|
|
10
|
-
cmd.modify do
|
11
|
-
name 'new'
|
12
|
-
usage _("new <type> [options]")
|
13
|
-
summary _("create a new module, etc.")
|
14
|
-
description _("Creates a new instance of <type> using the options relevant to that type of thing")
|
15
|
-
|
16
|
-
# print the help text for the 'new' sub command if no type has been
|
17
|
-
# provided.
|
18
|
-
run do |opts, args, cmd|
|
19
|
-
puts command.help
|
20
|
-
exit 1
|
21
|
-
end
|
22
|
-
end
|
23
1
|
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
2
|
+
module PDK::CLI
|
3
|
+
@new_cmd = @base_cmd.define_command do
|
4
|
+
name 'new'
|
5
|
+
usage _('new <type> [options]')
|
6
|
+
summary _('create a new module, etc.')
|
7
|
+
description _('Creates a new instance of <type> using the options relevant to that type of thing')
|
8
|
+
default_subcommand 'help'
|
29
9
|
end
|
10
|
+
|
11
|
+
@new_cmd.add_command Cri::Command.new_basic_help
|
30
12
|
end
|
13
|
+
|
14
|
+
require 'pdk/cli/new/class'
|
15
|
+
require 'pdk/cli/new/module'
|
data/lib/pdk/cli/new/class.rb
CHANGED
@@ -1,45 +1,32 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
option nil, 'template-url', _("Specifies the URL to the template to use when creating the module. Defaults to the template used to create the module, otherwise %{default}") % {:default => PDK::Generate::Module::DEFAULT_TEMPLATE}, argument: :required
|
20
|
-
|
21
|
-
run do |opts, args, cmd|
|
22
|
-
class_name = args[0]
|
23
|
-
module_dir = Dir.pwd
|
24
|
-
|
25
|
-
if class_name.nil? || class_name.empty?
|
26
|
-
puts command.help
|
27
|
-
exit 1
|
28
|
-
end
|
29
|
-
|
30
|
-
unless PDK::CLI::Util::OptionValidator.is_valid_class_name?(class_name)
|
31
|
-
raise PDK::CLI::FatalError, _("'%{name}' is not a valid class name") % {name: class_name}
|
32
|
-
end
|
33
|
-
|
34
|
-
if args.length > 1
|
35
|
-
opts[:params] = args[1..-1].map { |r| PDK::CLI::Util::OptionNormalizer.parameter_specification(r) }
|
36
|
-
end
|
37
|
-
|
38
|
-
PDK::Generate::PuppetClass.new(module_dir, class_name, opts).run
|
39
|
-
end
|
40
|
-
end
|
41
|
-
end
|
1
|
+
|
2
|
+
module PDK::CLI
|
3
|
+
@new_class_cmd = @new_cmd.define_command do
|
4
|
+
name 'class'
|
5
|
+
usage _('class [options] <class_name> [parameter[:type]] [parameter[:type]] ...')
|
6
|
+
summary _('Create a new class named <class_name> using given options')
|
7
|
+
|
8
|
+
PDK::CLI.template_url_option(self)
|
9
|
+
|
10
|
+
run do |opts, args, _cmd|
|
11
|
+
require 'pdk/generators/puppet_class'
|
12
|
+
|
13
|
+
class_name = args[0]
|
14
|
+
module_dir = Dir.pwd
|
15
|
+
|
16
|
+
if class_name.nil? || class_name.empty?
|
17
|
+
puts command.help
|
18
|
+
exit 1
|
42
19
|
end
|
20
|
+
|
21
|
+
unless Util::OptionValidator.valid_class_name?(class_name)
|
22
|
+
raise PDK::CLI::FatalError, _("'%{name}' is not a valid class name") % { name: class_name }
|
23
|
+
end
|
24
|
+
|
25
|
+
if args.length > 1
|
26
|
+
opts[:params] = args[1..-1].map { |r| Util::OptionNormalizer.parameter_specification(r) }
|
27
|
+
end
|
28
|
+
|
29
|
+
PDK::Generate::PuppetClass.new(module_dir, class_name, opts).run
|
43
30
|
end
|
44
31
|
end
|
45
32
|
end
|
data/lib/pdk/cli/new/module.rb
CHANGED
@@ -1,55 +1,44 @@
|
|
1
|
-
require 'cri'
|
2
|
-
require 'pdk/cli/util/option_validator'
|
3
1
|
|
4
|
-
|
2
|
+
module PDK::CLI
|
3
|
+
@new_module_cmd = @new_cmd.define_command do
|
4
|
+
name 'module'
|
5
|
+
usage _('module [options] <module_name> [target_dir]')
|
6
|
+
summary _('Create a new module named <module_name> using given options')
|
5
7
|
|
6
|
-
|
7
|
-
module CLI
|
8
|
-
module New
|
9
|
-
class Module
|
10
|
-
include PDK::CLI::Util
|
8
|
+
PDK::CLI.template_url_option(self)
|
11
9
|
|
12
|
-
|
13
|
-
|
14
|
-
name 'module'
|
15
|
-
usage _("module [options] <module_name> [target_dir]")
|
16
|
-
summary _("Create a new module named <module_name> using given options")
|
10
|
+
option nil, 'license', _('Specifies the license this module is written under. ' \
|
11
|
+
"This should be a identifier from https://spdx.org/licenses/. Common values are 'Apache-2.0', 'MIT', or 'proprietary'."), argument: :required
|
17
12
|
|
18
|
-
|
13
|
+
option nil, 'vcs', _("Specifies the version control driver. Valid values: 'git', 'none'. Default: 'git'."), argument: :required
|
19
14
|
|
20
|
-
|
15
|
+
flag nil, 'skip-interview', _('When specified, skips interactive querying of metadata.')
|
21
16
|
|
22
|
-
|
17
|
+
run do |opts, args, _cmd|
|
18
|
+
require 'pdk/generators/module'
|
23
19
|
|
24
|
-
|
20
|
+
module_name = args[0]
|
21
|
+
target_dir = args[1]
|
25
22
|
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
if module_name.nil? || module_name.empty?
|
31
|
-
puts command.help
|
32
|
-
exit 1
|
33
|
-
end
|
23
|
+
if module_name.nil? || module_name.empty?
|
24
|
+
puts command.help
|
25
|
+
exit 1
|
26
|
+
end
|
34
27
|
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
28
|
+
unless Util::OptionValidator.valid_module_name?(module_name)
|
29
|
+
error_msg = _(
|
30
|
+
"'%{module_name}' is not a valid module name.\n" \
|
31
|
+
'Module names must begin with a lowercase letter and can only include lowercase letters, digits, and underscores.',
|
32
|
+
) % { module_name: module_name }
|
33
|
+
raise PDK::CLI::FatalError, error_msg
|
34
|
+
end
|
42
35
|
|
43
|
-
|
44
|
-
|
45
|
-
|
36
|
+
opts[:name] = module_name
|
37
|
+
opts[:target_dir] = target_dir.nil? ? module_name : target_dir
|
38
|
+
opts[:vcs] ||= 'git'
|
46
39
|
|
47
|
-
|
48
|
-
|
49
|
-
end
|
50
|
-
end
|
51
|
-
end
|
52
|
-
end
|
40
|
+
PDK.logger.info(_('Creating new module: %{modname}') % { modname: module_name })
|
41
|
+
PDK::Generate::Module.invoke(opts)
|
53
42
|
end
|
54
43
|
end
|
55
44
|
end
|
data/lib/pdk/cli/test.rb
CHANGED
@@ -1,23 +1,12 @@
|
|
1
|
-
require 'cri'
|
2
|
-
require 'pdk/cli/tests/unit'
|
3
|
-
require 'pdk/report'
|
4
1
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
@test ||= Cri::Command.new.tap do |cmd|
|
12
|
-
cmd.modify do
|
13
|
-
name 'test'
|
14
|
-
usage _("test [type] [options]")
|
15
|
-
summary _("Run tests.")
|
16
|
-
end
|
17
|
-
|
18
|
-
cmd.add_command(PDK::CLI::Test::Unit.command)
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
2
|
+
module PDK::CLI
|
3
|
+
@test_cmd = @base_cmd.define_command do
|
4
|
+
name 'test'
|
5
|
+
usage _('test [type] [options]')
|
6
|
+
summary _('Run tests.')
|
7
|
+
default_subcommand 'help'
|
22
8
|
end
|
9
|
+
@test_cmd.add_command Cri::Command.new_basic_help
|
23
10
|
end
|
11
|
+
|
12
|
+
require 'pdk/cli/test/unit'
|
@@ -0,0 +1,38 @@
|
|
1
|
+
|
2
|
+
module PDK::CLI
|
3
|
+
@test_unit_cmd = @test_cmd.define_command do
|
4
|
+
name 'unit'
|
5
|
+
usage _('unit [options]')
|
6
|
+
summary _('Run unit tests.')
|
7
|
+
|
8
|
+
flag nil, :list, _('list all available unit tests and their descriptions')
|
9
|
+
|
10
|
+
option nil, :tests, _('a comma-separated list of tests to run'), argument: :required do |values|
|
11
|
+
OptionValidator.list(values)
|
12
|
+
end
|
13
|
+
|
14
|
+
option nil, :runner_options, _('options to pass through to the actual test-runner'), argument: :required
|
15
|
+
|
16
|
+
run do |opts, _args, _cmd|
|
17
|
+
require 'pdk/tests/unit'
|
18
|
+
|
19
|
+
report = nil
|
20
|
+
|
21
|
+
if opts[:list]
|
22
|
+
puts _('List of all available unit tests: (TODO)')
|
23
|
+
end
|
24
|
+
|
25
|
+
if opts[:tests]
|
26
|
+
tests = opts.fetch(:tests)
|
27
|
+
end
|
28
|
+
|
29
|
+
# Note: Reporting may be delegated to the validation tool itself.
|
30
|
+
if opts[:'report-file']
|
31
|
+
format = opts.fetch(:'report-format', PDK::Report.default_format)
|
32
|
+
report = Report.new(opts.fetch(:'report-file'), format)
|
33
|
+
end
|
34
|
+
|
35
|
+
PDK::Test::Unit.invoke(tests, report)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -2,41 +2,67 @@ module PDK
|
|
2
2
|
module CLI
|
3
3
|
module Util
|
4
4
|
class OptionNormalizer
|
5
|
-
def self.comma_separated_list_to_array(list,
|
6
|
-
raise _(
|
5
|
+
def self.comma_separated_list_to_array(list, _options = {})
|
6
|
+
raise _('Error: expected comma separated list') unless OptionValidator.comma_separated_list?(list)
|
7
7
|
list.split(',').compact
|
8
8
|
end
|
9
9
|
|
10
|
-
# Parse one or more format:target pairs
|
11
|
-
#
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
10
|
+
# Parse one or more format:target pairs into report format
|
11
|
+
# specifications.
|
12
|
+
#
|
13
|
+
# Each specification is a Hash with two values:
|
14
|
+
# :method => The name of the method to call on the PDK::Report object
|
15
|
+
# to render the report.
|
16
|
+
# :target => The target to write the report to. This can be either an
|
17
|
+
# IO object that implements #write, or a String filename
|
18
|
+
# that will be opened for writing.
|
19
|
+
#
|
20
|
+
# If the target given is "stdout" or "stderr", this will convert those
|
21
|
+
# strings into the appropriate IO object.
|
22
|
+
#
|
23
|
+
# @return [Array<Hash{Symbol=>Object}>] An array of one or more report
|
24
|
+
# format specifications
|
25
|
+
def self.report_formats(formats)
|
26
|
+
formats.map do |f|
|
27
|
+
format, target = f.split(':', 2)
|
28
|
+
|
29
|
+
begin
|
30
|
+
OptionValidator.enum(format, PDK::Report.formats)
|
31
|
+
rescue
|
32
|
+
raise PDK::CLI::FatalError, _("'%{name}' is not a valid report format (%{valid})") % {
|
33
|
+
name: format,
|
34
|
+
valid: PDK::Report.formats.join(', '),
|
35
|
+
}
|
19
36
|
end
|
20
37
|
|
21
|
-
|
22
|
-
|
38
|
+
case target
|
39
|
+
when 'stdout'
|
40
|
+
target = $stdout
|
41
|
+
when 'stderr'
|
42
|
+
target = $stderr
|
43
|
+
end
|
23
44
|
|
24
|
-
|
45
|
+
{ method: "to_#{format}".to_sym, target: target }
|
46
|
+
end
|
25
47
|
end
|
26
48
|
|
27
49
|
def self.parameter_specification(value)
|
28
50
|
param_name, param_type = value.split(':', 2)
|
29
51
|
param_type = 'String' if param_type.nil?
|
30
52
|
|
31
|
-
unless PDK::CLI::Util::OptionValidator.
|
32
|
-
raise PDK::CLI::FatalError, _("'%{name}' is not a valid parameter name") % {
|
53
|
+
unless PDK::CLI::Util::OptionValidator.valid_param_name?(param_name)
|
54
|
+
raise PDK::CLI::FatalError, _("'%{name}' is not a valid parameter name") % {
|
55
|
+
name: param_name,
|
56
|
+
}
|
33
57
|
end
|
34
58
|
|
35
|
-
unless PDK::CLI::Util::OptionValidator.
|
36
|
-
raise PDK::CLI::FatalError, _("'%{type}' is not a valid data type") % {
|
59
|
+
unless PDK::CLI::Util::OptionValidator.valid_data_type?(param_type)
|
60
|
+
raise PDK::CLI::FatalError, _("'%{type}' is not a valid data type") % {
|
61
|
+
type: param_type,
|
62
|
+
}
|
37
63
|
end
|
38
64
|
|
39
|
-
{name: param_name, type: param_type}
|
65
|
+
{ name: param_name, type: param_type }
|
40
66
|
end
|
41
67
|
end
|
42
68
|
end
|
@@ -2,16 +2,16 @@ module PDK
|
|
2
2
|
module CLI
|
3
3
|
module Util
|
4
4
|
class OptionValidator
|
5
|
-
def self.
|
6
|
-
list =~
|
5
|
+
def self.comma_separated_list?(list, _options = {})
|
6
|
+
(list =~ %r{^[\w\-]+(?:,[\w\-]+)+$}) ? true : false
|
7
7
|
end
|
8
8
|
|
9
|
-
def self.enum(val, valid_entries,
|
9
|
+
def self.enum(val, valid_entries, _options = {})
|
10
10
|
vals = val.is_a?(Array) ? val : [val]
|
11
|
-
invalid_entries = vals.
|
11
|
+
invalid_entries = vals.reject { |e| valid_entries.include?(e) }
|
12
12
|
|
13
13
|
unless invalid_entries.empty?
|
14
|
-
raise _(
|
14
|
+
raise _('Error: the following values are invalid: %{invalid_entries}') % { invalid_entries: invalid_entries }
|
15
15
|
end
|
16
16
|
|
17
17
|
val
|
@@ -19,31 +19,31 @@ module PDK
|
|
19
19
|
|
20
20
|
# Validate the module name against the regular expression in the
|
21
21
|
# documentation: https://docs.puppet.com/puppet/4.10/modules_fundamentals.html#allowed-module-names
|
22
|
-
def self.
|
23
|
-
!(string =~
|
22
|
+
def self.valid_module_name?(string)
|
23
|
+
!(string =~ %r{\A[a-z][a-z0-9_]*\Z}).nil?
|
24
24
|
end
|
25
25
|
|
26
26
|
# Validate a Puppet namespace against the regular expression in the
|
27
27
|
# documentation: https://docs.puppet.com/puppet/4.10/lang_reserved.html#classes-and-defined-resource-types
|
28
|
-
def self.
|
28
|
+
def self.valid_namespace?(string)
|
29
29
|
return false if (string || '').split('::').last == 'init'
|
30
30
|
|
31
|
-
!(string =~
|
31
|
+
!(string =~ %r{\A([a-z][a-z0-9_]*)(::[a-z][a-z0-9_]*)*\Z}).nil?
|
32
32
|
end
|
33
33
|
|
34
|
-
singleton_class.send(:alias_method, :
|
35
|
-
singleton_class.send(:alias_method, :
|
34
|
+
singleton_class.send(:alias_method, :valid_class_name?, :valid_namespace?)
|
35
|
+
singleton_class.send(:alias_method, :valid_defined_type_name?, :valid_namespace?)
|
36
36
|
|
37
37
|
# Validate that a class/defined type parameter matches the regular
|
38
38
|
# expression in the documentation: https://docs.puppet.com/puppet/4.10/lang_reserved.html#parameters
|
39
39
|
# The parameter should also not be a reserved word or overload
|
40
40
|
# a metaparameter.
|
41
|
-
def self.
|
42
|
-
reserved_words = %w
|
43
|
-
metaparams = %w
|
41
|
+
def self.valid_param_name?(string)
|
42
|
+
reserved_words = %w[trusted facts server_facts title name].freeze
|
43
|
+
metaparams = %w[alias audit before loglevel noop notify require schedule stage subscribe tag].freeze
|
44
44
|
return false if reserved_words.include?(string) || metaparams.include?(string)
|
45
45
|
|
46
|
-
!(string =~
|
46
|
+
!(string =~ %r{\A[a-z][a-zA-Z0-9_]*\Z}).nil?
|
47
47
|
end
|
48
48
|
|
49
49
|
# Naive validation of a data type declaration. Extracts all the bare
|
@@ -53,17 +53,21 @@ module PDK
|
|
53
53
|
# but that shouldn't be a problem for the current feature set. This
|
54
54
|
# should be replaced eventually by something better (or just call
|
55
55
|
# Puppet::Pops::Types::TypesParser)
|
56
|
-
def self.
|
57
|
-
valid_types = %w
|
56
|
+
def self.valid_data_type?(string)
|
57
|
+
valid_types = %w[
|
58
58
|
String Integer Float Numeric Boolean Array Hash Regexp Undef
|
59
59
|
Default Class Resource Scalar Collection Variant Data Pattern Enum
|
60
60
|
Tuple Struct Optional Catalogentry Type Any Callable NotUndef
|
61
|
-
|
61
|
+
].freeze
|
62
62
|
|
63
|
-
string.scan(
|
63
|
+
string.scan(%r{\b(([a-zA-Z0-9_]+)(,|\[|\]|\Z))}) do |result|
|
64
64
|
type = result[1]
|
65
65
|
|
66
|
-
return false unless
|
66
|
+
return false unless string =~ %r{\A[A-Z]}
|
67
|
+
|
68
|
+
unless valid_types.include?(type)
|
69
|
+
PDK.logger.warn(_("Non-standard data type '%{type}', make sure the type is available in your code, or dependencies") % { type: type })
|
70
|
+
end
|
67
71
|
end
|
68
72
|
|
69
73
|
true
|