tork 19.3.0 → 19.3.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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 8219d1204291e55fe5cf61d26abf4c87372db20e
4
+ data.tar.gz: 9ea1ec98a37c9617da8d685d7bb32bce3dd90678
5
+ SHA512:
6
+ metadata.gz: c5484725a1107f331f2c593735a3d290bf85e5dc668f9cbb41542248dfc84d29593f3a7e91bbce8c4138fb11e6df916878ee5ab3999413ed6737236895572f4f
7
+ data.tar.gz: 15c38bc0433802ce53e2f6828883db013bfdeec4e088993fca9c180480bbb717ec05d38beb015dc7df8dd78a354240093cbb327a03c8f2c9716eaf74b079d4af
data/Rakefile CHANGED
@@ -1,4 +1,3 @@
1
1
  require "bundler/gem_tasks"
2
2
  require "binman/rakefile"
3
- require "md2man"
4
3
  require "md2man/rakefile"
data/VERSION.markdown CHANGED
@@ -1,3 +1,16 @@
1
+ ## Version 19.3.1 (2013-06-07)
2
+
3
+ Patch:
4
+
5
+ * server: rescue from failed writes to asynchronously closed clients.
6
+
7
+ Thanks to Jonathan Cairns for reporting and fixing this bug in GH-53:
8
+ https://github.com/sunaku/tork/issues/53
9
+
10
+ Other:
11
+
12
+ * Upgrade to md2man 2.0.
13
+
1
14
  ## Version 19.3.0 (2013-05-05)
2
15
 
3
16
  Minor:
data/bin/tork CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
2
  =begin =======================================================================
3
3
 
4
- # TORK 1 2013-05-05 19.3.0
4
+ # TORK 1 2013-06-07 19.3.1
5
5
 
6
6
  ## NAME
7
7
 
data/bin/tork-driver CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
2
  =begin =======================================================================
3
3
 
4
- # TORK-DRIVER 1 2013-05-05 19.3.0
4
+ # TORK-DRIVER 1 2013-06-07 19.3.1
5
5
 
6
6
  ## NAME
7
7
 
data/bin/tork-engine CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
2
  =begin =======================================================================
3
3
 
4
- # TORK-ENGINE 1 2013-05-05 19.3.0
4
+ # TORK-ENGINE 1 2013-06-07 19.3.1
5
5
 
6
6
  ## NAME
7
7
 
data/bin/tork-herald CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
2
  =begin =======================================================================
3
3
 
4
- # TORK-HERALD 1 2013-05-05 19.3.0
4
+ # TORK-HERALD 1 2013-06-07 19.3.1
5
5
 
6
6
  ## NAME
7
7
 
data/bin/tork-master CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
2
  =begin =======================================================================
3
3
 
4
- # TORK-MASTER 1 2013-05-05 19.3.0
4
+ # TORK-MASTER 1 2013-06-07 19.3.1
5
5
 
6
6
  ## NAME
7
7
 
data/bin/tork-notify CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
2
  =begin =======================================================================
3
3
 
4
- # TORK-NOTIFY 1 2013-05-05 19.3.0
4
+ # TORK-NOTIFY 1 2013-06-07 19.3.1
5
5
 
6
6
  ## NAME
7
7
 
data/lib/tork/server.rb CHANGED
@@ -101,8 +101,14 @@ protected
101
101
 
102
102
  targets.each do |target|
103
103
  target = @stdout if target == STDIN
104
- target.puts message
105
- target.flush
104
+ begin
105
+ target.puts message
106
+ target.flush
107
+ rescue Errno::EPIPE
108
+ # the target closed itself asynchronously
109
+ # https://github.com/sunaku/tork/issues/53
110
+ next
111
+ end
106
112
  end
107
113
  end
108
114
 
data/lib/tork/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Tork
2
- VERSION = "19.3.0"
2
+ VERSION = "19.3.1"
3
3
  end
data/man/index.html ADDED
@@ -0,0 +1,11 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <meta charset="utf-8" />
5
+ <meta name="generator" content="md2man 2.0.0 https://github.com/sunaku/md2man" />
6
+ <title>man/index</title>
7
+ <link rel="stylesheet" href="style.css"/>
8
+ <!--[if lt IE 9]><script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script><![endif]-->
9
+ </head>
10
+ <body><div class="container-fluid"><h2 id="man0">man0</h2><dl class="dl-horizontal"><dt><a href="man0/README.html">README</a></dt><dd></dd></dl><dl class="dl-horizontal"><dt><a href="man0/VERSION.html">VERSION</a></dt><dd></dd></dl><h2 id="man1">man1</h2><dl class="dl-horizontal"><dt><a href="man1/tork-driver.1.html">tork-driver(1)</a></dt><dd>drives tork-engine(1) when files change</dd></dl><dl class="dl-horizontal"><dt><a href="man1/tork-engine.1.html">tork-engine(1)</a></dt><dd>wraps tork-master(1) with bookkeeping</dd></dl><dl class="dl-horizontal"><dt><a href="man1/tork-herald.1.html">tork-herald(1)</a></dt><dd>reports modified files</dd></dl><dl class="dl-horizontal"><dt><a href="man1/tork-master.1.html">tork-master(1)</a></dt><dd>absorbs overhead and runs tests</dd></dl><dl class="dl-horizontal"><dt><a href="man1/tork-notify.1.html">tork-notify(1)</a></dt><dd>notifies you of test status changes</dd></dl><dl class="dl-horizontal"><dt><a href="man1/tork-remote.1.html">tork-remote(1)</a></dt><dd>controls tork(1) programs</dd></dl><dl class="dl-horizontal"><dt><a href="man1/tork.1.html">tork(1)</a></dt><dd>Continuous testing tool for Ruby</dd></dl></div></body>
11
+ </html>
@@ -0,0 +1,137 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <meta charset="utf-8" />
5
+ <meta name="generator" content="md2man 2.0.0 https://github.com/sunaku/md2man" />
6
+ <title>README</title>
7
+ <link rel="stylesheet" href="../style.css"/>
8
+ <!--[if lt IE 9]><script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script><![endif]-->
9
+ </head>
10
+ <body><div class="navbar"><div class="navbar-inner"><span class="brand"><a href="../index.html#man0">man0</a>/README</span></div></div><div class="container-fluid"><pre><code>_______ _______
11
+ ___ /___________ /__
12
+ _ __/ __ \ __/ /_/
13
+ / /_/ /_/ / / / ,\
14
+ \__/\____/_/ /_/|_\
15
+ &gt;&gt;&gt;------&gt;
16
+ </code></pre>
17
+ <h1 id="Test-with-fork"><em>Test with fork</em></h1><p>Tork runs your tests as they change, in parallel:</p>
18
+ <ol>
19
+ <li><p>Absorbs test execution overhead into a master process.</p></li>
20
+ <li><p>Forks to inherit overhead and run test files in parallel.</p></li>
21
+ <li><p>Avoids running unchanged tests inside changed test files.</p></li>
22
+ </ol>
23
+ <h2 id="Features">Features</h2>
24
+ <ul>
25
+ <li><p>No configuration necessary: simply run <code>tork</code> to start testing <em>now!</em></p></li>
26
+ <li><p>Runs test files in parallel using fork for multi-core/CPU utilization.</p></li>
27
+ <li><p>Tests <em>changes</em> your Ruby application for rapid TDD: avoids running (1)
28
+ unchanged test files and (2) unchanged tests inside changed test files.</p></li>
29
+ <li><p>Supports MiniTest, Test::Unit, RSpec, and <em>any testing framework</em> that (1)
30
+ exits with a nonzero status to indicate test failures and (2) is loaded by
31
+ your application&#39;s <code>test/test_helper.rb</code> or <code>spec/spec_helper.rb</code> file.</p></li>
32
+ <li><p>Logs the output from your tests into separate files: one log per test.</p></li>
33
+ <li><p>Configurable through Ruby scripts in your current working directory.</p></li>
34
+ <li><p>You can override the modular <code>tork*</code> programs with your own in $PATH.</p></li>
35
+ <li><p>You can remotely control other <code>tork*</code> programs using <a class="md2man-xref" href="../man1/tork-remote.1.html">tork-remote(1)</a>.</p></li>
36
+ </ul>
37
+ <h3 id="Architecture">Architecture</h3><p>Following UNIX philosophy, Tork is composed of simple text-based programs that
38
+ <em>do one thing well</em>. As a result, you can even create your own user interface
39
+ for Tork by wrapping the <a class="md2man-xref" href="../man1/tork-driver.1.html">tork-driver(1)</a> program appropriately!</p>
40
+ <ul>
41
+ <li><a class="md2man-xref" href="../man1/tork.1.html">tork(1)</a> is an interactive command-line user interface for <a class="md2man-xref" href="../man1/tork-driver.1.html">tork-driver(1)</a></li>
42
+ <li><a class="md2man-xref" href="../man1/tork-herald.1.html">tork-herald(1)</a> monitors current directory tree and reports changed files</li>
43
+ <li><a class="md2man-xref" href="../man1/tork-driver.1.html">tork-driver(1)</a> drives the engine according to the herald&#39;s observations</li>
44
+ <li><a class="md2man-xref" href="../man1/tork-engine.1.html">tork-engine(1)</a> tells master to run tests and keeps track of test results</li>
45
+ <li><a class="md2man-xref" href="../man1/tork-master.1.html">tork-master(1)</a> absorbs test execution overhead and forks to run your tests</li>
46
+ <li><a class="md2man-xref" href="../man1/tork-remote.1.html">tork-remote(1)</a> remotely controls any Tork program running in the same <code>pwd</code></li>
47
+ <li><a class="md2man-xref" href="../man1/tork-notify.1.html">tork-notify(1)</a> shows how to receive and process messages from Tork programs</li>
48
+ </ul>
49
+ <p>When the herald observes that files in or beneath the current directory have
50
+ been written to, it tells the driver, which then commands the master to fork a
51
+ worker process to run the tests affected by those changed files. This is all
52
+ performed <em>automatically</em>. However, to run a test file <em>manually</em>, you can:</p>
53
+ <ol>
54
+ <li><p>Simply save the file! When you do, Tork tries to figure out which tests
55
+ inside your newly saved test file have changed (using diff and regexps)
56
+ and then attempts to run just those. To make it run <em>all</em> tests in your
57
+ saved file, simply save the file <em>again</em> without changing it.</p></li>
58
+ <li><p>Type <code>t</code> followed by a space and the file you want to run into <a class="md2man-xref" href="../man1/tork.1.html">tork(1)</a>:</p>
59
+ <pre><code># run all of test/some_test.rb
60
+ t test/some_test.rb
61
+
62
+ # run lines 4, 33, and 21 of test/some_test.rb
63
+ t test/some_test.rb 4 33 21
64
+ </code></pre></li>
65
+ <li><p>Send a <code>[&quot;run_test_file&quot;]</code> message to <a class="md2man-xref" href="../man1/tork-engine.1.html">tork-engine(1)</a> using <a class="md2man-xref" href="../man1/tork-remote.1.html">tork-remote(1)</a>:</p>
66
+ <pre><code># run all of test/some_test.rb
67
+ echo run_test_file test/some_test.rb | tork-remote tork-engine
68
+
69
+ # run lines 4, 33, and 21 of test/some_test.rb
70
+ echo run_test_file test/some_test.rb 4 33 21 | tork-remote tork-engine
71
+ </code></pre></li>
72
+ </ol>
73
+ <h2 id="Installation">Installation</h2>
74
+ <pre><code>gem install tork
75
+ </code></pre>
76
+ <h3 id="Prerequisites">Prerequisites</h3>
77
+ <ul>
78
+ <li><p>Ruby 1.8.7 or 1.9.3 or newer.</p></li>
79
+ <li><p>Operating system that supports POSIX signals and the <code>fork()</code> system call.
80
+ To check if your system qualifies, launch <a class="md2man-xref">irb(1)</a> and enter the following:</p>
81
+ <pre><code>Process.respond_to? :fork # must be true
82
+ Signal.list.key? &#39;TERM&#39; # must be true
83
+ Signal.list.key? &#39;KILL&#39; # must be true
84
+ </code></pre></li>
85
+ <li><p>To make the <a class="md2man-xref" href="../man1/tork-herald.1.html">tork-herald(1)</a> program&#39;s filesystem monitoring more efficient:</p>
86
+ <pre><code>gem install rb-inotify # linux
87
+ gem install rb-fsevent # macosx
88
+ </code></pre></li>
89
+ </ul>
90
+ <h3 id="Development">Development</h3>
91
+ <pre><code>git clone git://github.com/sunaku/tork
92
+ cd tork
93
+ bundle install
94
+ bundle exec tork --help # run it directly
95
+ bundle exec rake --tasks # packaging tasks
96
+ </code></pre>
97
+ <h2 id="Usage">Usage</h2><h3 id="At-the-command-line">At the command line</h3>
98
+ <pre><code>tork --help
99
+ </code></pre>
100
+ <p>You can add line editing, history, and filename completion:</p>
101
+ <pre><code>rlwrap -c tork
102
+ </code></pre>
103
+ <p>You can control <a class="md2man-xref" href="../man1/tork.1.html">tork(1)</a> interactively from another terminal:</p>
104
+ <pre><code>tork-remote tork-engine
105
+ # type your commands here, one per line.
106
+ # press Control-D to exit <a class="md2man-xref" href="../man1/tork-remote.1.html">tork-remote(1)</a>
107
+ </code></pre>
108
+ <p>You can also do the same non-interactively using a pipeline:</p>
109
+ <pre><code># run lines 4, 33, and 21 of test/some_test.rb
110
+ echo run_test_file test/some_test.rb 4 33 21 | tork-remote tork-engine
111
+ </code></pre>
112
+ <p>You can monitor your test processes from another terminal:</p>
113
+ <pre><code>watch &#39;pgrep -f ^tork | xargs -r ps u&#39;
114
+ </code></pre>
115
+ <h3 id="With-MiniTest">With MiniTest</h3><p>MiniTest 1.3.2 and newer contain a bug where <code>minitest/autorun</code> won&#39;t run any
116
+ tests if someone calls <code>Kernel#exit</code> explicitly or simply loads a library
117
+ (such as RSpec) which makes the call implicitly. Use Tork 19.0.2+ to avoid
118
+ this problem or <a href="https://github.com/seattlerb/minitest/pull/183/files">apply this patch to the minitest library</a> to fix the problem.</p><h3 id="With-RSpec">With RSpec</h3><p>RSpec 2.9.0 and newer contain a bug where RSpec&#39;s autorun helper won&#39;t run any
119
+ specs if someone calls <code>Kernel#exit</code> explicitly or simply loads a library
120
+ (such as Test::Unit) which makes the call implicitly. Use Tork 19.0.2+ to
121
+ avoid this problem or <a href="https://github.com/rspec/rspec-core/pull/720/files">apply this patch to the rspec-core library</a> to fix the problem.</p><p>RSpec 2.8.0 and older contain <a href="https://github.com/sunaku/tork/issues/31">a bug</a> where a nonzero exit status (caused
122
+ by an uncaught exception) is overridden by RSpec&#39;s <code>Kernel#at_exit</code> handler to
123
+ be zero, thereby falsely indicating that a spec had passed. <a href="https://github.com/rspec/rspec-core/pull/569/files">This patch</a> fixes the problem.</p><h3 id="With-Ruby-on-Rails">With <a href="http://rubyonrails.org">Ruby on Rails</a></h3><p>For Rails 3 or newer, use the <code>rails</code> configuration helper <em>before</em> the <code>test</code>
124
+ or <code>spec</code> helpers. Otherwise your test helper will load Rails <em>before</em> the
125
+ specified <code>rails</code> configuration helper has a chance to disable class caching!</p><p>For older Rails, make sure your <code>config/environments/test.rb</code> file contains:</p>
126
+ <pre><code>config.cache_classes = false
127
+ </code></pre>
128
+ <p>To use SQLite3 as your test database, install its <a href="https://github.com/stepahn/memory_test_fix">in-memory database
129
+ adapter</a>. Otherwise, you <em>might</em> face these errors:</p>
130
+ <blockquote>
131
+ <p>SQLite3::BusyException: database is locked</p><p>cannot start a transaction within a transaction</p></blockquote>
132
+ <h2 id="Configuration">Configuration</h2><p>Tork looks for a configuration directory named <code>.tork/</code> inside its working
133
+ directory. The configuration directory contains specially-named Ruby scripts,
134
+ within which you can query and modify the settings for various tork programs.
135
+ See the &quot;FILES&quot; sections in the manual pages of tork programs for details.</p><p>Note that tork <em>does not</em> automatically reload changes from your configuration
136
+ directory. Consequently, you must restart tork if your configuration changes.</p><h2 id="License">License</h2><p>Released under the ISC license. See the LICENSE file for details.</p></div></body>
137
+ </html>
@@ -0,0 +1,981 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <meta charset="utf-8" />
5
+ <meta name="generator" content="md2man 2.0.0 https://github.com/sunaku/md2man" />
6
+ <title>VERSION</title>
7
+ <link rel="stylesheet" href="../style.css"/>
8
+ <!--[if lt IE 9]><script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script><![endif]-->
9
+ </head>
10
+ <body><div class="navbar"><div class="navbar-inner"><span class="brand"><a href="../index.html#man0">man0</a>/VERSION</span></div></div><div class="container-fluid"><h2 id="Version-19-3-1-2013-06-07">Version 19.3.1 (2013-06-07)</h2><p>Patch:</p>
11
+ <ul>
12
+ <li><p>server: rescue from failed writes to asynchronously closed clients.</p><p>Thanks to Jonathan Cairns for reporting and fixing this bug in GH-53:
13
+ <a href="https://github.com/sunaku/tork/issues/53">https://github.com/sunaku/tork/issues/53</a></p></li>
14
+ </ul>
15
+ <p>Other:</p>
16
+ <ul>
17
+ <li>Upgrade to md2man 2.0.</li>
18
+ </ul>
19
+ <h2 id="Version-19-3-0-2013-05-05">Version 19.3.0 (2013-05-05)</h2><p>Minor:</p>
20
+ <ul>
21
+ <li><p><a class="md2man-xref" href="../man1/tork-engine.1.html">tork-engine(1)</a> now emits <code>[&quot;idle&quot;]</code> messages whenever all tests
22
+ have finished running and no more tests are queued for running.</p><p>Thanks to Jonathan Cairns for requesting this feature in GH-50:
23
+ <a href="https://github.com/sunaku/tork/issues/50">https://github.com/sunaku/tork/issues/50</a></p></li>
24
+ </ul>
25
+ <p>Other:</p>
26
+ <ul>
27
+ <li><p>add man/man0 subdir containing README and VERSION</p></li>
28
+ <li><p>README: use manpage xrefs for linking in HTML mans</p></li>
29
+ </ul>
30
+ <h2 id="Version-19-2-2-2013-05-04">Version 19.2.2 (2013-05-04)</h2><p>This release makes Tork resilient to <code>Errno::EADDRINUSE</code> errors that may occur
31
+ sometimes, intermittently, when test execution overhead is being reabsorbed.</p><p>Patch:</p>
32
+ <ul>
33
+ <li>server: retry until the socket opens successfully</li>
34
+ </ul>
35
+ <p>Other:</p>
36
+ <ul>
37
+ <li>include md2man rake tasks in developer&#39;s rakefile</li>
38
+ </ul>
39
+ <h2 id="Version-19-2-1-2013-02-08">Version 19.2.1 (2013-02-08)</h2><p>Patch:</p>
40
+ <ul>
41
+ <li><p>GH-46: allow reassigning <code>$tork_*</code> variable values. Thanks to Joe
42
+ Escalante for reminding me to fix this issue.</p></li>
43
+ <li><p>GH-48: disable class caching at the ActiveSupport level for Devise.
44
+ Thanks to Ryan Ahearn for fixing this issue and to Jonathan Cairns for
45
+ reporting it.</p></li>
46
+ </ul>
47
+ <h2 id="Version-19-2-0-2012-12-30">Version 19.2.0 (2012-12-30)</h2><p>Minor:</p>
48
+ <ul>
49
+ <li>Add &quot;devise&quot; configuration helper that adds support for testing Rails
50
+ applications that use the Devise authentication framework. Thanks to Ryan
51
+ Ahearn for this contribution.</li>
52
+ </ul>
53
+ <p>Patch:</p>
54
+ <ul>
55
+ <li><p>gemspec: upgrade to <em>listen</em> 0.7.0 to fix issue #43. Thanks to Ryan
56
+ Ahearn for reporting this issue and helping debug it, and to Thibaud
57
+ Guillaume-Gentil for fixing this issue upstream in the <em>listen</em> library.</p></li>
58
+ <li><p>Fix <code>undefined method &#39;path&#39; for nil</code> error on socket file removal.</p></li>
59
+ </ul>
60
+ <h2 id="Version-19-1-0-2012-12-12">Version 19.1.0 (2012-12-12)</h2><p>Minor:</p>
61
+ <ul>
62
+ <li>tork-driver: don&#39;t run overhead files as test files</li>
63
+ </ul>
64
+ <p>Patch:</p>
65
+ <ul>
66
+ <li><p>rails: run dependent tests when <code>app/views/*</code> change</p></li>
67
+ <li><p>Clear FactoryGirl sequences and traits on fork in the <code>factory_girl</code>
68
+ configuration helper. Thanks to Ryan Ahearn for this contribution.</p></li>
69
+ <li><p>server: fix clean up of socket files upon exit</p></li>
70
+ </ul>
71
+ <h2 id="Version-19-0-2-2012-11-07">Version 19.0.2 (2012-11-07)</h2><p>Patch:</p>
72
+ <ul>
73
+ <li><p>Monkeypatch <code>at_exit()</code> to fix RSpec and MiniTest:</p><p><a href="https://github.com/rspec/rspec-core/pull/720">https://github.com/rspec/rspec-core/pull/720</a></p><p><a href="https://github.com/seattlerb/minitest/pull/183">https://github.com/seattlerb/minitest/pull/183</a></p></li>
74
+ </ul>
75
+ <p>Other:</p>
76
+ <ul>
77
+ <li><p>README: document RSpec 2.9.0+ autorun skipping bug</p></li>
78
+ <li><p>README: MiniTest 1.3.2+ also has autorun skip bug</p></li>
79
+ </ul>
80
+ <h2 id="Version-19-0-1-2012-10-26">Version 19.0.1 (2012-10-26)</h2><p>Patch:</p>
81
+ <ul>
82
+ <li><p>Support testing projects that have both test/ and spec/ directories.</p><p>I assumed that users would only have either test/ or spec/ but not both.
83
+ Do you know what happens when a test/ is run by RSpec or vice versa? :-)</p><p>Thanks to Kyle Peyton for reporting this issue.</p></li>
84
+ <li><p>Automatically load the &quot;autorun&quot; helpers for RSpec and MiniTest.</p><p>RSpec users are accustomed to not having <code>require &quot;rspec/autorun&quot;</code> in
85
+ their spec/spec_helper.rb file because they use the <a class="md2man-xref">rspec(1)</a> executable
86
+ to run their tests. This commit makes things Just Work for them again.</p></li>
87
+ </ul>
88
+ <p>Other:</p>
89
+ <ul>
90
+ <li><p>test whether input is JSON by actually parsing it</p></li>
91
+ <li><p>server: use Set instead of Array for faster lookup</p></li>
92
+ </ul>
93
+ <h2 id="Version-19-0-0-2012-10-17">Version 19.0.0 (2012-10-17)</h2><p>Major:</p>
94
+ <ul>
95
+ <li><p>The <code>.tork.rb</code> configuration file has been replaced by the <code>.tork/</code>
96
+ directory, which contains specially-named Ruby scripts. Refer to the
97
+ <code>TORK_CONFIGS</code> environment variable in <a class="md2man-xref" href="../man1/tork.1.html">tork(1)</a> for more information.</p></li>
98
+ <li><p>The <code>Tork::Config</code> object has been replaced by various data structures in
99
+ the <code>Tork::</code> namespace. See the &quot;FILES&quot; sections in the manual pages of
100
+ tork programs for information on the data structures that replaced it.</p></li>
101
+ <li><p><code>Tork::Config.test_event_hooks</code> has been removed. Instead, you must now
102
+ monitor the STDOUT of <a class="md2man-xref" href="../man1/tork-master.1.html">tork-master(1)</a> or <a class="md2man-xref" href="../man1/tork-engine.1.html">tork-engine(1)</a> either directly
103
+ or indirectly, via <a class="md2man-xref" href="../man1/tork-remote.1.html">tork-remote(1)</a>, and react to their status messages.
104
+ See the <a class="md2man-xref" href="../man1/tork-notify.1.html">tork-notify(1)</a> program for an example of how to implement this.</p></li>
105
+ <li><p><a class="md2man-xref" href="../man1/tork.1.html">tork(1)</a>: &#39;t&#39; now runs a specified test, whereas &#39;a&#39; runs all tests.</p></li>
106
+ <li><p><a class="md2man-xref" href="../man1/tork-engine.1.html">tork-engine(1)</a>: the <code>run_test_file</code> command now takes line numbers as a
107
+ variable-length list of arguments (varargs) rather than as an array.</p></li>
108
+ <li><p><a class="md2man-xref" href="../man1/tork-engine.1.html">tork-engine(1)</a>: the <code>run_test_file</code> command now runs an entire test file
109
+ when zero is given as one of the line numbers to be run.</p></li>
110
+ <li><p><a class="md2man-xref" href="../man1/tork-master.1.html">tork-master(1)</a>: the <code>load</code> command is no longer accepted. Instead, you
111
+ must specify load paths and overhead files in the <code>.tork/master.rb</code> file.</p></li>
112
+ <li><p>The <code>TORK_CONFIGS</code> env-var is now a colon delimited list of directories.</p></li>
113
+ <li><p>The <code>tork/client</code> library has been removed. The threaded IO and popen()
114
+ wrappers that it provided have been replaced by the powerful IO.select().</p></li>
115
+ </ul>
116
+ <p>Minor:</p>
117
+ <ul>
118
+ <li><p><a class="md2man-xref" href="../man1/tork.1.html">tork(1)</a>: allow user to specify arguments after command key</p></li>
119
+ <li><p><a class="md2man-xref" href="../man1/tork.1.html">tork(1)</a>: add &#39;k&#39; to stop all currently running tests with SIGKILL</p></li>
120
+ <li><p>add <a class="md2man-xref" href="../man1/tork-remote.1.html">tork-remote(1)</a> to remotely control any tork program. This feature is
121
+ made possible by the awesome power of IO.select() and UNIX domain sockets.</p></li>
122
+ <li><p>add <a class="md2man-xref" href="../man1/tork-notify.1.html">tork-notify(1)</a> as example of using <a class="md2man-xref" href="../man1/tork-remote.1.html">tork-remote(1)</a> and <a class="md2man-xref" href="../man1/tork-engine.1.html">tork-engine(1)</a></p></li>
123
+ <li><p><a class="md2man-xref" href="../man1/tork-engine.1.html">tork-engine(1)</a>: add <code>[&quot;run_test_files&quot;]</code> command to run multiple files</p></li>
124
+ <li><p><a class="md2man-xref" href="../man1/tork-engine.1.html">tork-engine(1)</a>: emit edge-triggered <code>pass_now_fail</code> and <code>fail_now_pass</code>
125
+ events to notify you about changes in a test file&#39;s pass/fail status.</p></li>
126
+ <li><p>typing Control-D now breaks tork programs out of <code>Tork::Server#loop()</code></p></li>
127
+ </ul>
128
+ <p>Patch:</p>
129
+ <ul>
130
+ <li><a class="md2man-xref" href="../man1/tork-master.1.html">tork-master(1)</a>: stop workers with SIGKILL when quitting</li>
131
+ </ul>
132
+ <p>Other:</p>
133
+ <ul>
134
+ <li><p><a class="md2man-xref" href="../man1/tork.1.html">tork(1)</a>: document parameters for <code>t</code> and <code>s</code> commands</p></li>
135
+ <li><p>README: add tip about rlwrap for better interactive</p></li>
136
+ <li><p>README: simplify watch command using pgrep &amp; xargs</p></li>
137
+ <li><p>README: use standard bundle exec; no <code>--binstubs</code></p></li>
138
+ </ul>
139
+ <h2 id="Version-18-2-4-2012-10-10">Version 18.2.4 (2012-10-10)</h2><p>Other:</p>
140
+ <ul>
141
+ <li>GH-39: upgrade listen gem version to fix a bug in OSX.
142
+ Thanks to Adam Grant for reporting this issue.</li>
143
+ </ul>
144
+ <h2 id="Version-18-2-3-2012-09-26">Version 18.2.3 (2012-09-26)</h2><p>Patch:</p>
145
+ <ul>
146
+ <li><p>Restored support for building Tork from its gemspec under Ruby 1.8.
147
+ Thanks to Ohno Shin&#39;ichi for reporting this issue and contributing a
148
+ preliminary fix.</p></li>
149
+ <li><p>Add resilience against failed command dispatch in <code>Tork::Server#loop()</code>.</p></li>
150
+ </ul>
151
+ <p>Other:</p>
152
+ <ul>
153
+ <li><p>It&#39;s not worth rescuing Interrupt only to exit silently.
154
+ Let the user see stack traces when they press Control-C.</p></li>
155
+ <li><p>Update old comments about SIGCHLD handler, which was
156
+ replaced by reaping threads quite a few releases ago.</p></li>
157
+ <li><p>Use $0 instead of hard-coding the program name.</p></li>
158
+ </ul>
159
+ <h2 id="Version-18-2-2-2012-07-11">Version 18.2.2 (2012-07-11)</h2><p>Patch:</p>
160
+ <ul>
161
+ <li><p>GH-35: resume dispatched but not yet started tests.</p><p>After reabsorbing overhead, we need to resume previously dispatched test
162
+ files that have not yet finished running. This includes the waiting set
163
+ (dispatched but not yet running) as well as the running set (dispatched
164
+ and already started running). Otherwise, we encounter a bug where test
165
+ files in the waiting set can NEVER be run again!</p></li>
166
+ </ul>
167
+ <h2 id="Version-18-2-1-2012-07-05">Version 18.2.1 (2012-07-05)</h2><p>Patch:</p>
168
+ <ul>
169
+ <li>GH-37: switch from Guard::Listener to Listen gem.
170
+ Thanks to Jesse Cooke for reporting this issue.</li>
171
+ </ul>
172
+ <p>Other:</p>
173
+ <ul>
174
+ <li><p>gemspec: need to provide .0 suffix for ~&gt; operator.</p></li>
175
+ <li><p>gemspec: LICENSE file contains UTF-8 author names.</p></li>
176
+ </ul>
177
+ <h2 id="Version-18-2-0-2012-03-27">Version 18.2.0 (2012-03-27)</h2><p>Minor:</p>
178
+ <ul>
179
+ <li>Emit warnings when commands cannot be performed. This improves the user
180
+ experience by giving them immediate feedback. For example, if you issue
181
+ the &quot;rerun<em>failed</em>tests&quot; command and no tests have failed yet, you will
182
+ now see a warning message that explains the situation. Thanks to
183
+ NagaChaitanya Vellanki (@chaitanyav) for suggesting this change.</li>
184
+ </ul>
185
+ <p>Patch:</p>
186
+ <ul>
187
+ <li><p>GH-32: Restore support for Selenium and Capybara by replacing the global
188
+ SIGCHLD handler in <a class="md2man-xref" href="../man1/tork-master.1.html">tork-master(1)</a> with individual threads, one per forked
189
+ worker process. Thanks to Bjørn Trondsen (@Sharagoz) for reporting this
190
+ issue and verifying the fix.</p></li>
191
+ <li><p>README: Recommend a newer fork of the &quot;memory<em>test</em>fix&quot; Rails plugin.</p></li>
192
+ </ul>
193
+ <h2 id="Version-18-1-0-2012-02-26">Version 18.1.0 (2012-02-26)</h2><p>Minor:</p>
194
+ <ul>
195
+ <li><p>Add <code>tork/config/coverage</code> configuration helper for Ruby 1.9, which prints
196
+ a coverage report at the end of your log file in YAML format. The report
197
+ is a hash containing the following information per each loaded Ruby file
198
+ that exist in or beneath the current working directory:</p>
199
+ <ul>
200
+ <li>:grade - percentage of C0 code coverage for source lines of code</li>
201
+ <li>:nsloc - total number of source lines of code in the file</li>
202
+ <li>:holes - line numbers of source lines that were not covered</li>
203
+ </ul></li>
204
+ </ul>
205
+ <h2 id="Version-18-0-1-2012-02-13">Version 18.0.1 (2012-02-13)</h2><p>Alert:</p>
206
+ <ul>
207
+ <li>If you&#39;re on Ruby 1.9, please use 1.9.3 or newer because 1.9.2 is
208
+ known to segfault under RSpec and Rails. See GH-30 and GH-32.</li>
209
+ </ul>
210
+ <p>Patch:</p>
211
+ <ul>
212
+ <li><p>GH-27: Cucumber features now run correctly under RSpec. Thanks to Scott
213
+ Radcliff for reporting this issue and to David Burrows for solving it!</p></li>
214
+ <li><p><a class="md2man-xref" href="../man1/tork.1.html">tork(1)</a>: fix undefined method `strip&#39; for nil:NilClass error.</p></li>
215
+ <li><p>tork/config: ignore directories given as configuration files.</p></li>
216
+ </ul>
217
+ <h2 id="Version-18-0-0-2012-02-06">Version 18.0.0 (2012-02-06)</h2><p>Alert:</p>
218
+ <ul>
219
+ <li>RSpec 2.8.0 and older contain <a href="https://github.com/sunaku/tork/issues/31">a bug</a> where a nonzero
220
+ exit status (caused by an uncaught exception) is overridden
221
+ by RSpec&#39;s <code>Kernel#at_exit</code> handler to be zero, thereby
222
+ falsely indicating that a spec had passed. <a href="https://github.com/rspec/rspec-core/pull/569/files">This patch</a> fixes the
223
+ problem. Thanks to Gumaro Melendez for reporting this issue.</li>
224
+ </ul>
225
+ <p>Major:</p>
226
+ <ul>
227
+ <li><p>Dropped first parameter to <code>Tork::Config::test_file_globbers</code>.</p></li>
228
+ <li><p>GH-31: tork-master now emits separate exit code and info.
229
+ Update your <code>Tork::Config::test_event_hooks</code> accordingly.</p></li>
230
+ <li><p>tork/server: switch from modules to class inheritance.</p></li>
231
+ <li><p>tork/config: switch to Struct to prevent misspellings.</p></li>
232
+ </ul>
233
+ <p>Minor:</p>
234
+ <ul>
235
+ <li><p>tork-driver now recursively expands dependent test files while globbing.</p></li>
236
+ <li><p>Extracted bookkeeping stuff from tork-driver into tork-engine component.</p></li>
237
+ </ul>
238
+ <p>Other:</p>
239
+ <ul>
240
+ <li><p>tork/config: do not reabsorb when .tork.rb
241
+ changes. Since the configuration is loaded in
242
+ multiple processes, it is difficult to reload
243
+ the configuration on the fly without adding
244
+ significant complexity to Tork. Instead, it&#39;s
245
+ easier to accept the limitation that you must
246
+ restart Tork if you change your configuration.</p></li>
247
+ <li><p>GH-29: bump guard version requirement to v1 series.</p></li>
248
+ <li><p>Improve documentation; revise markdown; clean up.</p></li>
249
+ </ul>
250
+ <h2 id="Version-17-1-0-2012-01-30">Version 17.1.0 (2012-01-30)</h2><p>Minor:</p>
251
+ <ul>
252
+ <li><p>Added <code>Tork::Config.test_event_hooks</code> configuration option.</p></li>
253
+ <li><p>Added <code>tork/config/notify</code> configuration helper for receiving
254
+ edge-triggered notifications (via libnotify, growl, or
255
+ xmessage) about changes in test files&#39; pass/fail status.</p></li>
256
+ <li><p>Added <code>tork/config/factory_girl</code> configuration helper for properly
257
+ clearing factory definitions before forking and then finding them after
258
+ forking to avoid <code>FactoryGirl::DuplicateDefinitionError</code>. (Mark Hayes)</p></li>
259
+ <li><p>Lambda functions in <code>Tork::Config.test_file_globbers</code> can now return
260
+ multiple globs in an array, in addition to just a single glob or <code>nil</code>.</p></li>
261
+ <li><p>Added support for the MiniTest convention of naming test files as
262
+ <code>test/**/test_*.rb</code> and <code>spec/**/spec_*.rb</code>. (Jose Pablo Barrantes)</p></li>
263
+ </ul>
264
+ <h2 id="Version-17-0-1-2012-01-29">Version 17.0.1 (2012-01-29)</h2><p>Patch:</p>
265
+ <ul>
266
+ <li><p><a class="md2man-xref" href="../man1/tork-herald.1.html">tork-herald(1)</a> <em>sometimes</em> reported changed test files twice.</p></li>
267
+ <li><p>tork/driver: only whole test file runs should qualify as pass.</p></li>
268
+ <li><p>tork/config/cucumber: only set ARGV for <code>*.feature</code> test files.</p></li>
269
+ <li><p>Tork::Client::Transceiver needs to stop both TX &amp; RX loops.</p></li>
270
+ </ul>
271
+ <p>Other:</p>
272
+ <ul>
273
+ <li><p>tork/driver: store test file lists in Set, not Array.</p></li>
274
+ <li><p>HISTORY: use single-word change-set descriptions.</p></li>
275
+ </ul>
276
+ <h2 id="Version-17-0-0-2012-01-27">Version 17.0.0 (2012-01-27)</h2><p>Major:</p>
277
+ <ul>
278
+ <li><p><a class="md2man-xref" href="../man1/tork-herald.1.html">tork-herald(1)</a> now emits batches of single-line JSON arrays instead of
279
+ printing one (raw) path per line. This makes IPC uniform across Tork.</p></li>
280
+ <li><p><a class="md2man-xref" href="../man1/tork-master.1.html">tork-master(1)</a> now emits log<em>file and worker</em>number in status messages.</p></li>
281
+ <li><p>The order of parameters for before/after fork hooks has been changed to
282
+ better reflect the order of items in <a class="md2man-xref" href="../man1/tork-master.1.html">tork-master(1)</a>&#39;s status messages.</p>
283
+ <ul>
284
+ <li>The old order was: worker<em>number, log</em>file, test<em>file, line</em>numbers.</li>
285
+ <li>The new order is: test<em>file, line</em>numbers, log<em>file, worker</em>number.</li>
286
+ </ul></li>
287
+ </ul>
288
+ <p>Minor:</p>
289
+ <ul>
290
+ <li><p>GH-24: add <code>tork/config/dotlog</code> configuration helper to &quot;hide&quot; log files.
291
+ (Nicolas Fouché)</p></li>
292
+ <li><p>GH-25: add <code>tork/config/logdir</code> configuration helper to isolate log files.
293
+ (Jose Pablo Barrantes)</p></li>
294
+ <li><p><a class="md2man-xref" href="../man1/tork.1.html">tork(1)</a> now strips all whitespace from your input, in case you pressed
295
+ spacebar or tab a few times, by accident, before entering your command.</p></li>
296
+ </ul>
297
+ <p>Other:</p>
298
+ <ul>
299
+ <li><p>tork/client: Replace write lock with queue to support SIGCHLD handler.</p><p>The SIGCHLD handler in <a class="md2man-xref" href="../man1/tork-master.1.html">tork-master(1)</a> can be triggered at any time, even
300
+ in the middle of writing to the standard output stream! Locking access
301
+ to the output stream in normal code (outside the signal handler) would
302
+ freeze the program because the signal handler, waiting for the lock to
303
+ be released, would never return!</p><p>One solution is to maintain a thread-safe queue of outgoing items that
304
+ need to be written to the output stream. Both normal code and the
305
+ signal handler can quickly push an outgoing item onto the queue and
306
+ proceed with their business. A separate thread can then have the sole
307
+ responsibility of (and access to) continually writing those outgoing
308
+ items to the output stream.</p></li>
309
+ <li><p>README: revise instructions, reorganize document, and other improvements.</p></li>
310
+ </ul>
311
+ <h2 id="Version-16-0-0-2012-01-25">Version 16.0.0 (2012-01-25)</h2><p>Major:</p>
312
+ <ul>
313
+ <li><p>Drop the <code>Tork::Config.test_name_extractor</code> configuration option.</p></li>
314
+ <li><p>Pass line numbers instead of test names to before/after fork hooks.</p></li>
315
+ <li><p>Pass $~ (MatchData) to <code>Tork::Config::test_file_globbers</code> functions.</p></li>
316
+ </ul>
317
+ <p>Minor:</p>
318
+ <ul>
319
+ <li>tork/config/cucumber: only run changed scenarios in changed features.</li>
320
+ </ul>
321
+ <p>Other:</p>
322
+ <ul>
323
+ <li>README: update instructions on running Tork directly from Git clone.</li>
324
+ </ul>
325
+ <h2 id="Version-15-1-0-2012-01-25">Version 15.1.0 (2012-01-25)</h2><p>Minor:</p>
326
+ <ul>
327
+ <li>GH-19: add <code>tork cucumber</code> for running cucumber features.</li>
328
+ </ul>
329
+ <p>Patch:</p>
330
+ <ul>
331
+ <li><p>tork/config/rails: support Rails 2 and don&#39;t assume AR is used. (Benjamin
332
+ Quorning)</p></li>
333
+ <li><p>tork/config: settings from configuration helpers specified in
334
+ $TORK_CONFIGS should override settings from the <code>.tork.rb</code> file.</p></li>
335
+ <li><p>README: need to set $PATH to run this project from a git clone.</p></li>
336
+ <li><p>LICENSE: give copyright to major contributors only.
337
+ See <a href="http://stackoverflow.com/questions/1497756">http://stackoverflow.com/questions/1497756</a>.
338
+ Also added forgotten Luke Wendling to the list.</p></li>
339
+ </ul>
340
+ <h2 id="Version-15-0-1-2012-01-24">Version 15.0.1 (2012-01-24)</h2><p>Patch:</p>
341
+ <ul>
342
+ <li><p>GH-21: Ruby 1.9 class_eval() is smarter than 1.8.</p></li>
343
+ <li><p>GH-20: forgot <code>require &#39;thread&#39;</code> for Mutex class. (Jesse Cooke)</p></li>
344
+ </ul>
345
+ <p>Other:</p>
346
+ <ul>
347
+ <li><p><a class="md2man-xref" href="../man1/tork.1.html">tork(1)</a>: fix shadowed variable names. (Jose Pablo Barrantes)</p></li>
348
+ <li><p>GH-22: fix command to build &amp; install gem from source.</p></li>
349
+ <li><p>GH-22: add m2dman as development dependency in gemspec.</p></li>
350
+ <li><p>GH-18: windows not supported; lacks fork &amp; SIGCHLD.</p></li>
351
+ <li><p>README: spruce up introduction and features list.</p></li>
352
+ <li><p>README: missed a testr =&gt; tork rename in watch cmd.</p></li>
353
+ <li><p>README: add tip about Guard&#39;s FS watching backends.</p></li>
354
+ </ul>
355
+ <h2 id="Version-15-0-0-2012-01-23">Version 15.0.0 (2012-01-23)</h2><p>Major:</p>
356
+ <ul>
357
+ <li><p>This project has been renamed from TestR to Tork (test with fork) in order
358
+ to better compete with rival projects, namely Spork! &gt;:-) Credit goes to
359
+ Brian D. Burns for thinking of this most succinct &amp; awesome project name!
360
+ He also created the snazzy ASCII-art logo featured in the project README.</p></li>
361
+ <li><p><a class="md2man-xref" href="../man1/tork.1.html">tork(1)</a>: rename <code>r</code> command, which runs all tests, to <code>t</code>, for <em>t</em>ork.</p></li>
362
+ </ul>
363
+ <h2 id="Version-14-3-0-2012-01-20">Version 14.3.0 (2012-01-20)</h2><p>Minor:</p>
364
+ <ul>
365
+ <li><p><a class="md2man-xref">testr(1)</a>: notify user while dispatching their commands. This is especially
366
+ useful when the &quot;rerun<em>passed</em>test_files&quot; command has been dispatched but
367
+ there are no passed test files, so nothing happens and from the user&#39;s
368
+ perspective: TestR sucks because it&#39;s unresponsive.</p></li>
369
+ <li><p>config/testr/rails: Reopen connections in forked workers to fix errors:</p>
370
+ <pre><code>Mysql2::Error: MySQL server has gone away
371
+ PGError: connection not open
372
+ </code></pre>
373
+ <p>Thanks to Spencer Steffen for <a href="https://github.com/sunaku/tork/issues/14#issuecomment-3539470">contributing this solution</a>.</p></li>
374
+ <li><p><a class="md2man-xref">testr-driver(1)</a>: document the &quot;over&quot; status message in manual page.</p></li>
375
+ </ul>
376
+ <p>Other:</p>
377
+ <ul>
378
+ <li><p><a class="md2man-xref">testr-driver(1)</a>: keep same herald; only replace master.</p></li>
379
+ <li><p><a class="md2man-xref">testr(1)</a>: shorten code for loop break on quit command.</p></li>
380
+ <li><p>server: rename <code>@upstream</code> to <code>@client</code> for coherence.</p></li>
381
+ <li><p>Can pass lambda and proc with block to <code>&lt;&lt;</code> method.</p></li>
382
+ <li><p>Explain <code>$0</code> override at the start of bin/ scripts.</p></li>
383
+ <li><p>LICENSE: credit our most recent contributors.</p></li>
384
+ </ul>
385
+ <h2 id="Version-14-2-0-2012-01-16">Version 14.2.0 (2012-01-16)</h2><p>Minor:</p>
386
+ <ul>
387
+ <li><p>Add ability to run <code>testr rails</code> without needing a <code>.testr.rb</code> file.</p></li>
388
+ <li><p><a class="md2man-xref">testr(1)</a> no longer shows command menu at startup. Press ENTER to see it.</p></li>
389
+ <li><p><a class="md2man-xref">testr(1)</a> now notifies you before absorbing overhead at startup.</p></li>
390
+ </ul>
391
+ <p>Patch:</p>
392
+ <ul>
393
+ <li><a class="md2man-xref">testr(1)</a> now accepts death silently when Control-C is pressed.</li>
394
+ </ul>
395
+ <h2 id="Version-14-1-3-2012-01-13">Version 14.1.3 (2012-01-13)</h2><p>Patch:</p>
396
+ <ul>
397
+ <li>Add support Guard v0.9.0 and newer in <code>testr-herald</code>. (Jose Pablo
398
+ Barrantes)</li>
399
+ </ul>
400
+ <p>Other:</p>
401
+ <ul>
402
+ <li>Tighten version constraints for gem dependencies to avoid future
403
+ breakages.</li>
404
+ </ul>
405
+ <h2 id="Version-14-1-2-2012-01-09">Version 14.1.2 (2012-01-09)</h2><p>Minor:</p>
406
+ <ul>
407
+ <li>Don&#39;t consider partial test file pass as full pass.</li>
408
+ </ul>
409
+ <p>Other:</p>
410
+ <ul>
411
+ <li>Upgrade to binman 3 for better bundler support.</li>
412
+ </ul>
413
+ <h2 id="Version-14-1-1-2011-12-07">Version 14.1.1 (2011-12-07)</h2><p>Patch:</p>
414
+ <ul>
415
+ <li><p>Do not fail when given test file no longer exists.</p></li>
416
+ <li><p>Make xUnit <code>--name</code> option regexp case-insensitive.</p></li>
417
+ <li><p>RSpec does not accept regexp for <code>--example</code> option;
418
+ see <a href="https://github.com/rspec/rspec-core/issues/445">https://github.com/rspec/rspec-core/issues/445</a>
419
+ and <a href="https://github.com/dchelimsky/rspec/issues/44">https://github.com/dchelimsky/rspec/issues/44</a></p></li>
420
+ <li><p>Ruby 187 does not have Symbol#upcase() method.</p></li>
421
+ </ul>
422
+ <p>Other:</p>
423
+ <ul>
424
+ <li><p>README: add another SQLite3 error to known issues.
425
+ Thanks to Luke Wendling for contributing this patch.</p></li>
426
+ <li><p>README: add a section explaining usage and theory.</p></li>
427
+ <li><p>README: show example earlier in factory_girl tip.</p></li>
428
+ <li><p>README: update lines of code statistic: 372 SLOC.</p></li>
429
+ <li><p>Better variable naming for self-documentation.</p></li>
430
+ <li><p>Upgrade to binman 2.0.0 for UNIX man pages.</p></li>
431
+ </ul>
432
+ <h2 id="Version-14-1-0-2011-11-03">Version 14.1.0 (2011-11-03)</h2><p>Minor:</p>
433
+ <ul>
434
+ <li><p>Make servers responsive to quit request (SIGTERM) from upstream.</p><p>This change lets the user quit <a class="md2man-xref">testr-master(1)</a> while it is loading
435
+ test execution overhead (which can be a lengthy, blocking operation).</p><p>By sending a signal to the server, we don&#39;t have to wait for it to
436
+ finish processing its current command before seeing our :quit command.</p></li>
437
+ <li><p>Add embedded BinMan manual pages to bin scripts. All TestR scripts now
438
+ have a <code>--help</code> option which displays their UNIX manual page. Try it!</p><p>The single-line JSON message protocol used by these scripts is now
439
+ documented in their manual pages, so you should have everything you
440
+ need to create <em>your own custom user interface to TestR</em> if you wish! :-)</p></li>
441
+ </ul>
442
+ <p>Patch:</p>
443
+ <ul>
444
+ <li>SIGCHLD does not awaken main thread in Ruby 1.9.3p0.</li>
445
+ </ul>
446
+ <p>Other:</p>
447
+ <ul>
448
+ <li><p>Simplify <a class="md2man-xref">watch(1)</a> <a class="md2man-xref">ps(1)</a> process title monitoring.</p></li>
449
+ <li><p>Testr: tell user to press ENTER after command key.</p></li>
450
+ <li><p>README: add tip on loading factory_girl factories.</p></li>
451
+ </ul>
452
+ <h2 id="Version-14-0-3-2011-10-11">Version 14.0.3 (2011-10-11)</h2><p>Patch:</p>
453
+ <ul>
454
+ <li>Forgot to migrate the <code>testr/config/rails</code> configuration helper to use the
455
+ new TestR configuration parameter names.</li>
456
+ </ul>
457
+ <h2 id="Version-14-0-2-2011-10-11">Version 14.0.2 (2011-10-11)</h2><p>Patch:</p>
458
+ <ul>
459
+ <li><p>Fix updating passed/failed test files bookkeeping. Once a test file
460
+ failed, it was (incorrectly) always considered failed, even if it passed
461
+ later on.</p></li>
462
+ <li><p>Do not requeue test files that are waiting to run.</p></li>
463
+ </ul>
464
+ <p>Other:</p>
465
+ <ul>
466
+ <li>Rename <code>*.md</code> files to <code>*.markdown</code> to avoid ambiguity.</li>
467
+ </ul>
468
+ <h2 id="Version-14-0-1-2011-10-10">Version 14.0.1 (2011-10-10)</h2><p>Patch:</p>
469
+ <ul>
470
+ <li><p>Use blue/red for pass/fail instead of green/red to accommodate the color
471
+ blind.</p></li>
472
+ <li><p>Incorrect test name regexp was passed down to Test::Unit. This broke
473
+ focused testing, where only changed tests in a changed test file are run.</p></li>
474
+ </ul>
475
+ <p>Other:</p>
476
+ <ul>
477
+ <li>Make <code>testr-master</code> wait for killed worker processes before exiting.</li>
478
+ </ul>
479
+ <h2 id="Version-14-0-0-2011-10-09">Version 14.0.0 (2011-10-09)</h2><p>Major:</p>
480
+ <ul>
481
+ <li><p>Renamed this project and its resources from test-loop to TestR.</p></li>
482
+ <li><p>Renamed the <code>reabsorb_file_globs</code> configuration parameter to
483
+ <code>reabsorb_file_greps</code>. It now contains regular expressions.</p></li>
484
+ <li><p>Renamed the <code>test_file_matchers</code> configuration parameter to
485
+ <code>test_file_globbers</code>. Its keys are now regular expressions.</p></li>
486
+ <li><p>Renamed the <code>test_name_parser</code> configuration parameter to
487
+ <code>test_name_extractor</code>.</p></li>
488
+ <li><p>Renamed the <code>max_concurrent_tests</code> configuration parameter to
489
+ <code>max_forked_workers</code>.</p></li>
490
+ <li><p>Renamed the <code>before_each_test</code> configuration parameter to
491
+ <code>after_fork_hooks</code>. Its function parameters have also changed.</p></li>
492
+ <li><p>Removed the <code>delay_per_iteration</code> and <code>after_each_test</code> configuration
493
+ parameters.</p></li>
494
+ <li><p>Removed the <code>test/loop/notify</code> and <code>test-loop/coco</code> libraries.</p></li>
495
+ </ul>
496
+ <p>Minor:</p>
497
+ <ul>
498
+ <li><p>The file system is no longer polled to detect modified files. Instead, it
499
+ is monitored for file modification events in a portable and efficient
500
+ manner using the <a href="https://github.com/guard/guard">Guard</a> library.</p></li>
501
+ <li><p>The number of processors on your system is automatically detected for the
502
+ <code>max_forked_workers</code> configuration parameter.</p></li>
503
+ <li><p>Added <code>overhead_load_paths</code>, <code>all_test_file_globs</code>, and
504
+ <code>before_fork_hooks</code> configuration parameters.</p></li>
505
+ <li><p>Added ability to re-run passed and failed tests in the <code>testr</code> script.</p></li>
506
+ </ul>
507
+ <p>Other:</p>
508
+ <ul>
509
+ <li><p>The monolithic <code>test-loop</code> script has been replaced by several smaller
510
+ ones that communicate with each other using single-line JSON messages via
511
+ their standard input &amp; output streams. See &quot;Architecture&quot; in the README.</p></li>
512
+ <li><p>Now using Bundler to manage development dependencies and gem packaging.</p></li>
513
+ </ul>
514
+ <h2 id="Version-13-0-1-2011-09-21">Version 13.0.1 (2011-09-21)</h2><p>Other:</p>
515
+ <ul>
516
+ <li><p>Forgot to include <code>test/loop/coco</code> preset in gem package.</p></li>
517
+ <li><p>Forgot to mention <code>test/loop/parallel_tests</code> preset in README.</p></li>
518
+ </ul>
519
+ <h2 id="Version-13-0-0-2011-08-24">Version 13.0.0 (2011-08-24)</h2><p>Major:</p>
520
+ <ul>
521
+ <li>Pass worker sequence number as the last argument to lambda functions in
522
+ <code>Test::Loop.before_each_test</code> and <code>Test::Loop.after_each_test</code> arrays.</li>
523
+ </ul>
524
+ <p>Minor:</p>
525
+ <ul>
526
+ <li><p>In the <code>test/loop/rails</code> configuration preset:</p>
527
+ <ul>
528
+ <li>Automatically test a controller when its model or factory is modified.</li>
529
+ <li>Warn the user if Railtie (Rails 3) is not available for automatic
530
+ disabling of Rails&#39; class caching mechanism under the test environment.</li>
531
+ </ul></li>
532
+ <li><p>Add <code>test/loop/parallel_tests</code> configuration preset for parallel_tests
533
+ gem. (Corné Verbruggen)</p></li>
534
+ <li><p>Assign rotating sequence numbers to workers so that you can handle parallel
535
+ processes like connecting to separate databases better. (Corné
536
+ Verbruggen)</p></li>
537
+ </ul>
538
+ <p>Other:</p>
539
+ <ul>
540
+ <li><p>README: move configuration presets above options.</p></li>
541
+ <li><p>Eliminate 1 SLOC: .rb extension used in file glob.</p></li>
542
+ <li><p>Turn off executable bit on loop.rb file mode.</p></li>
543
+ <li><p>Pass child ENV directly to exec() for atomicity.</p></li>
544
+ </ul>
545
+ <h2 id="Version-12-3-1-2011-07-19">Version 12.3.1 (2011-07-19)</h2><p>Patch:</p>
546
+ <ul>
547
+ <li>Binary data could not be stored in environment variable values.</li>
548
+ </ul>
549
+ <p>Other:</p>
550
+ <ul>
551
+ <li>Forgot to add Jacob Helwig to the gemspec&#39;s authors list.</li>
552
+ </ul>
553
+ <h2 id="Version-12-3-0-2011-07-19">Version 12.3.0 (2011-07-19)</h2><p>Minor:</p>
554
+ <ul>
555
+ <li><p>Add <code>Test::Loop::max_concurrent_tests</code> configuration parameter to limit
556
+ the number of test files run concurrently (default 4). Otherwise, with
557
+ large test suites, we could end up swamping the machine running the tests
558
+ by forking hundreds of test files at once. (Jacob Helwig)</p></li>
559
+ <li><p>Rails: add matcher for <code>test/factories/*_factory.rb</code>.</p></li>
560
+ </ul>
561
+ <p>Other:</p>
562
+ <ul>
563
+ <li><p>ENV returns a Hash with duplicate/frozen keys/values. (Brian D. Burns)</p></li>
564
+ <li><p>Use Marshal to propagate resume_files to reabsorb.</p></li>
565
+ <li><p>Store test_files in a Set instead of an Array.</p></li>
566
+ </ul>
567
+ <h2 id="Version-12-2-0-2011-06-01">Version 12.2.0 (2011-06-01)</h2>
568
+ <ul>
569
+ <li><p>Prevent empty test suite run in master process. (Brian D. Burns)</p></li>
570
+ <li><p>Report test execution statistics in <code>test/loop/notify</code> preset as
571
+ requested by Juan G. Hurtado..</p></li>
572
+ <li><p>Add <code>test/loop/coco</code> preset for integrating the <a href="http://lkdjiin.github.com/coco/">Coco code coverage
573
+ library</a>.</p></li>
574
+ </ul>
575
+ <h2 id="Version-12-1-0-2011-04-29">Version 12.1.0 (2011-04-29)</h2><p>Minor:</p>
576
+ <ul>
577
+ <li>Add <code>Test::Loop.delay_per_iteration</code> parameter to control the number of
578
+ seconds (or fractions thereof) to sleep in between test-loop iterations.</li>
579
+ </ul>
580
+ <h2 id="Version-12-0-4-2011-04-29">Version 12.0.4 (2011-04-29)</h2><p>Patch:</p>
581
+ <ul>
582
+ <li><p>Reabsorb overhead when user&#39;s configuration file changes. (Brian D. Burns
583
+ and Daniel Pittman)</p></li>
584
+ <li><p><code>Thread.new { system() }</code> really is backgrounded so <code>fork { system() }</code> is
585
+ not necessary! <a href="https://github.com/sunaku/test-loop/issues/5">This issue</a>
586
+ was solved by upgrading to the newer 2.6.38.4-1 Linux kernel on my system.</p></li>
587
+ </ul>
588
+ <h2 id="Version-12-0-3-2011-04-25">Version 12.0.3 (2011-04-25)</h2><p>Patch:</p>
589
+ <ul>
590
+ <li><p>Fix SIGCHLD handling and test completion reporting (Daniel Pittman).</p><p>We need to reap all ready children in SIGCHLD, not just the first, and
591
+ should not be reporting completion in the signal handler.</p><p>On a fast machine, or where there is a slow hook executed at the
592
+ completion of a test run, more than one test child can terminate before
593
+ the SIGCHLD handler is invoked, or while it is running.</p><p>In that event we will only get another SIGCHLD when a new child
594
+ terminates, not to signal that there was more than one current
595
+ termination. We need to loop to collect all terminated children during
596
+ each invocation of the handler.</p><p>Since we don&#39;t know which child terminated, we wait on any terminated
597
+ child with NOHANG, until it informs us that there are no more zombies
598
+ hanging about.</p><p>Doing all the work of finishing the test case, cleaning up, and running
599
+ user hooks inside the SIGCHLD handler block was pretty slow. This could
600
+ lead to a big pile-up of children that needed to be cleaned up, especially
601
+ if the user hook did something like run another external process to signal
602
+ completion.</p><p>Moving the heavy work of completion outside the signal handler makes the
603
+ whole thing a lot faster, and less likely to bump into the low limit for
604
+ per-user processes on Mac OS-X.</p></li>
605
+ <li><p>Send SIGTERM to each worker PGID to kill workers (Brian D. Burns).</p><p>Using Process.setsid() in the workers establishes each process &quot;as a new
606
+ session and process group leader&quot;. So, the SIGTERM sent to the master&#39;s
607
+ process group was not recieved by the workers. kill_workers was simply
608
+ waiting for the workers to finish.</p></li>
609
+ <li><p>Revert &quot;skip at_exit() handlers defined in master process&quot;.</p><p>This reverts commit 0a0837f0b7ec92810e1c81d7506f2c8309f25f62 which was
610
+ originally written to skip the reporting of an empty test suite (master
611
+ does not load test files, workers do) by Test::Unit and Minitest in the
612
+ master process.</p><p>Such a harmless annoyance should not warrant the crippling of at_exit in
613
+ the master process because that would inhibit its valid uses as well:</p>
614
+ <blockquote>
615
+ <p>&quot;UNIX was not designed to stop you from doing stupid things, because
616
+ that would also stop you from doing clever things.&quot; ~Doug Gwyn</p></blockquote></li>
617
+ <li><p><code>Thread.new { system() }</code> is not really backgrounded so <code>fork()</code> instead!
618
+ Many thanks to Brian D. Burns and Daniel Pittman for helping solve <a href="https://github.com/sunaku/test-loop/issues/5">this
619
+ issue</a>.</p></li>
620
+ </ul>
621
+ <h2 id="Version-12-0-2-2011-04-21">Version 12.0.2 (2011-04-21)</h2><p>Patch:</p>
622
+ <ul>
623
+ <li><p>Consider DB schema dump file as overhead in Rails.</p></li>
624
+ <li><p>Do not consider test factories as overhead in Rails.</p></li>
625
+ <li><p>Run test files when test factory files change in Rails.</p></li>
626
+ </ul>
627
+ <p>Other:</p>
628
+ <ul>
629
+ <li><p>Detach worker from master&#39;s terminal device sooner.</p></li>
630
+ <li><p>All required signals must be present in irb check.</p></li>
631
+ <li><p>Prevent <a class="md2man-xref">ps(1)</a> from truncating lines to $TERM width.</p></li>
632
+ <li><p>Retain <a class="md2man-xref">ps(1)</a> column header in watch command output.</p></li>
633
+ <li><p>Begin parameter descriptions with the noun itself.</p></li>
634
+ </ul>
635
+ <h2 id="Version-12-0-1-2011-04-20">Version 12.0.1 (2011-04-20)</h2><p>Patch:</p>
636
+ <ul>
637
+ <li><p>Restore support for Ruby 1.8.7.</p></li>
638
+ <li><p>Allow user&#39;s test execution overhead to fork.</p></li>
639
+ </ul>
640
+ <p>Other:</p>
641
+ <ul>
642
+ <li><p>Freeze master&#39;s ENV properly; keep resume key.</p></li>
643
+ <li><p>Remove completed test from running list sooner.</p></li>
644
+ <li><p>Add instructions to check for POSIX prerequisites.</p></li>
645
+ <li><p>Support multiple test-loop instances in watch command.</p></li>
646
+ </ul>
647
+ <h2 id="Version-12-0-0-2011-04-19">Version 12.0.0 (2011-04-19)</h2><p>Major:</p>
648
+ <ul>
649
+ <li><p>You must now explicitly <code>require &#39;test/loop/rails&#39;</code> for Rails support
650
+ because we can only <em>automatically</em> apply our Railtie (to disable class
651
+ caching) after the overhead has been loaded, and by then it&#39;s too late:
652
+ your models are already loaded &amp; cached by the Rails environment.</p></li>
653
+ <li><p>Your tests can no longer read from the user&#39;s terminal (master&#39;s STDIN);
654
+ instead they will read from an empty stream (the reading end of IO.popen).</p></li>
655
+ </ul>
656
+ <p>Patch:</p>
657
+ <ul>
658
+ <li><p>Replace threads with SIGCHLD for reporting test results.</p><p>This fixes deadlock errors that sometimes occurred when the user&#39;s chosen
659
+ test library tried to print something to STDOUT/STDERR (even though those
660
+ streams were redirected to a log file in the worker process).</p><p>Thanks to Brian D. Burns for suggesting and verifying that the use of
661
+ threads to monitor workers was the culprit behind the deadlocks errors.</p></li>
662
+ <li><p>Ctrl-C did not raise Interrupt in my Rails 3 test suite.</p></li>
663
+ </ul>
664
+ <p>Other:</p>
665
+ <ul>
666
+ <li><p>Ensure a clean ENV when reabsorbing overhead. Environment variables set
667
+ by your test execution overhead are not propagated to subsequent
668
+ reabsorptions. (Brian D. Burns)</p></li>
669
+ <li><p>Call <code>setsid()</code> to detach worker from master&#39;s terminal.
670
+ <a href="http://stackoverflow.com/questions/1740308#1740314">http://stackoverflow.com/questions/1740308#1740314</a></p></li>
671
+ <li><p>Mutex is not needed since we only use GIL&#39;ed array methods.
672
+ <a href="http://www.ruby-forum.com/topic/174086#762788">http://www.ruby-forum.com/topic/174086#762788</a></p></li>
673
+ <li><p>Remove redundant STDOUT coercion after loading user&#39;s testing library.</p></li>
674
+ <li><p>Further simplify <code>Test::Loop.run()</code> by higher-order programming.</p></li>
675
+ <li><p>Add LICENSE file to gem package.</p></li>
676
+ <li><p>Add prerequisites section about POSIX environment.</p></li>
677
+ <li><p>Add tip about annihilating test-loop processes.</p></li>
678
+ <li><p>Fix markdown formatting.</p></li>
679
+ </ul>
680
+ <h2 id="Version-11-0-1-2011-04-14">Version 11.0.1 (2011-04-14)</h2><p>Patch:</p>
681
+ <ul>
682
+ <li>Only attempt to define Railtie if the current Rails version supports it.</li>
683
+ </ul>
684
+ <h2 id="Version-11-0-0-2011-04-14">Version 11.0.0 (2011-04-14)</h2><p>Major:</p>
685
+ <ul>
686
+ <li>The <code>test/loop/rails</code> preset has been internalized and is now applied
687
+ automatically if your test execution overhead includes Ruby on Rails.</li>
688
+ </ul>
689
+ <p>Minor:</p>
690
+ <ul>
691
+ <li>If you are using Rails 3, test-loop will automatically set
692
+ <code>config.cache_classes = false</code> for your test environment. (Brian D.
693
+ Burns)</li>
694
+ </ul>
695
+ <p>Patch:</p>
696
+ <ul>
697
+ <li><p>Avoid deadlock errors when printing output from Test::Unit and MiniTest.
698
+ (Brian D. Burns)</p>
699
+ <pre><code>`write&#39;: deadlock detected (fatal)
700
+ </code></pre></li>
701
+ <li><p>Signaled worker termination is neither pass nor fail.
702
+ Do not treat it as a failure by printing the log file.</p></li>
703
+ <li><p>Ignore SIGINT in workers; only master must honor it.</p></li>
704
+ </ul>
705
+ <h2 id="Version-10-0-1-2011-04-08">Version 10.0.1 (2011-04-08)</h2><p>Patch:</p>
706
+ <ul>
707
+ <li><p>Workers must ignore SIGTSTP, otherwise master waits forever before
708
+ exiting.</p></li>
709
+ <li><p>Unregister trap in workers upon first reception instead of racing to
710
+ unregister the trap handlers inherited from the master process.</p></li>
711
+ <li><p>Prevent uncaught throw error on subsequent Ctrl-C.</p></li>
712
+ <li><p>Simpler solution for terminating loop upon Ctrl-C.</p></li>
713
+ </ul>
714
+ <h2 id="Version-10-0-0-2011-04-06">Version 10.0.0 (2011-04-06)</h2><p>Major:</p>
715
+ <ul>
716
+ <li>The <code>Test::Loop.before_each_test</code> and <code>Test::Loop.after_each_test</code>
717
+ parameters are arrays now.</li>
718
+ </ul>
719
+ <h2 id="Version-9-4-0-2011-04-06">Version 9.4.0 (2011-04-06)</h2><p>Minor:</p>
720
+ <ul>
721
+ <li><p>Allow lambda functions in <code>Test::Loop.test_file_matchers</code> to return <code>nil</code>
722
+ so that you can exclude certain tests from being executed. (Brian D.
723
+ Burns)</p></li>
724
+ <li><p>Prefix worker process title with &quot;test-loop&quot; for easier <a class="md2man-xref">ps(1)</a>
725
+ searchability. The monitoring command in the README is now simplified to
726
+ the following:</p>
727
+ <pre><code>watch &#39;ps xf | grep test-loop | sed 1,3d&#39;
728
+ </code></pre></li>
729
+ </ul>
730
+ <p>Patch:</p>
731
+ <ul>
732
+ <li>Skip <code>at_exit()</code> when exiting master process. This prevents an empty test
733
+ from being run when exiting the loop after having processed a test/spec
734
+ helper that loads the Test::Unit library. (Brian D. Burns)</li>
735
+ </ul>
736
+ <p>Other:</p>
737
+ <ul>
738
+ <li><p>Use throw/catch to break loop instead of raising SystemExit exception.</p></li>
739
+ <li><p>Trap SIGTERM with IGNORE/DEFAULT instead of using a closure in master.</p></li>
740
+ <li><p>Unregister master&#39;s custom signal handlers inside worker processes.</p></li>
741
+ <li><p>Separate configuration parameters into subsections in README.</p></li>
742
+ </ul>
743
+ <h2 id="Version-9-3-0-2011-04-01">Version 9.3.0 (2011-04-01)</h2><p>Minor:</p>
744
+ <ul>
745
+ <li><p>Resume currently running tests--as well as those currently needing to be
746
+ run--after reabsorbing test execution overhead. (Brian D. Burns)</p></li>
747
+ <li><p>Stop currently running tests (and wait for them to finish) before
748
+ reabsorbing overhead. This greatly improves responsiveness because worker
749
+ processes are no longer there to compete with the new master process for
750
+ system resources.</p></li>
751
+ <li><p>Notify user when running all tests and when exiting. (Brian D. Burns)</p></li>
752
+ <li><p>Notify user when overhead changes instead of when restarting the loop.</p></li>
753
+ <li><p>Use ANSI clear line command to erase control-key combinations outputted by
754
+ shells such as BASH and ZSH in test-loop&#39;s output. (Brian D. Burns)</p></li>
755
+ </ul>
756
+ <p>Patch:</p>
757
+ <ul>
758
+ <li><p><code>@last_ran_at</code> was being set during every iteration of the loop. This is
759
+ problematic when Ruby&#39;s <code>Time.now</code> is more precise than your filesystem&#39;s
760
+ modification timestamp. For example, in the ext3 filesystem under Linux,
761
+ file modification timestamps have a precision of 1 second. (Brian D.
762
+ Burns)</p></li>
763
+ <li><p>Exit gently on SIGINT by sending SIGTERM to all worker processes and then
764
+ running waitall(), instead of sending SIGKILL to the entire process group.
765
+ As a result, test-loop no longer exits with a non-zero status upon SIGINT.</p></li>
766
+ <li><p>Remove &#39;ansi&#39; gem dependency. (Brian D. Burns)</p></li>
767
+ </ul>
768
+ <p>Other:</p>
769
+ <ul>
770
+ <li><p>Add tip on deleting logs for passing tests. (Brian D. Burns)</p></li>
771
+ <li><p>Add tip on monitoring test processes with <a class="md2man-xref">watch(1)</a> in README.</p></li>
772
+ </ul>
773
+ <h2 id="Version-9-2-0-2011-03-28">Version 9.2.0 (2011-03-28)</h2>
774
+ <ul>
775
+ <li><p>Extract Rails-specific configuration to &#39;test/loop/rails&#39; sublibrary.</p></li>
776
+ <li><p>Add &#39;test/loop/notify&#39; sublibrary for OSD notifications on failures.</p></li>
777
+ </ul>
778
+ <h2 id="Version-9-1-1-2011-03-15">Version 9.1.1 (2011-03-15)</h2>
779
+ <ul>
780
+ <li><p>$0 does not work from RubyGems wrapper executable.
781
+ Thanks to Brian D. Burns for reporting this issue.</p></li>
782
+ <li><p>Add information about sqlite3 errors &amp; workaround in README.</p></li>
783
+ </ul>
784
+ <h2 id="Version-9-1-0-2011-02-23">Version 9.1.0 (2011-02-23)</h2>
785
+ <ul>
786
+ <li><p>Print the status of completed tests in ANSI color.</p></li>
787
+ <li><p>Print the failure log of failing tests to STDERR.</p></li>
788
+ <li><p><code>$?</code> is not defined when Errno::ECHILD is raised.</p></li>
789
+ </ul>
790
+ <h2 id="Version-9-0-1-2011-02-18">Version 9.0.1 (2011-02-18)</h2>
791
+ <ul>
792
+ <li><p>Shield normal output from control-key combos printed into the terminal.</p></li>
793
+ <li><p>Do not print worker PID in status messages because every test file has
794
+ exactly one worker anyway.</p></li>
795
+ <li><p>Reabsorb on any <code>*.{rb,yml}</code> changes beneath the <code>config/</code> directory.</p></li>
796
+ <li><p>Do not reabsorb overhead when the configuration file changes.</p></li>
797
+ <li><p>Add <code>after_each_test</code> example for failure-only notifications.</p></li>
798
+ </ul>
799
+ <h2 id="Version-9-0-0-2011-02-15">Version 9.0.0 (2011-02-15)</h2>
800
+ <ul>
801
+ <li><p>Remove SIGUSR1 for killing worker processes.</p></li>
802
+ <li><p>Handle Ctrl-Z signal from the very beginning.</p></li>
803
+ </ul>
804
+ <h2 id="Version-8-0-0-2011-02-12">Version 8.0.0 (2011-02-12)</h2>
805
+ <ul>
806
+ <li><p>Move configuration into <code>Test::Loop</code> object itself.</p></li>
807
+ <li><p>Allow loading <code>bin/test-loop</code> into IRB for testing.</p></li>
808
+ <li><p>Simplify initialization of default configuration.</p></li>
809
+ <li><p>Revise README: delete needless cruft; add examples.</p></li>
810
+ <li><p>Add example on extending <code>before_each_test</code> function.</p></li>
811
+ <li><p>DRY <code>sleep 1</code> commands into higher order function.</p></li>
812
+ <li><p>Accept &gt; 80 character lines in some cases.</p></li>
813
+ <li><p>Freeze more constant values against modification.</p></li>
814
+ </ul>
815
+ <h2 id="Version-7-0-1-2011-02-10">Version 7.0.1 (2011-02-10)</h2>
816
+ <ul>
817
+ <li><p>Fix minitest deadlock issues with I/O redirection.</p></li>
818
+ <li><p>Do not signal to restart loop when overhead changes.</p></li>
819
+ </ul>
820
+ <h2 id="Version-7-0-0-2011-02-10">Version 7.0.0 (2011-02-10)</h2>
821
+ <ul>
822
+ <li><p>Switch from shell-script style to modular Ruby style in the source code.
823
+ This yields more lines of code, but the result is much easier to read.</p>
824
+ <ul>
825
+ <li>Replace the <code>$test_loop_config</code> global variable with the
826
+ <code>Test::Loop::Config</code> constant.</li>
827
+ </ul></li>
828
+ <li><p>Do not wait for all test runs to finish before detecting more changes.</p>
829
+ <ul>
830
+ <li>Replace the <code>after_all_tests</code> parameter with <code>after_each_test</code>.</li>
831
+ </ul></li>
832
+ <li><p>Capture test run output into separate log files; one log per test file.</p>
833
+ <ul>
834
+ <li>The <code>before_each_test</code> function is now passed the path to a log file.</li>
835
+ </ul></li>
836
+ <li><p>Register signal handlers at the earliest and act upon signals immediately.</p>
837
+ <ul>
838
+ <li>Previously, SIGQUIT did not work if there were no test helpers.</li>
839
+ </ul></li>
840
+ <li><p>Send the SIGUSR1 signal to terminate workers and their subprocesses.</p></li>
841
+ <li><p>Break long lines at 80 characters in the source code.</p></li>
842
+ </ul>
843
+ <h2 id="Version-6-0-0-2011-02-09">Version 6.0.0 (2011-02-09)</h2>
844
+ <ul>
845
+ <li><p>Only consider <code>{test,spec}_helper.rb</code> as overhead, not all <code>*_helper.rb</code>.</p></li>
846
+ <li><p>Give the user freedom to inspect and change the default configuration by
847
+ storing it in a <code>$test_loop_config</code> global variable instead of returning
848
+ the user&#39;s desired configuration as a hash from the user&#39;s configuration
849
+ file.</p></li>
850
+ <li><p>Change the method signature of the <code>after_all_tests</code> lambda function.</p></li>
851
+ <li><p>Add support for growl and xmessage in the <code>after_all_tests</code> example.</p></li>
852
+ <li><p>Add note about disabling class caching in Rails test environment.</p></li>
853
+ <li><p>Add better explanation for the <code>test_file_matchers</code> example.</p></li>
854
+ </ul>
855
+ <h2 id="Version-5-0-3-2011-01-25">Version 5.0.3 (2011-01-25)</h2>
856
+ <ul>
857
+ <li><p>Use &quot;diff/lcs&quot; library instead of &quot;diff&quot; for RSpec compatibility.</p><p>Thanks to millisami for reporting this bug:
858
+ <a href="https://github.com/sunaku/test-loop/issues/3">https://github.com/sunaku/test-loop/issues/3</a></p></li>
859
+ <li><p>Terminate worker processes when user presses Control-C.</p></li>
860
+ <li><p>Reabsorb when bundler is run, not when Gemfile changes.</p></li>
861
+ </ul>
862
+ <h2 id="Version-5-0-2-2011-01-19">Version 5.0.2 (2011-01-19)</h2>
863
+ <ul>
864
+ <li><p>Support string interpolations that yield empty strings in test names.</p></li>
865
+ <li><p>Accept extra characters before test name in test definition:</p>
866
+ <ul>
867
+ <li>Whitespace between <code>def</code> and <code>test_</code> in traditional test methods.</li>
868
+ <li>Opening parenthesis between test name and test definition keyword.</li>
869
+ </ul></li>
870
+ <li><p>Mention that diff gem is necessary for manual git clone installation.</p></li>
871
+ </ul>
872
+ <h2 id="Version-5-0-1-2011-01-18">Version 5.0.1 (2011-01-18)</h2>
873
+ <ul>
874
+ <li><p>Sanitize string interpolation in parsed test names.</p></li>
875
+ <li><p>Remove useless use of #map; result is not reused.</p></li>
876
+ <li><p>Mention parallelism and revise the introduction.</p></li>
877
+ <li><p>DRY the mentioning of .test-loop file in README.</p></li>
878
+ </ul>
879
+ <h2 id="Version-5-0-0-2011-01-17">Version 5.0.0 (2011-01-17)</h2>
880
+ <ul>
881
+ <li><p>The configuration file must now yield a Ruby
882
+ hash instead of polluting the global Object
883
+ private environment with instance variables.</p></li>
884
+ <li><p>Shortened the <code>:source_file_glob_to_test_file_mapping</code>
885
+ configuration parameter name to <code>:test_file_matchers</code>.</p></li>
886
+ </ul>
887
+ <h2 id="Version-4-0-1-2011-01-14">Version 4.0.1 (2011-01-14)</h2>
888
+ <ul>
889
+ <li><p>Print how much time it took to run all tests.</p></li>
890
+ <li><p>Do not print test file before loading because it
891
+ is hard to follow parallel test execution anyway.</p></li>
892
+ <li><p>Print rescued top-level exceptions to STDERR.</p></li>
893
+ <li><p>Strip surrounding spaces from parsed test names.</p></li>
894
+ <li><p>Use long options when passing test names in ARGV.</p></li>
895
+ <li><p>Only prepend lib/, test/, and spec/ to $LOAD_PATH.</p></li>
896
+ </ul>
897
+ <h2 id="Version-4-0-0-2011-01-13">Version 4.0.0 (2011-01-13)</h2>
898
+ <ul>
899
+ <li><p>Only run changed tests inside changed test files.</p></li>
900
+ <li><p>Run tests in parallel: one worker per test file.</p></li>
901
+ <li><p>Print the status of each test file after execution.</p></li>
902
+ <li><p>Rename <code>@after_test_execution</code> to <code>@after_all_tests</code>
903
+ and change its function signature.</p></li>
904
+ <li><p>Clean up implementation and improve documentation.</p></li>
905
+ </ul>
906
+ <h2 id="Version-3-0-2-2011-01-11">Version 3.0.2 (2011-01-11)</h2>
907
+ <ul>
908
+ <li><p>Reabsorb overhead upon Gemfile changes (Rails 3).</p></li>
909
+ <li><p>Try to recover from all kinds of exceptions.</p></li>
910
+ </ul>
911
+ <h2 id="Version-3-0-1-2011-01-05">Version 3.0.1 (2011-01-05)</h2>
912
+ <ul>
913
+ <li><p>Be resilient to $0 and ARGV being changed by tests.</p></li>
914
+ <li><p>Reduce pollution by making <code>notify()</code> into lambda.</p></li>
915
+ <li><p>Beautify markdown formatting and revise the README.</p></li>
916
+ </ul>
917
+ <h2 id="Version-3-0-0-2011-01-04">Version 3.0.0 (2011-01-04)</h2>
918
+ <ul>
919
+ <li><p>Replace Rake pathmap usage with lambda functions
920
+ in the <code>@source_file_to_test_file_mapping</code> hash.</p></li>
921
+ <li><p>Be resilient to syntax errors from loaded files.</p></li>
922
+ </ul>
923
+ <h2 id="Version-2-0-2-2011-01-02">Version 2.0.2 (2011-01-02)</h2>
924
+ <ul>
925
+ <li><p>Do not print stack trace when Control-C pressed.</p></li>
926
+ <li><p>Reduce the amount of notifications shown to user.</p></li>
927
+ </ul>
928
+ <h2 id="Version-2-0-1-2011-01-01">Version 2.0.1 (2011-01-01)</h2>
929
+ <ul>
930
+ <li><p>Fix syntax error caused by a dangling comma. Thanks
931
+ to darthdeus (Jakub Arnold) for reporting <a href="https://github.com/sunaku/test-loop/issues#issue/1">this bug</a>.</p></li>
932
+ <li><p>Notify user before reabsorbing overhead.</p></li>
933
+ </ul>
934
+ <h2 id="Version-2-0-0-2010-12-31">Version 2.0.0 (2010-12-31)</h2>
935
+ <ul>
936
+ <li><p>Add support for loading configuration file, which
937
+ allows you to define additional test file globs
938
+ and mappings, from the current working directory.</p></li>
939
+ <li><p>Add support for executing arbitrary logic after every test run
940
+ via the <code>@after_test_execution</code> hook in the configuration file.</p></li>
941
+ <li><p>Before running tests, print out their file paths.</p></li>
942
+ <li><p>Automatically retry when overhead absorption fails.</p></li>
943
+ </ul>
944
+ <h2 id="Version-1-2-0-2010-11-23">Version 1.2.0 (2010-11-23)</h2>
945
+ <ul>
946
+ <li><p>Notify user when absorbing overhead initially.</p></li>
947
+ <li><p>DRY up the repetition of <a class="md2man-xref">Time.at(0)</a> calculation.</p></li>
948
+ </ul>
949
+ <h2 id="Version-1-1-0-2010-11-22">Version 1.1.0 (2010-11-22)</h2>
950
+ <ul>
951
+ <li>All <code>*_{test,spec}_helper.rb</code> files inside <code>test/</code> and
952
+ <code>spec/</code> are now considered to be absorable overhead.</li>
953
+ </ul>
954
+ <h2 id="Version-1-0-2-2010-10-16">Version 1.0.2 (2010-10-16)</h2>
955
+ <ul>
956
+ <li>All *<em>helper.rb files inside test/ and spec/
957
+ were absorbed as overhead instead of just
958
+ the test</em>helper.rb and spec_helper.rb files.</li>
959
+ </ul>
960
+ <h2 id="Version-1-0-1-2010-10-16">Version 1.0.1 (2010-10-16)</h2>
961
+ <ul>
962
+ <li>Ensure that $LOAD_PATH reflects <code>ruby -Ilib:test</code>.</li>
963
+ </ul>
964
+ <h2 id="Version-1-0-0-2010-10-15">Version 1.0.0 (2010-10-15)</h2>
965
+ <ul>
966
+ <li><p>Remove ability to install as a Rails plugin.</p></li>
967
+ <li><p>Move logic from <code>lib/</code> into <code>bin/</code> to keep it simple.</p></li>
968
+ <li><p>Rely on $LOAD_PATH in <code>bin/</code> instead of relative paths.</p></li>
969
+ <li><p>Display status messages for better user interactivity.</p></li>
970
+ </ul>
971
+ <h2 id="Version-0-0-2-2010-10-11">Version 0.0.2 (2010-10-11)</h2>
972
+ <ul>
973
+ <li><p>Forgot to register <code>bin/test-loop</code> as gem executable.</p></li>
974
+ <li><p>Revise Usage section into Invocation and Operation.</p></li>
975
+ </ul>
976
+ <h2 id="Version-0-0-1-2010-10-10">Version 0.0.1 (2010-10-10)</h2>
977
+ <ul>
978
+ <li>First public release. Enjoy!</li>
979
+ </ul>
980
+ </div></body>
981
+ </html>