tork 17.0.1 → 17.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/HISTORY.markdown CHANGED
@@ -1,3 +1,25 @@
1
+ ------------------------------------------------------------------------------
2
+ Version 17.1.0 (2012-01-30)
3
+ ------------------------------------------------------------------------------
4
+
5
+ Improvements:
6
+
7
+ * Added `Tork::Config.test_event_hooks` configuration option.
8
+
9
+ * Added `tork/config/notify` configuration helper for receiving
10
+ edge-triggered notifications (via libnotify, growl, or
11
+ xmessage) about changes in test files' pass/fail status.
12
+
13
+ * Added `tork/config/factory_girl` configuration helper for properly
14
+ clearing factory definitions before forking and then finding them after
15
+ forking to avoid `FactoryGirl::DuplicateDefinitionError`. (Mark Hayes)
16
+
17
+ * Lambda functions in `Tork::Config.test_file_globbers` can now return
18
+ multiple globs in an array, in addition to just a single glob or `nil`.
19
+
20
+ * Added support for the MiniTest convention of naming test files as
21
+ `test/**/test_*.rb` and `spec/**/spec_*.rb`.
22
+
1
23
  ------------------------------------------------------------------------------
2
24
  Version 17.0.1 (2012-01-29)
3
25
  ------------------------------------------------------------------------------
data/LICENSE CHANGED
@@ -11,6 +11,7 @@ Thanks to 2012 Spencer Steffen <spencer@citrusme.com>
11
11
  Thanks to 2012 Jesse Cooke <jesse@jc00ke.com>
12
12
  Thanks to 2012 Benjamin Quorning <benjamin@quorning.net>
13
13
  Thanks to 2012 Nicolas Fouché <nicolas.fouche@gmail.com>
14
+ Thanks to 2012 Mark Hayes <mark@deployfx.com>
14
15
 
15
16
  Permission to use, copy, modify, and/or distribute this software for any
16
17
  purpose with or without fee is hereby granted, provided that the above
data/README.markdown CHANGED
@@ -39,7 +39,7 @@ Features
39
39
 
40
40
  * You can override the modular `tork*` programs with your own in $PATH.
41
41
 
42
- * Its core is written in less than 370 lines (SLOC) of pure Ruby code! :-)
42
+ * Its core is written in about 370 lines (SLOC) of pure Ruby code! :-)
43
43
 
44
44
  ### Architecture
45
45
 
@@ -105,7 +105,7 @@ You can monitor your test processes from another terminal:
105
105
 
106
106
  ### With [Ruby on Rails]
107
107
 
108
- For Rails 3 or newer, use the rails configuration helper (see below).
108
+ For Rails 3 or newer, use the `tork/config/rails` configuration helper.
109
109
  Otherwise, ensure that your `config/environments/test.rb` file contains:
110
110
 
111
111
  config.cache_classes = false
@@ -117,26 +117,6 @@ adapter][memory_test_fix]. Otherwise, you *might* face these errors:
117
117
 
118
118
  > cannot start a transaction within a transaction
119
119
 
120
- ### With [factory_girl]
121
-
122
- Do not load your factories into the master process as part of your test
123
- execution overhead in your test/spec helper because that would necessitate
124
- overhead reabsorption whenever you change or create factory definitions.
125
-
126
- Instead, use `at_exit()` to wait until (1) after the master process has forked
127
- a worker process and (2) just before that worker process runs its test suite
128
- (whose execution is started by your test framework's own `at_exit()` handler):
129
-
130
- # in your test/spec helper
131
- require 'factory_girl'
132
- at_exit { FactoryGirl.find_definitions unless $! }
133
-
134
- This way, worker processes will pick up changes in your factories "for free"
135
- whenever they (re)run your test files. Skip if Ruby is exiting because of a
136
- raised exception (denoted by the `$!` global variable in the snippet above).
137
-
138
- As a bonus, this arrangement also works when tests are run outside of Tork!
139
-
140
120
  ------------------------------------------------------------------------------
141
121
  Configuration
142
122
  ------------------------------------------------------------------------------
@@ -172,6 +152,16 @@ Or in your configuration file:
172
152
 
173
153
  require 'tork/config/cucumber'
174
154
 
155
+ ### [factory_girl]
156
+
157
+ At the command line:
158
+
159
+ tork factory_girl
160
+
161
+ Or in your configuration file:
162
+
163
+ require 'tork/config/factory_girl'
164
+
175
165
  ### [parallel_tests]
176
166
 
177
167
  At the command line:
@@ -202,6 +192,16 @@ Or in your configuration file:
202
192
 
203
193
  require 'tork/config/logdir'
204
194
 
195
+ ### Receive notifications via libnotify, growl, or xmessage(1)
196
+
197
+ At the command line:
198
+
199
+ tork notify
200
+
201
+ Or in your configuration file:
202
+
203
+ require 'tork/config/notify'
204
+
205
205
  ------------------------------------------------------------------------------
206
206
  Configuration options
207
207
  -----------------------------------------------------------------------------
@@ -235,8 +235,9 @@ your Ruby application.
235
235
 
236
236
  Hash that maps (1) a regular expression describing a set of file paths to (2)
237
237
  a lambda function that accepts the path to a changed file and a `MatchData`
238
- object containing the results of the regular expression matching, and yields a
239
- file globbing pattern that describes a set of test files that need to be run.
238
+ object containing the results of the regular expression matching, and yields
239
+ one or more file globbing patterns (a single string, or an array of strings)
240
+ that describe a set of test files that need to be run.
240
241
 
241
242
  In other words, whenever the source files (the regular expression) change,
242
243
  their associated test files (result of calling the lambda function) are run.
@@ -254,6 +255,23 @@ Then you would add the following to your configuration file:
254
255
  "{test,spec}/**/#{name}_#{name.reverse}.rb"
255
256
  end
256
257
 
258
+ Going further, if you suppose that test files could optionally have "test" or
259
+ "spec" prefixed or appended to their already peculiar names, like so:
260
+
261
+ * `lib/hello.rb` => `test/hello_olleh_test.rb`
262
+ * `lib/hello.rb` => `test/test_hello_olleh.rb`
263
+ * `app/world.rb` => `spec/world_ldrow_spec.rb`
264
+ * `app/world.rb` => `spec/spec_world_ldrow.rb`
265
+
266
+ Then you would add the following to your configuration file:
267
+
268
+ Tork::Config.test_file_globbers[%r<^(lib|app)/.+\.rb$>] = lambda do |path, matches|
269
+ name = File.basename(path, '.rb')
270
+ ["{test,spec}/**/#{name}_#{name.reverse}.rb",
271
+ "{test,spec}/**/#{name}_#{name.reverse}_{test,spec}.rb",
272
+ "{test,spec}/**/{test,spec}_#{name}_#{name.reverse}.rb"]
273
+ end
274
+
257
275
  In addition, these lambda functions can return `nil` if they do not wish for a
258
276
  particular source file to be tested. For example, to ignore tests for all
259
277
  source files except those within a `models/` directory, you would write:
@@ -261,12 +279,14 @@ source files except those within a `models/` directory, you would write:
261
279
  Tork::Config.test_file_globbers[%r<^(lib|app)/.+\.rb$>] = lambda do |path, matches|
262
280
  if path.include? '/models/'
263
281
  "{test,spec}/**/#{File.basename(path)}"
282
+ #else # implied by the Ruby language
283
+ #nil # implied by the Ruby language
264
284
  end
265
285
  end
266
286
 
267
287
  ### Tork::Config.before_fork_hooks
268
288
 
269
- Array of lambda functions that are executed inside `tork-master` before a
289
+ Array of lambda functions that are invoked inside `tork-master` before a
270
290
  worker process is forked to run a test file. These functions are given:
271
291
 
272
292
  1. The sequence number of the worker process that will be forked shortly.
@@ -293,7 +313,7 @@ For example, to see some real values:
293
313
 
294
314
  ### Tork::Config.after_fork_hooks
295
315
 
296
- Array of lambda functions that are executed inside a worker process forked
316
+ Array of lambda functions that are invoked inside a worker process forked
297
317
  by `tork-master`. These functions are given:
298
318
 
299
319
  1. The sequence number of the worker process.
@@ -323,6 +343,18 @@ The first function in this array instructs Test::Unit and RSpec to only run
323
343
  those tests that are defined on the given line numbers. This accelerates your
324
344
  test-driven development cycle by only running tests you are currently editing.
325
345
 
346
+ ### Tork::Config.test_event_hooks
347
+
348
+ Array of lambda functions that are invoked inside `tork-driver` whenever it
349
+ receives a status message (passed into those functions) from `tork-master`.
350
+ Run `tork-master --help` for more information about these status messages.
351
+
352
+ For example, to see some real values:
353
+
354
+ Tork::Config.test_event_hooks.push lambda {|message_from_tork_master|
355
+ p :test_event_hooks => message_from_tork_master
356
+ }
357
+
326
358
  ------------------------------------------------------------------------------
327
359
  License
328
360
  ------------------------------------------------------------------------------
data/bin/tork CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
2
  =begin
3
3
 
4
- TORK 1 2012-01-29 17.0.1
4
+ TORK 1 2012-01-30 17.1.0
5
5
  ==============================================================================
6
6
 
7
7
  NAME
data/bin/tork-driver CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
2
  =begin
3
3
 
4
- TORK-DRIVER 1 2012-01-29 17.0.1
4
+ TORK-DRIVER 1 2012-01-30 17.1.0
5
5
  ==============================================================================
6
6
 
7
7
  NAME
data/bin/tork-herald CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
2
  =begin
3
3
 
4
- TORK-HERALD 1 2012-01-29 17.0.1
4
+ TORK-HERALD 1 2012-01-30 17.1.0
5
5
  ==============================================================================
6
6
 
7
7
  NAME
data/bin/tork-master CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
2
  =begin
3
3
 
4
- TORK-MASTER 1 2012-01-29 17.0.1
4
+ TORK-MASTER 1 2012-01-30 17.1.0
5
5
  ==============================================================================
6
6
 
7
7
  NAME
data/lib/tork/config.rb CHANGED
@@ -22,19 +22,21 @@ module Tork
22
22
  Config.overhead_file_globs = ['{test,spec}/{test,spec}_helper.rb']
23
23
 
24
24
  Config.reabsorb_file_greps = [/^#{Regexp.quote(_user_config_file)}$/,
25
- %r<(test|spec)/\1_helper\.rb>]
25
+ %r<^(test|spec)/\1_helper\.rb$>]
26
26
 
27
- Config.all_test_file_globs = ['{test,spec}/**/*_{test,spec}.rb']
27
+ Config.all_test_file_globs = ['{test,spec}/**/*_{test,spec}.rb',
28
+ '{test,spec}/**/{test,spec}_*.rb']
28
29
 
29
30
  Config.test_file_globbers = {
30
31
  # source files that correspond to test files
31
32
  %r<^lib/.+\.rb$> => lambda do |path, matches|
32
33
  base = File.basename(path, '.rb')
33
- "{test,spec}/**/#{base}_{test,spec}.rb"
34
+ ["{test,spec}/**/#{base}_{test,spec}.rb",
35
+ "{test,spec}/**/{test,spec}_#{base}.rb"]
34
36
  end,
35
37
 
36
38
  # the actual test files themselves
37
- %r<^(test|spec)/.+_\1\.rb$> => lambda {|path, matches| path }
39
+ %r<^(test|spec)/.*(\1_[^/]+|[^/]+_\1)\.rb$> => proc {|path| path }
38
40
  }
39
41
 
40
42
  Config.before_fork_hooks = []
@@ -74,6 +76,8 @@ module Tork
74
76
  end
75
77
  ]
76
78
 
79
+ Config.test_event_hooks = []
80
+
77
81
  #---------------------------------------------------------------------------
78
82
  # overrides
79
83
  #---------------------------------------------------------------------------
@@ -0,0 +1,10 @@
1
+ require 'tork/config'
2
+
3
+ Tork::Config.before_fork_hooks.push proc {
4
+ require 'factory_girl'
5
+ FactoryGirl.factories.clear
6
+ }
7
+
8
+ Tork::Config.after_fork_hooks.push proc {
9
+ FactoryGirl.find_definitions
10
+ }
@@ -0,0 +1,34 @@
1
+ require 'tork/config'
2
+ require 'set'
3
+
4
+ failed_test_files = Set.new
5
+
6
+ Tork::Config.test_event_hooks.push lambda {|message|
7
+ event, test_file, line_numbers, log_file, worker_number, exit_status = message
8
+
9
+ # make notifications edge-triggered: pass => fail or vice versa.
10
+ # we do not care about pass => pass or fail => fail transitions.
11
+ case event.to_sym
12
+ when :fail
13
+ if failed_test_files.add? test_file
14
+ icon = 'dialog-error'
15
+ end
16
+ when :pass
17
+ if line_numbers.empty? and failed_test_files.delete? test_file
18
+ icon = 'dialog-information'
19
+ end
20
+ end
21
+
22
+ if icon
23
+ title = [event.upcase, test_file].join(' ')
24
+
25
+ statistics = File.readlines(log_file).grep(/^\d+ \w+,/).join.
26
+ gsub(/\e\[\d+(;\d+)?m/, '') # strip ANSI SGR escape codes
27
+
28
+ Thread.new do # run in background
29
+ system 'notify-send', '-i', icon, title, statistics or
30
+ system 'growlnotify', '-a', 'Xcode', '-m', statistics, title or
31
+ system 'xmessage', '-timeout', '5', '-title', title, statistics
32
+ end
33
+ end
34
+ }
data/lib/tork/driver.rb CHANGED
@@ -53,7 +53,8 @@ module Driver
53
53
  @passed_test_files.delete file
54
54
  end
55
55
 
56
- @client.send message
56
+ @client.send message # propagate output downstream
57
+ Config.test_event_hooks.each {|hook| hook.call message }
57
58
  end
58
59
 
59
60
  @master.send [:load, Config.overhead_load_paths,
@@ -72,8 +73,8 @@ module Driver
72
73
 
73
74
  # find and run the tests that correspond to the changed file
74
75
  Config.test_file_globbers.each do |regexp, globber|
75
- if regexp =~ changed_file and glob = globber.call(changed_file, $~)
76
- run_test_files Dir[glob]
76
+ if regexp =~ changed_file and globs = globber.call(changed_file, $~)
77
+ run_test_files Dir[*globs]
77
78
  end
78
79
  end
79
80
 
data/lib/tork/master.rb CHANGED
@@ -10,7 +10,7 @@ module Master
10
10
  def load paths, files
11
11
  $LOAD_PATH.unshift(*paths)
12
12
 
13
- files.each do |file|
13
+ @overhead_files = files.each do |file|
14
14
  branch, leaf = File.split(file)
15
15
  file = leaf if paths.include? branch
16
16
  require file.sub(/\.rb$/, '')
@@ -20,6 +20,8 @@ module Master
20
20
  end
21
21
 
22
22
  def test test_file, line_numbers
23
+ return if @overhead_files.include? test_file
24
+
23
25
  # throttle forking rate to meet the maximum concurrent workers limit
24
26
  sleep 1 until @command_by_worker_pid.size < Config.max_forked_workers
25
27
 
data/lib/tork/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Tork
2
- VERSION = "17.0.1"
2
+ VERSION = "17.1.0"
3
3
  end
@@ -1,4 +1,4 @@
1
- .TH TORK\-DRIVER 1 2012\-01\-29 17.0.1
1
+ .TH TORK\-DRIVER 1 2012\-01\-30 17.1.0
2
2
  .SH NAME
3
3
  .PP
4
4
  tork\-driver \- drives
@@ -1,4 +1,4 @@
1
- .TH TORK\-HERALD 1 2012\-01\-29 17.0.1
1
+ .TH TORK\-HERALD 1 2012\-01\-30 17.1.0
2
2
  .SH NAME
3
3
  .PP
4
4
  tork\-herald \- reports modified files
@@ -1,4 +1,4 @@
1
- .TH TORK\-MASTER 1 2012\-01\-29 17.0.1
1
+ .TH TORK\-MASTER 1 2012\-01\-30 17.1.0
2
2
  .SH NAME
3
3
  .PP
4
4
  tork\-master \- absorbs overhead and runs tests
data/man/man1/tork.1 CHANGED
@@ -1,4 +1,4 @@
1
- .TH TORK 1 2012\-01\-29 17.0.1
1
+ .TH TORK 1 2012\-01\-30 17.1.0
2
2
  .SH NAME
3
3
  .PP
4
4
  tork \- Continuous testing tool for Ruby
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tork
3
3
  version: !ruby/object:Gem::Version
4
- version: 17.0.1
4
+ version: 17.1.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -10,11 +10,11 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2012-01-29 00:00:00.000000000 Z
13
+ date: 2012-01-30 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: binman
17
- requirement: &13745920 !ruby/object:Gem::Requirement
17
+ requirement: &9258640 !ruby/object:Gem::Requirement
18
18
  none: false
19
19
  requirements:
20
20
  - - ~>
@@ -22,10 +22,10 @@ dependencies:
22
22
  version: '3'
23
23
  type: :runtime
24
24
  prerelease: false
25
- version_requirements: *13745920
25
+ version_requirements: *9258640
26
26
  - !ruby/object:Gem::Dependency
27
27
  name: json
28
- requirement: &13745380 !ruby/object:Gem::Requirement
28
+ requirement: &9258120 !ruby/object:Gem::Requirement
29
29
  none: false
30
30
  requirements:
31
31
  - - ! '>='
@@ -36,10 +36,10 @@ dependencies:
36
36
  version: '2'
37
37
  type: :runtime
38
38
  prerelease: false
39
- version_requirements: *13745380
39
+ version_requirements: *9258120
40
40
  - !ruby/object:Gem::Dependency
41
41
  name: guard
42
- requirement: &13744640 !ruby/object:Gem::Requirement
42
+ requirement: &9257380 !ruby/object:Gem::Requirement
43
43
  none: false
44
44
  requirements:
45
45
  - - ! '>='
@@ -50,10 +50,10 @@ dependencies:
50
50
  version: '1'
51
51
  type: :runtime
52
52
  prerelease: false
53
- version_requirements: *13744640
53
+ version_requirements: *9257380
54
54
  - !ruby/object:Gem::Dependency
55
55
  name: diff-lcs
56
- requirement: &13743900 !ruby/object:Gem::Requirement
56
+ requirement: &9256640 !ruby/object:Gem::Requirement
57
57
  none: false
58
58
  requirements:
59
59
  - - ! '>='
@@ -64,10 +64,10 @@ dependencies:
64
64
  version: '2'
65
65
  type: :runtime
66
66
  prerelease: false
67
- version_requirements: *13743900
67
+ version_requirements: *9256640
68
68
  - !ruby/object:Gem::Dependency
69
69
  name: md2man
70
- requirement: &13743120 !ruby/object:Gem::Requirement
70
+ requirement: &9255920 !ruby/object:Gem::Requirement
71
71
  none: false
72
72
  requirements:
73
73
  - - ~>
@@ -75,10 +75,10 @@ dependencies:
75
75
  version: '1'
76
76
  type: :development
77
77
  prerelease: false
78
- version_requirements: *13743120
78
+ version_requirements: *9255920
79
79
  - !ruby/object:Gem::Dependency
80
80
  name: rake
81
- requirement: &13742600 !ruby/object:Gem::Requirement
81
+ requirement: &9255380 !ruby/object:Gem::Requirement
82
82
  none: false
83
83
  requirements:
84
84
  - - ! '>='
@@ -89,7 +89,7 @@ dependencies:
89
89
  version: '1'
90
90
  type: :development
91
91
  prerelease: false
92
- version_requirements: *13742600
92
+ version_requirements: *9255380
93
93
  description: Continuous testing tool for Ruby.
94
94
  email:
95
95
  - sunaku@gmail.com
@@ -116,7 +116,9 @@ files:
116
116
  - lib/tork/config.rb
117
117
  - lib/tork/config/cucumber.rb
118
118
  - lib/tork/config/dotlog.rb
119
+ - lib/tork/config/factory_girl.rb
119
120
  - lib/tork/config/logdir.rb
121
+ - lib/tork/config/notify.rb
120
122
  - lib/tork/config/parallel_tests.rb
121
123
  - lib/tork/config/rails.rb
122
124
  - lib/tork/driver.rb