erb_lint 0.0.35 → 0.0.36

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1bec7519ea346d89eb70e485c59015ea8faae7f4c85f4e3b450a4f8853eaa9b5
4
- data.tar.gz: dba705708221bc3b5a71c57d6d9cbf1db2f7c8afbfaa7ed45fc63e71433383b5
3
+ metadata.gz: 63f417288a7c49d68dcd0a04bbf07d4c8fc31c424cec244ddebab39ed3e5fab4
4
+ data.tar.gz: 22649a4264e1c570fe4a39e4112ea402d5ae04da3aaf7c35d3ce685c6fff7e21
5
5
  SHA512:
6
- metadata.gz: 770cd1f544b749a7210949b1221ec4401349cb30bf9a171c1b7677c3d051f9887e264d62e1c8b86c5b09c593bc96b24b867a35b2bf11f4dfe2d8a17f54332d5c
7
- data.tar.gz: ae1f2c592fba2fce5a70eb0620024c49cdca3173388791036bb9e2ed56b3b0cbdf3e6361c0b68c94fc222640aba5422c6fd5c15d8691fa019d0a9cfc038e96a3
6
+ metadata.gz: c0c1a2bdef25b71c750708c661aea9504551f3bcc53e7ed2017056f15d2789be58e4f758fe3735885ff4da6d43c0501f99542ce764737a8c072c24f228239155
7
+ data.tar.gz: 0653d4ec366580de6a08aff33263e9415f96ecb4bc9e579db20979f8ffb0d238cc6db9e361877ca529eef2fdf45c98233ec1ddf39cb4c01d6560a2e30fa6b489
@@ -12,8 +12,15 @@ require 'erb_lint/processed_source'
12
12
  require 'erb_lint/runner_config'
13
13
  require 'erb_lint/runner'
14
14
  require 'erb_lint/version'
15
+ require 'erb_lint/stats'
16
+ require 'erb_lint/reporter'
15
17
 
16
18
  # Load linters
17
19
  Dir[File.expand_path('erb_lint/linters/**/*.rb', File.dirname(__FILE__))].each do |file|
18
20
  require file
19
21
  end
22
+
23
+ # Load reporters
24
+ Dir[File.expand_path('erb_lint/reporters/**/*.rb', File.dirname(__FILE__))].each do |file|
25
+ require file
26
+ end
@@ -14,16 +14,8 @@ module ERBLint
14
14
  DEFAULT_LINT_ALL_GLOB = "**/*.html{+*,}.erb"
15
15
 
16
16
  class ExitWithFailure < RuntimeError; end
17
- class ExitWithSuccess < RuntimeError; end
18
17
 
19
- class Stats
20
- attr_accessor :found, :corrected, :exceptions
21
- def initialize
22
- @found = 0
23
- @corrected = 0
24
- @exceptions = 0
25
- end
26
- end
18
+ class ExitWithSuccess < RuntimeError; end
27
19
 
28
20
  def initialize
29
21
  @options = {}
@@ -51,9 +43,12 @@ module ERBLint
51
43
  failure!('no linter available with current configuration')
52
44
  end
53
45
 
54
- puts "Linting #{lint_files.size} files with "\
55
- "#{enabled_linter_classes.size} #{'autocorrectable ' if autocorrect?}linters..."
56
- puts
46
+ @options[:format] ||= :multiline
47
+ @stats.files = lint_files.size
48
+ @stats.linters = enabled_linter_classes.size
49
+
50
+ reporter = Reporter.create_reporter(@options[:format], @stats, autocorrect?)
51
+ reporter.preview
57
52
 
58
53
  runner = ERBLint::Runner.new(file_loader, @config)
59
54
 
@@ -72,20 +67,7 @@ module ERBLint
72
67
  end
73
68
  end
74
69
 
75
- if @stats.corrected > 0
76
- corrected_found_diff = @stats.found - @stats.corrected
77
- if corrected_found_diff > 0
78
- warn(Rainbow(
79
- "#{@stats.corrected} error(s) corrected and #{corrected_found_diff} error(s) remaining in ERB files"
80
- ).red)
81
- else
82
- puts Rainbow("#{@stats.corrected} error(s) corrected in ERB files").green
83
- end
84
- elsif @stats.found > 0
85
- warn(Rainbow("#{@stats.found} error(s) were found in ERB files").red)
86
- else
87
- puts Rainbow("No errors were found in ERB files").green
88
- end
70
+ reporter.show
89
71
 
90
72
  @stats.found == 0 && @stats.exceptions == 0
91
73
  rescue OptionParser::InvalidOption, OptionParser::InvalidArgument, ExitWithFailure => e
@@ -126,15 +108,12 @@ module ERBLint
126
108
  file_content = corrector.corrected_content
127
109
  runner.clear_offenses
128
110
  end
111
+ offenses_filename = relative_filename(filename)
112
+ offenses = runner.offenses || []
129
113
 
130
- @stats.found += runner.offenses.size
131
- runner.offenses.each do |offense|
132
- puts <<~EOF
133
- #{offense.message}#{Rainbow(' (not autocorrected)').red if autocorrect?}
134
- In file: #{relative_filename(filename)}:#{offense.line_range.begin}
135
-
136
- EOF
137
- end
114
+ @stats.found += offenses.size
115
+ @stats.processed_files[offenses_filename] ||= []
116
+ @stats.processed_files[offenses_filename] |= offenses
138
117
  end
139
118
 
140
119
  def correct(processed_source, offenses)
@@ -258,6 +237,15 @@ module ERBLint
258
237
  end
259
238
  end
260
239
 
240
+ opts.on("--format FORMAT", format_options_help) do |format|
241
+ unless Reporter.available_format?(format)
242
+ error_message = invalid_format_error_message(format)
243
+ failure!(error_message)
244
+ end
245
+
246
+ @options[:format] = format
247
+ end
248
+
261
249
  opts.on("--lint-all", "Lint all files matching configured glob [default: #{DEFAULT_LINT_ALL_GLOB}]") do |config|
262
250
  @options[:lint_all] = config
263
251
  end
@@ -289,5 +277,15 @@ module ERBLint
289
277
  end
290
278
  end
291
279
  end
280
+
281
+ def format_options_help
282
+ "Report offenses in the given format: "\
283
+ "(#{Reporter.available_formats.join(', ')}) (default: multiline)"
284
+ end
285
+
286
+ def invalid_format_error_message(given_format)
287
+ formats = Reporter.available_formats.map { |format| " - #{format}\n" }
288
+ "#{given_format}: is not a valid format. Available formats:\n#{formats.join}"
289
+ end
292
290
  end
293
291
  end
@@ -14,6 +14,7 @@ module ERBLint
14
14
  # `ERBLint::Linters::Foo.simple_name` #=> "Foo"
15
15
  # `ERBLint::Linters::Compass::Bar.simple_name` #=> "Compass::Bar"
16
16
  def inherited(linter)
17
+ super
17
18
  linter.simple_name = if linter.name.start_with?('ERBLint::Linters::')
18
19
  name_parts = linter.name.split('::')
19
20
  name_parts[2..-1].join('::')
@@ -4,19 +4,28 @@ module ERBLint
4
4
  # Stores all linters available to the application.
5
5
  module LinterRegistry
6
6
  CUSTOM_LINTERS_DIR = '.erb-linters'
7
- @linters = []
7
+ @loaded_linters = []
8
8
 
9
9
  class << self
10
- attr_reader :linters
10
+ def clear
11
+ @linters = nil
12
+ end
11
13
 
12
14
  def included(linter_class)
13
- @linters << linter_class
15
+ @loaded_linters << linter_class
14
16
  end
15
17
 
16
18
  def find_by_name(name)
17
19
  linters.detect { |linter| linter.simple_name == name }
18
20
  end
19
21
 
22
+ def linters
23
+ @linters ||= begin
24
+ load_custom_linters
25
+ @loaded_linters
26
+ end
27
+ end
28
+
20
29
  def load_custom_linters(directory = CUSTOM_LINTERS_DIR)
21
30
  ruby_files = Dir.glob(File.expand_path(File.join(directory, '**', '*.rb')))
22
31
  ruby_files.each { |file| require file }
@@ -31,5 +31,13 @@ module ERBLint
31
31
  def line_range
32
32
  Range.new(source_range.line, source_range.last_line)
33
33
  end
34
+
35
+ def line_number
36
+ line_range.begin
37
+ end
38
+
39
+ def column
40
+ source_range.column
41
+ end
34
42
  end
35
43
  end
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+ require 'active_support/core_ext/class'
3
+
4
+ module ERBLint
5
+ class Reporter
6
+ def self.create_reporter(format, *args)
7
+ reporter_klass = "#{ERBLint::Reporters}::#{format.to_s.camelize}Reporter".constantize
8
+ reporter_klass.new(*args)
9
+ end
10
+
11
+ def self.available_format?(format)
12
+ available_formats.include?(format.to_s)
13
+ end
14
+
15
+ def self.available_formats
16
+ descendants
17
+ .map(&:to_s)
18
+ .map(&:demodulize)
19
+ .map(&:underscore)
20
+ .map { |klass_name| klass_name.sub("_reporter", "") }
21
+ .sort
22
+ end
23
+
24
+ def initialize(stats, autocorrect)
25
+ @stats = stats
26
+ @autocorrect = autocorrect
27
+ end
28
+
29
+ def preview; end
30
+
31
+ def show; end
32
+
33
+ private
34
+
35
+ attr_reader :stats, :autocorrect
36
+ delegate :processed_files, to: :stats
37
+ end
38
+ end
@@ -0,0 +1,60 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ERBLint
4
+ module Reporters
5
+ class CompactReporter < Reporter
6
+ def preview
7
+ puts "Linting #{stats.files} files with "\
8
+ "#{stats.linters} #{'autocorrectable ' if autocorrect}linters..."
9
+ end
10
+
11
+ def show
12
+ processed_files.each do |filename, offenses|
13
+ offenses.each do |offense|
14
+ puts format_offense(filename, offense)
15
+ end
16
+ end
17
+
18
+ footer
19
+ summary
20
+ end
21
+
22
+ private
23
+
24
+ def format_offense(filename, offense)
25
+ [
26
+ "#{filename}:",
27
+ "#{offense.line_number}:",
28
+ "#{offense.column}: ",
29
+ offense.message.to_s,
30
+ ].join
31
+ end
32
+
33
+ def footer; end
34
+
35
+ def summary
36
+ if stats.corrected > 0
37
+ report_corrected_offenses
38
+ elsif stats.found > 0
39
+ warn(Rainbow("#{stats.found} error(s) were found in ERB files").red)
40
+ else
41
+ puts Rainbow("No errors were found in ERB files").green
42
+ end
43
+ end
44
+
45
+ def report_corrected_offenses
46
+ corrected_found_diff = stats.found - stats.corrected
47
+
48
+ if corrected_found_diff > 0
49
+ message = Rainbow(
50
+ "#{stats.corrected} error(s) corrected and #{corrected_found_diff} error(s) remaining in ERB files"
51
+ ).red
52
+
53
+ warn(message)
54
+ else
55
+ puts Rainbow("#{stats.corrected} error(s) corrected in ERB files").green
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+ require_relative "compact_reporter"
3
+
4
+ module ERBLint
5
+ module Reporters
6
+ class MultilineReporter < CompactReporter
7
+ private
8
+
9
+ def format_offense(filename, offense)
10
+ <<~EOF
11
+
12
+ #{offense.message}#{Rainbow(' (not autocorrected)').red if autocorrect}
13
+ In file: #{filename}:#{offense.line_number}
14
+ EOF
15
+ end
16
+
17
+ def footer
18
+ puts
19
+ end
20
+ end
21
+ end
22
+ end
@@ -10,7 +10,6 @@ module ERBLint
10
10
  @config = config || RunnerConfig.default
11
11
  raise ArgumentError, 'expect `config` to be a RunnerConfig instance' unless @config.is_a?(RunnerConfig)
12
12
 
13
- LinterRegistry.load_custom_linters
14
13
  linter_classes = LinterRegistry.linters.select { |klass| @config.for_linter(klass).enabled? }
15
14
  @linters = linter_classes.map do |linter_class|
16
15
  linter_class.new(@file_loader, @config.for_linter(linter_class))
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+ module ERBLint
3
+ class Stats
4
+ attr_accessor :found,
5
+ :corrected,
6
+ :exceptions,
7
+ :linters,
8
+ :files,
9
+ :processed_files
10
+
11
+ def initialize(
12
+ found: 0,
13
+ corrected: 0,
14
+ exceptions: 0,
15
+ linters: 0,
16
+ files: 0,
17
+ processed_files: {}
18
+ )
19
+ @found = found
20
+ @corrected = corrected
21
+ @exceptions = exceptions
22
+ @linters = linters
23
+ @files = files
24
+ @processed_files = processed_files
25
+ end
26
+ end
27
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ERBLint
4
- VERSION = '0.0.35'
4
+ VERSION = '0.0.36'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: erb_lint
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.35
4
+ version: 0.0.36
5
5
  platform: ruby
6
6
  authors:
7
7
  - Justin Chan
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-08-06 00:00:00.000000000 Z
11
+ date: 2021-01-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: better_html
@@ -42,16 +42,16 @@ dependencies:
42
42
  name: rubocop
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - "~>"
45
+ - - ">="
46
46
  - !ruby/object:Gem::Version
47
- version: '0.79'
47
+ version: '0'
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - "~>"
52
+ - - ">="
53
53
  - !ruby/object:Gem::Version
54
- version: '0.79'
54
+ version: '0'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: parser
57
57
  requirement: !ruby/object:Gem::Requirement
@@ -185,9 +185,13 @@ files:
185
185
  - lib/erb_lint/linters/trailing_whitespace.rb
186
186
  - lib/erb_lint/offense.rb
187
187
  - lib/erb_lint/processed_source.rb
188
+ - lib/erb_lint/reporter.rb
189
+ - lib/erb_lint/reporters/compact_reporter.rb
190
+ - lib/erb_lint/reporters/multiline_reporter.rb
188
191
  - lib/erb_lint/runner.rb
189
192
  - lib/erb_lint/runner_config.rb
190
193
  - lib/erb_lint/runner_config_resolver.rb
194
+ - lib/erb_lint/stats.rb
191
195
  - lib/erb_lint/utils/block_map.rb
192
196
  - lib/erb_lint/utils/offset_corrector.rb
193
197
  - lib/erb_lint/utils/ruby_to_erb.rb