humidifier 4.1.1 → 4.2.0

Sign up to get free protection for your applications and to get access to all the features.
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