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](src/ameba/rules/) traverse AST and report bad parts of your code. Is still under construction, compatibility may be broken :construction: ## Installation Add this to your application's `shard.yml`: ```yaml development_dependencies: ameba: github: veelenga/ameba ``` That will compile and install `ameba` binary onto your system. Or just compile it from sources `make install`. ## Usage Run `ameba` binary to catch code issues within you project: ```sh $ ameba Inspecting 18 files. ...............F.F 18 inspected, 2 failures. src/ameba/source.cr:26 LineLength: Line too long (82 symbols) src/ameba.cr:12 UnlessElse: Favour if over unless with else ``` ## Write a new Rule Adding a new rule is as simple as inheriting from `Rule` struct and implementing your logic to detect a problem: ```crystal struct DebuggerStatement < Rule # This is a required method to be implemented by the rule. # Source will pass here. If rule finds an issue in this source, # it adds an error: # # source.error rule, line_number, message # def test(source) # This line deletegates verification to a particular AST visitor. AST::CallVisitor.new self, source end # This method is called once our visitor finds a required node. # # It reports an error, once there is `debugger` method call # without arguments and a receiver. That's it, somebody forgot # to remove debugger statement. def test(source, node : Crystal::Call) return unless node.name == "debugger" && node.args.empty? && node.obj.nil? source.error self, node.location.try &.line_number, "Possible forgotten debugger statement detected" end end ``` ## Contributors - [veelenga](https://github.com/veelenga) Vitalii Elenhaupt - creator, maintainer