sinatra 3.2.0 → 4.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +24 -3
- data/Gemfile +18 -28
- data/README.md +8 -14
- data/VERSION +1 -1
- data/lib/sinatra/base.rb +51 -22
- data/lib/sinatra/indifferent_hash.rb +0 -6
- data/lib/sinatra/show_exceptions.rb +2 -2
- data/lib/sinatra/version.rb +1 -1
- data/sinatra.gemspec +3 -2
- metadata +32 -12
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 71d0bb379c736d6c251ceb424cac84dbe3a8b22d80a54473a0af1085b93b7dbf
|
4
|
+
data.tar.gz: 489d48a5e4f934127e04cdafa2d0d582c5143cc2a8f476239ea5b5b0f0e492c9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fbe92c1867d3ebe8ddc3f707c4e9f9cf2b68bddf2556164b85083ac635650725d63f8c847b4c70d0ad2abf6793b5f1054918b0b7c4e04d303119867be84c3253
|
7
|
+
data.tar.gz: 0727d88e9f5574c304dd3f31c6107a2b3e1cde96914e258c86fee529a1e922b0ff1d023f109fcc3b232f010ae21d9bdb4c365001dc7c3f658c0bd75b95e8d24d
|
data/CHANGELOG.md
CHANGED
@@ -1,6 +1,27 @@
|
|
1
|
-
##
|
1
|
+
## 4.0.0. / 2024-01-19
|
2
2
|
|
3
|
-
*
|
3
|
+
* New: Add support for Rack 3 ([#1857])
|
4
|
+
* Note: you may want to read the [Rack 3 Upgrade Guide]
|
5
|
+
|
6
|
+
* Require Ruby 2.7.8 as minimum Ruby version ([#1993])
|
7
|
+
|
8
|
+
* Breaking change: Drop support for Rack 2 ([#1857])
|
9
|
+
* Note: when using Sinatra to start the web server, you now need the `rackup` gem installed
|
10
|
+
|
11
|
+
* Breaking change: Remove the `IndifferentHash` initializer ([#1982])
|
12
|
+
|
13
|
+
* Breaking change: Disable `session_hijacking` protection by default ([#1984])
|
14
|
+
|
15
|
+
* Breaking change: Remove `Rack::Protection::EncryptedCookie` ([#1989])
|
16
|
+
* Note: cookies are still encrypted (by [`Rack::Session::Cookie`])
|
17
|
+
|
18
|
+
[#1857]: https://github.com/sinatra/sinatra/pull/1857
|
19
|
+
[#1993]: https://github.com/sinatra/sinatra/pull/1993
|
20
|
+
[#1982]: https://github.com/sinatra/sinatra/pull/1982
|
21
|
+
[#1984]: https://github.com/sinatra/sinatra/pull/1984
|
22
|
+
[#1989]: https://github.com/sinatra/sinatra/pull/1989
|
23
|
+
[`Rack::Session::Cookie`]: https://github.com/rack/rack-session
|
24
|
+
[Rack 3 Upgrade Guide]: https://github.com/rack/rack/blob/main/UPGRADE-GUIDE.md
|
4
25
|
|
5
26
|
## 3.2.0 / 2023-12-29
|
6
27
|
|
@@ -23,7 +44,7 @@
|
|
23
44
|
[#1949]: https://github.com/sinatra/sinatra/pull/1949
|
24
45
|
[#1952]: https://github.com/sinatra/sinatra/pull/1952
|
25
46
|
[#1960]: https://github.com/sinatra/sinatra/pull/1960
|
26
|
-
[#1975]: https://github.com/sinatra/sinatra/pull/
|
47
|
+
[#1975]: https://github.com/sinatra/sinatra/pull/1975
|
27
48
|
|
28
49
|
## 3.1.0 / 2023-08-07
|
29
50
|
|
data/Gemfile
CHANGED
@@ -1,13 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
# Why use bundler?
|
4
|
-
# Well, not all development dependencies install on all rubies. Moreover, `gem
|
5
|
-
# install sinatra --development` doesn't work, as it will also try to install
|
6
|
-
# development dependencies of our dependencies, and those are not conflict free.
|
7
|
-
# So, here we are, `bundle install`.
|
8
|
-
#
|
9
|
-
# If you have issues with a gem: `bundle install --without-coffee-script`.
|
10
|
-
|
11
3
|
source 'https://rubygems.org'
|
12
4
|
gemspec
|
13
5
|
|
@@ -18,6 +10,13 @@ rack_version = nil if rack_version.empty? || (rack_version == 'stable')
|
|
18
10
|
rack_version = { github: 'rack/rack' } if rack_version == 'head'
|
19
11
|
gem 'rack', rack_version
|
20
12
|
|
13
|
+
rack_session_version = ENV['rack_session'].to_s
|
14
|
+
rack_session_version = nil if rack_session_version.empty? || (rack_session_version == 'stable')
|
15
|
+
rack_session_version = { github: 'rack/rack-session' } if rack_session_version == 'head'
|
16
|
+
gem 'rack-session', rack_session_version
|
17
|
+
|
18
|
+
gem 'rackup'
|
19
|
+
|
21
20
|
puma_version = ENV['puma'].to_s
|
22
21
|
puma_version = nil if puma_version.empty? || (puma_version == 'stable')
|
23
22
|
puma_version = { github: 'puma/puma' } if puma_version == 'head'
|
@@ -31,15 +30,9 @@ gem 'yard' # used by rake doc
|
|
31
30
|
gem 'rack-protection', path: 'rack-protection'
|
32
31
|
gem 'sinatra-contrib', path: 'sinatra-contrib'
|
33
32
|
|
34
|
-
# traces 0.10.0 started to use Ruby 2.7 syntax without specifying required Ruby version
|
35
|
-
# https://github.com/socketry/traces/pull/8#discussion_r1237988182
|
36
|
-
# async-http 0.60.2 added traces 0.10.0 as dependency
|
37
|
-
# https://github.com/socketry/async-http/pull/124/files#r1237988899
|
38
|
-
gem 'traces', '< 0.10.0' if RUBY_VERSION >= '2.6.0' && RUBY_VERSION < '2.7.0'
|
39
|
-
|
40
33
|
gem 'asciidoctor'
|
41
34
|
gem 'builder'
|
42
|
-
gem 'childprocess'
|
35
|
+
gem 'childprocess', '>= 5'
|
43
36
|
gem 'commonmarker', '~> 0.23.4', platforms: [:ruby]
|
44
37
|
gem 'erubi'
|
45
38
|
gem 'eventmachine'
|
@@ -47,25 +40,22 @@ gem 'falcon', '~> 0.40', platforms: [:ruby]
|
|
47
40
|
gem 'haml', '~> 6'
|
48
41
|
gem 'kramdown'
|
49
42
|
gem 'liquid'
|
50
|
-
|
51
|
-
# and does not specify required_ruby_version
|
52
|
-
if RUBY_VERSION >= '2.6.0' && RUBY_VERSION < '2.7.0'
|
53
|
-
gem 'markaby', '< 0.9.1'
|
54
|
-
else
|
55
|
-
gem 'markaby'
|
56
|
-
end
|
43
|
+
gem 'markaby'
|
57
44
|
gem 'nokogiri', '> 1.5.0'
|
58
45
|
gem 'pandoc-ruby', '~> 2.0.2'
|
59
46
|
gem 'rabl'
|
60
|
-
|
61
|
-
gem 'rdiscount', '< 2.2.7.2' # https://github.com/oracle/truffleruby/issues/3362
|
62
|
-
else
|
63
|
-
gem 'rdiscount', platforms: [:ruby]
|
64
|
-
end
|
47
|
+
gem 'rdiscount', platforms: [:ruby]
|
65
48
|
gem 'rdoc'
|
66
49
|
gem 'redcarpet', platforms: [:ruby]
|
67
|
-
gem 'sass-embedded', '~> 1.54'
|
68
50
|
gem 'simplecov', require: false
|
69
51
|
gem 'slim', '~> 4'
|
70
52
|
gem 'yajl-ruby', platforms: [:ruby]
|
71
53
|
gem 'zeitwerk'
|
54
|
+
|
55
|
+
# sass-embedded depends on google-protobuf
|
56
|
+
# which fails to be installed on JRuby and TruffleRuby under aarch64
|
57
|
+
# https://github.com/jruby/jruby/issues/8062
|
58
|
+
# https://github.com/protocolbuffers/protobuf/issues/11935
|
59
|
+
java = %w(jruby truffleruby).include?(RUBY_ENGINE)
|
60
|
+
aarch64 = RbConfig::CONFIG["target_cpu"] == 'aarch64'
|
61
|
+
gem 'sass-embedded', '~> 1.54' unless java && aarch64
|
data/README.md
CHANGED
@@ -1922,7 +1922,7 @@ set :protection, :except => :path_traversal
|
|
1922
1922
|
You can also hand in an array in order to disable a list of protections:
|
1923
1923
|
|
1924
1924
|
```ruby
|
1925
|
-
set :protection, :except => [:path_traversal, :
|
1925
|
+
set :protection, :except => [:path_traversal, :remote_token]
|
1926
1926
|
```
|
1927
1927
|
|
1928
1928
|
By default, Sinatra will only set up session based protection if `:sessions`
|
@@ -2820,30 +2820,24 @@ uses a threaded model of concurrency.
|
|
2820
2820
|
|
2821
2821
|
The following Ruby versions are officially supported:
|
2822
2822
|
<dl>
|
2823
|
-
<dt>Ruby
|
2823
|
+
<dt>Ruby</dt>
|
2824
2824
|
<dd>
|
2825
|
-
|
2826
|
-
drop official support for it.
|
2825
|
+
<a href="https://www.ruby-lang.org/en/downloads/">The stable releases</a> are fully supported and recommended.
|
2827
2826
|
</dd>
|
2828
2827
|
|
2829
|
-
<dt>
|
2828
|
+
<dt>TruffleRuby</dt>
|
2830
2829
|
<dd>
|
2831
|
-
|
2832
|
-
<tt>gem install puma</tt>.
|
2830
|
+
The latest stable release of TruffleRuby is supported.
|
2833
2831
|
</dd>
|
2834
2832
|
|
2835
2833
|
<dt>JRuby</dt>
|
2836
2834
|
<dd>
|
2837
|
-
The latest stable release of JRuby is
|
2838
|
-
recommended to use C extensions with JRuby.
|
2839
|
-
<tt>gem install trinidad</tt>.
|
2835
|
+
The latest stable release of JRuby is supported. It is not
|
2836
|
+
recommended to use C extensions with JRuby.
|
2840
2837
|
</dd>
|
2841
2838
|
</dl>
|
2842
2839
|
|
2843
|
-
Versions of Ruby before 2.
|
2844
|
-
|
2845
|
-
We also keep an eye on upcoming Ruby versions. Expect upcoming
|
2846
|
-
3.x releases to be fully supported.
|
2840
|
+
Versions of Ruby before 2.7.8 are no longer supported as of Sinatra 4.0.0.
|
2847
2841
|
|
2848
2842
|
Sinatra should work on any operating system supported by the chosen Ruby
|
2849
2843
|
implementation.
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
|
1
|
+
4.0.0
|
data/lib/sinatra/base.rb
CHANGED
@@ -2,8 +2,13 @@
|
|
2
2
|
|
3
3
|
# external dependencies
|
4
4
|
require 'rack'
|
5
|
+
begin
|
6
|
+
require 'rackup'
|
7
|
+
rescue LoadError
|
8
|
+
end
|
5
9
|
require 'tilt'
|
6
10
|
require 'rack/protection'
|
11
|
+
require 'rack/session'
|
7
12
|
require 'mustermann'
|
8
13
|
require 'mustermann/sinatra'
|
9
14
|
require 'mustermann/regular'
|
@@ -176,8 +181,8 @@ module Sinatra
|
|
176
181
|
result = body
|
177
182
|
|
178
183
|
if drop_content_info?
|
179
|
-
headers.delete '
|
180
|
-
headers.delete '
|
184
|
+
headers.delete 'content-length'
|
185
|
+
headers.delete 'content-type'
|
181
186
|
end
|
182
187
|
|
183
188
|
if drop_body?
|
@@ -186,9 +191,9 @@ module Sinatra
|
|
186
191
|
end
|
187
192
|
|
188
193
|
if calculate_content_length?
|
189
|
-
# if some other code has already set
|
194
|
+
# if some other code has already set content-length, don't muck with it
|
190
195
|
# currently, this would be the static file-handler
|
191
|
-
headers['
|
196
|
+
headers['content-length'] = body.map(&:bytesize).reduce(0, :+).to_s
|
192
197
|
end
|
193
198
|
|
194
199
|
[status, headers, result]
|
@@ -197,7 +202,7 @@ module Sinatra
|
|
197
202
|
private
|
198
203
|
|
199
204
|
def calculate_content_length?
|
200
|
-
headers['
|
205
|
+
headers['content-type'] && !headers['content-length'] && (Array === body)
|
201
206
|
end
|
202
207
|
|
203
208
|
def drop_content_info?
|
@@ -289,10 +294,8 @@ module Sinatra
|
|
289
294
|
def block.each; yield(call) end
|
290
295
|
response.body = block
|
291
296
|
elsif value
|
292
|
-
# Rack 2.0 returns a Rack::File::Iterator here instead of
|
293
|
-
# Rack::File as it was in the previous API.
|
294
297
|
unless request.head? || value.is_a?(Rack::Files::Iterator) || value.is_a?(Stream)
|
295
|
-
headers.delete '
|
298
|
+
headers.delete 'content-length'
|
296
299
|
end
|
297
300
|
response.body = value
|
298
301
|
else
|
@@ -302,7 +305,10 @@ module Sinatra
|
|
302
305
|
|
303
306
|
# Halt processing and redirect to the URI provided.
|
304
307
|
def redirect(uri, *args)
|
305
|
-
|
308
|
+
# SERVER_PROTOCOL is required in Rack 3, fall back to HTTP_VERSION
|
309
|
+
# for servers not updated for Rack 3 (like Puma 5)
|
310
|
+
http_version = env['SERVER_PROTOCOL'] || env['HTTP_VERSION']
|
311
|
+
if (http_version == 'HTTP/1.1') && (env['REQUEST_METHOD'] != 'GET')
|
306
312
|
status 303
|
307
313
|
else
|
308
314
|
status 302
|
@@ -372,10 +378,10 @@ module Sinatra
|
|
372
378
|
Base.mime_type(type)
|
373
379
|
end
|
374
380
|
|
375
|
-
# Set the
|
381
|
+
# Set the content-type of the response body given a media type or file
|
376
382
|
# extension.
|
377
383
|
def content_type(type = nil, params = {})
|
378
|
-
return response['
|
384
|
+
return response['content-type'] unless type
|
379
385
|
|
380
386
|
default = params.delete :default
|
381
387
|
mime_type = mime_type(type) || default
|
@@ -393,7 +399,7 @@ module Sinatra
|
|
393
399
|
"#{key}=#{val}"
|
394
400
|
end.join(', ')
|
395
401
|
end
|
396
|
-
response['
|
402
|
+
response['content-type'] = mime_type
|
397
403
|
end
|
398
404
|
|
399
405
|
# https://html.spec.whatwg.org/#multipart-form-data
|
@@ -412,12 +418,12 @@ module Sinatra
|
|
412
418
|
params = format('; filename="%s"', File.basename(filename).gsub(/["\r\n]/, MULTIPART_FORM_DATA_REPLACEMENT_TABLE))
|
413
419
|
response['Content-Disposition'] << params
|
414
420
|
ext = File.extname(filename)
|
415
|
-
content_type(ext) unless response['
|
421
|
+
content_type(ext) unless response['content-type'] || ext.empty?
|
416
422
|
end
|
417
423
|
|
418
424
|
# Use the contents of the file at +path+ as the response body.
|
419
425
|
def send_file(path, opts = {})
|
420
|
-
if opts[:type] || !response['
|
426
|
+
if opts[:type] || !response['content-type']
|
421
427
|
content_type opts[:type] || File.extname(path), default: 'application/octet-stream'
|
422
428
|
end
|
423
429
|
|
@@ -433,7 +439,7 @@ module Sinatra
|
|
433
439
|
result = file.serving(request, path)
|
434
440
|
|
435
441
|
result[1].each { |k, v| headers[k] ||= v }
|
436
|
-
headers['
|
442
|
+
headers['content-length'] = result[1]['content-length']
|
437
443
|
opts[:status] &&= Integer(opts[:status])
|
438
444
|
halt (opts[:status] || result[0]), result[2]
|
439
445
|
rescue Errno::ENOENT
|
@@ -995,7 +1001,7 @@ module Sinatra
|
|
995
1001
|
invoke { dispatch! }
|
996
1002
|
invoke { error_block!(response.status) } unless @env['sinatra.error']
|
997
1003
|
|
998
|
-
unless @response['
|
1004
|
+
unless @response['content-type']
|
999
1005
|
if Array === body && body[0].respond_to?(:content_type)
|
1000
1006
|
content_type body[0].content_type
|
1001
1007
|
elsif (default = settings.default_content_type)
|
@@ -1058,7 +1064,7 @@ module Sinatra
|
|
1058
1064
|
routes = base.routes[@request.request_method]
|
1059
1065
|
|
1060
1066
|
routes&.each do |pattern, conditions, block|
|
1061
|
-
response.delete_header('
|
1067
|
+
response.delete_header('content-type') unless @pinned_response
|
1062
1068
|
|
1063
1069
|
returned_pass_block = process_route(pattern, conditions) do |*args|
|
1064
1070
|
env['sinatra.route'] = "#{@request.request_method} #{pattern}"
|
@@ -1179,7 +1185,7 @@ module Sinatra
|
|
1179
1185
|
invoke do
|
1180
1186
|
static! if settings.static? && (request.get? || request.head?)
|
1181
1187
|
filter! :before do
|
1182
|
-
@pinned_response = !response['
|
1188
|
+
@pinned_response = !response['content-type'].nil?
|
1183
1189
|
end
|
1184
1190
|
route!
|
1185
1191
|
end
|
@@ -1460,7 +1466,13 @@ module Sinatra
|
|
1460
1466
|
# mime_types :js # => ['application/javascript', 'text/javascript']
|
1461
1467
|
def mime_types(type)
|
1462
1468
|
type = mime_type type
|
1463
|
-
type =~ %r{^application/(xml|javascript)$}
|
1469
|
+
if type =~ %r{^application/(xml|javascript)$}
|
1470
|
+
[type, "text/#{$1}"]
|
1471
|
+
elsif type =~ %r{^text/(xml|javascript)$}
|
1472
|
+
[type, "application/#{$1}"]
|
1473
|
+
else
|
1474
|
+
[type]
|
1475
|
+
end
|
1464
1476
|
end
|
1465
1477
|
|
1466
1478
|
# Define a before filter; runs before all requests within the same
|
@@ -1589,10 +1601,27 @@ module Sinatra
|
|
1589
1601
|
# Puma, Falcon, or WEBrick (in that order). If given a block, will call
|
1590
1602
|
# with the constructed handler once we have taken the stage.
|
1591
1603
|
def run!(options = {}, &block)
|
1604
|
+
unless defined?(Rackup::Handler)
|
1605
|
+
rackup_warning = <<~MISSING_RACKUP
|
1606
|
+
Sinatra could not start, the "rackup" gem was not found!
|
1607
|
+
|
1608
|
+
Add it to your bundle with:
|
1609
|
+
|
1610
|
+
bundle add rackup
|
1611
|
+
|
1612
|
+
or install it with:
|
1613
|
+
|
1614
|
+
gem install rackup
|
1615
|
+
|
1616
|
+
MISSING_RACKUP
|
1617
|
+
warn rackup_warning
|
1618
|
+
exit 1
|
1619
|
+
end
|
1620
|
+
|
1592
1621
|
return if running?
|
1593
1622
|
|
1594
1623
|
set options
|
1595
|
-
handler =
|
1624
|
+
handler = Rackup::Handler.pick(server)
|
1596
1625
|
handler_name = handler.name.gsub(/.*::/, '')
|
1597
1626
|
server_settings = settings.respond_to?(:server_settings) ? settings.server_settings : {}
|
1598
1627
|
server_settings.merge!(Port: port, Host: bind)
|
@@ -1724,7 +1753,7 @@ module Sinatra
|
|
1724
1753
|
types.map! { |t| mime_types(t) }
|
1725
1754
|
types.flatten!
|
1726
1755
|
condition do
|
1727
|
-
response_content_type = response['
|
1756
|
+
response_content_type = response['content-type']
|
1728
1757
|
preferred_type = request.preferred_type(types)
|
1729
1758
|
|
1730
1759
|
if response_content_type
|
@@ -1901,7 +1930,7 @@ module Sinatra
|
|
1901
1930
|
set :dump_errors, proc { !test? }
|
1902
1931
|
set :show_exceptions, proc { development? }
|
1903
1932
|
set :sessions, false
|
1904
|
-
set :session_store, Rack::
|
1933
|
+
set :session_store, Rack::Session::Cookie
|
1905
1934
|
set :logging, false
|
1906
1935
|
set :protection, true
|
1907
1936
|
set :method_override, false
|
data/lib/sinatra/version.rb
CHANGED
data/sinatra.gemspec
CHANGED
@@ -43,10 +43,11 @@ RubyGems 2.0 or newer is required to protect against public gem pushes. You can
|
|
43
43
|
'documentation_uri' => 'https://www.rubydoc.info/gems/sinatra'
|
44
44
|
}
|
45
45
|
|
46
|
-
s.required_ruby_version = '>= 2.
|
46
|
+
s.required_ruby_version = '>= 2.7.8'
|
47
47
|
|
48
48
|
s.add_dependency 'mustermann', '~> 3.0'
|
49
|
-
s.add_dependency 'rack', '
|
49
|
+
s.add_dependency 'rack', '>= 3.0.0', '< 4'
|
50
|
+
s.add_dependency 'rack-session', '>= 2.0.0', '< 3'
|
50
51
|
s.add_dependency 'rack-protection', version
|
51
52
|
s.add_dependency 'tilt', '~> 2.0'
|
52
53
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sinatra
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 4.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Blake Mizerany
|
@@ -11,7 +11,7 @@ authors:
|
|
11
11
|
autorequire:
|
12
12
|
bindir: bin
|
13
13
|
cert_chain: []
|
14
|
-
date:
|
14
|
+
date: 2024-01-19 00:00:00.000000000 Z
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
17
|
name: mustermann
|
@@ -31,36 +31,56 @@ dependencies:
|
|
31
31
|
name: rack
|
32
32
|
requirement: !ruby/object:Gem::Requirement
|
33
33
|
requirements:
|
34
|
-
- - "~>"
|
35
|
-
- !ruby/object:Gem::Version
|
36
|
-
version: '2.2'
|
37
34
|
- - ">="
|
38
35
|
- !ruby/object:Gem::Version
|
39
|
-
version:
|
36
|
+
version: 3.0.0
|
37
|
+
- - "<"
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: '4'
|
40
40
|
type: :runtime
|
41
41
|
prerelease: false
|
42
42
|
version_requirements: !ruby/object:Gem::Requirement
|
43
43
|
requirements:
|
44
|
-
- - "
|
44
|
+
- - ">="
|
45
45
|
- !ruby/object:Gem::Version
|
46
|
-
version:
|
46
|
+
version: 3.0.0
|
47
|
+
- - "<"
|
48
|
+
- !ruby/object:Gem::Version
|
49
|
+
version: '4'
|
50
|
+
- !ruby/object:Gem::Dependency
|
51
|
+
name: rack-session
|
52
|
+
requirement: !ruby/object:Gem::Requirement
|
53
|
+
requirements:
|
47
54
|
- - ">="
|
48
55
|
- !ruby/object:Gem::Version
|
49
|
-
version: 2.
|
56
|
+
version: 2.0.0
|
57
|
+
- - "<"
|
58
|
+
- !ruby/object:Gem::Version
|
59
|
+
version: '3'
|
60
|
+
type: :runtime
|
61
|
+
prerelease: false
|
62
|
+
version_requirements: !ruby/object:Gem::Requirement
|
63
|
+
requirements:
|
64
|
+
- - ">="
|
65
|
+
- !ruby/object:Gem::Version
|
66
|
+
version: 2.0.0
|
67
|
+
- - "<"
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '3'
|
50
70
|
- !ruby/object:Gem::Dependency
|
51
71
|
name: rack-protection
|
52
72
|
requirement: !ruby/object:Gem::Requirement
|
53
73
|
requirements:
|
54
74
|
- - '='
|
55
75
|
- !ruby/object:Gem::Version
|
56
|
-
version:
|
76
|
+
version: 4.0.0
|
57
77
|
type: :runtime
|
58
78
|
prerelease: false
|
59
79
|
version_requirements: !ruby/object:Gem::Requirement
|
60
80
|
requirements:
|
61
81
|
- - '='
|
62
82
|
- !ruby/object:Gem::Version
|
63
|
-
version:
|
83
|
+
version: 4.0.0
|
64
84
|
- !ruby/object:Gem::Dependency
|
65
85
|
name: tilt
|
66
86
|
requirement: !ruby/object:Gem::Requirement
|
@@ -132,7 +152,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
132
152
|
requirements:
|
133
153
|
- - ">="
|
134
154
|
- !ruby/object:Gem::Version
|
135
|
-
version: 2.
|
155
|
+
version: 2.7.8
|
136
156
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
137
157
|
requirements:
|
138
158
|
- - ">="
|