roda 3.36.0 → 3.37.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 +4 -4
- data/CHANGELOG +4 -0
- data/doc/release_notes/3.37.0.txt +42 -0
- data/lib/roda/plugins/custom_matchers.rb +87 -0
- data/lib/roda/plugins/typecast_params.rb +2 -3
- data/lib/roda/version.rb +1 -1
- metadata +6 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: de8c769572875e477058b48557b22861b9de731fa3b00b20a3022a67c929609d
|
4
|
+
data.tar.gz: 5cacc0d7b988bd3dc5bafbc30fcac145f6f67ddcc0e7809e1fc9cd60d8a16273
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1bf7df28d82f31820cd19c29b5a3f0f3afbbae2c41cf05974b16698c7ffb1725e924491874ddbb3f355a88990d4aab6d5b5b38f2d9c7612a548bfe0e3701ac2e
|
7
|
+
data.tar.gz: 32fca636d6324d29958cbcdf5c949c413eaeda7b74a701032d5766a60ec6b3f2db7ec262268dac697c3b3f5f9b183e127ddf265c7ba5015578969bc7f8be02a2
|
data/CHANGELOG
CHANGED
@@ -0,0 +1,42 @@
|
|
1
|
+
= New Features
|
2
|
+
|
3
|
+
* A custom_matchers plugin has been added, which allows using
|
4
|
+
arbitrary objects as matchers, as long as the matcher has been
|
5
|
+
registered. You can register matchers using the custom_matcher
|
6
|
+
class method, which takes the class of the matcher, and a block
|
7
|
+
which is yielded the matcher object. The block should return
|
8
|
+
nil or false if the matcher doesn't match, and any other value
|
9
|
+
if the matcher does match. Example:
|
10
|
+
|
11
|
+
plugin :custom_matchers
|
12
|
+
method_segment = Struct.new(:request_method, :next_segment)
|
13
|
+
custom_matcher(method_segment) do |matcher|
|
14
|
+
# self is the request instance ("r" yielded in the route block below)
|
15
|
+
if matcher.request_method == self.request_method
|
16
|
+
match(matcher.next_segment)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
get_foo = method_segment.new('GET', 'foo')
|
21
|
+
post_any = method_segment.new('POST', String)
|
22
|
+
route do |r|
|
23
|
+
r.on('baz') do
|
24
|
+
r.on(get_foo) do
|
25
|
+
# GET method, /baz/foo prefix
|
26
|
+
end
|
27
|
+
|
28
|
+
r.is(post_any) do |seg|
|
29
|
+
# for POST /baz/bar, seg is "bar"
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
r.on('quux') do
|
34
|
+
r.is(get_foo) do
|
35
|
+
# GET method, /quux/foo route
|
36
|
+
end
|
37
|
+
|
38
|
+
r.on(post_any) do |seg|
|
39
|
+
# for POST /quux/xyz, seg is "xyz"
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,87 @@
|
|
1
|
+
# frozen-string-literal: true
|
2
|
+
|
3
|
+
#
|
4
|
+
class Roda
|
5
|
+
module RodaPlugins
|
6
|
+
# The custom_matchers plugin supports using arbitrary objects
|
7
|
+
# as matchers, as long as the application has been configured
|
8
|
+
# to accept such objects.
|
9
|
+
#
|
10
|
+
# After loading the plugin, support for custom matchers can be
|
11
|
+
# configured using the +custom_matcher+ class method. This
|
12
|
+
# method is generally passed the class of the object you want
|
13
|
+
# to use as a custom matcher, as well as a block. The block
|
14
|
+
# will be called in the context of the request instance
|
15
|
+
# with the specific matcher used in the match method.
|
16
|
+
#
|
17
|
+
# Blocks can append to the captures in order to yield the appropriate
|
18
|
+
# values to match blocks, or call request methods that append to the
|
19
|
+
# captures.
|
20
|
+
#
|
21
|
+
# Example:
|
22
|
+
#
|
23
|
+
# plugin :custom_matchers
|
24
|
+
# method_segment = Struct.new(:request_method, :next_segment)
|
25
|
+
# custom_matcher(method_segment) do |matcher|
|
26
|
+
# # self is the request instance ("r" yielded in the route block below)
|
27
|
+
# if matcher.request_method == self.request_method
|
28
|
+
# match(matcher.next_segment)
|
29
|
+
# end
|
30
|
+
# end
|
31
|
+
#
|
32
|
+
# get_foo = method_segment.new('GET', 'foo')
|
33
|
+
# post_any = method_segment.new('POST', String)
|
34
|
+
# route do |r|
|
35
|
+
# r.on('baz') do
|
36
|
+
# r.on(get_foo) do
|
37
|
+
# # GET method, /baz/foo prefix
|
38
|
+
# end
|
39
|
+
#
|
40
|
+
# r.is(post_any) do |seg|
|
41
|
+
# # for POST /baz/bar, seg is "bar"
|
42
|
+
# end
|
43
|
+
# end
|
44
|
+
#
|
45
|
+
# r.on('quux') do
|
46
|
+
# r.is(get_foo) do
|
47
|
+
# # GET method, /quux/foo route
|
48
|
+
# end
|
49
|
+
#
|
50
|
+
# r.on(post_any) do |seg|
|
51
|
+
# # for POST /quux/xyz, seg is "xyz"
|
52
|
+
# end
|
53
|
+
# end
|
54
|
+
# end
|
55
|
+
module CustomMatchers
|
56
|
+
def self.configure(app)
|
57
|
+
app.opts[:custom_matchers] ||= OPTS
|
58
|
+
end
|
59
|
+
|
60
|
+
module ClassMethods
|
61
|
+
def custom_matcher(match_class, &block)
|
62
|
+
custom_matchers = Hash[opts[:custom_matchers]]
|
63
|
+
meth = custom_matchers[match_class] = custom_matchers[match_class] || :"_custom_matcher_#{match_class}"
|
64
|
+
opts[:custom_matchers] = custom_matchers.freeze
|
65
|
+
self::RodaRequest.send(:define_method, meth, &block)
|
66
|
+
nil
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
module RequestMethods
|
71
|
+
# Try custom matchers before calling super
|
72
|
+
def unsupported_matcher(matcher)
|
73
|
+
roda_class.opts[:custom_matchers].each do |match_class, meth|
|
74
|
+
if match_class === matcher
|
75
|
+
return send(meth, matcher)
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
super
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
register_plugin(:custom_matchers, CustomMatchers)
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
data/lib/roda/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: roda
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.
|
4
|
+
version: 3.37.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jeremy Evans
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-10-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rack
|
@@ -212,6 +212,7 @@ extra_rdoc_files:
|
|
212
212
|
- doc/release_notes/3.34.0.txt
|
213
213
|
- doc/release_notes/3.35.0.txt
|
214
214
|
- doc/release_notes/3.36.0.txt
|
215
|
+
- doc/release_notes/3.37.0.txt
|
215
216
|
files:
|
216
217
|
- CHANGELOG
|
217
218
|
- MIT-LICENSE
|
@@ -249,6 +250,7 @@ files:
|
|
249
250
|
- doc/release_notes/3.34.0.txt
|
250
251
|
- doc/release_notes/3.35.0.txt
|
251
252
|
- doc/release_notes/3.36.0.txt
|
253
|
+
- doc/release_notes/3.37.0.txt
|
252
254
|
- doc/release_notes/3.4.0.txt
|
253
255
|
- doc/release_notes/3.5.0.txt
|
254
256
|
- doc/release_notes/3.6.0.txt
|
@@ -275,6 +277,7 @@ files:
|
|
275
277
|
- lib/roda/plugins/content_security_policy.rb
|
276
278
|
- lib/roda/plugins/cookies.rb
|
277
279
|
- lib/roda/plugins/csrf.rb
|
280
|
+
- lib/roda/plugins/custom_matchers.rb
|
278
281
|
- lib/roda/plugins/default_headers.rb
|
279
282
|
- lib/roda/plugins/default_status.rb
|
280
283
|
- lib/roda/plugins/delay_build.rb
|
@@ -387,7 +390,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
387
390
|
- !ruby/object:Gem::Version
|
388
391
|
version: '0'
|
389
392
|
requirements: []
|
390
|
-
rubygems_version: 3.1.
|
393
|
+
rubygems_version: 3.1.4
|
391
394
|
signing_key:
|
392
395
|
specification_version: 4
|
393
396
|
summary: Routing tree web toolkit
|