specjour 0.5.0 → 0.5.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/History.markdown CHANGED
@@ -1,6 +1,21 @@
1
1
  History
2
2
  =======
3
3
 
4
+ 0.5.2 / 2012-02-21
5
+ ---------------------------
6
+ * [fixed] Binary path used by Loader
7
+ * [fixed] Specjour prepare wouldn't wait for managers to complete
8
+ * [fixed] Slower machines adding completed tests back to suite
9
+
10
+ [Full Changelog](https://github.com/sandro/specjour/compare/v0.5.1...v0.5.2)
11
+
12
+ 0.5.1 / 2012-02-21 - yanked
13
+ ---------------------------
14
+ * [fixed] Dispatcher hanging after printing the report
15
+ * [added] More verbosity during startup
16
+
17
+ [Full Changelog](https://github.com/sandro/specjour/compare/v0.5.0...v0.5.1)
18
+
4
19
  0.5.0 / 2012-02-20
5
20
  ----------------------
6
21
 
@@ -26,7 +41,7 @@ History
26
41
  the regular test environment can be loaded, a worker without a database
27
42
  shouldn't raise an exception, instead the db should be created.
28
43
 
29
- [Full Changelog](https://github.com/sandro/specjour/compare/v0.4.1...0.5.0)
44
+ [Full Changelog](https://github.com/sandro/specjour/compare/v0.4.1...v0.5.0)
30
45
 
31
46
  0.4.1 / 2011-06-17
32
47
  ------------------
data/lib/specjour/cli.rb CHANGED
@@ -16,6 +16,7 @@ module Specjour
16
16
 
17
17
  # allow specjour to be called with path arguments
18
18
  def self.start(original_args=ARGV, config={})
19
+ Specjour.trap_interrupt
19
20
  real_tasks = all_tasks.keys | @map.keys
20
21
  unless real_tasks.include? original_args.first
21
22
  original_args.unshift default_task
@@ -3,7 +3,7 @@ module Specjour
3
3
  include Protocol
4
4
  extend Forwardable
5
5
 
6
- attr_reader :uri
6
+ attr_reader :uri, :retries
7
7
  attr_writer :socket
8
8
 
9
9
  def_delegators :socket, :flush, :close, :closed?, :gets, :each
@@ -17,6 +17,7 @@ module Specjour
17
17
 
18
18
  def initialize(uri)
19
19
  @uri = uri
20
+ @retries = 0
20
21
  end
21
22
 
22
23
  alias to_str to_s
@@ -26,18 +27,13 @@ module Specjour
26
27
  end
27
28
 
28
29
  def disconnect
29
- socket.close unless socket && socket.closed?
30
+ socket.close if socket && !socket.closed?
30
31
  end
31
32
 
32
33
  def socket
33
34
  @socket ||= connect
34
35
  end
35
36
 
36
- def timeout(&block)
37
- Timeout.timeout(0.5, &block)
38
- rescue Timeout::Error
39
- end
40
-
41
37
  def next_test
42
38
  will_reconnect do
43
39
  send_message(:ready)
@@ -52,12 +48,16 @@ module Specjour
52
48
  end
53
49
 
54
50
  def puts(arg='')
55
- print(arg << "\n")
51
+ will_reconnect do
52
+ print(arg << "\n")
53
+ end
56
54
  end
57
55
 
58
56
  def send_message(method_name, *args)
59
- print([method_name, *args])
60
- flush
57
+ will_reconnect do
58
+ print([method_name, *args])
59
+ flush
60
+ end
61
61
  end
62
62
 
63
63
  protected
@@ -65,8 +65,6 @@ module Specjour
65
65
  def connect_socket
66
66
  @socket = TCPSocket.open(uri.host, uri.port)
67
67
  rescue Errno::ECONNREFUSED => error
68
- Specjour.logger.debug "Could not connect to #{uri.to_s}\n#{error.inspect}"
69
- sleep 0.1
70
68
  retry
71
69
  end
72
70
 
@@ -75,12 +73,18 @@ module Specjour
75
73
  connect
76
74
  end
77
75
 
76
+ def timeout(&block)
77
+ Timeout.timeout(0.1, &block)
78
+ rescue Timeout::Error
79
+ end
80
+
78
81
  def will_reconnect(&block)
79
82
  block.call
80
83
  rescue SystemCallError, IOError => error
81
84
  unless Specjour.interrupted?
85
+ @retries += 1
82
86
  reconnect
83
- retry
87
+ retry if retries <= 5
84
88
  end
85
89
  end
86
90
  end
@@ -2,6 +2,7 @@ module Specjour
2
2
  module Cucumber
3
3
  module Preloader
4
4
  def self.load
5
+ $stdout.puts "Loading Cucumber Environment"
5
6
  require 'cucumber' unless defined?(::Cucumber::Cli)
6
7
  configuration = ::Cucumber::Cli::Configuration.new
7
8
  configuration.parse! []
@@ -16,7 +16,7 @@ module Specjour
16
16
  @managers = []
17
17
  @drb_connection_errors = Hash.new(0)
18
18
  @rsync_port = options[:rsync_port]
19
- reset_manager_threads
19
+ @manager_threads = []
20
20
  end
21
21
 
22
22
  def start
@@ -24,8 +24,11 @@ module Specjour
24
24
  gather_managers
25
25
  rsync_daemon.start
26
26
  dispatch_work
27
- printer.start if dispatching_tests?
28
- wait_on_managers
27
+ if dispatching_tests?
28
+ printer.start
29
+ else
30
+ wait_on_managers
31
+ end
29
32
  exit printer.exit_status
30
33
  end
31
34
 
@@ -74,6 +77,7 @@ module Specjour
74
77
  puts "No listeners found on this machine, starting one..."
75
78
  manager_options = {:worker_size => options[:worker_size], :registered_projects => [project_alias], :rsync_port => rsync_port}
76
79
  manager = Manager.start_quietly manager_options
80
+ Process.detach manager.pid
77
81
  fetch_manager(manager.drb_uri)
78
82
  at_exit do
79
83
  unless Specjour.interrupted?
@@ -122,10 +126,6 @@ module Specjour
122
126
  @project_name ||= File.basename(project_path)
123
127
  end
124
128
 
125
- def reset_manager_threads
126
- @manager_threads = []
127
- end
128
-
129
129
  def resolve_reply(reply)
130
130
  DNSSD.resolve!(reply.name, reply.type, reply.domain, flags=0, reply.interface) do |resolved|
131
131
  Specjour.logger.debug "Bonjour discovered #{resolved.target}"
@@ -159,7 +159,6 @@ module Specjour
159
159
 
160
160
  def wait_on_managers
161
161
  manager_threads.each {|t| t.join; t.exit}
162
- reset_manager_threads
163
162
  end
164
163
 
165
164
  def worker_task
@@ -23,7 +23,7 @@ module Specjour
23
23
  Configuration.after_load.call
24
24
  (1..worker_size).each do |index|
25
25
  worker_pids << fork do
26
- w = Worker.new(
26
+ Worker.new(
27
27
  :number => index,
28
28
  :printer_uri => printer_uri,
29
29
  :quiet => quiet
@@ -81,20 +81,14 @@ module Specjour
81
81
  end
82
82
 
83
83
  def load_app
84
- share_examples if spec_files.any?
85
- share_features if feature_files.any?
84
+ RSpec::Preloader.load spec_files if spec_files.any?
85
+ Cucumber::Preloader.load if feature_files.any?
86
+ register_tests_with_printer
86
87
  end
87
88
 
88
- def share_examples
89
- RSpec::Preloader.load spec_files
90
- connection.send_message :tests=, filtered_examples
91
- ensure
92
- ::RSpec.reset
93
- end
94
-
95
- def share_features
96
- Cucumber::Preloader.load
97
- connection.send_message :tests=, feature_files
89
+ def register_tests_with_printer
90
+ tests = filtered_examples | feature_files
91
+ connection.send_message :tests=, tests
98
92
  end
99
93
 
100
94
  def filtered_examples
@@ -118,12 +112,9 @@ module Specjour
118
112
  def connection
119
113
  @connection ||= begin
120
114
  at_exit { connection.disconnect }
121
- printer_connection
115
+ Connection.new URI.parse(printer_uri)
122
116
  end
123
117
  end
124
118
 
125
- def printer_connection
126
- Connection.new URI.parse(printer_uri)
127
- end
128
119
  end
129
120
  end
@@ -22,7 +22,6 @@ module Specjour
22
22
  @worker_task = options[:worker_task]
23
23
  @registered_projects = options[:registered_projects]
24
24
  @rsync_port = options[:rsync_port]
25
- at_exit { kill_loader_process }
26
25
  end
27
26
 
28
27
  def available_for?(project_name)
@@ -63,15 +62,13 @@ module Specjour
63
62
  exec_cmd << " --test-paths #{test_paths.join(" ")}" if test_paths.any?
64
63
  exec_cmd << " --log" if Specjour.log?
65
64
  exec_cmd << " --quiet" if quiet?
66
- exec_ruby = "Specjour::CLI.start(#{exec_cmd.split(' ').inspect})"
67
- load_path = ''
68
- $LOAD_PATH.each {|p| load_path << "-I#{p} " if p =~ /specjour/}
69
- exec_cmd = "ruby #{load_path} -rspecjour -e '#{exec_ruby}'"
70
- exec exec_cmd
65
+ load_path = $LOAD_PATH.detect {|l| l =~ %r(specjour.*/lib$)}
66
+ bin_path = File.expand_path(File.join(load_path, "../bin"))
67
+ Kernel.exec({"RUBYLIB" => load_path}, "#{bin_path}/specjour #{exec_cmd}")
71
68
  end
72
69
  Process.waitall
73
70
  ensure
74
- kill_loader_process
71
+ kill_loader_process if loader_pid
75
72
  end
76
73
 
77
74
  def in_project(&block)
@@ -80,7 +77,7 @@ module Specjour
80
77
 
81
78
  def interrupted=(bool)
82
79
  Specjour.interrupted = bool
83
- kill_loader_process
80
+ kill_loader_process if loader_pid
84
81
  end
85
82
 
86
83
  def kill_loader_process
@@ -89,6 +86,7 @@ module Specjour
89
86
  else
90
87
  Process.kill('TERM', loader_pid) rescue Errno::ESRCH
91
88
  end
89
+ @loader_pid = nil
92
90
  end
93
91
 
94
92
  def pid
@@ -71,8 +71,10 @@ module Specjour
71
71
  end
72
72
 
73
73
  def tests=(client, tests)
74
- self.tests_to_run = run_order(tests_to_run | tests)
75
- self.example_size = tests_to_run.size
74
+ if tests_to_run.empty?
75
+ self.tests_to_run = run_order(tests)
76
+ self.example_size = tests_to_run.size
77
+ end
76
78
  end
77
79
 
78
80
  def rspec_summary=(client, summary)
@@ -89,7 +91,7 @@ module Specjour
89
91
  end
90
92
 
91
93
  def disconnecting
92
- if (examples_complete == example_size || clients.empty?)
94
+ if (examples_complete == example_size) || clients.empty?
93
95
  throw(:stop)
94
96
  end
95
97
  end
@@ -1,5 +1,6 @@
1
1
  class Specjour::RSpec::Preloader
2
2
  def self.load(paths=[])
3
+ $stdout.puts "Loading RSpec Environment"
3
4
  require './spec/spec_helper'
4
5
  load_spec_files paths
5
6
  end
@@ -52,7 +52,7 @@ module Specjour
52
52
 
53
53
  def print_status(test)
54
54
  status = "[#{ENV['TEST_ENV_NUMBER']}] Running #{test}"
55
- Specjour.logger.debug status
55
+ $stdout.puts status
56
56
  $PROGRAM_NAME = "specjour#{status}"
57
57
  end
58
58
 
data/lib/specjour.rb CHANGED
@@ -29,8 +29,13 @@ module Specjour
29
29
  autoload :Cucumber, 'specjour/cucumber'
30
30
  autoload :RSpec, 'specjour/rspec'
31
31
 
32
- VERSION = "0.5.0"
33
- HOOKS_PATH = "./.specjour/hooks.rb"
32
+ VERSION ||= "0.5.2"
33
+ HOOKS_PATH ||= "./.specjour/hooks.rb"
34
+ PROGRAM_NAME ||= $PROGRAM_NAME # keep a reference of the original program name
35
+
36
+ GC.copy_on_write_friendly = true if GC.respond_to?(:copy_on_write_friendly=)
37
+
38
+ class Error < StandardError; end
34
39
 
35
40
  def self.interrupted?
36
41
  @interrupted
@@ -75,12 +80,4 @@ module Specjour
75
80
  abort("\n")
76
81
  end
77
82
  end
78
-
79
- Error = Class.new(StandardError)
80
- PROGRAM_NAME = $PROGRAM_NAME # keep a reference of the original program name
81
-
82
- GC.copy_on_write_friendly = true if GC.respond_to?(:copy_on_write_friendly=)
83
-
84
- trap_interrupt
85
-
86
83
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: specjour
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.0
4
+ version: 0.5.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-02-20 00:00:00.000000000Z
12
+ date: 2012-02-22 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: dnssd
16
- requirement: &2156993440 !ruby/object:Gem::Requirement
16
+ requirement: &2156640700 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - =
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: 2.0.0
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *2156993440
24
+ version_requirements: *2156640700
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: thor
27
- requirement: &2156992940 !ruby/object:Gem::Requirement
27
+ requirement: &2156640200 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: 0.14.0
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *2156992940
35
+ version_requirements: *2156640200
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: rspec
38
- requirement: &2156992460 !ruby/object:Gem::Requirement
38
+ requirement: &2156639660 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: 2.8.0
44
44
  type: :development
45
45
  prerelease: false
46
- version_requirements: *2156992460
46
+ version_requirements: *2156639660
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: rr
49
- requirement: &2156991900 !ruby/object:Gem::Requirement
49
+ requirement: &2156639180 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ! '>='
@@ -54,10 +54,10 @@ dependencies:
54
54
  version: 1.0.4
55
55
  type: :development
56
56
  prerelease: false
57
- version_requirements: *2156991900
57
+ version_requirements: *2156639180
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: cucumber
60
- requirement: &2156991400 !ruby/object:Gem::Requirement
60
+ requirement: &2156638680 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ! '>='
@@ -65,10 +65,10 @@ dependencies:
65
65
  version: 1.1.4
66
66
  type: :development
67
67
  prerelease: false
68
- version_requirements: *2156991400
68
+ version_requirements: *2156638680
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: yard
71
- requirement: &2156990920 !ruby/object:Gem::Requirement
71
+ requirement: &2156638160 !ruby/object:Gem::Requirement
72
72
  none: false
73
73
  requirements:
74
74
  - - ! '>='
@@ -76,7 +76,7 @@ dependencies:
76
76
  version: 0.7.2
77
77
  type: :development
78
78
  prerelease: false
79
- version_requirements: *2156990920
79
+ version_requirements: *2156638160
80
80
  description: ! " Specjour splits your RSpec suite across multiple machines, and
81
81
  multiple\n cores per machine, to run super-parallel-fast! Also works with Cucumber.\n"
82
82
  email: sandro.turriate@gmail.com