gnurr 0.2.5 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 67dd4c735c0af29c5c40a74d9b25241e723172e4
4
- data.tar.gz: cd92ee12536108edb616fc4dff5ea0e62d04a7bb
3
+ metadata.gz: ec8dc0ae5118bc1e00b8ac8831c5a48e133fa857
4
+ data.tar.gz: c1b3154f7600edcc0073cf1bc94bac6a067caf30
5
5
  SHA512:
6
- metadata.gz: bd4cd3f9f819d4337b2763d0e1b4a3aeac3386285e0a8d7551a77b9326966a98af2ccabded9138394341a6fd30ef3b9a27d3a09658d26ac9b34f487645b9ef73
7
- data.tar.gz: cdb97a4c2f40696efcda774e10811545fd21afc43942e94bdcdf5d109d952d756cb85771adf5991523b7569900ae3a04081440b7dd26b6f72efc8f3dbd30dc4c
6
+ metadata.gz: a441515d7b3fd646d64ebae22d92f22ec0044d32219cf866560b3deaa6349671712a7752adc1d449801866a27e3a7bbe4155d8836e53c2b40b37979323880c21
7
+ data.tar.gz: cbef0d8c7e1a8c0f411aad2820b6580029aa133dc7ed1057f1472fef2d19d5850af5ce7240b0b0183c8953139c9ddd7cbaa8192ba73c4639481279c369649ac6
data/README.md CHANGED
@@ -41,8 +41,10 @@ In Ruby:
41
41
  ```rb
42
42
  gnurr = Gnurr::Processor.new(options)
43
43
  # Options:
44
- # branch: base branch to diff (default: master)
45
- # linters: which linters to run (default: es,haml,ruby,scss (all))
44
+ # base: Base reference: branch, SHA, etc for diff (default: master)
45
+ # expanded: Show lints for all changed files, not just changed lines
46
+ # (false unless specified)
47
+ # linters: Linters to use (default: es,haml,ruby,scss (all))
46
48
  # verbose: turn on verbose mode
47
49
  gnurr.execute
48
50
  ```
@@ -52,9 +54,12 @@ In your shell:
52
54
  ```sh
53
55
  $ gnurr --help
54
56
  Usage: gnurr [options]
55
- -b, --branch NAME Base branch: branch to diff against (default: master)
57
+ -b, --base NAME Base reference: branch, SHA, etc for diff (default: master)
58
+ -e, --expanded Show lints for all changed files, not just changed lines (false
59
+ unless specified)
56
60
  -l, --linters LIST Linters to use (default: es,haml,ruby,scss (all))
57
- -v, --verbose Verbose mode (false unless specified)
61
+ -v, --[no-]verbose Run verbosely
62
+ --version Show version
58
63
  -h, --help Prints this help
59
64
  ```
60
65
 
data/bin/gnurr CHANGED
@@ -14,7 +14,7 @@ option_parser = OptionParser.new do |opts|
14
14
 
15
15
  opts.on('-b', '--base NAME',
16
16
  'Base reference: branch, SHA, etc for diff (default: master)') do |v|
17
- options[:branch] = v
17
+ options[:base] = v
18
18
  end
19
19
 
20
20
  opts.on('-e', '--expanded',
@@ -20,7 +20,7 @@ Gem::Specification.new do |spec|
20
20
  spec.requirements += [
21
21
  'git',
22
22
  'npm and eslint for JS linting',
23
- 'haml_lint for Ruby linting',
23
+ 'haml_lint for HAML linting',
24
24
  'scss_lint for SCSS linting',
25
25
  'rubocop for Ruby linting'
26
26
  ]
@@ -1,9 +1,3 @@
1
1
  require 'gnurr/version'
2
- require 'json'
3
- require 'colorize'
4
2
 
5
- require 'gnurr/es_linter'
6
- require 'gnurr/haml_linter'
7
- require 'gnurr/ruby_linter'
8
- require 'gnurr/scss_linter'
9
3
  require 'gnurr/processor'
@@ -1,6 +1,11 @@
1
+ require 'colorize'
2
+ require 'gnurr/helper'
3
+
1
4
  module Gnurr
2
5
  # For outputting stuff using the command-line tool
3
6
  module CLI
7
+ include Gnurr::Helper
8
+
4
9
  def print_messages
5
10
  format_start
6
11
  format_messages || format_all_clear
@@ -1,6 +1,10 @@
1
+ require 'gnurr/helper'
2
+
1
3
  module Gnurr
2
4
  # For handling/reading Git output
3
5
  module Git
6
+ include Gnurr::Helper
7
+
4
8
  private
5
9
 
6
10
  def extract_lines(diffs)
@@ -12,14 +16,14 @@ module Gnurr
12
16
 
13
17
  def full_file_diff
14
18
  return @diff if @diff
15
- diff = `git diff #{@options[:branch]} --name-only --diff-filter=ACMRTUXB`
19
+ diff = `git diff #{@options[:base]} --name-only --diff-filter=ACMRTUXB`
16
20
  .split("\n")
17
21
  .map { |file| [file, file_diffs(file)] }
18
22
  @diff = Hash[diff.select { |_k, v| v && v.any? }]
19
23
  end
20
24
 
21
25
  def file_diffs(file)
22
- diffs = `git diff --unified=0 #{@options[:branch]} #{file} \
26
+ diffs = `git diff --unified=0 #{@options[:base]} #{escaped_filename(file)} \
23
27
  | egrep '\\+[0-9]+(,[1-9][0-9]*)? '`
24
28
  extract_lines(diffs.split("\n"))
25
29
  end
@@ -1,3 +1,5 @@
1
+ require 'colorize'
2
+
1
3
  module Gnurr
2
4
  # Miscellaneous helper methods for the gem
3
5
  module Helper
@@ -17,6 +19,10 @@ module Gnurr
17
19
  ranges + [Range.new(left, right)]
18
20
  end
19
21
 
22
+ def escaped_filename(filename)
23
+ filename.sub(/(\s)/,'\\\\\1')
24
+ end
25
+
20
26
  def left_bump(indent = 1)
21
27
  '▎'.ljust(indent * 2).colorize(color: color)
22
28
  end
@@ -1,3 +1,5 @@
1
+ require 'json'
2
+
1
3
  require 'gnurr/helper'
2
4
  require 'gnurr/cli'
3
5
  require 'gnurr/git'
@@ -10,7 +12,12 @@ module Gnurr
10
12
  include Gnurr::Git
11
13
 
12
14
  def initialize(options)
13
- @options = options
15
+ @options = {
16
+ base: 'master',
17
+ expanded: false,
18
+ stdout: false,
19
+ verbose: false
20
+ }.merge(options)
14
21
  raise "Dependency not available for #{type}" unless requirements_met?
15
22
  rescue => e
16
23
  log_error(e)
@@ -71,7 +78,7 @@ module Gnurr
71
78
 
72
79
  def escaped_files
73
80
  files.map do |file, _lines|
74
- file.sub(/(\s)/, '\\\\\1')
81
+ escaped_filename(file)
75
82
  end
76
83
  end
77
84
 
@@ -96,7 +103,7 @@ module Gnurr
96
103
  false # Can't lint from base class
97
104
  end
98
105
 
99
- def standardize_message(message)
106
+ def standardize_message(_message)
100
107
  raise 'Can\'t standardize on base Linter class'
101
108
  end
102
109
  end
@@ -0,0 +1,58 @@
1
+ require 'gnurr/linter'
2
+
3
+ module Gnurr
4
+ module Linters
5
+ # ES/JS Linter
6
+ class EsLinter < Linter
7
+ def type
8
+ :es
9
+ end
10
+
11
+ def color
12
+ :red
13
+ end
14
+
15
+ def command
16
+ 'eslint -f json'
17
+ end
18
+
19
+ def filter(file)
20
+ File.extname(file) == '.js'
21
+ end
22
+
23
+ private
24
+
25
+ def file_path(file)
26
+ file['filePath']
27
+ end
28
+
29
+ def file_messages(file)
30
+ file['messages']
31
+ end
32
+
33
+ def relative_filename(filename)
34
+ filename.sub(%r{^#{pwd}/}, '')
35
+ end
36
+
37
+ def requirements_met?
38
+ !`eslint -v`.nil?
39
+ rescue
40
+ false
41
+ end
42
+
43
+ def pwd
44
+ @pwd ||= `printf $(pwd)`
45
+ end
46
+
47
+ def standardize_message(message)
48
+ {
49
+ column: message['column'],
50
+ line: message['line'],
51
+ linter: message['ruleId'],
52
+ message: message['message'],
53
+ severity: message['severity'] == 2 ? :error : :warning
54
+ }
55
+ end
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,32 @@
1
+ require 'gnurr/linters/ruby_based_linters'
2
+
3
+ module Gnurr
4
+ module Linters
5
+ # HAML Linter
6
+ class HamlLinter
7
+ include Gnurr::Linters::RubyBasedLinters
8
+
9
+ def type
10
+ :haml
11
+ end
12
+
13
+ def color
14
+ :magenta
15
+ end
16
+
17
+ def command
18
+ 'haml-lint -r json'
19
+ end
20
+
21
+ def filter(file)
22
+ File.extname(file) == '.haml'
23
+ end
24
+
25
+ private
26
+
27
+ def requirements_met?
28
+ Gem::Specification.find_all_by_name('haml_lint').any?
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,33 @@
1
+ require 'gnurr/linter'
2
+
3
+ module Gnurr
4
+ module Linters
5
+ # Class from which Haml and Ruby extend
6
+ module RubyBasedLinters
7
+ private
8
+
9
+ def file_path(file)
10
+ file['path']
11
+ end
12
+
13
+ def file_messages(file)
14
+ file['offenses']
15
+ end
16
+
17
+ def messages
18
+ return @messages = {} if files.empty?
19
+ @messages ||= parse_messages(relevant_messages['files'])
20
+ end
21
+
22
+ def standardize_message(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
33
+ end
@@ -0,0 +1,36 @@
1
+ require 'gnurr/linters/ruby_based_linters'
2
+
3
+ module Gnurr
4
+ module Linters
5
+ # Ruby Linter
6
+ class RubyLinter < Linter
7
+ include Gnurr::Linters::RubyBasedLinters
8
+
9
+ def type
10
+ :ruby
11
+ end
12
+
13
+ def color
14
+ :yellow
15
+ end
16
+
17
+ def command
18
+ 'rubocop -f json'
19
+ end
20
+
21
+ def filter(file)
22
+ eligible_files.include?(file)
23
+ end
24
+
25
+ def eligible_files
26
+ @eligible_files ||= `rubocop -L`.split("\n")
27
+ end
28
+
29
+ private
30
+
31
+ def requirements_met?
32
+ Gem::Specification.find_all_by_name('rubocop').any?
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,48 @@
1
+ require 'gnurr/linter'
2
+
3
+ module Gnurr
4
+ module Linters
5
+ # SASS Linter
6
+ class ScssLinter < Linter
7
+ def type
8
+ :scss
9
+ end
10
+
11
+ def color
12
+ :blue
13
+ end
14
+
15
+ def command
16
+ 'scss-lint -f JSON'
17
+ end
18
+
19
+ def filter(file)
20
+ File.extname(file) == '.scss'
21
+ end
22
+
23
+ private
24
+
25
+ def file_path(params)
26
+ params[0]
27
+ end
28
+
29
+ def file_messages(params)
30
+ params[1]
31
+ end
32
+
33
+ def requirements_met?
34
+ Gem::Specification.find_all_by_name('scss_lint').any?
35
+ end
36
+
37
+ def standardize_message(message)
38
+ {
39
+ column: message['column'],
40
+ line: message['line'],
41
+ linter: message['linter'],
42
+ message: message['reason'],
43
+ severity: message['severity'] == 'error' ? :error : :warning
44
+ }
45
+ end
46
+ end
47
+ end
48
+ end
@@ -1,37 +1,42 @@
1
+ require 'gnurr/linters/es_linter'
2
+ require 'gnurr/linters/haml_linter'
3
+ require 'gnurr/linters/ruby_linter'
4
+ require 'gnurr/linters/scss_linter'
5
+
1
6
  module Gnurr
2
7
  # Main class for execution
3
8
  class Processor
4
9
  LINTERS = {
5
- es: EsLinter,
6
- haml: HamlLinter,
7
- ruby: RubyLinter,
8
- scss: ScssLinter
10
+ es: Gnurr::Linters::EsLinter,
11
+ haml: Gnurr::Linters::HamlLinter,
12
+ ruby: Gnurr::Linters::RubyLinter,
13
+ scss: Gnurr::Linters::ScssLinter
9
14
  }.freeze
10
15
 
11
16
  def initialize(options = {})
12
- if options[:linters] && options[:linters].any?
13
- options[:linters] = LINTERS.keys & options[:linters]
17
+ @options = options
18
+ if @options[:linters] && options[:linters].any?
19
+ @options[:linters] = LINTERS.keys & @options[:linters]
20
+ else
21
+ @options[:linters] = LINTERS.keys
14
22
  end
15
- @options = {
16
- branch: 'master',
17
- expanded: false,
18
- linters: LINTERS.keys,
19
- stdout: false,
20
- verbose: false
21
- }.merge(options)
22
23
  end
23
24
 
24
25
  def execute
25
- lints = {}
26
+ @lints ||= {}
26
27
  @options[:linters].each do |type|
27
28
  begin
28
- lints[type] = LINTERS[type].new(@options)
29
- lints[type].execute
29
+ @lints[type] = LINTERS[type].new(@options)
30
+ @lints[type].execute
30
31
  rescue => e
31
- lints[type] = e.inspect
32
+ @lints[type] = e.inspect
32
33
  end
33
34
  end
34
- lints
35
+ @lints
36
+ end
37
+
38
+ def lints
39
+ @lints ||= {}
35
40
  end
36
41
  end
37
42
  end
@@ -1,3 +1,3 @@
1
1
  module Gnurr
2
- VERSION = '0.2.5'.freeze
2
+ VERSION = '0.3.0'.freeze
3
3
  end
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.5
4
+ version: 0.3.0
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-04 00:00:00.000000000 Z
11
+ date: 2016-03-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -72,15 +72,15 @@ files:
72
72
  - gnurr.gemspec
73
73
  - lib/gnurr.rb
74
74
  - lib/gnurr/cli.rb
75
- - lib/gnurr/es_linter.rb
76
75
  - lib/gnurr/git.rb
77
- - lib/gnurr/haml_linter.rb
78
76
  - lib/gnurr/helper.rb
79
77
  - lib/gnurr/linter.rb
78
+ - lib/gnurr/linters/es_linter.rb
79
+ - lib/gnurr/linters/haml_linter.rb
80
+ - lib/gnurr/linters/ruby_based_linters.rb
81
+ - lib/gnurr/linters/ruby_linter.rb
82
+ - lib/gnurr/linters/scss_linter.rb
80
83
  - lib/gnurr/processor.rb
81
- - lib/gnurr/ruby_base_linter.rb
82
- - lib/gnurr/ruby_linter.rb
83
- - lib/gnurr/scss_linter.rb
84
84
  - lib/gnurr/version.rb
85
85
  homepage: http://github.com/bensaufley/gnurr
86
86
  licenses:
@@ -103,7 +103,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
103
103
  requirements:
104
104
  - git
105
105
  - npm and eslint for JS linting
106
- - haml_lint for Ruby linting
106
+ - haml_lint for HAML linting
107
107
  - scss_lint for SCSS linting
108
108
  - rubocop for Ruby linting
109
109
  rubyforge_project:
@@ -1,56 +0,0 @@
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 file_path(file)
25
- file['filePath']
26
- end
27
-
28
- def file_messages(file)
29
- file['messages']
30
- end
31
-
32
- def relative_filename(filename)
33
- filename.sub(%r{^#{pwd}/}, '')
34
- end
35
-
36
- def requirements_met?
37
- !`eslint -v`.nil?
38
- rescue
39
- false
40
- end
41
-
42
- def pwd
43
- @pwd ||= `printf $(pwd)`
44
- end
45
-
46
- def standardize_message(message)
47
- {
48
- column: message['column'],
49
- line: message['line'],
50
- linter: message['ruleId'],
51
- message: message['message'],
52
- severity: message['severity'] == 2 ? :error : :warning
53
- }
54
- end
55
- end
56
- end
@@ -1,28 +0,0 @@
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
-
22
- private
23
-
24
- def requirements_met?
25
- Gem::Specification.find_all_by_name('haml_lint').any?
26
- end
27
- end
28
- end
@@ -1,31 +0,0 @@
1
- require 'gnurr/linter'
2
-
3
- module Gnurr
4
- # Class from which Haml and Ruby extend
5
- class RubyBaseLinter < Linter
6
- private
7
-
8
- def file_path(file)
9
- file['path']
10
- end
11
-
12
- def file_messages(file)
13
- file['offenses']
14
- end
15
-
16
- def messages
17
- return @messages = {} if files.empty?
18
- @messages ||= parse_messages(relevant_messages['files'])
19
- end
20
-
21
- def standardize_message(message)
22
- {
23
- column: message['location']['column'], # nil in haml-lint
24
- line: message['location']['line'],
25
- linter: message['cop_name'], # nil in haml-lint
26
- message: message['message'],
27
- severity: message['severity'] == 'error' ? :error : :warning
28
- }
29
- end
30
- end
31
- end
@@ -1,32 +0,0 @@
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
-
26
- private
27
-
28
- def requirements_met?
29
- Gem::Specification.find_all_by_name('rubocop').any?
30
- end
31
- end
32
- end
@@ -1,46 +0,0 @@
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 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
- }
44
- end
45
- end
46
- end