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.
- checksums.yaml +4 -4
- data/Gemfile +16 -9
- data/Rakefile +60 -52
- data/chefspec.gemspec +20 -20
- data/lib/chefspec/api/core.rb +3 -3
- data/lib/chefspec/api/described.rb +3 -5
- data/lib/chefspec/api/stubs.rb +2 -2
- data/lib/chefspec/api/stubs_for.rb +22 -19
- data/lib/chefspec/api.rb +14 -14
- data/lib/chefspec/berkshelf.rb +4 -4
- data/lib/chefspec/cacher.rb +2 -2
- data/lib/chefspec/coverage/filters.rb +18 -15
- data/lib/chefspec/coverage.rb +35 -40
- data/lib/chefspec/deprecations.rb +3 -3
- data/lib/chefspec/errors.rb +7 -7
- data/lib/chefspec/expect_exception.rb +2 -1
- data/lib/chefspec/extensions/chef/client.rb +3 -3
- data/lib/chefspec/extensions/chef/conditional.rb +2 -1
- data/lib/chefspec/extensions/chef/cookbook/gem_installer.rb +5 -4
- data/lib/chefspec/extensions/chef/cookbook_loader.rb +1 -0
- data/lib/chefspec/extensions/chef/cookbook_uploader.rb +1 -1
- data/lib/chefspec/extensions/chef/data_query.rb +3 -3
- data/lib/chefspec/extensions/chef/lwrp_base.rb +1 -0
- data/lib/chefspec/extensions/chef/provider.rb +8 -5
- data/lib/chefspec/extensions/chef/resource/freebsd_package.rb +2 -1
- data/lib/chefspec/extensions/chef/resource.rb +18 -12
- data/lib/chefspec/extensions/chef/run_context/cookbook_compiler.rb +21 -1
- data/lib/chefspec/extensions/chef/securable.rb +1 -1
- data/lib/chefspec/extensions/ohai/system.rb +11 -0
- data/lib/chefspec/extensions.rb +14 -13
- data/lib/chefspec/file_cache_path_proxy.rb +3 -3
- data/lib/chefspec/formatter.rb +15 -3
- data/lib/chefspec/librarian.rb +7 -6
- data/lib/chefspec/matchers/do_nothing_matcher.rb +15 -15
- data/lib/chefspec/matchers/include_any_recipe_matcher.rb +4 -4
- data/lib/chefspec/matchers/include_recipe_matcher.rb +1 -1
- data/lib/chefspec/matchers/link_to_matcher.rb +2 -2
- data/lib/chefspec/matchers/notifications_matcher.rb +5 -4
- data/lib/chefspec/matchers/render_file_matcher.rb +3 -3
- data/lib/chefspec/matchers/resource_matcher.rb +18 -16
- data/lib/chefspec/matchers.rb +9 -9
- data/lib/chefspec/mixins/normalize.rb +1 -1
- data/lib/chefspec/policyfile.rb +6 -6
- data/lib/chefspec/renderer.rb +4 -4
- data/lib/chefspec/rspec.rb +1 -1
- data/lib/chefspec/server.rb +1 -1
- data/lib/chefspec/server_methods.rb +8 -8
- data/lib/chefspec/server_runner.rb +10 -10
- data/lib/chefspec/solo_runner.rb +27 -25
- data/lib/chefspec/stubs/command_registry.rb +1 -1
- data/lib/chefspec/stubs/command_stub.rb +1 -1
- data/lib/chefspec/stubs/data_bag_item_registry.rb +1 -1
- data/lib/chefspec/stubs/data_bag_item_stub.rb +1 -1
- data/lib/chefspec/stubs/data_bag_registry.rb +1 -1
- data/lib/chefspec/stubs/data_bag_stub.rb +1 -1
- data/lib/chefspec/stubs/registry.rb +1 -1
- data/lib/chefspec/stubs/search_registry.rb +2 -2
- data/lib/chefspec/stubs/search_stub.rb +2 -2
- data/lib/chefspec/util.rb +7 -7
- data/lib/chefspec/version.rb +1 -1
- data/lib/chefspec/zero_server.rb +4 -4
- data/lib/chefspec.rb +29 -29
- data/spec/spec_helper.rb +3 -4
- data/spec/support/hash.rb +3 -3
- data/spec/unit/cacher_spec.rb +17 -17
- data/spec/unit/coverage/filters_spec.rb +16 -16
- data/spec/unit/deprecations_spec.rb +8 -9
- data/spec/unit/errors_spec.rb +15 -15
- data/spec/unit/expect_exception_spec.rb +9 -9
- data/spec/unit/macros_spec.rb +50 -50
- data/spec/unit/matchers/do_nothing_matcher.rb +1 -1
- data/spec/unit/matchers/include_any_recipe_matcher_spec.rb +23 -23
- data/spec/unit/matchers/include_recipe_matcher_spec.rb +15 -15
- data/spec/unit/matchers/link_to_matcher_spec.rb +18 -18
- data/spec/unit/matchers/notifications_matcher_spec.rb +15 -16
- data/spec/unit/matchers/render_file_matcher_spec.rb +26 -26
- data/spec/unit/matchers/resource_matcher_spec.rb +1 -1
- data/spec/unit/matchers/state_attrs_matcher_spec.rb +24 -24
- data/spec/unit/matchers/subscribes_matcher_spec.rb +27 -29
- data/spec/unit/renderer_spec.rb +36 -36
- data/spec/unit/server_runner_spec.rb +6 -6
- data/spec/unit/solo_runner_spec.rb +69 -69
- data/spec/unit/stubs/command_registry_spec.rb +11 -11
- data/spec/unit/stubs/command_stub_spec.rb +26 -26
- data/spec/unit/stubs/data_bag_item_registry_spec.rb +17 -17
- data/spec/unit/stubs/data_bag_item_stub_spec.rb +14 -14
- data/spec/unit/stubs/data_bag_registry_spec.rb +16 -16
- data/spec/unit/stubs/data_bag_stub_spec.rb +13 -13
- data/spec/unit/stubs/registry_spec.rb +9 -9
- data/spec/unit/stubs/search_registry_spec.rb +17 -17
- data/spec/unit/stubs/search_stub_spec.rb +14 -14
- data/spec/unit/stubs/stub_spec.rb +22 -22
- metadata +10 -11
- data/lib/chefspec/extensions/.DS_Store +0 -0
- data/lib/chefspec/extensions/chef/.DS_Store +0 -0
data/lib/chefspec/cacher.rb
CHANGED
|
@@ -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.
|
|
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
|
|
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
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
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=~ /
|
|
78
|
+
normalized_source_line =~ %r{cookbooks/(?!#{@metadatas.join('|')})}
|
|
76
79
|
end
|
|
77
80
|
end
|
|
78
81
|
end
|
data/lib/chefspec/coverage.rb
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
require_relative
|
|
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
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
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(
|
|
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.
|
|
66
|
+
@filters[id] = if filter.is_a?(Filter)
|
|
67
67
|
filter
|
|
68
|
-
elsif filter.
|
|
68
|
+
elsif filter.is_a?(String)
|
|
69
69
|
StringFilter.new(filter)
|
|
70
|
-
elsif filter.
|
|
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,
|
|
76
|
-
|
|
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 =
|
|
102
|
-
[
|
|
103
|
-
ChefSpec.root.join(
|
|
104
|
-
File.expand_path(file, Dir.pwd)
|
|
105
|
-
].
|
|
106
|
-
|
|
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
|
-
|
|
133
|
-
|
|
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
|
-
|
|
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
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
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
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
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?(
|
|
245
|
-
file.split(
|
|
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 =~ /
|
|
10
|
+
calling_spec = caller.find { |line| line =~ %r{(/spec)|(_spec\.rb)} }
|
|
11
11
|
if calling_spec
|
|
12
|
-
calling_spec =
|
|
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;
|
|
45
|
+
class NoConversionError < ChefSpecError; end
|
|
46
46
|
end
|
data/lib/chefspec/errors.rb
CHANGED
|
@@ -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(
|
|
5
|
+
class_name = self.class.to_s.split("::").last
|
|
6
6
|
filename = options.delete(:_template) || Util.underscore(class_name)
|
|
7
|
-
template = ChefSpec.root.join(
|
|
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(
|
|
17
|
-
type = Util.underscore(name).gsub(
|
|
18
|
-
klass = Stubs.const_get(name.gsub(
|
|
19
|
-
stub = klass.new(*options[:args]).and_return(
|
|
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
|
-
|
|
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
|
|
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
|
|
8
|
-
require
|
|
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
|
|
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
|
|
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
|
|
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" \
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
require
|
|
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
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
require
|
|
2
|
-
require_relative
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
2
|
-
require
|
|
3
|
-
require_relative
|
|
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 =
|
|
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, :
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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,
|
|
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)
|