Class: Guard::RuboCop::Runner

Inherits:
Object
  • Object
show all
Defined in:
lib/guard/rubocop/runner.rb

Overview

This class runs rubocop command, retrieves result and notifies. An instance of this class is intended to invoke rubocop only once in its lifetime.

Instance Method Summary collapse

Constructor Details

#initialize(options) ⇒ Runner

Returns a new instance of Runner.



10
11
12
# File 'lib/guard/rubocop/runner.rb', line 10

def initialize(options)
  @options = options
end

Instance Method Details

#args_specified_by_userObject



47
48
49
50
51
52
53
54
55
56
57
# File 'lib/guard/rubocop/runner.rb', line 47

def args_specified_by_user
  @args_specified_by_user ||= begin
    args = @options[:cli]
    case args
    when Array    then args
    when String   then args.shellsplit
    when NilClass then []
    else raise ArgumentError, ':cli option must be either an array or string'
    end
  end
end

#build_command(paths) ⇒ Object



30
31
32
33
34
35
36
37
38
39
40
41
# File 'lib/guard/rubocop/runner.rb', line 30

def build_command(paths)
  command = ['rubocop']

  if should_add_default_formatter_for_console?
    command.concat(%w[--format progress]) # Keep default formatter for console.
  end

  command.concat(['--format', 'json', '--out', json_file_path])
  command << '--force-exclusion'
  command.concat(args_specified_by_user)
  command.concat(paths)
end

#failed_pathsObject



107
108
109
110
111
112
113
114
115
# File 'lib/guard/rubocop/runner.rb', line 107

def failed_paths
  failed_files = result[:files].reject do |file|
    offenses = file[:offenses] || file[:offences]
    offenses.empty?
  end
  failed_files.map do |file|
    file[:path]
  end
end

#include_formatter_for_console?(cli_args) ⇒ Boolean

Returns:

  • (Boolean)


59
60
61
62
63
64
65
66
67
68
69
70
# File 'lib/guard/rubocop/runner.rb', line 59

def include_formatter_for_console?(cli_args)
  index = -1
  formatter_args = cli_args.group_by do |arg|
    index += 1 if arg == '--format' || arg.start_with?('-f')
    index
  end
  formatter_args.delete(-1)

  formatter_args.each_value.any? do |args|
    args.none? { |a| a == '--out' || a.start_with?('-o') }
  end
end

#json_file_pathObject



72
73
74
75
76
77
78
79
80
# File 'lib/guard/rubocop/runner.rb', line 72

def json_file_path
  @json_file_path ||= begin
    # Just generate random tempfile path.
    basename = self.class.name.downcase.gsub('::', '_')
    tempfile = Tempfile.new(basename)
    tempfile.close
    tempfile.path
  end
end

#notify(passed) ⇒ Object



91
92
93
94
# File 'lib/guard/rubocop/runner.rb', line 91

def notify(passed)
  image = passed ? :success : :failed
  Notifier.notify(summary_text, title: 'RuboCop results', image: image)
end

#open_launchy_if_neededObject



131
132
133
134
135
136
137
# File 'lib/guard/rubocop/runner.rb', line 131

def open_launchy_if_needed
  return unless (output_path = @options[:launchy])
  return unless File.exist?(output_path)

  require 'launchy'
  ::Launchy.open(output_path)
end

#pluralize(number, thing, options = {}) ⇒ Object



117
118
119
120
121
122
123
124
125
126
127
128
129
# File 'lib/guard/rubocop/runner.rb', line 117

def pluralize(number, thing, options = {})
  text =
    if number.zero? && options[:no_for_zero]
      +'no'
    else
      number.to_s
    end

  text << " #{thing}"
  text << 's' unless number == 1

  text
end

#resultObject



82
83
84
85
86
87
88
89
# File 'lib/guard/rubocop/runner.rb', line 82

def result
  @result ||= begin
    File.open(json_file_path) do |file|
      # Rubinius 2.0.0.rc1 does not support `JSON.load` with 3 args.
      JSON.parse(file.read, symbolize_names: true)
    end
  end
end

#run(paths = []) ⇒ Object



14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# File 'lib/guard/rubocop/runner.rb', line 14

def run(paths = [])
  command = build_command(paths)
  passed = system(*command)

  case @options[:notification]
  when :failed
    notify(passed) unless passed
  when true
    notify(passed)
  end

  open_launchy_if_needed

  passed
end

#should_add_default_formatter_for_console?Boolean

Returns:

  • (Boolean)


43
44
45
# File 'lib/guard/rubocop/runner.rb', line 43

def should_add_default_formatter_for_console?
  !@options[:hide_stdout] && !include_formatter_for_console?(args_specified_by_user)
end

#summary_textObject



96
97
98
99
100
101
102
103
104
105
# File 'lib/guard/rubocop/runner.rb', line 96

def summary_text
  summary = result[:summary]

  text = pluralize(summary[:inspected_file_count], 'file')
  text << ' inspected, '

  offense_count = summary[:offense_count] || summary[:offence_count]
  text << pluralize(offense_count, 'offense', no_for_zero: true)
  text << ' detected'
end