Adjust readme

This commit is contained in:
Vitalii Elenhaupt 2017-11-17 20:28:45 +02:00
parent 0f25b50a57
commit 766bcb3dd9
No known key found for this signature in database
GPG key ID: 7558EF3A4056C706
2 changed files with 36 additions and 12 deletions

2
.gitignore vendored
View file

@ -6,3 +6,5 @@
# Libraries don't need dependency lock # Libraries don't need dependency lock
# Dependencies will be locked in application that uses them # Dependencies will be locked in application that uses them
/shard.lock /shard.lock
*.html

View file

@ -18,8 +18,19 @@
## About ## About
Ameba is a tool for enforcing a consistent Crystal code style, for catching code smells and wrong code constructions. Ameba is a static code analysis tool for the Crystal language.
Ameba's [rules](src/ameba/rules/) traverse AST and report bad parts of your code. It enforces a consistent [Crystal code style](https://crystal-lang.org/docs/conventions/coding_style.html),
also catches code smells and wrong code constructions.
## How it works
Ameba's *"fingerlike projections"* are [rules](src/rule/). Each rule makes the inspection for that or
another problem in the source code. Currently rules are able to:
- [x] simply validate lines of source code
- [x] traverse AST using [`Crystal::Visitor`](https://github.com/crystal-lang/crystal/blob/1f3e8b0e742b55c1feb5584dc932e87034365f48/src/compiler/crystal/syntax/visitor.cr)
- [x] tokenize sources using [`Crystal::Lexer`](https://github.com/crystal-lang/crystal/blob/1f3e8b0e742b55c1feb5584dc932e87034365f48/src/compiler/crystal/syntax/lexer.cr) and iterate through tokens
- [ ] do semantics analysis using [`Crystal::SemanticVisitor`](https://github.com/crystal-lang/crystal/blob/master/src/compiler/crystal/semantic/semantic_visitor.cr)
## Installation ## Installation
@ -35,9 +46,10 @@ development_dependencies:
Build `bin/ameba` binary within your project directory while running `crystal deps`. Build `bin/ameba` binary within your project directory while running `crystal deps`.
You may want also use it on [Travis](travis-ci.org): You may also want to use it on [Travis](travis-ci.org):
```yaml ```yaml
# .travis.yml
language: crystal language: crystal
install: install:
- crystal deps - crystal deps
@ -46,6 +58,9 @@ script:
- bin/ameba - bin/ameba
``` ```
Using this config Ameba will inspect files just and the specs run. Travis will also fail
the build if some problems detected.
### OS X ### OS X
```sh ```sh
@ -64,7 +79,7 @@ $ make install
Run `ameba` binary within your project directory to catch code issues: Run `ameba` binary within your project directory to catch code issues:
```sh ```
$ ameba $ ameba
Inspecting 52 files. Inspecting 52 files.
@ -86,11 +101,12 @@ Finished in 10.53 milliseconds
## Configuration ## Configuration
It is possible to configure or even disable specific rules using YAML configuration file. Default configuration file is `.ameba.yml`.
By default Ameba is looking for `.ameba.yml` in a project root directory. It allows to configure or even disable specific rules.
Copy and adjust [existed example](config/ameba.yml). Simply copy and adjust [existed sample](config/ameba.yml).
Each rule is enabled by default, even if you remove it from the config file.
## Write a new Rule ## Writing a new Rule
Adding a new rule is as simple as inheriting from `Rule::Base` struct and implementing Adding a new rule is as simple as inheriting from `Rule::Base` struct and implementing
your logic to detect a problem: your logic to detect a problem:
@ -104,24 +120,30 @@ struct DebuggerStatement < Rule::Base
# source.error rule, line_number, message # source.error rule, line_number, message
# #
def test(source) def test(source)
# This line deletegates verification to a particular AST visitor. # This line deletegates verification to a particular callback in the AST visitor.
AST::Visitor.new self, source AST::Visitor.new self, source
end end
# This method is called once the visitor finds a required node. # This method is called once the visitor finds a needed node.
def test(source, node : Crystal::Call) def test(source, node : Crystal::Call)
# It reports an error, if there is `debugger` method call # It reports an error, if there is `debugger` method call
# without arguments and a receiver. That's it, somebody forgot # without arguments and a receiver. That's it, somebody forgot
# to remove a debugger statement. # to remove a debugger statement.
return unless node.name == "debugger" && node.args.empty? && node.obj.nil? return unless node.name == "debugger" && node.args.empty? && node.obj.nil?
source.error self, node.location, source.error self, node.location, "Possible forgotten debugger statement detected"
"Possible forgotten debugger statement detected"
end end
end end
``` ```
## Credits & inspirations
- [Crystal Language](crystal-lang.org)
- [Rubocop](http://rubocop.readthedocs.io/en/latest/)
- [Credo](http://credo-ci.org/)
- [Dogma](https://github.com/lpil/dogma)
## Contributors ## Contributors
- [veelenga](https://github.com/veelenga) Vitalii Elenhaupt - creator, maintainer - [veelenga](https://github.com/veelenga) Vitalii Elenhaupt - creator, maintainer