No description
Find a file
2017-11-15 01:13:39 +02:00
bench Base YAML config loader & Ameba runner 2017-11-14 09:00:15 +02:00
bin Ameba cli & binary (#7) 2017-11-01 17:21:41 +02:00
config Document configuration properties & specs 2017-11-14 10:28:26 +02:00
spec Document configuration properties & specs 2017-11-14 10:28:26 +02:00
src v0.2.0 2017-11-14 19:40:42 +02:00
.editorconfig Hello, Ameba 2017-10-26 19:46:58 +03:00
.gitignore Ameba cli & binary (#7) 2017-11-01 17:21:41 +02:00
.travis.yml Deploy docs via travis 2017-11-15 01:13:39 +02:00
LICENSE Hello, Ameba 2017-10-26 19:46:58 +03:00
Makefile Fix travis build & new rule: constant names (#14) 2017-11-05 22:08:01 +02:00
README.md Deploy docs via travis 2017-11-15 01:13:39 +02:00
shard.yml v0.2.0 2017-11-14 19:40:42 +02:00

Ameba

Code style linter for Crystal

(a single-celled animal that catches food and moves about by extending fingerlike projections of protoplasm)

About

Ameba is a tool for enforcing a consistent Crystal code style, for catching code smells and wrong code constructions. Ameba's rules traverse AST and report bad parts of your code.

Is still under construction, compatibility may be broken 🚧

Installation

As a project dependency:

Add this to your application's shard.yml:

development_dependencies:
  ameba:
    github: veelenga/ameba

Compile and install ameba binary onto your system while running crystal deps.

OS X

$ brew tap veelenga/tap
$ brew install ameba

From sources

$ git clone https://github.com/veelenga/ameba && cd ameba
$ make install

Usage

Run ameba binary within your project directory to catch code issues:

$ ameba
Inspecting 52 files.

.........................F.......F........F.........

src/ameba/ast/traverse.cr:27:5
PredicateName: Favour method name 'node?' over 'is_node?'

src/ameba/rules/empty_expression.cr:42:7
LiteralInCondition: Literal value found in conditional

src/ameba/rules/empty_expression.cr:30:7
UnlessElse: Favour if over unless with else

Finished in 10.53 milliseconds

52 inspected, 3 failures.

Configuration

It is possible to configure or even disable specific rules using YAML configuration file. By default Ameba is looking for .ameba.yml in a project root directory. Copy and adjust existed example.

Write a new Rule

Adding a new rule is as simple as inheriting from Rule::Base struct and implementing your logic to detect a problem:

struct DebuggerStatement < Rule::Base
  # This is a required method to be implemented by the rule.
  # Source will be passed here. If rule finds an issue in this source,
  # it reports an error: 
  # 
  #   source.error rule, line_number, message
  #
  def test(source)
    # This line deletegates verification to a particular AST visitor.
    AST::Visitor.new self, source
  end

  # This method is called once the visitor finds a required node.
  def test(source, node : Crystal::Call)
    # It reports an error, if there is `debugger` method call
    # without arguments and a receiver. That's it, somebody forgot
    # to remove a debugger statement.
    return unless node.name == "debugger" && node.args.empty? && node.obj.nil?

    source.error self, node.location,
      "Possible forgotten debugger statement detected"
  end
end

Contributors

  • veelenga Vitalii Elenhaupt - creator, maintainer