Ameba::Rule::Base - ameba 1.6.4

# abstract class Ameba::Rule::Base

- Ameba::Rule::Base
- Reference
- Object

##
Overview

Represents a base of all rules. In other words, all rules inherits from this struct:

    class MyRule < Ameba::Rule::Base
      def test(source)
        if invalid?(source)
          issue_for line, column, "Something wrong."
        end
      end

      private def invalid?(source)
        # ...
      end
    end

Enforces rules to implement an abstract `#test` method which is designed to test the source passed in. If source has issues that are tested by this rule, it should add an issue.

##
Included Modules

- Ameba::Config::RuleConfig

##
Direct Known Subclasses

- Ameba::Rule::Documentation::Documentation
- Ameba::Rule::Documentation::DocumentationAdmonition
- Ameba::Rule::Layout::LineLength
- Ameba::Rule::Layout::TrailingBlankLines
- Ameba::Rule::Layout::TrailingWhitespace
- Ameba::Rule::Lint::AmbiguousAssignment
- Ameba::Rule::Lint::BadDirective
- Ameba::Rule::Lint::ComparisonToBoolean
- Ameba::Rule::Lint::DebugCalls
- Ameba::Rule::Lint::DebuggerStatement
- Ameba::Rule::Lint::DuplicatedRequire
- Ameba::Rule::Lint::EmptyEnsure
- Ameba::Rule::Lint::EmptyExpression
- Ameba::Rule::Lint::EmptyLoop
- Ameba::Rule::Lint::Formatting
- Ameba::Rule::Lint::HashDuplicatedKey
- Ameba::Rule::Lint::LiteralAssignmentsInExpressions
- Ameba::Rule::Lint::LiteralInCondition
- Ameba::Rule::Lint::LiteralInInterpolation
- Ameba::Rule::Lint::LiteralsComparison
- Ameba::Rule::Lint::MissingBlockArgument
- Ameba::Rule::Lint::NotNil
- Ameba::Rule::Lint::NotNilAfterNoBang
- Ameba::Rule::Lint::PercentArrays
- Ameba::Rule::Lint::RandZero
- Ameba::Rule::Lint::RedundantStringCoercion
- Ameba::Rule::Lint::RedundantWithIndex
- Ameba::Rule::Lint::RedundantWithObject
- Ameba::Rule::Lint::ShadowedArgument
- Ameba::Rule::Lint::ShadowedException
- Ameba::Rule::Lint::ShadowingOuterLocalVar
- Ameba::Rule::Lint::SharedVarInFiber
- Ameba::Rule::Lint::SpecFilename
- Ameba::Rule::Lint::SpecFocus
- Ameba::Rule::Lint::Syntax
- Ameba::Rule::Lint::Typos
- Ameba::Rule::Lint::UnneededDisableDirective
- Ameba::Rule::Lint::UnreachableCode
- Ameba::Rule::Lint::UnusedArgument
- Ameba::Rule::Lint::UnusedBlockArgument
- Ameba::Rule::Lint::UselessAssign
- Ameba::Rule::Lint::UselessConditionInWhen
- Ameba::Rule::Metrics::CyclomaticComplexity
- Ameba::Rule::Naming::AccessorMethodName
- Ameba::Rule::Naming::AsciiIdentifiers
- Ameba::Rule::Naming::BinaryOperatorParameterName
- Ameba::Rule::Naming::BlockParameterName
- Ameba::Rule::Naming::ConstantNames
- Ameba::Rule::Naming::Filename
- Ameba::Rule::Naming::MethodNames
- Ameba::Rule::Naming::PredicateName
- Ameba::Rule::Naming::QueryBoolMethods
- Ameba::Rule::Naming::RescuedExceptionsVariableName
- Ameba::Rule::Naming::TypeNames
- Ameba::Rule::Naming::VariableNames
- Ameba::Rule::Performance::Base
- Ameba::Rule::Style::GuardClause
- Ameba::Rule::Style::IsAFilter
- Ameba::Rule::Style::IsANil
- Ameba::Rule::Style::LargeNumbers
- Ameba::Rule::Style::NegatedConditionsInUnless
- Ameba::Rule::Style::ParenthesesAroundCondition
- Ameba::Rule::Style::RedundantBegin
- Ameba::Rule::Style::RedundantNext
- Ameba::Rule::Style::RedundantReturn
- Ameba::Rule::Style::UnlessElse
- Ameba::Rule::Style::VerboseBlock
- Ameba::Rule::Style::WhileTrue

##
Defined in:

ameba/rule/base.cr

##
Constant Summary

GROUP_SEVERITY = `{ Documentation: Ameba::Severity::Warning, Lint: Ameba::Severity::Warning, Metrics: Ameba::Severity::Warning, Performance: Ameba::Severity::Warning, }`

##
Class Method Summary

- .default_severity : Ameba::Severity

##
Macro Summary

- issue_for(*args, **kwargs, &block)

  Adds an issue to the source

##
Instance Method Summary

- #==(other)

  Returns `false` (other can only be a `Value` here).

- #catch(source : Source)

  A convenient addition to `#test` method that does the same but returns a passed in `source` as an addition.

- #excluded?(source)

  Checks whether the source is excluded from this rule.

- #group

  Returns a group this rule belong to.

- #hash

  Generates an `UInt64` hash value for this object.

- #name

  Returns a name of this rule, which is basically a class name.

- #special?

  Returns `true` if this rule is special and behaves differently than usual rules.

- #test(source : Source, node : Crystal::ASTNode, *opts)

  NOTE Can't be abstract

- #test(source : Source)

  This method is designed to test the source passed in.

### Macros inherited from module `Ameba::Config::RuleConfig`

properties(&block) properties

##
Class Method Detail

def self.default_severity : Ameba::Severity #

##
Macro Detail

macro issue_for(*args, **kwargs, &block) #

Adds an issue to the source

##
Instance Method Detail

def ==(other) #
Description copied from class Reference

Returns `false` (other can only be a `Value` here).

def catch(source : Source) #

A convenient addition to `#test` method that does the same but returns a passed in `source` as an addition.

    source = MyRule.new.catch(source)
    source.valid?

def excluded?(source) #

Checks whether the source is excluded from this rule. It searches for a path in `excluded` property which matches the one of the given source.

    my_rule.excluded?(source) # => true or false

def group #

Returns a group this rule belong to.

    class MyGroup::MyRule < Ameba::Rule::Base
      # ...
    end

    MyGroup::MyRule.new.group # => "MyGroup"

def hash #
Description copied from class Object

Generates an `UInt64` hash value for this object.

This method must have the property that `a == b` implies `a.hash == b.hash`.

The hash value is used along with `#==` by the `Hash` class to determine if two objects reference the same hash key.

Subclasses must not override this method. Instead, they must define `hash(hasher)`, though usually the macro `def_hash` can be used to generate this method.

def name #

Returns a name of this rule, which is basically a class name.

    class MyRule < Ameba::Rule::Base
      def test(source)
      end
    end

    MyRule.new.name # => "MyRule"

def special? #

Returns `true` if this rule is special and behaves differently than usual rules.

    my_rule.special? # => true or false

def test(source : Source, node : Crystal::ASTNode, *opts) #

NOTE Can't be abstract

def test(source : Source) #

This method is designed to test the source passed in. If source has issues that are tested by this rule, it should add an issue.

By default it uses a node visitor to traverse all the nodes in the source.

NOTE Must be overridden for other type of rules.