guard-rubocop 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +5 -0
- data/README.md +11 -6
- data/lib/guard/rubocop.rb +4 -1
- data/lib/guard/rubocop/runner.rb +41 -2
- data/lib/guard/rubocop/version.rb +1 -1
- data/spec/guard/rubocop/runner_spec.rb +130 -7
- data/spec/guard/rubocop_spec.rb +1 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ae91b5efb5588f487c013e9ce9bd122b8e5a3e5d
|
4
|
+
data.tar.gz: eb7c6e0877ece705ffc2ec3d0678be31c99ffde0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c145d8df9c847803da47b8837347afaa4792fc5a41e484824635a424e384daa2c3694fa109e47797ca17f9e7e6c8c1dbc9bdee7e88fd0de76cc1c7e19d7ff1d7
|
7
|
+
data.tar.gz: c8a27a5a563029a367fb65d2fa1bb00508f14bb56dc73e834f6767ee172b6e30d47fe4e0a0ba8c2e05ce26d61d67e0b7cd12e82cf75208bfab47aed94701a929
|
data/CHANGELOG.md
CHANGED
data/README.md
CHANGED
@@ -4,7 +4,7 @@
|
|
4
4
|
|
5
5
|
Guard::Rubocop allows you to automatically check Ruby code style with [RuboCop](https://github.com/bbatsov/rubocop) when files are modified.
|
6
6
|
|
7
|
-
Tested on MRI 1.9
|
7
|
+
Tested on MRI 1.9, MRI 2.0, JRuby and Rubinius in 1.9 modes.
|
8
8
|
|
9
9
|
## Installation
|
10
10
|
|
@@ -42,10 +42,10 @@ Please read the [Guard usage documentation](https://github.com/guard/guard#readm
|
|
42
42
|
|
43
43
|
## Options
|
44
44
|
|
45
|
-
You can pass some options in `Guardfile
|
45
|
+
You can pass some options in `Guardfile` like the following example:
|
46
46
|
|
47
47
|
```ruby
|
48
|
-
guard :rubocop, all_on_start: false,
|
48
|
+
guard :rubocop, all_on_start: false, cli: ['--format', 'clang', '--rails'] do
|
49
49
|
# ...
|
50
50
|
end
|
51
51
|
```
|
@@ -53,9 +53,14 @@ end
|
|
53
53
|
### Available Options
|
54
54
|
|
55
55
|
```ruby
|
56
|
-
all_on_start: true # Check all files at Guard startup
|
57
|
-
|
58
|
-
|
56
|
+
all_on_start: true # Check all files at Guard startup.
|
57
|
+
# default: true
|
58
|
+
cli: ['--rails'] # Pass arbitrary RuboCop CLI arguments.
|
59
|
+
# An array or string is acceptable.
|
60
|
+
# default: nil
|
61
|
+
keep_failed: true # Keep failed files until they pass.
|
62
|
+
# default: true
|
63
|
+
notification: :failed # Display Growl notification after each run.
|
59
64
|
# true - Always notify
|
60
65
|
# false - Never notify
|
61
66
|
# :failed - Notify only when failed
|
data/lib/guard/rubocop.rb
CHANGED
@@ -4,6 +4,8 @@ require 'guard'
|
|
4
4
|
require 'guard/guard'
|
5
5
|
|
6
6
|
module Guard
|
7
|
+
# This class gets API calls from `guard` and runs `rubocop` command via {Guard::Rubocop::Runner}.
|
8
|
+
# An instance of this class stays alive in a `guard` command session.
|
7
9
|
class Rubocop < Guard
|
8
10
|
autoload :Runner, 'guard/rubocop/runner'
|
9
11
|
|
@@ -15,7 +17,8 @@ module Guard
|
|
15
17
|
@options = {
|
16
18
|
all_on_start: true,
|
17
19
|
keep_failed: true,
|
18
|
-
notification: :failed
|
20
|
+
notification: :failed,
|
21
|
+
cli: nil
|
19
22
|
}.merge(options)
|
20
23
|
|
21
24
|
@failed_paths = []
|
data/lib/guard/rubocop/runner.rb
CHANGED
@@ -2,9 +2,15 @@
|
|
2
2
|
|
3
3
|
require 'json'
|
4
4
|
|
5
|
+
# rubocop:disable Documentation
|
6
|
+
|
5
7
|
module Guard
|
6
8
|
class Rubocop
|
9
|
+
# This class runs `rubocop` command, retrieves result and notifies.
|
10
|
+
# An instance of this class is intended to invoke `rubocop` only once in its lifetime.
|
7
11
|
class Runner
|
12
|
+
# rubocop:enable Documentation
|
13
|
+
|
8
14
|
def initialize(options)
|
9
15
|
@options = options
|
10
16
|
end
|
@@ -25,11 +31,43 @@ module Guard
|
|
25
31
|
|
26
32
|
def build_command(paths)
|
27
33
|
command = ['rubocop']
|
28
|
-
|
34
|
+
|
35
|
+
unless include_formatter_for_console?(args_specified_by_user)
|
36
|
+
command.concat(%w(--format progress)) # Keep default formatter for console.
|
37
|
+
end
|
38
|
+
|
29
39
|
command.concat(['--format', 'json', '--out', json_file_path])
|
40
|
+
command.concat(args_specified_by_user)
|
30
41
|
command.concat(paths)
|
31
42
|
end
|
32
43
|
|
44
|
+
def args_specified_by_user
|
45
|
+
@args_specified_by_user ||= begin
|
46
|
+
args = @options[:cli]
|
47
|
+
case args
|
48
|
+
when Array then args
|
49
|
+
when String then args.shellsplit
|
50
|
+
when NilClass then []
|
51
|
+
else fail ':cli option must be either an array or string'
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
def include_formatter_for_console?(cli_args)
|
57
|
+
index = -1
|
58
|
+
formatter_args = cli_args.group_by do |arg|
|
59
|
+
if %w(-f --format).include?(arg)
|
60
|
+
index += 1
|
61
|
+
end
|
62
|
+
index
|
63
|
+
end
|
64
|
+
formatter_args.delete(-1)
|
65
|
+
|
66
|
+
formatter_args.each_value.any? do |args|
|
67
|
+
args.none? { |a| %w(-o --out).include?(a) }
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
33
71
|
def json_file_path
|
34
72
|
@tempfile_path ||= begin
|
35
73
|
# Just generate random tempfile path.
|
@@ -43,7 +81,8 @@ module Guard
|
|
43
81
|
def result
|
44
82
|
@result ||= begin
|
45
83
|
File.open(json_file_path) do |file|
|
46
|
-
JSON.load
|
84
|
+
# Rubinius 2.0.0.rc1 does not support `JSON.load` with 3 args.
|
85
|
+
JSON.parse(file.read, symbolize_names: true)
|
47
86
|
end
|
48
87
|
end
|
49
88
|
end
|
@@ -92,24 +92,147 @@ describe Guard::Rubocop::Runner do
|
|
92
92
|
end
|
93
93
|
|
94
94
|
describe '#build_command' do
|
95
|
+
subject(:build_command) { runner.build_command(paths) }
|
96
|
+
let(:options) { { cli: %w(--debug --rails) } }
|
95
97
|
let(:paths) { %w(file1.rb file2.rb) }
|
96
98
|
|
97
|
-
|
98
|
-
|
99
|
+
context 'when :cli option includes formatter for console' do
|
100
|
+
let(:options) { { cli: %w(--format simple) } }
|
101
|
+
|
102
|
+
it 'does not add args for the default formatter for console' do
|
103
|
+
build_command[0..2].should_not == %w(rubocop --format progress)
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
context 'when :cli option does not include formatter for console' do
|
108
|
+
let(:options) { { cli: %w(--format simple --out simple.txt) } }
|
109
|
+
|
110
|
+
it 'adds args for the default formatter for console' do
|
111
|
+
build_command[0..2].should == %w(rubocop --format progress)
|
112
|
+
end
|
99
113
|
end
|
100
114
|
|
101
115
|
it 'adds args for JSON formatter ' do
|
102
|
-
|
116
|
+
build_command[3..4].should == %w(--format json)
|
103
117
|
end
|
104
118
|
|
105
119
|
it 'adds args for output file path of JSON formatter ' do
|
106
|
-
|
107
|
-
|
108
|
-
|
120
|
+
build_command[5].should == '--out'
|
121
|
+
build_command[6].should_not be_empty
|
122
|
+
end
|
123
|
+
|
124
|
+
it 'adds args specified by user' do
|
125
|
+
build_command[7..8].should == %w(--debug --rails)
|
109
126
|
end
|
110
127
|
|
111
128
|
it 'adds the passed paths' do
|
112
|
-
|
129
|
+
build_command[9..-1].should == %w(file1.rb file2.rb)
|
130
|
+
end
|
131
|
+
|
132
|
+
context 'when the value of :cli option is a string' do
|
133
|
+
let(:options) { { cli: '--debug --rails' } }
|
134
|
+
|
135
|
+
it 'handles' do
|
136
|
+
build_command[7..8].should == %w(--debug --rails)
|
137
|
+
end
|
138
|
+
end
|
139
|
+
end
|
140
|
+
|
141
|
+
describe '#args_specified_by_user' do
|
142
|
+
context 'when :cli option is nil' do
|
143
|
+
let(:options) { { cli: nil } }
|
144
|
+
|
145
|
+
it 'returns empty array' do
|
146
|
+
runner.args_specified_by_user.should == []
|
147
|
+
end
|
148
|
+
end
|
149
|
+
|
150
|
+
context 'when :cli option is an array' do
|
151
|
+
let(:options) { { cli: ['--out', 'output file.txt'] } }
|
152
|
+
|
153
|
+
it 'just returns the array' do
|
154
|
+
runner.args_specified_by_user.should == ['--out', 'output file.txt']
|
155
|
+
end
|
156
|
+
end
|
157
|
+
|
158
|
+
context 'when :cli option is a string' do
|
159
|
+
let(:options) { { cli: '--out "output file.txt"' } }
|
160
|
+
|
161
|
+
it 'returns an array from String#shellsplit' do
|
162
|
+
runner.args_specified_by_user.should == ['--out', 'output file.txt']
|
163
|
+
end
|
164
|
+
end
|
165
|
+
|
166
|
+
context 'when :cli option is other types' do
|
167
|
+
let(:options) { { cli: { key: 'value' } } }
|
168
|
+
|
169
|
+
it 'raises error' do
|
170
|
+
expect { runner.args_specified_by_user }.to raise_error
|
171
|
+
end
|
172
|
+
end
|
173
|
+
end
|
174
|
+
|
175
|
+
describe '#include_formatter_for_console?' do
|
176
|
+
subject(:include_formatter_for_console?) { runner.include_formatter_for_console?(args) }
|
177
|
+
|
178
|
+
context 'when the passed args include a -f/--format' do
|
179
|
+
context 'but does not include an -o/--output' do
|
180
|
+
let(:args) { %w(--format simple --debug) }
|
181
|
+
|
182
|
+
it 'returns true' do
|
183
|
+
include_formatter_for_console?.should be_true
|
184
|
+
end
|
185
|
+
end
|
186
|
+
|
187
|
+
context 'and include an -o/--output just after the -f/--format' do
|
188
|
+
let(:args) { %w(--format simple --out simple.txt) }
|
189
|
+
|
190
|
+
it 'returns false' do
|
191
|
+
include_formatter_for_console?.should be_false
|
192
|
+
end
|
193
|
+
end
|
194
|
+
|
195
|
+
context 'and include an -o/--output after the -f/--format across another arg' do
|
196
|
+
let(:args) { %w(--format simple --debug --out simple.txt) }
|
197
|
+
|
198
|
+
it 'returns false' do
|
199
|
+
include_formatter_for_console?.should be_false
|
200
|
+
end
|
201
|
+
end
|
202
|
+
end
|
203
|
+
|
204
|
+
context 'when the passed args include multiple -f/--format' do
|
205
|
+
context 'and all -f/--format have associated -o/--out' do
|
206
|
+
let(:args) { %w(--format simple --out simple.txt --format emacs --out emacs.txt) }
|
207
|
+
|
208
|
+
it 'returns false' do
|
209
|
+
include_formatter_for_console?.should be_false
|
210
|
+
end
|
211
|
+
end
|
212
|
+
|
213
|
+
context 'and any -f/--format has associated -o/--out' do
|
214
|
+
let(:args) { %w(--format simple --format emacs --out emacs.txt) }
|
215
|
+
|
216
|
+
it 'returns true' do
|
217
|
+
include_formatter_for_console?.should be_true
|
218
|
+
end
|
219
|
+
end
|
220
|
+
|
221
|
+
context 'and no -f/--format has associated -o/--out' do
|
222
|
+
let(:args) { %w(--format simple --format emacs) }
|
223
|
+
|
224
|
+
it 'returns true' do
|
225
|
+
include_formatter_for_console?.should be_true
|
226
|
+
end
|
227
|
+
end
|
228
|
+
end
|
229
|
+
|
230
|
+
context 'when the passed args do not include -f/--format' do
|
231
|
+
let(:args) { %w(--debug) }
|
232
|
+
|
233
|
+
it 'returns false' do
|
234
|
+
include_formatter_for_console?.should be_false
|
235
|
+
end
|
113
236
|
end
|
114
237
|
end
|
115
238
|
|
data/spec/guard/rubocop_spec.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: guard-rubocop
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Yuji Nakayama
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-07-
|
11
|
+
date: 2013-07-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: guard
|