pdk 2.7.0 → 3.0.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 +29 -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/util/git.rb
CHANGED
@@ -3,10 +3,7 @@ require 'pdk'
|
|
3
3
|
module PDK
|
4
4
|
module Util
|
5
5
|
class GitError < StandardError
|
6
|
-
attr_reader :stdout
|
7
|
-
attr_reader :stderr
|
8
|
-
attr_reader :exit_code
|
9
|
-
attr_reader :args
|
6
|
+
attr_reader :stdout, :stderr, :exit_code, :args
|
10
7
|
|
11
8
|
def initialze(args, result)
|
12
9
|
@args = args
|
@@ -14,12 +11,12 @@ module PDK
|
|
14
11
|
@stderr = result[:stderr]
|
15
12
|
@exit_code = result[:exit_code]
|
16
13
|
|
17
|
-
super('Git command failed: git %{args}'
|
14
|
+
super(format('Git command failed: git %{args}', args: args.join(' ')))
|
18
15
|
end
|
19
16
|
end
|
20
17
|
|
21
18
|
module Git
|
22
|
-
GIT_QUERY_CACHE_TTL
|
19
|
+
GIT_QUERY_CACHE_TTL = 10
|
23
20
|
|
24
21
|
def self.git_bindir
|
25
22
|
@git_dir ||= File.join('private', 'git', Gem.win_platform? ? 'cmd' : 'bin')
|
@@ -67,6 +64,7 @@ module PDK
|
|
67
64
|
def self.repo?(maybe_repo)
|
68
65
|
result = cached_git_query(maybe_repo, :repo?)
|
69
66
|
return result unless result.nil?
|
67
|
+
|
70
68
|
result = if PDK::Util::Filesystem.directory?(maybe_repo)
|
71
69
|
# Use boolean shortcircuiting here. The mostly likely type of git repo
|
72
70
|
# is a "normal" repo with a working tree. Bare repos do not have work tree
|
@@ -90,6 +88,7 @@ module PDK
|
|
90
88
|
|
91
89
|
def self.work_tree?(path)
|
92
90
|
return false unless PDK::Util::Filesystem.directory?(path)
|
91
|
+
|
93
92
|
result = cached_git_query(path, :work_tree?)
|
94
93
|
return result unless result.nil?
|
95
94
|
|
@@ -100,30 +99,27 @@ module PDK
|
|
100
99
|
end
|
101
100
|
|
102
101
|
def self.work_dir_clean?(repo)
|
103
|
-
raise PDK::CLI::ExitWithError, 'Unable to locate git work dir "%{workdir}"'
|
104
|
-
raise PDK::CLI::ExitWithError, 'Unable to locate git dir "%{gitdir}"'
|
102
|
+
raise PDK::CLI::ExitWithError, format('Unable to locate git work dir "%{workdir}"', workdir: repo) unless PDK::Util::Filesystem.directory?(repo)
|
103
|
+
raise PDK::CLI::ExitWithError, format('Unable to locate git dir "%{gitdir}"', gitdir: repo) unless PDK::Util::Filesystem.directory?(File.join(repo, '.git'))
|
105
104
|
|
106
105
|
git('--work-tree', repo, '--git-dir', File.join(repo, '.git'), 'status', '--untracked-files=no', '--porcelain', repo)[:stdout].empty?
|
107
106
|
end
|
108
107
|
|
109
108
|
def self.ls_remote(repo, ref)
|
110
|
-
if PDK::Util::Filesystem.directory?(repo)
|
111
|
-
repo = 'file://' + repo
|
112
|
-
end
|
109
|
+
repo = "file://#{repo}" if PDK::Util::Filesystem.directory?(repo)
|
113
110
|
|
114
111
|
output = git('ls-remote', '--refs', repo, ref)
|
115
112
|
|
116
113
|
unless output[:exit_code].zero?
|
117
114
|
PDK.logger.error output[:stdout]
|
118
115
|
PDK.logger.error output[:stderr]
|
119
|
-
raise PDK::CLI::ExitWithError, 'Unable to access the template repository "%{repository}"'
|
120
|
-
repository: repo,
|
121
|
-
}
|
116
|
+
raise PDK::CLI::ExitWithError, format('Unable to access the template repository "%{repository}"', repository: repo)
|
122
117
|
end
|
123
118
|
|
124
|
-
matching_refs = output[:stdout].split(
|
125
|
-
matching_ref = matching_refs.find { |_sha, remote_ref|
|
126
|
-
raise PDK::CLI::ExitWithError, 'Unable to find a branch or tag named "%{ref}" in %{repo}'
|
119
|
+
matching_refs = output[:stdout].split(/\r?\n/).map { |r| r.split("\t") }
|
120
|
+
matching_ref = matching_refs.find { |_sha, remote_ref| ["refs/tags/#{ref}", "refs/remotes/origin/#{ref}", "refs/heads/#{ref}"].include?(remote_ref) }
|
121
|
+
raise PDK::CLI::ExitWithError, format('Unable to find a branch or tag named "%{ref}" in %{repo}', ref: ref, repo: repo) if matching_ref.nil?
|
122
|
+
|
127
123
|
matching_ref.first
|
128
124
|
end
|
129
125
|
|
@@ -131,6 +127,7 @@ module PDK
|
|
131
127
|
args = ['--git-dir', path, 'describe', '--all', '--long', '--always', ref].compact
|
132
128
|
result = git(*args)
|
133
129
|
raise PDK::Util::GitError, args, result unless result[:exit_code].zero?
|
130
|
+
|
134
131
|
result[:stdout].strip
|
135
132
|
end
|
136
133
|
|
@@ -148,14 +145,12 @@ module PDK
|
|
148
145
|
|
149
146
|
def self.cached_git_query(repo, query)
|
150
147
|
# TODO: Not thread safe
|
151
|
-
if @git_repo_expire_cache.nil?
|
148
|
+
if @git_repo_expire_cache.nil? || Time.now > @git_repo_expire_cache
|
152
149
|
@git_repo_expire_cache = Time.now + GIT_QUERY_CACHE_TTL # Expire the cache every GIT_QUERY_CACHE_TTL seconds
|
153
150
|
@git_repo_cache = {}
|
154
|
-
elsif Time.now > @git_repo_expire_cache
|
155
|
-
@git_repo_expire_cache = Time.now + GIT_QUERY_CACHE_TTL
|
156
|
-
@git_repo_cache = {}
|
157
151
|
end
|
158
152
|
return nil if @git_repo_cache[repo].nil?
|
153
|
+
|
159
154
|
@git_repo_cache[repo][query]
|
160
155
|
end
|
161
156
|
private_class_method :cached_git_query
|
data/lib/pdk/util/json_finder.rb
CHANGED
@@ -33,13 +33,14 @@ module PDK
|
|
33
33
|
@scanner.getch until @scanner.peek(1) == '{' || @scanner.eos?
|
34
34
|
|
35
35
|
(@objects ||= []) << begin
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
36
|
+
JSON.parse(read_object(true) || '')
|
37
|
+
rescue JSON::ParserError
|
38
|
+
nil
|
39
|
+
end
|
40
40
|
end
|
41
41
|
|
42
42
|
return [] if @objects.nil?
|
43
|
+
|
43
44
|
@objects = @objects.compact
|
44
45
|
end
|
45
46
|
|
@@ -56,7 +57,7 @@ module PDK
|
|
56
57
|
matched_text = new_object ? @scanner.getch : ''
|
57
58
|
|
58
59
|
until @scanner.eos?
|
59
|
-
text = @scanner.scan_until(
|
60
|
+
text = @scanner.scan_until(/(?:(?<!\\)"|\{|\})/)
|
60
61
|
unless text
|
61
62
|
@scanner.terminate
|
62
63
|
return nil
|
@@ -67,7 +68,7 @@ module PDK
|
|
67
68
|
when '}'
|
68
69
|
break
|
69
70
|
when '"'
|
70
|
-
text = @scanner.scan_until(
|
71
|
+
text = @scanner.scan_until(/(?<!\\)"/)
|
71
72
|
unless text
|
72
73
|
@scanner.terminate
|
73
74
|
return nil
|
@@ -117,7 +117,7 @@ module PDK
|
|
117
117
|
require 'pdk/generate'
|
118
118
|
|
119
119
|
PDK::Generate.generators.find do |gen|
|
120
|
-
gen.const_defined?(:PUPPET_STRINGS_TYPE) && gen::PUPPET_STRINGS_TYPE
|
120
|
+
gen.const_defined?(:PUPPET_STRINGS_TYPE) && type == gen::PUPPET_STRINGS_TYPE
|
121
121
|
end
|
122
122
|
end
|
123
123
|
end
|
@@ -25,8 +25,8 @@ module PDK
|
|
25
25
|
require 'pdk/util/ruby_version'
|
26
26
|
|
27
27
|
{
|
28
|
-
gem_version: 'file://%{path}'
|
29
|
-
ruby_version: PDK::Util::RubyVersion.latest_ruby_version
|
28
|
+
gem_version: format('file://%{path}', path: puppet_dev_path),
|
29
|
+
ruby_version: PDK::Util::RubyVersion.latest_ruby_version
|
30
30
|
}
|
31
31
|
end
|
32
32
|
|
@@ -39,9 +39,7 @@ module PDK
|
|
39
39
|
def latest_available
|
40
40
|
latest = find_gem(Gem::Requirement.create('>= 0'))
|
41
41
|
|
42
|
-
if latest.nil?
|
43
|
-
raise ArgumentError, 'Unable to find a Puppet gem in current Ruby environment or from Rubygems.org.'
|
44
|
-
end
|
42
|
+
raise ArgumentError, 'Unable to find a Puppet gem in current Ruby environment or from Rubygems.org.' if latest.nil?
|
45
43
|
|
46
44
|
latest
|
47
45
|
end
|
@@ -69,7 +67,7 @@ module PDK
|
|
69
67
|
|
70
68
|
PDK.logger.error clone_result[:stdout]
|
71
69
|
PDK.logger.error clone_result[:stderr]
|
72
|
-
raise PDK::CLI::FatalError, "Unable to clone git repository from '%{repo}'."
|
70
|
+
raise PDK::CLI::FatalError, format("Unable to clone git repository from '%{repo}'.", repo: DEFAULT_PUPPET_DEV_URL)
|
73
71
|
end
|
74
72
|
|
75
73
|
# Fetch Updates from remote repository
|
@@ -78,7 +76,7 @@ module PDK
|
|
78
76
|
unless fetch_result[:exit_code].zero?
|
79
77
|
PDK.logger.error fetch_result[:stdout]
|
80
78
|
PDK.logger.error fetch_result[:stderr]
|
81
|
-
raise PDK::CLI::FatalError, "Unable to fetch from git remote at '%{repo}'."
|
79
|
+
raise PDK::CLI::FatalError, format("Unable to fetch from git remote at '%{repo}'.", repo: DEFAULT_PUPPET_DEV_URL)
|
82
80
|
end
|
83
81
|
|
84
82
|
# Reset local repo to latest
|
@@ -89,7 +87,7 @@ module PDK
|
|
89
87
|
|
90
88
|
PDK.logger.error reset_result[:stdout]
|
91
89
|
PDK.logger.error reset_result[:stderr]
|
92
|
-
raise PDK::CLI::FatalError, "Unable to update git repository at '%{cachedir}'."
|
90
|
+
raise PDK::CLI::FatalError, format("Unable to update git repository at '%{cachedir}'.", cachedir: puppet_dev_path)
|
93
91
|
end
|
94
92
|
|
95
93
|
def find_gem_for(version_str)
|
@@ -108,18 +106,12 @@ module PDK
|
|
108
106
|
latest_requirement = Gem::Requirement.create(requirement_string)
|
109
107
|
latest_available_gem = find_gem(latest_requirement)
|
110
108
|
|
111
|
-
if latest_available_gem.nil?
|
112
|
-
raise ArgumentError, 'Unable to find a Puppet gem matching %{requirement}.' % {
|
113
|
-
requirement: latest_requirement,
|
114
|
-
}
|
115
|
-
end
|
109
|
+
raise ArgumentError, format('Unable to find a Puppet gem matching %{requirement}.', requirement: latest_requirement) if latest_available_gem.nil?
|
116
110
|
|
117
111
|
# Only issue this warning if they requested an exact version that isn't available.
|
118
112
|
if version.segments.length == 3
|
119
|
-
PDK.logger.warn('Puppet %{requested_version} is not available, activating %{found_version} instead.'
|
120
|
-
|
121
|
-
found_version: latest_available_gem[:gem_version].version,
|
122
|
-
})
|
113
|
+
PDK.logger.warn(format('Puppet %{requested_version} is not available, activating %{found_version} instead.', requested_version: version_str,
|
114
|
+
found_version: latest_available_gem[:gem_version].version))
|
123
115
|
end
|
124
116
|
|
125
117
|
latest_available_gem
|
@@ -134,20 +126,13 @@ module PDK
|
|
134
126
|
safe_versions = {
|
135
127
|
2023 => '7.23.0',
|
136
128
|
2021 => '7.23.0',
|
137
|
-
2019 => '6.29.0'
|
129
|
+
2019 => '6.29.0'
|
138
130
|
}
|
139
131
|
|
140
132
|
gem_version = safe_versions[version.segments[0]]
|
141
|
-
if gem_version.nil?
|
142
|
-
raise ArgumentError, 'Unable to map Puppet Enterprise version %{pe_version} to a Puppet version.' % {
|
143
|
-
pe_version: version_str,
|
144
|
-
}
|
145
|
-
end
|
133
|
+
raise ArgumentError, format('Unable to map Puppet Enterprise version %{pe_version} to a Puppet version.', pe_version: version_str) if gem_version.nil?
|
146
134
|
|
147
|
-
PDK.logger.info 'Puppet Enterprise %{pe_version} maps to Puppet %{puppet_version}.'
|
148
|
-
pe_version: version_str,
|
149
|
-
puppet_version: gem_version,
|
150
|
-
}
|
135
|
+
PDK.logger.info format('Puppet Enterprise %{pe_version} maps to Puppet %{puppet_version}.', pe_version: version_str, puppet_version: gem_version)
|
151
136
|
|
152
137
|
find_gem_for(gem_version)
|
153
138
|
end
|
@@ -172,7 +157,7 @@ module PDK
|
|
172
157
|
|
173
158
|
# Split combined requirements like ">= 4.7.0 < 6.0.0" into their
|
174
159
|
# component requirements [">= 4.7.0", "< 6.0.0"]
|
175
|
-
pattern =
|
160
|
+
pattern = /#{Gem::Requirement::PATTERN_RAW}/o
|
176
161
|
requirement_strings = metadata_requirement['version_requirement'].scan(pattern).map do |req|
|
177
162
|
req.compact.join(' ')
|
178
163
|
end
|
@@ -186,47 +171,11 @@ module PDK
|
|
186
171
|
def parse_specified_version(version_str)
|
187
172
|
Gem::Version.new(version_str)
|
188
173
|
rescue ArgumentError
|
189
|
-
raise ArgumentError, '%{version} is not a valid version number.'
|
190
|
-
version: version_str,
|
191
|
-
}
|
192
|
-
end
|
193
|
-
|
194
|
-
def pe_version_map
|
195
|
-
@pe_version_map ||= fetch_pe_version_map.map { |version_map|
|
196
|
-
maps = version_map['versions'].map do |pe_release|
|
197
|
-
requirements = ["= #{pe_release['version']}"]
|
198
|
-
|
199
|
-
# Some PE release have a .0 Z release, which causes problems when
|
200
|
-
# the user specifies "X.Y" expecting to get the latest Z and
|
201
|
-
# instead getting the oldest.
|
202
|
-
requirements << "!= #{pe_release['version'].gsub(%r{\.\d+\Z}, '')}" if pe_release['version'].end_with?('.0')
|
203
|
-
{
|
204
|
-
requirement: Gem::Requirement.create(requirements),
|
205
|
-
gem_version: pe_release['puppet'],
|
206
|
-
}
|
207
|
-
end
|
208
|
-
|
209
|
-
maps << {
|
210
|
-
requirement: requirement_from_forge_range(version_map['release']),
|
211
|
-
gem_version: version_map['versions'].find { |r| r['version'] == version_map['latest'] }['puppet'],
|
212
|
-
}
|
213
|
-
}.flatten
|
214
|
-
end
|
215
|
-
|
216
|
-
def fetch_pe_version_map
|
217
|
-
require 'pdk/util/vendored_file'
|
218
|
-
|
219
|
-
map = PDK::Util::VendoredFile.new('pe_versions.json', PE_VERSIONS_URL).read
|
220
|
-
|
221
|
-
JSON.parse(map)
|
222
|
-
rescue PDK::Util::VendoredFile::DownloadError => e
|
223
|
-
raise PDK::CLI::FatalError, e.message
|
224
|
-
rescue JSON::ParserError
|
225
|
-
raise PDK::CLI::FatalError, 'Failed to parse Puppet Enterprise version map file.'
|
174
|
+
raise ArgumentError, format('%{version} is not a valid version number.', version: version_str)
|
226
175
|
end
|
227
176
|
|
228
177
|
def requirement_from_forge_range(range_str)
|
229
|
-
Gem::Requirement.create("~> #{range_str.gsub(
|
178
|
+
Gem::Requirement.create("~> #{range_str.gsub(/\.x\Z/, '.0')}")
|
230
179
|
end
|
231
180
|
|
232
181
|
def rubygems_puppet_versions
|
@@ -236,7 +185,7 @@ module PDK
|
|
236
185
|
spec_tuple.name == 'puppet' && Gem::Platform.match(spec_tuple.platform)
|
237
186
|
end
|
238
187
|
puppet_versions = puppet_tuples.map { |name, _| name.version }.uniq
|
239
|
-
puppet_versions.sort
|
188
|
+
puppet_versions.sort.reverse
|
240
189
|
end
|
241
190
|
end
|
242
191
|
|
@@ -31,23 +31,19 @@ module PDK
|
|
31
31
|
end
|
32
32
|
|
33
33
|
def use(version)
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
raise ArgumentError, 'Unknown Ruby version "%{ruby_version}"' % {
|
38
|
-
ruby_version: version,
|
39
|
-
}
|
40
|
-
end
|
34
|
+
raise ArgumentError, format('Unknown Ruby version "%{ruby_version}"', ruby_version: version) unless versions.key?(version)
|
35
|
+
|
36
|
+
@active_ruby_version = version
|
41
37
|
end
|
42
38
|
|
43
39
|
def scan_for_packaged_rubies
|
44
40
|
require 'pdk/util'
|
45
41
|
|
46
42
|
ruby_basedir = File.join(PDK::Util.pdk_package_basedir, 'private', 'ruby', '*')
|
47
|
-
PDK::Util::Filesystem.glob(ruby_basedir).sort.map
|
43
|
+
PDK::Util::Filesystem.glob(ruby_basedir).sort.map do |ruby_dir|
|
48
44
|
version = File.basename(ruby_dir)
|
49
|
-
[version, version.split('.').take(2).
|
50
|
-
|
45
|
+
[version, version.split('.').take(2).push('0').join('.')]
|
46
|
+
end.reverse.to_h
|
51
47
|
end
|
52
48
|
|
53
49
|
def default_ruby_version
|
@@ -71,7 +67,7 @@ module PDK
|
|
71
67
|
end
|
72
68
|
|
73
69
|
def latest_ruby_version
|
74
|
-
versions.keys.
|
70
|
+
versions.keys.min { |a, b| Gem::Version.new(b) <=> Gem::Version.new(a) }
|
75
71
|
end
|
76
72
|
|
77
73
|
def versions
|
@@ -111,7 +107,7 @@ module PDK
|
|
111
107
|
[
|
112
108
|
File.join(PDK::Util.pdk_package_basedir, 'private', 'ruby', ruby_version, 'lib', 'ruby', 'gems', versions[ruby_version]),
|
113
109
|
File.join(PDK::Util.package_cachedir, 'ruby', versions[ruby_version]),
|
114
|
-
File.join(PDK::Util.pdk_package_basedir, 'private', 'puppet', 'ruby', versions[ruby_version])
|
110
|
+
File.join(PDK::Util.pdk_package_basedir, 'private', 'puppet', 'ruby', versions[ruby_version])
|
115
111
|
]
|
116
112
|
else
|
117
113
|
# This allows the subprocess to find the 'bundler' gem, which isn't
|
@@ -155,7 +151,7 @@ module PDK
|
|
155
151
|
puppet_specs << spec if spec.name == 'puppet'
|
156
152
|
end
|
157
153
|
|
158
|
-
@available_puppet_versions = puppet_specs.map(&:version).sort
|
154
|
+
@available_puppet_versions = puppet_specs.map(&:version).sort.reverse
|
159
155
|
end
|
160
156
|
|
161
157
|
private
|
@@ -3,7 +3,7 @@ require 'pdk'
|
|
3
3
|
module PDK
|
4
4
|
module Util
|
5
5
|
class TemplateURI
|
6
|
-
SCP_PATTERN = %r{\A(?!\w+://)(?:(?<user>.+?)@)?(?<host>[^:/]+):(?<path>.+)\z}
|
6
|
+
SCP_PATTERN = %r{\A(?!\w+://)(?:(?<user>.+?)@)?(?<host>[^:/]+):(?<path>.+)\z}.freeze
|
7
7
|
|
8
8
|
PACKAGED_TEMPLATE_KEYWORD = 'pdk-default'.freeze
|
9
9
|
DEPRECATED_TEMPLATE_URL = 'https://github.com/puppetlabs/pdk-module-template'.freeze
|
@@ -11,8 +11,8 @@ module PDK
|
|
11
11
|
|
12
12
|
LEGACY_PACKAGED_TEMPLATE_PATHS = {
|
13
13
|
'windows' => 'file:///C:/Program Files/Puppet Labs/DevelopmentKit/share/cache/pdk-templates.git',
|
14
|
-
'macos'
|
15
|
-
'linux'
|
14
|
+
'macos' => 'file:///opt/puppetlabs/pdk/share/cache/pdk-templates.git',
|
15
|
+
'linux' => 'file:///opt/puppetlabs/pdk/share/cache/pdk-templates.git'
|
16
16
|
}.freeze
|
17
17
|
|
18
18
|
# XXX Previously
|
@@ -37,9 +37,10 @@ module PDK
|
|
37
37
|
def initialize(opts_or_uri)
|
38
38
|
require 'addressable'
|
39
39
|
# If a uri string is passed, skip the valid uri finding code.
|
40
|
-
@uri =
|
40
|
+
@uri = case opts_or_uri
|
41
|
+
when self.class
|
41
42
|
opts_or_uri.uri
|
42
|
-
|
43
|
+
when String
|
43
44
|
begin
|
44
45
|
uri, ref = opts_or_uri.split('#', 2)
|
45
46
|
if PDK::Util::TemplateURI.packaged_template?(uri)
|
@@ -48,9 +49,9 @@ module PDK
|
|
48
49
|
Addressable::URI.parse(opts_or_uri)
|
49
50
|
end
|
50
51
|
rescue Addressable::URI::InvalidURIError
|
51
|
-
raise PDK::CLI::FatalError,
|
52
|
+
raise PDK::CLI::FatalError, "PDK::Util::TemplateURI attempted initialization with a non-uri string: #{opts_or_uri}"
|
52
53
|
end
|
53
|
-
|
54
|
+
when Addressable::URI
|
54
55
|
opts_or_uri.dup
|
55
56
|
else
|
56
57
|
PDK::Util::TemplateURI.first_valid_uri(PDK::Util::TemplateURI.templates(opts_or_uri))
|
@@ -110,7 +111,7 @@ module PDK
|
|
110
111
|
require 'addressable'
|
111
112
|
|
112
113
|
if uri.is_a?(Addressable::URI) && uri.fragment
|
113
|
-
human_readable(uri.to_s.chomp(
|
114
|
+
human_readable(uri.to_s.chomp("##{uri.fragment}"))
|
114
115
|
else
|
115
116
|
human_readable(uri.to_s)
|
116
117
|
end
|
@@ -149,7 +150,7 @@ module PDK
|
|
149
150
|
#
|
150
151
|
# @returns String
|
151
152
|
def self.uri_safe(string)
|
152
|
-
url =
|
153
|
+
url = Gem.win_platform? && string =~ /^[a-zA-Z][|:]/ ? "/#{string}" : string
|
153
154
|
parse_scp_url(url)
|
154
155
|
end
|
155
156
|
|
@@ -159,7 +160,7 @@ module PDK
|
|
159
160
|
#
|
160
161
|
# @returns String
|
161
162
|
def self.human_readable(string)
|
162
|
-
|
163
|
+
Gem.win_platform? && string =~ %r{^/[a-zA-Z][|:]} ? string[1..] : string
|
163
164
|
end
|
164
165
|
|
165
166
|
def self.parse_scp_url(url)
|
@@ -178,10 +179,7 @@ module PDK
|
|
178
179
|
return url unless Pathname.new(url).relative? && scp_url
|
179
180
|
|
180
181
|
uri = Addressable::URI.new(scheme: 'ssh', user: scp_url[:user], host: scp_url[:host], path: scp_url[:path])
|
181
|
-
PDK.logger.warn '%{scp_uri} appears to be an SCP style URL; it will be converted to an RFC compliant URI: %{rfc_uri}'
|
182
|
-
scp_uri: url,
|
183
|
-
rfc_uri: uri.to_s,
|
184
|
-
}
|
182
|
+
PDK.logger.warn format('%{scp_uri} appears to be an SCP style URL; it will be converted to an RFC compliant URI: %{rfc_uri}', scp_uri: url, rfc_uri: uri.to_s)
|
185
183
|
|
186
184
|
uri.to_s
|
187
185
|
end
|
@@ -208,22 +206,14 @@ module PDK
|
|
208
206
|
else
|
209
207
|
explicit_uri = nil
|
210
208
|
end
|
211
|
-
metadata_uri = if PDK::Util.module_root && PDK::Util::Filesystem.file?(File.join(PDK::Util.module_root, 'metadata.json'))
|
212
|
-
|
213
|
-
new(uri_safe(PDK::Util.module_metadata['template-url'])).uri
|
214
|
-
else
|
215
|
-
nil
|
216
|
-
end
|
217
|
-
else
|
218
|
-
nil
|
209
|
+
metadata_uri = if PDK::Util.module_root && PDK::Util::Filesystem.file?(File.join(PDK::Util.module_root, 'metadata.json')) && PDK::Util.module_metadata['template-url']
|
210
|
+
new(uri_safe(PDK::Util.module_metadata['template-url'])).uri
|
219
211
|
end
|
220
212
|
default_template_url = PDK.config.get_within_scopes('module_defaults.template-url')
|
221
213
|
answers_uri = if [PACKAGED_TEMPLATE_KEYWORD, DEPRECATED_TEMPLATE_URL].include?(default_template_url)
|
222
214
|
Addressable::URI.parse(default_template_uri)
|
223
215
|
elsif default_template_url
|
224
216
|
new(uri_safe(default_template_url)).uri
|
225
|
-
else
|
226
|
-
nil
|
227
217
|
end
|
228
218
|
default_uri = default_template_uri.uri
|
229
219
|
default_uri.fragment = default_template_ref(default_template_uri)
|
@@ -257,6 +247,7 @@ module PDK
|
|
257
247
|
found_template = templates_array.find { |t| valid_template?(t) }
|
258
248
|
|
259
249
|
raise PDK::CLI::FatalError, 'Unable to find a valid module template to use.' if found_template.nil?
|
250
|
+
|
260
251
|
found_template[:uri]
|
261
252
|
end
|
262
253
|
|
@@ -267,6 +258,7 @@ module PDK
|
|
267
258
|
return false if template[:uri].nil? || !template[:uri].is_a?(Addressable::URI)
|
268
259
|
|
269
260
|
return true if PDK::Util::Git.repo?(bare_uri(template[:uri]))
|
261
|
+
|
270
262
|
path = human_readable(template[:uri].path)
|
271
263
|
if PDK::Util::Filesystem.directory?(path)
|
272
264
|
# We know that it's not a git repository, but it's a valid path on disk
|
@@ -278,11 +270,7 @@ module PDK
|
|
278
270
|
end
|
279
271
|
end
|
280
272
|
|
281
|
-
unless template[:allow_fallback]
|
282
|
-
raise PDK::CLI::FatalError, 'Unable to find a valid template at %{uri}' % {
|
283
|
-
uri: template[:uri].to_s,
|
284
|
-
}
|
285
|
-
end
|
273
|
+
raise PDK::CLI::FatalError, format('Unable to find a valid template at %{uri}', uri: template[:uri].to_s) unless template[:allow_fallback]
|
286
274
|
|
287
275
|
false
|
288
276
|
end
|
@@ -5,8 +5,7 @@ module PDK
|
|
5
5
|
class VendoredFile
|
6
6
|
class DownloadError < StandardError; end
|
7
7
|
|
8
|
-
attr_reader :file_name
|
9
|
-
attr_reader :url
|
8
|
+
attr_reader :file_name, :url
|
10
9
|
|
11
10
|
def initialize(file_name, url)
|
12
11
|
@file_name = file_name
|
@@ -44,13 +43,10 @@ module PDK
|
|
44
43
|
Net::HTTPBadResponse,
|
45
44
|
Net::HTTPHeaderSyntaxError,
|
46
45
|
Net::ProtocolError,
|
47
|
-
Timeout::Error
|
46
|
+
Timeout::Error
|
48
47
|
]
|
49
48
|
|
50
|
-
PDK.logger.debug '%{file_name} was not found in the cache, downloading it from %{url}.'
|
51
|
-
file_name: file_name,
|
52
|
-
url: url,
|
53
|
-
}
|
49
|
+
PDK.logger.debug format('%{file_name} was not found in the cache, downloading it from %{url}.', file_name: file_name, url: url)
|
54
50
|
|
55
51
|
uri = URI.parse(url)
|
56
52
|
http = Net::HTTP.new(uri.host, uri.port)
|
@@ -60,20 +56,11 @@ module PDK
|
|
60
56
|
request = Net::HTTP::Get.new(uri.request_uri)
|
61
57
|
response = http.request(request)
|
62
58
|
|
63
|
-
unless response.code == '200'
|
64
|
-
raise DownloadError, 'Unable to download %{url}. %{code}: %{message}.' % {
|
65
|
-
url: url,
|
66
|
-
code: response.code,
|
67
|
-
message: response.message,
|
68
|
-
}
|
69
|
-
end
|
59
|
+
raise DownloadError, format('Unable to download %{url}. %{code}: %{message}.', url: url, code: response.code, message: response.message) unless response.code == '200'
|
70
60
|
|
71
61
|
response.body
|
72
62
|
rescue *http_errors => e
|
73
|
-
raise DownloadError, 'Unable to download %{url}. Check internet connectivity and try again. %{error}'
|
74
|
-
url: url,
|
75
|
-
error: e,
|
76
|
-
}
|
63
|
+
raise DownloadError, format('Unable to download %{url}. Check internet connectivity and try again. %{error}', url: url, error: e)
|
77
64
|
end
|
78
65
|
|
79
66
|
def package_vendored_path
|