scorched 1.0.0.pre3 → 1.0.2
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 +5 -5
- data/CHANGES.md +10 -2
- data/lib/scorched/controller.rb +8 -4
- data/lib/scorched/request.rb +2 -2
- data/lib/scorched/version.rb +1 -1
- data/scorched.gemspec +3 -4
- data/spec/controller_spec.rb +56 -56
- data/spec/helper.rb +3 -0
- metadata +13 -14
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 867ade7529bcd2c1aef6c5ae9ec3898078f1aedc65e190d29fd03781f7fbaabb
|
4
|
+
data.tar.gz: 7275bd4b007d91441a06cd2a90e58fac6e49ea598fa146964fb074cc03af2f37
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0a0b3feb7e16e82571277ec4c97f8555b268013cbb8172e464a3d30fd4639e66c3ff817b9f165e5f4a2b4ef7b1470d28aaad4568dda1bad4cb56c390bf4a9cce
|
7
|
+
data.tar.gz: 9dbfa1171f29c6037c173ece4f584a828c073671896c2f6b40dcc49dd37269ac5ad096909ec4d77bfdb88b212c0d4278c39206d370a30fc37aa9a836c77a73dc
|
data/CHANGES.md
CHANGED
@@ -1,8 +1,16 @@
|
|
1
1
|
Changelog
|
2
2
|
=========
|
3
3
|
|
4
|
-
|
5
|
-
|
4
|
+
### v1.0.2
|
5
|
+
* Now requiring CGI instead of URI library as per v1.0.1 deprecation fixes.
|
6
|
+
### v1.0.1
|
7
|
+
* Fixed Ruby 2.7 deprecations
|
8
|
+
### v1.0.0
|
9
|
+
* Updated all dependencies. Ready for 1.0.0 release.
|
10
|
+
### v1.0.0.pre5
|
11
|
+
* Log level now defaults to :warn for every environment except development, which defaults to :debug
|
12
|
+
### v1.0.0.pre4
|
13
|
+
* Added `dispatched` condition which performs a similar role to the recently removed `handled` condition.
|
6
14
|
### v1.0.0.pre3
|
7
15
|
* APP_ENV now preferred over RACK_ENV for setting the environment.
|
8
16
|
### v1.0.0.pre2
|
data/lib/scorched/controller.rb
CHANGED
@@ -18,7 +18,7 @@ module Scorched
|
|
18
18
|
config << {
|
19
19
|
:auto_pass => false, # Automatically _pass_ request back to outer controller if no route matches.
|
20
20
|
:cache_templates => true,
|
21
|
-
:logger =>
|
21
|
+
:logger => nil,
|
22
22
|
:show_exceptions => false,
|
23
23
|
:show_http_error_pages => false, # If true, shows the default Scorched HTTP error page.
|
24
24
|
:static_dir => false, # The directory Scorched should serve static files from. Set to false if web server or anything else is serving static files.
|
@@ -35,6 +35,7 @@ module Scorched
|
|
35
35
|
}
|
36
36
|
|
37
37
|
if ENV['APP_ENV'] == 'development'
|
38
|
+
config[:logger] = Logger.new(STDOUT)
|
38
39
|
config[:show_exceptions] = true
|
39
40
|
config[:static_dir] = 'public'
|
40
41
|
config[:cache_templates] = false
|
@@ -51,6 +52,9 @@ module Scorched
|
|
51
52
|
content_type: proc { |content_types|
|
52
53
|
[*content_types].include? env['CONTENT_TYPE']
|
53
54
|
},
|
55
|
+
dispatched: proc { |bool|
|
56
|
+
!!@_dispatched == bool
|
57
|
+
},
|
54
58
|
encoding: proc { |encodings|
|
55
59
|
[*encodings].any? { |encoding| env['rack-accept.request'].encoding? encoding }
|
56
60
|
},
|
@@ -152,7 +156,7 @@ module Scorched
|
|
152
156
|
else
|
153
157
|
controller = klass
|
154
158
|
end
|
155
|
-
self
|
159
|
+
self.map **{pattern: pattern, target: controller}.merge(mapping)
|
156
160
|
controller
|
157
161
|
end
|
158
162
|
|
@@ -176,7 +180,7 @@ module Scorched
|
|
176
180
|
response
|
177
181
|
end
|
178
182
|
[*pattern].compact.each do |pattern|
|
179
|
-
self
|
183
|
+
self.map pattern: compile(pattern, true), priority: priority, conditions: conds, target: target
|
180
184
|
end
|
181
185
|
target
|
182
186
|
end
|
@@ -462,7 +466,7 @@ module Scorched
|
|
462
466
|
if value.empty?
|
463
467
|
request.cookies[name]
|
464
468
|
else
|
465
|
-
value = Hash === value[0] ? value[0] : {value: value}
|
469
|
+
value = (Hash === value[0]) ? value[0] : {value: value[0]}
|
466
470
|
if value[:value].nil?
|
467
471
|
response.delete_cookie(name, value)
|
468
472
|
else
|
data/lib/scorched/request.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
require '
|
1
|
+
require 'cgi'
|
2
2
|
|
3
3
|
module Scorched
|
4
4
|
class Request < Rack::Request
|
@@ -33,7 +33,7 @@ module Scorched
|
|
33
33
|
# The unescaped URL, excluding the escaped forward-slash and percent. The resulting string will always be safe
|
34
34
|
# to unescape again in situations where the forward-slash or percent are expected and valid characters.
|
35
35
|
def unescaped_path
|
36
|
-
path_info.split(/(%25|%2F)/i).each_slice(2).map { |v, m|
|
36
|
+
path_info.split(/(%25|%2F)/i).each_slice(2).map { |v, m| CGI.unescape(v) << (m || '') }.join('')
|
37
37
|
end
|
38
38
|
|
39
39
|
private
|
data/lib/scorched/version.rb
CHANGED
data/scorched.gemspec
CHANGED
@@ -10,7 +10,6 @@ Gem::Specification.new 'scorched', Scorched::VERSION do |s|
|
|
10
10
|
s.license = 'MIT'
|
11
11
|
s.files = Dir.glob(`git ls-files`.split("\n") - %w[.gitignore])
|
12
12
|
s.test_files = Dir.glob('spec/**/*_spec.rb')
|
13
|
-
s.has_rdoc = 'yard'
|
14
13
|
|
15
14
|
s.required_ruby_version = '>= 2.0.0'
|
16
15
|
|
@@ -18,7 +17,7 @@ Gem::Specification.new 'scorched', Scorched::VERSION do |s|
|
|
18
17
|
s.add_dependency 'rack-accept', '~> 0.4' # Used for Accept-Charset, Accept-Encoding and Accept-Language headers.
|
19
18
|
s.add_dependency 'scorched-accept', '~> 0.1' # Used for Accept header.
|
20
19
|
s.add_dependency 'tilt', '~> 2.0'
|
21
|
-
s.add_development_dependency 'rack-test', '
|
22
|
-
s.add_development_dependency 'rspec', '
|
23
|
-
s.add_development_dependency 'rake', '
|
20
|
+
s.add_development_dependency 'rack-test', '>= 1.0'
|
21
|
+
s.add_development_dependency 'rspec', '>= 3.4'
|
22
|
+
s.add_development_dependency 'rake', '>= 10.4'
|
24
23
|
end
|
data/spec/controller_spec.rb
CHANGED
@@ -24,13 +24,13 @@ module Scorched
|
|
24
24
|
end
|
25
25
|
|
26
26
|
it "handles a root rack call correctly" do
|
27
|
-
app
|
27
|
+
app.map pattern: '/$', target: generic_handler
|
28
28
|
response = rt.get '/'
|
29
29
|
response.status.should == 200
|
30
30
|
end
|
31
31
|
|
32
32
|
it "does not maintain state between requests" do
|
33
|
-
app
|
33
|
+
app.map pattern: '/state', target: proc { |env| [200, {}, [@state = 1 + @state.to_i]] }
|
34
34
|
response = rt.get '/state'
|
35
35
|
response.body.should == '1'
|
36
36
|
response = rt.get '/state'
|
@@ -39,54 +39,54 @@ module Scorched
|
|
39
39
|
|
40
40
|
it "raises exception when invalid mapping hash given" do
|
41
41
|
expect {
|
42
|
-
app
|
42
|
+
app.map(pattern: '/')
|
43
43
|
}.to raise_error(ArgumentError)
|
44
44
|
expect {
|
45
|
-
app
|
45
|
+
app.map(target: generic_handler)
|
46
46
|
}.to raise_error(ArgumentError)
|
47
47
|
end
|
48
48
|
end
|
49
49
|
|
50
50
|
describe "URL matching" do
|
51
51
|
it 'always matches from the beginning of the URL' do
|
52
|
-
app
|
52
|
+
app.map pattern: 'about', target: generic_handler
|
53
53
|
response = rt.get '/about'
|
54
54
|
response.status.should == 404
|
55
55
|
end
|
56
56
|
|
57
57
|
it "matches eagerly by default" do
|
58
58
|
req = nil
|
59
|
-
app
|
59
|
+
app.map pattern: '/*', target: proc { |env|
|
60
60
|
req = request; [200, {}, ['ok']]
|
61
|
-
|
61
|
+
}
|
62
62
|
response = rt.get '/about'
|
63
63
|
req.captures.should == ['about']
|
64
64
|
end
|
65
65
|
|
66
66
|
it "can be forced to match end of URL" do
|
67
|
-
app
|
67
|
+
app.map pattern: '/about$', target: generic_handler
|
68
68
|
response = rt.get '/about/us'
|
69
69
|
response.status.should == 404
|
70
|
-
app
|
70
|
+
app.map pattern: '/about', target: generic_handler
|
71
71
|
response = rt.get '/about/us'
|
72
72
|
response.status.should == 200
|
73
73
|
end
|
74
74
|
|
75
75
|
it "unescapes all characters except for the forward-slash and percent sign" do
|
76
|
-
app
|
76
|
+
app.map pattern: '/a (quite) big fish', target: generic_handler
|
77
77
|
rt.get('/a%20%28quite%29%20big%20fish').status.should == 200
|
78
|
-
app
|
78
|
+
app.map pattern: '/article/100%25 big%2Fsmall', target: generic_handler
|
79
79
|
rt.get('/article/100%25%20big%2Fsmall').status.should == 200
|
80
|
-
app
|
80
|
+
app.map pattern: '/*$', target: generic_handler
|
81
81
|
rt.get('/page%2Fabout').status.should == 200
|
82
82
|
rt.get('/page/about').status.should == 404
|
83
83
|
end
|
84
84
|
|
85
85
|
it "unmatched path doesn't always begin with a forward slash" do
|
86
86
|
gh = generic_handler
|
87
|
-
app
|
87
|
+
app.map pattern: '/ab', target: Class.new(Scorched::Controller) {
|
88
88
|
map(pattern: 'out', target: gh)
|
89
|
-
|
89
|
+
}
|
90
90
|
resp = rt.get('/about')
|
91
91
|
resp.status.should == 200
|
92
92
|
resp.body.should == "ok"
|
@@ -94,119 +94,119 @@ module Scorched
|
|
94
94
|
|
95
95
|
it "unmatched path begins with forward slash if last match was up to or included a forward slash" do
|
96
96
|
gh = generic_handler
|
97
|
-
app
|
97
|
+
app.map pattern: '/about/', target: Class.new(Scorched::Controller) {
|
98
98
|
map(pattern: '/us', target: gh)
|
99
|
-
|
100
|
-
app
|
99
|
+
}
|
100
|
+
app.map pattern: '/contact', target: Class.new(Scorched::Controller) {
|
101
101
|
map(pattern: '/us', target: gh)
|
102
|
-
|
102
|
+
}
|
103
103
|
rt.get('/about/us').body.should == "ok"
|
104
104
|
rt.get('/contact/us').body.should == "ok"
|
105
105
|
end
|
106
106
|
|
107
107
|
it "can match anonymous wildcards" do
|
108
108
|
req = nil
|
109
|
-
app
|
109
|
+
app.map pattern: '/anon/*/**', target: proc { |env|
|
110
110
|
req = request; [200, {}, ['ok']]
|
111
|
-
|
111
|
+
}
|
112
112
|
response = rt.get '/anon/jeff/has/crabs'
|
113
113
|
req.captures.should == ['jeff', 'has/crabs']
|
114
114
|
end
|
115
115
|
|
116
116
|
it "can match named wildcards (ignoring anonymous captures)" do
|
117
117
|
req = nil
|
118
|
-
app
|
118
|
+
app.map pattern: '/anon/:name/*/::infliction', target: proc { |env|
|
119
119
|
req = request; [200, {}, ['ok']]
|
120
|
-
|
120
|
+
}
|
121
121
|
response = rt.get '/anon/jeff/smith/has/crabs'
|
122
122
|
req.captures.should == {name: 'jeff', infliction: 'has/crabs'}
|
123
123
|
end
|
124
124
|
|
125
125
|
example "wildcards match one or more characters" do
|
126
|
-
app
|
126
|
+
app.map pattern: '/*', target: proc { |env| [200, {}, ['ok']] }
|
127
127
|
rt.get('/').status.should == 404
|
128
128
|
rt.get('/dog').status.should == 200
|
129
129
|
app.mappings.clear
|
130
|
-
app
|
130
|
+
app.map pattern: '/**', target: proc { |env| [200, {}, ['ok']] }
|
131
131
|
rt.get('/').status.should == 404
|
132
132
|
rt.get('/dog/cat').status.should == 200
|
133
133
|
app.mappings.clear
|
134
|
-
app
|
134
|
+
app.map pattern: '/:page', target: proc { |env| [200, {}, ['ok']] }
|
135
135
|
rt.get('/').status.should == 404
|
136
136
|
rt.get('/dog').status.should == 200
|
137
137
|
app.mappings.clear
|
138
|
-
app
|
138
|
+
app.map pattern: '/::page', target: proc { |env| [200, {}, ['ok']] }
|
139
139
|
rt.get('/').status.should == 404
|
140
140
|
rt.get('/dog/cat').status.should == 200
|
141
141
|
end
|
142
142
|
|
143
143
|
example "wildcards can optionally match zero or more characters" do
|
144
|
-
app
|
144
|
+
app.map pattern: '/*?', target: proc { |env| [200, {}, ['ok']] }
|
145
145
|
rt.get('/').status.should == 200
|
146
146
|
rt.get('/dog').status.should == 200
|
147
147
|
app.mappings.clear
|
148
|
-
app
|
148
|
+
app.map pattern: '/**?', target: proc { |env| [200, {}, ['ok']] }
|
149
149
|
rt.get('/').status.should == 200
|
150
150
|
rt.get('/dog/cat').status.should == 200
|
151
151
|
app.mappings.clear
|
152
|
-
app
|
152
|
+
app.map pattern: '/:page?', target: proc { |env| [200, {}, ['ok']] }
|
153
153
|
rt.get('/').status.should == 200
|
154
154
|
rt.get('/dog').status.should == 200
|
155
155
|
app.mappings.clear
|
156
|
-
app
|
156
|
+
app.map pattern: '/::page?', target: proc { |env| [200, {}, ['ok']] }
|
157
157
|
rt.get('/').status.should == 200
|
158
158
|
rt.get('/dog/cat').status.should == 200
|
159
159
|
end
|
160
160
|
|
161
161
|
it "can match regex and preserve anonymous captures" do
|
162
162
|
req = nil
|
163
|
-
app
|
163
|
+
app.map pattern: %r{/anon/([^/]+)/(.+)}, target: proc { |env|
|
164
164
|
req = request; [200, {}, ['ok']]
|
165
|
-
|
165
|
+
}
|
166
166
|
response = rt.get '/anon/jeff/has/crabs'
|
167
167
|
req.captures.should == ['jeff', 'has/crabs']
|
168
168
|
end
|
169
169
|
|
170
170
|
it "can match regex and preserve named captures (ignoring anonymous captures)" do
|
171
171
|
req = nil
|
172
|
-
app
|
172
|
+
app.map pattern: %r{/anon/(?<name>[^/]+)/([^/]+)/(?<infliction>.+)}, target: proc { |env|
|
173
173
|
req = request; [200, {}, ['ok']]
|
174
|
-
|
174
|
+
}
|
175
175
|
response = rt.get '/anon/jeff/smith/has/crabs'
|
176
176
|
req.captures.should == {name: 'jeff', infliction: 'has/crabs'}
|
177
177
|
end
|
178
178
|
|
179
179
|
it "can use symbol matchers" do
|
180
|
-
app
|
180
|
+
app.map pattern: '/:numeric', target: proc { |env| [200, {}, ['ok']] }
|
181
181
|
rt.get('/45').status.should == 200
|
182
182
|
rt.get('/dog45').status.should == 404
|
183
183
|
req = nil
|
184
|
-
app
|
184
|
+
app.map pattern: '/:alpha_numeric', target: proc { |env| req = request; [200, {}, ['ok']] }
|
185
185
|
rt.get('/dog45').status.should == 200
|
186
186
|
req.captures[:alpha_numeric].should == 'dog45'
|
187
187
|
rt.get('/_dog45').status.should == 404
|
188
188
|
end
|
189
189
|
|
190
190
|
it "can coerce symbol-matched values" do
|
191
|
-
app
|
191
|
+
app.map pattern: '/:numeric', target: proc { |env| [200, {}, [request.captures[:numeric].class.name]] }
|
192
192
|
rt.get('/45').body.should == 'Integer'
|
193
193
|
end
|
194
194
|
|
195
195
|
it "matches routes based on priority, otherwise giving precedence to those defined first" do
|
196
196
|
order = []
|
197
|
-
app
|
198
|
-
app
|
199
|
-
app
|
200
|
-
app
|
197
|
+
app.map pattern: '/', priority: -1, target: proc { |env| order << 'four'; [200, {}, ['ok']] }
|
198
|
+
app.map pattern: '/', target: proc { |env| order << 'two'; throw :pass }
|
199
|
+
app.map pattern: '/', target: proc { |env| order << 'three'; throw :pass }
|
200
|
+
app.map pattern: '/', priority: 2, target: proc { |env| order << 'one'; throw :pass }
|
201
201
|
rt.get('/').body.should == 'ok'
|
202
202
|
order.should == %w{one two three four}
|
203
203
|
end
|
204
204
|
|
205
205
|
it "finds the best match for the media type whilst respecting priority and definition order" do
|
206
|
-
app
|
207
|
-
app
|
208
|
-
app
|
209
|
-
app
|
206
|
+
app.map pattern: '/', target: proc { |env| [200, {}, ['anything']] }
|
207
|
+
app.map pattern: '/', conditions: {media_type: 'application/json'}, target: proc { |env| [200, {}, ['application/json']] }
|
208
|
+
app.map pattern: '/', conditions: {media_type: 'text/html'}, target: proc { |env| [200, {}, ['text/html']] }
|
209
|
+
app.map pattern: '/', priority: 1, target: proc { |env| [200, {}, ['anything_high_priority']] }
|
210
210
|
rt.get('/', {}, 'HTTP_ACCEPT' => 'application/json, */*;q=0.5').body.should == 'anything_high_priority'
|
211
211
|
app.mappings.pop
|
212
212
|
rt.get('/', {}, 'HTTP_ACCEPT' => 'application/json;q=0.5, text/html').body.should == 'text/html'
|
@@ -224,14 +224,14 @@ module Scorched
|
|
224
224
|
end
|
225
225
|
|
226
226
|
it "executes route only if all conditions return true" do
|
227
|
-
app
|
227
|
+
app.map pattern: '/$', conditions: {method: 'POST'}, target: generic_handler
|
228
228
|
response = rt.get "/"
|
229
229
|
response.status.should be_between(400, 499)
|
230
230
|
response = rt.post "/"
|
231
231
|
response.status.should == 200
|
232
232
|
|
233
233
|
app.conditions[:has_name] = proc { |name| request.GET['name'] }
|
234
|
-
app
|
234
|
+
app.map pattern: '/about', conditions: {method: ['GET', 'POST'], has_name: 'Ronald'}, target: generic_handler
|
235
235
|
response = rt.get "/about"
|
236
236
|
response.status.should be_between(400, 499)
|
237
237
|
response = rt.get "/about", name: 'Ronald'
|
@@ -239,21 +239,21 @@ module Scorched
|
|
239
239
|
end
|
240
240
|
|
241
241
|
it "raises exception when condition doesn't exist or is invalid" do
|
242
|
-
app
|
242
|
+
app.map pattern: '/', conditions: {surprise_christmas_turkey: true}, target: generic_handler
|
243
243
|
expect {
|
244
244
|
rt.get "/"
|
245
245
|
}.to raise_error(Scorched::Error)
|
246
246
|
end
|
247
247
|
|
248
248
|
it "falls through to next route when conditions are not met" do
|
249
|
-
app
|
250
|
-
app
|
249
|
+
app.map pattern: '/', conditions: {method: 'POST'}, target: proc { |env| [200, {}, ['post']] }
|
250
|
+
app.map pattern: '/', conditions: {method: 'GET'}, target: proc { |env| [200, {}, ['get']] }
|
251
251
|
rt.get("/").body.should == 'get'
|
252
252
|
rt.post("/").body.should == 'post'
|
253
253
|
end
|
254
254
|
|
255
255
|
it "inverts the conditions if it's referenced with a trailing exclamation mark" do
|
256
|
-
app
|
256
|
+
app.map pattern: '/', conditions: {method!: 'GET'}, target: proc { |env| [200, {}, ['ok']] }
|
257
257
|
rt.get("/").status.should == 405
|
258
258
|
rt.post("/").status.should == 200
|
259
259
|
end
|
@@ -272,7 +272,7 @@ module Scorched
|
|
272
272
|
wrapped_block = app.route(&block)
|
273
273
|
app.mappings.length.should == 0
|
274
274
|
block.should_not == wrapped_block
|
275
|
-
app
|
275
|
+
app.map pattern: '/*', target: wrapped_block
|
276
276
|
rt.get('/turkey').body.should == 'turkey'
|
277
277
|
end
|
278
278
|
|
@@ -319,9 +319,9 @@ module Scorched
|
|
319
319
|
|
320
320
|
describe "sub-controllers" do
|
321
321
|
it "should ignore the already matched portions of the path" do
|
322
|
-
app
|
322
|
+
app.map pattern: '/article', target: Class.new(Scorched::Controller) {
|
323
323
|
get('/*') { |title| title }
|
324
|
-
|
324
|
+
}
|
325
325
|
rt.get('/article/hello-world').body.should == 'hello-world'
|
326
326
|
end
|
327
327
|
|
@@ -916,7 +916,7 @@ module Scorched
|
|
916
916
|
get('/hello') { 'hello' }
|
917
917
|
after { response.status = 600 }
|
918
918
|
end
|
919
|
-
app
|
919
|
+
app.map pattern: '/', target: sub
|
920
920
|
app.get('/') { 'ok' }
|
921
921
|
rt.get('/').body.should == 'ok'
|
922
922
|
rt.get('/').status.should == 200
|
@@ -1096,7 +1096,7 @@ module Scorched
|
|
1096
1096
|
render(:'main.erb').should == "3 for me"
|
1097
1097
|
end
|
1098
1098
|
app.get('/full_path') do
|
1099
|
-
render(:'views/main.erb', {layout: :'views/layout.erb', dir: nil}).should == "(3 for me)"
|
1099
|
+
render(:'views/main.erb', **{layout: :'views/layout.erb', dir: nil}).should == "(3 for me)"
|
1100
1100
|
end
|
1101
1101
|
app.render_defaults[:dir] = 'views'
|
1102
1102
|
rt.get('/')
|
data/spec/helper.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: scorched
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tom Wardrop
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-01-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rack
|
@@ -70,42 +70,42 @@ dependencies:
|
|
70
70
|
name: rack-test
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
|
-
- - "
|
73
|
+
- - ">="
|
74
74
|
- !ruby/object:Gem::Version
|
75
|
-
version: '0
|
75
|
+
version: '1.0'
|
76
76
|
type: :development
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
|
-
- - "
|
80
|
+
- - ">="
|
81
81
|
- !ruby/object:Gem::Version
|
82
|
-
version: '0
|
82
|
+
version: '1.0'
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
84
|
name: rspec
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
86
86
|
requirements:
|
87
|
-
- - "
|
87
|
+
- - ">="
|
88
88
|
- !ruby/object:Gem::Version
|
89
89
|
version: '3.4'
|
90
90
|
type: :development
|
91
91
|
prerelease: false
|
92
92
|
version_requirements: !ruby/object:Gem::Requirement
|
93
93
|
requirements:
|
94
|
-
- - "
|
94
|
+
- - ">="
|
95
95
|
- !ruby/object:Gem::Version
|
96
96
|
version: '3.4'
|
97
97
|
- !ruby/object:Gem::Dependency
|
98
98
|
name: rake
|
99
99
|
requirement: !ruby/object:Gem::Requirement
|
100
100
|
requirements:
|
101
|
-
- - "
|
101
|
+
- - ">="
|
102
102
|
- !ruby/object:Gem::Version
|
103
103
|
version: '10.4'
|
104
104
|
type: :development
|
105
105
|
prerelease: false
|
106
106
|
version_requirements: !ruby/object:Gem::Requirement
|
107
107
|
requirements:
|
108
|
-
- - "
|
108
|
+
- - ">="
|
109
109
|
- !ruby/object:Gem::Version
|
110
110
|
version: '10.4'
|
111
111
|
description: A light-weight Sinatra-inspired web framework for web sites and applications
|
@@ -186,12 +186,11 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
186
186
|
version: 2.0.0
|
187
187
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
188
188
|
requirements:
|
189
|
-
- - "
|
189
|
+
- - ">="
|
190
190
|
- !ruby/object:Gem::Version
|
191
|
-
version:
|
191
|
+
version: '0'
|
192
192
|
requirements: []
|
193
|
-
|
194
|
-
rubygems_version: 2.6.12
|
193
|
+
rubygems_version: 3.1.2
|
195
194
|
signing_key:
|
196
195
|
specification_version: 4
|
197
196
|
summary: Light-weight, DRY as a desert, web framework for Ruby
|