rspec-puppet-utils 3.1.0 → 3.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +38 -13
- data/lib/rspec_puppet_utils/rake/project_tasks.rb +49 -37
- data/rspec-puppet-utils.gemspec +2 -2
- data/spec/classes/rake/project_tasks_spec.rb +50 -28
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6408456fd57f31f7a1dac8a2e5d2f77abce8ec74
|
4
|
+
data.tar.gz: 4c315ea6bd272943af43901067793efd9e5b842c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bfcc051e951a036c1a9037555f74e7be1a5de6b0a2310005013d97ff9f1c32a4ed03aeb8f10516952cbf3b541395940c8d98bd81db62f4efc2847ac047389a4a
|
7
|
+
data.tar.gz: 0aceea0bb7188ceff7ee84338de98310beded94f938f9e1ae5a6aec01f369dddd1b8444f0b739b0294cdd4dd9a80234cae8cc1911261027cf1fac4ea0910e83c
|
data/README.md
CHANGED
@@ -247,12 +247,11 @@ For more about usage see the [wiki page](../../wiki/Hiera-Data-Validator)
|
|
247
247
|
|
248
248
|
The `Rake::Puppet` class provides tasks that handle testing and building a Puppet project.
|
249
249
|
|
250
|
-
##### Usage
|
250
|
+
##### Usage
|
251
251
|
|
252
252
|
An example `Rakefile` might look like this:
|
253
253
|
|
254
254
|
```ruby
|
255
|
-
require 'rake'
|
256
255
|
require 'rspec_puppet_utils/rake/project_tasks'
|
257
256
|
|
258
257
|
puppet = Rake::Puppet.new
|
@@ -260,15 +259,15 @@ puppet.package_version = '1.0.0'
|
|
260
259
|
puppet.load_tasks
|
261
260
|
```
|
262
261
|
|
263
|
-
Running `rake -T`
|
262
|
+
Running `rake -T` should now show a list of spec and build tasks:
|
264
263
|
|
265
264
|
```bash
|
266
265
|
$ rake -T
|
267
266
|
rake build # Build puppet.zip v1.0.0
|
268
267
|
rake quick_build # Build puppet.zip v1.0.0 without tests
|
269
268
|
rake spec # Run specs in all modules
|
270
|
-
rake
|
271
|
-
rake
|
269
|
+
rake <mod a>:spec # Run <mod a> module specs
|
270
|
+
rake <mod b>:spec # Run <mod b> module specs
|
272
271
|
...
|
273
272
|
```
|
274
273
|
|
@@ -281,10 +280,40 @@ In the example above `package_version` is set as it's a required field. The othe
|
|
281
280
|
- module_path - The directory containing all the modules to test (default: 'modules')
|
282
281
|
- excluded_modules - Modules to exclude from rspec testing (default: [])
|
283
282
|
- package_dir - Where the puppet zip package will be created (default: 'pkg')
|
284
|
-
- package_files - Files and directories to include in the package (default: ['modules', 'modules-lib', '
|
283
|
+
- package_files - Files and directories to include in the package (default: ['modules', 'modules-lib', 'environment.conf'])
|
285
284
|
- package_versioning - Is the version included in the package name? (default: true)
|
286
285
|
|
287
|
-
#####
|
286
|
+
##### Setup
|
287
|
+
|
288
|
+
The `spec` task for each module actually just executes the `spec` task defined in the module's Rakefile,
|
289
|
+
and the `Rake::Puppet` class will filter out modules that dont have a Rakefile,
|
290
|
+
|
291
|
+
Therefore each module needs the following two files:
|
292
|
+
|
293
|
+
```ruby
|
294
|
+
# <mod>/Rakefile
|
295
|
+
require 'puppetlabs_spec_helper/rake_tasks'
|
296
|
+
```
|
297
|
+
|
298
|
+
```ruby
|
299
|
+
# <mod>/spec/spec_helper.rb
|
300
|
+
require 'rspec-puppet-utils'
|
301
|
+
require 'puppetlabs_spec_helper/module_spec_helper'
|
302
|
+
```
|
303
|
+
|
304
|
+
Extra content/tasks/options/etc can be added to these files, but this is the suggested minimum
|
305
|
+
|
306
|
+
In order for the `modules-lib` modules to be available to the Puppet server, each environment will need an `environment.conf` file to set the module path,
|
307
|
+
therefore an `environment.conf` file should be present in the project root:
|
308
|
+
|
309
|
+
```
|
310
|
+
# environment.conf
|
311
|
+
modulepath = ./modules:./modules-lib:$basemodulepath
|
312
|
+
```
|
313
|
+
|
314
|
+
Again, other settings can be changed, this is just the minimum to get the modules-lib pattern working
|
315
|
+
|
316
|
+
##### NB
|
288
317
|
|
289
318
|
The `package_files` list is setup for the modules-lib pattern by default. In this pattern external (e.g. Puppet Forge) modules are installed in a separate 'modules-lib', leaving the 'modules' dir for project modules such as 'components', 'profiles', 'role', etc.
|
290
319
|
If you're not using this pattern then just provide a new array for `package_files`.
|
@@ -293,12 +322,8 @@ Running the `build` or `quick_build` tasks will delete any existing builds in th
|
|
293
322
|
This is so the same build task can be run over and over on a build server (e.g. Jenkins) without filling up the disk.
|
294
323
|
It also guarantees that the binary at the end of a build was just built, and wasn't left over from a previous build.
|
295
324
|
|
296
|
-
##### ToDo
|
325
|
+
##### ToDo
|
297
326
|
|
298
|
-
Currently the `spec` task runs all the `
|
327
|
+
Currently the `spec` task runs all the `<module>:spec` tasks. If one of these fails then none of the subsequent tasks will run. This isn't ideal!
|
299
328
|
|
300
329
|
The zip commands need to be replaced by ruby zip library to avoid shelling out, this helps with support for Windows environments
|
301
|
-
|
302
|
-
### Module Tasks
|
303
|
-
|
304
|
-
WIP
|
@@ -27,88 +27,100 @@ module Rake
|
|
27
27
|
@excluded_dirs = ['.', '..']
|
28
28
|
@excluded_modules = []
|
29
29
|
@package_dir = 'pkg'
|
30
|
-
@package_files = ['modules', 'modules-lib', '
|
30
|
+
@package_files = ['modules', 'modules-lib', 'environment.conf']
|
31
31
|
@package_name = 'puppet'
|
32
32
|
@package_version = nil
|
33
33
|
@package_versioning = true
|
34
34
|
end
|
35
35
|
|
36
36
|
def load_tasks
|
37
|
-
|
37
|
+
load_module_tasks
|
38
38
|
load_build_tasks
|
39
39
|
end
|
40
40
|
|
41
41
|
def testable_modules
|
42
42
|
raise ArgumentError, 'Excluded modules must be an array' unless @excluded_modules.is_a? Array
|
43
43
|
module_dirs = Dir.entries(@module_path) - @excluded_dirs - @excluded_modules
|
44
|
-
module_dirs
|
44
|
+
filter_modules module_dirs
|
45
|
+
end
|
46
|
+
|
47
|
+
def filter_modules(module_dirs)
|
48
|
+
module_dirs.select! { |m| module_has_specs?(m) and module_has_rakefile?(m) }
|
45
49
|
module_dirs
|
46
50
|
end
|
47
51
|
|
48
|
-
def
|
52
|
+
def module_has_specs?(module_dir)
|
53
|
+
File.directory?("#{@module_path}/#{module_dir}/spec")
|
54
|
+
end
|
49
55
|
|
50
|
-
|
51
|
-
|
56
|
+
def module_has_rakefile?(module_dir)
|
57
|
+
rakefiles = ['rakefile', 'rakefile.rb']
|
58
|
+
entries = Dir.entries("#{@module_path}/#{module_dir}")
|
59
|
+
entries.collect! { |f| f.downcase }
|
60
|
+
rakefiles.each { |rf| return true if entries.include? rf }
|
61
|
+
false
|
62
|
+
end
|
52
63
|
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
64
|
+
def load_module_tasks
|
65
|
+
|
66
|
+
modules = testable_modules
|
67
|
+
spec_tasks = modules.collect { |m| "#{m}:#{:spec}" }
|
68
|
+
# lint_tasks = modules.collect { |m| "#{m}:#{:lint}" }
|
69
|
+
|
70
|
+
modules.each { |puppet_module|
|
71
|
+
namespace puppet_module do
|
57
72
|
|
58
73
|
desc "Run #{puppet_module} module specs"
|
59
|
-
|
60
|
-
|
61
|
-
|
74
|
+
task :spec do
|
75
|
+
Dir.chdir "#{@module_path}/#{puppet_module}" do
|
76
|
+
success = system('rake spec') # This isn't perfect but ...
|
77
|
+
exit success ? 0 : 1
|
78
|
+
end
|
62
79
|
end
|
63
|
-
|
64
|
-
|
80
|
+
|
81
|
+
end
|
82
|
+
}
|
83
|
+
|
84
|
+
# desc 'Run lint checks for all modules'
|
85
|
+
# task :lint => lint_tasks
|
65
86
|
|
66
87
|
desc 'Run specs in all modules'
|
67
|
-
task :spec =>
|
88
|
+
task :spec => spec_tasks
|
68
89
|
task :default => :spec
|
90
|
+
|
69
91
|
end
|
70
92
|
|
71
93
|
def load_build_tasks
|
72
94
|
|
73
95
|
raise(ArgumentError, 'Please provide a package_version (e.g. "1.0.0")') if @package_version.nil?
|
74
96
|
|
75
|
-
# The build_dir (i.e. 'puppet') is the root dir of the files when the zip is extracted
|
76
|
-
build_dir = "#{@package_dir}/puppet"
|
77
97
|
full_package_name = @package_versioning ? "puppet-#{@package_version}.zip" : 'puppet.zip'
|
78
98
|
package_desc = @package_versioning ? full_package_name : "#{full_package_name} v#{@package_version}"
|
99
|
+
package_path = "#{@package_dir}/#{full_package_name}"
|
79
100
|
|
80
101
|
namespace :build do
|
81
102
|
|
82
103
|
# Preps build directory
|
83
104
|
task :prep do
|
84
105
|
puts 'Preparing build'
|
85
|
-
FileUtils.
|
86
|
-
FileUtils.
|
87
|
-
@package_files.each {|f|
|
88
|
-
if File.exist? f
|
89
|
-
puts "Copying #{f} to #{build_dir}"
|
90
|
-
FileUtils.cp_r f, build_dir
|
91
|
-
else
|
92
|
-
fail "Could not find #{f} file or directory: Ensure that the package_files list is correct"
|
93
|
-
end
|
94
|
-
}
|
106
|
+
FileUtils.mkdir_p @package_dir
|
107
|
+
FileUtils.rm package_path if File.exist?(package_path)
|
95
108
|
end
|
96
109
|
|
97
110
|
task :package => [:prep] do
|
98
|
-
# Exclude
|
99
|
-
exclude_patterns = '
|
100
|
-
|
101
|
-
|
111
|
+
# Exclude all the spec code as it's not needed once deployed
|
112
|
+
exclude_patterns = ['modules/\*/spec/\*', 'modules-lib/\*/spec/\*']
|
113
|
+
exclude_string = "-x #{exclude_patterns.join(' ')}"
|
114
|
+
include_string = @package_files.join(' ')
|
115
|
+
cmd = "zip -qr #{package_path} #{include_string} #{exclude_string}"
|
116
|
+
success = system(cmd)
|
117
|
+
exit 1 unless success
|
102
118
|
end
|
103
119
|
|
104
|
-
task :cleanup do
|
105
|
-
puts "Cleaning up #{build_dir}/"
|
106
|
-
FileUtils.rm_r build_dir if File.exist?(build_dir)
|
107
|
-
end
|
108
120
|
end
|
109
121
|
|
110
122
|
desc "Build #{package_desc} without tests"
|
111
|
-
task :quick_build =>
|
123
|
+
task :quick_build => 'build:package' do
|
112
124
|
puts "Built #{package_desc}"
|
113
125
|
end
|
114
126
|
|
data/rspec-puppet-utils.gemspec
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
2
|
Gem::Specification.new do |gem|
|
3
3
|
gem.name = 'rspec-puppet-utils'
|
4
|
-
gem.version = '3.
|
4
|
+
gem.version = '3.2.0'
|
5
5
|
gem.description = 'Helper classes for mock/stub functions, templates and hieradata'
|
6
6
|
gem.summary = ''
|
7
7
|
gem.author = 'Tom Poulton'
|
@@ -12,7 +12,7 @@ Gem::Specification.new do |gem|
|
|
12
12
|
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
13
13
|
gem.require_paths = ['lib']
|
14
14
|
|
15
|
-
gem.add_dependency('puppet'
|
15
|
+
gem.add_dependency('puppet')
|
16
16
|
gem.add_dependency('rspec')
|
17
17
|
gem.add_dependency('rspec-puppet')
|
18
18
|
gem.add_dependency('puppetlabs_spec_helper')
|
@@ -6,6 +6,7 @@ describe Rake::Puppet do
|
|
6
6
|
module_path = 'modules'
|
7
7
|
testable_modules = [ 'core', 'base' ]
|
8
8
|
modules_dir_list = [ 'core', 'base', 'role', 'profiles' ]
|
9
|
+
rakefile_names = ['Rakefile', 'rakefile', 'Rakefile.rb', 'rakefile.rb']
|
9
10
|
|
10
11
|
let(:puppet) { Rake::Puppet.new }
|
11
12
|
|
@@ -16,7 +17,7 @@ describe Rake::Puppet do
|
|
16
17
|
expect(puppet.package_files.count).to eq initial_count + 1
|
17
18
|
end
|
18
19
|
|
19
|
-
describe '
|
20
|
+
describe 'load_module_tasks' do
|
20
21
|
|
21
22
|
before(:each) do
|
22
23
|
puppet.stubs(:testable_modules).returns(testable_modules) # not exactly best practice, but hey
|
@@ -24,18 +25,18 @@ describe Rake::Puppet do
|
|
24
25
|
|
25
26
|
it 'includes namespace and task methods from Rake::DSL' do
|
26
27
|
# It would throw error on load if task or namespace methods are missing
|
27
|
-
expect { puppet.
|
28
|
+
expect { puppet.load_module_tasks }.to_not raise_error
|
28
29
|
end
|
29
30
|
|
30
31
|
it 'creates a task for each module' do
|
31
|
-
puppet.
|
32
|
+
puppet.load_module_tasks
|
32
33
|
testable_modules.each { |mod|
|
33
|
-
expect(Rake::Task.task_defined?("
|
34
|
+
expect(Rake::Task.task_defined?("#{mod}:spec")).to eq true
|
34
35
|
}
|
35
36
|
end
|
36
37
|
|
37
38
|
it 'loads the main spec task' do
|
38
|
-
puppet.
|
39
|
+
puppet.load_module_tasks
|
39
40
|
expect(Rake::Task.task_defined?(:spec)).to eq true
|
40
41
|
end
|
41
42
|
|
@@ -94,37 +95,57 @@ describe Rake::Puppet do
|
|
94
95
|
|
95
96
|
end
|
96
97
|
|
97
|
-
describe '
|
98
|
+
describe 'filter_modules' do
|
98
99
|
|
99
|
-
|
100
|
-
Dir.stubs(:entries).
|
100
|
+
before(:each) do
|
101
|
+
Dir.stubs(:entries).returns []
|
102
|
+
end
|
101
103
|
|
102
|
-
|
104
|
+
it 'filters modules with a spec directory' do
|
105
|
+
Dir.stubs(:entries).returns rakefile_names # bypass Rakefile filter
|
106
|
+
|
107
|
+
File.stubs(:directory?).returns false
|
103
108
|
File.stubs(:directory?).with(regexp_matches( /(#{testable_modules.join '|'})\/spec$/ )).returns(true)
|
104
109
|
|
105
|
-
result = puppet.
|
110
|
+
result = puppet.filter_modules modules_dir_list
|
106
111
|
expect(result).to match_array testable_modules
|
107
112
|
end
|
108
113
|
|
109
|
-
|
110
|
-
|
114
|
+
rakefile_names.each { |filename|
|
115
|
+
it 'filters modules with a Rakefile' do
|
116
|
+
File.stubs(:directory?).returns true # bypass spec dir filter
|
111
117
|
|
112
|
-
|
113
|
-
testable_modules.each { |m|
|
114
|
-
File.expects(:directory?).with(regexp_matches( /#{alt_module_path}\/#{m}/ )).returns(true)
|
115
|
-
}
|
118
|
+
Dir.stubs(:entries).with(regexp_matches( /#{testable_modules.join '|'}/ )).returns([filename])
|
116
119
|
|
117
|
-
|
118
|
-
|
120
|
+
result = puppet.filter_modules modules_dir_list
|
121
|
+
expect(result).to match_array testable_modules
|
122
|
+
end
|
123
|
+
}
|
124
|
+
|
125
|
+
end
|
126
|
+
|
127
|
+
describe 'testable_modules' do
|
128
|
+
|
129
|
+
before(:each) do
|
130
|
+
# Bypass the filter logic. Again, not exactly best practice, but hey
|
131
|
+
def puppet.filter_modules(_modules)
|
132
|
+
_modules
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
it 'ignores excluded directories' do
|
137
|
+
Dir.stubs(:entries).with(module_path).returns testable_modules + ['.', '..']
|
138
|
+
|
139
|
+
result = puppet.testable_modules
|
140
|
+
expect(result).to match_array testable_modules
|
119
141
|
end
|
120
142
|
|
121
143
|
it 'ignores excluded modules' do
|
122
|
-
Dir.stubs(:entries).with(module_path).returns testable_modules
|
123
|
-
File.stubs(:directory?).returns(true)
|
144
|
+
Dir.stubs(:entries).with(module_path).returns testable_modules + ['exclude_me']
|
124
145
|
|
125
|
-
puppet.excluded_modules = ['
|
146
|
+
puppet.excluded_modules = ['exclude_me']
|
126
147
|
result = puppet.testable_modules
|
127
|
-
expect(result).to match_array
|
148
|
+
expect(result).to match_array testable_modules
|
128
149
|
end
|
129
150
|
|
130
151
|
it 'throws error if excluded modules is not an array' do
|
@@ -132,14 +153,15 @@ describe Rake::Puppet do
|
|
132
153
|
expect { puppet.testable_modules }.to raise_error(ArgumentError, /must be an array/)
|
133
154
|
end
|
134
155
|
|
135
|
-
it '
|
136
|
-
|
137
|
-
File.stubs(:directory?).returns(true)
|
156
|
+
it 'finds modules within module_path' do
|
157
|
+
alt_module_path = 'modules-alt'
|
138
158
|
|
139
|
-
|
140
|
-
|
159
|
+
Dir.expects(:entries).with(alt_module_path).returns modules_dir_list
|
160
|
+
|
161
|
+
puppet.module_path = alt_module_path
|
162
|
+
puppet.testable_modules
|
141
163
|
end
|
142
164
|
|
143
165
|
end
|
144
166
|
|
145
|
-
end
|
167
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rspec-puppet-utils
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.
|
4
|
+
version: 3.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tom Poulton
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-04-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: puppet
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
19
|
+
version: '0'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '
|
26
|
+
version: '0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rspec
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|