raad 0.4.1 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -14,6 +14,13 @@
14
14
  - tested on MRI 1.8.7 & 1.9.2, REE 1.8.7, JRuby 1.6.4 under OSX 10.6.8 and Linux Ubuntu 10.04
15
15
 
16
16
  # 0.4.1, 09-22-2011
17
- - allow arbitrary environment name
17
+ - issue #1, allow arbitrary environment name, https://github.com/praized/raad/issues/1
18
+ - issue #3, avoid calling stop multiple times, https://github.com/praized/raad/issues/3
18
19
  - added Raad.stopped?
19
- - avoid calling stop multiple times, https://github.com/praized/raad/issues/3
20
+
21
+ # 0.5.0, 10-12-2011
22
+ - issue #4, allow logger usage in service initialize method, https://github.com/praized/raad/issues/4
23
+ - issue #7, Raad.env not correct in service.initialize, https://github.com/praized/raad/issues/7
24
+ - refactored Runner initialize/run/start_service methods
25
+ - custom options now uses options_parser class method in the service
26
+ - added examples/custom_options.rb
data/README.md CHANGED
@@ -1,5 +1,4 @@
1
- # Raad v0.4.0
2
-
1
+ # Raad v0.5.0
3
2
  Raad - Ruby as a daemon lightweight service wrapper.
4
3
 
5
4
  Raad is a non-intrusive, lightweight, simple Ruby daemon wrapper. Basically any class which implements
@@ -14,22 +13,20 @@ logging module and benefit easy log file output while daemonized.
14
13
  ## Installation
15
14
 
16
15
  ### Gem
17
-
18
16
  ``` sh
19
17
  $ gem install raad
20
18
  ```
21
19
 
22
20
  ### Bundler
23
- #### Latest from github
24
21
 
22
+ #### Latest from github
25
23
  ``` sh
26
24
  gem "raad", :git => "git://github.com/praized/raad.git", :branch => "master"
27
25
  ```
28
26
 
29
27
  #### Released gem
30
-
31
28
  ``` bash
32
- gem "raad", "~> 0.4.0"
29
+ gem "raad", "~> 0.5.0"
33
30
  ```
34
31
 
35
32
  ## Example
@@ -42,14 +39,15 @@ require 'raad'
42
39
 
43
40
  class SimpleDaemon
44
41
  def start
42
+ Raad::Logger.debug("SimpleDaemon start")
45
43
  while !Raad.stopped?
46
- Raad::Logger.info("simple_daemon running")
44
+ Raad::Logger.info("SimpleDaemon running")
47
45
  sleep(1)
48
46
  end
49
47
  end
50
48
 
51
49
  def stop
52
- Raad::Logger.info("simple_daemon stopped")
50
+ Raad::Logger.debug("SimpleDaemon stop")
53
51
  end
54
52
  end
55
53
  ```
@@ -87,7 +85,7 @@ There are two ways to know when your service has been instructed to stop:
87
85
 
88
86
  There are basically 3 ways to run execute your service:
89
87
 
90
- * start it in foreground console mode, useful for debugging, `^C` to execute the stop sequence
88
+ * start it in foreground console mode, useful for debugging, `^C` to trigger the stop sequence
91
89
 
92
90
  ``` sh
93
91
  $ ruby your_service.rb start
@@ -134,14 +132,103 @@ Raad has been tested on MRI 1.8.7, MRI 1.9.2, REE 1.8.7, JRuby 1.6.4 under OSX 1
134
132
  -h, --help display help message
135
133
 
136
134
  Note that the command line options will always override any config file settings if present.
137
- ### Configuration and options
138
- tbd.
139
135
 
140
- ### Adding custom command line options
136
+ #### -e, --environment NAME
137
+ Raad provides a way to pass an **arbritary** environment name on the command line. This environment name can later be retrieved in your code using the following methods:
138
+
139
+ * `Raad.env` will return the **symbolized** environment name passed on the command line.
140
+ * `Raad.test?` will return `true` if the enviroment name passed on the command line was `test`.
141
+ * `Raad.development?` will return `true` if the enviroment name passed on the command line was `development` or `dev`.
142
+ * `Raad.stage?` will return `true` if the enviroment name passed on the command line was `stage` or `staging`.
143
+ * `Raad.production?` will return `true` if the enviroment name passed on the command line was `production` or `prod`.
144
+
145
+ Example:
146
+
147
+ ``` sh
148
+ $ ruby your_service.rb -e foobar start
149
+ ```
150
+
151
+ ``` ruby
152
+ if Raad.env == :foobar
153
+ # do foobar stuff
154
+ end
155
+
156
+ if Raad.production?
157
+ # never get here
158
+ end
159
+ ```
160
+
161
+ ### Custom command line options
162
+ It is possible to add **custom** command line options to your service, in addition to Raad own command line options. To handle custom command line options simply define a `self.options_parser` **class method** in your service class. This method will be passed a [OptionParser](http://apidock.com/ruby/OptionParser) object into which you can add your rules plus also a Hash to set the parsed options values. The OptionParser object must be returned.
163
+
164
+ Check complete example file [examples/custom_options.rb](https://github.com/praized/raad/blob/master/examples/custom_options.rb)
165
+
166
+ Example:
167
+
168
+ ``` ruby
169
+ # options_parser must be a class method
170
+ #
171
+ # @param raad_parser [OptionParser] raad options parser to which custom options rules can be added
172
+ # @param parsed_options [Hash] set parsing results into this hash. retrieve it later in your code using Raad.custom_options
173
+ # @return [OptionParser] the modified options parser must be returned
174
+ def self.options_parser(raad_parser, parsed_options)
175
+ raad_parser.separator "Your service options:"
176
+
177
+ raad_parser.on('-a', '--aoption PARAM', "some a option parameter") { |val| parsed_options[:aoption] = val }
178
+ raad_parser.on('-b', '--boption PARAM', "some b option parameter") { |val| parsed_options[:boption] = val }
179
+
180
+ raad_parser
181
+ end
182
+ ```
183
+
184
+ The parsed options values can later be retrieved in your code using `Raad.custom_options` which will hold the Hash as set in your `options_parser` class method.
185
+
186
+ ``` ruby
187
+ do_this if Raad.custom_options[:aoption] == 'a option parameter value'
188
+ ```
189
+
190
+ ``` sh
191
+ $ ruby your_service.rb -h
192
+
193
+ usage: ruby <service>.rb [options] start|stop
194
+
195
+ Raad common options:
196
+ -e, --environment NAME set the execution environment (default: development)
197
+ -l, --log FILE log to file (default: in console mode: no, daemonized: <service>.log)
198
+ -s, --stdout log to stdout (default: in console mode: true, daemonized: false)
199
+ -v, --verbose enable verbose logging (default: false)
200
+ --pattern PATTERN log4r log formatter pattern
201
+ -c, --config FILE config file (default: ./config/<service>.rb)
202
+ -d, --daemonize run daemonized in the background (default: false)
203
+ -P, --pid FILE pid file when daemonized (default: <service>.pid)
204
+ -r, --redirect FILE redirect stdout to FILE when daemonized (default: no)
205
+ -n, --name NAME daemon process name (default: <service>)
206
+ --timeout SECONDS seconds to wait before force stopping the service (default: 60)
207
+ -h, --help display help message
208
+
209
+ Your service options:
210
+ -a, --aoption PARAM some a option parameter
211
+ -b, --boption PARAM some b option parameter
212
+ ```
213
+
214
+ ### Configuration and options
141
215
  tbd.
142
216
 
143
217
  ### Logging
144
- tbd.
218
+ Raad uses Log4r for logging and provides hooks for logging in your service. Here's an example of how to use Raad logging:
219
+
220
+ ``` ruby
221
+ Raad::Logger.debug("this is a message with level DEBUG")
222
+ Raad::Logger.info("this is a message with level INFO")
223
+ Raad::Logger.warn("this is a message with level WARN")
224
+ Raad::Logger.error("this is a message with level ERROR")
225
+ Raad::Logger.fatal("this is a message with level FATAL")
226
+ ```
227
+
228
+ * By default, Raad will output log messages of level `INFO` **and higher**.
229
+ * If the `-v, --verbose` command line option is used, Raad will output **all** log messages (level `DEBUG` **and higher**).
230
+
231
+ Alternatively, the log output level can be set in your service using the `Raad::Logger.level=` method. The valid levels parameter are `:debug`, `:info`, `:warn` and `:error`.
145
232
 
146
233
  ### Stop sequence details
147
234
  tbd.
@@ -40,11 +40,8 @@ module Raad
40
40
  #
41
41
  # @return [Nil]
42
42
  def self.run!
43
- file = File.basename(service_file, '.rb')
44
- service = Object.module_eval(camel_case(file)).new
45
-
46
- runner = Runner.new(ARGV, service)
47
- runner.run
43
+ service_class = Object.module_eval(camel_case(File.basename(service_file, '.rb')))
44
+ Runner.new(ARGV, service_class).run
48
45
  end
49
46
 
50
47
  private
@@ -4,6 +4,7 @@ require 'thread'
4
4
  module Raad
5
5
 
6
6
  @env = :development
7
+ @custom_options = {}
7
8
  @stopped = false
8
9
  @stop_lock = Mutex.new
9
10
 
@@ -83,6 +84,13 @@ module Raad
83
84
  @stop_lock.synchronize{@stopped = !!state}
84
85
  end
85
86
 
86
- module_function :env, :env=, :production?, :development?, :stage?, :test?, :jruby?, :ruby_path, :stopped?, :stopped=
87
+ # returns the custom options hash set in the service options_parser class method
88
+ #
89
+ # @return [Hash] custom options hash
90
+ def custom_options
91
+ @custom_options
92
+ end
93
+
94
+ module_function :env, :env=, :production?, :development?, :stage?, :test?, :jruby?, :ruby_path, :stopped?, :stopped=, :custom_options
87
95
 
88
96
  end
@@ -38,7 +38,6 @@ module Raad
38
38
  #
39
39
  # @param log [Logger] The logger to add file logging too
40
40
  # @param log_format [Log4r::Formatter] The log format to use
41
- # @return [Nil]
42
41
  def setup_file_logger(log, log_format, file)
43
42
  FileUtils.mkdir_p(File.dirname(file))
44
43
 
@@ -53,7 +52,6 @@ module Raad
53
52
  #
54
53
  # @param log [Logger] The logger to add stdout logging too
55
54
  # @param log_format [Log4r::Formatter] The log format to use
56
- # @return [Nil]
57
55
  def setup_stdout_logger(log, log_format)
58
56
  @log.add(Log4r::StdoutOutputter.new('console', :formatter => log_format))
59
57
  end
@@ -9,56 +9,62 @@ module Raad
9
9
  SECOND = 1
10
10
  STOP_TIMEOUT = 60 * SECOND
11
11
 
12
- attr_accessor :service, :pid_file, :options
12
+ attr_accessor :pid_file
13
13
 
14
14
  # Create a new Runner
15
15
  #
16
16
  # @param argv [Array] command line arguments
17
- # @param service [Object] service to execute
18
- def initialize(argv, service)
17
+ # @param service_class [Class] service class
18
+ def initialize(argv, service_class)
19
19
  @argv = argv.dup # lets keep a copy for jruby double-launch
20
- create_options_parser(service).parse!(argv)
20
+ @service_class = service_class
21
+ @parsed_options = nil
21
22
 
22
- # start/stop
23
- @options[:command] = argv[0].to_s.downcase
24
- unless ['start', 'stop', 'post_fork'].include?(options[:command])
23
+ @stop_lock = Mutex.new
24
+ @stop_signaled = false
25
+
26
+ # parse command line options and set @parsed_options
27
+ options_parser = service_class.respond_to?(:options_parser) ? service_class.options_parser(create_options_parser, Raad.custom_options) : create_options_parser
28
+ begin
29
+ options_parser.parse!(argv)
30
+ rescue OptionParser::InvalidOption => e
31
+ puts(">> #{e.message}")
32
+ exit!(false)
33
+ end
34
+
35
+ # grab what's left after options, which should be the start/stop command
36
+ @parsed_options[:command] = argv[0].to_s.downcase
37
+ unless ['start', 'stop', 'post_fork'].include?(@parsed_options[:command])
25
38
  puts(">> start|stop command is required")
26
39
  exit!(false)
27
40
  end
28
41
 
29
- @service = service
30
- @service_name = nil
31
- @logger_options = nil
32
- @pid_file = nil
42
+ # load config if present
43
+ Configuration.load(@parsed_options[:config] || File.expand_path("./config/#{default_service_name(service_class)}.rb"))
33
44
 
34
- @stop_lock = Mutex.new
35
- @stop_signaled = false
36
- end
45
+ # default service name
46
+ @service_name = @parsed_options[:name] || Configuration.daemon_name || default_service_name(service_class)
37
47
 
38
- def run
39
- # first load config if present
40
- Configuration.load(options[:config] || File.expand_path("./config/#{default_service_name}.rb"))
48
+ # @pid_file is required to become Daemonizable
49
+ @pid_file = @parsed_options.delete(:pid_file) || "./#{@service_name}.pid"
41
50
 
42
- # settings which depends on configuration
43
- @service_name = options[:name] || Configuration.daemon_name || default_service_name
51
+ # default stop timeout
52
+ @stop_timeout = (@parsed_options.delete(:stop_timeout) || Configuration.stop_timeout || STOP_TIMEOUT).to_i
44
53
 
45
- unless options[:log_file]
46
- options[:log_file] = (options[:daemonize] ? File.expand_path("#{@service_name}.log") : nil)
47
- end
48
- unless options[:log_stdout]
49
- options[:log_stdout] = !options[:daemonize]
50
- end
54
+ # logger options
55
+ @parsed_options[:log_file] = (@parsed_options[:daemonize] ? File.expand_path("#{@service_name}.log") : nil) unless @parsed_options[:log_file]
56
+ @parsed_options[:log_stdout] = !@parsed_options[:daemonize] unless @parsed_options[:log_stdout]
51
57
  @logger_options = {
52
- :file => options.delete(:log_file) || Configuration.log_file,
53
- :stdout => options.delete(:log_stdout) || Configuration.log_stdout,
54
- :verbose => options.delete(:verbose) || Configuration.verbose,
55
- :pattern => options.delete(:log_pattern) || Configuration.log_pattern,
58
+ :file => @parsed_options.delete(:log_file) || Configuration.log_file,
59
+ :stdout => @parsed_options.delete(:log_stdout) || Configuration.log_stdout,
60
+ :verbose => @parsed_options.delete(:verbose) || Configuration.verbose,
61
+ :pattern => @parsed_options.delete(:log_pattern) || Configuration.log_pattern,
56
62
  }
57
- @pid_file = options.delete(:pid_file) || "./#{@service_name}.pid"
58
- @stop_timeout = (options.delete(:stop_timeout) || Configuration.stop_timeout || STOP_TIMEOUT).to_i
63
+ end
59
64
 
65
+ def run
60
66
  # check for stop command, @pid_file must be set
61
- if options[:command] == 'stop'
67
+ if @parsed_options[:command] == 'stop'
62
68
  puts(">> Raad service wrapper v#{VERSION} stopping")
63
69
  # first send the TERM signal which will invoke the daemon wait_or_will method which will timeout after @stop_timeout
64
70
  # if still not stopped afer @stop_timeout + 2 seconds, KILL -9 will be sent.
@@ -66,28 +72,31 @@ module Raad
66
72
  exit(success)
67
73
  end
68
74
 
69
- # setup logging
70
- Logger.setup(@logger_options)
71
- Logger.level = Configuration.log_level if Configuration.log_level
72
-
73
75
  Dir.chdir(File.expand_path(File.dirname("./"))) unless Raad.test?
74
76
 
75
- if options[:command] == 'post_fork'
77
+ if @parsed_options[:command] == 'post_fork'
76
78
  # we've been spawned and re executed, finish setup
77
- post_fork_setup(@service_name, options[:redirect])
78
- run_service
79
+ post_fork_setup(@service_name, @parsed_options[:redirect])
80
+ start_service
79
81
  else
80
82
  puts(">> Raad service wrapper v#{VERSION} starting")
81
- options[:daemonize] ? daemonize(@argv, @service_name, options[:redirect]) {run_service} : run_service
83
+ @parsed_options[:daemonize] ? daemonize(@argv, @service_name, @parsed_options[:redirect]) {start_service} : start_service
82
84
  end
83
85
  end
84
86
 
85
87
  private
86
88
 
87
- # Run the service
88
- #
89
- # @return nil
90
- def run_service
89
+ def start_service
90
+ # setup logging
91
+ Logger.setup(@logger_options)
92
+ Logger.level = Configuration.log_level if Configuration.log_level
93
+
94
+ Logger.debug("initializing #{@service_name} service")
95
+
96
+ # create service instance
97
+ service = @service_class.new
98
+
99
+ # important to display this after service instantiation which can set Raad.env
91
100
  Logger.info("starting #{@service_name} service in #{Raad.env.to_s} mode")
92
101
 
93
102
  at_exit do
@@ -95,24 +104,24 @@ module Raad
95
104
  end
96
105
 
97
106
  # do not trap :QUIT because its not supported in jruby
98
- [:INT, :TERM].each{|sig| SignalTrampoline.trap(sig) {stop_service}}
107
+ [:INT, :TERM].each{|sig| SignalTrampoline.trap(sig) {stop_service(service)}}
99
108
 
100
109
  # launch the service thread and call start. we expect start not to return
101
110
  # unless it is done or has been stopped.
102
111
  service_thread = Thread.new do
103
112
  Thread.current.abort_on_exception = true
104
113
  service.start
105
- stop_service
114
+ stop_service(service)
106
115
  end
107
116
 
108
117
  result = wait_or_kill(service_thread)
109
118
  # if not daemonized start a sentinel thread, if still alive after 2 seconds, do arakiri
110
- Thread.new{sleep(2 * SECOND); Process.kill(:KILL, Process.pid)} unless options[:daemonize]
119
+ Thread.new{sleep(2 * SECOND); Process.kill(:KILL, Process.pid)} unless @parsed_options[:daemonize]
111
120
  # use exit and not exit! to make sure the at_exit hooks are called, like the pid cleanup, etc.
112
121
  exit(result)
113
122
  end
114
123
 
115
- def stop_service
124
+ def stop_service(service)
116
125
  return if @stop_lock.synchronize{s = @stop_signaled; @stop_signaled = true; s}
117
126
 
118
127
  Logger.info("stopping #{@service_name} service")
@@ -150,15 +159,15 @@ module Raad
150
159
  # convert the service class name from CameCase to underscore
151
160
  #
152
161
  # @return [String] underscored service class name
153
- def default_service_name
154
- service.class.to_s.split('::').last.gsub(/(.)([A-Z])/,'\1_\2').downcase!
162
+ def default_service_name(clazz)
163
+ clazz.to_s.split('::').last.gsub(/(.)([A-Z])/,'\1_\2').downcase!
155
164
  end
156
165
 
157
166
  # Create the options parser
158
167
  #
159
168
  # @return [OptionParser] Creates the options parser for the runner with the default options
160
- def create_options_parser(service)
161
- @options ||= {
169
+ def create_options_parser
170
+ @parsed_options ||= {
162
171
  :daemonize => false,
163
172
  :verbose => false,
164
173
  }
@@ -171,21 +180,22 @@ module Raad
171
180
 
172
181
  opts.on('-e', '--environment NAME', "set the execution environment (default: #{Raad.env.to_s})") { |val| Raad.env = val }
173
182
 
174
- opts.on('-l', '--log FILE', "log to file (default: in console mode: no, daemonized: <service>.log)") { |file| @options[:log_file] = file }
175
- opts.on('-s', '--stdout', "log to stdout (default: in console mode: true, daemonized: false)") { |v| @options[:log_stdout] = v }
176
- opts.on('-v', '--verbose', "enable verbose logging (default: #{@options[:verbose]})") { |v| @options[:verbose] = v }
177
- opts.on('--pattern PATTERN', "log4r log formatter pattern") { |v| @options[:log_pattern] = v }
183
+ opts.on('-l', '--log FILE', "log to file (default: in console mode: no, daemonized: <service>.log)") { |file| @parsed_options[:log_file] = file }
184
+ opts.on('-s', '--stdout', "log to stdout (default: in console mode: true, daemonized: false)") { |v| @parsed_options[:log_stdout] = v }
185
+ opts.on('-v', '--verbose', "enable verbose logging (default: #{@parsed_options[:verbose]})") { |v| @parsed_options[:verbose] = v }
186
+ opts.on('--pattern PATTERN', "log4r log formatter pattern") { |v| @parsed_options[:log_pattern] = v }
178
187
 
179
- opts.on('-c', '--config FILE', "config file (default: ./config/<service>.rb)") { |v| @options[:config] = v }
180
- opts.on('-d', '--daemonize', "run daemonized in the background (default: #{@options[:daemonize]})") { |v| @options[:daemonize] = v }
181
- opts.on('-P', '--pid FILE', "pid file when daemonized (default: <service>.pid)") { |file| @options[:pid_file] = file }
182
- opts.on('-r', '--redirect FILE', "redirect stdout to FILE when daemonized (default: no)") { |v| @options[:redirect] = v }
183
- opts.on('-n', '--name NAME', "daemon process name (default: <service>)") { |v| @options[:name] = v }
184
- opts.on('--timeout SECONDS', "seconds to wait before force stopping the service (default: 60)") { |v| @options[:stop_timeout] = v }
188
+ opts.on('-c', '--config FILE', "config file (default: ./config/<service>.rb)") { |v| @parsed_options[:config] = v }
189
+ opts.on('-d', '--daemonize', "run daemonized in the background (default: #{@parsed_options[:daemonize]})") { |v| @parsed_options[:daemonize] = v }
190
+ opts.on('-P', '--pid FILE', "pid file when daemonized (default: <service>.pid)") { |file| @parsed_options[:pid_file] = file }
191
+ opts.on('-r', '--redirect FILE', "redirect stdout to FILE when daemonized (default: no)") { |v| @parsed_options[:redirect] = v }
192
+ opts.on('-n', '--name NAME', "daemon process name (default: <service>)") { |v| @parsed_options[:name] = v }
193
+ opts.on('--timeout SECONDS', "seconds to wait before force stopping the service (default: 60)") { |v| @parsed_options[:stop_timeout] = v }
185
194
 
186
- opts.on('-h', '--help', 'display help message') { show_options(opts) }
195
+ opts.on('-h', '--help', 'display help message') { show_options(options_parser) }
187
196
  end
188
- service.respond_to?(:options_parser) ? service.options_parser(options_parser) : options_parser
197
+
198
+ options_parser
189
199
  end
190
200
 
191
201
  # Output the servers options and exit Ruby
@@ -1,3 +1,3 @@
1
1
  module Raad
2
- VERSION = "0.4.1"
2
+ VERSION = "0.5.0"
3
3
  end unless defined?(Raad::VERSION)
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: raad
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.1
4
+ version: 0.5.0
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: 2011-09-23 00:00:00.000000000Z
12
+ date: 2011-10-12 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rubyforge
16
- requirement: &2165092620 !ruby/object:Gem::Requirement
16
+ requirement: &2165354500 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '0'
22
22
  type: :development
23
23
  prerelease: false
24
- version_requirements: *2165092620
24
+ version_requirements: *2165354500
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: rspec
27
- requirement: &2165092060 !ruby/object:Gem::Requirement
27
+ requirement: &2165353940 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ~>
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: 2.6.0
33
33
  type: :development
34
34
  prerelease: false
35
- version_requirements: *2165092060
35
+ version_requirements: *2165353940
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: rake
38
- requirement: &2165091540 !ruby/object:Gem::Requirement
38
+ requirement: &2165353420 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ~>
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: 0.9.2
44
44
  type: :development
45
45
  prerelease: false
46
- version_requirements: *2165091540
46
+ version_requirements: *2165353420
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: log4r
49
- requirement: &2165091060 !ruby/object:Gem::Requirement
49
+ requirement: &2165352940 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ~>
@@ -54,7 +54,7 @@ dependencies:
54
54
  version: 1.1.9
55
55
  type: :runtime
56
56
  prerelease: false
57
- version_requirements: *2165091060
57
+ version_requirements: *2165352940
58
58
  description: Ruby as a Daemon lightweight service wrapper
59
59
  email:
60
60
  - colin.surprenant@gmail.com