2017-10-26 17:47:42 +00:00
< p align = "center" >
2019-07-20 12:04:36 +00:00
< img src = "https://raw.githubusercontent.com/veelenga/bin/master/ameba/logo.png" width = "800" >
2017-10-26 17:47:42 +00:00
< h3 align = "center" > Ameba< / h3 >
< p align = "center" > Code style linter for Crystal< p >
< p align = "center" >
< sup >
2021-01-26 06:38:19 +00:00
< i > (a single-celled animal that catches food and moves about by extending fingerlike projections of protoplasm)< / i >
2017-10-26 17:47:42 +00:00
< / sup >
< / p >
2017-10-30 20:10:03 +00:00
< p align = "center" >
2021-01-11 17:21:32 +00:00
< a href = "https://github.com/crystal-ameba/ameba/actions?query=workflow%3ACI" > < img src = "https://github.com/crystal-ameba/ameba/workflows/CI/badge.svg" > < / a >
2019-07-20 12:18:35 +00:00
< a href = "https://github.com/crystal-ameba/ameba/releases" > < img src = "https://img.shields.io/github/release/crystal-ameba/ameba.svg?maxAge=360" > < / a >
< a href = "https://github.com/crystal-ameba/ameba/blob/master/LICENSE" > < img src = "https://img.shields.io/github/license/crystal-ameba/ameba.svg" > < / a >
2017-11-02 08:39:29 +00:00
< 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 >
2019-11-09 17:31:41 +00:00
- [About ](#about )
- [Usage ](#usage )
2021-04-12 17:52:59 +00:00
* [Watch a tutorial ](#watch-a-tutorial )
2019-11-09 17:31:41 +00:00
* [Run in parallel ](#run-in-parallel )
- [Installation ](#installation )
* [As a project dependency: ](#as-a-project-dependency )
* [OS X ](#os-x )
* [Docker ](#docker )
* [From sources ](#from-sources )
- [Configuration ](#configuration )
2020-03-22 12:58:10 +00:00
* [Sources ](#sources )
* [Rules ](#rules )
* [Explain issues ](#explain-issues )
2019-11-09 17:31:41 +00:00
* [Inline disabling ](#inline-disabling )
2019-11-25 12:11:17 +00:00
- [Editors & integrations ](#editors--integrations )
2019-11-09 17:31:41 +00:00
- [Credits & inspirations ](#credits--inspirations )
- [Contributors ](#contributors )
2017-11-01 17:14:38 +00:00
## About
2017-10-26 17:47:42 +00:00
2017-11-17 18:28:45 +00:00
Ameba is a static code analysis tool for the Crystal language.
2021-01-26 06:38:19 +00:00
It enforces a consistent [Crystal code style ](https://crystal-lang.org/reference/conventions/coding_style.html ),
2017-11-17 18:28:45 +00:00
also catches code smells and wrong code constructions.
2019-07-20 12:18:35 +00:00
See also [Roadmap ](https://github.com/crystal-ameba/ameba/wiki ).
2018-05-13 19:00:08 +00:00
2018-05-08 21:28:06 +00:00
## Usage
Run `ameba` binary within your project directory to catch code issues:
```sh
$ ameba
2021-01-26 06:38:19 +00:00
Inspecting 107 files
2018-05-08 21:28:06 +00:00
2018-05-14 13:28:46 +00:00
...............F.....................F....................................................................
2018-05-08 21:28:06 +00:00
2018-12-12 19:45:00 +00:00
src/ameba/formatter/flycheck_formatter.cr:4:33
2019-04-14 16:37:03 +00:00
[W] Lint/UnusedArgument: Unused argument `location`
2018-12-12 19:45:00 +00:00
> source.issues.each do |e, location|
^
src/ameba/formatter/base_formatter.cr:12:7
2019-04-14 16:37:03 +00:00
[W] Lint/UselessAssign: Useless assignment to variable `s`
2018-12-12 19:45:00 +00:00
> return s += issues.size
^
2017-11-17 18:28:45 +00:00
2018-12-12 19:45:00 +00:00
Finished in 542.64 milliseconds
2021-01-26 06:38:19 +00:00
129 inspected, 2 failures
2018-05-08 21:28:06 +00:00
```
2017-11-01 17:14:38 +00:00
2021-04-12 17:52:59 +00:00
### Watch a tutorial
< a href = "https://luckycasts.com/videos/ameba" > < img src = "https://i.imgur.com/uOETQlM.png" title = "Write Better Crystal Code with the Ameba Shard" width = "500" / > < / a >
2021-04-13 13:08:30 +00:00
[🎬 Watch the LuckyCast showing how to use Ameba ](https://luckycasts.com/videos/ameba )
2021-04-12 17:52:59 +00:00
2019-11-09 17:31:41 +00:00
### Run in parallel
Starting from 0.31.0 Crystal [supports parallelism ](https://crystal-lang.org/2019/09/06/parallelism-in-crystal.html ).
It allows to run linting in parallel too.
In order to take advantage of this feature you need to build ameba with preview_mt support:
2019-11-25 12:08:22 +00:00
```sh
2019-11-09 17:31:41 +00:00
$ crystal build src/cli.cr -Dpreview_mt -o bin/ameba
$ make install
```
Some quick benchmark results measured while running Ameba on Crystal repo:
2019-11-25 12:08:22 +00:00
```sh
2019-11-09 17:31:41 +00:00
$ CRYSTAL_WORKERS=1 ameba #=> 29.11 seconds
$ CRYSTAL_WORKERS=2 ameba #=> 19.49 seconds
$ CRYSTAL_WORKERS=4 ameba #=> 13.48 seconds
$ CRYSTAL_WORKERS=8 ameba #=> 10.14 seconds
```
2017-10-26 16:46:58 +00:00
## Installation
2017-11-14 18:52:15 +00:00
### As a project dependency:
2017-10-26 16:46:58 +00:00
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:
2019-07-20 12:18:35 +00:00
github: crystal-ameba/ameba
2020-10-17 10:45:54 +00:00
version: ~> 0.13.0
2017-10-26 16:46:58 +00:00
```
2018-04-11 09:38:36 +00:00
Build `bin/ameba` binary within your project directory while running `shards install` .
2017-11-16 08:18:11 +00:00
2017-11-17 18:28:45 +00:00
You may also want to use it on [Travis ](travis-ci.org ):
2017-11-16 08:18:11 +00:00
```yaml
2017-11-17 18:28:45 +00:00
# .travis.yml
2017-11-16 08:18:11 +00:00
language: crystal
install:
2018-04-11 09:38:36 +00:00
- shards install
2017-11-16 08:18:11 +00:00
script:
- crystal spec
2019-07-18 10:53:04 +00:00
- crystal bin/ameba.cr
2017-11-16 08:18:11 +00:00
```
2017-11-14 18:52:15 +00:00
2017-11-17 18:58:52 +00:00
Using this config Ameba will inspect files just after the specs run. Travis will also fail
2017-11-17 18:28:45 +00:00
the build if some problems detected.
2017-11-14 18:52:15 +00:00
### OS X
2017-11-14 23:02:07 +00:00
```sh
2017-11-14 18:52:15 +00:00
$ brew tap veelenga/tap
$ brew install ameba
```
2018-08-25 10:55:07 +00:00
### Docker
Build the image:
```sh
2020-08-26 19:54:29 +00:00
$ docker build -t crystal-ameba/ameba .
2018-08-25 10:55:07 +00:00
```
To use the resulting image on a local source folder, mount the current (or target) directory into `/src` :
```sh
2020-08-26 19:54:29 +00:00
$ docker run -v $(pwd):/src crystal-ameba/ameba
2018-08-25 10:55:07 +00:00
```
2020-08-26 20:05:59 +00:00
Also available on DockerHub: https://hub.docker.com/r/veelenga/ameba
2017-11-14 18:52:15 +00:00
### From sources
2017-10-26 16:46:58 +00:00
2017-11-14 23:02:07 +00:00
```sh
2019-07-20 12:18:35 +00:00
$ git clone https://github.com/crystal-ameba/ameba & & cd ameba
2017-11-14 18:52:15 +00:00
$ make install
```
2017-10-26 16:46:58 +00:00
2017-11-14 07:24:36 +00:00
## Configuration
2017-11-17 18:28:45 +00:00
Default configuration file is `.ameba.yml` .
2017-12-01 17:00:11 +00:00
It allows to configure rule properties, disable specific rules and exclude sources from the rules.
Generate new file by running `ameba --gen-config` .
2017-11-14 07:24:36 +00:00
2020-03-22 12:58:10 +00:00
### Sources
**List of sources to run Ameba on can be configured globally via:**
- `Globs` section - an array of wildcards (or paths) to include to the
inspection. Defaults to `%w(**/*.cr !lib)` , meaning it includes all project
files with `*.cr` extension except those which exist in `lib` folder.
- `Excluded` section - an array of wildcards (or paths) to exclude from the
source list defined by `Globs` . Defaults to an empty array.
In this example we define default globs and exclude `src/compiler` folder:
``` yaml
Globs:
- **/*.cr
- !lib
2021-01-11 17:21:32 +00:00
2020-03-22 12:58:10 +00:00
Excluded:
- src/compiler
```
**Specific sources can be excluded at rule level**:
``` yaml
Style/RedundantBegin:
Excluded:
- src/server/processor.cr
- src/server/api.cr
```
### Rules
2018-06-18 07:25:06 +00:00
One or more rules, or a one or more group of rules can be included or excluded
via command line arguments:
2019-11-25 12:08:22 +00:00
```sh
2018-06-18 07:25:06 +00:00
$ ameba --only Lint/Syntax # runs only Lint/Syntax rule
$ ameba --only Style,Lint # runs only rules from Style and Lint groups
$ ameba --except Lint/Syntax # runs all rules except Lint/Syntax
$ ameba --except Style,Lint # runs all rules except rules in Style and Lint groups
```
2020-03-22 12:58:10 +00:00
Or through the configuration file:
``` yaml
Style/RedundantBegin:
Enabled: false
```
### Explain issues
2018-12-27 21:34:10 +00:00
Ameba allows you to dig deeper into an issue, by showing you details about the issue
and the reasoning by it being reported.
To be convenient, you can just copy-paste the `PATH:line:column` string from the
report and paste behind the `ameba` command to check it out.
2019-11-25 12:08:22 +00:00
```sh
2018-12-27 21:34:10 +00:00
$ ameba crystal/command/format.cr:26:83 # show explanation for the issue
$ ameba --explain crystal/command/format.cr:26:83 # same thing
```
2018-01-29 22:25:36 +00:00
### Inline disabling
2018-06-23 13:52:48 +00:00
One or more rules or one or more group of rules can be disabled using inline directives:
2018-01-29 22:25:36 +00:00
```crystal
2018-06-16 11:50:59 +00:00
# ameba:disable Style/LargeNumbers
2018-01-29 22:25:36 +00:00
time = Time.epoch(1483859302)
2018-06-23 13:52:48 +00:00
time = Time.epoch(1483859302) # ameba:disable Style/LargeNumbers, Lint/UselessAssign
time = Time.epoch(1483859302) # ameba:disable Style, Lint
2018-01-29 22:25:36 +00:00
```
2019-11-25 12:11:17 +00:00
## Editors & integrations
2018-01-24 13:23:00 +00:00
2019-01-29 10:52:31 +00:00
* Vim: [vim-crystal ](https://github.com/rhysd/vim-crystal ), [Ale ](https://github.com/w0rp/ale )
2019-07-20 12:18:35 +00:00
* Emacs: [ameba.el ](https://github.com/crystal-ameba/ameba.el )
2018-05-12 18:20:05 +00:00
* Sublime Text: [Sublime Linter Ameba ](https://github.com/epergo/SublimeLinter-contrib-ameba )
2019-07-20 12:18:35 +00:00
* VSCode: [vscode-crystal-ameba ](https://github.com/crystal-ameba/vscode-crystal-ameba )
2019-11-25 12:11:17 +00:00
* Codacy: [codacy-ameba ](https://github.com/codacy/codacy-ameba )
* GitHub Actions: [github-action ](https://github.com/crystal-ameba/github-action )
2018-01-24 13:23:00 +00:00
2017-11-17 18:28:45 +00:00
## Credits & inspirations
2019-12-15 17:09:33 +00:00
- [Crystal Language ](https://crystal-lang.org )
- [Rubocop ](https://rubocop.readthedocs.io/en/latest/ )
2017-11-17 18:28:45 +00:00
- [Credo ](http://credo-ci.org/ )
- [Dogma ](https://github.com/lpil/dogma )
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