lint_trap 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +97 -0
- data/Dockerfile +222 -0
- data/Gemfile +2 -0
- data/Rakefile +45 -0
- data/circle.yml +22 -0
- data/config/checkstyle/checkstyle_logger-all.jar +0 -0
- data/config/checkstyle/sun_checks.xml +177 -0
- data/config/coffeelint/lint_trap.coffee +12 -0
- data/config/jshint/formatter.js +22 -0
- data/config/rubocop/formatter.rb +22 -0
- data/config/scsslint/scsslint +34 -0
- data/lib/lint_trap/command.rb +39 -0
- data/lib/lint_trap/container/base.rb +30 -0
- data/lib/lint_trap/container/docker.rb +46 -0
- data/lib/lint_trap/container/fake.rb +28 -0
- data/lib/lint_trap/language/base.rb +18 -0
- data/lib/lint_trap/language/coffeescript.rb +13 -0
- data/lib/lint_trap/language/cpp.rb +17 -0
- data/lib/lint_trap/language/css.rb +13 -0
- data/lib/lint_trap/language/go.rb +13 -0
- data/lib/lint_trap/language/java.rb +13 -0
- data/lib/lint_trap/language/javascript.rb +13 -0
- data/lib/lint_trap/language/json.rb +13 -0
- data/lib/lint_trap/language/python.rb +13 -0
- data/lib/lint_trap/language/ruby.rb +13 -0
- data/lib/lint_trap/language/scss.rb +13 -0
- data/lib/lint_trap/language.rb +50 -0
- data/lib/lint_trap/linter/base.rb +58 -0
- data/lib/lint_trap/linter/checkstyle.rb +24 -0
- data/lib/lint_trap/linter/coffeelint.rb +21 -0
- data/lib/lint_trap/linter/cppcheck.rb +18 -0
- data/lib/lint_trap/linter/csslint.rb +23 -0
- data/lib/lint_trap/linter/golint.rb +19 -0
- data/lib/lint_trap/linter/jshint.rb +20 -0
- data/lib/lint_trap/linter/jsonlint.rb +18 -0
- data/lib/lint_trap/linter/pylint.rb +19 -0
- data/lib/lint_trap/linter/rubocop.rb +22 -0
- data/lib/lint_trap/linter/scsslint.rb +22 -0
- data/lib/lint_trap/linter.rb +42 -0
- data/lib/lint_trap/{parsers/base_parser.rb → parser/base.rb} +8 -9
- data/lib/lint_trap/{parsers/csslint_parser.rb → parser/csslint.rb} +4 -5
- data/lib/lint_trap/{parsers/line_parser.rb → parser/line.rb} +14 -5
- data/lib/lint_trap/parser/standard.rb +22 -0
- data/lib/lint_trap/parser/vim_quickfix.rb +19 -0
- data/lib/lint_trap/version.rb +1 -1
- data/lib/lint_trap.rb +5 -14
- data/lint_trap.gemspec +3 -0
- data/spec/command_spec.rb +38 -0
- data/spec/container/docker_spec.rb +34 -0
- data/spec/container/fake_spec.rb +29 -0
- data/spec/fixtures/Good.java +6 -0
- data/spec/fixtures/bad.coffee +1 -0
- data/spec/fixtures/bad.cpp +5 -0
- data/spec/fixtures/bad.css +4 -0
- data/spec/fixtures/bad.go +7 -0
- data/spec/fixtures/bad.java +3 -0
- data/spec/fixtures/bad.js +3 -0
- data/spec/fixtures/bad.json +4 -0
- data/spec/fixtures/bad.py +2 -0
- data/spec/fixtures/bad.rb +4 -0
- data/spec/fixtures/bad.scss +3 -0
- data/spec/fixtures/good.coffee +1 -0
- data/spec/fixtures/good.cpp +4 -0
- data/spec/fixtures/good.css +3 -0
- data/spec/fixtures/good.go +7 -0
- data/spec/fixtures/good.js +5 -0
- data/spec/fixtures/good.json +4 -0
- data/spec/fixtures/good.py +6 -0
- data/spec/fixtures/good.rb +5 -0
- data/spec/fixtures/good.scss +3 -0
- data/spec/fixtures/lint.txt +1 -0
- data/spec/integration/checkstyle_spec.rb +52 -0
- data/spec/integration/coffeelint_spec.rb +44 -0
- data/spec/integration/cppcheck_spec.rb +60 -0
- data/spec/integration/csslint_spec.rb +44 -0
- data/spec/integration/golint_spec.rb +44 -0
- data/spec/integration/jshint_spec.rb +70 -0
- data/spec/integration/jsonlint_spec.rb +60 -0
- data/spec/integration/pylint_spec.rb +51 -0
- data/spec/integration/rubocop_spec.rb +52 -0
- data/spec/integration/scsslint_spec.rb +44 -0
- data/spec/language/coffeescript_spec.rb +8 -0
- data/spec/language/cpp_spec.rb +8 -0
- data/spec/language/css_spec.rb +8 -0
- data/spec/language/go_spec.rb +8 -0
- data/spec/language/java_spec.rb +8 -0
- data/spec/language/javascript_spec.rb +8 -0
- data/spec/language/json_spec.rb +8 -0
- data/spec/language/python_spec.rb +8 -0
- data/spec/language/ruby_spec.rb +8 -0
- data/spec/language/scss_spec.rb +8 -0
- data/spec/language_spec.rb +143 -0
- data/spec/lint_trap_spec.rb +0 -16
- data/spec/linter/checkstyle_spec.rb +45 -0
- data/spec/linter/coffeelint_spec.rb +46 -0
- data/spec/linter/cppcheck_spec.rb +26 -0
- data/spec/linter/csslint_spec.rb +44 -0
- data/spec/linter/golint_spec.rb +22 -0
- data/spec/linter/jshint_spec.rb +44 -0
- data/spec/linter/jsonlint_spec.rb +22 -0
- data/spec/linter/pylint_spec.rb +46 -0
- data/spec/linter/rubocop_spec.rb +48 -0
- data/spec/linter/scsslint_spec.rb +44 -0
- data/spec/linter_spec.rb +67 -0
- data/spec/parser/csslint_spec.rb +25 -0
- data/spec/{parsers/standard_parser_spec.rb → parser/standard_spec.rb} +4 -3
- data/spec/{parsers/vim_quickfix_parser_spec.rb → parser/vim_quickfix_spec.rb} +5 -4
- data/spec/spec_helper.rb +8 -0
- data/spec/support/fixture_file_helper.rb +8 -0
- metadata +193 -18
- data/lib/lint_trap/parser_factory.rb +0 -32
- data/lib/lint_trap/parsers/null_parser.rb +0 -11
- data/lib/lint_trap/parsers/standard_parser.rb +0 -23
- data/lib/lint_trap/parsers/vim_quickfix_parser.rb +0 -20
- data/spec/parser_factory_spec.rb +0 -17
- data/spec/parsers/csslint_parser_spec.rb +0 -26
@@ -0,0 +1,39 @@
|
|
1
|
+
require_relative 'container/fake'
|
2
|
+
require 'open3'
|
3
|
+
|
4
|
+
module LintTrap
|
5
|
+
# Wraps the execution of linter commands
|
6
|
+
class Command
|
7
|
+
attr_reader :binary
|
8
|
+
|
9
|
+
def initialize(binary, flags, files)
|
10
|
+
@binary = binary
|
11
|
+
@flags = flags
|
12
|
+
@files = files
|
13
|
+
end
|
14
|
+
|
15
|
+
def run(container)
|
16
|
+
Bundler.with_clean_env do
|
17
|
+
puts command(container) if ENV['DEBUG_LINTING']
|
18
|
+
Open3.popen3(command(container)) do |_, stdout, _, thread|
|
19
|
+
yield stdout
|
20
|
+
|
21
|
+
thread.join
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def command(container = LintTrap::Container::Fake.new)
|
27
|
+
container.wrap("#{binary} #{flags} #{files(container)} 2>&1")
|
28
|
+
end
|
29
|
+
alias_method :to_s, :command
|
30
|
+
|
31
|
+
def files(container = LintTrap::Container::Fake.new)
|
32
|
+
Shellwords.join(@files.map{|file| container.container_path(file)})
|
33
|
+
end
|
34
|
+
|
35
|
+
def flags
|
36
|
+
@flags.join(' ')
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'pathname'
|
2
|
+
|
3
|
+
module LintTrap
|
4
|
+
module Container
|
5
|
+
class Base
|
6
|
+
LOCAL_CONFIG_PATH = Pathname.new(File.expand_path('../../../../config', __FILE__))
|
7
|
+
|
8
|
+
def initialize(image, repo_path)
|
9
|
+
@image = image
|
10
|
+
@repo_path = Pathname.new(repo_path)
|
11
|
+
end
|
12
|
+
|
13
|
+
def wrap(_command)
|
14
|
+
raise NotImplementedError
|
15
|
+
end
|
16
|
+
|
17
|
+
def config_path(_path)
|
18
|
+
raise NotImplementedError
|
19
|
+
end
|
20
|
+
|
21
|
+
def file_path(_path)
|
22
|
+
raise NotImplementedError
|
23
|
+
end
|
24
|
+
|
25
|
+
protected
|
26
|
+
|
27
|
+
attr_reader :image, :repo_path
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require_relative 'base'
|
2
|
+
require 'pathname'
|
3
|
+
|
4
|
+
module LintTrap
|
5
|
+
module Container
|
6
|
+
# Acts like a container, without actually requiring a container.
|
7
|
+
class Docker < Base
|
8
|
+
CONFIG_PATH = Pathname.new('/opt/lint_trap/config')
|
9
|
+
CODE_PATH = Pathname.new('/home/spin_cycle')
|
10
|
+
|
11
|
+
def wrap(command)
|
12
|
+
"docker run #{flags} #{image} #{command}"
|
13
|
+
end
|
14
|
+
|
15
|
+
def config_path(path)
|
16
|
+
CONFIG_PATH.join(path).to_s
|
17
|
+
end
|
18
|
+
|
19
|
+
def local_path(path)
|
20
|
+
relative_path = Pathname.new(path).relative_path_from(CODE_PATH)
|
21
|
+
|
22
|
+
repo_path.join(relative_path).to_s
|
23
|
+
end
|
24
|
+
|
25
|
+
def container_path(path)
|
26
|
+
relative_path = Pathname.new(path).relative_path_from(repo_path)
|
27
|
+
|
28
|
+
CODE_PATH.join(relative_path).to_s
|
29
|
+
end
|
30
|
+
|
31
|
+
private
|
32
|
+
|
33
|
+
def flags
|
34
|
+
[
|
35
|
+
# '-m', '50m', # memory
|
36
|
+
# '-c', '1', # number of cpus
|
37
|
+
'--privileged=false',
|
38
|
+
'-v', "#{LOCAL_CONFIG_PATH}:#{CONFIG_PATH}",
|
39
|
+
'-v', "#{repo_path}:#{CODE_PATH}",
|
40
|
+
"--workdir=#{CODE_PATH}",
|
41
|
+
'--user=spin_cycle'
|
42
|
+
].join(' ')
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require_relative 'base'
|
2
|
+
|
3
|
+
module LintTrap
|
4
|
+
module Container
|
5
|
+
# Acts like a container, without actually requiring a container.
|
6
|
+
class Fake < Base
|
7
|
+
def initialize
|
8
|
+
super('no/image', 'local')
|
9
|
+
end
|
10
|
+
|
11
|
+
def wrap(command)
|
12
|
+
command
|
13
|
+
end
|
14
|
+
|
15
|
+
def config_path(path)
|
16
|
+
LOCAL_CONFIG_PATH.join(path).to_s
|
17
|
+
end
|
18
|
+
|
19
|
+
def container_path(path)
|
20
|
+
path
|
21
|
+
end
|
22
|
+
|
23
|
+
def local_path(path)
|
24
|
+
path
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module LintTrap
|
2
|
+
module Language
|
3
|
+
# Interface for languages
|
4
|
+
class Base
|
5
|
+
def self.canonical_name
|
6
|
+
name.split('::').last
|
7
|
+
end
|
8
|
+
|
9
|
+
def name
|
10
|
+
self.class.canonical_name
|
11
|
+
end
|
12
|
+
|
13
|
+
def linters
|
14
|
+
raise NotImplementedError, 'Must define what linters this language supports.'
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
require 'linguist'
|
2
|
+
|
3
|
+
require_relative 'language/coffeescript'
|
4
|
+
require_relative 'language/cpp'
|
5
|
+
require_relative 'language/css'
|
6
|
+
require_relative 'language/go'
|
7
|
+
require_relative 'language/java'
|
8
|
+
require_relative 'language/javascript'
|
9
|
+
require_relative 'language/json'
|
10
|
+
require_relative 'language/python'
|
11
|
+
require_relative 'language/ruby'
|
12
|
+
require_relative 'language/scss'
|
13
|
+
|
14
|
+
module LintTrap
|
15
|
+
# Language lookup
|
16
|
+
module Language
|
17
|
+
@languages = {}
|
18
|
+
|
19
|
+
class << self
|
20
|
+
def register(language)
|
21
|
+
languages[language.canonical_name] = language
|
22
|
+
end
|
23
|
+
|
24
|
+
def detect(file)
|
25
|
+
language = Linguist::FileBlob.new(file).language
|
26
|
+
|
27
|
+
find(language.name)
|
28
|
+
end
|
29
|
+
|
30
|
+
def find(name)
|
31
|
+
languages[name]
|
32
|
+
end
|
33
|
+
|
34
|
+
protected
|
35
|
+
|
36
|
+
attr_reader :languages
|
37
|
+
end
|
38
|
+
|
39
|
+
register CoffeeScript
|
40
|
+
register CPP
|
41
|
+
register CSS
|
42
|
+
register Go
|
43
|
+
register Java
|
44
|
+
register JavaScript
|
45
|
+
register JSON
|
46
|
+
register Python
|
47
|
+
register Ruby
|
48
|
+
register SCSS
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
require_relative '../parser/standard'
|
2
|
+
require_relative '../command'
|
3
|
+
|
4
|
+
module LintTrap
|
5
|
+
module Linter
|
6
|
+
# The base class for all linters. Provides a template for linter execution.
|
7
|
+
class Base
|
8
|
+
CONFIG_PATH = File.expand_path('../../../../config', __FILE__)
|
9
|
+
|
10
|
+
def self.canonical_name
|
11
|
+
name.split('::').last
|
12
|
+
end
|
13
|
+
|
14
|
+
def initialize(container:, **options)
|
15
|
+
@container = container
|
16
|
+
@options = options
|
17
|
+
end
|
18
|
+
|
19
|
+
def lint(files)
|
20
|
+
command(files).run(container) do |stdout|
|
21
|
+
parser(stdout).parse do |violation|
|
22
|
+
yield violation
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def name
|
28
|
+
self.class.canonical_name
|
29
|
+
end
|
30
|
+
|
31
|
+
protected
|
32
|
+
|
33
|
+
attr_reader :container, :options
|
34
|
+
|
35
|
+
private
|
36
|
+
|
37
|
+
def command(files)
|
38
|
+
Command.new(command_name, flags, files)
|
39
|
+
end
|
40
|
+
|
41
|
+
def parser(stdout)
|
42
|
+
LintTrap::Parser::Standard.new(stdout, container)
|
43
|
+
end
|
44
|
+
|
45
|
+
def config_path(path)
|
46
|
+
container.config_path(path)
|
47
|
+
end
|
48
|
+
|
49
|
+
def flags
|
50
|
+
raise NotImplementedError, 'Method flags must be implemented.'
|
51
|
+
end
|
52
|
+
|
53
|
+
def command_name
|
54
|
+
name.downcase
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require_relative 'base'
|
2
|
+
|
3
|
+
module LintTrap
|
4
|
+
module Linter
|
5
|
+
# Encapsulates logic specific to checkstyle command line tool.
|
6
|
+
class CheckStyle < Base
|
7
|
+
JAR = 'checkstyle/checkstyle_logger-all.jar'
|
8
|
+
CHECKS_XML = 'checkstyle/sun_checks.xml'
|
9
|
+
|
10
|
+
private
|
11
|
+
|
12
|
+
def command_name
|
13
|
+
'java'
|
14
|
+
end
|
15
|
+
|
16
|
+
def flags
|
17
|
+
[
|
18
|
+
'-jar', config_path(JAR),
|
19
|
+
'-c', options[:config] || config_path(CHECKS_XML)
|
20
|
+
]
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require_relative 'base'
|
2
|
+
|
3
|
+
module LintTrap
|
4
|
+
module Linter
|
5
|
+
# Encapsulates logic specific to coffeelint command line tool.
|
6
|
+
class CoffeeLint < Base
|
7
|
+
REPORTER = 'coffeelint/lint_trap.coffee'
|
8
|
+
|
9
|
+
private
|
10
|
+
|
11
|
+
def flags
|
12
|
+
[
|
13
|
+
"--reporter=#{config_path(REPORTER)}",
|
14
|
+
'--nocolor'
|
15
|
+
].tap do |flags|
|
16
|
+
flags.concat(["--file=#{options[:config]}"]) if options[:config]
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require_relative 'base'
|
2
|
+
|
3
|
+
module LintTrap
|
4
|
+
module Linter
|
5
|
+
# Encapsulates logic specific to cppcheck command line tool.
|
6
|
+
class CPPCheck < Base
|
7
|
+
private
|
8
|
+
|
9
|
+
def flags
|
10
|
+
[
|
11
|
+
'--enable=all',
|
12
|
+
'--error-exitcode=1',
|
13
|
+
'--template="{file}:{line}:::{id}:{severity}:{message}"'
|
14
|
+
]
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require_relative 'base'
|
2
|
+
require_relative '../parser/csslint'
|
3
|
+
|
4
|
+
module LintTrap
|
5
|
+
module Linter
|
6
|
+
# Encapsulates logic specific to csslint command line tool.
|
7
|
+
class CSSLint < Base
|
8
|
+
private
|
9
|
+
|
10
|
+
def flags
|
11
|
+
[
|
12
|
+
'--format=compact'
|
13
|
+
].tap do |flags|
|
14
|
+
flags.concat(["--config=#{options[:config]}"]) if options[:config]
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def parser(stdout)
|
19
|
+
LintTrap::Parser::CSSLint.new(stdout, container)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require_relative 'base'
|
2
|
+
require_relative '../parser/vim_quickfix'
|
3
|
+
|
4
|
+
module LintTrap
|
5
|
+
module Linter
|
6
|
+
# Encapsulates logic specific to golint command line tool.
|
7
|
+
class GoLint < Base
|
8
|
+
private
|
9
|
+
|
10
|
+
def flags
|
11
|
+
[]
|
12
|
+
end
|
13
|
+
|
14
|
+
def parser(stdout)
|
15
|
+
LintTrap::Parser::VimQuickfix.new(stdout, container)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require_relative 'base'
|
2
|
+
|
3
|
+
module LintTrap
|
4
|
+
module Linter
|
5
|
+
# Encapsulates logic specific to jshint command line tool.
|
6
|
+
class JSHint < Base
|
7
|
+
FORMATTER = 'jshint/formatter.js'
|
8
|
+
|
9
|
+
private
|
10
|
+
|
11
|
+
def flags
|
12
|
+
[
|
13
|
+
'--reporter', config_path(FORMATTER)
|
14
|
+
].tap do |flags|
|
15
|
+
flags.concat(['--config', options[:config]]) if options[:config]
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require_relative 'base'
|
2
|
+
|
3
|
+
module LintTrap
|
4
|
+
module Linter
|
5
|
+
# Encapsulates logic specific to durable-json-lint command line tool.
|
6
|
+
class JSONLint < Base
|
7
|
+
private
|
8
|
+
|
9
|
+
def command_name
|
10
|
+
'durable-json-lint'
|
11
|
+
end
|
12
|
+
|
13
|
+
def flags
|
14
|
+
['--format', '{{file}}:{{line}}:{{column}}:::error:{{{description}}}']
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require_relative 'base'
|
2
|
+
|
3
|
+
module LintTrap
|
4
|
+
module Linter
|
5
|
+
# Encapsulates logic specific to pylint command line tool.
|
6
|
+
class PyLint < Base
|
7
|
+
private
|
8
|
+
|
9
|
+
def flags
|
10
|
+
[
|
11
|
+
'-r', 'no',
|
12
|
+
'--msg-template', '"{abspath}:{line}:{column}::{symbol}:{category}:{msg}"'
|
13
|
+
].tap do |flags|
|
14
|
+
flags.concat(['--rcfile', options[:config]]) if options[:config]
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require_relative 'base'
|
2
|
+
|
3
|
+
module LintTrap
|
4
|
+
module Linter
|
5
|
+
# Encapsulates logic specific to rubocop command line tool.
|
6
|
+
class RuboCop < Base
|
7
|
+
FORMATTER = 'rubocop/formatter.rb'
|
8
|
+
|
9
|
+
private
|
10
|
+
|
11
|
+
def flags
|
12
|
+
[
|
13
|
+
'--require', config_path(FORMATTER),
|
14
|
+
'--format', 'LintTrap::Rubocop::Formatter',
|
15
|
+
'--no-color'
|
16
|
+
].tap do |flags|
|
17
|
+
flags.concat(['--config', options[:config]]) if options[:config]
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require_relative 'base'
|
2
|
+
|
3
|
+
module LintTrap
|
4
|
+
module Linter
|
5
|
+
# Encapsulates logic specific to scsslint command line tool.
|
6
|
+
class SCSSLint < Base
|
7
|
+
COMMAND = 'scsslint/scsslint'
|
8
|
+
|
9
|
+
def command_name
|
10
|
+
config_path(COMMAND)
|
11
|
+
end
|
12
|
+
|
13
|
+
def flags
|
14
|
+
[
|
15
|
+
'--format=LintTrap'
|
16
|
+
].tap do |flags|
|
17
|
+
flags.concat(['--config', options[:config]]) if options[:config]
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require_relative 'linter/checkstyle'
|
2
|
+
require_relative 'linter/coffeelint'
|
3
|
+
require_relative 'linter/cppcheck'
|
4
|
+
require_relative 'linter/csslint'
|
5
|
+
require_relative 'linter/golint'
|
6
|
+
require_relative 'linter/jshint'
|
7
|
+
require_relative 'linter/jsonlint'
|
8
|
+
require_relative 'linter/pylint'
|
9
|
+
require_relative 'linter/rubocop'
|
10
|
+
require_relative 'linter/scsslint'
|
11
|
+
|
12
|
+
module LintTrap
|
13
|
+
# Linter lookup
|
14
|
+
module Linter
|
15
|
+
@linters = {}
|
16
|
+
|
17
|
+
class << self
|
18
|
+
def register(linter)
|
19
|
+
linters[linter.canonical_name] = linter
|
20
|
+
end
|
21
|
+
|
22
|
+
def find(name)
|
23
|
+
linters[name]
|
24
|
+
end
|
25
|
+
|
26
|
+
protected
|
27
|
+
|
28
|
+
attr_reader :linters
|
29
|
+
end
|
30
|
+
|
31
|
+
register CheckStyle
|
32
|
+
register CoffeeLint
|
33
|
+
register CPPCheck
|
34
|
+
register CSSLint
|
35
|
+
register GoLint
|
36
|
+
register JSHint
|
37
|
+
register JSONLint
|
38
|
+
register PyLint
|
39
|
+
register RuboCop
|
40
|
+
register SCSSLint
|
41
|
+
end
|
42
|
+
end
|