gnurr 0.2.1

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.
@@ -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: []