roda 3.28.0 → 3.29.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (188) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +10 -0
  3. data/README.rdoc +10 -0
  4. data/doc/release_notes/3.29.0.txt +15 -0
  5. data/lib/roda.rb +1 -0
  6. data/lib/roda/plugins/caching.rb +2 -0
  7. data/lib/roda/plugins/common_logger.rb +1 -1
  8. data/lib/roda/plugins/exception_page.rb +7 -1
  9. data/lib/roda/plugins/indifferent_params.rb +2 -0
  10. data/lib/roda/version.rb +1 -1
  11. metadata +4 -214
  12. data/Rakefile +0 -108
  13. data/doc/release_notes/1.0.0.txt +0 -329
  14. data/doc/release_notes/1.1.0.txt +0 -226
  15. data/doc/release_notes/1.2.0.txt +0 -406
  16. data/doc/release_notes/1.3.0.txt +0 -109
  17. data/doc/release_notes/2.0.0.txt +0 -75
  18. data/doc/release_notes/2.1.0.txt +0 -124
  19. data/doc/release_notes/2.10.0.txt +0 -27
  20. data/doc/release_notes/2.11.0.txt +0 -70
  21. data/doc/release_notes/2.12.0.txt +0 -40
  22. data/doc/release_notes/2.13.0.txt +0 -10
  23. data/doc/release_notes/2.14.0.txt +0 -44
  24. data/doc/release_notes/2.15.0.txt +0 -53
  25. data/doc/release_notes/2.16.0.txt +0 -48
  26. data/doc/release_notes/2.17.0.txt +0 -62
  27. data/doc/release_notes/2.18.0.txt +0 -69
  28. data/doc/release_notes/2.19.0.txt +0 -30
  29. data/doc/release_notes/2.2.0.txt +0 -97
  30. data/doc/release_notes/2.20.0.txt +0 -5
  31. data/doc/release_notes/2.21.0.txt +0 -17
  32. data/doc/release_notes/2.22.0.txt +0 -41
  33. data/doc/release_notes/2.23.0.txt +0 -29
  34. data/doc/release_notes/2.24.0.txt +0 -65
  35. data/doc/release_notes/2.25.0.txt +0 -14
  36. data/doc/release_notes/2.26.0.txt +0 -13
  37. data/doc/release_notes/2.27.0.txt +0 -56
  38. data/doc/release_notes/2.28.0.txt +0 -17
  39. data/doc/release_notes/2.29.0.txt +0 -156
  40. data/doc/release_notes/2.3.0.txt +0 -109
  41. data/doc/release_notes/2.4.0.txt +0 -55
  42. data/doc/release_notes/2.5.0.txt +0 -23
  43. data/doc/release_notes/2.5.1.txt +0 -4
  44. data/doc/release_notes/2.6.0.txt +0 -21
  45. data/doc/release_notes/2.7.0.txt +0 -75
  46. data/doc/release_notes/2.8.0.txt +0 -44
  47. data/doc/release_notes/2.9.0.txt +0 -6
  48. data/spec/all.rb +0 -1
  49. data/spec/assets/css/app.scss +0 -1
  50. data/spec/assets/css/no_access.css +0 -1
  51. data/spec/assets/css/raw.css +0 -1
  52. data/spec/assets/js/head/app.js +0 -1
  53. data/spec/composition_spec.rb +0 -31
  54. data/spec/define_roda_method_spec.rb +0 -274
  55. data/spec/env_spec.rb +0 -11
  56. data/spec/freeze_spec.rb +0 -37
  57. data/spec/integration_spec.rb +0 -209
  58. data/spec/matchers_spec.rb +0 -832
  59. data/spec/opts_spec.rb +0 -42
  60. data/spec/plugin/_after_hook_spec.rb +0 -19
  61. data/spec/plugin/all_verbs_spec.rb +0 -29
  62. data/spec/plugin/assets_preloading_spec.rb +0 -98
  63. data/spec/plugin/assets_spec.rb +0 -745
  64. data/spec/plugin/backtracking_array_spec.rb +0 -42
  65. data/spec/plugin/branch_locals_spec.rb +0 -106
  66. data/spec/plugin/caching_spec.rb +0 -337
  67. data/spec/plugin/chunked_spec.rb +0 -201
  68. data/spec/plugin/class_level_routing_spec.rb +0 -164
  69. data/spec/plugin/class_matchers_spec.rb +0 -40
  70. data/spec/plugin/common_logger_spec.rb +0 -85
  71. data/spec/plugin/content_for_spec.rb +0 -162
  72. data/spec/plugin/content_security_policy_spec.rb +0 -175
  73. data/spec/plugin/cookies_spec.rb +0 -51
  74. data/spec/plugin/csrf_spec.rb +0 -111
  75. data/spec/plugin/default_headers_spec.rb +0 -82
  76. data/spec/plugin/default_status_spec.rb +0 -95
  77. data/spec/plugin/delay_build_spec.rb +0 -23
  78. data/spec/plugin/delegate_spec.rb +0 -23
  79. data/spec/plugin/delete_empty_headers_spec.rb +0 -27
  80. data/spec/plugin/direct_call_spec.rb +0 -28
  81. data/spec/plugin/disallow_file_uploads_spec.rb +0 -25
  82. data/spec/plugin/drop_body_spec.rb +0 -24
  83. data/spec/plugin/early_hints_spec.rb +0 -19
  84. data/spec/plugin/empty_root_spec.rb +0 -14
  85. data/spec/plugin/environments_spec.rb +0 -42
  86. data/spec/plugin/error_email_spec.rb +0 -97
  87. data/spec/plugin/error_handler_spec.rb +0 -216
  88. data/spec/plugin/error_mail_spec.rb +0 -93
  89. data/spec/plugin/exception_page_spec.rb +0 -168
  90. data/spec/plugin/flash_spec.rb +0 -121
  91. data/spec/plugin/h_spec.rb +0 -11
  92. data/spec/plugin/halt_spec.rb +0 -119
  93. data/spec/plugin/hash_matcher_spec.rb +0 -27
  94. data/spec/plugin/hash_routes_spec.rb +0 -535
  95. data/spec/plugin/head_spec.rb +0 -52
  96. data/spec/plugin/header_matchers_spec.rb +0 -98
  97. data/spec/plugin/heartbeat_spec.rb +0 -74
  98. data/spec/plugin/hooks_spec.rb +0 -152
  99. data/spec/plugin/indifferent_params_spec.rb +0 -14
  100. data/spec/plugin/json_parser_spec.rb +0 -141
  101. data/spec/plugin/json_spec.rb +0 -83
  102. data/spec/plugin/mail_processor_spec.rb +0 -451
  103. data/spec/plugin/mailer_spec.rb +0 -282
  104. data/spec/plugin/match_affix_spec.rb +0 -43
  105. data/spec/plugin/match_hook_spec.rb +0 -79
  106. data/spec/plugin/middleware_spec.rb +0 -237
  107. data/spec/plugin/middleware_stack_spec.rb +0 -81
  108. data/spec/plugin/module_include_spec.rb +0 -48
  109. data/spec/plugin/multi_route_spec.rb +0 -268
  110. data/spec/plugin/multi_run_spec.rb +0 -87
  111. data/spec/plugin/multi_view_spec.rb +0 -50
  112. data/spec/plugin/multibyte_string_matcher_spec.rb +0 -44
  113. data/spec/plugin/named_templates_spec.rb +0 -96
  114. data/spec/plugin/not_allowed_spec.rb +0 -69
  115. data/spec/plugin/not_found_spec.rb +0 -128
  116. data/spec/plugin/optimized_string_matchers_spec.rb +0 -43
  117. data/spec/plugin/padrino_render_spec.rb +0 -34
  118. data/spec/plugin/param_matchers_spec.rb +0 -69
  119. data/spec/plugin/params_capturing_spec.rb +0 -33
  120. data/spec/plugin/partials_spec.rb +0 -43
  121. data/spec/plugin/pass_spec.rb +0 -29
  122. data/spec/plugin/path_matchers_spec.rb +0 -42
  123. data/spec/plugin/path_rewriter_spec.rb +0 -45
  124. data/spec/plugin/path_spec.rb +0 -222
  125. data/spec/plugin/placeholder_string_matchers_spec.rb +0 -126
  126. data/spec/plugin/precompile_templates_spec.rb +0 -61
  127. data/spec/plugin/public_spec.rb +0 -85
  128. data/spec/plugin/render_each_spec.rb +0 -82
  129. data/spec/plugin/render_locals_spec.rb +0 -114
  130. data/spec/plugin/render_spec.rb +0 -912
  131. data/spec/plugin/request_aref_spec.rb +0 -51
  132. data/spec/plugin/request_headers_spec.rb +0 -39
  133. data/spec/plugin/response_request_spec.rb +0 -43
  134. data/spec/plugin/route_block_args_spec.rb +0 -86
  135. data/spec/plugin/route_csrf_spec.rb +0 -305
  136. data/spec/plugin/run_append_slash_spec.rb +0 -77
  137. data/spec/plugin/run_handler_spec.rb +0 -53
  138. data/spec/plugin/sessions_spec.rb +0 -452
  139. data/spec/plugin/shared_vars_spec.rb +0 -45
  140. data/spec/plugin/sinatra_helpers_spec.rb +0 -537
  141. data/spec/plugin/slash_path_empty_spec.rb +0 -22
  142. data/spec/plugin/static_routing_spec.rb +0 -192
  143. data/spec/plugin/static_spec.rb +0 -30
  144. data/spec/plugin/status_303_spec.rb +0 -28
  145. data/spec/plugin/status_handler_spec.rb +0 -158
  146. data/spec/plugin/streaming_spec.rb +0 -246
  147. data/spec/plugin/strip_path_prefix_spec.rb +0 -24
  148. data/spec/plugin/symbol_matchers_spec.rb +0 -51
  149. data/spec/plugin/symbol_status_spec.rb +0 -25
  150. data/spec/plugin/symbol_views_spec.rb +0 -32
  151. data/spec/plugin/timestamp_public_spec.rb +0 -85
  152. data/spec/plugin/type_routing_spec.rb +0 -348
  153. data/spec/plugin/typecast_params_spec.rb +0 -1370
  154. data/spec/plugin/unescape_path_spec.rb +0 -22
  155. data/spec/plugin/view_options_spec.rb +0 -170
  156. data/spec/plugin_spec.rb +0 -71
  157. data/spec/redirect_spec.rb +0 -41
  158. data/spec/request_spec.rb +0 -97
  159. data/spec/response_spec.rb +0 -199
  160. data/spec/route_spec.rb +0 -39
  161. data/spec/session_middleware_spec.rb +0 -129
  162. data/spec/session_spec.rb +0 -37
  163. data/spec/spec_helper.rb +0 -137
  164. data/spec/version_spec.rb +0 -14
  165. data/spec/views/_test.erb +0 -1
  166. data/spec/views/a.erb +0 -1
  167. data/spec/views/a.rdoc +0 -2
  168. data/spec/views/about.erb +0 -1
  169. data/spec/views/about.str +0 -1
  170. data/spec/views/about/_test.css.gz +0 -0
  171. data/spec/views/about/_test.erb +0 -1
  172. data/spec/views/about/_test.erb.gz +0 -0
  173. data/spec/views/about/comp_test.erb +0 -1
  174. data/spec/views/b.erb +0 -1
  175. data/spec/views/c.erb +0 -1
  176. data/spec/views/comp_layout.erb +0 -1
  177. data/spec/views/comp_test.erb +0 -1
  178. data/spec/views/content-yield.erb +0 -1
  179. data/spec/views/each.str +0 -1
  180. data/spec/views/home.erb +0 -2
  181. data/spec/views/home.str +0 -2
  182. data/spec/views/iv.erb +0 -1
  183. data/spec/views/layout-alternative.erb +0 -2
  184. data/spec/views/layout-yield.erb +0 -3
  185. data/spec/views/layout.erb +0 -2
  186. data/spec/views/layout.str +0 -2
  187. data/spec/views/multiple-layout.erb +0 -1
  188. data/spec/views/multiple.erb +0 -1
@@ -1,4 +0,0 @@
1
- = Improvements
2
-
3
- * The multi_route plugin now works correctly if the middleware plugin
4
- is loaded after it.
@@ -1,21 +0,0 @@
1
- = New Features
2
-
3
- * :params and :params! matchers have been added to the param_matchers
4
- plugin, allowing you to match multiple params at the same time:
5
-
6
- r.on :params=>%w'foo bar' do |foo, bar| end
7
- # instead of
8
- r.on({:param=>'foo'}, :param=>'bar') do |foo, bar| end
9
-
10
- = Other Improvements
11
-
12
- * When loading the csrf plugin multiple times, instead of loading the
13
- middleware multiple times with different settings, merge options
14
- in later plugin calls into a single middleware option hash, and
15
- only load the middleware once.
16
-
17
- This allows plugins to depend on the csrf plugin, while also
18
- allowing the application to use the csrf plugin with options.
19
-
20
- * request.halt now works correctly when used inside a before hook when
21
- using the hooks plugin.
@@ -1,75 +0,0 @@
1
- = New Features
2
-
3
- * A default_status plugin has been added for changing the default
4
- status for responses. Previously, the default status was hard
5
- coded to 200, this plugin allows you to change it. The plugin
6
- takes a block which is instance_evaled in the context of the
7
- response:
8
-
9
- plugin :default_status do
10
- headers['Content-Type'] == 'foo' ? 201 : 200
11
- end
12
-
13
- Note that the default status for empty responses (used when no
14
- route handles the response) is still 404, this just changes the
15
- default for non-empty responses.
16
-
17
- * A response_request plugin has been added for giving the response
18
- instance access to the related request. This can be useful in
19
- conjunction with the default_status plugin, if you want the
20
- default status of the response to depend on the request, such as
21
- using a different status for different request methods:
22
-
23
- plugin :response_request
24
- plugin :default_status do
25
- request.post? ? 201 : 200
26
- end
27
-
28
- * A run_handler plugin has been added, for modifying rack response
29
- arrays before returning them when using r.run. Additionally, it
30
- allows for continuing with routing if the response returned by
31
- r.run is a 404 response, using the :not_found=>:pass option:
32
-
33
- plugin :run_handler
34
- route do |r|
35
- # Keep running code if RackAppFoo returns a 404 response
36
- r.run RackAppFoo, :not_found=>:pass
37
-
38
- # Change response status codes before returning.
39
- r.run(RackAppBar) do |response|
40
- response[0] = 200 if response[0] == 201
41
- end
42
- end
43
-
44
- * Roda.rewite_path in the path_rewriter extension now accepts a block
45
- to allow for dynamic replacements. The block is yielded a MatchData
46
- instance:
47
-
48
- rewrite_path(/\A\/a/(\w+)/){|match| match[1].capitalize}
49
- # PATH_INFO '/a/moo' => remaining_path '/a/Moo'
50
-
51
- rewrite_path(/\A\/a/(\w+)/, :path_info => true) do |match|
52
- match[1].capitalize
53
- end
54
- # PATH_INFO '/a/moo' => PATH_INFO '/a/Moo'
55
-
56
- * The :host matcher in the header_matchers plugin will now yield the
57
- regexp captures to the block if given a regexp when the
58
- :host_matcher_captures application option is set. This behavior
59
- will become the default behavior in Roda 3. This will allow for
60
- code like:
61
-
62
- opts[:host_matcher_captures] = true
63
- route do |r|
64
- r.on :host=>/\A(\w+).example.com\z/ do |subdomain|
65
- # ...
66
- end
67
- end
68
-
69
- = Other Improvements
70
-
71
- * RodaCache now uses a mutex to synchronize access on MRI.
72
- Previously, it relied on the global interpreter lock, but testing
73
- has shown that is not reliable in all cases. RodaCache has always
74
- used a mutex for synchronization on other ruby implementations,
75
- this just extends that code to MRI as well.
@@ -1,44 +0,0 @@
1
- = New Features
2
-
3
- * A multi_view plugin has been added, for easily setting up routing
4
- for rendering multiple views:
5
-
6
- plugin :multi_view
7
-
8
- route do |r|
9
- r.multi_view(['foo', 'bar', 'baz'])
10
- end
11
-
12
- # or:
13
-
14
- route do |r|
15
- r.multi_view(/(foo|bar|baz)/)
16
- end
17
-
18
- # or:
19
-
20
- regexp = multi_view_compile(['foo', 'bar', 'baz'])
21
- route do |r|
22
- r.multi_view(regexp)
23
- end
24
-
25
- # all are equivalent to:
26
-
27
- route do |r|
28
- r.get 'foo' do
29
- view('foo')
30
- end
31
-
32
- r.get 'bar' do
33
- view('bar')
34
- end
35
-
36
- r.get 'baz' do
37
- view('baz')
38
- end
39
- end
40
-
41
- = Other Improvements
42
-
43
- * The content_for plugin now supports haml templates. Previous only
44
- erb templates were supported.
@@ -1,6 +0,0 @@
1
- = New Features
2
-
3
- * The content_for plugin now supports passing the content as a
4
- string argument instead of a block:
5
-
6
- <% content_for :foo, "Some content" %>
@@ -1 +0,0 @@
1
- (Dir['./spec/*_spec.rb'] + Dir['./spec/plugin/*_spec.rb']).each{|f| require f}
@@ -1 +0,0 @@
1
- body { color: red; }
@@ -1 +0,0 @@
1
- no access
@@ -1 +0,0 @@
1
- body { color: blue; }
@@ -1 +0,0 @@
1
- console.log('test')
@@ -1,31 +0,0 @@
1
- require_relative "spec_helper"
2
-
3
- describe "r.run" do
4
- it "should allow composition of apps" do
5
- a = app do |r|
6
- r.on "services", :id do |id|
7
- "View #{id}"
8
- end
9
- end
10
-
11
- app(:new) do |r|
12
- r.on "provider" do
13
- r.run a
14
- end
15
- end
16
-
17
- body("/provider/services/101").must_equal 'View 101'
18
- end
19
-
20
- it "modifies SCRIPT_NAME/PATH_INFO when calling run" do
21
- a = app{|r| "#{r.script_name}|#{r.path_info}"}
22
- app{|r| r.on("a"){r.run a}}
23
- body("/a/b").must_equal "/a|/b"
24
- end
25
-
26
- it "restores SCRIPT_NAME/PATH_INFO before returning from run" do
27
- a = app{|r| "#{r.script_name}|#{r.path_info}"}
28
- app{|r| s = catch(:halt){r.on("a"){r.run a}}; "#{s[2].join}%#{r.script_name}|#{r.path_info}"}
29
- body("/a/b").must_equal "/a|/b%|/a/b"
30
- end
31
- end
@@ -1,274 +0,0 @@
1
- require_relative "spec_helper"
2
-
3
- describe "Roda.define_roda_method" do
4
- before do
5
- @scope = app.new({'PATH_INFO'=>'/'})
6
- end
7
-
8
- it "should define methods using block" do
9
- m0 = app.define_roda_method("x", 0){1}
10
- m0.must_be_kind_of Symbol
11
- m0.must_match(/\A_roda_x_\d+\z/)
12
- @scope.send(m0).must_equal 1
13
-
14
- m1 = app.define_roda_method("x", 1){|x| [x, 2]}
15
- m1.must_be_kind_of Symbol
16
- m1.must_match(/\A_roda_x_\d+\z/)
17
- @scope.send(m1, 3).must_equal [3, 2]
18
- end
19
-
20
- it "should define private methods" do
21
- proc{@scope.public_send(app.define_roda_method("x", 0){1})}.must_raise NoMethodError
22
- end
23
-
24
- it "should accept symbols as method name and return the same symbol" do
25
- m0 = app.define_roda_method(:_roda_foo, 0){1}
26
- m0.must_equal :_roda_foo
27
- @scope.send(m0).must_equal 1
28
- end
29
-
30
- it "should handle optional arguments and splats for expected_arity 0" do
31
- m2 = app.define_roda_method("x", 0){|*x| [x, 3]}
32
- @scope.send(m2).must_equal [[], 3]
33
-
34
- m3 = app.define_roda_method("x", 0){|x=5| [x, 4]}
35
- @scope.send(m3).must_equal [5, 4]
36
-
37
- m4 = app.define_roda_method("x", 0){|x=6, *y| [x, y, 5]}
38
- @scope.send(m4).must_equal [6, [], 5]
39
- end
40
-
41
- it "should should optional arguments and splats for expected_arity 1" do
42
- m2 = app.define_roda_method("x", 1){|y, *x| [y, x, 3]}
43
- @scope.send(m2, :a).must_equal [:a, [], 3]
44
-
45
- m3 = app.define_roda_method("x", 1){|y, x=5| [y, x, 4]}
46
- @scope.send(m3, :b).must_equal [:b, 5, 4]
47
-
48
- m4 = app.define_roda_method("x", 1){|y, x=6, *z| [y, x, z, 5]}
49
- @scope.send(m4, :c).must_equal [:c, 6, [], 5]
50
- end
51
-
52
- it "should handle differences in arity" do
53
- m0 = app.define_roda_method("x", 0){|x| [x, 1]}
54
- @scope.send(m0).must_equal [nil, 1]
55
-
56
- m1 = app.define_roda_method("x", 1){2}
57
- @scope.send(m1, 3).must_equal 2
58
-
59
- m1 = app.define_roda_method("x", 1){|x, y| [x, y]}
60
- @scope.send(m1, 4).must_equal [4, nil]
61
- end
62
-
63
- it "should raise for unexpected expected_arity" do
64
- proc{app.define_roda_method("x", 2){|x|}}.must_raise Roda::RodaError
65
- end
66
-
67
- it "should fail if :check_arity false app option is used and a block with invalid arity is passed" do
68
- app.opts[:check_arity] = false
69
- m0 = app.define_roda_method("x", 0){|x| [x, 1]}
70
- proc{@scope.send(m0)}.must_raise ArgumentError
71
-
72
- m1 = app.define_roda_method("x", 1){2}
73
- proc{@scope.send(m1, 1)}.must_raise ArgumentError
74
- end
75
-
76
- deprecated "should warn if :check_arity :warn app option is used and a block with invalid arity is passed" do
77
- app.opts[:check_arity] = :warn
78
- m0 = app.define_roda_method("x", 0){|x| [x, 1]}
79
- @scope.send(m0).must_equal [nil, 1]
80
-
81
- m1 = app.define_roda_method("x", 1){2}
82
- @scope.send(m1, 3).must_equal 2
83
- end
84
-
85
- [false, true].each do |warn_dynamic_arity|
86
- meth = warn_dynamic_arity ? :deprecated : :it
87
- send meth, "should handle expected_arity :any and do dynamic arity check/fix" do
88
- if warn_dynamic_arity
89
- app.opts[:check_dynamic_arity] = :warn
90
- end
91
-
92
- m0 = app.define_roda_method("x", :any){1}
93
- @scope.send(m0).must_equal 1
94
- @scope.send(m0, 2).must_equal 1
95
-
96
- m1 = app.define_roda_method("x", :any){|x| [x, 1]}
97
- @scope.send(m1).must_equal [nil, 1]
98
- @scope.send(m1, 2).must_equal [2, 1]
99
- @scope.send(m1, 2, 3).must_equal [2, 1]
100
-
101
- m2 = app.define_roda_method("x", :any){|x=5| [x, 2]}
102
- @scope.send(m2).must_equal [5, 2]
103
- @scope.send(m2, 2).must_equal [2, 2]
104
- @scope.send(m2, 2, 3).must_equal [2, 2]
105
-
106
- m3 = app.define_roda_method("x", :any){|y, x=5| [x, y, 3]}
107
- @scope.send(m3).must_equal [5, nil, 3]
108
- @scope.send(m3, 2).must_equal [5, 2, 3]
109
- @scope.send(m3, 2, 3).must_equal [3, 2, 3]
110
- @scope.send(m3, 2, 3, 4).must_equal [3, 2, 3]
111
-
112
- m4 = app.define_roda_method("x", :any){|*z| [z, 1]}
113
- @scope.send(m4).must_equal [[], 1]
114
- @scope.send(m4, 2).must_equal [[2], 1]
115
-
116
- m5 = app.define_roda_method("x", :any){|x, *z| [x, z, 1]}
117
- @scope.send(m5).must_equal [nil, [], 1]
118
- @scope.send(m5, 2).must_equal [2, [], 1]
119
- @scope.send(m5, 2, 3).must_equal [2, [3], 1]
120
-
121
- m6 = app.define_roda_method("x", :any){|x=5, *z| [x, z, 2]}
122
- @scope.send(m6).must_equal [5, [], 2]
123
- @scope.send(m6, 2).must_equal [2, [], 2]
124
- @scope.send(m6, 2, 3).must_equal [2, [3], 2]
125
-
126
- m7 = app.define_roda_method("x", :any){|y, x=5, *z| [x, y, z, 3]}
127
- @scope.send(m7).must_equal [5, nil, [], 3]
128
- @scope.send(m7, 2).must_equal [5, 2, [], 3]
129
- @scope.send(m7, 2, 3).must_equal [3, 2, [], 3]
130
- @scope.send(m7, 2, 3, 4).must_equal [3, 2, [4], 3]
131
- end
132
- end
133
-
134
- it "should not fix dynamic arity issues if :check_dynamic_arity false app option is used" do
135
- app.opts[:check_dynamic_arity] = false
136
-
137
- m0 = app.define_roda_method("x", :any){1}
138
- @scope.send(m0).must_equal 1
139
- proc{@scope.send(m0, 2)}.must_raise ArgumentError
140
-
141
- m1 = app.define_roda_method("x", :any){|x| [x, 1]}
142
- proc{@scope.send(m1)}.must_raise ArgumentError
143
- @scope.send(m1, 2).must_equal [2, 1]
144
- proc{@scope.send(m1, 2, 3)}.must_raise ArgumentError
145
-
146
- m2 = app.define_roda_method("x", :any){|x=5| [x, 2]}
147
- @scope.send(m2).must_equal [5, 2]
148
- @scope.send(m2, 2).must_equal [2, 2]
149
- proc{@scope.send(m2, 2, 3)}.must_raise ArgumentError
150
-
151
- m3 = app.define_roda_method("x", :any){|y, x=5| [x, y, 3]}
152
- proc{@scope.send(m3)}.must_raise ArgumentError
153
- @scope.send(m3, 2).must_equal [5, 2, 3]
154
- @scope.send(m3, 2, 3).must_equal [3, 2, 3]
155
- proc{@scope.send(m3, 2, 3, 4)}.must_raise ArgumentError
156
-
157
- m4 = app.define_roda_method("x", :any){|*z| [z, 1]}
158
- @scope.send(m4).must_equal [[], 1]
159
- @scope.send(m4, 2).must_equal [[2], 1]
160
-
161
- m5 = app.define_roda_method("x", :any){|x, *z| [x, z, 1]}
162
- proc{@scope.send(m5)}.must_raise ArgumentError
163
- @scope.send(m5, 2).must_equal [2, [], 1]
164
- @scope.send(m5, 2, 3).must_equal [2, [3], 1]
165
-
166
- m6 = app.define_roda_method("x", :any){|x=5, *z| [x, z, 2]}
167
- @scope.send(m6).must_equal [5, [], 2]
168
- @scope.send(m6, 2).must_equal [2, [], 2]
169
- @scope.send(m6, 2, 3).must_equal [2, [3], 2]
170
-
171
- m7 = app.define_roda_method("x", :any){|y, x=5, *z| [x, y, z, 3]}
172
- proc{@scope.send(m7)}.must_raise ArgumentError
173
- @scope.send(m7, 2).must_equal [5, 2, [], 3]
174
- @scope.send(m7, 2, 3).must_equal [3, 2, [], 3]
175
- @scope.send(m7, 2, 3, 4).must_equal [3, 2, [4], 3]
176
- end
177
-
178
- if RUBY_VERSION > '2.1'
179
- it "should raise for required keyword arguments for expected_arity 0 or 1" do
180
- proc{eval("app.define_roda_method('x', 0){|b:| [b, 1]}", binding)}.must_raise Roda::RodaError
181
- proc{eval("app.define_roda_method('x', 0){|c=1, b:| [c, b, 1]}", binding)}.must_raise Roda::RodaError
182
- proc{eval("app.define_roda_method('x', 1){|x, b:| [b, 1]}", binding)}.must_raise Roda::RodaError
183
- proc{eval("app.define_roda_method('x', 1){|x, c=1, b:| [c, b, 1]}", binding)}.must_raise Roda::RodaError
184
- end
185
-
186
- it "should ignore keyword arguments for expected_arity 0" do
187
- @scope.send(eval("app.define_roda_method('x', 0){|b:2| [b, 1]}", binding)).must_equal [2, 1]
188
- @scope.send(eval("app.define_roda_method('x', 0){|**b| [b, 1]}", binding)).must_equal [{}, 1]
189
- @scope.send(eval("app.define_roda_method('x', 0){|c=1, b:2| [c, b, 1]}", binding)).must_equal [1, 2, 1]
190
- @scope.send(eval("app.define_roda_method('x', 0){|c=1, **b| [c, b, 1]}", binding)).must_equal [1, {}, 1]
191
- @scope.send(eval("app.define_roda_method('x', 0){|x, b:2| [x, b, 1]}", binding)).must_equal [nil, 2, 1]
192
- @scope.send(eval("app.define_roda_method('x', 0){|x, **b| [x, b, 1]}", binding)).must_equal [nil, {}, 1]
193
- @scope.send(eval("app.define_roda_method('x', 0){|x, c=1, b:2| [x, c, b, 1]}", binding)).must_equal [nil, 1, 2, 1]
194
- @scope.send(eval("app.define_roda_method('x', 0){|x, c=1, **b| [x, c, b, 1]}", binding)).must_equal [nil, 1, {}, 1]
195
- end
196
-
197
- it "should ignore keyword arguments for expected_arity 1" do
198
- @scope.send(eval("app.define_roda_method('x', 1){|b:2| [b, 1]}", binding), 3).must_equal [2, 1]
199
- @scope.send(eval("app.define_roda_method('x', 1){|**b| [b, 1]}", binding), 3).must_equal [{}, 1]
200
- @scope.send(eval("app.define_roda_method('x', 1){|c=1, b:2| [c, b, 1]}", binding), 3).must_equal [3, 2, 1]
201
- @scope.send(eval("app.define_roda_method('x', 1){|c=1, **b| [c, b, 1]}", binding), 3).must_equal [3, {}, 1]
202
- @scope.send(eval("app.define_roda_method('x', 1){|x, b:2| [x, b, 1]}", binding), 3).must_equal [3, 2, 1]
203
- @scope.send(eval("app.define_roda_method('x', 1){|x, **b| [x, b, 1]}", binding), 3).must_equal [3, {}, 1]
204
- @scope.send(eval("app.define_roda_method('x', 1){|x, c=1, b:2| [x, c, b, 1]}", binding), 3).must_equal [3, 1, 2, 1]
205
- @scope.send(eval("app.define_roda_method('x', 1){|x, c=1, **b| [x, c, b, 1]}", binding), 3).must_equal [3, 1, {}, 1]
206
- end
207
-
208
- it "should handle expected_arity :any with keyword arguments" do
209
- if RUBY_VERSION >= '2.7' && RUBY_VERSION < '3'
210
- suppress = proc do |&b|
211
- begin
212
- stderr = $stderr
213
- $stderr = StringIO.new
214
- b.call
215
- ensure
216
- $stderr = stderr
217
- end
218
- end
219
- else
220
- suppress = proc{|&b| b.call}
221
- end
222
-
223
- m = eval('app.define_roda_method("x", :any){|b:2| b}', binding)
224
- @scope.send(m).must_equal 2
225
- @scope.send(m, 4).must_equal 2
226
- @scope.send(m, b: 3).must_equal 3
227
- @scope.send(m, 4, b: 3).must_equal 3
228
-
229
- m = eval('app.define_roda_method("x", :any){|b:| b}', binding)
230
- proc{@scope.send(m)}.must_raise ArgumentError
231
- proc{@scope.send(m, 4)}.must_raise ArgumentError
232
- @scope.send(m, b: 3).must_equal 3
233
- @scope.send(m, 4, b: 3).must_equal 3
234
-
235
- m = eval('app.define_roda_method("x", :any){|**b| b}', binding)
236
- @scope.send(m).must_equal({})
237
- @scope.send(m, 4).must_equal({})
238
- @scope.send(m, b: 3).must_equal(b: 3)
239
- @scope.send(m, 4, b: 3).must_equal(b: 3)
240
-
241
- m = eval('app.define_roda_method("x", :any){|x, b:9| [x, b, 1]}', binding)
242
- suppress.call{@scope.send(m)[1..-1]}.must_equal [9, 1]
243
- @scope.send(m, 2).must_equal [2, 9, 1]
244
- @scope.send(m, 2, 3).must_equal [2, 9, 1]
245
- eval("@scope.send(m, {b: 4}#{', **{}' if RUBY_VERSION > '2'})").must_equal [{b: 4}, 9, 1]
246
- @scope.send(m, 2, b: 4).must_equal [2, 4, 1]
247
- @scope.send(m, 2, 3, b: 4).must_equal [2, 4, 1]
248
-
249
- m = eval('app.define_roda_method("x", :any){|x, b:| [x, b, 1]}', binding)
250
- proc{suppress.call{@scope.send(m)}}.must_raise ArgumentError
251
- proc{@scope.send(m, 2)}.must_raise ArgumentError
252
- proc{@scope.send(m, 2, 3)}.must_raise ArgumentError
253
- proc{eval("@scope.send(m, {b: 4}#{', **{}' if RUBY_VERSION > '2'})")}.must_raise ArgumentError
254
- @scope.send(m, 2, b: 4).must_equal [2, 4, 1]
255
- @scope.send(m, 2, 3, b: 4).must_equal [2, 4, 1]
256
-
257
- m = eval('app.define_roda_method("x", :any){|x, **b| [x, b, 1]}', binding)
258
- suppress.call{@scope.send(m)[1..-1]}.must_equal [{}, 1]
259
- @scope.send(m, 2).must_equal [2, {}, 1]
260
- @scope.send(m, 2, 3).must_equal [2, {}, 1]
261
- eval("@scope.send(m, {b: 4}#{', **{}' if RUBY_VERSION > '2'})").must_equal [{b: 4}, {}, 1]
262
- @scope.send(m, 2, b: 4).must_equal [2, {b: 4}, 1]
263
- @scope.send(m, 2, 3, b: 4).must_equal [2, {b: 4}, 1]
264
-
265
- m = eval('m = app.define_roda_method("x", :any){|x=5, b:9| [x, b, 2]}', binding)
266
- @scope.send(m).must_equal [5, 9, 2]
267
- @scope.send(m, 2).must_equal [2, 9, 2]
268
- @scope.send(m, 2, 3).must_equal [2, 9, 2]
269
- @scope.send(m, b: 4).must_equal [5, 4, 2]
270
- @scope.send(m, 2, b: 4).must_equal [2, 4, 2]
271
- @scope.send(m, 2, 3, b: 4).must_equal [2, 4, 2]
272
- end
273
- end
274
- end