gnurr 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 3974d42c9302a023ce25057a3a1da60327bcf340
4
+ data.tar.gz: 88eeb9666d2c41c0cee93b81832332f2bc92a58d
5
+ SHA512:
6
+ metadata.gz: 61a83db2076c426c1902bfed82b57f07f60673903facc607164c1fbf41b5828395ab495400bc26937f095fb7fbe67e8616766b3666da585a8bb1942d86ae7658
7
+ data.tar.gz: 48b66de7de833b1c326100978175486a0b98dc54ca7d05d1afb3de1d913d0d503fa8223ca6ee610d99e18da18828e1e68795dd151de3ba4e3e5b1f21c25f87e4
@@ -0,0 +1,22 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
18
+ *.bundle
19
+ *.so
20
+ *.o
21
+ *.a
22
+ mkmf.log
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in gnurr.gemspec
4
+ gemspec
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2016 Ben Saufley
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,87 @@
1
+ # Gnurr
2
+
3
+ ### _n._ The substance that collects over time in the bottoms of pockets or cuffs of trousers; pocket lint.
4
+
5
+ [![Gem Version](https://badge.fury.io/rb/gnurr.svg)](https://badge.fury.io/rb/gnurr)
6
+ [![Code Climate](https://codeclimate.com/github/bensaufley/gnurr/badges/gpa.svg)](https://codeclimate.com/github/bensaufley/gnurr)
7
+ [![Test Coverage](https://codeclimate.com/github/bensaufley/gnurr/badges/coverage.svg)](https://codeclimate.com/github/bensaufley/gnurr/coverage)
8
+ [![Issue Count](https://codeclimate.com/github/bensaufley/gnurr/badges/issue_count.svg)](https://codeclimate.com/github/bensaufley/gnurr)
9
+
10
+ Runs ESLint, SCSS-Lint, HAML-Lint, and Rubocop and returns info relevant to changed lines as reported by git.
11
+
12
+ ## Installation
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
+ As this gem is built to work with your git diffs, it does also require git.
29
+ If you've managed to execute the above code, you're already there.
30
+
31
+ ### Eventually, you'll be able to:
32
+
33
+ Add this line to your application's Gemfile:
34
+
35
+ ```bash
36
+ gem 'gnurr', group: :development, require :false
37
+ ```
38
+
39
+ And then execute:
40
+
41
+ ```sh
42
+ $ bundle
43
+ ```
44
+
45
+ Or install it yourself as:
46
+
47
+ ```sh
48
+ $ gem install gnurr
49
+ ```
50
+
51
+ ## Usage
52
+
53
+ In Ruby:
54
+
55
+ ```rb
56
+ gnurr = Gnurr::Processor.new(options)
57
+ # Options:
58
+ # branch: base branch to diff (default: master)
59
+ # linters: which linters to run (default: es,haml,ruby,scss (all))
60
+ # verbose: turn on verbose mode
61
+ gnurr.execute
62
+ ```
63
+
64
+ In your shell:
65
+
66
+ ```sh
67
+ $ gnurr --help
68
+ Usage: gnurr [options]
69
+ -b, --branch NAME Base branch: branch to diff against (default: master)
70
+ -l, --linters LIST Linters to use (default: es,haml,ruby,scss (all))
71
+ -v, --verbose Verbose mode (false unless specified)
72
+ -h, --help Prints this help
73
+ ```
74
+
75
+ ## Contributing
76
+
77
+ 1. Fork it ( https://github.com/bensaufley/gnurr/fork )
78
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
79
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
80
+ 4. Push to the branch (`git push origin my-new-feature`)
81
+ 5. Create a new Pull Request
82
+
83
+ [ESLint]: http://eslint.org
84
+ [HAML-Lint]: https://github.com/brigade/haml-lint
85
+ [Rubocop]: https://github.com/bbatsov/rubocop
86
+ [SCSS-Lint]: https://github.com/brigade/scss-lint
87
+ [npm-install]: http://eslint.org/docs/user-guide/getting-started
@@ -0,0 +1 @@
1
+ require 'bundler/gem_tasks'
@@ -0,0 +1,37 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ $LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
4
+
5
+ require 'gnurr'
6
+ require 'optparse'
7
+
8
+ options = {
9
+ stdout: true
10
+ }
11
+
12
+ option_parser = OptionParser.new do |opts|
13
+ opts.banner = 'Usage: gnurr [options]'
14
+
15
+ opts.on('-b', '--branch NAME', 'Base branch: branch to diff against (default: master)') { |v| options[:branch] = v }
16
+ opts.on('-l', '--linters LIST', 'Linters to use (default: es,haml,ruby,scss (all))') { |v| options[:linters] = v.split(',').map(&:to_sym) }
17
+ opts.on('-v', '--verbose', 'Verbose mode (false unless specified)') { options[:verbose] = true }
18
+
19
+ opts.on('-h', '--help', 'Prints this help') do
20
+ puts opts
21
+ exit
22
+ end
23
+ end
24
+
25
+ begin
26
+ option_parser.parse!
27
+ rescue OptionParser::InvalidOption => error
28
+ puts "Gnurr doesn't recognize that #{error}"
29
+ exit
30
+ rescue OptionParser::AmbiguousOption => error
31
+ puts "That's an #{error}"
32
+ exit
33
+ end
34
+
35
+ linter = Gnurr::Processor.new(options)
36
+
37
+ linter.execute
@@ -0,0 +1,9 @@
1
+ require 'gnurr/version'
2
+ require 'json'
3
+ require 'colorize'
4
+
5
+ require 'gnurr/es_linter'
6
+ require 'gnurr/haml_linter'
7
+ require 'gnurr/ruby_linter'
8
+ require 'gnurr/scss_linter'
9
+ require 'gnurr/processor'
@@ -0,0 +1,38 @@
1
+ require 'gnurr/linter'
2
+
3
+ module Gnurr
4
+ # ES/JS Linter
5
+ class EsLinter < Linter
6
+ def type
7
+ :es
8
+ end
9
+
10
+ def color
11
+ :red
12
+ end
13
+
14
+ def command
15
+ 'eslint -f json'
16
+ end
17
+
18
+ def filter(file)
19
+ File.extname(file) == '.js'
20
+ end
21
+
22
+ private
23
+
24
+ def map_errors(file)
25
+ [
26
+ file['filePath'],
27
+ file['messages'].map do |message|
28
+ next unless @files[file['filePath'].sub("#{pwd}/", '')].include?(message['line'])
29
+ standardize(message, 'column', 'line', 'ruleId', 'message', 'severity', 2)
30
+ end.reject(&:nil?)
31
+ ]
32
+ end
33
+
34
+ def pwd
35
+ @pwd ||= `printf $(pwd)`
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,22 @@
1
+ require 'gnurr/ruby_base_linter'
2
+
3
+ module Gnurr
4
+ # HAML Linter
5
+ class HamlLinter < RubyBaseLinter
6
+ def type
7
+ :haml
8
+ end
9
+
10
+ def color
11
+ :magenta
12
+ end
13
+
14
+ def command
15
+ 'haml-lint -r json'
16
+ end
17
+
18
+ def filter(file)
19
+ File.extname(file) == '.haml'
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,123 @@
1
+ module Gnurr
2
+ # Base linter class from which each linter extends
3
+ class Linter
4
+ def initialize(files, options)
5
+ @options = options
6
+ @files = Hash[files.select { |file, _lines| filter(file) }]
7
+ @messages = {} if @files.empty?
8
+ relevant_messages
9
+ end
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)
29
+ end
30
+
31
+ def errors(json)
32
+ return [] unless json && !json.empty?
33
+ json.map { |files| map_errors(files) }
34
+ .select { |_f, messages| messages && !messages.empty? }
35
+ end
36
+
37
+ def puts_line_diffs
38
+ diffs = line_diffs
39
+ if diffs.empty?
40
+ puts "#{left_bump(2)}No changes.".colorize(mode: :bold)
41
+ else
42
+ puts "#{left_bump(2)}Lines changed:".colorize(mode: :bold)
43
+ diffs.each do |filename, lines|
44
+ puts "#{left_bump(3)}#{filename}:#{lines.join(', ').colorize(:cyan)}"
45
+ end
46
+ end
47
+ end
48
+
49
+ def line_diffs
50
+ Hash[
51
+ @files.map do |filename, lines|
52
+ [filename, array_to_ranges(lines)]
53
+ end
54
+ ]
55
+ end
56
+
57
+ def relevant_messages
58
+ @messages ||= errors(JSON.parse(`git diff --name-only --diff-filter=ACMRTUXB #{@options[:branch]} #{@files.map(&:first).join(' ')} | xargs #{command}`))
59
+ rescue => e
60
+ if @options[:stdout]
61
+ puts "#{'ERROR'.colorize(:red)}: #{e}"
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]
73
+ end
74
+
75
+ private
76
+
77
+ def array_to_ranges(array)
78
+ array = array.compact.uniq.sort
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)
99
+ end
100
+
101
+ def format_linter(message)
102
+ message[:linter] ? " (#{message[:linter]})".colorize(:cyan) : ''
103
+ end
104
+
105
+ def left_bump(indent = 1)
106
+ '▎'.ljust(indent * 2).colorize(color: color)
107
+ end
108
+
109
+ def map_errors(errors)
110
+ # Empty: filled by subclasses
111
+ end
112
+
113
+ def standardize(message, column, line, linter, description, severity, error)
114
+ {
115
+ column: message[column],
116
+ line: message[line],
117
+ linter: message[linter],
118
+ message: message[description],
119
+ severity: message[severity] == error ? :error : :warning
120
+ }
121
+ end
122
+ end
123
+ end
@@ -0,0 +1,54 @@
1
+ module Gnurr
2
+ # Main class for execution
3
+ class Processor
4
+ LINTERS = {
5
+ es: EsLinter,
6
+ haml: HamlLinter,
7
+ ruby: RubyLinter,
8
+ scss: ScssLinter
9
+ }.freeze
10
+
11
+ def initialize(options)
12
+ if options[:linters] && !options[:linters].empty?
13
+ options[:linters] = LINTERS.keys & options[:linters]
14
+ end
15
+ @options = {
16
+ branch: 'master',
17
+ linters: LINTERS.keys,
18
+ stdout: false,
19
+ verbose: false
20
+ }.merge(options)
21
+ end
22
+
23
+ def execute
24
+ lints = {}
25
+ @options[:linters].each do |type|
26
+ lints[type] = LINTERS[type].new(diffs, @options)
27
+ lints[type].pretty_print if @options[:stdout]
28
+ end
29
+ lints
30
+ end
31
+
32
+ private
33
+
34
+ def extract_line_sets(diffs)
35
+ diffs.map do |lines|
36
+ nums = lines.match(/^.+\+(?<from>[0-9]+)(,(?<len>[0-9]+))? .+$/)
37
+ Range.new(nums[:from].to_i, nums[:from].to_i + nums[:len].to_i)
38
+ end.map(&:to_a).flatten
39
+ end
40
+
41
+ def line_diffs(file)
42
+ diffs = `git diff --unified=0 #{@options[:branch]} #{file} | egrep '\\+[0-9]+(,[1-9][0-9]*)? '`.split("\n")
43
+ extract_line_sets(diffs)
44
+ end
45
+
46
+ def diffs
47
+ return @diff if @diff
48
+ diff = `git diff #{@options[:branch]} --name-only --diff-filter=ACMRTUXB`
49
+ .split("\n")
50
+ .map { |file| [file, line_diffs(file)] }
51
+ @diff = Hash[diff.select { |_k, v| v && !v.empty? }]
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,32 @@
1
+ require 'gnurr/linter'
2
+
3
+ module Gnurr
4
+ # Class from which Haml and Ruby extend
5
+ class RubyBaseLinter < Linter
6
+ def errors(json)
7
+ super(json['files'])
8
+ end
9
+
10
+ private
11
+
12
+ def map_errors(file)
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
+ ]
20
+ end
21
+
22
+ def standardize(message)
23
+ {
24
+ column: message['location']['column'], # nil in haml-lint
25
+ line: message['location']['line'],
26
+ linter: message['cop_name'], # nil in haml-lint
27
+ message: message['message'],
28
+ severity: message['severity'] == 'error' ? :error : :warning
29
+ }
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,26 @@
1
+ require 'gnurr/ruby_base_linter'
2
+
3
+ module Gnurr
4
+ # Ruby Linter
5
+ class RubyLinter < RubyBaseLinter
6
+ def type
7
+ :ruby
8
+ end
9
+
10
+ def color
11
+ :yellow
12
+ end
13
+
14
+ def command
15
+ 'rubocop -f json'
16
+ end
17
+
18
+ def filter(file)
19
+ eligible_files.include?(file)
20
+ end
21
+
22
+ def eligible_files
23
+ @eligible_files ||= `rubocop -L`.split("\n")
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,35 @@
1
+ require 'gnurr/linter'
2
+
3
+ module Gnurr
4
+ # SASS Linter
5
+ class ScssLinter < Linter
6
+ def type
7
+ :scss
8
+ end
9
+
10
+ def color
11
+ :blue
12
+ end
13
+
14
+ def command
15
+ 'scss-lint -f JSON'
16
+ end
17
+
18
+ def filter(file)
19
+ File.extname(file) == '.scss'
20
+ end
21
+
22
+ private
23
+
24
+ def map_errors(params)
25
+ filename, messages = params
26
+ [
27
+ filename,
28
+ messages.map do |message|
29
+ next unless @files[filename].include?(message['line'])
30
+ standardize(message, 'column', 'line', 'linter', 'reason', 'severity', 'error')
31
+ end.reject(&:nil?)
32
+ ]
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,3 @@
1
+ module Gnurr
2
+ VERSION = '0.2.1'.freeze
3
+ end
@@ -0,0 +1,34 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'gnurr/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = 'gnurr'
8
+ spec.version = Gnurr::VERSION
9
+ spec.authors = ['Ben Saufley']
10
+ spec.email = ['contact@bensaufley.com']
11
+ spec.summary = 'Diff-specific linter'
12
+ spec.description = 'Runs ESLint, SCSS-Lint, HAML-Lint, and Rubocop and returns info relevant to changed lines as reported by git.'
13
+ spec.homepage = 'http://github.com/bensaufley/gnurr'
14
+ spec.license = 'MIT'
15
+
16
+ spec.files = `git ls-files -z`.split("\x0")
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ['lib']
20
+ spec.requirements += [
21
+ 'git',
22
+ 'npm and eslint for JS linting'
23
+ ]
24
+
25
+ spec.required_ruby_version = '~> 2.3.0'
26
+
27
+ spec.add_development_dependency 'bundler', '~> 1.6'
28
+ spec.add_development_dependency 'rake'
29
+ spec.add_development_dependency 'git', '~> 1.3.0'
30
+ spec.add_development_dependency 'colorize'
31
+ spec.add_development_dependency 'haml_lint', '~> 0.16.1'
32
+ spec.add_development_dependency 'scss_lint', '~> 0.47.0'
33
+ spec.add_development_dependency 'rubocop', '~> 0.37.2'
34
+ end
metadata ADDED
@@ -0,0 +1,162 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: gnurr
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.2.1
5
+ platform: ruby
6
+ authors:
7
+ - Ben Saufley
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-03-02 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.6'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.6'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: git
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: 1.3.0
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: 1.3.0
55
+ - !ruby/object:Gem::Dependency
56
+ name: colorize
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: haml_lint
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
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: 0.37.2
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: 0.37.2
111
+ description: Runs ESLint, SCSS-Lint, HAML-Lint, and Rubocop and returns info relevant
112
+ to changed lines as reported by git.
113
+ email:
114
+ - contact@bensaufley.com
115
+ executables:
116
+ - gnurr
117
+ extensions: []
118
+ extra_rdoc_files: []
119
+ files:
120
+ - ".gitignore"
121
+ - Gemfile
122
+ - LICENSE.txt
123
+ - README.md
124
+ - Rakefile
125
+ - bin/gnurr
126
+ - lib/gnurr.rb
127
+ - lib/gnurr/es_linter.rb
128
+ - lib/gnurr/haml_linter.rb
129
+ - lib/gnurr/linter.rb
130
+ - lib/gnurr/processor.rb
131
+ - lib/gnurr/ruby_base_linter.rb
132
+ - lib/gnurr/ruby_linter.rb
133
+ - lib/gnurr/scss_linter.rb
134
+ - lib/gnurr/version.rb
135
+ - linte.gemspec
136
+ homepage: http://github.com/bensaufley/gnurr
137
+ licenses:
138
+ - MIT
139
+ metadata: {}
140
+ post_install_message:
141
+ rdoc_options: []
142
+ require_paths:
143
+ - lib
144
+ required_ruby_version: !ruby/object:Gem::Requirement
145
+ requirements:
146
+ - - "~>"
147
+ - !ruby/object:Gem::Version
148
+ version: 2.3.0
149
+ required_rubygems_version: !ruby/object:Gem::Requirement
150
+ requirements:
151
+ - - ">="
152
+ - !ruby/object:Gem::Version
153
+ version: '0'
154
+ requirements:
155
+ - git
156
+ - npm and eslint for JS linting
157
+ rubyforge_project:
158
+ rubygems_version: 2.4.8
159
+ signing_key:
160
+ specification_version: 4
161
+ summary: Diff-specific linter
162
+ test_files: []