chefspec 9.2.1 → 9.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.
- checksums.yaml +4 -4
- data/Gemfile +16 -9
- data/Rakefile +60 -52
- data/chefspec.gemspec +20 -20
- data/lib/chefspec.rb +29 -29
- data/lib/chefspec/api.rb +14 -14
- 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 +12 -12
- data/lib/chefspec/berkshelf.rb +4 -4
- data/lib/chefspec/cacher.rb +2 -2
- data/lib/chefspec/coverage.rb +35 -40
- data/lib/chefspec/coverage/filters.rb +18 -15
- 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.rb +14 -14
- 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.rb +14 -9
- data/lib/chefspec/extensions/chef/resource/freebsd_package.rb +2 -1
- data/lib/chefspec/extensions/chef/run_context/cookbook_compiler.rb +12 -1
- data/lib/chefspec/extensions/chef/securable.rb +1 -1
- data/lib/chefspec/extensions/ohai/system.rb +1 -1
- data/lib/chefspec/file_cache_path_proxy.rb +3 -3
- data/lib/chefspec/formatter.rb +3 -3
- data/lib/chefspec/librarian.rb +7 -6
- data/lib/chefspec/matchers.rb +9 -9
- 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/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 +26 -24
- 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 +3 -3
- 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 +6 -6
@@ -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,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:
|
@@ -29,8 +29,8 @@ module ChefSpec::Extensions::Chef::Resource
|
|
29
29
|
|
30
30
|
def dup
|
31
31
|
return super unless $CHEFSPEC_MODE
|
32
|
+
|
32
33
|
# Also here be dragons.
|
33
|
-
stack = caller
|
34
34
|
super.tap do |dup_resource|
|
35
35
|
# We're directly inside a load_current_resource, which is probably via
|
36
36
|
# the load_current_value DSL system, so call this a current resource.
|
@@ -41,6 +41,7 @@ module ChefSpec::Extensions::Chef::Resource
|
|
41
41
|
# mix of no-op and tracking concerns
|
42
42
|
def run_action(action, notification_type = nil, notifying_resource = nil)
|
43
43
|
return super unless $CHEFSPEC_MODE
|
44
|
+
|
44
45
|
resolve_notification_references
|
45
46
|
validate_action(action)
|
46
47
|
|
@@ -68,17 +69,20 @@ module ChefSpec::Extensions::Chef::Resource
|
|
68
69
|
if ChefSpec::API::StubsFor::HAS_SHELLOUT_COMPACTED.satisfied_by?(Gem::Version.create(Chef::VERSION))
|
69
70
|
def shell_out_compacted(*args)
|
70
71
|
return super unless $CHEFSPEC_MODE
|
71
|
-
|
72
|
+
|
73
|
+
raise ChefSpec::Error::ShellOutNotStubbed.new(args: args, type: "resource", resource: self)
|
72
74
|
end
|
73
75
|
|
74
76
|
def shell_out_compacted!(*args)
|
75
77
|
return super unless $CHEFSPEC_MODE
|
76
|
-
|
78
|
+
|
79
|
+
shell_out_compacted(*args).tap(&:error!)
|
77
80
|
end
|
78
81
|
else
|
79
82
|
def shell_out(*args)
|
80
83
|
return super unless $CHEFSPEC_MODE
|
81
|
-
|
84
|
+
|
85
|
+
raise ChefSpec::Error::ShellOutNotStubbed.new(args: args, type: "resource", resource: self)
|
82
86
|
end
|
83
87
|
end
|
84
88
|
|
@@ -140,9 +144,9 @@ module ChefSpec::Extensions::Chef::Resource
|
|
140
144
|
super
|
141
145
|
end
|
142
146
|
|
143
|
-
def action(sym, &block)
|
147
|
+
def action(sym, description: nil, &block)
|
144
148
|
inject_actions(sym)
|
145
|
-
super
|
149
|
+
super(sym, &block)
|
146
150
|
end
|
147
151
|
|
148
152
|
def allowed_actions(*actions)
|
@@ -168,6 +172,7 @@ module ChefSpec::Extensions::Chef::Resource
|
|
168
172
|
def inject_actions(*actions)
|
169
173
|
provides_names.each do |resource_name|
|
170
174
|
next unless resource_name
|
175
|
+
|
171
176
|
ChefSpec.define_matcher(resource_name)
|
172
177
|
actions.each do |action|
|
173
178
|
inject_method(:"#{action}_#{resource_name}", resource_name, action)
|
@@ -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,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require "chef/run_context/cookbook_compiler"
|
2
2
|
|
3
3
|
Chef::RunContext::CookbookCompiler.prepend(Module.new do
|
4
4
|
# List of compile phases as of Chef 14:
|
@@ -15,36 +15,44 @@ Chef::RunContext::CookbookCompiler.prepend(Module.new do
|
|
15
15
|
|
16
16
|
def load_libraries_from_cookbook(cookbook)
|
17
17
|
return super unless $CHEFSPEC_MODE
|
18
|
+
|
18
19
|
$CHEFSPEC_LIBRARY_PRELOAD ||= {}
|
19
20
|
# Already loaded this once.
|
20
21
|
return if $CHEFSPEC_LIBRARY_PRELOAD[cookbook]
|
22
|
+
|
21
23
|
$CHEFSPEC_LIBRARY_PRELOAD[cookbook] = true
|
22
24
|
super
|
23
25
|
end
|
24
26
|
|
25
27
|
def load_ohai_plugins_from_cookbook(cookbook)
|
26
28
|
return super unless $CHEFSPEC_MODE
|
29
|
+
|
27
30
|
$CHEFSPEC_OHAI_PRELOAD ||= {}
|
28
31
|
# Already loaded this once.
|
29
32
|
return if $CHEFSPEC_OHAI_PRELOAD[cookbook]
|
33
|
+
|
30
34
|
$CHEFSPEC_OHAI_PRELOAD[cookbook] = true
|
31
35
|
super
|
32
36
|
end
|
33
37
|
|
34
38
|
def load_lwrps_from_cookbook(cookbook)
|
35
39
|
return super unless $CHEFSPEC_MODE
|
40
|
+
|
36
41
|
$CHEFSPEC_LWRP_PRELOAD ||= {}
|
37
42
|
# Already loaded this once.
|
38
43
|
return if $CHEFSPEC_LWRP_PRELOAD[cookbook]
|
44
|
+
|
39
45
|
$CHEFSPEC_LWRP_PRELOAD[cookbook] = true
|
40
46
|
super
|
41
47
|
end
|
42
48
|
|
43
49
|
def load_resource_definitions_from_cookbook(cookbook)
|
44
50
|
return super unless $CHEFSPEC_MODE
|
51
|
+
|
45
52
|
$CHEFSPEC_DEFINITION_PRELOAD ||= {}
|
46
53
|
# Already loaded this once.
|
47
54
|
return if $CHEFSPEC_DEFINITION_PRELOAD[cookbook]
|
55
|
+
|
48
56
|
$CHEFSPEC_DEFINITION_PRELOAD[cookbook] = true
|
49
57
|
super
|
50
58
|
end
|
@@ -56,18 +64,21 @@ Chef::RunContext::CookbookCompiler.prepend(Module.new do
|
|
56
64
|
def compile_ohai_plugins
|
57
65
|
return super unless $CHEFSPEC_MODE
|
58
66
|
return if $CHEFSPEC_PRELOAD
|
67
|
+
|
59
68
|
super
|
60
69
|
end
|
61
70
|
|
62
71
|
def compile_attributes
|
63
72
|
return super unless $CHEFSPEC_MODE
|
64
73
|
return if $CHEFSPEC_PRELOAD
|
74
|
+
|
65
75
|
super
|
66
76
|
end
|
67
77
|
|
68
78
|
def compile_recipes
|
69
79
|
return super unless $CHEFSPEC_MODE
|
70
80
|
return if $CHEFSPEC_PRELOAD
|
81
|
+
|
71
82
|
super
|
72
83
|
end
|
73
84
|
end)
|
@@ -1,5 +1,5 @@
|
|
1
|
-
require
|
2
|
-
require
|
1
|
+
require "fileutils" unless defined?(FileUtils)
|
2
|
+
require "singleton" unless defined?(Singleton)
|
3
3
|
|
4
4
|
module ChefSpec
|
5
5
|
class FileCachePathProxy
|
@@ -8,7 +8,7 @@ module ChefSpec
|
|
8
8
|
attr_reader :file_cache_path
|
9
9
|
|
10
10
|
def initialize
|
11
|
-
@file_cache_path = Dir.mktmpdir(
|
11
|
+
@file_cache_path = Dir.mktmpdir(%w{chefspec file_cache_path})
|
12
12
|
at_exit { FileUtils.rm_rf(@file_cache_path) }
|
13
13
|
end
|
14
14
|
end
|
data/lib/chefspec/formatter.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
|
-
require
|
2
|
-
require
|
1
|
+
require "chef/formatters/base"
|
2
|
+
require "chef/formatters/error_mapper"
|
3
3
|
|
4
4
|
module ChefSpec
|
5
5
|
class ChefFormatter < Chef::Formatters::Base
|
@@ -202,7 +202,7 @@ module ChefSpec
|
|
202
202
|
def converge_complete; end
|
203
203
|
|
204
204
|
# Called before action is executed on a resource.
|
205
|
-
def resource_action_start(resource, action, notification_type=nil, notifier=nil); end
|
205
|
+
def resource_action_start(resource, action, notification_type = nil, notifier = nil); end
|
206
206
|
|
207
207
|
# Called when a resource fails, but will retry.
|
208
208
|
def resource_failed_retriable(resource, action, retry_count, exception); end
|
data/lib/chefspec/librarian.rb
CHANGED
@@ -1,10 +1,11 @@
|
|
1
1
|
begin
|
2
|
-
require
|
3
|
-
require
|
4
|
-
require
|
2
|
+
require "librarian/chef/environment"
|
3
|
+
require "librarian/action/resolve"
|
4
|
+
require "librarian/action/install"
|
5
5
|
rescue LoadError
|
6
6
|
raise ChefSpec::Error::GemLoadError.new(
|
7
|
-
gem:
|
7
|
+
gem: "librarian-chef", name: "Librarian"
|
8
|
+
)
|
8
9
|
end
|
9
10
|
|
10
11
|
module ChefSpec
|
@@ -25,7 +26,7 @@ module ChefSpec
|
|
25
26
|
#
|
26
27
|
def setup!
|
27
28
|
env = ::Librarian::Chef::Environment.new(project_path: Dir.pwd)
|
28
|
-
@originalpath, env.config_db.local[
|
29
|
+
@originalpath, env.config_db.local["path"] = env.config_db.local["path"], @tmpdir
|
29
30
|
::Librarian::Action::Resolve.new(env).run
|
30
31
|
::Librarian::Action::Install.new(env).run
|
31
32
|
|
@@ -37,7 +38,7 @@ module ChefSpec
|
|
37
38
|
#
|
38
39
|
def teardown!
|
39
40
|
env = ::Librarian::Chef::Environment.new(project_path: Dir.pwd)
|
40
|
-
env.config_db.local[
|
41
|
+
env.config_db.local["path"] = @originalpath
|
41
42
|
|
42
43
|
FileUtils.rm_rf(@tmpdir) if File.exist?(@tmpdir)
|
43
44
|
end
|
data/lib/chefspec/matchers.rb
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
module ChefSpec
|
2
2
|
module Matchers
|
3
|
-
require_relative
|
4
|
-
require_relative
|
5
|
-
require_relative
|
6
|
-
require_relative
|
7
|
-
require_relative
|
8
|
-
require_relative
|
9
|
-
require_relative
|
10
|
-
require_relative
|
11
|
-
require_relative
|
3
|
+
require_relative "matchers/do_nothing_matcher"
|
4
|
+
require_relative "matchers/include_any_recipe_matcher"
|
5
|
+
require_relative "matchers/include_recipe_matcher"
|
6
|
+
require_relative "matchers/link_to_matcher"
|
7
|
+
require_relative "matchers/notifications_matcher"
|
8
|
+
require_relative "matchers/render_file_matcher"
|
9
|
+
require_relative "matchers/resource_matcher"
|
10
|
+
require_relative "matchers/state_attrs_matcher"
|
11
|
+
require_relative "matchers/subscribes_matcher"
|
12
12
|
end
|
13
13
|
end
|
@@ -14,37 +14,37 @@ module ChefSpec::Matchers
|
|
14
14
|
end
|
15
15
|
|
16
16
|
def description
|
17
|
-
|
17
|
+
"do nothing"
|
18
18
|
end
|
19
19
|
|
20
20
|
def failure_message
|
21
21
|
if @resource
|
22
|
-
message =
|
23
|
-
message <<
|
24
|
-
message <<
|
22
|
+
message = %{expected #{@resource} to do nothing, but the following }
|
23
|
+
message << %{actions were performed:}
|
24
|
+
message << %{\n\n}
|
25
25
|
@resource.performed_actions.each do |action|
|
26
|
-
message <<
|
26
|
+
message << %{ :#{action}}
|
27
27
|
end
|
28
28
|
message
|
29
29
|
else
|
30
|
-
message =
|
31
|
-
message <<
|
32
|
-
message <<
|
33
|
-
message <<
|
34
|
-
message <<
|
35
|
-
message <<
|
30
|
+
message = %{expected _something_ to do nothing, but the _something_ }
|
31
|
+
message << %{you gave me was nil! If you are running a test like:}
|
32
|
+
message << %{\n\n}
|
33
|
+
message << %{ expect(_something_).to do_nothing}
|
34
|
+
message << %{\n\n}
|
35
|
+
message << %{make sure that `_something_` exists, because I got nil!}
|
36
36
|
message
|
37
37
|
end
|
38
38
|
end
|
39
39
|
|
40
40
|
def failure_message_when_negated
|
41
41
|
if @resource
|
42
|
-
message =
|
43
|
-
message <<
|
42
|
+
message = %{expected #{@resource} to do something, but no actions }
|
43
|
+
message << %{were performed.}
|
44
44
|
message
|
45
45
|
else
|
46
|
-
message =
|
47
|
-
message <<
|
46
|
+
message = %{expected _something_ to do something, but no actions }
|
47
|
+
message << %{were performed.}
|
48
48
|
message
|
49
49
|
end
|
50
50
|
end
|
@@ -6,15 +6,15 @@ module ChefSpec::Matchers
|
|
6
6
|
end
|
7
7
|
|
8
8
|
def description
|
9
|
-
|
9
|
+
"include any recipe"
|
10
10
|
end
|
11
11
|
|
12
12
|
def failure_message
|
13
|
-
|
13
|
+
"expected to include any recipe"
|
14
14
|
end
|
15
15
|
|
16
16
|
def failure_message_when_negated
|
17
|
-
|
17
|
+
"expected not to include any recipes"
|
18
18
|
end
|
19
19
|
|
20
20
|
private
|
@@ -36,7 +36,7 @@ module ChefSpec::Matchers
|
|
36
36
|
# @return [String]
|
37
37
|
#
|
38
38
|
def with_default(name)
|
39
|
-
name.include?(
|
39
|
+
name.include?("::") ? name : "#{name}::default"
|
40
40
|
end
|
41
41
|
|
42
42
|
#
|
@@ -14,8 +14,8 @@ module ChefSpec::Matchers
|
|
14
14
|
if @resource
|
15
15
|
block = Proc.new do |notified|
|
16
16
|
resource_name(notified.resource).to_s == @expected_resource_type &&
|
17
|
-
|
18
|
-
|
17
|
+
(@expected_resource_name === notified.resource.identity.to_s || @expected_resource_name === notified.resource.name.to_s) &&
|
18
|
+
matches_action?(notified)
|
19
19
|
end
|
20
20
|
|
21
21
|
if @immediately
|
@@ -115,6 +115,7 @@ module ChefSpec::Matchers
|
|
115
115
|
|
116
116
|
def matches_action?(notification)
|
117
117
|
return true if @action.nil?
|
118
|
+
|
118
119
|
@action == notification.action.to_sym
|
119
120
|
end
|
120
121
|
|
@@ -130,12 +131,12 @@ module ChefSpec::Matchers
|
|
130
131
|
type = :delayed
|
131
132
|
end
|
132
133
|
|
133
|
-
%Q{ "#{notifying_resource
|
134
|
+
%Q{ "#{notifying_resource}" notifies "#{resource_name(resource)}[#{resource.name}]" to :#{notification.action}, :#{type}}
|
134
135
|
end
|
135
136
|
|
136
137
|
def format_notifications
|
137
138
|
all_notifications.map do |notification|
|
138
|
-
|
139
|
+
" " + format_notification(notification)
|
139
140
|
end.join("\n")
|
140
141
|
end
|
141
142
|
end
|
@@ -87,8 +87,8 @@ module ChefSpec::Matchers
|
|
87
87
|
|
88
88
|
def resource
|
89
89
|
@resource ||= @runner.find_resource(:cookbook_file, @path) ||
|
90
|
-
|
91
|
-
|
90
|
+
@runner.find_resource(:file, @path) ||
|
91
|
+
@runner.find_resource(:template, @path)
|
92
92
|
end
|
93
93
|
|
94
94
|
#
|
@@ -99,7 +99,7 @@ module ChefSpec::Matchers
|
|
99
99
|
# @return [true, false]
|
100
100
|
#
|
101
101
|
def has_create_action?
|
102
|
-
|
102
|
+
%i{create create_if_missing}.any? { |action| resource.performed_action?(action) }
|
103
103
|
end
|
104
104
|
|
105
105
|
#
|