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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 924d4f298027f823e62dea1fb2c6b5aaee469b61
4
- data.tar.gz: 7b0f41dbb693412266edc0d75f4f50db282bc9ff
3
+ metadata.gz: 6408456fd57f31f7a1dac8a2e5d2f77abce8ec74
4
+ data.tar.gz: 4c315ea6bd272943af43901067793efd9e5b842c
5
5
  SHA512:
6
- metadata.gz: 3de55b7778ccaf128ff7ac8630e076dc6eb0c981dde9bb43f5de612977154a5554bb6ce94e32cd2b501062fead337c37b8d713dc1c708bc40c707e6971af47ff
7
- data.tar.gz: 2367547ae235d27906bfff7b1e5647cc7ef272ad7dd6169362815813ae740cb8cf5b75cb91ea3e8e2ca751fec455081d84cfc36c68efa9fc478f15513f422f05
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` afterwords should show a list of spec and build tasks:
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 spec:<mod a> # Run <mod a> module specs
271
- rake spec:<mod b> # Run <mod b> module specs
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', 'config/environment.conf'])
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
- ##### NB:
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 `spec:<module>` tasks. If one of these fails then none of the subsequent tasks will run. This isn't ideal!
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', 'config/environment.conf']
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
- load_spec_tasks
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.select! {|e| File.directory?("#{@module_path}/#{e}/spec") }
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 load_spec_tasks
52
+ def module_has_specs?(module_dir)
53
+ File.directory?("#{@module_path}/#{module_dir}/spec")
54
+ end
49
55
 
50
- modules = testable_modules
51
- module_tasks = modules.collect { |m| "#{:spec}:#{m}" }
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
- namespace :spec do
54
- modules.each { |puppet_module|
55
- module_root = "#{@module_path}/#{puppet_module}"
56
- opts_path = "#{module_root}/spec/spec.opts"
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
- RSpec::Core::RakeTask.new puppet_module do |t|
60
- t.ruby_opts = "-C#{module_root}"
61
- t.rspec_opts = File.exists?(opts_path) ? File.read(opts_path).chomp : ''
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
- end
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 => module_tasks
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.rm_r @package_dir if File.exist?(@package_dir)
86
- FileUtils.mkdir_p build_dir
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 modules' spec directories as they're not needed once deployed
99
- exclude_patterns = '-x puppet/modules/\*/spec/\* puppet/modules-lib/\*/spec/\*'
100
- cmds = ["cd #{@package_dir}", '&&', "zip -qr #{full_package_name} . #{exclude_patterns}", '&&', 'cd -']
101
- puts `#{cmds.join(' ')}`
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 => ['build:package', 'build:cleanup'] do
123
+ task :quick_build => 'build:package' do
112
124
  puts "Built #{package_desc}"
113
125
  end
114
126
 
@@ -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.1.0'
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', '>= 3')
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 'load_spec_tasks' do
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.load_spec_tasks }.to_not raise_error
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.load_spec_tasks
32
+ puppet.load_module_tasks
32
33
  testable_modules.each { |mod|
33
- expect(Rake::Task.task_defined?("spec:#{mod}")).to eq true
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.load_spec_tasks
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 'testable_modules' do
98
+ describe 'filter_modules' do
98
99
 
99
- it 'finds modules with a spec directory' do
100
- Dir.stubs(:entries).with(module_path).returns modules_dir_list.clone
100
+ before(:each) do
101
+ Dir.stubs(:entries).returns []
102
+ end
101
103
 
102
- File.stubs(:directory?).returns(false)
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.testable_modules
110
+ result = puppet.filter_modules modules_dir_list
106
111
  expect(result).to match_array testable_modules
107
112
  end
108
113
 
109
- it 'finds modules within module_path' do
110
- alt_module_path = 'modules-alt'
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
- Dir.expects(:entries).with(alt_module_path).returns testable_modules
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
- puppet.module_path = alt_module_path
118
- puppet.testable_modules
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.clone
123
- File.stubs(:directory?).returns(true)
144
+ Dir.stubs(:entries).with(module_path).returns testable_modules + ['exclude_me']
124
145
 
125
- puppet.excluded_modules = ['core']
146
+ puppet.excluded_modules = ['exclude_me']
126
147
  result = puppet.testable_modules
127
- expect(result).to match_array ['base']
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 'ignores excluded directories' do
136
- Dir.stubs(:entries).with(module_path).returns testable_modules + ['.', '..']
137
- File.stubs(:directory?).returns(true)
156
+ it 'finds modules within module_path' do
157
+ alt_module_path = 'modules-alt'
138
158
 
139
- result = puppet.testable_modules
140
- expect(result).to match_array testable_modules
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.1.0
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-02-02 00:00:00.000000000 Z
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: '3'
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: '3'
26
+ version: '0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rspec
29
29
  requirement: !ruby/object:Gem::Requirement