diff --git a/.rubocop.yml b/.rubocop.yml index 9625d507..f83466fd 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -1,74 +1,520 @@ --- -inherit_from: './.rubocop_todo.yml' +require: +- rubocop-performance +- rubocop-rspec AllCops: - TargetRubyVersion: 1.9 - -Style/HashSyntax: - EnforcedStyle: hash_rockets - -Layout/FirstArrayElementLineBreak: - Enabled: true -Layout/FirstHashElementLineBreak: - Enabled: true -Layout/FirstMethodArgumentLineBreak: - Enabled: true -Layout/FirstMethodParameterLineBreak: - Enabled: true -Layout/IndentArray: - EnforcedStyle: consistent -Layout/MultilineArrayBraceLayout: - EnforcedStyle: new_line -Layout/MultilineAssignmentLayout: - Enabled: true - EnforcedStyle: same_line -Layout/MultilineHashBraceLayout: - EnforcedStyle: new_line -Layout/MultilineMethodDefinitionBraceLayout: - EnforcedStyle: new_line - -Style/AutoResourceCleanup: - Enabled: true + DisplayCopNames: true + TargetRubyVersion: '2.6' + SuggestExtensions: false + Include: + - "**/*.rb" + Exclude: + - bin/* + - ".vendor/**/*" + - "**/Gemfile" + - "**/Rakefile" + - pkg/**/* + - spec/fixtures/**/* + - vendor/**/* + - "**/Puppetfile" + - "**/Vagrantfile" + - "**/Guardfile" +Layout/LineLength: + Description: People have wide screens, use them. + Max: 200 +RSpec/BeforeAfterAll: + Description: Beware of using after(:all) as it may cause state to leak between tests. + A necessary evil in acceptance testing. + Exclude: + - spec/acceptance/**/*.rb +RSpec/HookArgument: + Description: Prefer explicit :each argument, matching existing module's style + EnforcedStyle: each +RSpec/DescribeSymbol: + Exclude: + - spec/unit/facter/**/*.rb Style/BlockDelimiters: - EnforcedStyle: braces_for_chaining -Style/BracesAroundHashParameters: - EnforcedStyle: context_dependent -Style/Encoding: - Enabled: false -Style/MethodCallWithArgsParentheses: - Enabled: true - IgnoreMacros: true - IgnoredMethods: - - puts - - require - - include - - it - - context - - describe - - to - - to_not - - raise - - desc - - task - - exit - - should - - gem - - group - - attr_reader - - attr_accessor - - attr_writer - - source -Style/MethodCalledOnDoEndBlock: - Enabled: true + Description: Prefer braces for chaining. Mostly an aesthetical choice. Better to + be consistent then. + EnforcedStyle: braces_for_chaining +Style/ClassAndModuleChildren: + Description: Compact style reduces the required amount of indentation. + EnforcedStyle: compact +Style/EmptyElse: + Description: Enforce against empty else clauses, but allow `nil` for clarity. + EnforcedStyle: empty +Style/FormatString: + Description: Following the main puppet project's style, prefer the % format format. + EnforcedStyle: percent +Style/FormatStringToken: + Description: Following the main puppet project's style, prefer the simpler template + tokens over annotated ones. + EnforcedStyle: template +Style/Lambda: + Description: Prefer the keyword for easier discoverability. + EnforcedStyle: literal Style/RegexpLiteral: - EnforcedStyle: percent_r + Description: Community preference. See https://github.com/voxpupuli/modulesync_config/issues/168 + EnforcedStyle: percent_r +Style/TernaryParentheses: + Description: Checks for use of parentheses around ternary conditions. Enforce parentheses + on complex expressions for better readability, but seriously consider breaking + it up. + EnforcedStyle: require_parentheses_when_complex Style/TrailingCommaInArguments: - EnforcedStyleForMultiline: no_comma -Style/TrailingCommaInLiteral: - EnforcedStyleForMultiline: comma -Style/FormatStringToken: - Enabled: false -Style/FileName: - Exclude: - - 'lib/puppet-lint.rb' - - 'lib/puppet-lint/tasks/puppet-lint.rb' - - 'spec/puppet-lint_spec.rb' + Description: Prefer always trailing comma on multiline argument lists. This makes + diffs, and re-ordering nicer. + EnforcedStyleForMultiline: comma +Style/TrailingCommaInArrayLiteral: + Description: Prefer always trailing comma on multiline literals. This makes diffs, + and re-ordering nicer. + EnforcedStyleForMultiline: comma +Style/SymbolArray: + Description: Using percent style obscures symbolic intent of array's contents. + EnforcedStyle: brackets +RSpec/MessageSpies: + EnforcedStyle: receive +Style/Documentation: + Exclude: + - lib/puppet/parser/functions/**/* + - spec/**/* +Style/WordArray: + EnforcedStyle: brackets +Performance/AncestorsInclude: + Enabled: true +Performance/BigDecimalWithNumericArgument: + Enabled: true +Performance/BlockGivenWithExplicitBlock: + Enabled: true +Performance/CaseWhenSplat: + Enabled: true +Performance/ConstantRegexp: + Enabled: true +Performance/MethodObjectAsBlock: + Enabled: true +Performance/RedundantSortBlock: + Enabled: true +Performance/RedundantStringChars: + Enabled: true +Performance/ReverseFirst: + Enabled: true +Performance/SortReverse: + Enabled: true +Performance/Squeeze: + Enabled: true +Performance/StringInclude: + Enabled: true +Performance/Sum: + Enabled: true +Style/CollectionMethods: + Enabled: true +Style/MethodCalledOnDoEndBlock: + Enabled: true +Style/StringMethods: + Enabled: true +Bundler/InsecureProtocolSource: + Enabled: false +Gemspec/DuplicatedAssignment: + Enabled: false +Gemspec/OrderedDependencies: + Enabled: false +Gemspec/RequiredRubyVersion: + Enabled: false +Gemspec/RubyVersionGlobalsUsage: + Enabled: false +Layout/ArgumentAlignment: + Enabled: false +Layout/BeginEndAlignment: + Enabled: false +Layout/ClosingHeredocIndentation: + Enabled: false +Layout/EmptyComment: + Enabled: false +Layout/EmptyLineAfterGuardClause: + Enabled: false +Layout/EmptyLinesAroundArguments: + Enabled: false +Layout/EmptyLinesAroundAttributeAccessor: + Enabled: false +Layout/EndOfLine: + Enabled: false +Layout/FirstArgumentIndentation: + Enabled: false +Layout/HashAlignment: + Enabled: false +Layout/HeredocIndentation: + Enabled: false +Layout/LeadingEmptyLines: + Enabled: false +Layout/SpaceAroundMethodCallOperator: + Enabled: false +Layout/SpaceInsideArrayLiteralBrackets: + Enabled: false +Layout/SpaceInsideReferenceBrackets: + Enabled: false +Lint/BigDecimalNew: + Enabled: false +Lint/BooleanSymbol: + Enabled: false +Lint/ConstantDefinitionInBlock: + Enabled: false +Lint/DeprecatedOpenSSLConstant: + Enabled: false +Lint/DisjunctiveAssignmentInConstructor: + Enabled: false +Lint/DuplicateElsifCondition: + Enabled: false +Lint/DuplicateRequire: + Enabled: false +Lint/DuplicateRescueException: + Enabled: false +Lint/EmptyConditionalBody: + Enabled: false +Lint/EmptyFile: + Enabled: false +Lint/ErbNewArguments: + Enabled: false +Lint/FloatComparison: + Enabled: false +Lint/HashCompareByIdentity: + Enabled: false +Lint/IdentityComparison: + Enabled: false +Lint/InterpolationCheck: + Enabled: false +Lint/MissingCopEnableDirective: + Enabled: false +Lint/MixedRegexpCaptureTypes: + Enabled: false +Lint/NestedPercentLiteral: + Enabled: false +Lint/NonDeterministicRequireOrder: + Enabled: false +Lint/OrderedMagicComments: + Enabled: false +Lint/OutOfRangeRegexpRef: + Enabled: false +Lint/RaiseException: + Enabled: false +Lint/RedundantCopEnableDirective: + Enabled: false +Lint/RedundantRequireStatement: + Enabled: false +Lint/RedundantSafeNavigation: + Enabled: false +Lint/RedundantWithIndex: + Enabled: false +Lint/RedundantWithObject: + Enabled: false +Lint/RegexpAsCondition: + Enabled: false +Lint/ReturnInVoidContext: + Enabled: false +Lint/SafeNavigationConsistency: + Enabled: false +Lint/SafeNavigationWithEmpty: + Enabled: false +Lint/SelfAssignment: + Enabled: false +Lint/SendWithMixinArgument: + Enabled: false +Lint/ShadowedArgument: + Enabled: false +Lint/StructNewOverride: + Enabled: false +Lint/ToJSON: + Enabled: false +Lint/TopLevelReturnWithArgument: + Enabled: false +Lint/TrailingCommaInAttributeDeclaration: + Enabled: false +Lint/UnreachableLoop: + Enabled: false +Lint/UriEscapeUnescape: + Enabled: false +Lint/UriRegexp: + Enabled: false +Lint/UselessMethodDefinition: + Enabled: false +Lint/UselessTimes: + Enabled: false +Metrics/AbcSize: + Enabled: false +Metrics/BlockLength: + Enabled: false +Metrics/BlockNesting: + Enabled: false +Metrics/ClassLength: + Enabled: false +Metrics/CyclomaticComplexity: + Enabled: false +Metrics/MethodLength: + Enabled: false +Metrics/ModuleLength: + Enabled: false +Metrics/ParameterLists: + Enabled: false +Metrics/PerceivedComplexity: + Enabled: false +Migration/DepartmentName: + Enabled: false +Naming/AccessorMethodName: + Enabled: false +Naming/BlockParameterName: + Enabled: false +Naming/HeredocDelimiterCase: + Enabled: false +Naming/HeredocDelimiterNaming: + Enabled: false +Naming/MemoizedInstanceVariableName: + Enabled: false +Naming/MethodParameterName: + Enabled: false +Naming/RescuedExceptionsVariableName: + Enabled: false +Naming/VariableNumber: + Enabled: false +Performance/BindCall: + Enabled: false +Performance/DeletePrefix: + Enabled: false +Performance/DeleteSuffix: + Enabled: false +Performance/InefficientHashSearch: + Enabled: false +Performance/UnfreezeString: + Enabled: false +Performance/UriDefaultParser: + Enabled: false +RSpec/Be: + Enabled: false +RSpec/Capybara/CurrentPathExpectation: + Enabled: false +RSpec/Capybara/FeatureMethods: + Enabled: false +RSpec/Capybara/VisibilityMatcher: + Enabled: false +RSpec/ContextMethod: + Enabled: false +RSpec/ContextWording: + Enabled: false +RSpec/DescribeClass: + Enabled: false +RSpec/EmptyHook: + Enabled: false +RSpec/EmptyLineAfterExample: + Enabled: false +RSpec/EmptyLineAfterExampleGroup: + Enabled: false +RSpec/EmptyLineAfterHook: + Enabled: false +RSpec/ExampleLength: + Enabled: false +RSpec/ExampleWithoutDescription: + Enabled: false +RSpec/ExpectChange: + Enabled: false +RSpec/ExpectInHook: + Enabled: false +RSpec/FactoryBot/AttributeDefinedStatically: + Enabled: false +RSpec/FactoryBot/CreateList: + Enabled: false +RSpec/FactoryBot/FactoryClassName: + Enabled: false +RSpec/HooksBeforeExamples: + Enabled: false +RSpec/ImplicitBlockExpectation: + Enabled: false +RSpec/ImplicitSubject: + Enabled: false +RSpec/LeakyConstantDeclaration: + Enabled: false +RSpec/LetBeforeExamples: + Enabled: false +RSpec/MissingExampleGroupArgument: + Enabled: false +RSpec/MultipleExpectations: + Enabled: false +RSpec/MultipleMemoizedHelpers: + Enabled: false +RSpec/MultipleSubjects: + Enabled: false +RSpec/NestedGroups: + Enabled: false +RSpec/PredicateMatcher: + Enabled: false +RSpec/ReceiveCounts: + Enabled: false +RSpec/ReceiveNever: + Enabled: false +RSpec/RepeatedExampleGroupBody: + Enabled: false +RSpec/RepeatedExampleGroupDescription: + Enabled: false +RSpec/RepeatedIncludeExample: + Enabled: false +RSpec/ReturnFromStub: + Enabled: false +RSpec/SharedExamples: + Enabled: false +RSpec/StubbedMock: + Enabled: false +RSpec/UnspecifiedException: + Enabled: false +RSpec/VariableDefinition: + Enabled: false +RSpec/VoidExpect: + Enabled: false +RSpec/Yield: + Enabled: false +Security/Open: + Enabled: false +Style/AccessModifierDeclarations: + Enabled: false +Style/AccessorGrouping: + Enabled: false +Style/AsciiComments: + Enabled: false +Style/BisectedAttrAccessor: + Enabled: false +Style/CaseLikeIf: + Enabled: false +Style/ClassEqualityComparison: + Enabled: false +Style/ColonMethodDefinition: + Enabled: false +Style/CombinableLoops: + Enabled: false +Style/CommentedKeyword: + Enabled: false +Style/Dir: + Enabled: false +Style/DoubleCopDisableDirective: + Enabled: false +Style/EmptyBlockParameter: + Enabled: false +Style/EmptyLambdaParameter: + Enabled: false +Style/Encoding: + Enabled: false +Style/EvalWithLocation: + Enabled: false +Style/ExpandPathArguments: + Enabled: false +Style/ExplicitBlockArgument: + Enabled: false +Style/ExponentialNotation: + Enabled: false +Style/FloatDivision: + Enabled: false +Style/FrozenStringLiteralComment: + Enabled: false +Style/GlobalStdStream: + Enabled: false +Style/HashAsLastArrayItem: + Enabled: false +Style/HashLikeCase: + Enabled: false +Style/HashTransformKeys: + Enabled: false +Style/HashTransformValues: + Enabled: false +Style/IfUnlessModifier: + Enabled: false +Style/KeywordParametersOrder: + Enabled: false +Style/MinMax: + Enabled: false +Style/MixinUsage: + Enabled: false +Style/MultilineWhenThen: + Enabled: false +Style/NegatedUnless: + Enabled: false +Style/NumericPredicate: + Enabled: false +Style/OptionalBooleanParameter: + Enabled: false +Style/OrAssignment: + Enabled: false +Style/RandomWithOffset: + Enabled: false +Style/RedundantAssignment: + Enabled: false +Style/RedundantCondition: + Enabled: false +Style/RedundantConditional: + Enabled: false +Style/RedundantFetchBlock: + Enabled: false +Style/RedundantFileExtensionInRequire: + Enabled: false +Style/RedundantRegexpCharacterClass: + Enabled: false +Style/RedundantRegexpEscape: + Enabled: false +Style/RedundantSelfAssignment: + Enabled: false +Style/RedundantSort: + Enabled: false +Style/RescueStandardError: + Enabled: false +Style/SingleArgumentDig: + Enabled: false +Style/SlicingWithRange: + Enabled: false +Style/SoleNestedConditional: + Enabled: false +Style/StderrPuts: + Enabled: false +Style/StringConcatenation: + Enabled: false +Style/Strip: + Enabled: false +Style/SymbolProc: + Enabled: false +Style/TrailingBodyOnClass: + Enabled: false +Style/TrailingBodyOnMethodDefinition: + Enabled: false +Style/TrailingBodyOnModule: + Enabled: false +Style/TrailingCommaInHashLiteral: + Enabled: false +Style/TrailingMethodEndStatement: + Enabled: false +Style/UnpackFirst: + Enabled: false +Lint/DuplicateBranch: + Enabled: false +Lint/DuplicateRegexpCharacterClassElement: + Enabled: false +Lint/EmptyBlock: + Enabled: false +Lint/EmptyClass: + Enabled: false +Lint/NoReturnInBeginEndBlocks: + Enabled: false +Lint/ToEnumArguments: + Enabled: false +Lint/UnexpectedBlockArity: + Enabled: false +Lint/UnmodifiedReduceAccumulator: + Enabled: false +Performance/CollectionLiteralInLoop: + Enabled: false +Style/ArgumentsForwarding: + Enabled: false +Style/CollectionCompact: + Enabled: false +Style/DocumentDynamicEvalDefinition: + Enabled: false +Style/NegatedIfElseCondition: + Enabled: false +Style/NilLambda: + Enabled: false +Style/RedundantArgument: + Enabled: false +Style/SwapValues: + Enabled: false diff --git a/.rubocop_todo.yml b/.rubocop_todo.yml deleted file mode 100644 index bc16b7c2..00000000 --- a/.rubocop_todo.yml +++ /dev/null @@ -1,89 +0,0 @@ -# This configuration was generated by -# `rubocop --auto-gen-config` -# on 2017-08-28 12:57:58 +1000 using RuboCop version 0.49.1. -# The point is for the user to remove these configuration records -# one by one as the offenses are removed from the code base. -# Note that changes in the inspected code, or installation of new -# versions of RuboCop, may require this file to be generated again. - -# Offense count: 3 -# Configuration parameters: Include. -# Include: **/Gemfile, **/gems.rb -Bundler/DuplicatedGem: - Exclude: - - 'Gemfile' - -# Offense count: 2 -# Cop supports --auto-correct. -# Configuration parameters: Include, TreatCommentsAsGroupSeparators. -# Include: **/Gemfile, **/gems.rb -Bundler/OrderedGems: - Exclude: - - 'Gemfile' - -# Offense count: 9 -# Configuration parameters: AllowSafeAssignment. -Lint/AssignmentInCondition: - Exclude: - - 'lib/puppet-lint/lexer.rb' - - 'lib/puppet-lint/plugins/check_classes/variable_scope.rb' - -# Offense count: 52 -Metrics/AbcSize: - Max: 153 - -# Offense count: 121 -# Configuration parameters: CountComments, ExcludedMethods. -Metrics/BlockLength: - Max: 1136 - -# Offense count: 8 -# Configuration parameters: CountBlocks. -Metrics/BlockNesting: - Max: 5 - -# Offense count: 2 -# Configuration parameters: CountComments. -Metrics/ClassLength: - Max: 385 - -# Offense count: 20 -Metrics/CyclomaticComplexity: - Max: 26 - -# Offense count: 238 -# Configuration parameters: AllowHeredoc, AllowURI, URISchemes, IgnoreCopDirectives, IgnoredPatterns. -# URISchemes: http, https -Metrics/LineLength: - Max: 223 - -# Offense count: 65 -# Configuration parameters: CountComments. -Metrics/MethodLength: - Max: 105 - -# Offense count: 18 -Metrics/PerceivedComplexity: - Max: 28 - -# Offense count: 1 -# Cop supports --auto-correct. -Performance/RedundantBlockCall: - Exclude: - - 'lib/puppet-lint/tasks/puppet-lint.rb' - -# Offense count: 7 -# Configuration parameters: EnforcedStyle, SupportedStyles. -# SupportedStyles: nested, compact -Style/ClassAndModuleChildren: - Exclude: - - 'lib/puppet-lint.rb' - - 'lib/puppet-lint/bin.rb' - - 'lib/puppet-lint/checkplugin.rb' - - 'lib/puppet-lint/checks.rb' - - 'lib/puppet-lint/data.rb' - - 'lib/puppet-lint/optparser.rb' - -# Offense count: 20 -Style/MultilineBlockChain: - Enabled: false diff --git a/Gemfile b/Gemfile index 71a5d647..85fdc11f 100644 --- a/Gemfile +++ b/Gemfile @@ -7,39 +7,22 @@ group :test do gem 'rspec-its', '~> 1.0' gem 'rspec-collection_matchers', '~> 1.0' - if RUBY_VERSION < '2.0' - # json 2.x requires ruby 2.0. Lock to 1.8 - gem 'json', '= 1.8' - # json_pure 2.0.2 requires ruby 2.0, and 2.0.1 requires ruby 1.9. Lock to 1.8.3. - gem 'json_pure', '= 1.8.3' - # addressable 2.4.0 requires ruby 1.9.0. Lock to 2.3.8. - gem 'addressable', '= 2.3.8' - gem 'diff-lcs', '< 1.3' - gem 'rspec', '<= 3.4' - else - gem 'rspec', '~> 3.0' - gem 'json' - end + gem 'rspec', '~> 3.0' + gem 'json' - if RUBY_VERSION > '1.8' - # requires ruby 1.9+, on 1.8 we'll fall back to the old regex parsing - gem 'rspec-json_expectations', '~> 1.4' - end + gem 'rspec-json_expectations', '~> 1.4' - gem 'rubocop', '0.49.1' if RUBY_VERSION > '2.0' gem 'simplecov', :require => false if ENV['COVERAGE'] == 'yes' end group :development do - if RUBY_VERSION > '1.9' - # For Changelog generation - if RUBY_VERSION >= '2.2.2' - gem 'github_changelog_generator', :require => false - else - gem 'github_changelog_generator', '~> 1.13.0', :require => false - gem 'rack', '~> 1.0', :require => false - end + gem 'github_changelog_generator', require: false + gem 'faraday-retry', require: false + gem 'pry', require: false +end - gem 'pry' - end +group :rubocop do + gem 'rubocop', '~> 1.6.1', require: false + gem 'rubocop-rspec', '~> 2.0.1', require: false + gem 'rubocop-performance', '~> 1.9.1', require: false end diff --git a/Rakefile b/Rakefile index c156c2bf..41382613 100644 --- a/Rakefile +++ b/Rakefile @@ -1,15 +1,14 @@ -require 'rake' -require 'rspec/core/rake_task' -require 'puppet-lint' -require 'puppet-lint/tasks/release_test' require 'bundler/gem_tasks' - -task :default => :test - -RSpec::Core::RakeTask.new(:test) +require 'rubocop/rake_task' +require 'github_changelog_generator/task' +require 'puppet-lint/version' +require 'rspec/core/rake_task' begin require 'github_changelog_generator/task' +rescue LoadError + # Gem not present +else GitHubChangelogGenerator::RakeTask.new(:changelog) do |config| version = PuppetLint::VERSION config.user = 'puppetlabs' @@ -19,28 +18,8 @@ begin config.exclude_labels = %w[duplicate question invalid wontfix release-pr documentation] config.enhancement_labels = %w[feature] end -rescue LoadError - $stderr.puts 'Changelog generation requires Ruby 2.0 or higher' -end - -begin - require 'rubocop/rake_task' - - RuboCop::RakeTask.new(:rubocop) do |task| - task.options = %w[-D -E] - task.patterns = [ - 'lib/**/*.rb', - 'spec/**/*.rb', - 'bin/*', - '*.gemspec', - 'Gemfile', - 'Rakefile', - ] - end -rescue LoadError - $stderr.puts 'Rubocop is not available for this version of Ruby.' end -task :ci => [:test, :release_test] +RSpec::Core::RakeTask.new(:spec) +task :default => :test -# vim: syntax=ruby diff --git a/puppet-lint.gemspec b/puppet-lint.gemspec index b3b3d116..a47f32db 100644 --- a/puppet-lint.gemspec +++ b/puppet-lint.gemspec @@ -1,20 +1,35 @@ $LOAD_PATH.push(File.expand_path('../lib', __FILE__)) require 'puppet-lint/version' -Gem::Specification.new do |s| - s.name = 'puppet-lint' - s.version = PuppetLint::VERSION.dup - s.homepage = 'https://github.com/puppetlabs/puppet-lint/' - s.summary = 'Ensure your Puppet manifests conform with the Puppetlabs style guide' - s.description = 'Checks your Puppet manifests against the Puppetlabs - style guide and alerts you to any discrepancies.' +Gem::Specification.new do |spec| + spec.name = 'puppet-lint' + spec.version = PuppetLint::VERSION.dup + spec.homepage = 'https://github.com/puppetlabs/puppet-lint/' + spec.summary = 'Ensure your Puppet manifests conform with the Puppetlabs style guide' + spec.description = <<-EOF + Checks your Puppet manifests against the Puppetlabs style guide and alerts you to any discrepancies.' + EOF - s.files = Dir['CHANGELOG.md', 'HISTORY.md', 'README.md', 'LICENSE', 'lib/**/*', 'bin/**/*', 'spec/**/*'] - s.test_files = s.files.grep(%r{\Aspec/}) - s.executables = s.files.grep(%r{\Abin/}) { |f| File.basename(f) } - s.require_paths = ['lib'] + spec.files = Dir[ + 'README.md', + 'LICENSE', + 'lib/**/*', + 'bin/**/*', + 'spec/**/*', + ] + spec.executables = Dir['bin/**/*'].map { |f| File.basename(f) } + spec.require_paths = ['lib'] - s.authors = ['Tim Sharpe', 'Puppet, Inc.', 'Community Contributors'] - s.email = ['tim@sharpe.id.au', 'modules-team@puppet.com'] - s.license = 'MIT' + spec.authors = [ + 'Tim Sharpe', + 'Puppet, Inc.', + 'Community Contributors', + ] + spec.email = [ + 'tim@sharpe.id.au', + 'modules-team@puppet.com', + ] + spec.license = 'MIT' + + spec.required_ruby_version = Gem::Requirement.new(">= 2.7".freeze) end