Merge pull request #191 from crystal-ameba/Sija/change-rule-to-class

Change Rule to a class
This commit is contained in:
Sijawusz Pur Rahnama 2021-01-19 22:20:05 +01:00 committed by GitHub
commit 9853203f19
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
52 changed files with 74 additions and 78 deletions

View file

@ -3,7 +3,7 @@ require "../src/ameba"
module Ameba module Ameba
# Dummy Rule which does nothing. # Dummy Rule which does nothing.
struct DummyRule < Rule::Base class DummyRule < Rule::Base
properties do properties do
description : String = "Dummy rule that does nothing." description : String = "Dummy rule that does nothing."
end end
@ -35,7 +35,7 @@ module Ameba
end end
end end
struct NamedRule < Rule::Base class NamedRule < Rule::Base
properties do properties do
description "A rule with a custom name." description "A rule with a custom name."
end end
@ -45,7 +45,7 @@ module Ameba
end end
end end
struct ErrorRule < Rule::Base class ErrorRule < Rule::Base
properties do properties do
description "Always adds an error at 1:1" description "Always adds an error at 1:1"
end end
@ -55,7 +55,7 @@ module Ameba
end end
end end
struct ScopeRule < Rule::Base class ScopeRule < Rule::Base
@[YAML::Field(ignore: true)] @[YAML::Field(ignore: true)]
getter scopes = [] of AST::Scope getter scopes = [] of AST::Scope
@ -68,7 +68,7 @@ module Ameba
end end
end end
struct FlowExpressionRule < Rule::Base class FlowExpressionRule < Rule::Base
@[YAML::Field(ignore: true)] @[YAML::Field(ignore: true)]
getter expressions = [] of AST::FlowExpression getter expressions = [] of AST::FlowExpression
@ -81,7 +81,7 @@ module Ameba
end end
end end
struct RedundantControlExpressionRule < Rule::Base class RedundantControlExpressionRule < Rule::Base
@[YAML::Field(ignore: true)] @[YAML::Field(ignore: true)]
getter nodes = [] of Crystal::ASTNode getter nodes = [] of Crystal::ASTNode
@ -95,7 +95,7 @@ module Ameba
end end
# A rule that always raises an error # A rule that always raises an error
struct RaiseRule < Rule::Base class RaiseRule < Rule::Base
property should_raise = false property should_raise = false
properties do properties do

View file

@ -121,16 +121,10 @@ module Ameba::Cli
private def configure_rules(config, opts) private def configure_rules(config, opts)
case case
when only = opts.only when only = opts.only
config.rules.map! do |rule| config.rules.each(&.enabled = false)
rule.enabled = false
rule
end
config.update_rules(only, enabled: true) config.update_rules(only, enabled: true)
when opts.all? when opts.all?
config.rules.map! do |rule| config.rules.each(&.enabled = true)
rule.enabled = true
rule
end
end end
config.update_rules(opts.except, enabled: false) config.update_rules(opts.except, enabled: false)
end end

View file

@ -135,13 +135,12 @@ class Ameba::Config
# config.update_rule "MyRuleName", enabled: false # config.update_rule "MyRuleName", enabled: false
# ``` # ```
def update_rule(name, enabled = true, excluded = nil) def update_rule(name, enabled = true, excluded = nil)
index = @rules.index { |rule| rule.name == name } rule = @rules.find(&.name.==(name))
raise ArgumentError.new("Rule `#{name}` does not exist") unless index raise ArgumentError.new("Rule `#{name}` does not exist") unless rule
rule = @rules[index] rule
rule.enabled = enabled .tap(&.enabled = enabled)
rule.excluded = excluded .tap(&.excluded = excluded)
@rules[index] = rule
end end
# Updates rules properties. # Updates rules properties.
@ -156,12 +155,15 @@ class Ameba::Config
# ``` # ```
# config.update_rules %w(Group1 Group2), enabled: true # config.update_rules %w(Group1 Group2), enabled: true
# ``` # ```
def update_rules(names, **args) def update_rules(names, enabled = true, excluded = nil)
names.try &.each do |name| names.try &.each do |name|
if group = @rule_groups[name]? if rules = @rule_groups[name]?
group.each { |rule| update_rule(rule.name, **args) } rules.each do |rule|
rule.enabled = enabled
rule.excluded = excluded
end
else else
update_rule name, **args update_rule name, enabled, excluded
end end
end end
end end

View file

@ -10,7 +10,7 @@ module Ameba::Rule
# inherits from this struct: # inherits from this struct:
# #
# ``` # ```
# struct MyRule < Ameba::Rule::Base # class MyRule < Ameba::Rule::Base
# def test(source) # def test(source)
# if invalid?(source) # if invalid?(source)
# issue_for line, column, "Something wrong." # issue_for line, column, "Something wrong."
@ -26,7 +26,7 @@ module Ameba::Rule
# Enforces rules to implement an abstract `#test` method which # Enforces rules to implement an abstract `#test` method which
# is designed to test the source passed in. If source has issues # is designed to test the source passed in. If source has issues
# that are tested by this rule, it should add an issue. # that are tested by this rule, it should add an issue.
abstract struct Base abstract class Base
include Config::RuleConfig include Config::RuleConfig
# This method is designed to test the source passed in. If source has issues # This method is designed to test the source passed in. If source has issues
@ -56,7 +56,7 @@ module Ameba::Rule
# Returns a name of this rule, which is basically a class name. # Returns a name of this rule, which is basically a class name.
# #
# ``` # ```
# struct MyRule < Ameba::Rule::Base # class MyRule < Ameba::Rule::Base
# def test(source) # def test(source)
# end # end
# end # end
@ -70,7 +70,7 @@ module Ameba::Rule
# Returns a group this rule belong to. # Returns a group this rule belong to.
# #
# ``` # ```
# struct MyGroup::MyRule < Ameba::Rule::Base # class MyGroup::MyRule < Ameba::Rule::Base
# # ... # # ...
# end # end
# #
@ -140,7 +140,7 @@ module Ameba::Rule
# module Ameba # module Ameba
# # This is a test rule. # # This is a test rule.
# # Does nothing. # # Does nothing.
# struct MyRule < Ameba::Rule::Base # class MyRule < Ameba::Rule::Base
# def test(source) # def test(source)
# end # end
# end # end

View file

@ -8,7 +8,7 @@ module Ameba::Rule::Layout
# Enabled: true # Enabled: true
# MaxLength: 100 # MaxLength: 100
# ``` # ```
struct LineLength < Base class LineLength < Base
properties do properties do
enabled false enabled false
description "Disallows lines longer than `MaxLength` number of symbols" description "Disallows lines longer than `MaxLength` number of symbols"

View file

@ -7,7 +7,7 @@ module Ameba::Rule::Layout
# Layout/TrailingBlankLines: # Layout/TrailingBlankLines:
# Enabled: true # Enabled: true
# ``` # ```
struct TrailingBlankLines < Base class TrailingBlankLines < Base
properties do properties do
description "Disallows trailing blank lines" description "Disallows trailing blank lines"
end end

View file

@ -7,7 +7,7 @@ module Ameba::Rule::Layout
# Layout/TrailingWhitespace: # Layout/TrailingWhitespace:
# Enabled: true # Enabled: true
# ``` # ```
struct TrailingWhitespace < Base class TrailingWhitespace < Base
properties do properties do
description "Disallows trailing whitespaces" description "Disallows trailing whitespaces"
end end

View file

@ -17,7 +17,7 @@ module Ameba::Rule::Lint
# Lint/BadDirective: # Lint/BadDirective:
# Enabled: true # Enabled: true
# ``` # ```
struct BadDirective < Base class BadDirective < Base
properties do properties do
description "Reports bad comment directives" description "Reports bad comment directives"
end end

View file

@ -19,7 +19,7 @@ module Ameba::Rule::Lint
# Lint/ComparisonToBoolean: # Lint/ComparisonToBoolean:
# Enabled: true # Enabled: true
# ``` # ```
struct ComparisonToBoolean < Base class ComparisonToBoolean < Base
properties do properties do
enabled false enabled false
description "Disallows comparison to booleans" description "Disallows comparison to booleans"

View file

@ -10,7 +10,7 @@ module Ameba::Rule::Lint
# Lint/DebuggerStatement: # Lint/DebuggerStatement:
# Enabled: true # Enabled: true
# ``` # ```
struct DebuggerStatement < Base class DebuggerStatement < Base
properties do properties do
description "Disallows calls to debugger" description "Disallows calls to debugger"
end end

View file

@ -13,7 +13,7 @@ module Ameba::Rule::Lint
# Lint/DuplicatedRequire: # Lint/DuplicatedRequire:
# Enabled: true # Enabled: true
# ``` # ```
struct DuplicatedRequire < Base class DuplicatedRequire < Base
properties do properties do
description "Reports duplicated require statements" description "Reports duplicated require statements"
end end

View file

@ -38,7 +38,7 @@ module Ameba::Rule::Lint
# Lint/EmptyEnsure # Lint/EmptyEnsure
# Enabled: true # Enabled: true
# ``` # ```
struct EmptyEnsure < Base class EmptyEnsure < Base
properties do properties do
description "Disallows empty ensure statement" description "Disallows empty ensure statement"
end end

View file

@ -27,7 +27,7 @@ module Ameba::Rule::Lint
# Lint/EmptyExpression: # Lint/EmptyExpression:
# Enabled: true # Enabled: true
# ``` # ```
struct EmptyExpression < Base class EmptyExpression < Base
include AST::Util include AST::Util
properties do properties do

View file

@ -37,7 +37,7 @@ module Ameba::Rule::Lint
# Lint/EmptyLoop: # Lint/EmptyLoop:
# Enabled: true # Enabled: true
# ``` # ```
struct EmptyLoop < Base class EmptyLoop < Base
include AST::Util include AST::Util
properties do properties do

View file

@ -19,7 +19,7 @@ module Ameba::Rule::Lint
# Lint/HashDuplicatedKey: # Lint/HashDuplicatedKey:
# Enabled: true # Enabled: true
# ``` # ```
struct HashDuplicatedKey < Base class HashDuplicatedKey < Base
properties do properties do
description "Disallows duplicated keys in hash literals" description "Disallows duplicated keys in hash literals"
end end

View file

@ -19,7 +19,7 @@ module Ameba::Rule::Lint
# Lint/LiteralInCondition: # Lint/LiteralInCondition:
# Enabled: true # Enabled: true
# ``` # ```
struct LiteralInCondition < Base class LiteralInCondition < Base
include AST::Util include AST::Util
properties do properties do

View file

@ -15,7 +15,7 @@ module Ameba::Rule::Lint
# Lint/LiteralInInterpolation # Lint/LiteralInInterpolation
# Enabled: true # Enabled: true
# ``` # ```
struct LiteralInInterpolation < Base class LiteralInInterpolation < Base
include AST::Util include AST::Util
properties do properties do

View file

@ -23,7 +23,7 @@ module Ameba::Rule::Lint
# StringArrayUnwantedSymbols: ',"' # StringArrayUnwantedSymbols: ',"'
# SymbolArrayUnwantedSymbols: ',:' # SymbolArrayUnwantedSymbols: ',:'
# ``` # ```
struct PercentArrays < Base class PercentArrays < Base
properties do properties do
description "Disallows some unwanted symbols in percent array literals" description "Disallows some unwanted symbols in percent array literals"

View file

@ -22,7 +22,7 @@ module Ameba::Rule::Lint
# Lint/RandZero: # Lint/RandZero:
# Enabled: true # Enabled: true
# ``` # ```
struct RandZero < Base class RandZero < Base
properties do properties do
description "Disallows rand zero calls" description "Disallows rand zero calls"
end end

View file

@ -20,7 +20,7 @@ module Ameba::Rule::Lint
# Lint/RedundantStringCoersion # Lint/RedundantStringCoersion
# Enabled: true # Enabled: true
# ``` # ```
struct RedundantStringCoercion < Base class RedundantStringCoercion < Base
include AST::Util include AST::Util
properties do properties do

View file

@ -26,7 +26,7 @@ module Ameba::Rule::Lint
# Lint/RedundantWithIndex: # Lint/RedundantWithIndex:
# Enabled: true # Enabled: true
# ``` # ```
struct RedundantWithIndex < Base class RedundantWithIndex < Base
properties do properties do
description "Disallows redundant `with_index` calls" description "Disallows redundant `with_index` calls"
end end

View file

@ -27,7 +27,7 @@ module Ameba::Rule::Lint
# Lint/RedundantWithObject: # Lint/RedundantWithObject:
# Enabled: true # Enabled: true
# ``` # ```
struct RedundantWithObject < Base class RedundantWithObject < Base
properties do properties do
description "Disallows redundant `with_object` calls" description "Disallows redundant `with_object` calls"
end end

View file

@ -35,7 +35,7 @@ module Ameba::Rule::Lint
# Lint/ShadowedArgument: # Lint/ShadowedArgument:
# Enabled: true # Enabled: true
# ``` # ```
struct ShadowedArgument < Base class ShadowedArgument < Base
properties do properties do
description "Disallows shadowed arguments" description "Disallows shadowed arguments"
end end

View file

@ -33,7 +33,7 @@ module Ameba::Rule::Lint
# Lint/ShadowedException: # Lint/ShadowedException:
# Enabled: true # Enabled: true
# ``` # ```
struct ShadowedException < Base class ShadowedException < Base
properties do properties do
description "Disallows rescued exception that get shadowed" description "Disallows rescued exception that get shadowed"
end end

View file

@ -30,7 +30,7 @@ module Ameba::Rule::Lint
# Lint/ShadowingOuterLocalVar: # Lint/ShadowingOuterLocalVar:
# Enabled: true # Enabled: true
# ``` # ```
struct ShadowingOuterLocalVar < Base class ShadowingOuterLocalVar < Base
properties do properties do
description "Disallows the usage of the same name as outer local variables" \ description "Disallows the usage of the same name as outer local variables" \
" for block or proc arguments." " for block or proc arguments."

View file

@ -49,7 +49,7 @@ module Ameba::Rule::Lint
# Lint/SharedVarInFiber: # Lint/SharedVarInFiber:
# Enabled: true # Enabled: true
# ``` # ```
struct SharedVarInFiber < Base class SharedVarInFiber < Base
properties do properties do
description "Disallows shared variables in fibers." description "Disallows shared variables in fibers."
end end

View file

@ -18,7 +18,7 @@ module Ameba::Rule::Lint
# rescue e : Exception # rescue e : Exception
# end # end
# ``` # ```
struct Syntax < Base class Syntax < Base
properties do properties do
description "Reports invalid Crystal syntax" description "Reports invalid Crystal syntax"
severity Ameba::Severity::Error severity Ameba::Severity::Error

View file

@ -24,7 +24,7 @@ module Ameba::Rule::Lint
# Lint/UnneededDisableDirective # Lint/UnneededDisableDirective
# Enabled: true # Enabled: true
# ``` # ```
struct UnneededDisableDirective < Base class UnneededDisableDirective < Base
properties do properties do
description "Reports unneeded disable directives in comments" description "Reports unneeded disable directives in comments"
end end

View file

@ -41,7 +41,7 @@ module Ameba::Rule::Lint
# Lint/UnreachableCode: # Lint/UnreachableCode:
# Enabled: true # Enabled: true
# ``` # ```
struct UnreachableCode < Base class UnreachableCode < Base
include AST::Util include AST::Util
properties do properties do

View file

@ -24,7 +24,7 @@ module Ameba::Rule::Lint
# IgnoreBlocks: false # IgnoreBlocks: false
# IgnoreProcs: false # IgnoreProcs: false
# ``` # ```
struct UnusedArgument < Base class UnusedArgument < Base
properties do properties do
description "Disallows unused arguments" description "Disallows unused arguments"

View file

@ -25,7 +25,7 @@ module Ameba::Rule::Lint
# Lint/UselessAssign: # Lint/UselessAssign:
# Enabled: true # Enabled: true
# ``` # ```
struct UselessAssign < Base class UselessAssign < Base
properties do properties do
description "Disallows useless variable assignments" description "Disallows useless variable assignments"
end end

View file

@ -30,7 +30,7 @@ module Ameba::Rule::Lint
# Lint/UselessConditionInWhen: # Lint/UselessConditionInWhen:
# Enabled: true # Enabled: true
# ``` # ```
struct UselessConditionInWhen < Base class UselessConditionInWhen < Base
properties do properties do
description "Disallows useless conditions in when" description "Disallows useless conditions in when"
end end

View file

@ -8,7 +8,7 @@ module Ameba::Rule::Metrics
# Enabled: true # Enabled: true
# MaxComplexity: 10 # MaxComplexity: 10
# ``` # ```
struct CyclomaticComplexity < Base class CyclomaticComplexity < Base
properties do properties do
description "Disallows methods with a cyclomatic complexity higher than `MaxComplexity`" description "Disallows methods with a cyclomatic complexity higher than `MaxComplexity`"
max_complexity 10 max_complexity 10

View file

@ -24,7 +24,7 @@ module Ameba::Rule::Performance
# - select # - select
# - reject # - reject
# ``` # ```
struct AnyAfterFilter < Base class AnyAfterFilter < Base
properties do properties do
description "Identifies usage of `any?` calls that follow filters." description "Identifies usage of `any?` calls that follow filters."
filter_names : Array(String) = %w(select reject) filter_names : Array(String) = %w(select reject)

View file

@ -19,7 +19,7 @@ module Ameba::Rule::Performance
# Performance/CompactAfterMap # Performance/CompactAfterMap
# Enabled: true # Enabled: true
# ``` # ```
struct CompactAfterMap < Base class CompactAfterMap < Base
properties do properties do
description "Identifies usage of `compact` calls that follow `map`." description "Identifies usage of `compact` calls that follow `map`."
end end

View file

@ -23,7 +23,7 @@ module Ameba::Rule::Performance
# FilterNames: # FilterNames:
# - select # - select
# ``` # ```
struct FirstLastAfterFilter < Base class FirstLastAfterFilter < Base
properties do properties do
description "Identifies usage of `first/last/first?/last?` calls that follow filters." description "Identifies usage of `first/last/first?/last?` calls that follow filters."
filter_names : Array(String) = %w(select) filter_names : Array(String) = %w(select)

View file

@ -19,7 +19,7 @@ module Ameba::Rule::Performance
# Performance/FlattenAfterMap # Performance/FlattenAfterMap
# Enabled: true # Enabled: true
# ``` # ```
struct FlattenAfterMap < Base class FlattenAfterMap < Base
properties do properties do
description "Identifies usage of `flatten` calls that follow `map`." description "Identifies usage of `flatten` calls that follow `map`."
end end

View file

@ -22,7 +22,7 @@ module Ameba::Rule::Performance
# Performance/MapInsteadOfBlock # Performance/MapInsteadOfBlock
# Enabled: true # Enabled: true
# ``` # ```
struct MapInsteadOfBlock < Base class MapInsteadOfBlock < Base
properties do properties do
description "Identifies usage of `join/sum/product` calls that follow `map`." description "Identifies usage of `join/sum/product` calls that follow `map`."
end end

View file

@ -30,7 +30,7 @@ module Ameba::Rule::Performance
# - select # - select
# - reject # - reject
# ``` # ```
struct SizeAfterFilter < Base class SizeAfterFilter < Base
properties do properties do
description "Identifies usage of `size` calls that follow filter" description "Identifies usage of `size` calls that follow filter"
filter_names : Array(String) = %w(select reject) filter_names : Array(String) = %w(select reject)

View file

@ -21,7 +21,7 @@ module Ameba::Rule::Style
# Style/ConstantNames: # Style/ConstantNames:
# Enabled: true # Enabled: true
# ``` # ```
struct ConstantNames < Base class ConstantNames < Base
properties do properties do
description "Enforces constant names to be in screaming case" description "Enforces constant names to be in screaming case"
end end

View file

@ -19,7 +19,7 @@ module Ameba::Rule::Style
# Style/IsANil: # Style/IsANil:
# Enabled: true # Enabled: true
# ``` # ```
struct IsANil < Base class IsANil < Base
properties do properties do
description "Disallows calls to `is_a?(Nil)` in favor of `nil?`" description "Disallows calls to `is_a?(Nil)` in favor of `nil?`"
end end

View file

@ -26,7 +26,7 @@ module Ameba::Rule::Style
# Enabled: true # Enabled: true
# IntMinDigits: 5 # i.e. integers higher than 9999 # IntMinDigits: 5 # i.e. integers higher than 9999
# ``` # ```
struct LargeNumbers < Base class LargeNumbers < Base
properties do properties do
enabled false enabled false
description "Disallows usage of large numbers without underscore" description "Disallows usage of large numbers without underscore"

View file

@ -37,7 +37,7 @@ module Ameba::Rule::Style
# Style/MethodNames: # Style/MethodNames:
# Enabled: true # Enabled: true
# ``` # ```
struct MethodNames < Base class MethodNames < Base
properties do properties do
description "Enforces method names to be in underscored case" description "Enforces method names to be in underscored case"
end end

View file

@ -26,7 +26,7 @@ module Ameba::Rule::Style
# Style/NegatedConditionsInUnless: # Style/NegatedConditionsInUnless:
# Enabled: true # Enabled: true
# ``` # ```
struct NegatedConditionsInUnless < Base class NegatedConditionsInUnless < Base
properties do properties do
description "Disallows negated conditions in unless" description "Disallows negated conditions in unless"
end end

View file

@ -28,7 +28,7 @@ module Ameba::Rule::Style
# Style/PredicateName: # Style/PredicateName:
# Enabled: true # Enabled: true
# ``` # ```
struct PredicateName < Base class PredicateName < Base
properties do properties do
enabled false enabled false
description "Disallows tautological predicate names" description "Disallows tautological predicate names"

View file

@ -55,7 +55,7 @@ module Ameba::Rule::Style
# Style/RedundantBegin: # Style/RedundantBegin:
# Enabled: true # Enabled: true
# ``` # ```
struct RedundantBegin < Base class RedundantBegin < Base
include AST::Util include AST::Util
properties do properties do

View file

@ -96,7 +96,7 @@ module Ameba::Rule::Style
# AllowMultiNext: true # AllowMultiNext: true
# AllowEmptyNext: true # AllowEmptyNext: true
# ``` # ```
struct RedundantNext < Base class RedundantNext < Base
properties do properties do
description "Reports redundant next expressions" description "Reports redundant next expressions"

View file

@ -93,7 +93,7 @@ module Ameba::Rule::Style
# AllowMutliReturn: true # AllowMutliReturn: true
# AllowEmptyReturn: true # AllowEmptyReturn: true
# ``` # ```
struct RedundantReturn < Base class RedundantReturn < Base
properties do properties do
description "Reports redundant return expressions" description "Reports redundant return expressions"

View file

@ -51,7 +51,7 @@ module Ameba::Rule::Style
# Style/TypeNames: # Style/TypeNames:
# Enabled: true # Enabled: true
# ``` # ```
struct TypeNames < Base class TypeNames < Base
properties do properties do
description "Enforces type names in camelcase manner" description "Enforces type names in camelcase manner"
end end

View file

@ -42,7 +42,7 @@ module Ameba::Rule::Style
# Style/UnlessElse: # Style/UnlessElse:
# Enabled: true # Enabled: true
# ``` # ```
struct UnlessElse < Base class UnlessElse < Base
properties do properties do
description "Disallows the use of an `else` block with the `unless`" description "Disallows the use of an `else` block with the `unless`"
end end

View file

@ -22,7 +22,7 @@ module Ameba::Rule::Style
# Style/VariableNames: # Style/VariableNames:
# Enabled: true # Enabled: true
# ``` # ```
struct VariableNames < Base class VariableNames < Base
properties do properties do
description "Enforces variable names to be in underscored case" description "Enforces variable names to be in underscored case"
end end

View file

@ -25,7 +25,7 @@ module Ameba::Rule::Style
# Style/WhileTrue: # Style/WhileTrue:
# Enabled: true # Enabled: true
# ``` # ```
struct WhileTrue < Base class WhileTrue < Base
properties do properties do
description "Disallows while statements with a true literal as condition" description "Disallows while statements with a true literal as condition"
end end