diff --git a/.rubocop_todo.yml b/.rubocop_todo.yml index 135e5b5f..488b9032 100644 --- a/.rubocop_todo.yml +++ b/.rubocop_todo.yml @@ -382,13 +382,6 @@ Security/YAMLLoad: - 'lib/stack_master/parameter_loader.rb' - 'lib/stack_master/template_utils.rb' -# This cop supports safe autocorrection (--autocorrect). -# Configuration parameters: EnforcedStyle. -# SupportedStyles: prefer_alias, prefer_alias_method -Style/Alias: - Exclude: - - 'lib/stack_master/sparkle_formation/template_file.rb' - # This cop supports unsafe autocorrection (--autocorrect-all). # Configuration parameters: EnforcedStyle. # SupportedStyles: always, conditionals @@ -396,50 +389,6 @@ Style/AndOr: Exclude: - 'lib/stack_master/cli.rb' -# This cop supports safe autocorrection (--autocorrect). -# Configuration parameters: EnforcedStyle, ProceduralMethods, FunctionalMethods, AllowedMethods, AllowedPatterns, AllowBracesOnProceduralOneLiners, BracesRequiredMethods. -# SupportedStyles: line_count_based, semantic, braces_for_chaining, always_braces -# ProceduralMethods: benchmark, bm, bmbm, create, each_with_object, measure, new, realtime, tap, with_object -# FunctionalMethods: let, let!, subject, watch -# AllowedMethods: lambda, proc, it -Style/BlockDelimiters: - Exclude: - - 'lib/stack_master/aws_driver/s3.rb' - - 'spec/fixtures/templates/rb/cfndsl/sample-ctp-repeated.rb' - - 'spec/fixtures/templates/rb/cfndsl/sample-ctp.rb' - - 'spec/fixtures/templates/rb/cfndsl/sample.rb' - - 'spec/stack_master/change_set_spec.rb' - - 'spec/stack_master/command_spec.rb' - - 'spec/stack_master/commands/compile_spec.rb' - - 'spec/stack_master/commands/drift_spec.rb' - - 'spec/stack_master/commands/lint_spec.rb' - - 'spec/stack_master/commands/nag_spec.rb' - - 'spec/stack_master/config_spec.rb' - - 'spec/stack_master/paged_response_accumulator_spec.rb' - - 'spec/stack_master/parameter_resolver_spec.rb' - - 'spec/stack_master/parameter_resolvers/one_password_spec.rb' - - 'spec/stack_master/parameter_resolvers/sns_topic_name_spec.rb' - - 'spec/stack_master/parameter_resolvers/sso_group_id_spec.rb' - - 'spec/stack_master/parameter_resolvers/stack_output_spec.rb' - - 'spec/stack_master/security_group_finder_spec.rb' - - 'spec/stack_master/sparkle_formation/template_file_spec.rb' - - 'spec/stack_master/stack_differ_spec.rb' - - 'spec/stack_master/stack_events/fetcher_spec.rb' - - 'spec/stack_master/stack_events/streamer_spec.rb' - - 'spec/stack_master/stack_spec.rb' - - 'spec/stack_master/template_compiler_spec.rb' - - 'spec/stack_master/template_compilers/json_spec.rb' - - 'spec/stack_master/template_compilers/sparkle_formation_spec.rb' - - 'spec/stack_master/template_compilers/yaml_spec.rb' - - 'spec/stack_master/test_driver/cloud_formation_spec.rb' - -# This cop supports safe autocorrection (--autocorrect). -# Configuration parameters: AllowOnConstant, AllowOnSelfClass. -Style/CaseEquality: - Exclude: - - 'lib/stack_master/parameter_resolver.rb' - - 'lib/stack_master/stack_definition.rb' - # This cop supports unsafe autocorrection (--autocorrect-all). # Configuration parameters: EnforcedStyle, EnforcedStyleForClasses, EnforcedStyleForModules. # SupportedStyles: nested, compact @@ -453,21 +402,6 @@ Style/ClassAndModuleChildren: - 'lib/stack_master/template_compilers/yaml.rb' - 'lib/stack_master/template_compilers/yaml_erb.rb' -# This cop supports safe autocorrection (--autocorrect). -# Configuration parameters: EnforcedStyle, AllowInnerBackticks. -# SupportedStyles: backticks, percent_x, mixed -Style/CommandLiteral: - Exclude: - - 'lib/stack_master/parameter_resolvers/one_password.rb' - -# This cop supports safe autocorrection (--autocorrect). -# Configuration parameters: EnforcedStyle, SingleLineConditionsOnly, IncludeTernaryExpressions. -# SupportedStyles: assign_to_condition, assign_inside_condition -Style/ConditionalAssignment: - Exclude: - - 'lib/stack_master/command.rb' - - 'lib/stack_master/parameter_validator.rb' - # Configuration parameters: AllowedConstants. Style/Documentation: Exclude: @@ -557,46 +491,6 @@ Style/Documentation: - 'lib/stack_master/utils.rb' - 'lib/stack_master/validator.rb' -# This cop supports safe autocorrection (--autocorrect). -Style/EachWithObject: - Exclude: - - 'features/step_definitions/stack_steps.rb' - - 'lib/stack_master/config.rb' - - 'lib/stack_master/parameter_loader.rb' - - 'lib/stack_master/parameter_resolver.rb' - - 'lib/stack_master/stack.rb' - - 'lib/stack_master/stack_definition.rb' - - 'lib/stack_master/utils.rb' - -# This cop supports safe autocorrection (--autocorrect). -Style/EmptyLiteral: - Exclude: - - 'lib/stack_master/test_driver/s3.rb' - - 'spec/stack_master/stack_differ_spec.rb' - -# This cop supports safe autocorrection (--autocorrect). -# Configuration parameters: EnforcedStyle. -# SupportedStyles: compact, expanded -Style/EmptyMethod: - Exclude: - - 'lib/stack_master/test_driver/s3.rb' - - 'spec/stack_master/parameter_resolver_spec.rb' - -# This cop supports safe autocorrection (--autocorrect). -Style/Encoding: - Exclude: - - 'stack_master.gemspec' - -# This cop supports safe autocorrection (--autocorrect). -Style/ExpandPathArguments: - Exclude: - - 'stack_master.gemspec' - -# This cop supports safe autocorrection (--autocorrect). -Style/ExplicitBlockArgument: - Exclude: - - 'lib/stack_master/parameter_resolver.rb' - # This cop supports unsafe autocorrection (--autocorrect-all). # Configuration parameters: EnforcedStyle. # SupportedStyles: always, always_true, never @@ -609,44 +503,10 @@ Style/GlobalStdStream: - 'lib/stack_master/cli.rb' - 'spec/stack_master/commands/apply_spec.rb' -# This cop supports safe autocorrection (--autocorrect). -# Configuration parameters: MinBodyLength, AllowConsecutiveConditionals. -Style/GuardClause: - Exclude: - - 'lib/stack_master/aws_driver/cloud_formation.rb' - - 'lib/stack_master/commands/apply.rb' - - 'lib/stack_master/commands/events.rb' - - 'lib/stack_master/commands/init.rb' - - 'lib/stack_master/parameter_resolver.rb' - - 'lib/stack_master/parameter_resolvers/ejson.rb' - - 'lib/stack_master/parameter_resolvers/stack_output.rb' - - 'lib/stack_master/sparkle_formation/compile_time/value_builder.rb' - - 'lib/stack_master/test_driver/cloud_formation.rb' - -# This cop supports safe autocorrection (--autocorrect). -# Configuration parameters: EnforcedStyle, EnforcedShorthandSyntax, UseHashRocketsWithSymbolValues, PreferHashRocketsForNonAlnumEndingSymbols. -# SupportedStyles: ruby19, hash_rockets, no_mixed_keys, ruby19_no_mixed_keys -# SupportedShorthandSyntax: always, never, either, consistent, either_consistent -Style/HashSyntax: - Exclude: - - 'Rakefile' - - 'lib/stack_master/template_compilers/sparkle_formation.rb' - - 'spec/stack_master/aws_driver/s3_spec.rb' - - 'spec/stack_master/commands/delete_spec.rb' - - 'spec/stack_master/parameter_resolvers/latest_container_spec.rb' - - 'spec/stack_master/parameter_resolvers/stack_output_spec.rb' - -# This cop supports safe autocorrection (--autocorrect). -Style/IfUnlessModifier: +# This cop supports unsafe autocorrection (--autocorrect-all). +Style/HashTransformValues: Exclude: - - 'bin/stack_master' - - 'lib/stack_master/change_set.rb' - - 'lib/stack_master/commands/apply.rb' - - 'lib/stack_master/commands/drift.rb' - - 'lib/stack_master/commands/events.rb' - - 'lib/stack_master/sparkle_formation/compile_time/value_builder.rb' - - 'lib/stack_master/sparkle_formation/compile_time/value_validator.rb' - - 'lib/stack_master/stack_differ.rb' + - 'lib/stack_master/stack.rb' # This cop supports unsafe autocorrection (--autocorrect-all). # Configuration parameters: InverseMethods, InverseBlocks. @@ -654,26 +514,6 @@ Style/InverseMethods: Exclude: - 'lib/stack_master/commands/tidy.rb' -# This cop supports safe autocorrection (--autocorrect). -Style/KeywordParametersOrder: - Exclude: - - 'lib/stack_master/diff.rb' - -# This cop supports safe autocorrection (--autocorrect). -# Configuration parameters: AllowedMethods, AllowedPatterns. -Style/MethodCallWithoutArgsParentheses: - Exclude: - - 'lib/stack_master/commands/tidy.rb' - - 'lib/stack_master/parameter_resolvers/sso_group_id.rb' - - 'spec/stack_master/commands/init_spec.rb' - -# This cop supports safe autocorrection (--autocorrect). -# Configuration parameters: EnforcedStyle. -# SupportedStyles: require_parentheses, require_no_parentheses, require_no_parentheses_except_multiline -Style/MethodDefParentheses: - Exclude: - - 'lib/stack_master/config.rb' - # This cop supports unsafe autocorrection (--autocorrect-all). # Configuration parameters: EnforcedStyle, Autocorrect. # SupportedStyles: module_function, extend_self, forbidden @@ -684,11 +524,6 @@ Style/ModuleFunction: - 'lib/stack_master/template_utils.rb' - 'lib/stack_master/utils.rb' -# This cop supports safe autocorrection (--autocorrect). -Style/MultilineIfModifier: - Exclude: - - 'lib/stack_master/cli.rb' - # This cop supports unsafe autocorrection (--autocorrect-all). # Configuration parameters: EnforcedStyle. # SupportedStyles: literals, strict @@ -701,33 +536,6 @@ Style/MutableConstant: - 'lib/stack_master/sparkle_formation/compile_time/value_validator_factory.rb' - 'lib/stack_master/version.rb' -# This cop supports safe autocorrection (--autocorrect). -# Configuration parameters: EnforcedStyle. -# SupportedStyles: both, prefix, postfix -Style/NegatedIf: - Exclude: - - 'lib/stack_master/commands/init.rb' - - 'lib/stack_master/commands/tidy.rb' - -# This cop supports safe autocorrection (--autocorrect). -# Configuration parameters: EnforcedStyle, MinBodyLength, AllowConsecutiveConditionals. -# SupportedStyles: skip_modifier_ifs, always -Style/Next: - Exclude: - - 'lib/stack_master/commands/tidy.rb' - -# This cop supports safe autocorrection (--autocorrect). -# Configuration parameters: MinDigits, Strict, AllowedNumbers, AllowedPatterns. -Style/NumericLiterals: - Exclude: - - 'lib/stack_master/template_compilers/json.rb' - - 'lib/stack_master/template_utils.rb' - - 'spec/stack_master/commands/apply_spec.rb' - - 'spec/stack_master/parameter_resolvers/latest_ami_spec.rb' - - 'spec/stack_master/stack_spec.rb' - - 'spec/stack_master/template_compilers/json_spec.rb' - - 'spec/stack_master/template_utils_spec.rb' - # This cop supports unsafe autocorrection (--autocorrect-all). # Configuration parameters: EnforcedStyle, AllowedMethods, AllowedPatterns. # SupportedStyles: predicate, comparison @@ -745,18 +553,6 @@ Style/OptionalBooleanParameter: - 'lib/stack_master/commands/status.rb' - 'lib/stack_master/stack.rb' -# This cop supports safe autocorrection (--autocorrect). -Style/ParallelAssignment: - Exclude: - - 'lib/stack_master/cli.rb' - -# This cop supports safe autocorrection (--autocorrect). -# Configuration parameters: PreferredDelimiters. -Style/PercentLiteralDelimiters: - Exclude: - - 'spec/stack_master/identity_spec.rb' - - 'stack_master.gemspec' - # This cop supports unsafe autocorrection (--autocorrect-all). # Configuration parameters: EnforcedStyle, AllowedCompactTypes. # SupportedStyles: compact, exploded @@ -769,17 +565,6 @@ Style/RaiseArgs: - 'lib/stack_master/sparkle_formation/compile_time/parameters_validator.rb' - 'lib/stack_master/template_compilers/sparkle_formation.rb' -# This cop supports safe autocorrection (--autocorrect). -Style/RedundantAssignment: - Exclude: - - 'lib/stack_master/commands/tidy.rb' - - 'lib/stack_master/parameter_resolvers/ami_finder.rb' - -# This cop supports safe autocorrection (--autocorrect). -Style/RedundantException: - Exclude: - - 'spec/stack_master/command_spec.rb' - # This cop supports unsafe autocorrection (--autocorrect-all). Style/RedundantInterpolation: Exclude: @@ -788,50 +573,6 @@ Style/RedundantInterpolation: - 'lib/stack_master/stack_definition.rb' - 'spec/stack_master/stack_definition_spec.rb' -# This cop supports safe autocorrection (--autocorrect). -Style/RedundantPercentQ: - Exclude: - - 'stack_master.gemspec' - -# This cop supports safe autocorrection (--autocorrect). -Style/RedundantRegexpCharacterClass: - Exclude: - - 'spec/stack_master/command_spec.rb' - -# This cop supports safe autocorrection (--autocorrect). -Style/RedundantRegexpEscape: - Exclude: - - 'spec/stack_master/stack_differ_spec.rb' - -# This cop supports safe autocorrection (--autocorrect). -# Configuration parameters: AllowMultipleReturnValues. -Style/RedundantReturn: - Exclude: - - 'lib/stack_master/parameter_resolvers/one_password.rb' - -# This cop supports safe autocorrection (--autocorrect). -Style/RedundantSelf: - Exclude: - - 'lib/stack_master/commands/list_stacks.rb' - - 'lib/stack_master/commands/outputs.rb' - - 'lib/stack_master/commands/status.rb' - - 'lib/stack_master/resolver_array.rb' - -# This cop supports safe autocorrection (--autocorrect). -# Configuration parameters: EnforcedStyle, AllowInnerSlashes. -# SupportedStyles: slashes, percent_r, mixed -Style/RegexpLiteral: - Exclude: - - 'lib/stack_master/commands/terminal_helper.rb' - - 'lib/stack_master/sparkle_formation/compile_time/allowed_pattern_validator.rb' - -# This cop supports safe autocorrection (--autocorrect). -# Configuration parameters: EnforcedStyle. -# SupportedStyles: implicit, explicit -Style/RescueStandardError: - Exclude: - - 'spec/stack_master/command_spec.rb' - # This cop supports unsafe autocorrection (--autocorrect-all). # Configuration parameters: ConvertCodeThatCanStartToReturnNil, AllowedMethods, MaxChainLength. # AllowedMethods: present?, blank?, presence, try, try! @@ -843,13 +584,6 @@ Style/SafeNavigation: - 'lib/stack_master/stack_status.rb' - 'lib/stack_master/template_compilers/sparkle_formation.rb' -# This cop supports safe autocorrection (--autocorrect). -# Configuration parameters: EnforcedStyle. -# SupportedStyles: only_raise, only_fail, semantic -Style/SignalException: - Exclude: - - 'lib/stack_master/resolver_array.rb' - # This cop supports unsafe autocorrection (--autocorrect-all). # Configuration parameters: RequireEnglish, EnforcedStyle. # SupportedStyles: use_perl_names, use_english_names, use_builtin_english_names @@ -868,98 +602,6 @@ Style/StringConcatenation: - 'spec/stack_master/commands/compile_spec.rb' - 'spec/stack_master/template_utils_spec.rb' -# This cop supports safe autocorrection (--autocorrect). -# Configuration parameters: EnforcedStyle, ConsistentQuotesInMultiline. -# SupportedStyles: single_quotes, double_quotes -Style/StringLiterals: - Exclude: - - 'Rakefile' - - 'bin/stack_master' - - 'example/simple/templates/myapp_vpc.rb' - - 'example/simple/templates/myapp_web.rb' - - 'features/step_definitions/parameter_store_steps.rb' - - 'features/support/env.rb' - - 'lib/stack_master.rb' - - 'lib/stack_master/aws_driver/s3.rb' - - 'lib/stack_master/change_set.rb' - - 'lib/stack_master/cli.rb' - - 'lib/stack_master/commands/apply.rb' - - 'lib/stack_master/commands/delete.rb' - - 'lib/stack_master/commands/drift.rb' - - 'lib/stack_master/commands/init.rb' - - 'lib/stack_master/commands/lint.rb' - - 'lib/stack_master/commands/status.rb' - - 'lib/stack_master/commands/terminal_helper.rb' - - 'lib/stack_master/commands/tidy.rb' - - 'lib/stack_master/config.rb' - - 'lib/stack_master/diff.rb' - - 'lib/stack_master/parameter_resolvers/latest_ami_by_tags.rb' - - 'lib/stack_master/parameter_resolvers/latest_container.rb' - - 'lib/stack_master/parameter_resolvers/one_password.rb' - - 'lib/stack_master/prompter.rb' - - 'lib/stack_master/role_assumer.rb' - - 'lib/stack_master/security_group_finder.rb' - - 'lib/stack_master/sns_topic_finder.rb' - - 'lib/stack_master/stack_definition.rb' - - 'lib/stack_master/stack_differ.rb' - - 'lib/stack_master/validator.rb' - - 'lib/stack_master/version.rb' - - 'spec/fixtures/sparkle_pack_integration/my_sparkle_pack/lib/sparkleformation/dynamics/my_dynamic.rb' - - 'spec/fixtures/sparkle_pack_integration/my_sparkle_pack/lib/sparkleformation/templates/dynamics/local_dynamic.rb' - - 'spec/fixtures/templates/rb/cfndsl/sample-ctp-repeated.rb' - - 'spec/fixtures/templates/rb/cfndsl/sample-ctp.rb' - - 'spec/fixtures/templates/rb/cfndsl/sample.rb' - - 'spec/fixtures/templates/rb/sparkle_formation/templates/template.rb' - - 'spec/integration/drift_spec.rb' - - 'spec/spec_helper.rb' - - 'spec/stack_master/aws_driver/s3_spec.rb' - - 'spec/stack_master/commands/apply_spec.rb' - - 'spec/stack_master/commands/compile_spec.rb' - - 'spec/stack_master/commands/delete_spec.rb' - - 'spec/stack_master/commands/drift_spec.rb' - - 'spec/stack_master/commands/init_spec.rb' - - 'spec/stack_master/commands/lint_spec.rb' - - 'spec/stack_master/commands/nag_spec.rb' - - 'spec/stack_master/commands/status_spec.rb' - - 'spec/stack_master/commands/validate_spec.rb' - - 'spec/stack_master/config_spec.rb' - - 'spec/stack_master/parameter_loader_spec.rb' - - 'spec/stack_master/parameter_resolver_spec.rb' - - 'spec/stack_master/parameter_resolvers/ami_finder_spec.rb' - - 'spec/stack_master/parameter_resolvers/ejson_spec.rb' - - 'spec/stack_master/parameter_resolvers/latest_container_spec.rb' - - 'spec/stack_master/parameter_resolvers/one_password_spec.rb' - - 'spec/stack_master/parameter_resolvers/parameter_store_spec.rb' - - 'spec/stack_master/parameter_resolvers/security_group_spec.rb' - - 'spec/stack_master/parameter_resolvers/security_groups_spec.rb' - - 'spec/stack_master/parameter_resolvers/stack_output_spec.rb' - - 'spec/stack_master/parameter_validator_spec.rb' - - 'spec/stack_master/security_group_finder_spec.rb' - - 'spec/stack_master/sparkle_formation/template_file_spec.rb' - - 'spec/stack_master/sso_group_id_finder_spec.rb' - - 'spec/stack_master/stack_definition_spec.rb' - - 'spec/stack_master/stack_differ_spec.rb' - - 'spec/stack_master/stack_events/presenter_spec.rb' - - 'spec/stack_master/stack_events/streamer_spec.rb' - - 'spec/stack_master/stack_spec.rb' - - 'spec/stack_master/template_compiler_spec.rb' - - 'spec/stack_master/template_compilers/cfndsl_spec.rb' - - 'spec/stack_master/template_compilers/json_spec.rb' - - 'spec/stack_master/template_compilers/sparkle_formation_spec.rb' - - 'spec/stack_master/template_utils_spec.rb' - - 'spec/stack_master/test_driver/cloud_formation_spec.rb' - - 'spec/stack_master/utils_spec.rb' - - 'spec/stack_master/validator_spec.rb' - - 'spec/stack_master_spec.rb' - - 'spec/support/aws_stubs.rb' - - 'stack_master.gemspec' - -# This cop supports safe autocorrection (--autocorrect). -# Configuration parameters: MinSize. -# SupportedStyles: percent, brackets -Style/SymbolArray: - EnforcedStyle: brackets - # This cop supports unsafe autocorrection (--autocorrect-all). # Configuration parameters: AllowMethodsWithArguments, AllowedMethods, AllowedPatterns, AllowComments. # AllowedMethods: define_method @@ -968,57 +610,6 @@ Style/SymbolProc: - 'lib/stack_master/command.rb' - 'spec/support/validator_spec.rb' -# This cop supports safe autocorrection (--autocorrect). -# Configuration parameters: EnforcedStyleForMultiline. -# SupportedStylesForMultiline: comma, consistent_comma, diff_comma, no_comma -Style/TrailingCommaInArguments: - Exclude: - - 'lib/stack_master/template_compilers/sparkle_formation.rb' - - 'spec/stack_master/validator_spec.rb' - -# This cop supports safe autocorrection (--autocorrect). -# Configuration parameters: EnforcedStyleForMultiline. -# SupportedStylesForMultiline: comma, consistent_comma, diff_comma, no_comma -Style/TrailingCommaInArrayLiteral: - Exclude: - - 'lib/stack_master/security_group_finder.rb' - - 'spec/integration/drift_spec.rb' - - 'spec/stack_master/cloudformation_interpolating_eruby_spec.rb' - - 'spec/stack_master/parameter_resolvers/latest_container_spec.rb' - - 'spec/stack_master/security_group_finder_spec.rb' - - 'spec/stack_master/sns_topic_finder_spec.rb' - - 'spec/stack_master/stack_definition_spec.rb' - - 'spec/stack_master/stack_events/fetcher_spec.rb' - - 'spec/stack_master/stack_events/streamer_spec.rb' - -# This cop supports safe autocorrection (--autocorrect). -# Configuration parameters: EnforcedStyleForMultiline. -# SupportedStylesForMultiline: comma, consistent_comma, diff_comma, no_comma -Style/TrailingCommaInHashLiteral: - Exclude: - - 'lib/stack_master/commands/status.rb' - - 'lib/stack_master/config.rb' - - 'lib/stack_master/parameter_resolvers/latest_container.rb' - - 'lib/stack_master/security_group_finder.rb' - - 'lib/stack_master/sso_group_id_finder.rb' - - 'spec/integration/drift_spec.rb' - - 'spec/stack_master/commands/apply_spec.rb' - - 'spec/stack_master/config_spec.rb' - - 'spec/stack_master/security_group_finder_spec.rb' - - 'stack_master.gemspec' - -# This cop supports safe autocorrection (--autocorrect). -Style/UnlessElse: - Exclude: - - 'lib/stack_master/cli.rb' - -# This cop supports safe autocorrection (--autocorrect). -# Configuration parameters: WordRegex. -# SupportedStyles: percent, brackets -Style/WordArray: - EnforcedStyle: percent - MinSize: 4 - # This cop supports unsafe autocorrection (--autocorrect-all). Style/ZeroLengthPredicate: Exclude: diff --git a/CHANGELOG.md b/CHANGELOG.md index da098b86..110c2e67 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,7 +10,12 @@ The format is based on [Keep a Changelog], and this project adheres to ## [Unreleased] +### Changed + +- Resolve style issues identified by RuboCop ([#396]) + [Unreleased]: https://github.com/envato/stack_master/compare/v2.17.1...HEAD +[#396]: https://github.com/envato/stack_master/pull/396 ## [2.17.1] - 2025-12-19 diff --git a/Rakefile b/Rakefile index 161a82dd..ced81b38 100644 --- a/Rakefile +++ b/Rakefile @@ -1,11 +1,11 @@ -require "bundler/gem_tasks" +require 'bundler/gem_tasks' require 'bundler/setup' task :environment do require 'stack_master' end -task :console => :environment do +task console: :environment do require 'pry' binding.pry end @@ -19,7 +19,7 @@ begin require 'rspec/core/rake_task' RSpec::Core::RakeTask.new(:spec) do |t| - t.rspec_opts = "--format doc" + t.rspec_opts = '--format doc' end require 'rubocop/rake_task' @@ -27,4 +27,4 @@ begin rescue LoadError end -task :default => [:features, :spec, :rubocop] +task default: %i[features spec rubocop] diff --git a/bin/stack_master b/bin/stack_master index 5379c577..09e8f56e 100755 --- a/bin/stack_master +++ b/bin/stack_master @@ -2,14 +2,12 @@ require 'stack_master' -if ENV['STUB_AWS'] == 'true' - require 'stack_master/testing' -end +require 'stack_master/testing' if ENV['STUB_AWS'] == 'true' -trap("SIGINT") { raise StackMaster::CtrlC } +trap('SIGINT') { raise StackMaster::CtrlC } begin StackMaster::CLI.new(ARGV.dup).execute! rescue StackMaster::CtrlC - StackMaster.stdout.puts "Exiting..." + StackMaster.stdout.puts 'Exiting...' end diff --git a/example/simple/templates/myapp_vpc.rb b/example/simple/templates/myapp_vpc.rb index e26bf84c..b18e38ca 100644 --- a/example/simple/templates/myapp_vpc.rb +++ b/example/simple/templates/myapp_vpc.rb @@ -1,5 +1,5 @@ SparkleFormation.new(:myapp_vpc) do - description "A test VPC template" + description 'A test VPC template' resources.vpc do type 'AWS::EC2::VPC' diff --git a/example/simple/templates/myapp_web.rb b/example/simple/templates/myapp_web.rb index 638f6a33..39b7cccb 100644 --- a/example/simple/templates/myapp_web.rb +++ b/example/simple/templates/myapp_web.rb @@ -1,5 +1,5 @@ SparkleFormation.new(:myapp_web) do - description "Test web template" + description 'Test web template' parameters.vpc_id do description 'VPC ID' diff --git a/features/step_definitions/parameter_store_steps.rb b/features/step_definitions/parameter_store_steps.rb index 1afc9224..384ca190 100644 --- a/features/step_definitions/parameter_store_steps.rb +++ b/features/step_definitions/parameter_store_steps.rb @@ -6,7 +6,7 @@ parameter: { name: parameter_name, value: parameter_value, - type: "SecureString", + type: 'SecureString', version: 1 } } diff --git a/features/step_definitions/stack_steps.rb b/features/step_definitions/stack_steps.rb index 7b535eb3..44ca2902 100644 --- a/features/step_definitions/stack_steps.rb +++ b/features/step_definitions/stack_steps.rb @@ -21,10 +21,9 @@ end def extract_hash_from_kv_string(string) - string.to_s.split(',').inject({}) do |hash, kv| + string.to_s.split(',').each_with_object({}) do |kv, hash| key, value = kv.split('=') hash[key] = value - hash end end @@ -32,9 +31,8 @@ def extract_hash_from_kv_string(string) table.hashes.each do |row| row.symbolize_keys! row[:parameters] = StackMaster::Utils.hash_to_aws_parameters(extract_hash_from_kv_string(row[:parameters])) - outputs = extract_hash_from_kv_string(row[:outputs]).inject([]) do |array, (k, v)| + outputs = extract_hash_from_kv_string(row[:outputs]).each_with_object([]) do |(k, v), array| array << OpenStruct.new(output_key: k, output_value: v) - array end row[:outputs] = outputs StackMaster.cloud_formation_driver.add_stack(row) diff --git a/features/support/env.rb b/features/support/env.rb index 7e3ca482..a9723a65 100644 --- a/features/support/env.rb +++ b/features/support/env.rb @@ -22,5 +22,5 @@ Timecop.return end -lib = File.join(File.dirname(__FILE__), "../../spec/fixtures/sparkle_pack_integration/my_sparkle_pack/lib") +lib = File.join(File.dirname(__FILE__), '../../spec/fixtures/sparkle_pack_integration/my_sparkle_pack/lib') $LOAD_PATH << lib diff --git a/lib/stack_master.rb b/lib/stack_master.rb index 5f94d8dc..d48ee779 100644 --- a/lib/stack_master.rb +++ b/lib/stack_master.rb @@ -172,7 +172,7 @@ def skip_account_check? @non_interactive_answer = 'y' def base_dir - File.expand_path(File.join(File.dirname(__FILE__), "..")) + File.expand_path(File.join(File.dirname(__FILE__), '..')) end def cloud_formation_driver diff --git a/lib/stack_master/aws_driver/cloud_formation.rb b/lib/stack_master/aws_driver/cloud_formation.rb index 2cc7b1b9..acdf1567 100644 --- a/lib/stack_master/aws_driver/cloud_formation.rb +++ b/lib/stack_master/aws_driver/cloud_formation.rb @@ -8,10 +8,10 @@ def region end def set_region(value) - if region != value - @region = value - @cf = nil - end + return if region == value + + @region = value + @cf = nil end def_delegators( diff --git a/lib/stack_master/aws_driver/s3.rb b/lib/stack_master/aws_driver/s3.rb index 0f385b0d..2b66d238 100644 --- a/lib/stack_master/aws_driver/s3.rb +++ b/lib/stack_master/aws_driver/s3.rb @@ -24,11 +24,11 @@ def upload_files(bucket: nil, prefix: nil, region: nil, files: {}) prefix: prefix, bucket: bucket } - ).map(&:contents).flatten.inject({}) { |h, obj| + ).map(&:contents).flatten.inject({}) do |h, obj| h.merge(obj.key => obj) - } + end - StackMaster.stdout.puts "Uploading files to S3:" + StackMaster.stdout.puts 'Uploading files to S3:' files.each do |template, file| body = file.fetch(:body) @@ -36,7 +36,7 @@ def upload_files(bucket: nil, prefix: nil, region: nil, files: {}) object_key = template.dup object_key.prepend("#{prefix}/") if prefix compiled_template_md5 = Digest::MD5.hexdigest(body).to_s - s3_md5 = current_objects[object_key] ? current_objects[object_key].etag.gsub("\"", '') : nil + s3_md5 = current_objects[object_key] ? current_objects[object_key].etag.gsub('"', '') : nil next if compiled_template_md5 == s3_md5 @@ -51,14 +51,14 @@ def upload_files(bucket: nil, prefix: nil, region: nil, files: {}) metadata: { md5: compiled_template_md5 } } ) - StackMaster.stdout.puts "done." + StackMaster.stdout.puts 'done.' end end def url(bucket:, prefix:, region:, template:) if region == 'us-east-1' - ["https://s3.amazonaws.com", bucket, prefix, template].compact.join('/') - elsif region.start_with? "cn-" + ['https://s3.amazonaws.com', bucket, prefix, template].compact.join('/') + elsif region.start_with? 'cn-' ["https://s3.#{region}.amazonaws.com.cn", bucket, prefix, template].compact.join('/') else ["https://s3-#{region}.amazonaws.com", bucket, prefix, template].compact.join('/') diff --git a/lib/stack_master/change_set.rb b/lib/stack_master/change_set.rb index 3d06ab79..23d91467 100644 --- a/lib/stack_master/change_set.rb +++ b/lib/stack_master/change_set.rb @@ -1,9 +1,9 @@ module StackMaster class ChangeSet - END_STATES = [ - 'CREATE_COMPLETE', - 'DELETE_COMPLETE', - 'FAILED' + END_STATES = %w[ + CREATE_COMPLETE + DELETE_COMPLETE + FAILED ] def self.generate_change_set_name(stack_name) @@ -50,7 +50,7 @@ def display(io) @response.changes.each do |change| display_resource_change(io, change.resource_change) end - io.puts "========================================" + io.puts '========================================' end def failed? @@ -84,13 +84,9 @@ def display_resource_change(io, resource_change) def display_resource_change_detail(io, action_name, color, detail) target_name = [detail.target.attribute, detail.target.name].compact.join('.') detail_messages = [target_name] - if action_name == 'Replace' - detail_messages << "#{detail.target.requires_recreation} requires recreation" - end + detail_messages << "#{detail.target.requires_recreation} requires recreation" if action_name == 'Replace' triggered_by = [detail.change_source, detail.causing_entity].compact.join('.') - if detail.evaluation != 'Static' - triggered_by << "(#{detail.evaluation})" - end + triggered_by << "(#{detail.evaluation})" if detail.evaluation != 'Static' detail_messages << "Triggered by: #{triggered_by}" io.puts Rainbow("- #{detail_messages.join('. ')}. ").color(color) end diff --git a/lib/stack_master/cli.rb b/lib/stack_master/cli.rb index 9ba31e45..b170c731 100644 --- a/lib/stack_master/cli.rb +++ b/lib/stack_master/cli.rb @@ -6,7 +6,11 @@ class CLI include Commander::Methods def initialize(argv, stdin = STDIN, stdout = STDOUT, stderr = STDERR, kernel = Kernel) - @argv, @stdin, @stdout, @stderr, @kernel = argv, stdin, stdout, stderr, kernel + @argv = argv + @stdin = stdin + @stdout = stdout + @stderr = stderr + @kernel = kernel Commander::Runner.instance_variable_set('@instance', Commander::Runner.new(argv)) StackMaster.stdout = @stdout StackMaster.stderr = @stderr @@ -49,7 +53,7 @@ def execute! 'Valid Values: [ DO_NOTHING | ROLLBACK | DELETE ]. ' \ "Default: ROLLBACK\n" \ 'Note: You cannot use this option with Serverless Application Model (SAM) templates.' - c.option '--yes-param PARAM_NAME', String, "Auto-approve stack updates when only parameter PARAM_NAME changes" + c.option '--yes-param PARAM_NAME', String, 'Auto-approve stack updates when only parameter PARAM_NAME changes' c.action do |args, options| options.default config: default_config_file execute_stacks_command(StackMaster::Commands::Apply, args, options) @@ -59,7 +63,7 @@ def execute! command :outputs do |c| c.syntax = 'stack_master outputs [region_or_alias] [stack_name]' c.summary = 'Displays outputs for a stack' - c.description = "Displays outputs for a stack" + c.description = 'Displays outputs for a stack' c.action do |args, options| options.default config: default_config_file execute_stacks_command(StackMaster::Commands::Outputs, args, options) @@ -73,10 +77,10 @@ def execute! c.option('--overwrite', 'Overwrite existing files') c.action do |args, options| options.default config: default_config_file - unless args.size == 2 - say "Invalid arguments. stack_master init [region] [stack_name]" - else + if args.size == 2 StackMaster::Commands::Init.perform(options, *args) + else + say 'Invalid arguments. stack_master init [region] [stack_name]' end end end @@ -94,8 +98,8 @@ def execute! command :events do |c| c.syntax = 'stack_master events [region_or_alias] [stack_name]' - c.summary = "Shows events for a stack" - c.description = "Shows events for a stack" + c.summary = 'Shows events for a stack' + c.description = 'Shows events for a stack' c.example 'show events for myapp-vpc in us-east-1', 'stack_master events us-east-1 myapp-vpc' c.option '--number Integer', Integer, 'Number of recent events to show' c.option '--all', 'Show all events' @@ -108,8 +112,8 @@ def execute! command :resources do |c| c.syntax = 'stack_master resources [region] [stack_name]' - c.summary = "Shows stack resources" - c.description = "Shows stack resources" + c.summary = 'Shows stack resources' + c.description = 'Shows stack resources' c.action do |args, options| options.default config: default_config_file execute_stacks_command(StackMaster::Commands::Resources, args, options) @@ -122,7 +126,7 @@ def execute! c.description = 'List stack definitions' c.action do |args, options| options.default config: default_config_file - say "Invalid arguments." if args.size > 0 + say 'Invalid arguments.' if args.size > 0 config = load_config(options.config) StackMaster::Commands::ListStacks.perform(config, nil, options) end @@ -142,8 +146,8 @@ def execute! command :lint do |c| c.syntax = 'stack_master lint [region_or_alias] [stack_name]' - c.summary = "Check the stack definition locally" - c.description = "Runs cfn-lint on the template which would be sent to AWS on apply" + c.summary = 'Check the stack definition locally' + c.description = 'Runs cfn-lint on the template which would be sent to AWS on apply' c.example 'run cfn-lint on stack myapp-vpc with us-east-1 settings', 'stack_master lint us-east-1 myapp-vpc' c.action do |args, options| options.default config: default_config_file @@ -154,7 +158,7 @@ def execute! command :nag do |c| c.syntax = 'stack_master nag [region_or_alias] [stack_name]' c.summary = "Check this stack's template with cfn_nag" - c.description = "Runs SAST scan cfn_nag on the template" + c.description = 'Runs SAST scan cfn_nag on the template' c.example 'run cfn_nag on stack myapp-vpc with us-east-1 settings', 'stack_master nag us-east-1 myapp-vpc' c.action do |args, options| options.default config: default_config_file @@ -164,7 +168,7 @@ def execute! command :compile do |c| c.syntax = 'stack_master compile [region_or_alias] [stack_name]' - c.summary = "Print the compiled version of a given stack" + c.summary = 'Print the compiled version of a given stack' c.description = "Processes the stack and prints out a compiled version - same we'd send to AWS" c.example 'print compiled stack myapp-vpc with us-east-1 settings', 'stack_master compile us-east-1 myapp-vpc' c.action do |args, options| @@ -181,7 +185,7 @@ def execute! c.example 'description', 'Check the status of all stack definitions' c.action do |args, options| options.default config: default_config_file - say "Invalid arguments. stack_master status" and return unless args.size == 0 + say 'Invalid arguments. stack_master status' and return unless args.size == 0 config = load_config(options.config) StackMaster::Commands::Status.perform(config, nil, options) @@ -196,7 +200,7 @@ def execute! c.example 'description', 'Check for missing or extra files' c.action do |args, options| options.default config: default_config_file - say "Invalid arguments. stack_master tidy" and return unless args.size == 0 + say 'Invalid arguments. stack_master tidy' and return unless args.size == 0 config = load_config(options.config) StackMaster::Commands::Tidy.perform(config, nil, options) @@ -211,7 +215,7 @@ def execute! c.action do |args, options| options.default config: default_config_file unless args.size == 2 - say "Invalid arguments. stack_master delete [region] [stack_name]" + say 'Invalid arguments. stack_master delete [region] [stack_name]' return end @@ -239,7 +243,7 @@ def execute! c.syntax = 'stack_master drift [region_or_alias] [stack_name]' c.summary = 'Detects and displays stack drift using the CloudFormation Drift API' c.description = 'Detects and displays stack drift' - c.option '--timeout SECONDS', Integer, "The number of seconds to wait for drift detection to complete" + c.option '--timeout SECONDS', Integer, 'The number of seconds to wait for drift detection to complete' c.example 'view stack drift for a stack named myapp-vpc in us-east-1', 'stack_master drift us-east-1 myapp-vpc' c.action do |args, options| options.default config: default_config_file, timeout: 120 @@ -253,7 +257,7 @@ def execute! private def default_config_file - "stack_master.yml" + 'stack_master.yml' end def load_config(file) @@ -277,10 +281,12 @@ def execute_stacks_command(command, args, options) show_other_region_candidates(config, stack_name) success = false end - stack_definitions = stack_definitions.select do |stack_definition| - running_in_allowed_account?(stack_definition.allowed_accounts) && - StackStatus.new(config, stack_definition).changed? - end if options.changed + if options.changed + stack_definitions = stack_definitions.select do |stack_definition| + running_in_allowed_account?(stack_definition.allowed_accounts) && + StackStatus.new(config, stack_definition).changed? + end + end stack_definitions.each do |stack_definition| StackMaster.cloud_formation_driver.set_region(stack_definition.region) StackMaster.stdout.puts( @@ -295,14 +301,14 @@ def execute_stacks_command(command, args, options) end def show_other_region_candidates(config, stack_name) - candidates = config.filter(region = "", stack_name = stack_name) + candidates = config.filter(region = '', stack_name = stack_name) return if candidates.empty? StackMaster.stdout.puts "Stack name #{stack_name} exists in regions: #{candidates.map(&:region).join(', ')}" end def execute_if_allowed_account(allowed_accounts, &block) - raise ArgumentError, "Block required to execute this method" unless block_given? + raise ArgumentError, 'Block required to execute this method' unless block_given? if running_in_allowed_account?(allowed_accounts) block.call diff --git a/lib/stack_master/command.rb b/lib/stack_master/command.rb index 7e30f380..c20d8484 100644 --- a/lib/stack_master/command.rb +++ b/lib/stack_master/command.rb @@ -43,11 +43,7 @@ def error_message(e) msg = "#{e.class} #{e.message}" msg << "\n Caused by: #{e.cause.class} #{e.cause.message}" if e.cause msg << "\n at #{e.cause.backtrace[0..3].join("\n ")}\n ..." if e.cause && !options.trace - if options.trace - msg << "\n#{backtrace(e)}" - else - msg << "\n Use --trace to view backtrace" - end + msg << (options.trace ? "\n#{backtrace(e)}" : "\n Use --trace to view backtrace") msg end diff --git a/lib/stack_master/commands/apply.rb b/lib/stack_master/commands/apply.rb index ba106855..46c3438f 100644 --- a/lib/stack_master/commands/apply.rb +++ b/lib/stack_master/commands/apply.rb @@ -44,10 +44,10 @@ def stack_exists? end def abort_if_review_in_progress - if stack_exists? && stack.stack_status == "REVIEW_IN_PROGRESS" - StackMaster.stderr.puts "Stack currently exists and is in #{stack.stack_status}" - failed! "You will need to delete the stack (#{stack.stack_name}) before continuing" - end + return unless stack_exists? && stack.stack_status == 'REVIEW_IN_PROGRESS' + + StackMaster.stderr.puts "Stack currently exists and is in #{stack.stack_status}" + failed! "You will need to delete the stack (#{stack.stack_name}) before continuing" end def use_s3? @@ -111,11 +111,11 @@ def create_stack_directly end def ask_to_cancel_stack_update - if ask?("Cancel stack update?") - StackMaster.stdout.puts "Attempting to cancel stack update" - cf.cancel_update_stack(stack_name: stack_name) - tail_stack_events - end + return unless ask?('Cancel stack update?') + + StackMaster.stdout.puts 'Attempting to cancel stack update' + cf.cancel_update_stack(stack_name: stack_name) + tail_stack_events end def update_stack @@ -136,10 +136,10 @@ def update_stack end def ask_update_confirmation! - unless ask?("Apply change set (y/n)? ") - ChangeSet.delete(@change_set.id) - halt! "Stack update aborted" - end + return if ask?('Apply change set (y/n)? ') + + ChangeSet.delete(@change_set.id) + halt! 'Stack update aborted' end def upload_files @@ -177,7 +177,7 @@ def stack_options stack_name: stack_name, parameters: proposed_stack.aws_parameters, tags: proposed_stack.aws_tags, - capabilities: ['CAPABILITY_IAM', 'CAPABILITY_NAMED_IAM', 'CAPABILITY_AUTO_EXPAND'], + capabilities: %w[CAPABILITY_IAM CAPABILITY_NAMED_IAM CAPABILITY_AUTO_EXPAND], role_arn: proposed_stack.role_arn, notification_arns: proposed_stack.notification_arns, template_method => template_value @@ -211,9 +211,9 @@ def ensure_valid_parameters! end def ensure_valid_template_body_size! - if proposed_stack.too_big?(use_s3?) - failed! TEMPLATE_TOO_LARGE_ERROR_MESSAGE - end + return unless proposed_stack.too_big?(use_s3?) + + failed! TEMPLATE_TOO_LARGE_ERROR_MESSAGE end def set_stack_policy diff --git a/lib/stack_master/commands/delete.rb b/lib/stack_master/commands/delete.rb index 9e86006c..cc09e4e2 100644 --- a/lib/stack_master/commands/delete.rb +++ b/lib/stack_master/commands/delete.rb @@ -15,7 +15,7 @@ def perform return unless check_exists unless ask?("Really delete stack #{@stack_name} (y/n)? ") - StackMaster.stdout.puts "Stack update aborted" + StackMaster.stdout.puts 'Stack update aborted' return end @@ -33,7 +33,7 @@ def check_exists cf.describe_stacks({ stack_name: @stack_name }) true rescue Aws::CloudFormation::Errors::ValidationError - failed("Stack does not exist") + failed('Stack does not exist') false end @@ -43,10 +43,10 @@ def cf def tail_stack_events StackEvents::Streamer.stream(@stack_name, @region, io: StackMaster.stdout, from: @from_time) - StackMaster.stdout.puts "Stack deleted" + StackMaster.stdout.puts 'Stack deleted' rescue Aws::CloudFormation::Errors::ValidationError # Unfortunately the stack as a tendency of going away before we get the final delete event. - StackMaster.stdout.puts "Stack deleted" + StackMaster.stdout.puts 'Stack deleted' end end end diff --git a/lib/stack_master/commands/drift.rb b/lib/stack_master/commands/drift.rb index a3e9858c..812f9e0f 100644 --- a/lib/stack_master/commands/drift.rb +++ b/lib/stack_master/commands/drift.rb @@ -6,9 +6,9 @@ class Drift include Command include Commander::UI - DETECTION_COMPLETE_STATES = [ - 'DETECTION_COMPLETE', - 'DETECTION_FAILED' + DETECTION_COMPLETE_STATES = %w[ + DETECTION_COMPLETE + DETECTION_FAILED ] def perform @@ -41,9 +41,7 @@ def display_drift(drift) drift.physical_resource_id].join(' '), color) return unless drift.stack_resource_drift_status == 'MODIFIED' - unless drift.property_differences.empty? - puts colorize(' Property differences:', color) - end + puts colorize(' Property differences:', color) unless drift.property_differences.empty? drift.property_differences.each do |property_difference| puts colorize(" - #{property_difference.difference_type} #{property_difference.property_path}", color) end @@ -98,9 +96,7 @@ def wait_for_drift_results(detection_id) break if DETECTION_COMPLETE_STATES.include?(resp.detection_status) elapsed_time = Time.now - start_time - if elapsed_time > @options.timeout - raise "Timeout waiting for stack drift detection" - end + raise 'Timeout waiting for stack drift detection' if elapsed_time > @options.timeout sleep SLEEP_SECONDS end diff --git a/lib/stack_master/commands/events.rb b/lib/stack_master/commands/events.rb index 9e1b163a..78ece8d3 100644 --- a/lib/stack_master/commands/events.rb +++ b/lib/stack_master/commands/events.rb @@ -9,9 +9,9 @@ def perform filter_events(events).each do |event| StackEvents::Presenter.print_event(StackMaster.stdout, event) end - if @options.tail - StackEvents::Streamer.stream(@stack_definition.stack_name, @stack_definition.region, io: StackMaster.stdout) - end + return unless @options.tail + + StackEvents::Streamer.stream(@stack_definition.stack_name, @stack_definition.region, io: StackMaster.stdout) end private @@ -22,9 +22,7 @@ def filter_events(events) else n = @options.number || 25 from = events.count - n - if from < 0 - from = 0 - end + from = 0 if from < 0 events[from..-1] end end diff --git a/lib/stack_master/commands/init.rb b/lib/stack_master/commands/init.rb index b82f75e4..b8dc8aa3 100644 --- a/lib/stack_master/commands/init.rb +++ b/lib/stack_master/commands/init.rb @@ -1,4 +1,4 @@ -require "erb" +require 'erb' module StackMaster module Commands @@ -12,22 +12,22 @@ def initialize(options, region, stack_name) end def perform - if check_files - create_stack_master_yml - create_stack_json_yml - create_parameters_yml - end + return unless check_files + + create_stack_master_yml + create_stack_json_yml + create_parameters_yml end private def check_files - @stack_master_filename = "stack_master.yml" + @stack_master_filename = 'stack_master.yml' @stack_json_filename = "templates/#{@stack_name}.json" - @parameters_filename = File.join("parameters", "#{@stack_name}.yml") - @region_parameters_filename = File.join("parameters", @region, "#{@stack_name}.yml") + @parameters_filename = File.join('parameters', "#{@stack_name}.yml") + @region_parameters_filename = File.join('parameters', @region, "#{@stack_name}.yml") - if !@options.overwrite + unless @options.overwrite [@stack_master_filename, @stack_json_filename, @parameters_filename, @region_parameters_filename].each do |filename| next unless File.exist?(filename) @@ -50,7 +50,7 @@ def stack_json_output end def stack_json_template - File.join(StackMaster.base_dir, "stacktemplates", "stack.json.erb") + File.join(StackMaster.base_dir, 'stacktemplates', 'stack.json.erb') end def create_stack_master_yml @@ -63,7 +63,7 @@ def stack_master_yml_output end def stack_master_template - File.join(StackMaster.base_dir, "stacktemplates", "stack_master.yml.erb") + File.join(StackMaster.base_dir, 'stacktemplates', 'stack_master.yml.erb') end def create_parameters_yml @@ -83,11 +83,11 @@ def parameter_region_yml_output end def parameter_stack_name_template - File.join(StackMaster.base_dir, "stacktemplates", "parameter_stack_name.yml") + File.join(StackMaster.base_dir, 'stacktemplates', 'parameter_stack_name.yml') end def parameter_region_template - File.join(StackMaster.base_dir, "stacktemplates", "parameter_region.yml") + File.join(StackMaster.base_dir, 'stacktemplates', 'parameter_region.yml') end def render(renderer) diff --git a/lib/stack_master/commands/lint.rb b/lib/stack_master/commands/lint.rb index 139d30a1..37e95f0f 100644 --- a/lib/stack_master/commands/lint.rb +++ b/lib/stack_master/commands/lint.rb @@ -19,7 +19,7 @@ def perform f.write(proposed_stack.template_body) f.flush system('cfn-lint', f.path) - puts "cfn-lint run complete" + puts 'cfn-lint run complete' end end diff --git a/lib/stack_master/commands/list_stacks.rb b/lib/stack_master/commands/list_stacks.rb index 1269857c..5f06ef5a 100644 --- a/lib/stack_master/commands/list_stacks.rb +++ b/lib/stack_master/commands/list_stacks.rb @@ -8,7 +8,7 @@ class ListStacks include StackMaster::Commands::TerminalHelper def perform - tp.set :max_width, self.window_size + tp.set :max_width, window_size tp @config.stacks, :region, :stack_name end end diff --git a/lib/stack_master/commands/outputs.rb b/lib/stack_master/commands/outputs.rb index 658e04a3..df478fa9 100644 --- a/lib/stack_master/commands/outputs.rb +++ b/lib/stack_master/commands/outputs.rb @@ -9,7 +9,7 @@ class Outputs def perform if stack - tp.set :max_width, self.window_size + tp.set :max_width, window_size tp stack.outputs, :output_key, :output_value, :description else failed("Stack doesn't exist") diff --git a/lib/stack_master/commands/status.rb b/lib/stack_master/commands/status.rb index 57762053..4d6f1c94 100644 --- a/lib/stack_master/commands/status.rb +++ b/lib/stack_master/commands/status.rb @@ -21,11 +21,11 @@ def perform { region: stack_definition.region, stack_name: stack_definition.stack_name, - stack_status: running_in_allowed_account?(allowed_accounts) ? stack_status.status : "Disallowed account", - different: running_in_allowed_account?(allowed_accounts) ? stack_status.changed_message : "N/A", + stack_status: running_in_allowed_account?(allowed_accounts) ? stack_status.status : 'Disallowed account', + different: running_in_allowed_account?(allowed_accounts) ? stack_status.changed_message : 'N/A' } end - tp.set :max_width, self.window_size + tp.set :max_width, window_size tp.set :io, StackMaster.stdout tp status StackMaster.stdout.puts " * No echo parameters can't be diffed" @@ -34,7 +34,7 @@ def perform private def progress - @progress ||= ProgressBar.create(title: "Fetching stack information", + @progress ||= ProgressBar.create(title: 'Fetching stack information', total: @config.stacks.size, output: StackMaster.stdout) end diff --git a/lib/stack_master/commands/terminal_helper.rb b/lib/stack_master/commands/terminal_helper.rb index be3acc72..ef5d191a 100644 --- a/lib/stack_master/commands/terminal_helper.rb +++ b/lib/stack_master/commands/terminal_helper.rb @@ -4,9 +4,9 @@ module StackMaster module Commands module TerminalHelper def window_size - size = ENV.fetch("COLUMNS") { OS.windows? ? windows_window_size : unix_window_size } + size = ENV.fetch('COLUMNS') { OS.windows? ? windows_window_size : unix_window_size } - if size.nil? || size == "" + if size.nil? || size == '' 80 else size.to_i @@ -18,7 +18,7 @@ def unix_window_size end def windows_window_size - columns_regex = %r{^\s+Columns:\s+([0-9]+)$} + columns_regex = /^\s+Columns:\s+([0-9]+)$/ output = `mode con` columns_line = output.split("\n").select { |line| line.match(columns_regex) }.last columns_line.match(columns_regex)[1] diff --git a/lib/stack_master/commands/tidy.rb b/lib/stack_master/commands/tidy.rb index 078adf3a..49e3be51 100644 --- a/lib/stack_master/commands/tidy.rb +++ b/lib/stack_master/commands/tidy.rb @@ -8,23 +8,23 @@ def perform used_templates = [] used_parameter_files = [] - templates = Set.new(find_templates()) - parameter_files = Set.new(find_parameter_files()) + templates = Set.new(find_templates) + parameter_files = Set.new(find_parameter_files) status = @config.stacks.each do |stack_definition| parameter_files.subtract(stack_definition.parameter_files_from_globs) template = File.absolute_path(stack_definition.template_file_path) - if template - templates.delete(template) + next unless template - if !File.exist?(template) - StackMaster.stdout.puts( - "Stack \"#{stack_definition.stack_name}\" in \"#{stack_definition.region}\" " \ - "missing template \"#{rel_path(template)}\"" - ) - end - end + templates.delete(template) + + next if File.exist?(template) + + StackMaster.stdout.puts( + "Stack \"#{stack_definition.stack_name}\" in \"#{stack_definition.region}\" " \ + "missing template \"#{rel_path(template)}\"" + ) end templates.each do |path| @@ -46,21 +46,19 @@ def find_templates # template directories) this won't find the right directory. template_dir = @config.template_dir || File.join(@config.base_dir, 'templates') - templates = Dir.glob(File.absolute_path(File.join(template_dir, '**', "*.{rb,yaml,yml,json}"))) + templates = Dir.glob(File.absolute_path(File.join(template_dir, '**', '*.{rb,yaml,yml,json}'))) dynamics_dir = File.join(template_dir, 'dynamics') # Exclude sparkleformation dynamics # TODO: Should this filter out anything with 'dynamics', not just the first # subdirectory? - templates = templates.select do |path| + templates.select do |path| !path.start_with?(dynamics_dir) end - - templates end def find_parameter_files - Dir.glob(File.absolute_path(File.join(@config.base_dir, "parameters", "*.{yml,yaml}"))) + Dir.glob(File.absolute_path(File.join(@config.base_dir, 'parameters', '*.{yml,yaml}'))) end end end diff --git a/lib/stack_master/config.rb b/lib/stack_master/config.rb index b4cbbbbc..d332a398 100644 --- a/lib/stack_master/config.rb +++ b/lib/stack_master/config.rb @@ -26,13 +26,13 @@ def self.load!(config_file = 'stack_master.yml') ) def self.search_up_and_chdir(config_file) - return config_file unless File.dirname(config_file) == "." + return config_file unless File.dirname(config_file) == '.' dir = Dir.pwd - parent_dir = File.expand_path("..", Dir.pwd) + parent_dir = File.expand_path('..', Dir.pwd) while parent_dir != dir && !File.exist?(File.join(dir, config_file)) dir = parent_dir - parent_dir = File.expand_path("..", dir) + parent_dir = File.expand_path('..', dir) end File.join(dir, config_file) @@ -45,10 +45,9 @@ def initialize(config, base_dir) @parameters_dir = config.fetch('parameters_dir', nil) @stack_defaults = config.fetch('stack_defaults', {}) @region_aliases = Utils.underscore_keys_to_hyphen(config.fetch('region_aliases', {})) - @region_to_aliases = @region_aliases.inject({}) do |hash, (key, value)| + @region_to_aliases = @region_aliases.each_with_object({}) do |(key, value), hash| hash[value] ||= [] hash[value] << key - hash end @region_defaults = normalise_region_defaults(config.fetch('region_defaults', {})) @stacks = [] @@ -86,7 +85,7 @@ def merge_defaults_to_user_defined_compilers @template_compilers = default_template_compilers.merge(@template_compilers) end - def populate_template_compilers user_defined_compilers + def populate_template_compilers(user_defined_compilers) user_defined_compilers.each do |key, val| @template_compilers[key.to_sym] = val.to_sym end @@ -98,7 +97,7 @@ def default_template_compilers json: :json, yml: :yaml, yaml: :yaml, - erb: :yaml_erb, + erb: :yaml_erb } end @@ -108,9 +107,8 @@ def load_config end def resolve_region_aliases(stacks) - stacks.inject({}) do |hash, (region, attributes)| + stacks.each_with_object({}) do |(region, attributes), hash| hash[unalias_region(region)] = attributes - hash end end @@ -141,10 +139,9 @@ def build_stack_defaults(region) end def normalise_region_defaults(region_defaults) - region_defaults.inject({}) do |normalised_aliases, (region_or_alias, value)| + region_defaults.each_with_object({}) do |(region_or_alias, value), normalised_aliases| region = unalias_region(region_or_alias) normalised_aliases[Utils.underscore_to_hyphen(region)] = value - normalised_aliases end end end diff --git a/lib/stack_master/diff.rb b/lib/stack_master/diff.rb index c55dadb9..4d4c5442 100644 --- a/lib/stack_master/diff.rb +++ b/lib/stack_master/diff.rb @@ -1,6 +1,6 @@ module StackMaster class Diff - def initialize(name: nil, before:, after:, context: 10_000) + def initialize(before:, after:, name: nil, context: 10_000) @name = name @before = before @after = after @@ -10,7 +10,7 @@ def initialize(name: nil, before:, after:, context: 10_000) def display stdout.print "#{@name} diff: " if diff == '' - stdout.puts "No changes" + stdout.puts 'No changes' else stdout.puts display_colorized_diff diff --git a/lib/stack_master/parameter_loader.rb b/lib/stack_master/parameter_loader.rb index 4d62cb87..a9baf4e3 100644 --- a/lib/stack_master/parameter_loader.rb +++ b/lib/stack_master/parameter_loader.rb @@ -7,13 +7,12 @@ class ParameterLoader def self.load(parameter_files: [], parameters: {}) StackMaster.debug 'Searching for parameter files...' all_parameters = parameter_files.map { |file_name| load_parameters(file_name) } + [parameters] - all_parameters.reduce({ template_parameters: {}, compile_time_parameters: {} }) do |hash, parameters| + all_parameters.each_with_object({ template_parameters: {}, compile_time_parameters: {} }) do |parameters, hash| template_parameters = create_template_parameters(parameters) compile_time_parameters = create_compile_time_parameters(parameters) merge_and_camelize(hash[:template_parameters], template_parameters) merge_and_camelize(hash[:compile_time_parameters], compile_time_parameters) - hash end end diff --git a/lib/stack_master/parameter_resolver.rb b/lib/stack_master/parameter_resolver.rb index 8e316408..6d5d47f9 100644 --- a/lib/stack_master/parameter_resolver.rb +++ b/lib/stack_master/parameter_resolver.rb @@ -15,13 +15,12 @@ def initialize(config, stack_definition, parameters) end def resolve - @parameters.reduce({}) do |parameters, (key, value)| + @parameters.each_with_object({}) do |(key, value), parameters| begin parameters[key] = resolve_parameter_value(key, value) rescue InvalidParameter raise InvalidParameter, "Unable to resolve parameter #{key.inspect} value causing error: #{$!.message}" end - parameters end end @@ -30,11 +29,9 @@ def resolve def require_parameter_resolver(file_name) require "stack_master/parameter_resolvers/#{file_name}" rescue LoadError - if file_name == file_name.singularize - raise ResolverNotFound.new(file_name) - else - require_parameter_resolver(file_name.singularize) - end + raise ResolverNotFound.new(file_name) if file_name == file_name.singularize + + require_parameter_resolver(file_name.singularize) end def load_parameter_resolver(class_name) @@ -46,9 +43,11 @@ def load_parameter_resolver(class_name) end def resolve_parameter_value(key, parameter_value) - return parameter_value.to_s if Numeric === parameter_value || parameter_value == true || parameter_value == false - return resolve_array_parameter_values(key, parameter_value).join(',') if Array === parameter_value - return parameter_value unless Hash === parameter_value + if parameter_value.is_a?(Numeric) || parameter_value == true || parameter_value == false + return parameter_value.to_s + end + return resolve_array_parameter_values(key, parameter_value).join(',') if parameter_value.is_a?(Array) + return parameter_value unless parameter_value.is_a?(Hash) resolve_parameter_resolver_hash(key, parameter_value) rescue Aws::CloudFormation::Errors::ValidationError @@ -73,15 +72,13 @@ def resolve_parameter_resolver_hash(key, parameter_value) end end - def assume_role_if_present(account, role, key) + def assume_role_if_present(account, role, key, &block) return yield if account.nil? && role.nil? if account.nil? || role.nil? raise InvalidParameter, "Both 'account' and 'role' are required to assume role for parameter '#{key}'" end - role_assumer.assume_role(account, role) do - yield - end + role_assumer.assume_role(account, role, &block) end def resolve_array_parameter_values(key, parameter_values) @@ -114,9 +111,9 @@ def resolver_class(class_name) end def validate_parameter_value!(key, parameter_value) - if parameter_value.keys.size != 1 - raise InvalidParameter, "#{key} hash contained more than one key: #{parameter_value.inspect}" - end + return if parameter_value.keys.size == 1 + + raise InvalidParameter, "#{key} hash contained more than one key: #{parameter_value.inspect}" end def role_assumer diff --git a/lib/stack_master/parameter_resolvers/ami_finder.rb b/lib/stack_master/parameter_resolvers/ami_finder.rb index d079a3a6..d2cff117 100644 --- a/lib/stack_master/parameter_resolvers/ami_finder.rb +++ b/lib/stack_master/parameter_resolvers/ami_finder.rb @@ -6,12 +6,11 @@ def initialize(region) end def build_filters_from_string(value, prefix = nil) - filters = value.split(',').map do |name_with_value| + value.split(',').map do |name_with_value| name, value = name_with_value.strip.split('=') name = prefix ? "#{prefix}:#{name}" : name { name: name, values: [value] } end - filters end def build_filters_from_hash(hash) diff --git a/lib/stack_master/parameter_resolvers/ejson.rb b/lib/stack_master/parameter_resolvers/ejson.rb index 26a01f76..e1cc241a 100644 --- a/lib/stack_master/parameter_resolvers/ejson.rb +++ b/lib/stack_master/parameter_resolvers/ejson.rb @@ -22,10 +22,10 @@ def resolve(secret_key) private def validate_ejson_file_specified - if @stack_definition.ejson_file.nil? - raise ArgumentError, 'No ejson_file defined for stack definition ' \ - "#{@stack_definition.stack_name} in #{@stack_definition.region}" - end + return unless @stack_definition.ejson_file.nil? + + raise ArgumentError, 'No ejson_file defined for stack definition ' \ + "#{@stack_definition.stack_name} in #{@stack_definition.region}" end def decrypt_ejson_file diff --git a/lib/stack_master/parameter_resolvers/latest_ami_by_tags.rb b/lib/stack_master/parameter_resolvers/latest_ami_by_tags.rb index 5874c258..af1416fd 100644 --- a/lib/stack_master/parameter_resolvers/latest_ami_by_tags.rb +++ b/lib/stack_master/parameter_resolvers/latest_ami_by_tags.rb @@ -10,7 +10,7 @@ def initialize(config, stack_definition) end def resolve(value) - filters = @ami_finder.build_filters_from_string(value, prefix = "tag") + filters = @ami_finder.build_filters_from_string(value, prefix = 'tag') @ami_finder.find_latest_ami(filters)&.image_id end end diff --git a/lib/stack_master/parameter_resolvers/latest_container.rb b/lib/stack_master/parameter_resolvers/latest_container.rb index cf38aa18..a6d87edb 100644 --- a/lib/stack_master/parameter_resolvers/latest_container.rb +++ b/lib/stack_master/parameter_resolvers/latest_container.rb @@ -10,7 +10,7 @@ def initialize(config, stack_definition) def resolve(parameters) if parameters['repository_name'].nil? - raise ArgumentError, "repository_name parameter is required but was not supplied" + raise ArgumentError, 'repository_name parameter is required but was not supplied' end @region = parameters['region'] || @stack_definition.region @@ -43,8 +43,8 @@ def fetch_images(repository_name, registry_id, ecr) registry_id: registry_id, next_token: next_token, filter: { - tag_status: "TAGGED", - }, + tag_status: 'TAGGED' + } } ) diff --git a/lib/stack_master/parameter_resolvers/one_password.rb b/lib/stack_master/parameter_resolvers/one_password.rb index 01629dc0..8ee04880 100644 --- a/lib/stack_master/parameter_resolvers/one_password.rb +++ b/lib/stack_master/parameter_resolvers/one_password.rb @@ -16,7 +16,7 @@ def initialize(config, stack_definition) def resolve(params = {}) if ENV.keys.grep(/OP_SESSION_\w+$/).empty? raise OnePasswordNotAbleToAuthenticate, - "1password requires the `OP_SESSION_` to be set, (remember to sign in?)" + '1password requires the `OP_SESSION_` to be set, (remember to sign in?)' end get_items(params) @@ -25,7 +25,7 @@ def resolve(params = {}) private def validate_op_installed? - %x(op --version) + `op --version` rescue Errno::ENOENT => exception raise OnePasswordBinaryNotFound, "The op cli needs to be installed and in the PATH, #{exception}" end @@ -53,7 +53,7 @@ def login_item(data) def op_get_item(item, vault) validate_op_installed? - item = %x(op get item --vault='#{vault}' '#{item}' 2>&1) + item = `op get item --vault='#{vault}' '#{item}' 2>&1` item if validate_response?(item) end @@ -79,9 +79,9 @@ def get_secure_note(title, vault) def get_items(params) case params['type'] when 'password' - return get_password(params['title'], params['vault']) + get_password(params['title'], params['vault']) when 'secureNote' - return get_secure_note(params['title'], params['vault']) + get_secure_note(params['title'], params['vault']) end end end diff --git a/lib/stack_master/parameter_resolvers/sso_group_id.rb b/lib/stack_master/parameter_resolvers/sso_group_id.rb index b1743e9a..3bf5ed71 100644 --- a/lib/stack_master/parameter_resolvers/sso_group_id.rb +++ b/lib/stack_master/parameter_resolvers/sso_group_id.rb @@ -15,7 +15,7 @@ def resolve(value) private def sso_group_id_finder - StackMaster::SsoGroupIdFinder.new() + StackMaster::SsoGroupIdFinder.new end end end diff --git a/lib/stack_master/parameter_resolvers/stack_output.rb b/lib/stack_master/parameter_resolvers/stack_output.rb index 01379a2f..a6dd4992 100644 --- a/lib/stack_master/parameter_resolvers/stack_output.rb +++ b/lib/stack_master/parameter_resolvers/stack_output.rb @@ -17,18 +17,14 @@ def initialize(config, stack_definition) def resolve(value) region, stack_name, output_name = parse!(value) stack = find_stack(stack_name, region) - if stack - output = stack.outputs.find do |stack_output| - stack_output.output_key == output_name.camelize || stack_output.output_key == output_name - end - if output - output.output_value - else - raise StackOutputNotFound, "Stack exists (#{stack_name}), but output does not: #{output_name}" - end - else - raise StackNotFound, "Stack in StackOutput not found: #{value}" + raise StackNotFound, "Stack in StackOutput not found: #{value}" unless stack + + output = stack.outputs.find do |stack_output| + stack_output.output_key == output_name.camelize || stack_output.output_key == output_name end + raise StackOutputNotFound, "Stack exists (#{stack_name}), but output does not: #{output_name}" unless output + + output.output_value end private diff --git a/lib/stack_master/parameter_validator.rb b/lib/stack_master/parameter_validator.rb index e6e0b8c2..b80e726a 100644 --- a/lib/stack_master/parameter_validator.rb +++ b/lib/stack_master/parameter_validator.rb @@ -14,11 +14,7 @@ def error_message missing_parameters.each do |parameter_name| message << " - #{parameter_name}\n" end - if @stack_definition.parameter_files.empty? - message << message_for_parameter_globs - else - message << message_for_parameter_files - end + message << (@stack_definition.parameter_files.empty? ? message_for_parameter_globs : message_for_parameter_files) message end diff --git a/lib/stack_master/prompter.rb b/lib/stack_master/prompter.rb index b132ed62..99b24435 100644 --- a/lib/stack_master/prompter.rb +++ b/lib/stack_master/prompter.rb @@ -10,7 +10,7 @@ def ask?(question) StackMaster.stdin.getch.chomp else StackMaster.stdout.puts - StackMaster.stdout.puts "STDOUT or STDIN was not a TTY. Defaulting to no. To force yes use -y" + StackMaster.stdout.puts 'STDOUT or STDIN was not a TTY. Defaulting to no. To force yes use -y' 'n' end else diff --git a/lib/stack_master/resolver_array.rb b/lib/stack_master/resolver_array.rb index c4e8f341..a5d09bc9 100644 --- a/lib/stack_master/resolver_array.rb +++ b/lib/stack_master/resolver_array.rb @@ -13,13 +13,13 @@ def resolve(values) end def resolver_class - fail "Method resolver_class not implemented on #{self.class}" + raise "Method resolver_class not implemented on #{self.class}" end end class Resolver def self.array_resolver(options = {}) - resolver_class ||= Object.const_get(self.name) + resolver_class ||= Object.const_get(name) array_resolver_class_name = options[:class_name] || resolver_class.to_s.demodulize.pluralize klass = Class.new(ResolverArray) do diff --git a/lib/stack_master/role_assumer.rb b/lib/stack_master/role_assumer.rb index ab67804a..941a5b63 100644 --- a/lib/stack_master/role_assumer.rb +++ b/lib/stack_master/role_assumer.rb @@ -48,7 +48,7 @@ def assume_role_credentials(account, role) { region: StackMaster.cloud_formation_driver.region, role_arn: "arn:aws:iam::#{account}:role/#{role}", - role_session_name: "stack-master-role-assumer" + role_session_name: 'stack-master-role-assumer' } ) end diff --git a/lib/stack_master/security_group_finder.rb b/lib/stack_master/security_group_finder.rb index 8398ca1d..455736f7 100644 --- a/lib/stack_master/security_group_finder.rb +++ b/lib/stack_master/security_group_finder.rb @@ -15,10 +15,10 @@ def find(reference) groups = @resource.security_groups({ filters: [ { - name: "group-name", - values: [reference], - }, - ], + name: 'group-name', + values: [reference] + } + ] }) raise SecurityGroupNotFound, "No security group with name #{reference} found" unless groups.any? diff --git a/lib/stack_master/sns_topic_finder.rb b/lib/stack_master/sns_topic_finder.rb index ee06d118..607d7ec1 100644 --- a/lib/stack_master/sns_topic_finder.rb +++ b/lib/stack_master/sns_topic_finder.rb @@ -21,7 +21,7 @@ def find(reference) private def topic_name_from_arn(arn) - arn.split(":")[5] + arn.split(':')[5] end end end diff --git a/lib/stack_master/sparkle_formation/compile_time/allowed_pattern_validator.rb b/lib/stack_master/sparkle_formation/compile_time/allowed_pattern_validator.rb index 94bd673b..a2c25a1c 100644 --- a/lib/stack_master/sparkle_formation/compile_time/allowed_pattern_validator.rb +++ b/lib/stack_master/sparkle_formation/compile_time/allowed_pattern_validator.rb @@ -22,7 +22,7 @@ def check_is_valid def invalid_values values = build_values(@definition, @parameter) - values.reject { |value| value.to_s.match(%r{#{@definition[KEY]}}) } + values.reject { |value| value.to_s.match(/#{@definition[KEY]}/) } end def create_error diff --git a/lib/stack_master/sparkle_formation/compile_time/definitions_validator.rb b/lib/stack_master/sparkle_formation/compile_time/definitions_validator.rb index 574e90ef..3c087fb4 100644 --- a/lib/stack_master/sparkle_formation/compile_time/definitions_validator.rb +++ b/lib/stack_master/sparkle_formation/compile_time/definitions_validator.rb @@ -4,7 +4,7 @@ module StackMaster module SparkleFormation module CompileTime class DefinitionsValidator - VALID_TYPES = [:string, :number] + VALID_TYPES = %i[string number] def initialize(definitions) @definitions = definitions end diff --git a/lib/stack_master/sparkle_formation/compile_time/value_builder.rb b/lib/stack_master/sparkle_formation/compile_time/value_builder.rb index 60eebe27..f35767f2 100644 --- a/lib/stack_master/sparkle_formation/compile_time/value_builder.rb +++ b/lib/stack_master/sparkle_formation/compile_time/value_builder.rb @@ -21,16 +21,16 @@ def parameter_or_default end def convert_strings_to_array - if @definition[:multiple] && @value.is_a?(String) - @value = @value.split(',').map(&:strip) - end + return unless @definition[:multiple] && @value.is_a?(String) + + @value = @value.split(',').map(&:strip) end def convert_strings_to_numbers - if @definition[:type] == :number - @value = @value.to_f if @value.is_a?(String) - @value = @value.map { |item| item.is_a?(String) ? item.to_f : item } if @value.is_a?(Array) - end + return if @definition[:type] != :number + + @value = @value.to_f if @value.is_a?(String) + @value = @value.map { |item| item.is_a?(String) ? item.to_f : item } if @value.is_a?(Array) end end end diff --git a/lib/stack_master/sparkle_formation/compile_time/value_validator.rb b/lib/stack_master/sparkle_formation/compile_time/value_validator.rb index a6e4f3f4..2b0e73b5 100644 --- a/lib/stack_master/sparkle_formation/compile_time/value_validator.rb +++ b/lib/stack_master/sparkle_formation/compile_time/value_validator.rb @@ -27,9 +27,7 @@ def build_values(definition, parameter) private def convert_to_array(definition, parameter) - if definition[:multiple] && parameter.is_a?(String) - return parameter.split(',').map(&:strip) - end + return parameter.split(',').map(&:strip) if definition[:multiple] && parameter.is_a?(String) parameter.is_a?(Array) ? parameter : [parameter] end diff --git a/lib/stack_master/sparkle_formation/template_file.rb b/lib/stack_master/sparkle_formation/template_file.rb index cb263ef6..f6bb232c 100644 --- a/lib/stack_master/sparkle_formation/template_file.rb +++ b/lib/stack_master/sparkle_formation/template_file.rb @@ -49,14 +49,14 @@ module JoinedFile def _joined_file(file_name, vars = {}) join!(Template.render('joined_file', file_name, vars)) end - alias_method :joined_file!, :_joined_file + alias joined_file! _joined_file end module UserDataFile def _user_data_file(file_name, vars = {}) base64!(join!(Template.render('user_data', file_name, vars))) end - alias_method :user_data_file!, :_user_data_file + alias user_data_file! _user_data_file end end end diff --git a/lib/stack_master/sso_group_id_finder.rb b/lib/stack_master/sso_group_id_finder.rb index 9a453313..0eb71229 100644 --- a/lib/stack_master/sso_group_id_finder.rb +++ b/lib/stack_master/sso_group_id_finder.rb @@ -19,9 +19,9 @@ def find(reference) alternate_identifier: { unique_attribute: { attribute_path: 'displayName', - attribute_value: match[:group_name], - }, - }, + attribute_value: match[:group_name] + } + } } ) return response.group_id diff --git a/lib/stack_master/stack.rb b/lib/stack_master/stack.rb index 88e2e580..ed2f0c9f 100644 --- a/lib/stack_master/stack.rb +++ b/lib/stack_master/stack.rb @@ -20,9 +20,8 @@ def template_default_parameters TemplateUtils .template_hash(template) .fetch('Parameters', {}) - .inject({}) do |result, (parameter_name, description)| + .each_with_object({}) do |(parameter_name, description), result| result[parameter_name] = description['Default']&.to_s - result end end @@ -35,9 +34,8 @@ def self.find(region, stack_name) cf_stack = cf.describe_stacks({ stack_name: stack_name }).stacks.first return unless cf_stack - parameters = cf_stack.parameters.inject({}) do |params_hash, param_struct| + parameters = cf_stack.parameters.each_with_object({}) do |param_struct, params_hash| params_hash[param_struct.parameter_key] = param_struct.parameter_value - params_hash end template_body ||= cf.get_template({ stack_name: stack_name, template_stage: 'Original' }).template_body template_format = TemplateUtils.identify_template_format(template_body) diff --git a/lib/stack_master/stack_definition.rb b/lib/stack_master/stack_definition.rb index a71e8b96..ef750186 100644 --- a/lib/stack_master/stack_definition.rb +++ b/lib/stack_master/stack_definition.rb @@ -35,7 +35,7 @@ def initialize(attributes = {}) @compiler = nil super @additional_parameter_lookup_dirs ||= [] - @base_dir ||= "" + @base_dir ||= '' @template_dir ||= File.join(@base_dir, 'templates') @parameters_dir ||= File.join(@base_dir, 'parameters') @allowed_accounts = Array(@allowed_accounts) @@ -44,7 +44,7 @@ def initialize(attributes = {}) end def ==(other) - self.class === other && + other.is_a?(self.class) && @region == other.region && @stack_name == other.stack_name && @template == other.template && @@ -74,13 +74,12 @@ def files_dir end def s3_files - files.inject({}) do |hash, file| + files.each_with_object({}) do |file, hash| path = File.join(files_dir, file) hash[file] = { path: path, body: File.read(path) } - hash end end diff --git a/lib/stack_master/stack_differ.rb b/lib/stack_master/stack_differ.rb index 916f6edd..c868905b 100644 --- a/lib/stack_master/stack_differ.rb +++ b/lib/stack_master/stack_differ.rb @@ -1,5 +1,5 @@ -require "diffy" -require "hashdiff" +require 'diffy' +require 'hashdiff' module StackMaster class StackDiffer @@ -34,7 +34,7 @@ def proposed_parameters params = @proposed_stack.parameters_with_defaults if @current_stack noecho_keys.each do |key| - params[key] = "****" + params[key] = '****' end end YAML.dump(sort_params(params)) @@ -65,16 +65,14 @@ def output_diff body_diff.display parameters_diff.display - unless noecho_keys.empty? - StackMaster.stdout.puts " * can not tell if NoEcho parameters are different." - end - StackMaster.stdout.puts "No stack found" if @current_stack.nil? + StackMaster.stdout.puts ' * can not tell if NoEcho parameters are different.' unless noecho_keys.empty? + StackMaster.stdout.puts 'No stack found' if @current_stack.nil? end def noecho_keys if @current_stack @current_stack.parameters_with_defaults.select do |key, value| - value == "****" + value == '****' end.keys else [] @@ -88,7 +86,7 @@ def single_param_update?(param_name) return false if differences.count != 1 diff = differences[0] - diff[0] == "~" && diff[1] == param_name + diff[0] == '~' && diff[1] == param_name end private diff --git a/lib/stack_master/template_compilers/json.rb b/lib/stack_master/template_compilers/json.rb index c15c41b4..4e4fcc3e 100644 --- a/lib/stack_master/template_compilers/json.rb +++ b/lib/stack_master/template_compilers/json.rb @@ -1,6 +1,6 @@ module StackMaster::TemplateCompilers class Json - MAX_TEMPLATE_SIZE = 51200 + MAX_TEMPLATE_SIZE = 51_200 private_constant :MAX_TEMPLATE_SIZE def self.require_dependencies diff --git a/lib/stack_master/template_compilers/sparkle_formation.rb b/lib/stack_master/template_compilers/sparkle_formation.rb index 334bd238..40da8900 100644 --- a/lib/stack_master/template_compilers/sparkle_formation.rb +++ b/lib/stack_master/template_compilers/sparkle_formation.rb @@ -36,13 +36,13 @@ def self.compile_sparkle_template(template_dir, template, compiler_options) collection = ::SparkleFormation::SparkleCollection.new root_pack = ::SparkleFormation::Sparkle.new( - :root => sparkle_path, + root: sparkle_path ) collection.set_root(root_pack) if compiler_options['sparkle_packs'] compiler_options['sparkle_packs'].each do |pack_name| require pack_name - pack = ::SparkleFormation::SparklePack.new(:name => pack_name) + pack = ::SparkleFormation::SparklePack.new(name: pack_name) collection.add_sparkle(pack) end end diff --git a/lib/stack_master/template_utils.rb b/lib/stack_master/template_utils.rb index 37f5392d..5e120393 100644 --- a/lib/stack_master/template_utils.rb +++ b/lib/stack_master/template_utils.rb @@ -1,7 +1,7 @@ module StackMaster module TemplateUtils - MAX_TEMPLATE_SIZE = 51200 - MAX_S3_TEMPLATE_SIZE = 460800 + MAX_TEMPLATE_SIZE = 51_200 + MAX_S3_TEMPLATE_SIZE = 460_800 # Matches if the first non-whitespace character is a '{', handling cases # with leading whitespace and extra (whitespace-only) lines. JSON_IDENTIFICATION_PATTERN = Regexp.new('\A\s*{', Regexp::MULTILINE) diff --git a/lib/stack_master/test_driver/cloud_formation.rb b/lib/stack_master/test_driver/cloud_formation.rb index dd5cf8fd..940b6efd 100644 --- a/lib/stack_master/test_driver/cloud_formation.rb +++ b/lib/stack_master/test_driver/cloud_formation.rb @@ -139,11 +139,11 @@ def describe_stacks(options = {}) stack_name = options[:stack_name] stacks = if stack_name - if @stacks[stack_name] - [@stacks[stack_name]] - else + unless @stacks[stack_name] raise Aws::CloudFormation::Errors::ValidationError.new('', 'Stack does not exist') end + + [@stacks[stack_name]] else @stacks.values end diff --git a/lib/stack_master/test_driver/s3.rb b/lib/stack_master/test_driver/s3.rb index ad4eda53..857f60e4 100644 --- a/lib/stack_master/test_driver/s3.rb +++ b/lib/stack_master/test_driver/s3.rb @@ -5,11 +5,10 @@ def initialize reset end - def set_region(_) - end + def set_region(_); end def reset - @files = Hash.new { |hash, key| hash[key] = Hash.new } + @files = Hash.new { |hash, key| hash[key] = {} } end def upload_files(bucket: nil, prefix: nil, region: nil, files: {}) diff --git a/lib/stack_master/utils.rb b/lib/stack_master/utils.rb index 07173421..9a8aa9b2 100644 --- a/lib/stack_master/utils.rb +++ b/lib/stack_master/utils.rb @@ -22,18 +22,16 @@ def change_extension(file_name, extension) end def hash_to_aws_parameters(params) - params.inject([]) do |params, (key, value)| + params.each_with_object([]) do |(key, value), params| params << { parameter_key: key, parameter_value: value } - params end end def hash_to_aws_tags(tags) return [] if tags.nil? - tags.inject([]) do |aws_tags, (key, value)| + tags.each_with_object([]) do |(key, value), aws_tags| aws_tags << { key: key, value: value } - aws_tags end end @@ -42,9 +40,8 @@ def underscore_to_hyphen(string) end def underscore_keys_to_hyphen(hash) - hash.inject({}) do |hash, (key, value)| + hash.each_with_object({}) do |(key, value), hash| hash[underscore_to_hyphen(key)] = value - hash end end end diff --git a/lib/stack_master/validator.rb b/lib/stack_master/validator.rb index 07189644..d48c7515 100644 --- a/lib/stack_master/validator.rb +++ b/lib/stack_master/validator.rb @@ -17,7 +17,7 @@ def perform return false end cf.validate_template(template_body: TemplateUtils.maybe_compressed_template_body(stack.template_body)) - StackMaster.stdout.puts "valid" + StackMaster.stdout.puts 'valid' true rescue Aws::CloudFormation::Errors::ValidationError => e StackMaster.stdout.puts "invalid. #{e.message}" diff --git a/lib/stack_master/version.rb b/lib/stack_master/version.rb index 81a1d5b5..1b60eb38 100644 --- a/lib/stack_master/version.rb +++ b/lib/stack_master/version.rb @@ -1,3 +1,3 @@ module StackMaster - VERSION = "2.17.1" + VERSION = '2.17.1' end diff --git a/spec/fixtures/sparkle_pack_integration/my_sparkle_pack/lib/sparkleformation/dynamics/my_dynamic.rb b/spec/fixtures/sparkle_pack_integration/my_sparkle_pack/lib/sparkleformation/dynamics/my_dynamic.rb index b0c896ca..329fc441 100644 --- a/spec/fixtures/sparkle_pack_integration/my_sparkle_pack/lib/sparkleformation/dynamics/my_dynamic.rb +++ b/spec/fixtures/sparkle_pack_integration/my_sparkle_pack/lib/sparkleformation/dynamics/my_dynamic.rb @@ -1,5 +1,5 @@ SparkleFormation.dynamic(:my_dynamic) do outputs.foo do - value "bar" + value 'bar' end end diff --git a/spec/fixtures/sparkle_pack_integration/my_sparkle_pack/lib/sparkleformation/templates/dynamics/local_dynamic.rb b/spec/fixtures/sparkle_pack_integration/my_sparkle_pack/lib/sparkleformation/templates/dynamics/local_dynamic.rb index d5f6a558..903a4bf2 100644 --- a/spec/fixtures/sparkle_pack_integration/my_sparkle_pack/lib/sparkleformation/templates/dynamics/local_dynamic.rb +++ b/spec/fixtures/sparkle_pack_integration/my_sparkle_pack/lib/sparkleformation/templates/dynamics/local_dynamic.rb @@ -1,5 +1,5 @@ SparkleFormation.dynamic(:local_dynamic) do outputs.bar do - value "local_dynamic" + value 'local_dynamic' end end diff --git a/spec/fixtures/templates/rb/cfndsl/sample-ctp-repeated.rb b/spec/fixtures/templates/rb/cfndsl/sample-ctp-repeated.rb index 83d39b16..37c795cf 100644 --- a/spec/fixtures/templates/rb/cfndsl/sample-ctp-repeated.rb +++ b/spec/fixtures/templates/rb/cfndsl/sample-ctp-repeated.rb @@ -1,17 +1,17 @@ -CloudFormation { - Description "Test" +CloudFormation do + Description 'Test' - Parameter("One") { + Parameter('One') do String - Default "Test" + Default 'Test' MaxLength 15 - } + end - Output(:One, FnBase64(Ref("One"))) + Output(:One, FnBase64(Ref('One'))) - EC2_Instance(:MyInstance) { - DisableApiTermination external_parameters.fetch(:DisableApiTermination, "false") - InstanceType external_parameters["InstanceType"] - ImageId "ami-12345678" - } -} + EC2_Instance(:MyInstance) do + DisableApiTermination external_parameters.fetch(:DisableApiTermination, 'false') + InstanceType external_parameters['InstanceType'] + ImageId 'ami-12345678' + end +end diff --git a/spec/fixtures/templates/rb/cfndsl/sample-ctp.rb b/spec/fixtures/templates/rb/cfndsl/sample-ctp.rb index fa97240c..7e7e561d 100644 --- a/spec/fixtures/templates/rb/cfndsl/sample-ctp.rb +++ b/spec/fixtures/templates/rb/cfndsl/sample-ctp.rb @@ -1,16 +1,16 @@ -CloudFormation { - Description "Test" +CloudFormation do + Description 'Test' - Parameter("One") { + Parameter('One') do String - Default "Test" + Default 'Test' MaxLength 15 - } + end - Output(:One, FnBase64(Ref("One"))) + Output(:One, FnBase64(Ref('One'))) - EC2_Instance(:MyInstance) { - InstanceType external_parameters["InstanceType"] - ImageId "ami-12345678" - } -} + EC2_Instance(:MyInstance) do + InstanceType external_parameters['InstanceType'] + ImageId 'ami-12345678' + end +end diff --git a/spec/fixtures/templates/rb/cfndsl/sample.rb b/spec/fixtures/templates/rb/cfndsl/sample.rb index f7664adb..89d832d3 100644 --- a/spec/fixtures/templates/rb/cfndsl/sample.rb +++ b/spec/fixtures/templates/rb/cfndsl/sample.rb @@ -1,15 +1,15 @@ -CloudFormation { - Description "Test" +CloudFormation do + Description 'Test' - Parameter("One") { + Parameter('One') do String - Default "Test" + Default 'Test' MaxLength 15 - } + end - Output(:One, FnBase64(Ref("One"))) + Output(:One, FnBase64(Ref('One'))) - EC2_Instance(:MyInstance) { - ImageId "ami-12345678" - } -} + EC2_Instance(:MyInstance) do + ImageId 'ami-12345678' + end +end diff --git a/spec/fixtures/templates/rb/sparkle_formation/templates/template.rb b/spec/fixtures/templates/rb/sparkle_formation/templates/template.rb index 8c281623..07f2a16e 100644 --- a/spec/fixtures/templates/rb/sparkle_formation/templates/template.rb +++ b/spec/fixtures/templates/rb/sparkle_formation/templates/template.rb @@ -1,5 +1,5 @@ SparkleFormation.new(:myapp_vpc_2) do - description "A test VPC template" + description 'A test VPC template' resources.vpc do type 'AWS::EC2::VPC' diff --git a/spec/integration/drift_spec.rb b/spec/integration/drift_spec.rb index 170dcb03..a3a3bf16 100644 --- a/spec/integration/drift_spec.rb +++ b/spec/integration/drift_spec.rb @@ -1,11 +1,11 @@ -RSpec.describe "drift command", type: :aruba do +RSpec.describe 'drift command', type: :aruba do let(:cfn) { Aws::CloudFormation::Client.new(stub_responses: true) } let(:expected_properties) { '{"CidrIp":"1.2.3.4/0","FromPort":80,"IpProtocol":"tcp","ToPort":80}' } let(:actual_properties) { '{"CidrIp":"5.6.7.8/0","FromPort":80,"IpProtocol":"tcp","ToPort":80}' } before do allow(Aws::CloudFormation::Client).to receive(:new).and_return(cfn) - write_file("stack_master.yml", <<~FILE) + write_file('stack_master.yml', <<~FILE) stacks: us-east-1: myapp-web: @@ -15,40 +15,40 @@ context 'when drifted' do before do - stub_drift_detection(stack_drift_status: "DRIFTED") + stub_drift_detection(stack_drift_status: 'DRIFTED') stub_stack_resource_drift( - stack_name: "myapp-web", + stack_name: 'myapp-web', stack_resource_drifts: [ - stack_id: "1", + stack_id: '1', timestamp: Time.now, - stack_resource_drift_status: "MODIFIED", - resource_type: "AWS::EC2::SecurityGroup", - logical_resource_id: "SecurityGroup", - physical_resource_id: "sg-123456", + stack_resource_drift_status: 'MODIFIED', + resource_type: 'AWS::EC2::SecurityGroup', + logical_resource_id: 'SecurityGroup', + physical_resource_id: 'sg-123456', expected_properties: expected_properties, actual_properties: actual_properties, property_differences: [ { difference_type: 'ADD', property_path: '/SecurityGroupIngress/2', - expected_value: "", - actual_value: "", + expected_value: '', + actual_value: '' } ] ] ) - run_command_and_stop("stack_master drift us-east-1 myapp-web --trace", fail_on_error: false) + run_command_and_stop('stack_master drift us-east-1 myapp-web --trace', fail_on_error: false) end - it "exits unsuccessfully" do + it 'exits unsuccessfully' do expect(last_command_stopped).not_to be_successfully_executed end it 'outputs stack drift information' do [ - "Drift Status: DRIFTED", - "MODIFIED AWS::EC2::SecurityGroup SecurityGroup sg-123456", - "- ADD /SecurityGroupIngress/2", + 'Drift Status: DRIFTED', + 'MODIFIED AWS::EC2::SecurityGroup SecurityGroup sg-123456', + '- ADD /SecurityGroupIngress/2', '\- "CidrIp": "1.2.3.4/0",', '\+ "CidrIp": "5.6.7.8/0",' ].each do |line| @@ -59,12 +59,12 @@ context 'when not drifted' do before do - stub_drift_detection(stack_drift_status: "IN_SYNC") + stub_drift_detection(stack_drift_status: 'IN_SYNC') stub_stack_resource_drift( - stack_name: "myapp-web", + stack_name: 'myapp-web', stack_resource_drifts: [] ) - run_command_and_stop("stack_master drift us-east-1 myapp-web --trace", fail_on_error: false) + run_command_and_stop('stack_master drift us-east-1 myapp-web --trace', fail_on_error: false) end it 'exits successfully' do @@ -73,7 +73,7 @@ it 'outputs stack drift information' do [ - "Drift Status: IN_SYNC", + 'Drift Status: IN_SYNC' ].each do |line| expect(last_command_stopped).to have_output an_output_string_matching(line) end diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 4b9c8397..f9c4c4dd 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -3,7 +3,7 @@ require 'pry' require 'os' -Dir["./spec/support/**/*.rb"].sort.each { |f| require f } +Dir['./spec/support/**/*.rb'].sort.each { |f| require f } Aws.config[:stub_responses] = true # This file was generated by the `rspec --init` command. Conventionally, all @@ -63,7 +63,7 @@ # Allows RSpec to persist some state between runs in order to support # the `--only-failures` and `--next-failure` CLI options. We recommend # you configure your source control system to ignore this file. - config.example_status_persistence_file_path = "spec/examples.txt" + config.example_status_persistence_file_path = 'spec/examples.txt' # Limits the available syntax to the non-monkey patched syntax that is # recommended. For more details, see: diff --git a/spec/stack_master/aws_driver/s3_spec.rb b/spec/stack_master/aws_driver/s3_spec.rb index bd64b8bb..b5171c86 100644 --- a/spec/stack_master/aws_driver/s3_spec.rb +++ b/spec/stack_master/aws_driver/s3_spec.rb @@ -44,7 +44,7 @@ key: 'prefix/template', body: 'file content', metadata: { - md5: "d10b4c3ff123b26dc068d43a8bef2d23" + md5: 'd10b4c3ff123b26dc068d43a8bef2d23' } } ) @@ -58,8 +58,8 @@ bucket: 'bucket', region: 'region', files: { 'template' => { - :path => 'spec/fixtures/templates/myapp_vpc.json', - :body => 'file content' + path: 'spec/fixtures/templates/myapp_vpc.json', + body: 'file content' } } } end @@ -71,7 +71,7 @@ key: 'template', body: 'file content', metadata: { - md5: "d10b4c3ff123b26dc068d43a8bef2d23" + md5: 'd10b4c3ff123b26dc068d43a8bef2d23' } } ) @@ -86,8 +86,8 @@ region: 'region', prefix: 'prefix', files: { 'template' => { - :path => 'spec/fixtures/templates/myapp_vpc.json', - :body => 'file content' + path: 'spec/fixtures/templates/myapp_vpc.json', + body: 'file content' } } } end @@ -99,7 +99,7 @@ key: 'prefix/template', body: 'file content', metadata: { - md5: "d10b4c3ff123b26dc068d43a8bef2d23" + md5: 'd10b4c3ff123b26dc068d43a8bef2d23' } } ) @@ -114,12 +114,12 @@ region: 'region', files: { 'template1' => { - :path => 'spec/fixtures/templates/myapp_vpc.json', - :body => 'file content' + path: 'spec/fixtures/templates/myapp_vpc.json', + body: 'file content' }, 'template2' => { - :path => 'spec/fixtures/templates/myapp_vpc.json', - :body => 'file content' + path: 'spec/fixtures/templates/myapp_vpc.json', + body: 'file content' } } } @@ -132,7 +132,7 @@ key: 'template1', body: 'file content', metadata: { - md5: "d10b4c3ff123b26dc068d43a8bef2d23" + md5: 'd10b4c3ff123b26dc068d43a8bef2d23' } } ) @@ -142,7 +142,7 @@ key: 'template2', body: 'file content', metadata: { - md5: "d10b4c3ff123b26dc068d43a8bef2d23" + md5: 'd10b4c3ff123b26dc068d43a8bef2d23' } } ) diff --git a/spec/stack_master/change_set_spec.rb b/spec/stack_master/change_set_spec.rb index ec918b78..ce6fdeab 100644 --- a/spec/stack_master/change_set_spec.rb +++ b/spec/stack_master/change_set_spec.rb @@ -71,7 +71,7 @@ describe '#display' do context 'a successful response' do let(:target) { OpenStruct.new(name: 'GroupDescription', attribute: 'Properties', requires_recreation: 'Always') } - let(:changes) { + let(:changes) do [ OpenStruct.new( resource_change: OpenStruct.new( @@ -90,8 +90,8 @@ ) ) ] - } - let(:cf_response) { + end + let(:cf_response) do double( next_token: nil, changes: changes, @@ -100,7 +100,7 @@ status: 'FAILED', status_reason: 'No changes' ) - } + end let(:io) { StringIO.new } subject(:change_set) { StackMaster::ChangeSet.new(cf_response) } let(:message) { io.string } diff --git a/spec/stack_master/cloudformation_interpolating_eruby_spec.rb b/spec/stack_master/cloudformation_interpolating_eruby_spec.rb index e911dd2c..60ff60de 100644 --- a/spec/stack_master/cloudformation_interpolating_eruby_spec.rb +++ b/spec/stack_master/cloudformation_interpolating_eruby_spec.rb @@ -16,7 +16,7 @@ "#!/bin/bash\n", "\n", "REGION=ap-southeast-2\n", - "echo $REGION\n", + "echo $REGION\n" ] ) end @@ -35,7 +35,7 @@ { 'Ref' => 'Param1' }, ' ', { 'Ref' => 'Param2' }, - "\n", + "\n" ] ) end @@ -59,7 +59,7 @@ "#!/bin/bash\n", "\n", "REGION=ap-southeast-2\n", - "echo $REGION\n", + "echo $REGION\n" ] ) end diff --git a/spec/stack_master/command_spec.rb b/spec/stack_master/command_spec.rb index 73eac0bb..d9ca21f4 100644 --- a/spec/stack_master/command_spec.rb +++ b/spec/stack_master/command_spec.rb @@ -1,5 +1,5 @@ RSpec.describe StackMaster::Command do - let(:command_class) { + let(:command_class) do Class.new do include StackMaster::Command @@ -17,7 +17,7 @@ def perform false end end - } + end context 'when failed is not called' do it 'is successful' do @@ -63,8 +63,8 @@ def perform let(:error_proc) do proc do begin - raise RuntimeError, 'the cause message' - rescue + raise 'the cause message' + rescue StandardError raise StackMaster::TemplateCompiler::TemplateCompilationFailed, 'the message' end end @@ -79,7 +79,7 @@ def perform before { command.instance_variable_set(:@options, spy(trace: true)) } it 'outputs the backtrace' do - expect { command.perform }.to output(%r{spec/stack_master/command_spec.rb:[\d]*:in }).to_stderr + expect { command.perform }.to output(%r{spec/stack_master/command_spec.rb:\d*:in }).to_stderr end end @@ -87,7 +87,7 @@ def perform before { command.instance_variable_set(:@options, spy(trace: nil)) } it 'does not output the backtrace' do - expect { command.perform }.not_to output(%r{spec/stack_master/command_spec.rb:[\d]*:in }).to_stderr + expect { command.perform }.not_to output(%r{spec/stack_master/command_spec.rb:\d*:in }).to_stderr end it 'informs to set --trace option to see the backtrace' do diff --git a/spec/stack_master/commands/apply_spec.rb b/spec/stack_master/commands/apply_spec.rb index ef50fab0..9df35da9 100644 --- a/spec/stack_master/commands/apply_spec.rb +++ b/spec/stack_master/commands/apply_spec.rb @@ -61,7 +61,7 @@ def apply tags: [ { key: 'environment', value: 'production' } ], - capabilities: ['CAPABILITY_IAM', 'CAPABILITY_NAMED_IAM', 'CAPABILITY_AUTO_EXPAND'], + capabilities: %w[CAPABILITY_IAM CAPABILITY_NAMED_IAM CAPABILITY_AUTO_EXPAND], role_arn: role_arn, notification_arns: [notification_arn] ) @@ -99,7 +99,7 @@ def apply stack_definition.s3 = { 'bucket' => 'my-bucket', 'prefix' => 'my-prefix', - 'region' => 'us-east-1', + 'region' => 'us-east-1' } stack_definition.template = 'my-template.rb' allow(s3).to receive(:list_objects).and_return([]) @@ -161,7 +161,7 @@ def apply allow(differ).to receive(:single_param_update?).with(yes_param).and_return(true) end - it "skips asking for confirmation on single param updates" do + it 'skips asking for confirmation on single param updates' do expect(StackMaster::ChangeSet).to receive(:execute).with(change_set.id, stack_name) StackMaster::Commands::Apply.perform(config, stack_definition, options) end @@ -182,7 +182,7 @@ def apply tags: [ { key: 'environment', value: 'production' } ], - capabilities: ['CAPABILITY_IAM', 'CAPABILITY_NAMED_IAM', 'CAPABILITY_AUTO_EXPAND'], + capabilities: %w[CAPABILITY_IAM CAPABILITY_NAMED_IAM CAPABILITY_AUTO_EXPAND], role_arn: role_arn, notification_arns: [notification_arn], change_set_type: 'CREATE' @@ -200,7 +200,7 @@ def apply template_body: proposed_stack.template_body, parameters: [{ parameter_key: 'param_1', parameter_value: 'hello' }], tags: [{ key: 'environment', value: 'production' }], - capabilities: ['CAPABILITY_IAM', 'CAPABILITY_NAMED_IAM', 'CAPABILITY_AUTO_EXPAND'], + capabilities: %w[CAPABILITY_IAM CAPABILITY_NAMED_IAM CAPABILITY_AUTO_EXPAND], role_arn: role_arn, notification_arns: [notification_arn], on_failure: 'ROLLBACK' @@ -217,7 +217,7 @@ def apply end context 'the stack is too large' do - let(:big_string) { 'x' * 60000 } + let(:big_string) { 'x' * 60_000 } let(:template_body) do "{\"a\":\"#{big_string}\"}" end @@ -261,7 +261,7 @@ def apply allow(StackMaster::ChangeSet).to receive(:create).and_raise(StackMaster::CtrlC) end - it "deletes the stack" do + it 'deletes the stack' do expect(cf).to receive(:delete_stack).with({ stack_name: stack_name }) expect { apply }.to raise_error(StackMaster::CtrlC) end diff --git a/spec/stack_master/commands/compile_spec.rb b/spec/stack_master/commands/compile_spec.rb index 425ba2aa..5e39200e 100644 --- a/spec/stack_master/commands/compile_spec.rb +++ b/spec/stack_master/commands/compile_spec.rb @@ -4,13 +4,13 @@ let(:stack_definition) { StackMaster::StackDefinition.new(base_dir: '/base_dir', region: region, stack_name: stack_name) } let(:config) { double(find_stack: stack_definition) } let(:parameters) { {} } - let(:proposed_stack) { + let(:proposed_stack) do StackMaster::Stack.new( template_body: template_body, template_format: template_format, parameters: parameters ) - } + end let(:template_body) { '{}' } let(:template_format) { :json } @@ -23,13 +23,13 @@ def run described_class.perform(config, stack_definition) end - context "with a json stack" do + context 'with a json stack' do it 'outputs the template' do expect { run }.to output(template_body + "\n").to_stdout end end - context "with a yaml stack" do + context 'with a yaml stack' do let(:template_body) { '---' } let(:template_format) { :yaml } diff --git a/spec/stack_master/commands/delete_spec.rb b/spec/stack_master/commands/delete_spec.rb index a2868f5f..5376e307 100644 --- a/spec/stack_master/commands/delete_spec.rb +++ b/spec/stack_master/commands/delete_spec.rb @@ -12,8 +12,8 @@ allow(StackMaster::StackEvents::Streamer).to receive(:stream) end - describe "#perform" do - context "The stack exists" do + describe '#perform' do + context 'The stack exists' do before do allow(cf) .to receive(:describe_stacks) @@ -21,7 +21,7 @@ { stacks: [ { - stack_id: "ABC", + stack_id: 'ABC', stack_name: stack_name, creation_time: Time.now, stack_status: 'UPDATE_COMPLETE', @@ -31,18 +31,18 @@ } ) end - it "deletes the stack and tails the events" do + it 'deletes the stack and tails the events' do delete.perform - expect(cf).to have_received(:delete_stack).with({ :stack_name => region }) + expect(cf).to have_received(:delete_stack).with({ stack_name: region }) expect(StackMaster::StackEvents::Streamer).to have_received(:stream) end end - context "The stack does not exist" do + context 'The stack does not exist' do before do - allow(cf).to receive(:describe_stacks).and_raise(Aws::CloudFormation::Errors::ValidationError.new("x", "y")) + allow(cf).to receive(:describe_stacks).and_raise(Aws::CloudFormation::Errors::ValidationError.new('x', 'y')) end - it "is not successful" do + it 'is not successful' do delete.perform expect(StackMaster::StackEvents::Streamer).not_to have_received(:stream) expect(cf).not_to have_received(:delete_stack) diff --git a/spec/stack_master/commands/drift_spec.rb b/spec/stack_master/commands/drift_spec.rb index 724fbb55..a6e25b2a 100644 --- a/spec/stack_master/commands/drift_spec.rb +++ b/spec/stack_master/commands/drift_spec.rb @@ -6,41 +6,41 @@ subject(:drift) { described_class.new(config, stack_definition, options) } let(:stack_drift_detection_id) { 123 } - let(:detect_stack_drift_response) { + let(:detect_stack_drift_response) do Aws::CloudFormation::Types::DetectStackDriftOutput.new( stack_drift_detection_id: stack_drift_detection_id ) - } - let(:stack_drift_status) { "IN_SYNC" } - let(:describe_stack_drift_detection_status_response) { + end + let(:stack_drift_status) { 'IN_SYNC' } + let(:describe_stack_drift_detection_status_response) do Aws::CloudFormation::Types::DescribeStackDriftDetectionStatusOutput.new( stack_drift_detection_id: stack_drift_detection_id, stack_drift_status: stack_drift_status, - detection_status: "DETECTION_COMPLETE" + detection_status: 'DETECTION_COMPLETE' ) - } - let(:describe_stack_resource_drifts_response) { + end + let(:describe_stack_resource_drifts_response) do Aws::CloudFormation::Types::DescribeStackResourceDriftsOutput.new( stack_resource_drifts: stack_resource_drifts ) - } - let(:property_difference) { + end + let(:property_difference) do Aws::CloudFormation::Types::PropertyDifference.new( difference_type: 'ADD', property_path: '/SecurityGroupIngress/2' ) - } - let(:stack_resource_drifts) { + end + let(:stack_resource_drifts) do [ Aws::CloudFormation::Types::StackResourceDrift.new( - stack_resource_drift_status: "IN_SYNC", - resource_type: "AWS::EC2::SecurityGroup", - logical_resource_id: "SecurityGroup", - physical_resource_id: "sg-123456", + stack_resource_drift_status: 'IN_SYNC', + resource_type: 'AWS::EC2::SecurityGroup', + logical_resource_id: 'SecurityGroup', + physical_resource_id: 'sg-123456', property_differences: [property_difference] ) ] - } + end before do options.timeout = 10 @@ -74,33 +74,33 @@ let(:stack_drift_status) { 'DRIFTED' } let(:expected_properties) { '{"CidrIp":"1.2.3.4/0","FromPort":80,"IpProtocol":"tcp","ToPort":80}' } let(:actual_properties) { '{"CidrIp":"5.6.7.8/0","FromPort":80,"IpProtocol":"tcp","ToPort":80}' } - let(:stack_resource_drifts) { + let(:stack_resource_drifts) do [ Aws::CloudFormation::Types::StackResourceDrift.new( - stack_resource_drift_status: "DELETED", - resource_type: "AWS::EC2::SecurityGroup", - logical_resource_id: "SecurityGroup1", - physical_resource_id: "sg-123456", + stack_resource_drift_status: 'DELETED', + resource_type: 'AWS::EC2::SecurityGroup', + logical_resource_id: 'SecurityGroup1', + physical_resource_id: 'sg-123456', property_differences: [property_difference] ), Aws::CloudFormation::Types::StackResourceDrift.new( - stack_resource_drift_status: "MODIFIED", - resource_type: "AWS::EC2::SecurityGroup", - logical_resource_id: "SecurityGroup2", - physical_resource_id: "sg-789012", + stack_resource_drift_status: 'MODIFIED', + resource_type: 'AWS::EC2::SecurityGroup', + logical_resource_id: 'SecurityGroup2', + physical_resource_id: 'sg-789012', expected_properties: expected_properties, actual_properties: actual_properties, property_differences: [property_difference] ), Aws::CloudFormation::Types::StackResourceDrift.new( - stack_resource_drift_status: "IN_SYNC", - resource_type: "AWS::EC2::SecurityGroup", - logical_resource_id: "SecurityGroup3", - physical_resource_id: "sg-345678", + stack_resource_drift_status: 'IN_SYNC', + resource_type: 'AWS::EC2::SecurityGroup', + logical_resource_id: 'SecurityGroup3', + physical_resource_id: 'sg-345678', property_differences: [property_difference] ) ] - } + end it 'outputs drift status' do expect { drift.perform }.to output(/Drift Status: DRIFTED/).to_stdout diff --git a/spec/stack_master/commands/init_spec.rb b/spec/stack_master/commands/init_spec.rb index 6b034527..e0e883d8 100644 --- a/spec/stack_master/commands/init_spec.rb +++ b/spec/stack_master/commands/init_spec.rb @@ -1,14 +1,14 @@ RSpec.describe StackMaster::Commands::Init do subject(:init_command) { described_class.new(options, region, stack_name) } - let(:region) { "us-east-1" } - let(:stack_name) { "test-stack" } + let(:region) { 'us-east-1' } + let(:stack_name) { 'test-stack' } let(:options) { double(overwrite: false) } - describe "#perform" do - it "creates all the expected files" do + describe '#perform' do + it 'creates all the expected files' do expect(IO) .to receive(:write) - .with("stack_master.yml", <<~YAML) + .with('stack_master.yml', <<~YAML) stacks: us-east-1: test-stack: @@ -19,7 +19,7 @@ expect(IO) .to receive(:write) - .with("parameters/test-stack.yml", <<~YAML) + .with('parameters/test-stack.yml', <<~YAML) # Add parameters here: # param1: value1 # param2: value2 @@ -27,7 +27,7 @@ expect(IO) .to receive(:write) - .with("parameters/us-east-1/test-stack.yml", <<~YAML) + .with('parameters/us-east-1/test-stack.yml', <<~YAML) # Add parameters here: # param1: value1 # param2: value2 @@ -35,7 +35,7 @@ expect(IO) .to receive(:write) - .with("templates/test-stack.json", <<~JSON) + .with('templates/test-stack.json', <<~JSON) { "AWSTemplateFormatVersion" : "2010-09-09", "Description" : "Cloudformation stack for test-stack", @@ -58,7 +58,7 @@ } JSON - init_command.perform() + init_command.perform end end end diff --git a/spec/stack_master/commands/lint_spec.rb b/spec/stack_master/commands/lint_spec.rb index 399f7f0a..900ad912 100644 --- a/spec/stack_master/commands/lint_spec.rb +++ b/spec/stack_master/commands/lint_spec.rb @@ -4,13 +4,13 @@ let(:stack_definition) { StackMaster::StackDefinition.new(base_dir: '/base_dir', region: region, stack_name: stack_name) } let(:config) { double(find_stack: stack_definition) } let(:parameters) { {} } - let(:proposed_stack) { + let(:proposed_stack) do StackMaster::Stack.new( template_body: template_body, template_format: template_format, parameters: parameters ) - } + end let(:tempfile) { double(:tempfile) } let(:path) { double(:path) } @@ -22,12 +22,12 @@ def run described_class.perform(config, stack_definition) end - context "when cfn-lint is installed" do + context 'when cfn-lint is installed' do before do expect_any_instance_of(described_class).to receive(:system).once.with('cfn-lint', '--version').and_return(0) end - context "with a json stack" do + context 'with a json stack' do let(:template_body) { '{}' } let(:template_format) { :json } @@ -37,7 +37,7 @@ def run end end - context "with a yaml stack" do + context 'with a yaml stack' do let(:template_body) { '---' } let(:template_format) { :yaml } @@ -48,7 +48,7 @@ def run end end - context "when cfn-lint is missing" do + context 'when cfn-lint is missing' do let(:template_body) { '' } let(:template_format) { :json } diff --git a/spec/stack_master/commands/nag_spec.rb b/spec/stack_master/commands/nag_spec.rb index a7854bc5..55408340 100644 --- a/spec/stack_master/commands/nag_spec.rb +++ b/spec/stack_master/commands/nag_spec.rb @@ -4,13 +4,13 @@ let(:stack_definition) { StackMaster::StackDefinition.new(base_dir: '/base_dir', region: region, stack_name: stack_name) } let(:config) { instance_double(StackMaster::Config, find_stack: stack_definition) } let(:parameters) { {} } - let(:proposed_stack) { + let(:proposed_stack) do StackMaster::Stack.new( template_body: template_body, template_format: template_format, parameters: parameters ) - } + end let(:tempfile) { double(Tempfile) } let(:path) { double(String) } let(:template_body) { '{}' } @@ -26,7 +26,7 @@ def run described_class.perform(config, stack_definition) end - context "with a json stack" do + context 'with a json stack' do it 'calls the nag gem' do expect_any_instance_of(File).to receive(:write).once expect_any_instance_of(File).to receive(:flush).once @@ -35,7 +35,7 @@ def run end end - context "with a yaml stack" do + context 'with a yaml stack' do let(:template_body) { '---' } let(:template_format) { :yaml } @@ -47,7 +47,7 @@ def run end end - context "when check is successful" do + context 'when check is successful' do it 'exits with a zero exit status' do expect_any_instance_of(described_class).to receive(:system).once.with('cfn_nag', /.*\.json/) result = run @@ -55,7 +55,7 @@ def run end end - context "when check fails" do + context 'when check fails' do let(:exitstatus) { 1 } it 'exits with non-zero exit status' do expect_any_instance_of(described_class).to receive(:system).once.with('cfn_nag', /.*\.json/) diff --git a/spec/stack_master/commands/status_spec.rb b/spec/stack_master/commands/status_spec.rb index 3268ba43..bee3d8c8 100644 --- a/spec/stack_master/commands/status_spec.rb +++ b/spec/stack_master/commands/status_spec.rb @@ -23,13 +23,13 @@ allow(Aws::CloudFormation::Client).to receive(:new).with(region: 'us-east-1').and_return cf end - context "#perform" do + context '#perform' do before do allow(StackMaster::Stack).to receive(:find).and_return stack1, stack2 allow(StackMaster::Stack).to receive(:generate).and_return proposed_stack1, proposed_stack2 end - context "some parameters are different" do + context 'some parameters are different' do let(:stack1) do double( :stack1, @@ -53,14 +53,14 @@ end let(:proposed_stack1) do - double(:proposed_stack1, template_body: "{}", template_format: :json, parameters_with_defaults: { a: 1 }) + double(:proposed_stack1, template_body: '{}', template_format: :json, parameters_with_defaults: { a: 1 }) end let(:proposed_stack2) do - double(:proposed_stack2, template_body: "{}", template_format: :json, parameters_with_defaults: { a: 1 }) + double(:proposed_stack2, template_body: '{}', template_format: :json, parameters_with_defaults: { a: 1 }) end - it "returns the status of call stacks" do + it 'returns the status of call stacks' do out = <<~OUTPUT REGION | STACK_NAME | STACK_STATUS | DIFFERENT ----------|------------|-----------------|---------- @@ -72,7 +72,7 @@ end end - context "some templates are different" do + context 'some templates are different' do let(:stack1) do double( :stack1, @@ -96,14 +96,14 @@ end let(:proposed_stack1) do - double(:proposed_stack1, template_body: "{}", template_format: :json, parameters_with_defaults: { a: 1 }) + double(:proposed_stack1, template_body: '{}', template_format: :json, parameters_with_defaults: { a: 1 }) end let(:proposed_stack2) do - double(:proposed_stack2, template_body: "{}", template_format: :json, parameters_with_defaults: { a: 1 }) + double(:proposed_stack2, template_body: '{}', template_format: :json, parameters_with_defaults: { a: 1 }) end - it "returns the status of call stacks" do + it 'returns the status of call stacks' do out = <<~OUTPUT REGION | STACK_NAME | STACK_STATUS | DIFFERENT ----------|------------|-----------------|---------- @@ -145,11 +145,11 @@ end let(:proposed_stack1) do - double(:proposed_stack1, template_body: "{}", template_format: :json, parameters_with_defaults: { a: 1 }) + double(:proposed_stack1, template_body: '{}', template_format: :json, parameters_with_defaults: { a: 1 }) end let(:proposed_stack2) do - double(:proposed_stack2, template_body: "{}", template_format: :json, parameters_with_defaults: { a: 1 }) + double(:proposed_stack2, template_body: '{}', template_format: :json, parameters_with_defaults: { a: 1 }) end before do @@ -184,7 +184,7 @@ StackMaster.reset_flags end - it "returns the status of call stacks" do + it 'returns the status of call stacks' do out = <<~OUTPUT REGION | STACK_NAME | STACK_STATUS | DIFFERENT ----------|------------|-----------------|---------- diff --git a/spec/stack_master/commands/validate_spec.rb b/spec/stack_master/commands/validate_spec.rb index 697af6fb..dc763f82 100644 --- a/spec/stack_master/commands/validate_spec.rb +++ b/spec/stack_master/commands/validate_spec.rb @@ -1,8 +1,8 @@ RSpec.describe StackMaster::Commands::Validate do subject(:validate) { described_class.new(config, stack_definition, options) } let(:config) { instance_double(StackMaster::Config) } - let(:region) { "us-east-1" } - let(:stack_name) { "mystack" } + let(:region) { 'us-east-1' } + let(:stack_name) { 'mystack' } let(:options) { Commander::Command::Options.new } let(:stack_definition) do StackMaster::StackDefinition.new( @@ -14,9 +14,9 @@ ) end - describe "#perform" do - context "can find stack" do - it "calls the validator to validate the stack definition" do + describe '#perform' do + context 'can find stack' do + it 'calls the validator to validate the stack definition' do expect(StackMaster::Validator).to receive(:valid?).with(stack_definition, config, options) validate.perform end diff --git a/spec/stack_master/config_spec.rb b/spec/stack_master/config_spec.rb index 6a866847..548fbf07 100644 --- a/spec/stack_master/config_spec.rb +++ b/spec/stack_master/config_spec.rb @@ -1,30 +1,30 @@ RSpec.describe StackMaster::Config do subject(:loaded_config) { StackMaster::Config.load!('spec/fixtures/stack_master.yml') } let(:base_dir) { File.expand_path('spec/fixtures') } - let(:myapp_vpc_definition) { + let(:myapp_vpc_definition) do StackMaster::StackDefinition.new( region: 'us-east-1', region_alias: 'production', stack_name: 'myapp-vpc', template: 'myapp_vpc.json', - allowed_accounts: ["555555555"], + allowed_accounts: ['555555555'], tags: { 'application' => 'my-awesome-blog', 'environment' => 'production' }, s3: { 'bucket' => 'my-bucket', 'region' => 'us-east-1' }, - notification_arns: ['test_arn', 'test_arn_2'], + notification_arns: %w[test_arn test_arn_2], role_arn: 'test_service_role_arn2', base_dir: base_dir, stack_policy_file: 'my_policy.json', additional_parameter_lookup_dirs: ['production'] ) - } + end let(:bad_yaml) { "a: b\n- c" } - describe ".load!" do - it "fails to load the config if no stack_master.yml in parent directories" do + describe '.load!' do + it 'fails to load the config if no stack_master.yml in parent directories' do expect { StackMaster::Config.load!('stack_master.yml') }.to raise_error Errno::ENOENT end - it "raises exception on invalid yaml" do + it 'raises exception on invalid yaml' do begin orig_dir = Dir.pwd Dir.chdir './spec/fixtures/' @@ -35,21 +35,21 @@ end end - it "gives explicit error on badly indented entries" do + it 'gives explicit error on badly indented entries' do Dir.chdir('./spec/fixtures/') do expect { StackMaster::Config.load!('stack_master_wrong_indent.yml') } .to raise_error StackMaster::Config::ConfigParseError end end - it "gives explicit error on empty defaults" do + it 'gives explicit error on empty defaults' do Dir.chdir('./spec/fixtures/') do expect { StackMaster::Config.load!('stack_master_empty_default.yml') } .to raise_error StackMaster::Config::ConfigParseError end end - it "searches up the tree for stack master yaml" do + it 'searches up the tree for stack master yaml' do begin orig_dir = Dir.pwd Dir.chdir './spec/fixtures/templates' @@ -97,7 +97,7 @@ expect(loaded_config.stack_defaults) .to eq( { - 'allowed_accounts' => ["555555555"], + 'allowed_accounts' => ['555555555'], 'tags' => { 'application' => 'my-awesome-blog' }, 's3' => { 'bucket' => 'my-bucket', 'region' => 'us-east-1' } } @@ -112,7 +112,7 @@ json: :json, yml: :yaml, yaml: :yaml, - erb: :yaml_erb, + erb: :yaml_erb } ) end @@ -130,7 +130,7 @@ 'ap-southeast-2' => { 'tags' => { 'environment' => 'staging', 'test_override' => 1 }, 'role_arn' => 'test_service_role_arn3', - 'notification_arns' => ['test_arn_3'], + 'notification_arns' => ['test_arn_3'] } } ) @@ -150,11 +150,11 @@ stack_name: 'myapp-vpc', region: 'ap-southeast-2', region_alias: 'staging', - allowed_accounts: ["555555555"], + allowed_accounts: ['555555555'], tags: { 'application' => 'my-awesome-blog', 'environment' => 'staging', 'test_override' => 1 }, s3: { 'bucket' => 'my-bucket', 'region' => 'us-east-1' }, role_arn: 'test_service_role_arn4', - notification_arns: ['test_arn_3', 'test_arn_4'], + notification_arns: %w[test_arn_3 test_arn_4], template: 'myapp_vpc.rb', base_dir: base_dir, additional_parameter_lookup_dirs: ['staging'] @@ -166,7 +166,7 @@ stack_name: 'myapp-web', region: 'ap-southeast-2', region_alias: 'staging', - allowed_accounts: ["1234567890", "9876543210"], + allowed_accounts: %w[1234567890 9876543210], tags: { 'application' => 'my-awesome-blog', 'environment' => 'staging', 'test_override' => 2 }, s3: { 'bucket' => 'my-bucket', 'region' => 'us-east-1' }, role_arn: 'test_service_role_arn3', diff --git a/spec/stack_master/identity_spec.rb b/spec/stack_master/identity_spec.rb index c1df0fdd..82928fb0 100644 --- a/spec/stack_master/identity_spec.rb +++ b/spec/stack_master/identity_spec.rb @@ -97,7 +97,7 @@ end context 'with a combination of account id and alias' do - let(:allowed_accounts) { %w(192837471659 allowed-account another-account) } + let(:allowed_accounts) { %w[192837471659 allowed-account another-account] } it 'returns true' do expect(running_in_allowed_account).to eq(true) @@ -148,14 +148,14 @@ iam.stub_responses( :list_account_aliases, { - account_aliases: %w(my-account new-account-name), + account_aliases: %w[my-account new-account-name], is_truncated: false } ) end it 'returns the current identity account aliases' do - expect(identity.account_aliases).to eq(%w(my-account new-account-name)) + expect(identity.account_aliases).to eq(%w[my-account new-account-name]) end context "when identity doesn't have the required iam permissions" do diff --git a/spec/stack_master/paged_response_accumulator_spec.rb b/spec/stack_master/paged_response_accumulator_spec.rb index 7d65aeb9..606e278a 100644 --- a/spec/stack_master/paged_response_accumulator_spec.rb +++ b/spec/stack_master/paged_response_accumulator_spec.rb @@ -3,12 +3,12 @@ subject(:accumulator) { described_class.new(cf, :describe_stack_events, { stack_name: 'blah' }, :stack_events) } context 'with one page' do - let(:page_one_events) { + let(:page_one_events) do [ { event_id: '1', stack_id: '1', stack_name: 'blah', timestamp: Time.now }, { event_id: '2', stack_id: '1', stack_name: 'blah', timestamp: Time.now } ] - } + end before do cf.stub_responses(:describe_stack_events, { stack_events: page_one_events, next_token: nil }) @@ -21,17 +21,17 @@ end context 'with two pages' do - let(:page_one_events) { + let(:page_one_events) do [ { event_id: '1', stack_id: '1', stack_name: 'blah', timestamp: Time.now }, { event_id: '2', stack_id: '1', stack_name: 'blah', timestamp: Time.now } ] - } - let(:page_two_events) { + end + let(:page_two_events) do [ { event_id: '3', stack_id: '1', stack_name: 'blah', timestamp: Time.now } ] - } + end before do cf.stub_responses( diff --git a/spec/stack_master/parameter_loader_spec.rb b/spec/stack_master/parameter_loader_spec.rb index aa6bfd9d..719a71b3 100644 --- a/spec/stack_master/parameter_loader_spec.rb +++ b/spec/stack_master/parameter_loader_spec.rb @@ -57,9 +57,9 @@ context 'yml and yaml region parameter files' do let(:stack_file_returns) { { exists: false } } - let(:region_file_returns) { { exists: true, read: "Param2: value2" } } + let(:region_file_returns) { { exists: true, read: 'Param2: value2' } } let(:region_yaml_file_returns) { { exists: true, read: "Param1: value1\nParam2: valueX" } } - let(:region_yaml_file_name) { "/base_dir/parameters/us-east-1/stack_name.yaml" } + let(:region_yaml_file_name) { '/base_dir/parameters/us-east-1/stack_name.yaml' } subject(:parameters) { StackMaster::ParameterLoader.load(parameter_files: [stack_file_name, region_yaml_file_name, region_file_name]) } diff --git a/spec/stack_master/parameter_resolver_spec.rb b/spec/stack_master/parameter_resolver_spec.rb index 363b6f13..fa9cc3e4 100644 --- a/spec/stack_master/parameter_resolver_spec.rb +++ b/spec/stack_master/parameter_resolver_spec.rb @@ -7,26 +7,24 @@ end let(:config) { double } let(:region) { 'us-east-1' } - let(:my_resolver) { + let(:my_resolver) do Class.new do - def initialize(config, region) - end + def initialize(config, region); end def resolve(value) value.to_i * 5 end end - } - let(:bad_resolver) { + end + let(:bad_resolver) do Class.new do - def initialize(config, region) - end + def initialize(config, region); end def resolve(value) raise Aws::CloudFormation::Errors::ValidationError.new(nil, "Can't find stack") end end - } + end before do stub_const('StackMaster::ParameterResolvers::MyResolver', my_resolver) @@ -55,15 +53,15 @@ def resolve(params) end it 'it throws an error when the hash contains more than one key' do - expect { + expect do resolve(param: { nested1: 'value1', nested2: 'value2' }) - }.to raise_error(StackMaster::ParameterResolver::InvalidParameter) + end.to raise_error(StackMaster::ParameterResolver::InvalidParameter) end it "doesn't throw an error when given an array" do - expect { + expect do resolve(param: [1, 2]) - }.to_not raise_error + end.to_not raise_error end context 'when array values contain resolver hashes' do @@ -84,17 +82,17 @@ def resolve(params) context 'when the resolver is unknown' do it 'throws an error' do - expect { + expect do resolve(param: { my_unknown_resolver: 2 }) - }.to raise_error StackMaster::ParameterResolver::ResolverNotFound + end.to raise_error StackMaster::ParameterResolver::ResolverNotFound end end context 'when the resolver throws a ValidationError' do it 'throws a invalid parameter error' do - expect { + expect do resolve(param: { bad_resolver: 2 }) - }.to raise_error StackMaster::ParameterResolver::InvalidParameter + end.to raise_error StackMaster::ParameterResolver::InvalidParameter end end @@ -166,25 +164,25 @@ def resolve(params) context "with missing 'account' property" do it 'raises an invalid parameter error' do - expect { + expect do resolve(param: { 'role' => role, 'my_resolver' => 2 }) - }.to raise_error StackMaster::ParameterResolver::InvalidParameter, - match("Both 'account' and 'role' are required to assume role for parameter 'param'") + end.to raise_error StackMaster::ParameterResolver::InvalidParameter, + match("Both 'account' and 'role' are required to assume role for parameter 'param'") end end context "with missing 'role' property" do it 'raises an invalid parameter error' do - expect { + expect do resolve(param: { 'account' => account, 'my_resolver' => 2 }) - }.to raise_error StackMaster::ParameterResolver::InvalidParameter, - match("Both 'account' and 'role' are required to assume role for parameter 'param'") + end.to raise_error StackMaster::ParameterResolver::InvalidParameter, + match("Both 'account' and 'role' are required to assume role for parameter 'param'") end end end context 'resolver class caching' do - it "uses the same instance of the resolver for the duration of the resolve run" do + it 'uses the same instance of the resolver for the duration of the resolve run' do expect(my_resolver).to receive(:new).once.and_call_original expect(resolve(param: { my_resolver: 2 }, param2: { my_resolver: 2 })).to eq(param: 10, param2: 10) end @@ -214,23 +212,23 @@ def resolve(params) parameter_resolver.resolve end - context "using an array resolver" do + context 'using an array resolver' do let(:params) do { param: { other_dummy_resolvers: [1, 2] } } end - it "tries to load the plural and singular forms" do + it 'tries to load the plural and singular forms' do expect(parameter_resolver) .to receive(:require_parameter_resolver) - .with("other_dummy_resolvers") + .with('other_dummy_resolvers') .once .and_call_original .ordered expect(parameter_resolver) .to receive(:require_parameter_resolver) - .with("other_dummy_resolver") + .with('other_dummy_resolver') .once .ordered expect(parameter_resolver) diff --git a/spec/stack_master/parameter_resolvers/ami_finder_spec.rb b/spec/stack_master/parameter_resolvers/ami_finder_spec.rb index b03bdc5b..5e57f116 100644 --- a/spec/stack_master/parameter_resolvers/ami_finder_spec.rb +++ b/spec/stack_master/parameter_resolvers/ami_finder_spec.rb @@ -40,7 +40,7 @@ end describe '#find_latest_ami' do - let(:filter) { [{ name: "String", values: ["String"] }] } + let(:filter) { [{ name: 'String', values: ['String'] }] } context 'when matches are found' do before do diff --git a/spec/stack_master/parameter_resolvers/ejson_spec.rb b/spec/stack_master/parameter_resolvers/ejson_spec.rb index 855400b7..7c1447ef 100644 --- a/spec/stack_master/parameter_resolvers/ejson_spec.rb +++ b/spec/stack_master/parameter_resolvers/ejson_spec.rb @@ -69,12 +69,12 @@ end end - context "when different credentials are used" do + context 'when different credentials are used' do it 'caches the decrypted file by credentials' do expect(EJSONWrapper).to receive(:decrypt).twice ejson.resolve('secret_a') ejson.resolve('secret_b') - Aws.config[:credentials] = "my-credentials" + Aws.config[:credentials] = 'my-credentials' ejson.resolve('secret_a') ejson.resolve('secret_b') Aws.config.delete(:credentials) diff --git a/spec/stack_master/parameter_resolvers/latest_ami_spec.rb b/spec/stack_master/parameter_resolvers/latest_ami_spec.rb index 3603ea6c..77b0a929 100644 --- a/spec/stack_master/parameter_resolvers/latest_ami_spec.rb +++ b/spec/stack_master/parameter_resolvers/latest_ami_spec.rb @@ -45,7 +45,7 @@ it 'calls find_latest_ami with the owner and filters' do expect(ami_finder).to receive(:find_latest_ami).with([{ name: 'foo', values: ['bacon'] }], ['123456']) - resolver.resolve({ 'owners' => 123456, 'filters' => { 'foo' => 'bacon' } }) + resolver.resolve({ 'owners' => 123_456, 'filters' => { 'foo' => 'bacon' } }) end end end diff --git a/spec/stack_master/parameter_resolvers/latest_container_spec.rb b/spec/stack_master/parameter_resolvers/latest_container_spec.rb index c2a8dd37..fe20d4dc 100644 --- a/spec/stack_master/parameter_resolvers/latest_container_spec.rb +++ b/spec/stack_master/parameter_resolvers/latest_container_spec.rb @@ -59,7 +59,7 @@ registry_id: '012345678910', image_digest: 'sha256:decafc0ffee', image_pushed_at: Time.utc(2015, 1, 2, 0, 0), - image_tags: ['v1', 'production'] + image_tags: %w[v1 production] }, { registry_id: '012345678910', @@ -99,7 +99,7 @@ image_digest: 'sha256:decafc0ffee', image_pushed_at: Time.utc(2015, 1, 2, 0, 0), image_tags: ['v1'] - }, + } ] } ) @@ -110,10 +110,10 @@ .to receive(:describe_images) .with( { - repository_name: "foo", - registry_id: "012345678910", + repository_name: 'foo', + registry_id: '012345678910', next_token: nil, - filter: { :tag_status => "TAGGED" } + filter: { tag_status: 'TAGGED' } } ) resolver.resolve({ 'repository_name' => 'foo', 'registry_id' => '012345678910' }) @@ -137,7 +137,7 @@ registry_id: '012345678910', image_digest: 'sha256:deadbeef', image_pushed_at: Time.utc(2015, 1, 3, 0, 0), - image_tags: ['latest', 'v2'] + image_tags: %w[latest v2] } ] }, diff --git a/spec/stack_master/parameter_resolvers/one_password_spec.rb b/spec/stack_master/parameter_resolvers/one_password_spec.rb index 40703a9e..3fac18e1 100644 --- a/spec/stack_master/parameter_resolvers/one_password_spec.rb +++ b/spec/stack_master/parameter_resolvers/one_password_spec.rb @@ -4,105 +4,105 @@ let(:stack_definition) { double(stack_name: 'mystack', region: 'us-east-1') } subject(:resolver) { described_class.new(config, stack_definition) } let(:op_env_unset) { ENV['OP_SESSION_something'].clear } - let(:secureNote) { + let(:secureNote) do { - "uuid" => "auuid", - "vaultUuid" => "avaultuuid", - "templateUuid" => "003", - "createdAt" => "2018-01-17 07:28:11 +0000 UTC", - "updatedAt" => "2018-01-17 07:28:11 +0000 UTC", - "changerUuid" => "anotheruuid", - "overview" => { - "ainfo" => "begin message", - "ps" => 0, - "title" => "note title" + 'uuid' => 'auuid', + 'vaultUuid' => 'avaultuuid', + 'templateUuid' => '003', + 'createdAt' => '2018-01-17 07:28:11 +0000 UTC', + 'updatedAt' => '2018-01-17 07:28:11 +0000 UTC', + 'changerUuid' => 'anotheruuid', + 'overview' => { + 'ainfo' => 'begin message', + 'ps' => 0, + 'title' => 'note title' }, - "details" => { - "notesPlain" => "decrypted note", - "sections" => [ + 'details' => { + 'notesPlain' => 'decrypted note', + 'sections' => [ { - "name" => "linked items", - "title" => "Related Items" + 'name' => 'linked items', + 'title' => 'Related Items' } ] } } - } - let(:login_password) { + end + let(:login_password) do { - "uuid" => "auuid", - "vaultUuid" => "avaultuuid", - "templateUuid" => "001", - "createdAt" => "2018-03-24 01:55:07 +0000 UTC", - "updatedAt" => "2018-03-24 01:55:07 +0000 UTC", - "changerUuid" => "anotheruuid", - "overview" => { - "ainfo" => "pi", - "ps" => 84, - "title" => "password title" + 'uuid' => 'auuid', + 'vaultUuid' => 'avaultuuid', + 'templateUuid' => '001', + 'createdAt' => '2018-03-24 01:55:07 +0000 UTC', + 'updatedAt' => '2018-03-24 01:55:07 +0000 UTC', + 'changerUuid' => 'anotheruuid', + 'overview' => { + 'ainfo' => 'pi', + 'ps' => 84, + 'title' => 'password title' }, - "details" => { - "fields" => [ + 'details' => { + 'fields' => [ { - "designation" => "username", - "name" => "username", - "type" => "T", - "value" => "theusername" + 'designation' => 'username', + 'name' => 'username', + 'type' => 'T', + 'value' => 'theusername' }, { - "designation" => "password", - "name" => "password", - "type" => "P", - "value" => "thepassword" + 'designation' => 'password', + 'name' => 'password', + 'type' => 'P', + 'value' => 'thepassword' } ], - "sections" => [ + 'sections' => [ { - "name" => "linked items", - "title" => "Related Items" + 'name' => 'linked items', + 'title' => 'Related Items' } ] } } - } - let(:password) { + end + let(:password) do { - "uuid" => "auuid", - "vaultUuid" => "avaultuuid", - "templateUuid" => "005", - "createdAt" => "2018-04-24 11:07:34 +0000 UTC", - "updatedAt" => "2018-04-24 11:07:34 +0000 UTC", - "changerUuid" => "antheruuid", - "overview" => { - "ainfo" => "24 Apr 2018, 9:07:34 pm", - "ps" => 100, - "title" => "password title" + 'uuid' => 'auuid', + 'vaultUuid' => 'avaultuuid', + 'templateUuid' => '005', + 'createdAt' => '2018-04-24 11:07:34 +0000 UTC', + 'updatedAt' => '2018-04-24 11:07:34 +0000 UTC', + 'changerUuid' => 'antheruuid', + 'overview' => { + 'ainfo' => '24 Apr 2018, 9:07:34 pm', + 'ps' => 100, + 'title' => 'password title' }, - "details" => { - "password" => "thepassword", - "sections" => [ + 'details' => { + 'password' => 'thepassword', + 'sections' => [ { - "name" => "linked items", - "title" => "Related Items" + 'name' => 'linked items', + 'title' => 'Related Items' } ] } } - } - let(:the_password) { + end + let(:the_password) do { 'title' => 'password title', 'type' => 'password', 'vault' => 'Shared' } - } - let(:the_secureNote) { + end + let(:the_secureNote) do { 'title' => 'note title', 'type' => 'secureNote', 'vault' => 'Shared' } - } + end context 'when we have set OP_SESSION_ environment' do before do @@ -113,7 +113,7 @@ it 'returns the login password' do allow_any_instance_of(described_class) .to receive(:`) - .with("op --version") + .with('op --version') .and_return(true) allow_any_instance_of(described_class) .to receive(:`) @@ -128,7 +128,7 @@ it 'returns the password' do allow_any_instance_of(described_class) .to receive(:`) - .with("op --version") + .with('op --version') .and_return(true) allow_any_instance_of(described_class) .to receive(:`) @@ -143,7 +143,7 @@ it 'returns the secureNote' do allow_any_instance_of(described_class) .to receive(:`) - .with("op --version") + .with('op --version') .and_return(true) allow_any_instance_of(described_class) .to receive(:`) @@ -164,7 +164,7 @@ .and_return([]) allow_any_instance_of(described_class) .to receive(:`) - .with("op --version") + .with('op --version') .and_return(true) allow_any_instance_of(described_class) .to receive(:`) @@ -174,7 +174,7 @@ expect { resolver.resolve(the_password) } .to raise_error( StackMaster::ParameterResolvers::OnePassword::OnePasswordNotAbleToAuthenticate, - "1password requires the `OP_SESSION_` to be set, (remember to sign in?)" + '1password requires the `OP_SESSION_` to be set, (remember to sign in?)' ) end end @@ -186,12 +186,12 @@ end it 'we return an error' do - allow_any_instance_of(described_class).to receive(:`).with("op --version").and_raise(Errno::ENOENT) + allow_any_instance_of(described_class).to receive(:`).with('op --version').and_raise(Errno::ENOENT) expect { resolver.resolve(the_password) } .to raise_error( StackMaster::ParameterResolvers::OnePassword::OnePasswordBinaryNotFound, - "The op cli needs to be installed and in the PATH, No such file or directory" + 'The op cli needs to be installed and in the PATH, No such file or directory' ) end end @@ -204,7 +204,7 @@ it 'we return an error' do allow_any_instance_of(described_class) .to receive(:`) - .with("op --version") + .with('op --version') .and_return(true) allow_any_instance_of(described_class) .to receive(:`) @@ -227,7 +227,7 @@ it 'we return an error' do allow_any_instance_of(described_class) .to receive(:`) - .with("op --version") + .with('op --version') .and_return(true) allow_any_instance_of(described_class) .to receive(:`) diff --git a/spec/stack_master/parameter_resolvers/parameter_store_spec.rb b/spec/stack_master/parameter_resolvers/parameter_store_spec.rb index 98a0b28c..70852c19 100644 --- a/spec/stack_master/parameter_resolvers/parameter_store_spec.rb +++ b/spec/stack_master/parameter_resolvers/parameter_store_spec.rb @@ -16,7 +16,7 @@ parameter: { name: parameter_name, value: parameter_value, - type: "SecureString", + type: 'SecureString', version: 1 } } diff --git a/spec/stack_master/parameter_resolvers/security_group_spec.rb b/spec/stack_master/parameter_resolvers/security_group_spec.rb index 69491e36..f16d17d1 100644 --- a/spec/stack_master/parameter_resolvers/security_group_spec.rb +++ b/spec/stack_master/parameter_resolvers/security_group_spec.rb @@ -1,5 +1,5 @@ RSpec.describe StackMaster::ParameterResolvers::SecurityGroup do - describe "#resolve" do + describe '#resolve' do subject(:resolver) { described_class.new(nil, double(region: 'us-east-1')) } let(:finder) { instance_double(StackMaster::SecurityGroupFinder) } let(:sg_id) { 'sg-id' } @@ -11,7 +11,7 @@ end context 'when given a single SG name' do - it "resolves the security group" do + it 'resolves the security group' do expect(resolver.resolve(sg_name)).to eq sg_id end end diff --git a/spec/stack_master/parameter_resolvers/security_groups_spec.rb b/spec/stack_master/parameter_resolvers/security_groups_spec.rb index 461fe044..6b87dd15 100644 --- a/spec/stack_master/parameter_resolvers/security_groups_spec.rb +++ b/spec/stack_master/parameter_resolvers/security_groups_spec.rb @@ -1,5 +1,5 @@ RSpec.describe StackMaster::ParameterResolvers::SecurityGroups do - describe "#resolve" do + describe '#resolve' do subject(:resolver) { described_class.new(nil, double(region: 'us-east-1')) } let(:finder) { instance_double(StackMaster::SecurityGroupFinder) } let(:sg_id) { 'sg-id' } @@ -11,7 +11,7 @@ end context 'when given a single SG name' do - it "resolves the security group" do + it 'resolves the security group' do expect(resolver.resolve(sg_name)).to eq sg_id end end @@ -24,7 +24,7 @@ expect(finder).to receive(:find).once.with(sg_name2).and_return sg_id2 end - it "resolves the security groups" do + it 'resolves the security groups' do expect(resolver.resolve([sg_name, sg_name2])).to eq "#{sg_id},#{sg_id2}" end end diff --git a/spec/stack_master/parameter_resolvers/sns_topic_name_spec.rb b/spec/stack_master/parameter_resolvers/sns_topic_name_spec.rb index 87aaef28..45b9559e 100644 --- a/spec/stack_master/parameter_resolvers/sns_topic_name_spec.rb +++ b/spec/stack_master/parameter_resolvers/sns_topic_name_spec.rb @@ -13,9 +13,9 @@ def resolve(value) let(:value) { { not_expected: 1 } } it 'raises an error' do - expect { + expect do resolved_value - }.to raise_error(ArgumentError) + end.to raise_error(ArgumentError) end end @@ -34,9 +34,9 @@ def resolve(value) context "the topic doesn't exist" do it 'raises topic not found' do - expect { + expect do resolved_value - }.to raise_error(StackMaster::ParameterResolvers::SnsTopicName::TopicNotFound) + end.to raise_error(StackMaster::ParameterResolvers::SnsTopicName::TopicNotFound) end end end diff --git a/spec/stack_master/parameter_resolvers/sso_group_id_spec.rb b/spec/stack_master/parameter_resolvers/sso_group_id_spec.rb index 85eef6cd..56b20398 100644 --- a/spec/stack_master/parameter_resolvers/sso_group_id_spec.rb +++ b/spec/stack_master/parameter_resolvers/sso_group_id_spec.rb @@ -28,9 +28,9 @@ it 'propagates the SsoGroupNotFound error' do allow(finder).to receive(:find).and_raise(StackMaster::SsoGroupIdFinder::SsoGroupNotFound) - expect { + expect do resolver.resolve(group_reference) - }.to raise_error(StackMaster::SsoGroupIdFinder::SsoGroupNotFound) + end.to raise_error(StackMaster::SsoGroupIdFinder::SsoGroupNotFound) end end @@ -40,9 +40,9 @@ it 'raises ArgumentError from SsoGroupIdFinder' do allow(finder).to receive(:find).and_raise(ArgumentError) - expect { + expect do resolver.resolve(invalid_reference) - }.to raise_error(ArgumentError) + end.to raise_error(ArgumentError) end end end diff --git a/spec/stack_master/parameter_resolvers/stack_output_spec.rb b/spec/stack_master/parameter_resolvers/stack_output_spec.rb index 6f979ea5..761d0b6c 100644 --- a/spec/stack_master/parameter_resolvers/stack_output_spec.rb +++ b/spec/stack_master/parameter_resolvers/stack_output_spec.rb @@ -3,7 +3,7 @@ let(:stack_name) { 'my-stack' } let(:resolver) { described_class.new(config, double(region: 'us-east-1')) } let(:cf) { Aws::CloudFormation::Client.new } - let(:config) { double(:unalias_region => region) } + let(:config) { double(unalias_region: region) } def resolve(value) resolver.resolve(value) @@ -15,9 +15,9 @@ def resolve(value) let(:value) { 'stack-name-without-output' } it 'raises an error' do - expect { + expect do resolved_value - }.to raise_error(ArgumentError) + end.to raise_error(ArgumentError) end end @@ -25,17 +25,17 @@ def resolve(value) let(:value) { { not_expected: 1 } } it 'raises an error' do - expect { + expect do resolved_value - }.to raise_error(ArgumentError) + end.to raise_error(ArgumentError) end end context 'when given a valid string value' do let(:value) { 'my-stack/MyOutput' } - let(:stacks) { + let(:stacks) do [{ stack_name: 'blah', creation_time: Time.now, stack_status: 'CREATE_COMPLETE', outputs: outputs }] - } + end let(:outputs) { [] } before do @@ -61,7 +61,7 @@ def resolve(value) resolver.resolve(value) end - it "caches stacks by region" do + it 'caches stacks by region' do expect(cf).to receive(:describe_stacks).with({ stack_name: 'my-stack' }).and_call_original.twice resolver.resolve(value) resolver.resolve(value) @@ -78,9 +78,9 @@ def resolve(value) end end - context "when different credentials are used" do + context 'when different credentials are used' do let(:outputs_in_account_2) { [{ output_key: 'MyOutput', output_value: 'resolvedvalueinaccount2' }] } - let(:stacks_in_account_2) { + let(:stacks_in_account_2) do [ { stack_name: 'other-stack', @@ -89,7 +89,7 @@ def resolve(value) outputs: outputs_in_account_2 } ] - } + end before do cf.stub_responses( @@ -99,23 +99,23 @@ def resolve(value) ) end - it "caches stacks by credentials" do + it 'caches stacks by credentials' do expect(cf).to receive(:describe_stacks).with({ stack_name: 'my-stack' }).and_call_original.twice resolver.resolve(value) resolver.resolve(value) - Aws.config[:credentials] = "my-credentials" + Aws.config[:credentials] = 'my-credentials' resolver.resolve(value) resolver.resolve(value) Aws.config.delete(:credentials) end - it "caches CF clients by region and credentials" do + it 'caches CF clients by region and credentials' do expect(Aws::CloudFormation::Client).to receive(:new).and_return(cf).exactly(3).times resolver.resolve(value) resolver.resolve(value) resolver.resolve('other-stack/MyOutput') resolver.resolve('other-stack/MyOutput') - Aws.config[:credentials] = "my-credentials" + Aws.config[:credentials] = 'my-credentials' resolver.resolve('other-stack/MyOutput') resolver.resolve('other-stack/MyOutput') resolver.resolve('ap-southeast-2:other-stack/MyOutput') @@ -129,9 +129,9 @@ def resolve(value) let(:stacks) { nil } it 'resolves the value' do - expect { + expect do resolved_value - }.to raise_error(StackMaster::ParameterResolvers::StackOutput::StackNotFound) + end.to raise_error(StackMaster::ParameterResolvers::StackOutput::StackNotFound) end end @@ -139,18 +139,18 @@ def resolve(value) let(:outputs) { [] } it 'resolves the value' do - expect { + expect do resolved_value - }.to raise_error(StackMaster::ParameterResolvers::StackOutput::StackOutputNotFound) + end.to raise_error(StackMaster::ParameterResolvers::StackOutput::StackOutputNotFound) end end end context 'when given a valid string value including region' do let(:value) { 'us-east-1:my-stack/MyOutput' } - let(:stacks) { + let(:stacks) do [{ stack_name: 'my-stack', creation_time: Time.now, stack_status: 'CREATE_COMPLETE', outputs: outputs }] - } + end let(:outputs) { [] } before do @@ -169,7 +169,7 @@ def resolve(value) let(:value_in_region_alias) { 'global:my-stack/MyOutput' } let(:value_in_region_2) { 'ap-southeast-2:my-stack/MyOutput' } let(:outputs_in_region_2) { [{ output_key: 'MyOutput', output_value: 'myresolvedvalue2' }] } - let(:stacks_in_region_2) { + let(:stacks_in_region_2) do [ { stack_name: 'my-stack', @@ -178,7 +178,7 @@ def resolve(value) outputs: outputs_in_region_2 } ] - } + end before do cf.stub_responses( diff --git a/spec/stack_master/parameter_validator_spec.rb b/spec/stack_master/parameter_validator_spec.rb index 19fbedad..81dda3c6 100644 --- a/spec/stack_master/parameter_validator_spec.rb +++ b/spec/stack_master/parameter_validator_spec.rb @@ -41,7 +41,7 @@ context 'when the stack definition is using explicit parameter files' do let(:parameters) { { 'Param1' => true, 'Param2' => nil, 'Param3' => 'string', 'Param4' => nil } } - let(:parameter_files) { ["params.yml"] } + let(:parameter_files) { ['params.yml'] } it 'returns a descriptive message' do expect(error_message).to eq(<<~MESSAGE) diff --git a/spec/stack_master/security_group_finder_spec.rb b/spec/stack_master/security_group_finder_spec.rb index 678dbeba..cf9c2d99 100644 --- a/spec/stack_master/security_group_finder_spec.rb +++ b/spec/stack_master/security_group_finder_spec.rb @@ -1,50 +1,50 @@ RSpec.describe StackMaster::SecurityGroupFinder do subject(:finder) { described_class.new(region) } let(:region) { 'us-east-1' } - let(:group_name) { "our-api-BeanstalkSg-T4RKD99YOY2F" } + let(:group_name) { 'our-api-BeanstalkSg-T4RKD99YOY2F' } let(:filter) do { filters: [ { - name: "group-name", - values: [group_name], - }, - ], + name: 'group-name', + values: [group_name] + } + ] } end - describe "#find" do + describe '#find' do before do allow_any_instance_of(Aws::EC2::Resource).to receive(:security_groups).with(filter).and_return(security_groups) end - context "one sg match" do - let(:security_groups) { + context 'one sg match' do + let(:security_groups) do [ double(id: 'sg-a7d2ccc0') ] - } - it "returns the id" do + end + it 'returns the id' do expect(finder.find(group_name)).to eq 'sg-a7d2ccc0' end end - context "more than one sg matches" do - let(:security_groups) { + context 'more than one sg matches' do + let(:security_groups) do [ double(id: 'sg-a7d2ccc0'), - double(id: 'sg-a7d2ccc2'), + double(id: 'sg-a7d2ccc2') ] - } - it "returns the id" do + end + it 'returns the id' do err = StackMaster::SecurityGroupFinder::MultipleSecurityGroupsFound expect { finder.find(group_name) }.to raise_error(err) end end - context "no matches" do + context 'no matches' do let(:security_groups) { [] } - it "returns the id" do + it 'returns the id' do err = StackMaster::SecurityGroupFinder::SecurityGroupNotFound expect { finder.find(group_name) }.to raise_error(err) end diff --git a/spec/stack_master/sns_topic_finder_spec.rb b/spec/stack_master/sns_topic_finder_spec.rb index c206a5cc..bff34852 100644 --- a/spec/stack_master/sns_topic_finder_spec.rb +++ b/spec/stack_master/sns_topic_finder_spec.rb @@ -4,7 +4,7 @@ let(:topics) do [ double(arn: 'arn:aws:sns:us-east-1:581634149801:topic1name'), - double(arn: 'arn:aws:sns:us-east-1:581634149801:topic2name'), + double(arn: 'arn:aws:sns:us-east-1:581634149801:topic2name') ] end before do diff --git a/spec/stack_master/sparkle_formation/compile_time/definitions_validator_spec.rb b/spec/stack_master/sparkle_formation/compile_time/definitions_validator_spec.rb index 6a6a2b8b..be8f6e33 100644 --- a/spec/stack_master/sparkle_formation/compile_time/definitions_validator_spec.rb +++ b/spec/stack_master/sparkle_formation/compile_time/definitions_validator_spec.rb @@ -5,7 +5,7 @@ subject { described_class.new(definition) } - [:string, :number].each do |type| + %i[string number].each do |type| context "with :#{type} type definition" do let(:type) { type } @@ -22,7 +22,7 @@ expect { subject.validate } .to raise_error( ArgumentError, - "Unknown compile time parameter type: #{key}:#{type} valid types are #{[:string, :number]}" + "Unknown compile time parameter type: #{key}:#{type} valid types are #{%i[string number]}" ) end end diff --git a/spec/stack_master/sparkle_formation/compile_time/value_build_spec.rb b/spec/stack_master/sparkle_formation/compile_time/value_build_spec.rb index ba0e1d03..bf53d54b 100644 --- a/spec/stack_master/sparkle_formation/compile_time/value_build_spec.rb +++ b/spec/stack_master/sparkle_formation/compile_time/value_build_spec.rb @@ -7,8 +7,8 @@ { definition: { type: :string, default: 'a' }, parameter: nil, expected: 'a' }, { definition: { type: :string, multiple: true }, parameter: 'a', expected: ['a'] }, - { definition: { type: :string, multiple: true }, parameter: 'a,b', expected: ['a', 'b'] }, - { definition: { type: :string, multiple: true }, parameter: 'a, b', expected: ['a', 'b'] }, + { definition: { type: :string, multiple: true }, parameter: 'a,b', expected: %w[a b] }, + { definition: { type: :string, multiple: true }, parameter: 'a, b', expected: %w[a b] }, { definition: { type: :string, multiple: true, default: 'a' }, parameter: nil, expected: ['a'] }, diff --git a/spec/stack_master/sparkle_formation/template_file_spec.rb b/spec/stack_master/sparkle_formation/template_file_spec.rb index 4c10f08a..a075c6b3 100644 --- a/spec/stack_master/sparkle_formation/template_file_spec.rb +++ b/spec/stack_master/sparkle_formation/template_file_spec.rb @@ -12,7 +12,7 @@ EOS end let(:expected_hash) do - { "Fn::Base64" => { "Fn::Join" => ["", ["#!/bin/bash\n", "\n", "REGION=", { "Ref" => "AWS::Region" }, "\n", "echo $REGION\n", { "Ref" => "Test" }, " ", { "Ref" => "Test2" }, "\n", "echo 'no'", "\n"]] } } + { 'Fn::Base64' => { 'Fn::Join' => ['', ["#!/bin/bash\n", "\n", 'REGION=', { 'Ref' => 'AWS::Region' }, "\n", "echo $REGION\n", { 'Ref' => 'Test' }, ' ', { 'Ref' => 'Test2' }, "\n", "echo 'no'", "\n"]] } } end before do @@ -48,7 +48,7 @@ EOS end let(:expected_hash) do - { "Fn::Base64" => { "Fn::Join" => ["", ["#!/bin/bash\n", "test_var", "\n", "yes", "\n"]] } } + { 'Fn::Base64' => { 'Fn::Join' => ['', ["#!/bin/bash\n", 'test_var', "\n", 'yes', "\n"]] } } end it 'compiles the file and returns a joined version' do @@ -64,9 +64,9 @@ end it 'raises a specific error' do - expect { + expect do @attr.user_data_file!('test.erb') - }.to raise_error(StackMaster::SparkleFormation::TemplateFileNotFound) + end.to raise_error(StackMaster::SparkleFormation::TemplateFileNotFound) end end @@ -88,7 +88,7 @@ end let(:expected_hash) do - { "Fn::Base64" => { "Fn::Join" => ["", ["#!/bin/bash\n", "outer1", " ", "outer2", "\n", "REGION=", { "Ref" => "AWS::Region" }, "\n", "inner1", "\n", "no", "\n", "\n"]] } } + { 'Fn::Base64' => { 'Fn::Join' => ['', ["#!/bin/bash\n", 'outer1', ' ', 'outer2', "\n", 'REGION=', { 'Ref' => 'AWS::Region' }, "\n", 'inner1', "\n", 'no', "\n", "\n"]] } } end before do @@ -111,7 +111,7 @@ end let(:expected_hash) do - { "Fn::Join" => ["", ["variable=", { "Ref" => "Test" }, "\n"]] } + { 'Fn::Join' => ['', ['variable=', { 'Ref' => 'Test' }, "\n"]] } end before do diff --git a/spec/stack_master/sso_group_id_finder_spec.rb b/spec/stack_master/sso_group_id_finder_spec.rb index 04bbaa78..75553a43 100644 --- a/spec/stack_master/sso_group_id_finder_spec.rb +++ b/spec/stack_master/sso_group_id_finder_spec.rb @@ -45,7 +45,7 @@ it 'raises SsoGroupNotFound' do error = Aws::IdentityStore::Errors::ResourceNotFoundException.new( Seahorse::Client::RequestContext.new, - "Group not found" + 'Group not found' ) expect(aws_client).to receive(:get_group_id).and_raise(error) diff --git a/spec/stack_master/stack_definition_spec.rb b/spec/stack_master/stack_definition_spec.rb index 3e901552..1b693f27 100644 --- a/spec/stack_master/stack_definition_spec.rb +++ b/spec/stack_master/stack_definition_spec.rb @@ -23,7 +23,7 @@ ).and_return( [ "/base_dir/parameters/#{stack_name}.yaml", - "/base_dir/parameters/#{stack_name}.yml", + "/base_dir/parameters/#{stack_name}.yml" ] ) @@ -32,7 +32,7 @@ ).and_return( [ "/base_dir/parameters/#{region}/#{stack_name}.yaml", - "/base_dir/parameters/#{region}/#{stack_name}.yml", + "/base_dir/parameters/#{region}/#{stack_name}.yml" ] ) end @@ -43,7 +43,7 @@ "/base_dir/parameters/#{stack_name}.yaml", "/base_dir/parameters/#{stack_name}.yml", "/base_dir/parameters/#{region}/#{stack_name}.yaml", - "/base_dir/parameters/#{region}/#{stack_name}.yml", + "/base_dir/parameters/#{region}/#{stack_name}.yml" ] ) end @@ -52,7 +52,7 @@ expect(stack_definition.parameter_file_globs).to eq( [ "/base_dir/parameters/#{stack_name}.y*ml", - "/base_dir/parameters/#{region}/#{stack_name}.y*ml", + "/base_dir/parameters/#{region}/#{stack_name}.y*ml" ] ) end @@ -63,8 +63,8 @@ it 'returns globs supporting dashes and underscores in the parameter filenames' do expect(stack_definition.parameter_file_globs).to eq( [ - "/base_dir/parameters/stack[-_]name.y*ml", - "/base_dir/parameters/#{region}/stack[-_]name.y*ml", + '/base_dir/parameters/stack[-_]name.y*ml', + "/base_dir/parameters/#{region}/stack[-_]name.y*ml" ] ) end @@ -74,11 +74,11 @@ before do stack_definition.additional_parameter_lookup_dirs = ['production'] allow(Dir).to receive(:glob).with( - File.join(base_dir, 'parameters', "production", "#{stack_name}.y*ml") + File.join(base_dir, 'parameters', 'production', "#{stack_name}.y*ml") ).and_return( [ "/base_dir/parameters/production/#{stack_name}.yaml", - "/base_dir/parameters/production/#{stack_name}.yml", + "/base_dir/parameters/production/#{stack_name}.yml" ] ) end @@ -91,7 +91,7 @@ "/base_dir/parameters/#{region}/#{stack_name}.yaml", "/base_dir/parameters/#{region}/#{stack_name}.yml", "/base_dir/parameters/production/#{stack_name}.yaml", - "/base_dir/parameters/production/#{stack_name}.yml", + "/base_dir/parameters/production/#{stack_name}.yml" ] ) end @@ -101,7 +101,7 @@ [ "/base_dir/parameters/#{stack_name}.y*ml", "/base_dir/parameters/#{region}/#{stack_name}.y*ml", - "/base_dir/parameters/production/#{stack_name}.y*ml", + "/base_dir/parameters/production/#{stack_name}.y*ml" ] ) end @@ -112,9 +112,9 @@ it 'returns globs supporting dashes and underscores in the parameter filenames' do expect(stack_definition.parameter_file_globs).to eq( [ - "/base_dir/parameters/stack[-_]name.y*ml", + '/base_dir/parameters/stack[-_]name.y*ml', "/base_dir/parameters/#{region}/stack[-_]name.y*ml", - "/base_dir/parameters/production/stack[-_]name.y*ml", + '/base_dir/parameters/production/stack[-_]name.y*ml' ] ) end @@ -125,11 +125,11 @@ expect(stack_definition.ejson_file_kms).to eq true end - context "with explicit parameter_files" do - let(:parameter_files) { ["my-stack.yml", "../my-stack.yml"] } + context 'with explicit parameter_files' do + let(:parameter_files) { ['my-stack.yml', '../my-stack.yml'] } - it "ignores parameter globs and resolves them relative to parameters_dir" do - expect(stack_definition.all_parameter_files).to eq ["/base_dir/parameters/my-stack.yml", "/base_dir/my-stack.yml"] + it 'ignores parameter globs and resolves them relative to parameters_dir' do + expect(stack_definition.all_parameter_files).to eq ['/base_dir/parameters/my-stack.yml', '/base_dir/my-stack.yml'] end end end diff --git a/spec/stack_master/stack_differ_spec.rb b/spec/stack_master/stack_differ_spec.rb index 229458b4..9aeeaf1e 100644 --- a/spec/stack_master/stack_differ_spec.rb +++ b/spec/stack_master/stack_differ_spec.rb @@ -1,10 +1,10 @@ RSpec.describe StackMaster::StackDiffer do subject(:differ) { described_class.new(proposed_stack, stack) } let(:current_body) { '{}' } - let(:proposed_body) { "{\"a\": 1}" } - let(:current_params) { Hash.new } + let(:proposed_body) { '{"a": 1}' } + let(:current_params) { {} } let(:proposed_params) { { 'param1' => 'hello' } } - let(:stack) { + let(:stack) do StackMaster::Stack.new( stack_name: stack_name, region: region, @@ -13,8 +13,8 @@ template_format: :json, parameters: current_params ) - } - let(:proposed_stack) { + end + let(:proposed_stack) do StackMaster::Stack.new( stack_name: stack_name, region: region, @@ -22,43 +22,43 @@ template_body: proposed_body, template_format: :json ) - } + end let(:stack_name) { 'myapp-vpc' } let(:region) { 'us-east-1' } - describe "#proposed_parameters" do - let(:current_params) { + describe '#proposed_parameters' do + let(:current_params) do { 'param1' => 'hello', 'param2' => '****' } - } - it "stars out noecho params" do + end + it 'stars out noecho params' do expect(differ.proposed_parameters).to eq "---\nparam1: hello\nparam2: \"****\"\n" end end - describe "#output_diff" do - context "entirely new stack" do + describe '#output_diff' do + context 'entirely new stack' do let(:stack) { nil } - it "outputs the entire stack" do - expect { differ.output_diff }.to output(/\+ \"a\"\: 1/).to_stdout - expect { differ.output_diff }.to output(/param1\: hello/).to_stdout + it 'outputs the entire stack' do + expect { differ.output_diff }.to output(/\+ "a": 1/).to_stdout + expect { differ.output_diff }.to output(/param1: hello/).to_stdout expect { differ.output_diff }.to output(/No stack found/).to_stdout end end - context "stack update" do - it "outputs the stack diff" do - expect { differ.output_diff }.to output(/\+ \"a\"\: 1/).to_stdout - expect { differ.output_diff }.to output(/param1\: hello/).to_stdout + context 'stack update' do + it 'outputs the stack diff' do + expect { differ.output_diff }.to output(/\+ "a": 1/).to_stdout + expect { differ.output_diff }.to output(/param1: hello/).to_stdout expect { differ.output_diff }.to_not output(/No stack found/).to_stdout end end end - describe "#single_param_update?" do + describe '#single_param_update?' do let(:yes_param) { 'YesParam' } let(:old_value) { 'old' } let(:new_value) { 'new' } @@ -68,36 +68,36 @@ subject(:result) { differ.single_param_update?(yes_param) } - context "when only param changes" do + context 'when only param changes' do it { is_expected.to be_truthy } end - context "when new stack" do + context 'when new stack' do let(:stack) { nil } it { is_expected.to be_falsey } end - context "when no changes" do + context 'when no changes' do let(:current_params) { proposed_params } it { is_expected.to be_falsey } end - context "when body changes" do + context 'when body changes' do let(:current_body) { '{}' } it { is_expected.to be_falsey } end - context "on param removal" do + context 'on param removal' do let(:proposed_params) { {} } it { is_expected.to be_falsey } end - context "on param first addition" do + context 'on param first addition' do let(:current_params) { {} } it { is_expected.to be_falsey } end - context "when another param also changes" do + context 'when another param also changes' do let(:current_params) { { yes_param => old_value, 'other' => 'old' } } let(:proposed_params) { { yes_param => new_value, 'other' => 'new' } } it { is_expected.to be_falsey } diff --git a/spec/stack_master/stack_events/fetcher_spec.rb b/spec/stack_master/stack_events/fetcher_spec.rb index 847e9fd8..42684f80 100644 --- a/spec/stack_master/stack_events/fetcher_spec.rb +++ b/spec/stack_master/stack_events/fetcher_spec.rb @@ -17,12 +17,12 @@ end context 'with 2 stack events' do - let(:events) { + let(:events) do [ OpenStruct.new(event_id: '1', stack_id: '1', stack_name: 'blah', timestamp: Time.now), OpenStruct.new(event_id: '2', stack_id: '1', stack_name: 'blah', timestamp: Time.now) ] - } + end it 'returns stack events' do events = StackMaster::StackEvents::Fetcher.fetch(stack_name, 'us-east-1') @@ -35,12 +35,12 @@ let(:three_pm) { Time.parse('2015-10-27 15:00') } let(:four_pm) { Time.parse('2015-10-27 16:00') } - let(:events) { + let(:events) do [ OpenStruct.new(event_id: '1', stack_id: '1', stack_name: 'blah', timestamp: two_pm), - OpenStruct.new(event_id: '2', stack_id: '1', stack_name: 'blah', timestamp: four_pm), + OpenStruct.new(event_id: '2', stack_id: '1', stack_name: 'blah', timestamp: four_pm) ] - } + end it 'only returns events after the timestamp' do events = StackMaster::StackEvents::Fetcher.fetch(stack_name, 'us-east-1', from: three_pm) diff --git a/spec/stack_master/stack_events/presenter_spec.rb b/spec/stack_master/stack_events/presenter_spec.rb index 23c511bf..f65ad554 100644 --- a/spec/stack_master/stack_events/presenter_spec.rb +++ b/spec/stack_master/stack_events/presenter_spec.rb @@ -1,5 +1,5 @@ RSpec.describe StackMaster::StackEvents::Presenter do - describe "#print_event" do + describe '#print_event' do let(:time) { Time.new(2001, 1, 1, 2, 2, 2) } let(:event) do double( @@ -13,9 +13,9 @@ end subject(:print_event) { described_class.print_event($stdout, event) } - it "nicely presents event data" do + it 'nicely presents event data' do expect { print_event }.to output("\e[33m2001-01-01 02:02:02 #{time.strftime('%z')} " \ - "MyAwesomeQueue AWS::SQS::Queue CREATE_IN_PROGRESS " \ + 'MyAwesomeQueue AWS::SQS::Queue CREATE_IN_PROGRESS ' \ "Resource creation Initiated\e[0m\n").to_stdout end end diff --git a/spec/stack_master/stack_events/streamer_spec.rb b/spec/stack_master/stack_events/streamer_spec.rb index dede48be..637b1129 100644 --- a/spec/stack_master/stack_events/streamer_spec.rb +++ b/spec/stack_master/stack_events/streamer_spec.rb @@ -1,12 +1,12 @@ RSpec.describe StackMaster::StackEvents::Streamer do - let(:events_first_call) { + let(:events_first_call) do [ OpenStruct.new(event_id: '1', resource_status: 'BLAH', timestamp: Time.now), OpenStruct.new(event_id: '2', resource_status: 'BLAH', timestamp: Time.now), - OpenStruct.new(event_id: '3', resource_status: 'BLAH', timestamp: Time.now), + OpenStruct.new(event_id: '3', resource_status: 'BLAH', timestamp: Time.now) ] - } - let(:events_second_call) { + end + let(:events_second_call) do events_first_call + [ OpenStruct.new( event_id: '4', @@ -16,7 +16,7 @@ timestamp: Time.now ) ] - } + end let(:stack_name) { 'stack-name' } let(:region) { 'us-east-1' } let(:now) { Time.now } @@ -42,8 +42,8 @@ expect(io.string).to include('UPDATE_COMPLETE') end - context "the stack is in a failed state" do - let(:events_second_call) { + context 'the stack is in a failed state' do + let(:events_second_call) do events_first_call + [ OpenStruct.new( event_id: '4', @@ -53,7 +53,7 @@ timestamp: Time.now ) ] - } + end it 'raises an error on failure' do expect { StackMaster::StackEvents::Streamer.stream(stack_name, region, sleep_between_fetches: 0) } diff --git a/spec/stack_master/stack_spec.rb b/spec/stack_master/stack_spec.rb index 36abf957..0aa823c0 100644 --- a/spec/stack_master/stack_spec.rb +++ b/spec/stack_master/stack_spec.rb @@ -12,12 +12,12 @@ describe '.find' do context 'when the stack exists in AWS' do - let(:parameters) { + let(:parameters) do [ { parameter_key: 'param1', parameter_value: 'value1' }, { parameter_key: 'param2', parameter_value: 'value2' } ] - } + end before do cf.stub_responses( :describe_stacks, @@ -35,7 +35,7 @@ ] } ) - cf.stub_responses(:get_template, { template_body: "{}" }) + cf.stub_responses(:get_template, { template_body: '{}' }) cf.stub_responses(:get_stack_policy, { stack_policy_body: stack_policy_body }) end @@ -43,8 +43,8 @@ expect(stack.stack_id).to eq stack_id end - it "returns a template body" do - expect(stack.template_body).to eq "{}" + it 'returns a template body' do + expect(stack.template_body).to eq '{}' end it 'parses parameters into a hash' do @@ -212,12 +212,12 @@ let(:stack_definition) { StackMaster::StackDefinition.new(region: region, stack_name: stack_name, tags: tags, base_dir: '/base_dir', template: template_file_name, notification_arns: ['test_arn'], role_arn: 'test_service_role_arn', stack_policy_file: 'no_replace_rds.json') } let(:config) { StackMaster::Config.new({ 'stacks' => {} }, '/base_dir') } subject(:stack) { StackMaster::Stack.generate(stack_definition, config) } - let(:parameter_hash) { + let(:parameter_hash) do { template_parameters: { 'DbPassword' => { 'secret' => 'db_password' } }, compile_time_parameters: {} } - } - let(:resolved_template_parameters) { + end + let(:resolved_template_parameters) do { 'DbPassword' => 'sdfgjkdhlfjkghdflkjghdflkjg', 'InstanceType' => 't2.medium' } - } + end let(:resolved_compile_time_parameters) { {} } let(:template_file_name) { 'template.rb' } let(:template_body) { <<~JSON } @@ -321,8 +321,8 @@ end describe '#too_big?' do - let(:big_stack) { described_class.new(template_body: "{\"a\":\"#{'x' * 500000}\"}") } - let(:medium_stack) { described_class.new(template_body: "{\"a\":\"#{'x' * 60000}\"}") } + let(:big_stack) { described_class.new(template_body: "{\"a\":\"#{'x' * 500_000}\"}") } + let(:medium_stack) { described_class.new(template_body: "{\"a\":\"#{'x' * 60_000}\"}") } let(:little_stack) { described_class.new(template_body: "{\"a\":\"#{'x' * 1000}\"}") } context 'when not using S3' do diff --git a/spec/stack_master/template_compiler_spec.rb b/spec/stack_master/template_compiler_spec.rb index 1c321e00..43fa7ffd 100644 --- a/spec/stack_master/template_compiler_spec.rb +++ b/spec/stack_master/template_compiler_spec.rb @@ -28,9 +28,9 @@ def self.compile(template_dir, template, compile_time_parameters, compile_option end context 'when a template compiler is registered for the given file type' do - before { + before do StackMaster::TemplateCompiler.register(:test_template_compiler, TestTemplateCompiler) - } + end it 'compiles the template using the relevant template compiler' do expect(TestTemplateCompiler) @@ -48,7 +48,7 @@ def self.compile(template_dir, template, compile_time_parameters, compile_option end it 'passes compile_options to the template compiler' do - opts = { foo: 1, bar: true, baz: "meh" } + opts = { foo: 1, bar: true, baz: 'meh' } expect(TestTemplateCompiler).to receive(:compile).with(nil, template, compile_time_parameters, opts) StackMaster::TemplateCompiler.compile(config, nil, nil, template, compile_time_parameters, opts) end @@ -57,7 +57,7 @@ def self.compile(template_dir, template, compile_time_parameters, compile_option before { allow(TestTemplateCompiler).to receive(:compile).and_raise(RuntimeError) } it 'raise TemplateCompilationFailed exception' do - expect { + expect do StackMaster::TemplateCompiler.compile( config, nil, @@ -66,7 +66,7 @@ def self.compile(template_dir, template, compile_time_parameters, compile_option compile_time_parameters, compile_time_parameters ) - }.to raise_error(StackMaster::TemplateCompiler::TemplateCompilationFailed, /^Failed to compile/) + end.to raise_error(StackMaster::TemplateCompiler::TemplateCompilationFailed, /^Failed to compile/) end end end diff --git a/spec/stack_master/template_compilers/cfndsl_spec.rb b/spec/stack_master/template_compilers/cfndsl_spec.rb index fa58f1b9..1e196a49 100644 --- a/spec/stack_master/template_compilers/cfndsl_spec.rb +++ b/spec/stack_master/template_compilers/cfndsl_spec.rb @@ -33,8 +33,8 @@ def compile let(:template) { 'sample-ctp-repeated.rb' } it 'does not leak compile time params across invocations' do - expect { compile_time_parameters.delete("DisableApiTermination") } - .to change { JSON.parse(compile)["Resources"]["MyInstance"]["Properties"]["DisableApiTermination"] } + expect { compile_time_parameters.delete('DisableApiTermination') } + .to change { JSON.parse(compile)['Resources']['MyInstance']['Properties']['DisableApiTermination'] } .from('true') .to('false') end diff --git a/spec/stack_master/template_compilers/json_spec.rb b/spec/stack_master/template_compilers/json_spec.rb index b0d6997f..5792c6eb 100644 --- a/spec/stack_master/template_compilers/json_spec.rb +++ b/spec/stack_master/template_compilers/json_spec.rb @@ -6,28 +6,28 @@ def compile described_class.compile(stack_definition.template_dir, stack_definition.template, compile_time_parameters) end - let(:stack_definition) { + let(:stack_definition) do StackMaster::StackDefinition.new(template_dir: File.dirname(template_file_path), template: File.basename(template_file_path)) - } + end let(:template_file_path) { '/base_dir/templates/template.json' } - context "small json template" do + context 'small json template' do before do allow(File).to receive(:read).with(template_file_path).and_return('{ }') end - it "reads from the template file path" do + it 'reads from the template file path' do expect(compile).to eq('{ }') end end context 'extra big json template' do before do - allow(File).to receive(:read).with(template_file_path).and_return("{ #{' ' * 60000} }") + allow(File).to receive(:read).with(template_file_path).and_return("{ #{' ' * 60_000} }") end - it "reads from the template file path" do + it 'reads from the template file path' do expect(compile).to eq('{}') end end diff --git a/spec/stack_master/template_compilers/sparkle_formation_spec.rb b/spec/stack_master/template_compilers/sparkle_formation_spec.rb index 5fa6145a..441004dc 100644 --- a/spec/stack_master/template_compilers/sparkle_formation_spec.rb +++ b/spec/stack_master/template_compilers/sparkle_formation_spec.rb @@ -3,7 +3,7 @@ let(:compile_time_parameter_definitions) { {} } def project_path(path) - File.expand_path(File.join(File.dirname(__FILE__), "..", "..", "..", path)) + File.expand_path(File.join(File.dirname(__FILE__), '..', '..', '..', path)) end def fixture_template(file) @@ -11,11 +11,11 @@ def fixture_template(file) end def template_dir - "spec/fixtures/templates/rb/sparkle_formation/templates" + 'spec/fixtures/templates/rb/sparkle_formation/templates' end def sparkle_pack_dir - project_path("spec/fixtures/sparkle_pack_integration/my_sparkle_pack/lib/sparkleformation/templates") + project_path('spec/fixtures/sparkle_pack_integration/my_sparkle_pack/lib/sparkleformation/templates') end def sparkle_pack_template(file) @@ -27,13 +27,13 @@ def compile described_class.compile(template_dir, template, compile_time_parameters, compiler_options) end - let(:stack_definition) { + let(:stack_definition) do instance_double( StackMaster::StackDefinition, template: template, template_dir: template_dir ) - } + end let(:compile_time_parameters) { { 'Ip' => '10.0.0.0', 'Name' => 'Something' } } let(:compiler_options) { {} } let(:template) { 'template.rb' } @@ -104,17 +104,17 @@ def compile context 'with sparkle packs' do let(:compile_time_parameters) { {} } - let(:compiler_options) { { "sparkle_packs" => ["my_sparkle_pack"] } } + let(:compiler_options) { { 'sparkle_packs' => ['my_sparkle_pack'] } } before do - lib = File.join(File.dirname(__FILE__), "..", "..", "fixtures", "sparkle_pack_integration", "my_sparkle_pack", - "lib") + lib = File.join(File.dirname(__FILE__), '..', '..', 'fixtures', 'sparkle_pack_integration', 'my_sparkle_pack', + 'lib') $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib) end context 'compiling a sparkle pack dynamic' do let(:template) { 'template_with_dynamic_from_pack' } - let(:compiler_options) { { "sparkle_packs" => ["my_sparkle_pack"], "sparkle_pack_template" => true } } + let(:compiler_options) { { 'sparkle_packs' => ['my_sparkle_pack'], 'sparkle_pack_template' => true } } it 'pulls the dynamic from the sparkle pack' do expect(compile).to eq(<<~JSON.chomp) @@ -131,7 +131,7 @@ def compile context 'compiling a sparkle pack template' do let(:template) { 'template_with_dynamic' } - let(:compiler_options) { { "sparkle_packs" => ["my_sparkle_pack"], "sparkle_pack_template" => true } } + let(:compiler_options) { { 'sparkle_packs' => ['my_sparkle_pack'], 'sparkle_pack_template' => true } } context 'when template is found' do it 'resolves template location' do diff --git a/spec/stack_master/template_compilers/yaml_spec.rb b/spec/stack_master/template_compilers/yaml_spec.rb index fd19f4ff..c6119d94 100644 --- a/spec/stack_master/template_compilers/yaml_spec.rb +++ b/spec/stack_master/template_compilers/yaml_spec.rb @@ -7,10 +7,10 @@ def compile end context 'valid YAML template' do - let(:stack_definition) { + let(:stack_definition) do StackMaster::StackDefinition.new(template_dir: 'spec/fixtures/templates/yml', template: 'valid_myapp_vpc.yml') - } + end it 'produces valid YAML' do valid_myapp_vpc_yaml = File.read(stack_definition.template_file_path) diff --git a/spec/stack_master/template_utils_spec.rb b/spec/stack_master/template_utils_spec.rb index a9611dc3..37ce07fd 100644 --- a/spec/stack_master/template_utils_spec.rb +++ b/spec/stack_master/template_utils_spec.rb @@ -1,31 +1,31 @@ RSpec.describe StackMaster::TemplateUtils do - describe "#identify_template_format" do + describe '#identify_template_format' do subject { described_class.identify_template_format(template_body) } - context "with a json template body" do + context 'with a json template body' do let(:template_body) { '{"AWSTemplateFormatVersion": "2010-09-09"}' } it { is_expected.to eq(:json) } - context "starting with a blank line with whitespace" do + context 'starting with a blank line with whitespace' do let(:template_body) { "\n " + '{"AWSTemplateFormatVersion" : "2010-09-09"}' } it { is_expected.to eq(:json) } end end - context "with a non-json template body" do + context 'with a non-json template body' do let(:template_body) { 'AWSTemplateFormatVersion: 2010-09-09' } it { is_expected.to eq(:yaml) } end end - describe "#maybe_compressed_template_body" do + describe '#maybe_compressed_template_body' do subject(:maybe_compressed_template_body) do described_class.maybe_compressed_template_body(template_body) end - context "undersized json" do + context 'undersized json' do let(:template_body) { '{ }' } it "leaves the json alone if it's not too large" do @@ -33,8 +33,8 @@ end end - context "oversized json" do - let(:template_body) { "{#{' ' * 60000}}" } + context 'oversized json' do + let(:template_body) { "{#{' ' * 60_000}}" } it "compresses the json when it's overly bulbous" do expect(maybe_compressed_template_body).to eq('{}') end diff --git a/spec/stack_master/test_driver/cloud_formation_spec.rb b/spec/stack_master/test_driver/cloud_formation_spec.rb index c13f4b57..91608288 100644 --- a/spec/stack_master/test_driver/cloud_formation_spec.rb +++ b/spec/stack_master/test_driver/cloud_formation_spec.rb @@ -5,17 +5,17 @@ context 'stacks' do it 'creates and describes stacks' do - test_cf_driver.create_stack(stack_id: "1", stack_name: 'stack-1') - test_cf_driver.create_stack(stack_id: "2", stack_name: 'stack-2') - expect(test_cf_driver.describe_stacks.stacks.map(&:stack_id)).to eq(["1", "2"]) + test_cf_driver.create_stack(stack_id: '1', stack_name: 'stack-1') + test_cf_driver.create_stack(stack_id: '2', stack_name: 'stack-2') + expect(test_cf_driver.describe_stacks.stacks.map(&:stack_id)).to eq(%w[1 2]) end it 'adds and gets stack events' do - test_cf_driver.add_stack_event(stack_name: 'stack-1', resource_status: "UPDATE_COMPLETE") - test_cf_driver.add_stack_event(stack_name: 'stack-1', resource_status: "UPDATE_COMPLETE") + test_cf_driver.add_stack_event(stack_name: 'stack-1', resource_status: 'UPDATE_COMPLETE') + test_cf_driver.add_stack_event(stack_name: 'stack-1', resource_status: 'UPDATE_COMPLETE') test_cf_driver.add_stack_event(stack_name: 'stack-2') expect(test_cf_driver.describe_stack_events(stack_name: 'stack-1').stack_events.map(&:stack_name)) - .to eq(['stack-1', 'stack-1']) + .to eq(%w[stack-1 stack-1]) end it 'sets and gets templates' do @@ -59,15 +59,15 @@ ) test_cf_driver.execute_change_set(change_set_name: change_set1.id) test_cf_driver.execute_change_set(change_set_name: change_set2.id) - expect(test_cf_driver.describe_stacks.stacks.map(&:stack_name)).to eq(['stack-1', 'stack-2']) + expect(test_cf_driver.describe_stacks.stacks.map(&:stack_name)).to eq(%w[stack-1 stack-2]) end end it 'deletes change sets' do change_set_id = test_cf_driver.create_change_set(stack_name: '1', change_set_name: '2').id test_cf_driver.delete_change_set(change_set_name: change_set_id) - expect { + expect do test_cf_driver.describe_change_set(change_set_name: change_set_id) - }.to raise_error(KeyError) + end.to raise_error(KeyError) end end diff --git a/spec/stack_master/utils_spec.rb b/spec/stack_master/utils_spec.rb index 3076c34e..c63dc45f 100644 --- a/spec/stack_master/utils_spec.rb +++ b/spec/stack_master/utils_spec.rb @@ -1,26 +1,26 @@ RSpec.describe StackMaster::Utils do - describe ".hash_to_aws_tags" do + describe '.hash_to_aws_tags' do let(:tags) { { 'environment' => 'production' } } subject(:aws_tags) { StackMaster::Utils.hash_to_aws_tags(tags) } - it "converts the tags attribute to aws format" do + it 'converts the tags attribute to aws format' do expect(aws_tags).to eq([{ key: 'environment', value: 'production' }]) end - context "tags is nil" do + context 'tags is nil' do let(:tags) { nil } - it "returns nil" do + it 'returns nil' do expect(aws_tags).to eq([]) end end end - describe ".hash_to_aws_parameters" do + describe '.hash_to_aws_parameters' do let(:params) { { 'param1' => 'value1', 'param2' => 'value2' } } subject(:aws_params) { StackMaster::Utils.hash_to_aws_parameters(params) } - it "converts to aws parameters" do + it 'converts to aws parameters' do expect(aws_params).to eq( [ { parameter_key: 'param1', parameter_value: 'value1' }, diff --git a/spec/stack_master/validator_spec.rb b/spec/stack_master/validator_spec.rb index 31351abd..60922fef 100644 --- a/spec/stack_master/validator_spec.rb +++ b/spec/stack_master/validator_spec.rb @@ -10,7 +10,7 @@ stack_name: stack_name, template: template_file, tags: { 'environment' => 'production' }, - base_dir: File.expand_path('spec/fixtures'), + base_dir: File.expand_path('spec/fixtures') ) end let(:cf) { spy(Aws::CloudFormation::Client, validate_template: nil) } @@ -25,32 +25,32 @@ allow(StackMaster::ParameterResolver).to receive(:resolve).and_return(resolved_parameters) end - describe "#perform" do - context "template body is valid" do - it "tells the user everything will be fine" do + describe '#perform' do + context 'template body is valid' do + it 'tells the user everything will be fine' do expect { validator.perform }.to output(/myapp_vpc: valid/).to_stdout end end - context "invalid template body" do + context 'invalid template body' do before do allow(cf) .to receive(:validate_template) .and_raise(Aws::CloudFormation::Errors::ValidationError.new('a', 'Problem')) end - it "informs the user of their stupdity" do + it 'informs the user of their stupdity' do expect { validator.perform }.to output(/myapp_vpc: invalid/).to_stdout end end - context "missing parameters" do + context 'missing parameters' do let(:template_file) { 'mystack-with-parameters.yaml' } - context "--validate-template-parameters" do + context '--validate-template-parameters' do before { options.validate_template_parameters = true } - it "informs the user of the problem" do + it 'informs the user of the problem' do expect { validator.perform }.to output(<<~OUTPUT).to_stdout myapp_vpc: invalid Empty/blank parameters detected. Please provide values for these parameters: @@ -63,10 +63,10 @@ end end - context "--no-validate-template-parameters" do + context '--no-validate-template-parameters' do before { options.validate_template_parameters = false } - it "reports the stack as valid" do + it 'reports the stack as valid' do expect { validator.perform }.to output(/myapp_vpc: valid/).to_stdout end end diff --git a/spec/stack_master_spec.rb b/spec/stack_master_spec.rb index c2b7c4f6..fd4ec22c 100644 --- a/spec/stack_master_spec.rb +++ b/spec/stack_master_spec.rb @@ -1,6 +1,6 @@ RSpec.describe StackMaster do describe '.debug' do - let(:message) { "Doing some stuff" } + let(:message) { 'Doing some stuff' } context 'when debugging' do before { allow(StackMaster).to receive(:debug?).and_return(true) } @@ -14,7 +14,7 @@ before { allow(StackMaster).to receive(:debug?).and_return(false) } it "doesn't output the message to STDERR" do - expect { StackMaster.debug(message) }.to output("").to_stderr + expect { StackMaster.debug(message) }.to output('').to_stderr end end end diff --git a/spec/support/aws_stubs.rb b/spec/support/aws_stubs.rb index 7b90e294..468eb10a 100644 --- a/spec/support/aws_stubs.rb +++ b/spec/support/aws_stubs.rb @@ -1,16 +1,16 @@ Aws.config[:stub_responses] = true module AwsHelpers - def stub_drift_detection(stack_drift_detection_id: "1", stack_drift_status: "IN_SYNC") + def stub_drift_detection(stack_drift_detection_id: '1', stack_drift_status: 'IN_SYNC') cfn.stub_responses(:detect_stack_drift, { stack_drift_detection_id: stack_drift_detection_id }) cfn.stub_responses( :describe_stack_drift_detection_status, { - stack_id: "1", + stack_id: '1', timestamp: Time.now, stack_drift_detection_id: stack_drift_detection_id, stack_drift_status: stack_drift_status, - detection_status: "DETECTION_COMPLETE" + detection_status: 'DETECTION_COMPLETE' } ) end diff --git a/stack_master.gemspec b/stack_master.gemspec index 22ae8e92..02cd5a27 100644 --- a/stack_master.gemspec +++ b/stack_master.gemspec @@ -1,66 +1,64 @@ -# coding: utf-8 - -lib = File.expand_path('../lib', __FILE__) +lib = File.expand_path('lib', __dir__) $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib) require 'stack_master/version' require 'rbconfig' Gem::Specification.new do |spec| - spec.name = "stack_master" + spec.name = 'stack_master' spec.version = StackMaster::VERSION - spec.authors = ["Steve Hodgkiss", "Glen Stampoultzis"] - spec.email = ["steve@hodgkiss.me", "gstamp@gmail.com"] + spec.authors = ['Steve Hodgkiss', 'Glen Stampoultzis'] + spec.email = ['steve@hodgkiss.me', 'gstamp@gmail.com'] spec.summary = 'StackMaster is a sure-footed way of creating, updating and keeping track ' \ 'of Amazon (AWS) CloudFormation stacks.' - spec.description = %q{} - spec.homepage = "https://opensource.envato.com/projects/stack_master.html" - spec.license = "MIT" + spec.description = '' + spec.homepage = 'https://opensource.envato.com/projects/stack_master.html' + spec.license = 'MIT' spec.metadata = { - "bug_tracker_uri" => "https://github.com/envato/stack_master/issues", - "changelog_uri" => "https://github.com/envato/stack_master/blob/master/CHANGELOG.md", - "documentation_uri" => "https://www.rubydoc.info/gems/stack_master/#{spec.version}", - "source_code_uri" => "https://github.com/envato/stack_master/tree/v#{spec.version}", + 'bug_tracker_uri' => 'https://github.com/envato/stack_master/issues', + 'changelog_uri' => 'https://github.com/envato/stack_master/blob/master/CHANGELOG.md', + 'documentation_uri' => "https://www.rubydoc.info/gems/stack_master/#{spec.version}", + 'source_code_uri' => "https://github.com/envato/stack_master/tree/v#{spec.version}" } - spec.files = Dir.glob("{bin,lib,stacktemplates}/**/*") + %w(README.md LICENSE.txt) + spec.files = Dir.glob('{bin,lib,stacktemplates}/**/*') + %w[README.md LICENSE.txt] spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) } spec.test_files = spec.files.grep(%r{^(test|spec|features)/}) - spec.require_paths = ["lib"] - spec.required_ruby_version = ">= 2.4.0" + spec.require_paths = ['lib'] + spec.required_ruby_version = '>= 2.4.0' - spec.add_development_dependency "bundler" - spec.add_development_dependency "rake" - spec.add_development_dependency "rspec" - spec.add_development_dependency "pry" - spec.add_development_dependency "cucumber" - spec.add_development_dependency "aruba" - spec.add_development_dependency "timecop" - spec.add_development_dependency "ostruct" - spec.add_development_dependency "rubocop" - spec.add_dependency "os" - spec.add_dependency "ruby-progressbar" - spec.add_dependency "commander", ">= 4.6.0", "< 6" - spec.add_dependency "aws-sdk-acm", "~> 1" - spec.add_dependency "aws-sdk-cloudformation", "~> 1" - spec.add_dependency "aws-sdk-ec2", "~> 1" - spec.add_dependency "aws-sdk-identitystore", "~> 1" - spec.add_dependency "aws-sdk-s3", "~> 1" - spec.add_dependency "aws-sdk-sns", "~> 1" - spec.add_dependency "aws-sdk-ssm", "~> 1" - spec.add_dependency "aws-sdk-ecr", "~> 1" - spec.add_dependency "aws-sdk-iam", "~> 1" - spec.add_dependency "sorted_set" # remove once new version of sparkle_formation released (> v3.0.40). See https://github.com/sparkleformation/sparkle_formation/pull/271. - spec.add_dependency "diffy" - spec.add_dependency "erubis" - spec.add_dependency "rainbow" - spec.add_dependency "activesupport", '>= 4' - spec.add_dependency "sparkle_formation", "~> 3" - spec.add_dependency "table_print" - spec.add_dependency "deep_merge" - spec.add_dependency "cfndsl", "~> 1" - spec.add_dependency "multi_json" - spec.add_dependency "hashdiff", "~> 1" - spec.add_dependency "ejson_wrapper" - spec.add_dependency "diff-lcs" - spec.add_dependency "cfn-nag", ">= 0.6.7", "< 0.9.0" + spec.add_development_dependency 'bundler' + spec.add_development_dependency 'rake' + spec.add_development_dependency 'rspec' + spec.add_development_dependency 'pry' + spec.add_development_dependency 'cucumber' + spec.add_development_dependency 'aruba' + spec.add_development_dependency 'timecop' + spec.add_development_dependency 'ostruct' + spec.add_development_dependency 'rubocop' + spec.add_dependency 'os' + spec.add_dependency 'ruby-progressbar' + spec.add_dependency 'commander', '>= 4.6.0', '< 6' + spec.add_dependency 'aws-sdk-acm', '~> 1' + spec.add_dependency 'aws-sdk-cloudformation', '~> 1' + spec.add_dependency 'aws-sdk-ec2', '~> 1' + spec.add_dependency 'aws-sdk-identitystore', '~> 1' + spec.add_dependency 'aws-sdk-s3', '~> 1' + spec.add_dependency 'aws-sdk-sns', '~> 1' + spec.add_dependency 'aws-sdk-ssm', '~> 1' + spec.add_dependency 'aws-sdk-ecr', '~> 1' + spec.add_dependency 'aws-sdk-iam', '~> 1' + spec.add_dependency 'sorted_set' # remove once new version of sparkle_formation released (> v3.0.40). See https://github.com/sparkleformation/sparkle_formation/pull/271. + spec.add_dependency 'diffy' + spec.add_dependency 'erubis' + spec.add_dependency 'rainbow' + spec.add_dependency 'activesupport', '>= 4' + spec.add_dependency 'sparkle_formation', '~> 3' + spec.add_dependency 'table_print' + spec.add_dependency 'deep_merge' + spec.add_dependency 'cfndsl', '~> 1' + spec.add_dependency 'multi_json' + spec.add_dependency 'hashdiff', '~> 1' + spec.add_dependency 'ejson_wrapper' + spec.add_dependency 'diff-lcs' + spec.add_dependency 'cfn-nag', '>= 0.6.7', '< 0.9.0' end