chefspec 1.2.0 → 1.3.0

Sign up to get free protection for your applications and to get access to all the features.
data/lib/chefspec.rb CHANGED
@@ -20,9 +20,15 @@ if defined?(RSpec)
20
20
  require 'chefspec/matchers/env'
21
21
  require 'chefspec/matchers/include_recipe'
22
22
  require 'chefspec/matchers/script'
23
+
24
+ require 'chefspec/helpers/describe'
25
+ RSpec.configure do |c|
26
+ c.include ChefSpec::Helpers::Describe
27
+ end
23
28
  end
24
29
 
25
30
  require 'chefspec/minitest'
31
+ require 'chefspec/monkey_patches/conditional'
26
32
  require 'chefspec/monkey_patches/hash'
27
33
  require 'chefspec/monkey_patches/lwrp_base'
28
34
  require 'chefspec/monkey_patches/provider'
@@ -22,6 +22,7 @@ module ChefSpec
22
22
  attr_reader :step_into
23
23
  attr_reader :run_context
24
24
  attr_reader :node
25
+ attr_reader :stubbed_commands
25
26
 
26
27
  # Instantiate a new runner to run examples with.
27
28
  #
@@ -33,7 +34,13 @@ module ChefSpec
33
34
  # @option options [String] :ohai_data_path Path of a json file that will be passed to fauxhai as :path option
34
35
  # @yield [node] Configuration block for Chef::Node
35
36
  def initialize(options={})
36
- defaults = {:cookbook_path => default_cookbook_path, :log_level => :warn, :dry_run => false, :step_into => []}
37
+ defaults = {
38
+ :cookbook_path => default_cookbook_path,
39
+ :log_level => :warn,
40
+ :dry_run => false,
41
+ :step_into => [],
42
+ :evaluate_guards => false
43
+ }
37
44
  options = {:cookbook_path => options} unless options.respond_to?(:to_hash) # backwards-compatibility
38
45
  @options = defaults.merge(options)
39
46
 
@@ -41,6 +48,24 @@ module ChefSpec
41
48
  @resources = []
42
49
  @step_into = @options[:step_into]
43
50
  @do_dry_run = @options[:dry_run]
51
+ @evaluate_guards = @options[:evaluate_guards]
52
+ @actually_run_shell_guards = @options[:actually_run_shell_guards]
53
+ @stubbed_commands = []
54
+
55
+ Chef::Resource::Conditional.class_eval do
56
+ if self.class.methods.include?(:class_variable_set)
57
+ self.class_variable_set :@@runner, the_runner
58
+ else
59
+ @@runner = the_runner
60
+ end
61
+ def runner
62
+ if self.class.methods.include?(:class_variable_get)
63
+ self.class.send(:class_variable_get, :@@runner)
64
+ else
65
+ @@runner
66
+ end
67
+ end
68
+ end
44
69
 
45
70
  Chef::Resource.class_eval do
46
71
  alias :old_run_action :run_action unless method_defined?(:old_run_action)
@@ -59,6 +84,16 @@ module ChefSpec
59
84
  @@runner
60
85
  end
61
86
 
87
+ if runner.evaluate_guards?
88
+ if self.respond_to?(:should_skip?) # Chef >= 0.10
89
+ if self.method(:should_skip?).arity == 1
90
+ return if self.should_skip?(action)
91
+ else
92
+ return if self.should_skip?
93
+ end
94
+ end
95
+ end
96
+
62
97
  if runner.step_into.include?(self.resource_name.to_s)
63
98
  # Ignore not_if / only_if guards
64
99
  if self.only_if.is_a?(Array) # 0.10.x
@@ -82,6 +117,11 @@ module ChefSpec
82
117
  Chef::Config[:cookbook_path] = cookbook_paths
83
118
  Chef::Config[:client_key] = nil
84
119
 
120
+ # it should be saved to an instance variable to prevent automatic
121
+ # unlinking during garbage collection
122
+ @dummy_config = Tempfile.new 'chef-config'
123
+ Chef::Config[:config_file] = @dummy_config.path
124
+
85
125
  # As of Chef 11, Chef uses custom formatters which munge the RSpec output.
86
126
  # This uses a custom formatter which basically tells Chef to shut up.
87
127
  Chef::Config.add_formatter('chefspec') if Chef::Config.respond_to?(:add_formatter)
@@ -97,6 +137,15 @@ module ChefSpec
97
137
  end
98
138
  end
99
139
 
140
+ def stub_command(command, result)
141
+ # We want to preserve insertion order so that stubs are applied in a
142
+ # known order. Ruby 1.9 hashes behave like this but we are still
143
+ # supporting 1.8.
144
+ @stubbed_commands.reject!{|existing_cmd, _| existing_cmd == command}
145
+ @stubbed_commands << [command, result]
146
+ self
147
+ end
148
+
100
149
  # Run the specified recipes, but without actually converging the node.
101
150
  #
102
151
  # @param [array] recipe_names The names of the recipes to execute
@@ -126,6 +175,14 @@ module ChefSpec
126
175
  self
127
176
  end
128
177
 
178
+ def evaluate_guards?
179
+ !! @evaluate_guards
180
+ end
181
+
182
+ def actually_run_shell_guards?
183
+ !! @actually_run_shell_guards
184
+ end
185
+
129
186
  FILE_RESOURCES = %w(directory cookbook_file file template link remote_directory remote_file)
130
187
  PACKAGE_RESOURCES = %w(package apt_package dpkg_package easy_install_package freebsd_package macports_package portage_package rpm_package chef_gem solaris_package yum_package zypper_package)
131
188
  SCRIPT_RESOURCES = %w(script powershell bash csh perl python ruby)
@@ -0,0 +1,13 @@
1
+ module ChefSpec
2
+ module Helpers
3
+ module Describe
4
+ def described_recipe
5
+ self.class.metadata[:example_group][:description_args].first
6
+ end
7
+
8
+ def described_cookbook
9
+ described_recipe.split('::').first
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,19 @@
1
+ class Chef
2
+ class Resource
3
+ class Conditional
4
+ alias_method :original_evaluate_command, :evaluate_command
5
+ def evaluate_command
6
+ runner.stubbed_commands.each do |stubbed_cmd, result|
7
+ case command
8
+ when stubbed_cmd then return result
9
+ end
10
+ end
11
+ if runner.actually_run_shell_guards?
12
+ return original_evaluate_command
13
+ end
14
+ raise RSpec::Mocks::MockExpectationError.new(
15
+ "The following shell guard was unstubbed: #{description}")
16
+ end
17
+ end
18
+ end
19
+ end
@@ -1,4 +1,4 @@
1
1
  module ChefSpec
2
2
  # The gem version
3
- VERSION = '1.2.0'
3
+ VERSION = '1.3.0'
4
4
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: chefspec
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.0
4
+ version: 1.3.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-05-17 00:00:00.000000000 Z
12
+ date: 2013-06-06 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: chef
@@ -201,29 +201,31 @@ extra_rdoc_files: []
201
201
  files:
202
202
  - lib/chef/formatters/chefspec.rb
203
203
  - lib/chef/knife/cookbook_create_specs.rb
204
+ - lib/chefspec.rb
204
205
  - lib/chefspec/chef_runner.rb
206
+ - lib/chefspec/helpers/describe.rb
207
+ - lib/chefspec/minitest.rb
208
+ - lib/chefspec/monkey_patches/lwrp_base.rb
209
+ - lib/chefspec/monkey_patches/hash.rb
210
+ - lib/chefspec/monkey_patches/conditional.rb
211
+ - lib/chefspec/monkey_patches/provider.rb
212
+ - lib/chefspec/version.rb
213
+ - lib/chefspec/matchers/file_content.rb
214
+ - lib/chefspec/matchers/ruby_block.rb
215
+ - lib/chefspec/matchers/execute.rb
205
216
  - lib/chefspec/matchers/cron.rb
217
+ - lib/chefspec/matchers/link.rb
218
+ - lib/chefspec/matchers/user.rb
206
219
  - lib/chefspec/matchers/env.rb
207
- - lib/chefspec/matchers/execute.rb
220
+ - lib/chefspec/matchers/script.rb
221
+ - lib/chefspec/matchers/package.rb
208
222
  - lib/chefspec/matchers/file.rb
209
- - lib/chefspec/matchers/file_content.rb
210
- - lib/chefspec/matchers/group.rb
211
223
  - lib/chefspec/matchers/include_recipe.rb
212
- - lib/chefspec/matchers/link.rb
213
224
  - lib/chefspec/matchers/log.rb
214
- - lib/chefspec/matchers/notifications.rb
215
- - lib/chefspec/matchers/package.rb
216
- - lib/chefspec/matchers/ruby_block.rb
217
- - lib/chefspec/matchers/script.rb
218
225
  - lib/chefspec/matchers/service.rb
219
226
  - lib/chefspec/matchers/shared.rb
220
- - lib/chefspec/matchers/user.rb
221
- - lib/chefspec/minitest.rb
222
- - lib/chefspec/monkey_patches/hash.rb
223
- - lib/chefspec/monkey_patches/lwrp_base.rb
224
- - lib/chefspec/monkey_patches/provider.rb
225
- - lib/chefspec/version.rb
226
- - lib/chefspec.rb
227
+ - lib/chefspec/matchers/group.rb
228
+ - lib/chefspec/matchers/notifications.rb
227
229
  homepage: http://acrmp.github.com/chefspec
228
230
  licenses:
229
231
  - MIT
@@ -239,7 +241,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
239
241
  version: '0'
240
242
  segments:
241
243
  - 0
242
- hash: -3769472040999822905
244
+ hash: 768299270690559200
243
245
  required_rubygems_version: !ruby/object:Gem::Requirement
244
246
  none: false
245
247
  requirements:
@@ -248,12 +250,12 @@ required_rubygems_version: !ruby/object:Gem::Requirement
248
250
  version: '0'
249
251
  segments:
250
252
  - 0
251
- hash: -3769472040999822905
253
+ hash: 768299270690559200
252
254
  requirements: []
253
255
  rubyforge_project:
254
- rubygems_version: 1.8.23
256
+ rubygems_version: 1.8.25
255
257
  signing_key:
256
258
  specification_version: 3
257
- summary: chefspec-1.2.0
259
+ summary: chefspec-1.3.0
258
260
  test_files: []
259
261
  has_rdoc: