pdk 0.5.0 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b878e02d3bef0909854556bea786e90c9046e19d
4
- data.tar.gz: 57f154d05abdef54e0c658529664cfe4eeedc3d3
3
+ metadata.gz: 6dcde45f10e3958c18de937239e90bdd7f4a4b50
4
+ data.tar.gz: ed1a5dafcf13c2b7a40a028caf59625a4694b967
5
5
  SHA512:
6
- metadata.gz: 5334b857cda21c8a2383cded335f22e8fdd16752305db1d3b52bb1f61c98d8ccca6acf33724085e79b4492e0c083a44732acd6b081f75ce20eba8af5bc01a0af
7
- data.tar.gz: ff431dd53fa3ebe9d4b5f0ab95d0e3d49101c0bb7cebcd80720d4bf007440df216f03d573f257994d3cb33f0f39a225f4918ff23438276c0c28cceef9c377999
6
+ metadata.gz: 4addbf8f2b767b3a5774b142acabf289710d6cb5eb7c0e32ef199dc352fe853b6e1291236ce3535ebf99f1c2173ef89d0643c0a489b90ad6a39aef315c9f99cb
7
+ data.tar.gz: 78ce8ece339647fbcbeda887b3a3e5af7fabd59a90afb7640bb638d5432a43841307cd079ba39a25874c7e02b4f5d3b8ddbd358ebf0ec322d1e79e1a90cec966
data/CHANGELOG.md CHANGED
@@ -3,7 +3,37 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
 
5
5
 
6
+ ## [v0.6.0](https://github.com/puppetlabs/pdk/tree/v0.6.0) (2017-08-08)
7
+
8
+ [Full Changelog](https://github.com/puppetlabs/pdk/compare/v0.5.0...v0.6.0)
9
+
10
+ **Implemented enhancements:**
11
+
12
+ - \(MAINT\) Improve moduleroot error message [\#224](https://github.com/puppetlabs/pdk/pull/224) ([DavidS](https://github.com/DavidS))
13
+ - \(PDK-354\) Change PDK::Logger to write to STDERR [\#217](https://github.com/puppetlabs/pdk/pull/217) ([scotje](https://github.com/scotje))
14
+ - \(SDK-331\) Use vendored Gemfile.lock when available and needed [\#215](https://github.com/puppetlabs/pdk/pull/215) ([scotje](https://github.com/scotje))
15
+ - \(maint\) Expose message when FileUtils.mkdir\_p fails during module generation [\#209](https://github.com/puppetlabs/pdk/pull/209) ([rodjek](https://github.com/rodjek))
16
+ - \(SDK-323\) Change color of default answer to cyan [\#206](https://github.com/puppetlabs/pdk/pull/206) ([austb](https://github.com/austb))
17
+ - \(maint\) Remove unimplemented `add provider` from docs [\#200](https://github.com/puppetlabs/pdk/pull/200) ([DavidS](https://github.com/DavidS))
18
+ - Update PowerShell install instructions [\#194](https://github.com/puppetlabs/pdk/pull/194) ([jpogran](https://github.com/jpogran))
19
+ - \(maint\) Remove unused vcs option from 'pdk new module' [\#192](https://github.com/puppetlabs/pdk/pull/192) ([rodjek](https://github.com/rodjek))
20
+ - Document compatibility policy and upgrade strategy [\#188](https://github.com/puppetlabs/pdk/pull/188) ([turbodog](https://github.com/turbodog))
21
+ - \(MAINT\) Remove spinner for `bundle check` command [\#187](https://github.com/puppetlabs/pdk/pull/187) ([scotje](https://github.com/scotje))
22
+ - \(SDK-321\) add `pdk validate help` [\#183](https://github.com/puppetlabs/pdk/pull/183) ([DavidS](https://github.com/DavidS))
23
+ - \(SDK-317\) Ensure parent of 'pdk new module' is writable before generation [\#175](https://github.com/puppetlabs/pdk/pull/175) ([rodjek](https://github.com/rodjek))
24
+ - \(SDK-312\) Add option --parallel to `pdk test unit` [\#154](https://github.com/puppetlabs/pdk/pull/154) ([austb](https://github.com/austb))
25
+
26
+ **Fixed bugs:**
27
+
28
+ - \(SDK-325\) Validate all should run all validators [\#230](https://github.com/puppetlabs/pdk/pull/230) ([bmjen](https://github.com/bmjen))
29
+ - \(PDK-373\) Make test unit --list consistent with test unit [\#216](https://github.com/puppetlabs/pdk/pull/216) ([james-stocks](https://github.com/james-stocks))
30
+ - \(MAINT\) Add --strict-dependencies to metadata-json-lint invocation [\#213](https://github.com/puppetlabs/pdk/pull/213) ([scotje](https://github.com/scotje))
31
+ - \(SDK-317\) Replace File.writable? test with actually creating a test file [\#207](https://github.com/puppetlabs/pdk/pull/207) ([scotje](https://github.com/scotje))
32
+ - \(SDK-333\) Rescue Interrupt cleanly [\#199](https://github.com/puppetlabs/pdk/pull/199) ([scotje](https://github.com/scotje))
33
+ - \(\#137\) Nicer response when binary doesn't exist [\#149](https://github.com/puppetlabs/pdk/pull/149) ([rodjek](https://github.com/rodjek))
34
+
6
35
  ## [v0.5.0](https://github.com/puppetlabs/pdk/tree/v0.5.0) (2017-07-20)
36
+
7
37
  [Full Changelog](https://github.com/puppetlabs/pdk/compare/v0.4.4...v0.5.0)
8
38
 
9
39
  **Implemented enhancements:**
@@ -16,6 +46,7 @@ All notable changes to this project will be documented in this file.
16
46
  - \(SDK-331\) allow additional gems to be installed [\#178](https://github.com/puppetlabs/pdk/pull/178) ([DavidS](https://github.com/DavidS))
17
47
 
18
48
  ## [v0.4.4](https://github.com/puppetlabs/pdk/tree/v0.4.4) (2017-07-18)
49
+
19
50
  [Full Changelog](https://github.com/puppetlabs/pdk/compare/v0.4.3...v0.4.4)
20
51
 
21
52
  **Fixed bugs:**
@@ -26,6 +57,7 @@ All notable changes to this project will be documented in this file.
26
57
  - \(SDK-319\) force usage of our ruby [\#168](https://github.com/puppetlabs/pdk/pull/168) ([DavidS](https://github.com/DavidS))
27
58
 
28
59
  ## [v0.4.3](https://github.com/puppetlabs/pdk/tree/v0.4.3) (2017-07-17)
60
+
29
61
  [Full Changelog](https://github.com/puppetlabs/pdk/compare/v0.4.2...v0.4.3)
30
62
 
31
63
  **Fixed bugs:**
@@ -33,6 +65,7 @@ All notable changes to this project will be documented in this file.
33
65
  - \(FIXUP\) Fix default subprocess success/failure messages on Windows [\#164](https://github.com/puppetlabs/pdk/pull/164) ([scotje](https://github.com/scotje))
34
66
 
35
67
  ## [v0.4.2](https://github.com/puppetlabs/pdk/tree/v0.4.2) (2017-07-17)
68
+
36
69
  [Full Changelog](https://github.com/puppetlabs/pdk/compare/v0.4.1...v0.4.2)
37
70
 
38
71
  **Fixed bugs:**
@@ -42,6 +75,7 @@ All notable changes to this project will be documented in this file.
42
75
  - Use default username when Etc.getlogin fails [\#160](https://github.com/puppetlabs/pdk/pull/160) ([austb](https://github.com/austb))
43
76
 
44
77
  ## [v0.4.1](https://github.com/puppetlabs/pdk/tree/v0.4.1) (2017-07-14)
78
+
45
79
  [Full Changelog](https://github.com/puppetlabs/pdk/compare/v0.4.0...v0.4.1)
46
80
 
47
81
  **Fixed bugs:**
@@ -49,6 +83,7 @@ All notable changes to this project will be documented in this file.
49
83
  - \(FIXUP\) Resolve conflation of cachedir concepts [\#153](https://github.com/puppetlabs/pdk/pull/153) ([scotje](https://github.com/scotje))
50
84
 
51
85
  ## [v0.4.0](https://github.com/puppetlabs/pdk/tree/v0.4.0) (2017-07-14)
86
+
52
87
  [Full Changelog](https://github.com/puppetlabs/pdk/compare/v0.3.0...v0.4.0)
53
88
 
54
89
  **Implemented enhancements:**
@@ -64,6 +99,7 @@ All notable changes to this project will be documented in this file.
64
99
  - \(SDK-298\) Handle exception raised when an invalid report format is specified on the CLI [\#125](https://github.com/puppetlabs/pdk/pull/125) ([rodjek](https://github.com/rodjek))
65
100
 
66
101
  ## [v0.3.0](https://github.com/puppetlabs/pdk/tree/v0.3.0) (2017-06-29)
102
+
67
103
  [Full Changelog](https://github.com/puppetlabs/pdk/compare/v0.2.0...v0.3.0)
68
104
 
69
105
  **Implemented enhancements:**
@@ -83,6 +119,7 @@ All notable changes to this project will be documented in this file.
83
119
  - \(SDK-277\) Exit cleanly if pdk commands are run outside of a module [\#100](https://github.com/puppetlabs/pdk/pull/100) ([rodjek](https://github.com/rodjek))
84
120
 
85
121
  ## [v0.2.0](https://github.com/puppetlabs/pdk/tree/v0.2.0) (2017-06-21)
122
+
86
123
  [Full Changelog](https://github.com/puppetlabs/pdk/compare/v0.1.0...v0.2.0)
87
124
 
88
125
  **Implemented enhancements:**
@@ -103,6 +140,7 @@ All notable changes to this project will be documented in this file.
103
140
  - \(maint\) nokogiri: avoid versions without ruby 2.1 support [\#60](https://github.com/puppetlabs/pdk/pull/60) ([DavidS](https://github.com/DavidS))
104
141
 
105
142
  ## [v0.1.0](https://github.com/puppetlabs/pdk/tree/v0.1.0) (2017-06-05)
143
+
106
144
  [Full Changelog](https://github.com/puppetlabs/pdk/compare/2be9329bed4715c888f273814b99f2cf37ee9341...v0.1.0)
107
145
 
108
146
  **Implemented enhancements:**
@@ -126,4 +164,4 @@ All notable changes to this project will be documented in this file.
126
164
 
127
165
 
128
166
 
129
- \* *This Change Log was automatically generated by [github_changelog_generator](https://github.com/skywinder/Github-Changelog-Generator)*
167
+ * *This Change Log was automatically generated by [github_changelog_generator](https://github.com/skywinder/Github-Changelog-Generator)*
data/README.md CHANGED
@@ -1,13 +1,51 @@
1
- # pdk [![Build Status](https://travis-ci.org/puppetlabs/pdk.svg?branch=master)](https://travis-ci.org/puppetlabs/pdk) [![Appveyor Build Status](https://ci.appveyor.com/api/projects/status/x70e2fqllbaootpd?svg=true)](https://ci.appveyor.com/project/puppetlabs/pdk)
1
+ # pdk [![Build Status](https://travis-ci.org/puppetlabs/pdk.svg?branch=master)](https://travis-ci.org/puppetlabs/pdk) [![Appveyor Build Status](https://ci.appveyor.com/api/projects/status/x70e2fqllbaootpd?svg=true)](https://ci.appveyor.com/project/puppetlabs/pdk) [![Coverage Status](https://coveralls.io/repos/github/puppetlabs/pdk/badge.svg?branch=master)](https://coveralls.io/github/puppetlabs/pdk?branch=master)
2
2
 
3
3
 
4
- A CLI to facilitate easy, unified development workflows for Puppet modules. pdk is a key part of the Puppet Development Kit, the shortest path to better modules.
4
+ A CLI to facilitate easy, unified development workflows for Puppet modules. `pdk` is a key part of the Puppet Development Kit, the shortest path to better modules.
5
5
 
6
6
  ## Installation
7
7
 
8
- Download and install the newest package matching your platform from [here](https://drive.google.com/drive/folders/0Bz0tCHSb1u41alR4MmZfRHBTV1k?usp=sharing).
8
+ Download and install the newest package matching your platform from [here](https://drive.google.com/drive/folders/0Bz0tCHSb1u41alR4MmZfRHBTV1k?usp=sharing). If you are using Windows, please remember to close any open PowerShell windows.
9
9
 
10
- On Windows you need to set your script execution policy to [RemoteSigned](https://technet.microsoft.com/en-us/library/ee176961.aspx), to allow the (required) PowerShell integration to work.
10
+ ### Windows
11
+
12
+ On Windows you should run PDK from PowerShell and `pdk` will be available in your PowerShell prompt after installation.
13
+
14
+ If the `pdk` command does not appear, check that the `PuppetDevelopmentKit` PowerShell module is loaded in your PowerShell prompt:
15
+
16
+ ```
17
+ Get-Module -Name PuppetDevelopmentKit
18
+ ```
19
+
20
+ If no output is returned, load the `PuppetDevelopmentKit` module by running the following command:
21
+
22
+ ```
23
+ Import-Module -Name PuppetDevelopmentKit
24
+ ```
25
+
26
+ > Note: On PowerShell version 3 and above, PowerShell modules are loaded automatically so this step shouldn't be necessary.
27
+
28
+ You should set your script execution policy to at least [RemoteSigned](https://msdn.microsoft.com/en-us/powershell/reference/5.1/microsoft.powershell.security/set-executionpolicy), if it's not already, to allow the PowerShell integration to work.
29
+
30
+ You can check your ExecutionPolicy by running the following command from a PowerShell prompt:
31
+
32
+ ```
33
+ Get-ExecutionPolicy
34
+ ```
35
+
36
+ To set the `ExecutionPolicy`, run the following command:
37
+
38
+ ```
39
+ Set-ExecutionPolicy -ExecutionPolicy RemoteSigned
40
+ ```
41
+
42
+ If you can't change the system `ExecutionPolicy`, you can change the `ExecutionPolicy` for just the current session by using the `Scope` paramter:
43
+
44
+ ```
45
+ Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
46
+ ```
47
+
48
+ For more information about PowerShell `ExecutionPolicies` or how to change them, see [about_Execution_Policies](http://go.microsoft.com/fwlink/?LinkID=135170).
11
49
 
12
50
  ## Usage
13
51
 
@@ -98,7 +136,7 @@ Generates a new module.
98
136
  Usage:
99
137
 
100
138
  ```
101
- pdk new module [--template-url=git_url] [--license=spdx_identifier] [--vcs=vcs_provider] module_name [target_dir]
139
+ pdk new module [--template-url=git_url] [--license=spdx_identifier] module_name [target_dir]
102
140
  ```
103
141
 
104
142
  The `pdk new module` command accepts the following arguments and options. Arguments are optional unless otherwise specified.
@@ -111,10 +149,6 @@ Overrides the template to use for this module. If possible, please contribute yo
111
149
 
112
150
  Specifies the license this module is written under. See https://spdx.org/licenses/ for a list of open source licenses, or use `proprietary`. Defaults to `Apache-2.0`.
113
151
 
114
- #### `--vcs=vcs_provider`
115
-
116
- Specifies the version control driver. Valid values: `git`, `none`. Default: `git`.
117
-
118
152
  #### `--skip-interview`
119
153
 
120
154
  Suppress interactive queries for initial values. All questions will use the default values.
@@ -166,30 +200,6 @@ to be added to the generated class. Optionally, the data type of the parameter
166
200
  can be specified along with the parameter name, separated by a colon. Any
167
201
  number of parameters can be provided on the command line.
168
202
 
169
- ### `pdk add provider` command
170
-
171
- Adds a new resource provider to an existing module.
172
-
173
- Usage:
174
-
175
- ```
176
- pdk add provider [--template-url=git_url] provider_name [data_type:attribute_name]*
177
- ```
178
-
179
- The `pdk add provider` command accepts the following arguments. Arguments are optional unless specified.
180
-
181
- #### `--template-url=git_url`
182
-
183
- Overrides the template to use for this module. If possible please contribute your improvements back to the default template at [puppetlabs/pdk](https://github.com/puppetlabs/pdk).
184
-
185
- #### `provider_name`
186
-
187
- **Required**. Specifies the name of the resource provider being created.
188
-
189
- #### `data_type:attribute_name`
190
-
191
- Specifies a list of attributes with their expected data types, such as `'Enum[absent, present]:ensure'`. If not specified, the data type will have no attributes.
192
-
193
203
  ### `pdk validate` command
194
204
 
195
205
  Runs all static validations. Any errors are reported to the console in the format requested. The exit code is non-zero when errors occur.
@@ -293,48 +303,21 @@ rake build # Build puppet module package
293
303
  [...]
294
304
  ```
295
305
 
296
- ## Contributing
297
-
298
- In cases where `pdk` needs to run in a working directory outside the cloned repository, either set `BUNDLE_GEMFILE` to the pdk's Gemfile location, or install and use the [binstubs of bundler](http://bundler.io/v1.15/bundle_binstubs.html), which are small proxy binaries, that set up the environment for running the tool.
299
-
300
- ```
301
- # assuming ~/bin is already on your path:
302
- $ bundle binstubs pdk --path ~/bin
303
- ```
304
-
305
- Bug reports and pull requests are welcome on GitHub at https://github.com/puppetlabs/pdk/issues.
306
+ ## Module Compatibility
306
307
 
307
- ### Running tests
308
+ **PDK Version Compatibility:** modules created with a specific PDK version should validate against and run on all Puppet andRuby version combinations currently under maintenance (see https://docs.puppet.com/puppet/latest/about_agent.html and https://puppet.com/misc/puppet-enterprise-lifecycle)
308
309
 
309
- pdk has three testing rake tasks
310
+ **Module Template Compatibility:** Modules created with a specific version of the PDK will remain compatible to newer versions of the PDK with the following exceptions:
311
+ * access to new PDK functionality might require an update of the module to the current Template version
312
+ * access to a new major PDK version might require an update of the module to the current Template version, after a one year deprecation cycle
313
+ * validation against new Puppet versions might require new PDK functionality, a new major PDK version, and changes to the module itself.
310
314
 
311
- #### spec
315
+ ## Upgrading
316
+ * In the common case, Puppet and the PDK will be forward-compatible so that minor Puppet updates will not require a new version of the PDK.
317
+ * Some new Puppet versions will require changes to the PDK. In that case, upgrading the PDK for validation prior to roll-out of Puppet is strongly recommended.
312
318
 
313
- Run unit tests.
314
319
 
315
- #### acceptance:local
316
320
 
317
- Run acceptance tests on the current pdk code. These tests are executed on commits and pull requests to this repo using both travis and appveyor.
318
-
319
- #### acceptance:package
320
-
321
- Run acceptance tests against a package install. This task is for Puppet's packaging CI, and contributors outside of Puppet, Inc. don't need to worry about executing it. It uses [beaker](https://github.com/puppetlabs/beaker) to provision a VM, fetch and install a pdk installation package, and then run the acceptance tests on that VM.
322
- It requires some environment variables to be set in order to specify what beaker will set up:
323
-
324
- Environment Variable | Usage
325
- ---------------------|------
326
- **SHA** | The SHA or tag of a package build i.e. the folder name on the build server that packages will be found in.
327
- **TEST_TARGET** | A beaker-hostgenerator string for the OS of the VM you want to test on e.g. _redhat7-64workstation._ or _windows2012r2-64workstation._ (The period character after workstation is required by beaker-hostgenerator).
328
- **BUILD_SERVER** | (Only required if the tests will run on a Windows VM). The hostname of the build server that hosts packages. A Puppet JIRA ticket ([BKR-1109](https://tickets.puppetlabs.com/browse/BKR-1109)) has been filed to update beaker so this would never be required.
329
-
330
- On completion of this testing task, the results from the VM will be available in a folder named _archive_.
331
-
332
- ### Release Process
321
+ ## Contributing
333
322
 
334
- 1. Bump the version in `lib/pdk/version.rb`.
335
- 1. In a clean checkout of master, run `bundle exec rake changelog`.
336
- 1. Edit PR titles and tags, until `bundle exec rake changelog` output makes sense.
337
- 1. Commit and PR the changes.
338
- 1. When the PR is merged, get a clean checkout of the merged commit, and run `bundle exec rake release[upstream]` (where "upstream" is your local name of the puppetlabs remote)
339
- 1. Profit!
340
- 1. Update `lib/pdk/version.rb` with `x.y.z.pre` version bump, commit, and PR to prepare for next release.
323
+ See the [CONTRIBUTING.md](CONTRIBUTING.md) file for development notes.
data/exe/pdk CHANGED
@@ -2,4 +2,9 @@
2
2
 
3
3
  require 'pdk/cli'
4
4
 
5
- PDK::CLI.run(ARGV)
5
+ begin
6
+ PDK::CLI.run(ARGV)
7
+ rescue Interrupt
8
+ warn "\nAborted!"
9
+ exit 1
10
+ end
@@ -13,8 +13,8 @@ module PDK
13
13
  #
14
14
  # @param path [String] A path on disk to the file where the PDK should store
15
15
  # answers to interactive questions.
16
- def self.answer_file=(value)
17
- @answer_file = PDK::AnswerFile.new(value)
16
+ def self.answer_file=(path)
17
+ @answer_file = PDK::AnswerFile.new(path)
18
18
  end
19
19
 
20
20
  class AnswerFile
data/lib/pdk/cli/exec.rb CHANGED
@@ -2,6 +2,7 @@ require 'bundler'
2
2
  require 'childprocess'
3
3
  require 'tempfile'
4
4
  require 'tty-spinner'
5
+ require 'tty-which'
5
6
 
6
7
  require 'pdk/util'
7
8
 
@@ -12,22 +13,35 @@ module PDK
12
13
  Command.new(*cmd).execute!
13
14
  end
14
15
 
16
+ def self.ensure_bin_present!(bin_path, bin_name)
17
+ message = _('Unable to find `%{name}`. Check that it is installed and try again.') % {
18
+ name: bin_name,
19
+ }
20
+
21
+ raise PDK::CLI::FatalError, message unless TTY::Which.exist?(bin_path)
22
+ end
23
+
15
24
  def self.git_bindir
16
25
  @git_dir ||= File.join('private', 'git', Gem.win_platform? ? 'cmd' : 'bin')
17
26
  end
18
27
 
19
- def self.git(*args)
28
+ def self.git_bin
20
29
  git_bin = Gem.win_platform? ? 'git.exe' : 'git'
21
30
  vendored_bin_path = File.join(git_bindir, git_bin)
22
31
 
23
- execute(try_vendored_bin(vendored_bin_path, git_bin), *args)
32
+ try_vendored_bin(vendored_bin_path, git_bin)
33
+ end
34
+
35
+ def self.git(*args)
36
+ ensure_bin_present!(git_bin, 'git')
37
+
38
+ execute(git_bin, *args)
24
39
  end
25
40
 
26
41
  def self.bundle(*args)
27
- bundle_bin = Gem.win_platform? ? 'bundle.bat' : 'bundle'
28
- vendored_bin_path = File.join('private', 'ruby', '2.1.9', 'bin', bundle_bin)
42
+ ensure_bin_present!(bundle_bin, 'bundler')
29
43
 
30
- execute(try_vendored_bin(vendored_bin_path, bundle_bin), *args)
44
+ execute(bundle_bin, *args)
31
45
  end
32
46
 
33
47
  def self.bundle_bin
@@ -156,6 +170,7 @@ module PDK
156
170
  stdout: @stdout.read,
157
171
  stderr: @stderr.read,
158
172
  exit_code: @process.exit_code,
173
+ duration: @duration,
159
174
  }
160
175
 
161
176
  return process_data
@@ -169,6 +184,7 @@ module PDK
169
184
  def run_process!
170
185
  command_string = argv.join(' ')
171
186
  PDK.logger.debug(_("Executing '%{command}'") % { command: command_string })
187
+ start_time = Time.now
172
188
  begin
173
189
  @process.start
174
190
  rescue ChildProcess::LaunchError => e
@@ -185,6 +201,7 @@ module PDK
185
201
  # Wait indfinitely if no timeout set.
186
202
  @process.wait
187
203
  end
204
+ @duration = Time.now - start_time
188
205
  end
189
206
  end
190
207
 
@@ -10,8 +10,6 @@ module PDK::CLI
10
10
  option nil, 'license', _('Specifies the license this module is written under. ' \
11
11
  "This should be a identifier from https://spdx.org/licenses/. Common values are 'Apache-2.0', 'MIT', or 'proprietary'."), argument: :required
12
12
 
13
- option nil, 'vcs', _("Specifies the version control driver. Valid values: 'git', 'none'. Default: 'git'."), argument: :required
14
-
15
13
  flag nil, 'skip-interview', _('When specified, skips interactive querying of metadata.')
16
14
 
17
15
  run do |opts, args, _cmd|
@@ -35,7 +33,6 @@ module PDK::CLI
35
33
 
36
34
  opts[:name] = module_name
37
35
  opts[:target_dir] = target_dir.nil? ? module_name : target_dir
38
- opts[:vcs] ||= 'git'
39
36
 
40
37
  PDK.logger.info(_('Creating new module: %{modname}') % { modname: module_name })
41
38
  PDK::Generate::Module.invoke(opts)
@@ -8,6 +8,7 @@ module PDK::CLI
8
8
  summary _('Run unit tests.')
9
9
 
10
10
  flag nil, :list, _('list all available unit tests and their descriptions')
11
+ flag nil, :parallel, _('run unit tests in parallel'), hidden: true
11
12
 
12
13
  option nil, :tests, _('a comma-separated list of tests to run'), argument: :required, default: '' do |values|
13
14
  PDK::CLI::Util::OptionValidator.comma_separated_list?(values)
@@ -19,7 +19,7 @@ module PDK
19
19
  end
20
20
 
21
21
  def num_questions
22
- @questions.count
22
+ (@questions ||= {}).count
23
23
  end
24
24
 
25
25
  def run
@@ -17,6 +17,11 @@ module PDK::CLI
17
17
  flag :a, 'auto-correct', _('automatically correct problems (where possible)')
18
18
 
19
19
  run do |opts, args, _cmd|
20
+ if args == ['help']
21
+ PDK::CLI.run(['validate', '--help'])
22
+ exit 0
23
+ end
24
+
20
25
  validator_names = PDK::Validate.validators.map { |v| v.name }
21
26
  validators = PDK::Validate.validators
22
27
  targets = []
@@ -77,8 +82,8 @@ module PDK::CLI
77
82
  PDK::Util::Bundler.ensure_bundle!
78
83
 
79
84
  validators.each do |validator|
80
- exit_code = validator.invoke(report, options)
81
- break if exit_code != 0
85
+ validator_exit_code = validator.invoke(report, options)
86
+ exit_code = validator_exit_code if validator_exit_code != 0
82
87
  end
83
88
 
84
89
  report_formats.each do |format|
@@ -24,6 +24,18 @@ module PDK
24
24
  raise PDK::CLI::FatalError, _("The destination directory '%{dir}' already exists") % { dir: target_dir }
25
25
  end
26
26
 
27
+ parent_dir = File.dirname(target_dir)
28
+
29
+ begin
30
+ test_file = File.join(parent_dir, '.pdk-test-writable')
31
+ File.open(test_file, 'w') { |f| f.write('This file was created by the Puppet Development Kit to test if this folder was writable, you can safely remove this file.') }
32
+ FileUtils.rm_f(test_file)
33
+ rescue Errno::EACCES
34
+ raise PDK::CLI::FatalError, _("You do not have permission to write to '%{parent_dir}'") % {
35
+ parent_dir: parent_dir,
36
+ }
37
+ end
38
+
27
39
  metadata = prepare_metadata(opts)
28
40
 
29
41
  temp_target_dir = PDK::Util.make_tmpdir_name('pdk-module-target')
@@ -50,7 +62,15 @@ module PDK
50
62
 
51
63
  PDK.answers.update!('template-url' => template_url)
52
64
 
53
- FileUtils.mv(temp_target_dir, target_dir)
65
+ begin
66
+ FileUtils.mv(temp_target_dir, target_dir)
67
+ rescue Errno::EACCES => e
68
+ raise PDK::CLI::FatalError, _("Failed to move '%{source}' to '%{target}': %{message}") % {
69
+ source: temp_target_dir,
70
+ target: target_dir,
71
+ message: e.message,
72
+ }
73
+ end
54
74
  end
55
75
 
56
76
  def self.username_from_login
@@ -97,8 +117,11 @@ module PDK
97
117
  ].each do |dir|
98
118
  begin
99
119
  FileUtils.mkdir_p(dir)
100
- rescue SystemCallError
101
- raise PDK::CLI::FatalError, _("Unable to create directory '%{dir}'") % { dir: dir }
120
+ rescue SystemCallError => e
121
+ raise PDK::CLI::FatalError, _("Unable to create directory '%{dir}': %{message}") % {
122
+ dir: dir,
123
+ message: e.message,
124
+ }
102
125
  end
103
126
  end
104
127
  end
@@ -165,7 +188,7 @@ module PDK
165
188
  },
166
189
  ]
167
190
 
168
- prompt = TTY::Prompt.new
191
+ prompt = TTY::Prompt.new(help_color: :cyan)
169
192
 
170
193
  interview = PDK::CLI::Util::Interview.new(prompt)
171
194
 
@@ -44,7 +44,7 @@ module PDK
44
44
 
45
45
  # @abstract Subclass and implement {#template_data} to provide data to
46
46
  # the templates during rendering. Implementations of this method should
47
- # return a Hash[{Symbol => Object}].
47
+ # return a Hash!{Symbol => Object}.
48
48
  def template_data
49
49
  raise NotImplementedError
50
50
  end
@@ -79,6 +79,7 @@ module PDK
79
79
  # point for the class.
80
80
  #
81
81
  # @raise [PDK::CLI::FatalError] if the target files already exist.
82
+ # @raise [PDK::CLI::FatalError] (see #render_file)
82
83
  #
83
84
  # @api public
84
85
  def run
@@ -105,14 +106,33 @@ module PDK
105
106
  # @param data [Hash{Object => Object}] The data to be provided to the
106
107
  # template when rendering.
107
108
  #
109
+ # @raise [PDK::CLI::FatalError] if the parent directories to `dest_path`
110
+ # do not exist and could not be created.
111
+ # @raise [PDK::CLI::FatalError] if the rendered file could not be written
112
+ # to `dest_path`.
113
+ #
108
114
  # @return [void]
109
115
  #
110
116
  # @api private
111
117
  def render_file(dest_path, template_path, data)
112
118
  PDK.logger.info(_("Creating '%{file}' from template.") % { file: dest_path })
113
119
  file_content = PDK::TemplateFile.new(template_path, data).render
114
- FileUtils.mkdir_p(File.dirname(dest_path))
120
+
121
+ begin
122
+ FileUtils.mkdir_p(File.dirname(dest_path))
123
+ rescue SystemCallError => e
124
+ raise PDK::CLI::FatalError, _("Unable to create directory '%{path}': %{message}") % {
125
+ path: File.dirname(dest_path),
126
+ message: e.message,
127
+ }
128
+ end
129
+
115
130
  File.open(dest_path, 'w') { |f| f.write file_content }
131
+ rescue SystemCallError => e
132
+ raise PDK::CLI::FatalError, _("Unable to write to file '%{path}': %{message}") % {
133
+ path: dest_path,
134
+ message: e.message,
135
+ }
116
136
  end
117
137
 
118
138
  # Search the possible template directories in order of preference to find
data/lib/pdk/logger.rb CHANGED
@@ -7,8 +7,7 @@ module PDK
7
7
 
8
8
  class Logger < ::Logger
9
9
  def initialize
10
- # TODO: Decide where log output goes, probably stderr?
11
- super(STDOUT)
10
+ super(STDERR)
12
11
 
13
12
  # TODO: Decide on output format.
14
13
  self.formatter = proc do |severity, _datetime, _progname, msg|
@@ -30,8 +30,8 @@ module PDK
30
30
  'operatingsystemrelease' => ['16.04'],
31
31
  },
32
32
  {
33
- 'operatingsystem' => 'Windows',
34
- 'operatingsystemrelease' => ['2016'],
33
+ 'operatingsystem' => 'windows',
34
+ 'operatingsystemrelease' => ['2012 R2'],
35
35
  },
36
36
  ],
37
37
  }.freeze
@@ -178,7 +178,7 @@ module PDK
178
178
  end
179
179
 
180
180
  unless File.directory?(@moduleroot_dir) # rubocop:disable Style/GuardClause
181
- raise ArgumentError, _("The template at '%{path}' does not contain a moduleroot directory") % { path: @path }
181
+ raise ArgumentError, _("The template at '%{path}' does not contain a 'moduleroot/' directory") % { path: @path }
182
182
  end
183
183
  end
184
184
 
@@ -6,9 +6,16 @@ require 'json'
6
6
  module PDK
7
7
  module Test
8
8
  class Unit
9
- def self.cmd(_tests)
9
+ def self.cmd(_tests, opts = {})
10
10
  # TODO: test selection
11
- [File.join(PDK::Util.module_root, 'bin', 'rake'), 'spec']
11
+ rake_task = opts.key?(:parallel) ? 'parallel_spec' : 'spec'
12
+ [File.join(PDK::Util.module_root, 'bin', 'rake'), rake_task]
13
+ end
14
+
15
+ def self.parallel_with_no_tests?(ran_in_parallel, json_result, result)
16
+ ran_in_parallel && json_result.empty? &&
17
+ !result[:exit_code].zero? &&
18
+ result[:stderr].strip =~ %r{Pass files or folders to run$}
12
19
  end
13
20
 
14
21
  def self.invoke(report, options = {})
@@ -17,12 +24,13 @@ module PDK
17
24
 
18
25
  tests = options.fetch(:tests)
19
26
 
20
- cmd_argv = cmd(tests)
27
+ cmd_argv = cmd(tests, options)
21
28
  cmd_argv.unshift('ruby') if Gem.win_platform?
22
29
 
23
30
  command = PDK::CLI::Exec::Command.new(*cmd_argv).tap do |c|
24
31
  c.context = :module
25
- c.add_spinner('Running unit tests')
32
+ spinner_msg = options.key?(:parallel) ? _('Running unit tests in parallel') : _('Running unit tests')
33
+ c.add_spinner(spinner_msg)
26
34
  c.environment['CI_SPEC_OPTIONS'] = '--format j'
27
35
  end
28
36
 
@@ -30,20 +38,20 @@ module PDK
30
38
 
31
39
  result = command.execute!
32
40
 
33
- # TODO: cleanup rspec and/or beaker output
34
- # Iterate through possible JSON documents until we find one that is valid.
35
- json_result = nil
41
+ json_result = if options.key?(:parallel)
42
+ PDK::Util.find_all_json_in(result[:stdout])
43
+ else
44
+ PDK::Util.find_first_json_in(result[:stdout])
45
+ end
36
46
 
37
- result[:stdout].scan(%r{\{(?:[^{}]|(?:\g<0>))*\}}x) do |str|
38
- begin
39
- json_result = JSON.parse(str)
40
- break
41
- rescue JSON::ParserError
42
- next
43
- end
47
+ if parallel_with_no_tests?(options.key?(:parallel), json_result, result)
48
+ json_result = [{ 'messages' => ['No examples found.'] }]
49
+ result[:exit_code] = 0
44
50
  end
45
51
 
46
- raise PDK::CLI::FatalError, _('Unit test output did not contain a valid JSON result: %{output}') % { output: result[:stdout] } unless json_result
52
+ raise PDK::CLI::FatalError, _('Unit test output did not contain a valid JSON result: %{output}') % { output: result[:stdout] } if json_result.nil? || json_result.empty?
53
+
54
+ json_result = merge_json_results(json_result, result[:duration]) if options.key?(:parallel)
47
55
 
48
56
  parse_output(report, json_result)
49
57
 
@@ -99,32 +107,68 @@ module PDK
99
107
  }
100
108
  end
101
109
 
110
+ def self.merge_json_results(json_data, duration)
111
+ merged_json_result = {}
112
+
113
+ # Merge messages
114
+ message_set = Set.new
115
+ json_data.each do |json|
116
+ next unless json['messages']
117
+ message_set |= json['messages']
118
+ end
119
+ merged_json_result['messages'] = message_set.to_a
120
+
121
+ # Merge examples
122
+ all_examples = []
123
+ json_data.each do |json|
124
+ next unless json['examples']
125
+ all_examples.concat json['examples']
126
+ end
127
+ merged_json_result['examples'] = all_examples
128
+
129
+ # Merge summaries
130
+ summary_hash = {
131
+ 'duration' => duration,
132
+ 'example_count' => 0,
133
+ 'failure_count' => 0,
134
+ 'pending_count' => 0,
135
+ }
136
+ json_data.each do |json|
137
+ next unless json['summary']
138
+ summary_hash['example_count'] += json['summary']['example_count']
139
+ summary_hash['failure_count'] += json['summary']['failure_count']
140
+ summary_hash['pending_count'] += json['summary']['pending_count']
141
+ end
142
+ merged_json_result['summary'] = summary_hash
143
+
144
+ merged_json_result
145
+ end
146
+
102
147
  # @return array of { :id, :full_description }
103
148
  def self.list
104
149
  PDK::Util::Bundler.ensure_bundle!
105
- PDK::Util::Bundler.ensure_binstubs!('rspec-core')
150
+ PDK::Util::Bundler.ensure_binstubs!('rake')
106
151
 
107
- command_argv = [File.join(PDK::Util.module_root, 'bin', 'rspec'), '--dry-run', '--format', 'json']
152
+ command_argv = [File.join(PDK::Util.module_root, 'bin', 'rake'), 'spec_list_json']
108
153
  command_argv.unshift('ruby') if Gem.win_platform?
109
154
  list_command = PDK::CLI::Exec::Command.new(*command_argv)
110
155
  list_command.context = :module
111
156
  output = list_command.execute!
112
157
 
113
- rspec_json_output = JSON.parse(output[:stdout])
114
- if rspec_json_output['examples'].empty?
115
- rspec_message = rspec_json_output['messages'][0]
158
+ rspec_json = PDK::Util.find_first_json_in(output[:stdout])
159
+ raise PDK::CLI::FatalError, _('Failed to find valid JSON in output from rspec: %{output}' % { output: output[:stdout] }) unless rspec_json
160
+ if rspec_json['examples'].empty?
161
+ rspec_message = rspec_json['messages'][0]
116
162
  return [] if rspec_message == 'No examples found.'
117
163
 
118
164
  raise PDK::CLI::FatalError, _('Unable to enumerate examples. rspec reported: %{message}' % { message: rspec_message })
119
165
  else
120
166
  examples = []
121
- rspec_json_output['examples'].each do |example|
167
+ rspec_json['examples'].each do |example|
122
168
  examples << { id: example['id'], full_description: example['full_description'] }
123
169
  end
124
170
  examples
125
171
  end
126
- rescue JSON::ParserError => e
127
- raise PDK::CLI::FatalError, _('Failed to parse output from rspec: %{message}' % { message: e.message })
128
172
  end
129
173
  end
130
174
  end
data/lib/pdk/util.rb CHANGED
@@ -100,5 +100,57 @@ module PDK
100
100
  end
101
101
  end
102
102
  module_function :module_root
103
+
104
+ # Iterate through possible JSON documents until we find one that is valid.
105
+ #
106
+ # @param [String] text the text in which to find a JSON document
107
+ # @return [Hash, nil] subset of text as Hash of first valid JSON found, or nil if no valid
108
+ # JSON found in the text
109
+ def find_first_json_in(text)
110
+ find_valid_json_in(text)
111
+ end
112
+ module_function :find_first_json_in
113
+
114
+ # Iterate through possible JSON documents for all valid JSON
115
+ #
116
+ # @param [String] text the text in which to find JSON document(s)
117
+ # @return [Array<Hash>] subset of text as Array of all JSON object found, empty Array if none are found
118
+ # JSON found in the text
119
+ def find_all_json_in(text)
120
+ find_valid_json_in(text, break_on_first: false)
121
+ end
122
+ module_function :find_all_json_in
123
+
124
+ # Iterate through possible JSON documents until we find one that is valid.
125
+ #
126
+ # @param [String] text the text in which to find a JSON document
127
+ # @param [Hash] opts options
128
+ # @option opts [Boolean] :break_on_first Whether or not to break after valid JSON is found, defaults to true
129
+ #
130
+ # @return [Hash, Array<Hash>, nil] subset of text as Hash of first valid JSON found, array of all valid JSON found, or nil if no valid
131
+ # JSON found in the text
132
+ #
133
+ # @private
134
+ def find_valid_json_in(text, opts = {})
135
+ break_on_first = opts.key?(:break_on_first) ? opts[:break_on_first] : true
136
+
137
+ json_result = break_on_first ? nil : []
138
+
139
+ text.scan(%r{\{(?:[^{}]|(?:\g<0>))*\}}x) do |str|
140
+ begin
141
+ if break_on_first
142
+ json_result = JSON.parse(str)
143
+ break
144
+ else
145
+ json_result.push(JSON.parse(str))
146
+ end
147
+ rescue JSON::ParserError
148
+ next
149
+ end
150
+ end
151
+
152
+ json_result
153
+ end
154
+ module_function :find_valid_json_in
103
155
  end
104
156
  end
@@ -1,4 +1,5 @@
1
1
  require 'bundler'
2
+ require 'fileutils'
2
3
  require 'tty-spinner'
3
4
  require 'pdk/util'
4
5
  require 'pdk/cli/exec'
@@ -22,8 +23,20 @@ module PDK
22
23
  end
23
24
 
24
25
  unless bundle.locked?
25
- unless bundle.lock!
26
- raise PDK::CLI::FatalError, _('Unable to resolve Gemfile dependencies.')
26
+ if PDK::Util.package_install?
27
+ # In packaged installs, try to use vendored Gemfile.lock as a starting point.
28
+ # The 'bundle install' below will pick up any new dependencies.
29
+ vendored_gemfile_lock = File.join(PDK::Util.package_cachedir, 'Gemfile.lock')
30
+
31
+ if File.exist?(vendored_gemfile_lock)
32
+ PDK.logger.debug(_("No Gemfile.lock found in module, using vendored Gemfile.lock from '%{source}'") % { source: vendored_gemfile_lock })
33
+ FileUtils.cp(vendored_gemfile_lock, File.join(PDK::Util.module_root, 'Gemfile.lock'))
34
+ end
35
+ else
36
+ # In non-packaged installs, just let bundler resolve deps as normal.
37
+ unless bundle.lock!
38
+ raise PDK::CLI::FatalError, _('Unable to resolve Gemfile dependencies.')
39
+ end
27
40
  end
28
41
  end
29
42
 
@@ -62,14 +75,12 @@ module PDK
62
75
  end
63
76
 
64
77
  def installed?
78
+ PDK.logger.debug(_('Checking for missing Gemfile dependencies.'))
79
+
65
80
  argv = ['check', "--gemfile=#{gemfile}"]
66
81
  argv << "--path=#{bundle_cachedir}" if PDK::Util.gem_install?
67
82
 
68
- command = bundle_command(*argv).tap do |c|
69
- c.add_spinner(_('Checking for missing Gemfile dependencies'))
70
- end
71
-
72
- result = command.execute!
83
+ result = bundle_command(*argv).execute!
73
84
 
74
85
  unless result[:exit_code].zero?
75
86
  $stderr.puts result[:stdout]
@@ -76,7 +76,7 @@ module PDK
76
76
  parse_output(report, result, invokation_targets)
77
77
  end
78
78
 
79
- exit_codes.sort.last
79
+ exit_codes.max
80
80
  end
81
81
  end
82
82
  end
@@ -31,6 +31,7 @@ module PDK
31
31
 
32
32
  def self.parse_options(_options, targets)
33
33
  cmd_options = ['--format', 'json']
34
+ cmd_options << '--strict-dependencies'
34
35
 
35
36
  cmd_options.concat(targets)
36
37
  end
data/lib/pdk/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module PDK
2
- VERSION = '0.5.0'.freeze
2
+ VERSION = '0.6.0'.freeze
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pdk
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.0
4
+ version: 0.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Puppet, Inc.
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-07-20 00:00:00.000000000 Z
11
+ date: 2017-08-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -108,6 +108,20 @@ dependencies:
108
108
  - - "~>"
109
109
  - !ruby/object:Gem::Version
110
110
  version: 2.1.0
111
+ - !ruby/object:Gem::Dependency
112
+ name: tty-which
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: 0.3.0
118
+ type: :runtime
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: 0.3.0
111
125
  - !ruby/object:Gem::Dependency
112
126
  name: deep_merge
113
127
  requirement: !ruby/object:Gem::Requirement
@@ -202,7 +216,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
202
216
  version: '0'
203
217
  requirements: []
204
218
  rubyforge_project:
205
- rubygems_version: 2.5.2
219
+ rubygems_version: 2.2.5
206
220
  signing_key:
207
221
  specification_version: 4
208
222
  summary: A key part of the Puppet Development Kit, the shortest path to better modules