unicorn-cuba-base 1.5.0 → 1.6.0

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.
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- YzE3ODM1NDM5Y2ZhODc5ZGE4OTU5ZTFhZDU4M2RmNTExYzM5ZjQ3NQ==
4
+ NDM4MGI3YTdmZWYyNWE4NmU5M2Q0ODhlZDBmYzBmNGRhZmRhNDY3Mw==
5
5
  data.tar.gz: !binary |-
6
- OGM3NTRmYTYzOTgxN2Q2ZmY2NDQ3NjIwZjRjNzU0NTNiNjZmMDZhYg==
6
+ MjUzOTJiMTgwMmRkMGY2MDg1YTU3MGNjNzA2MDIyZGMzMDU0YTdhNQ==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- NTExZDAxOTVkZDExNTJhMjViZjliODE1NzIwNDVlODZkMTdlZjAyZjFjNDNk
10
- OGQ4YzhkNjg4NGE2ODViZjg3NzI1YTk1NmZlOTVhN2E5ZDIwZTAzYTk2Nzdk
11
- NzQ5MjM5NWE4NjQ0Zjg3MWJlOGU4ZjBiMTQ3YzIzMjA0Zjc1ZWQ=
9
+ NzUzM2M4ODdkZTdjODM5ZTViNjJhZTYxNGRlNTFjNTQ5ZmNiZDJhMDVmYzVj
10
+ OTk5ODAyYjU4NzQwNWQzMzMwNjMzNDczYjlkMzMxZjJiYjkzMGI0Mjc5NDMx
11
+ MmVhNjFlZGE4ZTdlY2JmYjA1YWY1YmMzYTkxZTdiNTlhZGI3YmE=
12
12
  data.tar.gz: !binary |-
13
- ZjliMzIwMTM1YmUzMzY2YzVlMTFiMGI3ZDY0MzljN2ZiMDI4NGZhMjQ0NGI2
14
- ZTZiZWFjZTExZDUyODEyMjBlNTJmM2RlYjdkNjM1ZmRjZjcwNmI5OTUzM2Ux
15
- MmNmOTVjOWIyMmVlMTkyYTNhOWQ4YTdmNTViMGExMjQxY2Q2ODM=
13
+ ODAxOTFhZjRlNGY0ZTRhMjBhODczNDA3MTExMDdmYTBjZGEyOWFkN2I3YmNh
14
+ MTYxNjE2ZTkwZGRlMGM2YjNmMTYxYmNjZTgyYjdmODI1N2NiYjI0MmE3MjNj
15
+ NzdlMGYwYzEyNjI4Mjc5MzJkNmNjNjUzZWQ3YmM1ZmZiMDdmM2M=
data/Gemfile CHANGED
@@ -3,7 +3,7 @@ source "http://rubygems.org"
3
3
  ruby "1.9.3"
4
4
 
5
5
  gem "cuba", "~> 3.0"
6
- gem "unicorn", "~> 4.6.2"
6
+ gem "unicorn", '~> 4.6', '>= 4.6.2'
7
7
  gem "raindrops", "~> 0.11"
8
8
  gem "cli", "~> 1.3"
9
9
  gem "facter", "~> 1.6", ">= 1.6.18"
@@ -75,4 +75,4 @@ DEPENDENCIES
75
75
  rdoc (~> 3.9)
76
76
  rspec (~> 2.13)
77
77
  ruby-ip (~> 0.9)
78
- unicorn (~> 4.6.2)
78
+ unicorn (~> 4.6, >= 4.6.2)
data/Rakefile CHANGED
@@ -17,10 +17,13 @@ Jeweler::Tasks.new do |gem|
17
17
  gem.name = "unicorn-cuba-base"
18
18
  gem.homepage = "http://github.com/jpastuszek/unicorn-cuba-base"
19
19
  gem.license = "MIT"
20
- gem.summary = "web appliaction base powered by Unicorn and Cuba"
21
- gem.description = "web application base powered by Unicorn HTTP server and based on Cuba framework extended with additional Rack middleware and Cuba plugins"
20
+ gem.summary = "Web appliaction base powered by Unicorn and Cuba"
21
+ gem.description = "Web application base powered by Unicorn HTTP server and based on Cuba framework extended with additional Rack middleware and Cuba plugins"
22
22
  gem.email = "jpastuszek@gmail.com"
23
23
  gem.authors = ["Jakub Pastuszek"]
24
+ gem.files.exclude "spec/**/*"
25
+ gem.files.exclude "*.gemspec"
26
+ gem.files.exclude ".rspec"
24
27
  # dependencies defined in Gemfile
25
28
  end
26
29
  Jeweler::RubygemsDotOrgTasks.new
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.5.0
1
+ 1.6.0
@@ -63,6 +63,7 @@ class Application
63
63
  root_logger.level = RootLogger::WARN
64
64
  root_logger.level = RootLogger::INFO if @settings.verbose
65
65
  root_logger.level = RootLogger::DEBUG if @settings.debug
66
+ root_logger.enable_perf_logging if @settings.perf_stats
66
67
  Controller.logger = root_logger
67
68
  MemoryLimit.logger = Controller.logger_for(MemoryLimit)
68
69
 
@@ -175,6 +176,9 @@ class Application
175
176
  switch :debug,
176
177
  short: :d,
177
178
  description: 'enable verbose and debug logging (DEBUG)'
179
+ switch :perf_stats,
180
+ short: :V,
181
+ description: 'enable logging of performance statistics on ANY level'
178
182
  end
179
183
  end
180
184
 
@@ -1,18 +1,37 @@
1
1
  require 'benchmark'
2
2
 
3
3
  $perf_stats_nest_level = -1
4
+ $perf_stats_tasks = []
4
5
 
5
6
  module PerfStats
6
- def measure(name)
7
- $perf_stats_nest_level += 1
8
- ret = nil
9
- took = Benchmark.measure do
10
- ret = yield
7
+ def measure(task, object = nil)
8
+ if log.perf?
9
+ begin
10
+ $perf_stats_nest_level += 1
11
+ $perf_stats_tasks << task
12
+ task = $perf_stats_tasks.join(' -> ')
13
+ ret = nil
14
+ took = Benchmark.measure do
15
+ ret = yield
16
+ end
17
+ log.with_meta(
18
+ type: 'perf-stats',
19
+ user_time: took.utime.round(6),
20
+ system_time:took.stime.round(6),
21
+ total_time: took.total.round(6),
22
+ real_time: took.real.round(6),
23
+ task: task,
24
+ object: object,
25
+ level: $perf_stats_nest_level
26
+ ).perf "took #{"%0.6f" % took.real} sec - #{task}#{object ? ": #{object}" : ''}"
27
+ ret
28
+ ensure
29
+ $perf_stats_nest_level -= 1
30
+ $perf_stats_tasks.pop
31
+ end
32
+ else
33
+ yield
11
34
  end
12
- log.info "[PERF] #{took.to_s.chomp} -#{'+' * $perf_stats_nest_level} #{name}"
13
- ret
14
- ensure
15
- $perf_stats_nest_level -= 1
16
35
  end
17
36
  end
18
37
 
@@ -73,6 +73,8 @@ class RootLogger < Logger
73
73
  def initialize(logdev = STDERR, &formatter)
74
74
  super(logdev)
75
75
 
76
+ @perf_enabled = false
77
+
76
78
  @ext_formatter = proc do |severity, datetime, progname, meta, msg|
77
79
  if formatter
78
80
  formatter.call(severity, datetime, progname, meta, msg)
@@ -89,6 +91,19 @@ class RootLogger < Logger
89
91
  end
90
92
  end
91
93
 
94
+ def enable_perf_logging
95
+ @perf_enabled = true
96
+ self
97
+ end
98
+
99
+ def perf?
100
+ @perf_enabled
101
+ end
102
+
103
+ def perf(msg)
104
+ unknown(msg) if @perf_enabled
105
+ end
106
+
92
107
  def logger_for(class_obj)
93
108
  ClassLogger.new(self, class_obj)
94
109
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: unicorn-cuba-base
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.5.0
4
+ version: 1.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jakub Pastuszek
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-05-13 00:00:00.000000000 Z
11
+ date: 2015-06-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: cuba
@@ -28,16 +28,22 @@ dependencies:
28
28
  name: unicorn
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - ~>
31
+ - - ! '>='
32
32
  - !ruby/object:Gem::Version
33
33
  version: 4.6.2
34
+ - - ~>
35
+ - !ruby/object:Gem::Version
36
+ version: '4.6'
34
37
  type: :runtime
35
38
  prerelease: false
36
39
  version_requirements: !ruby/object:Gem::Requirement
37
40
  requirements:
38
- - - ~>
41
+ - - ! '>='
39
42
  - !ruby/object:Gem::Version
40
43
  version: 4.6.2
44
+ - - ~>
45
+ - !ruby/object:Gem::Version
46
+ version: '4.6'
41
47
  - !ruby/object:Gem::Dependency
42
48
  name: raindrops
43
49
  requirement: !ruby/object:Gem::Requirement
@@ -162,7 +168,7 @@ dependencies:
162
168
  - - ~>
163
169
  - !ruby/object:Gem::Version
164
170
  version: '1.0'
165
- description: web application base powered by Unicorn HTTP server and based on Cuba
171
+ description: Web application base powered by Unicorn HTTP server and based on Cuba
166
172
  framework extended with additional Rack middleware and Cuba plugins
167
173
  email: jpastuszek@gmail.com
168
174
  executables: []
@@ -172,7 +178,6 @@ extra_rdoc_files:
172
178
  - README.md
173
179
  files:
174
180
  - .document
175
- - .rspec
176
181
  - Gemfile
177
182
  - Gemfile.lock
178
183
  - LICENSE.txt
@@ -196,10 +201,6 @@ files:
196
201
  - lib/unicorn-cuba-base/stats.rb
197
202
  - lib/unicorn-cuba-base/stats_reporter.rb
198
203
  - lib/unicorn-cuba-base/uri_ext.rb
199
- - spec/memory_limit_spec.rb
200
- - spec/root_logger_spec.rb
201
- - spec/spec_helper.rb
202
- - unicorn-cuba-base.gemspec
203
204
  homepage: http://github.com/jpastuszek/unicorn-cuba-base
204
205
  licenses:
205
206
  - MIT
@@ -220,8 +221,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
220
221
  version: '0'
221
222
  requirements: []
222
223
  rubyforge_project:
223
- rubygems_version: 2.2.2
224
+ rubygems_version: 2.4.7
224
225
  signing_key:
225
226
  specification_version: 4
226
- summary: web appliaction base powered by Unicorn and Cuba
227
+ summary: Web appliaction base powered by Unicorn and Cuba
227
228
  test_files: []
data/.rspec DELETED
@@ -1 +0,0 @@
1
- --color
@@ -1,66 +0,0 @@
1
- require_relative 'spec_helper'
2
- require 'unicorn-cuba-base/memory_limit'
3
- MemoryLimit.logger = Logger.new('/dev/null')
4
-
5
- describe MemoryLimit do
6
- subject do
7
- MemoryLimit.new(10)
8
- end
9
-
10
- it 'should raise MemoryLimitedExceededError when too much memory is borrowed' do
11
- subject.borrow 8
12
- subject.return 3
13
- subject.borrow 4
14
- subject.borrow 1
15
- expect {
16
- subject.borrow 1
17
- }.to raise_error MemoryLimit::MemoryLimitedExceededError, 'memory limit exceeded'
18
- end
19
-
20
- describe '#get' do
21
- it 'should yield limit left and borrow as much as returned string bytesize' do
22
- subject.get do |limit|
23
- limit.should == 10
24
- '123'
25
- end.should == '123'
26
- subject.limit.should == 7
27
- end
28
-
29
- it 'should raise MemoryLimit::MemoryLimitedExceededError if retruned string is longer than the limit' do
30
- expect {
31
- subject.get do |limit|
32
- '12345678901'
33
- end
34
- }.to raise_error MemoryLimit::MemoryLimitedExceededError
35
- end
36
- end
37
-
38
- describe MemoryLimit::IO do
39
- it 'should limit reading from extended IO like object' do
40
- test_file = Pathname.new('/tmp/memlimtest')
41
- test_file.open('w+') { |io|
42
- io.write '12345'
43
- io.seek 0
44
-
45
- subject.io io
46
- io.read.should == '12345'
47
-
48
- io.seek 0
49
- io.truncate 0
50
- io.write '678'
51
- io.seek 0
52
- io.read.should == '678'
53
-
54
- io.seek 0
55
- io.write '09123'
56
- io.seek 0
57
-
58
- expect {
59
- io.read
60
- }.to raise_error MemoryLimit::MemoryLimitedExceededError, 'memory limit exceeded'
61
- }
62
- test_file.unlink
63
- end
64
- end
65
- end
66
-
@@ -1,152 +0,0 @@
1
- require_relative 'spec_helper'
2
-
3
- require 'unicorn-cuba-base/root_logger'
4
- require 'stringio'
5
-
6
- describe RootLogger do
7
- let! :log_out do
8
- StringIO.new
9
- end
10
-
11
- subject do
12
- RootLogger.new(log_out)
13
- end
14
-
15
- it 'should log to given logger' do
16
- subject.info 'hello world'
17
- log_out.string.should include 'INFO'
18
- log_out.string.should include 'hello world'
19
- end
20
-
21
- describe 'support for different logging levels' do
22
- it 'should log info' do
23
- subject.info 'hello world'
24
- log_out.string.should include 'INFO'
25
- end
26
-
27
- it 'should log warn' do
28
- subject.warn 'hello world'
29
- log_out.string.should include 'WARN'
30
- end
31
-
32
- it 'should log error' do
33
- subject.error 'hello world'
34
- log_out.string.should include 'ERROR'
35
- end
36
- end
37
-
38
- describe 'class logger' do
39
- it 'should report class name' do
40
- TestApp = Class.new
41
- subject.logger_for(TestApp).info 'hello world'
42
- log_out.string.should include 'TestApp'
43
-
44
- subject.logger_for(String).info 'hello world'
45
- log_out.string.should include 'String'
46
- end
47
- end
48
-
49
- it 'should log exceptions' do
50
- begin
51
- raise RuntimeError, 'bad luck'
52
- rescue => error
53
- subject.logger_for(String).error 'hello world', error
54
- end
55
- log_out.string.should include 'hello world: RuntimeError: bad luck'
56
- end
57
-
58
- describe 'meta data' do
59
- it 'should log with metadata in RFC5424 format' do
60
- subject.with_meta(type: 'access-log').info 'GET /asdfas'
61
- log_out.string.should include '"type":"access-log"'
62
-
63
- subject.info 'GET /asdfas'
64
- log_out.string.lines.to_a.last.should_not include '"type":"access-log"'
65
- end
66
-
67
- it 'should work with chaining' do
68
- subject.with_meta(type: 'access-log').with_meta(blah: 'xxx').info 'GET /asdfas'
69
- log_out.string.should include '"type":"access-log","blah":"xxx"'
70
- end
71
-
72
- it 'should log with metadata context' do
73
- subject.with_meta_context(type: 'app-log') do
74
- subject.info 'GET /asdfas'
75
- end
76
- log_out.string.should include '"type":"app-log"'
77
-
78
- subject.info 'GET /asdfas'
79
- log_out.string.lines.to_a.last.should_not include '"type":"app-log"'
80
- end
81
- end
82
- end
83
-
84
- require 'capture-output'
85
-
86
- describe SyslogLogDev do
87
- subject do
88
- SyslogLogDev.new('unicorn-cuba-base-test', 'daemon', true)
89
- end
90
-
91
- after :each do
92
- subject.close
93
- end
94
-
95
- it 'should write messages to syslog expecting first word to be log level' do
96
- Capture.stderr{subject.write 'INFO hello world'}.should include '<Info>'
97
- Capture.stderr{subject.write 'WARN hello world'}.should include '<Warning>'
98
- Capture.stderr{subject.write 'INFO hello world'}.should include 'hello world'
99
- end
100
-
101
- it 'should handle multiline log entries' do
102
- Capture.stderr{subject.write "INFO hello\nworld"}.should include "<Info>: hello\n\tworld\n"
103
- end
104
- end
105
-
106
- describe RootSyslogLogger do
107
- subject do
108
- @subject ||= RootSyslogLogger.new('unicorn-cuba-base-test', 'daemon', true).logger_for(RSpec)
109
- end
110
-
111
- after :each do
112
- subject.close
113
- end
114
-
115
- it 'should log to syslog' do
116
- log_out = Capture.stderr{subject.info 'hello world'}
117
-
118
- log_out.should include 'unicorn-cuba-base-test'
119
- log_out.should match /\[[0-9]+\]/
120
- log_out.should include '<Info>:'
121
- end
122
-
123
- it 'should include message' do
124
- Capture.stderr{subject.info 'hello world'}.should include 'hello world'
125
- end
126
-
127
- it 'should include class name' do
128
- Capture.stderr{subject.info 'hello world'}.should include 'RSpec'
129
- end
130
-
131
- it 'should map log levels to syslog severities' do
132
- Capture.stderr{subject.debug 'hello world'}.should include '<Debug>'
133
- Capture.stderr{subject.info 'hello world'}.should include '<Info>'
134
- Capture.stderr{subject.warn 'hello world'}.should include '<Warning>'
135
- Capture.stderr{subject.error 'hello world'}.should include '<Error>'
136
- Capture.stderr{subject.fatal 'hello world'}.should include '<Critical>'
137
- end
138
-
139
- it 'should handle multiline logs by appending tab after new line (done by syslog?)' do
140
- Capture.stderr{subject.info "hello\nworld\ntest"}.should include "hello\n\tworld\n\ttest\n"
141
- end
142
-
143
- describe 'direct wirtes' do
144
- it 'should use Info level' do
145
- Capture.stderr{subject.write "hello world"}.should include '<Info>'
146
- end
147
-
148
- it 'should allow use of meta data' do
149
- Capture.stderr{subject.with_meta('type' => 'access-log').write "hello world"}.should include '"type":"access-log"'
150
- end
151
- end
152
- end
@@ -1,12 +0,0 @@
1
- $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
2
- $LOAD_PATH.unshift(File.dirname(__FILE__))
3
- require 'rspec'
4
- require 'unicorn-cuba-base'
5
-
6
- # Requires supporting files with custom matchers and macros, etc,
7
- # in ./support/ and its subdirectories.
8
- Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f}
9
-
10
- RSpec.configure do |config|
11
-
12
- end
@@ -1,96 +0,0 @@
1
- # Generated by jeweler
2
- # DO NOT EDIT THIS FILE DIRECTLY
3
- # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
- # -*- encoding: utf-8 -*-
5
- # stub: unicorn-cuba-base 1.5.0 ruby lib
6
-
7
- Gem::Specification.new do |s|
8
- s.name = "unicorn-cuba-base"
9
- s.version = "1.5.0"
10
-
11
- s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
12
- s.require_paths = ["lib"]
13
- s.authors = ["Jakub Pastuszek"]
14
- s.date = "2015-05-13"
15
- s.description = "web application base powered by Unicorn HTTP server and based on Cuba framework extended with additional Rack middleware and Cuba plugins"
16
- s.email = "jpastuszek@gmail.com"
17
- s.extra_rdoc_files = [
18
- "LICENSE.txt",
19
- "README.md"
20
- ]
21
- s.files = [
22
- ".document",
23
- ".rspec",
24
- "Gemfile",
25
- "Gemfile.lock",
26
- "LICENSE.txt",
27
- "README.md",
28
- "Rakefile",
29
- "VERSION",
30
- "lib/unicorn-cuba-base.rb",
31
- "lib/unicorn-cuba-base/default_error_reporter.rb",
32
- "lib/unicorn-cuba-base/memory_limit.rb",
33
- "lib/unicorn-cuba-base/perf_stats.rb",
34
- "lib/unicorn-cuba-base/plugin/error_matcher.rb",
35
- "lib/unicorn-cuba-base/plugin/logging.rb",
36
- "lib/unicorn-cuba-base/plugin/memory_limit.rb",
37
- "lib/unicorn-cuba-base/plugin/response_helpers.rb",
38
- "lib/unicorn-cuba-base/rack/common_logger_xid.rb",
39
- "lib/unicorn-cuba-base/rack/error_handling.rb",
40
- "lib/unicorn-cuba-base/rack/memory_limit.rb",
41
- "lib/unicorn-cuba-base/rack/unhandled_request.rb",
42
- "lib/unicorn-cuba-base/rack/xid_logging.rb",
43
- "lib/unicorn-cuba-base/root_logger.rb",
44
- "lib/unicorn-cuba-base/stats.rb",
45
- "lib/unicorn-cuba-base/stats_reporter.rb",
46
- "lib/unicorn-cuba-base/uri_ext.rb",
47
- "spec/memory_limit_spec.rb",
48
- "spec/root_logger_spec.rb",
49
- "spec/spec_helper.rb",
50
- "unicorn-cuba-base.gemspec"
51
- ]
52
- s.homepage = "http://github.com/jpastuszek/unicorn-cuba-base"
53
- s.licenses = ["MIT"]
54
- s.rubygems_version = "2.2.2"
55
- s.summary = "web appliaction base powered by Unicorn and Cuba"
56
-
57
- if s.respond_to? :specification_version then
58
- s.specification_version = 4
59
-
60
- if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
61
- s.add_runtime_dependency(%q<cuba>, ["~> 3.0"])
62
- s.add_runtime_dependency(%q<unicorn>, ["~> 4.6.2"])
63
- s.add_runtime_dependency(%q<raindrops>, ["~> 0.11"])
64
- s.add_runtime_dependency(%q<cli>, ["~> 1.3"])
65
- s.add_runtime_dependency(%q<facter>, [">= 1.6.18", "~> 1.6"])
66
- s.add_runtime_dependency(%q<ruby-ip>, ["~> 0.9"])
67
- s.add_development_dependency(%q<rspec>, ["~> 2.13"])
68
- s.add_development_dependency(%q<rdoc>, ["~> 3.9"])
69
- s.add_development_dependency(%q<jeweler>, [">= 1.8.8", "~> 1.8"])
70
- s.add_development_dependency(%q<capture-output>, ["~> 1.0"])
71
- else
72
- s.add_dependency(%q<cuba>, ["~> 3.0"])
73
- s.add_dependency(%q<unicorn>, ["~> 4.6.2"])
74
- s.add_dependency(%q<raindrops>, ["~> 0.11"])
75
- s.add_dependency(%q<cli>, ["~> 1.3"])
76
- s.add_dependency(%q<facter>, [">= 1.6.18", "~> 1.6"])
77
- s.add_dependency(%q<ruby-ip>, ["~> 0.9"])
78
- s.add_dependency(%q<rspec>, ["~> 2.13"])
79
- s.add_dependency(%q<rdoc>, ["~> 3.9"])
80
- s.add_dependency(%q<jeweler>, [">= 1.8.8", "~> 1.8"])
81
- s.add_dependency(%q<capture-output>, ["~> 1.0"])
82
- end
83
- else
84
- s.add_dependency(%q<cuba>, ["~> 3.0"])
85
- s.add_dependency(%q<unicorn>, ["~> 4.6.2"])
86
- s.add_dependency(%q<raindrops>, ["~> 0.11"])
87
- s.add_dependency(%q<cli>, ["~> 1.3"])
88
- s.add_dependency(%q<facter>, [">= 1.6.18", "~> 1.6"])
89
- s.add_dependency(%q<ruby-ip>, ["~> 0.9"])
90
- s.add_dependency(%q<rspec>, ["~> 2.13"])
91
- s.add_dependency(%q<rdoc>, ["~> 3.9"])
92
- s.add_dependency(%q<jeweler>, [">= 1.8.8", "~> 1.8"])
93
- s.add_dependency(%q<capture-output>, ["~> 1.0"])
94
- end
95
- end
96
-