Coala is a free and open-source language-independent analysis toolkit, written in Python. The primary goal of coala is to make it easier for developers to create rules, which a project's code should conform to the developer-defined rules. It has support for more than 40+ programming languages and is best for people who want their code to look good and follow good coding practices. It's been developed at https://github.com/coala/coala

Bears and coala

Coala checks the code with the help of bears, for example, the HTMLlint bear for HTML code analysis. You can define the bears you want to use in the .coafile file.

Setting up coala

The basic practice is to configure it to run with a CI, but you could initialize them with git hooks as well, provided you have coala installed on the system. I would explain how to do both.

Requirements: python >= 3.8 and pip >= 8

The simplest way to install coala is to do it system-wide, but this is generally discouraged in favor of using a virtualenv. To install the latest most stable version of coala system-wide, use:
pip3 install coala-bears
For a nightly build add a --pre to the end. This configures coala and its bears system wide.

If you want to use coala with a container then the command is:
docker run -ti -v $(pwd):/app --workdir=/app coala/base coala --version

If you want to run it on a ci as done for various ci, install a container on each build and run the above-mentioned command, the build will fail if there are any errors in the code and will pass if there aren't any errors in your code.

To setup, a .coafile create a new file without any name and with the extension of .coafile at the root of your project.
A basic .coafile can also be auto-generated. I won't step into that now but show you a basic file:

[default]
bears = SpaceConsistencyBear, LineLengthBear
files = **.html, **.yml, **.css, **.js, **.md
ignore = **.min.css, **.min.js, _site/**
max_line_length = 300
use_spaces = True
[html]
bears = HTMLLintBear, BootLintBear
files = **.html
ignore = _site/**
htmllint_ignore = indentation, optional_tag, concerns_separation, capitalization
[yaml]
bears = YAMLLintBear
files = **.yml
yamllint_config = .yamllint
[css]
bears = PHPCodeSnifferBear
files = **.css
ignore = **.min.css, _site/**
[js]
bears = JSHintBear
files = **.js
ignore = **.min.js, _site/**
environment_jquery = True
javascript_strictness = implied
[md]
bears = MarkdownBear
files = **.md

The file must be pretty clear, be sure to google for more info or ask me here.

Auto-applying patches

Coala could auto apply back patches to your code, fixing your code and this is pretty awesome, it could speed up and avoid pretty bad issues like trailing whitespaces, etc. Now to configure coala to apply patches you run additionally:

coala --apply-patches --no-orig;
coala --non-interactive

This would give you the much need comeback setup. We went further and I have made a way to apply it back when using a ci as it applies patches and never pushes it back. So, as you make a commit you modify the ci script to check for unstated changes by using git, adding a remote, and push if there are changes. This would be a sample script for Travis ci to push to gh-pages branch after a PR merge on Github:

#!/bin/bash
# Push Coala fixes back to the repo if on gh-pages branch
# only do this on gh-page branch
if [ "$TRAVIS_BRANCH" = "gh-pages" ]; then
git config --global user.email "travis@travis-ci.org"
git config --global user.name "travis"
git fetch --all --quiet
git add .
# check for staged changes
git status --porcelain|grep "M"
# if there are changes
if [ "$?" = 0 ]; then
git remote add origin-pages https://username:access_token@github.com/repository_owner/repository_name
git checkout --quiet -B gh-pages
git commit --quiet --message "Coala auto-patch"
git pull --quiet --rebase origin gh-pages
git push --quiet --set-upstream origin-pages gh-pages
echo "Coala patches have been committed to the gh-pages branch"
else
echo "No changes detected. Not creating a patch."
fi
else
echo "Not creating a patch since not on gh-pages branch."
fi

Now calling this file from your CI would be enough to push changes back, be sure to replace the needy regions!

Wrapping up, for now, hope you all had a great time...
Happy coding :)


For more on integration and automation visit Red Hat Developers product page.

Last updated: July 12, 2017