roda 3.70.0 → 3.71.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.71.0.txt +33 -0
- data/lib/roda/plugins/json.rb +3 -0
- data/lib/roda/plugins/mail_processor.rb +1 -1
- data/lib/roda/plugins/match_hook.rb +3 -1
- data/lib/roda/plugins/match_hook_args.rb +93 -0
- data/lib/roda/plugins/typecast_params.rb +1 -1
- data/lib/roda/version.rb +1 -1
- metadata +5 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: d5460d6cecb4f9b9acfedd05f5b14793bb9aefa2df2a8c29c559da319df87ee4
|
|
4
|
+
data.tar.gz: 75c3c8803abef4e27cac592a88597e8f9cd098be39bf1d0c1b1192175fd1f8e2
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 6efc49bb205012a7ce50bc3c300d924a149de33416a35870f11efed492251c331804b970c967e47a481b0ddb0a83507c5926c1dc32069941b4edd2bd56df09e5
|
|
7
|
+
data.tar.gz: 698b7e7daae4cd0712a20a1e3e274f7ba3cdb9068eefdeb3bb5f043f2d437cdd5dda961ce91d88794e22a8ca3ef5825e3f8bd3f92ff933eab772c352dd17c2ee
|
data/CHANGELOG
CHANGED
|
@@ -1,3 +1,7 @@
|
|
|
1
|
+
= 3.71.0 (2023-08-14)
|
|
2
|
+
|
|
3
|
+
* Add match_hook_args plugin, similar to match_hooks but support matchers and block args as hook arguments (jeremyevans)
|
|
4
|
+
|
|
1
5
|
= 3.70.0 (2023-07-12)
|
|
2
6
|
|
|
3
7
|
* Add plain_hash_response_headers plugin, using a plain hash for response headers on Rack 3 for much better performance (jeremyevans)
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
= New Feature
|
|
2
|
+
|
|
3
|
+
* A match_hook_args plugin has been added. This is similar to the
|
|
4
|
+
existing match_hook plugin, but passes through the matchers and
|
|
5
|
+
block arguments (values yielded to the match block). Example:
|
|
6
|
+
|
|
7
|
+
plugin :match_hook_args
|
|
8
|
+
|
|
9
|
+
add_match_hook do |matchers, block_args|
|
|
10
|
+
logger.debug("matchers: #{matchers.inspect}. #{block_args.inspect} yielded.")
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
# Term is an implicit matcher used for terminating matches, and
|
|
14
|
+
# will be included in the array of matchers yielded to the match hook
|
|
15
|
+
# if a terminating match is used.
|
|
16
|
+
term = self.class::RodaRequest::TERM
|
|
17
|
+
|
|
18
|
+
route do |r|
|
|
19
|
+
r.root do
|
|
20
|
+
# for a request for /
|
|
21
|
+
# matchers: nil, block_args: nil
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
r.on 'a', ['b', 'c'], Integer do |segment, id|
|
|
25
|
+
# for a request for /a/b/1
|
|
26
|
+
# matchers: ["a", ["b", "c"], Integer], block_args: ["b", 1]
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
r.get 'd' do
|
|
30
|
+
# for a request for /d
|
|
31
|
+
# matchers: ["d", term], block_args: []
|
|
32
|
+
end
|
|
33
|
+
end
|
data/lib/roda/plugins/json.rb
CHANGED
|
@@ -52,6 +52,9 @@ class Roda
|
|
|
52
52
|
# using the +:content_type+ option:
|
|
53
53
|
#
|
|
54
54
|
# plugin :json, content_type: 'application/xml'
|
|
55
|
+
#
|
|
56
|
+
# This plugin depends on the custom_block_results plugin, and therefore does
|
|
57
|
+
# not support treating String, FalseClass, or NilClass values as JSON.
|
|
55
58
|
module Json
|
|
56
59
|
# Set the classes to automatically convert to JSON, and the serializer to use.
|
|
57
60
|
def self.configure(app, opts=OPTS)
|
|
@@ -379,7 +379,7 @@ class Roda
|
|
|
379
379
|
end
|
|
380
380
|
|
|
381
381
|
# Perform the processing of mail for this request, first considering
|
|
382
|
-
# routes defined via the
|
|
382
|
+
# routes defined via the class-level +rcpt+ method, and then the
|
|
383
383
|
# normal routing tree passed in as the block.
|
|
384
384
|
def process_mail(&block)
|
|
385
385
|
if string_routes = opts[:mail_processor_string_routes]
|
|
@@ -4,7 +4,9 @@
|
|
|
4
4
|
class Roda
|
|
5
5
|
module RodaPlugins
|
|
6
6
|
# The match_hook plugin adds hooks that are called upon a successful match
|
|
7
|
-
# by any of the matchers.
|
|
7
|
+
# by any of the matchers. The hooks do not take any arguments. If you would
|
|
8
|
+
# like hooks that pass the arguments/matchers and values yielded to the route block,
|
|
9
|
+
# use the match_hook_args plugin.
|
|
8
10
|
#
|
|
9
11
|
# plugin :match_hook
|
|
10
12
|
#
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
# frozen-string-literal: true
|
|
2
|
+
|
|
3
|
+
#
|
|
4
|
+
class Roda
|
|
5
|
+
module RodaPlugins
|
|
6
|
+
# The match_hook_args plugin adds hooks that are called upon a successful match
|
|
7
|
+
# by any of the matchers. It is similar to the match_hook plugin, but it allows
|
|
8
|
+
# for passing the matchers and block arguments for each match method.
|
|
9
|
+
#
|
|
10
|
+
# plugin :match_hook_args
|
|
11
|
+
#
|
|
12
|
+
# add_match_hook do |matchers, block_args|
|
|
13
|
+
# logger.debug("matchers: #{matchers.inspect}. #{block_args.inspect} yielded.")
|
|
14
|
+
# end
|
|
15
|
+
#
|
|
16
|
+
# # Term is an implicit matcher used for terminating matches, and
|
|
17
|
+
# # will be included in the array of matchers yielded to the match hook
|
|
18
|
+
# # if a terminating match is used.
|
|
19
|
+
# term = self.class::RodaRequest::TERM
|
|
20
|
+
#
|
|
21
|
+
# route do |r|
|
|
22
|
+
# r.root do
|
|
23
|
+
# # for a request for /
|
|
24
|
+
# # matchers: nil, block_args: nil
|
|
25
|
+
# end
|
|
26
|
+
#
|
|
27
|
+
# r.on 'a', ['b', 'c'], Integer do |segment, id|
|
|
28
|
+
# # for a request for /a/b/1
|
|
29
|
+
# # matchers: ["a", ["b", "c"], Integer], block_args: ["b", 1]
|
|
30
|
+
# end
|
|
31
|
+
#
|
|
32
|
+
# r.get 'd' do
|
|
33
|
+
# # for a request for /d
|
|
34
|
+
# # matchers: ["d", term], block_args: []
|
|
35
|
+
# end
|
|
36
|
+
# end
|
|
37
|
+
module MatchHookArgs
|
|
38
|
+
def self.configure(app)
|
|
39
|
+
app.opts[:match_hook_args] ||= []
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
module ClassMethods
|
|
43
|
+
# Freeze the array of hook methods when freezing the app
|
|
44
|
+
def freeze
|
|
45
|
+
opts[:match_hook_args].freeze
|
|
46
|
+
super
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
# Add a match hook that will be called with matchers and block args.
|
|
50
|
+
def add_match_hook(&block)
|
|
51
|
+
opts[:match_hook_args] << define_roda_method("match_hook_args", :any, &block)
|
|
52
|
+
|
|
53
|
+
if opts[:match_hook_args].length == 1
|
|
54
|
+
class_eval("alias _match_hook_args #{opts[:match_hook_args].first}", __FILE__, __LINE__)
|
|
55
|
+
else
|
|
56
|
+
class_eval("def _match_hook_args(v, a); #{opts[:match_hook_args].map{|m| "#{m}(v, a)"}.join(';')} end", __FILE__, __LINE__)
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
public :_match_hook_args
|
|
60
|
+
|
|
61
|
+
nil
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
module InstanceMethods
|
|
66
|
+
# Default empty method if no match hooks are defined.
|
|
67
|
+
def _match_hook_args(matchers, block_args)
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
module RequestMethods
|
|
72
|
+
private
|
|
73
|
+
|
|
74
|
+
# Call the match hook with matchers and block args if yielding to the block before yielding to the block.
|
|
75
|
+
def if_match(v)
|
|
76
|
+
super do |*a|
|
|
77
|
+
scope._match_hook_args(v, a)
|
|
78
|
+
yield(*a)
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
# Call the match hook with nil matchers and blocks before yielding to the block
|
|
83
|
+
def always
|
|
84
|
+
scope._match_hook_args(nil, nil)
|
|
85
|
+
super
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
register_plugin :match_hook_args, MatchHookArgs
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
|
|
@@ -346,7 +346,7 @@ class Roda
|
|
|
346
346
|
end
|
|
347
347
|
|
|
348
348
|
# The reason behind this error. If this error was caused by a conversion method,
|
|
349
|
-
# this will be the
|
|
349
|
+
# this will be the conversion method symbol. If this error was caused
|
|
350
350
|
# because a value was missing, then it will be +:missing+. If this error was
|
|
351
351
|
# caused because a value was not the correct type, then it will be +:invalid_type+.
|
|
352
352
|
attr_accessor :reason
|
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.71.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: 2023-
|
|
11
|
+
date: 2023-08-14 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: rack
|
|
@@ -244,6 +244,7 @@ extra_rdoc_files:
|
|
|
244
244
|
- doc/release_notes/3.69.0.txt
|
|
245
245
|
- doc/release_notes/3.7.0.txt
|
|
246
246
|
- doc/release_notes/3.70.0.txt
|
|
247
|
+
- doc/release_notes/3.71.0.txt
|
|
247
248
|
- doc/release_notes/3.8.0.txt
|
|
248
249
|
- doc/release_notes/3.9.0.txt
|
|
249
250
|
files:
|
|
@@ -321,6 +322,7 @@ files:
|
|
|
321
322
|
- doc/release_notes/3.69.0.txt
|
|
322
323
|
- doc/release_notes/3.7.0.txt
|
|
323
324
|
- doc/release_notes/3.70.0.txt
|
|
325
|
+
- doc/release_notes/3.71.0.txt
|
|
324
326
|
- doc/release_notes/3.8.0.txt
|
|
325
327
|
- doc/release_notes/3.9.0.txt
|
|
326
328
|
- lib/roda.rb
|
|
@@ -391,6 +393,7 @@ files:
|
|
|
391
393
|
- lib/roda/plugins/mailer.rb
|
|
392
394
|
- lib/roda/plugins/match_affix.rb
|
|
393
395
|
- lib/roda/plugins/match_hook.rb
|
|
396
|
+
- lib/roda/plugins/match_hook_args.rb
|
|
394
397
|
- lib/roda/plugins/middleware.rb
|
|
395
398
|
- lib/roda/plugins/middleware_stack.rb
|
|
396
399
|
- lib/roda/plugins/module_include.rb
|