guard-rubocop 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: b0043258943e6ce7804f19377ee96f8cb4fbe231
4
+ data.tar.gz: 63e9ca25fb5011528c2e86df4b1a98eccfda5e4a
5
+ SHA512:
6
+ metadata.gz: 292b240599d027edd2125021b55212ae4f0291eaa7d897a4489d2cf8d338c8bb372480a344cc2e468e2f09a2ff941530921a1db8d9e6b66c681c2c30abe3f121
7
+ data.tar.gz: 052a46d2a3f6e4a2ba5abb368e0ff6cc91d3cad56bdb21d9e8de14f57a26106420833544c7fd204e7b943143f44c0ea4a242c30e38dfe1005506531be1b9af89
data/.gitignore ADDED
@@ -0,0 +1,17 @@
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
data/.travis.yml ADDED
@@ -0,0 +1,5 @@
1
+ language: ruby
2
+ rvm:
3
+ - 1.9.3
4
+ - 2.0.0
5
+ script: bundle exec rspec
data/Gemfile ADDED
@@ -0,0 +1,13 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
4
+
5
+ # Travis CI
6
+ group :test do
7
+ gem 'coveralls'
8
+ end
9
+
10
+ # Jenkins
11
+ group :ci do
12
+ gem 'simplecov-rcov', '~> 0.2'
13
+ end
data/Guardfile ADDED
@@ -0,0 +1,14 @@
1
+ # A sample Guardfile
2
+ # More info at https://github.com/guard/guard#readme
3
+
4
+ guard 'rspec' do
5
+ watch(%r{^spec/.+_spec\.rb$})
6
+ watch(%r{^lib/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
7
+ watch('spec/spec_helper.rb') { "spec" }
8
+ watch(%r{^spec/support/.+\.rb$}) { "spec" }
9
+ end
10
+
11
+ guard 'rubocop' do
12
+ watch(%r{.+\.rb$})
13
+ watch(%r{(?:.+/)?\.rubocop\.yml$}) { |m| File.dirname(m[0]) }
14
+ end
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 Yuji Nakayama
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.
data/README.md ADDED
@@ -0,0 +1,70 @@
1
+ # Guard::Rubocop [![Build Status](https://travis-ci.org/yujinakayama/guard-rubocop.png?branch=master)](https://travis-ci.org/yujinakayama/guard-rubocop) [![Coverage Status](https://coveralls.io/repos/yujinakayama/guard-rubocop/badge.png?branch=master)](https://coveralls.io/r/yujinakayama/guard-rubocop) [![Dependency Status](https://gemnasium.com/yujinakayama/guard-rubocop.png)](https://gemnasium.com/yujinakayama/guard-rubocop) [![Code Climate](https://codeclimate.com/github/yujinakayama/guard-rubocop.png)](https://codeclimate.com/github/yujinakayama/guard-rubocop)
2
+
3
+
4
+ Guard::Rubocop allows you to automatically check Ruby code style with [RuboCop](https://github.com/bbatsov/rubocop) when files are modified.
5
+
6
+ Tested on MRI 1.9 and MRI 2.0, according to RuboCop.
7
+
8
+ ## Installation
9
+
10
+ Please make sure to have [Guard](https://github.com/guard/guard) installed before continue.
11
+
12
+ Add `guard-rubocop` to your `Gemfile`:
13
+
14
+ ```ruby
15
+ group :development do
16
+ gem 'guard-rubocop'
17
+ end
18
+ ```
19
+
20
+ and then execute:
21
+
22
+ ```sh
23
+ $ bundle install
24
+ ```
25
+
26
+ or install it yourself as:
27
+
28
+ ```sh
29
+ $ gem install guard-rubocop
30
+ ```
31
+
32
+ Add the default Guard::Rubocop definition to your `Guardfile` by running:
33
+
34
+ ```sh
35
+ $ guard init rubocop
36
+ ```
37
+
38
+ ## Usage
39
+
40
+ Please read the [Guard usage documentation](https://github.com/guard/guard#readme).
41
+
42
+ ## Options
43
+
44
+ You can pass some options in `Guardfile`:
45
+
46
+ ```ruby
47
+ guard 'rubocop', all_on_start: false, notification: true do
48
+ # ...
49
+ end
50
+ ```
51
+
52
+ ### Available Options
53
+
54
+ ```ruby
55
+ all_on_start: true # Check all files at Guard startup, default: true
56
+ keep_failed: true # Keep failed files until they pass, default: true
57
+ notification: :failed # Display Growl notification after each run
58
+ # true - Always notify
59
+ # false - Never notify
60
+ # :failed - Notify only when failed
61
+ # default: :failed
62
+ ```
63
+
64
+ ## Contributing
65
+
66
+ 1. Fork it
67
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
68
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
69
+ 4. Push to the branch (`git push origin my-new-feature`)
70
+ 5. Create new Pull Request
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -0,0 +1,34 @@
1
+ # coding: utf-8
2
+
3
+ lib = File.expand_path('../lib', __FILE__)
4
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
+
6
+ require 'guard/rubocop/version'
7
+
8
+ Gem::Specification.new do |spec|
9
+ spec.name = "guard-rubocop"
10
+ spec.version = Guard::RubocopVersion::VERSION
11
+ spec.authors = ["Yuji Nakayama"]
12
+ spec.email = ["nkymyj@gmail.com"]
13
+ spec.summary = "Guard plugin for RuboCop"
14
+ spec.description = "Guard::Rubocop allows you to automatically check Ruby code style with RuboCop when files are modified."
15
+ spec.homepage = "https://github.com/yujinakayama/guard-rubocop"
16
+ spec.license = "MIT"
17
+
18
+ spec.files = `git ls-files`.split($/)
19
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
20
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
21
+ spec.require_paths = ["lib"]
22
+
23
+ spec.add_runtime_dependency "guard", "~> 1.8"
24
+ spec.add_runtime_dependency "rubocop", "~> 0.5"
25
+ spec.add_runtime_dependency "childprocess", "~> 0.3"
26
+ spec.add_runtime_dependency "term-ansicolor", "~> 1.1"
27
+
28
+ spec.add_development_dependency "bundler", "~> 1.3"
29
+ spec.add_development_dependency "rake", "~> 10.0"
30
+ spec.add_development_dependency "rspec", "~> 2.13"
31
+ spec.add_development_dependency "simplecov", "~> 0.7"
32
+ spec.add_development_dependency "guard-rspec", ">= 2.5.4"
33
+ spec.add_development_dependency "ruby_gntp", ">= 0.3"
34
+ end
@@ -0,0 +1,4 @@
1
+ # A workaround for `autoload :Runner` in rubocop.rb
2
+ # until comment based switch will be released
3
+ SymbolSnakeCase:
4
+ Enabled: false
@@ -0,0 +1,79 @@
1
+ # coding: utf-8
2
+
3
+ require 'guard'
4
+ require 'guard/guard'
5
+ require 'guard/notifier'
6
+
7
+ module Guard
8
+ class Rubocop < Guard
9
+ # rubocop:disable SymbolSnakeCase
10
+ autoload :Runner, 'guard/rubocop/runner'
11
+ # rubocop:enable SymbolSnakeCase
12
+
13
+ attr_reader :options, :failed_paths
14
+
15
+ def initialize(watchers = [], options = {})
16
+ super
17
+
18
+ @options = {
19
+ all_on_start: true,
20
+ keep_failed: true,
21
+ notification: :failed
22
+ }.merge(options)
23
+
24
+ @failed_paths = []
25
+ end
26
+
27
+ def start
28
+ run_all if @options[:all_on_start]
29
+ end
30
+
31
+ def run_all
32
+ UI.info 'Checking Ruby code style of all files'
33
+
34
+ runner = Runner.new(@options)
35
+ passed = runner.run
36
+ @failed_paths = runner.failed_paths
37
+
38
+ throw :task_has_failed unless passed
39
+ end
40
+
41
+ def run_on_changes(paths)
42
+ paths += @failed_paths if @options[:keep_failed]
43
+ paths.map! { |path| File.expand_path(path) }
44
+ paths.uniq!
45
+
46
+ UI.info "Checking Ruby code styles: #{paths.join(' ')}"
47
+
48
+ runner = Runner.new(@options)
49
+ passed = runner.run(paths)
50
+ @failed_paths = runner.failed_paths
51
+
52
+ throw :task_has_failed unless passed
53
+ end
54
+
55
+ def reload
56
+ @failed_paths = []
57
+ end
58
+
59
+ def clean_paths(paths)
60
+ paths = paths.dup
61
+ paths.map! { |path| File.expand_path(path) }
62
+ paths.uniq!
63
+ paths.reject! do |path|
64
+ included_in_other_path?(path, paths)
65
+ end
66
+ paths
67
+ end
68
+
69
+ private
70
+
71
+ def included_in_other_path?(target_path, other_paths)
72
+ dir_paths = other_paths.select { |path| File.directory?(path) }
73
+ dir_paths.delete(target_path)
74
+ dir_paths.any? do |dir_path|
75
+ target_path.start_with?(dir_path)
76
+ end
77
+ end
78
+ end
79
+ end
@@ -0,0 +1,95 @@
1
+ # coding: utf-8
2
+
3
+ require 'childprocess'
4
+ require 'term/ansicolor'
5
+
6
+ module Guard
7
+ class Rubocop
8
+ class Runner
9
+ PASSED_EXIT_CODE = 0
10
+ MINIMUM_POLL_INTERVAL = 0.1
11
+
12
+ attr_reader :passed, :output
13
+
14
+ alias_method :passed?, :passed
15
+
16
+ def initialize(options)
17
+ @options = options
18
+ end
19
+
20
+ def run(paths = [])
21
+ exit_code, output = rubocop(paths)
22
+ @passed = (exit_code == PASSED_EXIT_CODE)
23
+ @output = Term::ANSIColor.uncolor(output)
24
+
25
+ case @options[:notification]
26
+ when :failed
27
+ notify unless passed?
28
+ when true
29
+ notify
30
+ end
31
+
32
+ passed
33
+ end
34
+
35
+ def rubocop(args)
36
+ process = ChildProcess.build('rubocop', *args)
37
+
38
+ stdout_reader, stdout_writer = IO.pipe
39
+ process.io.stdout = stdout_writer
40
+
41
+ process.start
42
+
43
+ ios = [stdout_reader]
44
+ output = ''
45
+
46
+ loop do
47
+ available_ios, = IO.select(ios, nil, nil, MINIMUM_POLL_INTERVAL)
48
+
49
+ if available_ios
50
+ available_ios.each do |io|
51
+ chunk = io.read_available_nonblock
52
+ $stdout.write chunk
53
+ output << chunk
54
+ end
55
+ end
56
+
57
+ break if process.exited?
58
+ end
59
+
60
+ [process.exit_code, output]
61
+ end
62
+
63
+ def notify
64
+ image = passed ? :success : :failed
65
+ Notifier.notify(summary, title: 'Rubocop results', image: image)
66
+ end
67
+
68
+ def summary
69
+ return nil unless output
70
+ output.lines.to_a.last.chomp
71
+ end
72
+
73
+ def failed_paths
74
+ return [] unless output
75
+ output.scan(/^== (.+) ==$/).flatten
76
+ end
77
+
78
+ class IO < ::IO
79
+ READ_CHUNK_SIZE = 10000
80
+
81
+ def read_available_nonblock
82
+ data = ''
83
+ loop do
84
+ begin
85
+ data << read_nonblock(READ_CHUNK_SIZE)
86
+ rescue ::IO::WaitReadable, EOFError
87
+ return data
88
+ end
89
+ end
90
+ end
91
+ end
92
+
93
+ end
94
+ end
95
+ end
@@ -0,0 +1,4 @@
1
+ guard 'rubocop' do
2
+ watch(%r{.+\.rb$})
3
+ watch(%r{(?:.+/)?\.rubocop\.yml$}) { |m| File.dirname(m[0]) }
4
+ end
@@ -0,0 +1,13 @@
1
+ # coding: utf-8
2
+
3
+ module Guard
4
+ # A workaround for declaring `class Rubocop`
5
+ # before `class Rubocop < Guard` in rubocop.rb
6
+ module RubocopVersion
7
+ # http://semver.org/
8
+ MAJOR = 0
9
+ MINOR = 0
10
+ PATCH = 1
11
+ VERSION = [MAJOR, MINOR, PATCH].join('.')
12
+ end
13
+ end
data/spec/.rubocop.yml ADDED
@@ -0,0 +1,4 @@
1
+ # Avoid warning "Possibly useless use of == in void context"
2
+ # for `should ==`
3
+ Syntax:
4
+ Enabled: false
@@ -0,0 +1,207 @@
1
+ # coding: utf-8
2
+
3
+ require 'spec_helper.rb'
4
+ require 'term/ansicolor'
5
+
6
+ describe Guard::Rubocop::Runner, :silence_output do
7
+ include CaptureHelper
8
+
9
+ subject(:runner) { Guard::Rubocop::Runner.new(options) }
10
+ let(:options) { {} }
11
+
12
+ describe '#run' do
13
+ subject { super().run(paths) }
14
+ let(:paths) { ['spec/spec_helper.rb'] }
15
+
16
+ before do
17
+ runner.stub(:rubocop)
18
+ end
19
+
20
+ it 'executes rubocop' do
21
+ runner.should_receive(:rubocop)
22
+ runner.run
23
+ end
24
+
25
+ context 'when all files are passed' do
26
+ before do
27
+ runner.stub(:rubocop).and_return(0)
28
+ end
29
+ it { should be_true }
30
+ end
31
+
32
+ context 'when any file is failed' do
33
+ before do
34
+ runner.stub(:rubocop).and_return(1)
35
+ end
36
+ it { should be_false }
37
+ end
38
+
39
+ shared_examples 'notifies', :notifies do
40
+ it 'notifies' do
41
+ runner.should_receive(:notify)
42
+ runner.run
43
+ end
44
+ end
45
+
46
+ shared_examples 'does not notify', :does_not_notify do
47
+ it 'does not notify' do
48
+ runner.should_not_receive(:notify)
49
+ runner.run
50
+ end
51
+ end
52
+
53
+ shared_examples 'notification' do |expectations|
54
+ context 'when passed' do
55
+ before do
56
+ runner.stub(:rubocop).and_return(0)
57
+ end
58
+
59
+ if expectations[:passed]
60
+ include_examples 'notifies'
61
+ else
62
+ include_examples 'does not notify'
63
+ end
64
+ end
65
+
66
+ context 'when failed' do
67
+ before do
68
+ runner.stub(:rubocop).and_return(1)
69
+ end
70
+
71
+ if expectations[:failed]
72
+ include_examples 'notifies'
73
+ else
74
+ include_examples 'does not notify'
75
+ end
76
+ end
77
+ end
78
+
79
+ context 'when :notification option is true' do
80
+ let(:options) { { notification: true } }
81
+ include_examples 'notification', { passed: true, failed: true }
82
+ end
83
+
84
+ context 'when :notification option is :failed' do
85
+ let(:options) { { notification: :failed } }
86
+ include_examples 'notification', { passed: false, failed: true }
87
+ end
88
+
89
+ context 'when :notification option is false' do
90
+ let(:options) { { notification: false } }
91
+ include_examples 'notification', { passed: false, failed: false }
92
+ end
93
+ end
94
+
95
+ describe '#rubocop' do
96
+ let(:paths) { ['spec/spec_helper.rb'] }
97
+
98
+ it 'runs rubocop command' do
99
+ capture(:stdout) do
100
+ runner.rubocop(paths)
101
+ end.should include 'inspected'
102
+ end
103
+
104
+ it 'returns exit code and output' do
105
+ exit_code, output = runner.rubocop(paths)
106
+ exit_code.should == 0
107
+ output.should include 'inspected'
108
+ end
109
+ end
110
+
111
+ describe '#output' do
112
+ subject { super().output }
113
+ let(:paths) { ['spec/spec_helper.rb'] }
114
+
115
+ context 'before running' do
116
+ it { should be_nil }
117
+ end
118
+
119
+ context 'after running' do
120
+ before do
121
+ runner.stub(:notify)
122
+ end
123
+
124
+ it 'returns uncolored output of rubocop command' do
125
+ captured_output = capture(:stdout) { runner.run(paths) }
126
+ runner.output.should == Term::ANSIColor.uncolor(captured_output)
127
+ end
128
+ end
129
+ end
130
+
131
+ shared_context 'stubbed output', stubbed_output: true do
132
+ before do
133
+ runner.stub(:output) do
134
+ <<OUTPUT
135
+ == /home/foo/guard-rubocop/lib/guard/rubocop.rb ==
136
+ C: 1: Missing encoding comment.
137
+ == /home/foo/guard-rubocop/spec/support/silence_output.rb ==
138
+ C: 3: Ruby 1.8 hash syntax detected
139
+
140
+ 7 files inspected, 2 offences detected
141
+ OUTPUT
142
+ end
143
+ end
144
+ end
145
+
146
+ describe '#notify', stubbed_output: true do
147
+ it 'notifies summary' do
148
+ Guard::Notifier.should_receive(:notify) do |message, options|
149
+ message.should == '7 files inspected, 2 offences detected'
150
+ end
151
+ runner.notify
152
+ end
153
+
154
+ it 'notifies with title "Rubocop results"' do
155
+ Guard::Notifier.should_receive(:notify) do |message, options|
156
+ options[:title].should == 'Rubocop results'
157
+ end
158
+ runner.notify
159
+ end
160
+
161
+ context 'when passed' do
162
+ before do
163
+ runner.stub(:passed).and_return(true)
164
+ end
165
+
166
+ it 'shows success image' do
167
+ Guard::Notifier.should_receive(:notify) do |message, options|
168
+ options[:image].should == :success
169
+ end
170
+ runner.notify
171
+ end
172
+ end
173
+
174
+ context 'when failed' do
175
+ before do
176
+ runner.stub(:passed).and_return(false)
177
+ end
178
+
179
+ it 'shows failed image' do
180
+ Guard::Notifier.should_receive(:notify) do |message, options|
181
+ options[:image].should == :failed
182
+ end
183
+ runner.notify
184
+ end
185
+ end
186
+ end
187
+
188
+ describe '#summary', stubbed_output: true do
189
+ subject { super().summary }
190
+
191
+ it 'returns summary line of output' do
192
+ should == '7 files inspected, 2 offences detected'
193
+ end
194
+ end
195
+
196
+ describe '#failed_paths', stubbed_output: true do
197
+ subject { super().failed_paths }
198
+
199
+ it 'returns failed file paths as array' do
200
+ should == [
201
+ '/home/foo/guard-rubocop/lib/guard/rubocop.rb',
202
+ '/home/foo/guard-rubocop/spec/support/silence_output.rb'
203
+ ]
204
+ end
205
+ end
206
+
207
+ end
@@ -0,0 +1,194 @@
1
+ # coding: utf-8
2
+
3
+ require 'spec_helper.rb'
4
+
5
+ module Guard
6
+ describe Rubocop, :silence_output do
7
+ subject(:guard) { Rubocop.new(watchers, options) }
8
+ let(:watchers) { [] }
9
+ let(:options) { {} }
10
+
11
+ let(:runner) { Rubocop::Runner.any_instance }
12
+
13
+ describe '#options' do
14
+ subject { super().options }
15
+
16
+ context 'by default' do
17
+ let(:options) { {} }
18
+ its([:all_on_start]) { should be_true }
19
+ its([:keep_failed]) { should be_true }
20
+ its([:notification]) { should == :failed }
21
+ end
22
+ end
23
+
24
+ describe '#start' do
25
+ context 'when :all_on_start option is enabled' do
26
+ let(:options) { { all_on_start: true } }
27
+
28
+ it 'runs all' do
29
+ guard.should_receive(:run_all)
30
+ guard.start
31
+ end
32
+ end
33
+
34
+ context 'when :all_on_start option is disabled' do
35
+ let(:options) { { all_on_start: false } }
36
+
37
+ it 'does nothing' do
38
+ guard.should_not_receive(:run_all)
39
+ guard.start
40
+ end
41
+ end
42
+ end
43
+
44
+ shared_examples 'processes after running', :processes_after_running do
45
+ context 'when passed' do
46
+ it 'throws nothing' do
47
+ runner.stub(:run).and_return(true)
48
+ expect { subject }.not_to throw_symbol
49
+ end
50
+
51
+ it 'clears failed paths' do
52
+ runner.stub(:run).and_return(true)
53
+ runner.stub(:failed_paths).and_return([])
54
+ subject
55
+ guard.failed_paths.should be_empty
56
+ end
57
+ end
58
+
59
+ context 'when failed' do
60
+ it 'throws symbol :task_has_failed' do
61
+ runner.stub(:run).and_return(false)
62
+ expect { subject }.to throw_symbol(:task_has_failed)
63
+ end
64
+
65
+ it 'keeps failed paths' do
66
+ guard.stub(:throw)
67
+ failed_paths = [
68
+ 'some_failed_file.rb',
69
+ 'dir/another_failed_file.rb'
70
+ ]
71
+ runner.stub(:run).and_return(false)
72
+ runner.stub(:failed_paths).and_return(failed_paths)
73
+ subject
74
+ guard.failed_paths.should == failed_paths
75
+ end
76
+ end
77
+ end
78
+
79
+ describe '#run_all', :processes_after_running do
80
+ subject { super().run_all }
81
+
82
+ before do
83
+ runner.stub(:run).and_return(true)
84
+ end
85
+
86
+ it 'inspects all files with rubocop' do
87
+ runner.should_receive(:run).with(no_args)
88
+ guard.run_all
89
+ end
90
+ end
91
+
92
+ describe '#run_on_changes', :processes_after_running do
93
+ subject { super().run_on_changes(changed_paths) }
94
+ let(:changed_paths) { ['some.rb', 'dir/another.rb', 'dir/../some.rb'] }
95
+
96
+ before do
97
+ runner.stub(:run).and_return(true)
98
+ end
99
+
100
+ it 'inspects changed files with rubocop' do
101
+ runner.should_receive(:run)
102
+ guard.run_on_changes(changed_paths)
103
+ end
104
+
105
+ it 'passes cleaned paths to rubocop' do
106
+ runner.should_receive(:run) do |paths|
107
+ paths.should == [
108
+ File.expand_path('some.rb'),
109
+ File.expand_path('dir/another.rb')
110
+ ]
111
+ end
112
+ guard.run_on_changes(changed_paths)
113
+ end
114
+
115
+ let(:failed_path) { File.expand_path('failed_file_last_time.rb') }
116
+
117
+ context 'when :keep_failed option is enabled' do
118
+ let(:options) { { keep_failed: true } }
119
+
120
+ it 'also inspects paths which are failed last time' do
121
+ guard.failed_paths << failed_path
122
+ runner.should_receive(:run) do |paths|
123
+ paths.should include failed_path
124
+ end
125
+ guard.run_on_changes(changed_paths)
126
+ end
127
+ end
128
+
129
+ context 'when :keep_failed option is disabled' do
130
+ let(:options) { { keep_failed: false } }
131
+ let(:changed_paths) do
132
+ [
133
+ File.expand_path('some.rb'),
134
+ File.expand_path('dir/another.rb')
135
+ ]
136
+ end
137
+
138
+ it 'inspects just changed paths' do
139
+ guard.failed_paths << failed_path
140
+ runner.should_receive(:run) do |paths|
141
+ paths.should == changed_paths
142
+ end
143
+ guard.run_on_changes(changed_paths)
144
+ end
145
+ end
146
+ end
147
+
148
+ describe '#reload' do
149
+ it 'clears failed paths' do
150
+ guard.failed_paths << 'failed.rb'
151
+ guard.reload
152
+ guard.failed_paths.should be_empty
153
+ end
154
+ end
155
+
156
+ describe '#clean_paths' do
157
+ it 'converts to absolute paths' do
158
+ paths = [
159
+ 'lib/guard/rubocop.rb',
160
+ 'spec/spec_helper.rb'
161
+ ]
162
+ guard.clean_paths(paths).should == [
163
+ File.expand_path('lib/guard/rubocop.rb'),
164
+ File.expand_path('spec/spec_helper.rb')
165
+ ]
166
+ end
167
+
168
+ it 'removes to duplicated paths' do
169
+ paths = [
170
+ 'lib/guard/rubocop.rb',
171
+ 'spec/spec_helper.rb',
172
+ 'lib/guard/../guard/rubocop.rb'
173
+ ]
174
+ guard.clean_paths(paths).should == [
175
+ File.expand_path('lib/guard/rubocop.rb'),
176
+ File.expand_path('spec/spec_helper.rb')
177
+ ]
178
+ end
179
+
180
+ it 'removes paths which are included in another path' do
181
+ paths = [
182
+ 'lib/guard/rubocop.rb',
183
+ 'spec/spec_helper.rb',
184
+ 'spec'
185
+ ]
186
+ guard.clean_paths(paths).should == [
187
+ File.expand_path('lib/guard/rubocop.rb'),
188
+ File.expand_path('spec')
189
+ ]
190
+ end
191
+ end
192
+
193
+ end
194
+ end
@@ -0,0 +1,47 @@
1
+ # coding: utf-8
2
+
3
+ class NoExpectationExecutedError < StandardError
4
+ end
5
+
6
+ RSpec.configure do |config|
7
+ config.treat_symbols_as_metadata_keys_with_true_values = true
8
+
9
+ # Original snippet by sorah
10
+ # https://gist.github.com/sorah/4315150
11
+ config.after do
12
+ result = self.example.metadata[:execution_result]
13
+
14
+ has_mock_expectations = !RSpec::Mocks.space.instance_eval do
15
+ receivers
16
+ end.empty?
17
+
18
+ next if result[:exception]
19
+ next if result[:pending_message]
20
+ next if RSpec::Matchers.last_should
21
+ next if has_mock_expectations
22
+
23
+ fail NoExpectationExecutedError
24
+ end
25
+ end
26
+
27
+ Dir[File.join(File.dirname(__FILE__), 'support', '*')].each do |path|
28
+ require path
29
+ end
30
+
31
+ require 'simplecov'
32
+ SimpleCov.coverage_dir(File.join('spec', 'coverage'))
33
+
34
+ if ENV['TRAVIS']
35
+ require 'coveralls'
36
+ Coveralls.wear!
37
+ elsif ENV['CI']
38
+ require 'simplecov-rcov'
39
+ SimpleCov.formatter = SimpleCov::Formatter::RcovFormatter
40
+ end
41
+
42
+ SimpleCov.start do
43
+ add_filter '/spec/'
44
+ add_filter '/vendor/bundle/'
45
+ end
46
+
47
+ require 'guard/rubocop'
@@ -0,0 +1,2 @@
1
+ Syntax:
2
+ Enabled: false
@@ -0,0 +1,18 @@
1
+ # coding: utf-8
2
+
3
+ module CaptureHelper
4
+ def capture(stream_name)
5
+ stream_name = stream_name.to_s.downcase
6
+ original_stream = eval("$#{stream_name}")
7
+ eval("$#{stream_name} = StringIO.new")
8
+
9
+ begin
10
+ yield
11
+ result = eval("$#{stream_name}").string
12
+ ensure
13
+ eval("$#{stream_name} = original_stream")
14
+ end
15
+
16
+ result
17
+ end
18
+ end
@@ -0,0 +1,18 @@
1
+ # coding: utf-8
2
+
3
+ shared_context 'silence output', silence_output: true do
4
+ before do
5
+ null_output = double('output').as_null_object
6
+
7
+ @original_stdout = $stdout
8
+ @original_stderr = $stderr
9
+
10
+ $stdout = null_output
11
+ $stderr = null_output
12
+ end
13
+
14
+ after do
15
+ $stdout = @original_stdout
16
+ $stderr = @original_stderr
17
+ end
18
+ end
metadata ADDED
@@ -0,0 +1,212 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: guard-rubocop
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Yuji Nakayama
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2013-04-20 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: guard
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ~>
18
+ - !ruby/object:Gem::Version
19
+ version: '1.8'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: '1.8'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rubocop
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ~>
32
+ - !ruby/object:Gem::Version
33
+ version: '0.5'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ~>
39
+ - !ruby/object:Gem::Version
40
+ version: '0.5'
41
+ - !ruby/object:Gem::Dependency
42
+ name: childprocess
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ~>
46
+ - !ruby/object:Gem::Version
47
+ version: '0.3'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ~>
53
+ - !ruby/object:Gem::Version
54
+ version: '0.3'
55
+ - !ruby/object:Gem::Dependency
56
+ name: term-ansicolor
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ version: '1.1'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ~>
67
+ - !ruby/object:Gem::Version
68
+ version: '1.1'
69
+ - !ruby/object:Gem::Dependency
70
+ name: bundler
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ~>
74
+ - !ruby/object:Gem::Version
75
+ version: '1.3'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ~>
81
+ - !ruby/object:Gem::Version
82
+ version: '1.3'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rake
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ~>
88
+ - !ruby/object:Gem::Version
89
+ version: '10.0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ~>
95
+ - !ruby/object:Gem::Version
96
+ version: '10.0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: rspec
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ~>
102
+ - !ruby/object:Gem::Version
103
+ version: '2.13'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ~>
109
+ - !ruby/object:Gem::Version
110
+ version: '2.13'
111
+ - !ruby/object:Gem::Dependency
112
+ name: simplecov
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ~>
116
+ - !ruby/object:Gem::Version
117
+ version: '0.7'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ~>
123
+ - !ruby/object:Gem::Version
124
+ version: '0.7'
125
+ - !ruby/object:Gem::Dependency
126
+ name: guard-rspec
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - '>='
130
+ - !ruby/object:Gem::Version
131
+ version: 2.5.4
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - '>='
137
+ - !ruby/object:Gem::Version
138
+ version: 2.5.4
139
+ - !ruby/object:Gem::Dependency
140
+ name: ruby_gntp
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - '>='
144
+ - !ruby/object:Gem::Version
145
+ version: '0.3'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - '>='
151
+ - !ruby/object:Gem::Version
152
+ version: '0.3'
153
+ description: Guard::Rubocop allows you to automatically check Ruby code style with
154
+ RuboCop when files are modified.
155
+ email:
156
+ - nkymyj@gmail.com
157
+ executables: []
158
+ extensions: []
159
+ extra_rdoc_files: []
160
+ files:
161
+ - .gitignore
162
+ - .travis.yml
163
+ - Gemfile
164
+ - Guardfile
165
+ - LICENSE.txt
166
+ - README.md
167
+ - Rakefile
168
+ - guard-rubocop.gemspec
169
+ - lib/guard/.rubocop.yml
170
+ - lib/guard/rubocop.rb
171
+ - lib/guard/rubocop/runner.rb
172
+ - lib/guard/rubocop/templates/Guardfile
173
+ - lib/guard/rubocop/version.rb
174
+ - spec/.rubocop.yml
175
+ - spec/guard/rubocop/runner_spec.rb
176
+ - spec/guard/rubocop_spec.rb
177
+ - spec/spec_helper.rb
178
+ - spec/support/.rubocop.yml
179
+ - spec/support/capture_helper.rb
180
+ - spec/support/silence_output.rb
181
+ homepage: https://github.com/yujinakayama/guard-rubocop
182
+ licenses:
183
+ - MIT
184
+ metadata: {}
185
+ post_install_message:
186
+ rdoc_options: []
187
+ require_paths:
188
+ - lib
189
+ required_ruby_version: !ruby/object:Gem::Requirement
190
+ requirements:
191
+ - - '>='
192
+ - !ruby/object:Gem::Version
193
+ version: '0'
194
+ required_rubygems_version: !ruby/object:Gem::Requirement
195
+ requirements:
196
+ - - '>='
197
+ - !ruby/object:Gem::Version
198
+ version: '0'
199
+ requirements: []
200
+ rubyforge_project:
201
+ rubygems_version: 2.0.3
202
+ signing_key:
203
+ specification_version: 4
204
+ summary: Guard plugin for RuboCop
205
+ test_files:
206
+ - spec/.rubocop.yml
207
+ - spec/guard/rubocop/runner_spec.rb
208
+ - spec/guard/rubocop_spec.rb
209
+ - spec/spec_helper.rb
210
+ - spec/support/.rubocop.yml
211
+ - spec/support/capture_helper.rb
212
+ - spec/support/silence_output.rb