stackup 0.9.5 → 1.0.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c0d5247909e33849cd8ebd01a050d97d446e1e27
4
- data.tar.gz: c791ab2604455fb5786ca2c6c3162fa9520e7e87
3
+ metadata.gz: 70cf1deee1c8dc53041f2d6ff6cb31fdc9dac4f7
4
+ data.tar.gz: 54fad33244ba8fe2c0935a95efed3ca897feb65b
5
5
  SHA512:
6
- metadata.gz: 10b971d636c818efe634cca634a30fffe672517b2e05fa46648f7e17eada5320e94f15bac14125917bc8527978068a4f582f00cc154319f4c2c045e0c37446b7
7
- data.tar.gz: de309273aa1a1c05a968e4ae12793a35a027d87360bc7612e627f001a828d77d4f84f1ce350c5b941def64f46205c292a791411198d64a3e2b9b4cd9cc0e5a91
6
+ metadata.gz: 8c250dadcf6d56e74423b0c191bd21c52e2790a0c7f73c15f2c506c4213be26582033642b7dadc6979cf62f2e41653cfd31e66e48c442942eccb6352fd410553
7
+ data.tar.gz: cbc82bd3c82c85795636cd0e1e2febc30bc9ee307427f9b7f5c6cb1d51e633e7eb43335878061c686a8380f949314ffc8bcca316f58718b53b1f9c08c5151f9a
data/CHANGES.md CHANGED
@@ -1,4 +1,8 @@
1
- ## 0.9.4 (2016-09-26)
1
+ ## 1.0.0 (2016-10-07)
2
+
3
+ * Add support for CloudFormation YAML extensions (e.g. `!Ref`).
4
+
5
+ ## 0.9.5 (2016-09-26)
2
6
 
3
7
  * Add `--with-role` option, to assume a role for stack operations.
4
8
 
data/README.md CHANGED
@@ -37,8 +37,6 @@ Called with `--list`, it will list stacks:
37
37
  foo-bar-test
38
38
  zzz-production
39
39
 
40
- The command-line support inputs (template and parameters) in either JSON or YAML format.
41
-
42
40
  ### Stack create/update
43
41
 
44
42
  Use sub-command "up" to create or update a stack, as appropriate:
@@ -102,6 +100,12 @@ Parameters and tags may be specified via files, or as a Hash, e.g.
102
100
  t.tags = { "environment" => "production" }
103
101
  end
104
102
 
103
+ ## YAML support
104
+
105
+ Stackup supports input files (template, parameters, tags) in either JSON or YAML format.
106
+
107
+ It also supports the [abbreviated YAML syntax for Cloudformation functions](https://aws.amazon.com/blogs/aws/aws-cloudformation-update-yaml-cross-stack-references-simplified-substitution/), though unlike the [AWS CLI](https://aws.amazon.com/cli/), Stackup normalises YAML input to JSON before invoking CloudFormation APIs.
108
+
105
109
  ## Docker image
106
110
 
107
111
  Stackup is also published as a Docker image. Basic usage is:
@@ -9,7 +9,7 @@ require "securerandom"
9
9
  require "stackup"
10
10
  require "stackup/differ"
11
11
  require "stackup/version"
12
- require "yaml"
12
+ require "stackup/yaml"
13
13
 
14
14
  $stdout.sync = true
15
15
  $stderr.sync = true
@@ -127,7 +127,7 @@ Clamp do
127
127
  end
128
128
 
129
129
  def load_data(file)
130
- YAML.load_file(file)
130
+ Stackup::YAML.load_file(file)
131
131
  rescue Errno::ENOENT
132
132
  signal_error "no such file: #{file.inspect}"
133
133
  end
@@ -1,5 +1,5 @@
1
1
  module Stackup
2
2
 
3
- VERSION = "0.9.5"
3
+ VERSION = "1.0.0"
4
4
 
5
5
  end
@@ -0,0 +1,61 @@
1
+ require "yaml"
2
+
3
+ module Stackup
4
+
5
+ # Modified YAML parsing, to support CloudFormation YAML shortcuts
6
+ #
7
+ module YAML
8
+
9
+ class << self
10
+
11
+ # Dump Ruby object +o+ to a YAML string.
12
+ #
13
+ def dump(*args)
14
+ ::YAML.dump(*args)
15
+ end
16
+
17
+ # Load YAML stream/string into a Ruby data structure.
18
+ #
19
+ # Supports CloudFormation extensions:
20
+ #
21
+ # `!Ref blah` as a shortcut for `{ "Ref" => blah }`
22
+ # `!Foo blah` as a shortcut for `{ "Fn::Foo" => blah }`
23
+ #
24
+ def load(yaml, filename = nil)
25
+ tree = ::YAML.parse(yaml, filename)
26
+ return tree unless tree
27
+ CloudFormationToRuby.create.accept(tree)
28
+ end
29
+
30
+ # Load YAML file into a Ruby data structure.
31
+ #
32
+ # Supports CloudFormation extensions as per `load`.
33
+ #
34
+ def load_file(filename)
35
+ File.open(filename, 'r:bom|utf-8') do |f|
36
+ load(f, filename)
37
+ end
38
+ end
39
+
40
+ end
41
+
42
+ # Custom Psych node visitor, with CloudFormation extensions.
43
+ #
44
+ class CloudFormationToRuby < Psych::Visitors::ToRuby
45
+
46
+ def accept(target)
47
+ case target.tag
48
+ when "!Ref"
49
+ { "Ref" => super }
50
+ when /^!(\w+)$/
51
+ { "Fn::#{$1}" => super }
52
+ else
53
+ super
54
+ end
55
+ end
56
+
57
+ end
58
+
59
+ end
60
+
61
+ end
@@ -0,0 +1,79 @@
1
+ require "spec_helper"
2
+
3
+ require "stackup/yaml"
4
+
5
+ describe Stackup::YAML do
6
+
7
+ describe ".load" do
8
+
9
+ let(:data) do
10
+ described_class.load(input)
11
+ end
12
+
13
+ context "with plain YAML" do
14
+
15
+ let(:input) do
16
+ <<-YAML
17
+ Outputs:
18
+ Foo: "bar"
19
+ YAML
20
+ end
21
+
22
+ it "loads as normal" do
23
+ expect(data).to eql(
24
+ "Outputs" => {
25
+ "Foo" => "bar"
26
+ }
27
+ )
28
+ end
29
+
30
+ end
31
+
32
+ context "with a !Ref" do
33
+
34
+ let(:input) do
35
+ <<-YAML
36
+ Outputs:
37
+ Foo: !Ref "Bar"
38
+ YAML
39
+ end
40
+
41
+ it "expands to Ref" do
42
+ expect(data).to eql(
43
+ "Outputs" => {
44
+ "Foo" => {
45
+ "Ref" => "Bar"
46
+ }
47
+ }
48
+ )
49
+ end
50
+
51
+ end
52
+
53
+ context "with a !Ref" do
54
+
55
+ let(:input) do
56
+ <<-YAML
57
+ Outputs:
58
+ Foo: !GetAtt ["Bar", "Baz"]
59
+ YAML
60
+ end
61
+
62
+ it "expands to Ref" do
63
+ expect(data).to eql(
64
+ "Outputs" => {
65
+ "Foo" => {
66
+ "Fn::GetAtt" => [
67
+ "Bar",
68
+ "Baz"
69
+ ]
70
+ }
71
+ }
72
+ )
73
+ end
74
+
75
+ end
76
+
77
+ end
78
+
79
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: stackup
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.5
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mike Williams
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2016-09-26 00:00:00.000000000 Z
12
+ date: 2016-10-07 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: aws-sdk-resources
@@ -104,11 +104,13 @@ files:
104
104
  - lib/stackup/stack_watcher.rb
105
105
  - lib/stackup/utils.rb
106
106
  - lib/stackup/version.rb
107
+ - lib/stackup/yaml.rb
107
108
  - spec/spec_helper.rb
108
109
  - spec/stackup/parameters_spec.rb
109
110
  - spec/stackup/stack_spec.rb
110
111
  - spec/stackup/stack_watcher_spec.rb
111
112
  - spec/stackup/utils_spec.rb
113
+ - spec/stackup/yaml_spec.rb
112
114
  homepage: https://github.com/realestate-com-au/stackup
113
115
  licenses:
114
116
  - MIT
@@ -129,7 +131,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
129
131
  version: '0'
130
132
  requirements: []
131
133
  rubyforge_project:
132
- rubygems_version: 2.6.6
134
+ rubygems_version: 2.5.1
133
135
  signing_key:
134
136
  specification_version: 4
135
137
  summary: Manage CloudFormation stacks
@@ -139,3 +141,4 @@ test_files:
139
141
  - spec/stackup/stack_spec.rb
140
142
  - spec/stackup/stack_watcher_spec.rb
141
143
  - spec/stackup/utils_spec.rb
144
+ - spec/stackup/yaml_spec.rb