zbatery 0.3.1 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
data/ChangeLog CHANGED
@@ -1,198 +1,26 @@
1
- ChangeLog from git://git.bogomips.org/zbatery.git (v0.1.1..v0.3.1)
1
+ ChangeLog from git://git.bogomips.org/zbatery.git (v0.3.1..v0.4.0)
2
2
 
3
- commit 7a3de46f4e5734c237e2bb731ee15c0c4bf0c099
3
+ commit f3aa4b5c01c9ff7d72c6ce5bfde398d556e15d5a
4
4
  Author: Eric Wong <normalperson@yhbt.net>
5
- Date: Sun Jul 11 02:57:56 2010 +0000
5
+ Date: Thu Oct 28 09:44:45 2010 +0000
6
6
 
7
- Zbatery v0.3.1 - quiet EOF errors from clients
7
+ Zbatery 0.4.0 - Rainbows! 1.0.x sync
8
8
 
9
- Eric Wong (3):
10
- update local.mk.sample for 0.3.0
11
- Fix documentation generation
12
- bump Rainbows! (and Unicorn) dependencies
9
+ This release syncs up with the latest from Rainbows! 1.0.x
10
+ and Unicorn 2.0.x
13
11
 
14
- commit 6ef21bfb48fd813f084f509f525f490d66b41bc4
12
+ commit 7a01cae820a175c2f7fd85e43f2e06ec8174340d
15
13
  Author: Eric Wong <normalperson@yhbt.net>
16
- Date: Sun Jul 11 02:57:01 2010 +0000
14
+ Date: Thu Oct 28 09:43:15 2010 +0000
17
15
 
18
- bump Rainbows! (and Unicorn) dependencies
16
+ updates for Rainbows! 1.0.0
19
17
 
20
- Unicorn 1.1.0 had constant resolution problems
21
- with TeeInput
18
+ There are some internal API changes here.
22
19
 
23
- commit a50a048a805e88c2ea01a1c8d0ad71391d3b11f8
20
+ commit c37172c8febcec7f8a491b6e229260ca607e14b0
24
21
  Author: Eric Wong <normalperson@yhbt.net>
25
- Date: Sat Jul 10 10:09:54 2010 +0000
22
+ Date: Sat Aug 28 20:03:57 2010 +0000
26
23
 
27
- Fix documentation generation
24
+ bump dependencies on Unicorn + Rainbows!
28
25
 
29
- .document needed to be updated for RDoc 2.5.x
30
-
31
- commit 35f28b9eeae69077003fc9d98779104d76da5531
32
- Author: Eric Wong <normalperson@yhbt.net>
33
- Date: Sat Jul 10 09:58:53 2010 +0000
34
-
35
- update local.mk.sample for 0.3.0
36
-
37
- commit d4f095ed8ed0da4f190280eb957c14b3f5e9a2e9
38
- Author: Eric Wong <normalperson@yhbt.net>
39
- Date: Sat Jul 10 09:56:27 2010 +0000
40
-
41
- Zbatery v0.3.0 - for newer Rainbows!
42
-
43
- Rainbows! v0.95.0 is more awesome than v0.94.0, so we've updated
44
- ourselves to use it and be more awesome as well!
45
-
46
- commit 00f570d6c3363794ee4489fae17b05555b78b2cf
47
- Author: Eric Wong <normalperson@yhbt.net>
48
- Date: Sat Jul 10 09:55:20 2010 +0000
49
-
50
- gemspec: small doc updates
51
-
52
- commit 59d3b3f6318a85e4d68592e1f7b992dd54832aa0
53
- Author: Eric Wong <normalperson@yhbt.net>
54
- Date: Sat Jul 10 09:53:52 2010 +0000
55
-
56
- add additional tests for newish Rainbows! features
57
-
58
- commit bd6b2263869c271113577b88d526c7c2a6f1455d
59
- Author: Eric Wong <normalperson@yhbt.net>
60
- Date: Sat Jul 10 02:41:46 2010 -0700
61
-
62
- updates for Rainbows! 0.95.0
63
-
64
- Rainbows! 0.95.0 made some incompatible changes, so update
65
- everything. Unfortunately we have to avoid subclassing here.
66
- Tests use isolate now.
67
-
68
- commit 5764336aa3785af8a08be7ec7b40846ec139eb6c
69
- Author: Eric Wong <normalperson@yhbt.net>
70
- Date: Mon Apr 19 14:14:46 2010 -0700
71
-
72
- Zbatery 0.2.1 - use a less-broken parser from Unicorn
73
-
74
- This release fixes a denial-of-service vector for deployments
75
- exposed directly to untrusted clients.
76
-
77
- The HTTP parser in Unicorn <= 0.97.0 would trip an assertion
78
- (killing the associated worker process) on invalid
79
- Content-Length headers instead of raising an exception. Since
80
- Rainbows! and Zbatery supports multiple clients per worker
81
- process, all clients connected to the worker process that hit
82
- the assertion would be aborted.
83
-
84
- Deployments behind nginx are _not_ affected by this bug, as
85
- nginx will reject clients that send invalid Content-Length
86
- headers.
87
-
88
- The status of deployments behind other HTTP-aware proxies is
89
- unknown. Deployments behind a non-HTTP-aware proxy (or no proxy
90
- at all) are certainly affected by this DoS.
91
-
92
- Users are strongly encouraged to upgrade as soon as possible,
93
- there are no other changes besides this bug fix from Rainbows!
94
- 0.91.0 nor Unicorn 0.97.0
95
-
96
- This bug affects all previously released versions of Rainbows!
97
- and Zbatery.
98
-
99
- commit bf277616bf1a13385150260c8bccb1d97b830bec
100
- Author: Eric Wong <normalperson@yhbt.net>
101
- Date: Mon Mar 1 18:22:14 2010 +0000
102
-
103
- t0003: fix error log check
104
-
105
- We don't have "worker" processes in here.
106
-
107
- commit 816d4e840fca8606215a328beda90dd92153bcd7
108
- Author: Eric Wong <normalperson@yhbt.net>
109
- Date: Mon Mar 1 10:40:51 2010 +0000
110
-
111
- Zbatery 0.2.0 - Unicorn/Rainbows! resync
112
-
113
- Eric Wong (7):
114
- use Unicorn.builder to parse config.ru switches
115
- import selected parts of test suite from Rainbows!
116
- gemspec: depend on newer Unicorn for Unicorn.builder
117
- support "user" directive outside of after_fork hook
118
- MRI 1.8 thread fix to avoid blocking accept()
119
- disable more Unicorn methods
120
- support Unicorn 0.96.0+ ready_pipe daemonization
121
-
122
- commit cdec2a634c85b92aa95d4c1f0ce2a056e332dfca
123
- Author: Eric Wong <normalperson@yhbt.net>
124
- Date: Mon Mar 1 10:36:54 2010 +0000
125
-
126
- support Unicorn 0.96.0+ ready_pipe daemonization
127
-
128
- ready_pipe allows the controlling process to detect
129
- errors more reliably.
130
-
131
- commit 98d605423b3a563de7b2d0b5f37695a4cf5bed7a
132
- Author: Eric Wong <normalperson@yhbt.net>
133
- Date: Mon Mar 1 10:33:41 2010 +0000
134
-
135
- disable more Unicorn methods
136
-
137
- init_self_pipe! and trap_deferred are worthless and
138
- possibly harmful to us
139
-
140
- commit 7dde8d1402a44e2997fa86ff5e3cf89c4ca6d82a
141
- Author: Eric Wong <normalperson@yhbt.net>
142
- Date: Mon Mar 1 10:29:01 2010 +0000
143
-
144
- MRI 1.8 thread fix to avoid blocking accept()
145
-
146
- Rainbows! commit ee7fe220ccbc991e1e7cbe982caf48e3303274c7
147
-
148
- Under MRI 1.8, listen sockets do not appear to have the
149
- nonblocking I/O flag on by default, nor does it set the
150
- nonblocking I/O flag when calling #accept (but it does
151
- when using #accept_nonblock, of course).
152
-
153
- Normally this is not a problem even when using green threads
154
- since MRI will internally select(2) on the file descriptor
155
- before attempting a blocking (and immediately successful)
156
- accept(2).
157
-
158
- However, when sharing a listen descriptor across multiple
159
- processes, spurious wakeups are likely to occur, causing
160
- multiple processes may be woken up when a single client
161
- connects.
162
-
163
- This causes a problem because accept(2)-ing on multiple
164
- threads/processes for a single connection causes blocking accepts in
165
- multiple processes, leading to stalled green threads.
166
-
167
- This is not an issue under 1.9 where a blocking accept() call
168
- unlocks the GVL to let other threads run.
169
-
170
- commit 168bacbea266baecafe72adc1d7fa08674607744
171
- Author: Eric Wong <normalperson@yhbt.net>
172
- Date: Mon Mar 1 10:20:32 2010 +0000
173
-
174
- support "user" directive outside of after_fork hook
175
-
176
- This is new in Unicorn 0.97.0, and makes sense to us since we
177
- don't fork. It won't work as nicely with log reopening in some
178
- cases, but it's better than nothing
179
-
180
- commit 796b2db10446ff263e419b1009f854ca6afa4fe4
181
- Author: Eric Wong <normalperson@yhbt.net>
182
- Date: Mon Mar 1 09:23:29 2010 +0000
183
-
184
- gemspec: depend on newer Unicorn for Unicorn.builder
185
-
186
- commit 9dc37425107195530b30af80ed9aa1ad72c9be94
187
- Author: Eric Wong <normalperson@yhbt.net>
188
- Date: Mon Mar 1 08:27:36 2010 +0000
189
-
190
- import selected parts of test suite from Rainbows!
191
-
192
- commit 5682d2879258f3ca06b28d4a1a7671b20f676dac
193
- Author: Eric Wong <normalperson@yhbt.net>
194
- Date: Sun Feb 28 19:43:06 2010 -0800
195
-
196
- use Unicorn.builder to parse config.ru switches
197
-
198
- Less code to maintain this way.
26
+ Small fixes from both that are worth having to ease support.
data/GIT-VERSION-FILE CHANGED
@@ -1 +1 @@
1
- GIT_VERSION = 0.3.1
1
+ GIT_VERSION = 0.4.0
data/GIT-VERSION-GEN CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/bin/sh
2
2
 
3
3
  GVF=GIT-VERSION-FILE
4
- DEF_VER=v0.3.1.GIT
4
+ DEF_VER=v0.4.0.GIT
5
5
 
6
6
  LF='
7
7
  '
data/GNUmakefile CHANGED
@@ -62,7 +62,7 @@ NEWS: GIT-VERSION-FILE
62
62
  $(RAKE) -s news_rdoc > $@+
63
63
  mv $@+ $@
64
64
 
65
- SINCE = 0.1.1
65
+ SINCE = 0.3.1
66
66
  ChangeLog: LOG_VERSION = \
67
67
  $(shell git rev-parse -q "$(GIT_VERSION)" >/dev/null 2>&1 && \
68
68
  echo $(GIT_VERSION) || git describe)
data/NEWS CHANGED
@@ -1,3 +1,8 @@
1
+ === 0.4.0 / 2010-10-28 09:45 UTC
2
+
3
+ This release syncs up with the latest from Rainbows! 1.0.x
4
+ and Unicorn 2.0.x and includes minor bugfixes from both.
5
+
1
6
  === 0.3.1 / 2010-07-11 02:58 UTC
2
7
 
3
8
  Eric Wong (3):
data/bin/zbatery CHANGED
@@ -1,20 +1,17 @@
1
- #!/usr/bin/ruby
1
+ #!/this/will/be/overwritten/or/wrapped/anyways/do/not/worry/ruby
2
2
  # -*- encoding: binary -*-
3
3
  require 'unicorn/launcher'
4
4
  require 'zbatery'
5
5
  require 'optparse'
6
6
 
7
7
  ENV["RACK_ENV"] ||= "development"
8
- daemonize = false
9
- listeners = []
10
- options = { :listeners => listeners }
11
- host, port = Unicorn::Const::DEFAULT_HOST, Unicorn::Const::DEFAULT_PORT
12
- set_listener = false
8
+ rackup_opts = Unicorn::Configurator::RACKUP
9
+ options = rackup_opts[:options]
13
10
 
14
11
  opts = OptionParser.new("", 24, ' ') do |opts|
15
- opts.banner = "Usage: #{File.basename($0)} " \
16
- "[ruby options] [zbatery options] [rackup config file]"
17
-
12
+ cmd = File.basename($0)
13
+ opts.banner = "Usage: #{cmd} " \
14
+ "[ruby options] [#{cmd} options] [rackup config file]"
18
15
  opts.separator "Ruby options:"
19
16
 
20
17
  lineno = 1
@@ -41,34 +38,34 @@ opts = OptionParser.new("", 24, ' ') do |opts|
41
38
  require library
42
39
  end
43
40
 
44
- opts.separator "Zbatery options:"
41
+ opts.separator "#{cmd} options:"
45
42
 
46
43
  # some of these switches exist for rackup command-line compatibility,
47
44
 
48
45
  opts.on("-o", "--host HOST",
49
46
  "listen on HOST (default: #{Unicorn::Const::DEFAULT_HOST})") do |h|
50
- host = h
51
- set_listener = true
47
+ rackup_opts[:host] = h
48
+ rackup_opts[:set_listener] = true
52
49
  end
53
50
 
54
51
  opts.on("-p", "--port PORT",
55
52
  "use PORT (default: #{Unicorn::Const::DEFAULT_PORT})") do |p|
56
- port = p.to_i
57
- set_listener = true
53
+ rackup_opts[:port] = p.to_i
54
+ rackup_opts[:set_listener] = true
58
55
  end
59
56
 
60
- opts.on("-E", "--env ENVIRONMENT",
61
- "use ENVIRONMENT for defaults (default: development)") do |e|
57
+ opts.on("-E", "--env RACK_ENV",
58
+ "use RACK_ENV for defaults (default: development)") do |e|
62
59
  ENV["RACK_ENV"] = e
63
60
  end
64
61
 
65
62
  opts.on("-D", "--daemonize", "run daemonized in the background") do |d|
66
- daemonize = d ? true : false
63
+ rackup_opts[:daemonize] = !!d
67
64
  end
68
65
 
69
66
  opts.on("-P", "--pid FILE", "DEPRECATED") do |f|
70
- warn %q{Use of --pid/-P is strongly discouraged}
71
- warn %q{Use the 'pid' directive in the Zbatery config file instead}
67
+ warn "Use of --pid/-P is strongly discouraged"
68
+ warn "Use the 'pid' directive in the Zbatery config file instead"
72
69
  options[:pid] = f
73
70
  end
74
71
 
@@ -77,15 +74,15 @@ opts = OptionParser.new("", 24, ' ') do |opts|
77
74
  warn "-s/--server only exists for compatibility with rackup"
78
75
  end
79
76
 
80
- # Zbatery/Unicorn-specific stuff
77
+ # Rainbows!/Unicorn-specific stuff
81
78
  opts.on("-l", "--listen {HOST:PORT|PATH}",
82
79
  "listen on HOST:PORT or PATH",
83
80
  "this may be specified multiple times",
84
81
  "(default: #{Unicorn::Const::DEFAULT_LISTEN})") do |address|
85
- listeners << address
82
+ options[:listeners] << address
86
83
  end
87
84
 
88
- opts.on("-c", "--config-file FILE", "Unicorn-specific config file") do |f|
85
+ opts.on("-c", "--config-file FILE", "Zbatery-specific config file") do |f|
89
86
  options[:config_file] = f
90
87
  end
91
88
 
@@ -102,27 +99,23 @@ opts = OptionParser.new("", 24, ' ') do |opts|
102
99
  end
103
100
 
104
101
  opts.on_tail("-v", "--version", "Show version") do
105
- puts "zbatery v#{Zbatery::VERSION}"
102
+ puts "Zbatery v#{Zbatery::VERSION}"
106
103
  exit
107
104
  end
108
105
 
109
106
  opts.parse! ARGV
110
107
  end
111
108
 
112
- config = ARGV[0] || "config.ru"
113
- abort "configuration file #{config} not found" unless File.exist?(config)
114
-
115
- app = Unicorn.builder(config, opts)
116
- listeners << "#{host}:#{port}" if set_listener
109
+ app = Unicorn.builder(ARGV[0] || 'config.ru', opts)
117
110
 
118
111
  if $DEBUG
119
112
  require 'pp'
120
113
  pp({
121
- :zbatery_options => options,
114
+ :unicorn_options => options,
122
115
  :app => app,
123
- :daemonize => daemonize,
116
+ :daemonize => rackup_opts[:daemonize],
124
117
  })
125
118
  end
126
119
 
127
- Unicorn::Launcher.daemonize!(options) if daemonize
120
+ Unicorn::Launcher.daemonize!(options) if rackup_opts[:daemonize]
128
121
  Zbatery.run(app, options)
data/lib/zbatery.rb CHANGED
@@ -4,8 +4,8 @@ require 'rainbows'
4
4
 
5
5
  module Zbatery
6
6
 
7
- # current version of Zbatery
8
- VERSION = "0.3.1"
7
+ # version of Zbatery, currently 0.4.0
8
+ VERSION = "0.4.0"
9
9
 
10
10
  class << self
11
11
 
@@ -18,21 +18,10 @@ module Zbatery
18
18
 
19
19
  Rainbows::Const::RACK_DEFAULTS["SERVER_SOFTWARE"] = "Zbatery #{VERSION}"
20
20
 
21
- # true if our Ruby implementation supports unlinked files
22
- UnlinkedIO = begin
23
- tmp = Unicorn::Util.tmpio
24
- tmp.chmod(0)
25
- tmp.close
26
- true
27
- rescue
28
- false
29
- end
30
-
31
21
  # we don't actually fork workers, but allow using the
32
22
  # {before,after}_fork hooks found in Unicorn/Rainbows!
33
23
  # config files...
34
24
  FORK_HOOK = lambda { |_,_| }
35
-
36
25
  end
37
26
 
38
27
  # :stopdoc:
@@ -47,12 +36,7 @@ module Rainbows
47
36
  build_app! unless preload_app
48
37
  Rainbows::Response.setup(self.class)
49
38
  Rainbows::MaxBody.setup
50
-
51
- # avoid spurious wakeups and blocking-accept() with 1.8 green threads
52
- if RUBY_VERSION.to_f < 1.9
53
- require "io/nonblock"
54
- HttpServer::LISTENERS.each { |l| l.nonblock = true }
55
- end
39
+ Rainbows::ProcessClient.const_set(:APP, @app)
56
40
 
57
41
  logger.info "Zbatery #@use worker_connections=#@worker_connections"
58
42
  end
@@ -68,6 +52,7 @@ module Rainbows
68
52
  # this class is only used to avoid breaking Unicorn user switching
69
53
  class DeadIO
70
54
  def chown(*args); end
55
+ alias fcntl chown
71
56
  end
72
57
 
73
58
  # only used if no concurrency model is specified
@@ -75,11 +60,8 @@ module Rainbows
75
60
  init_worker_process(worker)
76
61
  begin
77
62
  ret = IO.select(LISTENERS, nil, nil, nil) and
78
- ret.first.each do |sock|
79
- begin
80
- process_client(sock.accept_nonblock)
81
- rescue Errno::EAGAIN, Errno::ECONNABORTED
82
- end
63
+ ret[0].each do |sock|
64
+ io = sock.kgio_tryaccept and process_client(io)
83
65
  end
84
66
  rescue Errno::EINTR
85
67
  rescue Errno::EBADF, TypeError
@@ -108,32 +90,24 @@ module Rainbows
108
90
  end
109
91
 
110
92
  def join
111
- begin
112
- trap(:INT) { stop(false) } # Mongrel trapped INT for Win32...
113
-
114
- # try these anyways regardless of platform...
115
- trap(:TERM) { stop(false) }
116
- trap(:QUIT) { stop }
117
- trap(:USR1) { reopen_logs }
118
- trap(:USR2) { reexec }
119
-
120
- # no other way to reliably switch concurrency models...
121
- trap(:HUP) { reexec; stop }
122
-
123
- # technically feasible in some cases, just not sanely supportable:
124
- %w(TTIN TTOU WINCH).each do |sig|
125
- trap(sig) { logger.info "SIG#{sig} is not handled by Zbatery" }
126
- end
127
- rescue => e # hopefully ignores errors on Win32...
128
- logger.error "failed to setup signal handler: #{e.message}"
93
+ trap(:INT) { stop(false) }
94
+ trap(:TERM) { stop(false) }
95
+ trap(:QUIT) { stop }
96
+ trap(:USR1) { reopen_logs }
97
+ trap(:USR2) { reexec }
98
+ trap(:HUP) { reexec; stop }
99
+
100
+ # technically feasible in some cases, just not sanely supportable:
101
+ %w(TTIN TTOU WINCH).each do |sig|
102
+ trap(sig) { logger.info "SIG#{sig} is not handled by Zbatery" }
129
103
  end
130
104
 
131
105
  if ready_pipe
132
106
  ready_pipe.syswrite($$.to_s)
133
- ready_pipe.close rescue nil
107
+ ready_pipe.close
134
108
  self.ready_pipe = nil
135
109
  end
136
-
110
+ extend(Rainbows.const_get(@use))
137
111
  worker = Worker.new(0, DeadIO.new)
138
112
  before_fork.call(self, worker)
139
113
  worker_loop(worker) # runs forever
@@ -160,24 +134,5 @@ module Rainbows
160
134
  end
161
135
  end
162
136
 
163
- module Unicorn
164
-
165
- class Configurator
166
- DEFAULTS[:before_fork] = DEFAULTS[:after_fork] = Zbatery::FORK_HOOK
167
- end
168
-
169
- unless Zbatery::UnlinkedIO
170
- require 'tempfile'
171
- class Util
172
-
173
- # Tempfiles should get automatically unlinked by GC
174
- def self.tmpio
175
- fp = Tempfile.new("zbatery")
176
- fp.binmode
177
- fp.sync = true
178
- fp
179
- end
180
- end
181
- end
182
-
183
- end
137
+ Unicorn::Configurator::DEFAULTS[:before_fork] =
138
+ Unicorn::Configurator::DEFAULTS[:after_fork] = Zbatery::FORK_HOOK
data/t/test_isolate.rb CHANGED
@@ -14,9 +14,9 @@ old_out = $stdout.dup
14
14
  $stdout.reopen($stderr)
15
15
 
16
16
  Isolate.now!(opts) do
17
- gem 'rack', '1.1.0'
18
- gem 'unicorn', '1.1.1'
19
- gem 'rainbows', '0.95.1'
17
+ gem 'rack', '1.2.1'
18
+ gem 'unicorn', '2.0.0'
19
+ gem 'rainbows', '1.0.0'
20
20
 
21
21
  if engine == "ruby"
22
22
  gem 'sendfile', '1.0.0' # next Rubinius should support this
@@ -29,7 +29,6 @@ Isolate.now!(opts) do
29
29
  gem 'async_sinatra', '0.2.1'
30
30
 
31
31
  gem 'neverblock', '0.1.6.2'
32
- gem 'cramp', '0.11'
33
32
  end
34
33
 
35
34
  if defined?(::Fiber) && engine == "ruby"
data/zbatery.gemspec CHANGED
@@ -50,12 +50,8 @@ Gem::Specification.new do |s|
50
50
  # espace-neverblock + eventmachine
51
51
  # async_sinatra + sinatra + eventmachine
52
52
  #
53
- # rainbows 0.91.1 depends on unicorn ~> 0.97.1, previous versions of
54
- # Unicorn were vulnerable to a remote DoS when exposed directly to
55
- # untrusted clients (a configuration only supported by Zbatery and Rainbows!,
56
- # Unicorn has never and will never be supported without trusted LAN clients.
57
- s.add_dependency(%q<rainbows>, [">= 0.95.1", "<= 1.0.0"])
58
- s.add_development_dependency(%q<isolate>, "~> 2.1.0")
53
+ s.add_dependency(%q<rainbows>, ["~> 1.0.0"])
54
+ s.add_development_dependency(%q<isolate>, "~> 3.0.0")
59
55
 
60
56
  # s.licenses = %w(GPLv2 Ruby) # accessor not compatible with older RubyGems
61
57
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: zbatery
3
3
  version: !ruby/object:Gem::Version
4
- hash: 17
4
+ hash: 15
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
- - 3
9
- - 1
10
- version: 0.3.1
8
+ - 4
9
+ - 0
10
+ version: 0.4.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Zbatery hackers
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2010-07-11 00:00:00 +00:00
18
+ date: 2010-10-28 00:00:00 +00:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -24,15 +24,7 @@ dependencies:
24
24
  requirement: &id001 !ruby/object:Gem::Requirement
25
25
  none: false
26
26
  requirements:
27
- - - ">="
28
- - !ruby/object:Gem::Version
29
- hash: 353
30
- segments:
31
- - 0
32
- - 95
33
- - 1
34
- version: 0.95.1
35
- - - <=
27
+ - - ~>
36
28
  - !ruby/object:Gem::Version
37
29
  hash: 23
38
30
  segments:
@@ -50,12 +42,12 @@ dependencies:
50
42
  requirements:
51
43
  - - ~>
52
44
  - !ruby/object:Gem::Version
53
- hash: 11
45
+ hash: 7
54
46
  segments:
55
- - 2
56
- - 1
47
+ - 3
48
+ - 0
57
49
  - 0
58
- version: 2.1.0
50
+ version: 3.0.0
59
51
  type: :development
60
52
  version_requirements: *id002
61
53
  description: |-