2017-10-26 17:47:42 +00:00
|
|
|
<p align="center">
|
|
|
|
<img src="https://media.githubusercontent.com/media/veelenga/bin/master/ameba/logo.png" width="200">
|
|
|
|
<h3 align="center">Ameba</h3>
|
|
|
|
<p align="center">Code style linter for Crystal<p>
|
|
|
|
<p align="center">
|
|
|
|
<sup>
|
|
|
|
<i>
|
|
|
|
(a single-celled animal that catches food and moves about by extending fingerlike projections of protoplasm)
|
|
|
|
</i>
|
|
|
|
</sup>
|
|
|
|
</p>
|
2017-10-30 20:10:03 +00:00
|
|
|
<p align="center">
|
2017-11-03 10:12:45 +00:00
|
|
|
<a href="https://travis-ci.org/veelenga/ameba"><img src="https://travis-ci.org/veelenga/ameba.svg?branch=master"></a>
|
2017-10-30 20:10:03 +00:00
|
|
|
<a href="https://github.com/veelenga/ameba/releases"><img src="https://img.shields.io/github/release/veelenga/ameba.svg?maxAge=360"></a>
|
|
|
|
<a href="https://shards.rocks/badge/github/veelenga/ameba"><img src="https://shards.rocks/badge/github/veelenga/ameba/status.svg"></a>
|
2017-11-02 08:39:29 +00:00
|
|
|
<a href="https://github.com/veelenga/ameba/blob/master/LICENSE"><img src="https://img.shields.io/github/license/veelenga/ameba.svg"></a>
|
|
|
|
<a href="https://gitter.im/veelenga/ameba?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge"><img src="https://badges.gitter.im/veelenga/ameba.svg"></a>
|
2017-10-30 20:10:03 +00:00
|
|
|
</p>
|
2017-10-26 17:47:42 +00:00
|
|
|
</p>
|
|
|
|
|
2017-11-01 17:14:38 +00:00
|
|
|
## About
|
2017-10-26 17:47:42 +00:00
|
|
|
|
2017-11-01 17:14:38 +00:00
|
|
|
Ameba is a tool for enforcing a consistent Crystal code style, for catching code smells and wrong code constructions.
|
|
|
|
Ameba's [rules](src/ameba/rules/) traverse AST and report bad parts of your code.
|
|
|
|
|
|
|
|
Is still under construction, compatibility may be broken :construction:
|
2017-10-26 16:46:58 +00:00
|
|
|
|
|
|
|
## Installation
|
|
|
|
|
|
|
|
Add this to your application's `shard.yml`:
|
|
|
|
|
|
|
|
```yaml
|
2017-10-26 17:47:42 +00:00
|
|
|
development_dependencies:
|
2017-10-26 16:46:58 +00:00
|
|
|
ameba:
|
2017-10-26 17:47:42 +00:00
|
|
|
github: veelenga/ameba
|
2017-10-26 16:46:58 +00:00
|
|
|
```
|
|
|
|
|
2017-11-01 17:14:38 +00:00
|
|
|
That will compile and install `ameba` binary onto your system.
|
2017-10-26 16:46:58 +00:00
|
|
|
|
2017-11-01 17:14:38 +00:00
|
|
|
Or just compile it from sources `make install`.
|
2017-10-26 16:46:58 +00:00
|
|
|
|
2017-11-01 17:14:38 +00:00
|
|
|
## Usage
|
|
|
|
|
|
|
|
Run `ameba` binary to catch code issues within you project:
|
2017-10-26 16:46:58 +00:00
|
|
|
|
2017-10-26 21:01:23 +00:00
|
|
|
```sh
|
2017-11-01 17:14:38 +00:00
|
|
|
$ ameba
|
2017-11-07 21:07:25 +00:00
|
|
|
Inspecting 52 files.
|
2017-10-26 21:01:23 +00:00
|
|
|
|
2017-11-07 21:07:25 +00:00
|
|
|
.........................F.......F........F.........
|
2017-10-26 21:01:23 +00:00
|
|
|
|
2017-11-07 21:07:25 +00:00
|
|
|
src/ameba/ast/traverse.cr:27:5
|
|
|
|
PredicateName: Favour method name 'node?' over 'is_node?'
|
2017-10-26 21:01:23 +00:00
|
|
|
|
2017-11-07 21:07:25 +00:00
|
|
|
src/ameba/rules/empty_expression.cr:42:7
|
|
|
|
LiteralInCondition: Literal value found in conditional
|
2017-10-26 21:01:23 +00:00
|
|
|
|
2017-11-07 21:07:25 +00:00
|
|
|
src/ameba/rules/empty_expression.cr:30:7
|
2017-10-31 20:11:49 +00:00
|
|
|
UnlessElse: Favour if over unless with else
|
2017-11-07 21:07:25 +00:00
|
|
|
|
|
|
|
Finished in 10.53 milliseconds
|
|
|
|
|
|
|
|
52 inspected, 3 failures.
|
2017-10-26 21:01:23 +00:00
|
|
|
```
|
|
|
|
|
2017-11-01 17:14:38 +00:00
|
|
|
## Write a new Rule
|
|
|
|
|
2017-11-07 21:50:25 +00:00
|
|
|
Adding a new rule is as simple as inheriting from `Rule::Base` struct and implementing
|
2017-11-01 17:14:38 +00:00
|
|
|
your logic to detect a problem:
|
2017-10-26 16:46:58 +00:00
|
|
|
|
2017-11-01 17:14:38 +00:00
|
|
|
```crystal
|
2017-11-07 21:50:25 +00:00
|
|
|
struct DebuggerStatement < Rule::Base
|
2017-11-01 17:14:38 +00:00
|
|
|
# This is a required method to be implemented by the rule.
|
2017-11-06 18:54:58 +00:00
|
|
|
# Source will be passed here. If rule finds an issue in this source,
|
|
|
|
# it reports an error:
|
2017-11-01 17:14:38 +00:00
|
|
|
#
|
|
|
|
# source.error rule, line_number, message
|
|
|
|
#
|
|
|
|
def test(source)
|
|
|
|
# This line deletegates verification to a particular AST visitor.
|
2017-11-06 18:54:58 +00:00
|
|
|
AST::Visitor.new self, source
|
2017-11-01 17:14:38 +00:00
|
|
|
end
|
|
|
|
|
2017-11-06 18:54:58 +00:00
|
|
|
# This method is called once the visitor finds a required node.
|
2017-11-01 17:14:38 +00:00
|
|
|
def test(source, node : Crystal::Call)
|
2017-11-06 18:54:58 +00:00
|
|
|
# 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.
|
2017-11-01 17:14:38 +00:00
|
|
|
return unless node.name == "debugger" && node.args.empty? && node.obj.nil?
|
|
|
|
|
2017-11-07 20:02:51 +00:00
|
|
|
source.error self, node.location,
|
2017-11-01 17:14:38 +00:00
|
|
|
"Possible forgotten debugger statement detected"
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
```
|
2017-10-26 16:46:58 +00:00
|
|
|
|
|
|
|
## Contributors
|
|
|
|
|
2017-10-26 17:47:42 +00:00
|
|
|
- [veelenga](https://github.com/veelenga) Vitalii Elenhaupt - creator, maintainer
|