gnurr 0.2.1 → 0.2.2
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/README.md +11 -15
- data/bin/gnurr +20 -3
- data/{linte.gemspec → gnurr.gemspec} +7 -5
- data/lib/gnurr/cli.rb +83 -0
- data/lib/gnurr/es_linter.rb +22 -8
- data/lib/gnurr/haml_linter.rb +6 -0
- data/lib/gnurr/helper.rb +33 -0
- data/lib/gnurr/linter.rb +47 -83
- data/lib/gnurr/processor.rb +24 -18
- data/lib/gnurr/ruby_base_linter.rb +10 -12
- data/lib/gnurr/ruby_linter.rb +6 -0
- data/lib/gnurr/scss_linter.rb +20 -9
- data/lib/gnurr/version.rb +1 -1
- metadata +16 -39
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 6a1410c6508df47eca91d6925eef3e939f31d9d7
|
|
4
|
+
data.tar.gz: b86e3ad6538174203af4986a072416a0c6bab212
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 2c8f93c2e60d0941e95c073d36bbfe0b5db367adb0c401cb3c1ca9e1dba07534b9a18298f0309eeb2e31ef4f3cac02ce67892ebe046a09bd103c0b1bcf98d022
|
|
7
|
+
data.tar.gz: 0f5cec29cb40f13bf85c688f90657ffa3b8459385e99f1c3c272613b5b137403f63ba17534b4cf91eb8bbdfd6b28975f298a49e12da381031a358d2561d996f8
|
data/README.md
CHANGED
|
@@ -11,24 +11,10 @@ Runs ESLint, SCSS-Lint, HAML-Lint, and Rubocop and returns info relevant to chan
|
|
|
11
11
|
|
|
12
12
|
## Installation
|
|
13
13
|
|
|
14
|
-
**This gem is not yet hosted elsewhere.** To install, clone the repo, then
|
|
15
|
-
`cd` into that directory and build the gem.
|
|
16
|
-
|
|
17
|
-
```bash
|
|
18
|
-
$ git clone https://github.com/bensaufley/gnurr
|
|
19
|
-
$ bundle install
|
|
20
|
-
…
|
|
21
|
-
$ rake install
|
|
22
|
-
```
|
|
23
|
-
|
|
24
|
-
If you intend to use [ESLint], be sure to [install that in npm][npm-install].
|
|
25
|
-
The other linters – [HAML-Lint], [Rubocop], and [SCSS-Lint] – are all listed as
|
|
26
|
-
gem dependencies.
|
|
27
|
-
|
|
28
14
|
As this gem is built to work with your git diffs, it does also require git.
|
|
29
15
|
If you've managed to execute the above code, you're already there.
|
|
30
16
|
|
|
31
|
-
|
|
17
|
+
Make sure you've installed the [Linters](#available-linters) you'd like to use.
|
|
32
18
|
|
|
33
19
|
Add this line to your application's Gemfile:
|
|
34
20
|
|
|
@@ -72,6 +58,16 @@ Usage: gnurr [options]
|
|
|
72
58
|
-h, --help Prints this help
|
|
73
59
|
```
|
|
74
60
|
|
|
61
|
+
## Available Linters
|
|
62
|
+
|
|
63
|
+
Below are the currently-supported linters. They are not required by this
|
|
64
|
+
gem and must be independently installed.
|
|
65
|
+
|
|
66
|
+
- [ESLint] for JavaScript ([requires npm][npm-install])
|
|
67
|
+
- [HAML-Lint] (~> 0.16.1) for HAML
|
|
68
|
+
- [Rubocop] (~> 0.47.0) for Ruby
|
|
69
|
+
- [SCSS-Lint] (~> 0.37.2) for SCSS
|
|
70
|
+
|
|
75
71
|
## Contributing
|
|
76
72
|
|
|
77
73
|
1. Fork it ( https://github.com/bensaufley/gnurr/fork )
|
data/bin/gnurr
CHANGED
|
@@ -12,9 +12,26 @@ options = {
|
|
|
12
12
|
option_parser = OptionParser.new do |opts|
|
|
13
13
|
opts.banner = 'Usage: gnurr [options]'
|
|
14
14
|
|
|
15
|
-
opts.on('-b', '--branch NAME',
|
|
16
|
-
|
|
17
|
-
|
|
15
|
+
opts.on('-b', '--branch NAME',
|
|
16
|
+
'Base branch: branch to diff against (default: master)') do |v|
|
|
17
|
+
options[:branch] = v
|
|
18
|
+
end
|
|
19
|
+
opts.on('-e', '--expanded',
|
|
20
|
+
'Show lints for all changed files, not just changed lines (false',
|
|
21
|
+
'unless specified)') do
|
|
22
|
+
options[:expanded] = true
|
|
23
|
+
end
|
|
24
|
+
opts.on('-l', '--linters LIST',
|
|
25
|
+
'Linters to use (default: es,haml,ruby,scss (all))') do |v|
|
|
26
|
+
options[:linters] = v.split(',').map(&:to_sym)
|
|
27
|
+
end
|
|
28
|
+
opts.on('-v', '--[no-]verbose', 'Run verbosely') do |v|
|
|
29
|
+
options[:verbose] = v
|
|
30
|
+
end
|
|
31
|
+
opts.on('--version', 'Show version') do
|
|
32
|
+
puts Gnurr::VERSION
|
|
33
|
+
exit
|
|
34
|
+
end
|
|
18
35
|
|
|
19
36
|
opts.on('-h', '--help', 'Prints this help') do
|
|
20
37
|
puts opts
|
|
@@ -19,7 +19,10 @@ Gem::Specification.new do |spec|
|
|
|
19
19
|
spec.require_paths = ['lib']
|
|
20
20
|
spec.requirements += [
|
|
21
21
|
'git',
|
|
22
|
-
'npm and eslint for JS linting'
|
|
22
|
+
'npm and eslint for JS linting',
|
|
23
|
+
'haml_lint for Ruby linting',
|
|
24
|
+
'scss_lint for SCSS linting',
|
|
25
|
+
'rubocop for Ruby linting'
|
|
23
26
|
]
|
|
24
27
|
|
|
25
28
|
spec.required_ruby_version = '~> 2.3.0'
|
|
@@ -27,8 +30,7 @@ Gem::Specification.new do |spec|
|
|
|
27
30
|
spec.add_development_dependency 'bundler', '~> 1.6'
|
|
28
31
|
spec.add_development_dependency 'rake'
|
|
29
32
|
spec.add_development_dependency 'git', '~> 1.3.0'
|
|
30
|
-
spec.add_development_dependency '
|
|
31
|
-
|
|
32
|
-
spec.
|
|
33
|
-
spec.add_development_dependency 'rubocop', '~> 0.37.2'
|
|
33
|
+
spec.add_development_dependency 'pry'
|
|
34
|
+
|
|
35
|
+
spec.add_runtime_dependency 'colorize'
|
|
34
36
|
end
|
data/lib/gnurr/cli.rb
ADDED
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
module Gnurr
|
|
2
|
+
# For outputting stuff using the command-line tool
|
|
3
|
+
module CLI
|
|
4
|
+
def print_messages
|
|
5
|
+
format_start
|
|
6
|
+
format_messages || format_all_clear
|
|
7
|
+
format_finish
|
|
8
|
+
messages
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
private
|
|
12
|
+
|
|
13
|
+
def format_all_clear
|
|
14
|
+
puts "#{left_bump(2)}#{"#{type.to_s.upcase} all clear! ✔"
|
|
15
|
+
.colorize(color: :light_green)}"
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def format_messages
|
|
19
|
+
format_line_diffs if @options[:verbose]
|
|
20
|
+
return if messages.empty?
|
|
21
|
+
puts "#{left_bump(2)}Messages:".colorize(mode: :bold)
|
|
22
|
+
messages.each do |filename, messages|
|
|
23
|
+
messages.each do |message|
|
|
24
|
+
puts format_error(filename, message)
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
messages
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def format_error(filename, message)
|
|
31
|
+
left_bump(3) +
|
|
32
|
+
filename.colorize(color: color) + ':' +
|
|
33
|
+
format_line(message) + ' ' +
|
|
34
|
+
format_severity(message) + ' ' +
|
|
35
|
+
message[:message] +
|
|
36
|
+
format_linter(message)
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def format_finish
|
|
40
|
+
if @options[:verbose]
|
|
41
|
+
puts "#{left_bump}Done linting #{type.to_s.colorize(color)}\n"
|
|
42
|
+
.colorize(mode: :bold)
|
|
43
|
+
else
|
|
44
|
+
puts
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def format_line(message)
|
|
49
|
+
line = message[:line].to_s
|
|
50
|
+
line += ':' + message[:column].to_s if message[:column]
|
|
51
|
+
line.colorize(:cyan)
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def format_line_diffs
|
|
55
|
+
diffs = line_diffs
|
|
56
|
+
if diffs.empty?
|
|
57
|
+
puts "#{left_bump(2)}No changes.".colorize(mode: :bold)
|
|
58
|
+
else
|
|
59
|
+
puts "#{left_bump(2)}Lines changed:".colorize(mode: :bold)
|
|
60
|
+
diffs.each do |filename, lines|
|
|
61
|
+
puts "#{left_bump(3)}#{filename}:#{lines.join(', ').colorize(:cyan)}"
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def format_linter(message)
|
|
67
|
+
message[:linter] ? " (#{message[:linter]})".colorize(:cyan) : ''
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def format_severity(message)
|
|
71
|
+
if message[:severity] == :error
|
|
72
|
+
'[E]'.colorize(:red)
|
|
73
|
+
else
|
|
74
|
+
'[W]'.colorize(:yellow)
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
def format_start
|
|
79
|
+
puts "#{left_bump}Linting #{type.to_s.colorize(color)}…"
|
|
80
|
+
.colorize(mode: :bold)
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
end
|
data/lib/gnurr/es_linter.rb
CHANGED
|
@@ -21,18 +21,32 @@ module Gnurr
|
|
|
21
21
|
|
|
22
22
|
private
|
|
23
23
|
|
|
24
|
-
def
|
|
25
|
-
[
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
24
|
+
def file_path(file)
|
|
25
|
+
file['filePath']
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def file_messages(file)
|
|
29
|
+
file['messages']
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def requirements_met?
|
|
33
|
+
!`eslint -v`.nil?
|
|
34
|
+
rescue
|
|
35
|
+
false
|
|
32
36
|
end
|
|
33
37
|
|
|
34
38
|
def pwd
|
|
35
39
|
@pwd ||= `printf $(pwd)`
|
|
36
40
|
end
|
|
41
|
+
|
|
42
|
+
def standardize_message(message)
|
|
43
|
+
{
|
|
44
|
+
column: message['column'],
|
|
45
|
+
line: message['line'],
|
|
46
|
+
linter: message['ruleId'],
|
|
47
|
+
message: message['message'],
|
|
48
|
+
severity: message['severity'] == 2 ? :error : :warning
|
|
49
|
+
}
|
|
50
|
+
end
|
|
37
51
|
end
|
|
38
52
|
end
|
data/lib/gnurr/haml_linter.rb
CHANGED
data/lib/gnurr/helper.rb
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
module Gnurr
|
|
2
|
+
# Miscellaneous helper methods for the gem
|
|
3
|
+
module Helper
|
|
4
|
+
def array_to_ranges(array)
|
|
5
|
+
array = array.compact.uniq.sort
|
|
6
|
+
ranges = []
|
|
7
|
+
return ranges if array.empty?
|
|
8
|
+
left = array.first
|
|
9
|
+
right = nil
|
|
10
|
+
array.each do |obj|
|
|
11
|
+
if right && obj != right.succ
|
|
12
|
+
ranges << Range.new(left, right)
|
|
13
|
+
left = obj
|
|
14
|
+
end
|
|
15
|
+
right = obj
|
|
16
|
+
end
|
|
17
|
+
ranges + [Range.new(left, right)]
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def left_bump(indent = 1)
|
|
21
|
+
'▎'.ljust(indent * 2).colorize(color: color)
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def log_error(e)
|
|
25
|
+
if @options[:stdout]
|
|
26
|
+
puts "#{'ERROR'.colorize(:red)}: #{e}"
|
|
27
|
+
puts e.backtrace if @options[:verbose]
|
|
28
|
+
else
|
|
29
|
+
warn("Error: #{e}")
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
data/lib/gnurr/linter.rb
CHANGED
|
@@ -1,51 +1,43 @@
|
|
|
1
|
+
require 'gnurr/helper'
|
|
2
|
+
require 'gnurr/cli'
|
|
3
|
+
|
|
1
4
|
module Gnurr
|
|
2
5
|
# Base linter class from which each linter extends
|
|
3
6
|
class Linter
|
|
7
|
+
include Gnurr::Helper
|
|
8
|
+
include Gnurr::CLI
|
|
9
|
+
|
|
4
10
|
def initialize(files, options)
|
|
11
|
+
raise "Dependency not available for #{type}" unless requirements_met?
|
|
5
12
|
@options = options
|
|
6
13
|
@files = Hash[files.select { |file, _lines| filter(file) }]
|
|
7
14
|
@messages = {} if @files.empty?
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
def format_errors
|
|
12
|
-
puts_line_diffs if @options[:verbose]
|
|
13
|
-
return if relevant_messages.empty?
|
|
14
|
-
puts "#{left_bump(2)}Messages:".colorize(mode: :bold)
|
|
15
|
-
relevant_messages.each do |filename, messages|
|
|
16
|
-
messages.each do |message|
|
|
17
|
-
puts left_bump(3) + format_error(filename, message)
|
|
18
|
-
end
|
|
19
|
-
end
|
|
20
|
-
relevant_messages
|
|
21
|
-
end
|
|
22
|
-
|
|
23
|
-
def format_error(filename, message)
|
|
24
|
-
filename.colorize(color: color) + ':' +
|
|
25
|
-
format_line(message) + ' ' +
|
|
26
|
-
format_severity(message) + ' ' +
|
|
27
|
-
message[:message] +
|
|
28
|
-
format_linter(message)
|
|
15
|
+
rescue => e
|
|
16
|
+
log_error(e)
|
|
29
17
|
end
|
|
30
18
|
|
|
31
|
-
def
|
|
32
|
-
|
|
33
|
-
json.map { |files| map_errors(files) }
|
|
34
|
-
.select { |_f, messages| messages && !messages.empty? }
|
|
19
|
+
def execute
|
|
20
|
+
@options[:stdout] ? print_messages : messages
|
|
35
21
|
end
|
|
36
22
|
|
|
37
|
-
def
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
23
|
+
def parse_messages(json)
|
|
24
|
+
return [] unless json.any?
|
|
25
|
+
messages = json.map { |files| map_errors(files) }
|
|
26
|
+
.select { |_f, msgs| msgs && msgs.any? }
|
|
27
|
+
if @options[:expanded]
|
|
28
|
+
messages
|
|
41
29
|
else
|
|
42
|
-
|
|
43
|
-
diffs.each do |filename, lines|
|
|
44
|
-
puts "#{left_bump(3)}#{filename}:#{lines.join(', ').colorize(:cyan)}"
|
|
45
|
-
end
|
|
30
|
+
filter_messages(messages)
|
|
46
31
|
end
|
|
47
32
|
end
|
|
48
33
|
|
|
34
|
+
def filter_messages(messages)
|
|
35
|
+
messages.map do |filename, msgs|
|
|
36
|
+
msgs.reject! { |msg| !@files[filename].include?(msg[:line]) }
|
|
37
|
+
msgs.empty? ? nil : [filename, msgs]
|
|
38
|
+
end.reject(&:nil?)
|
|
39
|
+
end
|
|
40
|
+
|
|
49
41
|
def line_diffs
|
|
50
42
|
Hash[
|
|
51
43
|
@files.map do |filename, lines|
|
|
@@ -55,68 +47,40 @@ module Gnurr
|
|
|
55
47
|
end
|
|
56
48
|
|
|
57
49
|
def relevant_messages
|
|
58
|
-
|
|
50
|
+
JSON.parse(`git diff --name-only --diff-filter=ACMRTUXB \
|
|
51
|
+
#{@options[:branch]} #{@files.map(&:first).join(' ')} \
|
|
52
|
+
| xargs #{command}`)
|
|
59
53
|
rescue => e
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
puts e.backtrace if @options[:verbose]
|
|
63
|
-
else
|
|
64
|
-
warn("Error: #{e}")
|
|
65
|
-
end
|
|
66
|
-
@messages = {}
|
|
67
|
-
end
|
|
68
|
-
|
|
69
|
-
def pretty_print
|
|
70
|
-
puts "#{left_bump}Linting #{@type.to_s.colorize(color)}…".colorize(mode: :bold)
|
|
71
|
-
format_errors || puts("#{left_bump(2)}#{"#{@type.to_s.upcase} all clear! ✔".colorize(color: :light_green)}")
|
|
72
|
-
puts "#{left_bump}Done linting #{@type.to_s.colorize(color)}\n".colorize(mode: :bold) if @options[:verbose]
|
|
54
|
+
log_error(e)
|
|
55
|
+
{}
|
|
73
56
|
end
|
|
74
57
|
|
|
75
58
|
private
|
|
76
59
|
|
|
77
|
-
def
|
|
78
|
-
|
|
79
|
-
ranges = []
|
|
80
|
-
return ranges if array.empty?
|
|
81
|
-
left = array.first
|
|
82
|
-
right = nil
|
|
83
|
-
array.each do |obj|
|
|
84
|
-
if right && obj != right.succ
|
|
85
|
-
ranges << Range.new(left, right)
|
|
86
|
-
left = obj
|
|
87
|
-
end
|
|
88
|
-
right = obj
|
|
89
|
-
end
|
|
90
|
-
ranges + [Range.new(left, right)]
|
|
91
|
-
end
|
|
92
|
-
|
|
93
|
-
def format_line(message)
|
|
94
|
-
(message[:line].to_s + (message[:column] ? ':' + message[:column].to_s : '')).colorize(:cyan)
|
|
95
|
-
end
|
|
96
|
-
|
|
97
|
-
def format_severity(message)
|
|
98
|
-
message[:severity] == :error ? '[E]'.colorize(:red) : '[W]'.colorize(:yellow)
|
|
60
|
+
def requirements_met?
|
|
61
|
+
true # Set by subclasses
|
|
99
62
|
end
|
|
100
63
|
|
|
101
|
-
def
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
64
|
+
def map_errors(file)
|
|
65
|
+
[
|
|
66
|
+
file_path(file),
|
|
67
|
+
file_messages(file).map do |message|
|
|
68
|
+
standardize_message(message)
|
|
69
|
+
end.reject(&:nil?)
|
|
70
|
+
]
|
|
107
71
|
end
|
|
108
72
|
|
|
109
|
-
def
|
|
110
|
-
|
|
73
|
+
def messages
|
|
74
|
+
@messages ||= parse_messages(relevant_messages)
|
|
111
75
|
end
|
|
112
76
|
|
|
113
|
-
def
|
|
77
|
+
def standardize_message(message)
|
|
114
78
|
{
|
|
115
|
-
column: message[column],
|
|
116
|
-
line: message[line],
|
|
117
|
-
linter: message[linter],
|
|
118
|
-
message: message[
|
|
119
|
-
severity: message[severity] == error ? :error : :warning
|
|
79
|
+
column: message['column'],
|
|
80
|
+
line: message['line'],
|
|
81
|
+
linter: message['linter'],
|
|
82
|
+
message: message['message'],
|
|
83
|
+
severity: message['severity'] == 'error' ? :error : :warning
|
|
120
84
|
}
|
|
121
85
|
end
|
|
122
86
|
end
|
data/lib/gnurr/processor.rb
CHANGED
|
@@ -8,12 +8,13 @@ module Gnurr
|
|
|
8
8
|
scss: ScssLinter
|
|
9
9
|
}.freeze
|
|
10
10
|
|
|
11
|
-
def initialize(options)
|
|
12
|
-
if options[:linters] &&
|
|
11
|
+
def initialize(options = {})
|
|
12
|
+
if options[:linters] && options[:linters].any?
|
|
13
13
|
options[:linters] = LINTERS.keys & options[:linters]
|
|
14
14
|
end
|
|
15
15
|
@options = {
|
|
16
16
|
branch: 'master',
|
|
17
|
+
expanded: false,
|
|
17
18
|
linters: LINTERS.keys,
|
|
18
19
|
stdout: false,
|
|
19
20
|
verbose: false
|
|
@@ -23,32 +24,37 @@ module Gnurr
|
|
|
23
24
|
def execute
|
|
24
25
|
lints = {}
|
|
25
26
|
@options[:linters].each do |type|
|
|
26
|
-
|
|
27
|
-
|
|
27
|
+
begin
|
|
28
|
+
lints[type] = LINTERS[type].new(git_diffs, @options)
|
|
29
|
+
lints[type].execute
|
|
30
|
+
rescue => e
|
|
31
|
+
lints[type] = e.inspect
|
|
32
|
+
end
|
|
28
33
|
end
|
|
29
34
|
lints
|
|
30
35
|
end
|
|
31
36
|
|
|
32
37
|
private
|
|
33
38
|
|
|
34
|
-
def
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
+
def git_diffs
|
|
40
|
+
return @diff if @diff
|
|
41
|
+
diff = `git diff #{@options[:branch]} --name-only --diff-filter=ACMRTUXB`
|
|
42
|
+
.split("\n")
|
|
43
|
+
.map { |file| [file, file_diffs(file)] }
|
|
44
|
+
@diff = Hash[diff.select { |_k, v| v && v.any? }]
|
|
39
45
|
end
|
|
40
46
|
|
|
41
|
-
def
|
|
42
|
-
diffs = `git diff --unified=0 #{@options[:branch]} #{file}
|
|
43
|
-
|
|
47
|
+
def file_diffs(file)
|
|
48
|
+
diffs = `git diff --unified=0 #{@options[:branch]} #{file} \
|
|
49
|
+
| egrep '\\+[0-9]+(,[1-9][0-9]*)? '`
|
|
50
|
+
line_diffs(diffs.split("\n"))
|
|
44
51
|
end
|
|
45
52
|
|
|
46
|
-
def diffs
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
@diff = Hash[diff.select { |_k, v| v && !v.empty? }]
|
|
53
|
+
def line_diffs(diffs)
|
|
54
|
+
diffs.map do |lines|
|
|
55
|
+
nums = lines.match(/^.+\+(?<from>[0-9]+)(,(?<len>[0-9]+))? .+$/)
|
|
56
|
+
Range.new(nums[:from].to_i, nums[:from].to_i + nums[:len].to_i)
|
|
57
|
+
end.map(&:to_a).flatten
|
|
52
58
|
end
|
|
53
59
|
end
|
|
54
60
|
end
|
|
@@ -3,23 +3,21 @@ require 'gnurr/linter'
|
|
|
3
3
|
module Gnurr
|
|
4
4
|
# Class from which Haml and Ruby extend
|
|
5
5
|
class RubyBaseLinter < Linter
|
|
6
|
-
|
|
7
|
-
|
|
6
|
+
private
|
|
7
|
+
|
|
8
|
+
def file_path(file)
|
|
9
|
+
file['path']
|
|
8
10
|
end
|
|
9
11
|
|
|
10
|
-
|
|
12
|
+
def file_messages(file)
|
|
13
|
+
file['offenses']
|
|
14
|
+
end
|
|
11
15
|
|
|
12
|
-
def
|
|
13
|
-
[
|
|
14
|
-
file['path'],
|
|
15
|
-
file['offenses'].map do |message|
|
|
16
|
-
next unless @files[file['path']].include?(message['location']['line'])
|
|
17
|
-
standardize(message)
|
|
18
|
-
end.reject(&:nil?)
|
|
19
|
-
]
|
|
16
|
+
def messages
|
|
17
|
+
@messages ||= parse_messages(relevant_messages['files'])
|
|
20
18
|
end
|
|
21
19
|
|
|
22
|
-
def
|
|
20
|
+
def standardize_message(message)
|
|
23
21
|
{
|
|
24
22
|
column: message['location']['column'], # nil in haml-lint
|
|
25
23
|
line: message['location']['line'],
|
data/lib/gnurr/ruby_linter.rb
CHANGED
data/lib/gnurr/scss_linter.rb
CHANGED
|
@@ -21,15 +21,26 @@ module Gnurr
|
|
|
21
21
|
|
|
22
22
|
private
|
|
23
23
|
|
|
24
|
-
def
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
24
|
+
def file_path(params)
|
|
25
|
+
params[0]
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def file_messages(params)
|
|
29
|
+
params[1]
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def requirements_met?
|
|
33
|
+
Gem::Specification.find_all_by_name('scss_lint').any?
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def standardize_message(message)
|
|
37
|
+
{
|
|
38
|
+
column: message['column'],
|
|
39
|
+
line: message['line'],
|
|
40
|
+
linter: message['linter'],
|
|
41
|
+
message: message['reason'],
|
|
42
|
+
severity: message['severity'] == 'error' ? :error : :warning
|
|
43
|
+
}
|
|
33
44
|
end
|
|
34
45
|
end
|
|
35
46
|
end
|
data/lib/gnurr/version.rb
CHANGED
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: gnurr
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.2.
|
|
4
|
+
version: 0.2.2
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Ben Saufley
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2016-03-
|
|
11
|
+
date: 2016-03-03 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: bundler
|
|
@@ -53,7 +53,7 @@ dependencies:
|
|
|
53
53
|
- !ruby/object:Gem::Version
|
|
54
54
|
version: 1.3.0
|
|
55
55
|
- !ruby/object:Gem::Dependency
|
|
56
|
-
name:
|
|
56
|
+
name: pry
|
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
|
58
58
|
requirements:
|
|
59
59
|
- - ">="
|
|
@@ -67,47 +67,19 @@ dependencies:
|
|
|
67
67
|
- !ruby/object:Gem::Version
|
|
68
68
|
version: '0'
|
|
69
69
|
- !ruby/object:Gem::Dependency
|
|
70
|
-
name:
|
|
71
|
-
requirement: !ruby/object:Gem::Requirement
|
|
72
|
-
requirements:
|
|
73
|
-
- - "~>"
|
|
74
|
-
- !ruby/object:Gem::Version
|
|
75
|
-
version: 0.16.1
|
|
76
|
-
type: :development
|
|
77
|
-
prerelease: false
|
|
78
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
79
|
-
requirements:
|
|
80
|
-
- - "~>"
|
|
81
|
-
- !ruby/object:Gem::Version
|
|
82
|
-
version: 0.16.1
|
|
83
|
-
- !ruby/object:Gem::Dependency
|
|
84
|
-
name: scss_lint
|
|
85
|
-
requirement: !ruby/object:Gem::Requirement
|
|
86
|
-
requirements:
|
|
87
|
-
- - "~>"
|
|
88
|
-
- !ruby/object:Gem::Version
|
|
89
|
-
version: 0.47.0
|
|
90
|
-
type: :development
|
|
91
|
-
prerelease: false
|
|
92
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
93
|
-
requirements:
|
|
94
|
-
- - "~>"
|
|
95
|
-
- !ruby/object:Gem::Version
|
|
96
|
-
version: 0.47.0
|
|
97
|
-
- !ruby/object:Gem::Dependency
|
|
98
|
-
name: rubocop
|
|
70
|
+
name: colorize
|
|
99
71
|
requirement: !ruby/object:Gem::Requirement
|
|
100
72
|
requirements:
|
|
101
|
-
- - "
|
|
73
|
+
- - ">="
|
|
102
74
|
- !ruby/object:Gem::Version
|
|
103
|
-
version: 0
|
|
104
|
-
type: :
|
|
75
|
+
version: '0'
|
|
76
|
+
type: :runtime
|
|
105
77
|
prerelease: false
|
|
106
78
|
version_requirements: !ruby/object:Gem::Requirement
|
|
107
79
|
requirements:
|
|
108
|
-
- - "
|
|
80
|
+
- - ">="
|
|
109
81
|
- !ruby/object:Gem::Version
|
|
110
|
-
version: 0
|
|
82
|
+
version: '0'
|
|
111
83
|
description: Runs ESLint, SCSS-Lint, HAML-Lint, and Rubocop and returns info relevant
|
|
112
84
|
to changed lines as reported by git.
|
|
113
85
|
email:
|
|
@@ -123,16 +95,18 @@ files:
|
|
|
123
95
|
- README.md
|
|
124
96
|
- Rakefile
|
|
125
97
|
- bin/gnurr
|
|
98
|
+
- gnurr.gemspec
|
|
126
99
|
- lib/gnurr.rb
|
|
100
|
+
- lib/gnurr/cli.rb
|
|
127
101
|
- lib/gnurr/es_linter.rb
|
|
128
102
|
- lib/gnurr/haml_linter.rb
|
|
103
|
+
- lib/gnurr/helper.rb
|
|
129
104
|
- lib/gnurr/linter.rb
|
|
130
105
|
- lib/gnurr/processor.rb
|
|
131
106
|
- lib/gnurr/ruby_base_linter.rb
|
|
132
107
|
- lib/gnurr/ruby_linter.rb
|
|
133
108
|
- lib/gnurr/scss_linter.rb
|
|
134
109
|
- lib/gnurr/version.rb
|
|
135
|
-
- linte.gemspec
|
|
136
110
|
homepage: http://github.com/bensaufley/gnurr
|
|
137
111
|
licenses:
|
|
138
112
|
- MIT
|
|
@@ -154,8 +128,11 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
154
128
|
requirements:
|
|
155
129
|
- git
|
|
156
130
|
- npm and eslint for JS linting
|
|
131
|
+
- haml_lint for Ruby linting
|
|
132
|
+
- scss_lint for SCSS linting
|
|
133
|
+
- rubocop for Ruby linting
|
|
157
134
|
rubyforge_project:
|
|
158
|
-
rubygems_version: 2.
|
|
135
|
+
rubygems_version: 2.2.2
|
|
159
136
|
signing_key:
|
|
160
137
|
specification_version: 4
|
|
161
138
|
summary: Diff-specific linter
|