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.
Files changed (80) hide show
  1. checksums.yaml +4 -4
  2. data/Rakefile +2 -1
  3. data/lib/lint_trap/container/base.rb +1 -0
  4. data/lib/lint_trap/language/base.rb +8 -6
  5. data/lib/lint_trap/language/coffeescript.rb +0 -3
  6. data/lib/lint_trap/language/cpp.rb +0 -4
  7. data/lib/lint_trap/language/css.rb +0 -3
  8. data/lib/lint_trap/language/go.rb +0 -3
  9. data/lib/lint_trap/language/java.rb +0 -3
  10. data/lib/lint_trap/language/javascript.rb +0 -3
  11. data/lib/lint_trap/language/json.rb +0 -3
  12. data/lib/lint_trap/language/python.rb +0 -3
  13. data/lib/lint_trap/language/ruby.rb +0 -3
  14. data/lib/lint_trap/language/scss.rb +0 -3
  15. data/lib/lint_trap/language/unknown.rb +1 -11
  16. data/lib/lint_trap/language.rb +6 -19
  17. data/lib/lint_trap/linter/base.rb +21 -19
  18. data/lib/lint_trap/linter/checkstyle.rb +0 -4
  19. data/lib/lint_trap/linter/coffeelint.rb +0 -4
  20. data/lib/lint_trap/linter/cppcheck.rb +0 -4
  21. data/lib/lint_trap/linter/csslint.rb +0 -8
  22. data/lib/lint_trap/linter/golint.rb +0 -8
  23. data/lib/lint_trap/linter/jshint.rb +0 -4
  24. data/lib/lint_trap/linter/jsonlint.rb +0 -4
  25. data/lib/lint_trap/linter/pylint.rb +0 -4
  26. data/lib/lint_trap/linter/rubocop.rb +0 -4
  27. data/lib/lint_trap/linter/scsslint.rb +0 -4
  28. data/lib/lint_trap/linter/unknown.rb +2 -9
  29. data/lib/lint_trap/linter.rb +20 -26
  30. data/lib/lint_trap/parser/base.rb +5 -9
  31. data/lib/lint_trap/parser/line.rb +6 -6
  32. data/lib/lint_trap/parser.rb +16 -0
  33. data/lib/lint_trap/registerable.rb +20 -0
  34. data/lib/lint_trap/registry.rb +29 -0
  35. data/lib/lint_trap/version.rb +2 -1
  36. data/lib/lint_trap.rb +1 -0
  37. data/lint_trap.gemspec +2 -2
  38. data/spec/integration/base_spec.rb +5 -1
  39. data/spec/integration/checkstyle_spec.rb +1 -1
  40. data/spec/integration/coffeelint_spec.rb +1 -1
  41. data/spec/integration/cppcheck_spec.rb +1 -1
  42. data/spec/integration/csslint_spec.rb +1 -1
  43. data/spec/integration/golint_spec.rb +1 -1
  44. data/spec/integration/jshint_spec.rb +1 -1
  45. data/spec/integration/jsonlint_spec.rb +1 -1
  46. data/spec/integration/pylint_spec.rb +1 -1
  47. data/spec/integration/rubocop_spec.rb +1 -1
  48. data/spec/integration/scsslint_spec.rb +1 -1
  49. data/spec/language/coffeescript_spec.rb +1 -2
  50. data/spec/language/cpp_spec.rb +1 -2
  51. data/spec/language/css_spec.rb +1 -2
  52. data/spec/language/go_spec.rb +1 -2
  53. data/spec/language/java_spec.rb +1 -2
  54. data/spec/language/javascript_spec.rb +1 -2
  55. data/spec/language/json_spec.rb +1 -2
  56. data/spec/language/python_spec.rb +1 -2
  57. data/spec/language/ruby_spec.rb +1 -2
  58. data/spec/language/scss_spec.rb +1 -2
  59. data/spec/language/unknown_spec.rb +1 -11
  60. data/spec/language_spec.rb +21 -2
  61. data/spec/linter/checkstyle_spec.rb +1 -1
  62. data/spec/linter/coffeelint_spec.rb +1 -1
  63. data/spec/linter/cppcheck_spec.rb +1 -1
  64. data/spec/linter/csslint_spec.rb +1 -1
  65. data/spec/linter/golint_spec.rb +1 -1
  66. data/spec/linter/jshint_spec.rb +1 -1
  67. data/spec/linter/jsonlint_spec.rb +1 -1
  68. data/spec/linter/pylint_spec.rb +1 -1
  69. data/spec/linter/rubocop_spec.rb +1 -1
  70. data/spec/linter/scsslint_spec.rb +1 -1
  71. data/spec/linter/unknown_spec.rb +1 -0
  72. data/spec/linter_spec.rb +1 -1
  73. data/spec/parser/base_spec.rb +3 -2
  74. data/spec/parser/csslint_spec.rb +2 -2
  75. data/spec/parser/line_spec.rb +3 -2
  76. data/spec/parser/standard_spec.rb +2 -2
  77. data/spec/parser/vim_quickfix_spec.rb +2 -2
  78. data/spec/registry_spec.rb +52 -0
  79. data/spec/support/examples/linter.rb +2 -1
  80. metadata +7 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 92fc111e75ab3a2cab86275cab5777e8c82f793f
4
- data.tar.gz: 6096c4ee46e51450dc472c020f14ce8f8a005e50
3
+ metadata.gz: 5bc37f9f82c78cd395b59c6c0db07c517734a50f
4
+ data.tar.gz: d6f3c7092a1cf4118ee781126b7c4ccaddec4c5f
5
5
  SHA512:
6
- metadata.gz: 78086d27a86e8adced7b07d6c8879ac649a44321835fce6a27c64b1caa1ddba5defae22bd5cf5a46ebce3d3d1016b0b42e27154f19cd04624a86137b5dab785b
7
- data.tar.gz: 75c073bf67794d1eb036844a26fc19034ae58dfc370ea27d6e37ee6c03e0d5f7667c7619aa181bef6560e22d1c9400dadc27704f16e680d2f145cfb5474f415a
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
- sha = ENV['CIRCLE_SHA1'] ? ENV['CIRCLE_SHA1'] : `git rev-parse HEAD`.strip
95
+ ENV['CIRCLE_SHA1'] ? ENV['CIRCLE_SHA1'] : `git rev-parse HEAD`.strip
95
96
  end
96
97
  end
97
98
 
@@ -3,6 +3,7 @@ require_relative '../execution_error'
3
3
 
4
4
  module LintTrap
5
5
  module Container
6
+ # Interface for a container
6
7
  class Base
7
8
  ImagePullError = Class.new(ExecutionError)
8
9
 
@@ -2,16 +2,18 @@ module LintTrap
2
2
  module Language
3
3
  # Interface for languages
4
4
  class Base
5
- def name
6
- self.class.name.split('::').last
5
+ attr_reader :linters
6
+
7
+ def initialize
8
+ @linters = []
7
9
  end
8
10
 
9
- def linters(*classes)
10
- classes.map(&:new)
11
+ def name
12
+ self.class.name.split('::').last
11
13
  end
12
14
 
13
- def known?
14
- true
15
+ def add_linter(linter)
16
+ @linters << linter
15
17
  end
16
18
 
17
19
  def ==(other)
@@ -5,9 +5,6 @@ module LintTrap
5
5
  module Language
6
6
  # CoffeeScript
7
7
  class CoffeeScript < Base
8
- def linters
9
- super(Linter::CoffeeLint)
10
- end
11
8
  end
12
9
  end
13
10
  end
@@ -8,10 +8,6 @@ module LintTrap
8
8
  def name
9
9
  'C++'
10
10
  end
11
-
12
- def linters
13
- super(Linter::CPPCheck)
14
- end
15
11
  end
16
12
  end
17
13
  end
@@ -5,9 +5,6 @@ module LintTrap
5
5
  module Language
6
6
  # CSS
7
7
  class CSS < Base
8
- def linters
9
- super(Linter::CSSLint)
10
- end
11
8
  end
12
9
  end
13
10
  end
@@ -5,9 +5,6 @@ module LintTrap
5
5
  module Language
6
6
  # Go
7
7
  class Go < Base
8
- def linters
9
- super(Linter::GoLint)
10
- end
11
8
  end
12
9
  end
13
10
  end
@@ -5,9 +5,6 @@ module LintTrap
5
5
  module Language
6
6
  # Java
7
7
  class Java < Base
8
- def linters
9
- super(Linter::CheckStyle)
10
- end
11
8
  end
12
9
  end
13
10
  end
@@ -5,9 +5,6 @@ module LintTrap
5
5
  module Language
6
6
  # JavaScript
7
7
  class JavaScript < Base
8
- def linters
9
- super(Linter::JSHint)
10
- end
11
8
  end
12
9
  end
13
10
  end
@@ -5,9 +5,6 @@ module LintTrap
5
5
  module Language
6
6
  # JSON
7
7
  class JSON < Base
8
- def linters
9
- super(Linter::JSONLint)
10
- end
11
8
  end
12
9
  end
13
10
  end
@@ -5,9 +5,6 @@ module LintTrap
5
5
  module Language
6
6
  # Python
7
7
  class Python < Base
8
- def linters
9
- super(Linter::PyLint)
10
- end
11
8
  end
12
9
  end
13
10
  end
@@ -5,9 +5,6 @@ module LintTrap
5
5
  module Language
6
6
  # Ruby
7
7
  class Ruby < Base
8
- def linters
9
- super(Linter::RuboCop)
10
- end
11
8
  end
12
9
  end
13
10
  end
@@ -5,9 +5,6 @@ module LintTrap
5
5
  module Language
6
6
  # SCSS
7
7
  class SCSS < Base
8
- def linters
9
- super(Linter::SCSSLint)
10
- end
11
8
  end
12
9
  end
13
10
  end
@@ -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
- super(Linter::Unknown)
16
- end
17
-
18
- def known?
19
- false
9
+ [Linter::Unknown.new]
20
10
  end
21
11
  end
22
12
  end
@@ -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 lookup
17
+ # Language registry
17
18
  module Language
18
- @languages = {}
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
- if (language = Linguist::FileBlob.new(file).language)
28
- find(language.name)
29
- else
30
- Unknown.new
31
- end
32
- end
23
+ language = Linguist::FileBlob.new(file).language
33
24
 
34
- def find(name)
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
- def lint(files, container, options)
14
- return unless known?
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).parse do |violation|
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 !violations_found && !success
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
@@ -6,10 +6,6 @@ module LintTrap
6
6
  class CheckStyle < Base
7
7
  CHECKS_XML = 'checkstyle/sun_checks.xml'
8
8
 
9
- def languages
10
- super(Language::Java)
11
- end
12
-
13
9
  def version
14
10
  '6.6'
15
11
  end
@@ -6,10 +6,6 @@ module LintTrap
6
6
  class CoffeeLint < Base
7
7
  REPORTER = 'coffeelint/lint_trap.coffee'
8
8
 
9
- def languages
10
- super(Language::CoffeeScript)
11
- end
12
-
13
9
  def version
14
10
  '1.9.7'
15
11
  end
@@ -4,10 +4,6 @@ module LintTrap
4
4
  module Linter
5
5
  # Encapsulates logic specific to cppcheck command line tool.
6
6
  class CPPCheck < Base
7
- def languages
8
- super(Language::CPP)
9
- end
10
-
11
7
  def version
12
8
  '1.67-1'
13
9
  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
@@ -6,10 +6,6 @@ module LintTrap
6
6
  class JSHint < Base
7
7
  FORMATTER = 'jshint/formatter.js'
8
8
 
9
- def languages
10
- super(Language::JavaScript)
11
- end
12
-
13
9
  def version
14
10
  '2.5.11'
15
11
  end
@@ -4,10 +4,6 @@ module LintTrap
4
4
  module Linter
5
5
  # Encapsulates logic specific to durable-json-lint command line tool.
6
6
  class JSONLint < Base
7
- def languages
8
- super(Language::JSON)
9
- end
10
-
11
7
  def version
12
8
  '0.0.4'
13
9
  end
@@ -4,10 +4,6 @@ module LintTrap
4
4
  module Linter
5
5
  # Encapsulates logic specific to pylint command line tool.
6
6
  class PyLint < Base
7
- def languages
8
- super(Language::Python)
9
- end
10
-
11
7
  def version
12
8
  '1.3.1-3'
13
9
  end
@@ -6,10 +6,6 @@ module LintTrap
6
6
  class RuboCop < Base
7
7
  FORMATTER = 'rubocop/formatter.rb'
8
8
 
9
- def languages
10
- super(Language::Ruby)
11
- end
12
-
13
9
  def version
14
10
  '0.31.0'
15
11
  end
@@ -6,10 +6,6 @@ module LintTrap
6
6
  class SCSSLint < Base
7
7
  COMMAND = 'scsslint/scsslint'
8
8
 
9
- def languages
10
- super(Language::SCSS)
11
- end
12
-
13
9
  def version
14
10
  '0.38.0'
15
11
  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
- attr_reader :name
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
- super(Language::Unknown)
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
@@ -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 lookup
15
+ # Linter registry
15
16
  module Linter
16
- @linters = Hash.new{|h, v| h[v] = Unknown.new(v)}
17
+ extend Registerable
17
18
 
18
19
  class << self
19
- def register(linter_class)
20
- linter = linter_class.new
20
+ def register(linter_class, languages:, parser: nil)
21
+ linter = super(linter_class)
21
22
 
22
- linters[linter.name] = linter
23
- end
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
- def all
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 initialize(io, container)
5
- @io = io
6
- @container = container
5
+ def parse(_io, _container)
6
+ raise NotImplementedError, 'Must implement parse.'
7
7
  end
8
8
 
9
- def parse
10
- raise NotImplementedError, "Must implement parse."
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, "Must implement violation_regex."
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