# Copyright 2013-2014 Sebastian Kreft
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

# Regular expression matchers like \d, \w, must be escaped as in \\d, \\w.
# If you need to include a string like '{}' or '{foo}', you need to double the
# braces, as in '{{}}' or '{{foo}}'. See the pylint configuration for an
# example.

# NOTE: filter are regular expressions, and for readability they are broken up
# using '>-' line folding from YAML. This means that between each line a space
# will be added.


# Python
pylint:
  extensions:
    - .py
  command: pylint
  arguments:
    - --rcfile={REPO_HOME}/script/formatting/config/pylintrc
    - --output-format=text
    - >-
      --msg-template={{abspath}}:{{line}}:{{column}}:
      [{{category}}:{{symbol}}] {{obj}}: {{msg}}
    - --reports=n
    - --verbose
  filter: >-
    ^{filename}:(?P<line>{lines}):((?P<column>\d+):)?
    \[(?P<severity>.+):(?P<message_id>\S+)\]\s+(:
    )?(?P<message>.+)$
  installation: "Run pip install pylint."

# Sample output:
# package/module.py:68:80: E501 line too long (80 > 79 characters)
pycodestyle:
  extensions:
    - .py
  command: pycodestyle
  arguments:
    - "--ignore=E121,E123,E126,E226,E24,E704,W503,E501"
    - "--max-line-length=100"
    # All exclude patterns up to 'driver_config.py' are the defaults
    - "--exclude=.svn,CVS,.bzr,.hg,.git,__pycache__,.tox,driver_config.py"
  filter: >-
    ^{filename}:(?P<line>{lines}):((?P<column>\d+):)?
    (?P<message_id>\S+) (?P<message>.+)$
  installation: "Run pip install pycodestyle."

# Java
# Sample output:
# /path_to/error.java:0: Missing package-info.java file.
# /path_to/error.java:1:7: warning: Name 'foo' must match pattern '^[A-Z][a-zA-Z0-9]*$'.
checkstyle:
  command: checkstyle
  extensions:
    - .java
  requirements:
    - java
  arguments:
    - -c
    - "{REPO_HOME}/script/formatting/config/google_checks.xml"
  filter: "{filename}:(?P<line>{lines}):((?P<column>\\d+):)? (?P<message>.+)"
  installation: >-
    sudo apt-get install checkstyle or go to
    http://checkstyle.sourceforge.net/cmdline.html

## Sample output:
## /path_to/error.java:1:  All methods are static.
## Disabled rulesets because of false positives
## rulesets/java/coupling.xml: Demeter
## rulesets/java/design.xml: Static class
## rulesets/java/optimizations.xml: Parameter could be final
## rulesets/java/junit.xml: maximum asserts, asserts should have message
#pmd:
#  command: run.sh
#  extensions:
#    - .java
#  requirements:
#    - java
#  arguments:
#    - pmd
#    - -format
#    - text
#    - -rulesets
#    - "rulesets/java/android.xml,rulesets/java/basic.xml,\
#       rulesets/java/braces.xml,rulesets/java/clone.xml,\
#       rulesets/java/codesize.xml,rulesets/java/empty.xml,\
#       rulesets/java/finalizers.xml,rulesets/java/imports.xml,\
#       rulesets/java/j2ee.xml,rulesets/java/logging-jakarta-commons.xml,\
#       rulesets/java/strictexception.xml,rulesets/java/strings.xml,\
#       rulesets/java/sunsecure.xml,rulesets/java/typeresolution.xml,\
#       rulesets/java/unnecessary.xml,rulesets/java/unusedcode.xml"
#    - -d
#  filter: "{filename}:(?P<line>{lines}):\\s+(?P<message>.+)"
#  installation: Go to http://pmd.sourceforge.net/pmd-5.1.1/installing.html
#
## JSON
## Sample output:
## Expecting property name: line 3 column 5 (char 15)
#json:
#  extensions:
#    - .json
#  command: python
#  arguments:
#    - -m
#    - json.tool
#  # enforce that here comes a colon
#  filter: >-
#    ^(?P<message>[^:]+(?=:
#    line \d+ column \d+)|No JSON object could be decoded)(:
#    line (?P<line>\d+) column (?P<column>\d+).*)?$
#  installation: Nothing else should be required.
#
## CSS
## Sample output:
## /path_to/error.css: line 3, col 2, Warning - Duplicate property 'width' found.
#csslint:
#  extensions:
#    - .css
#  command: csslint
#  arguments:
#    - "--ignore=ids,box-model,adjoining-classes,qualified-headings,\
#       unique-headings,zero-units"
#    - --format=compact
#  filter: >-
#    ^{filename}: line (?P<line>{lines}), col (?P<column>\d+)?,
#    (?P<severity>\S+) - (?P<message>.+)
#  installation: >-
#    Go to https://github.com/stubbornella/csslint/wiki/Command-line-interface
#    for installation instructions.
#
## SCSS
## Sample output:
## /path_to/error.scss:2 [W] `0px` should be written without units as `0`
#scss:
#  extensions:
#    - .scss
#  command: scss-lint
#  filter: >-
#    ^{filename}:(?P<line>{lines})(:(?P<column>\d+))?
#    \[(?P<severity>.+)\]( (?P<message_id>.+):)?
#    (?P<message>.+)
#  installation: >-
#    gem install scss-lint or go to https://github.com/causes/scss-lint
#
## Javascript
## Sample output:
## Line 1, E:0002: Missing space before "="
#gjslint:
#  extensions:
#    - .js
#  command: gjslint
#  filter: >-
#      ^Line\s+(?P<line>{lines}), (?P<severity>[^: ]+):((?P<message_id>\d+):)?
#      (?P<message>.+)
#  installation: >-
#    Run pip install
#    http://closure-linter.googlecode.com/files/closure_linter-latest.tar.gz,
#    or visit https://developers.google.com/closure/utilities/docs/linter_howto
#    for installation instructions.
#
## Sample output:
## /path_to/error.js: line 1, col 3, Use '===' to compare with ''.
#jshint:
#  extensions:
#    - .js
#  command: jshint
#  arguments:
#    - --config
#    - "{DEFAULT_CONFIGS}/jshint.json"
#  filter: >-
#    ^{filename}: line (?P<line>{lines}), col (?P<column>\d+), (?P<message>.+)
#  installation: >-
#    Visit http://www.jshint.com/install/ for installation instructions.
#
## PHP
## Sample output:
## PHP Parse error:  syntax error, unexpected 'bar' (T_STRING) in /path_to/error.php on line 3
#php:
#  extensions:
#    - .php
#  command: php
#  arguments:
#    - -l
#  filter: ^(?P<message>.*) in {filename} on line (?P<line>\d+)
#  installation: You first need to install PHP.
#
## Sample output:
## 2 | ERROR | Expected "if (...) {\n"; found "if (...) {"
#phpcs:
#  extensions:
#    - .php
#  command: phpcs
#  arguments:
#    - --report-width=1000
#    - --standard=PSR2
#  filter: >-
#    ^\s*(?P<line>{lines})\s+[|]\s+(?P<severity>\S+)\s+[|]\s+(?P<message>.+)
#  installation: >-
#    Visit https://github.com/squizlabs/PHP_CodeSniffer for installation
#    instructions
#
#
## RST
## Sample output:
## /path_to/error.rst:3: (WARNING/2) Inline interpreted text or phrase reference start-string without end-string.
#rst:
#  extensions:
#    - .rst
#  command: rst2html.py
#  filter: >-
#    ^{filename}:(?P<line>{lines}): [(](?P<severity>.+)[)] (?P<message>.+)
#  installation: Run pip install docutils.
#
## PNG
#pngcrush:
#  extensions:
#    - .png
#  command: pngcrush-linter.sh
#  requirements:
#    - pngcrush
#  filter: (?P<message>.+)$
#  installation: Run apt-get install pngcrush.
#
#optipng:
#  extensions:
#    - .png
#  command: optipng-linter.sh
#  requirements:
#    - optipng
#  filter: (?P<message>.+)$
#  installation: Run apt-get install optipng.
#
## JPEG
#jpegtran:
#  extensions:
#    - .jpg
#    - .jpeg
#  command: jpegtran-linter.sh
#  requirements:
#    - jpegtran
#  filter: (?P<message>.+)
#  installation: Run apt-get install jpegtran.
#
## SHELL scripts
## Sample output
## /path_to/error.sh: line 3: syntax error: unexpected end of file
#bash:
#  extensions:
#    - .sh
#  command: bash
#  arguments:
#    - "-n"
#  filter: >-
#    {filename}: line (?P<line>{lines}): (?P<message>.+)
#  installation: Please install bash in your system.
#
## YAML
#yaml:
#  extensions:
#    - .yaml
#    - .yml
#  command: yamllint
#  arguments:
#    - --format
#    - parsable
#    - --config-data
#    - "{{extends: default, rules: {{document-start: disable}}}}"
#  # Matches either:
#  # - syntax error, on any line
#  # - other error, on a modified line only
#  filter: >-
#    ^{filename}:(?P<line>{lines}|\d+(?=:\d+:
#    \[error\] syntax error:)):(?P<column>\d+):
#    \[(?P<severity>\S+)\] (?P<message>.+)$
#
#  installation: Run pip install yamllint.
#
## INI
#ini:
#  extensions:
#    - .ini
#    - .cfg
#  command: ini_linter.py
#  filter: (?P<message>.+)$
#  installation: ""
#
## HTML
## Sample output:
## line 2 column 1 - Warning: missing </h2> before </h3>
#tidy:
#  extensions:
#    - .html
#  command: tidy-wrapper.sh
#  requirements:
#    - tidy
#    - remove_template.py
#    - grep
#  arguments:
#    - -qe
#    - --drop-empty-elements
#    - "false"
#  installation: Visit https://w3c.github.io/tidy-html5/
#  filter: >-
#    ^line (?P<line>{lines}) column (?P<column>\d+) -
#    (?P<severity>[^:]+): (?P<message>.+)
#
## Sample output:
## 1:10: Error: Javascript ...
#html_lint:
#  extensions:
#    - .html
#  command: html_lint.py
#  arguments:
#    - --disable
#    - optional_tag
#  installation: pip install html-linter.
#  filter: >-
#    ^(?P<line>{lines}):(?P<column>\d+): (?P<severity>\S+): (?P<message>.+)
#
## Ruby
## Sample output:
## error.rb: warning: line 1, column 1: unused constant FOO
#rubylint:
#  command: ruby-lint
#  arguments:
#    - --analysis
#    - "argument_amount,loop_keywords,pedantics,shadowing_variables,\
#       unused_variables,useless_equality_checks"
#  extensions:
#    - .rb
#  # The first component is the basename, but it's not supported yet.
#  filter: >-
#    .*: (?P<severity>.+): line (?P<line>{lines}),
#    column (?P<column>\d+): (?P<message>.+)
#  installation: >-
#    sudo gem install ruby-lint (requires ruby 1.9) or visit
#    https://github.com/yorickpeterse/ruby-lint
#
#
## Sample output with the --format emacs option:
## /path_to/error.rb:1:4: C: Surrounding space missing for operator '='.
#rubocop:
#  command: rubocop
#  arguments:
#    - --format
#    - emacs
#    - --rails
#  extensions:
#    - .rb
#  # The first component is the relpath, but it's not supported yet.
#  filter: >-
#    {filename}:(?P<line>{lines}):(?P<column>\d+):
#    (?P<severity>.+): (?P<message>.+)
#  installation: >-
#    sudo gem install rubocop or visit https://github.com/bbatsov/rubocop
#
## Coffeescript
## Sample output:
## /path_to/error.coffee,4,,error,Operators must be spaced properly =.
## /path_to/error.coffee,5,,error,[stdin]:5:1: error: reserved word 'yes' can't be assigned
#coffeelint:
#  command: coffeelint
#  extensions:
#    - .coffee
#  arguments:
#    - --reporter=csv
#    - --file={DEFAULT_CONFIGS}/coffeelint.json
#  filter: >-
#    {filename},(?P<line>{lines}),.*,(?P<severity>.+),(?:\[stdin\]:\d+:(?P<column>\d+): .*: )?(?P<message>.+)
#  installation: npm install -g coffeelint
#
## C++
## Sample output:
## main.cpp:0:  No copyright message found.  You should have a line: "Copyright [year] <Copyright Owner>"  [legal/copyright] [5]
#cpplint:
#  extensions:
#    - .c
#    - .cc
#    - .cpp
#    - .c++
#    - .h
#    - .hpp
#    - .h++
#  command: cpplint
#  requirements:
#    - cpplint
#  filter: >-
#    ^{filename}:(?P<line>{lines}): (?P<message>.+) \[(?P<message_id>.+)\]
#    \[(?P<severity>\d+)\]
#  installation: "Run pip install cpplint."