chambermaid 0.0.1 → 0.3.2
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 +0 -3
- data/Gemfile.lock +2 -2
- data/README.md +24 -3
- data/chambermaid.gemspec +2 -0
- data/lib/chambermaid.rb +3 -1
- data/lib/chambermaid/base.rb +113 -0
- data/lib/chambermaid/environment.rb +68 -0
- data/lib/chambermaid/namespace.rb +42 -0
- data/lib/chambermaid/parameter_store.rb +67 -0
- data/lib/chambermaid/version.rb +1 -1
- metadata +34 -2
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA256:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: fbcb610044b8dd8ff4487cb6729889f18dde9a32bd09b25620b53b6c6336a9e9
         | 
| 4 | 
            +
              data.tar.gz: 80abde8476c848335de1f9557f49557322a1463f36419fe8c986a53ee18cb816
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: beb4b9d61c45e48bd48497e2cf27fec7cd5055447aac237324b298ba343b3d4bed49a46151aff364a90049ac31ae78b2c9dcf51b42cfa3cf000c3adde06a9552
         | 
| 7 | 
            +
              data.tar.gz: 4228d741b603f187e69d3c900efae0241808eccabd4e3227b745cfd4e75e9c570949071c5d46c079d3ecd34992704c0390cea0f6b174c8560c2ce8ba3fe361f9
         | 
    
        data/Gemfile
    CHANGED
    
    
    
        data/Gemfile.lock
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            PATH
         | 
| 2 2 | 
             
              remote: .
         | 
| 3 3 | 
             
              specs:
         | 
| 4 | 
            -
                chambermaid (0. | 
| 4 | 
            +
                chambermaid (0.3.2)
         | 
| 5 5 | 
             
                  aws-sdk-ssm (~> 1.85)
         | 
| 6 6 |  | 
| 7 7 | 
             
            GEM
         | 
| 8 8 | 
             
              remote: https://rubygems.org/
         | 
| 9 9 | 
             
              specs:
         | 
| 10 10 | 
             
                aws-eventstream (1.1.0)
         | 
| 11 | 
            -
                aws-partitions (1. | 
| 11 | 
            +
                aws-partitions (1.349.0)
         | 
| 12 12 | 
             
                aws-sdk-core (3.104.3)
         | 
| 13 13 | 
             
                  aws-eventstream (~> 1, >= 1.0.2)
         | 
| 14 14 | 
             
                  aws-partitions (~> 1, >= 1.239.0)
         | 
    
        data/README.md
    CHANGED
    
    | @@ -1,4 +1,4 @@ | |
| 1 | 
            -
            # Chambermaid
         | 
| 1 | 
            +
            # Chambermaid [](https://badge.fury.io/rb/chambermaid) [](https://travis-ci.com/mileszim/chambermaid)
         | 
| 2 2 |  | 
| 3 3 | 
             
            Companion RubyGem for [chamber](https://github.com/segmentio/chamber).
         | 
| 4 4 |  | 
| @@ -22,18 +22,39 @@ Or install it yourself as: | |
| 22 22 |  | 
| 23 23 | 
             
            ## Usage
         | 
| 24 24 |  | 
| 25 | 
            +
            **Standalone**
         | 
| 26 | 
            +
             | 
| 27 | 
            +
            ```ruby
         | 
| 28 | 
            +
            Chambermaid.add_namespace("/my/param/namespace")
         | 
| 29 | 
            +
            Chambermaid.add_service("my-chamber-service")
         | 
| 30 | 
            +
            ```
         | 
| 31 | 
            +
             | 
| 32 | 
            +
            **Configuration Block**
         | 
| 33 | 
            +
             | 
| 25 34 | 
             
            ```ruby
         | 
| 26 35 | 
             
            # config/initializers/chambermaid.rb
         | 
| 27 36 |  | 
| 28 37 | 
             
            Chambermaid.configure do |config|
         | 
| 29 38 | 
             
              config.add_namespace("/my/param/namespace")
         | 
| 39 | 
            +
              config.add_service("my-chamber-service")
         | 
| 30 40 |  | 
| 31 | 
            -
              # Set ` | 
| 41 | 
            +
              # Set `overload: true` to choose these params over existing
         | 
| 32 42 | 
             
              # ones in ENV when they are merged together
         | 
| 33 | 
            -
              config.add_namespace("/my/important/namespace",  | 
| 43 | 
            +
              config.add_namespace("/my/important/namespace", overload: true)
         | 
| 34 44 | 
             
            end
         | 
| 35 45 | 
             
            ```
         | 
| 36 46 |  | 
| 47 | 
            +
            **Reload SSM into ENV**
         | 
| 48 | 
            +
            ```ruby
         | 
| 49 | 
            +
            Chambermaid.reload!
         | 
| 50 | 
            +
            ```
         | 
| 51 | 
            +
             | 
| 52 | 
            +
            **Restore ENV to original state**
         | 
| 53 | 
            +
            ```ruby
         | 
| 54 | 
            +
            Chambermaid.restore!
         | 
| 55 | 
            +
            Chambermaid.reset! # alias of .restore!
         | 
| 56 | 
            +
            ```
         | 
| 57 | 
            +
             | 
| 37 58 | 
             
            ## Development
         | 
| 38 59 |  | 
| 39 60 | 
             
            After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
         | 
    
        data/chambermaid.gemspec
    CHANGED
    
    
    
        data/lib/chambermaid.rb
    CHANGED
    
    
| @@ -0,0 +1,113 @@ | |
| 1 | 
            +
            require "chambermaid/environment"
         | 
| 2 | 
            +
            require "chambermaid/namespace"
         | 
| 3 | 
            +
            require "chambermaid/parameter_store"
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            module Chambermaid
         | 
| 6 | 
            +
              module Base
         | 
| 7 | 
            +
                def self.extended(base)
         | 
| 8 | 
            +
                  # Make a copy of ENV before we mess it all up
         | 
| 9 | 
            +
                  @@_original_env = ENV.to_h.dup.freeze
         | 
| 10 | 
            +
                end
         | 
| 11 | 
            +
             | 
| 12 | 
            +
                extend self
         | 
| 13 | 
            +
             | 
| 14 | 
            +
                def configure
         | 
| 15 | 
            +
                  yield self
         | 
| 16 | 
            +
                  load!
         | 
| 17 | 
            +
                end
         | 
| 18 | 
            +
             | 
| 19 | 
            +
                # @todo
         | 
| 20 | 
            +
                def configuration
         | 
| 21 | 
            +
                  raise "Namespaces must be defined" unless @namespaces
         | 
| 22 | 
            +
                end
         | 
| 23 | 
            +
             | 
| 24 | 
            +
                # Load SSM into ENV
         | 
| 25 | 
            +
                def load!
         | 
| 26 | 
            +
                  @namespaces.each(&:load!)
         | 
| 27 | 
            +
                end
         | 
| 28 | 
            +
             | 
| 29 | 
            +
                # @todo
         | 
| 30 | 
            +
                def reload!
         | 
| 31 | 
            +
                  @namespaces.each(&:reload!)
         | 
| 32 | 
            +
                end
         | 
| 33 | 
            +
             | 
| 34 | 
            +
                def unload!
         | 
| 35 | 
            +
                  @namespaces.each(&:unload!)
         | 
| 36 | 
            +
                end
         | 
| 37 | 
            +
             | 
| 38 | 
            +
                # Restore ENV to its original state
         | 
| 39 | 
            +
                def restore!
         | 
| 40 | 
            +
                  ENV.replace(@@_original_env)
         | 
| 41 | 
            +
                end
         | 
| 42 | 
            +
                alias :reset! :restore!
         | 
| 43 | 
            +
             | 
| 44 | 
            +
                # Add an AWS SSM parameter namespace to ENV
         | 
| 45 | 
            +
                #
         | 
| 46 | 
            +
                # @param [String] path
         | 
| 47 | 
            +
                # @param [Boolean] overload
         | 
| 48 | 
            +
                #   true  - replace any duplicate ENV keys with new params
         | 
| 49 | 
            +
                #   false - keep any existing duplicate ENV key values
         | 
| 50 | 
            +
                #
         | 
| 51 | 
            +
                # @raise [ArgumentError]
         | 
| 52 | 
            +
                #   when `path` is not a string
         | 
| 53 | 
            +
                #
         | 
| 54 | 
            +
                # @example
         | 
| 55 | 
            +
                #   Chambermaid.add_namespace("/my/param/namespace")
         | 
| 56 | 
            +
                #
         | 
| 57 | 
            +
                # @example overload duplicate ENV vars
         | 
| 58 | 
            +
                #   Chambermaid.add_namespace("/my/param/namespace", overload: true)
         | 
| 59 | 
            +
                def add_namespace(path, overload: false)
         | 
| 60 | 
            +
                  raise ArgumentError.new("`path` must be a string") unless path.is_a?(String)
         | 
| 61 | 
            +
                  raise ArgumentError.new("`overload` must be a boolean") unless [true, false].include?(overload)
         | 
| 62 | 
            +
             | 
| 63 | 
            +
                  namespaces << Namespace.new(path: path, overload: overload)
         | 
| 64 | 
            +
                end
         | 
| 65 | 
            +
             | 
| 66 | 
            +
                # Immediately load an AWS SSM parameter namespace to ENV
         | 
| 67 | 
            +
                #
         | 
| 68 | 
            +
                # @param [String] path
         | 
| 69 | 
            +
                # @param [Boolean] overload
         | 
| 70 | 
            +
                #   true  - replace any duplicate ENV keys with new params
         | 
| 71 | 
            +
                #   false - keep any existing duplicate ENV key values
         | 
| 72 | 
            +
                #
         | 
| 73 | 
            +
                # @raise [ArgumentError]
         | 
| 74 | 
            +
                #   when `path` is not a string
         | 
| 75 | 
            +
                #
         | 
| 76 | 
            +
                # @example
         | 
| 77 | 
            +
                #   Chambermaid.add_namespace!("/my/param/namespace")
         | 
| 78 | 
            +
                #
         | 
| 79 | 
            +
                # @example overload duplicate ENV vars
         | 
| 80 | 
            +
                #   Chambermaid.add_namespace("/my/param/namespace", overload: true)
         | 
| 81 | 
            +
                def add_namespace!(path, overload: false)
         | 
| 82 | 
            +
                  raise ArgumentError.new("`path` must be a string") unless path.is_a?(String)
         | 
| 83 | 
            +
                  raise ArgumentError.new("`overload` must be a boolean") unless [true, false].include?(overload)
         | 
| 84 | 
            +
             | 
| 85 | 
            +
                  namespaces << Namespace.load!(path: path, overload: overload)
         | 
| 86 | 
            +
                end
         | 
| 87 | 
            +
             | 
| 88 | 
            +
                # Add all secrets from Chamber service to ENV
         | 
| 89 | 
            +
                #
         | 
| 90 | 
            +
                # @param [String] service
         | 
| 91 | 
            +
                # @param [Boolean] overload
         | 
| 92 | 
            +
                #   true  - replace any duplicate ENV keys with new params
         | 
| 93 | 
            +
                #   false - keep any existing duplicate ENV key values
         | 
| 94 | 
            +
                #
         | 
| 95 | 
            +
                # @example
         | 
| 96 | 
            +
                #   Chambermaid.add_service("my-chamber-service")
         | 
| 97 | 
            +
                #
         | 
| 98 | 
            +
                # @example overload duplicate ENV vars
         | 
| 99 | 
            +
                #   Chambermaid.add_service("my-chamber-service", overload: true)
         | 
| 100 | 
            +
                #
         | 
| 101 | 
            +
                # @see {Chambermaid::Base.add_namespace}
         | 
| 102 | 
            +
                def add_service(service, overload: false)
         | 
| 103 | 
            +
                  service = "/#{service}" unless service[0] == "/"
         | 
| 104 | 
            +
                  add_namespace(service)
         | 
| 105 | 
            +
                end
         | 
| 106 | 
            +
             | 
| 107 | 
            +
                private
         | 
| 108 | 
            +
             | 
| 109 | 
            +
                def namespaces
         | 
| 110 | 
            +
                  @namespaces ||= []
         | 
| 111 | 
            +
                end
         | 
| 112 | 
            +
              end
         | 
| 113 | 
            +
            end
         | 
| @@ -0,0 +1,68 @@ | |
| 1 | 
            +
            module Chambermaid
         | 
| 2 | 
            +
              class Environment < Hash
         | 
| 3 | 
            +
                attr_reader :params
         | 
| 4 | 
            +
             | 
| 5 | 
            +
                # Create new Chambermaid::Environment
         | 
| 6 | 
            +
                #
         | 
| 7 | 
            +
                # @param [Hash] params
         | 
| 8 | 
            +
                #
         | 
| 9 | 
            +
                # @raise [ArgumentError]
         | 
| 10 | 
            +
                #   if params is not type Hash
         | 
| 11 | 
            +
                #
         | 
| 12 | 
            +
                # @return [Chambermaid::Environment]
         | 
| 13 | 
            +
                def initialize(params)
         | 
| 14 | 
            +
                  validate_params!(params)
         | 
| 15 | 
            +
                  stash_current_env!
         | 
| 16 | 
            +
                  update(format_env(params))
         | 
| 17 | 
            +
                end
         | 
| 18 | 
            +
             | 
| 19 | 
            +
                # Generate a dotenv (.env) compatible string
         | 
| 20 | 
            +
                #
         | 
| 21 | 
            +
                # @return [String] dotenv compatible string
         | 
| 22 | 
            +
                def to_dotenv
         | 
| 23 | 
            +
                  to_h.inject("") do |env_str, param|
         | 
| 24 | 
            +
                    env_str + "#{param[0]}=#{param[1]}\n"
         | 
| 25 | 
            +
                  end
         | 
| 26 | 
            +
                end
         | 
| 27 | 
            +
             | 
| 28 | 
            +
                # Write a .env file
         | 
| 29 | 
            +
                #
         | 
| 30 | 
            +
                # @param [String] file_path
         | 
| 31 | 
            +
                def to_file!(file_path)
         | 
| 32 | 
            +
                  File.open(file_path, "wb") do |f|
         | 
| 33 | 
            +
                    f.write(to_dotenv)
         | 
| 34 | 
            +
                  end
         | 
| 35 | 
            +
                end
         | 
| 36 | 
            +
             | 
| 37 | 
            +
                # Inject into ENV without overwriting duplicates
         | 
| 38 | 
            +
                def load!
         | 
| 39 | 
            +
                  each { |k, v| ENV[k] ||= v }
         | 
| 40 | 
            +
                end
         | 
| 41 | 
            +
             | 
| 42 | 
            +
                # Inject into ENV and overwrite duplicates
         | 
| 43 | 
            +
                def overload!
         | 
| 44 | 
            +
                  each { |k, v| ENV[k] = v }
         | 
| 45 | 
            +
                end
         | 
| 46 | 
            +
             | 
| 47 | 
            +
                # Restore to original ENV
         | 
| 48 | 
            +
                def unload!
         | 
| 49 | 
            +
                  ENV.replace(@_original_env)
         | 
| 50 | 
            +
                end
         | 
| 51 | 
            +
             | 
| 52 | 
            +
                private
         | 
| 53 | 
            +
             | 
| 54 | 
            +
                def stash_current_env!
         | 
| 55 | 
            +
                  @_original_env ||= ENV.to_h.dup.freeze
         | 
| 56 | 
            +
                end
         | 
| 57 | 
            +
             | 
| 58 | 
            +
                def format_env(params)
         | 
| 59 | 
            +
                  params.map{|k,v| [k.upcase, v]}.to_h
         | 
| 60 | 
            +
                end
         | 
| 61 | 
            +
             | 
| 62 | 
            +
                def validate_params!(params)
         | 
| 63 | 
            +
                  unless params.is_a?(Hash)
         | 
| 64 | 
            +
                    raise ArgumentError.new("`params` must be a hash")
         | 
| 65 | 
            +
                  end
         | 
| 66 | 
            +
                end
         | 
| 67 | 
            +
              end
         | 
| 68 | 
            +
            end
         | 
| @@ -0,0 +1,42 @@ | |
| 1 | 
            +
            module Chambermaid
         | 
| 2 | 
            +
              class Namespace
         | 
| 3 | 
            +
                # @param [String] path
         | 
| 4 | 
            +
                # @param [Boolean] overload
         | 
| 5 | 
            +
                def initialize(path:, overload: false)
         | 
| 6 | 
            +
                  @path = path
         | 
| 7 | 
            +
                  @overload = overload
         | 
| 8 | 
            +
             | 
| 9 | 
            +
                  @store = ParameterStore.new(path: path)
         | 
| 10 | 
            +
                  @env = Environment.new({})
         | 
| 11 | 
            +
                end
         | 
| 12 | 
            +
             | 
| 13 | 
            +
                def self.load!(path:, overload: false)
         | 
| 14 | 
            +
                  namespace = new(path: path, overload: overload)
         | 
| 15 | 
            +
                  namespace.load!
         | 
| 16 | 
            +
                  namespace
         | 
| 17 | 
            +
                end
         | 
| 18 | 
            +
             | 
| 19 | 
            +
                def load!
         | 
| 20 | 
            +
                  @store.load!
         | 
| 21 | 
            +
                  load_env!
         | 
| 22 | 
            +
                end
         | 
| 23 | 
            +
             | 
| 24 | 
            +
                def reload!
         | 
| 25 | 
            +
                  @env.unload!
         | 
| 26 | 
            +
                  @store.reload!
         | 
| 27 | 
            +
                  load_env!
         | 
| 28 | 
            +
                end
         | 
| 29 | 
            +
             | 
| 30 | 
            +
                def unload!
         | 
| 31 | 
            +
                  @env.unload!
         | 
| 32 | 
            +
                end
         | 
| 33 | 
            +
             | 
| 34 | 
            +
                private
         | 
| 35 | 
            +
             | 
| 36 | 
            +
                # Inject into ENV
         | 
| 37 | 
            +
                def load_env!
         | 
| 38 | 
            +
                  @env.replace(@store.params)
         | 
| 39 | 
            +
                  @overload ? @env.overload! : @env.load!
         | 
| 40 | 
            +
                end
         | 
| 41 | 
            +
              end
         | 
| 42 | 
            +
            end
         | 
| @@ -0,0 +1,67 @@ | |
| 1 | 
            +
            require "aws-sdk-ssm"
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module Chambermaid
         | 
| 4 | 
            +
              class ParameterStore
         | 
| 5 | 
            +
                def initialize(path:)
         | 
| 6 | 
            +
                  @path = path
         | 
| 7 | 
            +
                end
         | 
| 8 | 
            +
             | 
| 9 | 
            +
                def load!
         | 
| 10 | 
            +
                  fetch_ssm_params!
         | 
| 11 | 
            +
                end
         | 
| 12 | 
            +
             | 
| 13 | 
            +
                def reload!
         | 
| 14 | 
            +
                  clear_params!
         | 
| 15 | 
            +
                  fetch_ssm_params!
         | 
| 16 | 
            +
                end
         | 
| 17 | 
            +
             | 
| 18 | 
            +
                def loaded?
         | 
| 19 | 
            +
                  !@params_list.empty?
         | 
| 20 | 
            +
                end
         | 
| 21 | 
            +
             | 
| 22 | 
            +
                def self.load!(path:)
         | 
| 23 | 
            +
                  store = new(path: path)
         | 
| 24 | 
            +
                  store.load!
         | 
| 25 | 
            +
                  store
         | 
| 26 | 
            +
                end
         | 
| 27 | 
            +
             | 
| 28 | 
            +
                def params
         | 
| 29 | 
            +
                  @params ||= @param_list.map { |p|
         | 
| 30 | 
            +
                    [p.name.split("/").last.upcase, p.value]
         | 
| 31 | 
            +
                  }.to_h
         | 
| 32 | 
            +
                end
         | 
| 33 | 
            +
             | 
| 34 | 
            +
                alias :to_h :params
         | 
| 35 | 
            +
             | 
| 36 | 
            +
                private
         | 
| 37 | 
            +
             | 
| 38 | 
            +
                def client
         | 
| 39 | 
            +
                  @client ||= Aws::SSM::Client.new
         | 
| 40 | 
            +
                end
         | 
| 41 | 
            +
             | 
| 42 | 
            +
                def fetch_ssm_params!
         | 
| 43 | 
            +
                  @param_list = []
         | 
| 44 | 
            +
                  response = nil
         | 
| 45 | 
            +
                  loop do
         | 
| 46 | 
            +
                    response = fetch_ssm_param_batch!(response&.next_token)
         | 
| 47 | 
            +
                    @param_list.concat(response.parameters)
         | 
| 48 | 
            +
             | 
| 49 | 
            +
                    break unless response.next_token
         | 
| 50 | 
            +
                  end
         | 
| 51 | 
            +
                end
         | 
| 52 | 
            +
             | 
| 53 | 
            +
                def fetch_ssm_param_batch!(next_token = nil)
         | 
| 54 | 
            +
                  client.get_parameters_by_path(
         | 
| 55 | 
            +
                    path: @path,
         | 
| 56 | 
            +
                    with_decryption: true,
         | 
| 57 | 
            +
                    recursive: true,
         | 
| 58 | 
            +
                    next_token: next_token
         | 
| 59 | 
            +
                  )
         | 
| 60 | 
            +
                end
         | 
| 61 | 
            +
             | 
| 62 | 
            +
                def clear_params!
         | 
| 63 | 
            +
                  @params = nil
         | 
| 64 | 
            +
                  @params_list = []
         | 
| 65 | 
            +
                end
         | 
| 66 | 
            +
              end
         | 
| 67 | 
            +
            end
         | 
    
        data/lib/chambermaid/version.rb
    CHANGED
    
    
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: chambermaid
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0. | 
| 4 | 
            +
              version: 0.3.2
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Miles Zimmerman
         | 
| 8 8 | 
             
            autorequire: 
         | 
| 9 9 | 
             
            bindir: exe
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date: 2020- | 
| 11 | 
            +
            date: 2020-08-02 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: aws-sdk-ssm
         | 
| @@ -24,6 +24,34 @@ dependencies: | |
| 24 24 | 
             
                - - "~>"
         | 
| 25 25 | 
             
                  - !ruby/object:Gem::Version
         | 
| 26 26 | 
             
                    version: '1.85'
         | 
| 27 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 28 | 
            +
              name: rspec
         | 
| 29 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 30 | 
            +
                requirements:
         | 
| 31 | 
            +
                - - "~>"
         | 
| 32 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 33 | 
            +
                    version: '3.0'
         | 
| 34 | 
            +
              type: :development
         | 
| 35 | 
            +
              prerelease: false
         | 
| 36 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 37 | 
            +
                requirements:
         | 
| 38 | 
            +
                - - "~>"
         | 
| 39 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 40 | 
            +
                    version: '3.0'
         | 
| 41 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 42 | 
            +
              name: rake
         | 
| 43 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 44 | 
            +
                requirements:
         | 
| 45 | 
            +
                - - "~>"
         | 
| 46 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 47 | 
            +
                    version: '12.0'
         | 
| 48 | 
            +
              type: :development
         | 
| 49 | 
            +
              prerelease: false
         | 
| 50 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 51 | 
            +
                requirements:
         | 
| 52 | 
            +
                - - "~>"
         | 
| 53 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 54 | 
            +
                    version: '12.0'
         | 
| 27 55 | 
             
            description: 
         | 
| 28 56 | 
             
            email:
         | 
| 29 57 | 
             
            - miles@asktrim.com
         | 
| @@ -44,6 +72,10 @@ files: | |
| 44 72 | 
             
            - bin/setup
         | 
| 45 73 | 
             
            - chambermaid.gemspec
         | 
| 46 74 | 
             
            - lib/chambermaid.rb
         | 
| 75 | 
            +
            - lib/chambermaid/base.rb
         | 
| 76 | 
            +
            - lib/chambermaid/environment.rb
         | 
| 77 | 
            +
            - lib/chambermaid/namespace.rb
         | 
| 78 | 
            +
            - lib/chambermaid/parameter_store.rb
         | 
| 47 79 | 
             
            - lib/chambermaid/version.rb
         | 
| 48 80 | 
             
            homepage: https://github.com/mileszim/chambermaid
         | 
| 49 81 | 
             
            licenses:
         |