rack_csrf 2.4.0 → 2.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +2 -0
- data/.travis.yml +15 -0
- data/Changelog.md +12 -0
- data/Gemfile +2 -12
- data/LICENSE.rdoc +1 -1
- data/README.rdoc +10 -6
- data/Rakefile +10 -32
- data/examples/camping/Gemfile +2 -0
- data/examples/camping/app.rb +0 -2
- data/examples/cuba/Gemfile +1 -0
- data/examples/cuba/app.rb +2 -0
- data/examples/cuba/config-with-raise.ru +1 -2
- data/examples/cuba/config.ru +1 -2
- data/examples/innate/Gemfile +1 -0
- data/examples/innate/start-with-raise.rb +1 -3
- data/examples/innate/start.rb +1 -3
- data/examples/rack/Gemfile +2 -1
- data/examples/rack/app.rb +8 -3
- data/examples/rack/config-with-raise.ru +1 -2
- data/examples/rack/config.ru +1 -2
- data/examples/sinatra/Gemfile +2 -1
- data/examples/sinatra/config-with-raise.ru +1 -4
- data/examples/sinatra/config.ru +1 -4
- data/features/step_definitions/setup_steps.rb +11 -7
- data/lib/rack/csrf.rb +3 -8
- data/lib/rack/csrf/version.rb +5 -0
- data/rack_csrf.gemspec +41 -112
- data/spec/csrf_spec.rb +6 -6
- data/spec/spec_helper.rb +7 -0
- metadata +164 -143
- data/VERSION +0 -1
- data/lib/rack/vendor/securerandom.rb +0 -256
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 347ff3179f58ae9f50ba7ea21ced84f4e79ce39a
|
4
|
+
data.tar.gz: ae43acbd043e920ae4aa0f19bf9607f4c8775fb2
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: f57f414196810efbb0fde60593cb889e2e4c9897e714afb10c8d44e232b522fa068820f9c9fbb461dd19eefaf56553063fdd1c195363ad41a6eef686d77bb14c
|
7
|
+
data.tar.gz: ffe85c09c9da3ffec3d39d1e30f88ddeb46558505f8f2d87fb56a6a1b31eb1c2706ca4a9b59a262ac2af87665d4871ac39d521ccfd3e8d5bf84acb8ded360a78
|
data/.gitignore
ADDED
data/.travis.yml
ADDED
data/Changelog.md
CHANGED
@@ -1,3 +1,15 @@
|
|
1
|
+
# v2.5.0 (2014-06-15)
|
2
|
+
|
3
|
+
* Fixed/improved the examples.
|
4
|
+
* Added basic Travis setup.
|
5
|
+
* Dropped support for Rack versions older than 1.1.0.
|
6
|
+
* Lazy generation of the CSRF token.
|
7
|
+
* Left Jeweler; totally embraced Bundler.
|
8
|
+
* Dropped support for Ruby 1.8.6.
|
9
|
+
* Fixed Cucumber's step for Ruby 1.8.*.
|
10
|
+
|
11
|
+
|
12
|
+
|
1
13
|
# v2.4.0 (2012-02-28)
|
2
14
|
|
3
15
|
* Updated examples' Gemfiles.
|
data/Gemfile
CHANGED
@@ -1,12 +1,2 @@
|
|
1
|
-
source '
|
2
|
-
|
3
|
-
gem 'rack', '>= 0.9'
|
4
|
-
|
5
|
-
group :development do
|
6
|
-
gem 'bundler', '>= 1.0.0'
|
7
|
-
gem 'cucumber', '>= 1.1.1'
|
8
|
-
gem 'rack-test'
|
9
|
-
gem 'rspec', '>= 2.0.0'
|
10
|
-
gem 'rdoc', '>= 2.4.2'
|
11
|
-
gem 'jeweler'
|
12
|
-
end
|
1
|
+
source 'https://rubygems.org'
|
2
|
+
gemspec
|
data/LICENSE.rdoc
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
(The MIT License)
|
4
4
|
|
5
|
-
Copyright (c) 2009, 2010, 2011, 2012 Emanuele Vicentini
|
5
|
+
Copyright (c) 2009, 2010, 2011, 2012, 2014 Emanuele Vicentini
|
6
6
|
|
7
7
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
8
8
|
of this software and associated documentation files (the 'Software'), to deal
|
data/README.rdoc
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
= Rack::Csrf
|
1
|
+
= Rack::Csrf {<img src="https://travis-ci.org/baldowl/rack_csrf.png?branch=master" alt="Build Status" />}[https://travis-ci.org/baldowl/rack_csrf] {<img src="https://badge.fury.io/rb/rack_csrf.png" alt="Gem Version" />}[http://badge.fury.io/rb/rack_csrf]
|
2
2
|
|
3
3
|
This is just a small Rack middleware whose only goal is to lessen the hazards
|
4
4
|
posed by CSRF attacks by trying to ensure that all requests of particular
|
@@ -20,9 +20,6 @@ immediately replies with an empty response.
|
|
20
20
|
|
21
21
|
The anti-forging token can be passed as a request parameter or a header.
|
22
22
|
|
23
|
-
I have not tested Rack::Csrf with Rack 0.4.0 or earlier versions, but it could
|
24
|
-
possibly work.
|
25
|
-
|
26
23
|
== Options
|
27
24
|
|
28
25
|
The following options allow you to tweak Rack::Csrf.
|
@@ -79,6 +76,9 @@ The following options allow you to tweak Rack::Csrf.
|
|
79
76
|
This option is useful if a guarded resource can be accessed by clients who
|
80
77
|
support CSRF token (e.g. browsers) and by ones who don't (e.g. API clients).
|
81
78
|
|
79
|
+
Don't try to check the CSRF token: it could exist or not at this stage and
|
80
|
+
you should always let it alone.
|
81
|
+
|
82
82
|
Default value: empty.
|
83
83
|
|
84
84
|
[<tt>:field</tt>]
|
@@ -154,6 +154,10 @@ token.
|
|
154
154
|
Returns the name of the key used to store/retrieve the token from the Rack
|
155
155
|
session.
|
156
156
|
|
157
|
+
Despite this class method, you should never try to retrieve the token with
|
158
|
+
code like <tt>env['rack.session'][Rack::Csrf.key]</tt>. See the `token`
|
159
|
+
method below.
|
160
|
+
|
157
161
|
[<tt>Rack::Csrf.field</tt> (also <tt>Rack::Csrf.csrf_field</tt>)]
|
158
162
|
Returns the name of the field that must be present in the request.
|
159
163
|
|
@@ -208,5 +212,5 @@ forgo responsibilities for keeping your application as safe as possible.
|
|
208
212
|
|
209
213
|
== Copyright
|
210
214
|
|
211
|
-
Copyright (c) 2009, 2010, 2011, 2012 Emanuele Vicentini. See
|
212
|
-
details.
|
215
|
+
Copyright (c) 2009, 2010, 2011, 2012, 2014 Emanuele Vicentini. See
|
216
|
+
LICENSE.rdoc for details.
|
data/Rakefile
CHANGED
@@ -1,52 +1,30 @@
|
|
1
1
|
require 'rubygems'
|
2
|
-
require 'bundler'
|
3
|
-
begin
|
4
|
-
Bundler.setup(:default, :development)
|
5
|
-
rescue Bundler::BundlerError => e
|
6
|
-
$stderr.puts e.message
|
7
|
-
$stderr.puts "Run `bundle install` to install missing gems"
|
8
|
-
exit e.status_code
|
9
|
-
end
|
2
|
+
require 'bundler/setup'
|
10
3
|
|
11
4
|
require 'rake/clean'
|
12
|
-
require 'cucumber/rake/task'
|
13
|
-
require 'rspec/core/rake_task'
|
14
|
-
require 'rdoc/task'
|
15
|
-
require 'jeweler'
|
16
5
|
|
6
|
+
require 'cucumber/rake/task'
|
17
7
|
Cucumber::Rake::Task.new :features
|
18
8
|
task :default => :features
|
19
9
|
|
10
|
+
require 'rspec/core/rake_task'
|
20
11
|
RSpec::Core::RakeTask.new :spec
|
21
12
|
task :default => :spec
|
22
13
|
|
23
|
-
|
14
|
+
require 'rack/csrf/version'
|
24
15
|
|
16
|
+
require 'rdoc/task'
|
25
17
|
RDoc::Task.new :doc do |rdoc|
|
26
18
|
rdoc.rdoc_dir = 'doc'
|
27
|
-
rdoc.title = "Rack::Csrf #{
|
19
|
+
rdoc.title = "Rack::Csrf #{Rack::Csrf::VERSION}"
|
28
20
|
rdoc.main = 'README.rdoc'
|
29
21
|
rdoc.rdoc_files.include('README.rdoc', 'LICENSE.rdoc')
|
30
22
|
rdoc.rdoc_files.include('lib/**/*.rb')
|
31
23
|
end
|
32
24
|
|
33
|
-
|
34
|
-
gem.name = 'rack_csrf'
|
35
|
-
gem.summary = 'Anti-CSRF Rack middleware'
|
36
|
-
gem.description = 'Anti-CSRF Rack middleware'
|
37
|
-
gem.license = 'MIT'
|
38
|
-
gem.authors = 'Emanuele Vicentini'
|
39
|
-
gem.email = 'emanuele.vicentini@gmail.com'
|
40
|
-
gem.homepage = 'https://github.com/baldowl/rack_csrf'
|
41
|
-
gem.rubyforge_project = 'rackcsrf'
|
42
|
-
# dependencies defined in Gemfile
|
43
|
-
gem.rdoc_options << '--line-numbers' << '--inline-source' << '--title' <<
|
44
|
-
"Rack::Csrf #{version}" << '--main' << 'README.rdoc'
|
45
|
-
gem.test_files.clear
|
46
|
-
end
|
47
|
-
|
48
|
-
Jeweler::GemcutterTasks.new
|
25
|
+
require 'bundler/gem_tasks'
|
49
26
|
|
27
|
+
require 'git'
|
50
28
|
desc <<-EOD
|
51
29
|
Shows the changelog in Git between the given points.
|
52
30
|
|
@@ -54,9 +32,9 @@ start -- defaults to the current version tag
|
|
54
32
|
end -- defaults to HEAD
|
55
33
|
EOD
|
56
34
|
task :changes, [:start, :end] do |t, args|
|
57
|
-
args.with_defaults :start => "v#{
|
35
|
+
args.with_defaults :start => "v#{Rack::Csrf::VERSION}",
|
58
36
|
:end => 'HEAD'
|
59
|
-
repo = Git.open
|
37
|
+
repo = Git.open Dir.pwd
|
60
38
|
repo.log(nil).between(args.start, args.end).each do |c|
|
61
39
|
puts c.message.split($/).first
|
62
40
|
end
|
data/examples/camping/Gemfile
CHANGED
data/examples/camping/app.rb
CHANGED
data/examples/cuba/Gemfile
CHANGED
data/examples/cuba/app.rb
CHANGED
data/examples/cuba/config.ru
CHANGED
data/examples/innate/Gemfile
CHANGED
data/examples/innate/start.rb
CHANGED
data/examples/rack/Gemfile
CHANGED
data/examples/rack/app.rb
CHANGED
@@ -30,16 +30,21 @@ class LittleApp
|
|
30
30
|
|
31
31
|
def self.call env
|
32
32
|
req = Rack::Request.new env
|
33
|
+
res = Rack::Response.new
|
34
|
+
|
33
35
|
if req.get?
|
34
36
|
if req.path_info == '/notworking'
|
35
|
-
|
37
|
+
res.write @form_not_working.result(binding)
|
36
38
|
else
|
37
|
-
|
39
|
+
res.write @form.result(binding)
|
38
40
|
end
|
39
41
|
elsif req.post?
|
40
42
|
utterance = req['utterance']
|
41
43
|
csrf = req[Rack::Csrf.field]
|
42
|
-
|
44
|
+
res.write @response.result(binding)
|
43
45
|
end
|
46
|
+
|
47
|
+
res['Content-Type'] = 'text/html'
|
48
|
+
res.finish
|
44
49
|
end
|
45
50
|
end
|
data/examples/rack/config.ru
CHANGED
data/examples/sinatra/Gemfile
CHANGED
@@ -1,14 +1,11 @@
|
|
1
1
|
require 'sinatra'
|
2
|
-
$: << File.join(File.dirname(__FILE__), '../../lib')
|
3
2
|
require 'rack/csrf'
|
4
3
|
|
5
4
|
require 'erb'
|
6
|
-
require 'app'
|
5
|
+
require './app'
|
7
6
|
|
8
7
|
use Rack::ShowExceptions
|
9
8
|
use Rack::Session::Cookie
|
10
9
|
use Rack::Csrf, :raise => true
|
11
10
|
|
12
|
-
set :app_file, 'app.rb'
|
13
|
-
|
14
11
|
run Sinatra::Application
|
data/examples/sinatra/config.ru
CHANGED
@@ -1,13 +1,10 @@
|
|
1
1
|
require 'sinatra'
|
2
|
-
$: << File.join(File.dirname(__FILE__), '../../lib')
|
3
2
|
require 'rack/csrf'
|
4
3
|
|
5
4
|
require 'erb'
|
6
|
-
require 'app'
|
5
|
+
require './app'
|
7
6
|
|
8
7
|
use Rack::Session::Cookie
|
9
8
|
use Rack::Csrf
|
10
9
|
|
11
|
-
set :app_file, 'app.rb'
|
12
|
-
|
13
10
|
run Sinatra::Application
|
@@ -80,7 +80,8 @@ When /^I insert the anti\-CSRF middleware with the :skip option$/ do |table|
|
|
80
80
|
end
|
81
81
|
|
82
82
|
When /^I insert the anti\-CSRF middleware with the :skip_if option$/ do |table|
|
83
|
-
skippable =
|
83
|
+
skippable = {}
|
84
|
+
table.hashes.each {|row| skippable[row['name']] = row['value']}
|
84
85
|
@rack_builder.use Rack:: Csrf, :skip_if => Proc.new { |request|
|
85
86
|
skippable.any? { |name, value| request.env[name] == value }
|
86
87
|
}
|
@@ -89,12 +90,15 @@ When /^I insert the anti\-CSRF middleware with the :skip_if option$/ do |table|
|
|
89
90
|
end
|
90
91
|
|
91
92
|
When /^I insert the anti\-CSRF middleware with the :skip and :skip_if options$/ do |table|
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
93
|
+
skip_option_arguments = []
|
94
|
+
skip_if_option_arguments = {}
|
95
|
+
table.hashes.each do |row|
|
96
|
+
skip_option_arguments << row['path']
|
97
|
+
skip_if_option_arguments[row['name']] = row['value']
|
98
|
+
end
|
99
|
+
|
100
|
+
@rack_builder.use Rack:: Csrf, :skip => skip_option_arguments, :skip_if => Proc.new { |request|
|
101
|
+
skip_if_option_arguments.any? { |name, value| request.env[name] == value }
|
98
102
|
}
|
99
103
|
@app = toy_app
|
100
104
|
@browser = Rack::Test::Session.new(Rack::MockSession.new(@app))
|
data/lib/rack/csrf.rb
CHANGED
@@ -1,9 +1,5 @@
|
|
1
1
|
require 'rack'
|
2
|
-
|
3
|
-
require 'securerandom'
|
4
|
-
rescue LoadError
|
5
|
-
require File.dirname(__FILE__) + '/vendor/securerandom'
|
6
|
-
end
|
2
|
+
require 'securerandom'
|
7
3
|
|
8
4
|
module Rack
|
9
5
|
class Csrf
|
@@ -34,12 +30,11 @@ module Rack
|
|
34
30
|
unless env['rack.session']
|
35
31
|
raise SessionUnavailable.new('Rack::Csrf depends on session middleware')
|
36
32
|
end
|
37
|
-
self.class.token(env)
|
38
33
|
req = Rack::Request.new(env)
|
39
34
|
untouchable = skip_checking(req) ||
|
40
35
|
!@http_methods.include?(req.request_method) ||
|
41
|
-
req.params[self.class.field] ==
|
42
|
-
req.env[self.class.rackified_header] ==
|
36
|
+
req.params[self.class.field] == self.class.token(env) ||
|
37
|
+
req.env[self.class.rackified_header] == self.class.token(env)
|
43
38
|
if untouchable
|
44
39
|
@app.call(env)
|
45
40
|
else
|
data/rack_csrf.gemspec
CHANGED
@@ -1,121 +1,50 @@
|
|
1
|
-
#
|
2
|
-
|
3
|
-
|
4
|
-
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'rack/csrf/version'
|
5
5
|
|
6
|
-
Gem::Specification.new do |
|
7
|
-
|
8
|
-
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = 'rack_csrf'
|
8
|
+
spec.version = Rack::Csrf::VERSION
|
9
|
+
spec.authors = ['Emanuele Vicentini']
|
10
|
+
spec.email = ['emanuele.vicentini@gmail.com']
|
11
|
+
spec.description = 'Anti-CSRF Rack middleware'
|
12
|
+
spec.summary = 'Anti-CSRF Rack middleware'
|
13
|
+
spec.homepage = 'https://github.com/baldowl/rack_csrf'
|
14
|
+
spec.license = 'MIT'
|
9
15
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
16
|
+
spec.files = `git ls-files`.split($/)
|
17
|
+
spec.executables = spec.files.grep(%r{^bin/}) {|f| File.basename f}
|
18
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
|
+
spec.require_paths = ['lib']
|
20
|
+
|
21
|
+
spec.rdoc_options = [
|
22
|
+
'--line-numbers',
|
23
|
+
'--inline-source',
|
24
|
+
'--title',
|
25
|
+
"Rack::Csrf #{Rack::Csrf::VERSION}",
|
26
|
+
'--main',
|
27
|
+
'README.rdoc'
|
18
28
|
]
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
"Gemfile",
|
23
|
-
"LICENSE.rdoc",
|
24
|
-
"README.rdoc",
|
25
|
-
"Rakefile",
|
26
|
-
"VERSION",
|
27
|
-
"cucumber.yml",
|
28
|
-
"examples/camping/Gemfile",
|
29
|
-
"examples/camping/README.rdoc",
|
30
|
-
"examples/camping/app.rb",
|
31
|
-
"examples/camping/config.ru",
|
32
|
-
"examples/cuba/Gemfile",
|
33
|
-
"examples/cuba/README.rdoc",
|
34
|
-
"examples/cuba/app.rb",
|
35
|
-
"examples/cuba/config-with-raise.ru",
|
36
|
-
"examples/cuba/config.ru",
|
37
|
-
"examples/cuba/views/form.erb",
|
38
|
-
"examples/cuba/views/form_not_working.erb",
|
39
|
-
"examples/cuba/views/response.erb",
|
40
|
-
"examples/innate/Gemfile",
|
41
|
-
"examples/innate/README.rdoc",
|
42
|
-
"examples/innate/app.rb",
|
43
|
-
"examples/innate/start-with-raise.rb",
|
44
|
-
"examples/innate/start.rb",
|
45
|
-
"examples/innate/view/index.erb",
|
46
|
-
"examples/innate/view/notworking.erb",
|
47
|
-
"examples/innate/view/response.erb",
|
48
|
-
"examples/rack/Gemfile",
|
49
|
-
"examples/rack/README.rdoc",
|
50
|
-
"examples/rack/app.rb",
|
51
|
-
"examples/rack/config-with-raise.ru",
|
52
|
-
"examples/rack/config.ru",
|
53
|
-
"examples/sinatra/Gemfile",
|
54
|
-
"examples/sinatra/README.rdoc",
|
55
|
-
"examples/sinatra/app.rb",
|
56
|
-
"examples/sinatra/config-with-raise.ru",
|
57
|
-
"examples/sinatra/config.ru",
|
58
|
-
"examples/sinatra/views/form.erb",
|
59
|
-
"examples/sinatra/views/form_not_working.erb",
|
60
|
-
"examples/sinatra/views/response.erb",
|
61
|
-
"features/check_only_some_specific_requests.feature",
|
62
|
-
"features/custom_http_methods.feature",
|
63
|
-
"features/empty_responses.feature",
|
64
|
-
"features/inspecting_also_get_requests.feature",
|
65
|
-
"features/raising_exception.feature",
|
66
|
-
"features/setup.feature",
|
67
|
-
"features/skip_if_block_passes.feature",
|
68
|
-
"features/skip_some_routes.feature",
|
69
|
-
"features/step_definitions/request_steps.rb",
|
70
|
-
"features/step_definitions/response_steps.rb",
|
71
|
-
"features/step_definitions/setup_steps.rb",
|
72
|
-
"features/support/env.rb",
|
73
|
-
"features/support/fake_session.rb",
|
74
|
-
"features/variation_on_field_name.feature",
|
75
|
-
"features/variation_on_header_name.feature",
|
76
|
-
"features/variation_on_key_name.feature",
|
77
|
-
"lib/rack/csrf.rb",
|
78
|
-
"lib/rack/vendor/securerandom.rb",
|
79
|
-
"rack_csrf.gemspec",
|
80
|
-
"spec/csrf_spec.rb",
|
81
|
-
"spec/spec_helper.rb"
|
29
|
+
spec.extra_rdoc_files = [
|
30
|
+
'LICENSE.rdoc',
|
31
|
+
'README.rdoc'
|
82
32
|
]
|
83
|
-
s.homepage = "https://github.com/baldowl/rack_csrf"
|
84
|
-
s.licenses = ["MIT"]
|
85
|
-
s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Rack::Csrf 2.4.0", "--main", "README.rdoc"]
|
86
|
-
s.require_paths = ["lib"]
|
87
|
-
s.rubyforge_project = "rackcsrf"
|
88
|
-
s.rubygems_version = "1.8.17"
|
89
|
-
s.summary = "Anti-CSRF Rack middleware"
|
90
33
|
|
91
|
-
|
92
|
-
s.specification_version = 3
|
34
|
+
spec.required_ruby_version = '>= 1.8.7'
|
93
35
|
|
94
|
-
|
95
|
-
|
96
|
-
s.add_development_dependency(%q<bundler>, [">= 1.0.0"])
|
97
|
-
s.add_development_dependency(%q<cucumber>, [">= 1.1.1"])
|
98
|
-
s.add_development_dependency(%q<rack-test>, [">= 0"])
|
99
|
-
s.add_development_dependency(%q<rspec>, [">= 2.0.0"])
|
100
|
-
s.add_development_dependency(%q<rdoc>, [">= 2.4.2"])
|
101
|
-
s.add_development_dependency(%q<jeweler>, [">= 0"])
|
102
|
-
else
|
103
|
-
s.add_dependency(%q<rack>, [">= 0.9"])
|
104
|
-
s.add_dependency(%q<bundler>, [">= 1.0.0"])
|
105
|
-
s.add_dependency(%q<cucumber>, [">= 1.1.1"])
|
106
|
-
s.add_dependency(%q<rack-test>, [">= 0"])
|
107
|
-
s.add_dependency(%q<rspec>, [">= 2.0.0"])
|
108
|
-
s.add_dependency(%q<rdoc>, [">= 2.4.2"])
|
109
|
-
s.add_dependency(%q<jeweler>, [">= 0"])
|
110
|
-
end
|
36
|
+
if ENV['TEST_WITH_RACK']
|
37
|
+
spec.add_runtime_dependency 'rack', "~> #{ENV['TEST_WITH_RACK']}"
|
111
38
|
else
|
112
|
-
|
113
|
-
s.add_dependency(%q<bundler>, [">= 1.0.0"])
|
114
|
-
s.add_dependency(%q<cucumber>, [">= 1.1.1"])
|
115
|
-
s.add_dependency(%q<rack-test>, [">= 0"])
|
116
|
-
s.add_dependency(%q<rspec>, [">= 2.0.0"])
|
117
|
-
s.add_dependency(%q<rdoc>, [">= 2.4.2"])
|
118
|
-
s.add_dependency(%q<jeweler>, [">= 0"])
|
39
|
+
spec.add_runtime_dependency 'rack', '>= 1.1.0'
|
119
40
|
end
|
120
|
-
end
|
121
41
|
|
42
|
+
spec.add_development_dependency 'bundler', '>= 1.0.0'
|
43
|
+
spec.add_development_dependency 'rake'
|
44
|
+
spec.add_development_dependency 'cucumber', '>= 1.1.1'
|
45
|
+
spec.add_development_dependency 'rack-test', '>= 0'
|
46
|
+
spec.add_development_dependency 'rspec', '~> 3.0'
|
47
|
+
spec.add_development_dependency 'rspec-collection_matchers'
|
48
|
+
spec.add_development_dependency 'rdoc', '>= 2.4.2'
|
49
|
+
spec.add_development_dependency 'git', '>= 1.2.5'
|
50
|
+
end
|