pdk 2.7.1 → 3.0.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 +25 -0
- data/README.md +2 -48
- data/lib/pdk/analytics/client/google_analytics.rb +22 -26
- data/lib/pdk/analytics/util.rb +0 -1
- data/lib/pdk/analytics.rb +1 -1
- data/lib/pdk/bolt.rb +1 -0
- data/lib/pdk/cli/build.rb +53 -56
- data/lib/pdk/cli/bundle.rb +34 -33
- data/lib/pdk/cli/console.rb +136 -134
- data/lib/pdk/cli/convert.rb +39 -41
- data/lib/pdk/cli/env.rb +49 -47
- data/lib/pdk/cli/errors.rb +1 -2
- data/lib/pdk/cli/exec/command.rb +23 -29
- data/lib/pdk/cli/exec/interactive_command.rb +7 -12
- data/lib/pdk/cli/exec.rb +4 -11
- data/lib/pdk/cli/exec_group.rb +3 -2
- data/lib/pdk/cli/get/config.rb +21 -19
- data/lib/pdk/cli/get.rb +15 -13
- data/lib/pdk/cli/new/class.rb +22 -22
- data/lib/pdk/cli/new/defined_type.rb +22 -22
- data/lib/pdk/cli/new/fact.rb +19 -19
- data/lib/pdk/cli/new/function.rb +20 -20
- data/lib/pdk/cli/new/module.rb +40 -38
- data/lib/pdk/cli/new/provider.rb +19 -19
- data/lib/pdk/cli/new/task.rb +23 -23
- data/lib/pdk/cli/new/test.rb +50 -48
- data/lib/pdk/cli/new/transport.rb +18 -18
- data/lib/pdk/cli/new.rb +11 -9
- data/lib/pdk/cli/release/prep.rb +27 -25
- data/lib/pdk/cli/release/publish.rb +39 -37
- data/lib/pdk/cli/release.rb +152 -149
- data/lib/pdk/cli/remove/config.rb +63 -60
- data/lib/pdk/cli/remove.rb +15 -13
- data/lib/pdk/cli/set/config.rb +91 -89
- data/lib/pdk/cli/set.rb +15 -13
- data/lib/pdk/cli/test/unit.rb +71 -69
- data/lib/pdk/cli/test.rb +9 -7
- data/lib/pdk/cli/update.rb +33 -38
- data/lib/pdk/cli/util/command_redirector.rb +10 -1
- data/lib/pdk/cli/util/interview.rb +11 -4
- data/lib/pdk/cli/util/option_normalizer.rb +2 -4
- data/lib/pdk/cli/util/option_validator.rb +7 -9
- data/lib/pdk/cli/util/update_manager_printer.rb +4 -4
- data/lib/pdk/cli/util.rb +32 -48
- data/lib/pdk/cli/validate.rb +98 -96
- data/lib/pdk/cli.rb +124 -120
- data/lib/pdk/config/ini_file.rb +4 -3
- data/lib/pdk/config/ini_file_setting.rb +6 -10
- data/lib/pdk/config/json.rb +1 -0
- data/lib/pdk/config/json_schema_namespace.rb +5 -10
- data/lib/pdk/config/json_schema_setting.rb +3 -5
- data/lib/pdk/config/json_with_schema.rb +2 -4
- data/lib/pdk/config/namespace.rb +19 -13
- data/lib/pdk/config/setting.rb +5 -6
- data/lib/pdk/config/task_schema.json +116 -0
- data/lib/pdk/config/validator.rb +4 -4
- data/lib/pdk/config/yaml.rb +3 -8
- data/lib/pdk/config/yaml_with_schema.rb +4 -12
- data/lib/pdk/config.rb +47 -51
- data/lib/pdk/context/control_repo.rb +3 -2
- data/lib/pdk/context/module.rb +2 -2
- data/lib/pdk/context/none.rb +2 -2
- data/lib/pdk/context.rb +4 -5
- data/lib/pdk/control_repo.rb +3 -4
- data/lib/pdk/generate/defined_type.rb +3 -3
- data/lib/pdk/generate/fact.rb +3 -2
- data/lib/pdk/generate/function.rb +5 -4
- data/lib/pdk/generate/module.rb +91 -106
- data/lib/pdk/generate/provider.rb +5 -4
- data/lib/pdk/generate/puppet_class.rb +3 -3
- data/lib/pdk/generate/puppet_object.rb +9 -12
- data/lib/pdk/generate/task.rb +11 -10
- data/lib/pdk/generate/transport.rb +8 -7
- data/lib/pdk/generate.rb +1 -1
- data/lib/pdk/logger.rb +3 -2
- data/lib/pdk/module/build.rb +34 -49
- data/lib/pdk/module/convert.rb +13 -22
- data/lib/pdk/module/metadata.rb +53 -61
- data/lib/pdk/module/release.rb +19 -25
- data/lib/pdk/module/update.rb +4 -13
- data/lib/pdk/module/update_manager.rb +18 -25
- data/lib/pdk/module.rb +1 -1
- data/lib/pdk/monkey_patches.rb +268 -0
- data/lib/pdk/report/event.rb +12 -37
- data/lib/pdk/report.rb +4 -4
- data/lib/pdk/template/fetcher/git.rb +7 -8
- data/lib/pdk/template/fetcher/local.rb +1 -0
- data/lib/pdk/template/fetcher.rb +4 -2
- data/lib/pdk/template/renderer/v1/legacy_template_dir.rb +4 -9
- data/lib/pdk/template/renderer/v1/renderer.rb +19 -20
- data/lib/pdk/template/renderer/v1/template_file.rb +4 -8
- data/lib/pdk/template/renderer/v1.rb +1 -1
- data/lib/pdk/template/renderer.rb +1 -0
- data/lib/pdk/template/template_dir.rb +3 -3
- data/lib/pdk/template.rb +2 -6
- data/lib/pdk/tests/unit.rb +36 -25
- data/lib/pdk/util/bundler.rb +10 -14
- data/lib/pdk/util/changelog_generator.rb +15 -12
- data/lib/pdk/util/env.rb +1 -0
- data/lib/pdk/util/filesystem.rb +18 -17
- data/lib/pdk/util/git.rb +16 -21
- data/lib/pdk/util/json_finder.rb +7 -6
- data/lib/pdk/util/puppet_strings.rb +1 -1
- data/lib/pdk/util/puppet_version.rb +16 -67
- data/lib/pdk/util/ruby_version.rb +9 -13
- data/lib/pdk/util/template_uri.rb +17 -29
- data/lib/pdk/util/vendored_file.rb +5 -18
- data/lib/pdk/util/windows/api_types.rb +70 -64
- data/lib/pdk/util/windows/file.rb +31 -27
- data/lib/pdk/util/windows/process.rb +59 -61
- data/lib/pdk/util/windows/string.rb +19 -12
- data/lib/pdk/util.rb +12 -20
- data/lib/pdk/validate/control_repo/control_repo_validator_group.rb +1 -1
- data/lib/pdk/validate/control_repo/environment_conf_validator.rb +25 -25
- data/lib/pdk/validate/external_command_validator.rb +6 -1
- data/lib/pdk/validate/internal_ruby_validator.rb +5 -4
- data/lib/pdk/validate/invokable_validator.rb +30 -20
- data/lib/pdk/validate/metadata/metadata_json_lint_validator.rb +12 -14
- data/lib/pdk/validate/metadata/metadata_syntax_validator.rb +13 -15
- data/lib/pdk/validate/metadata/metadata_validator_group.rb +1 -1
- data/lib/pdk/validate/puppet/puppet_epp_validator.rb +16 -18
- data/lib/pdk/validate/puppet/puppet_lint_validator.rb +14 -14
- data/lib/pdk/validate/puppet/puppet_plan_syntax_validator.rb +1 -1
- data/lib/pdk/validate/puppet/puppet_syntax_validator.rb +16 -18
- data/lib/pdk/validate/puppet/puppet_validator_group.rb +1 -1
- data/lib/pdk/validate/ruby/ruby_rubocop_validator.rb +10 -11
- data/lib/pdk/validate/ruby/ruby_validator_group.rb +1 -1
- data/lib/pdk/validate/tasks/tasks_metadata_lint_validator.rb +19 -24
- data/lib/pdk/validate/tasks/tasks_name_validator.rb +11 -13
- data/lib/pdk/validate/tasks/tasks_validator_group.rb +1 -1
- data/lib/pdk/validate/validator.rb +4 -2
- data/lib/pdk/validate/validator_group.rb +6 -3
- data/lib/pdk/validate/yaml/yaml_syntax_validator.rb +27 -36
- data/lib/pdk/validate/yaml/yaml_validator_group.rb +1 -1
- data/lib/pdk/validate.rb +6 -6
- data/lib/pdk/version.rb +2 -2
- data/lib/pdk.rb +12 -12
- metadata +27 -35
- data/lib/pdk/cli/config/get.rb +0 -26
- data/lib/pdk/cli/config.rb +0 -22
- data/lib/pdk/cli/module/build.rb +0 -12
- data/lib/pdk/cli/module/generate.rb +0 -47
- data/lib/pdk/cli/module.rb +0 -14
data/lib/pdk/generate/module.rb
CHANGED
|
@@ -3,17 +3,17 @@ require 'pdk'
|
|
|
3
3
|
module PDK
|
|
4
4
|
module Generate
|
|
5
5
|
class Module
|
|
6
|
-
def self.validate_options(opts)
|
|
6
|
+
def self.validate_options(opts = {})
|
|
7
7
|
require 'pdk/cli/util/option_validator'
|
|
8
8
|
|
|
9
9
|
unless PDK::CLI::Util::OptionValidator.valid_module_name?(opts[:module_name])
|
|
10
|
-
error_msg = "'%{module_name}' is not a valid module name.\n" \
|
|
11
|
-
|
|
10
|
+
error_msg = format("'%{module_name}' is not a valid module name.\n" \
|
|
11
|
+
'Module names must begin with a lowercase letter and can only include lowercase letters, digits, and underscores.', module_name: opts[:module_name])
|
|
12
12
|
raise PDK::CLI::ExitWithError, error_msg
|
|
13
13
|
end
|
|
14
14
|
|
|
15
15
|
target_dir = PDK::Util::Filesystem.expand_path(opts[:target_dir])
|
|
16
|
-
raise PDK::CLI::ExitWithError, "The destination directory '%{dir}' already exists"
|
|
16
|
+
raise PDK::CLI::ExitWithError, format("The destination directory '%{dir}' already exists", dir: target_dir) if PDK::Util::Filesystem.exist?(target_dir)
|
|
17
17
|
end
|
|
18
18
|
|
|
19
19
|
def self.invoke(opts = {})
|
|
@@ -32,10 +32,8 @@ module PDK
|
|
|
32
32
|
test_file = File.join(parent_dir, '.pdk-test-writable')
|
|
33
33
|
PDK::Util::Filesystem.write_file(test_file, 'This file was created by the Puppet Development Kit to test if this folder was writable, you can safely remove this file.')
|
|
34
34
|
PDK::Util::Filesystem.rm_f(test_file)
|
|
35
|
-
rescue Errno::EACCES
|
|
36
|
-
raise PDK::CLI::FatalError, "You do not have permission to write to '%{parent_dir}'"
|
|
37
|
-
parent_dir: parent_dir,
|
|
38
|
-
}
|
|
35
|
+
rescue Errno::EACCES || Errno::EROFS
|
|
36
|
+
raise PDK::CLI::FatalError, format("You do not have permission to write to '%{parent_dir}'", parent_dir: parent_dir)
|
|
39
37
|
end
|
|
40
38
|
|
|
41
39
|
temp_target_dir = PDK::Util.make_tmpdir_name('pdk-module-target')
|
|
@@ -47,10 +45,8 @@ module PDK
|
|
|
47
45
|
if template_uri.default? && template_uri.default_ref?
|
|
48
46
|
PDK.logger.info 'Using the default template-url and template-ref.'
|
|
49
47
|
else
|
|
50
|
-
PDK.logger.info "Using the %{method} template-url and template-ref '%{template_uri}'."
|
|
51
|
-
|
|
52
|
-
template_uri: template_uri.metadata_format,
|
|
53
|
-
}
|
|
48
|
+
PDK.logger.info format("Using the %{method} template-url and template-ref '%{template_uri}'.", method: opts.key?(:'template-url') ? 'specified' : 'saved',
|
|
49
|
+
template_uri: template_uri.metadata_format)
|
|
54
50
|
end
|
|
55
51
|
|
|
56
52
|
begin
|
|
@@ -58,6 +54,7 @@ module PDK
|
|
|
58
54
|
PDK::Template.with(template_uri, context) do |template_dir|
|
|
59
55
|
template_dir.render_new_module(metadata.data['name'], metadata.data) do |relative_file_path, file_content, file_status|
|
|
60
56
|
next if [:delete, :unmanage].include?(file_status)
|
|
57
|
+
|
|
61
58
|
file = Pathname.new(temp_target_dir) + relative_file_path
|
|
62
59
|
file.dirname.mkpath
|
|
63
60
|
PDK::Util::Filesystem.write_file(file, file_content)
|
|
@@ -79,11 +76,11 @@ module PDK
|
|
|
79
76
|
# If the user specifies our default template url via the command
|
|
80
77
|
# line, remove the saved template-url answer so that the template_uri
|
|
81
78
|
# resolution can find new default URLs in the future.
|
|
82
|
-
PDK.config.set(
|
|
79
|
+
PDK.config.set(['user', 'module_defaults', 'template-url'], nil) if opts.key?(:'template-url')
|
|
83
80
|
else
|
|
84
81
|
# Save the template-url answers if the module was generated using a
|
|
85
82
|
# template/reference other than ours.
|
|
86
|
-
PDK.config.set(
|
|
83
|
+
PDK.config.set(['user', 'module_defaults', 'template-url'], template_uri.metadata_format)
|
|
87
84
|
end
|
|
88
85
|
|
|
89
86
|
begin
|
|
@@ -95,18 +92,11 @@ module PDK
|
|
|
95
92
|
end
|
|
96
93
|
end
|
|
97
94
|
|
|
98
|
-
PDK.logger.info "Module '%{name}' generated at path '%{path}'."
|
|
99
|
-
name: opts[:module_name],
|
|
100
|
-
path: target_dir,
|
|
101
|
-
}
|
|
95
|
+
PDK.logger.info format("Module '%{name}' generated at path '%{path}'.", name: opts[:module_name], path: target_dir)
|
|
102
96
|
PDK.logger.info "In your module directory, add classes with the 'pdk new class' command."
|
|
103
97
|
end
|
|
104
98
|
rescue Errno::EACCES => e
|
|
105
|
-
raise PDK::CLI::FatalError, "Failed to move '%{source}' to '%{target}': %{message}"
|
|
106
|
-
source: temp_target_dir,
|
|
107
|
-
target: target_dir,
|
|
108
|
-
message: e.message,
|
|
109
|
-
}
|
|
99
|
+
raise PDK::CLI::FatalError, format("Failed to move '%{source}' to '%{target}': %{message}", source: temp_target_dir, target: target_dir, message: e.message)
|
|
110
100
|
end
|
|
111
101
|
end
|
|
112
102
|
|
|
@@ -114,13 +104,11 @@ module PDK
|
|
|
114
104
|
require 'etc'
|
|
115
105
|
|
|
116
106
|
login = Etc.getlogin || ''
|
|
117
|
-
login_clean = login.downcase.gsub(
|
|
107
|
+
login_clean = login.downcase.gsub(/[^0-9a-z]/i, '')
|
|
118
108
|
login_clean = 'username' if login_clean.empty?
|
|
119
109
|
|
|
120
110
|
if login_clean != login
|
|
121
|
-
PDK.logger.debug 'Your username is not a valid Forge username. Proceeding with the username %{username}. You can fix this later in metadata.json.'
|
|
122
|
-
username: login_clean,
|
|
123
|
-
}
|
|
111
|
+
PDK.logger.debug format('Your username is not a valid Forge username. Proceeding with the username %{username}. You can fix this later in metadata.json.', username: login_clean)
|
|
124
112
|
end
|
|
125
113
|
|
|
126
114
|
login_clean
|
|
@@ -138,9 +126,15 @@ module PDK
|
|
|
138
126
|
PDK.config.with_scoped_value('module_defaults.author') { |val| defaults['author'] = val }
|
|
139
127
|
PDK.config.with_scoped_value('module_defaults.license') { |val| defaults['license'] = val }
|
|
140
128
|
defaults['license'] = opts[:license] if opts.key?(:license)
|
|
129
|
+
PDK.config.with_scoped_value('module_defaults.operatingsystem_support') { |val| defaults['operatingsystem_support'] = val }
|
|
141
130
|
|
|
142
131
|
metadata = PDK::Module::Metadata.new(defaults)
|
|
143
|
-
|
|
132
|
+
|
|
133
|
+
if opts[:'skip-interview']
|
|
134
|
+
metadata.data['operatingsystem_support'] = metadata.data['operatingsystem_support'].map { |val| PDK::Module::Metadata::OPERATING_SYSTEMS[val] }.flatten
|
|
135
|
+
else
|
|
136
|
+
module_interview(metadata, opts)
|
|
137
|
+
end
|
|
144
138
|
|
|
145
139
|
metadata
|
|
146
140
|
end
|
|
@@ -151,16 +145,11 @@ module PDK
|
|
|
151
145
|
File.join(target_dir, 'files'),
|
|
152
146
|
File.join(target_dir, 'manifests'),
|
|
153
147
|
File.join(target_dir, 'templates'),
|
|
154
|
-
File.join(target_dir, 'tasks')
|
|
148
|
+
File.join(target_dir, 'tasks')
|
|
155
149
|
].each do |dir|
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
raise PDK::CLI::FatalError, "Unable to create directory '%{dir}': %{message}" % {
|
|
160
|
-
dir: dir,
|
|
161
|
-
message: e.message,
|
|
162
|
-
}
|
|
163
|
-
end
|
|
150
|
+
PDK::Util::Filesystem.mkdir_p(dir)
|
|
151
|
+
rescue SystemCallError => e
|
|
152
|
+
raise PDK::CLI::FatalError, format("Unable to create directory '%{dir}': %{message}", dir: dir, message: e.message)
|
|
164
153
|
end
|
|
165
154
|
end
|
|
166
155
|
|
|
@@ -170,88 +159,88 @@ module PDK
|
|
|
170
159
|
|
|
171
160
|
questions = [
|
|
172
161
|
{
|
|
173
|
-
name:
|
|
174
|
-
question:
|
|
175
|
-
help:
|
|
176
|
-
required:
|
|
177
|
-
validate_pattern:
|
|
178
|
-
validate_message: 'Module names must begin with a lowercase letter and can only include lowercase letters, numbers, and underscores.'
|
|
162
|
+
name: 'module_name',
|
|
163
|
+
question: 'If you have a name for your module, add it here.',
|
|
164
|
+
help: 'This is the name that will be associated with your module, it should be relevant to the modules content.',
|
|
165
|
+
required: true,
|
|
166
|
+
validate_pattern: /\A[a-z][a-z0-9_]*\Z/i,
|
|
167
|
+
validate_message: 'Module names must begin with a lowercase letter and can only include lowercase letters, numbers, and underscores.'
|
|
179
168
|
},
|
|
180
169
|
{
|
|
181
|
-
name:
|
|
182
|
-
question:
|
|
183
|
-
help:
|
|
184
|
-
required:
|
|
185
|
-
validate_pattern:
|
|
170
|
+
name: 'forge_username',
|
|
171
|
+
question: 'If you have a Puppet Forge username, add it here.',
|
|
172
|
+
help: 'We can use this to upload your module to the Forge when it\'s complete.',
|
|
173
|
+
required: true,
|
|
174
|
+
validate_pattern: /\A[a-z0-9]+\Z/i,
|
|
186
175
|
validate_message: 'Forge usernames can only contain lowercase letters and numbers',
|
|
187
|
-
default:
|
|
176
|
+
default: opts[:username]
|
|
188
177
|
},
|
|
189
178
|
{
|
|
190
|
-
name:
|
|
191
|
-
question:
|
|
192
|
-
help:
|
|
193
|
-
required:
|
|
194
|
-
validate_pattern:
|
|
179
|
+
name: 'version',
|
|
180
|
+
question: 'What version is this module?',
|
|
181
|
+
help: 'Puppet uses Semantic Versioning (semver.org) to version modules.',
|
|
182
|
+
required: true,
|
|
183
|
+
validate_pattern: /\A[0-9]+\.[0-9]+\.[0-9]+/i,
|
|
195
184
|
validate_message: 'Semantic Version numbers must be in the form MAJOR.MINOR.PATCH',
|
|
196
|
-
default:
|
|
197
|
-
forge_only:
|
|
185
|
+
default: metadata.data['version'],
|
|
186
|
+
forge_only: true
|
|
198
187
|
},
|
|
199
188
|
{
|
|
200
|
-
name:
|
|
189
|
+
name: 'author',
|
|
201
190
|
question: 'Who wrote this module?',
|
|
202
|
-
help:
|
|
191
|
+
help: 'This is used to credit the module\'s author.',
|
|
203
192
|
required: true,
|
|
204
|
-
default:
|
|
193
|
+
default: metadata.data['author']
|
|
205
194
|
},
|
|
206
195
|
{
|
|
207
|
-
name:
|
|
196
|
+
name: 'license',
|
|
208
197
|
question: 'What license does this module code fall under?',
|
|
209
|
-
help:
|
|
198
|
+
help: 'This should be an identifier from https://spdx.org/licenses/. Common values are "Apache-2.0", "MIT", or "proprietary".',
|
|
210
199
|
required: true,
|
|
211
|
-
default:
|
|
200
|
+
default: metadata.data['license']
|
|
212
201
|
},
|
|
213
202
|
{
|
|
214
|
-
name:
|
|
203
|
+
name: 'operatingsystem_support',
|
|
215
204
|
question: 'What operating systems does this module support?',
|
|
216
|
-
help:
|
|
205
|
+
help: 'Use the up and down keys to move between the choices, space to select and enter to continue.',
|
|
217
206
|
required: true,
|
|
218
|
-
type:
|
|
219
|
-
choices:
|
|
220
|
-
default:
|
|
207
|
+
type: :multi_select,
|
|
208
|
+
choices: PDK::Module::Metadata::OPERATING_SYSTEMS,
|
|
209
|
+
default: metadata.data['operatingsystem_support'] do |os_name|
|
|
221
210
|
# tty-prompt uses a 1-index
|
|
222
211
|
PDK::Module::Metadata::OPERATING_SYSTEMS.keys.index(os_name) + 1
|
|
223
|
-
end
|
|
212
|
+
end
|
|
224
213
|
},
|
|
225
214
|
{
|
|
226
|
-
name:
|
|
227
|
-
question:
|
|
228
|
-
help:
|
|
229
|
-
required:
|
|
230
|
-
default:
|
|
231
|
-
forge_only: true
|
|
215
|
+
name: 'summary',
|
|
216
|
+
question: 'Summarize the purpose of this module in a single sentence.',
|
|
217
|
+
help: 'This helps other Puppet users understand what the module does.',
|
|
218
|
+
required: true,
|
|
219
|
+
default: metadata.data['summary'],
|
|
220
|
+
forge_only: true
|
|
232
221
|
},
|
|
233
222
|
{
|
|
234
|
-
name:
|
|
235
|
-
question:
|
|
236
|
-
help:
|
|
237
|
-
required:
|
|
238
|
-
default:
|
|
239
|
-
forge_only: true
|
|
223
|
+
name: 'source',
|
|
224
|
+
question: 'If there is a source code repository for this module, enter the URL here.',
|
|
225
|
+
help: 'Skip this if no repository exists yet. You can update this later in the metadata.json.',
|
|
226
|
+
required: true,
|
|
227
|
+
default: metadata.data['source'],
|
|
228
|
+
forge_only: true
|
|
240
229
|
},
|
|
241
230
|
{
|
|
242
|
-
name:
|
|
243
|
-
question:
|
|
244
|
-
help:
|
|
245
|
-
default:
|
|
246
|
-
forge_only: true
|
|
231
|
+
name: 'project_page',
|
|
232
|
+
question: 'If there is a URL where others can learn more about this module, enter it here.',
|
|
233
|
+
help: 'Optional. You can update this later in the metadata.json.',
|
|
234
|
+
default: metadata.data['project_page'],
|
|
235
|
+
forge_only: true
|
|
247
236
|
},
|
|
248
237
|
{
|
|
249
|
-
name:
|
|
250
|
-
question:
|
|
251
|
-
help:
|
|
252
|
-
default:
|
|
253
|
-
forge_only: true
|
|
254
|
-
}
|
|
238
|
+
name: 'issues_url',
|
|
239
|
+
question: 'If there is a public issue tracker for this module, enter its URL here.',
|
|
240
|
+
help: 'Optional. You can update this later in the metadata.json.',
|
|
241
|
+
default: metadata.data['issues_url'],
|
|
242
|
+
forge_only: true
|
|
243
|
+
}
|
|
255
244
|
]
|
|
256
245
|
|
|
257
246
|
prompt = TTY::Prompt.new(help_color: :cyan)
|
|
@@ -260,8 +249,8 @@ module PDK
|
|
|
260
249
|
|
|
261
250
|
if opts[:only_ask]
|
|
262
251
|
questions.reject! do |question|
|
|
263
|
-
if
|
|
264
|
-
metadata.data['name'] && metadata.data['name'] =~
|
|
252
|
+
if ['module_name', 'forge_username'].include?(question[:name])
|
|
253
|
+
metadata.data['name'] && metadata.data['name'] =~ /\A[a-z0-9]+-[a-z][a-z0-9_]*\Z/i
|
|
265
254
|
else
|
|
266
255
|
!opts[:only_ask].include?(question[:name])
|
|
267
256
|
end
|
|
@@ -275,15 +264,11 @@ module PDK
|
|
|
275
264
|
interview.add_questions(questions)
|
|
276
265
|
|
|
277
266
|
if PDK::Util::Filesystem.file?('metadata.json')
|
|
278
|
-
puts "\nWe need to update the metadata.json file for this module, so we
|
|
279
|
-
|
|
280
|
-
count: interview.num_questions,
|
|
281
|
-
}
|
|
267
|
+
puts format("\nWe need to update the metadata.json file for this module, so we're going to ask you %{count} " \
|
|
268
|
+
"questions.\n", count: interview.num_questions)
|
|
282
269
|
else
|
|
283
|
-
puts "\nWe need to create the metadata.json file for this module, so we
|
|
284
|
-
|
|
285
|
-
count: interview.num_questions,
|
|
286
|
-
}
|
|
270
|
+
puts format("\nWe need to create the metadata.json file for this module, so we're going to ask you %{count} " \
|
|
271
|
+
"questions.\n", count: interview.num_questions)
|
|
287
272
|
end
|
|
288
273
|
|
|
289
274
|
puts 'If the question is not applicable to this module, accept the default option ' \
|
|
@@ -320,8 +305,8 @@ module PDK
|
|
|
320
305
|
|
|
321
306
|
continue = PDK::CLI::Util.prompt_for_yes(
|
|
322
307
|
'Metadata will be generated based on this information, continue?',
|
|
323
|
-
prompt:
|
|
324
|
-
cancel_message: 'Interview cancelled; exiting.'
|
|
308
|
+
prompt: prompt,
|
|
309
|
+
cancel_message: 'Interview cancelled; exiting.'
|
|
325
310
|
)
|
|
326
311
|
|
|
327
312
|
unless continue
|
|
@@ -331,9 +316,9 @@ module PDK
|
|
|
331
316
|
end
|
|
332
317
|
|
|
333
318
|
require 'pdk/answer_file'
|
|
334
|
-
PDK.config.set(
|
|
335
|
-
PDK.config.set(
|
|
336
|
-
PDK.config.set(
|
|
319
|
+
PDK.config.set(['user', 'module_defaults', 'forge_username'], opts[:username]) unless opts[:username].nil?
|
|
320
|
+
PDK.config.set(['user', 'module_defaults', 'author'], answers['author']) unless answers['author'].nil?
|
|
321
|
+
PDK.config.set(['user', 'module_defaults', 'license'], answers['license']) unless answers['license'].nil?
|
|
337
322
|
end
|
|
338
323
|
end
|
|
339
324
|
end
|
|
@@ -9,13 +9,14 @@ module PDK
|
|
|
9
9
|
|
|
10
10
|
def template_files
|
|
11
11
|
files = {
|
|
12
|
-
'provider_spec.erb'
|
|
13
|
-
'provider_type_spec.erb' => File.join('spec', 'unit', 'puppet', 'type', object_name)
|
|
12
|
+
'provider_spec.erb' => "#{File.join('spec', 'unit', 'puppet', 'provider', object_name, object_name)}_spec.rb",
|
|
13
|
+
'provider_type_spec.erb' => "#{File.join('spec', 'unit', 'puppet', 'type', object_name)}_spec.rb"
|
|
14
14
|
}
|
|
15
15
|
return files if spec_only?
|
|
16
|
+
|
|
16
17
|
files.merge(
|
|
17
|
-
'provider.erb' => File.join('lib', 'puppet', 'provider', object_name, object_name)
|
|
18
|
-
'provider_type.erb' => File.join('lib', 'puppet', 'type', object_name)
|
|
18
|
+
'provider.erb' => "#{File.join('lib', 'puppet', 'provider', object_name, object_name)}.rb",
|
|
19
|
+
'provider_type.erb' => "#{File.join('lib', 'puppet', 'type', object_name)}.rb"
|
|
19
20
|
)
|
|
20
21
|
end
|
|
21
22
|
|
|
@@ -25,12 +25,12 @@ module PDK
|
|
|
25
25
|
class_name_parts = object_name.split('::')
|
|
26
26
|
# Drop the module name if the object name contains multiple parts
|
|
27
27
|
class_name_parts.delete_at(0) if class_name_parts.length > 1
|
|
28
|
-
files = { 'class_spec.erb' => File.join('spec', 'classes', *class_name_parts)
|
|
28
|
+
files = { 'class_spec.erb' => "#{File.join('spec', 'classes', *class_name_parts)}_spec.rb" }
|
|
29
29
|
return files if spec_only?
|
|
30
30
|
|
|
31
|
-
class_name_parts = object_name.split('::')[1
|
|
31
|
+
class_name_parts = object_name.split('::')[1..]
|
|
32
32
|
class_name_parts << 'init' if class_name_parts.empty?
|
|
33
|
-
files['class.erb'] = File.join('manifests', *class_name_parts)
|
|
33
|
+
files['class.erb'] = "#{File.join('manifests', *class_name_parts)}.pp"
|
|
34
34
|
|
|
35
35
|
files
|
|
36
36
|
end
|
|
@@ -3,9 +3,7 @@ require 'pdk'
|
|
|
3
3
|
module PDK
|
|
4
4
|
module Generate
|
|
5
5
|
class PuppetObject
|
|
6
|
-
attr_reader :context
|
|
7
|
-
attr_reader :object_name
|
|
8
|
-
attr_reader :options
|
|
6
|
+
attr_reader :context, :object_name, :options
|
|
9
7
|
|
|
10
8
|
# Initialises the PDK::Generate::PuppetObject object.
|
|
11
9
|
#
|
|
@@ -21,7 +19,8 @@ module PDK
|
|
|
21
19
|
# @param object_name [String] The name of the object.
|
|
22
20
|
# @param options [Hash{Symbol => Object}]
|
|
23
21
|
def initialize(context, object_name, options)
|
|
24
|
-
raise ArgumentError, 'Expected PDK::Context::AbstractContext but got \'%{klass}\' for context'
|
|
22
|
+
raise ArgumentError, format('Expected PDK::Context::AbstractContext but got \'%{klass}\' for context', klass: context.class) unless context.is_a?(PDK::Context::AbstractContext)
|
|
23
|
+
|
|
25
24
|
@context = context
|
|
26
25
|
@options = options
|
|
27
26
|
@object_name = object_name
|
|
@@ -61,7 +60,7 @@ module PDK
|
|
|
61
60
|
# @return [void]
|
|
62
61
|
# @abstract
|
|
63
62
|
def check_preconditions
|
|
64
|
-
raise ArgumentError, 'Expected a module context but got %{context_name}'
|
|
63
|
+
raise ArgumentError, format('Expected a module context but got %{context_name}', context_name: context.display_name) unless context.is_a?(PDK::Context::Module)
|
|
65
64
|
end
|
|
66
65
|
|
|
67
66
|
# Check the preconditions of this template group, behaving as a predicate rather than raising an exception.
|
|
@@ -122,11 +121,9 @@ module PDK
|
|
|
122
121
|
def stage_change(relative_dest_path, content, update_manager)
|
|
123
122
|
absolute_file_path = File.join(context.root_path, relative_dest_path)
|
|
124
123
|
if PDK::Util::Filesystem.exist?(absolute_file_path)
|
|
125
|
-
raise PDK::CLI::ExitWithError, "Unable to generate %{object_type}; '%{file}' already exists."
|
|
126
|
-
file: absolute_file_path,
|
|
127
|
-
object_type: spec_only? ? 'unit test' : friendly_name,
|
|
128
|
-
}
|
|
124
|
+
raise PDK::CLI::ExitWithError, format("Unable to generate %{object_type}; '%{file}' already exists.", file: absolute_file_path, object_type: spec_only? ? 'unit test' : friendly_name)
|
|
129
125
|
end
|
|
126
|
+
|
|
130
127
|
update_manager.add_file(absolute_file_path, content)
|
|
131
128
|
end
|
|
132
129
|
|
|
@@ -160,7 +157,7 @@ module PDK
|
|
|
160
157
|
|
|
161
158
|
templates.each do |template|
|
|
162
159
|
if template[:uri].nil?
|
|
163
|
-
PDK.logger.debug('No %{dir_type} template found; trying next template directory.'
|
|
160
|
+
PDK.logger.debug(format('No %{dir_type} template found; trying next template directory.', dir_type: template[:type]))
|
|
164
161
|
next
|
|
165
162
|
end
|
|
166
163
|
|
|
@@ -170,9 +167,9 @@ module PDK
|
|
|
170
167
|
# TODO: refactor to a search-and-execute form instead
|
|
171
168
|
return # work is done # rubocop:disable Lint/NonLocalExitFromIterator
|
|
172
169
|
elsif template[:allow_fallback]
|
|
173
|
-
PDK.logger.debug('Unable to find a %{type} template in %{url}; trying next template directory.'
|
|
170
|
+
PDK.logger.debug(format('Unable to find a %{type} template in %{url}; trying next template directory.', type: friendly_name, url: template[:uri]))
|
|
174
171
|
else
|
|
175
|
-
raise PDK::CLI::FatalError, 'Unable to find the %{type} template in %{url}.'
|
|
172
|
+
raise PDK::CLI::FatalError, format('Unable to find the %{type} template in %{url}.', type: friendly_name, url: template[:uri])
|
|
176
173
|
end
|
|
177
174
|
end
|
|
178
175
|
end
|
data/lib/pdk/generate/task.rb
CHANGED
|
@@ -9,14 +9,15 @@ module PDK
|
|
|
9
9
|
|
|
10
10
|
def template_files
|
|
11
11
|
return {} if spec_only?
|
|
12
|
+
|
|
12
13
|
{
|
|
13
|
-
'task.erb' => File.join('tasks', task_name
|
|
14
|
+
'task.erb' => File.join('tasks', "#{task_name}.sh")
|
|
14
15
|
}
|
|
15
16
|
end
|
|
16
17
|
|
|
17
18
|
def template_data
|
|
18
19
|
{
|
|
19
|
-
name: object_name
|
|
20
|
+
name: object_name
|
|
20
21
|
}
|
|
21
22
|
end
|
|
22
23
|
|
|
@@ -29,17 +30,17 @@ module PDK
|
|
|
29
30
|
super
|
|
30
31
|
|
|
31
32
|
error = "A task named '%{name}' already exists in this module; defined in %{file}"
|
|
32
|
-
allowed_extensions =
|
|
33
|
+
allowed_extensions = ['.md', '.conf']
|
|
33
34
|
|
|
34
|
-
PDK::Util::Filesystem.glob(File.join(context.root_path, 'tasks', task_name
|
|
35
|
+
PDK::Util::Filesystem.glob(File.join(context.root_path, 'tasks', "#{task_name}.*")).each do |file|
|
|
35
36
|
next if allowed_extensions.include?(File.extname(file))
|
|
36
37
|
|
|
37
|
-
raise PDK::CLI::ExitWithError, error
|
|
38
|
+
raise PDK::CLI::ExitWithError, format(error, name: task_name, file: file)
|
|
38
39
|
end
|
|
39
40
|
end
|
|
40
41
|
|
|
41
42
|
def non_template_files
|
|
42
|
-
task_metadata_file = File.join('tasks', task_name
|
|
43
|
+
task_metadata_file = File.join('tasks', "#{task_name}.json")
|
|
43
44
|
{ task_metadata_file => JSON.pretty_generate(task_metadata) }
|
|
44
45
|
end
|
|
45
46
|
|
|
@@ -52,15 +53,15 @@ module PDK
|
|
|
52
53
|
#
|
|
53
54
|
# @api private
|
|
54
55
|
def task_name
|
|
55
|
-
|
|
56
|
+
object_name == module_name ? 'init' : object_name
|
|
56
57
|
end
|
|
57
58
|
|
|
58
59
|
def task_metadata
|
|
59
60
|
{
|
|
60
61
|
puppet_task_version: 1,
|
|
61
|
-
supports_noop:
|
|
62
|
-
description:
|
|
63
|
-
parameters:
|
|
62
|
+
supports_noop: false,
|
|
63
|
+
description: options.fetch(:description, 'A short description of this task'),
|
|
64
|
+
parameters: {}
|
|
64
65
|
}
|
|
65
66
|
end
|
|
66
67
|
end
|
|
@@ -8,24 +8,25 @@ module PDK
|
|
|
8
8
|
end
|
|
9
9
|
|
|
10
10
|
def template_files
|
|
11
|
-
#
|
|
11
|
+
# NOTE: Due to how the V1 templates work, the names of the source template files may be mismatched to
|
|
12
12
|
# their destination, e.g. transport_type.erb is really a transport schema
|
|
13
13
|
files = {
|
|
14
|
-
'transport_spec.erb'
|
|
15
|
-
'transport_type_spec.erb' => File.join('spec', 'unit', 'puppet', 'transport', 'schema', object_name)
|
|
14
|
+
'transport_spec.erb' => "#{File.join('spec', 'unit', 'puppet', 'transport', object_name)}_spec.rb",
|
|
15
|
+
'transport_type_spec.erb' => "#{File.join('spec', 'unit', 'puppet', 'transport', 'schema', object_name)}_spec.rb"
|
|
16
16
|
}
|
|
17
17
|
return files if spec_only?
|
|
18
|
+
|
|
18
19
|
files.merge(
|
|
19
|
-
'transport.erb' => File.join('lib', 'puppet', 'transport', object_name)
|
|
20
|
-
'transport_device.erb'
|
|
21
|
-
'transport_type.erb'
|
|
20
|
+
'transport.erb' => "#{File.join('lib', 'puppet', 'transport', object_name)}.rb",
|
|
21
|
+
'transport_device.erb' => File.join('lib', 'puppet', 'util', 'network_device', object_name, 'device.rb'),
|
|
22
|
+
'transport_type.erb' => "#{File.join('lib', 'puppet', 'transport', 'schema', object_name)}.rb"
|
|
22
23
|
)
|
|
23
24
|
end
|
|
24
25
|
|
|
25
26
|
def template_data
|
|
26
27
|
{
|
|
27
28
|
name: object_name,
|
|
28
|
-
transport_class: class_name_from_object_name(object_name)
|
|
29
|
+
transport_class: class_name_from_object_name(object_name)
|
|
29
30
|
}
|
|
30
31
|
end
|
|
31
32
|
end
|
data/lib/pdk/generate.rb
CHANGED
data/lib/pdk/logger.rb
CHANGED
|
@@ -6,7 +6,7 @@ module PDK
|
|
|
6
6
|
WRAP_COLUMN_LIMIT = 78
|
|
7
7
|
|
|
8
8
|
def initialize
|
|
9
|
-
super(
|
|
9
|
+
super($stderr)
|
|
10
10
|
@sent_messages = {}
|
|
11
11
|
|
|
12
12
|
# TODO: Decide on output format.
|
|
@@ -14,7 +14,7 @@ module PDK
|
|
|
14
14
|
prefix = "pdk (#{severity}): "
|
|
15
15
|
if msg.is_a?(Hash)
|
|
16
16
|
if msg.fetch(:wrap, false)
|
|
17
|
-
wrap_pattern =
|
|
17
|
+
wrap_pattern = /(.{1,#{WRAP_COLUMN_LIMIT - prefix.length}})(\s+|\Z)/
|
|
18
18
|
"#{prefix}#{msg[:text].gsub(wrap_pattern, "\\1\n#{' ' * prefix.length}")}\n"
|
|
19
19
|
else
|
|
20
20
|
"#{prefix}#{msg[:text]}\n"
|
|
@@ -30,6 +30,7 @@ module PDK
|
|
|
30
30
|
def warn_once(*args)
|
|
31
31
|
hash = args.inspect.hash
|
|
32
32
|
return if (@sent_messages[::Logger::WARN] ||= {}).key?(hash)
|
|
33
|
+
|
|
33
34
|
@sent_messages[::Logger::WARN][hash] = true
|
|
34
35
|
warn(*args)
|
|
35
36
|
end
|