daemon_objects 0.1.9 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +1 -0
- data/Gemfile +0 -3
- data/README.md +31 -13
- data/daemon_objects.gemspec +1 -0
- data/lib/daemon_objects/base.rb +32 -10
- data/lib/daemon_objects/consumer_base.rb +5 -3
- data/lib/daemon_objects/logging.rb +1 -1
- data/lib/daemon_objects/tasks/daemon_objects.rake +3 -3
- data/lib/daemon_objects/version.rb +1 -1
- data/spec/lib/daemon_objects/base_spec.rb +131 -3
- data/spec/lib/daemon_objects/consumer_base_spec.rb +22 -1
- data/spec/lib/daemon_objects/logging_spec.rb +7 -24
- data/spec/spec_helper.rb +3 -0
- metadata +18 -4
- data/spec/support/stub_logger.rb +0 -23
data/.gitignore
CHANGED
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -5,10 +5,10 @@
|
|
5
5
|
|
6
6
|
Daemon Objects is designed to simplify using daemons in your ruby applications. Under the hood, it uses the
|
7
7
|
[daemons](http://daemons.rubyforge.org) gem, which is a mature and tested solution. But, it adds support for managing via rake tasks,
|
8
|
-
error handling and instrumentation.
|
8
|
+
error handling and instrumentation.
|
9
9
|
|
10
|
-
The [daemons](http://daemons.rubyforge.org) gem also is intended to be used to daemonize a ruby script. DaemonObjects provides an
|
11
|
-
object-oriented framework for developing daemons. This allows the application developer to focus on the specific behavior of the daemon
|
10
|
+
The [daemons](http://daemons.rubyforge.org) gem also is intended to be used to daemonize a ruby script. DaemonObjects provides an
|
11
|
+
object-oriented framework for developing daemons. This allows the application developer to focus on the specific behavior of the daemon
|
12
12
|
instead of the infrastructure of daemon management.
|
13
13
|
|
14
14
|
## Installation
|
@@ -27,7 +27,7 @@ Or install it yourself as:
|
|
27
27
|
|
28
28
|
## Usage
|
29
29
|
|
30
|
-
DaemonObjects will create daemons based on a simple convention. It will search a directory for files name \*Daemon.rb. These typically
|
30
|
+
DaemonObjects will create daemons based on a simple convention. It will search a directory for files name \*Daemon.rb. These typically
|
31
31
|
will just inherit from the base Daemon class.
|
32
32
|
|
33
33
|
class MyDaemon < DaemonObjects::Base; end
|
@@ -37,7 +37,7 @@ This provides the basic daemon control methods (start, stop, run and restart) to
|
|
37
37
|
To add behavior to your daemon, you will need a consumer. DaemonObjects will load the consumer using the name of the daemon and
|
38
38
|
will search in the same directory for it. For example, if your daemon is name MyDaemon, the consumer should be named MyConsumer.
|
39
39
|
|
40
|
-
A consumer needs to inherit from the consumer base and implement run. For example,
|
40
|
+
A consumer needs to inherit from the consumer base and implement run. For example,
|
41
41
|
|
42
42
|
class MyConsumer < DaemonObjects::ConsumerBase
|
43
43
|
|
@@ -50,6 +50,25 @@ A consumer needs to inherit from the consumer base and implement run. For examp
|
|
50
50
|
|
51
51
|
end
|
52
52
|
|
53
|
+
### Environment
|
54
|
+
|
55
|
+
You can pass an environment argument to the consumer in two ways. If the project is
|
56
|
+
using Rails, it will automatically use `Rails.env`. Otherwise, you can use the
|
57
|
+
`DAEMON_ENV` environment variable.
|
58
|
+
|
59
|
+
### Application directory
|
60
|
+
|
61
|
+
Application directory can be set a number of ways. If the project is using Rails, the
|
62
|
+
application directory is `Rails.root`. If the task was started with Rake, it will be
|
63
|
+
`Rake.original_dir`. You can also override this value by defining an `app_directory`
|
64
|
+
method in the `DaemonBase` subclass.
|
65
|
+
|
66
|
+
class MyDaemon < DaemonObjects::Base
|
67
|
+
def app_directory
|
68
|
+
"/some/other/directory"
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
53
72
|
### Rake tasks
|
54
73
|
|
55
74
|
Once you have defined the daemon, you can control it with rake tasks. To access the rake tasks,
|
@@ -74,22 +93,19 @@ Four commands are supported
|
|
74
93
|
|
75
94
|
### Amqp Support
|
76
95
|
|
77
|
-
|
96
|
+
DaemonObjects also has support for monitoring amqp queues. This is done with the bunny gem. To support this with your daemon, add `consumes_amqp` to your daemon class, one pair of daemon/consumer classes per queue you wish to support. Queues are constructed as 'durable' by default.
|
78
97
|
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
class MyQueueProcessingDaemon < Daemon::Base
|
83
|
-
supports_amqp :endpoint => "http://localhost:5672",
|
98
|
+
class MyQueueProcessingDaemon < DaemonObjects::Base
|
99
|
+
consumes_amqp :endpoint => "http://localhost:5672",
|
84
100
|
:queue_name => "my_awesome_queue"
|
85
101
|
end
|
86
102
|
|
87
103
|
This will add the code to monitor the queue, so all you need now is code to handle the messages.
|
88
104
|
|
89
|
-
class MyQueueProcessingConsumer <
|
105
|
+
class MyQueueProcessingConsumer < DaemonObjects::ConsumerBase
|
90
106
|
|
91
107
|
handle_messages_with do |payload|
|
92
|
-
puts
|
108
|
+
puts payload
|
93
109
|
end
|
94
110
|
|
95
111
|
end
|
@@ -99,6 +115,8 @@ This will add the code to monitor the queue, so all you need now is code to hand
|
|
99
115
|
DaemonObjects will create a new log file for your daemon using the pattern _daemon\_file\_name_\_daemon.log. In a rails project,
|
100
116
|
this will be created in the log directory of your application.
|
101
117
|
|
118
|
+
If the daemon does not have access to create the log, it will log errors to /tmp/_daemon_name_.output.
|
119
|
+
|
102
120
|
### Support for third-party libraries
|
103
121
|
|
104
122
|
DaemonObjects supports the following third-party libraries. If they are required in your application, your daemon will use them.
|
data/daemon_objects.gemspec
CHANGED
data/lib/daemon_objects/base.rb
CHANGED
@@ -17,8 +17,16 @@ class DaemonObjects::Base
|
|
17
17
|
logger.info "Worker class is '#{worker_class}'"
|
18
18
|
end
|
19
19
|
|
20
|
+
def self.app_directory
|
21
|
+
@app_directory ||= (defined? Rails) ? Rails.root : Rake.original_dir
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.environment
|
25
|
+
@environment ||= (defined? Rails) ? Rails.env : ENV["DAEMON_ENV"]
|
26
|
+
end
|
27
|
+
|
20
28
|
def self.pid_directory
|
21
|
-
|
29
|
+
File.join(app_directory, "tmp/pids")
|
22
30
|
end
|
23
31
|
|
24
32
|
def self.consumer_class
|
@@ -30,16 +38,27 @@ class DaemonObjects::Base
|
|
30
38
|
end
|
31
39
|
|
32
40
|
def self.get_consumer
|
33
|
-
consumer_class.new(logger)
|
41
|
+
consumer_class.new(:logger => logger, :app_directory => app_directory, :environment => environment)
|
42
|
+
rescue Exception => e
|
43
|
+
logger.error("An exception occured while instantiating the consumer #{consumer_class}. Startup will be aborted.")
|
44
|
+
logger.error("Error: #{e.class}")
|
45
|
+
logger.error("Message: #{e.message}")
|
46
|
+
logger.error(e.backtrace.join("\n"))
|
47
|
+
Airbrake.notify(e) if defined?(Airbrake)
|
48
|
+
raise e
|
34
49
|
end
|
35
50
|
|
36
51
|
def self.run
|
37
|
-
|
52
|
+
begin
|
53
|
+
get_consumer.run
|
54
|
+
rescue StandardError => e
|
55
|
+
handle_error(e)
|
56
|
+
end
|
38
57
|
end
|
39
58
|
|
40
59
|
def self.after_fork
|
41
60
|
# daemonizing closes all file handles, so this will reopen the log
|
42
|
-
force_logger_reset
|
61
|
+
force_logger_reset
|
43
62
|
# this seems to be enough to initialize NewRelic if it's defined
|
44
63
|
defined?(NewRelic)
|
45
64
|
end
|
@@ -50,20 +69,18 @@ class DaemonObjects::Base
|
|
50
69
|
|
51
70
|
FileUtils.mkdir_p(pid_directory)
|
52
71
|
|
53
|
-
Daemons.run_proc(proc_name,
|
72
|
+
Daemons.run_proc(proc_name,
|
54
73
|
{ :ARGV => ["start", "-f"],
|
55
74
|
:log_dir => "/tmp",
|
56
75
|
:dir => pid_directory,
|
57
76
|
:log_output => true}) do
|
58
|
-
|
77
|
+
|
59
78
|
after_fork
|
60
|
-
run
|
79
|
+
run
|
61
80
|
end
|
62
81
|
|
63
82
|
rescue StandardError => e
|
64
|
-
|
65
|
-
logger.error(e.backtrace.join("\n"))
|
66
|
-
Airbrake.notify(e) if defined?(Airbrake)
|
83
|
+
handle_error(e)
|
67
84
|
end
|
68
85
|
|
69
86
|
def self.stop
|
@@ -75,4 +92,9 @@ class DaemonObjects::Base
|
|
75
92
|
stop
|
76
93
|
end
|
77
94
|
|
95
|
+
def self.handle_error(e)
|
96
|
+
logger.error(e.message)
|
97
|
+
logger.error(e.backtrace.join("\n"))
|
98
|
+
Airbrake.notify(e) if defined?(Airbrake)
|
99
|
+
end
|
78
100
|
end
|
@@ -6,10 +6,12 @@ class DaemonObjects::ConsumerBase
|
|
6
6
|
attr_accessor :message_handler
|
7
7
|
end
|
8
8
|
|
9
|
-
|
9
|
+
attr_reader :logger, :app_directory, :environment
|
10
10
|
|
11
|
-
def initialize(
|
12
|
-
@logger
|
11
|
+
def initialize(opts)
|
12
|
+
@logger = opts[:logger]
|
13
|
+
@app_directory = opts[:app_directory]
|
14
|
+
@environment = opts[:environment]
|
13
15
|
end
|
14
16
|
|
15
17
|
def run
|
@@ -9,20 +9,20 @@ namespace :daemon do
|
|
9
9
|
"or use run to run the daemon in the foreground"
|
10
10
|
|
11
11
|
[:start, :stop, :run].each do |action|
|
12
|
-
task action
|
12
|
+
task action do
|
13
|
+
Rake::Task[:environment].invoke if Rake::Task.task_defined?(:environment)
|
13
14
|
|
14
15
|
require "daemon_objects"
|
15
16
|
require "#{DaemonObjects.daemon_path}/#{daemon}_daemon.rb"
|
16
17
|
require "#{DaemonObjects.daemon_path}/#{daemon}_consumer.rb"
|
17
18
|
|
18
|
-
|
19
19
|
puts "#{description} #{action}"
|
20
20
|
daemon_class = "#{daemon}_daemon".camelcase.constantize
|
21
21
|
daemon_class.send(action)
|
22
22
|
end
|
23
23
|
end
|
24
24
|
|
25
|
-
task :restart => [:
|
25
|
+
task :restart => [:stop, :start]
|
26
26
|
end
|
27
27
|
end
|
28
28
|
|
@@ -7,6 +7,80 @@ describe DaemonObjects::Base do
|
|
7
7
|
end
|
8
8
|
end
|
9
9
|
|
10
|
+
describe '#app_directory' do
|
11
|
+
it 'should be Rake.original_directory if Rails is not defined' do
|
12
|
+
Rake.stub(:original_dir).and_return("/mydir")
|
13
|
+
MyDaemon = Class.new(DaemonObjects::Base)
|
14
|
+
MyDaemon.app_directory.should == Rake.original_dir
|
15
|
+
end
|
16
|
+
|
17
|
+
context 'Rails' do
|
18
|
+
before :each do
|
19
|
+
Rails = Module.new do
|
20
|
+
def self.root
|
21
|
+
"/mydir"
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
after :each do
|
27
|
+
Object.send(:remove_const, :Rails)
|
28
|
+
end
|
29
|
+
|
30
|
+
it 'should be Rails.root is Rails is defined' do
|
31
|
+
MyDaemon = Class.new(DaemonObjects::Base)
|
32
|
+
MyDaemon.app_directory.should == Rails.root
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
it 'should allow app_directory to be set explicitly' do
|
37
|
+
MyDaemon = Class.new(DaemonObjects::Base) do
|
38
|
+
def app_directory
|
39
|
+
"."
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
describe '#environment' do
|
46
|
+
context 'Rails' do
|
47
|
+
before :each do
|
48
|
+
Rails = Module.new do
|
49
|
+
def self.env
|
50
|
+
"railsenv"
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
after :each do
|
56
|
+
Object.send(:remove_const, :Rails)
|
57
|
+
end
|
58
|
+
|
59
|
+
it 'should use Rails.env if Rails is defined' do
|
60
|
+
MyDaemon = Class.new(DaemonObjects::Base)
|
61
|
+
MyDaemon.environment.should == Rails.env
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
context 'Env variable set' do
|
66
|
+
before :each do
|
67
|
+
ENV["DAEMON_ENV"] = "daemonenv"
|
68
|
+
end
|
69
|
+
after :each do
|
70
|
+
ENV["DAEMON_ENV"] = nil
|
71
|
+
end
|
72
|
+
it 'should use environment variable if Rails is not defined' do
|
73
|
+
MyDaemon = Class.new(DaemonObjects::Base)
|
74
|
+
MyDaemon.environment.should == ENV["DAEMON_ENV"]
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
it 'should be nil if not Rails and no environment set' do
|
79
|
+
MyDaemon = Class.new(DaemonObjects::Base)
|
80
|
+
MyDaemon.environment.should be_nil
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
10
84
|
describe '#extends' do
|
11
85
|
it 'should extend logging' do
|
12
86
|
MyDaemon = Class.new(DaemonObjects::Base)
|
@@ -19,11 +93,11 @@ describe DaemonObjects::Base do
|
|
19
93
|
MyConsumer = Class.new(DaemonObjects::ConsumerBase)
|
20
94
|
|
21
95
|
MyDaemon = Class.new(DaemonObjects::Base) do
|
22
|
-
self.logger =
|
96
|
+
self.logger = MemoryLogger::Logger.new
|
23
97
|
end
|
24
98
|
|
25
99
|
MyDaemon.run
|
26
|
-
MyDaemon.logger.logged_output.should =~ /Starting consumer
|
100
|
+
MyDaemon.logger.logged_output.should =~ /Starting consumer/
|
27
101
|
end
|
28
102
|
|
29
103
|
end
|
@@ -55,7 +129,7 @@ describe DaemonObjects::Base do
|
|
55
129
|
|
56
130
|
describe '##consumer_class' do
|
57
131
|
it 'should constantize a file with multiple part name' do
|
58
|
-
ThreePartNameConsumer = Class.new
|
132
|
+
ThreePartNameConsumer = Class.new
|
59
133
|
ThreePartNameDaemon = Class.new(DaemonObjects::Base)
|
60
134
|
ThreePartNameDaemon.consumer_class.should == ThreePartNameConsumer
|
61
135
|
end
|
@@ -68,6 +142,60 @@ describe DaemonObjects::Base do
|
|
68
142
|
end
|
69
143
|
end
|
70
144
|
|
145
|
+
describe '##get_consumer' do
|
146
|
+
|
147
|
+
|
148
|
+
it 'should log exceptions during consumer instantiation' do
|
149
|
+
TestConsumer = Class.new(DaemonObjects::ConsumerBase) do
|
150
|
+
def initialize(logger)
|
151
|
+
super
|
152
|
+
raise StandardError.new("Test")
|
153
|
+
end
|
154
|
+
end
|
155
|
+
TestDaemon = Class.new(DaemonObjects::Base) do
|
156
|
+
self.logger = MemoryLogger::Logger.new
|
157
|
+
end
|
158
|
+
|
159
|
+
expect {TestDaemon.get_consumer}.to raise_error(StandardError)
|
160
|
+
TestDaemon.logger.logged_output =~ /Message: Test/
|
161
|
+
end
|
162
|
+
|
163
|
+
let(:consumer) { MyDaemon.get_consumer }
|
164
|
+
|
165
|
+
before :each do
|
166
|
+
MyConsumer = Class.new(DaemonObjects::ConsumerBase)
|
167
|
+
MyDaemon = Class.new(DaemonObjects::Base)
|
168
|
+
end
|
169
|
+
|
170
|
+
after :each do
|
171
|
+
Object.send(:remove_const, :MyDaemon)
|
172
|
+
Object.send(:remove_const, :MyConsumer)
|
173
|
+
end
|
174
|
+
|
175
|
+
it 'should set environment' do
|
176
|
+
def MyDaemon.environment
|
177
|
+
"theenv"
|
178
|
+
end
|
179
|
+
|
180
|
+
consumer.environment.should == "theenv"
|
181
|
+
end
|
182
|
+
|
183
|
+
it 'should set app directory' do
|
184
|
+
def MyDaemon.app_directory
|
185
|
+
"thedir"
|
186
|
+
end
|
187
|
+
|
188
|
+
consumer.app_directory.should == "thedir"
|
189
|
+
end
|
190
|
+
|
191
|
+
it 'should set logger' do
|
192
|
+
logger = MemoryLogger::Logger.new
|
193
|
+
MyDaemon.stub(:logger).and_return(logger)
|
194
|
+
|
195
|
+
consumer.logger.should == logger
|
196
|
+
end
|
197
|
+
end
|
198
|
+
|
71
199
|
describe 'AMQP support' do
|
72
200
|
let(:endpoint){ }
|
73
201
|
|
@@ -16,11 +16,32 @@ describe DaemonObjects::ConsumerBase do
|
|
16
16
|
handle_messages_with{|p| payloads_received << p }
|
17
17
|
end
|
18
18
|
|
19
|
-
h = Harness.new(
|
19
|
+
h = Harness.new(:logger => MemoryLogger::Logger.new)
|
20
20
|
h.handle_message({:x => 1})
|
21
21
|
|
22
22
|
h.payloads_received.should == [{:x => 1}]
|
23
23
|
end
|
24
24
|
end
|
25
|
+
|
26
|
+
describe '#initialize' do
|
27
|
+
let(:logger) { MemoryLogger::Logger.new }
|
28
|
+
let(:harness) { Class.new(DaemonObjects::ConsumerBase) }
|
29
|
+
|
30
|
+
it 'should set logger' do
|
31
|
+
h = harness.new(:logger => logger)
|
32
|
+
h.logger.should == logger
|
33
|
+
end
|
34
|
+
|
35
|
+
it 'should set app_directory' do
|
36
|
+
h = harness.new(:app_directory => 'app_dir')
|
37
|
+
h.app_directory.should == 'app_dir'
|
38
|
+
end
|
39
|
+
|
40
|
+
it 'should set environment' do
|
41
|
+
h = harness.new(:environment => 'environment')
|
42
|
+
h.environment.should == 'environment'
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
25
46
|
|
26
47
|
end
|
@@ -4,12 +4,16 @@ describe DaemonObjects::Logging do
|
|
4
4
|
let(:harness) do
|
5
5
|
Class.new do
|
6
6
|
extend DaemonObjects::Logging
|
7
|
+
|
8
|
+
def self.app_directory
|
9
|
+
"."
|
10
|
+
end
|
7
11
|
end
|
8
12
|
end
|
9
13
|
|
10
14
|
describe '#logger' do
|
11
15
|
it 'should create a logger at log/log_filename path' do
|
12
|
-
logger =
|
16
|
+
logger = MemoryLogger::Logger.new
|
13
17
|
|
14
18
|
Logger.stub(:new).
|
15
19
|
with("#{harness.log_directory}/#{harness.log_filename}").
|
@@ -17,7 +21,7 @@ describe DaemonObjects::Logging do
|
|
17
21
|
|
18
22
|
harness.logger.info("starting consumer")
|
19
23
|
|
20
|
-
logger.logged_output.should =~ /starting consumer
|
24
|
+
logger.logged_output.should =~ /starting consumer/
|
21
25
|
end
|
22
26
|
end
|
23
27
|
|
@@ -46,29 +50,8 @@ describe DaemonObjects::Logging do
|
|
46
50
|
|
47
51
|
describe '#log_directory' do
|
48
52
|
it "should use 'log' for default log path" do
|
49
|
-
harness.log_directory.to_s.should == "log"
|
50
|
-
end
|
51
|
-
|
52
|
-
context 'with rails' do
|
53
|
-
before :each do
|
54
|
-
unless defined?(Rails)
|
55
|
-
module Rails
|
56
|
-
def self.root
|
57
|
-
"/root"
|
58
|
-
end
|
59
|
-
end
|
60
|
-
end
|
61
|
-
end
|
62
|
-
|
63
|
-
after :each do
|
64
|
-
Object.send(:remove_const, :Rails)
|
65
|
-
end
|
66
|
-
|
67
|
-
it 'should use Rails log path when Rails is defined' do
|
68
|
-
harness.log_directory.to_s.should == File.join(Rails.root, "log")
|
69
|
-
end
|
53
|
+
harness.log_directory.to_s.should == File.join(harness.app_directory, "log")
|
70
54
|
end
|
71
|
-
|
72
55
|
end
|
73
56
|
|
74
57
|
|
data/spec/spec_helper.rb
CHANGED
@@ -5,6 +5,8 @@
|
|
5
5
|
#
|
6
6
|
# See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
|
7
7
|
require 'pry'
|
8
|
+
require 'memory_logger'
|
9
|
+
|
8
10
|
SPEC_PATH = File.dirname(__FILE__)
|
9
11
|
Dir[File.join(SPEC_PATH, "support/**/*.rb")].each{|f| require f}
|
10
12
|
|
@@ -22,4 +24,5 @@ RSpec.configure do |config|
|
|
22
24
|
config.order = 'random'
|
23
25
|
end
|
24
26
|
|
27
|
+
require 'rake'
|
25
28
|
require File.join(File.dirname(__FILE__), "../lib/daemon_objects.rb")
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: daemon_objects
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2014-
|
12
|
+
date: 2014-11-17 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: daemons
|
@@ -107,6 +107,22 @@ dependencies:
|
|
107
107
|
- - ! '>='
|
108
108
|
- !ruby/object:Gem::Version
|
109
109
|
version: '0'
|
110
|
+
- !ruby/object:Gem::Dependency
|
111
|
+
name: memory_logger
|
112
|
+
requirement: !ruby/object:Gem::Requirement
|
113
|
+
none: false
|
114
|
+
requirements:
|
115
|
+
- - ~>
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: 0.0.3
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
none: false
|
122
|
+
requirements:
|
123
|
+
- - ~>
|
124
|
+
- !ruby/object:Gem::Version
|
125
|
+
version: 0.0.3
|
110
126
|
description: ! ' A light-weight approach to creating and managing daemons in an object-oriented
|
111
127
|
way. Supports any type of daemon, but provides additional support for consuming
|
112
128
|
AMQP queues. '
|
@@ -143,7 +159,6 @@ files:
|
|
143
159
|
- spec/lib/daemon_objects/runner_spec.rb
|
144
160
|
- spec/lib/daemon_objects_spec.rb
|
145
161
|
- spec/spec_helper.rb
|
146
|
-
- spec/support/stub_logger.rb
|
147
162
|
homepage: http://github.com/craigisrael/daemon_objects
|
148
163
|
licenses:
|
149
164
|
- MIT
|
@@ -178,4 +193,3 @@ test_files:
|
|
178
193
|
- spec/lib/daemon_objects/runner_spec.rb
|
179
194
|
- spec/lib/daemon_objects_spec.rb
|
180
195
|
- spec/spec_helper.rb
|
181
|
-
- spec/support/stub_logger.rb
|
data/spec/support/stub_logger.rb
DELETED
@@ -1,23 +0,0 @@
|
|
1
|
-
class StubLogger
|
2
|
-
|
3
|
-
attr_accessor :logger
|
4
|
-
|
5
|
-
def method_missing(sym, *args, &block)
|
6
|
-
logger.send(sym, *args, &block)
|
7
|
-
end
|
8
|
-
|
9
|
-
def initialize
|
10
|
-
@io = StringIO.new
|
11
|
-
|
12
|
-
require 'logger'
|
13
|
-
@logger = Logger.new(@io)
|
14
|
-
end
|
15
|
-
|
16
|
-
def logged_output
|
17
|
-
@io.string
|
18
|
-
end
|
19
|
-
|
20
|
-
def messages
|
21
|
-
logged_output.split("\n")
|
22
|
-
end
|
23
|
-
end
|