roda 3.83.0 → 3.84.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.
Files changed (93) hide show
  1. checksums.yaml +4 -4
  2. data/lib/roda/plugins/hsts.rb +35 -0
  3. data/lib/roda/response.rb +1 -1
  4. data/lib/roda/version.rb +1 -1
  5. metadata +4 -179
  6. data/CHANGELOG +0 -691
  7. data/README.rdoc +0 -1136
  8. data/doc/conventions.rdoc +0 -177
  9. data/doc/release_notes/3.0.0.txt +0 -84
  10. data/doc/release_notes/3.1.0.txt +0 -24
  11. data/doc/release_notes/3.10.0.txt +0 -132
  12. data/doc/release_notes/3.11.0.txt +0 -54
  13. data/doc/release_notes/3.12.0.txt +0 -19
  14. data/doc/release_notes/3.13.0.txt +0 -38
  15. data/doc/release_notes/3.14.0.txt +0 -36
  16. data/doc/release_notes/3.14.1.txt +0 -43
  17. data/doc/release_notes/3.15.0.txt +0 -21
  18. data/doc/release_notes/3.16.0.txt +0 -52
  19. data/doc/release_notes/3.17.0.txt +0 -62
  20. data/doc/release_notes/3.18.0.txt +0 -170
  21. data/doc/release_notes/3.19.0.txt +0 -229
  22. data/doc/release_notes/3.2.0.txt +0 -22
  23. data/doc/release_notes/3.20.0.txt +0 -7
  24. data/doc/release_notes/3.21.0.txt +0 -5
  25. data/doc/release_notes/3.22.0.txt +0 -24
  26. data/doc/release_notes/3.23.0.txt +0 -28
  27. data/doc/release_notes/3.24.0.txt +0 -14
  28. data/doc/release_notes/3.25.0.txt +0 -12
  29. data/doc/release_notes/3.26.0.txt +0 -15
  30. data/doc/release_notes/3.27.0.txt +0 -15
  31. data/doc/release_notes/3.28.0.txt +0 -13
  32. data/doc/release_notes/3.29.0.txt +0 -15
  33. data/doc/release_notes/3.3.0.txt +0 -291
  34. data/doc/release_notes/3.30.0.txt +0 -14
  35. data/doc/release_notes/3.31.0.txt +0 -11
  36. data/doc/release_notes/3.32.0.txt +0 -42
  37. data/doc/release_notes/3.33.0.txt +0 -8
  38. data/doc/release_notes/3.34.0.txt +0 -17
  39. data/doc/release_notes/3.35.0.txt +0 -12
  40. data/doc/release_notes/3.36.0.txt +0 -17
  41. data/doc/release_notes/3.37.0.txt +0 -42
  42. data/doc/release_notes/3.38.0.txt +0 -5
  43. data/doc/release_notes/3.39.0.txt +0 -16
  44. data/doc/release_notes/3.4.0.txt +0 -24
  45. data/doc/release_notes/3.40.0.txt +0 -24
  46. data/doc/release_notes/3.41.0.txt +0 -9
  47. data/doc/release_notes/3.42.0.txt +0 -21
  48. data/doc/release_notes/3.43.0.txt +0 -34
  49. data/doc/release_notes/3.44.0.txt +0 -23
  50. data/doc/release_notes/3.45.0.txt +0 -22
  51. data/doc/release_notes/3.46.0.txt +0 -19
  52. data/doc/release_notes/3.47.0.txt +0 -13
  53. data/doc/release_notes/3.48.0.txt +0 -10
  54. data/doc/release_notes/3.49.0.txt +0 -18
  55. data/doc/release_notes/3.5.0.txt +0 -31
  56. data/doc/release_notes/3.50.0.txt +0 -21
  57. data/doc/release_notes/3.51.0.txt +0 -20
  58. data/doc/release_notes/3.52.0.txt +0 -20
  59. data/doc/release_notes/3.53.0.txt +0 -14
  60. data/doc/release_notes/3.54.0.txt +0 -48
  61. data/doc/release_notes/3.55.0.txt +0 -12
  62. data/doc/release_notes/3.56.0.txt +0 -33
  63. data/doc/release_notes/3.57.0.txt +0 -34
  64. data/doc/release_notes/3.58.0.txt +0 -16
  65. data/doc/release_notes/3.59.0.txt +0 -17
  66. data/doc/release_notes/3.6.0.txt +0 -21
  67. data/doc/release_notes/3.60.0.txt +0 -56
  68. data/doc/release_notes/3.61.0.txt +0 -24
  69. data/doc/release_notes/3.62.0.txt +0 -41
  70. data/doc/release_notes/3.63.0.txt +0 -36
  71. data/doc/release_notes/3.64.0.txt +0 -26
  72. data/doc/release_notes/3.65.0.txt +0 -12
  73. data/doc/release_notes/3.66.0.txt +0 -23
  74. data/doc/release_notes/3.67.0.txt +0 -25
  75. data/doc/release_notes/3.68.0.txt +0 -21
  76. data/doc/release_notes/3.69.0.txt +0 -33
  77. data/doc/release_notes/3.7.0.txt +0 -123
  78. data/doc/release_notes/3.70.0.txt +0 -19
  79. data/doc/release_notes/3.71.0.txt +0 -33
  80. data/doc/release_notes/3.72.0.txt +0 -48
  81. data/doc/release_notes/3.73.0.txt +0 -33
  82. data/doc/release_notes/3.74.0.txt +0 -28
  83. data/doc/release_notes/3.75.0.txt +0 -19
  84. data/doc/release_notes/3.76.0.txt +0 -18
  85. data/doc/release_notes/3.77.0.txt +0 -8
  86. data/doc/release_notes/3.78.0.txt +0 -99
  87. data/doc/release_notes/3.79.0.txt +0 -148
  88. data/doc/release_notes/3.8.0.txt +0 -27
  89. data/doc/release_notes/3.80.0.txt +0 -31
  90. data/doc/release_notes/3.81.0.txt +0 -24
  91. data/doc/release_notes/3.82.0.txt +0 -43
  92. data/doc/release_notes/3.83.0.txt +0 -6
  93. data/doc/release_notes/3.9.0.txt +0 -67
@@ -1,52 +0,0 @@
1
- = New Features
2
-
3
- * A mail_processor plugin has been added for processing mail using
4
- a routing tree. Quick example:
5
-
6
- class MailProcessor < Roda
7
- plugin :mail_processor
8
-
9
- route do |r|
10
- # Match based on the To header, extracting the ticket_id
11
- r.to /ticket\+(\d+)@example.com/ do |ticket_id|
12
- if ticket = Ticket[ticket_id.to_i]
13
- # Mark the mail as handled if there is a valid ticket
14
- # associated
15
- r.handle do
16
- ticket.add_note(text: mail_text, from: from)
17
- end
18
- end
19
- end
20
- end
21
- end
22
-
23
- You can submit mail for processing by calling the process_mail
24
- method with a Mail instance:
25
-
26
- MailProcessor.process_mail(Mail.read('/path/to/message.eml'))
27
-
28
- The mail_processor routing tree uses routing methods specific to
29
- mail:
30
-
31
- r.from :: match on the mail From address
32
- r.to :: match on the mail To address
33
- r.cc :: match on the mail CC address
34
- r.rcpt :: match on the mail recipients (To and CC addresses by
35
- default)
36
- r.subject :: match on the mail subject
37
- r.body :: match on the mail body
38
- r.text :: match on text extracted from the message (same as mail
39
- body by default)
40
- r.header :: match on a mail header
41
-
42
- To mark a mail as having been handled, you call the r.handle method
43
- with a block, or one of the above methods prefixed by handle_
44
- (e.g. r.handle_text).
45
-
46
- The mail_processor plugin supports hooks that are called for handled
47
- mail, unhandled mail, and all mail (for archiving). It also
48
- supports the ability to configure how reply text is parsed out of
49
- mail, who to consider as the recipients of the email, and the
50
- ability to have separate routing blocks per recipient email address
51
- (with O(1) delegation to the appropriate block if the recipient
52
- addresses to match is a string).
@@ -1,62 +0,0 @@
1
- = New Features
2
-
3
- * A route_block_args plugin has been added, allowing you to customize
4
- which objects are yielded to the the route block. You call the
5
- plugin with a block, which is evaluated in the context of the
6
- instance and should return an array of arguments for the instance
7
- to yield to the route block.
8
-
9
- To yield both the request and response objects, you can do:
10
-
11
- plugin :route_block_args do |r|
12
- [r, response]
13
- end
14
-
15
- route do |r, response|
16
- # ...
17
- end
18
-
19
- In addition to the main route block, using this plugin also affects
20
- the arguments passed to routing blocks in the following plugins:
21
-
22
- * class_level_routing
23
- * mailer
24
- * mail_processor
25
- * multi_route
26
- * static_routing
27
-
28
- = Other Improvements
29
-
30
- * The set_layout_opts method in the view_options plugin can now
31
- override the layout template even if the render plugin :layout
32
- option is given.
33
-
34
- * The mailer and mail_processor plugin now integrate with the hooks
35
- plugin to support before/after hooks.
36
-
37
- * Dispatching to the route block and RodaResponse#finish are both
38
- slightly faster.
39
-
40
- * Internal before hook handling has been moved from an internal
41
- plugin into the core, and modified so that if you are not using
42
- the internal before hook in any plugin, there is no runtime cost.
43
-
44
- * The core now recognizes when plugins are using the internal after
45
- hook, and automatically loads the internal plugin supporting the
46
- after hook.
47
-
48
- = Backwards Compatibility
49
-
50
- * When using the render plugin with a :layout option, the render_opts
51
- :layout option will be set to true if the layout is enabled.
52
- Previously, the render_opts :layout option would retain the value
53
- given as the plugin option. Options for the layout (including the
54
- template) are still available in the render_opts :layout_opts
55
- option. This change was made to fix the set_layout_opts bug in the
56
- view_options plugin.
57
-
58
- * RodaResponse#initialize no longer sets the response status to nil
59
- if it was already set.
60
-
61
- * RodaResponse#finish no longer sets the status on the receiver, it
62
- just uses the receiver's status to set the rack response status.
@@ -1,170 +0,0 @@
1
- = New Features
2
-
3
- * A direct_call plugin has been added. This plugin makes Roda.call
4
- call the app directly, skipping any middleware. This plugin
5
- can be used for performance reasons, as the class itself can be
6
- used as the base rack app, instead of using a lambda as the base
7
- rack app. Roda.app.call will still call all middleware when
8
- using this plugin.
9
-
10
- = Other Improvements
11
-
12
- * Blocks that are given during application configuration, and
13
- previously executed with instance_exec, instead now define methods,
14
- and Roda now calls these methods. This is a much faster approach.
15
- This new approach, combined with the direct_call plugin and the
16
- Roda.freeze optimizations, can be over 80% faster for trivial
17
- applications, with measureable improvements in most applications.
18
-
19
- As methods are strict in regards to arity and instance_exec is
20
- not, Roda now checks all such blocks for arity mismatches, and
21
- attempts to compensate for arity mismatches. In case of an arity
22
- mismatch, Roda will define a method that will call instance_exec,
23
- in which case there will not be a performance improvement.
24
-
25
- For some methods, Roda may not know the expected arity until
26
- runtime. In that case, Roda will check the arity at runtime and
27
- try to call the method with the arity that it supports if there is
28
- an arity mismatch.
29
-
30
- You can control the checking of arity via two options:
31
-
32
- :check_arity :: Set to false to turn off all arity checking. Set to
33
- :warn to issue a warning when defining the method if
34
- there is an arity mismatch (for methods where the
35
- expected arity is known in advance).
36
- :check_dynamic_arity :: Set to false to turn off arity checking for
37
- methods defined where the arity is not known
38
- at compile time. Set to :warn to issue a
39
- warning at runtime every time the method is
40
- called and there is an arity mismatch (for
41
- methods where the expected arity is not
42
- known in advance). Note that checking the
43
- arity at runtime has a performance cost,
44
- so for maximum performance this should be
45
- set to false.
46
-
47
- Note that this arity checking is only done to keep backwards
48
- compatibility. Since lambdas already used strict arity, no arity
49
- checking is done if the block is a lambda and not a regular proc.
50
-
51
- Roda has a new dispatch API that works with these defined methods.
52
- The new dispatch API uses the following methods:
53
-
54
- * _roda_handle_main_route: Entry point for normal request dispatch.
55
- * _roda_handle_route: Yields to the routing block, catching any
56
- halts inside the block, treating the block as a routing block.
57
- * _roda_main_route: Roda.route defines this method using the
58
- block provided, it accepts the request as an argument.
59
- * _roda_run_main_route: Calls _roda_main_route with the request,
60
- allowing for plugins to execute code around the main routing,
61
- while still being able to throw :halt to return a response.
62
-
63
- All instance methods defined by Roda use the _roda_ prefix.
64
-
65
- * When deleting the session cookie in the sessions plugin, the
66
- Set-Cookie response header now uses the same path and domain
67
- that was originally used to set the cookie. This can fix cases
68
- where the cookie was not being cleared as expected.
69
-
70
- * Freezing a Roda app now can add performance improvements in
71
- addition to reliability improvements. When freezing the class,
72
- if certain methods in the class have not been overridden, Roda
73
- now defines aliases or more optimized methods to improve
74
- performance.
75
-
76
- * Roda now warns if the Roda#call method is overridden in a module,
77
- without the module also overridding _roda_handle_main_route or
78
- _roda_run_main_route. This indicates that the module needs
79
- to be updated to use Roda's new dispatch API. Roda will continue
80
- to work in this case, but it will be slower than the Roda's now
81
- default behavior, as it will force usage of the old dispatch API.
82
- This check will be removed in Roda 4, which will remove support
83
- for Roda#call (and Roda#_call).
84
-
85
- * When there is only a single internal before or after hook defined,
86
- the hook is now faster by using a method alias.
87
-
88
- * The route_csrf plugin block or :csrf_failure option proc now
89
- integrates with the route_block_args plugin.
90
-
91
- * The default_status plugin is now faster by defining the
92
- default_status method directly.
93
-
94
- * The default_headers plugin is now faster by defining an optimized
95
- set_default_headers method directly.
96
-
97
- * The hooks plugin is now faster by defining methods for each
98
- hook block, with a main hook method that dispatches to each
99
- of the hook block methods. If only a single hook block is
100
- used, the main hook method is an alias to the hook block
101
- method to avoid an extra method call.
102
-
103
- * The following plugins now use define_method instead of
104
- instance_exec for better performance:
105
-
106
- * defaults_setter
107
- * mail_processor
108
- * multi_route
109
- * named_templates
110
- * path
111
- * route_block_args
112
- * route_csrf
113
- * static_routing
114
- * status_handler
115
-
116
- * The internal after hook implementation has now been merged into
117
- the error_handler plugin. This is faster in cases where the
118
- error_handler plugin is used, and slower in cases where the
119
- internal after hook plugin was used without the error_handler
120
- plugin.
121
-
122
- * The route_block_args plugin now handles cases where
123
- Roda.convert_route_block has already been overridden.
124
-
125
- * Performance of routing methods that can yield captures has been
126
- improved.
127
-
128
- * Hash#merge is now used in preference to Hash[].merge! in cases
129
- where the receiver of Hash#merge would not be provided by the
130
- user. This is because Hash#merge is faster than Hash[].merge!
131
- in recent ruby versions. If the receiver of #merge is provided
132
- by the user, then Hash[].merge! is still used to ensure that the
133
- resulting value is plain hash.
134
-
135
- * The static_routing plugin no longer removes existing static
136
- routes if loaded more than once.
137
-
138
- * Roda now warns when calling Roda.route without a block.
139
-
140
- = Backwards Compatibility
141
-
142
- * The route_block_args plugin no longer affects the
143
- class_level_routing plugin. Support for this was added in Roda
144
- 3.17.0 when the route_block_args plugin was added, but this was a
145
- mistake as class_level_routing blocks should be called with the
146
- captures for their matchers, not with the route block args.
147
-
148
- * Some of the internal state was changed in the following plugins:
149
-
150
- * class_level_routing
151
- * mail_processor
152
- * multi_route
153
- * named_templates
154
- * static_routing
155
- * status_handler
156
-
157
- This only affects you if you were accessing the internal state
158
- via the opts hash.
159
-
160
- * The static_routing plugin no longer defines the r.static_route
161
- method.
162
-
163
- * The mailer plugin was switched to use the new dispatch API, and
164
- will no longer handle cases where the old dispatch API (Roda#call)
165
- was overrridden.
166
-
167
- * The static_route method in the static_routing plugin must
168
- now be called with a block. Previously, that would not
169
- cause a failure until runtime, where it would fail when
170
- you tried to execute the route.
@@ -1,229 +0,0 @@
1
- = New Features
2
-
3
- * A hash_routes plugin has been added for O(1) route dispatching at
4
- any level of the routing tree. By default, Roda uses a linear
5
- search of possible branches at each level of the routing tree,
6
- which results in roughly O(log(n)) routing behavior in most
7
- applications (where n is the total number of routes in the
8
- application).
9
-
10
- Assume you have the following routing tree:
11
-
12
- route do |r|
13
- r.on "a" do
14
- # ...
15
- end
16
-
17
- r.on "b" do
18
- # ...
19
- end
20
-
21
- r.is "c" do
22
- # ...
23
- end
24
-
25
- # ...
26
- end
27
-
28
- With this routing tree, a request for /c will first check /a and
29
- /b. This is not normally a performance issue, but if you have a
30
- large number of routes at a particular level, it can be.
31
-
32
- The hash_routes plugin allows you to convert this routing tree to:
33
-
34
- plugin :hash_routes
35
-
36
- hash_routes do
37
- on "a" do |r|
38
- # ...
39
- end
40
-
41
- on "b" do |r|
42
- # ...
43
- end
44
-
45
- is "c" do |r|
46
- # ...
47
- end
48
-
49
- # ...
50
- end
51
-
52
- route do |r|
53
- r.hash_routes
54
- end
55
-
56
- This routing tree looks similar to Roda's standard routing tree, and
57
- will have the same behavior as the previous example, but dispatching
58
- to the routes inside the hash_routes block by the r.hash_routes
59
- method will be an O(1) operation, instead of a linear search. This
60
- can significantly improve performance in cases where you have a large
61
- number of branches at any point in the routing tree.
62
-
63
- In order to support O(1) route dispatching at any level of the
64
- tree, the hash_routes plugin supports namespaces. You can use this
65
- namespace support to keep the primary advantage of Roda when using
66
- the hash_routes plugin, which is the ability to operate on a request
67
- at any point during routing. Assume you have this routing tree:
68
-
69
- hash_routes :root do
70
- on "foo" do |r|
71
- r.on Integer do |foo_id|
72
- next unless @foo = Foo[foo_id]
73
- r.hash_routes(:foo)
74
- end
75
- end
76
-
77
- on "bar" do |r|
78
- r.on Integer do |bar_id|
79
- next unless @bar = Bar[bar_id]
80
- r.hash_routes(:bar)
81
- end
82
- end
83
-
84
- # ...
85
- end
86
-
87
- hash_routes :foo do
88
- get "show" do
89
- @page_title = @foo.name
90
- view('foo/show')
91
- end
92
-
93
- # ...
94
- end
95
-
96
- hash_routes :bar do
97
- post "edit" do
98
- @bar.update(:name=>request.params['name'])
99
- r.redirect "/"
100
- end
101
-
102
- # ...
103
- end
104
-
105
- route do |r|
106
- r.hash_routes(:root)
107
- end
108
-
109
- With this routing tree, a GET /foo/123/show request will first get
110
- dispatched to the on "foo" block in the :root namespace. That will
111
- extract the 123 segment from the path, and use it to find the Foo
112
- object with id 123 and set that to the instance variable @foo.
113
- If there is no matching foo, the rest of the block will be skipped,
114
- which will result in a 404 response. If there is a matching foo,
115
- after setting the instance variable, it will dispatch to routes in
116
- the :foo namespace, one of which is show, which will be able to use
117
- the @foo variable, both in the route and in the view.
118
-
119
- Similarly, a POST /bar/321/edit request would dispatch to the on
120
- "bar" block in the :root namespace, will look up the matching bar,
121
- then will dispatch to the edit route in the :bar namespace.
122
-
123
- The hash_routes plugin can be used as a faster version of the
124
- multi_route plugin's r.multi_route method. It can also be used as
125
- a faster replacement for the multi_view plugin.
126
-
127
- Please see the hash_routes plugin documentation for additional
128
- methods and configuration styles supported by the plugin.
129
-
130
- * A match_hook plugin has been added, which is called for each
131
- successful match, before yielding to the match block. For example,
132
- with the following routing tree:
133
-
134
- plugin :match_hook
135
-
136
- match_hook do
137
- puts "#{r.matched_path}|#{r.remaining_path}"
138
- end
139
-
140
- route do |r|
141
- r.on "a" do
142
- r.is "b" do
143
- r.get do
144
- end
145
-
146
- r.post do
147
- end
148
- end
149
- end
150
- end
151
-
152
- A GET request for /a/b would call the match hook three times, and
153
- output the following:
154
-
155
- /a|/b # When the r.on block matches
156
- /a/b| # When the r.is block matches
157
- /a/b| # When the r.get block matches
158
-
159
- A GET request for /a/c would call the match hook once, and output
160
- the following:
161
-
162
- /a|/b # When the r.on block matches
163
-
164
- This plugin can be used to make debugging easier, as well as for
165
- metrics.
166
-
167
- = Other Improvements
168
-
169
- * Per-cookie cipher secrets are now supported and used automatically
170
- by default in the sessions plugin. This can prevent issues where
171
- the cipher secret can be leaked if the random initialization vector
172
- turns out not to be so random and ends up being reused. This
173
- makes the session cookies slightly larger and about 10-20% slower.
174
-
175
- Note that because of the way the sessions plugin is designed,
176
- even if the cipher secret was leaked and you are not using
177
- per-cookie cipher secrets, it would not allow an attacker to
178
- forge a session, it would only allow them to read the contents of
179
- an existing session.
180
-
181
- If you are currently using the sessions plugin, and performing
182
- rolling restarts, you should temporarily disable per-cookie session
183
- secrets until all processes have been restarted and are able to
184
- support per-cookie session secrets. You can do so by setting the
185
- :per_cookie_cipher_secret sessions plugin option to false
186
- temporarily until all processes have restarted and are running Roda
187
- 3.19.0+.
188
-
189
- * When passing route blocks to Roda that have 0 arity instead of the
190
- expected arity of 1, emulate an arity of 1 using an approach that is
191
- about 2.75-8x faster. This emulation is still about 20% slower than
192
- using the expected arity.
193
-
194
- * Fix emulation of route blocks that have >1 arity but where the
195
- expected arity is 1. Such blocks were not handled correctly in
196
- Roda 3.18.0.
197
-
198
- * String matching performance has been improved by 10-20%.
199
-
200
- * Symbol and String class matching performance has improved by 10-20%.
201
-
202
- * Terminal matching performance has improved by about 4x.
203
-
204
- * Roda will now automatically load the direct_call plugin when
205
- freezing the application if there is no middleware used and the
206
- application has not been subclassed, for improved performance.
207
-
208
- * Roda no longer builds the rack application until the app class
209
- method is called. This can fix O(n^2) issues when building
210
- applications with a lot of middleware. One consequence of
211
- this is that a Roda.route block is no longer required. If
212
- Roda.route is not called, then the default routing tree will
213
- return a 404 response for all requests.
214
-
215
- The delay_build plugin used to support delaying building the rack
216
- application until a build! method is called. Now that Roda delays
217
- building the rack application until the app method is called, there
218
- is no reason to use this plugin, and it is now a no-op.
219
-
220
- * The assets plugin :timestamp_paths option now supports a string
221
- value to use a custom separator. A slash separator is still used
222
- by default.
223
-
224
- = Backwards Compatibility
225
-
226
- * The static_routing plugin internals have changed, as the
227
- static_routing is now implemented via the hash_routes plugin. If
228
- you were depending on the internals, you will need to update your
229
- code.
@@ -1,22 +0,0 @@
1
- = New Features
2
-
3
- * A timestamp_public plugin has been added for serving static files
4
- with paths that change based on the modification timestamp of the
5
- file. By using a new path, cached versions of the file will not
6
- be used, fixing staleness issues. Example:
7
-
8
- plugin :timestamp_public
9
-
10
- route do |r|
11
- # serves requests for /static/\d+/.*
12
- r.timestamp_public
13
-
14
- # /static/1234567890/path/to/file
15
- timestamp_path("path/to/file")
16
- end
17
-
18
- = Other Improvements
19
-
20
- * When using the assets plugin :timestamp_paths option, the
21
- timestamps now include microseconds, to make cache poisoning more
22
- difficult.
@@ -1,7 +0,0 @@
1
- = Improvements
2
-
3
- * For empty responses with status code 205, a Content-Length header
4
- is now added with a value of 0, for better conformance to RFC 7232.
5
-
6
- Similarly, when using the drop_body plugin, responses with status
7
- code 205 now have a Content-Length header added with a value of 0.
@@ -1,5 +0,0 @@
1
- = Improvements
2
-
3
- * View rendering speed is significantly improved in development mode
4
- by caching file-based templates until there has been a modification
5
- to the template file.
@@ -1,24 +0,0 @@
1
- = Improvements
2
-
3
- * The render/view methods in the render plugin, when called with
4
- a single string/symbol argument (the most common case), are now
5
- up to 2.5x/4x faster by directly calling compiled template methods.
6
- This works by extracting the UnboundMethod objects that Tilt
7
- creates, and defining real methods for them, then calling those
8
- methods using send. This avoids most of the overhead of the render
9
- and view methods. The compiled template methods are defined inside
10
- a module included in the Roda app's class, so this support works
11
- even if the Roda app itself is frozen.
12
-
13
- Some plugins, such as render_locals, do not work with this
14
- optimization, and disable the use of it. The view_options plugin
15
- does work with this optimization if you are using set_view_subdir or
16
- append_view_subdir, but not if using set_view_options or
17
- set_layout_options.
18
-
19
- This optimization depends on Ruby 2.3+ and Tilt 1.2+, and will not
20
- be used on earlier versions, or if an API change in Tilt is
21
- detected.
22
-
23
- * Session deserialization is now slightly faster in the sessions
24
- plugin.
@@ -1,28 +0,0 @@
1
- = Improvements
2
-
3
- * The render/view methods in the render plugin, when called with
4
- a single string/symbol argument (the most common case), are now
5
- up to 2x faster in cache: false mode by directly calling compiled
6
- template methods. This takes the performance increase in 3.22.0
7
- and applies it to cache: false mode in addition to cache: true
8
- mode. If the template file has changed, the compiled method is
9
- removed, and a new compiled method replaces it.
10
-
11
- * Template modification detection in the render plugin now uses a
12
- faster check for modification, which also avoids a race condition.
13
-
14
- * The type_routing plugin now handles requests with nothing but the
15
- extension in the request path. This fixes cases when you have
16
- one app partially route a request, and send the request to another
17
- app, and that app uses the type_routing plugin and has an r.is
18
- call at the root level.
19
-
20
- * The roda/session_middleware middleware now works correctly if the
21
- type_routing plugin is loaded into Roda itself (as opposed to a
22
- Roda subclass).
23
-
24
- * The exception_page plugin now always shows the line number for
25
- each line. Previously, it only showed the line number if it was
26
- showing the content of the line, which complicated debugging in
27
- cases where the content of the line was no longer retrievable
28
- due to file system permissions or restrictions (e.g. chroot).
@@ -1,14 +0,0 @@
1
- = Improvements
2
-
3
- * The performance of the render_each plugin has been dramatically
4
- improved by calling compiled template methods directly. For a simple
5
- template, render_each performance with a single object can be about
6
- 2x faster, and render_each performance for 100 objects can be 3x
7
- (cache: false) to 9x (cache: true) faster.
8
-
9
- This optimization can be used if no options are provided to
10
- render_each, or if :local and/or :locals options are provided. Use
11
- of other options will disable this optimization.
12
-
13
- * The module_include plugin no longer calls Proc.new without a
14
- block, fixing a warning on Ruby 2.7.
@@ -1,12 +0,0 @@
1
- = Improvements
2
-
3
- * The new tilt 2.0.10 private API is now supported when using
4
- compiled template methods, with up to a 33% performance increase.
5
- The older tilt private API (back to tilt 1.2) is still supported.
6
-
7
- * The performance of the render and view methods in the render plugin
8
- when called with only the :locals option are now about 75% faster
9
- by calling compiled template methods directly.
10
-
11
- * Keyword argument separation issues are now handled on Ruby 2.7+
12
- when defining methods with blocks that accept keyword arguments.
@@ -1,15 +0,0 @@
1
- = New Features
2
-
3
- * Asynchronous streaming is now supported in the streaming plugin,
4
- using the :async option. When using this option, streaming
5
- responses are temporarily buffered in a queue. By default, the
6
- queue is a sized queue with a maximum of 10 elements, but the
7
- queue can be specified manually via the :queue option, which
8
- can be used with async libraries that support non-blocking
9
- queues. This option is currently only supported on Ruby 2.3+.
10
-
11
- = Other Improvements
12
-
13
- * When combining multiple compiled assets into a single file, the
14
- files are now separated by a newline, fixing issues when a
15
- single line comment is used as the last line of a file.
@@ -1,15 +0,0 @@
1
- = New Features
2
-
3
- * A multibyte_string_matcher plugin has been added that supports
4
- multibyte characters in strings used as matchers. It uses a slower
5
- string matching implementation that supports multibyte characters.
6
- As multibyte strings in paths must be escaped, this also loads the
7
- unescape_path plugin.
8
-
9
- = Other Improvements
10
-
11
- * The json_parser plugin now returns expected results for invalid JSON
12
- if the params_capturing plugin is used.
13
-
14
- * lib/roda.rb has been split into multiple files for easier code
15
- navigation.
@@ -1,13 +0,0 @@
1
- = New Features
2
-
3
- * The sessions plugin now supports RodaRequest#session_created_at
4
- and RodaRequest#session_updated_at for the times of session
5
- creation and last update.
6
-
7
- = Other Improvements
8
-
9
- * The json_parser plugin now correctly parses the request body even
10
- if the request body has already been read.
11
-
12
- * The sessions plugin now correctly handles upgrading rack cookie
13
- sessions when using rack 2.0.8+.