pdk 3.2.0 → 3.3.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 61c49c154cc69ce1e3c47ddfdd089b42c9c4c5e610bfb2e6caf3256939a16d5d
4
- data.tar.gz: 420c70b35bfaf64077b990f6853bfc92062659fc7ba36379cb053232b99313a5
3
+ metadata.gz: 7ea7fd13c13423022b2ef3e28275d98860b34b9afe9d4b5ccac56c06a0a29346
4
+ data.tar.gz: 5025806f00ad6d9b36bb0957d8da65765cc46cd335c11ef75cf3b82f88a61e79
5
5
  SHA512:
6
- metadata.gz: 3e2e8f1e63a936c310459a67a14b632e00a4ac1694fa4cc77f2849b3d19bf09cc9a5e4a19d7ce3e3a0eb6493a31141c76a72bc98d30cbb4eb7ffd1f5d3da7ca0
7
- data.tar.gz: fe219a60e2cf9f7263e1b8fd8e721f143349aa3f03125649e551f9978ae3a9012c4b051f21b2707a266ed31a67772ad6c3cef026f1c5a1a0dadaf8257dc888dc
6
+ metadata.gz: a3b2866a2a221d87d7c87ecc15231b0a97b00bce150cdd97fd6a6a1ee99f36d9ead2fcee2aef644360aaef84e499f1adff1cdb8de9a10ec084ac302743255a6a
7
+ data.tar.gz: e4fbd9517b238b85d55c59df0a838f831ac1033e84ec2daa96487470f91e1c5954bf96208b223311ab8c8e4c00bc3150570094017576d7e1ffb105c57f2f2eff
data/CHANGELOG.md CHANGED
@@ -5,6 +5,20 @@ All notable changes to this project will be documented in this file.
5
5
 
6
6
  The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](http://semver.org).
7
7
 
8
+ ## [v3.3.0](https://github.com/puppetlabs/pdk/tree/v3.3.0) - 2024-09-10
9
+
10
+ [Full Changelog](https://github.com/puppetlabs/pdk/compare/v3.2.0...v3.3.0)
11
+
12
+ ## Added
13
+
14
+ - Skip 'name' validation when in a controlrepo context [#1352](https://github.com/puppetlabs/pdk/pull/1352) ([garrettrowell](https://github.com/garrettrowell))
15
+ - (CAT-1896) - Use puppet-modulebuilder for PDK build [#1374](https://github.com/puppetlabs/pdk/pull/1374) ([jordanbreen28](https://github.com/jordanbreen28))
16
+
17
+ ### Fixed
18
+
19
+ - (CAT-1643) Update childprocess and remove patch [#1356](https://github.com/puppetlabs/pdk/pull/1356) ([david22swan](https://github.com/david22swan))
20
+ - (CAT-2026) Update how pdk test unit --list detects an error [#1388](https://github.com/puppetlabs/pdk/pull/1388) ([david22swan](https://github.com/david22swan))
21
+
8
22
  ## [v3.2.0](https://github.com/puppetlabs/pdk/tree/v3.2.0) - 2024-05-02
9
23
 
10
24
  [Full Changelog](https://github.com/puppetlabs/pdk/compare/v3.1.0...v3.2.0)
data/lib/pdk/cli/build.rb CHANGED
@@ -12,7 +12,6 @@ module PDK
12
12
  option nil, 'force', 'Skips the prompts and builds the module package.'
13
13
 
14
14
  run do |opts, _args, _cmd|
15
- require 'pdk/module/build'
16
15
  require 'pdk/module/metadata'
17
16
  require 'pdk/cli/util'
18
17
 
@@ -37,7 +36,11 @@ module PDK
37
36
  end
38
37
  end
39
38
 
40
- builder = PDK::Module::Build.new(opts)
39
+ # build module
40
+ require 'puppet/modulebuilder'
41
+ module_dir = PDK::Util::Filesystem.expand_path(Dir.pwd)
42
+ target_dir = PDK::Util::Filesystem.expand_path(opts[:'target-dir'])
43
+ builder = Puppet::Modulebuilder::Builder.new(module_dir, target_dir, PDK.logger)
41
44
 
42
45
  unless opts[:force]
43
46
  if builder.package_already_exists?
@@ -49,7 +52,7 @@ module PDK
49
52
  end
50
53
  end
51
54
 
52
- unless builder.module_pdk_compatible?
55
+ unless PDK::Util.module_pdk_compatible?(module_dir)
53
56
  PDK.logger.info 'This module is not compatible with PDK, so PDK can not validate or test this build. ' \
54
57
  'Unvalidated modules may have errors when uploading to the Forge. ' \
55
58
  'To make this module PDK compatible and use validate features, cancel the build and run `pdk convert`.'
@@ -20,8 +20,6 @@ module PDK
20
20
 
21
21
  def initialize(*argv)
22
22
  require 'childprocess'
23
-
24
- require 'pdk/monkey_patches'
25
23
  require 'tempfile'
26
24
 
27
25
  @argv = argv
@@ -3,7 +3,6 @@ require 'pdk/validate'
3
3
  require 'pdk/util/bundler'
4
4
  require 'pdk/cli/util/interview'
5
5
  require 'pdk/util/changelog_generator'
6
- require 'pdk/module/build'
7
6
 
8
7
  module PDK
9
8
  module CLI
@@ -163,7 +163,7 @@ module PDK
163
163
  when :manage
164
164
  if PDK::Util::Filesystem.exist?(absolute_file_path)
165
165
  update_manager.modify_file(absolute_file_path, file_content)
166
- update_manager.make_file_executable(absolute_file_path) if file_executable && !PDK::Util::Filesystem.executable?(absolute_file_path)
166
+ update_manager.make_file_executable(absolute_file_path) if file_executable && !PDK::Util::Filesystem.stat(absolute_file_path).executable?
167
167
  else
168
168
  update_manager.add_file(absolute_file_path, file_content)
169
169
  update_manager.make_file_executable(absolute_file_path) if file_executable
@@ -211,7 +211,7 @@ module PDK
211
211
  return if options[:noop]
212
212
 
213
213
  project_dir = File.basename(Dir.pwd)
214
- options[:module_name] = project_dir.split('-', 2).compact[-1]
214
+ options[:module_name] = PDK.context.is_a?(PDK::Context::ControlRepo) ? project_dir : project_dir.split('-', 2).compact[-1]
215
215
  options[:prompt] = false
216
216
  options[:'skip-interview'] = true if options[:force]
217
217
 
@@ -9,7 +9,7 @@ module PDK
9
9
  'RedHat based Linux' => [
10
10
  {
11
11
  'operatingsystem' => 'CentOS',
12
- 'operatingsystemrelease' => ['7']
12
+ 'operatingsystemrelease' => ['7', '8', '9']
13
13
  },
14
14
  {
15
15
  'operatingsystem' => 'OracleLinux',
@@ -17,30 +17,38 @@ module PDK
17
17
  },
18
18
  {
19
19
  'operatingsystem' => 'RedHat',
20
- 'operatingsystemrelease' => ['8']
20
+ 'operatingsystemrelease' => ['7', '8', '9']
21
21
  },
22
22
  {
23
23
  'operatingsystem' => 'Scientific',
24
24
  'operatingsystemrelease' => ['7']
25
+ },
26
+ {
27
+ 'operatingsystem' => 'Rocky',
28
+ 'operatingsystemrelease' => ['8']
29
+ },
30
+ {
31
+ 'operatingsystem' => 'AlmaLinux',
32
+ 'operatingsystemrelease' => ['8']
25
33
  }
26
34
  ],
27
35
  'Debian based Linux' => [
28
36
  {
29
37
  'operatingsystem' => 'Debian',
30
- 'operatingsystemrelease' => ['10']
38
+ 'operatingsystemrelease' => ['10', '11', '12']
31
39
  },
32
40
  {
33
41
  'operatingsystem' => 'Ubuntu',
34
- 'operatingsystemrelease' => ['18.04']
42
+ 'operatingsystemrelease' => ['18.04', '20.04', '22.04']
35
43
  }
36
44
  ],
37
45
  'Fedora' => {
38
46
  'operatingsystem' => 'Fedora',
39
- 'operatingsystemrelease' => ['29']
47
+ 'operatingsystemrelease' => ['40']
40
48
  },
41
49
  'OSX' => {
42
50
  'operatingsystem' => 'Darwin',
43
- 'operatingsystemrelease' => ['16']
51
+ 'operatingsystemrelease' => ['21', '22', '23']
44
52
  },
45
53
  'SLES' => {
46
54
  'operatingsystem' => 'SLES',
@@ -52,11 +60,11 @@ module PDK
52
60
  },
53
61
  'Windows' => {
54
62
  'operatingsystem' => 'windows',
55
- 'operatingsystemrelease' => ['2019', '10']
63
+ 'operatingsystemrelease' => ['2019', '2022', '10', '11']
56
64
  },
57
65
  'AIX' => {
58
66
  'operatingsystem' => 'AIX',
59
- 'operatingsystemrelease' => ['6.1', '7.1', '7.2']
67
+ 'operatingsystemrelease' => ['7.2', '7.3']
60
68
  }
61
69
  }.freeze
62
70
 
@@ -162,7 +170,7 @@ module PDK
162
170
 
163
171
  # Do basic validation and parsing of the name parameter.
164
172
  def process_name(data)
165
- validate_name(data['name'])
173
+ validate_name(data['name']) unless PDK.context.is_a?(PDK::Context::ControlRepo)
166
174
  author, modname = data['name'].split(%r{[-/]}, 2)
167
175
  data['name'] = [author, modname].join('-')
168
176
 
@@ -1,5 +1,6 @@
1
1
  require 'pdk'
2
2
  require 'uri'
3
+ require 'puppet/modulebuilder'
3
4
 
4
5
  module PDK
5
6
  module Module
@@ -77,7 +78,7 @@ module PDK
77
78
  # Use the default as a last resort
78
79
  package_file = default_package_filename if package_file.nil?
79
80
  else
80
- package_file = run_build(options)
81
+ package_file = run_build
81
82
  end
82
83
 
83
84
  run_publish(options.dup, package_file) unless skip_publish?
@@ -95,7 +96,7 @@ module PDK
95
96
  def default_package_filename
96
97
  return @default_tarball_filename unless @default_tarball_filename.nil?
97
98
 
98
- builder = PDK::Module::Build.new(module_dir: module_path)
99
+ builder = Puppet::Modulebuilder::Builder.new(module_path, nil, PDK.logger)
99
100
  @default_tarball_filename = builder.package_file
100
101
  end
101
102
 
@@ -135,8 +136,11 @@ module PDK
135
136
  end
136
137
 
137
138
  # @return [String] Path to the built tarball
138
- def run_build(opts)
139
- PDK::Module::Build.invoke(opts.dup)
139
+ def run_build
140
+ module_dir = PDK::Util::Filesystem.expand_path(module_path || Dir.pwd)
141
+ target_dir = File.join(module_dir, 'pkg')
142
+ builder = Puppet::Modulebuilder::Builder.new(module_dir, target_dir, PDK.logger)
143
+ builder.build
140
144
  end
141
145
 
142
146
  def run_publish(_opts, tarball_path)
@@ -238,8 +242,7 @@ module PDK
238
242
  def pdk_compatible?
239
243
  return @pdk_compatible unless @pdk_compatible.nil?
240
244
 
241
- builder = PDK::Module::Build.new(module_dir: module_path)
242
- @pdk_compatible = builder.module_pdk_compatible?
245
+ @pdk_compatible = PDK::Util.module_pdk_compatible?(module_path)
243
246
  end
244
247
  # :nocov:
245
248
 
@@ -95,7 +95,7 @@ module PDK
95
95
  end
96
96
  end
97
97
 
98
- dest_executable = config['manage_execute_permissions'] && PDK::Util::Filesystem.executable?(File.join(template_loc, template_file))
98
+ dest_executable = config['manage_execute_permissions'] && PDK::Util::Filesystem.stat(File.join(template_loc, template_file)).executable?
99
99
 
100
100
  yield dest_path, dest_content, dest_status, dest_executable
101
101
  end
@@ -246,10 +246,10 @@ module PDK
246
246
  raise PDK::CLI::FatalError, format('Failed to find valid JSON in output from rspec: %{output}', output: output[:stdout]) unless rspec_json
247
247
 
248
248
  if rspec_json['examples'].empty?
249
- rspec_message = rspec_json['messages'][0]
250
- return [] if rspec_message == 'No examples found.'
249
+ return [] if rspec_json['messages'][0] == 'No examples found.'
250
+ return [] if rspec_json['messages'].include?("\nAll examples were filtered out")
251
251
 
252
- raise PDK::CLI::FatalError, format('Unable to enumerate examples. rspec reported: %{message}', message: rspec_message)
252
+ raise PDK::CLI::FatalError, format('Unable to enumerate examples. rspec reported: %{message}', message: rspec_json['messages'])
253
253
  else
254
254
  examples = []
255
255
  rspec_json['examples'].each do |example|
data/lib/pdk/util.rb CHANGED
@@ -32,6 +32,7 @@ module PDK
32
32
  def exit_process(exit_code)
33
33
  exit exit_code
34
34
  end
35
+ module_function :exit_process
35
36
  # :nocov:
36
37
 
37
38
  # Searches upwards from current working directory for the given target file.
data/lib/pdk/version.rb CHANGED
@@ -1,4 +1,4 @@
1
1
  module PDK
2
- VERSION = '3.2.0'.freeze
3
- TEMPLATE_REF = '3.2.0'.freeze
2
+ VERSION = '3.3.0'.freeze
3
+ TEMPLATE_REF = '3.3.0'.freeze
4
4
  end
metadata CHANGED
@@ -1,97 +1,97 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pdk
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.2.0
4
+ version: 3.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Puppet, Inc.
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-05-09 00:00:00.000000000 Z
11
+ date: 2024-09-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: bundler
14
+ name: ffi
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: 2.1.0
19
+ version: 1.15.5
20
20
  - - "<"
21
21
  - !ruby/object:Gem::Version
22
- version: 3.0.0
22
+ version: 2.0.0
23
23
  type: :runtime
24
24
  prerelease: false
25
25
  version_requirements: !ruby/object:Gem::Requirement
26
26
  requirements:
27
27
  - - ">="
28
28
  - !ruby/object:Gem::Version
29
- version: 2.1.0
29
+ version: 1.15.5
30
30
  - - "<"
31
31
  - !ruby/object:Gem::Version
32
- version: 3.0.0
32
+ version: 2.0.0
33
33
  - !ruby/object:Gem::Dependency
34
- name: childprocess
34
+ name: minitar
35
35
  requirement: !ruby/object:Gem::Requirement
36
36
  requirements:
37
37
  - - "~>"
38
38
  - !ruby/object:Gem::Version
39
- version: 4.1.0
39
+ version: '0.8'
40
40
  type: :runtime
41
41
  prerelease: false
42
42
  version_requirements: !ruby/object:Gem::Requirement
43
43
  requirements:
44
44
  - - "~>"
45
45
  - !ruby/object:Gem::Version
46
- version: 4.1.0
46
+ version: '0.8'
47
47
  - !ruby/object:Gem::Dependency
48
- name: cri
48
+ name: bundler
49
49
  requirement: !ruby/object:Gem::Requirement
50
50
  requirements:
51
- - - "~>"
51
+ - - ">="
52
52
  - !ruby/object:Gem::Version
53
- version: 2.15.11
53
+ version: 2.1.0
54
+ - - "<"
55
+ - !ruby/object:Gem::Version
56
+ version: 3.0.0
54
57
  type: :runtime
55
58
  prerelease: false
56
59
  version_requirements: !ruby/object:Gem::Requirement
57
60
  requirements:
58
- - - "~>"
61
+ - - ">="
59
62
  - !ruby/object:Gem::Version
60
- version: 2.15.11
63
+ version: 2.1.0
64
+ - - "<"
65
+ - !ruby/object:Gem::Version
66
+ version: 3.0.0
61
67
  - !ruby/object:Gem::Dependency
62
- name: diff-lcs
68
+ name: cri
63
69
  requirement: !ruby/object:Gem::Requirement
64
70
  requirements:
65
- - - ">="
71
+ - - "~>"
66
72
  - !ruby/object:Gem::Version
67
- version: 1.5.0
73
+ version: 2.15.11
68
74
  type: :runtime
69
75
  prerelease: false
70
76
  version_requirements: !ruby/object:Gem::Requirement
71
77
  requirements:
72
- - - ">="
78
+ - - "~>"
73
79
  - !ruby/object:Gem::Version
74
- version: 1.5.0
80
+ version: 2.15.11
75
81
  - !ruby/object:Gem::Dependency
76
- name: ffi
82
+ name: childprocess
77
83
  requirement: !ruby/object:Gem::Requirement
78
84
  requirements:
79
- - - ">="
80
- - !ruby/object:Gem::Version
81
- version: 1.15.5
82
- - - "<"
85
+ - - "~>"
83
86
  - !ruby/object:Gem::Version
84
- version: 2.0.0
87
+ version: '5.0'
85
88
  type: :runtime
86
89
  prerelease: false
87
90
  version_requirements: !ruby/object:Gem::Requirement
88
91
  requirements:
89
- - - ">="
90
- - !ruby/object:Gem::Version
91
- version: 1.15.5
92
- - - "<"
92
+ - - "~>"
93
93
  - !ruby/object:Gem::Version
94
- version: 2.0.0
94
+ version: '5.0'
95
95
  - !ruby/object:Gem::Dependency
96
96
  name: hitimes
97
97
  requirement: !ruby/object:Gem::Requirement
@@ -107,117 +107,131 @@ dependencies:
107
107
  - !ruby/object:Gem::Version
108
108
  version: 2.0.0
109
109
  - !ruby/object:Gem::Dependency
110
- name: json_pure
110
+ name: tty-prompt
111
111
  requirement: !ruby/object:Gem::Requirement
112
112
  requirements:
113
113
  - - "~>"
114
114
  - !ruby/object:Gem::Version
115
- version: 2.6.3
115
+ version: '0.23'
116
116
  type: :runtime
117
117
  prerelease: false
118
118
  version_requirements: !ruby/object:Gem::Requirement
119
119
  requirements:
120
120
  - - "~>"
121
121
  - !ruby/object:Gem::Version
122
- version: 2.6.3
122
+ version: '0.23'
123
123
  - !ruby/object:Gem::Dependency
124
- name: json-schema
124
+ name: tty-spinner
125
125
  requirement: !ruby/object:Gem::Requirement
126
126
  requirements:
127
127
  - - "~>"
128
128
  - !ruby/object:Gem::Version
129
- version: '4.0'
129
+ version: '0.9'
130
130
  type: :runtime
131
131
  prerelease: false
132
132
  version_requirements: !ruby/object:Gem::Requirement
133
133
  requirements:
134
134
  - - "~>"
135
135
  - !ruby/object:Gem::Version
136
- version: '4.0'
136
+ version: '0.9'
137
137
  - !ruby/object:Gem::Dependency
138
- name: minitar
138
+ name: tty-which
139
139
  requirement: !ruby/object:Gem::Requirement
140
140
  requirements:
141
141
  - - "~>"
142
142
  - !ruby/object:Gem::Version
143
- version: '0.8'
143
+ version: '0.5'
144
144
  type: :runtime
145
145
  prerelease: false
146
146
  version_requirements: !ruby/object:Gem::Requirement
147
147
  requirements:
148
148
  - - "~>"
149
149
  - !ruby/object:Gem::Version
150
- version: '0.8'
150
+ version: '0.5'
151
151
  - !ruby/object:Gem::Dependency
152
- name: pathspec
152
+ name: json-schema
153
153
  requirement: !ruby/object:Gem::Requirement
154
154
  requirements:
155
155
  - - "~>"
156
156
  - !ruby/object:Gem::Version
157
- version: '1.1'
157
+ version: '4.0'
158
158
  type: :runtime
159
159
  prerelease: false
160
160
  version_requirements: !ruby/object:Gem::Requirement
161
161
  requirements:
162
162
  - - "~>"
163
163
  - !ruby/object:Gem::Version
164
- version: '1.1'
164
+ version: '4.0'
165
165
  - !ruby/object:Gem::Dependency
166
- name: tty-prompt
166
+ name: puppet-modulebuilder
167
167
  requirement: !ruby/object:Gem::Requirement
168
168
  requirements:
169
169
  - - "~>"
170
170
  - !ruby/object:Gem::Version
171
- version: '0.23'
171
+ version: '1.0'
172
172
  type: :runtime
173
173
  prerelease: false
174
174
  version_requirements: !ruby/object:Gem::Requirement
175
175
  requirements:
176
176
  - - "~>"
177
177
  - !ruby/object:Gem::Version
178
- version: '0.23'
178
+ version: '1.0'
179
179
  - !ruby/object:Gem::Dependency
180
- name: tty-spinner
180
+ name: deep_merge
181
181
  requirement: !ruby/object:Gem::Requirement
182
182
  requirements:
183
183
  - - "~>"
184
184
  - !ruby/object:Gem::Version
185
- version: '0.9'
185
+ version: 1.2.2
186
186
  type: :runtime
187
187
  prerelease: false
188
188
  version_requirements: !ruby/object:Gem::Requirement
189
189
  requirements:
190
190
  - - "~>"
191
191
  - !ruby/object:Gem::Version
192
- version: '0.9'
192
+ version: 1.2.2
193
193
  - !ruby/object:Gem::Dependency
194
- name: tty-which
194
+ name: diff-lcs
195
+ requirement: !ruby/object:Gem::Requirement
196
+ requirements:
197
+ - - ">="
198
+ - !ruby/object:Gem::Version
199
+ version: 1.5.0
200
+ type: :runtime
201
+ prerelease: false
202
+ version_requirements: !ruby/object:Gem::Requirement
203
+ requirements:
204
+ - - ">="
205
+ - !ruby/object:Gem::Version
206
+ version: 1.5.0
207
+ - !ruby/object:Gem::Dependency
208
+ name: json_pure
195
209
  requirement: !ruby/object:Gem::Requirement
196
210
  requirements:
197
211
  - - "~>"
198
212
  - !ruby/object:Gem::Version
199
- version: '0.5'
213
+ version: 2.6.3
200
214
  type: :runtime
201
215
  prerelease: false
202
216
  version_requirements: !ruby/object:Gem::Requirement
203
217
  requirements:
204
218
  - - "~>"
205
219
  - !ruby/object:Gem::Version
206
- version: '0.5'
220
+ version: 2.6.3
207
221
  - !ruby/object:Gem::Dependency
208
- name: deep_merge
222
+ name: pathspec
209
223
  requirement: !ruby/object:Gem::Requirement
210
224
  requirements:
211
225
  - - "~>"
212
226
  - !ruby/object:Gem::Version
213
- version: 1.2.2
227
+ version: '1.1'
214
228
  type: :runtime
215
229
  prerelease: false
216
230
  version_requirements: !ruby/object:Gem::Requirement
217
231
  requirements:
218
232
  - - "~>"
219
233
  - !ruby/object:Gem::Version
220
- version: 1.2.2
234
+ version: '1.1'
221
235
  description: A CLI to facilitate easy, unified development workflows for Puppet modules.
222
236
  email:
223
237
  - pdk-maintainers@puppet.com
@@ -305,13 +319,11 @@ files:
305
319
  - lib/pdk/generate/transport.rb
306
320
  - lib/pdk/logger.rb
307
321
  - lib/pdk/module.rb
308
- - lib/pdk/module/build.rb
309
322
  - lib/pdk/module/convert.rb
310
323
  - lib/pdk/module/metadata.rb
311
324
  - lib/pdk/module/release.rb
312
325
  - lib/pdk/module/update.rb
313
326
  - lib/pdk/module/update_manager.rb
314
- - lib/pdk/monkey_patches.rb
315
327
  - lib/pdk/report.rb
316
328
  - lib/pdk/report/event.rb
317
329
  - lib/pdk/template.rb
@@ -371,7 +383,7 @@ homepage: https://github.com/puppetlabs/pdk
371
383
  licenses: []
372
384
  metadata:
373
385
  rubygems_mfa_required: 'true'
374
- post_install_message:
386
+ post_install_message:
375
387
  rdoc_options: []
376
388
  require_paths:
377
389
  - lib
@@ -386,8 +398,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
386
398
  - !ruby/object:Gem::Version
387
399
  version: '0'
388
400
  requirements: []
389
- rubygems_version: 3.1.6
390
- signing_key:
401
+ rubygems_version: 3.5.17
402
+ signing_key:
391
403
  specification_version: 4
392
404
  summary: A key part of the Puppet Development Kit, the shortest path to better modules
393
405
  test_files: []
@@ -1,302 +0,0 @@
1
- require 'pdk'
2
-
3
- module PDK
4
- module Module
5
- class Build
6
- def self.invoke(options = {})
7
- new(options).build
8
- end
9
-
10
- attr_reader :module_dir, :target_dir
11
-
12
- def initialize(options = {})
13
- @module_dir = PDK::Util::Filesystem.expand_path(options[:module_dir] || Dir.pwd)
14
- @target_dir = PDK::Util::Filesystem.expand_path(options[:'target-dir'] || File.join(module_dir, 'pkg'))
15
- end
16
-
17
- # Read and parse the values from metadata.json for the module that is
18
- # being built.
19
- #
20
- # @return [Hash{String => Object}] The hash of metadata values.
21
- def metadata
22
- require 'pdk/module/metadata'
23
-
24
- @metadata ||= PDK::Module::Metadata.from_file(File.join(module_dir, 'metadata.json')).data
25
- end
26
-
27
- # Return the path where the built package file will be written to.
28
- def package_file
29
- @package_file ||= File.join(target_dir, "#{release_name}.tar.gz")
30
- end
31
-
32
- # Build a module package from a module directory.
33
- #
34
- # @return [String] The path to the built package file.
35
- def build
36
- create_build_dir
37
-
38
- stage_module_in_build_dir
39
- build_package
40
-
41
- package_file
42
- ensure
43
- cleanup_build_dir
44
- end
45
-
46
- # Verify if there is an existing package in the target directory and prompts
47
- # the user if they want to overwrite it.
48
- def package_already_exists?
49
- PDK::Util::Filesystem.exist?(package_file)
50
- end
51
-
52
- # Check if the module is PDK Compatible. If not, then prompt the user if
53
- # they want to run PDK Convert.
54
- def module_pdk_compatible?
55
- ['pdk-version', 'template-url'].any? { |key| metadata.key?(key) }
56
- end
57
-
58
- # Return the path to the temporary build directory, which will be placed
59
- # inside the target directory and match the release name (see #release_name).
60
- def build_dir
61
- @build_dir ||= File.join(target_dir, release_name)
62
- end
63
-
64
- # Create a temporary build directory where the files to be included in
65
- # the package will be staged before building the tarball.
66
- #
67
- # If the directory already exists, remove it first.
68
- def create_build_dir
69
- cleanup_build_dir
70
-
71
- PDK::Util::Filesystem.mkdir_p(build_dir)
72
- end
73
-
74
- # Remove the temporary build directory and all its contents from disk.
75
- #
76
- # @return nil.
77
- def cleanup_build_dir
78
- PDK::Util::Filesystem.rm_rf(build_dir, secure: true)
79
- end
80
-
81
- # Combine the module name and version into a Forge-compatible dash
82
- # separated string.
83
- #
84
- # @return [String] The module name and version, joined by a dash.
85
- def release_name
86
- @release_name ||= [
87
- metadata['name'],
88
- metadata['version']
89
- ].join('-')
90
- end
91
-
92
- # Iterate through all the files and directories in the module and stage
93
- # them into the temporary build directory (unless ignored).
94
- #
95
- # @return nil
96
- def stage_module_in_build_dir
97
- require 'find'
98
-
99
- Find.find(module_dir) do |path|
100
- next if path == module_dir
101
-
102
- ignored_path?(path) ? Find.prune : stage_path(path)
103
- end
104
- end
105
-
106
- # Stage a file or directory from the module into the build directory.
107
- #
108
- # @param path [String] The path to the file or directory.
109
- #
110
- # @return nil.
111
- def stage_path(path)
112
- require 'pathname'
113
-
114
- relative_path = Pathname.new(path).relative_path_from(Pathname.new(module_dir))
115
- dest_path = File.join(build_dir, relative_path)
116
-
117
- validate_path_encoding!(relative_path.to_path)
118
-
119
- if PDK::Util::Filesystem.directory?(path)
120
- PDK::Util::Filesystem.mkdir_p(dest_path, mode: PDK::Util::Filesystem.stat(path).mode)
121
- elsif PDK::Util::Filesystem.symlink?(path)
122
- warn_symlink(path)
123
- else
124
- validate_ustar_path!(relative_path.to_path)
125
- PDK::Util::Filesystem.cp(path, dest_path, preserve: true)
126
- end
127
- rescue ArgumentError => e
128
- raise PDK::CLI::ExitWithError, format('%{message} Rename the file or exclude it from the package ' \
129
- 'by adding it to the .pdkignore file in your module.', message: e.message)
130
- end
131
-
132
- # Check if the given path matches one of the patterns listed in the
133
- # ignore file.
134
- #
135
- # @param path [String] The path to be checked.
136
- #
137
- # @return [Boolean] true if the path matches and should be ignored.
138
- def ignored_path?(path)
139
- path = "#{path}/" if PDK::Util::Filesystem.directory?(path)
140
-
141
- !ignored_files.match_paths([path], module_dir).empty?
142
- end
143
-
144
- # Warn the user about a symlink that would have been included in the
145
- # built package.
146
- #
147
- # @param path [String] The relative or absolute path to the symlink.
148
- #
149
- # @return nil.
150
- def warn_symlink(path)
151
- require 'pathname'
152
-
153
- symlink_path = Pathname.new(path)
154
- module_path = Pathname.new(module_dir)
155
-
156
- PDK.logger.warn format('Symlinks in modules are not supported and will not be included in the package. Please investigate symlink %{from} -> %{to}.',
157
- from: symlink_path.relative_path_from(module_path), to: symlink_path.realpath.relative_path_from(module_path))
158
- end
159
-
160
- # Checks if the path length will fit into the POSIX.1-1998 (ustar) tar
161
- # header format.
162
- #
163
- # POSIX.1-2001 (which allows paths of infinite length) was adopted by GNU
164
- # tar in 2004 and is supported by minitar 0.7 and above. Unfortunately
165
- # much of the Puppet ecosystem still uses minitar 0.6.1.
166
- #
167
- # POSIX.1-1998 tar format does not allow for paths greater than 256 bytes,
168
- # or paths that can't be split into a prefix of 155 bytes (max) and
169
- # a suffix of 100 bytes (max).
170
- #
171
- # This logic was pretty much copied from the private method
172
- # {Archive::Tar::Minitar::Writer#split_name}.
173
- #
174
- # @param path [String] the relative path to be added to the tar file.
175
- #
176
- # @raise [ArgumentError] if the path is too long or could not be split.
177
- #
178
- # @return [nil]
179
- def validate_ustar_path!(path)
180
- raise ArgumentError, format("The path '%{path}' is longer than 256 bytes.", path: path) if path.bytesize > 256
181
-
182
- if path.bytesize <= 100
183
- prefix = ''
184
- else
185
- parts = path.split(File::SEPARATOR)
186
- newpath = parts.pop
187
- nxt = ''
188
-
189
- loop do
190
- nxt = parts.pop || ''
191
- break if newpath.bytesize + 1 + nxt.bytesize >= 100
192
-
193
- newpath = File.join(nxt, newpath)
194
- end
195
-
196
- prefix = File.join(*parts, nxt)
197
- path = newpath
198
- end
199
-
200
- return unless path.bytesize > 100 || prefix.bytesize > 155
201
-
202
- raise ArgumentError,
203
- format("'%{path}' could not be split at a directory separator into two " \
204
- 'parts, the first having a maximum length of 155 bytes and the ' \
205
- 'second having a maximum length of 100 bytes.', path: path)
206
- end
207
-
208
- # Checks if the path contains any non-ASCII characters.
209
- #
210
- # Java will throw an error when it encounters a path containing
211
- # characters that are not supported by the hosts locale. In order to
212
- # maximise compatibility we limit the paths to contain only ASCII
213
- # characters, which should be part of any locale character set.
214
- #
215
- # @param path [String] the relative path to be added to the tar file.
216
- #
217
- # @raise [ArgumentError] if the path contains non-ASCII characters.
218
- #
219
- # @return [nil]
220
- def validate_path_encoding!(path)
221
- return unless /[^\x00-\x7F]/.match?(path)
222
-
223
- raise ArgumentError, format("'%{path}' can only include ASCII characters in its path or " \
224
- 'filename in order to be compatible with a wide range of hosts.', path: path)
225
- end
226
-
227
- # Creates a gzip compressed tarball of the build directory.
228
- #
229
- # If the destination package already exists, it will be removed before
230
- # creating the new tarball.
231
- #
232
- # @return nil.
233
- def build_package
234
- require 'zlib'
235
- require 'minitar'
236
- require 'find'
237
-
238
- PDK::Util::Filesystem.rm_f(package_file)
239
-
240
- Dir.chdir(target_dir) do
241
- gz = Zlib::GzipWriter.new(File.open(package_file, 'wb')) # rubocop:disable PDK/FileOpen
242
- tar = Minitar::Output.new(gz)
243
- Find.find(release_name) do |entry|
244
- entry_meta = {
245
- name: entry
246
- }
247
-
248
- orig_mode = PDK::Util::Filesystem.stat(entry).mode
249
- min_mode = Minitar.dir?(entry) ? 0o755 : 0o644
250
-
251
- entry_meta[:mode] = orig_mode | min_mode
252
-
253
- PDK.logger.debug(format('Updated permissions of packaged \'%{entry}\' to %{new_mode}', entry: entry, new_mode: (entry_meta[:mode] & 0o7777).to_s(8))) if entry_meta[:mode] != orig_mode
254
-
255
- Minitar.pack_file(entry_meta, tar)
256
- end
257
- ensure
258
- tar.close
259
- end
260
- end
261
-
262
- # Select the most appropriate ignore file in the module directory.
263
- #
264
- # In order of preference, we first try `.pdkignore`, then `.pmtignore`
265
- # and finally `.gitignore`.
266
- #
267
- # @return [String] The path to the file containing the patterns of file
268
- # paths to ignore.
269
- def ignore_file
270
- @ignore_file ||= [
271
- File.join(module_dir, '.pdkignore'),
272
- File.join(module_dir, '.pmtignore'),
273
- File.join(module_dir, '.gitignore')
274
- ].find { |file| PDK::Util::Filesystem.file?(file) && PDK::Util::Filesystem.readable?(file) }
275
- end
276
-
277
- # Instantiate a new PathSpec class and populate it with the pattern(s) of
278
- # files to be ignored.
279
- #
280
- # @return [PathSpec] The populated ignore path matcher.
281
- def ignored_files
282
- require 'pdk/module'
283
- require 'pathspec'
284
-
285
- @ignored_files ||=
286
- begin
287
- ignored = if ignore_file.nil?
288
- PathSpec.new
289
- else
290
- PathSpec.new(PDK::Util::Filesystem.read_file(ignore_file, open_args: 'rb:UTF-8'))
291
- end
292
-
293
- ignored = ignored.add("/#{File.basename(target_dir)}/") if File.realdirpath(target_dir).start_with?(File.realdirpath(module_dir))
294
-
295
- PDK::Module::DEFAULT_IGNORED.each { |r| ignored.add(r) }
296
-
297
- ignored
298
- end
299
- end
300
- end
301
- end
302
- end
@@ -1,268 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module OS
4
- # Os detection: Are we on Windows?
5
- def self.windows?
6
- (/cygwin|mswin|mingw|bccwin|wince|emx/ =~ RUBY_PLATFORM) != nil
7
- end
8
- end
9
-
10
- # Patch childprocess so that it is Ruby 3 compliant.
11
- # This could be removed if the following PR is ever merged
12
- # and released:
13
- # https://github.com/enkessler/childprocess/pull/185
14
- module ChildProcess
15
- class << self
16
- def build(*args)
17
- case os
18
- when :macosx, :linux, :solaris, :bsd, :cygwin, :aix
19
- if posix_spawn?
20
- Unix::PosixSpawnProcess.new(*args)
21
- elsif jruby?
22
- JRuby::Process.new(*args)
23
- else
24
- Unix::ForkExecProcess.new(*args)
25
- end
26
- when :windows
27
- Windows::Process.new(*args)
28
- else
29
- raise Error, "unsupported platform #{platform_name.inspect}"
30
- end
31
- end
32
- end
33
-
34
- class AbstractProcess
35
- def initialize(*args)
36
- raise ArgumentError, "all arguments must be String: #{args.inspect}" unless args.all?(String)
37
-
38
- @args = args
39
- @started = false
40
- @exit_code = nil
41
- @io = nil
42
- @cwd = nil
43
- @detach = false
44
- @duplex = false
45
- @leader = false
46
- @environment = {}
47
- end
48
- end
49
-
50
- if OS.windows?
51
- module Windows
52
- module Lib
53
- extend FFI::Library
54
- def self.msvcrt_name
55
- RbConfig::CONFIG['RUBY_SO_NAME'][/msvc\w+/] || 'ucrtbase'
56
- end
57
-
58
- ffi_lib 'kernel32', msvcrt_name
59
- ffi_convention :stdcall
60
-
61
- # We have to redefine the function declarations so that they are available
62
- # with the patched ffi_lib.
63
- enum :wait_status, [
64
- :wait_object_0, 0, # rubocop:disable Naming/VariableNumber
65
- :wait_timeout, 0x102,
66
- :wait_abandoned, 0x80,
67
- :wait_failed, 0xFFFFFFFF
68
- ]
69
-
70
- #
71
- # BOOL WINAPI CreateProcess(
72
- # __in_opt LPCTSTR lpApplicationName,
73
- # __inout_opt LPTSTR lpCommandLine,
74
- # __in_opt LPSECURITY_ATTRIBUTES lpProcessAttributes,
75
- # __in_opt LPSECURITY_ATTRIBUTES lpThreadAttributes,
76
- # __in BOOL bInheritHandles,
77
- # __in DWORD dwCreationFlags,
78
- # __in_opt LPVOID lpEnvironment,
79
- # __in_opt LPCTSTR lpCurrentDirectory,
80
- # __in LPSTARTUPINFO lpStartupInfo,
81
- # __out LPPROCESS_INFORMATION lpProcessInformation
82
- # );
83
- #
84
-
85
- attach_function :create_process, :CreateProcessW, [
86
- :pointer,
87
- :buffer_inout,
88
- :pointer,
89
- :pointer,
90
- :bool,
91
- :ulong,
92
- :pointer,
93
- :pointer,
94
- :pointer,
95
- :pointer
96
- ], :bool
97
-
98
- #
99
- # DWORD WINAPI FormatMessage(
100
- # __in DWORD dwFlags,
101
- # __in_opt LPCVOID lpSource,
102
- # __in DWORD dwMessageId,
103
- # __in DWORD dwLanguageId,
104
- # __out LPTSTR lpBuffer,
105
- # __in DWORD nSize,
106
- # __in_opt va_list *Arguments
107
- # );
108
- #
109
-
110
- attach_function :format_message, :FormatMessageA, [
111
- :ulong,
112
- :pointer,
113
- :ulong,
114
- :ulong,
115
- :pointer,
116
- :ulong,
117
- :pointer
118
- ], :ulong
119
-
120
- attach_function :close_handle, :CloseHandle, [:pointer], :bool
121
-
122
- #
123
- # HANDLE WINAPI OpenProcess(
124
- # __in DWORD dwDesiredAccess,
125
- # __in BOOL bInheritHandle,
126
- # __in DWORD dwProcessId
127
- # );
128
- #
129
-
130
- attach_function :open_process, :OpenProcess, [:ulong, :bool, :ulong], :pointer
131
-
132
- #
133
- # HANDLE WINAPI CreateJobObject(
134
- # _In_opt_ LPSECURITY_ATTRIBUTES lpJobAttributes,
135
- # _In_opt_ LPCTSTR lpName
136
- # );
137
- #
138
-
139
- attach_function :create_job_object, :CreateJobObjectA, [:pointer, :pointer], :pointer
140
-
141
- #
142
- # BOOL WINAPI AssignProcessToJobObject(
143
- # _In_ HANDLE hJob,
144
- # _In_ HANDLE hProcess
145
- # );
146
-
147
- attach_function :assign_process_to_job_object, :AssignProcessToJobObject, [:pointer, :pointer], :bool
148
-
149
- #
150
- # BOOL WINAPI SetInformationJobObject(
151
- # _In_ HANDLE hJob,
152
- # _In_ JOBOBJECTINFOCLASS JobObjectInfoClass,
153
- # _In_ LPVOID lpJobObjectInfo,
154
- # _In_ DWORD cbJobObjectInfoLength
155
- # );
156
- #
157
-
158
- attach_function :set_information_job_object, :SetInformationJobObject, [:pointer, :int, :pointer, :ulong], :bool
159
-
160
- #
161
- #
162
- # DWORD WINAPI WaitForSingleObject(
163
- # __in HANDLE hHandle,
164
- # __in DWORD dwMilliseconds
165
- # );
166
- #
167
-
168
- attach_function :wait_for_single_object, :WaitForSingleObject, [:pointer, :ulong], :wait_status, blocking: true
169
-
170
- #
171
- # BOOL WINAPI GetExitCodeProcess(
172
- # __in HANDLE hProcess,
173
- # __out LPDWORD lpExitCode
174
- # );
175
- #
176
-
177
- attach_function :get_exit_code, :GetExitCodeProcess, [:pointer, :pointer], :bool
178
-
179
- #
180
- # BOOL WINAPI GenerateConsoleCtrlEvent(
181
- # __in DWORD dwCtrlEvent,
182
- # __in DWORD dwProcessGroupId
183
- # );
184
- #
185
-
186
- attach_function :generate_console_ctrl_event, :GenerateConsoleCtrlEvent, [:ulong, :ulong], :bool
187
-
188
- #
189
- # BOOL WINAPI TerminateProcess(
190
- # __in HANDLE hProcess,
191
- # __in UINT uExitCode
192
- # );
193
- #
194
-
195
- attach_function :terminate_process, :TerminateProcess, [:pointer, :uint], :bool
196
-
197
- #
198
- # intptr_t _get_osfhandle(
199
- # int fd
200
- # );
201
- #
202
-
203
- attach_function :get_osfhandle, :_get_osfhandle, [:int], :intptr_t
204
-
205
- #
206
- # int _open_osfhandle (
207
- # intptr_t osfhandle,
208
- # int flags
209
- # );
210
- #
211
-
212
- attach_function :open_osfhandle, :_open_osfhandle, [:pointer, :int], :int
213
-
214
- # BOOL WINAPI SetHandleInformation(
215
- # __in HANDLE hObject,
216
- # __in DWORD dwMask,
217
- # __in DWORD dwFlags
218
- # );
219
-
220
- attach_function :set_handle_information, :SetHandleInformation, [:pointer, :ulong, :ulong], :bool
221
-
222
- # BOOL WINAPI GetHandleInformation(
223
- # __in HANDLE hObject,
224
- # __out LPDWORD lpdwFlags
225
- # );
226
-
227
- attach_function :get_handle_information, :GetHandleInformation, [:pointer, :pointer], :bool
228
-
229
- # BOOL WINAPI CreatePipe(
230
- # __out PHANDLE hReadPipe,
231
- # __out PHANDLE hWritePipe,
232
- # __in_opt LPSECURITY_ATTRIBUTES lpPipeAttributes,
233
- # __in DWORD nSize
234
- # );
235
-
236
- attach_function :create_pipe, :CreatePipe, [:pointer, :pointer, :pointer, :ulong], :bool
237
-
238
- #
239
- # HANDLE WINAPI GetCurrentProcess(void);
240
- #
241
-
242
- attach_function :current_process, :GetCurrentProcess, [], :pointer
243
-
244
- #
245
- # BOOL WINAPI DuplicateHandle(
246
- # __in HANDLE hSourceProcessHandle,
247
- # __in HANDLE hSourceHandle,
248
- # __in HANDLE hTargetProcessHandle,
249
- # __out LPHANDLE lpTargetHandle,
250
- # __in DWORD dwDesiredAccess,
251
- # __in BOOL bInheritHandle,
252
- # __in DWORD dwOptions
253
- # );
254
- #
255
-
256
- attach_function :_duplicate_handle, :DuplicateHandle, [
257
- :pointer,
258
- :pointer,
259
- :pointer,
260
- :pointer,
261
- :ulong,
262
- :bool,
263
- :ulong
264
- ], :bool
265
- end
266
- end
267
- end
268
- end