cfndsl-pipeline 0.1.4 → 0.1.5

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
  SHA256:
3
- metadata.gz: b2916ce7032d93f6a62603e4f7e0f67d1387429245eda792ae5aaa8421736cbc
4
- data.tar.gz: ef9800894ba6333955a3f1ab8bae3e4a2162a15c91a02049062267032a429224
3
+ metadata.gz: 5ac916d2749dd8f2515364b954dc62dc40e2d9d8242c930bfc0807ae702c2528
4
+ data.tar.gz: fb3f8cef4fa7cd04b13cca323835e3f1fbe226e5dc1d051c54627c980e3e186e
5
5
  SHA512:
6
- metadata.gz: 37fad470245cc31ac95127c0af8316b0ecdb28aa54a23e67fe5e9740eabecdb34ae48a7def92277ec01f54204390490a11f1ac46e06620166dff0afffc81c528
7
- data.tar.gz: 3a4a082fb5f433f84d0ac4605dc0ba53e0ab28645efccca3c8cd8e1a2d11b5c2bb411ca326df59066a75db974831828769a5166956e30a603b62c2f4801c67df
6
+ metadata.gz: ba4466092aede32b0161d0cb6dc10365dde94bd2ec31ba1a5c5c1f42dbc26cb8680c9eadf0758d525bb25428b9d99c8f5864fca88722b17c0a58a784cdfe39c5
7
+ data.tar.gz: 808e4b4a21329d741544a2241219a34449271607db408154f74a001509f9d682d1e736dfa7812b3795293450a36d6a499401ec44220653099aacb8ec825b2680
@@ -11,11 +11,11 @@ Metrics/MethodLength:
11
11
  Max: 25
12
12
 
13
13
  # Due to our @Properties style instance names
14
- Style/VariableName:
14
+ Naming/VariableName:
15
15
  Enabled: false
16
16
 
17
17
  # We are a DSL
18
- Style/MethodName:
18
+ Naming/MethodName:
19
19
  Enabled: false
20
20
 
21
21
  # Lone String
@@ -26,7 +26,7 @@ AllCops:
26
26
  Exclude:
27
27
  - 'tmp/**/*'
28
28
  - 'examples/**/*'
29
- - 'spec/*'
29
+ - 'spec/**/*'
30
30
  - Gemfile
31
31
  - Guardfile
32
32
  - Rakefile
data/Gemfile CHANGED
@@ -1,6 +1,5 @@
1
1
  source "https://rubygems.org"
2
2
  repo_name = "cmaxwellau/cfndsl-pipeline"
3
- gem "rubocop", ">= 0.49.0"
4
3
 
5
4
  git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
6
5
 
@@ -1,4 +1,6 @@
1
1
  #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
2
4
  require 'optparse'
3
5
  require 'cfndsl-pipeline'
4
6
 
@@ -8,7 +10,7 @@ cli_options = {
8
10
  }
9
11
 
10
12
  pipe_options = CfnDslPipeline::Options.new
11
-
13
+ # rubocop:disable Metrics/BlockLength
12
14
  op = OptionParser.new do |opts|
13
15
  opts.banner = USAGE
14
16
 
@@ -66,6 +68,7 @@ op = OptionParser.new do |opts|
66
68
  exit
67
69
  end
68
70
  end
71
+ # rubocop:enable Metrics/BlockLength
69
72
 
70
73
  op.parse!
71
74
 
@@ -106,7 +109,7 @@ end
106
109
  cfndsl_extras = []
107
110
  ARGV.each do |arg|
108
111
  cfndsl_extras << [:yaml, arg]
109
- end if ARGV.length > 0
112
+ end
110
113
 
111
114
  pipeline = CfnDslPipeline::Pipeline.new(cli_options[:output], pipe_options)
112
115
  pipeline.build(cli_options[:template], cfndsl_extras)
@@ -30,7 +30,7 @@ Gem::Specification.new do |s|
30
30
 
31
31
  s.executables << 'cfndsl_pipeline'
32
32
 
33
- s.add_development_dependency "bundler", "~> 1.5"
33
+ s.add_development_dependency "bundler", "~> 2.0"
34
34
  s.add_development_dependency "rake"
35
35
  s.add_development_dependency "rspec"
36
36
  s.add_development_dependency "cfndsl"
@@ -1,5 +1,6 @@
1
- #!/usr/bin/env ruby
2
- #
1
+ # rubocop:disable Naming/FileName
2
+ # frozen_string_literal: true
3
+
3
4
  # The MIT License
4
5
  #
5
6
  # Copyright (c) 2019 Cam Maxwell (cameron.maxwell@gmail.com)
@@ -53,7 +54,7 @@ module CfnDslPipeline
53
54
 
54
55
  def build(input_filename, cfndsl_extras)
55
56
  abort "Input file #{input_filename} doesn't exist!" unless File.file?(input_filename)
56
- self.input_filename = "#{input_filename}"
57
+ self.input_filename = input_filename.to_s
57
58
  self.base_name = File.basename(input_filename, '.*')
58
59
  self.output_filename = File.expand_path("#{output_dir}/#{base_name}.yaml")
59
60
  exec_cfndsl cfndsl_extras
@@ -63,3 +64,4 @@ module CfnDslPipeline
63
64
  end
64
65
  end
65
66
  end
67
+ # rubocop:enable Naming/FileName
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
 
2
3
  require 'optparse'
3
4
 
@@ -19,6 +20,7 @@ module CfnDslPipeline
19
20
 
20
21
  # rubocop:disable Metrics/AbcSize
21
22
  # rubocop:disable Metrics/MethodLength
23
+ # rubocop:disable Metrics/BlockLength
22
24
  def parse
23
25
  @op = OptionParser.new do |opts|
24
26
  opts.banner = USAGE
@@ -47,8 +49,8 @@ module CfnDslPipeline
47
49
  pipeline.validate_cfn_nag = false
48
50
  end
49
51
 
50
- opts.on('--audit-rule-dir', 'cfn_nag audit custom rules directory') do
51
- pipeline.cfn_nag[:rule_directory] = true
52
+ opts.on('--audit-rule-dir', 'cfn_nag audit custom rules directory') do |rule_dir|
53
+ pipeline.cfn_nag[:rule_directory] = rule_dir
52
54
  end
53
55
 
54
56
  opts.on('--audit-report', 'Save cfn_nag audit report') do
@@ -86,15 +88,17 @@ module CfnDslPipeline
86
88
 
87
89
  # first non-dash parameter is the mandatory input file
88
90
  @template = ARGV.pop
89
-
91
+ # rubocop:disable Style/MultilineIfModifier
90
92
  ARGV.each do |arg|
91
93
  @cfndsl_extras << [:yaml, arg]
92
- end if ARGV.length > 0
94
+ end unless ARGV.empty?
95
+ # rubocop:enable Style/MultilineIfModifier
93
96
 
94
97
  pipeline
95
98
  end
96
99
  # rubocop:enable Metrics/AbcSize
97
100
  # rubocop:enable Metrics/MethodLength
101
+ # rubocop:enable Metrics/BlockLength
98
102
 
99
103
  def fatal(msg)
100
104
  puts msg
@@ -1,9 +1,11 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'cfn-nag'
2
4
  require 'logging'
3
5
  require 'colorize'
4
6
 
5
7
  module CfnDslPipeline
6
- # Add cfn_nag functions to pipeline
8
+ # Interface to cfn_nag auditing
7
9
  class Pipeline
8
10
  def exec_cfn_nag
9
11
  puts 'Auditing template with cfn-nag...'
@@ -22,23 +24,28 @@ module CfnDslPipeline
22
24
  end
23
25
 
24
26
  def display_report(result)
25
- ColoredStdoutResults.new.render([
26
- {
27
- filename: "#{@base_name}",
28
- file_results: result
29
- }
30
- ])
27
+ ColoredStdoutResults.new.render(
28
+ [
29
+ {
30
+ filename: @base_name.to_s,
31
+ file_results: result
32
+ }
33
+ ]
34
+ )
31
35
  end
32
36
 
33
37
  def save_report(result)
34
38
  return unless options.save_audit_report
39
+
35
40
  report_data = Capture.capture do
36
- SimpleStdoutResults.new.render([
37
- {
38
- filename: "#{@base_name}",
39
- file_results: result
40
- }
41
- ])
41
+ SimpleStdoutResults.new.render(
42
+ [
43
+ {
44
+ filename: @base_name.to_s,
45
+ file_results: result
46
+ }
47
+ ]
48
+ )
42
49
  end
43
50
  filename = "#{output_dir}/#{base_name}.audit"
44
51
  File.open(File.expand_path(filename), 'w').puts report_data['stdout']
@@ -46,9 +53,9 @@ module CfnDslPipeline
46
53
  end
47
54
 
48
55
  def show_summary(result)
49
- if result[:failure_count] > 0
56
+ if result[:failure_count].positive?
50
57
  puts "Audit failed. #{result[:failure_count]} error(s) found ( ಠ ʖ̯ ಠ) ".red
51
- elsif result[:violations].count > 0
58
+ elsif result[:violations].count.positive?
52
59
  puts "Audit passed with #{result[:warning_count]} warnings. (._.) ".yellow
53
60
  else
54
61
  puts 'Audit passed! ヽ( ゚ヮ゚)/ ヽ(´ー`)ノ'.green
@@ -1,14 +1,16 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'cfndsl'
2
4
  require 'cfndsl/globals'
3
5
  require 'cfndsl/version'
4
6
 
5
7
  module CfnDslPipeline
6
- #
8
+ # Interface to cfndsl
7
9
  class Pipeline
8
10
  def exec_cfndsl(cfndsl_extras)
9
11
  puts 'Generating CloudFormation template...'
10
12
 
11
- model = CfnDsl.eval_file_with_extras("#{@input_filename}", cfndsl_extras, (options.debug_cfndsl ? STDOUT : nil))
13
+ model = CfnDsl.eval_file_with_extras(@input_filename.to_s, cfndsl_extras, (options.debug_cfndsl ? STDOUT : nil))
12
14
  @template = JSON.parse(model.to_json).to_yaml
13
15
  File.open(@output_filename, 'w') do |file|
14
16
  file.puts @template
@@ -1,17 +1,18 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'aws-sdk-cloudformation'
3
4
  require 'aws-sdk-s3'
4
5
  require 'uuid'
5
6
 
6
7
  module CfnDslPipeline
7
- #
8
+ # Interface to AWS SDK syntax checks
8
9
  class Pipeline
9
10
  attr_accessor :s3_client
10
11
 
11
12
  def initialize
12
13
  self.s3_client = Aws::S3::Client.new(region: aws_region)
13
14
  end
14
- # rubocop:disable Metrics/AbcSize
15
+
15
16
  def exec_syntax_validation
16
17
  puts 'Validating template syntax...'
17
18
  if options.estimate_cost || (output_file.size > 51_200)
@@ -31,7 +32,6 @@ module CfnDslPipeline
31
32
  end
32
33
  save_syntax_report
33
34
  end
34
- # rubocop:enable Metrics/AbcSize
35
35
 
36
36
  private
37
37
 
@@ -51,6 +51,7 @@ module CfnDslPipeline
51
51
 
52
52
  def save_syntax_report
53
53
  return unless options.save_syntax_report
54
+
54
55
  report_filename = "#{output_dir}/#{base_name}.report"
55
56
  puts "Syntax validation report written to #{report_filename}"
56
57
  File.open(File.expand_path(report_filename), 'w').puts syntax_report.to_hash.to_yaml
@@ -65,6 +66,7 @@ module CfnDslPipeline
65
66
 
66
67
  def estimate_cost(bucket, object_name)
67
68
  return unless options.estimate_cost
69
+
68
70
  puts 'Estimate cost of template...'
69
71
  client = Aws::CloudFormation::Client.new(region: options.aws_region)
70
72
  costing = client.estimate_template_cost(template_url: "https://#{bucket.url}/#{object_name}")
@@ -73,6 +75,7 @@ module CfnDslPipeline
73
75
 
74
76
  def s3_validate_syntax(bucket, object_name)
75
77
  return unless options.validate_syntax
78
+
76
79
  puts 'Validating template syntax in S3 Bucket...'
77
80
  client = Aws::CloudFormation::Client.new(region: options.aws_region)
78
81
  client.validate_template(template_url: "https://s3.amazonaws.com/#{bucket.url}/#{object_name}")
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'cfndsl/globals'
3
4
  require 'cfndsl/version'
4
5
  require 'cfndsl/external_parameters'
@@ -13,7 +14,7 @@ HAS_MAPPED_TAGS = %w([CfnDsl::AWS::Types::AWS_Serverless_Function CfnDsl::AWS::T
13
14
  # Automatically add Parameters for Tag values
14
15
  CfnDsl::CloudFormationTemplate.class_eval do
15
16
  def initialize
16
- return unless defined? external_parameters[:TagStandard]
17
+ return unless external_parameters&.fetch(:TagStandard) && external_parameters[:TagStandard].is_a?(Hash)
17
18
 
18
19
  # parameters for tagging standard
19
20
  external_parameters[:TagStandard].each do |param_name, props|
@@ -25,7 +26,7 @@ CfnDsl::CloudFormationTemplate.class_eval do
25
26
  send(key, props[key]) if props[key]
26
27
  end
27
28
  end
28
- end if external_parameters[:TagStandard].is_a?(Hash)
29
+ end
29
30
  end
30
31
  end
31
32
 
@@ -48,9 +49,10 @@ module CfnDsl
48
49
 
49
50
  def fix_substitutions(val)
50
51
  return val unless defined? val.class.to_s.downcase
51
- meth = "fix_#{val.class.to_s.downcase}"
52
52
 
53
+ meth = "fix_#{val.class.to_s.downcase}"
53
54
  return send(meth, val) if respond_to?(meth.to_sym)
55
+
54
56
  val
55
57
  end
56
58
 
@@ -79,6 +81,7 @@ module CfnDsl
79
81
  def apply_tag_standard
80
82
  return unless defined? external_parameters[:TagStandard]
81
83
  return unless external_parameters[:TagStandard].is_a?(Hash)
84
+
82
85
  apply_tags(external_parameters[:TagStandard]) if defined? self.Tag
83
86
  apply_tags_map(external_parameters[:TagStandard]) if HAS_MAPPED_TAGS.include? self.class.to_s
84
87
  end
@@ -1,9 +1,10 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'cfn-nag/custom_rule_loader'
3
4
  require 'cfn-nag/cfn_nag_config'
4
5
 
5
6
  module CfnDslPipeline
6
- #
7
+ # Main pipeline options
7
8
  class Options
8
9
  attr_accessor :aws_region, :validation_bucket, :estimate_cost, :dump_deploy_params, :cfn_nag
9
10
  attr_accessor :validate_cfn_nag, :save_audit_report, :validate_syntax, :save_syntax_report, :validate_output
@@ -1,8 +1,9 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'shellwords'
3
4
 
4
5
  module CfnDslPipeline
5
- #
6
+ # Dump stack parameters based on template
6
7
  class Pipeline
7
8
  def exec_dump_params
8
9
  param_filename = "#{output_dir}/#{base_name}.params"
@@ -1,4 +1,6 @@
1
- #
1
+ # frozen_string_literal: true
2
+
3
+ # set release version
2
4
  module CfnDslPipeline
3
- VERSION = '0.1.4'
5
+ VERSION = '0.1.5'
4
6
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cfndsl-pipeline
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.4
4
+ version: 0.1.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Cam Maxwell
@@ -100,14 +100,14 @@ dependencies:
100
100
  requirements:
101
101
  - - "~>"
102
102
  - !ruby/object:Gem::Version
103
- version: '1.5'
103
+ version: '2.0'
104
104
  type: :development
105
105
  prerelease: false
106
106
  version_requirements: !ruby/object:Gem::Requirement
107
107
  requirements:
108
108
  - - "~>"
109
109
  - !ruby/object:Gem::Version
110
- version: '1.5'
110
+ version: '2.0'
111
111
  - !ruby/object:Gem::Dependency
112
112
  name: rake
113
113
  requirement: !ruby/object:Gem::Requirement
@@ -221,8 +221,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
221
221
  - !ruby/object:Gem::Version
222
222
  version: '0'
223
223
  requirements: []
224
- rubyforge_project:
225
- rubygems_version: 2.7.10
224
+ rubygems_version: 3.0.6
226
225
  signing_key:
227
226
  specification_version: 4
228
227
  summary: Integrated build pipeline for building CloudFormation with CfnDsl