lint_trap 0.0.15 → 0.0.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Rakefile +2 -1
- data/lib/lint_trap/container/base.rb +1 -0
- data/lib/lint_trap/language/base.rb +8 -6
- data/lib/lint_trap/language/coffeescript.rb +0 -3
- data/lib/lint_trap/language/cpp.rb +0 -4
- data/lib/lint_trap/language/css.rb +0 -3
- data/lib/lint_trap/language/go.rb +0 -3
- data/lib/lint_trap/language/java.rb +0 -3
- data/lib/lint_trap/language/javascript.rb +0 -3
- data/lib/lint_trap/language/json.rb +0 -3
- data/lib/lint_trap/language/python.rb +0 -3
- data/lib/lint_trap/language/ruby.rb +0 -3
- data/lib/lint_trap/language/scss.rb +0 -3
- data/lib/lint_trap/language/unknown.rb +1 -11
- data/lib/lint_trap/language.rb +6 -19
- data/lib/lint_trap/linter/base.rb +21 -19
- data/lib/lint_trap/linter/checkstyle.rb +0 -4
- data/lib/lint_trap/linter/coffeelint.rb +0 -4
- data/lib/lint_trap/linter/cppcheck.rb +0 -4
- data/lib/lint_trap/linter/csslint.rb +0 -8
- data/lib/lint_trap/linter/golint.rb +0 -8
- data/lib/lint_trap/linter/jshint.rb +0 -4
- data/lib/lint_trap/linter/jsonlint.rb +0 -4
- data/lib/lint_trap/linter/pylint.rb +0 -4
- data/lib/lint_trap/linter/rubocop.rb +0 -4
- data/lib/lint_trap/linter/scsslint.rb +0 -4
- data/lib/lint_trap/linter/unknown.rb +2 -9
- data/lib/lint_trap/linter.rb +20 -26
- data/lib/lint_trap/parser/base.rb +5 -9
- data/lib/lint_trap/parser/line.rb +6 -6
- data/lib/lint_trap/parser.rb +16 -0
- data/lib/lint_trap/registerable.rb +20 -0
- data/lib/lint_trap/registry.rb +29 -0
- data/lib/lint_trap/version.rb +2 -1
- data/lib/lint_trap.rb +1 -0
- data/lint_trap.gemspec +2 -2
- data/spec/integration/base_spec.rb +5 -1
- data/spec/integration/checkstyle_spec.rb +1 -1
- data/spec/integration/coffeelint_spec.rb +1 -1
- data/spec/integration/cppcheck_spec.rb +1 -1
- data/spec/integration/csslint_spec.rb +1 -1
- data/spec/integration/golint_spec.rb +1 -1
- data/spec/integration/jshint_spec.rb +1 -1
- data/spec/integration/jsonlint_spec.rb +1 -1
- data/spec/integration/pylint_spec.rb +1 -1
- data/spec/integration/rubocop_spec.rb +1 -1
- data/spec/integration/scsslint_spec.rb +1 -1
- data/spec/language/coffeescript_spec.rb +1 -2
- data/spec/language/cpp_spec.rb +1 -2
- data/spec/language/css_spec.rb +1 -2
- data/spec/language/go_spec.rb +1 -2
- data/spec/language/java_spec.rb +1 -2
- data/spec/language/javascript_spec.rb +1 -2
- data/spec/language/json_spec.rb +1 -2
- data/spec/language/python_spec.rb +1 -2
- data/spec/language/ruby_spec.rb +1 -2
- data/spec/language/scss_spec.rb +1 -2
- data/spec/language/unknown_spec.rb +1 -11
- data/spec/language_spec.rb +21 -2
- data/spec/linter/checkstyle_spec.rb +1 -1
- data/spec/linter/coffeelint_spec.rb +1 -1
- data/spec/linter/cppcheck_spec.rb +1 -1
- data/spec/linter/csslint_spec.rb +1 -1
- data/spec/linter/golint_spec.rb +1 -1
- data/spec/linter/jshint_spec.rb +1 -1
- data/spec/linter/jsonlint_spec.rb +1 -1
- data/spec/linter/pylint_spec.rb +1 -1
- data/spec/linter/rubocop_spec.rb +1 -1
- data/spec/linter/scsslint_spec.rb +1 -1
- data/spec/linter/unknown_spec.rb +1 -0
- data/spec/linter_spec.rb +1 -1
- data/spec/parser/base_spec.rb +3 -2
- data/spec/parser/csslint_spec.rb +2 -2
- data/spec/parser/line_spec.rb +3 -2
- data/spec/parser/standard_spec.rb +2 -2
- data/spec/parser/vim_quickfix_spec.rb +2 -2
- data/spec/registry_spec.rb +52 -0
- data/spec/support/examples/linter.rb +2 -1
- metadata +7 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5bc37f9f82c78cd395b59c6c0db07c517734a50f
|
4
|
+
data.tar.gz: d6f3c7092a1cf4118ee781126b7c4ccaddec4c5f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9587a9b916aaadb66a8e4e8144836d035fba86ba36c7aba527f3edbfd7c316f7079c8630b08c4b27d4056b5e9e994857a3bda47930d5d8a9b137589ecdf029ca
|
7
|
+
data.tar.gz: 6f1f42b7a96f2b26ca0f0f4fff5a796065439bb65117531d6ce63c4be3b709d9209498e0107f16c8d7517bb39df726bf3706de63fd7ad87ff1cd5e5e1b401f05
|
data/Rakefile
CHANGED
@@ -21,6 +21,7 @@ task :credentials do
|
|
21
21
|
end
|
22
22
|
|
23
23
|
namespace :docker do
|
24
|
+
# Common tasks performed with docker
|
24
25
|
class Docker
|
25
26
|
DOCKER_CACHE_PATH = File.expand_path('~/.docker')
|
26
27
|
DOCKER_IMAGE_PATH = File.join(DOCKER_CACHE_PATH, 'image.tar')
|
@@ -91,7 +92,7 @@ namespace :docker do
|
|
91
92
|
end
|
92
93
|
|
93
94
|
def sha
|
94
|
-
|
95
|
+
ENV['CIRCLE_SHA1'] ? ENV['CIRCLE_SHA1'] : `git rev-parse HEAD`.strip
|
95
96
|
end
|
96
97
|
end
|
97
98
|
|
@@ -2,16 +2,18 @@ module LintTrap
|
|
2
2
|
module Language
|
3
3
|
# Interface for languages
|
4
4
|
class Base
|
5
|
-
|
6
|
-
|
5
|
+
attr_reader :linters
|
6
|
+
|
7
|
+
def initialize
|
8
|
+
@linters = []
|
7
9
|
end
|
8
10
|
|
9
|
-
def
|
10
|
-
|
11
|
+
def name
|
12
|
+
self.class.name.split('::').last
|
11
13
|
end
|
12
14
|
|
13
|
-
def
|
14
|
-
|
15
|
+
def add_linter(linter)
|
16
|
+
@linters << linter
|
15
17
|
end
|
16
18
|
|
17
19
|
def ==(other)
|
@@ -5,18 +5,8 @@ module LintTrap
|
|
5
5
|
module Language
|
6
6
|
# Interface for languages
|
7
7
|
class Unknown < Base
|
8
|
-
attr_reader :name
|
9
|
-
|
10
|
-
def initialize(name = 'Unknown')
|
11
|
-
@name = name
|
12
|
-
end
|
13
|
-
|
14
8
|
def linters
|
15
|
-
|
16
|
-
end
|
17
|
-
|
18
|
-
def known?
|
19
|
-
false
|
9
|
+
[Linter::Unknown.new]
|
20
10
|
end
|
21
11
|
end
|
22
12
|
end
|
data/lib/lint_trap/language.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'linguist'
|
2
2
|
|
3
|
+
require_relative 'registerable'
|
3
4
|
require_relative 'language/coffeescript'
|
4
5
|
require_relative 'language/cpp'
|
5
6
|
require_relative 'language/css'
|
@@ -13,31 +14,16 @@ require_relative 'language/scss'
|
|
13
14
|
require_relative 'language/unknown'
|
14
15
|
|
15
16
|
module LintTrap
|
16
|
-
# Language
|
17
|
+
# Language registry
|
17
18
|
module Language
|
18
|
-
|
19
|
+
extend Registerable
|
19
20
|
|
20
21
|
class << self
|
21
|
-
def register(language_class)
|
22
|
-
language = language_class.new
|
23
|
-
languages[language.name] = language
|
24
|
-
end
|
25
|
-
|
26
22
|
def detect(file)
|
27
|
-
|
28
|
-
find(language.name)
|
29
|
-
else
|
30
|
-
Unknown.new
|
31
|
-
end
|
32
|
-
end
|
23
|
+
language = Linguist::FileBlob.new(file).language
|
33
24
|
|
34
|
-
|
35
|
-
languages[name] || Unknown.new(name)
|
25
|
+
find(language && language.name)
|
36
26
|
end
|
37
|
-
|
38
|
-
protected
|
39
|
-
|
40
|
-
attr_reader :languages
|
41
27
|
end
|
42
28
|
|
43
29
|
register CoffeeScript
|
@@ -50,5 +36,6 @@ module LintTrap
|
|
50
36
|
register Python
|
51
37
|
register Ruby
|
52
38
|
register SCSS
|
39
|
+
default Unknown
|
53
40
|
end
|
54
41
|
end
|
@@ -1,31 +1,45 @@
|
|
1
|
-
require_relative '../parser/standard'
|
2
1
|
require_relative '../command'
|
3
2
|
require_relative '../execution_error'
|
4
3
|
|
5
4
|
module LintTrap
|
6
5
|
module Linter
|
7
|
-
LintError = Class.new(ExecutionError)
|
8
|
-
|
9
6
|
# The base class for all linters. Provides a template for linter execution.
|
10
7
|
class Base
|
8
|
+
LintError = Class.new(ExecutionError)
|
9
|
+
|
11
10
|
CONFIG_PATH = File.expand_path('../../../../config', __FILE__)
|
12
11
|
|
13
|
-
|
14
|
-
|
12
|
+
attr_accessor :parser
|
13
|
+
attr_reader :languages
|
14
|
+
|
15
|
+
def initialize
|
16
|
+
@languages = []
|
17
|
+
end
|
15
18
|
|
19
|
+
def lint(files, container, options)
|
16
20
|
violations_found, remaining_output = false, ''
|
21
|
+
|
17
22
|
success = command(files, container, options).run(container) do |stdout|
|
18
|
-
remaining_output = parser(stdout, container)
|
23
|
+
remaining_output = parser.parse(stdout, container) do |violation|
|
19
24
|
violations_found = true
|
20
25
|
yield violation
|
21
26
|
end
|
22
27
|
end
|
23
28
|
|
24
|
-
if
|
29
|
+
if violations_found
|
30
|
+
false
|
31
|
+
elsif success
|
32
|
+
true
|
33
|
+
else
|
25
34
|
raise LintError.new(command(files, container, options).to_s(container), remaining_output)
|
26
35
|
end
|
27
36
|
end
|
28
37
|
|
38
|
+
def add_language(language)
|
39
|
+
@languages << language
|
40
|
+
language.add_linter(self)
|
41
|
+
end
|
42
|
+
|
29
43
|
def name
|
30
44
|
self.class.name.split('::').last
|
31
45
|
end
|
@@ -42,14 +56,6 @@ module LintTrap
|
|
42
56
|
"#{image}:#{version}"
|
43
57
|
end
|
44
58
|
|
45
|
-
def languages(*classes)
|
46
|
-
classes.map(&:new)
|
47
|
-
end
|
48
|
-
|
49
|
-
def known?
|
50
|
-
true
|
51
|
-
end
|
52
|
-
|
53
59
|
def ==(other)
|
54
60
|
return false unless other.respond_to?(:name, true)
|
55
61
|
|
@@ -66,10 +72,6 @@ module LintTrap
|
|
66
72
|
Command.new(command_name(container), flags(container, options), files)
|
67
73
|
end
|
68
74
|
|
69
|
-
def parser(stdout, container)
|
70
|
-
LintTrap::Parser::Standard.new(stdout, container)
|
71
|
-
end
|
72
|
-
|
73
75
|
def flags(_container, _options)
|
74
76
|
raise NotImplementedError, 'Must implement flags.'
|
75
77
|
end
|
@@ -5,10 +5,6 @@ module LintTrap
|
|
5
5
|
module Linter
|
6
6
|
# Encapsulates logic specific to csslint command line tool.
|
7
7
|
class CSSLint < Base
|
8
|
-
def languages
|
9
|
-
super(Language::CSS)
|
10
|
-
end
|
11
|
-
|
12
8
|
def version
|
13
9
|
'0.10.0'
|
14
10
|
end
|
@@ -22,10 +18,6 @@ module LintTrap
|
|
22
18
|
flags.concat(["--config=#{options[:config]}"]) if options[:config]
|
23
19
|
end
|
24
20
|
end
|
25
|
-
|
26
|
-
def parser(stdout, container)
|
27
|
-
LintTrap::Parser::CSSLint.new(stdout, container)
|
28
|
-
end
|
29
21
|
end
|
30
22
|
end
|
31
23
|
end
|
@@ -5,10 +5,6 @@ module LintTrap
|
|
5
5
|
module Linter
|
6
6
|
# Encapsulates logic specific to golint command line tool.
|
7
7
|
class GoLint < Base
|
8
|
-
def languages
|
9
|
-
super(Language::Go)
|
10
|
-
end
|
11
|
-
|
12
8
|
def version
|
13
9
|
LintTrap::VERSION
|
14
10
|
end
|
@@ -18,10 +14,6 @@ module LintTrap
|
|
18
14
|
def flags(_container, _options)
|
19
15
|
[]
|
20
16
|
end
|
21
|
-
|
22
|
-
def parser(stdout, container)
|
23
|
-
LintTrap::Parser::VimQuickfix.new(stdout, container)
|
24
|
-
end
|
25
17
|
end
|
26
18
|
end
|
27
19
|
end
|
@@ -4,23 +4,16 @@ module LintTrap
|
|
4
4
|
module Linter
|
5
5
|
# Encapsulates logic specific to scsslint command line tool.
|
6
6
|
class Unknown < Base
|
7
|
-
|
8
|
-
|
9
|
-
def initialize(name = 'Unknown')
|
10
|
-
@name = name
|
7
|
+
def lint(_files, _container, _options)
|
11
8
|
end
|
12
9
|
|
13
10
|
def languages
|
14
|
-
|
11
|
+
[Language::Unknown.new]
|
15
12
|
end
|
16
13
|
|
17
14
|
def version
|
18
15
|
LintTrap::VERSION
|
19
16
|
end
|
20
|
-
|
21
|
-
def known?
|
22
|
-
false
|
23
|
-
end
|
24
17
|
end
|
25
18
|
end
|
26
19
|
end
|
data/lib/lint_trap/linter.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
require_relative 'registerable'
|
1
2
|
require_relative 'linter/checkstyle'
|
2
3
|
require_relative 'linter/coffeelint'
|
3
4
|
require_relative 'linter/cppcheck'
|
@@ -11,39 +12,32 @@ require_relative 'linter/scsslint'
|
|
11
12
|
require_relative 'linter/unknown'
|
12
13
|
|
13
14
|
module LintTrap
|
14
|
-
# Linter
|
15
|
+
# Linter registry
|
15
16
|
module Linter
|
16
|
-
|
17
|
+
extend Registerable
|
17
18
|
|
18
19
|
class << self
|
19
|
-
def register(linter_class)
|
20
|
-
linter = linter_class
|
20
|
+
def register(linter_class, languages:, parser: nil)
|
21
|
+
linter = super(linter_class)
|
21
22
|
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
def find(name)
|
26
|
-
linters[name]
|
27
|
-
end
|
23
|
+
Array(languages).each do |language|
|
24
|
+
linter.add_language(Language.find(language))
|
25
|
+
end
|
28
26
|
|
29
|
-
|
30
|
-
linters.values
|
27
|
+
linter.parser = Parser.find(parser)
|
31
28
|
end
|
32
|
-
|
33
|
-
protected
|
34
|
-
|
35
|
-
attr_reader :linters
|
36
29
|
end
|
37
30
|
|
38
|
-
register CheckStyle
|
39
|
-
register CoffeeLint
|
40
|
-
register CPPCheck
|
41
|
-
register CSSLint
|
42
|
-
register GoLint
|
43
|
-
register JSHint
|
44
|
-
register JSONLint
|
45
|
-
register PyLint
|
46
|
-
register RuboCop
|
47
|
-
register SCSSLint
|
31
|
+
register CheckStyle, languages: 'Java'
|
32
|
+
register CoffeeLint, languages: 'CoffeeScript'
|
33
|
+
register CPPCheck, languages: 'C++'
|
34
|
+
register CSSLint, languages: 'CSS', parser: 'CSSLint'
|
35
|
+
register GoLint, languages: 'Go', parser: 'VimQuickfix'
|
36
|
+
register JSHint, languages: 'JavaScript'
|
37
|
+
register JSONLint, languages: 'JSON'
|
38
|
+
register PyLint, languages: 'Python'
|
39
|
+
register RuboCop, languages: 'Ruby'
|
40
|
+
register SCSSLint, languages: 'SCSS'
|
41
|
+
default Unknown
|
48
42
|
end
|
49
43
|
end
|
@@ -1,18 +1,14 @@
|
|
1
1
|
module LintTrap
|
2
2
|
module Parser
|
3
|
+
# Interface for parsers
|
3
4
|
class Base
|
4
|
-
def
|
5
|
-
|
6
|
-
@container = container
|
5
|
+
def parse(_io, _container)
|
6
|
+
raise NotImplementedError, 'Must implement parse.'
|
7
7
|
end
|
8
8
|
|
9
|
-
def
|
10
|
-
|
9
|
+
def name
|
10
|
+
self.class.name.split('::').last
|
11
11
|
end
|
12
|
-
|
13
|
-
protected
|
14
|
-
|
15
|
-
attr_reader :container, :io
|
16
12
|
end
|
17
13
|
end
|
18
14
|
end
|
@@ -4,11 +4,11 @@ module LintTrap
|
|
4
4
|
module Parser
|
5
5
|
# Handles parsing line by line with regex
|
6
6
|
class Line < Base
|
7
|
-
def parse
|
7
|
+
def parse(io, container)
|
8
8
|
output = ''
|
9
9
|
|
10
10
|
io.each_line do |line|
|
11
|
-
if (violation = parse_line(line))
|
11
|
+
if (violation = parse_line(line, container))
|
12
12
|
yield violation
|
13
13
|
else
|
14
14
|
output << line
|
@@ -20,7 +20,7 @@ module LintTrap
|
|
20
20
|
|
21
21
|
private
|
22
22
|
|
23
|
-
def parse_line(line)
|
23
|
+
def parse_line(line, container)
|
24
24
|
return unless (match = line.match(violation_regex))
|
25
25
|
|
26
26
|
violation = {}
|
@@ -32,7 +32,7 @@ module LintTrap
|
|
32
32
|
end
|
33
33
|
end
|
34
34
|
|
35
|
-
standardize(violation)
|
35
|
+
standardize(violation, container)
|
36
36
|
end
|
37
37
|
|
38
38
|
def violation_fields
|
@@ -40,10 +40,10 @@ module LintTrap
|
|
40
40
|
end
|
41
41
|
|
42
42
|
def violation_regex
|
43
|
-
raise NotImplementedError,
|
43
|
+
raise NotImplementedError, 'Must implement violation_regex.'
|
44
44
|
end
|
45
45
|
|
46
|
-
def standardize(violation)
|
46
|
+
def standardize(violation, container)
|
47
47
|
violation[:file] = container.local_path(violation[:file])
|
48
48
|
|
49
49
|
violation
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require_relative 'registerable'
|
2
|
+
require_relative 'parser/csslint'
|
3
|
+
require_relative 'parser/standard'
|
4
|
+
require_relative 'parser/vim_quickfix'
|
5
|
+
|
6
|
+
module LintTrap
|
7
|
+
# Parser registry
|
8
|
+
module Parser
|
9
|
+
extend Registerable
|
10
|
+
|
11
|
+
register CSSLint
|
12
|
+
register Standard
|
13
|
+
register VimQuickfix
|
14
|
+
default Standard
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'forwardable'
|
2
|
+
require_relative 'registry'
|
3
|
+
|
4
|
+
module LintTrap
|
5
|
+
# Provide a registry DSL
|
6
|
+
module Registerable
|
7
|
+
extend Forwardable
|
8
|
+
|
9
|
+
def_delegator :registry, :register
|
10
|
+
def_delegator :registry, :default
|
11
|
+
def_delegator :registry, :find
|
12
|
+
def_delegator :registry, :all
|
13
|
+
|
14
|
+
protected
|
15
|
+
|
16
|
+
def registry
|
17
|
+
@registry ||= Registry.new
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|