pdk 0.1.0 → 0.2.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.
- 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/validate.rb
CHANGED
@@ -1,81 +1,81 @@
|
|
1
|
-
require '
|
2
|
-
require 'pdk/cli/util/option_validator'
|
3
|
-
require 'pdk/report'
|
1
|
+
require 'pdk/util/bundler'
|
4
2
|
|
5
|
-
|
3
|
+
module PDK::CLI
|
4
|
+
@validate_cmd = @base_cmd.define_command do
|
5
|
+
name 'validate'
|
6
|
+
usage _('validate [options]')
|
7
|
+
summary _('Run static analysis tests.')
|
8
|
+
description _('Run metadata, puppet, or ruby validation.')
|
6
9
|
|
7
|
-
|
8
|
-
module CLI
|
9
|
-
class Validate
|
10
|
-
include PDK::CLI::Util
|
10
|
+
flag nil, :list, _('list all available validators')
|
11
11
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
summary _("Run static analysis tests.")
|
17
|
-
description _("Run metadata-json-lint, puppet parser validate, puppet-lint, or rubocop.")
|
12
|
+
run do |opts, args, _cmd|
|
13
|
+
validator_names = PDK::Validate.validators.map { |v| v.name }
|
14
|
+
validators = PDK::Validate.validators
|
15
|
+
targets = []
|
18
16
|
|
19
|
-
|
17
|
+
if opts[:list]
|
18
|
+
PDK.logger.info(_('Available validators: %{validator_names}') % { validator_names: validator_names.join(', ') })
|
19
|
+
exit 0
|
20
|
+
end
|
20
21
|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
reports = nil
|
22
|
+
if args[0]
|
23
|
+
# This may be a single validator, a list of validators, or a target.
|
24
|
+
if Util::OptionValidator.comma_separated_list?(args[0])
|
25
|
+
# This is a comma separated list. Treat each item as a validator.
|
26
26
|
|
27
|
-
|
28
|
-
|
29
|
-
exit 0
|
30
|
-
end
|
27
|
+
vals = Util::OptionNormalizer.comma_separated_list_to_array(args[0])
|
28
|
+
validators = PDK::Validate.validators.select { |v| vals.include?(v.name) }
|
31
29
|
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
30
|
+
invalid = vals.reject { |v| validator_names.include?(v) }
|
31
|
+
invalid.each do |v|
|
32
|
+
PDK.logger.warn(_("Unknown validator '%{v}'. Available validators: %{validators}") % { v: v, validators: validator_names.join(', ') })
|
33
|
+
end
|
34
|
+
else
|
35
|
+
# This is a single item. Check if it's a known validator, or otherwise treat it as a target.
|
36
|
+
val = PDK::Validate.validators.find { |v| args[0] == v.name }
|
37
|
+
if val
|
38
|
+
validators = [val]
|
39
|
+
else
|
40
|
+
targets = [args[0]]
|
41
|
+
# We now know that no validators were passed, so let the user know we're using all of them by default.
|
42
|
+
PDK.logger.info(_('Running all available validators...'))
|
43
|
+
end
|
44
|
+
end
|
45
|
+
else
|
46
|
+
PDK.logger.info(_('Running all available validators...'))
|
47
|
+
end
|
36
48
|
|
37
|
-
|
38
|
-
|
49
|
+
# Subsequent arguments are targets.
|
50
|
+
targets.concat(args[1..-1]) if args.length > 1
|
39
51
|
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
else
|
50
|
-
targets = [args[0]]
|
51
|
-
# We now know that no validators were passed, so let the user know we're using all of them by default.
|
52
|
-
PDK.logger.info(_("Running all available validators..."))
|
53
|
-
end
|
54
|
-
end
|
55
|
-
else
|
56
|
-
PDK.logger.info(_("Running all available validators..."))
|
57
|
-
end
|
52
|
+
report = PDK::Report.new
|
53
|
+
report_formats = if opts[:format]
|
54
|
+
PDK::CLI::Util::OptionNormalizer.report_formats(opts[:format])
|
55
|
+
else
|
56
|
+
[{
|
57
|
+
method: PDK::Report.default_format,
|
58
|
+
target: PDK::Report.default_target,
|
59
|
+
}]
|
60
|
+
end
|
58
61
|
|
59
|
-
|
60
|
-
targets.concat(args[1..-1]) if args.length > 1
|
62
|
+
options = targets.empty? ? {} : { targets: targets }
|
61
63
|
|
62
|
-
|
63
|
-
if opts[:format]
|
64
|
-
reports = OptionNormalizer.report_formats(opts.fetch(:format))
|
65
|
-
end
|
64
|
+
exit_code = 0
|
66
65
|
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
end
|
74
|
-
end
|
75
|
-
end
|
76
|
-
end
|
77
|
-
end
|
66
|
+
# Ensure that the bundle is installed and tools are available before running any validations.
|
67
|
+
PDK::Util::Bundler.ensure_bundle!
|
68
|
+
|
69
|
+
validators.each do |validator|
|
70
|
+
exit_code = validator.invoke(report, options)
|
71
|
+
break if exit_code != 0
|
78
72
|
end
|
73
|
+
|
74
|
+
report_formats.each do |format|
|
75
|
+
report.send(format[:method], format[:target])
|
76
|
+
end
|
77
|
+
|
78
|
+
exit exit_code
|
79
79
|
end
|
80
80
|
end
|
81
81
|
end
|
data/lib/pdk/generate.rb
CHANGED
@@ -9,31 +9,35 @@ require 'pdk/module/templatedir'
|
|
9
9
|
require 'pdk/cli/exec'
|
10
10
|
require 'pdk/cli/input'
|
11
11
|
require 'pdk/util'
|
12
|
+
require 'pdk/util/version'
|
12
13
|
|
13
14
|
module PDK
|
14
15
|
module Generate
|
15
16
|
class Module
|
16
|
-
DEFAULT_TEMPLATE = 'https://github.com/puppetlabs/pdk-module-template'
|
17
|
+
DEFAULT_TEMPLATE = 'https://github.com/puppetlabs/pdk-module-template'.freeze
|
17
18
|
|
18
|
-
def self.invoke(opts={})
|
19
|
+
def self.invoke(opts = {})
|
19
20
|
defaults = {
|
21
|
+
'name' => "#{Etc.getlogin}-#{opts[:name]}",
|
20
22
|
'version' => '0.1.0',
|
21
23
|
'dependencies' => [
|
22
|
-
{ 'name' => 'puppetlabs-stdlib', 'version_requirement' => '>= 1.0.0' }
|
23
|
-
]
|
24
|
+
{ 'name' => 'puppetlabs-stdlib', 'version_requirement' => '>= 4.13.1 < 5.0.0' },
|
25
|
+
],
|
24
26
|
}
|
25
27
|
|
26
|
-
defaults['license'] = opts[:license] if opts.
|
28
|
+
defaults['license'] = opts[:license] if opts.key? :license
|
27
29
|
target_dir = File.expand_path(opts[:target_dir])
|
28
30
|
|
29
|
-
if File.
|
30
|
-
raise PDK::CLI::FatalError, _("The destination directory '%{dir}' already exists") % {:
|
31
|
+
if File.exist?(target_dir)
|
32
|
+
raise PDK::CLI::FatalError, _("The destination directory '%{dir}' already exists") % { dir: target_dir }
|
31
33
|
end
|
32
34
|
|
33
35
|
metadata = PDK::Module::Metadata.new(defaults)
|
34
36
|
|
35
37
|
module_interview(metadata, opts) unless opts[:'skip-interview'] # @todo Build way to get info by answers file
|
36
38
|
|
39
|
+
metadata.update!('pdk-version' => PDK::Util::Version.version_string)
|
40
|
+
|
37
41
|
temp_target_dir = PDK::Util.make_tmpdir_name('pdk-module-target')
|
38
42
|
|
39
43
|
prepare_module_directory(temp_target_dir)
|
@@ -67,60 +71,60 @@ module PDK
|
|
67
71
|
begin
|
68
72
|
FileUtils.mkdir_p(dir)
|
69
73
|
rescue SystemCallError
|
70
|
-
raise PDK::CLI::FatalError, _("Unable to create directory '%{dir}'") % {:dir
|
74
|
+
raise PDK::CLI::FatalError, _("Unable to create directory '%{dir}'") % { dir: dir }
|
71
75
|
end
|
72
76
|
end
|
73
77
|
end
|
74
78
|
|
75
|
-
def self.module_interview(metadata, opts={})
|
79
|
+
def self.module_interview(metadata, opts = {})
|
76
80
|
puts _(
|
77
|
-
|
78
|
-
|
79
|
-
|
81
|
+
'We need to create a metadata.json file for this module. Please answer the ' \
|
82
|
+
'following questions; if the question is not applicable to this module, feel free ' \
|
83
|
+
'to leave it blank.',
|
80
84
|
)
|
81
85
|
|
82
86
|
begin
|
83
|
-
puts
|
84
|
-
forge_user = PDK::CLI::Input.get(_(
|
87
|
+
puts ''
|
88
|
+
forge_user = PDK::CLI::Input.get(_('What is your Puppet Forge username?'), metadata.data['author'])
|
85
89
|
metadata.update!('name' => "#{forge_user}-#{opts[:name]}")
|
86
90
|
rescue StandardError => e
|
87
|
-
PDK.logger.error(_("We're sorry, we could not parse your module name: %{message}") % {:
|
91
|
+
PDK.logger.error(_("We're sorry, we could not parse your module name: %{message}") % { message: e.message })
|
88
92
|
retry
|
89
93
|
end
|
90
94
|
|
91
95
|
begin
|
92
|
-
puts "\n" + _(
|
93
|
-
module_version = PDK::CLI::Input.get(_(
|
96
|
+
puts "\n" + _('Puppet uses Semantic Versioning (semver.org) to version modules.')
|
97
|
+
module_version = PDK::CLI::Input.get(_('What version is this module?'), metadata.data['version'])
|
94
98
|
metadata.update!('version' => module_version)
|
95
99
|
rescue StandardError => e
|
96
|
-
PDK.logger.error(_("We're sorry, we could not parse that as a Semantic Version: %{message}") % {message: e.message})
|
100
|
+
PDK.logger.error(_("We're sorry, we could not parse that as a Semantic Version: %{message}") % { message: e.message })
|
97
101
|
retry
|
98
102
|
end
|
99
103
|
|
100
|
-
puts
|
101
|
-
module_author = PDK::CLI::Input.get(_(
|
104
|
+
puts ''
|
105
|
+
module_author = PDK::CLI::Input.get(_('Who wrote this module?'), metadata.data['author'])
|
102
106
|
metadata.update!('author' => module_author)
|
103
107
|
|
104
|
-
unless opts.
|
105
|
-
puts
|
106
|
-
module_license = PDK::CLI::Input.get(_(
|
108
|
+
unless opts.key?(:license)
|
109
|
+
puts ''
|
110
|
+
module_license = PDK::CLI::Input.get(_('What license does this module code fall under?'), metadata.data['license'])
|
107
111
|
metadata.update!('license' => module_license)
|
108
112
|
end
|
109
113
|
|
110
|
-
puts
|
111
|
-
module_summary = PDK::CLI::Input.get(_(
|
114
|
+
puts ''
|
115
|
+
module_summary = PDK::CLI::Input.get(_('How would you describe this module in a single sentence?'), metadata.data['summary'])
|
112
116
|
metadata.update!('summary' => module_summary)
|
113
117
|
|
114
|
-
puts
|
115
|
-
module_source = PDK::CLI::Input.get(_("Where is this module's source code repository?"))
|
118
|
+
puts ''
|
119
|
+
module_source = PDK::CLI::Input.get(_("Where is this module's source code repository?"), metadata.data['source'])
|
116
120
|
metadata.update!('source' => module_source)
|
117
121
|
|
118
|
-
puts
|
119
|
-
module_page = PDK::CLI::Input.get(_(
|
122
|
+
puts ''
|
123
|
+
module_page = PDK::CLI::Input.get(_('Where can others go to learn more about this module?'), metadata.data['project_page'])
|
120
124
|
metadata.update!('project_page' => module_page)
|
121
125
|
|
122
|
-
puts
|
123
|
-
module_issues = PDK::CLI::Input.get(_(
|
126
|
+
puts ''
|
127
|
+
module_issues = PDK::CLI::Input.get(_('Where can others go to file issues about this module?'), metadata.data['issues_url'])
|
124
128
|
metadata.update!('issues_url' => module_issues)
|
125
129
|
|
126
130
|
puts
|
@@ -129,8 +133,8 @@ module PDK
|
|
129
133
|
puts '-' * 40
|
130
134
|
puts
|
131
135
|
|
132
|
-
|
133
|
-
puts _(
|
136
|
+
unless PDK::CLI::Input.get(_('About to generate this module; continue?'), 'Y') =~ %r{^y(es)?$}i # rubocop:disable Style/GuardClause
|
137
|
+
puts _('Aborting...')
|
134
138
|
exit 0
|
135
139
|
end
|
136
140
|
end
|
@@ -10,7 +10,7 @@ module PDK
|
|
10
10
|
# @return [Hash{Symbol => Object}] a hash of information that will be
|
11
11
|
# provided to the class and class spec templates during rendering.
|
12
12
|
def template_data
|
13
|
-
data = {name: object_name}
|
13
|
+
data = { name: object_name }
|
14
14
|
if @options.key?(:params)
|
15
15
|
data[:params] = @options[:params]
|
16
16
|
data[:max_type_length] = @options[:params].map { |r| r[:type].length }.max
|
@@ -31,14 +31,14 @@ module PDK
|
|
31
31
|
@module_dir = module_dir
|
32
32
|
@options = options
|
33
33
|
|
34
|
-
if [:class, :defined_type].include?(object_type)
|
34
|
+
if [:class, :defined_type].include?(object_type) # rubocop:disable Style/GuardClause
|
35
35
|
object_name_parts = object_name.split('::')
|
36
36
|
|
37
|
-
if object_name_parts.first == module_name
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
37
|
+
@object_name = if object_name_parts.first == module_name
|
38
|
+
object_name
|
39
|
+
else
|
40
|
+
[module_name, object_name].join('::')
|
41
|
+
end
|
42
42
|
end
|
43
43
|
end
|
44
44
|
|
@@ -84,12 +84,12 @@ module PDK
|
|
84
84
|
def run
|
85
85
|
[target_object_path, target_spec_path].each do |target_file|
|
86
86
|
if File.exist?(target_file)
|
87
|
-
raise PDK::CLI::FatalError, _("Unable to generate class, '%{file}' already exists.") % {file: target_file}
|
87
|
+
raise PDK::CLI::FatalError, _("Unable to generate class, '%{file}' already exists.") % { file: target_file }
|
88
88
|
end
|
89
89
|
end
|
90
90
|
|
91
91
|
with_templates do |template_path, config_hash|
|
92
|
-
data = template_data.merge(:
|
92
|
+
data = template_data.merge(configs: config_hash)
|
93
93
|
|
94
94
|
render_file(target_object_path, template_path[:object], data)
|
95
95
|
render_file(target_spec_path, template_path[:spec], data) if template_path[:spec]
|
@@ -109,7 +109,7 @@ module PDK
|
|
109
109
|
#
|
110
110
|
# @api private
|
111
111
|
def render_file(dest_path, template_path, data)
|
112
|
-
PDK.logger.info(_("Creating %{file} from template.") % {file: dest_path})
|
112
|
+
PDK.logger.info(_("Creating '%{file}' from template.") % { file: dest_path })
|
113
113
|
file_content = PDK::TemplateFile.new(template_path, data).render
|
114
114
|
FileUtils.mkdir_p(File.dirname(dest_path))
|
115
115
|
File.open(dest_path, 'w') { |f| f.write file_content }
|
@@ -132,7 +132,7 @@ module PDK
|
|
132
132
|
def with_templates
|
133
133
|
templates.each do |template|
|
134
134
|
if template[:url].nil?
|
135
|
-
PDK.logger.debug(_(
|
135
|
+
PDK.logger.debug(_('No %{dir_type} template specified; trying next template directory.') % { dir_type: template[:type] })
|
136
136
|
next
|
137
137
|
end
|
138
138
|
|
@@ -142,13 +142,12 @@ module PDK
|
|
142
142
|
if template_paths
|
143
143
|
config_hash = template_dir.object_config
|
144
144
|
yield template_paths, config_hash
|
145
|
-
|
145
|
+
# TODO: refactor to a search-and-execute form instead
|
146
|
+
return # work is done # rubocop:disable Lint/NonLocalExitFromIterator
|
147
|
+
elsif template[:allow_fallback]
|
148
|
+
PDK.logger.debug(_('Unable to find a %{type} template in %{url}, trying next template directory') % { type: object_type, url: template[:url] })
|
146
149
|
else
|
147
|
-
|
148
|
-
PDK.logger.debug(_("Unable to find a %{type} template in %{url}, trying next template directory") % {type: object_type, url: template[:url]})
|
149
|
-
else
|
150
|
-
raise PDK::CLI::FatalError, _("Unable to find the %{type} template in %{url}.") % {type: object_type, url: template[:url]}
|
151
|
-
end
|
150
|
+
raise PDK::CLI::FatalError, _('Unable to find the %{type} template in %{url}.') % { type: object_type, url: template[:url] }
|
152
151
|
end
|
153
152
|
end
|
154
153
|
end
|
@@ -176,9 +175,9 @@ module PDK
|
|
176
175
|
# @api private
|
177
176
|
def templates
|
178
177
|
@templates ||= [
|
179
|
-
{type: 'CLI', url: @options[:'template-url'], allow_fallback: false},
|
180
|
-
{type: 'metadata', url: module_metadata.data['template-url'], allow_fallback: true},
|
181
|
-
{type: 'default', url: PDK::Generate::Module::DEFAULT_TEMPLATE, allow_fallback: false},
|
178
|
+
{ type: 'CLI', url: @options[:'template-url'], allow_fallback: false },
|
179
|
+
{ type: 'metadata', url: module_metadata.data['template-url'], allow_fallback: true },
|
180
|
+
{ type: 'default', url: PDK::Generate::Module::DEFAULT_TEMPLATE, allow_fallback: false },
|
182
181
|
]
|
183
182
|
end
|
184
183
|
|
@@ -205,7 +204,7 @@ module PDK
|
|
205
204
|
@module_metadata ||= begin
|
206
205
|
PDK::Module::Metadata.from_file(File.join(module_dir, 'metadata.json'))
|
207
206
|
rescue ArgumentError => e
|
208
|
-
raise PDK::CLI::FatalError, _("'%{dir}' does not contain valid Puppet module metadata
|
207
|
+
raise PDK::CLI::FatalError, _("'%{dir}' does not contain valid Puppet module metadata: %{msg}") % { dir: module_dir, msg: e.message }
|
209
208
|
end
|
210
209
|
end
|
211
210
|
end
|
data/lib/pdk/logger.rb
CHANGED
data/lib/pdk/module/metadata.rb
CHANGED
@@ -3,21 +3,38 @@ require 'json'
|
|
3
3
|
module PDK
|
4
4
|
module Module
|
5
5
|
class Metadata
|
6
|
-
|
7
6
|
attr_accessor :data
|
8
7
|
|
9
8
|
DEFAULTS = {
|
10
9
|
'name' => nil,
|
11
10
|
'version' => nil,
|
12
11
|
'author' => nil,
|
13
|
-
'summary' =>
|
12
|
+
'summary' => '',
|
14
13
|
'license' => 'Apache-2.0',
|
15
14
|
'source' => '',
|
16
15
|
'project_page' => nil,
|
17
16
|
'issues_url' => nil,
|
18
17
|
'dependencies' => Set.new.freeze,
|
19
18
|
'data_provider' => nil,
|
20
|
-
|
19
|
+
'operatingsystem_support' => [
|
20
|
+
{
|
21
|
+
'operatingsystem' => 'Debian',
|
22
|
+
'operatingsystemrelease' => ['8'],
|
23
|
+
},
|
24
|
+
{
|
25
|
+
'operatingsystem' => 'RedHat',
|
26
|
+
'operatingsystemrelease' => ['7.0'],
|
27
|
+
},
|
28
|
+
{
|
29
|
+
'operatingsystem' => 'Ubuntu',
|
30
|
+
'operatingsystemrelease' => ['16.04'],
|
31
|
+
},
|
32
|
+
{
|
33
|
+
'operatingsystem' => 'Windows',
|
34
|
+
'operatingsystemrelease' => ['2016'],
|
35
|
+
},
|
36
|
+
],
|
37
|
+
}.freeze
|
21
38
|
|
22
39
|
def initialize(params = {})
|
23
40
|
@data = DEFAULTS.dup
|
@@ -26,17 +43,17 @@ module PDK
|
|
26
43
|
|
27
44
|
def self.from_file(metadata_json_path)
|
28
45
|
unless File.file?(metadata_json_path)
|
29
|
-
raise ArgumentError, _("'%{file}' does not exist or is not a file") % {file: metadata_json_path}
|
46
|
+
raise ArgumentError, _("'%{file}' does not exist or is not a file") % { file: metadata_json_path }
|
30
47
|
end
|
31
48
|
|
32
49
|
unless File.readable?(metadata_json_path)
|
33
|
-
raise ArgumentError, _("Unable to open '%{file}' for reading") % {file: metadata_json_path}
|
50
|
+
raise ArgumentError, _("Unable to open '%{file}' for reading") % { file: metadata_json_path }
|
34
51
|
end
|
35
52
|
|
36
53
|
begin
|
37
54
|
data = JSON.parse(File.read(metadata_json_path))
|
38
55
|
rescue JSON::JSONError => e
|
39
|
-
raise ArgumentError, _(
|
56
|
+
raise ArgumentError, _('Invalid JSON in metadata.json: %{msg}') % { msg: e.message }
|
40
57
|
end
|
41
58
|
|
42
59
|
new(data)
|
@@ -58,28 +75,28 @@ module PDK
|
|
58
75
|
# Do basic validation and parsing of the name parameter.
|
59
76
|
def process_name(data)
|
60
77
|
validate_name(data['name'])
|
61
|
-
author,
|
78
|
+
author, _modname = data['name'].split(%r{[-/]}, 2)
|
62
79
|
|
63
80
|
data['author'] ||= author if @data['author'] == DEFAULTS['author']
|
64
81
|
end
|
65
82
|
|
66
83
|
# Validates that the given module name is both namespaced and well-formed.
|
67
84
|
def validate_name(name)
|
68
|
-
return if name =~
|
85
|
+
return if name =~ %r{\A[a-z0-9]+[-\/][a-z][a-z0-9_]*\Z}i
|
69
86
|
|
70
|
-
namespace, modname = name.split(
|
87
|
+
namespace, modname = name.split(%r{[-/]}, 2)
|
71
88
|
modname = :namespace_missing if namespace == ''
|
72
89
|
|
73
90
|
err = case modname
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
91
|
+
when nil, '', :namespace_missing
|
92
|
+
'the field must be a dash-separated username and module name'
|
93
|
+
when %r{[^a-z0-9_]}i
|
94
|
+
'the module name contains non-alphanumeric (or underscore) characters'
|
95
|
+
when %r{^[^a-z]}i
|
96
|
+
'the module name must begin with a letter'
|
97
|
+
else
|
98
|
+
'the namespace contains non-alphanumeric characters'
|
99
|
+
end
|
83
100
|
|
84
101
|
raise ArgumentError, "Invalid 'name' field in metadata.json: #{err}"
|
85
102
|
end
|