From 40278a3a911370616b44c27528564e7091c95d55 Mon Sep 17 00:00:00 2001 From: Vamshi99 Date: Mon, 8 May 2017 23:59:08 +0530 Subject: [PATCH] bears/go: Add GoMetaLinterBear Add GometalinterBear which replaces some of existing bears like errcheck, vet etc Closes https://github.com/coala/coala-bears/issues/972 --- .ci/deps.sh | 1 + bears/go/GoMetaLinterBear.py | 45 ++++++++++++++++++++++++++++++++ tests/go/GoMetaLinterBearTest.py | 40 ++++++++++++++++++++++++++++ 3 files changed, 86 insertions(+) create mode 100644 bears/go/GoMetaLinterBear.py create mode 100644 tests/go/GoMetaLinterBearTest.py diff --git a/.ci/deps.sh b/.ci/deps.sh index 34074efd63..9f77c3c981 100644 --- a/.ci/deps.sh +++ b/.ci/deps.sh @@ -19,6 +19,7 @@ go get -u sourcegraph.com/sqs/goreturns go get -u golang.org/x/tools/cmd/gotype go get -u github.com/kisielk/errcheck go get -u github.com/BurntSushi/toml/cmd/tomlv +go get -u gopkg.in/alecthomas/gometalinter.v1 # Ruby commands bundle install --path=vendor/bundle --binstubs=vendor/bin --jobs=8 --retry=3 diff --git a/bears/go/GoMetaLinterBear.py b/bears/go/GoMetaLinterBear.py new file mode 100644 index 0000000000..65456962f9 --- /dev/null +++ b/bears/go/GoMetaLinterBear.py @@ -0,0 +1,45 @@ +from coalib.bearlib.abstractions.Linter import linter +from dependency_management.requirements.GoRequirement import GoRequirement + + +@linter(executable='gometalinter.v1', + use_stdout=True, + output_format='regex', + output_regex=r'(.*):(?P\d*):(?P\d*):' + '(?P.*) \((?:\w*)\)') +class GoMetaLinterBear: + """ + Checks the ``go`` code using ``gometalinter``. This will run + some set of golang linters over each file separately. + """ + LANGUAGES = {'Go'} + REQUIREMENTS = {GoRequirement( + package='gopkg.in/alecthomas/gometalinter.v1', flag='-u')} + AUTHORS = {'The coala developers'} + AUTHORS_EMAILS = {'coala-devel@googlegroups.com'} + LICENSE = 'AGPL-3.0' + CAN_DETECT = {'Formatting', 'Syntax', 'Missing import', + 'Unused Code', 'Smell', 'Unreachable Code', 'Security'} + SEE_MORE = 'https://github.com/alecthomas/gometalinter' + + @staticmethod + def create_arguments(filename, file, config_file, + gometalinter_disable: str='', + gometalinter_enable: str='', + gometalinter_config: str=''): + """ + :param gometalinter_disable: + Disable a linter. + :param gometalinter_enable: + Enable a linter. + :param gometalinter_config: + Path to a custom configuration file. + """ + args = () + if gometalinter_disable: + args += ('--disable=' + gometalinter_disable,) + if gometalinter_enable: + args += ('--enable=' + gometalinter_enable,) + if gometalinter_config: + args += ('--config=' + gometalinter_config,) + return args diff --git a/tests/go/GoMetaLinterBearTest.py b/tests/go/GoMetaLinterBearTest.py new file mode 100644 index 0000000000..01aec537a7 --- /dev/null +++ b/tests/go/GoMetaLinterBearTest.py @@ -0,0 +1,40 @@ +from bears.go.GoMetaLinterBear import GoMetaLinterBear +from coalib.testing.LocalBearTestHelper import verify_local_bear + +good_file_errcheck = """package main +import "fmt" +func main() { + fmt.Println("Hello, Arch!") +} +""" + +bad_file_errcheck = """package main +import "os" +func main() { +f, _ := os.Open("foo") +f.Write([]byte("Hello, world.")) +f.Close() +} +""" + +good_file_imports = """package main + +import "os" + +func main() { +\tf, _ := os.Open("foo") +}""" + +bad_file_imports = """package main + + +func main() { +\tf, _ := os.Open("foo") +}""" + + +GoMetaLinterBearTest = verify_local_bear(GoMetaLinterBear, + valid_files=(good_file_errcheck, + bad_file_imports), + invalid_files=(bad_file_errcheck, + good_file_imports))