pdk 2.3.0 → 2.4.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 +1329 -1321
- data/LICENSE +201 -201
- data/README.md +163 -163
- data/exe/pdk +10 -10
- data/lib/pdk/analytics/client/google_analytics.rb +143 -143
- data/lib/pdk/analytics/client/noop.rb +25 -25
- data/lib/pdk/analytics/util.rb +19 -19
- data/lib/pdk/analytics.rb +30 -30
- data/lib/pdk/answer_file.rb +12 -12
- data/lib/pdk/bolt.rb +19 -19
- data/lib/pdk/cli/build.rb +82 -82
- data/lib/pdk/cli/bundle.rb +48 -48
- data/lib/pdk/cli/config/get.rb +26 -26
- data/lib/pdk/cli/config.rb +22 -22
- data/lib/pdk/cli/console.rb +148 -148
- data/lib/pdk/cli/convert.rb +52 -52
- data/lib/pdk/cli/env.rb +52 -52
- data/lib/pdk/cli/errors.rb +25 -25
- data/lib/pdk/cli/exec/command.rb +293 -293
- data/lib/pdk/cli/exec/interactive_command.rb +114 -114
- data/lib/pdk/cli/exec.rb +84 -84
- data/lib/pdk/cli/exec_group.rb +104 -104
- data/lib/pdk/cli/get/config.rb +24 -24
- data/lib/pdk/cli/get.rb +20 -20
- data/lib/pdk/cli/module/build.rb +12 -12
- data/lib/pdk/cli/module/generate.rb +47 -47
- data/lib/pdk/cli/module.rb +14 -14
- data/lib/pdk/cli/new/class.rb +32 -32
- data/lib/pdk/cli/new/defined_type.rb +32 -32
- data/lib/pdk/cli/new/fact.rb +29 -29
- data/lib/pdk/cli/new/function.rb +29 -29
- data/lib/pdk/cli/new/module.rb +53 -53
- data/lib/pdk/cli/new/provider.rb +29 -29
- data/lib/pdk/cli/new/task.rb +34 -34
- data/lib/pdk/cli/new/test.rb +52 -52
- data/lib/pdk/cli/new/transport.rb +27 -27
- data/lib/pdk/cli/new.rb +21 -21
- data/lib/pdk/cli/release/prep.rb +39 -39
- data/lib/pdk/cli/release/publish.rb +50 -50
- data/lib/pdk/cli/release.rb +194 -194
- data/lib/pdk/cli/remove/config.rb +80 -80
- data/lib/pdk/cli/remove.rb +20 -20
- data/lib/pdk/cli/set/config.rb +119 -119
- data/lib/pdk/cli/set.rb +20 -20
- data/lib/pdk/cli/test/unit.rb +90 -90
- data/lib/pdk/cli/test.rb +11 -11
- data/lib/pdk/cli/update.rb +64 -64
- data/lib/pdk/cli/util/command_redirector.rb +27 -27
- data/lib/pdk/cli/util/interview.rb +72 -72
- data/lib/pdk/cli/util/option_normalizer.rb +55 -55
- data/lib/pdk/cli/util/option_validator.rb +68 -68
- data/lib/pdk/cli/util/spinner.rb +13 -13
- data/lib/pdk/cli/util/update_manager_printer.rb +82 -82
- data/lib/pdk/cli/util.rb +305 -305
- data/lib/pdk/cli/validate.rb +116 -116
- data/lib/pdk/cli.rb +175 -175
- data/lib/pdk/config/analytics_schema.json +26 -26
- data/lib/pdk/config/errors.rb +5 -5
- data/lib/pdk/config/ini_file.rb +183 -183
- data/lib/pdk/config/ini_file_setting.rb +39 -39
- data/lib/pdk/config/json.rb +34 -34
- data/lib/pdk/config/json_schema_namespace.rb +142 -142
- data/lib/pdk/config/json_schema_setting.rb +53 -53
- data/lib/pdk/config/json_with_schema.rb +49 -49
- data/lib/pdk/config/namespace.rb +354 -354
- data/lib/pdk/config/setting.rb +135 -135
- data/lib/pdk/config/validator.rb +31 -31
- data/lib/pdk/config/yaml.rb +46 -46
- data/lib/pdk/config/yaml_with_schema.rb +59 -59
- data/lib/pdk/config.rb +390 -390
- data/lib/pdk/context/control_repo.rb +60 -60
- data/lib/pdk/context/module.rb +28 -28
- data/lib/pdk/context/none.rb +22 -22
- data/lib/pdk/context.rb +99 -99
- data/lib/pdk/control_repo.rb +90 -90
- data/lib/pdk/generate/defined_type.rb +43 -43
- data/lib/pdk/generate/fact.rb +25 -25
- data/lib/pdk/generate/function.rb +48 -48
- data/lib/pdk/generate/module.rb +352 -352
- data/lib/pdk/generate/provider.rb +28 -28
- data/lib/pdk/generate/puppet_class.rb +43 -43
- data/lib/pdk/generate/puppet_object.rb +232 -232
- data/lib/pdk/generate/task.rb +68 -68
- data/lib/pdk/generate/transport.rb +33 -33
- data/lib/pdk/generate.rb +24 -24
- data/lib/pdk/i18n.rb +4 -4
- data/lib/pdk/logger.rb +45 -45
- data/lib/pdk/module/build.rb +322 -322
- data/lib/pdk/module/convert.rb +296 -296
- data/lib/pdk/module/metadata.rb +202 -202
- data/lib/pdk/module/release.rb +260 -260
- data/lib/pdk/module/update.rb +131 -131
- data/lib/pdk/module/update_manager.rb +227 -227
- data/lib/pdk/module.rb +30 -30
- data/lib/pdk/report/event.rb +370 -370
- data/lib/pdk/report.rb +121 -121
- data/lib/pdk/template/fetcher/git.rb +85 -85
- data/lib/pdk/template/fetcher/local.rb +28 -28
- data/lib/pdk/template/fetcher.rb +98 -98
- data/lib/pdk/template/renderer/v1/legacy_template_dir.rb +116 -116
- data/lib/pdk/template/renderer/v1/renderer.rb +132 -132
- data/lib/pdk/template/renderer/v1/template_file.rb +102 -102
- data/lib/pdk/template/renderer/v1.rb +25 -25
- data/lib/pdk/template/renderer.rb +96 -96
- data/lib/pdk/template/template_dir.rb +67 -67
- data/lib/pdk/template.rb +59 -59
- data/lib/pdk/tests/unit.rb +252 -252
- data/lib/pdk/util/bundler.rb +259 -259
- data/lib/pdk/util/changelog_generator.rb +137 -137
- data/lib/pdk/util/env.rb +47 -47
- data/lib/pdk/util/filesystem.rb +138 -138
- data/lib/pdk/util/git.rb +179 -179
- data/lib/pdk/util/json_finder.rb +85 -85
- data/lib/pdk/util/puppet_strings.rb +125 -125
- data/lib/pdk/util/puppet_version.rb +266 -266
- data/lib/pdk/util/ruby_version.rb +179 -179
- data/lib/pdk/util/template_uri.rb +295 -295
- data/lib/pdk/util/vendored_file.rb +93 -93
- data/lib/pdk/util/version.rb +43 -43
- data/lib/pdk/util/windows/api_types.rb +82 -82
- data/lib/pdk/util/windows/file.rb +36 -36
- data/lib/pdk/util/windows/process.rb +79 -79
- data/lib/pdk/util/windows/string.rb +16 -16
- data/lib/pdk/util/windows.rb +15 -15
- data/lib/pdk/util.rb +278 -277
- data/lib/pdk/validate/control_repo/control_repo_validator_group.rb +23 -23
- data/lib/pdk/validate/control_repo/environment_conf_validator.rb +98 -98
- data/lib/pdk/validate/external_command_validator.rb +208 -208
- data/lib/pdk/validate/internal_ruby_validator.rb +100 -100
- data/lib/pdk/validate/invokable_validator.rb +228 -228
- data/lib/pdk/validate/metadata/metadata_json_lint_validator.rb +86 -86
- data/lib/pdk/validate/metadata/metadata_syntax_validator.rb +78 -78
- data/lib/pdk/validate/metadata/metadata_validator_group.rb +20 -20
- data/lib/pdk/validate/puppet/puppet_epp_validator.rb +133 -133
- data/lib/pdk/validate/puppet/puppet_lint_validator.rb +66 -66
- data/lib/pdk/validate/puppet/puppet_syntax_validator.rb +137 -137
- data/lib/pdk/validate/puppet/puppet_validator_group.rb +21 -21
- data/lib/pdk/validate/ruby/ruby_rubocop_validator.rb +80 -80
- data/lib/pdk/validate/ruby/ruby_validator_group.rb +19 -19
- data/lib/pdk/validate/tasks/tasks_metadata_lint_validator.rb +88 -88
- data/lib/pdk/validate/tasks/tasks_name_validator.rb +50 -50
- data/lib/pdk/validate/tasks/tasks_validator_group.rb +20 -20
- data/lib/pdk/validate/validator.rb +118 -118
- data/lib/pdk/validate/validator_group.rb +104 -104
- data/lib/pdk/validate/yaml/yaml_syntax_validator.rb +95 -95
- data/lib/pdk/validate/yaml/yaml_validator_group.rb +19 -19
- data/lib/pdk/validate.rb +94 -94
- data/lib/pdk/version.rb +4 -4
- data/lib/pdk.rb +76 -76
- data/locales/config.yaml +21 -21
- data/locales/pdk.pot +2094 -2094
- metadata +5 -6
data/lib/pdk/module/metadata.rb
CHANGED
|
@@ -1,202 +1,202 @@
|
|
|
1
|
-
require 'pdk'
|
|
2
|
-
|
|
3
|
-
module PDK
|
|
4
|
-
module Module
|
|
5
|
-
class Metadata
|
|
6
|
-
attr_accessor :data
|
|
7
|
-
|
|
8
|
-
OPERATING_SYSTEMS = {
|
|
9
|
-
'RedHat based Linux' => [
|
|
10
|
-
{
|
|
11
|
-
'operatingsystem' => 'CentOS',
|
|
12
|
-
'operatingsystemrelease' => ['7'],
|
|
13
|
-
},
|
|
14
|
-
{
|
|
15
|
-
'operatingsystem' => 'OracleLinux',
|
|
16
|
-
'operatingsystemrelease' => ['7'],
|
|
17
|
-
},
|
|
18
|
-
{
|
|
19
|
-
'operatingsystem' => 'RedHat',
|
|
20
|
-
'operatingsystemrelease' => ['8'],
|
|
21
|
-
},
|
|
22
|
-
{
|
|
23
|
-
'operatingsystem' => 'Scientific',
|
|
24
|
-
'operatingsystemrelease' => ['7'],
|
|
25
|
-
},
|
|
26
|
-
],
|
|
27
|
-
'Debian based Linux' => [
|
|
28
|
-
{
|
|
29
|
-
'operatingsystem' => 'Debian',
|
|
30
|
-
'operatingsystemrelease' => ['10'],
|
|
31
|
-
},
|
|
32
|
-
{
|
|
33
|
-
'operatingsystem' => 'Ubuntu',
|
|
34
|
-
'operatingsystemrelease' => ['18.04'],
|
|
35
|
-
},
|
|
36
|
-
],
|
|
37
|
-
'Fedora' => {
|
|
38
|
-
'operatingsystem' => 'Fedora',
|
|
39
|
-
'operatingsystemrelease' => ['29'],
|
|
40
|
-
},
|
|
41
|
-
'OSX' => {
|
|
42
|
-
'operatingsystem' => 'Darwin',
|
|
43
|
-
'operatingsystemrelease' => ['16'],
|
|
44
|
-
},
|
|
45
|
-
'SLES' => {
|
|
46
|
-
'operatingsystem' => 'SLES',
|
|
47
|
-
'operatingsystemrelease' => ['15'],
|
|
48
|
-
},
|
|
49
|
-
'Solaris' => {
|
|
50
|
-
'operatingsystem' => 'Solaris',
|
|
51
|
-
'operatingsystemrelease' => ['11'],
|
|
52
|
-
},
|
|
53
|
-
'Windows' => {
|
|
54
|
-
'operatingsystem' => 'windows',
|
|
55
|
-
'operatingsystemrelease' => %w[2019 10],
|
|
56
|
-
},
|
|
57
|
-
'AIX' => {
|
|
58
|
-
'operatingsystem' => 'AIX',
|
|
59
|
-
'operatingsystemrelease' => %w[6.1 7.1 7.2],
|
|
60
|
-
},
|
|
61
|
-
}.freeze
|
|
62
|
-
|
|
63
|
-
DEFAULT_OPERATING_SYSTEMS = [
|
|
64
|
-
'RedHat based Linux',
|
|
65
|
-
'Debian based Linux',
|
|
66
|
-
'Windows',
|
|
67
|
-
].freeze
|
|
68
|
-
|
|
69
|
-
DEFAULTS = {
|
|
70
|
-
'name' => nil,
|
|
71
|
-
'version' => '0.1.0',
|
|
72
|
-
'author' => nil,
|
|
73
|
-
'summary' => '',
|
|
74
|
-
'license' => 'Apache-2.0',
|
|
75
|
-
'source' => '',
|
|
76
|
-
'project_page' => nil,
|
|
77
|
-
'issues_url' => nil,
|
|
78
|
-
'dependencies' => [],
|
|
79
|
-
'data_provider' => nil,
|
|
80
|
-
'operatingsystem_support' => DEFAULT_OPERATING_SYSTEMS.map { |os_name|
|
|
81
|
-
OPERATING_SYSTEMS[os_name]
|
|
82
|
-
}.flatten,
|
|
83
|
-
'requirements' => [
|
|
84
|
-
{ 'name' => 'puppet', 'version_requirement' => '>= 6.21.0 < 8.0.0' },
|
|
85
|
-
],
|
|
86
|
-
}.freeze
|
|
87
|
-
|
|
88
|
-
def initialize(params = {})
|
|
89
|
-
@data = DEFAULTS.dup
|
|
90
|
-
update!(params) if params
|
|
91
|
-
end
|
|
92
|
-
|
|
93
|
-
def self.from_file(metadata_json_path)
|
|
94
|
-
if metadata_json_path.nil?
|
|
95
|
-
raise ArgumentError, _('Cannot read metadata from file: no path to file was given.')
|
|
96
|
-
end
|
|
97
|
-
|
|
98
|
-
unless PDK::Util::Filesystem.file?(metadata_json_path)
|
|
99
|
-
raise ArgumentError, _("'%{file}' does not exist or is not a file.") % { file: metadata_json_path }
|
|
100
|
-
end
|
|
101
|
-
|
|
102
|
-
unless PDK::Util::Filesystem.readable?(metadata_json_path)
|
|
103
|
-
raise ArgumentError, _("Unable to open '%{file}' for reading.") % { file: metadata_json_path }
|
|
104
|
-
end
|
|
105
|
-
|
|
106
|
-
require 'json'
|
|
107
|
-
begin
|
|
108
|
-
data = JSON.parse(PDK::Util::Filesystem.read_file(metadata_json_path))
|
|
109
|
-
rescue JSON::JSONError => e
|
|
110
|
-
raise ArgumentError, _('Invalid JSON in metadata.json: %{msg}') % { msg: e.message }
|
|
111
|
-
end
|
|
112
|
-
|
|
113
|
-
require 'pdk/util'
|
|
114
|
-
data['template-url'] = PDK::Util::TemplateURI.default_template_uri.metadata_format if PDK::Util.package_install? && data['template-url'] == PDK::Util::TemplateURI::PACKAGED_TEMPLATE_KEYWORD
|
|
115
|
-
new(data)
|
|
116
|
-
end
|
|
117
|
-
|
|
118
|
-
def update!(data)
|
|
119
|
-
# TODO: validate all data
|
|
120
|
-
process_name(data) if data['name']
|
|
121
|
-
@data.merge!(data)
|
|
122
|
-
self
|
|
123
|
-
end
|
|
124
|
-
|
|
125
|
-
def to_json
|
|
126
|
-
require 'json'
|
|
127
|
-
|
|
128
|
-
JSON.pretty_generate(@data.dup.delete_if { |_key, value| value.nil? })
|
|
129
|
-
end
|
|
130
|
-
|
|
131
|
-
def write!(path)
|
|
132
|
-
PDK::Util::Filesystem.write_file(path, to_json)
|
|
133
|
-
end
|
|
134
|
-
|
|
135
|
-
def forge_ready?
|
|
136
|
-
missing_fields.empty?
|
|
137
|
-
end
|
|
138
|
-
|
|
139
|
-
def interview_for_forge!
|
|
140
|
-
require 'pdk/generate/module'
|
|
141
|
-
|
|
142
|
-
PDK::Generate::Module.module_interview(self, only_ask: missing_fields)
|
|
143
|
-
end
|
|
144
|
-
|
|
145
|
-
def validate_puppet_version_requirement!
|
|
146
|
-
msgs = {
|
|
147
|
-
no_reqs: _('Module metadata does not contain any requirements.'),
|
|
148
|
-
no_puppet_req: _('Module metadata does not contain a "puppet" requirement.'),
|
|
149
|
-
no_puppet_ver: _('The "puppet" requirement in module metadata does not specify a "version_requirement".'),
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
raise ArgumentError, msgs[:no_reqs] unless @data.key?('requirements')
|
|
153
|
-
raise ArgumentError, msgs[:no_puppet_req] if puppet_requirement.nil?
|
|
154
|
-
raise ArgumentError, msgs[:no_puppet_ver] unless puppet_requirement.key?('version_requirement')
|
|
155
|
-
raise ArgumentError, msgs[:no_puppet_ver] if puppet_requirement['version_requirement'].empty?
|
|
156
|
-
end
|
|
157
|
-
|
|
158
|
-
def puppet_requirement
|
|
159
|
-
@data['requirements'].find do |r|
|
|
160
|
-
r.key?('name') && r['name'] == 'puppet'
|
|
161
|
-
end
|
|
162
|
-
end
|
|
163
|
-
|
|
164
|
-
def missing_fields
|
|
165
|
-
fields = DEFAULTS.keys - %w[data_provider requirements dependencies]
|
|
166
|
-
fields.select { |key| @data[key].nil? || @data[key].empty? }
|
|
167
|
-
end
|
|
168
|
-
|
|
169
|
-
private
|
|
170
|
-
|
|
171
|
-
# Do basic validation and parsing of the name parameter.
|
|
172
|
-
def process_name(data)
|
|
173
|
-
validate_name(data['name'])
|
|
174
|
-
author, modname = data['name'].split(%r{[-/]}, 2)
|
|
175
|
-
data['name'] = [author, modname].join('-')
|
|
176
|
-
|
|
177
|
-
data['author'] ||= author if @data['author'] == DEFAULTS['author']
|
|
178
|
-
end
|
|
179
|
-
|
|
180
|
-
# Validates that the given module name is both namespaced and well-formed.
|
|
181
|
-
def validate_name(name)
|
|
182
|
-
return if name =~ %r{\A[a-z0-9]+[-\/][a-z][a-z0-9_]*\Z}i
|
|
183
|
-
|
|
184
|
-
namespace, modname = name.split(%r{[-/]}, 2)
|
|
185
|
-
modname = :namespace_missing if namespace == ''
|
|
186
|
-
|
|
187
|
-
err = case modname
|
|
188
|
-
when nil, '', :namespace_missing
|
|
189
|
-
_('Field must be a dash-separated user name and module name.')
|
|
190
|
-
when %r{[^a-z0-9_]}i
|
|
191
|
-
_('Module name must contain only alphanumeric or underscore characters.')
|
|
192
|
-
when %r{^[^a-z]}i
|
|
193
|
-
_('Module name must begin with a letter.')
|
|
194
|
-
else
|
|
195
|
-
_('Namespace must contain only alphanumeric characters.')
|
|
196
|
-
end
|
|
197
|
-
|
|
198
|
-
raise ArgumentError, _("Invalid 'name' field in metadata.json: %{err}") % { err: err }
|
|
199
|
-
end
|
|
200
|
-
end
|
|
201
|
-
end
|
|
202
|
-
end
|
|
1
|
+
require 'pdk'
|
|
2
|
+
|
|
3
|
+
module PDK
|
|
4
|
+
module Module
|
|
5
|
+
class Metadata
|
|
6
|
+
attr_accessor :data
|
|
7
|
+
|
|
8
|
+
OPERATING_SYSTEMS = {
|
|
9
|
+
'RedHat based Linux' => [
|
|
10
|
+
{
|
|
11
|
+
'operatingsystem' => 'CentOS',
|
|
12
|
+
'operatingsystemrelease' => ['7'],
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
'operatingsystem' => 'OracleLinux',
|
|
16
|
+
'operatingsystemrelease' => ['7'],
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
'operatingsystem' => 'RedHat',
|
|
20
|
+
'operatingsystemrelease' => ['8'],
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
'operatingsystem' => 'Scientific',
|
|
24
|
+
'operatingsystemrelease' => ['7'],
|
|
25
|
+
},
|
|
26
|
+
],
|
|
27
|
+
'Debian based Linux' => [
|
|
28
|
+
{
|
|
29
|
+
'operatingsystem' => 'Debian',
|
|
30
|
+
'operatingsystemrelease' => ['10'],
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
'operatingsystem' => 'Ubuntu',
|
|
34
|
+
'operatingsystemrelease' => ['18.04'],
|
|
35
|
+
},
|
|
36
|
+
],
|
|
37
|
+
'Fedora' => {
|
|
38
|
+
'operatingsystem' => 'Fedora',
|
|
39
|
+
'operatingsystemrelease' => ['29'],
|
|
40
|
+
},
|
|
41
|
+
'OSX' => {
|
|
42
|
+
'operatingsystem' => 'Darwin',
|
|
43
|
+
'operatingsystemrelease' => ['16'],
|
|
44
|
+
},
|
|
45
|
+
'SLES' => {
|
|
46
|
+
'operatingsystem' => 'SLES',
|
|
47
|
+
'operatingsystemrelease' => ['15'],
|
|
48
|
+
},
|
|
49
|
+
'Solaris' => {
|
|
50
|
+
'operatingsystem' => 'Solaris',
|
|
51
|
+
'operatingsystemrelease' => ['11'],
|
|
52
|
+
},
|
|
53
|
+
'Windows' => {
|
|
54
|
+
'operatingsystem' => 'windows',
|
|
55
|
+
'operatingsystemrelease' => %w[2019 10],
|
|
56
|
+
},
|
|
57
|
+
'AIX' => {
|
|
58
|
+
'operatingsystem' => 'AIX',
|
|
59
|
+
'operatingsystemrelease' => %w[6.1 7.1 7.2],
|
|
60
|
+
},
|
|
61
|
+
}.freeze
|
|
62
|
+
|
|
63
|
+
DEFAULT_OPERATING_SYSTEMS = [
|
|
64
|
+
'RedHat based Linux',
|
|
65
|
+
'Debian based Linux',
|
|
66
|
+
'Windows',
|
|
67
|
+
].freeze
|
|
68
|
+
|
|
69
|
+
DEFAULTS = {
|
|
70
|
+
'name' => nil,
|
|
71
|
+
'version' => '0.1.0',
|
|
72
|
+
'author' => nil,
|
|
73
|
+
'summary' => '',
|
|
74
|
+
'license' => 'Apache-2.0',
|
|
75
|
+
'source' => '',
|
|
76
|
+
'project_page' => nil,
|
|
77
|
+
'issues_url' => nil,
|
|
78
|
+
'dependencies' => [],
|
|
79
|
+
'data_provider' => nil,
|
|
80
|
+
'operatingsystem_support' => DEFAULT_OPERATING_SYSTEMS.map { |os_name|
|
|
81
|
+
OPERATING_SYSTEMS[os_name]
|
|
82
|
+
}.flatten,
|
|
83
|
+
'requirements' => [
|
|
84
|
+
{ 'name' => 'puppet', 'version_requirement' => '>= 6.21.0 < 8.0.0' },
|
|
85
|
+
],
|
|
86
|
+
}.freeze
|
|
87
|
+
|
|
88
|
+
def initialize(params = {})
|
|
89
|
+
@data = DEFAULTS.dup
|
|
90
|
+
update!(params) if params
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
def self.from_file(metadata_json_path)
|
|
94
|
+
if metadata_json_path.nil?
|
|
95
|
+
raise ArgumentError, _('Cannot read metadata from file: no path to file was given.')
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
unless PDK::Util::Filesystem.file?(metadata_json_path)
|
|
99
|
+
raise ArgumentError, _("'%{file}' does not exist or is not a file.") % { file: metadata_json_path }
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
unless PDK::Util::Filesystem.readable?(metadata_json_path)
|
|
103
|
+
raise ArgumentError, _("Unable to open '%{file}' for reading.") % { file: metadata_json_path }
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
require 'json'
|
|
107
|
+
begin
|
|
108
|
+
data = JSON.parse(PDK::Util::Filesystem.read_file(metadata_json_path))
|
|
109
|
+
rescue JSON::JSONError => e
|
|
110
|
+
raise ArgumentError, _('Invalid JSON in metadata.json: %{msg}') % { msg: e.message }
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
require 'pdk/util'
|
|
114
|
+
data['template-url'] = PDK::Util::TemplateURI.default_template_uri.metadata_format if PDK::Util.package_install? && data['template-url'] == PDK::Util::TemplateURI::PACKAGED_TEMPLATE_KEYWORD
|
|
115
|
+
new(data)
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
def update!(data)
|
|
119
|
+
# TODO: validate all data
|
|
120
|
+
process_name(data) if data['name']
|
|
121
|
+
@data.merge!(data)
|
|
122
|
+
self
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
def to_json
|
|
126
|
+
require 'json'
|
|
127
|
+
|
|
128
|
+
JSON.pretty_generate(@data.dup.delete_if { |_key, value| value.nil? })
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
def write!(path)
|
|
132
|
+
PDK::Util::Filesystem.write_file(path, to_json)
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
def forge_ready?
|
|
136
|
+
missing_fields.empty?
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
def interview_for_forge!
|
|
140
|
+
require 'pdk/generate/module'
|
|
141
|
+
|
|
142
|
+
PDK::Generate::Module.module_interview(self, only_ask: missing_fields)
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
def validate_puppet_version_requirement!
|
|
146
|
+
msgs = {
|
|
147
|
+
no_reqs: _('Module metadata does not contain any requirements.'),
|
|
148
|
+
no_puppet_req: _('Module metadata does not contain a "puppet" requirement.'),
|
|
149
|
+
no_puppet_ver: _('The "puppet" requirement in module metadata does not specify a "version_requirement".'),
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
raise ArgumentError, msgs[:no_reqs] unless @data.key?('requirements')
|
|
153
|
+
raise ArgumentError, msgs[:no_puppet_req] if puppet_requirement.nil?
|
|
154
|
+
raise ArgumentError, msgs[:no_puppet_ver] unless puppet_requirement.key?('version_requirement')
|
|
155
|
+
raise ArgumentError, msgs[:no_puppet_ver] if puppet_requirement['version_requirement'].empty?
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
def puppet_requirement
|
|
159
|
+
@data['requirements'].find do |r|
|
|
160
|
+
r.key?('name') && r['name'] == 'puppet'
|
|
161
|
+
end
|
|
162
|
+
end
|
|
163
|
+
|
|
164
|
+
def missing_fields
|
|
165
|
+
fields = DEFAULTS.keys - %w[data_provider requirements dependencies]
|
|
166
|
+
fields.select { |key| @data[key].nil? || @data[key].empty? }
|
|
167
|
+
end
|
|
168
|
+
|
|
169
|
+
private
|
|
170
|
+
|
|
171
|
+
# Do basic validation and parsing of the name parameter.
|
|
172
|
+
def process_name(data)
|
|
173
|
+
validate_name(data['name'])
|
|
174
|
+
author, modname = data['name'].split(%r{[-/]}, 2)
|
|
175
|
+
data['name'] = [author, modname].join('-')
|
|
176
|
+
|
|
177
|
+
data['author'] ||= author if @data['author'] == DEFAULTS['author']
|
|
178
|
+
end
|
|
179
|
+
|
|
180
|
+
# Validates that the given module name is both namespaced and well-formed.
|
|
181
|
+
def validate_name(name)
|
|
182
|
+
return if name =~ %r{\A[a-z0-9]+[-\/][a-z][a-z0-9_]*\Z}i
|
|
183
|
+
|
|
184
|
+
namespace, modname = name.split(%r{[-/]}, 2)
|
|
185
|
+
modname = :namespace_missing if namespace == ''
|
|
186
|
+
|
|
187
|
+
err = case modname
|
|
188
|
+
when nil, '', :namespace_missing
|
|
189
|
+
_('Field must be a dash-separated user name and module name.')
|
|
190
|
+
when %r{[^a-z0-9_]}i
|
|
191
|
+
_('Module name must contain only alphanumeric or underscore characters.')
|
|
192
|
+
when %r{^[^a-z]}i
|
|
193
|
+
_('Module name must begin with a letter.')
|
|
194
|
+
else
|
|
195
|
+
_('Namespace must contain only alphanumeric characters.')
|
|
196
|
+
end
|
|
197
|
+
|
|
198
|
+
raise ArgumentError, _("Invalid 'name' field in metadata.json: %{err}") % { err: err }
|
|
199
|
+
end
|
|
200
|
+
end
|
|
201
|
+
end
|
|
202
|
+
end
|