Narnach-minitest 0.2.1 → 0.2.2

Sign up to get free protection for your applications and to get access to all the features.
data/bin/minitest CHANGED
@@ -4,5 +4,8 @@ require 'minitest'
4
4
 
5
5
  minitest = Minitest.new
6
6
  minitest.recent = (ARGV.include? "recent")
7
- minitest.spec_opts = "--format profile --colour --diff unified" if ARGV.include? "profile"
7
+ custom_spec_opts = ''
8
+ custom_spec_opts << " --drb" if ARGV.include? "drb"
9
+ custom_spec_opts << " --format profile --colour --diff unified" if ARGV.include? "profile"
10
+ minitest.spec_opts = custom_spec_opts if custom_spec_opts.size > 0
8
11
  minitest.start
data/lib/dir_monitor.rb CHANGED
@@ -4,7 +4,7 @@
4
4
  # - Keep track of changed files in monitored directories.
5
5
  # - Link these files to their specs, so Minitest can run the specs.
6
6
  class DirMonitor
7
- attr_reader :known_files, :dirs
7
+ attr_reader :known_files, :dirs, :last_mtime
8
8
 
9
9
  # Setup a new DirMonitor.
10
10
  # Directories can be provided in a number of ways:
@@ -15,6 +15,7 @@ class DirMonitor
15
15
  def initialize(*dirs)
16
16
  @dirs = dirs.flatten.map{|dir| dir.to_s}
17
17
  @known_files = []
18
+ @last_mtime = {}
18
19
  end
19
20
 
20
21
  # Scan for all files in the directories and their sub-directories.
@@ -28,6 +29,29 @@ class DirMonitor
28
29
  @known_files = results
29
30
  end
30
31
 
32
+ # Scan for changes in the known files.
33
+ # Yields the name of the changed files.
34
+ # Stores the mtime for all changed files.
35
+ def scan_changed(&block) # :yields: file
36
+ known_files.each do |known_file|
37
+ new_mtime = mtime_for(known_file)
38
+ if new_mtime != last_mtime[known_file]
39
+ block.call(known_file)
40
+ last_mtime[known_file]= new_mtime
41
+ end
42
+ end
43
+ end
44
+
45
+ # Scans for changed known files, using #scan_changed. Yields the name of both the file and its associated spec.
46
+ # spec_for is used to determine what the name of the file's spec _should_ be.
47
+ # Does not yield a file/spec name when the spec does not exist.
48
+ def scan_changed_with_spec(&block) # :yields: file, spec
49
+ scan_changed do |file|
50
+ spec = spec_for(file)
51
+ block.call(file, spec) if File.exists?(spec)
52
+ end
53
+ end
54
+
31
55
  # Scan for new files.
32
56
  # All new file names are yielded.
33
57
  def scan_new(&block) # :yields: file
@@ -39,6 +63,19 @@ class DirMonitor
39
63
  end
40
64
  end
41
65
 
66
+ # Scan for new files and check for changed known files.
67
+ # Only yields a file once per call.
68
+ def scan_new_or_changed_with_spec(&block) # :yields: file, spec
69
+ yielded_files = {}
70
+ yield_once_block = Proc.new do |file, spec|
71
+ next if yielded_files.has_key? file
72
+ block.call(file, spec)
73
+ yielded_files[file]=nil
74
+ end
75
+ scan_new_with_spec(&yield_once_block)
76
+ scan_changed_with_spec(&yield_once_block)
77
+ end
78
+
42
79
  # Scans for new files, like scan_new does, but yields the name of both the file and spec.
43
80
  # spec_for is used to determine what the name of the file's spec _should_ be.
44
81
  # Does not yield a file/spec name when the spec does not exist.
@@ -73,4 +110,11 @@ class DirMonitor
73
110
  spec_dir = dir_array.join('/')
74
111
  return File.join(spec_dir, spec_file)
75
112
  end
113
+
114
+ private
115
+
116
+ # Get the modification time for a file.
117
+ def mtime_for(file)
118
+ File.mtime(file)
119
+ end
76
120
  end
@@ -31,77 +31,188 @@ describe DirMonitor, "#scan" do
31
31
  end
32
32
 
33
33
  describe DirMonitor, "#scan_new" do
34
+ before(:each) do
35
+ @known_files = %w[lib/minitest.rb lib/dir_monitor.rb]
36
+ Dir.stub!(:glob).with('lib/**/*').and_return(@known_files)
37
+ @dm = DirMonitor.new 'lib'
38
+ end
39
+
34
40
  it "should yield the names of all new files" do
35
- known_files = %w[lib/minitest.rb lib/dir_monitor.rb]
36
- Dir.should_receive(:glob).with('lib/**/*').and_return(known_files)
37
- dm = DirMonitor.new('lib')
38
41
  yield_results = []
39
- dm.scan_new do |file|
42
+ @dm.scan_new do |file|
40
43
  yield_results << file
41
44
  end
42
- yield_results.should == known_files
45
+ yield_results.should == @known_files
43
46
  end
44
47
 
45
48
  it "should not yield known file names" do
46
- known_files = %w[lib/minitest.rb lib/dir_monitor.rb]
47
49
  known_files2 = %w[lib/minitest.rb lib/dir_monitor2.rb]
48
- Dir.should_receive(:glob).with('lib/**/*').and_return(known_files, known_files2)
49
- dm = DirMonitor.new('lib')
50
- dm.scan
50
+ Dir.stub!(:glob).with('lib/**/*').and_return(@known_files, known_files2)
51
+ @dm.scan
51
52
  yield_results = []
52
- dm.scan_new do |file|
53
+ @dm.scan_new do |file|
53
54
  yield_results << file
54
55
  end
55
- yield_results.should == known_files2 - known_files
56
+ yield_results.should == known_files2 - @known_files
56
57
  end
57
58
  end
58
59
 
59
- describe DirMonitor, "#spec_for" do
60
- it "should find the spec for a given file" do
61
- file = 'lib/dir_monitor.rb'
62
- spec = 'spec/dir_monitor_spec.rb'
63
- dm = DirMonitor.new
64
- dm.spec_for(file).should == spec
60
+ describe DirMonitor, "#scan_new_with_spec" do
61
+ before :each do
62
+ @file = 'lib/dir_monitor.rb'
63
+ @spec = 'spec/dir_monitor_spec.rb'
64
+ Dir.stub!(:glob).with('lib/**/*').and_return([@file])
65
+ @dm = DirMonitor.new 'lib'
65
66
  end
66
67
 
67
- it "should find the spec for non-ruby files" do
68
- file = 'app/views/posts/post.html.haml'
69
- spec = 'spec/views/posts/post.html.haml_spec.rb'
70
- dm = DirMonitor.new
71
- dm.spec_for(file).should == spec
68
+ it "should yield new files and their specs" do
69
+ File.should_receive(:exists?).with(@spec).and_return(true)
70
+ results = []
71
+ @dm.scan_new_with_spec do |new_file, new_spec|
72
+ results << {new_file => new_spec}
73
+ end
74
+ results.should == [{@file=>@spec}]
72
75
  end
73
76
 
74
- it "should map specs to themselves" do
75
- spec = 'spec/dir_monitor_spec.rb'
76
- dm = DirMonitor.new
77
- dm.spec_for(spec).should == spec
77
+ it "should not yield files with non-existent specs" do
78
+ File.should_receive(:exists?).with(@spec).and_return(false)
79
+ results = []
80
+ @dm.scan_new_with_spec do |new_file, new_spec|
81
+ results << {new_file => new_spec}
82
+ end
83
+ results.should == []
78
84
  end
79
85
  end
80
86
 
81
- describe DirMonitor, "#scan_new_with_spec" do
82
- it "should yield new files and their specs" do
83
- file = 'lib/dir_monitor.rb'
84
- spec = 'spec/dir_monitor_spec.rb'
85
- Dir.should_receive(:glob).with('lib/**/*').and_return([file])
86
- File.should_receive(:exists?).with(spec).and_return(true)
87
- dm = DirMonitor.new 'lib'
87
+ describe DirMonitor, "#scan_changed" do
88
+ before(:each) do
89
+ @file = 'lib/dir_monitor.rb'
90
+ @time = Time.now
91
+ Dir.stub!(:glob).with('lib/**/*').and_return([@file])
92
+ File.stub!(:mtime).with(@file).and_return(@time)
93
+ @dm = DirMonitor.new 'lib'
94
+ @dm.scan
95
+ end
96
+
97
+ it "should yield the names of changed known files" do
98
+ changes = []
99
+ @dm.scan_changed do |changed_file|
100
+ changes << changed_file
101
+ end
102
+ changes.should == [@file]
103
+ end
104
+
105
+ it "should not yield the names of files which did not change since last scan" do
106
+ @dm.scan_changed { |f| }
107
+ changes = []
108
+ @dm.scan_changed do |changed_file|
109
+ changes << changed_file
110
+ end
111
+ changes.should == []
112
+ end
113
+
114
+ it "should yield for every change in a file" do
115
+ # Every scan should find the file changed:
116
+ File.should_receive(:mtime).with(@file).and_return(@time-3,@time-2,@time-1)
117
+ 3.times do
118
+ changes = []
119
+ @dm.scan_changed do |changed_file|
120
+ changes << changed_file
121
+ end
122
+ changes.should == [@file]
123
+ end
124
+ end
125
+ end
126
+
127
+ describe DirMonitor, "scan_changed_with_spec" do
128
+ before(:each) do
129
+ @file = 'lib/dir_monitor.rb'
130
+ @spec = 'spec/dir_monitor_spec.rb'
131
+ @time = Time.now
132
+ Dir.stub!(:glob).with('lib/**/*').and_return([@file])
133
+ File.stub!(:mtime).with(@file).and_return(@time)
134
+ @dm = DirMonitor.new 'lib'
135
+ @dm.scan
136
+ end
137
+
138
+ it "should yield the file name and spec name of changed files with an existing spec" do
139
+ File.should_receive(:exists?).with(@spec).and_return(true)
140
+ changes = []
141
+ @dm.scan_changed_with_spec do |changed_file, spec_file|
142
+ changes << { changed_file => spec_file }
143
+ end
144
+ changes.should == [{@file=>@spec}]
145
+ end
146
+
147
+ it "should not yield the file name and spec name of changed files without an existing spec" do
148
+ File.should_receive(:exists?).with(@spec).and_return(false)
149
+ changes = []
150
+ @dm.scan_changed_with_spec do |changed_file, spec_file|
151
+ changes << { changed_file => spec_file }
152
+ end
153
+ changes.should == []
154
+ end
155
+ end
156
+
157
+ describe DirMonitor, "scan_new_or_changed_with_spec" do
158
+ before(:each) do
159
+ @file = 'lib/dir_monitor.rb'
160
+ @spec = 'spec/dir_monitor_spec.rb'
161
+ @time = Time.now
162
+ Dir.stub!(:glob).with('lib/**/*').and_return([@file])
163
+ File.stub!(:mtime).with(@file).and_return(@time)
164
+ @dm = DirMonitor.new 'lib'
165
+ end
166
+
167
+ it "should yield a file and spec when a file is new" do
88
168
  results = []
89
- dm.scan_new_with_spec do |new_file, new_spec|
90
- results << {new_file => new_spec}
169
+ @dm.scan_new_or_changed_with_spec do |file, spec|
170
+ results << {file => spec}
91
171
  end
92
- results.should == [{file=>spec}]
172
+ results.should == [{@file=>@spec}]
93
173
  end
94
174
 
95
- it "should not yield files with non-existent specs" do
96
- file = 'lib/dir_monitor.rb'
97
- spec = 'spec/dir_monitor_spec.rb'
98
- Dir.should_receive(:glob).with('lib/**/*').and_return([file])
99
- File.should_receive(:exists?).with(spec).and_return(false)
100
- dm = DirMonitor.new 'lib'
175
+ it "should yield a file and spec when a file is not new but has changed" do
176
+ @dm.scan
177
+ @dm.scan_changed {|f|}
178
+ File.should_receive(:mtime).with(@file).and_return(@time+1)
101
179
  results = []
102
- dm.scan_new_with_spec do |new_file, new_spec|
103
- results << {new_file => new_spec}
180
+ @dm.scan_new_or_changed_with_spec do |file, spec|
181
+ results << {file => spec}
182
+ end
183
+ results.should == [{@file=>@spec}]
184
+ end
185
+
186
+ it "should not yield a file and spec when a file is not new and has not changed" do
187
+ @dm.scan
188
+ @dm.scan_changed {|f|}
189
+ results = []
190
+ @dm.scan_new_or_changed_with_spec do |file, spec|
191
+ results << {file => spec}
104
192
  end
105
193
  results.should == []
106
194
  end
195
+ end
196
+
197
+ describe DirMonitor, "#spec_for" do
198
+ before(:each) do
199
+ @dm = DirMonitor.new
200
+ end
201
+
202
+ it "should find the spec for a given file" do
203
+ file = 'lib/dir_monitor.rb'
204
+ spec = 'spec/dir_monitor_spec.rb'
205
+ @dm.spec_for(file).should == spec
206
+ end
207
+
208
+ it "should find the spec for non-ruby files" do
209
+ file = 'app/views/posts/post.html.haml'
210
+ spec = 'spec/views/posts/post.html.haml_spec.rb'
211
+ @dm.spec_for(file).should == spec
212
+ end
213
+
214
+ it "should map specs to themselves" do
215
+ spec = 'spec/dir_monitor_spec.rb'
216
+ @dm.spec_for(spec).should == spec
217
+ end
107
218
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: Narnach-minitest
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ version: 0.2.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Wes Oldenbeuving
@@ -74,7 +74,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
74
74
  requirements: []
75
75
 
76
76
  rubyforge_project:
77
- rubygems_version: 1.0.1
77
+ rubygems_version: 1.2.0
78
78
  signing_key:
79
79
  specification_version: 2
80
80
  summary: Minitest is a simple autotester tool.