sfn 3.0.28 → 3.0.30
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 +5 -5
- data/CHANGELOG.md +5 -0
- data/docs/callbacks.md +1 -0
- data/lib/chef/knife/knife_plugin_seed.rb +11 -17
- data/lib/sfn.rb +0 -2
- data/lib/sfn/api_provider.rb +0 -2
- data/lib/sfn/api_provider/google.rb +6 -9
- data/lib/sfn/api_provider/terraform.rb +4 -6
- data/lib/sfn/cache.rb +36 -39
- data/lib/sfn/callback.rb +0 -2
- data/lib/sfn/callback/aws_assume_role.rb +7 -8
- data/lib/sfn/callback/aws_mfa.rb +7 -8
- data/lib/sfn/callback/stack_policy.rb +15 -17
- data/lib/sfn/command.rb +9 -11
- data/lib/sfn/command/conf.rb +7 -10
- data/lib/sfn/command/create.rb +8 -12
- data/lib/sfn/command/describe.rb +6 -8
- data/lib/sfn/command/destroy.rb +8 -10
- data/lib/sfn/command/diff.rb +18 -25
- data/lib/sfn/command/events.rb +15 -16
- data/lib/sfn/command/export.rb +13 -17
- data/lib/sfn/command/graph.rb +11 -13
- data/lib/sfn/command/graph/aws.rb +27 -29
- data/lib/sfn/command/graph/terraform.rb +22 -23
- data/lib/sfn/command/import.rb +13 -16
- data/lib/sfn/command/init.rb +5 -7
- data/lib/sfn/command/inspect.rb +26 -29
- data/lib/sfn/command/lint.rb +10 -12
- data/lib/sfn/command/list.rb +5 -8
- data/lib/sfn/command/print.rb +3 -5
- data/lib/sfn/command/promote.rb +0 -2
- data/lib/sfn/command/update.rb +42 -46
- data/lib/sfn/command/validate.rb +4 -6
- data/lib/sfn/command_module/base.rb +17 -25
- data/lib/sfn/command_module/callbacks.rb +12 -8
- data/lib/sfn/command_module/stack.rb +39 -43
- data/lib/sfn/command_module/template.rb +89 -90
- data/lib/sfn/config.rb +30 -31
- data/lib/sfn/config/conf.rb +1 -3
- data/lib/sfn/config/create.rb +5 -7
- data/lib/sfn/config/describe.rb +3 -5
- data/lib/sfn/config/diff.rb +1 -1
- data/lib/sfn/config/events.rb +6 -8
- data/lib/sfn/config/export.rb +4 -7
- data/lib/sfn/config/graph.rb +4 -6
- data/lib/sfn/config/import.rb +3 -5
- data/lib/sfn/config/init.rb +0 -1
- data/lib/sfn/config/inspect.rb +7 -9
- data/lib/sfn/config/lint.rb +4 -4
- data/lib/sfn/config/list.rb +3 -5
- data/lib/sfn/config/print.rb +3 -5
- data/lib/sfn/config/promote.rb +3 -5
- data/lib/sfn/config/update.rb +10 -12
- data/lib/sfn/config/validate.rb +18 -20
- data/lib/sfn/lint.rb +0 -2
- data/lib/sfn/lint/definition.rb +3 -5
- data/lib/sfn/lint/rule.rb +7 -8
- data/lib/sfn/lint/rule_set.rb +11 -20
- data/lib/sfn/monkey_patch/stack.rb +32 -34
- data/lib/sfn/monkey_patch/stack/azure.rb +0 -1
- data/lib/sfn/monkey_patch/stack/google.rb +15 -16
- data/lib/sfn/planner.rb +1 -3
- data/lib/sfn/planner/aws.rb +82 -89
- data/lib/sfn/provider.rb +21 -23
- data/lib/sfn/utils.rb +0 -2
- data/lib/sfn/utils/debug.rb +1 -2
- data/lib/sfn/utils/json.rb +3 -2
- data/lib/sfn/utils/object_storage.rb +1 -2
- data/lib/sfn/utils/output.rb +8 -9
- data/lib/sfn/utils/path_selector.rb +9 -10
- data/lib/sfn/utils/ssher.rb +2 -3
- data/lib/sfn/utils/stack_exporter.rb +20 -21
- data/lib/sfn/utils/stack_parameter_scrubber.rb +6 -7
- data/lib/sfn/utils/stack_parameter_validator.rb +14 -16
- data/lib/sfn/version.rb +1 -1
- data/sfn.gemspec +1 -1
- metadata +8 -8
data/lib/sfn/config/list.rb
CHANGED
@@ -4,25 +4,23 @@ module Sfn
|
|
4
4
|
class Config
|
5
5
|
# List command configuration
|
6
6
|
class List < Sfn::Config
|
7
|
-
|
8
7
|
attribute(
|
9
8
|
:attribute, String,
|
10
9
|
:multiple => true,
|
11
10
|
:description => 'Attribute of stack to print',
|
12
|
-
:short_flag => 'a'
|
11
|
+
:short_flag => 'a',
|
13
12
|
)
|
14
13
|
attribute(
|
15
14
|
:all_attributes, [TrueClass, FalseClass],
|
16
15
|
:description => 'Print all available attributes',
|
17
|
-
:short_flag => 'A'
|
16
|
+
:short_flag => 'A',
|
18
17
|
)
|
19
18
|
attribute(
|
20
19
|
:status, String,
|
21
20
|
:multiple => true,
|
22
21
|
:description => 'Match stacks with given status. Use "none" to disable.',
|
23
|
-
:short_flag => 's'
|
22
|
+
:short_flag => 's',
|
24
23
|
)
|
25
|
-
|
26
24
|
end
|
27
25
|
end
|
28
26
|
end
|
data/lib/sfn/config/print.rb
CHANGED
@@ -4,23 +4,21 @@ module Sfn
|
|
4
4
|
class Config
|
5
5
|
# Print command configurationUpdate command configuration
|
6
6
|
class Print < Validate
|
7
|
-
|
8
7
|
attribute(
|
9
8
|
:write_to_file, String,
|
10
9
|
:description => 'Write compiled SparkleFormation template to path provided',
|
11
|
-
:short_flag => 'w'
|
10
|
+
:short_flag => 'w',
|
12
11
|
)
|
13
12
|
|
14
13
|
attribute(
|
15
14
|
:sparkle_dump, [TrueClass, FalseClass],
|
16
|
-
:description => 'Do not use provider customized dump behavior'
|
15
|
+
:description => 'Do not use provider customized dump behavior',
|
17
16
|
)
|
18
17
|
|
19
18
|
attribute(
|
20
19
|
:yaml, [TrueClass, FalseClass],
|
21
|
-
:description => 'Output template content in YAML format'
|
20
|
+
:description => 'Output template content in YAML format',
|
22
21
|
)
|
23
|
-
|
24
22
|
end
|
25
23
|
end
|
26
24
|
end
|
data/lib/sfn/config/promote.rb
CHANGED
@@ -4,20 +4,18 @@ module Sfn
|
|
4
4
|
class Config
|
5
5
|
# Promote command configuration
|
6
6
|
class Promote < Config
|
7
|
-
|
8
7
|
attribute(
|
9
8
|
:accounts, String,
|
10
|
-
:description => 'JSON accounts file path'
|
9
|
+
:description => 'JSON accounts file path',
|
11
10
|
)
|
12
11
|
attribute(
|
13
12
|
:bucket, String,
|
14
|
-
:description => 'Bucket name containing the exports'
|
13
|
+
:description => 'Bucket name containing the exports',
|
15
14
|
)
|
16
15
|
attribute(
|
17
16
|
:bucket_prefix, String,
|
18
|
-
:description => 'Key prefix within remote bucket'
|
17
|
+
:description => 'Key prefix within remote bucket',
|
19
18
|
)
|
20
|
-
|
21
19
|
end
|
22
20
|
end
|
23
21
|
end
|
data/lib/sfn/config/update.rb
CHANGED
@@ -4,22 +4,21 @@ module Sfn
|
|
4
4
|
class Config
|
5
5
|
# Update command configuration
|
6
6
|
class Update < Validate
|
7
|
-
|
8
7
|
attribute(
|
9
8
|
:apply_stack, String,
|
10
9
|
:multiple => true,
|
11
10
|
:description => 'Apply outputs from stack to input parameters',
|
12
|
-
:short_flag => 'A'
|
11
|
+
:short_flag => 'A',
|
13
12
|
)
|
14
13
|
attribute(
|
15
14
|
:apply_mapping, Smash,
|
16
|
-
:description => 'Customize apply stack mapping as [StackName__]OutputName:ParameterName'
|
15
|
+
:description => 'Customize apply stack mapping as [StackName__]OutputName:ParameterName',
|
17
16
|
)
|
18
17
|
attribute(
|
19
18
|
:parameter, Smash,
|
20
19
|
:multiple => true,
|
21
20
|
:description => '[DEPRECATED - use `parameters`] Pass template parameters directly (ParamName:ParamValue)',
|
22
|
-
:coerce => lambda{|v, inst|
|
21
|
+
:coerce => lambda { |v, inst|
|
23
22
|
result = inst.data[:parameter] || Array.new
|
24
23
|
case v
|
25
24
|
when String
|
@@ -31,41 +30,40 @@ module Sfn
|
|
31
30
|
end
|
32
31
|
{:bogo_multiple => result}
|
33
32
|
},
|
34
|
-
:short_flag => 'R'
|
33
|
+
:short_flag => 'R',
|
35
34
|
)
|
36
35
|
attribute(
|
37
36
|
:parameters, Smash,
|
38
37
|
:description => 'Pass template parameters directly',
|
39
|
-
:short_flag => 'm'
|
38
|
+
:short_flag => 'm',
|
40
39
|
)
|
41
40
|
attribute(
|
42
41
|
:plan, [TrueClass, FalseClass],
|
43
42
|
:default => true,
|
44
43
|
:description => 'Provide planning information prior to update',
|
45
|
-
:short_flag => 'l'
|
44
|
+
:short_flag => 'l',
|
46
45
|
)
|
47
46
|
attribute(
|
48
47
|
:plan_only, [TrueClass, FalseClass],
|
49
48
|
:default => false,
|
50
|
-
:description => 'Exit after plan display'
|
49
|
+
:description => 'Exit after plan display',
|
51
50
|
)
|
52
51
|
attribute(
|
53
52
|
:diffs, [TrueClass, FalseClass],
|
54
53
|
:description => 'Show planner content diff',
|
55
|
-
:short_flag => 'D'
|
54
|
+
:short_flag => 'D',
|
56
55
|
)
|
57
56
|
attribute(
|
58
57
|
:merge_api_options, [TrueClass, FalseClass],
|
59
58
|
:description => 'Merge API options defined within configuration on update',
|
60
|
-
:default => false
|
59
|
+
:default => false,
|
61
60
|
)
|
62
61
|
attribute(
|
63
62
|
:parameter_validation, String,
|
64
63
|
:allowed => ['default', 'none', 'current', 'expected'],
|
65
64
|
:description => 'Stack parameter validation behavior',
|
66
|
-
:default => 'default'
|
65
|
+
:default => 'default',
|
67
66
|
)
|
68
|
-
|
69
67
|
end
|
70
68
|
end
|
71
69
|
end
|
data/lib/sfn/config/validate.rb
CHANGED
@@ -4,79 +4,78 @@ module Sfn
|
|
4
4
|
class Config
|
5
5
|
# Validate command configuration
|
6
6
|
class Validate < Config
|
7
|
-
|
8
7
|
attribute(
|
9
8
|
:processing, [TrueClass, FalseClass],
|
10
9
|
:description => 'Call the unicorns and explode the glitter bombs',
|
11
10
|
:default => true,
|
12
|
-
:short_flag => 'P'
|
11
|
+
:short_flag => 'P',
|
13
12
|
)
|
14
13
|
attribute(
|
15
14
|
:file, String,
|
16
15
|
:description => 'Path to template file',
|
17
16
|
:default => nil,
|
18
|
-
:short_flag => 'f'
|
17
|
+
:short_flag => 'f',
|
19
18
|
)
|
20
19
|
attribute(
|
21
20
|
:file_path_prompt, [TrueClass, FalseClass],
|
22
21
|
:default => true,
|
23
22
|
:description => 'Enable interactive prompt for template path discovery',
|
24
|
-
:short_flag => 'F'
|
23
|
+
:short_flag => 'F',
|
25
24
|
)
|
26
25
|
attribute(
|
27
26
|
:base_directory, String,
|
28
27
|
:description => 'Path to root of of templates directory',
|
29
|
-
:short_flag => 'b'
|
28
|
+
:short_flag => 'b',
|
30
29
|
)
|
31
30
|
attribute(
|
32
31
|
:no_base_directory, [TrueClass, FalseClass],
|
33
32
|
:description => 'Unset any value used for the template root directory path',
|
34
|
-
:short_flag => 'n'
|
33
|
+
:short_flag => 'n',
|
35
34
|
)
|
36
35
|
attribute(
|
37
36
|
:translate, String,
|
38
37
|
:description => 'Translate generated template to given provider',
|
39
|
-
:short_flag => 't'
|
38
|
+
:short_flag => 't',
|
40
39
|
)
|
41
40
|
attribute(
|
42
41
|
:translate_chunk, Integer,
|
43
42
|
:description => 'Chunk length for serialization',
|
44
|
-
:coerce => lambda{|v| v.to_i},
|
45
|
-
:short_flag => 'T'
|
43
|
+
:coerce => lambda { |v| v.to_i },
|
44
|
+
:short_flag => 'T',
|
46
45
|
)
|
47
46
|
attribute(
|
48
47
|
:apply_nesting, [String, Symbol],
|
49
48
|
:default => 'deep',
|
50
49
|
:description => 'Apply stack nesting',
|
51
|
-
:short_flag => 'a'
|
50
|
+
:short_flag => 'a',
|
52
51
|
)
|
53
52
|
attribute(
|
54
53
|
:nesting_bucket, String,
|
55
54
|
:description => 'Bucket to use for storing nested stack templates',
|
56
|
-
:short_flag => 'N'
|
55
|
+
:short_flag => 'N',
|
57
56
|
)
|
58
57
|
attribute(
|
59
58
|
:nesting_prefix, String,
|
60
59
|
:description => 'File name prefix for storing template in bucket',
|
61
|
-
:short_flag => 'Y'
|
60
|
+
:short_flag => 'Y',
|
62
61
|
)
|
63
62
|
attribute(
|
64
63
|
:print_only, [TrueClass, FalseClass],
|
65
64
|
:description => 'Print the resulting stack template',
|
66
|
-
:short_flag => 'r'
|
65
|
+
:short_flag => 'r',
|
67
66
|
)
|
68
67
|
attribute(
|
69
68
|
:sparkle_pack, String,
|
70
69
|
:multiple => true,
|
71
70
|
:description => 'Load SparklePack gem',
|
72
|
-
:coerce => lambda{|s| s.to_s},
|
73
|
-
:short_flag => 's'
|
71
|
+
:coerce => lambda { |s| s.to_s },
|
72
|
+
:short_flag => 's',
|
74
73
|
)
|
75
74
|
attribute(
|
76
75
|
:compile_parameters, Smash,
|
77
76
|
:description => 'Pass template compile time parameters directly',
|
78
77
|
:short_flag => 'o',
|
79
|
-
:coerce => lambda{|v|
|
78
|
+
:coerce => lambda { |v|
|
80
79
|
case v
|
81
80
|
when String
|
82
81
|
result = Smash.new
|
@@ -90,7 +89,7 @@ module Sfn
|
|
90
89
|
extractor = lambda do |data, prefix|
|
91
90
|
data.each_pair do |key, value|
|
92
91
|
local_key = "#{prefix}__#{key}"
|
93
|
-
if
|
92
|
+
if value.is_a?(Hash)
|
94
93
|
extractor.call(value, local_key)
|
95
94
|
else
|
96
95
|
result[local_key] = data
|
@@ -101,13 +100,12 @@ module Sfn
|
|
101
100
|
else
|
102
101
|
v
|
103
102
|
end
|
104
|
-
}
|
103
|
+
},
|
105
104
|
)
|
106
105
|
attribute(
|
107
106
|
:upload_root_template, [TrueClass, FalseClass],
|
108
|
-
:description => 'Upload root template to storage bucket'
|
107
|
+
:description => 'Upload root template to storage bucket',
|
109
108
|
)
|
110
|
-
|
111
109
|
end
|
112
110
|
end
|
113
111
|
end
|
data/lib/sfn/lint.rb
CHANGED
data/lib/sfn/lint/definition.rb
CHANGED
@@ -18,8 +18,8 @@ module Sfn
|
|
18
18
|
# @param provider [String, Symbol] target provider
|
19
19
|
# @param evaluator [Proc] logic used to handle match
|
20
20
|
# @return [self]
|
21
|
-
def initialize(expr, provider
|
22
|
-
if
|
21
|
+
def initialize(expr, provider = :aws, evaluator = nil, &block)
|
22
|
+
if evaluator && block
|
23
23
|
raise ArgumentError.new 'Only evaluator or block can be provided, not both.'
|
24
24
|
end
|
25
25
|
@provider = Bogo::Utility.snake(provider).to_sym
|
@@ -45,13 +45,11 @@ module Sfn
|
|
45
45
|
# @return [TrueClass, Array<String>] true if passed. List of string results that failed
|
46
46
|
# @note override this method when subclassing
|
47
47
|
def run(result, template)
|
48
|
-
unless
|
48
|
+
unless evaluator
|
49
49
|
raise NotImplementedError.new 'No evaluator has been defined for this definition!'
|
50
50
|
end
|
51
51
|
evaluator.call(result, template)
|
52
52
|
end
|
53
|
-
|
54
53
|
end
|
55
|
-
|
56
54
|
end
|
57
55
|
end
|
data/lib/sfn/lint/rule.rb
CHANGED
@@ -21,7 +21,7 @@ module Sfn
|
|
21
21
|
# @param fail_message [String] message to describe failure
|
22
22
|
# @param provider [String, Symbol] target provider
|
23
23
|
# @return [self]
|
24
|
-
def initialize(name, definitions, fail_message, provider
|
24
|
+
def initialize(name, definitions, fail_message, provider = :aws)
|
25
25
|
@name = name.to_sym
|
26
26
|
@definitions = definitions.dup.uniq.freeze
|
27
27
|
@fail_message = fail_message
|
@@ -33,13 +33,13 @@ module Sfn
|
|
33
33
|
# result set.
|
34
34
|
def generate_fail_message(results)
|
35
35
|
msg = fail_message.dup
|
36
|
-
unless
|
36
|
+
unless results.empty?
|
37
37
|
failed_items = results.map do |item|
|
38
38
|
f_item = item[:failures]
|
39
39
|
next if f_item.nil? || f_item == true || f_item == false
|
40
40
|
f_item
|
41
41
|
end.flatten.compact.map(&:to_s)
|
42
|
-
unless
|
42
|
+
unless failed_items.empty?
|
43
43
|
msg = "#{msg} (failures: `#{failed_items.join('`, `')}`)"
|
44
44
|
end
|
45
45
|
end
|
@@ -55,10 +55,10 @@ module Sfn
|
|
55
55
|
result = definition.apply(template)
|
56
56
|
result == true ? result : Smash.new(:definition => definition, :failures => result)
|
57
57
|
end
|
58
|
-
if
|
58
|
+
if results.all? { |item| item == true }
|
59
59
|
true
|
60
60
|
else
|
61
|
-
results.delete_if{|item| item == true}
|
61
|
+
results.delete_if { |item| item == true }
|
62
62
|
results
|
63
63
|
end
|
64
64
|
end
|
@@ -107,12 +107,11 @@ module Sfn
|
|
107
107
|
non_match = definitions.find_all do |definition|
|
108
108
|
definition.provider != provider
|
109
109
|
end
|
110
|
-
unless
|
110
|
+
unless non_match.empty?
|
111
111
|
raise ArgumentError.new "Rule defines `#{provider}` as provider but includes definitions for " \
|
112
|
-
|
112
|
+
"non matching providers. (#{non_match.map(&:provider).map(&:to_s).uniq.sort.join(', ')})"
|
113
113
|
end
|
114
114
|
end
|
115
|
-
|
116
115
|
end
|
117
116
|
end
|
118
117
|
end
|
data/lib/sfn/lint/rule_set.rb
CHANGED
@@ -7,7 +7,6 @@ module Sfn
|
|
7
7
|
|
8
8
|
# Helper class for ruleset generation
|
9
9
|
class Creator
|
10
|
-
|
11
10
|
attr_reader :items, :provider
|
12
11
|
|
13
12
|
def initialize(provider)
|
@@ -16,34 +15,28 @@ module Sfn
|
|
16
15
|
end
|
17
16
|
|
18
17
|
class RuleSet < Creator
|
19
|
-
|
20
18
|
def rule(name, &block)
|
21
19
|
r = Rule.new(provider)
|
22
20
|
r.instance_exec(&block)
|
23
21
|
items << Sfn::Lint::Rule.new(name, r.items, r.fail_message, provider)
|
24
22
|
end
|
25
|
-
|
26
23
|
end
|
27
24
|
|
28
25
|
class Rule < Creator
|
29
|
-
|
30
|
-
def definition(expr, evaluator=nil, &block)
|
26
|
+
def definition(expr, evaluator = nil, &block)
|
31
27
|
items << Sfn::Lint::Definition.new(expr, provider, evaluator, &block)
|
32
28
|
end
|
33
29
|
|
34
|
-
def fail_message(val=nil)
|
35
|
-
unless
|
30
|
+
def fail_message(val = nil)
|
31
|
+
unless val.nil?
|
36
32
|
@fail_message = val
|
37
33
|
end
|
38
34
|
@fail_message
|
39
35
|
end
|
40
|
-
|
41
36
|
end
|
42
|
-
|
43
37
|
end
|
44
38
|
|
45
39
|
class << self
|
46
|
-
|
47
40
|
@@_rule_set_registry = Smash.new
|
48
41
|
|
49
42
|
# RuleSet generator helper for quickly building simple rule sets
|
@@ -51,7 +44,7 @@ module Sfn
|
|
51
44
|
# @param name [String] name of rule set
|
52
45
|
# @param provider [String, Symbol] target provider
|
53
46
|
# @yieldblock rule set content
|
54
|
-
def build(name, provider
|
47
|
+
def build(name, provider = :aws, &block)
|
55
48
|
provider = Bogo::Utility.snake(provider).to_sym
|
56
49
|
rs = Creator::RuleSet.new(provider)
|
57
50
|
rs.instance_exec(&block)
|
@@ -72,7 +65,7 @@ module Sfn
|
|
72
65
|
# @param name [String] name of rule set
|
73
66
|
# @param provider [String] target provider
|
74
67
|
# @return [RuleSet, NilClass]
|
75
|
-
def get(name, provider
|
68
|
+
def get(name, provider = :aws)
|
76
69
|
provider = Bogo::Utility.snake(provider)
|
77
70
|
@@_rule_set_registry.get(provider, name)
|
78
71
|
end
|
@@ -81,10 +74,9 @@ module Sfn
|
|
81
74
|
#
|
82
75
|
# @param provider [String] target provider
|
83
76
|
# @return [Array<RuleSet>]
|
84
|
-
def get_all(provider
|
77
|
+
def get_all(provider = :aws)
|
85
78
|
@@_rule_set_registry.fetch(provider, {}).values
|
86
79
|
end
|
87
|
-
|
88
80
|
end
|
89
81
|
|
90
82
|
include Bogo::Memoization
|
@@ -102,7 +94,7 @@ module Sfn
|
|
102
94
|
# @param provider [String, Symbol] name of target provider
|
103
95
|
# @param rules [Array<Rule>] list of rules defining this set
|
104
96
|
# @return [self]
|
105
|
-
def initialize(name, provider
|
97
|
+
def initialize(name, provider = :aws, rules = [])
|
106
98
|
@name = name.to_sym
|
107
99
|
@provider = Bogo::Utility.snake(provider).to_sym
|
108
100
|
@rules = rules.dup.uniq.freeze
|
@@ -138,7 +130,7 @@ module Sfn
|
|
138
130
|
# @return [TrueClass, Array<String>] true on success, list failure messages on failure
|
139
131
|
def apply(template)
|
140
132
|
failures = collect_failures(template)
|
141
|
-
if
|
133
|
+
if failures.empty?
|
142
134
|
true
|
143
135
|
else
|
144
136
|
failures.map do |failure|
|
@@ -157,7 +149,7 @@ module Sfn
|
|
157
149
|
result = rule.apply(template)
|
158
150
|
result == true ? true : Smash.new(:rule => rule, :result => result)
|
159
151
|
end
|
160
|
-
results.delete_if{|i| i == true}
|
152
|
+
results.delete_if { |i| i == true }
|
161
153
|
results
|
162
154
|
end
|
163
155
|
|
@@ -166,12 +158,11 @@ module Sfn
|
|
166
158
|
non_match = rules.find_all do |rule|
|
167
159
|
rule.provider != provider
|
168
160
|
end
|
169
|
-
unless
|
161
|
+
unless non_match.empty?
|
170
162
|
raise ArgumentError.new "Rule set defines `#{provider}` as provider but includes rules for " \
|
171
|
-
|
163
|
+
"non matching providers. (#{non_match.map(&:provider).map(&:to_s).uniq.sort.join(', ')})"
|
172
164
|
end
|
173
165
|
end
|
174
|
-
|
175
166
|
end
|
176
167
|
end
|
177
168
|
end
|