roda 3.28.0 → 3.33.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (208) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +40 -0
  3. data/README.rdoc +15 -1
  4. data/doc/conventions.rdoc +17 -8
  5. data/doc/release_notes/3.29.0.txt +15 -0
  6. data/doc/release_notes/3.30.0.txt +14 -0
  7. data/doc/release_notes/3.31.0.txt +11 -0
  8. data/doc/release_notes/3.32.0.txt +42 -0
  9. data/doc/release_notes/3.33.0.txt +8 -0
  10. data/lib/roda.rb +3 -0
  11. data/lib/roda/plugins/_symbol_regexp_matchers.rb +2 -0
  12. data/lib/roda/plugins/assets.rb +26 -5
  13. data/lib/roda/plugins/caching.rb +2 -0
  14. data/lib/roda/plugins/common_logger.rb +1 -1
  15. data/lib/roda/plugins/content_security_policy.rb +2 -0
  16. data/lib/roda/plugins/default_headers.rb +2 -0
  17. data/lib/roda/plugins/exception_page.rb +9 -5
  18. data/lib/roda/plugins/hash_matcher.rb +1 -1
  19. data/lib/roda/plugins/header_matchers.rb +5 -1
  20. data/lib/roda/plugins/indifferent_params.rb +4 -0
  21. data/lib/roda/plugins/partials.rb +33 -6
  22. data/lib/roda/plugins/path.rb +42 -15
  23. data/lib/roda/plugins/placeholder_string_matchers.rb +2 -0
  24. data/lib/roda/plugins/public.rb +25 -17
  25. data/lib/roda/plugins/relative_path.rb +73 -0
  26. data/lib/roda/plugins/render.rb +17 -5
  27. data/lib/roda/plugins/render_each.rb +11 -3
  28. data/lib/roda/plugins/run_append_slash.rb +1 -1
  29. data/lib/roda/plugins/symbol_matchers.rb +2 -2
  30. data/lib/roda/version.rb +1 -1
  31. metadata +13 -214
  32. data/Rakefile +0 -108
  33. data/doc/release_notes/1.0.0.txt +0 -329
  34. data/doc/release_notes/1.1.0.txt +0 -226
  35. data/doc/release_notes/1.2.0.txt +0 -406
  36. data/doc/release_notes/1.3.0.txt +0 -109
  37. data/doc/release_notes/2.0.0.txt +0 -75
  38. data/doc/release_notes/2.1.0.txt +0 -124
  39. data/doc/release_notes/2.10.0.txt +0 -27
  40. data/doc/release_notes/2.11.0.txt +0 -70
  41. data/doc/release_notes/2.12.0.txt +0 -40
  42. data/doc/release_notes/2.13.0.txt +0 -10
  43. data/doc/release_notes/2.14.0.txt +0 -44
  44. data/doc/release_notes/2.15.0.txt +0 -53
  45. data/doc/release_notes/2.16.0.txt +0 -48
  46. data/doc/release_notes/2.17.0.txt +0 -62
  47. data/doc/release_notes/2.18.0.txt +0 -69
  48. data/doc/release_notes/2.19.0.txt +0 -30
  49. data/doc/release_notes/2.2.0.txt +0 -97
  50. data/doc/release_notes/2.20.0.txt +0 -5
  51. data/doc/release_notes/2.21.0.txt +0 -17
  52. data/doc/release_notes/2.22.0.txt +0 -41
  53. data/doc/release_notes/2.23.0.txt +0 -29
  54. data/doc/release_notes/2.24.0.txt +0 -65
  55. data/doc/release_notes/2.25.0.txt +0 -14
  56. data/doc/release_notes/2.26.0.txt +0 -13
  57. data/doc/release_notes/2.27.0.txt +0 -56
  58. data/doc/release_notes/2.28.0.txt +0 -17
  59. data/doc/release_notes/2.29.0.txt +0 -156
  60. data/doc/release_notes/2.3.0.txt +0 -109
  61. data/doc/release_notes/2.4.0.txt +0 -55
  62. data/doc/release_notes/2.5.0.txt +0 -23
  63. data/doc/release_notes/2.5.1.txt +0 -4
  64. data/doc/release_notes/2.6.0.txt +0 -21
  65. data/doc/release_notes/2.7.0.txt +0 -75
  66. data/doc/release_notes/2.8.0.txt +0 -44
  67. data/doc/release_notes/2.9.0.txt +0 -6
  68. data/spec/all.rb +0 -1
  69. data/spec/assets/css/app.scss +0 -1
  70. data/spec/assets/css/no_access.css +0 -1
  71. data/spec/assets/css/raw.css +0 -1
  72. data/spec/assets/js/head/app.js +0 -1
  73. data/spec/composition_spec.rb +0 -31
  74. data/spec/define_roda_method_spec.rb +0 -274
  75. data/spec/env_spec.rb +0 -11
  76. data/spec/freeze_spec.rb +0 -37
  77. data/spec/integration_spec.rb +0 -209
  78. data/spec/matchers_spec.rb +0 -832
  79. data/spec/opts_spec.rb +0 -42
  80. data/spec/plugin/_after_hook_spec.rb +0 -19
  81. data/spec/plugin/all_verbs_spec.rb +0 -29
  82. data/spec/plugin/assets_preloading_spec.rb +0 -98
  83. data/spec/plugin/assets_spec.rb +0 -745
  84. data/spec/plugin/backtracking_array_spec.rb +0 -42
  85. data/spec/plugin/branch_locals_spec.rb +0 -106
  86. data/spec/plugin/caching_spec.rb +0 -337
  87. data/spec/plugin/chunked_spec.rb +0 -201
  88. data/spec/plugin/class_level_routing_spec.rb +0 -164
  89. data/spec/plugin/class_matchers_spec.rb +0 -40
  90. data/spec/plugin/common_logger_spec.rb +0 -85
  91. data/spec/plugin/content_for_spec.rb +0 -162
  92. data/spec/plugin/content_security_policy_spec.rb +0 -175
  93. data/spec/plugin/cookies_spec.rb +0 -51
  94. data/spec/plugin/csrf_spec.rb +0 -111
  95. data/spec/plugin/default_headers_spec.rb +0 -82
  96. data/spec/plugin/default_status_spec.rb +0 -95
  97. data/spec/plugin/delay_build_spec.rb +0 -23
  98. data/spec/plugin/delegate_spec.rb +0 -23
  99. data/spec/plugin/delete_empty_headers_spec.rb +0 -27
  100. data/spec/plugin/direct_call_spec.rb +0 -28
  101. data/spec/plugin/disallow_file_uploads_spec.rb +0 -25
  102. data/spec/plugin/drop_body_spec.rb +0 -24
  103. data/spec/plugin/early_hints_spec.rb +0 -19
  104. data/spec/plugin/empty_root_spec.rb +0 -14
  105. data/spec/plugin/environments_spec.rb +0 -42
  106. data/spec/plugin/error_email_spec.rb +0 -97
  107. data/spec/plugin/error_handler_spec.rb +0 -216
  108. data/spec/plugin/error_mail_spec.rb +0 -93
  109. data/spec/plugin/exception_page_spec.rb +0 -168
  110. data/spec/plugin/flash_spec.rb +0 -121
  111. data/spec/plugin/h_spec.rb +0 -11
  112. data/spec/plugin/halt_spec.rb +0 -119
  113. data/spec/plugin/hash_matcher_spec.rb +0 -27
  114. data/spec/plugin/hash_routes_spec.rb +0 -535
  115. data/spec/plugin/head_spec.rb +0 -52
  116. data/spec/plugin/header_matchers_spec.rb +0 -98
  117. data/spec/plugin/heartbeat_spec.rb +0 -74
  118. data/spec/plugin/hooks_spec.rb +0 -152
  119. data/spec/plugin/indifferent_params_spec.rb +0 -14
  120. data/spec/plugin/json_parser_spec.rb +0 -141
  121. data/spec/plugin/json_spec.rb +0 -83
  122. data/spec/plugin/mail_processor_spec.rb +0 -451
  123. data/spec/plugin/mailer_spec.rb +0 -282
  124. data/spec/plugin/match_affix_spec.rb +0 -43
  125. data/spec/plugin/match_hook_spec.rb +0 -79
  126. data/spec/plugin/middleware_spec.rb +0 -237
  127. data/spec/plugin/middleware_stack_spec.rb +0 -81
  128. data/spec/plugin/module_include_spec.rb +0 -48
  129. data/spec/plugin/multi_route_spec.rb +0 -268
  130. data/spec/plugin/multi_run_spec.rb +0 -87
  131. data/spec/plugin/multi_view_spec.rb +0 -50
  132. data/spec/plugin/multibyte_string_matcher_spec.rb +0 -44
  133. data/spec/plugin/named_templates_spec.rb +0 -96
  134. data/spec/plugin/not_allowed_spec.rb +0 -69
  135. data/spec/plugin/not_found_spec.rb +0 -128
  136. data/spec/plugin/optimized_string_matchers_spec.rb +0 -43
  137. data/spec/plugin/padrino_render_spec.rb +0 -34
  138. data/spec/plugin/param_matchers_spec.rb +0 -69
  139. data/spec/plugin/params_capturing_spec.rb +0 -33
  140. data/spec/plugin/partials_spec.rb +0 -43
  141. data/spec/plugin/pass_spec.rb +0 -29
  142. data/spec/plugin/path_matchers_spec.rb +0 -42
  143. data/spec/plugin/path_rewriter_spec.rb +0 -45
  144. data/spec/plugin/path_spec.rb +0 -222
  145. data/spec/plugin/placeholder_string_matchers_spec.rb +0 -126
  146. data/spec/plugin/precompile_templates_spec.rb +0 -61
  147. data/spec/plugin/public_spec.rb +0 -85
  148. data/spec/plugin/render_each_spec.rb +0 -82
  149. data/spec/plugin/render_locals_spec.rb +0 -114
  150. data/spec/plugin/render_spec.rb +0 -912
  151. data/spec/plugin/request_aref_spec.rb +0 -51
  152. data/spec/plugin/request_headers_spec.rb +0 -39
  153. data/spec/plugin/response_request_spec.rb +0 -43
  154. data/spec/plugin/route_block_args_spec.rb +0 -86
  155. data/spec/plugin/route_csrf_spec.rb +0 -305
  156. data/spec/plugin/run_append_slash_spec.rb +0 -77
  157. data/spec/plugin/run_handler_spec.rb +0 -53
  158. data/spec/plugin/sessions_spec.rb +0 -452
  159. data/spec/plugin/shared_vars_spec.rb +0 -45
  160. data/spec/plugin/sinatra_helpers_spec.rb +0 -537
  161. data/spec/plugin/slash_path_empty_spec.rb +0 -22
  162. data/spec/plugin/static_routing_spec.rb +0 -192
  163. data/spec/plugin/static_spec.rb +0 -30
  164. data/spec/plugin/status_303_spec.rb +0 -28
  165. data/spec/plugin/status_handler_spec.rb +0 -158
  166. data/spec/plugin/streaming_spec.rb +0 -246
  167. data/spec/plugin/strip_path_prefix_spec.rb +0 -24
  168. data/spec/plugin/symbol_matchers_spec.rb +0 -51
  169. data/spec/plugin/symbol_status_spec.rb +0 -25
  170. data/spec/plugin/symbol_views_spec.rb +0 -32
  171. data/spec/plugin/timestamp_public_spec.rb +0 -85
  172. data/spec/plugin/type_routing_spec.rb +0 -348
  173. data/spec/plugin/typecast_params_spec.rb +0 -1370
  174. data/spec/plugin/unescape_path_spec.rb +0 -22
  175. data/spec/plugin/view_options_spec.rb +0 -170
  176. data/spec/plugin_spec.rb +0 -71
  177. data/spec/redirect_spec.rb +0 -41
  178. data/spec/request_spec.rb +0 -97
  179. data/spec/response_spec.rb +0 -199
  180. data/spec/route_spec.rb +0 -39
  181. data/spec/session_middleware_spec.rb +0 -129
  182. data/spec/session_spec.rb +0 -37
  183. data/spec/spec_helper.rb +0 -137
  184. data/spec/version_spec.rb +0 -14
  185. data/spec/views/_test.erb +0 -1
  186. data/spec/views/a.erb +0 -1
  187. data/spec/views/a.rdoc +0 -2
  188. data/spec/views/about.erb +0 -1
  189. data/spec/views/about.str +0 -1
  190. data/spec/views/about/_test.css.gz +0 -0
  191. data/spec/views/about/_test.erb +0 -1
  192. data/spec/views/about/_test.erb.gz +0 -0
  193. data/spec/views/about/comp_test.erb +0 -1
  194. data/spec/views/b.erb +0 -1
  195. data/spec/views/c.erb +0 -1
  196. data/spec/views/comp_layout.erb +0 -1
  197. data/spec/views/comp_test.erb +0 -1
  198. data/spec/views/content-yield.erb +0 -1
  199. data/spec/views/each.str +0 -1
  200. data/spec/views/home.erb +0 -2
  201. data/spec/views/home.str +0 -2
  202. data/spec/views/iv.erb +0 -1
  203. data/spec/views/layout-alternative.erb +0 -2
  204. data/spec/views/layout-yield.erb +0 -3
  205. data/spec/views/layout.erb +0 -2
  206. data/spec/views/layout.str +0 -2
  207. data/spec/views/multiple-layout.erb +0 -1
  208. data/spec/views/multiple.erb +0 -1
@@ -1,226 +0,0 @@
1
- = New Plugins
2
-
3
- * An assets plugin has been added, for rendering your CSS and
4
- javascript asset files on the fly in development, and compiling
5
- them to a single, compressed file in production.
6
-
7
- When loading the plugin, you just specify the assets to use via :css
8
- and/or :js options:
9
-
10
- plugin :assets, :css=>'some_file.scss', :js=>'some_file.coffee'
11
-
12
- Inside your Roda.route block, you call r.assets to serve the assets:
13
-
14
- route do |r|
15
- r.assets
16
- end
17
-
18
- In your views, you can call the assets method, which returns strings
19
- containing link/script tags for your assets:
20
-
21
- <%= assets(:css) %>
22
- <%= assets(:js) %>
23
-
24
- In production mode, you call compile_assets after loading the
25
- plugin, and it will compile all of the asset files into a single
26
- file per type, optionally compress it (using yuicompressor), and
27
- write the file to the public folder where it can be served by the
28
- webserver. In compiled mode, calling assets in your views will
29
- reference the compiled file.
30
-
31
- It's possible to precompile your assets before application boot, so
32
- they don't need to be compiled every time your application boots.
33
-
34
- The assets plugin also supports asset groups, useful when different
35
- sections of your application use different sets of assets.
36
-
37
- * A chunked plugin has been added, for streaming template rendering
38
- using Transfer-Encoding: chunked. By default, this flushes the
39
- rendering of the top part of the layout template before rendering
40
- the content template, allowing the client to load the assets
41
- necessary to fully render the page while the content template is
42
- still being rendered on the server. This can significantly decrease
43
- client rendering times.
44
-
45
- To use chunked encoding for a response, just call the chunked method
46
- instead of view:
47
-
48
- r.root do
49
- chunked(:index)
50
- end
51
-
52
- If you want to execute code after flushing the top part of the layout
53
- template, but before rendering the content template, pass a block to
54
- chunked:
55
-
56
- r.root do
57
- chunked(:index) do
58
- # expensive calculation here
59
- end
60
- end
61
-
62
- If you want to use chunked encoding for all responses, pass the
63
- :chunk_by_default option when loading the plugin:
64
-
65
- plugin :chunked, :chunk_by_default => true
66
-
67
- Inside your layout or content templates, you can call the flush method
68
- to flush the current result of the template to the user, useful for
69
- streaming large datasets.
70
-
71
- <% (1..100).each do |i| %>
72
- <%= i %>
73
- <% sleep 0.1 %>
74
- <% flush %>
75
- <% end %>
76
-
77
- * A caching plugin has been added, for simple HTTP caching support.
78
- The implementation is based on Sinatra's, and offers
79
- r.last_modifed and r.etag methods for conditional responses:
80
-
81
- r.get '/albums/:d' do |album_id|
82
- @album = Album[album_id]
83
- r.last_modified @album.updated_at
84
- r.etag @album.sha1
85
- view('album')
86
- end
87
-
88
- This also adds response.cache_control and response.expires methods
89
- for setting the Cache-Control/Expires headers for the response.
90
-
91
- * A path plugin has been added for simple support for named paths:
92
-
93
- plugin :path
94
- path :foo, '/foo' # foo_path => '/foo'
95
- path :bar do |bar| # bar_path(bar) => '/bar/1'
96
- "/bar/#{bar.id}"
97
- end
98
-
99
- * An error_email plugin has been added, for easily emailing error
100
- notifications for an exception. This is designed for use with
101
- the error_handler plugin, and should only be used in low-traffic
102
- environments:
103
-
104
- plugin :error_email, :to=>'to@example.com',
105
- :from=>'from@example.com'
106
- plugin :error_handler do |e|
107
- error_email(e)
108
- 'Internal Server Error'
109
- end
110
-
111
- = multi_route Plugin Improvements
112
-
113
- * The multi_route plugin now supports namespaces, allowing it to
114
- support routing trees of arbitrary complexity. Previously, only
115
- a single namespace was supported. For example, if you want
116
- to store your named routes in a directory tree:
117
-
118
- /routes/foo.rb
119
- /routes/foo/baz.rb
120
- /routes/foo/quux.rb
121
- /routes/bar.rb
122
- /routes/bar/baz.rb
123
- /routes/bar/quux.rb
124
-
125
- You can load all of the routing files in the routes subdirectory
126
- tree, and structure your routing tree as follows:
127
-
128
- # app.rb
129
- route do |r|
130
- r.multi_route
131
- end
132
-
133
- # routes/foo.rb
134
- route('foo') do |r|
135
- check_foo_access!
136
- r.multi_route('foo')
137
- end
138
-
139
- # routes/bar.rb
140
- route('bar') do |r|
141
- check_bar_access!
142
- r.multi_route('bar')
143
- end
144
-
145
- # routes/foo/baz.rb
146
- route('baz', 'foo') do
147
- # ...
148
- end
149
-
150
- * Newly added named routes are now picked up while running, useful in
151
- development when using code reloading.
152
-
153
- * r.multi_route now ignores non-String named routes, allowing you to
154
- only dispatch to the String named routes. Previously, calling
155
- r.multi_route when any non-String names routes were present resulted
156
- in an error.
157
-
158
- * r.multi_route now prefers longer routes to shorter routes if
159
- routes have the same prefix. This can fix behavior if you have
160
- named routes such as "foo" and "foo/bar".
161
-
162
- * If you don't pass a block to r.multi_route, it will use the
163
- return value of the named route as the block value to return,
164
- instead of always returning nil.
165
-
166
- = Optimizations
167
-
168
- * Dispatch speed is slightly improved by using allocate instead of
169
- new to create new instances.
170
-
171
- * Hash allocations in the render plugin have been reduced.
172
-
173
- = Other Improvements
174
-
175
- * The Roda.route block is now inherited when subclassing, making
176
- it possible to subclass a Roda application and have the subclass
177
- work without adding a route block.
178
-
179
- * Middleware added to a Roda app after the Roda.route method is
180
- called are now used instead of being ignored.
181
-
182
- * A response.finish_with_body method has been added, for overriding
183
- the response body to use. This is useful if you want to support
184
- arbitrary response bodies.
185
-
186
- * The render plugin now defaults the locals argument to an empty
187
- frozen hash instead of nil when rendering templates via tilt.
188
- This is faster as it avoids a hash allocation inside tilt, and
189
- also works with broken external tilt templates that require that
190
- the locals argument be a hash.
191
-
192
- * Plugins that ship with Roda no longer set constants inside
193
- InstanceMethods. Instead, the constants are set at the plugin
194
- module level. This is done to avoid polluting the namespace of
195
- the application with the constants. Roda's policy is that all
196
- internal constants inside the Roda namespace are prefixed with
197
- Roda, so they don't pollute the user's namespace, and setting
198
- these constants inside InstanceMethods in plugins violated that
199
- policy.
200
-
201
- = Backwards Compatibility
202
-
203
- * response.write no longer sets a Content-Length header. Instead,
204
- response.finish sets it. This is faster if you call
205
- response.write multiple times, and more correct if you call
206
- response.finish without calling response.write.
207
-
208
- * In the render plugin, modifying render_opts directly is now
209
- deprecated and will raise an error in the next major release (the
210
- hash will be frozen). Instead, users should call plugin :render
211
- again with a new hash, which will be merged into the existing
212
- render_opts hash.
213
-
214
- * Moving plugin's constants from InstanceMethods to the plugin level
215
- can break applications where the constant was referenced directly.
216
- For example, if you were doing:
217
-
218
- Roda::SESSION_KEY
219
-
220
- to get the constant for the session key, you would now need to use:
221
-
222
- Roda::RodaPlugins::Base::SESSION_KEY
223
-
224
- In general, it is recommended to not reference such constants at
225
- all. If you think there should be a general reason to access them,
226
- request that a method is added that returns them.
@@ -1,406 +0,0 @@
1
- = New Plugins
2
-
3
- * A static_path_info plugin has been added, which doesn't modify
4
- SCRIPT_NAME/PATH_INFO during routing, only before dispatching
5
- the request to another rack application via r.run. This is
6
- faster and avoids problems caused by changing SCRIPT_NAME/PATH_INFO
7
- during routing, such as methods that return paths that depend on
8
- SCRIPT_NAME. This behavior will become Roda's default starting
9
- in Roda 2, and it is recommended that all Roda apps use it.
10
-
11
- * A mailer plugin has been added, which allows you to use Roda's
12
- render plugin to create email bodies, and allows you to use Roda's
13
- routing tree features to DRY up your mailing code similar to how it
14
- DRYs up your web code.
15
-
16
- Here is an example routing tree using the mailer plugin:
17
-
18
- class Mailer < Roda
19
- plugin :render
20
- plugin :mailer
21
-
22
- route do |r|
23
- r.on "user/:d" do |user_id|
24
- # DRY up code by setting shared behavior in higher level
25
- # branches, instead of duplicating it inside each subtree.
26
- @user = User[user_id]
27
- from 'notifications@example.com'
28
- to @user.email
29
-
30
- r.mail "open_account" do
31
- subject 'Welcome to example.com'
32
- render(:open_account)
33
- end
34
-
35
- r.mail "close_account" do
36
- subject 'Thank you for using example.com'
37
- render(:close_account)
38
- end
39
- end
40
- end
41
- end
42
-
43
- With your routing tree setup, you can use the sendmail method to
44
- send email:
45
-
46
- Mailer.sendmail("/user/1/open_account")
47
-
48
- If you want a Mail::Message object returned for further modification
49
- before sending, you can use mail instead of of sendmail:
50
-
51
- Mailer.mail("/user/2/close_account").deliver
52
-
53
- * A delegate plugin has been added, allowing you to easily create
54
- methods in the route block scope that delegate to the request or
55
- response. While Roda does not pollute your namespaces by default,
56
- this allows you to choose to do so yourself if you find it offers
57
- a nicer API. Example:
58
-
59
- class App < Roda
60
- plugin :delegate
61
- request_delegate :root, :on, :is, :get, :post, :redirect
62
-
63
- route do |r|
64
- root do
65
- redirect "/hello"
66
- end
67
-
68
- on "hello" do
69
- get "world" do
70
- "Hello world!"
71
- end
72
-
73
- is do
74
- get do
75
- "Hello!"
76
- end
77
-
78
- post do
79
- puts "Someone said hello!"
80
- redirect
81
- end
82
- end
83
- end
84
- end
85
- end
86
-
87
- * A class_level_routing plugin has been added, allowing you to define
88
- your routes at the class level if desired. The routes defined at
89
- the class level can still use a routing tree for further routing.
90
- Example:
91
-
92
- class App < Roda
93
- plugin :class_level_routing
94
-
95
- root do
96
- request.redirect "/hello"
97
- end
98
-
99
- get "hello/world" do
100
- "Hello world!"
101
- end
102
-
103
- is "hello" do
104
- request.get do
105
- "Hello!"
106
- end
107
-
108
- request.post do
109
- puts "Someone said hello!"
110
- request.redirect
111
- end
112
- end
113
- end
114
-
115
- * A named_templates plugin has been added, for creating inline
116
- templates associated with a given name, that are used by
117
- the render plugin's render/view method in preference to
118
- templates stored in the filesystem. This makes it simpler to
119
- ship single-file Roda applications that use templates. Example:
120
-
121
- class App < Roda
122
- plugin :named_templates
123
-
124
- template :layout do
125
- "<html><body><%= yield %></body></html>"
126
- end
127
- template :index do
128
- "<p>Hello <%= @user %>!</p>"
129
- end
130
-
131
- route do |r|
132
- @user = 'You'
133
- render(:index)
134
- end
135
- # => "<html><body><p>Hello You!</p></body></html>"
136
- end
137
-
138
- * A multi_run plugin has been added, for dispatching to multiple
139
- rack applications based on the request path prefix. This
140
- provides a similar API as the multi_route plugin, but allows
141
- you to separate your applications per routing subtree, as
142
- opposed to multi_route which uses the same application for
143
- all routing subtrees.
144
-
145
- With the multi_run plugin, you call the class level run method
146
- with the routing prefix and the rack application to use, and
147
- you call r.multi_run to dispatch to all of the applications
148
- based on the prefix.
149
-
150
- class App < Roda
151
- plugin :multi_run
152
-
153
- run "foo", Foo
154
- run "bar", Bar
155
- run "baz", Baz
156
-
157
- route do |r|
158
- r.multi_run
159
- end
160
- end
161
-
162
- In this case, Foo, Bar, and Baz, can be subclasses of App, which
163
- allows them to share methods that should be shared, but still
164
- define methods themselves that are not shared by the other
165
- applications.
166
-
167
- * A sinatra_helpers plugin has been added, that ports over most
168
- of the Sinatra::Helpers methods that haven't already been added
169
- by other plugins. All of the methods are added either to the
170
- request or response class as appropriate. By default, delegate
171
- methods are also added to the route block scope, but you can
172
- turn this off by passing a :delegate=>false option when loading
173
- the plugin, which avoids polluting the route block namespace.
174
-
175
- The sinatra_helpers plugin adds the following request methods:
176
-
177
- * back
178
- * error
179
- * not_found
180
- * uri
181
- * send_file
182
-
183
- And the following response methods:
184
-
185
- * body
186
- * body=
187
- * status
188
- * headers
189
- * mime_type
190
- * content_type
191
- * attachment
192
- * informational?
193
- * success?
194
- * redirect?
195
- * client_error?
196
- * not_found?
197
- * server_error?
198
-
199
- * A slash_path_empty plugin has been added, which changes Roda
200
- so that "/" is considered an empty path when doing a
201
- terminal match via r.is or r.get/r.post with a path.
202
-
203
- class App < Roda
204
- plugin :slash_path_empty
205
-
206
- route do |r|
207
- r.get "albums" do
208
- # matches both GET /albums and GET /albums/
209
- end
210
- end
211
- end
212
-
213
- * An empty_root plugin has been added, which makes r.root match
214
- the empty string, in addition to /. This can be useful in
215
- cases where a partial match on the patch has been completed.
216
-
217
- class App < Roda
218
- plugin :empty_root
219
-
220
- route do |r|
221
- r.on "albums" do
222
- r.root do
223
- # matches both GET /albums and GET /albums/
224
- end
225
- end
226
- end
227
- end
228
-
229
- * A match_affix plugin has been added, for overriding the default
230
- prefix/suffix used in match patterns. For example, if you want
231
- to require that a leading / be specified in your routes. and
232
- you want to consume any trailing slash:
233
-
234
- class App < Roda
235
- plugin :match_affix, "", /(\/|\z)/
236
-
237
- route do |r|
238
- r.on "/albums" do |s|
239
- # GET /albums # s => ""
240
- # GET /albums/ # s => "/"
241
- end
242
- end
243
- end
244
-
245
- * An environments plugin has been added, giving some simple
246
- helpers for executing code in different environments. Example:
247
-
248
- class App < Roda
249
- plugin :environments
250
-
251
- environment # => :development
252
- development? # => true
253
- test? # => false
254
- production? # => false
255
-
256
- # Set the environment for the application
257
- self.environment = :test
258
- test? # => true
259
-
260
- configure do
261
- # called, as no environments given
262
- end
263
-
264
- configure :development, :production do
265
- # not called, as no environments match
266
- end
267
-
268
- configure :test do
269
- # called, as environment given matches current environment
270
- end
271
- end
272
-
273
- * A drop_body plugin has been added, which automatically drops the
274
- body, Content-Type header, and Content-Length header when the
275
- response status indicates no body (100-102, 204, 205, 304).
276
-
277
- * A delay_build plugin has been added, which delays building the
278
- rack application until Roda.app is called, and only rebuilds the
279
- rack application if build! is called. This removes O(n^2)
280
- performance in the pathological case of adding a route block
281
- and then calling Roda.use many times to add middlewares, though
282
- you have to add a few hundred middlewares for the difference
283
- to be noticeable.
284
-
285
- = New Features
286
-
287
- * r.remaining_path and r.matched_path have been added for returning
288
- the remaining path that will be used for matching, and for
289
- returning the path already matched. Currently, these just provide
290
- the PATH_INFO and SCRIPT_NAME, but starting in Roda 2 PATH_INFO
291
- and SCRIPT_NAME will not be modified during routing, and you'll
292
- need to use these methods if you want to find out the remaining
293
- or already matched paths.
294
-
295
- * The render plugin now supports a :template option to render/view
296
- to specify the template to use, instead of requiring a separate
297
- argument.
298
-
299
- * The render plugin now supports a :template_class option, allowing
300
- you to override the default template class that Roda would use.
301
-
302
- * The render plugin now supports a :template_block option, specifying
303
- the block to pass when creating a template.
304
-
305
- * The path class method added by the path plugin now accepts :name,
306
- :url, :url_only, and :add_script_name options:
307
-
308
- :name :: Specifies name for method
309
- :url :: Creates a url method in addition to a path method
310
- :url_only :: Only creates a url method, not a path method
311
- :add_script_name :: prefixes the path with SCRIPT_NAME
312
-
313
- Note that if you plan to use :add_script_name, you should use
314
- the static_path_info plugin so that the method created does not
315
- return different results depending on where you are in the
316
- routing tree.
317
-
318
- * A :user_agent hash matcher has been added to the header_matchers
319
- plugin.
320
-
321
- * An inherit_middleware class accessor has been added. This can
322
- be set to false if you do not want subclasses to inherit
323
- middleware from the superclass. This is useful if the
324
- superclass dispatches to the subclass via r.run, as otherwise
325
- it would have to run the same middleware stack twice.
326
-
327
- * A clear_middleware! class accessor has been added, allowing
328
- you to clear the current middleware stack.
329
-
330
- * RodaRequest#default_redirect_status has been added, allowing
331
- plugins to override the default status used for redirect if
332
- a status is not given.
333
-
334
- * Roda{Request,Response}#roda_class has been added, which
335
- returns the Roda class related to the given request/response.
336
-
337
- = Other Improvements
338
-
339
- * The render plugin no longer caches templates by default if
340
- RACK_ENV is development.
341
-
342
- * When subclassing a Roda app, unfrozen Array/Hash entries in the
343
- opts hash are now duped into the subclass, so the subclass
344
- no longer needs to dup them manually. Note that plugins that
345
- use nested arrays/hashes in the opts hash still need to dup
346
- manually inside ClassMethods#inherited. For the plugins where
347
- it is possible, it is recommended to store plugin options in a
348
- frozen object in the opts hash, and require loading the plugin
349
- again to modify the plugin options.
350
-
351
- * Caching of templates is now fixed when the render/view :opts is
352
- used to specify template options per-call.
353
-
354
- * An explicit :default_encoding of nil in the render plugin's
355
- :opts hash is no longer overwritten with
356
- Encoding.default_external.
357
-
358
- * Roda#session now returns the same object as RodaRequest#session.
359
-
360
- * The view_subdirs, content_for, and render_each plugins now all
361
- depend on the render plugin.
362
-
363
- * The not_allowed plugin now depends on the all_verbs plugin.
364
-
365
- * Local/instance variables are now used in more places instead of
366
- method calls, improving performance.
367
-
368
- = Backwards Compatibility
369
-
370
- * The render plugin's render/view methods no longer pass the given
371
- hash directly to the underlying template. To pass options to the
372
- template engine, use a separate hash under the :opts key:
373
-
374
- render :file, :opts=>{:foo=>'bar'}
375
-
376
- This is more consistent with the class-level render plugin options,
377
- which also uses :opts to pass options to the template engine.
378
-
379
- The :js_opts and :css_opts options to the assets plugin are now
380
- passed as the :opts hash, so they continue to affect the template
381
- engine, so they no longer specify general render method options.
382
-
383
- * Modifying render_opts :layout after loading the render plugin
384
- now has no effect. You need to use plugin :render, :layout=>'...'
385
- to set the layout to use now.
386
-
387
- * Default headers are not set on a response until the response is
388
- finished. This allows you to check for header presence during
389
- routing to detect whether the header was specifically set for the
390
- current request.
391
-
392
- * RodaRequest.consume_pattern no longer captures anything by default.
393
- Previously, it did so in order to update SCRIPT_NAME, but that is
394
- now handled differently. This should only affect external plugins
395
- that attempt to override RodaRequest#consume.
396
-
397
- * RodaRequest.def_verb_method has been removed.
398
-
399
- * The hooks, default_headers, json, and multi_route plugins all store
400
- their class-level metadata in the opts hash instead of separate
401
- class instance variables. This should have no affect unless you
402
- were accessing the class instance variables directly.
403
-
404
- * The render plugin internals changed significantly, it now passes
405
- internal data using a hash. This should only affect users that
406
- were overriding render plugin methods.