chefspec 9.1.0 → 9.3.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (95) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +16 -9
  3. data/Rakefile +60 -52
  4. data/chefspec.gemspec +20 -20
  5. data/lib/chefspec/api/core.rb +3 -3
  6. data/lib/chefspec/api/described.rb +3 -5
  7. data/lib/chefspec/api/stubs.rb +2 -2
  8. data/lib/chefspec/api/stubs_for.rb +22 -19
  9. data/lib/chefspec/api.rb +14 -14
  10. data/lib/chefspec/berkshelf.rb +4 -4
  11. data/lib/chefspec/cacher.rb +2 -2
  12. data/lib/chefspec/coverage/filters.rb +18 -15
  13. data/lib/chefspec/coverage.rb +35 -40
  14. data/lib/chefspec/deprecations.rb +3 -3
  15. data/lib/chefspec/errors.rb +7 -7
  16. data/lib/chefspec/expect_exception.rb +2 -1
  17. data/lib/chefspec/extensions/chef/client.rb +3 -3
  18. data/lib/chefspec/extensions/chef/conditional.rb +2 -1
  19. data/lib/chefspec/extensions/chef/cookbook/gem_installer.rb +5 -4
  20. data/lib/chefspec/extensions/chef/cookbook_loader.rb +1 -0
  21. data/lib/chefspec/extensions/chef/cookbook_uploader.rb +1 -1
  22. data/lib/chefspec/extensions/chef/data_query.rb +3 -3
  23. data/lib/chefspec/extensions/chef/lwrp_base.rb +1 -0
  24. data/lib/chefspec/extensions/chef/provider.rb +8 -5
  25. data/lib/chefspec/extensions/chef/resource/freebsd_package.rb +2 -1
  26. data/lib/chefspec/extensions/chef/resource.rb +18 -12
  27. data/lib/chefspec/extensions/chef/run_context/cookbook_compiler.rb +21 -1
  28. data/lib/chefspec/extensions/chef/securable.rb +1 -1
  29. data/lib/chefspec/extensions/ohai/system.rb +11 -0
  30. data/lib/chefspec/extensions.rb +14 -13
  31. data/lib/chefspec/file_cache_path_proxy.rb +3 -3
  32. data/lib/chefspec/formatter.rb +15 -3
  33. data/lib/chefspec/librarian.rb +7 -6
  34. data/lib/chefspec/matchers/do_nothing_matcher.rb +15 -15
  35. data/lib/chefspec/matchers/include_any_recipe_matcher.rb +4 -4
  36. data/lib/chefspec/matchers/include_recipe_matcher.rb +1 -1
  37. data/lib/chefspec/matchers/link_to_matcher.rb +2 -2
  38. data/lib/chefspec/matchers/notifications_matcher.rb +5 -4
  39. data/lib/chefspec/matchers/render_file_matcher.rb +3 -3
  40. data/lib/chefspec/matchers/resource_matcher.rb +18 -16
  41. data/lib/chefspec/matchers.rb +9 -9
  42. data/lib/chefspec/mixins/normalize.rb +1 -1
  43. data/lib/chefspec/policyfile.rb +6 -6
  44. data/lib/chefspec/renderer.rb +4 -4
  45. data/lib/chefspec/rspec.rb +1 -1
  46. data/lib/chefspec/server.rb +1 -1
  47. data/lib/chefspec/server_methods.rb +8 -8
  48. data/lib/chefspec/server_runner.rb +10 -10
  49. data/lib/chefspec/solo_runner.rb +27 -25
  50. data/lib/chefspec/stubs/command_registry.rb +1 -1
  51. data/lib/chefspec/stubs/command_stub.rb +1 -1
  52. data/lib/chefspec/stubs/data_bag_item_registry.rb +1 -1
  53. data/lib/chefspec/stubs/data_bag_item_stub.rb +1 -1
  54. data/lib/chefspec/stubs/data_bag_registry.rb +1 -1
  55. data/lib/chefspec/stubs/data_bag_stub.rb +1 -1
  56. data/lib/chefspec/stubs/registry.rb +1 -1
  57. data/lib/chefspec/stubs/search_registry.rb +2 -2
  58. data/lib/chefspec/stubs/search_stub.rb +2 -2
  59. data/lib/chefspec/util.rb +7 -7
  60. data/lib/chefspec/version.rb +1 -1
  61. data/lib/chefspec/zero_server.rb +4 -4
  62. data/lib/chefspec.rb +29 -29
  63. data/spec/spec_helper.rb +3 -4
  64. data/spec/support/hash.rb +3 -3
  65. data/spec/unit/cacher_spec.rb +17 -17
  66. data/spec/unit/coverage/filters_spec.rb +16 -16
  67. data/spec/unit/deprecations_spec.rb +8 -9
  68. data/spec/unit/errors_spec.rb +15 -15
  69. data/spec/unit/expect_exception_spec.rb +9 -9
  70. data/spec/unit/macros_spec.rb +50 -50
  71. data/spec/unit/matchers/do_nothing_matcher.rb +1 -1
  72. data/spec/unit/matchers/include_any_recipe_matcher_spec.rb +23 -23
  73. data/spec/unit/matchers/include_recipe_matcher_spec.rb +15 -15
  74. data/spec/unit/matchers/link_to_matcher_spec.rb +18 -18
  75. data/spec/unit/matchers/notifications_matcher_spec.rb +15 -16
  76. data/spec/unit/matchers/render_file_matcher_spec.rb +26 -26
  77. data/spec/unit/matchers/resource_matcher_spec.rb +1 -1
  78. data/spec/unit/matchers/state_attrs_matcher_spec.rb +24 -24
  79. data/spec/unit/matchers/subscribes_matcher_spec.rb +27 -29
  80. data/spec/unit/renderer_spec.rb +36 -36
  81. data/spec/unit/server_runner_spec.rb +6 -6
  82. data/spec/unit/solo_runner_spec.rb +69 -69
  83. data/spec/unit/stubs/command_registry_spec.rb +11 -11
  84. data/spec/unit/stubs/command_stub_spec.rb +26 -26
  85. data/spec/unit/stubs/data_bag_item_registry_spec.rb +17 -17
  86. data/spec/unit/stubs/data_bag_item_stub_spec.rb +14 -14
  87. data/spec/unit/stubs/data_bag_registry_spec.rb +16 -16
  88. data/spec/unit/stubs/data_bag_stub_spec.rb +13 -13
  89. data/spec/unit/stubs/registry_spec.rb +9 -9
  90. data/spec/unit/stubs/search_registry_spec.rb +17 -17
  91. data/spec/unit/stubs/search_stub_spec.rb +14 -14
  92. data/spec/unit/stubs/stub_spec.rb +22 -22
  93. metadata +10 -11
  94. data/lib/chefspec/extensions/.DS_Store +0 -0
  95. data/lib/chefspec/extensions/chef/.DS_Store +0 -0
@@ -42,8 +42,8 @@ module ChefSpec
42
42
  location ||= ancestors.first.metadata[:parent_example_group][:location]
43
43
 
44
44
  define_method(name) do
45
- key = [location, name.to_s].join('.')
46
- unless @@cache.has_key?(Thread.current.object_id)
45
+ key = [location, name.to_s].join(".")
46
+ unless @@cache.key?(Thread.current.object_id)
47
47
  ObjectSpace.define_finalizer(Thread.current, FINALIZER)
48
48
  end
49
49
  @@cache[Thread.current.object_id] ||= {}
@@ -6,7 +6,7 @@ module ChefSpec
6
6
  end
7
7
 
8
8
  def matches?
9
- raise RuntimeError, "Must override Filter#matches?"
9
+ raise "Must override Filter#matches?"
10
10
  end
11
11
  end
12
12
 
@@ -17,6 +17,7 @@ module ChefSpec
17
17
  class RegexpFilter < Filter
18
18
  def matches?(resource)
19
19
  return true if resource.source_line.nil?
20
+
20
21
  @filter =~ resource.source_line
21
22
  end
22
23
  end
@@ -41,6 +42,7 @@ module ChefSpec
41
42
  class BlockFilter < Filter
42
43
  def matches?(resource)
43
44
  return true if resource.source_line.nil?
45
+
44
46
  @filter.call(resource)
45
47
  end
46
48
  end
@@ -54,25 +56,26 @@ module ChefSpec
54
56
  @berksfile = berksfile
55
57
 
56
58
  @metadatas = if berksfile.respond_to?(:dependencies)
57
- berksfile.dependencies
58
- .select(&:metadata?)
59
- .map(&:name)
60
- else
61
- berksfile.sources.collect do |source|
62
- location = source.location
63
- if location.respond_to?(:metadata?) && location.metadata?
64
- source
65
- else
66
- nil
67
- end
68
- end.compact.map(&:name)
69
- end
59
+ berksfile.dependencies
60
+ .select(&:metadata?)
61
+ .map(&:name)
62
+ else
63
+ berksfile.sources.collect do |source|
64
+ location = source.location
65
+ if location.respond_to?(:metadata?) && location.metadata?
66
+ source
67
+ else
68
+ nil
69
+ end
70
+ end.compact.map(&:name)
71
+ end
70
72
  end
71
73
 
72
74
  def matches?(resource)
73
75
  return true if resource.source_line.nil?
76
+
74
77
  normalized_source_line = resource.source_line.gsub("\\", "/")
75
- normalized_source_line=~ /cookbooks\/(?!#{@metadatas.join('|')})/
78
+ normalized_source_line =~ %r{cookbooks/(?!#{@metadatas.join('|')})}
76
79
  end
77
80
  end
78
81
  end
@@ -1,4 +1,4 @@
1
- require_relative 'coverage/filters'
1
+ require_relative "coverage/filters"
2
2
 
3
3
  module ChefSpec
4
4
  class Coverage
@@ -30,14 +30,14 @@ module ChefSpec
30
30
  @filters = {}
31
31
  @outputs = []
32
32
  add_output do |report|
33
- begin
34
- erb = Erubis::Eruby.new(File.read(@template))
35
- puts erb.evaluate(report)
36
- rescue NameError => e
37
- raise Error::ErbTemplateParseError.new(original_error: e.message)
38
- end
33
+
34
+ erb = Erubis::Eruby.new(File.read(@template))
35
+ puts erb.evaluate(report)
36
+ rescue NameError => e
37
+ raise Error::ErbTemplateParseError.new(original_error: e.message)
38
+
39
39
  end
40
- @template = ChefSpec.root.join('templates', 'coverage', 'human.erb')
40
+ @template = ChefSpec.root.join("templates", "coverage", "human.erb")
41
41
  end
42
42
 
43
43
  #
@@ -63,17 +63,17 @@ module ChefSpec
63
63
  def add_filter(filter = nil, &block)
64
64
  id = "#{filter.inspect}/#{block.inspect}".hash
65
65
 
66
- @filters[id] = if filter.kind_of?(Filter)
66
+ @filters[id] = if filter.is_a?(Filter)
67
67
  filter
68
- elsif filter.kind_of?(String)
68
+ elsif filter.is_a?(String)
69
69
  StringFilter.new(filter)
70
- elsif filter.kind_of?(Regexp)
70
+ elsif filter.is_a?(Regexp)
71
71
  RegexpFilter.new(filter)
72
72
  elsif block
73
73
  BlockFilter.new(block)
74
74
  else
75
- raise ArgumentError, 'Please specify either a string, ' \
76
- 'filter, or block to filter source files with!'
75
+ raise ArgumentError, "Please specify either a string, " \
76
+ "filter, or block to filter source files with!"
77
77
  end
78
78
 
79
79
  true
@@ -98,18 +98,14 @@ module ChefSpec
98
98
  #
99
99
  # @return [true]
100
100
  #
101
- def set_template(file = 'human.erb')
102
- [
103
- ChefSpec.root.join('templates', 'coverage', file),
104
- File.expand_path(file, Dir.pwd)
105
- ].each do |temp|
106
- if File.exist?(temp)
107
- @template = temp
108
- return
109
- end
110
- end
111
- raise Error::TemplateNotFound.new(path: file)
101
+ def set_template(file = "human.erb")
102
+ @template = [
103
+ ChefSpec.root.join("templates", "coverage", file),
104
+ File.expand_path(file, Dir.pwd),
105
+ ].find { |f| File.exist?(f) }
106
+ raise Error::TemplateNotFound.new(path: file) unless @template
112
107
  end
108
+
113
109
  #
114
110
  # Add a resource to the resource collection. Only new resources are added
115
111
  # and only resources that match the given filter are covered (which is *
@@ -129,9 +125,8 @@ module ChefSpec
129
125
  # @param [Chef::Resource] resource
130
126
  #
131
127
  def cover!(resource)
132
- if wrapper = find(resource)
133
- wrapper.touch!
134
- end
128
+ wrapper = find(resource)
129
+ wrapper.touch! if wrapper
135
130
  end
136
131
 
137
132
  #
@@ -166,7 +161,7 @@ module ChefSpec
166
161
  report = {}.tap do |h|
167
162
  h[:total] = @collection.size
168
163
  h[:touched] = @collection.count { |_, resource| resource.touched? }
169
- h[:coverage] = ((h[:touched]/h[:total].to_f)*100).round(2)
164
+ h[:coverage] = ((h[:touched] / h[:total].to_f) * 100).round(2)
170
165
  end
171
166
 
172
167
  report[:untouched_resources] = @collection.collect do |_, resource|
@@ -175,7 +170,7 @@ module ChefSpec
175
170
  report[:all_resources] = @collection.values
176
171
 
177
172
  @outputs.each do |block|
178
- self.instance_exec(report, &block)
173
+ instance_exec(report, &block)
179
174
  end
180
175
 
181
176
  # Ensure we exit correctly (#351)
@@ -208,24 +203,24 @@ module ChefSpec
208
203
  "source_file" => source_file,
209
204
  "source_line" => source_line,
210
205
  "touched" => touched?,
211
- "resource" => to_s
206
+ "resource" => to_s,
212
207
  }.to_json
213
208
  end
214
209
 
215
210
  def source_file
216
211
  @source_file ||= if @resource.source_line
217
- shortname(@resource.source_line.split(':').first)
218
- else
219
- 'Unknown'
220
- end
212
+ shortname(@resource.source_line.split(":").first)
213
+ else
214
+ "Unknown"
215
+ end
221
216
  end
222
217
 
223
218
  def source_line
224
219
  @source_line ||= if @resource.source_line
225
- @resource.source_line.split(':', 2).last.to_i
226
- else
227
- 'Unknown'
228
- end
220
+ @resource.source_line.split(":", 2).last.to_i
221
+ else
222
+ "Unknown"
223
+ end
229
224
  end
230
225
 
231
226
  def touch!
@@ -241,8 +236,8 @@ module ChefSpec
241
236
  def shortname(file)
242
237
  if file.include?(Dir.pwd)
243
238
  file.split(Dir.pwd, 2).last
244
- elsif file.include?('cookbooks')
245
- file.split('cookbooks/', 2).last
239
+ elsif file.include?("cookbooks")
240
+ file.split("cookbooks/", 2).last
246
241
  else
247
242
  file
248
243
  end
@@ -7,9 +7,9 @@ module Kernel
7
7
  # @param [Array<String>] messages
8
8
  def deprecated(*messages)
9
9
  messages.each do |message|
10
- calling_spec = caller.find { |line| line =~ /(\/spec)|(_spec\.rb)/ }
10
+ calling_spec = caller.find { |line| line =~ %r{(/spec)|(_spec\.rb)} }
11
11
  if calling_spec
12
- calling_spec = 'spec/' + calling_spec.split('/spec/').last
12
+ calling_spec = "spec/" + calling_spec.split("/spec/").last
13
13
  warn "[DEPRECATION] #{message} (called from #{calling_spec})"
14
14
  else
15
15
  warn "[DEPRECATION] #{message}"
@@ -42,5 +42,5 @@ module ChefSpec
42
42
  end
43
43
 
44
44
  module ChefSpec::Error
45
- class NoConversionError < ChefSpecError; end
45
+ class NoConversionError < ChefSpecError; end
46
46
  end
@@ -2,9 +2,9 @@ module ChefSpec
2
2
  module Error
3
3
  class ChefSpecError < StandardError
4
4
  def initialize(options = {})
5
- class_name = self.class.to_s.split('::').last
5
+ class_name = self.class.to_s.split("::").last
6
6
  filename = options.delete(:_template) || Util.underscore(class_name)
7
- template = ChefSpec.root.join('templates', 'errors', "#{filename}.erb")
7
+ template = ChefSpec.root.join("templates", "errors", "#{filename}.erb")
8
8
 
9
9
  erb = Erubis::Eruby.new(File.read(template))
10
10
  super erb.evaluate(options)
@@ -13,12 +13,12 @@ module ChefSpec
13
13
 
14
14
  class NotStubbed < ChefSpecError
15
15
  def initialize(options = {})
16
- name = self.class.name.to_s.split('::').last
17
- type = Util.underscore(name).gsub('_not_stubbed', '')
18
- klass = Stubs.const_get(name.gsub('NotStubbed', '') + 'Stub')
19
- stub = klass.new(*options[:args]).and_return('...').signature
16
+ name = self.class.name.to_s.split("::").last
17
+ type = Util.underscore(name).gsub("_not_stubbed", "")
18
+ klass = Stubs.const_get(name.gsub("NotStubbed", "") + "Stub")
19
+ stub = klass.new(*options[:args]).and_return("...").signature
20
20
 
21
- signature = "#{type}(#{options[:args].map(&:inspect).join(', ')})"
21
+ signature = "#{type}(#{options[:args].map(&:inspect).join(", ")})"
22
22
 
23
23
  super({
24
24
  type: type,
@@ -26,6 +26,7 @@ module ChefSpec
26
26
 
27
27
  def expected?
28
28
  return false if @matcher.nil?
29
+
29
30
  exception_matched? && message_matched?
30
31
  end
31
32
 
@@ -33,7 +34,7 @@ module ChefSpec
33
34
 
34
35
  def exception_matched?
35
36
  @formatter_exception == @matcher.last_error_for_chefspec ||
36
- @matcher.last_error_for_chefspec === @formatter_exception
37
+ @matcher.last_error_for_chefspec === @formatter_exception
37
38
  end
38
39
 
39
40
  def message_matched?
@@ -1,11 +1,11 @@
1
1
  # Force loading Chef Config to fix a bad dependency tree. See
2
2
  # https://github.com/opscode/chef/issues/2703 for more information.
3
- require 'chef/config'
3
+ require "chef/config"
4
4
 
5
5
  # Providers has to be included before client... probably a weird
6
6
  # include missing in Chef-land, but we can make sure we get it right anyway.
7
- require 'chef/providers'
8
- require 'chef/client'
7
+ require "chef/providers"
8
+ require "chef/client"
9
9
 
10
10
  # @private
11
11
  Chef::Client.prepend(Module.new do
@@ -1,9 +1,10 @@
1
- require 'chef/resource/conditional'
1
+ require "chef/resource/conditional"
2
2
 
3
3
  Chef::Resource::Conditional.prepend(Module.new do
4
4
  # @see Chef::Resource::Conditional#evaluate_command
5
5
  def evaluate_command
6
6
  return super unless $CHEFSPEC_MODE
7
+
7
8
  stub = ChefSpec::Stubs::CommandRegistry.stub_for(@command)
8
9
 
9
10
  if stub.nil?
@@ -1,9 +1,10 @@
1
- require 'chef/cookbook/gem_installer'
1
+ require "chef/cookbook/gem_installer"
2
2
 
3
3
  Chef::Cookbook::GemInstaller.prepend(Module.new do
4
4
  # Installs the gems into the omnibus gemset.
5
5
  def install
6
6
  return super unless $CHEFSPEC_MODE
7
+
7
8
  cookbook_gems = Hash.new { |h, k| h[k] = [] }
8
9
 
9
10
  cookbook_collection.each do |cookbook_name, cookbook_version|
@@ -20,10 +21,10 @@ Chef::Cookbook::GemInstaller.prepend(Module.new do
20
21
  private
21
22
 
22
23
  def locate_gem(gem_name, gem_requirements)
23
- ::Gem::Specification::find_by_name(gem_name, gem_requirements)
24
+ ::Gem::Specification.find_by_name(gem_name, gem_requirements)
24
25
  rescue ::Gem::MissingSpecError
25
- gem_cmd = "gem install #{gem_name} --version '#{gem_requirements.join(', ')}'"
26
- gemfile_line = "gem '#{[gem_name, *gem_requirements].join('\', \'')}'"
26
+ gem_cmd = "gem install #{gem_name} --version '#{gem_requirements.join(", ")}'"
27
+ gemfile_line = "gem '#{[gem_name, *gem_requirements].join("', '")}'"
27
28
  warn "No matching version found for '#{gem_name}' in your gem environment.\n" \
28
29
  " - if you are using Chef Workstation, run the following command: \"chef #{gem_cmd}\"\n" \
29
30
  " - if you are using bundler, append \"#{gemfile_line}\" to your Gemfile and run \"bundle install\"\n" \
@@ -3,6 +3,7 @@ require "chef/cookbook_loader"
3
3
  Chef::CookbookLoader.prepend(Module.new do
4
4
  def all_directories_in_repo_paths
5
5
  return super unless $CHEFSPEC_MODE
6
+
6
7
  if Chef::Config[:chefspec_cookbook_root]
7
8
  # Hax.
8
9
  [Chef::Config[:chefspec_cookbook_root]]
@@ -1,4 +1,4 @@
1
- require 'chef/cookbook_uploader'
1
+ require "chef/cookbook_uploader"
2
2
 
3
3
  Chef::CookbookUploader.prepend(Module.new do |variable|
4
4
  #
@@ -1,4 +1,4 @@
1
- require 'chef/dsl/data_query'
1
+ require "chef/dsl/data_query"
2
2
 
3
3
  Chef::DSL::DataQuery.prepend(Module.new do
4
4
  # @see Chef::DSL::DataQuery#search
@@ -6,7 +6,7 @@ Chef::DSL::DataQuery.prepend(Module.new do
6
6
  return super unless Chef::Config[:solo] && $CHEFSPEC_MODE
7
7
 
8
8
  type = args[0]
9
- query = args[1] || '*:*'
9
+ query = args[1] || "*:*"
10
10
  stub = ChefSpec::Stubs::SearchRegistry.stub_for(type, query)
11
11
 
12
12
  if stub.nil?
@@ -14,7 +14,7 @@ Chef::DSL::DataQuery.prepend(Module.new do
14
14
  end
15
15
 
16
16
  if block
17
- Array(stub.result).each {|r| block.call(r) }
17
+ Array(stub.result).each { |r| block.call(r) }
18
18
  true
19
19
  else
20
20
  stub.result
@@ -22,6 +22,7 @@ else # >= 13.0
22
22
  Chef::Provider.prepend(Module.new do
23
23
  def compile_and_converge_action(&block)
24
24
  return super unless $CHEFSPEC_MODE
25
+
25
26
  instance_eval(&block)
26
27
  end
27
28
  end)
@@ -1,5 +1,5 @@
1
- require 'chef/provider'
2
- require_relative '../../api'
1
+ require "chef/provider"
2
+ require_relative "../../api"
3
3
 
4
4
  Chef::Provider.prepend(Module.new do
5
5
  def self.name
@@ -20,17 +20,20 @@ Chef::Provider.prepend(Module.new do
20
20
  if ChefSpec::API::StubsFor::HAS_SHELLOUT_COMPACTED.satisfied_by?(Gem::Version.create(Chef::VERSION))
21
21
  def shell_out_compacted(*args)
22
22
  return super unless $CHEFSPEC_MODE
23
- raise ChefSpec::Error::ShellOutNotStubbed.new(args: args, type: 'provider', resource: new_resource)
23
+
24
+ raise ChefSpec::Error::ShellOutNotStubbed.new(args: args, type: "provider", resource: new_resource)
24
25
  end
25
26
 
26
27
  def shell_out_compacted!(*args)
27
28
  return super unless $CHEFSPEC_MODE
28
- shell_out_compacted(*args).tap {|c| c.error! }
29
+
30
+ shell_out_compacted(*args).tap(&:error!)
29
31
  end
30
32
  else
31
33
  def shell_out(*args)
32
34
  return super unless $CHEFSPEC_MODE
33
- raise ChefSpec::Error::ShellOutNotStubbed.new(args: args, type: 'provider', resource: new_resource)
35
+
36
+ raise ChefSpec::Error::ShellOutNotStubbed.new(args: args, type: "provider", resource: new_resource)
34
37
  end
35
38
  end
36
39
  end)
@@ -1,4 +1,4 @@
1
- require 'chef/resource/freebsd_package'
1
+ require "chef/resource/freebsd_package"
2
2
 
3
3
  Chef::Resource::FreebsdPackage.prepend(Module.new do
4
4
  #
@@ -11,6 +11,7 @@ Chef::Resource::FreebsdPackage.prepend(Module.new do
11
11
  #
12
12
  def supports_pkgng?
13
13
  return super unless $CHEFSPEC_MODE
14
+
14
15
  true
15
16
  end
16
17
  end)
@@ -1,6 +1,6 @@
1
- require 'chef/resource'
2
- require 'chef/version'
3
- require_relative '../../api'
1
+ require "chef/resource"
2
+ require "chef/version"
3
+ require_relative "../../api"
4
4
 
5
5
  #
6
6
  # Three concerns:
@@ -21,25 +21,27 @@ module ChefSpec::Extensions::Chef::Resource
21
21
  # If we're directly inside a `load_current_resource`, this is probably
22
22
  # something like `new_resource.class.new` so we want to call this a current_resource,
23
23
  # Otherwise it's probably a normal resource instantiation.
24
- mode = caller[1].include?("`load_current_resource'") ? :current_resource : :resource
24
+ mode = :resource
25
+ mode = :current_value if caller.any? { |x| x.include?("`load_current_resource'") || x.include?("`load_after_resource'") }
25
26
  ChefSpec::API::StubsFor.setup_stubs_for(self, mode)
26
27
  end
27
28
  end
28
29
 
29
30
  def dup
30
31
  return super unless $CHEFSPEC_MODE
32
+
31
33
  # Also here be dragons.
32
- stack = caller
33
34
  super.tap do |dup_resource|
34
35
  # We're directly inside a load_current_resource, which is probably via
35
36
  # the load_current_value DSL system, so call this a current resource.
36
- ChefSpec::API::StubsFor.setup_stubs_for(dup_resource, :current_resource) if stack.first.include?("`load_current_resource'")
37
+ ChefSpec::API::StubsFor.setup_stubs_for(dup_resource, :current_value) if caller.any? { |x| x.include?("`load_current_resource'") || x.include?("`load_after_resource'") }
37
38
  end
38
39
  end
39
40
 
40
41
  # mix of no-op and tracking concerns
41
42
  def run_action(action, notification_type = nil, notifying_resource = nil)
42
43
  return super unless $CHEFSPEC_MODE
44
+
43
45
  resolve_notification_references
44
46
  validate_action(action)
45
47
 
@@ -67,17 +69,20 @@ module ChefSpec::Extensions::Chef::Resource
67
69
  if ChefSpec::API::StubsFor::HAS_SHELLOUT_COMPACTED.satisfied_by?(Gem::Version.create(Chef::VERSION))
68
70
  def shell_out_compacted(*args)
69
71
  return super unless $CHEFSPEC_MODE
70
- raise ChefSpec::Error::ShellOutNotStubbed.new(args: args, type: 'resource', resource: self)
72
+
73
+ raise ChefSpec::Error::ShellOutNotStubbed.new(args: args, type: "resource", resource: self)
71
74
  end
72
75
 
73
76
  def shell_out_compacted!(*args)
74
77
  return super unless $CHEFSPEC_MODE
75
- shell_out_compacted(*args).tap {|c| c.error! }
78
+
79
+ shell_out_compacted(*args).tap(&:error!)
76
80
  end
77
81
  else
78
82
  def shell_out(*args)
79
83
  return super unless $CHEFSPEC_MODE
80
- raise ChefSpec::Error::ShellOutNotStubbed.new(args: args, type: 'resource', resource: self)
84
+
85
+ raise ChefSpec::Error::ShellOutNotStubbed.new(args: args, type: "resource", resource: self)
81
86
  end
82
87
  end
83
88
 
@@ -133,15 +138,15 @@ module ChefSpec::Extensions::Chef::Resource
133
138
  super
134
139
  end
135
140
 
136
- def provides(name, *args, &block)
141
+ def provides(name, **options, &block)
137
142
  provides_names << name unless provides_names.include?(name)
138
143
  inject_actions(*allowed_actions)
139
144
  super
140
145
  end
141
146
 
142
- def action(sym, &block)
147
+ def action(sym, description: nil, &block)
143
148
  inject_actions(sym)
144
- super
149
+ super(sym, &block)
145
150
  end
146
151
 
147
152
  def allowed_actions(*actions)
@@ -167,6 +172,7 @@ module ChefSpec::Extensions::Chef::Resource
167
172
  def inject_actions(*actions)
168
173
  provides_names.each do |resource_name|
169
174
  next unless resource_name
175
+
170
176
  ChefSpec.define_matcher(resource_name)
171
177
  actions.each do |action|
172
178
  inject_method(:"#{action}_#{resource_name}", resource_name, action)