test-loop 3.0.0 → 3.0.1
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.
- data/README.md +9 -6
- data/bin/test-loop +14 -11
- metadata +3 -3
data/README.md
CHANGED
@@ -8,21 +8,24 @@ and tests changes in your Ruby application in an efficient manner, whereby it:
|
|
8
8
|
2. Forks to evaluate your test files directly and without overhead.
|
9
9
|
|
10
10
|
It relies on file modification times to determine what parts of your Ruby
|
11
|
-
application have changed and then
|
12
|
-
|
11
|
+
application have changed and then uses a simple lambda mapping function to
|
12
|
+
determine which test files in your test suite correspond to those changes.
|
13
13
|
|
14
14
|
|
15
15
|
Features
|
16
16
|
--------
|
17
17
|
|
18
|
-
* Tests
|
18
|
+
* Tests *changes* in your Ruby application; does not run all tests every time.
|
19
19
|
|
20
20
|
* Reabsorbs test execution overhead if the test or spec helper file changes.
|
21
21
|
|
22
22
|
* Mostly I/O bound, so you can have it always running without CPU slowdowns.
|
23
23
|
|
24
|
-
* Supports
|
25
|
-
by your application's `test/test_helper.rb`
|
24
|
+
* Supports any testing framework that (1) reflects failures in the process'
|
25
|
+
exit status and (2) is loaded by your application's `test/test_helper.rb`
|
26
|
+
or `spec/spec_helper.rb` file.
|
27
|
+
|
28
|
+
* Configurable through a `.test-loop` file in your current working directory.
|
26
29
|
|
27
30
|
* Implemented in less than 60 (SLOC) lines of code! :-)
|
28
31
|
|
@@ -95,7 +98,7 @@ define the following instance variables:
|
|
95
98
|
end
|
96
99
|
}
|
97
100
|
|
98
|
-
* `@after_test_execution` is a
|
101
|
+
* `@after_test_execution` is a lambda function that is executed after tests
|
99
102
|
are run. It is passed three things: the status of the test execution
|
100
103
|
subprocess, the time when the tests were run, and the list of test files
|
101
104
|
that were run.
|
data/bin/test-loop
CHANGED
@@ -21,12 +21,13 @@
|
|
21
21
|
# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
22
22
|
# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
23
23
|
#
|
24
|
+
|
25
|
+
process_invocation_vector = [$0, *ARGV].map! {|s| s.dup }
|
26
|
+
|
24
27
|
begin
|
25
|
-
|
26
|
-
puts "test-loop: #{message}"
|
27
|
-
end
|
28
|
+
notify = lambda {|message| puts "test-loop: #{message}" }
|
28
29
|
|
29
|
-
notify 'Loading configuration...'
|
30
|
+
notify.call 'Loading configuration...'
|
30
31
|
config_file = File.join(Dir.pwd, '.test-loop')
|
31
32
|
load config_file if File.exist? config_file
|
32
33
|
|
@@ -54,7 +55,7 @@ begin
|
|
54
55
|
# absorb test execution overhead into master process
|
55
56
|
$LOAD_PATH.unshift 'lib' # for non-Rails applications
|
56
57
|
|
57
|
-
notify 'Absorbing overhead...'
|
58
|
+
notify.call 'Absorbing overhead...'
|
58
59
|
Dir[*@overhead_file_globs].each do |file|
|
59
60
|
$LOAD_PATH.insert 1, File.dirname(file)
|
60
61
|
require File.basename(file, File.extname(file))
|
@@ -66,7 +67,7 @@ begin
|
|
66
67
|
trap(:QUIT) { started_at = epoch_time }
|
67
68
|
trap(:TSTP) { last_ran_at = epoch_time }
|
68
69
|
|
69
|
-
notify 'Ready for testing!'
|
70
|
+
notify.call 'Ready for testing!'
|
70
71
|
loop do
|
71
72
|
# figure out what test files need to be run
|
72
73
|
test_files = @source_file_to_test_file_mapping.
|
@@ -78,24 +79,26 @@ begin
|
|
78
79
|
|
79
80
|
# fork worker process to run the test files
|
80
81
|
unless test_files.empty?
|
81
|
-
notify 'Running tests...'
|
82
|
+
notify.call 'Running tests...'
|
82
83
|
last_ran_at = Time.now
|
83
|
-
fork { test_files.each {|file| notify file; load file } }
|
84
|
+
fork { test_files.each {|file| notify.call file; load file } }
|
84
85
|
Process.wait
|
85
86
|
@after_test_execution.call($?, last_ran_at, test_files)
|
86
87
|
end
|
87
88
|
|
88
89
|
# reabsorb test execution overhead as necessary
|
89
90
|
if Dir[*@reabsorb_file_globs].any? {|file| File.mtime(file) > started_at }
|
90
|
-
notify 'Restarting loop...'
|
91
|
-
exec
|
91
|
+
notify.call 'Restarting loop...'
|
92
|
+
exec(*process_invocation_vector)
|
92
93
|
end
|
93
94
|
|
94
95
|
sleep 1
|
95
96
|
end
|
97
|
+
|
96
98
|
rescue Interrupt
|
97
99
|
# user wants to quit the loop
|
100
|
+
|
98
101
|
rescue StandardError, LoadError, SyntaxError => error
|
99
102
|
puts error.inspect, error.backtrace
|
100
|
-
sleep 1 and exec
|
103
|
+
sleep 1 and exec(*process_invocation_vector)
|
101
104
|
end
|
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 3
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
version: 3.0.
|
8
|
+
- 1
|
9
|
+
version: 3.0.1
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Suraj N. Kurapati
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2011-01-
|
17
|
+
date: 2011-01-05 00:00:00 -08:00
|
18
18
|
default_executable:
|
19
19
|
dependencies: []
|
20
20
|
|