servolux 0.9.6 → 0.9.7

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/.gitignore ADDED
@@ -0,0 +1,18 @@
1
+ # The list of files that should be ignored by Mr Bones.
2
+ # Lines that start with '#' are comments.
3
+ #
4
+ # A .gitignore file can be used instead by setting it as the ignore
5
+ # file in your Rakefile:
6
+ #
7
+ # PROJ.ignore_file = '.gitignore'
8
+ #
9
+ # For a project with a C extension, the following would be a good set of
10
+ # exclude patterns (uncomment them if you want to use them):
11
+ # *.[oa]
12
+ *~
13
+ *.sw[op]
14
+ announcement.txt
15
+ coverage
16
+ doc
17
+ pkg
18
+ .yardoc
data/.travis.yml ADDED
@@ -0,0 +1,11 @@
1
+ language: ruby
2
+
3
+ before_install: "gem install bones"
4
+ install: "rake gem:install_dependencies"
5
+
6
+ script: "rake"
7
+
8
+ rvm:
9
+ - 1.8.7
10
+ - 1.9.2
11
+
data/History.txt CHANGED
@@ -1,3 +1,10 @@
1
+ == 0.9.7 / 2012-01-19
2
+
3
+ * Minor Enhancements
4
+ * Added `after_fork` and `before_exec` handlers for the Daemon class [issue #4]
5
+ * Bug Fixes
6
+ * ThreadError when stopping threaded objects [issue #5]
7
+
1
8
  == 0.9.6 / 2011-01-02
2
9
 
3
10
  * Minor Enhancements
data/README.rdoc CHANGED
@@ -1,6 +1,8 @@
1
1
  = Serv-O-Lux
2
- * by Tim Pease
3
- * http://gemcutter.org/gems/servolux
2
+ by Tim Pease {<img src="https://secure.travis-ci.org/TwP/servolux.png">}[http://travis-ci.org/TwP/servolux]
3
+
4
+ * {Homepage}[http://rubygems.org/gems/servolux]
5
+ * {Github Project}[http://github.com/TwP/servolux]
4
6
 
5
7
  === DESCRIPTION
6
8
 
data/Rakefile CHANGED
@@ -14,7 +14,6 @@ Bones {
14
14
  email 'tim.pease@gmail.com'
15
15
  url 'http://gemcutter.org/gems/servolux'
16
16
  readme_file 'README.rdoc'
17
- ignore_file '.gitignore'
18
17
  spec.opts << '--color'
19
18
 
20
19
  use_gmail
@@ -67,10 +67,10 @@ class Servolux::Child
67
67
  # signal before trying the next one in the list.
68
68
  #
69
69
  def initialize( opts = {} )
70
- @command = opts[:command]
71
- @timeout = opts[:timeout]
72
- @signals = opts[:signals] || %w[TERM QUIT KILL]
73
- @suspend = opts[:suspend] || 4
70
+ @command = opts.fetch(:command, nil)
71
+ @timeout = opts.fetch(:timeout, nil)
72
+ @signals = opts.fetch(:signals, %w[TERM QUIT KILL])
73
+ @suspend = opts.fetch(:suspend, 4)
74
74
  @io = @pid = @status = @thread = @timed_out = nil
75
75
  yield self if block_given?
76
76
  end
@@ -218,4 +218,3 @@ class Servolux::Child
218
218
 
219
219
  end
220
220
 
221
- # EOF
@@ -39,7 +39,7 @@ require 'ostruct'
39
39
  #
40
40
  # Again, the Daemon instance will wait till the daemon process shuts down.
41
41
  # This is determined by attempting to signal the daemon process PID and then
42
- # returning when this signal fails -- i.e. then the deamon process has died.
42
+ # returning when this signal fails -- i.e. then the daemon process has died.
43
43
  #
44
44
  # == Examples
45
45
  #
@@ -75,7 +75,7 @@ class Servolux::Daemon
75
75
  Timeout = Class.new(Error)
76
76
  StartupError = Class.new(Error)
77
77
 
78
- attr_reader :name
78
+ attr_accessor :name
79
79
  attr_accessor :logger
80
80
  attr_accessor :pid_file
81
81
  attr_reader :startup_command
@@ -85,8 +85,10 @@ class Servolux::Daemon
85
85
  attr_accessor :noclose
86
86
  attr_reader :log_file
87
87
  attr_reader :look_for
88
+ attr_accessor :after_fork
89
+ attr_accessor :before_exec
88
90
 
89
- # Create a new Daemon that will manage the +startup_command+ as a deamon
91
+ # Create a new Daemon that will manage the +startup_command+ as a daemon
90
92
  # process.
91
93
  #
92
94
  # @option opts [String] :name
@@ -119,7 +121,7 @@ class Servolux::Daemon
119
121
  #
120
122
  # @option opts [Boolen] :noclose (false)
121
123
  # When set to true this flag keeps the standard input/output streams from
122
- # being reopend to /dev/null when the deamon process is created. Reopening
124
+ # being reopend to /dev/null when the daemon process is created. Reopening
123
125
  # the standard input/output streams frees the file descriptors which are
124
126
  # still being used by the parent process. This prevents zombie processes.
125
127
  #
@@ -138,23 +140,32 @@ class Servolux::Daemon
138
140
  # is a useful check for determining if the daemon process is fully
139
141
  # started.
140
142
  #
143
+ # @option opts [Proc, lambda] :after_fork (nil)
144
+ # This proc will be called in the child process immediately after forking.
145
+ #
146
+ # @option opts [Proc, lambda] :before_exec (nil)
147
+ # This proc will be called in the child process immediately before calling
148
+ # `exec` to execute the desired process. This proc will be called after
149
+ # the :after_fork proc if present.
150
+ #
141
151
  # @yield [self] Block used to configure the daemon instance
142
152
  #
143
153
  def initialize( opts = {} )
144
- self.server = opts[:server] || opts[:startup_command]
145
-
146
- @name = opts[:name] if opts.key?(:name)
147
- @logger = opts[:logger] if opts.key?(:logger)
148
- @pid_file = opts[:pid_file] if opts.key?(:pid_file)
149
- @timeout = opts[:timeout] || 30
150
- @nochdir = opts[:nochdir] || false
151
- @noclose = opts[:noclose] || false
152
- @shutdown_command = opts[:shutdown_command]
153
-
154
154
  @piper = nil
155
155
  @logfile_reader = nil
156
- self.log_file = opts[:log_file]
157
- self.look_for = opts[:look_for]
156
+
157
+ self.name = opts.fetch(:name, nil)
158
+ self.logger = opts.fetch(:logger, nil)
159
+ self.pid_file = opts.fetch(:pid_file, nil)
160
+ self.startup_command = opts.fetch(:server, nil) || opts.fetch(:startup_command, nil)
161
+ self.shutdown_command = opts.fetch(:shutdown_command, nil)
162
+ self.timeout = opts.fetch(:timeout, 30)
163
+ self.nochdir = opts.fetch(:nochdir, false)
164
+ self.noclose = opts.fetch(:noclose, false)
165
+ self.log_file = opts.fetch(:log_file, nil)
166
+ self.look_for = opts.fetch(:look_for, nil)
167
+ self.after_fork = opts.fetch(:after_fork, nil)
168
+ self.before_exec = opts.fetch(:before_exec, nil)
158
169
 
159
170
  yield self if block_given?
160
171
 
@@ -324,9 +335,11 @@ class Servolux::Daemon
324
335
  end
325
336
 
326
337
 
327
- private
338
+ private
328
339
 
329
340
  def run_startup_command
341
+ after_fork.call if after_fork.respond_to? :call
342
+
330
343
  case startup_command
331
344
  when String; exec(startup_command)
332
345
  when Array; exec(*startup_command)
@@ -347,12 +360,15 @@ class Servolux::Daemon
347
360
 
348
361
  def exec( *args )
349
362
  logger.debug "Calling: exec(*#{args.inspect})"
363
+
350
364
  skip = [STDIN, STDOUT, STDERR]
351
365
  skip << @piper.socket if @piper
352
366
  ObjectSpace.each_object(IO) { |obj|
353
367
  next if skip.include? obj
354
368
  obj.close rescue nil
355
369
  }
370
+
371
+ before_exec.call if before_exec.respond_to? :call
356
372
  Kernel.exec(*args)
357
373
  end
358
374
 
@@ -124,7 +124,7 @@ class Servolux::Piper
124
124
  raise ArgumentError, "Unsupported mode #{mode.inspect}"
125
125
  end
126
126
 
127
- @timeout = opts.key?(:timeout) ? opts[:timeout] : nil
127
+ @timeout = opts.fetch(:timeout, nil)
128
128
  socket_pair = Socket.pair(Socket::AF_UNIX, Socket::SOCK_STREAM, 0)
129
129
  @child_pid = Kernel.fork
130
130
 
@@ -160,8 +160,8 @@ class Servolux::Prefork
160
160
  # left to the user to implement this functionality.
161
161
  #
162
162
  def initialize( opts = {}, &block )
163
- @timeout = opts[:timeout]
164
- @module = opts[:module]
163
+ @timeout = opts.fetch(:timeout, nil)
164
+ @module = opts.fetch(:module, nil)
165
165
  @module = Module.new { define_method :execute, &block } if block
166
166
  @workers = []
167
167
  @harvest = Queue.new
@@ -45,7 +45,7 @@ require 'thread'
45
45
  # just after the run loop thread has died; the +after_stopping+ method is
46
46
  # guarnteed to NOT be called till after the run loop thread is well and
47
47
  # truly dead.
48
- #
48
+ #
49
49
  # == Usage
50
50
  # For simple, quick and dirty servers just pass a block to the Server
51
51
  # initializer. This block will be used as the run method.
@@ -153,10 +153,10 @@ class Servolux::Server
153
153
  @mutex = Mutex.new
154
154
  @shutdown = nil
155
155
 
156
- self.logger = opts[:logger]
157
- self.pid_file = opts[:pid_file]
158
- self.pid_file_mode = opts[:pid_file_mode] || DEFAULT_PID_FILE_MODE
159
- self.interval = opts[:interval] || 0
156
+ self.logger = opts.fetch(:logger, nil)
157
+ self.pid_file = opts.fetch(:pid_file, nil)
158
+ self.pid_file_mode = opts.fetch(:pid_file_mode, DEFAULT_PID_FILE_MODE)
159
+ self.interval = opts.fetch(:interval, 0)
160
160
 
161
161
  if block
162
162
  eg = class << self; self; end
@@ -213,16 +213,23 @@ module Servolux::Threaded
213
213
 
214
214
  def stop
215
215
  self.running = false
216
- thread.wakeup
216
+ thread.wakeup if thread.alive?
217
217
  end # @private
218
218
 
219
219
  def run( threaded )
220
- loop {
220
+ loop do
221
221
  begin
222
222
  break unless running?
223
223
  threaded.run
224
- self.iterations += 1
225
- break if finished_iterations?
224
+
225
+ if maximum_iterations
226
+ self.iterations += 1
227
+ if finished_iterations?
228
+ self.running = false
229
+ break
230
+ end
231
+ end
232
+
226
233
  sleep interval if running?
227
234
  rescue SystemExit; raise
228
235
  rescue Exception => err
@@ -233,7 +240,7 @@ module Servolux::Threaded
233
240
  raise err
234
241
  end
235
242
  end
236
- }
243
+ end
237
244
  ensure
238
245
  if threaded.respond_to?(:after_stopping) and !self.running
239
246
  threaded.after_stopping
data/spec/child_spec.rb CHANGED
@@ -1,5 +1,5 @@
1
1
 
2
- require File.join(File.dirname(__FILE__), %w[spec_helper])
2
+ require File.expand_path('../spec_helper', __FILE__)
3
3
 
4
4
  describe Servolux::Child do
5
5
 
@@ -14,8 +14,8 @@ describe Servolux::Child do
14
14
  it 'has some sensible defaults' do
15
15
  @child.command.should be_nil
16
16
  @child.timeout.should be_nil
17
- @child.signals.should == %w[TERM QUIT KILL]
18
- @child.suspend.should == 4
17
+ @child.signals.should be == %w[TERM QUIT KILL]
18
+ @child.suspend.should be == 4
19
19
  @child.pid.should be_nil
20
20
  @child.io.should be_nil
21
21
  end
@@ -26,7 +26,7 @@ describe Servolux::Child do
26
26
 
27
27
  @child.pid.should_not be_nil
28
28
  @child.wait
29
- @child.io.read.strip.should == Dir.pwd
29
+ @child.io.read.strip.should be == Dir.pwd
30
30
  @child.success?.should be_true
31
31
  end
32
32
 
@@ -48,4 +48,3 @@ describe Servolux::Child do
48
48
 
49
49
  end
50
50
 
51
- # EOF
data/spec/daemon_spec.rb CHANGED
@@ -1,5 +1,5 @@
1
1
 
2
- require File.join(File.dirname(__FILE__), %w[spec_helper])
2
+ require File.expand_path('../spec_helper', __FILE__)
3
3
  require 'logger'
4
4
  require 'fileutils'
5
5
 
data/spec/piper_spec.rb CHANGED
@@ -1,5 +1,5 @@
1
1
 
2
- require File.join(File.dirname(__FILE__), %w[spec_helper])
2
+ require File.expand_path('../spec_helper', __FILE__)
3
3
 
4
4
  if Servolux.fork?
5
5
 
@@ -45,20 +45,20 @@ describe Servolux::Piper do
45
45
 
46
46
  @piper.parent {
47
47
  @piper.puts 'foo bar baz'
48
- @piper.gets.should == 'foo bar baz'
48
+ @piper.gets.should be == 'foo bar baz'
49
49
 
50
50
  @piper.puts %w[one two three]
51
- @piper.gets.should == %w[one two three]
51
+ @piper.gets.should be == %w[one two three]
52
52
 
53
- @piper.puts('Returns # of bytes written').should > 0
54
- @piper.gets.should == 'Returns # of bytes written'
53
+ @piper.puts('Returns # of bytes written').should be > 0
54
+ @piper.gets.should be == 'Returns # of bytes written'
55
55
 
56
56
  @piper.puts 1
57
57
  @piper.puts 2
58
58
  @piper.puts 3
59
- @piper.gets.should == 1
60
- @piper.gets.should == 2
61
- @piper.gets.should == 3
59
+ @piper.gets.should be == 1
60
+ @piper.gets.should be == 2
61
+ @piper.gets.should be == 3
62
62
 
63
63
  @piper.timeout = 0.1
64
64
  @piper.readable?.should be_false
@@ -82,13 +82,13 @@ describe Servolux::Piper do
82
82
  }
83
83
 
84
84
  @piper.parent {
85
- @piper.gets.should == :ready
85
+ @piper.gets.should be == :ready
86
86
 
87
87
  @piper.signal 'USR2'
88
- @piper.gets.should == "'USR2' was received"
88
+ @piper.gets.should be == "'USR2' was received"
89
89
 
90
90
  @piper.signal 'INT'
91
- @piper.gets.should == "'INT' was received"
91
+ @piper.gets.should be == "'INT' was received"
92
92
  }
93
93
  end
94
94
 
@@ -109,4 +109,3 @@ describe Servolux::Piper do
109
109
  end
110
110
  end # if Servolux.fork?
111
111
 
112
- # EOF
data/spec/prefork_spec.rb CHANGED
@@ -1,5 +1,5 @@
1
1
 
2
- require File.join(File.dirname(__FILE__), %w[spec_helper])
2
+ require File.expand_path('../spec_helper', __FILE__)
3
3
  require 'tempfile'
4
4
  require 'fileutils'
5
5
  require 'enumerator'
@@ -70,8 +70,8 @@ describe Servolux::Prefork do
70
70
  sleep 0.1 until worker_count >= 1
71
71
 
72
72
  ary = Dir.glob(@glob)
73
- ary.length.should == 1
74
- File.basename(ary.first).to_i.should == pids.first
73
+ ary.length.should be == 1
74
+ File.basename(ary.first).to_i.should be == pids.first
75
75
  end
76
76
 
77
77
  it "starts up a number of workers" do
@@ -82,10 +82,10 @@ describe Servolux::Prefork do
82
82
  sleep 0.250 until worker_count >= 8
83
83
 
84
84
  ary = Dir.glob(@glob)
85
- ary.length.should == 8
85
+ ary.length.should be == 8
86
86
 
87
87
  ary.map! { |fn| File.basename(fn).to_i }.sort!
88
- ary.should == pids.sort
88
+ ary.should be == pids.sort
89
89
  end
90
90
 
91
91
  it "stops workers gracefullly" do
@@ -96,13 +96,14 @@ describe Servolux::Prefork do
96
96
  sleep 0.250 until worker_count >= 3
97
97
 
98
98
  ary = Dir.glob(@glob)
99
- ary.length.should == 3
99
+ ary.length.should be == 3
100
100
 
101
101
  @prefork.stop
102
102
  sleep 0.250 until Dir.glob(@glob).length == 0
103
+ workers.each { |w| w.wait rescue nil }
103
104
 
104
105
  rv = workers.all? { |w| !w.alive? }
105
- rv.should == true
106
+ rv.should be == true
106
107
  end
107
108
 
108
109
  it "restarts a worker via SIGHUP" do
data/spec/server_spec.rb CHANGED
@@ -1,5 +1,5 @@
1
1
 
2
- require File.join(File.dirname(__FILE__), %w[spec_helper])
2
+ require File.expand_path('../spec_helper', __FILE__)
3
3
 
4
4
  describe Servolux::Server do
5
5
  base = Class.new(Servolux::Server) do
@@ -36,9 +36,9 @@ describe Servolux::Server do
36
36
  Thread.pass until @server.running? and t.status == 'sleep'
37
37
  test(?e, @server.pid_file).should be_true
38
38
 
39
- @log_output.readline.chomp.should == %q(DEBUG Servolux : Server "Test Server" creating pid file "test_server.pid")
40
- @log_output.readline.chomp.should == %q(DEBUG Servolux : Starting)
41
- (File.stat(@server.pid_file).mode & 0777).should == 0640
39
+ @log_output.readline.chomp.should be == %q(DEBUG Servolux : Server "Test Server" creating pid file "test_server.pid")
40
+ @log_output.readline.chomp.should be == %q(DEBUG Servolux : Starting)
41
+ (File.stat(@server.pid_file).mode & 0777).should be == 0640
42
42
 
43
43
  @server.shutdown
44
44
  Thread.pass until t.status == false
@@ -51,9 +51,9 @@ describe Servolux::Server do
51
51
  Thread.pass until @server.running? and t.status == 'sleep'
52
52
  test(?e, @server.pid_file).should be_true
53
53
 
54
- @log_output.readline.chomp.should == %q(DEBUG Servolux : Server "Test Server" creating pid file "test_server.pid")
55
- @log_output.readline.chomp.should == %q(DEBUG Servolux : Starting)
56
- (File.stat(@server.pid_file).mode & 0777).should == 0400
54
+ @log_output.readline.chomp.should be == %q(DEBUG Servolux : Server "Test Server" creating pid file "test_server.pid")
55
+ @log_output.readline.chomp.should be == %q(DEBUG Servolux : Starting)
56
+ (File.stat(@server.pid_file).mode & 0777).should be == 0400
57
57
 
58
58
  @server.shutdown
59
59
  Thread.pass until t.status == false
@@ -82,13 +82,13 @@ describe Servolux::Server do
82
82
  @log_output.readline
83
83
 
84
84
  Process.kill('USR1', $$)
85
- @log_output.readline.strip.should == 'INFO Servolux : usr1 was called'
85
+ @log_output.readline.strip.should be == 'INFO Servolux : usr1 was called'
86
86
 
87
87
  Process.kill('HUP', $$)
88
- @log_output.readline.strip.should == 'INFO Servolux : hup was called'
88
+ @log_output.readline.strip.should be == 'INFO Servolux : hup was called'
89
89
 
90
90
  Process.kill('USR2', $$)
91
- @log_output.readline.strip.should == 'INFO Servolux : usr2 was called'
91
+ @log_output.readline.strip.should be == 'INFO Servolux : usr2 was called'
92
92
 
93
93
  Process.kill('TERM', $$)
94
94
  Thread.pass until t.status == false
@@ -96,4 +96,3 @@ describe Servolux::Server do
96
96
  end
97
97
  end
98
98
 
99
- # EOF
@@ -1,5 +1,5 @@
1
1
 
2
- require File.join(File.dirname(__FILE__), %w[spec_helper])
2
+ require File.expand_path('../spec_helper', __FILE__)
3
3
 
4
4
  describe Servolux do
5
5
 
@@ -9,12 +9,11 @@ describe Servolux do
9
9
 
10
10
  it "finds things releative to 'lib'" do
11
11
  Servolux.libpath(%w[servolux threaded]).should == File.join(@root_dir, %w[lib servolux threaded])
12
- end
13
-
12
+ end
13
+
14
14
  it "finds things releative to 'root'" do
15
15
  Servolux.path('Rakefile').should == File.join(@root_dir, 'Rakefile')
16
- end
16
+ end
17
17
 
18
18
  end
19
19
 
20
- # EOF
data/spec/spec_helper.rb CHANGED
@@ -4,27 +4,17 @@ SERVOLUX_SPEC_HELPER = true
4
4
 
5
5
  require 'rubygems'
6
6
  require 'logging'
7
- require 'spec'
8
- require 'spec/logging_helper'
7
+ require 'rspec'
8
+ require 'rspec/logging_helper'
9
9
 
10
- require File.expand_path(
11
- File.join(File.dirname(__FILE__), %w[.. lib servolux]))
10
+ require File.expand_path('../../lib/servolux', __FILE__)
12
11
 
13
12
  include Logging.globally
14
13
 
15
- Spec::Runner.configure do |config|
16
- include Spec::LoggingHelper
14
+ RSpec.configure do |config|
15
+ include RSpec::LoggingHelper
17
16
  config.capture_log_messages
18
-
19
- # == Mock Framework
20
- #
21
- # RSpec uses it's own mocking framework by default. If you prefer to
22
- # use mocha, flexmock or RR, uncomment the appropriate line:
23
- #
24
- # config.mock_with :mocha
25
- # config.mock_with :flexmock
26
- # config.mock_with :rr
27
17
  end
28
18
 
29
19
  end # unless defined?
30
- # EOF
20
+
@@ -1,5 +1,5 @@
1
1
 
2
- require File.join(File.dirname(__FILE__), %w[spec_helper])
2
+ require File.expand_path('../spec_helper', __FILE__)
3
3
 
4
4
  describe Servolux::Threaded do
5
5
 
@@ -78,11 +78,11 @@ describe Servolux::Threaded do
78
78
  obj.ary = []
79
79
 
80
80
  obj.start
81
- obj.ary.should == [1,2]
81
+ obj.ary.should be == [1,2]
82
82
  obj.pass
83
83
 
84
84
  obj.stop.join(2)
85
- obj.ary.should == [1,2,3,4]
85
+ obj.ary.should be == [1,2,3,4]
86
86
  end
87
87
 
88
88
  it "dies when an exception is thrown" do
@@ -97,7 +97,7 @@ describe Servolux::Threaded do
97
97
 
98
98
  obj.running?.should be_false
99
99
  @log_output.readline
100
- @log_output.readline.chomp.should == "FATAL Object : <RuntimeError> ni"
100
+ @log_output.readline.chomp.should be == "FATAL Object : <RuntimeError> ni"
101
101
 
102
102
  lambda { obj.join }.should raise_error(RuntimeError, 'ni')
103
103
  end
@@ -124,7 +124,7 @@ describe Servolux::Threaded do
124
124
 
125
125
  obj.running?.should be_true
126
126
  @log_output.readline
127
- @log_output.readline.chomp.should == "ERROR Object : <RuntimeError> ni"
127
+ @log_output.readline.chomp.should be == "ERROR Object : <RuntimeError> ni"
128
128
 
129
129
  obj.stop.join(2)
130
130
  obj.running?.should be_false
@@ -136,27 +136,63 @@ describe Servolux::Threaded do
136
136
  obj.pass nil
137
137
 
138
138
  @log_output.readline
139
- @log_output.readline.chomp.should == "FATAL Object : <NotImplementedError> The run method must be defined by the threaded object."
139
+ @log_output.readline.chomp.should be == "FATAL Object : <NotImplementedError> The run method must be defined by the threaded object."
140
140
 
141
141
  lambda { obj.join }.should raise_error(NotImplementedError, 'The run method must be defined by the threaded object.')
142
142
  end
143
143
 
144
- it "stops after a limited number of iterations" do
145
- klass = Class.new( base ) do
146
- def run() ; end
144
+ # --------------------------------------------------------------------------
145
+ describe 'when setting maximum iterations' do
146
+
147
+ it "stops after a limited number of iterations" do
148
+ klass = Class.new( base ) do
149
+ def run() ; end
150
+ end
151
+
152
+ obj = klass.new
153
+ obj.maximum_iterations = 5
154
+ obj.iterations.should be == 0
155
+
156
+ obj.start
157
+ obj.wait
158
+ obj.iterations.should be == 5
159
+ end
160
+
161
+ it "runs the 'after_stopping' method" do
162
+ klass = Class.new( base ) do
163
+ attr_accessor :ary
164
+ def run() ; end
165
+ def after_stopping() ary << 4; end
166
+ end
167
+
168
+ obj = klass.new
169
+ obj.maximum_iterations = 5
170
+ obj.ary = []
171
+
172
+ obj.start
173
+ obj.wait
174
+ obj.ary.should be == [4]
175
+ end
176
+
177
+ it "should not increment iterations if maximum iterations has not been set" do
178
+ klass = Class.new( base ) do
179
+ def run() ; end
180
+ end
181
+
182
+ obj = klass.new
183
+ obj.iterations.should be == 0
184
+
185
+ obj.start
186
+ sleep 0.1
187
+ obj.stop.join(2)
188
+ obj.iterations.should be == 0
189
+ end
190
+
191
+ it "complains loudly if you attempt to set a maximum number of iterations < 1" do
192
+ obj = base.new
193
+ lambda { obj.maximum_iterations = -1 }.should raise_error( ArgumentError, "maximum iterations must be >= 1" )
147
194
  end
148
- obj = klass.new
149
- obj.maximum_iterations = 5
150
- obj.iterations.should == 0
151
- obj.start
152
- obj.wait
153
- obj.iterations.should == 5
154
- end
155
195
 
156
- it "complains loudly if you attempt to set a maximum number of iterations < 1" do
157
- obj = base.new
158
- lambda { obj.maximum_iterations = -1 }.should raise_error( ArgumentError, "maximum iterations must be >= 1" )
159
196
  end
160
197
  end
161
198
 
162
- # EOF
data/version.txt CHANGED
@@ -1 +1 @@
1
- 0.9.6
1
+ 0.9.7
metadata CHANGED
@@ -1,102 +1,77 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: servolux
3
- version: !ruby/object:Gem::Version
4
- hash: 55
5
- prerelease: false
6
- segments:
7
- - 0
8
- - 9
9
- - 6
10
- version: 0.9.6
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.9.7
5
+ prerelease:
11
6
  platform: ruby
12
- authors:
7
+ authors:
13
8
  - Tim Pease
14
9
  autorequire:
15
10
  bindir: bin
16
11
  cert_chain: []
17
-
18
- date: 2011-01-02 00:00:00 -07:00
19
- default_executable:
20
- dependencies:
21
- - !ruby/object:Gem::Dependency
12
+ date: 2012-01-19 00:00:00.000000000Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
22
15
  name: bones-rspec
23
- prerelease: false
24
- requirement: &id001 !ruby/object:Gem::Requirement
16
+ requirement: &2154204220 !ruby/object:Gem::Requirement
25
17
  none: false
26
- requirements:
27
- - - ">="
28
- - !ruby/object:Gem::Version
29
- hash: 19
30
- segments:
31
- - 1
32
- - 1
33
- - 0
34
- version: 1.1.0
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: 2.0.1
35
22
  type: :development
36
- version_requirements: *id001
37
- - !ruby/object:Gem::Dependency
38
- name: bones-git
39
23
  prerelease: false
40
- requirement: &id002 !ruby/object:Gem::Requirement
24
+ version_requirements: *2154204220
25
+ - !ruby/object:Gem::Dependency
26
+ name: bones-git
27
+ requirement: &2154203600 !ruby/object:Gem::Requirement
41
28
  none: false
42
- requirements:
43
- - - ">="
44
- - !ruby/object:Gem::Version
45
- hash: 27
46
- segments:
47
- - 1
48
- - 2
49
- - 2
50
- version: 1.2.2
29
+ requirements:
30
+ - - ! '>='
31
+ - !ruby/object:Gem::Version
32
+ version: 1.2.4
51
33
  type: :development
52
- version_requirements: *id002
53
- - !ruby/object:Gem::Dependency
54
- name: logging
55
34
  prerelease: false
56
- requirement: &id003 !ruby/object:Gem::Requirement
35
+ version_requirements: *2154203600
36
+ - !ruby/object:Gem::Dependency
37
+ name: logging
38
+ requirement: &2154203040 !ruby/object:Gem::Requirement
57
39
  none: false
58
- requirements:
59
- - - ">="
60
- - !ruby/object:Gem::Version
61
- hash: 1
62
- segments:
63
- - 1
64
- - 4
65
- - 3
66
- version: 1.4.3
40
+ requirements:
41
+ - - ! '>='
42
+ - !ruby/object:Gem::Version
43
+ version: 1.6.1
67
44
  type: :development
68
- version_requirements: *id003
69
- - !ruby/object:Gem::Dependency
70
- name: bones
71
45
  prerelease: false
72
- requirement: &id004 !ruby/object:Gem::Requirement
46
+ version_requirements: *2154203040
47
+ - !ruby/object:Gem::Dependency
48
+ name: bones
49
+ requirement: &2154202560 !ruby/object:Gem::Requirement
73
50
  none: false
74
- requirements:
75
- - - ">="
76
- - !ruby/object:Gem::Version
77
- hash: 27
78
- segments:
79
- - 3
80
- - 5
81
- - 4
82
- version: 3.5.4
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
54
+ version: 3.7.2
83
55
  type: :development
84
- version_requirements: *id004
85
- description: |-
86
- Serv-O-Lux is a collection of Ruby classes that are useful for daemon and
56
+ prerelease: false
57
+ version_requirements: *2154202560
58
+ description: ! 'Serv-O-Lux is a collection of Ruby classes that are useful for daemon
59
+ and
60
+
87
61
  process management, and for writing your own Ruby services. The code is well
62
+
88
63
  documented and tested. It works with Ruby and JRuby supporing both 1.8 and 1.9
89
- interpreters.
64
+
65
+ interpreters.'
90
66
  email: tim.pease@gmail.com
91
67
  executables: []
92
-
93
68
  extensions: []
94
-
95
- extra_rdoc_files:
69
+ extra_rdoc_files:
96
70
  - History.txt
97
71
  - README.rdoc
98
- - version.txt
99
- files:
72
+ files:
73
+ - .gitignore
74
+ - .travis.yml
100
75
  - History.txt
101
76
  - README.rdoc
102
77
  - Rakefile
@@ -119,40 +94,30 @@ files:
119
94
  - spec/spec_helper.rb
120
95
  - spec/threaded_spec.rb
121
96
  - version.txt
122
- has_rdoc: true
123
97
  homepage: http://gemcutter.org/gems/servolux
124
98
  licenses: []
125
-
126
99
  post_install_message:
127
- rdoc_options:
100
+ rdoc_options:
128
101
  - --main
129
102
  - README.rdoc
130
- require_paths:
103
+ require_paths:
131
104
  - lib
132
- required_ruby_version: !ruby/object:Gem::Requirement
105
+ required_ruby_version: !ruby/object:Gem::Requirement
133
106
  none: false
134
- requirements:
135
- - - ">="
136
- - !ruby/object:Gem::Version
137
- hash: 3
138
- segments:
139
- - 0
140
- version: "0"
141
- required_rubygems_version: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ! '>='
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ required_rubygems_version: !ruby/object:Gem::Requirement
142
112
  none: false
143
- requirements:
144
- - - ">="
145
- - !ruby/object:Gem::Version
146
- hash: 3
147
- segments:
148
- - 0
149
- version: "0"
113
+ requirements:
114
+ - - ! '>='
115
+ - !ruby/object:Gem::Version
116
+ version: '0'
150
117
  requirements: []
151
-
152
118
  rubyforge_project: servolux
153
- rubygems_version: 1.3.7
119
+ rubygems_version: 1.8.11
154
120
  signing_key:
155
121
  specification_version: 3
156
- summary: Serv-O-Lux is a collection of Ruby classes that are useful for daemon and process management, and for writing your own Ruby services.
122
+ summary: ! '* {Homepage}[http://rubygems.'
157
123
  test_files: []
158
-