chefspec 9.1.0 → 9.3.1

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.
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)