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
data/doc/conventions.rdoc CHANGED
@@ -78,14 +78,14 @@ Large applications generally need more structure:
78
78
 
79
79
  For larger apps, the +Rakefile+, +assets/+, +migrate+, +models.rb+, +models/+, +public/+, remain the same.
80
80
 
81
- +app_name.rb+ should use the +multi_route+ and +view_subdirs+ plugin, or the +multi_run+ plugin.
81
+ +app_name.rb+ should use the +multi_route+ and +view_options+ plugin, or the +multi_run+ plugin.
82
82
  The routes used by the +multi_route+ or +multi_run+ should be stored in routing files in the +routes/+
83
83
  directory, with one file per prefix.
84
84
 
85
85
  For specs/tests, you should have +spec/models/+ and +spec/web/+, with one file per model in +spec/models/+
86
86
  and one file per prefix in +spec/web/+.
87
87
 
88
- You should have a separate view subdirectory per prefix. If you are using +multi_route+ and +view_subdirs+,
88
+ You should have a separate view subdirectory per prefix. If you are using +multi_route+ and +view_options+ plugins,
89
89
  use +set_view_subdir+ in your routing files to specify the subdirectory to use, so it doesn't need to be
90
90
  specified on every call to view.
91
91
 
@@ -147,7 +147,7 @@ For larger applications, there are some slight changes to the Roda application f
147
147
 
148
148
  plugin :render
149
149
  plugin :assets
150
- plugin :view_subdirs
150
+ plugin :view_options
151
151
  plugin :multi_route
152
152
  Dir['./routes/*.rb'].each{|f| require f}
153
153
 
@@ -158,7 +158,7 @@ For larger applications, there are some slight changes to the Roda application f
158
158
  Dir['./helpers/*.rb'].each{|f| require f}
159
159
  end
160
160
 
161
- After loading the +view_subdirs+ and +multi_route+ plugin, you require all of your
161
+ After loading the +view_options+ and +multi_route+ plugin, you require all of your
162
162
  routing files. Inside your route block, instead of defining your routes, you just call
163
163
  +r.multi_route+, which will dispatch to all of your routing files. After your route
164
164
  block, you require all of your helper files containing the instance methods for your
@@ -322,7 +322,7 @@
322
322
  be set to false if you do not want subclasses to inherit
323
323
  middleware from the superclass. This is useful if the
324
324
  superclass dispatches to the subclass via r.run, as otherwise
325
- it would have to run the the same middleware stack twice.
325
+ it would have to run the same middleware stack twice.
326
326
 
327
327
  * A clear_middleware! class accessor has been added, allowing
328
328
  you to clear the current middleware stack.
@@ -0,0 +1,84 @@
1
+ = Major Changes
2
+
3
+ * String matchers now match literally by default, for simplicity,
4
+ understandability, and performance. Use the String class matcher
5
+ or a symbol matcher to match arbitrary segments.
6
+
7
+ # Before
8
+ r.is "artists/:name" do |artist_name|
9
+ end
10
+
11
+ # Now
12
+ r.is "artists", String do |artist_name|
13
+ end
14
+ # or
15
+ r.is "artists", :name do |artist_name|
16
+ end
17
+
18
+ You can use the placeholder_string_matchers plugin to restore
19
+ the historical behavior if you don't want to modify your
20
+ routes.
21
+
22
+ * Using an unsupported matcher now raises an error, making it
23
+ more likely to detect using a unexpected value as a matcher
24
+ (which previously matched everything).
25
+
26
+ * Have a route/match block return an unsupported value now
27
+ raises an error if nothing has been written to the body, making
28
+ it more likely to detect using an unexpected value as a block
29
+ result (which previously was ignored).
30
+
31
+ = Backwards Compatibility
32
+
33
+ * Deprecated plugins, features, and constants have been removed.
34
+ Before upgrading to 3.0.0, please upgrade to 2.29.0 first and
35
+ fix any deprecation warnings.
36
+
37
+ * Ruby 1.8.7 support has been dropped. Ruby 1.9.2 is the new
38
+ minimum supported version.
39
+
40
+ * The :check_paths render plugin option now defaults to true so that
41
+ generated template paths are checked by default, reducing the risk
42
+ of rendering arbitrary files.
43
+
44
+ * The assets plugin now defaults to using subresource integrity
45
+ with SHA256 for compiled assets, and using SHA256 instead of
46
+ SHA1 for compiled asset hashes.
47
+
48
+ * Subclassing a Roda app that uses the render plugin now always
49
+ uses a copy of the superclass's template cache.
50
+
51
+ * Using a Roda app as middleware now always uses a subclass
52
+ of the app for the middleware.
53
+
54
+ * public_send is now used instead of send internally unless it is
55
+ expected that private methods will be called.
56
+
57
+ * The match methods added by the symbol_matchers and hash_matchers
58
+ plugins are now private instead of public.
59
+
60
+ = Other Improvements
61
+
62
+ * The streaming plugin has been greatly simplified, by dropping
63
+ deprecated compatibility for EventMachine.
64
+
65
+ * It is now possible to reset the :include_request option to false
66
+ in the json and json_parser plugins by loading the plugin a
67
+ second time with the option set.
68
+
69
+ * The precompile_templates plugin now always sorts locals. This
70
+ plugin should now be used with Tilt 2.0.1+ (which also sorts
71
+ locals), though it will still work with earlier Tilt versions.
72
+
73
+ * The multi_run plugin now recomputes the regexp when freezing the
74
+ app.
75
+
76
+ = Deprecated Features
77
+
78
+ These features will be removed in Roda 3.1.0:
79
+
80
+ * Roda.thread_safe_cache is now deprecated. RodaCache is now used
81
+ as the thread-safe cache class.
82
+
83
+ * RodaRequest#placeholder_string_matcher? (private method) is now
84
+ deprecated and always returns false.
data/lib/roda.rb CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  require "rack"
4
4
  require "thread"
5
- require "roda/version"
5
+ require_relative "roda/version"
6
6
 
7
7
  # The main class for Roda. Roda is built completely out of plugins, with the
8
8
  # default plugin being Roda::RodaPlugins::Base, so this class is mostly empty
@@ -102,9 +102,11 @@ class Roda
102
102
  # Deprecate the constant with the given name in the given module,
103
103
  # if the ruby version supports it.
104
104
  def self.deprecate_constant(mod, name)
105
+ # :nocov:
105
106
  if RUBY_VERSION >= '2.3'
106
107
  mod.deprecate_constant(name)
107
108
  end
109
+ # :nocov:
108
110
  end
109
111
 
110
112
  # The base plugin for Roda, implementing all default functionality.
@@ -177,7 +179,7 @@ class Roda
177
179
 
178
180
  request_class = Class.new(self::RodaRequest)
179
181
  request_class.roda_class = subclass
180
- request_class.match_pattern_cache = thread_safe_cache
182
+ request_class.match_pattern_cache = RodaCache.new
181
183
  subclass.const_set(:RodaRequest, request_class)
182
184
 
183
185
  response_class = Class.new(self::RodaResponse)
@@ -223,16 +225,17 @@ class Roda
223
225
  build_rack_app
224
226
  end
225
227
 
226
- # A new thread safe cache instance. This is a method so it can be
227
- # easily overridden for alternative implementations.
228
228
  def thread_safe_cache
229
+ # :nocov:
230
+ RodaPlugins.warn "Roda.thread_safe_cache is deprecated and will be removed from Roda 3.1."
229
231
  RodaCache.new
232
+ # :nocov:
230
233
  end
231
234
 
232
235
  # Add a middleware to use for the rack application. Must be
233
236
  # called before calling #route to have an effect. Example:
234
237
  #
235
- # Roda.use Rack::Session::Cookie, :secret=>ENV['secret']
238
+ # Roda.use Rack::Session::Cookie, secret: ENV['secret']
236
239
  def use(*args, &block)
237
240
  @middleware << [args, block].freeze
238
241
  build_rack_app
@@ -357,27 +360,6 @@ class Roda
357
360
  # Instance methods for RodaRequest, mostly related to handling routing
358
361
  # for the request.
359
362
  module RequestMethods
360
- PATH_INFO = "PATH_INFO".freeze
361
- RodaPlugins.deprecate_constant(self, :PATH_INFO)
362
- SCRIPT_NAME = "SCRIPT_NAME".freeze
363
- RodaPlugins.deprecate_constant(self, :SCRIPT_NAME)
364
- REQUEST_METHOD = "REQUEST_METHOD".freeze
365
- RodaPlugins.deprecate_constant(self, :REQUEST_METHOD)
366
- EMPTY_STRING = "".freeze
367
- RodaPlugins.deprecate_constant(self, :EMPTY_STRING)
368
- SLASH = "/".freeze
369
- RodaPlugins.deprecate_constant(self, :SLASH)
370
- COLON = ":".freeze
371
- RodaPlugins.deprecate_constant(self, :COLON)
372
- SEGMENT = "([^\\/]+)".freeze
373
- RodaPlugins.deprecate_constant(self, :SEGMENT)
374
- TERM_INSPECT = "TERM".freeze
375
- RodaPlugins.deprecate_constant(self, :TERM_INSPECT)
376
- GET_REQUEST_METHOD = 'GET'.freeze
377
- RodaPlugins.deprecate_constant(self, :GET_REQUEST_METHOD)
378
- SESSION_KEY = 'rack.session'.freeze
379
- RodaPlugins.deprecate_constant(self, :SESSION_KEY)
380
-
381
363
  TERM = Object.new
382
364
  def TERM.inspect
383
365
  "TERM"
@@ -611,7 +593,7 @@ class Roda
611
593
  self.class.roda_class
612
594
  end
613
595
 
614
- # Routing matches that only matches +GET+ requests where the current
596
+ # Match method that only matches +GET+ requests where the current
615
597
  # path is +/+. If it matches, the match block is executed, and when
616
598
  # the match block returns, the rack response is returned.
617
599
  #
@@ -722,6 +704,7 @@ class Roda
722
704
  def _match_class(klass)
723
705
  meth = :"_match_class_#{klass}"
724
706
  if respond_to?(meth, true)
707
+ # Allow calling private methods, as match methods are generally private
725
708
  send(meth)
726
709
  else
727
710
  unsupported_matcher(klass)
@@ -730,6 +713,7 @@ class Roda
730
713
 
731
714
  # Match the given hash if all hash matchers match.
732
715
  def _match_hash(hash)
716
+ # Allow calling private methods, as match methods are generally private
733
717
  hash.all?{|k,v| send("match_#{k}", v)}
734
718
  end
735
719
 
@@ -749,35 +733,14 @@ class Roda
749
733
  # string so that regexp metacharacters are not matched, and recognizes
750
734
  # colon tokens for placeholders.
751
735
  def _match_string(str)
752
- if str.index(":") && placeholder_string_matcher?
753
- # RODA3: Remove
754
- not_warned = true
755
- consume(self.class.cached_matcher(str){Regexp.escape(str).gsub(/:(\w+)/) do |m|
756
- match = $1
757
- if not_warned
758
- nor_warned = false
759
- RodaPlugins.warn("Placeholder symbol matchers are deprecated by default and will be removed in Roda 3 (matcher used: #{str.inspect}). Use the placeholder_symbol_matchers plugin or split the string and use separate symbol matchers or String class matchers for the placeholders")
760
- end
761
- _match_symbol_regexp(match)
762
- end})
763
- else
764
- rp = @remaining_path
765
- if rp.start_with?("/#{str}")
766
- last = str.length + 1
767
- case rp[last]
768
- when "/"
769
- @remaining_path = rp[last, rp.length]
770
- when nil
771
- @remaining_path = ""
772
- when Integer
773
- # :nocov:
774
- # RODA3: Remove
775
- # Ruby 1.8 support
776
- if rp[last].chr == "/"
777
- @remaining_path = rp[last, rp.length]
778
- end
779
- # :nocov:
780
- end
736
+ rp = @remaining_path
737
+ if rp.start_with?("/#{str}")
738
+ last = str.length + 1
739
+ case rp[last]
740
+ when "/"
741
+ @remaining_path = rp[last, rp.length]
742
+ when nil
743
+ @remaining_path = ""
781
744
  end
782
745
  end
783
746
  end
@@ -801,11 +764,6 @@ class Roda
801
764
  # Match any nonempty segment. This should be called without an argument.
802
765
  alias _match_class_String _match_symbol
803
766
 
804
- # RODA3: Remove
805
- def _match_symbol_regexp(s)
806
- "([^\\/]+)"
807
- end
808
-
809
767
  # The base remaining path to use.
810
768
  def _remaining_path(env)
811
769
  env["PATH_INFO"]
@@ -838,11 +796,7 @@ class Roda
838
796
  when nil, false
839
797
  # nothing
840
798
  else
841
- if roda_class.opts[:unsupported_block_result] == :raise
842
- raise RodaError, "unsupported block result: #{result.inspect}"
843
- else
844
- RodaPlugins.warn("Unsupported match block return result: #{result.inspect}. This is currently ignored, but will raise an error in Roda 3. Have the block return nil or false to ignore the result.")
845
- end
799
+ raise RodaError, "unsupported block result: #{result.inspect}"
846
800
  end
847
801
  end
848
802
 
@@ -946,16 +900,15 @@ class Roda
946
900
  # Whether string matchers are used verbatim, without handling
947
901
  # placeholders via colons.
948
902
  def placeholder_string_matcher?
949
- !roda_class.opts[:verbatim_string_matcher]
903
+ # :nocov:
904
+ RodaPlugins.warn "Roda::RodaRequest.placeholder_string_matcher? is deprecated and will be removed from Roda 3.1."
905
+ false
906
+ # :nocov:
950
907
  end
951
908
 
952
909
  # Handle an unsupported matcher.
953
910
  def unsupported_matcher(matcher)
954
- if roda_class.opts[:unsupported_matcher] == :raise
955
- raise RodaError, "unsupported matcher: #{matcher.inspect}"
956
- end
957
- RodaPlugins.warn("Unsupported matcher used: #{matcher.inspect}. This currently always matches, but will raise an error in Roda 3. Switch to using true if you want the matcher to always match.")
958
- matcher
911
+ raise RodaError, "unsupported matcher: #{matcher.inspect}"
959
912
  end
960
913
  end
961
914
 
@@ -976,13 +929,6 @@ class Roda
976
929
  module ResponseMethods
977
930
  DEFAULT_HEADERS = {"Content-Type" => "text/html".freeze}.freeze
978
931
 
979
- CONTENT_LENGTH = "Content-Length".freeze
980
- RodaPlugins.deprecate_constant(self, :CONTENT_LENGTH)
981
- CONTENT_TYPE = "Content-Type".freeze
982
- RodaPlugins.deprecate_constant(self, :CONTENT_TYPE)
983
- LOCATION = "Location".freeze
984
- RodaPlugins.deprecate_constant(self, :LOCATION)
985
-
986
932
  # The body for the current response.
987
933
  attr_reader :body
988
934
 
@@ -24,7 +24,7 @@ class Roda
24
24
  # When loading the plugin, use the :css and :js options
25
25
  # to set the source file(s) to use for CSS and javascript assets:
26
26
  #
27
- # plugin :assets, :css => 'some_file.scss', :js => 'some_file.coffee'
27
+ # plugin :assets, css: 'some_file.scss', js: 'some_file.coffee'
28
28
  #
29
29
  # This will look for the following files:
30
30
  #
@@ -57,10 +57,10 @@ class Roda
57
57
  #
58
58
  # You can add attributes to the tags by using an options hash:
59
59
  #
60
- # <%= assets(:css, :media => 'print') %>
60
+ # <%= assets(:css, media: 'print') %>
61
61
  #
62
- # The assets method will respect the application's :add_script_name option,
63
- # if it set it will automatically prefix the path with the SCRIPT_NAME for
62
+ # The assets method will respect the application's +:add_script_name+ option,
63
+ # if it set it will automatically prefix the path with the +SCRIPT_NAME+ for
64
64
  # the request.
65
65
  #
66
66
  # == Asset Paths
@@ -84,8 +84,8 @@ class Roda
84
84
  # css/js files for your front end and back end. To use asset groups, you
85
85
  # pass a hash for the :css and/or :js options:
86
86
  #
87
- # plugin :assets, :css => {:frontend => 'some_frontend_file.scss',
88
- # :backend => 'some_backend_file.scss'}
87
+ # plugin :assets, css: {frontend: 'some_frontend_file.scss',
88
+ # backend: 'some_backend_file.scss'}
89
89
  #
90
90
  # This expects the following directory structure for your assets:
91
91
  #
@@ -93,7 +93,7 @@ class Roda
93
93
  # assets/css/backend/some_backend_file.scss
94
94
  #
95
95
  # If you do not want to force that directory structure when using
96
- # asset groups, you can use the <tt>:group_subdirs => false</tt> option.
96
+ # asset groups, you can use the <tt>group_subdirs: false</tt> option.
97
97
  #
98
98
  # In your view code use an array argument in your call to assets:
99
99
  #
@@ -106,7 +106,7 @@ class Roda
106
106
  # the plugin:
107
107
  #
108
108
  # plugin :assets,
109
- # :css => {:frontend => {:dashboard => 'some_frontend_file.scss'}}
109
+ # css: {frontend: {dashboard: 'some_frontend_file.scss'}}
110
110
  #
111
111
  # and an extra entry per nesting level when creating the tags.
112
112
  #
@@ -126,7 +126,7 @@ class Roda
126
126
  # dependencies of those asset files:
127
127
  #
128
128
  # app.plugin :assets,
129
- # :dependencies=>{'assets/css/bootstrap.scss'=>Dir['assets/css/bootstrap/' '**/*.scss']}
129
+ # dependencies: {'assets/css/bootstrap.scss'=>Dir['assets/css/bootstrap/' '**/*.scss']}
130
130
  #
131
131
  # == Asset Compilation
132
132
  #
@@ -134,7 +134,7 @@ class Roda
134
134
  # into a single file, with you can do by calling compile_assets after
135
135
  # loading the plugin:
136
136
  #
137
- # plugin :assets, :css => 'some_file.scss', :js => 'some_file.coffee'
137
+ # plugin :assets, css: 'some_file.scss', js: 'some_file.coffee'
138
138
  # compile_assets
139
139
  #
140
140
  # After calling compile_assets, calls to assets in your views will default
@@ -224,8 +224,8 @@ class Roda
224
224
  # You can use this to call Autoprefixer on your CSS:
225
225
  #
226
226
  # plugin :assets, {
227
- # :css => [ 'style.scss' ],
228
- # :postprocessor => lambda do |file, type, content|
227
+ # css: [ 'style.scss' ],
228
+ # postprocessor: lambda do |file, type, content|
229
229
  # type == :css ? AutoprefixerRails.process(content).css : content
230
230
  # end
231
231
  # }
@@ -292,7 +292,8 @@ class Roda
292
292
  # paths will be considered relative to the application's :root option.
293
293
  # :sri :: Enables subresource integrity when setting up references to compiled assets. The value should be
294
294
  # :sha256, :sha384, or :sha512 depending on which hash algorithm you want to use. This changes the
295
- # hash algorithm that Roda will use when naming compiled asset files.
295
+ # hash algorithm that Roda will use when naming compiled asset files. The default is :sha256, you
296
+ # can use nil to disable subresource integrity.
296
297
  module Assets
297
298
  DEFAULTS = {
298
299
  :compiled_name => 'app'.freeze,
@@ -305,37 +306,9 @@ class Roda
305
306
  :group_subdirs => true,
306
307
  :compiled_css_dir => nil,
307
308
  :compiled_js_dir => nil,
309
+ :sri => :sha256
308
310
  }.freeze
309
311
 
310
- EMPTY_ATTRS = {}.freeze
311
- RodaPlugins.deprecate_constant(self, :EMPTY_ATTRS)
312
- JS_END = "\"></script>".freeze
313
- RodaPlugins.deprecate_constant(self, :JS_END)
314
- CSS_END = "\" />".freeze
315
- RodaPlugins.deprecate_constant(self, :CSS_END)
316
- SPACE = ' '.freeze
317
- RodaPlugins.deprecate_constant(self, :SPACE)
318
- DOT = '.'.freeze
319
- RodaPlugins.deprecate_constant(self, :DOT)
320
- SLASH = '/'.freeze
321
- RodaPlugins.deprecate_constant(self, :SLASH)
322
- NEWLINE = "\n".freeze
323
- RodaPlugins.deprecate_constant(self, :NEWLINE)
324
- EMPTY_STRING = ''.freeze
325
- RodaPlugins.deprecate_constant(self, :EMPTY_STRING)
326
- JS_SUFFIX = '.js'.freeze
327
- RodaPlugins.deprecate_constant(self, :JS_SUFFIX)
328
- CSS_SUFFIX = '.css'.freeze
329
- RodaPlugins.deprecate_constant(self, :CSS_SUFFIX)
330
- HTTP_ACCEPT_ENCODING = 'HTTP_ACCEPT_ENCODING'.freeze
331
- RodaPlugins.deprecate_constant(self, :HTTP_ACCEPT_ENCODING)
332
- CONTENT_ENCODING = 'Content-Encoding'.freeze
333
- RodaPlugins.deprecate_constant(self, :CONTENT_ENCODING)
334
- GZIP = 'gzip'.freeze
335
- RodaPlugins.deprecate_constant(self, :GZIP)
336
- DOTGZ = '.gz'.freeze
337
- RodaPlugins.deprecate_constant(self, :DOTGZ)
338
-
339
312
  # Internal exception raised when a compressor cannot be found
340
313
  CompressorNotFound = Class.new(RodaError)
341
314
 
@@ -527,10 +500,8 @@ class Roda
527
500
  nil
528
501
  end
529
502
 
530
- # Compress the given content for the given type using yuicompressor,
531
- # but handle cases where yuicompressor isn't installed or can't find
532
- # a java runtime. This method can be overridden by the application
533
- # to use a different compressor.
503
+ # Compress the given content for the given type by using the
504
+ # configured compressor, or trying the supported compressors.
534
505
  def compress_asset(content, type)
535
506
  case compressor = assets_opts[:"#{type}_compressor"]
536
507
  when :none
@@ -538,6 +509,7 @@ class Roda
538
509
  when nil
539
510
  # default, try different compressors
540
511
  else
512
+ # Allow calling private compress methods
541
513
  return send("compress_#{type}_#{compressor}", content)
542
514
  end
543
515
 
@@ -549,6 +521,7 @@ class Roda
549
521
 
550
522
  compressors.each do |comp|
551
523
  begin
524
+ # Allow calling private compress methods
552
525
  if c = send("compress_#{type}_#{comp}", content)
553
526
  return c
554
527
  end
@@ -595,25 +568,19 @@ class Roda
595
568
  # Compress the CSS/JS using YUI Compressor, requires java runtime
596
569
  def compress_yui(content, meth)
597
570
  require 'yuicompressor'
598
- ::YUICompressor.send(meth, content, :munge => true)
571
+ ::YUICompressor.public_send(meth, content, :munge => true)
599
572
  rescue ::Errno::ENOENT => e
600
573
  raise CompressorNotFound, "#{e.class}: #{e.message}", e.backtrace
601
574
  end
602
575
 
603
576
  # Return a unique id for the given content. By default, uses the
604
- # SHA1 hash of the content. This method can be overridden to use
577
+ # SHA256 hash of the content. This method can be overridden to use
605
578
  # a different digest type or to return a static string if you don't
606
579
  # want to use a unique value.
607
580
  def asset_digest(content)
608
- klass = if algo = assets_opts[:sri]
609
- require 'digest/sha2'
610
- ::Digest.const_get(algo.to_s.upcase)
611
- else
612
- require 'digest/sha1'
613
- ::Digest::SHA1
614
- end
615
-
616
- klass.hexdigest(content)
581
+ require 'digest/sha2'
582
+ algo = assets_opts[:sri] || :sha256
583
+ ::Digest.const_get(algo.to_s.upcase).hexdigest(content)
617
584
  end
618
585
  end
619
586
 
@@ -682,7 +649,7 @@ class Roda
682
649
  # Render the asset with the given filename. When assets are compiled,
683
650
  # or when the file is already of the given type (no rendering necessary),
684
651
  # this returns the contents of the compiled file.
685
- # When assets are not compiled and the file is not already of the correct,
652
+ # When assets are not compiled and the file is not already in the same format,
686
653
  # this will render the asset using the render plugin.
687
654
  # In both cases, if the file has not been modified since the last request,
688
655
  # this will return a 304 response.