pidly 0.1.0 → 0.1.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.
@@ -1,4 +1,9 @@
1
- === 0.1.0 / 2011-04-04
1
+ === 0.1.1 / 04/07/2011
2
+
3
+ * Bug fixes
4
+ * Added Pidly::Control#clean!
5
+
6
+ === 0.1.0 / 04/06/2011
2
7
 
3
8
  * Initial release:
4
9
 
data/README.md CHANGED
@@ -1,7 +1,7 @@
1
1
  # pidly
2
2
 
3
- * [Homepage][https://github.com/mephux/pidly]
4
- * [Documentation][http://rubydoc.info/gems/pidly/frames]
3
+ * [Homepage](https://github.com/mephux/pidly)
4
+ * [Documentation](http://rubydoc.info/github/mephux/pidly/master/frames)
5
5
 
6
6
  ## Description
7
7
 
@@ -10,34 +10,34 @@ daemon without getting in the way with forced verbose output and usage messages.
10
10
 
11
11
  ## Examples
12
12
 
13
- require 'pidly'
13
+ require 'pidly'
14
14
 
15
- class Test < Pidly::Control
15
+ class Test < Pidly::Control
16
16
 
17
- before_start do
18
- "BEFORE START #{@pid}"
19
- end
17
+ before_start do
18
+ puts "BEFORE START #{@pid}"
19
+ end
20
20
 
21
- start :when_daemon_starts
21
+ start :when_daemon_starts
22
22
 
23
- stop do
24
- "Attempting to kill process: #{@pid}"
25
- end
23
+ stop do
24
+ puts "Attempting to kill process: #{@pid}"
25
+ end
26
26
 
27
- after_stop :test_after_daemon_stops
27
+ after_stop :test_after_daemon_stops
28
28
 
29
- error do
30
- "SENDING EMAIL | Error Count: #{@error_count}"
31
- end
29
+ error do
30
+ puts "SENDING EMAIL | Error Count: #{@error_count}"
31
+ end
32
32
 
33
- def when_daemon_starts
34
- loop do
35
- print "TEST FROM #{@pid}"
36
- sleep 2
37
- end
38
- end
33
+ def when_daemon_starts
34
+ loop do
35
+ print "TEST FROM #{@pid}"
36
+ sleep 2
37
+ end
38
+ end
39
39
 
40
- end
40
+ end
41
41
 
42
42
  @daemon = Test.spawn(
43
43
  :name => 'Test Daemon',
@@ -46,11 +46,11 @@ daemon without getting in the way with forced verbose output and usage messages.
46
46
  )
47
47
 
48
48
  # @daemon.send ARGV.first
49
- @daemon.start # stop, status, restart, and kill.
49
+ @daemon.start # stop, status, restart, clean!, and kill.
50
50
 
51
51
  ## Install
52
52
 
53
- $ gem install pidly
53
+ $ gem install pidly
54
54
 
55
55
  ## Copyright
56
56
 
@@ -1,19 +1,19 @@
1
1
  module Pidly
2
2
  #
3
3
  # Pidly before/after callbacks
4
- #
4
+ #
5
5
  module Callbacks
6
-
6
+
7
7
  #
8
8
  # Before start
9
- #
10
- # Right before the daemon is instructed to start the
9
+ #
10
+ # Right before the daemon is instructed to start the
11
11
  # following callback will be invoked and executed.
12
- #
12
+ #
13
13
  # @param [Symbol] callback Method name
14
14
  # @yield [] Code to be executed upon callback invocation
15
15
  #
16
- # @example
16
+ # @example
17
17
  # before_start :method_name
18
18
  # # OR
19
19
  # before_start { puts "#{@pid} is about to start!" }
@@ -21,53 +21,53 @@ module Pidly
21
21
  def before_start(callback=nil, &block)
22
22
  add_callback(:before_start, (callback || block))
23
23
  end
24
-
24
+
25
25
  #
26
26
  # Start
27
- #
28
- # When the daemon is instructed to start the
27
+ #
28
+ # When the daemon is instructed to start the
29
29
  # following callback will be invoked and executed.
30
- #
30
+ #
31
31
  # @param [Symbol] callback Method name
32
32
  # @yield [] Code to be executed upon callback invocation
33
33
  #
34
- # @example
34
+ # @example
35
35
  # start :method_name
36
36
  # # OR
37
37
  # start { puts "Daemon Started!" }
38
- #
38
+ #
39
39
  def start(callback=nil, &block)
40
40
  add_callback(:start, (callback || block))
41
41
  end
42
-
42
+
43
43
  #
44
44
  # Stop
45
- #
46
- # When the daemon is instructed to stop the
45
+ #
46
+ # When the daemon is instructed to stop the
47
47
  # following callback will be invoked and executed.
48
- #
48
+ #
49
49
  # @param [Symbol] callback Method name
50
50
  # @yield [] Code to be executed upon callback invocation
51
- #
52
- # @example
51
+ #
52
+ # @example
53
53
  # stop :method_name
54
54
  # # OR
55
55
  # stop { puts "Attempting to stop #{@name} with pid #{@pid}!" }
56
- #
56
+ #
57
57
  def stop(callback=nil, &block)
58
58
  add_callback(:stop, (callback || block))
59
59
  end
60
-
60
+
61
61
  #
62
62
  # After stop
63
- #
64
- # Right after the daemon is instructed to stop the
63
+ #
64
+ # Right after the daemon is instructed to stop the
65
65
  # following callback will be invoked and executed.
66
- #
66
+ #
67
67
  # @param [Symbol] callback Method name
68
68
  # @yield [] Code to be executed upon callback invocation
69
69
  #
70
- # @example
70
+ # @example
71
71
  # after_start :method_name
72
72
  # # OR
73
73
  # after_start { puts "#{@pid} was just killed!" }
@@ -75,17 +75,17 @@ module Pidly
75
75
  def after_stop(callback=nil, &block)
76
76
  add_callback(:after_stop, (callback || block))
77
77
  end
78
-
78
+
79
79
  #
80
80
  # Error
81
- #
81
+ #
82
82
  # If the daemon encounters an error or an exception is raised
83
83
  # the following callback will be invoked and executed.
84
- #
84
+ #
85
85
  # @param [Symbol] callback Method name
86
86
  # @yield [] Code to be executed upon callback invocation
87
87
  #
88
- # @example
88
+ # @example
89
89
  # error :send_error_email
90
90
  # # OR
91
91
  # error { puts "ZOMG! #{@name} failed!" }
@@ -96,25 +96,26 @@ module Pidly
96
96
 
97
97
  #
98
98
  # Add callback
99
- #
99
+ #
100
100
  # @param [Symbol] callback Callback method name
101
101
  # @param [Symbol, nil] invoke Method to call
102
102
  # @yield [] Code to be executed upon callback invocation
103
- #
103
+ #
104
104
  def add_callback(callback, invoke)
105
- Control.class_variable_set(:"@@#{callback}", invoke)
105
+ Control.instance_eval do
106
+ class_variable_set(:"@@#{callback}", invoke)
107
+ end
106
108
  end
107
109
 
108
110
  #
109
111
  # Extend and include callback methods
110
- #
112
+ #
111
113
  # @param [Class] receiver The calling class
112
- #
114
+ #
113
115
  def self.included(receiver)
114
- puts receiver.class
115
116
  receiver.extend self
116
117
  end
117
118
 
118
119
  end # modle Callbacks
119
-
120
- end # module Pidly
120
+
121
+ end # module Pidly
@@ -16,7 +16,7 @@ module Pidly
16
16
 
17
17
  # Include callbacks
18
18
  include Pidly::Callbacks
19
-
19
+
20
20
  # Include logging helpers
21
21
  include Pidly::Logger
22
22
 
@@ -28,13 +28,13 @@ module Pidly
28
28
  # Initialize control object
29
29
  #
30
30
  # @param [Hash] options The options to create a controller with.
31
- #
32
- # @raise [RuntimeError]
31
+ #
32
+ # @raise [RuntimeError]
33
33
  # Raise exception if path does not exist
34
- #
35
- # @raise [RuntimeError]
34
+ #
35
+ # @raise [RuntimeError]
36
36
  # Raise exception if path is not readable or writable.
37
- #
37
+ #
38
38
  def initialize(options={})
39
39
 
40
40
  @messages = []
@@ -88,28 +88,28 @@ module Pidly
88
88
  # Spawn
89
89
  #
90
90
  # @param [Hash] options The options to create a controller with.
91
- #
91
+ #
92
92
  # @option options [String] :name Daemon name
93
- #
93
+ #
94
94
  # @option options [String] :path Path to create the log/pids directory
95
- #
95
+ #
96
96
  # @option options [String] :pid_file Pid file path
97
- #
97
+ #
98
98
  # @option options [String] :log_file Log file path
99
- #
99
+ #
100
100
  # @option options [true, false] :sync_log Synchronize log files
101
- #
102
- # @option options [true, false] :allow_multiple
101
+ #
102
+ # @option options [true, false] :allow_multiple
103
103
  # Allow multiple daemons of the same type
104
- #
104
+ #
105
105
  # @option options [true, false] :sync_log Synchronize log files
106
- #
106
+ #
107
107
  # @option options [String] :signal Trap signal
108
- #
108
+ #
109
109
  # @option options [Integer] :timeout Timeout for Process#wait
110
- #
110
+ #
111
111
  # @option options [true, false] :verbose Display daemon messages
112
- #
112
+ #
113
113
  # @option options [true, false] :logger Enable daemon logging
114
114
  #
115
115
  # @return [Control] Control object
@@ -117,12 +117,12 @@ module Pidly
117
117
  def self.spawn(options={})
118
118
  @daemon = new(options)
119
119
  end
120
-
120
+
121
121
  #
122
122
  # Start
123
- #
123
+ #
124
124
  # Validate callbacks and start daemon
125
- #
125
+ #
126
126
  def start
127
127
  validate_files_and_paths!
128
128
  validate_callbacks!
@@ -156,7 +156,7 @@ module Pidly
156
156
  STDOUT.reopen log
157
157
  STDERR.reopen STDOUT
158
158
  end
159
-
159
+
160
160
  trap("TERM") do
161
161
  stop
162
162
  end
@@ -181,12 +181,12 @@ module Pidly
181
181
  STDERR.puts message.backtrace
182
182
  execute_callback(:error)
183
183
  end
184
-
184
+
185
185
  #
186
186
  # Stop
187
- #
187
+ #
188
188
  # Stop daemon and remove pid file
189
- #
189
+ #
190
190
  def stop
191
191
 
192
192
  if running?
@@ -211,19 +211,19 @@ module Pidly
211
211
 
212
212
  else
213
213
  FileUtils.rm(@pid_file) if File.exists?(@pid_file)
214
- log(:info, "PID file not found. Is the daemon started?")
214
+ log(:info, "PID file not found.")
215
215
  end
216
216
 
217
217
  rescue Errno::ENOENT
218
218
  end
219
-
219
+
220
220
  #
221
221
  # Status
222
- #
222
+ #
223
223
  # Return current daemon status and pid
224
- #
224
+ #
225
225
  # @return [String] Status
226
- #
226
+ #
227
227
  def status
228
228
  if running?
229
229
  log(:info, "#{@name} is running (PID #{@pid})")
@@ -231,21 +231,21 @@ module Pidly
231
231
  log(:info, "#{@name} is NOT running")
232
232
  end
233
233
  end
234
-
234
+
235
235
  #
236
236
  # Restart
237
- #
237
+ #
238
238
  # Restart the daemon
239
- #
239
+ #
240
240
  def restart
241
241
  stop; sleep 1 while running?; start
242
242
  end
243
-
243
+
244
244
  #
245
245
  # Kill
246
- #
246
+ #
247
247
  # @param [String] remove_pid_file Remove the daemon pid file
248
- #
248
+ #
249
249
  def kill(remove_pid_file=true)
250
250
  if running?
251
251
  log(:info, "Killing #{@name} (PID #{@pid})")
@@ -255,12 +255,12 @@ module Pidly
255
255
  FileUtils.rm(@pid_file) if remove_pid_file
256
256
  rescue Errno::ENOENT
257
257
  end
258
-
258
+
259
259
  #
260
260
  # Running?
261
- #
261
+ #
262
262
  # @return [true, false] Return the running status of the daemon.
263
- #
263
+ #
264
264
  def running?
265
265
  Process.kill 0, @pid
266
266
  true
@@ -271,7 +271,18 @@ module Pidly
271
271
  rescue
272
272
  false
273
273
  end
274
-
274
+
275
+ #
276
+ # Clean
277
+ #
278
+ # Remove all files created by the daemon.
279
+ #
280
+ def clean!
281
+ FileUtils.rm(@log_file)
282
+ FileUtils.rm(@pid_file)
283
+ rescue Errno::ENOENT
284
+ end
285
+
275
286
  def validate_files_and_paths!
276
287
  log = Pathname.new(@log_file).dirname
277
288
  pid = Pathname.new(@pid_file).dirname
@@ -294,8 +305,7 @@ module Pidly
294
305
  def execute_callback(callback_name)
295
306
  @error_count += 1 if callback_name == :error
296
307
 
297
- if Control.class_variable_defined?(:"@@#{callback_name}")
298
- callback = Control.class_variable_get(:"@@#{callback_name}")
308
+ if (callback = fetch_class_var(callback_name))
299
309
 
300
310
  if callback.kind_of?(Symbol)
301
311
 
@@ -323,8 +333,17 @@ module Pidly
323
333
  nil
324
334
  end
325
335
 
336
+ def fetch_class_var(name)
337
+ if Control.class_variable_defined?(:"@@#{name}")
338
+ Control.instance_eval do
339
+ return class_variable_get(:"@@#{name}")
340
+ end
341
+ end
342
+ end
343
+
326
344
  private :validate_callbacks!, :fetch_pid,
327
- :validate_files_and_paths!, :execute_callback
345
+ :validate_files_and_paths!, :execute_callback,
346
+ :fetch_class_var
328
347
 
329
348
  end # class Control
330
349
 
@@ -1,4 +1,4 @@
1
1
  module Pidly
2
2
  # pidly version
3
- VERSION = "0.1.0"
3
+ VERSION = "0.1.1"
4
4
  end
@@ -17,49 +17,51 @@ describe Control do
17
17
  it "should be running" do
18
18
  @daemon.running?.should == true
19
19
  end
20
-
20
+
21
21
  it "should have an active status, name and pid" do
22
22
  @daemon.status
23
23
  reply = "#{@daemon.name} is running (PID #{@daemon.pid})"
24
24
  @daemon.messages.last.should == reply
25
25
  end
26
-
26
+
27
27
  it "should have the correct pid path" do
28
28
  @daemon.pid_file.should == "/tmp/pids/#{@daemon.name}.pid"
29
29
  end
30
-
30
+
31
31
  it "should have a pid file that exists" do
32
32
  File.exists?("/tmp/pids/#{@daemon.name}.pid").should == true
33
33
  end
34
-
34
+
35
35
  it "should have the correct log file" do
36
36
  @daemon.log_file.should == "/tmp/logs/#{@daemon.name}.log"
37
37
  end
38
-
38
+
39
39
  it "should have a log file that exists" do
40
40
  File.exists?("/tmp/logs/#{@daemon.name}.log").should == true
41
41
  end
42
-
42
+
43
43
  it "should fail when trying to start another daemon" do
44
44
  @daemon.start
45
45
  reply = "#{@daemon.name} is already running (PID #{@daemon.pid})"
46
-
46
+
47
47
  @daemon.messages.last.should == reply
48
48
  end
49
-
49
+
50
50
  it "should write to the log file" do
51
51
  file = File.open(@daemon.log_file, 'r')
52
52
  file.read.should =~ /TEST FROM #{@daemon.pid}/
53
53
  end
54
-
54
+
55
55
  it "should write to the pid file" do
56
56
  file = File.open(@daemon.pid_file, 'r')
57
57
  file.read.should =~ /#{@daemon.pid}/
58
58
  end
59
-
59
+
60
60
  after(:all) do
61
- @daemon.kill if @daemon
62
- FileUtils.rm @daemon.log_file.to_s
61
+ if @daemon
62
+ @daemon.kill
63
+ @daemon.clean!
64
+ end
63
65
  end
64
66
 
65
67
  end
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: pidly
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.1.0
5
+ version: 0.1.1
6
6
  platform: ruby
7
7
  authors:
8
8
  - Dustin Willis Webber
@@ -10,7 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2011-04-06 00:00:00 -04:00
13
+ date: 2011-04-07 00:00:00 -04:00
14
14
  default_executable:
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
@@ -99,7 +99,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
99
99
  requirements: []
100
100
 
101
101
  rubyforge_project: pidly
102
- rubygems_version: 1.6.1
102
+ rubygems_version: 1.5.0
103
103
  signing_key:
104
104
  specification_version: 3
105
105
  summary: A super simple daemon library.