stack_master 0.2.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (34) hide show
  1. checksums.yaml +4 -4
  2. data/features/apply.feature +9 -2
  3. data/lib/stack_master.rb +20 -1
  4. data/lib/stack_master/aws_driver/cloud_formation.rb +15 -35
  5. data/lib/stack_master/change_set.rb +104 -0
  6. data/lib/stack_master/cli.rb +3 -0
  7. data/lib/stack_master/command.rb +29 -3
  8. data/lib/stack_master/commands/apply.rb +54 -38
  9. data/lib/stack_master/commands/validate.rb +1 -1
  10. data/lib/stack_master/config.rb +10 -1
  11. data/lib/stack_master/paged_response_accumulator.rb +29 -0
  12. data/lib/stack_master/parameter_loader.rb +3 -0
  13. data/lib/stack_master/stack.rb +7 -1
  14. data/lib/stack_master/stack_events/fetcher.rb +1 -8
  15. data/lib/stack_master/template_compiler.rb +18 -14
  16. data/lib/stack_master/template_compilers/json.rb +18 -0
  17. data/lib/stack_master/template_compilers/sparkle_formation.rb +10 -0
  18. data/lib/stack_master/test_driver/cloud_formation.rb +33 -0
  19. data/lib/stack_master/validator.rb +5 -4
  20. data/lib/stack_master/version.rb +1 -1
  21. data/spec/stack_master/change_set_spec.rb +62 -0
  22. data/spec/stack_master/command_spec.rb +21 -1
  23. data/spec/stack_master/commands/apply_spec.rb +53 -9
  24. data/spec/stack_master/commands/validate_spec.rb +1 -1
  25. data/spec/stack_master/paged_response_accumulator_spec.rb +39 -0
  26. data/spec/stack_master/stack_events/fetcher_spec.rb +8 -33
  27. data/spec/stack_master/stack_spec.rb +19 -1
  28. data/spec/stack_master/template_compiler_spec.rb +12 -39
  29. data/spec/stack_master/template_compilers/json_spec.rb +29 -0
  30. data/spec/stack_master/template_compilers/sparkle_formation_spec.rb +22 -0
  31. data/spec/stack_master/test_driver/cloud_formation_spec.rb +39 -12
  32. data/spec/stack_master/validator_spec.rb +2 -1
  33. data/spec/stack_master_spec.rb +81 -0
  34. metadata +17 -3
@@ -18,7 +18,7 @@ RSpec.describe StackMaster::Commands::Validate do
18
18
  describe "#perform" do
19
19
  context "can find stack" do
20
20
  it "calls the validator to validate the stack definition" do
21
- expect(StackMaster::Validator).to receive(:valid?).with(stack_definition)
21
+ expect(StackMaster::Validator).to receive(:valid?).with(stack_definition, config)
22
22
  validate.perform
23
23
  end
24
24
  end
@@ -0,0 +1,39 @@
1
+ RSpec.describe StackMaster::PagedResponseAccumulator do
2
+ let(:cf) { Aws::CloudFormation::Client.new }
3
+ subject(:accumulator) { described_class.new(cf, :describe_stack_events, { stack_name: 'blah' }, :stack_events) }
4
+
5
+ context 'with one page' do
6
+ let(:page_one_events) { [
7
+ { event_id: '1', stack_id: '1', stack_name: 'blah', timestamp: Time.now},
8
+ { event_id: '2', stack_id: '1', stack_name: 'blah', timestamp: Time.now}
9
+ ] }
10
+
11
+ before do
12
+ cf.stub_responses(:describe_stack_events, { stack_events: page_one_events, next_token: nil })
13
+ end
14
+
15
+ it 'returns the first page' do
16
+ events = accumulator.call
17
+ expect(events.stack_events.count).to eq 2
18
+ end
19
+ end
20
+
21
+ context 'with two pages' do
22
+ let(:page_one_events) { [
23
+ { event_id: '1', stack_id: '1', stack_name: 'blah', timestamp: Time.now},
24
+ { event_id: '2', stack_id: '1', stack_name: 'blah', timestamp: Time.now}
25
+ ] }
26
+ let(:page_two_events) { [
27
+ { event_id: '3', stack_id: '1', stack_name: 'blah', timestamp: Time.now}
28
+ ] }
29
+
30
+ before do
31
+ cf.stub_responses(:describe_stack_events, { stack_events: page_one_events, next_token: 'blah' }, { stack_events: page_two_events } )
32
+ end
33
+
34
+ it 'returns all the stack events combined' do
35
+ events = accumulator.call
36
+ expect(events.stack_events.count).to eq 3
37
+ end
38
+ end
39
+ end
@@ -1,46 +1,25 @@
1
1
  RSpec.describe StackMaster::StackEvents::Fetcher do
2
2
  let(:cf) { Aws::CloudFormation::Client.new }
3
+ let(:stack_name) { 'blah' }
3
4
 
4
5
  before do
5
6
  allow(Aws::CloudFormation::Client).to receive(:new).and_return(cf)
6
7
  allow(StackMaster::StackEvents::Streamer).to receive(:stream)
8
+ allow(StackMaster::PagedResponseAccumulator).to receive(:call).with(StackMaster.cloud_formation_driver, :describe_stack_events, { stack_name: stack_name }, :stack_events).and_return(OpenStruct.new(stack_events: events))
7
9
  end
8
10
 
9
11
  context 'with 2 stack events' do
10
12
  let(:events) { [
11
- { event_id: '1', stack_id: '1', stack_name: 'blah', timestamp: Time.now},
12
- { event_id: '2', stack_id: '1', stack_name: 'blah', timestamp: Time.now}
13
+ OpenStruct.new(event_id: '1', stack_id: '1', stack_name: 'blah', timestamp: Time.now),
14
+ OpenStruct.new(event_id: '2', stack_id: '1', stack_name: 'blah', timestamp: Time.now)
13
15
  ] }
14
16
 
15
- before do
16
- cf.stub_responses(:describe_stack_events, stack_events: events)
17
- end
18
-
19
17
  it 'returns stack events' do
20
- events = StackMaster::StackEvents::Fetcher.fetch('blah', 'us-east-1')
18
+ events = StackMaster::StackEvents::Fetcher.fetch(stack_name, 'us-east-1')
21
19
  expect(events.count).to eq 2
22
20
  end
23
21
  end
24
22
 
25
- context 'when more than one page is present' do
26
- let(:page_one_events) { [
27
- { event_id: '1', stack_id: '1', stack_name: 'blah', timestamp: Time.now},
28
- { event_id: '2', stack_id: '1', stack_name: 'blah', timestamp: Time.now}
29
- ] }
30
- let(:page_two_events) { [
31
- { event_id: '3', stack_id: '1', stack_name: 'blah', timestamp: Time.now}
32
- ] }
33
-
34
- before do
35
- cf.stub_responses(:describe_stack_events, { stack_events: page_one_events, next_token: 'blah' }, { stack_events: page_two_events } )
36
- end
37
-
38
- it 'returns all the stack events combined' do
39
- events = StackMaster::StackEvents::Fetcher.fetch('blah', 'us-east-1')
40
- expect(events.count).to eq 3
41
- end
42
- end
43
-
44
23
  context 'filtering with a from timestamp' do
45
24
  let(:two_pm) { Time.parse('2015-10-27 14:00') }
46
25
  let(:three_pm) { Time.parse('2015-10-27 15:00') }
@@ -48,17 +27,13 @@ RSpec.describe StackMaster::StackEvents::Fetcher do
48
27
 
49
28
  let(:events) {
50
29
  [
51
- { event_id: '1', stack_id: '1', stack_name: 'blah', timestamp: two_pm },
52
- { event_id: '2', stack_id: '1', stack_name: 'blah', timestamp: four_pm },
30
+ OpenStruct.new(event_id: '1', stack_id: '1', stack_name: 'blah', timestamp: two_pm),
31
+ OpenStruct.new(event_id: '2', stack_id: '1', stack_name: 'blah', timestamp: four_pm),
53
32
  ]
54
33
  }
55
34
 
56
- before do
57
- cf.stub_responses(:describe_stack_events, stack_events: events)
58
- end
59
-
60
35
  it 'only returns events after the timestamp' do
61
- events = StackMaster::StackEvents::Fetcher.fetch('blah', 'us-east-1', from: three_pm)
36
+ events = StackMaster::StackEvents::Fetcher.fetch(stack_name, 'us-east-1', from: three_pm)
62
37
  expect(events.map(&:event_id)).to eq ['2']
63
38
  end
64
39
  end
@@ -82,7 +82,7 @@ RSpec.describe StackMaster::Stack do
82
82
  before do
83
83
  allow(StackMaster::ParameterLoader).to receive(:load).and_return(parameter_hash)
84
84
  allow(StackMaster::ParameterResolver).to receive(:resolve).and_return(resolved_parameters)
85
- allow(StackMaster::TemplateCompiler).to receive(:compile).with(stack_definition.template_file_path).and_return(template_body)
85
+ allow(StackMaster::TemplateCompiler).to receive(:compile).with(config, stack_definition.template_file_path).and_return(template_body)
86
86
  allow(File).to receive(:read).with(stack_definition.stack_policy_file_path).and_return(stack_policy_body)
87
87
  end
88
88
 
@@ -154,4 +154,22 @@ RSpec.describe StackMaster::Stack do
154
154
  expect(little_stack.too_big?).to be_falsey
155
155
  end
156
156
  end
157
+
158
+ describe '#missing_parameters?' do
159
+ subject { stack.missing_parameters? }
160
+
161
+ let(:stack) { StackMaster::Stack.new(parameters: parameters, template_body: '{}') }
162
+
163
+ context 'when a parameter has a nil value' do
164
+ let(:parameters) { { 'my_param' => nil } }
165
+
166
+ it { should eq true }
167
+ end
168
+
169
+ context 'when no parameers have a nil value' do
170
+ let(:parameters) { { 'my_param' => '1' } }
171
+
172
+ it { should eq false }
173
+ end
174
+ end
157
175
  end
@@ -1,47 +1,20 @@
1
1
  RSpec.describe StackMaster::TemplateCompiler do
2
- describe ".compile" do
3
- def compile
4
- StackMaster::TemplateCompiler.compile(template_file_path)
5
- end
6
-
7
- context 'json template' do
8
- let(:template_file_path) { '/base_dir/templates/template.json' }
9
-
10
- context "small json template" do
11
- before do
12
- allow(File).to receive(:read).with(template_file_path).and_return('{ }')
13
- end
14
-
15
- it "reads from the template file path" do
16
- expect(compile).to eq('{ }')
17
- end
18
- end
19
-
20
- context 'extra big json template' do
21
- before do
22
- allow(File).to receive(:read).with(template_file_path).and_return("{ #{' ' * 60000} }")
23
- end
2
+ describe '.compile' do
3
+ let(:config) { double(template_compilers: { fab: :test_template_compiler }) }
4
+ let(:template_file_path) { '/base_dir/templates/template.fab' }
24
5
 
25
- it "reads from the template file path" do
26
- expect(compile).to eq('{}')
27
- end
28
- end
6
+ class TestTemplateCompiler
7
+ def self.compile(template_file_path); end
29
8
  end
30
9
 
31
- context 'sparkleformation template' do
32
- let(:template_file_path) { '/base_dir/templates/template.rb' }
33
-
34
- before do
35
- allow(SparkleFormation).to receive(:compile).with(template_file_path).and_return({})
36
- end
37
-
38
- it 'compiles with sparkleformation' do
39
- expect(compile).to eq("{\n}")
40
- end
10
+ context 'when a template compiler is registered for the given file type' do
11
+ before {
12
+ StackMaster::TemplateCompiler.register(:test_template_compiler, TestTemplateCompiler)
13
+ }
41
14
 
42
- it 'sets the appropriate sparkle_path' do
43
- compile
44
- expect(SparkleFormation.sparkle_path).to eq File.dirname(template_file_path)
15
+ it 'compiles the template using the relevant template compiler' do
16
+ expect(TestTemplateCompiler).to receive(:compile).with(template_file_path)
17
+ StackMaster::TemplateCompiler.compile(config, template_file_path)
45
18
  end
46
19
  end
47
20
  end
@@ -0,0 +1,29 @@
1
+ RSpec.describe StackMaster::TemplateCompilers::Json do
2
+ describe '.compile' do
3
+ def compile
4
+ described_class.compile(template_file_path)
5
+ end
6
+
7
+ let(:template_file_path) { '/base_dir/templates/template.json' }
8
+
9
+ context "small json template" do
10
+ before do
11
+ allow(File).to receive(:read).with(template_file_path).and_return('{ }')
12
+ end
13
+
14
+ it "reads from the template file path" do
15
+ expect(compile).to eq('{ }')
16
+ end
17
+ end
18
+
19
+ context 'extra big json template' do
20
+ before do
21
+ allow(File).to receive(:read).with(template_file_path).and_return("{ #{' ' * 60000} }")
22
+ end
23
+
24
+ it "reads from the template file path" do
25
+ expect(compile).to eq('{}')
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,22 @@
1
+ RSpec.describe StackMaster::TemplateCompilers::SparkleFormation do
2
+ describe '.compile' do
3
+ def compile
4
+ described_class.compile(template_file_path)
5
+ end
6
+
7
+ before do
8
+ allow(SparkleFormation).to receive(:compile).with(template_file_path).and_return({})
9
+ end
10
+
11
+ let(:template_file_path) { '/base_dir/templates/template.rb' }
12
+
13
+ it 'compiles with sparkleformation' do
14
+ expect(compile).to eq("{\n}")
15
+ end
16
+
17
+ it 'sets the appropriate sparkle_path' do
18
+ compile
19
+ expect(SparkleFormation.sparkle_path).to eq File.dirname(template_file_path)
20
+ end
21
+ end
22
+ end
@@ -3,22 +3,49 @@ require 'stack_master/test_driver/cloud_formation'
3
3
  RSpec.describe StackMaster::TestDriver::CloudFormation do
4
4
  subject(:test_cf_driver) { described_class.new }
5
5
 
6
- it 'adds and gets stacks' do
7
- test_cf_driver.add_stack(stack_id: "1", stack_name: 'stack-1')
8
- test_cf_driver.add_stack(stack_id: "2", stack_name: 'stack-2')
9
- expect(test_cf_driver.describe_stacks.stacks.map(&:stack_id)).to eq(["1", "2"])
6
+ context 'stacks' do
7
+ it 'creates and describes stacks' do
8
+ test_cf_driver.create_stack(stack_id: "1", stack_name: 'stack-1')
9
+ test_cf_driver.create_stack(stack_id: "2", stack_name: 'stack-2')
10
+ expect(test_cf_driver.describe_stacks.stacks.map(&:stack_id)).to eq(["1", "2"])
10
11
 
12
+ end
13
+
14
+ it 'adds and gets stack events' do
15
+ test_cf_driver.add_stack_event(stack_name: 'stack-1', resource_status: "UPDATE_COMPLETE")
16
+ test_cf_driver.add_stack_event(stack_name: 'stack-1', resource_status: "UPDATE_COMPLETE")
17
+ test_cf_driver.add_stack_event(stack_name: 'stack-2')
18
+ expect(test_cf_driver.describe_stack_events(stack_name: 'stack-1').stack_events.map(&:stack_name)).to eq ['stack-1', 'stack-1']
19
+ end
20
+
21
+ it 'sets and gets templates' do
22
+ test_cf_driver.set_template('stack-1', 'blah')
23
+ expect(test_cf_driver.get_template(stack_name: 'stack-1').template_body).to eq 'blah'
24
+ end
11
25
  end
12
26
 
13
- it 'adds and gets stack events' do
14
- test_cf_driver.add_stack_event(stack_name: 'stack-1', resource_status: "UPDATE_COMPLETE")
15
- test_cf_driver.add_stack_event(stack_name: 'stack-1', resource_status: "UPDATE_COMPLETE")
16
- test_cf_driver.add_stack_event(stack_name: 'stack-2')
17
- expect(test_cf_driver.describe_stack_events(stack_name: 'stack-1').stack_events.map(&:stack_name)).to eq ['stack-1', 'stack-1']
27
+ context 'change sets' do
28
+ it 'creates and describes change sets' do
29
+ change_set_id = test_cf_driver.create_change_set(
30
+ stack_name: 'stack-1',
31
+ change_set_name: 'change-set-1',
32
+ template_body: '{}',
33
+ parameters: [{ paramater_key: 'param_1', parameter_value: 'value_1'}]
34
+ ).id
35
+ change_set = test_cf_driver.describe_change_set(change_set_name: change_set_id)
36
+ expect(change_set.change_set_id).to eq change_set_id
37
+ expect(change_set.change_set_name).to eq 'change-set-1'
38
+ change_set = test_cf_driver.describe_change_set(change_set_name: 'change-set-1')
39
+ expect(change_set.change_set_id).to eq change_set_id
40
+ expect(change_set.change_set_name).to eq 'change-set-1'
41
+ end
18
42
  end
19
43
 
20
- it 'sets and gets templates' do
21
- test_cf_driver.set_template('stack-1', 'blah')
22
- expect(test_cf_driver.get_template(stack_name: 'stack-1').template_body).to eq 'blah'
44
+ it 'deletes change sets' do
45
+ change_set_id = test_cf_driver.create_change_set(stack_name: '1', change_set_name: '2').id
46
+ test_cf_driver.delete_change_set(change_set_name: change_set_id)
47
+ expect {
48
+ test_cf_driver.describe_change_set(change_set_name: change_set_id)
49
+ }.to raise_error(KeyError)
23
50
  end
24
51
  end
@@ -1,6 +1,7 @@
1
1
  RSpec.describe StackMaster::Validator do
2
2
 
3
- subject(:validator) { described_class.new(stack_definition) }
3
+ subject(:validator) { described_class.new(stack_definition, config) }
4
+ let(:config) { StackMaster::Config.new({'stacks' => {}}, '/base_dir') }
4
5
  let(:stack_definition) do
5
6
  StackMaster::StackDefinition.new(
6
7
  region: 'us-east-1',
@@ -0,0 +1,81 @@
1
+ RSpec.describe StackMaster do
2
+ describe '.debug' do
3
+ let(:message) { "Doing some stuff" }
4
+
5
+ context 'when debugging' do
6
+ before { allow(StackMaster).to receive(:debug?).and_return(true) }
7
+
8
+ it 'outputs the message to STDERR' do
9
+ expect { StackMaster.debug(message) }.to output(/\[DEBUG\] #{message}/).to_stderr
10
+ end
11
+ end
12
+
13
+ context 'when not debugging' do
14
+ before { allow(StackMaster).to receive(:debug?).and_return(false) }
15
+
16
+ it "doesn't output the message to STDERR" do
17
+ expect { StackMaster.debug(message) }.to output("").to_stderr
18
+ end
19
+ end
20
+ end
21
+
22
+ describe '.debug?' do
23
+ subject { StackMaster.debug? }
24
+
25
+ context "when debug! isn't called" do
26
+ it { should eq false }
27
+ end
28
+
29
+ context 'when debug! is called' do
30
+ before { StackMaster.debug! }
31
+
32
+ it { should eq true }
33
+
34
+ after { StackMaster.instance_variable_set('@debug', false) }
35
+ end
36
+ end
37
+
38
+ describe '.interactive?' do
39
+ subject { StackMaster.interactive? }
40
+
41
+ context "when non_interactive! isn't called" do
42
+ it { should eq true }
43
+ end
44
+
45
+ context 'when non_interactive! is called' do
46
+ before { StackMaster.non_interactive! }
47
+
48
+ it { should eq false }
49
+
50
+ after { StackMaster.instance_variable_set('@non_interactive', false) }
51
+ end
52
+ end
53
+
54
+ describe '.non_interactive?' do
55
+ subject { StackMaster.non_interactive? }
56
+
57
+ context "when non_interactive! isn't called" do
58
+ it { should eq false }
59
+ end
60
+
61
+ context 'when non_interactive! is called' do
62
+ before { StackMaster.non_interactive! }
63
+
64
+ it { should eq true }
65
+
66
+ after { StackMaster.instance_variable_set('@non_interactive', false) }
67
+ end
68
+ end
69
+
70
+ describe '.non_interactive_answer' do
71
+ it 'defaults to y' do
72
+ expect(StackMaster.non_interactive_answer).to eq 'y'
73
+ end
74
+
75
+ it 'can be overridden' do
76
+ StackMaster.non_interactive_answer = 'n'
77
+ expect(StackMaster.non_interactive_answer).to eq 'n'
78
+ StackMaster.instance_variable_set('@non_interactive_answer', 'y')
79
+ end
80
+ end
81
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: stack_master
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Steve Hodgkiss
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2016-03-09 00:00:00.000000000 Z
12
+ date: 2016-03-31 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler
@@ -302,6 +302,7 @@ files:
302
302
  - features/validate.feature
303
303
  - lib/stack_master.rb
304
304
  - lib/stack_master/aws_driver/cloud_formation.rb
305
+ - lib/stack_master/change_set.rb
305
306
  - lib/stack_master/cli.rb
306
307
  - lib/stack_master/command.rb
307
308
  - lib/stack_master/commands/apply.rb
@@ -317,6 +318,7 @@ files:
317
318
  - lib/stack_master/commands/validate.rb
318
319
  - lib/stack_master/config.rb
319
320
  - lib/stack_master/ctrl_c.rb
321
+ - lib/stack_master/paged_response_accumulator.rb
320
322
  - lib/stack_master/parameter_loader.rb
321
323
  - lib/stack_master/parameter_resolver.rb
322
324
  - lib/stack_master/parameter_resolvers/latest_ami_by_tags.rb
@@ -337,6 +339,8 @@ files:
337
339
  - lib/stack_master/stack_states.rb
338
340
  - lib/stack_master/stack_status.rb
339
341
  - lib/stack_master/template_compiler.rb
342
+ - lib/stack_master/template_compilers/json.rb
343
+ - lib/stack_master/template_compilers/sparkle_formation.rb
340
344
  - lib/stack_master/test_driver/cloud_formation.rb
341
345
  - lib/stack_master/testing.rb
342
346
  - lib/stack_master/utils.rb
@@ -350,6 +354,7 @@ files:
350
354
  - spec/fixtures/stack_master.yml
351
355
  - spec/fixtures/templates/myapp_vpc.json
352
356
  - spec/spec_helper.rb
357
+ - spec/stack_master/change_set_spec.rb
353
358
  - spec/stack_master/command_spec.rb
354
359
  - spec/stack_master/commands/apply_spec.rb
355
360
  - spec/stack_master/commands/delete_spec.rb
@@ -357,6 +362,7 @@ files:
357
362
  - spec/stack_master/commands/status_spec.rb
358
363
  - spec/stack_master/commands/validate_spec.rb
359
364
  - spec/stack_master/config_spec.rb
365
+ - spec/stack_master/paged_response_accumulator_spec.rb
360
366
  - spec/stack_master/parameter_loader_spec.rb
361
367
  - spec/stack_master/parameter_resolver_spec.rb
362
368
  - spec/stack_master/parameter_resolvers/latest_ami_by_tag_spec.rb
@@ -376,9 +382,12 @@ files:
376
382
  - spec/stack_master/stack_events/streamer_spec.rb
377
383
  - spec/stack_master/stack_spec.rb
378
384
  - spec/stack_master/template_compiler_spec.rb
385
+ - spec/stack_master/template_compilers/json_spec.rb
386
+ - spec/stack_master/template_compilers/sparkle_formation_spec.rb
379
387
  - spec/stack_master/test_driver/cloud_formation_spec.rb
380
388
  - spec/stack_master/utils_spec.rb
381
389
  - spec/stack_master/validator_spec.rb
390
+ - spec/stack_master_spec.rb
382
391
  - stack_master.gemspec
383
392
  - stacktemplates/parameter_region.yml
384
393
  - stacktemplates/parameter_stack_name.yml
@@ -404,7 +413,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
404
413
  version: '0'
405
414
  requirements: []
406
415
  rubyforge_project:
407
- rubygems_version: 2.4.5.1
416
+ rubygems_version: 2.5.1
408
417
  signing_key:
409
418
  specification_version: 4
410
419
  summary: StackMaster is a sure-footed way of creating, updating and keeping track
@@ -427,6 +436,7 @@ test_files:
427
436
  - spec/fixtures/stack_master.yml
428
437
  - spec/fixtures/templates/myapp_vpc.json
429
438
  - spec/spec_helper.rb
439
+ - spec/stack_master/change_set_spec.rb
430
440
  - spec/stack_master/command_spec.rb
431
441
  - spec/stack_master/commands/apply_spec.rb
432
442
  - spec/stack_master/commands/delete_spec.rb
@@ -434,6 +444,7 @@ test_files:
434
444
  - spec/stack_master/commands/status_spec.rb
435
445
  - spec/stack_master/commands/validate_spec.rb
436
446
  - spec/stack_master/config_spec.rb
447
+ - spec/stack_master/paged_response_accumulator_spec.rb
437
448
  - spec/stack_master/parameter_loader_spec.rb
438
449
  - spec/stack_master/parameter_resolver_spec.rb
439
450
  - spec/stack_master/parameter_resolvers/latest_ami_by_tag_spec.rb
@@ -453,6 +464,9 @@ test_files:
453
464
  - spec/stack_master/stack_events/streamer_spec.rb
454
465
  - spec/stack_master/stack_spec.rb
455
466
  - spec/stack_master/template_compiler_spec.rb
467
+ - spec/stack_master/template_compilers/json_spec.rb
468
+ - spec/stack_master/template_compilers/sparkle_formation_spec.rb
456
469
  - spec/stack_master/test_driver/cloud_formation_spec.rb
457
470
  - spec/stack_master/utils_spec.rb
458
471
  - spec/stack_master/validator_spec.rb
472
+ - spec/stack_master_spec.rb