pdk 1.9.0 → 3.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (163) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +744 -711
  3. data/README.md +23 -21
  4. data/lib/pdk/answer_file.rb +3 -112
  5. data/lib/pdk/bolt.rb +20 -0
  6. data/lib/pdk/cli/build.rb +51 -54
  7. data/lib/pdk/cli/bundle.rb +33 -29
  8. data/lib/pdk/cli/console.rb +148 -0
  9. data/lib/pdk/cli/convert.rb +46 -37
  10. data/lib/pdk/cli/env.rb +51 -0
  11. data/lib/pdk/cli/errors.rb +4 -3
  12. data/lib/pdk/cli/exec/command.rb +285 -0
  13. data/lib/pdk/cli/exec/interactive_command.rb +109 -0
  14. data/lib/pdk/cli/exec.rb +32 -201
  15. data/lib/pdk/cli/exec_group.rb +79 -43
  16. data/lib/pdk/cli/get/config.rb +26 -0
  17. data/lib/pdk/cli/get.rb +22 -0
  18. data/lib/pdk/cli/new/class.rb +20 -22
  19. data/lib/pdk/cli/new/defined_type.rb +21 -21
  20. data/lib/pdk/cli/new/fact.rb +27 -0
  21. data/lib/pdk/cli/new/function.rb +27 -0
  22. data/lib/pdk/cli/new/module.rb +40 -29
  23. data/lib/pdk/cli/new/provider.rb +18 -18
  24. data/lib/pdk/cli/new/task.rb +23 -22
  25. data/lib/pdk/cli/new/test.rb +52 -0
  26. data/lib/pdk/cli/new/transport.rb +27 -0
  27. data/lib/pdk/cli/new.rb +15 -9
  28. data/lib/pdk/cli/release/prep.rb +39 -0
  29. data/lib/pdk/cli/release/publish.rb +46 -0
  30. data/lib/pdk/cli/release.rb +185 -0
  31. data/lib/pdk/cli/remove/config.rb +83 -0
  32. data/lib/pdk/cli/remove.rb +22 -0
  33. data/lib/pdk/cli/set/config.rb +121 -0
  34. data/lib/pdk/cli/set.rb +22 -0
  35. data/lib/pdk/cli/test/unit.rb +71 -69
  36. data/lib/pdk/cli/test.rb +9 -8
  37. data/lib/pdk/cli/update.rb +38 -21
  38. data/lib/pdk/cli/util/command_redirector.rb +13 -3
  39. data/lib/pdk/cli/util/interview.rb +25 -9
  40. data/lib/pdk/cli/util/option_normalizer.rb +6 -6
  41. data/lib/pdk/cli/util/option_validator.rb +19 -9
  42. data/lib/pdk/cli/util/spinner.rb +13 -0
  43. data/lib/pdk/cli/util/update_manager_printer.rb +82 -0
  44. data/lib/pdk/cli/util.rb +105 -48
  45. data/lib/pdk/cli/validate.rb +96 -111
  46. data/lib/pdk/cli.rb +134 -87
  47. data/lib/pdk/config/errors.rb +5 -0
  48. data/lib/pdk/config/ini_file.rb +184 -0
  49. data/lib/pdk/config/ini_file_setting.rb +35 -0
  50. data/lib/pdk/config/json.rb +35 -0
  51. data/lib/pdk/config/json_schema_namespace.rb +137 -0
  52. data/lib/pdk/config/json_schema_setting.rb +51 -0
  53. data/lib/pdk/config/json_with_schema.rb +47 -0
  54. data/lib/pdk/config/namespace.rb +362 -0
  55. data/lib/pdk/config/setting.rb +134 -0
  56. data/lib/pdk/config/task_schema.json +116 -0
  57. data/lib/pdk/config/validator.rb +31 -0
  58. data/lib/pdk/config/yaml.rb +41 -0
  59. data/lib/pdk/config/yaml_with_schema.rb +51 -0
  60. data/lib/pdk/config.rb +304 -0
  61. data/lib/pdk/context/control_repo.rb +61 -0
  62. data/lib/pdk/context/module.rb +28 -0
  63. data/lib/pdk/context/none.rb +22 -0
  64. data/lib/pdk/context.rb +98 -0
  65. data/lib/pdk/control_repo.rb +89 -0
  66. data/lib/pdk/generate/defined_type.rb +27 -33
  67. data/lib/pdk/generate/fact.rb +26 -0
  68. data/lib/pdk/generate/function.rb +49 -0
  69. data/lib/pdk/generate/module.rb +160 -153
  70. data/lib/pdk/generate/provider.rb +16 -69
  71. data/lib/pdk/generate/puppet_class.rb +27 -32
  72. data/lib/pdk/generate/puppet_object.rb +100 -159
  73. data/lib/pdk/generate/task.rb +34 -51
  74. data/lib/pdk/generate/transport.rb +34 -0
  75. data/lib/pdk/generate.rb +21 -8
  76. data/lib/pdk/logger.rb +24 -6
  77. data/lib/pdk/module/build.rb +125 -37
  78. data/lib/pdk/module/convert.rb +146 -65
  79. data/lib/pdk/module/metadata.rb +72 -71
  80. data/lib/pdk/module/release.rb +255 -0
  81. data/lib/pdk/module/update.rb +48 -37
  82. data/lib/pdk/module/update_manager.rb +75 -39
  83. data/lib/pdk/module.rb +10 -2
  84. data/lib/pdk/monkey_patches.rb +268 -0
  85. data/lib/pdk/report/event.rb +36 -48
  86. data/lib/pdk/report.rb +35 -22
  87. data/lib/pdk/template/fetcher/git.rb +84 -0
  88. data/lib/pdk/template/fetcher/local.rb +29 -0
  89. data/lib/pdk/template/fetcher.rb +100 -0
  90. data/lib/pdk/template/renderer/v1/legacy_template_dir.rb +108 -0
  91. data/lib/pdk/template/renderer/v1/renderer.rb +131 -0
  92. data/lib/pdk/template/renderer/v1/template_file.rb +100 -0
  93. data/lib/pdk/template/renderer/v1.rb +25 -0
  94. data/lib/pdk/template/renderer.rb +97 -0
  95. data/lib/pdk/template/template_dir.rb +67 -0
  96. data/lib/pdk/template.rb +52 -0
  97. data/lib/pdk/tests/unit.rb +101 -51
  98. data/lib/pdk/util/bundler.rb +44 -42
  99. data/lib/pdk/util/changelog_generator.rb +138 -0
  100. data/lib/pdk/util/env.rb +48 -0
  101. data/lib/pdk/util/filesystem.rb +139 -2
  102. data/lib/pdk/util/git.rb +108 -8
  103. data/lib/pdk/util/json_finder.rb +86 -0
  104. data/lib/pdk/util/puppet_strings.rb +125 -0
  105. data/lib/pdk/util/puppet_version.rb +71 -87
  106. data/lib/pdk/util/ruby_version.rb +49 -25
  107. data/lib/pdk/util/template_uri.rb +283 -0
  108. data/lib/pdk/util/vendored_file.rb +34 -42
  109. data/lib/pdk/util/version.rb +11 -10
  110. data/lib/pdk/util/windows/api_types.rb +74 -44
  111. data/lib/pdk/util/windows/file.rb +31 -27
  112. data/lib/pdk/util/windows/process.rb +74 -0
  113. data/lib/pdk/util/windows/string.rb +19 -12
  114. data/lib/pdk/util/windows.rb +2 -0
  115. data/lib/pdk/util.rb +111 -124
  116. data/lib/pdk/validate/control_repo/control_repo_validator_group.rb +23 -0
  117. data/lib/pdk/validate/control_repo/environment_conf_validator.rb +98 -0
  118. data/lib/pdk/validate/external_command_validator.rb +213 -0
  119. data/lib/pdk/validate/internal_ruby_validator.rb +101 -0
  120. data/lib/pdk/validate/invokable_validator.rb +238 -0
  121. data/lib/pdk/validate/metadata/metadata_json_lint_validator.rb +84 -0
  122. data/lib/pdk/validate/metadata/metadata_syntax_validator.rb +76 -0
  123. data/lib/pdk/validate/metadata/metadata_validator_group.rb +20 -0
  124. data/lib/pdk/validate/puppet/puppet_epp_validator.rb +131 -0
  125. data/lib/pdk/validate/puppet/puppet_lint_validator.rb +66 -0
  126. data/lib/pdk/validate/puppet/puppet_plan_syntax_validator.rb +38 -0
  127. data/lib/pdk/validate/puppet/puppet_syntax_validator.rb +135 -0
  128. data/lib/pdk/validate/puppet/puppet_validator_group.rb +22 -0
  129. data/lib/pdk/validate/ruby/ruby_rubocop_validator.rb +79 -0
  130. data/lib/pdk/validate/ruby/ruby_validator_group.rb +19 -0
  131. data/lib/pdk/validate/tasks/tasks_metadata_lint_validator.rb +83 -0
  132. data/lib/pdk/validate/tasks/tasks_name_validator.rb +45 -0
  133. data/lib/pdk/validate/tasks/tasks_validator_group.rb +20 -0
  134. data/lib/pdk/validate/validator.rb +120 -0
  135. data/lib/pdk/validate/validator_group.rb +107 -0
  136. data/lib/pdk/validate/yaml/yaml_syntax_validator.rb +86 -0
  137. data/lib/pdk/validate/yaml/yaml_validator_group.rb +19 -0
  138. data/lib/pdk/validate.rb +86 -12
  139. data/lib/pdk/version.rb +2 -2
  140. data/lib/pdk.rb +60 -10
  141. metadata +138 -100
  142. data/lib/pdk/cli/module/build.rb +0 -14
  143. data/lib/pdk/cli/module/generate.rb +0 -45
  144. data/lib/pdk/cli/module.rb +0 -14
  145. data/lib/pdk/i18n.rb +0 -4
  146. data/lib/pdk/module/templatedir.rb +0 -321
  147. data/lib/pdk/template_file.rb +0 -95
  148. data/lib/pdk/validate/base_validator.rb +0 -215
  149. data/lib/pdk/validate/metadata/metadata_json_lint.rb +0 -86
  150. data/lib/pdk/validate/metadata/metadata_syntax.rb +0 -109
  151. data/lib/pdk/validate/metadata_validator.rb +0 -30
  152. data/lib/pdk/validate/puppet/puppet_lint.rb +0 -67
  153. data/lib/pdk/validate/puppet/puppet_syntax.rb +0 -112
  154. data/lib/pdk/validate/puppet_validator.rb +0 -30
  155. data/lib/pdk/validate/ruby/rubocop.rb +0 -77
  156. data/lib/pdk/validate/ruby_validator.rb +0 -29
  157. data/lib/pdk/validate/tasks/metadata_lint.rb +0 -126
  158. data/lib/pdk/validate/tasks/name.rb +0 -88
  159. data/lib/pdk/validate/tasks_validator.rb +0 -33
  160. data/lib/pdk/validate/yaml/syntax.rb +0 -109
  161. data/lib/pdk/validate/yaml_validator.rb +0 -31
  162. data/locales/config.yaml +0 -21
  163. data/locales/pdk.pot +0 -1291
@@ -1,5 +1,6 @@
1
- require 'pdk/util'
2
- require 'pdk/util/git'
1
+ require 'pdk'
2
+ require 'json'
3
+ require 'forwardable'
3
4
 
4
5
  module PDK
5
6
  module Util
@@ -18,45 +19,55 @@ module PDK
18
19
 
19
20
  PE_VERSIONS_URL = 'https://forgeapi.puppet.com/private/versions/pe'.freeze
20
21
  DEFAULT_PUPPET_DEV_URL = 'https://github.com/puppetlabs/puppet'.freeze
21
- DEFAULT_PUPPET_DEV_BRANCH = 'master'.freeze
22
+ DEFAULT_PUPPET_DEV_BRANCH = 'main'.freeze
22
23
 
23
24
  def puppet_dev_env
25
+ require 'pdk/util/ruby_version'
26
+
24
27
  {
25
- gem_version: 'file://%{path}' % { path: puppet_dev_path },
26
- 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
27
30
  }
28
31
  end
29
32
 
30
33
  def puppet_dev_path
34
+ require 'pdk/util'
35
+
31
36
  File.join(PDK::Util.cachedir, 'src', 'puppet')
32
37
  end
33
38
 
34
39
  def latest_available
35
40
  latest = find_gem(Gem::Requirement.create('>= 0'))
36
41
 
37
- if latest.nil?
38
- raise ArgumentError, _('Unable to find a Puppet gem in current Ruby environment or from Rubygems.org.')
39
- end
42
+ raise ArgumentError, 'Unable to find a Puppet gem in current Ruby environment or from Rubygems.org.' if latest.nil?
40
43
 
41
44
  latest
42
45
  end
43
46
 
44
- def fetch_puppet_dev
47
+ def puppet_dev_fetched?
48
+ !@puppet_dev_fetched.nil?
49
+ end
50
+
51
+ def fetch_puppet_dev(options = {})
52
+ return if options[:run] == :once && puppet_dev_fetched?
53
+
54
+ require 'pdk/util/git'
55
+
45
56
  # Check if the source is cloned and is a readable git repo
46
57
  unless PDK::Util::Git.remote_repo? puppet_dev_path
47
58
  # Check if the path has something in it already. Delete it and prepare for clone if so.
48
- if File.exist? puppet_dev_path
49
- File.delete(puppet_dev_path) if File.file? puppet_dev_path
50
- FileUtils.rm_rf(puppet_dev_path) if File.directory? puppet_dev_path
59
+ if PDK::Util::Filesystem.exist? puppet_dev_path
60
+ PDK::Util::Filesystem.delete(puppet_dev_path) if PDK::Util::Filesystem.file? puppet_dev_path
61
+ PDK::Util::Filesystem.rm_rf(puppet_dev_path) if PDK::Util::Filesystem.directory? puppet_dev_path
51
62
  end
52
63
 
53
- FileUtils.mkdir_p puppet_dev_path
64
+ PDK::Util::Filesystem.mkdir_p puppet_dev_path
54
65
  clone_result = PDK::Util::Git.git('clone', DEFAULT_PUPPET_DEV_URL, puppet_dev_path)
55
66
  return if clone_result[:exit_code].zero?
56
67
 
57
68
  PDK.logger.error clone_result[:stdout]
58
69
  PDK.logger.error clone_result[:stderr]
59
- raise PDK::CLI::FatalError, _("Unable to clone git repository at '%{repo}'.") % { repo: DEFAULT_PUPPET_DEV_URL }
70
+ raise PDK::CLI::FatalError, format("Unable to clone git repository from '%{repo}'.", repo: DEFAULT_PUPPET_DEV_URL)
60
71
  end
61
72
 
62
73
  # Fetch Updates from remote repository
@@ -65,16 +76,18 @@ module PDK
65
76
  unless fetch_result[:exit_code].zero?
66
77
  PDK.logger.error fetch_result[:stdout]
67
78
  PDK.logger.error fetch_result[:stderr]
68
- raise PDK::CLI::FatalError, _("Unable to fetch from git remote at '%{repo}'.") % { repo: DEFAULT_PUPPET_DEV_URL }
79
+ raise PDK::CLI::FatalError, format("Unable to fetch from git remote at '%{repo}'.", repo: DEFAULT_PUPPET_DEV_URL)
69
80
  end
70
81
 
71
82
  # Reset local repo to latest
72
- reset_result = PDK::Util::Git.git('-C', puppet_dev_path, 'reset', '--hard', 'origin/master')
83
+ reset_result = PDK::Util::Git.git('-C', puppet_dev_path, 'reset', '--hard', "origin/#{DEFAULT_PUPPET_DEV_BRANCH}")
84
+
85
+ @puppet_dev_fetched = true
73
86
  return if reset_result[:exit_code].zero?
74
87
 
75
88
  PDK.logger.error reset_result[:stdout]
76
89
  PDK.logger.error reset_result[:stderr]
77
- raise PDK::CLI::FatalError, _("Unable to update git repository at '%{cachedir}'.") % { repo: puppet_dev_path }
90
+ raise PDK::CLI::FatalError, format("Unable to update git repository at '%{cachedir}'.", cachedir: puppet_dev_path)
78
91
  end
79
92
 
80
93
  def find_gem_for(version_str)
@@ -91,21 +104,14 @@ module PDK
91
104
  requirement_string = version.approximate_recommendation
92
105
  requirement_string += '.0' unless version.segments.length == 1
93
106
  latest_requirement = Gem::Requirement.create(requirement_string)
94
-
95
107
  latest_available_gem = find_gem(latest_requirement)
96
108
 
97
- if latest_available_gem.nil?
98
- raise ArgumentError, _('Unable to find a Puppet gem matching %{requirement}.') % {
99
- requirement: latest_requirement,
100
- }
101
- end
109
+ raise ArgumentError, format('Unable to find a Puppet gem matching %{requirement}.', requirement: latest_requirement) if latest_available_gem.nil?
102
110
 
103
111
  # Only issue this warning if they requested an exact version that isn't available.
104
112
  if version.segments.length == 3
105
- PDK.logger.warn(_('Puppet %{requested_version} is not available, activating %{found_version} instead.') % {
106
- requested_version: version_str,
107
- found_version: latest_available_gem[:gem_version].version,
108
- })
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))
109
115
  end
110
116
 
111
117
  latest_available_gem
@@ -114,31 +120,33 @@ module PDK
114
120
  def from_pe_version(version_str)
115
121
  version = parse_specified_version(version_str)
116
122
 
117
- gem_version = pe_version_map.find do |version_map|
118
- version_map[:requirement].satisfied_by?(version)
119
- end
123
+ # Due to the issue with concurrent ruby in older puppet gems
124
+ # we are locking the pe to puppet version mapping to the latest
125
+ # puppet version that is compatible with the pe version.
126
+ safe_versions = {
127
+ 2023 => '7.23.0',
128
+ 2021 => '7.23.0',
129
+ 2019 => '6.29.0'
130
+ }
120
131
 
121
- if gem_version.nil?
122
- raise ArgumentError, _('Unable to map Puppet Enterprise version %{pe_version} to a Puppet version.') % {
123
- pe_version: version_str,
124
- }
125
- end
132
+ gem_version = safe_versions[version.segments[0]]
133
+ raise ArgumentError, format('Unable to map Puppet Enterprise version %{pe_version} to a Puppet version.', pe_version: version_str) if gem_version.nil?
126
134
 
127
- PDK.logger.info _('Puppet Enterprise %{pe_version} maps to Puppet %{puppet_version}.') % {
128
- pe_version: version_str,
129
- puppet_version: gem_version[:gem_version],
130
- }
135
+ PDK.logger.info format('Puppet Enterprise %{pe_version} maps to Puppet %{puppet_version}.', pe_version: version_str, puppet_version: gem_version)
131
136
 
132
- find_gem_for(gem_version[:gem_version])
137
+ find_gem_for(gem_version)
133
138
  end
134
139
 
135
140
  def from_module_metadata(metadata = nil)
141
+ require 'pdk/module/metadata'
142
+ require 'pdk/util'
143
+
136
144
  if metadata.nil?
137
145
  metadata_file = PDK::Util.find_upwards('metadata.json')
138
146
 
139
147
  unless metadata_file
140
- PDK.logger.warn _('Unable to determine Puppet version for module: no metadata.json present in module.')
141
- return nil
148
+ PDK.logger.warn 'Unable to determine Puppet version for module: no metadata.json present in module.'
149
+ return
142
150
  end
143
151
 
144
152
  metadata = PDK::Module::Metadata.from_file(metadata_file)
@@ -149,7 +157,7 @@ module PDK
149
157
 
150
158
  # Split combined requirements like ">= 4.7.0 < 6.0.0" into their
151
159
  # component requirements [">= 4.7.0", "< 6.0.0"]
152
- pattern = %r{#{Gem::Requirement::PATTERN_RAW}}
160
+ pattern = /#{Gem::Requirement::PATTERN_RAW}/o
153
161
  requirement_strings = metadata_requirement['version_requirement'].scan(pattern).map do |req|
154
162
  req.compact.join(' ')
155
163
  end
@@ -163,59 +171,27 @@ module PDK
163
171
  def parse_specified_version(version_str)
164
172
  Gem::Version.new(version_str)
165
173
  rescue ArgumentError
166
- raise ArgumentError, _('%{version} is not a valid version number.') % {
167
- version: version_str,
168
- }
169
- end
170
-
171
- def pe_version_map
172
- @pe_version_map ||= fetch_pe_version_map.map { |version_map|
173
- maps = version_map['versions'].map do |pe_release|
174
- requirements = ["= #{pe_release['version']}"]
175
-
176
- # Some PE release have a .0 Z release, which causes problems when
177
- # the user specifies "X.Y" expecting to get the latest Z and
178
- # instead getting the oldest.
179
- requirements << "!= #{pe_release['version'].gsub(%r{\.\d+\Z}, '')}" if pe_release['version'].end_with?('.0')
180
- {
181
- requirement: Gem::Requirement.create(requirements),
182
- gem_version: pe_release['puppet'],
183
- }
184
- end
185
-
186
- maps << {
187
- requirement: requirement_from_forge_range(version_map['release']),
188
- gem_version: version_map['versions'].find { |r| r['version'] == version_map['latest'] }['puppet'],
189
- }
190
- }.flatten
191
- end
192
-
193
- def fetch_pe_version_map
194
- map = PDK::Util::VendoredFile.new('pe_versions.json', PE_VERSIONS_URL).read
195
-
196
- JSON.parse(map)
197
- rescue PDK::Util::VendoredFile::DownloadError => e
198
- raise PDK::CLI::FatalError, e.message
199
- rescue JSON::ParserError
200
- 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)
201
175
  end
202
176
 
203
177
  def requirement_from_forge_range(range_str)
204
- Gem::Requirement.create("~> #{range_str.gsub(%r{\.x\Z}, '.0')}")
178
+ Gem::Requirement.create("~> #{range_str.gsub(/\.x\Z/, '.0')}")
205
179
  end
206
180
 
207
181
  def rubygems_puppet_versions
208
- return @rubygems_puppet_versions unless @rubygems_puppet_versions.nil?
209
-
210
- fetcher = Gem::SpecFetcher.fetcher
211
- puppet_tuples = fetcher.detect(:released) do |spec_tuple|
212
- spec_tuple.name == 'puppet' && Gem::Platform.match(spec_tuple.platform)
182
+ @rubygems_puppet_versions ||= begin
183
+ fetcher = Gem::SpecFetcher.fetcher
184
+ puppet_tuples = fetcher.detect(:released) do |spec_tuple|
185
+ spec_tuple.name == 'puppet' && Gem::Platform.match(spec_tuple.platform)
186
+ end
187
+ puppet_versions = puppet_tuples.map { |name, _| name.version }.uniq
188
+ puppet_versions.sort.reverse
213
189
  end
214
- puppet_versions = puppet_tuples.map { |name, _| name.version }.uniq
215
- @rubygems_puppet_versions = puppet_versions.sort { |a, b| b <=> a }
216
190
  end
217
191
 
218
192
  def find_gem(requirement)
193
+ require 'pdk/util'
194
+
219
195
  if PDK::Util.package_install?
220
196
  find_in_package_cache(requirement)
221
197
  else
@@ -224,12 +200,20 @@ module PDK
224
200
  end
225
201
 
226
202
  def find_in_rubygems(requirement)
203
+ require 'pdk/util/ruby_version'
204
+
227
205
  version = rubygems_puppet_versions.find { |r| requirement.satisfied_by?(r) }
228
206
  version.nil? ? nil : { gem_version: version, ruby_version: PDK::Util::RubyVersion.default_ruby_version }
229
207
  end
230
208
 
209
+ # Finds the specified requirement in the package cache.
210
+ #
211
+ # @param requirement [Gem::Requirement] The requirement to search for.
212
+ # @return [Hash] A hash containing the gem version and ruby version if found, or nil if not found.
231
213
  def find_in_package_cache(requirement)
232
- PDK::Util::RubyVersion.versions.each do |ruby_version, _|
214
+ require 'pdk/util/ruby_version'
215
+
216
+ PDK::Util::RubyVersion.versions.each_key do |ruby_version|
233
217
  PDK::Util::RubyVersion.use(ruby_version)
234
218
  version = PDK::Util::RubyVersion.available_puppet_versions.find { |r| requirement.satisfied_by?(r) }
235
219
  return { gem_version: version, ruby_version: ruby_version } unless version.nil?
@@ -1,4 +1,5 @@
1
- require 'pdk/util'
1
+ require 'pdk'
2
+ require 'forwardable'
2
3
 
3
4
  module PDK
4
5
  module Util
@@ -8,6 +9,8 @@ module PDK
8
9
 
9
10
  def_delegators :instance, :gem_path, :gem_paths_raw, :gem_home, :available_puppet_versions, :bin_path
10
11
 
12
+ # TODO: resolve this
13
+ # rubocop:disable Lint/DuplicateMethods
11
14
  attr_reader :instance
12
15
 
13
16
  def instance(version = nil)
@@ -21,43 +24,55 @@ module PDK
21
24
  end
22
25
  @instance[active_ruby_version]
23
26
  end
27
+ # rubocop:enable Lint/DuplicateMethods
24
28
 
25
29
  def active_ruby_version
26
30
  @active_ruby_version || default_ruby_version
27
31
  end
28
32
 
29
33
  def use(version)
30
- if versions.key?(version)
31
- @active_ruby_version = version
32
- else
33
- raise ArgumentError, _('Unknown Ruby version "%{ruby_version}"') % {
34
- ruby_version: version,
35
- }
36
- end
34
+ raise ArgumentError, format('Unknown Ruby version "%{ruby_version}"', ruby_version: version) unless versions.key?(version)
35
+
36
+ @active_ruby_version = version
37
37
  end
38
38
 
39
39
  def scan_for_packaged_rubies
40
+ require 'pdk/util'
41
+
40
42
  ruby_basedir = File.join(PDK::Util.pdk_package_basedir, 'private', 'ruby', '*')
41
- Dir[ruby_basedir].sort.map { |ruby_dir|
43
+ PDK::Util::Filesystem.glob(ruby_basedir).sort.map do |ruby_dir|
42
44
  version = File.basename(ruby_dir)
43
- [version, version.split('.').take(2).concat(['0']).join('.')]
44
- }.reverse.to_h
45
+ [version, version.split('.').take(2).push('0').join('.')]
46
+ end.reverse.to_h
45
47
  end
46
48
 
47
49
  def default_ruby_version
48
- # For now, the packaged versions will be using default of 2.4.5
49
- # FIXME: make this dynamic
50
- return '2.4.5' if PDK::Util.package_install?
51
-
52
- # TODO: may not be a safe assumption that highest available version should be default
53
- latest_ruby_version
50
+ require 'pdk/util'
51
+ require 'pdk/util/puppet_version'
52
+
53
+ @default_ruby_version ||= if PDK::Util.package_install?
54
+ # Default to the ruby that supports the latest puppet gem. If you wish to default to a
55
+ # specific Puppet Gem version use the following example;
56
+ #
57
+ # PDK::Util::PuppetVersion.find_gem_for('5.5.10')[:ruby_version]
58
+ #
59
+ # For using the latest puppet gem:
60
+ PDK::Util::PuppetVersion.latest_available[:ruby_version]
61
+ else
62
+ # TODO: may not be a safe assumption that highest available version should be default
63
+ # WARNING Do NOT use PDK::Util::PuppetVersion.*** methods as it can recurse into this
64
+ # method and cause Stack Level Too Deep errors.
65
+ latest_ruby_version
66
+ end
54
67
  end
55
68
 
56
69
  def latest_ruby_version
57
- versions.keys.sort { |a, b| Gem::Version.new(b) <=> Gem::Version.new(a) }.first
70
+ versions.keys.min { |a, b| Gem::Version.new(b) <=> Gem::Version.new(a) }
58
71
  end
59
72
 
60
73
  def versions
74
+ require 'pdk/util'
75
+
61
76
  @versions ||= if PDK::Util.package_install?
62
77
  scan_for_packaged_rubies
63
78
  else
@@ -73,6 +88,8 @@ module PDK
73
88
  end
74
89
 
75
90
  def bin_path
91
+ require 'pdk/util'
92
+
76
93
  if PDK::Util.package_install?
77
94
  File.join(PDK::Util.pdk_package_basedir, 'private', 'ruby', ruby_version, 'bin')
78
95
  else
@@ -81,6 +98,8 @@ module PDK
81
98
  end
82
99
 
83
100
  def gem_paths_raw
101
+ require 'pdk/util'
102
+
84
103
  if PDK::Util.package_install?
85
104
  # Subprocesses use their own set of gems which are managed by pdk or
86
105
  # installed with the package. We also include the separate gem path
@@ -88,14 +107,12 @@ module PDK
88
107
  [
89
108
  File.join(PDK::Util.pdk_package_basedir, 'private', 'ruby', ruby_version, 'lib', 'ruby', 'gems', versions[ruby_version]),
90
109
  File.join(PDK::Util.package_cachedir, 'ruby', versions[ruby_version]),
91
- 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])
92
111
  ]
93
112
  else
94
113
  # This allows the subprocess to find the 'bundler' gem, which isn't
95
114
  # in GEM_HOME for gem installs.
96
- # TODO: There must be a better way to do this than shelling out to
97
- # gem... Perhaps can be replaced with "Gem.path"?
98
- [File.absolute_path(File.join(`gem which bundler`, '..', '..', '..', '..'))]
115
+ [File.absolute_path(File.join(bundler_basedir, '..', '..', '..'))]
99
116
  end
100
117
  end
101
118
 
@@ -104,6 +121,9 @@ module PDK
104
121
  end
105
122
 
106
123
  def gem_home
124
+ require 'pdk/util'
125
+
126
+ # TODO: bundle install --path is deprecated
107
127
  # `bundle install --path` ignores all "system" installed gems and
108
128
  # causes unnecessary package installs. `bundle install` (without
109
129
  # --path) installs into GEM_HOME, which by default is non-user
@@ -118,10 +138,10 @@ module PDK
118
138
  def available_puppet_versions
119
139
  return @available_puppet_versions unless @available_puppet_versions.nil?
120
140
 
121
- puppet_spec_files = Dir[File.join(gem_home, 'specifications', '**', 'puppet*.gemspec')]
141
+ puppet_spec_files = PDK::Util::Filesystem.glob(File.join(gem_home, 'specifications', '**', 'puppet*.gemspec'))
122
142
 
123
143
  gem_path.split(File::PATH_SEPARATOR).each do |path|
124
- puppet_spec_files += Dir[File.join(path, 'specifications', '**', 'puppet*.gemspec')]
144
+ puppet_spec_files += PDK::Util::Filesystem.glob(File.join(path, 'specifications', '**', 'puppet*.gemspec'))
125
145
  end
126
146
 
127
147
  puppet_specs = []
@@ -131,7 +151,7 @@ module PDK
131
151
  puppet_specs << spec if spec.name == 'puppet'
132
152
  end
133
153
 
134
- @available_puppet_versions = puppet_specs.map(&:version).sort { |a, b| b <=> a }
154
+ @available_puppet_versions = puppet_specs.map(&:version).sort.reverse
135
155
  end
136
156
 
137
157
  private
@@ -143,6 +163,10 @@ module PDK
143
163
  def versions
144
164
  self.class.versions
145
165
  end
166
+
167
+ def bundler_basedir
168
+ Gem::Specification.latest_specs.find { |spec| spec.name.eql?('bundler') }.base_dir
169
+ end
146
170
  end
147
171
  end
148
172
  end