djinn 0.0.5 → 0.0.6

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/README.rdoc CHANGED
@@ -1,10 +1,10 @@
1
- = djinn
1
+ = Djinn
2
2
 
3
- Djinn is a very basic helper for building simple daemons
3
+ Djinn is a very basic helper for building simple daemons.
4
4
 
5
5
  == Non-Rails Example
6
6
 
7
- #!/usr/bin/env ruby
7
+ #!/usr/bin/env ruby
8
8
 
9
9
  require 'rubygems'
10
10
  require 'djinn'
@@ -41,9 +41,32 @@ this is the general idea:
41
41
  sleep(10)
42
42
  djinn.stop
43
43
 
44
+ Assuming you didn't sleep there your script would end and the daemon would
45
+ detach and run in the background until it dies or gets killed. You can wrap
46
+ argument parsing around that if you want, or do it in any other way. By default
47
+ the daemon will look for a config YAML file in same directory as you executed it
48
+ from, named the same as the Djinn class, so in this case _basic.yml_. It will by
49
+ default create the pid and log files in the same way. You can change this by
50
+ putting it in the config file or supplying an options hash:
51
+
52
+ options = {
53
+ 'pid_file_path' => 'path/to/pid/file',
54
+ 'log_file_path' => 'path/to/log/file'
55
+ }
56
+
57
+ djinn.start(options)
58
+
59
+ These options will also be passed to your *perform* method, so you can include
60
+ anything you need in the hash as well, or in the YAML file for that matter.
61
+
62
+ It might seem ugly, but the solution is minimal, and so remains flexible I think.
63
+ The rails daemon helpers are an implementation on top of this illustrating how it
64
+ can be tailored to include some option parsing and so forth, and so do a little
65
+ more for you.
66
+
44
67
  == Rails Example
45
68
 
46
- There's a nice example in the example directory if you check the code out, but
69
+ There's a simple example in the example directory if you check the code out, but
47
70
  here's the gist of it.
48
71
 
49
72
  Assumes a scenario where you have a Book model that keeps a count of how many
@@ -51,12 +74,12 @@ times a book has been read.
51
74
 
52
75
  Create a file in RAILS_ROOT/lib or somewhere similar:
53
76
 
54
- BOOK_WORKER_INTERVAL = 5
77
+ require 'djinn/rails'
55
78
 
56
79
  class BookDjinn
57
-
58
- require 'djinn/rails'
59
-
80
+
81
+ BOOK_WORKER_INTERVAL = 5
82
+
60
83
  include Djinn::Rails
61
84
 
62
85
  def perform config
@@ -80,16 +103,16 @@ Create a file in RAILS_ROOT/lib or somewhere similar:
80
103
  Right, now you need to start it somehow. The easiest way is to create a file
81
104
  in RAILS_ROOT/scripts and pop this in it:
82
105
 
83
- #!/usr/bin/env ruby
84
- require 'rubygems'
85
- require File.join(File.dirname(__FILE__), '../lib/book_djinn')
86
- BookDjinn.go ARGV
106
+ #!/usr/bin/env ruby
107
+ require 'rubygems'
108
+ require File.join(File.dirname(__FILE__), '../lib/book_djinn')
109
+ BookDjinn.go ARGV
87
110
 
88
111
  Righto, now start it from RAILS_ROOT:
89
112
 
90
113
  ruby script/book_djinn
91
114
 
92
- Okay, but that defaults to "run", which starts it in the foreground and also
115
+ Okay, but that defaults to _run_, which starts it in the foreground and also
93
116
  uses the rails development environment by default. Try this:
94
117
 
95
118
  ruby script/book_djinn --help
@@ -107,7 +130,7 @@ and monitor it with god or a similar process monitor.
107
130
 
108
131
  == TODO
109
132
 
110
- Lots. Keep 'em peeled.
133
+ Lots. Keep 'em peeled.
111
134
 
112
135
  == Copyright
113
136
 
data/Rakefile CHANGED
@@ -13,9 +13,14 @@ begin
13
13
  gem.add_development_dependency "shoulda", ">= 2.11.1"
14
14
  gem.files.exclude 'example/**/*'
15
15
  gem.test_files.exclude 'example/**/*'
16
+ gem.has_rdoc = true
17
+ gem.rubyforge_project = 'djinn'
16
18
  # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
17
19
  end
18
20
  Jeweler::GemcutterTasks.new
21
+ Jeweler::RubyforgeTasks.new do |rubyforge|
22
+ rubyforge.doc_task = "rdoc"
23
+ end
19
24
  rescue LoadError
20
25
  puts "Jeweler (or a dependency) not available. Install it with: gem install jeweler"
21
26
  end
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.5
1
+ 0.0.6
data/djinn.gemspec CHANGED
@@ -5,7 +5,7 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{djinn}
8
- s.version = "0.0.5"
8
+ s.version = "0.0.6"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Craig Paterson"]
@@ -37,6 +37,7 @@ Gem::Specification.new do |s|
37
37
  s.homepage = %q{http://github.com/craigp/djinn}
38
38
  s.rdoc_options = ["--charset=UTF-8"]
39
39
  s.require_paths = ["lib"]
40
+ s.rubyforge_project = %q{djinn}
40
41
  s.rubygems_version = %q{1.3.7}
41
42
  s.summary = %q{Helper for creating simple custom daemons}
42
43
  s.test_files = [
data/lib/djinn.rb CHANGED
@@ -1,5 +1,7 @@
1
1
  require 'djinn/base'
2
2
 
3
+ # This is a base implementation which handles looking for config
4
+ # files and sets up the default locations for pid and log files
3
5
  module Djinn
4
6
 
5
7
  include Djinn::Base
data/lib/djinn/base.rb CHANGED
@@ -5,6 +5,7 @@ require 'pid_file'
5
5
  require 'logging'
6
6
 
7
7
  module Djinn
8
+ # The base class from which all Djinn spring forth
8
9
  module Base
9
10
 
10
11
  include Djinn::Tonic
@@ -12,8 +13,9 @@ module Djinn
12
13
 
13
14
  attr_reader :config
14
15
 
16
+ # Base implementation does nothing worthwhile, you should override this
17
+ # in your own implementation
15
18
  def perform config={}
16
- # base implementation does nothing worthwhile
17
19
  trap('TERM') { handle_exit }
18
20
  trap('INT') { handle_exit }
19
21
  while true
@@ -22,11 +24,13 @@ module Djinn
22
24
  end
23
25
  end
24
26
 
27
+ # Override this with useful exit code if you need to, but remember to
28
+ # call *super* or call *exit* yourself, or your Djinn will be immortal
25
29
  def handle_exit
26
- # override this with useful exit code if you need it
27
30
  exit(0)
28
31
  end
29
32
 
33
+ # Starts the Djinn in the background
30
34
  def start config={}
31
35
  @config = (config.empty?) ? load_config : config.empty?
32
36
  log "Starting #{name} in the background.."
@@ -38,6 +42,8 @@ module Djinn
38
42
  end
39
43
  end
40
44
 
45
+ # Starts the Djinn in the foreground, which is often useful for
46
+ # testing or other noble pursuits
41
47
  def run config={}
42
48
  @config = (config.empty?) ? load_config : config.empty?
43
49
  log "Starting #{name} in the foreground.."
@@ -46,13 +52,17 @@ module Djinn
46
52
  perform(config)
47
53
  end
48
54
 
49
- def restart
55
+ # Convenience method, really just calls *stop* and then *start* for you :P
56
+ def restart config={}
50
57
  stop
51
- start
58
+ start(config)
52
59
  end
53
60
 
54
- def stop
55
- pidfile = get_pidfile(load_config)
61
+ # Stops the Djinn, unless you change the location of the pid file, in
62
+ # which case its all about you and the *kill* command
63
+ def stop config={}
64
+ @config = (config.empty?) ? load_config : config.empty?
65
+ pidfile = get_pidfile(@config)
56
66
  log 'No such process' and exit unless pidfile.pid
57
67
  begin
58
68
  log "Sending TERM signal to process #{pidfile.pid}"
@@ -66,12 +76,15 @@ module Djinn
66
76
 
67
77
  protected
68
78
 
79
+ # The name used to identify the Djinn, for pid and log file
80
+ # naming, as well as finding default config files
69
81
  def name
70
82
  underscore(self.class.name)
71
83
  end
72
84
 
73
85
  private
74
86
 
87
+ # Shamelessly stolen from the Rails source
75
88
  def underscore(camel_cased_word)
76
89
  camel_cased_word.to_s.gsub(/::/, '/').
77
90
  gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: djinn
3
3
  version: !ruby/object:Gem::Version
4
- hash: 21
4
+ hash: 19
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 5
10
- version: 0.0.5
9
+ - 6
10
+ version: 0.0.6
11
11
  platform: ruby
12
12
  authors:
13
13
  - Craig Paterson
@@ -89,7 +89,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
89
89
  version: "0"
90
90
  requirements: []
91
91
 
92
- rubyforge_project:
92
+ rubyforge_project: djinn
93
93
  rubygems_version: 1.3.7
94
94
  signing_key:
95
95
  specification_version: 3