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 +4 -4
- data/CHANGES.md +5 -1
- data/README.md +6 -2
- data/bin/stackup +2 -2
- data/lib/stackup/version.rb +1 -1
- data/lib/stackup/yaml.rb +61 -0
- data/spec/stackup/yaml_spec.rb +79 -0
- metadata +6 -3
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA1:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 70cf1deee1c8dc53041f2d6ff6cb31fdc9dac4f7
         | 
| 4 | 
            +
              data.tar.gz: 54fad33244ba8fe2c0935a95efed3ca897feb65b
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 8c250dadcf6d56e74423b0c191bd21c52e2790a0c7f73c15f2c506c4213be26582033642b7dadc6979cf62f2e41653cfd31e66e48c442942eccb6352fd410553
         | 
| 7 | 
            +
              data.tar.gz: cbc82bd3c82c85795636cd0e1e2febc30bc9ee307427f9b7f5c6cb1d51e633e7eb43335878061c686a8380f949314ffc8bcca316f58718b53b1f9c08c5151f9a
         | 
    
        data/CHANGES.md
    CHANGED
    
    
    
        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:
         | 
    
        data/bin/stackup
    CHANGED
    
    | @@ -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
         | 
    
        data/lib/stackup/version.rb
    CHANGED
    
    
    
        data/lib/stackup/yaml.rb
    ADDED
    
    | @@ -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. | 
| 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- | 
| 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. | 
| 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
         |