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
@@ -28,11 +28,6 @@ class Roda
28
28
  #
29
29
  # This plugin automatically loads the placeholder_string_matchers plugin.
30
30
  module MatchAffix
31
- PREFIX = "/".freeze
32
- RodaPlugins.deprecate_constant(self, :PREFIX)
33
- SUFFIX = "(?=\/|\z)".freeze
34
- RodaPlugins.deprecate_constant(self, :SUFFIX)
35
-
36
31
  def self.load_dependencies(app, _prefix, _suffix)
37
32
  app.plugin :placeholder_string_matchers
38
33
  end
@@ -34,7 +34,8 @@ class Roda
34
34
  # run App
35
35
  #
36
36
  # It is possible to use the Roda app as a regular app even when using
37
- # the middleware plugin.
37
+ # the middleware plugin. Using an app as middleware automatically creates
38
+ # a subclass of the app for the middleware.
38
39
  #
39
40
  # You can support configurable middleware by passing a block when loading
40
41
  # the plugin:
@@ -60,11 +61,6 @@ class Roda
60
61
  #
61
62
  # # Request to App for /mid returns
62
63
  # # "foo bar baz"
63
- #
64
- # Note that when supporting configurable middleware via a block, the middleware
65
- # used is a subclass of the class loading the plugin, instead of the class itself.
66
- # This is done so the same class can be used as middleware with multiple separate
67
- # configurations.
68
64
  module Middleware
69
65
  # Configure the middleware plugin. Options:
70
66
  # :env_var :: Set the environment variable to use to indicate to the roda
@@ -77,17 +73,16 @@ class Roda
77
73
  app.opts[:middleware_configure] = block if block
78
74
  end
79
75
 
80
- # Forward instances are what is actually used as middleware.
76
+ # Forwarder instances are what is actually used as middleware.
81
77
  class Forwarder
82
- # Store the current middleware and the next middleware to call.
78
+ # Make a subclass of +mid+ to use as the current middleware,
79
+ # and store +app+ as the next middleware to call.
83
80
  def initialize(mid, app, *args, &block)
84
- @mid = if configure = mid.opts[:middleware_configure]
85
- mid = Class.new(mid)
86
- configure.call(mid, *args, &block)
87
- mid
88
- else
89
- raise RodaError, "cannot provide middleware args or block unless loading middleware plugin with a block" if block || !args.empty?
90
- mid
81
+ @mid = Class.new(mid)
82
+ if configure = @mid.opts[:middleware_configure]
83
+ configure.call(@mid, *args, &block)
84
+ elsif block || !args.empty?
85
+ raise RodaError, "cannot provide middleware args or block unless loading middleware plugin with a block"
91
86
  end
92
87
  @app = app
93
88
  end
@@ -133,10 +133,13 @@ class Roda
133
133
  end
134
134
 
135
135
  module ClassMethods
136
- # Freeze the namespaced routes so that there can be no thread safety issues at runtime.
136
+ # Freeze the namespaced routes and setup the regexp matchers so that there can be no thread safety issues at runtime.
137
137
  def freeze
138
- opts[:namespaced_routes].freeze
139
- opts[:namespaced_routes].each_value(&:freeze)
138
+ opts[:namespaced_routes].freeze.each do |k,v|
139
+ v.freeze
140
+ self::RodaRequest.named_route_regexp(k)
141
+ end
142
+ self::RodaRequest.instance_variable_get(:@namespaced_route_regexps).freeze
140
143
  super
141
144
  end
142
145
 
@@ -151,9 +154,9 @@ class Roda
151
154
  # The names for the currently stored named routes
152
155
  def named_routes(namespace=nil)
153
156
  unless routes = opts[:namespaced_routes][namespace]
154
- RodaPlugins.warn "Attempt to access multi_route namespace for which no routes have been defined: #{namespace}"
157
+ raise RodaError, "unsupported multi_route namespace used: #{namespace.inspect}"
155
158
  end
156
- routes ? routes.keys : []
159
+ routes.keys
157
160
  end
158
161
 
159
162
  # Return the named route with the given name.
@@ -55,6 +55,7 @@ class Roda
55
55
  # Freeze the multi_run apps so that there can be no thread safety issues at runtime.
56
56
  def freeze
57
57
  opts[:multi_run_apps].freeze
58
+ self::RodaRequest.refresh_multi_run_regexp!
58
59
  super
59
60
  end
60
61
 
@@ -24,7 +24,7 @@ class Roda
24
24
  # You can provide options for the template, for example to change the
25
25
  # engine that the template uses:
26
26
  #
27
- # template :index, :engine=>:str do
27
+ # template :index, engine: :str do
28
28
  # "<p>Hello #{@user}!</p>"
29
29
  # end
30
30
  #
@@ -37,7 +37,7 @@ class Roda
37
37
  # "<p>#{greating} <%= @user %>!</p>"
38
38
  # end
39
39
  #
40
- # This plugin also works with the view_subdirs plugin, as long as you
40
+ # This plugin also works with the view_options plugin, as long as you
41
41
  # prefix the template name with the view subdirectory:
42
42
  #
43
43
  # template "main/index" do
@@ -24,9 +24,6 @@ class Roda
24
24
  # correctly in such cases, but the captures will not be yielded to the
25
25
  # match blocks.
26
26
  module OptimizedStringMatchers
27
- EMPTY_STRING = ''.freeze
28
- RodaPlugins.deprecate_constant(self, :EMPTY_STRING)
29
-
30
27
  module RequestMethods
31
28
  # Optimized version of +on+ that only supports a single string.
32
29
  def on_branch(s)
@@ -5,36 +5,33 @@ class Roda
5
5
  module RodaPlugins
6
6
  # The padrino_render plugin adds rendering support that is
7
7
  # similar to Padrino's. While not everything Padrino's
8
- # rendering supports is supported by this plugin (yet), it
8
+ # rendering supports is supported by this plugin, it
9
9
  # currently handles enough to be a drop in replacement for
10
10
  # some applications.
11
11
  #
12
- # plugin :padrino_render, :views => 'path/2/views'
12
+ # plugin :padrino_render, views: 'path/2/views'
13
13
  #
14
14
  # Most notably, this makes the +render+ method default to
15
15
  # using the layout, similar to how the +view+ method works
16
16
  # in the render plugin. If you want to call render and not
17
- # use a layout, you can use the <tt>:layout=>false</tt>
17
+ # use a layout, you can use the <tt>layout: false</tt>
18
18
  # option:
19
19
  #
20
20
  # render('test') # layout
21
- # render('test', :layout=>false) # no layout
21
+ # render('test', layout: false) # no layout
22
22
  #
23
23
  # Note that this plugin loads the :partials plugin.
24
24
  module PadrinoRender
25
- OPTS = {}.freeze
26
- RodaPlugins.deprecate_constant(self, :OPTS)
27
-
28
25
  # Depend on the render plugin, since this overrides
29
26
  # some of its methods.
30
- def self.load_dependencies(app, opts=RodaPlugins::OPTS)
27
+ def self.load_dependencies(app, opts=OPTS)
31
28
  app.plugin :partials, opts
32
29
  end
33
30
 
34
31
  module InstanceMethods
35
32
  # Call view with the given arguments, so that render
36
33
  # uses a layout by default.
37
- def render(template, opts=RodaPlugins::OPTS)
34
+ def render(template, opts=OPTS)
38
35
  view(template, opts)
39
36
  end
40
37
  end
@@ -9,7 +9,7 @@ class Roda
9
9
  # It adds a :param matcher for matching on any param with the
10
10
  # same name, yielding the value of the param:
11
11
  #
12
- # r.on :param => 'foo' do |value|
12
+ # r.on param: 'foo' do |value|
13
13
  # # Matches '?foo=bar', '?foo='
14
14
  # # Doesn't match '?bar=foo'
15
15
  # end
@@ -17,7 +17,7 @@ class Roda
17
17
  # It adds a :param! matcher for matching on any non-empty param
18
18
  # with the same name, yielding the value of the param:
19
19
  #
20
- # r.on(:param! => 'foo') do |value|
20
+ # r.on(param!: 'foo') do |value|
21
21
  # # Matches '?foo=bar'
22
22
  # # Doesn't match '?foo=', '?bar=foo'
23
23
  # end
@@ -25,12 +25,12 @@ class Roda
25
25
  # It also adds :params and :params! matchers, for matching multiple
26
26
  # params at the same time:
27
27
  #
28
- # r.on :params => ['foo', 'baz'] do |value|
28
+ # r.on params: ['foo', 'baz'] do |value|
29
29
  # # Matches '?foo=bar&baz=quuz', '?foo=&baz='
30
30
  # # Doesn't match '?foo=bar', '?baz='
31
31
  # end
32
32
  #
33
- # r.on :params! => ['foo', 'baz'] do |value|
33
+ # r.on params!: ['foo', 'baz'] do |value|
34
34
  # # Matches '?foo=bar&baz=quuz'
35
35
  # # Doesn't match '?foo=bar', '?baz=', '?foo=&baz=', '?foo=bar&baz='
36
36
  # end
@@ -40,7 +40,7 @@ class Roda
40
40
  # Match the given parameter if present, even if the parameter is empty.
41
41
  # Adds match to the captures.
42
42
  def match_param(key)
43
- if v = self[key]
43
+ if v = params[key.to_s]
44
44
  @captures << v
45
45
  end
46
46
  end
@@ -48,7 +48,7 @@ class Roda
48
48
  # Match the given parameter if present and not empty.
49
49
  # Adds match to the captures.
50
50
  def match_param!(key)
51
- if (v = self[key]) && !v.empty?
51
+ if (v = params[key.to_s]) && !v.empty?
52
52
  @captures << v
53
53
  end
54
54
  end
@@ -12,9 +12,9 @@ class Roda
12
12
  # route do |r|
13
13
  # # GET /foo/123/abc/67
14
14
  # r.on("foo", :bar, :baz, :quux) do
15
- # r[:bar] #=> '123'
16
- # r[:baz] #=> 'abc'
17
- # r[:quux] #=> '67'
15
+ # r.params['bar'] #=> '123'
16
+ # r.params['baz'] #=> 'abc'
17
+ # r.params['quux'] #=> '67'
18
18
  # end
19
19
  # end
20
20
  #
@@ -26,9 +26,9 @@ class Roda
26
26
  # captured segments to the +captures+ key:
27
27
  #
28
28
  # r.on(:x, /(\d+)\/(\w+)/, :y) do
29
- # r[:x] #=> nil
30
- # r[:y] #=> nil
31
- # r[:captures] #=> ["foo", "123", "abc", "67"]
29
+ # r.params['x'] #=> nil
30
+ # r.params['y'] #=> nil
31
+ # r.params['captures'] #=> ["foo", "123", "abc", "67"]
32
32
  # end
33
33
  #
34
34
  # Note that the request params +captures+ entry will be appended to with
@@ -38,7 +38,7 @@ class Roda
38
38
  # r.on(:x) do
39
39
  # r.on(:y) do
40
40
  # r.on(:z) do
41
- # r[:captures] # => ["foo", "123", "abc", "67"]
41
+ # r.params['captures'] # => ["foo", "123", "abc", "67"]
42
42
  # end
43
43
  # end
44
44
  # end
@@ -48,10 +48,6 @@ class Roda
48
48
  # by this plugin. You can use +r.GET+ or +r.POST+ to get the underlying
49
49
  # entry, depending on how it was submitted.
50
50
  #
51
- # Also note that the param keys are actually stored in +r.params+ as
52
- # strings and not symbols (<tt>r[]</tt> converts the argument
53
- # to a string before looking it up in +r.params+).
54
- #
55
51
  # This plugin will also handle string matchers with placeholders if
56
52
  # the placeholder_string_matchers plugin is loaded before this plugin.
57
53
  #
@@ -67,33 +63,17 @@ class Roda
67
63
 
68
64
  private
69
65
 
70
- if RUBY_VERSION >= '1.9'
71
- # Regexp to scan for capture names. Uses positive lookbehind
72
- # so it is only valid on ruby 1.9+, hence the use of eval.
73
- STRING_PARAM_CAPTURE_REGEXP = eval("/(?<=:)\\w+/")
66
+ # Add the capture names from this string to list of param
67
+ # capture names if param capturing.
68
+ def _match_string(str)
69
+ cap_len = @captures.length
74
70
 
75
- # Add the capture names from this string to list of param
76
- # capture names if param capturing.
77
- def _match_string(str)
78
- if (pc = @_params_captures) && placeholder_string_matcher?
79
- pc.concat(str.scan(STRING_PARAM_CAPTURE_REGEXP))
80
- end
81
- super
71
+ if (ret = super) && (pc = @_params_captures) && (cap_len != @captures.length)
72
+ # Handle use with placeholder_string_matchers plugin
73
+ pc.concat(str.scan(/(?<=:)\w+/))
82
74
  end
83
- else
84
- # :nocov:
85
- # RODA3: Remove
86
- # Ruby 1.8 doesn't support positive lookbehind, so include the
87
- # colon in the scan, and strip it out later.
88
- STRING_PARAM_CAPTURE_RANGE = 1..-1
89
75
 
90
- def _match_string(str)
91
- if (pc = @_params_captures) && placeholder_string_matcher?
92
- pc.concat(str.scan(/:\w+/).map{|s| s[STRING_PARAM_CAPTURE_RANGE]})
93
- end
94
- super
95
- end
96
- # :nocov:
76
+ ret
97
77
  end
98
78
 
99
79
  # Add the symbol to the list of param capture names if param capturing.
@@ -6,7 +6,7 @@ class Roda
6
6
  # The partials plugin adds a +partial+ method, which renders
7
7
  # templates without the layout.
8
8
  #
9
- # plugin :partials, :views => 'path/2/views'
9
+ # plugin :partials, views: 'path/2/views'
10
10
  #
11
11
  # Template files are prefixed with an underscore:
12
12
  #
@@ -20,14 +20,9 @@ class Roda
20
20
  #
21
21
  # Note that this plugin automatically loads the :render plugin.
22
22
  module Partials
23
- OPTS = {}.freeze
24
- RodaPlugins.deprecate_constant(self, :OPTS)
25
- SLASH = '/'.freeze
26
- RodaPlugins.deprecate_constant(self, :SLASH)
27
-
28
23
  # Depend on the render plugin, since this overrides
29
24
  # some of its methods.
30
- def self.load_dependencies(app, opts=RodaPlugins::OPTS)
25
+ def self.load_dependencies(app, opts=OPTS)
31
26
  app.plugin :render, opts
32
27
  end
33
28
 
@@ -35,7 +30,7 @@ class Roda
35
30
  # Renders the given template without a layout, but
36
31
  # prefixes the template filename to use with an
37
32
  # underscore.
38
- def partial(template, opts=RodaPlugins::OPTS)
33
+ def partial(template, opts=OPTS)
39
34
  opts = parse_template_opts(template, opts)
40
35
  if opts[:template]
41
36
  template = opts[:template].split('/')
@@ -63,13 +63,10 @@ class Roda
63
63
  module Path
64
64
  DEFAULT_PORTS = {'http' => 80, 'https' => 443}.freeze
65
65
 
66
- OPTS = {}.freeze
67
- RodaPlugins.deprecate_constant(self, :OPTS)
68
-
69
66
  # Initialize the path classes when loading the plugin. Options:
70
67
  # :by_name :: Register classes by name, which is friendlier when reloading code (defaults to
71
68
  # true in development mode)
72
- def self.configure(app, opts=RodaPlugins::OPTS)
69
+ def self.configure(app, opts=OPTS)
73
70
  app.instance_eval do
74
71
  self.opts[:path_class_by_name] = opts.fetch(:by_name, ENV['RACK_ENV'] == 'development')
75
72
  self.opts[:path_classes] ||= {}
@@ -92,7 +89,7 @@ class Roda
92
89
  end
93
90
 
94
91
  # Create a new instance method for the named path. See plugin module documentation for options.
95
- def path(name, path=nil, opts=RodaPlugins::OPTS, &block)
92
+ def path(name, path=nil, opts=OPTS, &block)
96
93
  if name.is_a?(Class)
97
94
  raise RodaError, "can't provide path or options when calling path with a class" unless path.nil? && opts.empty?
98
95
  raise RodaError, "must provide a block when calling path with a class" unless block
@@ -124,11 +121,13 @@ class Roda
124
121
  if add_script_name || url || opts[:url_only]
125
122
  _meth = "_#{meth}"
126
123
  define_method(_meth, &block)
124
+ private _meth
127
125
  end
128
126
 
129
127
  unless opts[:url_only]
130
128
  if add_script_name
131
129
  define_method(meth) do |*a, &blk|
130
+ # Allow calling private _method to get path
132
131
  request.script_name.to_s + send(_meth, *a, &blk)
133
132
  end
134
133
  else
@@ -149,6 +148,7 @@ class Roda
149
148
  port = r.port
150
149
  uri = ["#{scheme}://#{r.host}#{":#{port}" unless DEFAULT_PORTS[scheme] == port}"]
151
150
  uri << request.script_name.to_s if add_script_name
151
+ # Allow calling private _method to get path
152
152
  uri << send(_meth, *a, &blk)
153
153
  File.join(uri)
154
154
  end
@@ -9,7 +9,7 @@ class Roda
9
9
  # It adds a :prefix matcher for matching on the path's prefix,
10
10
  # yielding the rest of the matched segment:
11
11
  #
12
- # r.on :prefix=>'foo' do |suffix|
12
+ # r.on prefix: 'foo' do |suffix|
13
13
  # # Matches '/foo-bar', yielding '-bar'
14
14
  # # Does not match bar-foo
15
15
  # end
@@ -17,7 +17,7 @@ class Roda
17
17
  # It adds a :suffix matcher for matching on the path's suffix,
18
18
  # yielding the part of the segment before the suffix:
19
19
  #
20
- # r.on :suffix=>'bar' do |prefix|
20
+ # r.on suffix: 'bar' do |prefix|
21
21
  # # Matches '/foo-bar', yielding 'foo-'
22
22
  # # Does not match bar-foo
23
23
  # end
@@ -25,7 +25,7 @@ class Roda
25
25
  # It adds an :extension matcher for matching on the given file extension,
26
26
  # yielding the part of the segment before the extension:
27
27
  #
28
- # r.on :extension=>'bar' do |reset|
28
+ # r.on extension: 'bar' do |reset|
29
29
  # # Matches '/foo.bar', yielding 'foo'
30
30
  # # Does not match bar.foo
31
31
  # end
@@ -18,10 +18,10 @@ class Roda
18
18
  #
19
19
  # In some cases, you may want to override PATH_INFO for the rewritten
20
20
  # paths, such as when you are passing the request to another Rack app.
21
- # For those cases, you can use the <tt>:path_info => true</tt> option to
21
+ # For those cases, you can use the <tt>path_info: true</tt> option to
22
22
  # +rewrite_path+.
23
23
  #
24
- # rewrite_path '/a', '/b', :path_info => true
24
+ # rewrite_path '/a', '/b', path_info: true
25
25
  # # PATH_INFO '/a' => PATH_INFO '/b'
26
26
  # # PATH_INFO '/a/c' => PATH_INFO '/b/c'
27
27
  #
@@ -38,18 +38,13 @@ class Roda
38
38
  #
39
39
  # rewrite_path(/\A\/a\/(\w+)/){|match| "/a/#{match[1].capitalize}"}
40
40
  # # PATH_INFO '/a/moo' => remaining_path '/a/Moo'
41
- # rewrite_path(/\A\/a\/(\w+)/, :path_info => true){|match| "/a/#{match[1].capitalize}"}
41
+ # rewrite_path(/\A\/a\/(\w+)/, path_info: true){|match| "/a/#{match[1].capitalize}"}
42
42
  # # PATH_INFO '/a/moo' => PATH_INFO '/a/Moo'
43
43
  #
44
44
  # All path rewrites are applied in order, so if a path is rewritten by one rewrite,
45
45
  # it can be rewritten again by a later rewrite. Note that PATH_INFO rewrites are
46
46
  # processed before remaining_path rewrites.
47
47
  module PathRewriter
48
- OPTS={}.freeze
49
- RodaPlugins.deprecate_constant(self, :OPTS)
50
- PATH_INFO = 'PATH_INFO'.freeze
51
- RodaPlugins.deprecate_constant(self, :PATH_INFO)
52
-
53
48
  def self.configure(app)
54
49
  app.instance_exec do
55
50
  app.opts[:remaining_path_rewrites] ||= []
@@ -67,7 +62,7 @@ class Roda
67
62
 
68
63
  # Record a path rewrite from path +was+ to path +is+. Options:
69
64
  # :path_info :: Modify PATH_INFO, not just remaining path.
70
- def rewrite_path(was, is = nil, opts=RodaPlugins::OPTS, &block)
65
+ def rewrite_path(was, is = nil, opts=OPTS, &block)
71
66
  if is.is_a? Hash
72
67
  raise RodaError, "cannot provide two hashes to rewrite_path" unless opts.empty?
73
68
  opts = is