chefspec 1.2.0 → 1.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.
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: