humidifier 4.1.1 → 4.2.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.
data/Gemfile CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- source 'https://rubygems.org'
3
+ source "https://rubygems.org"
4
4
 
5
5
  gemspec
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- humidifier (4.1.1)
4
+ humidifier (4.2.0)
5
5
  aws-sdk-cloudformation (~> 1.25)
6
6
  aws-sdk-s3 (~> 1.48)
7
7
  fast_underscore (~> 0.3)
@@ -14,52 +14,50 @@ GEM
14
14
  specs:
15
15
  ast (2.4.2)
16
16
  aws-eventstream (1.2.0)
17
- aws-partitions (1.531.0)
18
- aws-sdk-cloudformation (1.60.0)
19
- aws-sdk-core (~> 3, >= 3.122.0)
17
+ aws-partitions (1.592.0)
18
+ aws-sdk-cloudformation (1.69.0)
19
+ aws-sdk-core (~> 3, >= 3.127.0)
20
20
  aws-sigv4 (~> 1.1)
21
- aws-sdk-core (3.122.1)
21
+ aws-sdk-core (3.131.1)
22
22
  aws-eventstream (~> 1, >= 1.0.2)
23
23
  aws-partitions (~> 1, >= 1.525.0)
24
24
  aws-sigv4 (~> 1.1)
25
- jmespath (~> 1.0)
26
- aws-sdk-kms (1.51.0)
27
- aws-sdk-core (~> 3, >= 3.122.0)
25
+ jmespath (~> 1, >= 1.6.1)
26
+ aws-sdk-kms (1.56.0)
27
+ aws-sdk-core (~> 3, >= 3.127.0)
28
28
  aws-sigv4 (~> 1.1)
29
- aws-sdk-s3 (1.105.1)
30
- aws-sdk-core (~> 3, >= 3.122.0)
29
+ aws-sdk-s3 (1.114.0)
30
+ aws-sdk-core (~> 3, >= 3.127.0)
31
31
  aws-sdk-kms (~> 1)
32
32
  aws-sigv4 (~> 1.4)
33
- aws-sigv4 (1.4.0)
33
+ aws-sigv4 (1.5.0)
34
34
  aws-eventstream (~> 1, >= 1.0.2)
35
35
  docile (1.4.0)
36
36
  fast_underscore (0.3.3)
37
37
  hollaback (0.1.1)
38
- jmespath (1.4.0)
39
- mini_portile2 (2.6.1)
40
- minitest (5.14.4)
41
- nokogiri (1.12.5)
42
- mini_portile2 (~> 2.6.1)
38
+ jmespath (1.6.1)
39
+ minitest (5.15.0)
40
+ nokogiri (1.13.6-x86_64-darwin)
43
41
  racc (~> 1.4)
44
- parallel (1.21.0)
45
- parser (3.0.2.0)
42
+ parallel (1.22.1)
43
+ parser (3.1.2.0)
46
44
  ast (~> 2.4.1)
47
45
  racc (1.6.0)
48
- rainbow (3.0.0)
46
+ rainbow (3.1.1)
49
47
  rake (13.0.6)
50
- regexp_parser (2.1.1)
48
+ regexp_parser (2.5.0)
51
49
  rexml (3.2.5)
52
- rubocop (1.23.0)
50
+ rubocop (1.30.1)
53
51
  parallel (~> 1.10)
54
- parser (>= 3.0.0.0)
52
+ parser (>= 3.1.0.0)
55
53
  rainbow (>= 2.2.2, < 4.0)
56
54
  regexp_parser (>= 1.8, < 3.0)
57
- rexml
58
- rubocop-ast (>= 1.12.0, < 2.0)
55
+ rexml (>= 3.2.5, < 4.0)
56
+ rubocop-ast (>= 1.18.0, < 2.0)
59
57
  ruby-progressbar (~> 1.7)
60
58
  unicode-display_width (>= 1.4.0, < 3.0)
61
- rubocop-ast (1.13.0)
62
- parser (>= 3.0.1.1)
59
+ rubocop-ast (1.18.0)
60
+ parser (>= 3.1.1.0)
63
61
  ruby-progressbar (1.11.0)
64
62
  simplecov (0.21.2)
65
63
  docile (~> 1.1)
@@ -67,12 +65,14 @@ GEM
67
65
  simplecov_json_formatter (~> 0.1)
68
66
  simplecov-html (0.12.3)
69
67
  simplecov_json_formatter (0.1.3)
70
- thor (1.1.0)
71
- thor-hollaback (0.2.0)
72
- hollaback (~> 0.1.0)
68
+ thor (1.2.1)
69
+ thor-hollaback (0.2.1)
70
+ hollaback (~> 0.1)
73
71
  thor (>= 0.19.1)
74
72
  unicode-display_width (2.1.0)
75
- yard (0.9.26)
73
+ webrick (1.7.0)
74
+ yard (0.9.28)
75
+ webrick (~> 1.7.0)
76
76
 
77
77
  PLATFORMS
78
78
  ruby
@@ -82,7 +82,7 @@ DEPENDENCIES
82
82
  humidifier!
83
83
  minitest (~> 5.13)
84
84
  rake (~> 13.0)
85
- rubocop (~> 1.0)
85
+ rubocop (~> 1.24)
86
86
  simplecov (~> 0.17)
87
87
  yard (~> 0.9)
88
88
 
data/README.md CHANGED
@@ -25,6 +25,7 @@ Humidifier is a ruby tool for managing [AWS CloudFormation](https://aws.amazon.c
25
25
  - [`upgrade`](#upgrade)
26
26
  - [`upload [?stack]`](#upload-stack)
27
27
  - [`validate [?stack]`](#validate-stack)
28
+ - [`version`](#version)
28
29
  - [Parameters](#parameters)
29
30
  - [Shortcuts](#shortcuts)
30
31
  - [Automatic id properties](#automatic-id-properties)
@@ -272,6 +273,10 @@ Upload one or all stacks in the repo to S3 for reference later. Note that this m
272
273
 
273
274
  Validate that one or all stacks in the repo are properly configured and using values that CloudFormation understands.
274
275
 
276
+ #### `version`
277
+
278
+ Output the version of `Humidifier` as well as the version of the CloudFormation resource specification that you are using.
279
+
275
280
  ### Parameters
276
281
 
277
282
  CloudFormation template parameters can be specified by having a special `parameters.yml` file in your stack directory. This file should contain a YAML-encoded object whose keys are the names of the parameters and whose values are the parameter configuration (using the same underscore paradigm as `humidifier` resources for specifying configuration).
data/Rakefile CHANGED
@@ -1,26 +1,26 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'bundler/gem_tasks'
4
- require 'fileutils'
5
- require 'rake/testtask'
6
- require 'yard'
3
+ require "bundler/gem_tasks"
4
+ require "fileutils"
5
+ require "rake/testtask"
6
+ require "yard"
7
7
 
8
8
  Rake::TestTask.new(:test) do |t|
9
- t.libs << 'test'
10
- t.libs << 'lib'
11
- t.test_files = FileList['test/**/*_test.rb']
9
+ t.libs << "test"
10
+ t.libs << "lib"
11
+ t.test_files = FileList["test/**/*_test.rb"]
12
12
  t.warning = false
13
13
  end
14
14
 
15
15
  task default: :test
16
16
 
17
17
  YARD::Rake::YardocTask.new(:yard) do |t|
18
- filepath = File.join('lib', 'humidifier', 'magic.rb')
18
+ filepath = File.join("lib", "humidifier", "magic.rb")
19
19
 
20
- t.stats_options = ['--list-undoc']
20
+ t.stats_options = ["--list-undoc"]
21
21
  t.before = lambda do
22
- require 'humidifier'
23
- require_relative 'yard/dynamic'
22
+ require "humidifier"
23
+ require_relative "yard/dynamic"
24
24
  Dynamic.generate(filepath)
25
25
  end
26
26
  t.after = -> { FileUtils.rm(filepath) }
data/exe/humidifier CHANGED
@@ -3,13 +3,13 @@
3
3
 
4
4
  # If there is a `bin/humidifier` file, then swap out execution of this default
5
5
  # CLI with the custom CLI instead.
6
- if File.file?(File.join('bin', 'humidifier'))
7
- exec(File.join('bin', 'humidifier'))
6
+ if File.file?(File.join("bin", "humidifier"))
7
+ exec(File.join("bin", "humidifier"))
8
8
  end
9
9
 
10
- require 'bundler/setup'
10
+ require "bundler/setup"
11
11
 
12
- $LOAD_PATH.unshift File.expand_path(File.join('..', 'lib'), __dir__)
13
- require 'humidifier'
12
+ $LOAD_PATH.unshift File.expand_path(File.join("..", "lib"), __dir__)
13
+ require "humidifier"
14
14
 
15
15
  Humidifier::CLI.start(ARGV)
data/humidifier.gemspec CHANGED
@@ -1,27 +1,27 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative 'lib/humidifier/version'
3
+ require_relative "lib/humidifier/version"
4
4
 
5
5
  version = Humidifier::VERSION
6
- repository = 'https://github.com/kddnewton/humidifier'
6
+ repository = "https://github.com/kddnewton/humidifier"
7
7
 
8
8
  Gem::Specification.new do |spec|
9
- spec.name = 'humidifier'
9
+ spec.name = "humidifier"
10
10
  spec.version = version
11
- spec.authors = ['Kevin Newton']
12
- spec.email = ['kddnewton@gmail.com']
11
+ spec.authors = ["Kevin Newton"]
12
+ spec.email = ["kddnewton@gmail.com"]
13
13
 
14
- spec.summary = 'CloudFormation made easy'
15
- spec.description = 'Programmatically generate and manage AWS ' \
16
- 'CloudFormation templates, stacks, and change sets.'
14
+ spec.summary = "CloudFormation made easy"
15
+ spec.description = "Programmatically generate and manage AWS " \
16
+ "CloudFormation templates, stacks, and change sets."
17
17
  spec.homepage = repository
18
- spec.license = 'MIT'
18
+ spec.license = "MIT"
19
19
 
20
20
  spec.metadata = {
21
- 'bug_tracker_uri' => "#{repository}/issues",
22
- 'changelog_uri' => "#{repository}/blob/v#{version}/CHANGELOG.md",
23
- 'source_code_uri' => repository,
24
- 'rubygems_mfa_required' => 'true'
21
+ "bug_tracker_uri" => "#{repository}/issues",
22
+ "changelog_uri" => "#{repository}/blob/v#{version}/CHANGELOG.md",
23
+ "source_code_uri" => repository,
24
+ "rubygems_mfa_required" => "true"
25
25
  }
26
26
 
27
27
  spec.files = Dir.chdir(__dir__) do
@@ -30,21 +30,21 @@ Gem::Specification.new do |spec|
30
30
  end
31
31
  end
32
32
 
33
- spec.bindir = 'exe'
33
+ spec.bindir = "exe"
34
34
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
35
- spec.require_paths = ['lib']
36
-
37
- spec.add_dependency 'aws-sdk-cloudformation', '~> 1.25'
38
- spec.add_dependency 'aws-sdk-s3', '~> 1.48'
39
- spec.add_dependency 'fast_underscore', '~> 0.3'
40
- spec.add_dependency 'nokogiri', '~> 1.10'
41
- spec.add_dependency 'thor', '~> 1.0'
42
- spec.add_dependency 'thor-hollaback', '~> 0.2'
43
-
44
- spec.add_development_dependency 'bundler', '~> 2.0'
45
- spec.add_development_dependency 'minitest', '~> 5.13'
46
- spec.add_development_dependency 'rake', '~> 13.0'
47
- spec.add_development_dependency 'rubocop', '~> 1.0'
48
- spec.add_development_dependency 'simplecov', '~> 0.17'
49
- spec.add_development_dependency 'yard', '~> 0.9'
35
+ spec.require_paths = ["lib"]
36
+
37
+ spec.add_dependency "aws-sdk-cloudformation", "~> 1.25"
38
+ spec.add_dependency "aws-sdk-s3", "~> 1.48"
39
+ spec.add_dependency "fast_underscore", "~> 0.3"
40
+ spec.add_dependency "nokogiri", "~> 1.10"
41
+ spec.add_dependency "thor", "~> 1.0"
42
+ spec.add_dependency "thor-hollaback", "~> 0.2"
43
+
44
+ spec.add_development_dependency "bundler", "~> 2.0"
45
+ spec.add_development_dependency "minitest", "~> 5.13"
46
+ spec.add_development_dependency "rake", "~> 13.0"
47
+ spec.add_development_dependency "rubocop", "~> 1.24"
48
+ spec.add_development_dependency "simplecov", "~> 0.17"
49
+ spec.add_development_dependency "yard", "~> 0.9"
50
50
  end
@@ -4,13 +4,13 @@ module Humidifier
4
4
  # A CLI for running commands to manipulate the stacks that Humidifier knows
5
5
  # about.
6
6
  class CLI < Thor
7
- class_option :aws_profile, desc: 'The AWS profile to authenticate with',
8
- aliases: ['-p']
7
+ class_option :aws_profile, desc: "The AWS profile to authenticate with",
8
+ aliases: ["-p"]
9
9
 
10
- class_option :debug, desc: 'Sets up debug mode', aliases: ['-d']
10
+ class_option :debug, desc: "Sets up debug mode", aliases: ["-d"]
11
11
  class_around :safe_execute
12
12
 
13
- desc 'change [?stack]', 'Create changesets for one or all stacks'
13
+ desc "change [?stack]", "Create changesets for one or all stacks"
14
14
  def change(name = nil)
15
15
  authorize
16
16
 
@@ -22,10 +22,10 @@ module Humidifier
22
22
  end
23
23
  end
24
24
 
25
- desc 'deploy [?stack] [*parameters]', 'Update one or all stacks'
26
- option :wait, desc: 'Wait for the stack to create/update',
25
+ desc "deploy [?stack] [*parameters]", "Update one or all stacks"
26
+ option :wait, desc: "Wait for the stack to create/update",
27
27
  type: :boolean, default: false
28
- option :prefix, desc: 'The prefix to use for the stack'
28
+ option :prefix, desc: "The prefix to use for the stack"
29
29
  def deploy(name = nil, *parameters)
30
30
  authorize
31
31
 
@@ -37,8 +37,8 @@ module Humidifier
37
37
  end
38
38
  end
39
39
 
40
- desc 'display [stack] [?pattern]',
41
- 'Display the CloudFormation JSON for a given stack'
40
+ desc "display [stack] [?pattern]",
41
+ "Display the CloudFormation JSON for a given stack"
42
42
  def display(name, pattern = nil)
43
43
  directory = Directory.new(name, pattern: pattern && /#{pattern}/i)
44
44
 
@@ -46,21 +46,21 @@ module Humidifier
46
46
  puts directory.to_cf
47
47
  end
48
48
 
49
- desc 'stacks', 'List the stacks known to Humidifier'
49
+ desc "stacks", "List the stacks known to Humidifier"
50
50
  def stacks
51
- puts '🗒 Listing stacks'
51
+ puts "🗒 Listing stacks"
52
52
  puts Humidifier.config.stack_names.sort.map { |name| "- #{name}" }
53
53
  end
54
54
 
55
- desc 'upgrade', 'Download the latest CloudFormation resource specification'
55
+ desc "upgrade", "Download the latest CloudFormation resource specification"
56
56
  def upgrade
57
- print '💾 Downloading...'
57
+ print "💾 Downloading..."
58
58
 
59
59
  version = Upgrade.perform
60
60
  puts " upgraded to v#{version}"
61
61
  end
62
62
 
63
- desc 'upload [?stack]', 'Upload one or all stacks to S3'
63
+ desc "upload [?stack]", "Upload one or all stacks to S3"
64
64
  def upload(name = nil)
65
65
  authorize
66
66
 
@@ -72,22 +72,30 @@ module Humidifier
72
72
  end
73
73
  end
74
74
 
75
- desc 'validate [?stack]',
76
- 'Validate that one or all stacks are valid with CloudFormation'
75
+ desc "validate [?stack]",
76
+ "Validate that one or all stacks are valid with CloudFormation"
77
77
  def validate(name = nil)
78
78
  authorize
79
79
 
80
- print '🔍 Validating... '
80
+ print "🔍 Validating... "
81
81
 
82
82
  valid =
83
83
  stack_names_from(name).all? do |stack_name|
84
84
  Directory.new(stack_name).valid?
85
85
  end
86
86
 
87
- puts valid ? 'Valid.' : 'Invalid.'
87
+ puts valid ? "Valid." : "Invalid."
88
88
  end
89
89
 
90
- no_commands do # rubocop:disable Metrics/BlockLength
90
+ desc "version", "Display the version of Humidifier"
91
+ def version
92
+ filepath = File.expand_path("../../#{SPECIFICATION}", __dir__)
93
+ version = JSON.parse(File.read(filepath))["ResourceSpecificationVersion"]
94
+
95
+ puts "📦 CloudFormation specification v#{version}"
96
+ end
97
+
98
+ no_commands do
91
99
  def authorize
92
100
  return unless options[:aws_profile]
93
101
 
@@ -97,14 +105,14 @@ module Humidifier
97
105
 
98
106
  def parameters_from(opts)
99
107
  opts.map do |opt|
100
- key, value = opt.split('=')
108
+ key, value = opt.split("=")
101
109
  { parameter_key: key, parameter_value: value }
102
110
  end
103
111
  end
104
112
 
105
113
  def prelude
106
114
  command = @_invocations.values.dig(0, 0)
107
- command = command ? "#{command} " : ''
115
+ command = command ? "#{command} " : ""
108
116
  puts "\033[1mhumidifier #{command}v#{VERSION}\033[0m"
109
117
  end
110
118
 
@@ -118,7 +126,7 @@ module Humidifier
118
126
  puts error.message
119
127
  exit 1
120
128
  else
121
- puts '✨ Done in %.2fs.' % (Time.now.to_f - start)
129
+ puts "✨ Done in %.2fs." % (Time.now.to_f - start)
122
130
  end
123
131
 
124
132
  def stack_names_from(name)
@@ -83,7 +83,7 @@ module Humidifier
83
83
  end
84
84
  end
85
85
 
86
- def mapped_from(clazz, key, value) # rubocop:disable Metrics/MethodLength
86
+ def mapped_from(clazz, key, value)
87
87
  if self.class.attribute_methods.include?(key.to_sym)
88
88
  # The given attribute name has been defined using the `::attribute`
89
89
  # DSL method, so send the given value to that method and return the
@@ -10,7 +10,7 @@ module Humidifier
10
10
  raise Error, "Invalid resource: #{opts[:to].inspect}" if @clazz.nil?
11
11
 
12
12
  if opts[:using] && block_given?
13
- raise Error, 'Cannot specify :using and provide an anonymous mapper'
13
+ raise Error, "Cannot specify :using and provide an anonymous mapper"
14
14
  end
15
15
 
16
16
  @mapper = mapper_from(opts, &block)
@@ -33,7 +33,7 @@ module Humidifier
33
33
  end
34
34
 
35
35
  def normalized(name)
36
- name.start_with?('AWS') ? name : "AWS::#{name}"
36
+ name.start_with?("AWS") ? name : "AWS::#{name}"
37
37
  end
38
38
  end
39
39
  end
@@ -26,7 +26,7 @@ module Humidifier
26
26
 
27
27
  def initialize
28
28
  @mappings = {}
29
- @stack_path = '.'
29
+ @stack_path = "."
30
30
  end
31
31
 
32
32
  def files_for(name)
@@ -82,7 +82,7 @@ module Humidifier
82
82
  begin
83
83
  parameter_filepath =
84
84
  Humidifier.config.files_for(name).detect do |filepath|
85
- File.basename(filepath, '.yml') == 'parameters'
85
+ File.basename(filepath, ".yml") == "parameters"
86
86
  end
87
87
 
88
88
  parameter_filepath ? parameters_from(parameter_filepath) : {}
@@ -94,7 +94,7 @@ module Humidifier
94
94
  return {} unless loaded
95
95
 
96
96
  loaded.each_with_object({}) do |(name, opts), params|
97
- opts = opts.map { |key, value| [key.to_sym, value] }.to_h
97
+ opts = opts.to_h { |key, value| [key.to_sym, value] }
98
98
  params[name] = Parameter.new(opts)
99
99
  end
100
100
  end
@@ -109,7 +109,7 @@ module Humidifier
109
109
  loaded.each_with_object({}) do |(name, attributes), resources|
110
110
  next if pattern && name !~ pattern
111
111
 
112
- attribute = attributes.delete('export')
112
+ attribute = attributes.delete("export")
113
113
  exports << Export.new(name, attribute) if attribute
114
114
 
115
115
  resources[name] = mapping.resource_for(name, attributes)
@@ -120,10 +120,10 @@ module Humidifier
120
120
  filepaths = Humidifier.config.files_for(name)
121
121
 
122
122
  filepaths.each_with_object({}) do |filepath, resources|
123
- basename = File.basename(filepath, '.yml')
123
+ basename = File.basename(filepath, ".yml")
124
124
 
125
125
  # Explicitly skip past parameters so we can pull them out later
126
- next if basename == 'parameters'
126
+ next if basename == "parameters"
127
127
 
128
128
  resources.merge!(parse(filepath, basename))
129
129
  end