roda 2.29.0 → 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (170) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +52 -0
  3. data/MIT-LICENSE +1 -1
  4. data/README.rdoc +51 -109
  5. data/Rakefile +7 -14
  6. data/doc/conventions.rdoc +4 -4
  7. data/doc/release_notes/1.2.0.txt +1 -1
  8. data/doc/release_notes/3.0.0.txt +84 -0
  9. data/lib/roda.rb +25 -79
  10. data/lib/roda/plugins/assets.rb +25 -58
  11. data/lib/roda/plugins/assets_preloading.rb +0 -5
  12. data/lib/roda/plugins/backtracking_array.rb +0 -5
  13. data/lib/roda/plugins/branch_locals.rb +3 -3
  14. data/lib/roda/plugins/caching.rb +5 -38
  15. data/lib/roda/plugins/chunked.rb +7 -25
  16. data/lib/roda/plugins/class_level_routing.rb +2 -2
  17. data/lib/roda/plugins/content_for.rb +7 -10
  18. data/lib/roda/plugins/cookies.rb +3 -3
  19. data/lib/roda/plugins/csrf.rb +2 -2
  20. data/lib/roda/plugins/delegate.rb +3 -3
  21. data/lib/roda/plugins/drop_body.rb +0 -7
  22. data/lib/roda/plugins/empty_root.rb +0 -3
  23. data/lib/roda/plugins/error_email.rb +4 -6
  24. data/lib/roda/plugins/error_handler.rb +1 -2
  25. data/lib/roda/plugins/error_mail.rb +3 -6
  26. data/lib/roda/plugins/flash.rb +0 -4
  27. data/lib/roda/plugins/h.rb +5 -0
  28. data/lib/roda/plugins/hash_matcher.rb +4 -2
  29. data/lib/roda/plugins/head.rb +5 -7
  30. data/lib/roda/plugins/header_matchers.rb +12 -33
  31. data/lib/roda/plugins/heartbeat.rb +2 -7
  32. data/lib/roda/plugins/indifferent_params.rb +2 -2
  33. data/lib/roda/plugins/json.rb +6 -14
  34. data/lib/roda/plugins/json_parser.rb +2 -13
  35. data/lib/roda/plugins/mailer.rb +29 -39
  36. data/lib/roda/plugins/match_affix.rb +0 -5
  37. data/lib/roda/plugins/middleware.rb +10 -15
  38. data/lib/roda/plugins/multi_route.rb +8 -5
  39. data/lib/roda/plugins/multi_run.rb +1 -0
  40. data/lib/roda/plugins/named_templates.rb +2 -2
  41. data/lib/roda/plugins/optimized_string_matchers.rb +0 -3
  42. data/lib/roda/plugins/padrino_render.rb +6 -9
  43. data/lib/roda/plugins/param_matchers.rb +6 -6
  44. data/lib/roda/plugins/params_capturing.rb +15 -35
  45. data/lib/roda/plugins/partials.rb +3 -8
  46. data/lib/roda/plugins/path.rb +5 -5
  47. data/lib/roda/plugins/path_matchers.rb +3 -3
  48. data/lib/roda/plugins/path_rewriter.rb +4 -9
  49. data/lib/roda/plugins/placeholder_string_matchers.rb +1 -1
  50. data/lib/roda/plugins/precompile_templates.rb +10 -20
  51. data/lib/roda/plugins/public.rb +6 -9
  52. data/lib/roda/plugins/render.rb +50 -171
  53. data/lib/roda/plugins/render_each.rb +4 -7
  54. data/lib/roda/plugins/render_locals.rb +6 -20
  55. data/lib/roda/plugins/request_headers.rb +2 -4
  56. data/lib/roda/plugins/run_append_slash.rb +1 -4
  57. data/lib/roda/plugins/run_handler.rb +4 -7
  58. data/lib/roda/plugins/shared_vars.rb +3 -6
  59. data/lib/roda/plugins/sinatra_helpers.rb +11 -40
  60. data/lib/roda/plugins/slash_path_empty.rb +0 -3
  61. data/lib/roda/plugins/static.rb +2 -2
  62. data/lib/roda/plugins/static_routing.rb +2 -3
  63. data/lib/roda/plugins/streaming.rb +15 -108
  64. data/lib/roda/plugins/strip_path_prefix.rb +1 -1
  65. data/lib/roda/plugins/symbol_matchers.rb +7 -23
  66. data/lib/roda/plugins/type_routing.rb +4 -9
  67. data/lib/roda/plugins/view_options.rb +10 -66
  68. data/lib/roda/version.rb +2 -2
  69. data/spec/all.rb +0 -2
  70. data/spec/composition_spec.rb +1 -1
  71. data/spec/env_spec.rb +1 -1
  72. data/spec/freeze_spec.rb +1 -1
  73. data/spec/integration_spec.rb +1 -1
  74. data/spec/matchers_spec.rb +26 -70
  75. data/spec/opts_spec.rb +1 -1
  76. data/spec/plugin/all_verbs_spec.rb +1 -1
  77. data/spec/plugin/assets_preloading_spec.rb +1 -1
  78. data/spec/plugin/assets_spec.rb +43 -27
  79. data/spec/plugin/backtracking_array_spec.rb +1 -1
  80. data/spec/plugin/branch_locals_spec.rb +1 -1
  81. data/spec/plugin/caching_spec.rb +1 -1
  82. data/spec/plugin/chunked_spec.rb +1 -1
  83. data/spec/plugin/class_level_routing_spec.rb +1 -1
  84. data/spec/plugin/class_matchers_spec.rb +1 -1
  85. data/spec/plugin/content_for_spec.rb +2 -7
  86. data/spec/plugin/cookies_spec.rb +1 -1
  87. data/spec/plugin/csrf_spec.rb +1 -1
  88. data/spec/plugin/default_headers_spec.rb +1 -1
  89. data/spec/plugin/default_status_spec.rb +1 -1
  90. data/spec/plugin/delay_build_spec.rb +1 -1
  91. data/spec/plugin/delegate_spec.rb +1 -1
  92. data/spec/plugin/delete_empty_headers_spec.rb +1 -1
  93. data/spec/plugin/disallow_file_uploads_spec.rb +2 -2
  94. data/spec/plugin/drop_body_spec.rb +1 -1
  95. data/spec/plugin/empty_root_spec.rb +1 -1
  96. data/spec/plugin/environments_spec.rb +1 -1
  97. data/spec/plugin/error_email_spec.rb +1 -1
  98. data/spec/plugin/error_handler_spec.rb +1 -1
  99. data/spec/plugin/error_mail_spec.rb +2 -2
  100. data/spec/plugin/flash_spec.rb +1 -1
  101. data/spec/plugin/h_spec.rb +1 -1
  102. data/spec/plugin/halt_spec.rb +2 -2
  103. data/spec/plugin/hash_matcher_spec.rb +1 -1
  104. data/spec/plugin/head_spec.rb +1 -1
  105. data/spec/plugin/header_matchers_spec.rb +4 -47
  106. data/spec/plugin/heartbeat_spec.rb +1 -1
  107. data/spec/plugin/hooks_spec.rb +1 -1
  108. data/spec/plugin/indifferent_params_spec.rb +1 -1
  109. data/spec/plugin/json_parser_spec.rb +12 -1
  110. data/spec/plugin/json_spec.rb +8 -1
  111. data/spec/plugin/mailer_spec.rb +1 -1
  112. data/spec/plugin/match_affix_spec.rb +1 -1
  113. data/spec/plugin/middleware_spec.rb +15 -1
  114. data/spec/plugin/module_include_spec.rb +1 -1
  115. data/spec/plugin/multi_route_spec.rb +5 -3
  116. data/spec/plugin/multi_run_spec.rb +1 -1
  117. data/spec/plugin/multi_view_spec.rb +1 -1
  118. data/spec/plugin/named_templates_spec.rb +1 -1
  119. data/spec/plugin/not_allowed_spec.rb +1 -1
  120. data/spec/plugin/not_found_spec.rb +1 -1
  121. data/spec/plugin/optimized_string_matchers_spec.rb +1 -1
  122. data/spec/plugin/padrino_render_spec.rb +1 -1
  123. data/spec/plugin/param_matchers_spec.rb +1 -1
  124. data/spec/plugin/params_capturing_spec.rb +6 -22
  125. data/spec/plugin/partials_spec.rb +1 -1
  126. data/spec/plugin/pass_spec.rb +1 -1
  127. data/spec/plugin/path_matchers_spec.rb +1 -1
  128. data/spec/plugin/path_rewriter_spec.rb +1 -1
  129. data/spec/plugin/path_spec.rb +1 -1
  130. data/spec/plugin/placeholder_string_matchers_spec.rb +3 -36
  131. data/spec/plugin/precompile_templates_spec.rb +1 -17
  132. data/spec/plugin/public_spec.rb +3 -4
  133. data/spec/plugin/render_each_spec.rb +1 -1
  134. data/spec/plugin/render_locals_spec.rb +1 -1
  135. data/spec/plugin/render_spec.rb +28 -114
  136. data/spec/plugin/request_headers_spec.rb +1 -1
  137. data/spec/plugin/response_request_spec.rb +1 -1
  138. data/spec/plugin/run_append_slash_spec.rb +1 -1
  139. data/spec/plugin/run_handler_spec.rb +1 -1
  140. data/spec/plugin/shared_vars_spec.rb +1 -1
  141. data/spec/plugin/sinatra_helpers_spec.rb +1 -1
  142. data/spec/plugin/slash_path_empty_spec.rb +1 -1
  143. data/spec/plugin/static_routing_spec.rb +1 -1
  144. data/spec/plugin/static_spec.rb +1 -1
  145. data/spec/plugin/status_303_spec.rb +1 -1
  146. data/spec/plugin/status_handler_spec.rb +1 -1
  147. data/spec/plugin/streaming_spec.rb +1 -106
  148. data/spec/plugin/strip_path_prefix_spec.rb +1 -1
  149. data/spec/plugin/symbol_matchers_spec.rb +1 -77
  150. data/spec/plugin/symbol_status_spec.rb +1 -1
  151. data/spec/plugin/symbol_views_spec.rb +1 -1
  152. data/spec/plugin/type_routing_spec.rb +1 -1
  153. data/spec/plugin/unescape_path_spec.rb +1 -1
  154. data/spec/plugin/view_options_spec.rb +16 -110
  155. data/spec/plugin_spec.rb +1 -1
  156. data/spec/redirect_spec.rb +1 -1
  157. data/spec/request_spec.rb +1 -1
  158. data/spec/response_spec.rb +1 -1
  159. data/spec/session_spec.rb +1 -1
  160. data/spec/spec_helper.rb +1 -3
  161. data/spec/version_spec.rb +1 -1
  162. metadata +6 -26
  163. data/lib/roda/plugins/_erubis_escaping.rb +0 -59
  164. data/lib/roda/plugins/per_thread_caching.rb +0 -71
  165. data/lib/roda/plugins/static_path_info.rb +0 -12
  166. data/lib/roda/plugins/view_subdirs.rb +0 -7
  167. data/lib/roda/plugins/websockets.rb +0 -107
  168. data/spec/plugin/_erubis_escaping_spec.rb +0 -97
  169. data/spec/plugin/per_thread_caching_spec.rb +0 -28
  170. data/spec/plugin/websockets_spec.rb +0 -84
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e11c20c0c5dfda417dafc01b68c10915e59abf04
4
- data.tar.gz: edd6bd09207b2f8e15f78b9c9ada35285003ff0d
3
+ metadata.gz: b7717dcab195a4aa608a95fe1b957a4e70e46eb1
4
+ data.tar.gz: a183e023f32c278e5ddce68390775ef396472d44
5
5
  SHA512:
6
- metadata.gz: a82a396922fc18b9d69551ff405cade3d51e09d5eb518c70bc3166b4214d70692412f91e59c4e31a9fec84e948c93bec3a1a7a066584bd1c5585b39fc57b2c15
7
- data.tar.gz: 4690e25684a1264e29c3c60426263a5631716080de3e699785e193bd96868a9c4788b8aa17ca97fbecacf1db96a39146bb33bc0db23e1398c8d79c2ab3ab34da
6
+ metadata.gz: 0aded27e4b6f521e554f49d14e805fe3bdf03265f3cb4b4437145bc8767ef4b07ced8e267caaee331dc8fba84cb706c166776dd507e5ff254238c9b39984a94a
7
+ data.tar.gz: 79cc0eeea440e916f31b5312c0005e06a543f29204b6ec4b3a34340a221708fb5779b85b38d1242bca29d9b86e789803336e502621bec68034e08e583e1df2b1
data/CHANGELOG CHANGED
@@ -1,3 +1,55 @@
1
+ = 3.0.0 (2017-09-15)
2
+
3
+ * Make defined symbol_matcher and hash_matcher match methods private (jeremyevans)
4
+
5
+ * Use public_send instead of send unless calling private methods is expected (jeremyevans)
6
+
7
+ * Compute multi_run regexp when freezing app to avoid thread safety issues at runtime (jeremyevans)
8
+
9
+ * Remove deprecated support for using undefined multi_route namespaces when routing (jeremyevans)
10
+
11
+ * Make it possible to reset :include_request options to false for json and json_parser plugins (jeremyevans)
12
+
13
+ * Deprecate RodaRequest#placeholder_string_matcher? private method (jeremyevans)
14
+
15
+ * Deprecate Roda.thread_safe_cache, use RodaCache directly (jeremyevans)
16
+
17
+ * Make using an app as middleware always create a subclass of the app (jeremyevans)
18
+
19
+ * Enable SHA256 subresource integrity by default in assets plugin (jeremyevans)
20
+
21
+ * Make subclassing a roda app always inherit the render cache (jeremyevans)
22
+
23
+ * Make :cache=>nil render plugin option still allow caching via :cache render method option (jeremyevans)
24
+
25
+ * Make content_for plugin append to existing content by default (jeremyevans)
26
+
27
+ * Make :host matcher in the header_matchers plugin always yield captures if given a regexp (jeremyevans)
28
+
29
+ * Make :header matcher in the header_matchers plugin now always prefix header with HTTP_ (jeremyevans)
30
+
31
+ * Remove deprecated support for locals handling at the plugin level in the render plugin (jeremyevans)
32
+
33
+ * Remove deprecated support for handling locals in the view_options plugin (jeremyevans)
34
+
35
+ * Remove deprecated support for :ext option in render plugin (jeremyevans)
36
+
37
+ * Remove deprecated view_subdirs alias for view_options plugin (jeremyevans)
38
+
39
+ * Remove deprecated support for EventMachine and Stream#callback method in the streaming plugin (jeremyevans)
40
+
41
+ * Drop support for ruby 1.8.7 (jeremyevans)
42
+
43
+ * Make using an unsupported matcher raise error by default (jeremyevans)
44
+
45
+ * Make having a match/route block return an unsupported value raise error by default (jeremyevans)
46
+
47
+ * Remove deprecated :format, :opt, and :optd symbol matchers in symbol_matchers plugin (jeremyevans)
48
+
49
+ * Remove deprecated support for placeholders in string matchers (jeremyevans)
50
+
51
+ * Remove deprecated constants and plugins (jeremyevans)
52
+
1
53
  = 2.29.0 (2017-08-16)
2
54
 
3
55
  * Deprecate accessing multi_route namespace when there are no routes (jeremyevans)
data/MIT-LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2014-2016 Jeremy Evans
1
+ Copyright (c) 2014-2017 Jeremy Evans
2
2
  Copyright (c) 2010-2014 Michel Martens, Damian Janowski and Cyril David
3
3
  Copyright (c) 2008-2009 Christian Neukirchen
4
4
 
data/README.rdoc CHANGED
@@ -131,10 +131,11 @@ allowing for code such as <tt>r.redirect(path) if some_condition</tt>.
131
131
  If +r.redirect+ is called without arguments
132
132
  and the current request method is not +GET+, it redirects to the current path.
133
133
 
134
- The +.freeze.app+ at the end is optional. Freezing the app avoids any possible
135
- thread safety issues inside the application at runtime, which shouldn't be possible
136
- anyway. This generally should only be done in production mode.
137
- The +.app+ is an optimization, which saves a few method calls for every request.
134
+ The +.freeze.app+ at the end is optional. Freezing the app makes modifying
135
+ app-level settings raise an error, alerting you to possible thread-safety issues
136
+ in your application. It is recommended to freeze the app in production and
137
+ during testing. The +.app+ is an optimization, which saves a few method calls
138
+ for every request.
138
139
 
139
140
  == The Routing Tree
140
141
 
@@ -232,7 +233,7 @@ Here's an example showcasing how different matchers work:
232
233
  end
233
234
 
234
235
  # GET /username/foobar branch
235
- r.on "username", String, :method=>:get do |username|
236
+ r.on "username", String, method: :get do |username|
236
237
  user = User.find_by_username(username)
237
238
 
238
239
  # GET /username/foobar/posts
@@ -249,7 +250,7 @@ Here's an example showcasing how different matchers work:
249
250
 
250
251
  # /search?q=barbaz
251
252
  r.get "search" do
252
- "Searched for #{r['q']}" #=> "Searched for barbaz"
253
+ "Searched for #{r.params['q']}" #=> "Searched for barbaz"
253
254
  end
254
255
 
255
256
  r.is "login" do
@@ -260,7 +261,7 @@ Here's an example showcasing how different matchers work:
260
261
 
261
262
  # POST /login?user=foo&password=baz
262
263
  r.post do
263
- "#{r['user']}:#{r['password']}" #=> "foo:baz"
264
+ "#{r.params['user']}:#{r.params['password']}" #=> "foo:baz"
264
265
  end
265
266
  end
266
267
  end
@@ -285,41 +286,15 @@ If a string contains any slashes, it matches one additional segment for each sla
285
286
  "foo/bar" # matches "/foo/bar"
286
287
  "foo/bar" # does not match "/foo/bard"
287
288
 
288
- While deprecated by default, if a string contains a colon followed by any
289
- <tt>\\w</tt> characters, the colon and remaining <tt>\\w</tt> characters match any
290
- nonempty segment that contains at least one character:
291
-
292
- "foo/:id" # matches "/foo/bar", "/foo/baz", etc.
293
- "foo/:id" # does not match "/fo/bar"
294
-
295
- You can use multiple colons in a string:
296
-
297
- ":x/:y" # matches "/foo/bar", "/bar/foo" etc.
298
- ":x/:y" # does not match "/foo", "/bar/"
299
-
300
- Note that instead of using colons in strings, it is recommended to use separate
301
- symbol arguments, as it is faster and simpler:
302
-
303
- "foo", String # instead of "foo/:id"
304
- String, String # instead of ":x/:y"
305
-
306
- You can load the placeholder_string_matchers plugin to allow placeholders in
307
- strings without a deprecation warning. The deprecated default handling of placeholders
308
- in strings will be removed in Roda 3.
309
-
310
- Note that other than colons followed by a <tt>\\w</tt> character, strings do no
311
- handle regular expression syntax, they are matched verbatim:
312
-
313
- "\\d+(/\\w+)?" # matches "/\d+(/\w+)?"
314
- "\\d+(/\\w+)?" # does not match "/123/abc"
315
-
316
289
  === Regexp
317
290
 
318
291
  Regexps match one or more segments by looking for the pattern,
319
- preceded by a slash:
292
+ preceded by a slash, and followed by a slash or the end of the path:
320
293
 
321
294
  /foo\w+/ # matches "/foobar"
322
295
  /foo\w+/ # does not match "/foo/bar"
296
+ /foo/i # matches "/foo", "/Foo/"
297
+ /foo/i # does not match "/food"
323
298
 
324
299
  If any patterns are captured by the Regexp, they are yielded:
325
300
 
@@ -331,7 +306,8 @@ If any patterns are captured by the Regexp, they are yielded:
331
306
  There are two classes that are supported as matchers, String
332
307
  and Integer.
333
308
 
334
- String :: matches any non-empty segment
309
+ String :: matches any non-empty segment, yielding the segment except for
310
+ the preceding slash
335
311
  Integer :: matches any segment of 0-9, returns matched values as integers
336
312
 
337
313
  Using String and Integer is the recommended way to handle
@@ -396,7 +372,7 @@ allows for easily defining your own:
396
372
  end
397
373
 
398
374
  route do |r|
399
- r.on :foo=>'bar' do
375
+ r.on foo: 'bar' do
400
376
  # ...
401
377
  end
402
378
  end
@@ -406,7 +382,7 @@ allows for easily defining your own:
406
382
 
407
383
  The +:all+ matcher matches if all of the entries in the given array match, so
408
384
 
409
- r.on :all=>[String, String] do
385
+ r.on all: [String, String] do
410
386
  # ...
411
387
  end
412
388
 
@@ -419,7 +395,7 @@ is the same as:
419
395
  The reason it also exists as a separate hash matcher
420
396
  is so you can use it inside an array matcher, so:
421
397
 
422
- r.on ['foo', {:all=>['foos', Integer]}] do
398
+ r.on ['foo', {all: ['foos', Integer]}] do
423
399
  end
424
400
 
425
401
  would match +/foo+ and +/foos/10+, but not +/foos+.
@@ -429,8 +405,8 @@ would match +/foo+ and +/foos/10+, but not +/foos+.
429
405
  The +:method+ matcher matches the method of the request.
430
406
  You can provide an array to specify multiple request methods and match on any of them:
431
407
 
432
- {:method => :post} # matches POST
433
- {:method => ['post', 'patch']} # matches POST and PATCH
408
+ {method: :post} # matches POST
409
+ {method: ['post', 'patch']} # matches POST and PATCH
434
410
 
435
411
  === false, nil
436
412
 
@@ -438,8 +414,8 @@ If +false+ or +nil+ is given directly as a matcher, it doesn't match anything.
438
414
 
439
415
  === Everything else
440
416
 
441
- Everything else matches anything, but such usage is deprecated. In Roda 3, using
442
- an unsupported matcher will raise an error.
417
+ Everything else raises an error, unless support is specifically added for it
418
+ (some plugins add support for additional matcher types).
443
419
 
444
420
  == Optional segments
445
421
 
@@ -450,11 +426,11 @@ the item's id, and 456 being some optional data.
450
426
  The simplest way to handle this is by treating this as two separate routes with a
451
427
  shared branch:
452
428
 
453
- r.on "items", String do |item_id|
429
+ r.on "items", Integer do |item_id|
454
430
  # Shared code for branch here
455
431
 
456
432
  # /items/123/456
457
- r.is String do |optional_data|
433
+ r.is Integer do |optional_data|
458
434
  end
459
435
 
460
436
  # /items/123
@@ -495,8 +471,7 @@ or route block return value is inspected:
495
471
 
496
472
  String :: used as the response body
497
473
  nil, false :: ignored
498
- everything else :: also ignored, but this is deprecated and will raise an
499
- error starting in Roda 3
474
+ everything else :: raises an error
500
475
 
501
476
  Plugins can add support for additional match block and route block return
502
477
  values. One example of this is the json plugin, which allows returning
@@ -574,7 +549,7 @@ If you want to match the request method
574
549
  and do only a partial match on the request path,
575
550
  you need to use +r.on+ with the <tt>:method</tt> hash matcher:
576
551
 
577
- r.on "foo", :method=>:get do # Matches GET /foo(/.*)?
552
+ r.on "foo", method: :get do # Matches GET /foo(/.*)?
578
553
  end
579
554
 
580
555
  == Root Method
@@ -588,7 +563,7 @@ Unlike the other matching methods, +r.root+ takes no arguments.
588
563
 
589
564
  Note that +r.root+ does not match if the path is empty;
590
565
  you should use <tt>r.get true</tt> for that.
591
- If you want to match either the the empty path or +/+,
566
+ If you want to match either the empty path or +/+,
592
567
  you can use <tt>r.get ["", true]</tt>, or use the slash_path_empty
593
568
  plugin.
594
569
 
@@ -694,7 +669,7 @@ The default Rake task will run the specs for Roda.
694
669
  == Settings
695
670
 
696
671
  Each Roda app can store settings in the +opts+ hash.
697
- The settings are inherited if you happen to subclass +Roda+.
672
+ The settings are inherited by subclasses.
698
673
 
699
674
  Roda.opts[:layout] = "guest"
700
675
 
@@ -726,22 +701,6 @@ The following options are respected by the default library or multiple plugins:
726
701
  :freeze_middleware :: Whether to freeze all middleware when building the rack app.
727
702
  :root :: Set the root path for the app. This defaults to the current working
728
703
  directory of the process.
729
- :unsupported_block_result :: If set to :raise, raises an error if a match or
730
- route block returns an object that is not handled.
731
- By default, String, nil, and false are handled,
732
- and other types can be handled via plugins. Setting
733
- this option can alert you to possible issues in your
734
- application.
735
- :unsupported_matcher :: If set to :raise, raises an error if a matcher is used that
736
- is not handled. By default, String, Symbol, Regexp, Hash,
737
- Array, Proc, true, false, and nil are handled. Setting
738
- this option can alert you to possible issues in your
739
- application.
740
- :verbatim_string_matcher :: If set to true, makes all string matchers match
741
- verbatim strings, disallowing the use of colons
742
- for placeholders. In general, it is recommended
743
- to use separate symbol matchers instead of
744
- embedding placeholders in string matchers.
745
704
 
746
705
  There may be other options supported by individual plugins, if so it will be
747
706
  mentioned in the documentation for the plugin.
@@ -769,7 +728,7 @@ By default, +view+ will render the template inside the default layout template;
769
728
  r.get "render" do
770
729
  # Renders the views/home.erb template, which will have access to
771
730
  # the instance variable @var, as well as local variable content.
772
- render("home", :locals=>{:content => "hello, world"})
731
+ render("home", locals: {content: "hello, world"})
773
732
  end
774
733
 
775
734
  r.get "view" do
@@ -788,12 +747,10 @@ You can override the default rendering options by passing a hash to the plugin:
788
747
 
789
748
  class App < Roda
790
749
  plugin :render,
791
- :escape => true, # Automatically escape output in erb templates using Erubis
792
- # can use :erubi instead of true to use Erubi instead of Erubis
793
- :views => 'admin_views', # Default views directory
794
- :layout_opts => {:template=>'admin_layout',
795
- :ext=>'html.erb'}, # Default layout template options
796
- :template_opts => {:default_encoding=>'UTF-8'} # Default template options
750
+ escape: true, # Automatically escape output in erb templates using Erubi's escaping support
751
+ views: 'admin_views', # Default views directory
752
+ layout_opts: {template: 'admin_layout', engine: 'html.erb'}, # Default layout options
753
+ template_opts: {default_encoding: 'UTF-8'} # Default template options
797
754
  end
798
755
 
799
756
  == Sessions
@@ -806,7 +763,7 @@ that comes with Rack:
806
763
  require "roda"
807
764
 
808
765
  class App < Roda
809
- use Rack::Session::Cookie, :secret => ENV['SECRET']
766
+ use Rack::Session::Cookie, secret: ENV['SECRET']
810
767
  end
811
768
 
812
769
  == Security
@@ -853,14 +810,7 @@ are not escaping the output of the content template:
853
810
 
854
811
  <%== yield %> # not <%= yield %>
855
812
 
856
- You can also provide a +:escape_safe_classes+ option, which will
857
- make <tt><%= %></tt> not escape certain string subclasses, useful
858
- if you have helpers that already return escaped output using a
859
- string subclass instance.
860
-
861
- This support requires {Erubis}[http://www.kuwata-lab.com/erubis/].
862
- You can use <tt>:escape=>:erubi</tt> to use {Erubi}[https://github.com/jeremyevans/erubi],
863
- a simplified fork of Erubis.
813
+ This support requires {Erubi}[https://github.com/jeremyevans/erubi].
864
814
 
865
815
  === Security Related HTTP Headers
866
816
 
@@ -890,36 +840,21 @@ Example:
890
840
 
891
841
  === Rendering Templates Derived From User Input
892
842
 
893
- Roda's rendering plugin assumes that template paths given to it are trusted by default.
894
- If you provide a path to the +render+/+view+ methods that is derived from user input, you
895
- are opening yourself for people rendering arbitrary files on the system that that have a
896
- file name ending in the default template extension. For example, if you do:
843
+ Roda's rendering plugin by default checks that rendered templates are inside the views
844
+ directory. This is because rendering templates outside the views directory is not
845
+ commonly needed, and it prevents a common attack (which is especially severe if there is any
846
+ location on the file system that users can write files to).
897
847
 
898
- class App < Roda
899
- plugin :render
900
- route do |r|
901
- view(r['page'])
902
- end
903
- end
904
-
905
- Then attackers can submit a <tt>page</tt> parameter such as <tt>'../../../../tmp/upload'</tt>
906
- to render the <tt>/tmp/upload.erb</tt> file. If you have another part of your system that
907
- allows users to create files with arbitrary extensions (even temporary files), then it may
908
- be possible to combine these two issues into a remote code execution exploit.
909
-
910
- To mitigate against this issue, you can use the <tt>:check_paths => true</tt> render
911
- option, which will check that the full path of the template to be rendered begins with the
912
- +:views+ directory, and raises an exception if not. You can also use the +:allowed_paths+
913
- render option to specify which paths are allowed. While
914
- <tt>:check_paths => true</tt> is not currently the default, it will become the default in
915
- Roda 3. Note that when specifying the +:path+ option when rendering a template, Roda will
848
+ You can specify which directories are allowed using the +:allowed_paths+ render plugin
849
+ option. If you really want to turn path checking off, you can do so via the
850
+ <tt>check_paths: false</tt> render plugin option.
916
851
  not check paths, as it assumes that users and libraries that use this option will be checking
917
852
  such paths manually.
918
853
 
919
854
  == Code Reloading
920
855
 
921
- Roda does not ship with integrated support for code reloading, as it is a toolkit and not a
922
- framework, but there are rack-based reloaders that will work with Roda apps.
856
+ Roda does not ship with integrated support for code reloading, but there are rack-based
857
+ reloaders that will work with Roda apps.
923
858
 
924
859
  For most applications, {rack-unreloader}[https://github.com/jeremyevans/rack-unreloader]
925
860
  is probably the fastest approach to reloading while still being fairly safe, as it
@@ -954,7 +889,7 @@ It's fast but may cause issues in cases where you remove classes, constants, or
954
889
  or when you are not clearing out cached data manually when files are reloaded.
955
890
 
956
891
  There is no one reloading solution that is the best for all applications and development
957
- approaches. Consider your needs and the the tradeoffs of each of the reloading approaches,
892
+ approaches. Consider your needs and the tradeoffs of each of the reloading approaches,
958
893
  and pick the one you think will work best.
959
894
 
960
895
  If you are unsure where to start, it may be best to start with rerun or shotgun
@@ -1060,9 +995,16 @@ It started out as a fork of Cuba, from which it borrows the idea of using a rout
1060
995
  (which Cuba in turn took from {Rum}[https://github.com/chneukirchen/rum]).
1061
996
  From Sinatra, it takes the ideas that route blocks should return the request bodies
1062
997
  and that routes should be canonical.
1063
- It pilfers the idea for an extensible plugin system from the Ruby database library
998
+ Roda's plugin system is based on the plugin system used by
1064
999
  {Sequel}[http://sequel.jeremyevans.net].
1065
1000
 
1001
+ == Ruby Support Policy
1002
+
1003
+ Roda fully supports the currently supported versions of Ruby (MRI) and JRuby. It may
1004
+ support unsupported versions of Ruby or JRuby, but such support may be dropped in any
1005
+ minor version of keeping it becomes a support issue. The minimum Ruby version
1006
+ required to run the current version of Roda is 1.9.2.
1007
+
1066
1008
  == License
1067
1009
 
1068
1010
  MIT
data/Rakefile CHANGED
@@ -1,9 +1,10 @@
1
1
  require "rake"
2
2
  require "rake/clean"
3
+ require "rdoc/task"
3
4
 
4
5
  NAME = 'roda'
5
6
  VERS = lambda do
6
- require File.expand_path("../lib/roda/version.rb", __FILE__)
7
+ require_relative 'lib/roda/version'
7
8
  Roda::RodaVersion
8
9
  end
9
10
  CLEAN.include ["#{NAME}-*.gem", "rdoc", "coverage", "www/public/*.html", "www/public/rdoc", "spec/assets/app.*.css", "spec/assets/app.*.js", "spec/assets/app.*.css.gz", "spec/assets/app.*.js.gz"]
@@ -17,32 +18,24 @@ end
17
18
 
18
19
  ### RDoc
19
20
 
20
- RDOC_DEFAULT_OPTS = ["--line-numbers", "--inline-source", '--title', 'Roda: Routing tree web toolkit']
21
+ RDOC_OPTS = ["--line-numbers", "--inline-source", '--title', 'Roda: Routing tree web toolkit']
21
22
 
22
23
  begin
23
24
  gem 'hanna-nouveau'
24
- RDOC_DEFAULT_OPTS.concat(['-f', 'hanna'])
25
+ RDOC_OPTS.concat(['-f', 'hanna'])
25
26
  rescue Gem::LoadError
26
27
  end
27
28
 
28
- rdoc_task_class = begin
29
- require "rdoc/task"
30
- RDoc::Task
31
- rescue LoadError
32
- require "rake/rdoctask"
33
- Rake::RDocTask
34
- end
35
-
36
- RDOC_OPTS = RDOC_DEFAULT_OPTS + ['--main', 'README.rdoc']
29
+ RDOC_OPTS.concat(['--main', 'README.rdoc'])
37
30
  RDOC_FILES = %w"README.rdoc CHANGELOG MIT-LICENSE lib/**/*.rb" + Dir["doc/*.rdoc"] + Dir['doc/release_notes/*.txt']
38
31
 
39
- rdoc_task_class.new do |rdoc|
32
+ RDoc::Task.new do |rdoc|
40
33
  rdoc.rdoc_dir = "rdoc"
41
34
  rdoc.options += RDOC_OPTS
42
35
  rdoc.rdoc_files.add RDOC_FILES
43
36
  end
44
37
 
45
- rdoc_task_class.new(:website_rdoc) do |rdoc|
38
+ RDoc::Task.new(:website_rdoc) do |rdoc|
46
39
  rdoc.rdoc_dir = "www/public/rdoc"
47
40
  rdoc.options += RDOC_OPTS
48
41
  rdoc.rdoc_files.add RDOC_FILES