roda 2.2.0 → 2.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (94) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +34 -0
  3. data/Rakefile +22 -46
  4. data/doc/release_notes/2.3.0.txt +109 -0
  5. data/lib/roda/plugins/assets.rb +2 -1
  6. data/lib/roda/plugins/caching.rb +1 -1
  7. data/lib/roda/plugins/chunked.rb +1 -1
  8. data/lib/roda/plugins/error_email.rb +1 -1
  9. data/lib/roda/plugins/head.rb +6 -0
  10. data/lib/roda/plugins/heartbeat.rb +40 -0
  11. data/lib/roda/plugins/json.rb +23 -3
  12. data/lib/roda/plugins/json_parser.rb +72 -0
  13. data/lib/roda/plugins/mailer.rb +22 -5
  14. data/lib/roda/plugins/named_templates.rb +2 -2
  15. data/lib/roda/plugins/path_rewriter.rb +82 -0
  16. data/lib/roda/plugins/precompile_templates.rb +87 -0
  17. data/lib/roda/plugins/render.rb +111 -43
  18. data/lib/roda/plugins/render_each.rb +1 -1
  19. data/lib/roda/plugins/shared_vars.rb +1 -1
  20. data/lib/roda/plugins/view_options.rb +28 -3
  21. data/lib/roda/version.rb +1 -1
  22. data/spec/composition_spec.rb +3 -3
  23. data/spec/env_spec.rb +1 -1
  24. data/spec/freeze_spec.rb +6 -6
  25. data/spec/integration_spec.rb +16 -15
  26. data/spec/matchers_spec.rb +110 -110
  27. data/spec/opts_spec.rb +8 -8
  28. data/spec/plugin/_erubis_escaping_spec.rb +34 -3
  29. data/spec/plugin/all_verbs_spec.rb +8 -8
  30. data/spec/plugin/assets_spec.rb +164 -150
  31. data/spec/plugin/backtracking_array_spec.rb +18 -18
  32. data/spec/plugin/caching_spec.rb +70 -70
  33. data/spec/plugin/chunked_spec.rb +38 -38
  34. data/spec/plugin/class_level_routing_spec.rb +78 -78
  35. data/spec/plugin/content_for_spec.rb +2 -2
  36. data/spec/plugin/cookies_spec.rb +4 -4
  37. data/spec/plugin/csrf_spec.rb +8 -8
  38. data/spec/plugin/default_headers_spec.rb +6 -6
  39. data/spec/plugin/delay_build_spec.rb +7 -6
  40. data/spec/plugin/delegate_spec.rb +2 -2
  41. data/spec/plugin/delete_empty_headers_spec.rb +2 -2
  42. data/spec/plugin/drop_body_spec.rb +6 -6
  43. data/spec/plugin/empty_root_spec.rb +3 -3
  44. data/spec/plugin/environments_spec.rb +7 -7
  45. data/spec/plugin/error_email_spec.rb +23 -23
  46. data/spec/plugin/error_handler_spec.rb +14 -14
  47. data/spec/plugin/flash_spec.rb +30 -29
  48. data/spec/plugin/h_spec.rb +1 -1
  49. data/spec/plugin/halt_spec.rb +16 -16
  50. data/spec/plugin/hash_matcher_spec.rb +5 -5
  51. data/spec/plugin/head_spec.rb +10 -10
  52. data/spec/plugin/header_matchers_spec.rb +13 -13
  53. data/spec/plugin/heartbeat_spec.rb +74 -0
  54. data/spec/plugin/hooks_spec.rb +20 -20
  55. data/spec/plugin/indifferent_params_spec.rb +1 -1
  56. data/spec/plugin/json_parser_spec.rb +72 -0
  57. data/spec/plugin/json_spec.rb +22 -9
  58. data/spec/plugin/mailer_spec.rb +72 -58
  59. data/spec/plugin/match_affix_spec.rb +2 -2
  60. data/spec/plugin/middleware_spec.rb +7 -7
  61. data/spec/plugin/module_include_spec.rb +4 -4
  62. data/spec/plugin/multi_route_spec.rb +66 -66
  63. data/spec/plugin/multi_run_spec.rb +21 -21
  64. data/spec/plugin/named_templates_spec.rb +6 -6
  65. data/spec/plugin/not_allowed_spec.rb +17 -17
  66. data/spec/plugin/not_found_spec.rb +14 -14
  67. data/spec/plugin/padrino_render_spec.rb +2 -2
  68. data/spec/plugin/param_matchers_spec.rb +6 -6
  69. data/spec/plugin/partials_spec.rb +3 -3
  70. data/spec/plugin/pass_spec.rb +7 -7
  71. data/spec/plugin/path_matchers_spec.rb +6 -6
  72. data/spec/plugin/path_rewriter_spec.rb +37 -0
  73. data/spec/plugin/path_spec.rb +41 -40
  74. data/spec/plugin/per_thread_caching_spec.rb +6 -6
  75. data/spec/plugin/precompile_templates_spec.rb +74 -0
  76. data/spec/plugin/render_each_spec.rb +4 -4
  77. data/spec/plugin/render_spec.rb +179 -76
  78. data/spec/plugin/shared_vars_spec.rb +4 -4
  79. data/spec/plugin/sinatra_helpers_spec.rb +121 -121
  80. data/spec/plugin/slash_path_empty_spec.rb +10 -10
  81. data/spec/plugin/static_spec.rb +4 -4
  82. data/spec/plugin/streaming_spec.rb +11 -11
  83. data/spec/plugin/symbol_matchers_spec.rb +24 -24
  84. data/spec/plugin/symbol_views_spec.rb +3 -3
  85. data/spec/plugin/view_options_spec.rb +10 -10
  86. data/spec/plugin_spec.rb +2 -2
  87. data/spec/redirect_spec.rb +10 -10
  88. data/spec/request_spec.rb +8 -8
  89. data/spec/response_spec.rb +23 -23
  90. data/spec/session_spec.rb +4 -4
  91. data/spec/spec_helper.rb +5 -19
  92. data/spec/version_spec.rb +4 -4
  93. data/spec/views/iv.erb +1 -0
  94. metadata +16 -5
@@ -24,11 +24,11 @@ describe "padrino_render plugin" do
24
24
  end
25
25
 
26
26
  it "render uses layout by default" do
27
- body("/render").strip.should == "<title>Roda: Home</title>\nbar"
27
+ body("/render").strip.must_equal "<title>Roda: Home</title>\nbar"
28
28
  end
29
29
 
30
30
  it "render doesn't use layout if layout is nil" do
31
- body("/render/nolayout").strip.should == "<h1>No Layout</h1>"
31
+ body("/render/nolayout").strip.must_equal "<h1>No Layout</h1>"
32
32
  end
33
33
  end
34
34
  end
@@ -13,9 +13,9 @@ describe "param_matchers plugin" do
13
13
  end
14
14
 
15
15
  io = StringIO.new
16
- body("/signup", "rack.input" => io, "QUERY_STRING" => "email=john@doe.com").should == 'john@doe.com'
17
- body("/signup", "rack.input" => io, "QUERY_STRING" => "").should == 'No email'
18
- body("/signup", "rack.input" => io, "QUERY_STRING" => "email=").should == 'No email'
16
+ body("/signup", "rack.input" => io, "QUERY_STRING" => "email=john@doe.com").must_equal 'john@doe.com'
17
+ body("/signup", "rack.input" => io, "QUERY_STRING" => "").must_equal 'No email'
18
+ body("/signup", "rack.input" => io, "QUERY_STRING" => "email=").must_equal 'No email'
19
19
  end
20
20
 
21
21
  it "param matcheshould yield a param only if given" do
@@ -30,8 +30,8 @@ describe "param_matchers plugin" do
30
30
  end
31
31
 
32
32
  io = StringIO.new
33
- body("/signup", "rack.input" => io, "QUERY_STRING" => "email=john@doe.com").should == 'john@doe.com'
34
- body("/signup", "rack.input" => io, "QUERY_STRING" => "").should == 'No email'
35
- body("/signup", "rack.input" => io, "QUERY_STRING" => "email=").should == ''
33
+ body("/signup", "rack.input" => io, "QUERY_STRING" => "email=john@doe.com").must_equal 'john@doe.com'
34
+ body("/signup", "rack.input" => io, "QUERY_STRING" => "").must_equal 'No email'
35
+ body("/signup", "rack.input" => io, "QUERY_STRING" => "email=").must_equal ''
36
36
  end
37
37
  end
@@ -28,15 +28,15 @@ else
28
28
  end
29
29
 
30
30
  it "partial renders without layout, and prepends _ to template" do
31
- body("/partial").strip.should == "<h1>About Roda</h1>"
31
+ body("/partial").strip.must_equal "<h1>About Roda</h1>"
32
32
  end
33
33
 
34
34
  it "partial renders without layout, and prepends _ to template" do
35
- body("/partial/subdir").strip.should == "<h1>Subdir: About Roda</h1>"
35
+ body("/partial/subdir").strip.must_equal "<h1>Subdir: About Roda</h1>"
36
36
  end
37
37
 
38
38
  it "partial handles inline partials" do
39
- body("/partial/inline").strip.should == "Hello Agent Smith"
39
+ body("/partial/inline").strip.must_equal "Hello Agent Smith"
40
40
  end
41
41
 
42
42
  end
@@ -18,12 +18,12 @@ describe "pass plugin" do
18
18
  end
19
19
  end
20
20
 
21
- body.should == 'root'
22
- status('FOO'=>true).should == 404
23
- body("/a").should == 'a'
24
- body("/a/b").should == 'a'
25
- body("/foo/a").should == 'fooa'
26
- body("/foo/a/b").should == 'fooa'
27
- status("/foo").should == 404
21
+ body.must_equal 'root'
22
+ status('FOO'=>true).must_equal 404
23
+ body("/a").must_equal 'a'
24
+ body("/a/b").must_equal 'a'
25
+ body("/foo/a").must_equal 'fooa'
26
+ body("/foo/a/b").must_equal 'fooa'
27
+ status("/foo").must_equal 404
28
28
  end
29
29
  end
@@ -10,8 +10,8 @@ describe "path_matchers plugin" do
10
10
  end
11
11
  end
12
12
 
13
- body("/css/reset.css").should == 'reset'
14
- status("/css/reset.bar").should == 404
13
+ body("/css/reset.css").must_equal 'reset'
14
+ status("/css/reset.bar").must_equal 404
15
15
  end
16
16
 
17
17
  it ":suffix matcher should match given suffix" do
@@ -23,8 +23,8 @@ describe "path_matchers plugin" do
23
23
  end
24
24
  end
25
25
 
26
- body("/css/reset.css").should == 'reset'
27
- status("/css/reset.bar").should == 404
26
+ body("/css/reset.css").must_equal 'reset'
27
+ status("/css/reset.bar").must_equal 404
28
28
  end
29
29
 
30
30
  it ":prefix matcher should match given prefix" do
@@ -36,7 +36,7 @@ describe "path_matchers plugin" do
36
36
  end
37
37
  end
38
38
 
39
- body("/css/reset.css").should == '.css'
40
- status("/css/foo.bar").should == 404
39
+ body("/css/reset.css").must_equal '.css'
40
+ status("/css/foo.bar").must_equal 404
41
41
  end
42
42
  end
@@ -0,0 +1,37 @@
1
+ require File.expand_path("spec_helper", File.dirname(File.dirname(__FILE__)))
2
+
3
+ describe "path_rewriter plugin" do
4
+ it "allows rewriting remaining path or PATH_INFO" do
5
+ app(:bare) do
6
+ plugin :path_rewriter
7
+ rewrite_path '/1', '/a'
8
+ rewrite_path '/a', '/b'
9
+ rewrite_path '/c', '/d', :path_info=>true
10
+ rewrite_path '/2', '/1', :path_info=>true
11
+ rewrite_path '/3', '/h'
12
+ rewrite_path '/3', '/g', :path_info=>true
13
+ rewrite_path(/\A\/e\z/, '/f')
14
+ route do |r|
15
+ "#{r.path_info}:#{r.remaining_path}"
16
+ end
17
+ end
18
+
19
+ body('/a').must_equal '/a:/b'
20
+ body('/a/f').must_equal '/a/f:/b/f'
21
+ body('/b').must_equal '/b:/b'
22
+ body('/c').must_equal '/d:/d'
23
+ body('/c/f').must_equal '/d/f:/d/f'
24
+ body('/d').must_equal '/d:/d'
25
+ body('/e').must_equal '/e:/f'
26
+ body('/e/g').must_equal '/e/g:/e/g'
27
+ body('/1').must_equal '/1:/b'
28
+ body('/1/f').must_equal '/1/f:/b/f'
29
+ body('/2').must_equal '/1:/b'
30
+ body('/2/f').must_equal '/1/f:/b/f'
31
+ body('/3').must_equal '/g:/g'
32
+
33
+ app.freeze
34
+ body('/a').must_equal '/a:/b'
35
+ proc{app.rewrite_path '/a', '/b'}.must_raise FrozenError
36
+ end
37
+ end
@@ -4,7 +4,7 @@ describe "path plugin" do
4
4
  def path_app(*args, &block)
5
5
  app(:bare) do
6
6
  plugin :path
7
- path *args, &block
7
+ path(*args, &block)
8
8
  route{|r| send(r.path_info)}
9
9
  end
10
10
  end
@@ -13,7 +13,7 @@ describe "path plugin" do
13
13
  app(:bare) do
14
14
  opts[:add_script_name] = true
15
15
  plugin :path
16
- path *args, &block
16
+ path(*args, &block)
17
17
  route{|r| send(r.path_info)}
18
18
  end
19
19
  end
@@ -39,75 +39,75 @@ describe "path plugin" do
39
39
  end
40
40
  end
41
41
 
42
- body.should == '/foo/bar/a/baz/b'
42
+ body.must_equal '/foo/bar/a/baz/b'
43
43
  end
44
44
 
45
45
  it "raises if both path and block are given" do
46
46
  app.plugin :path
47
- proc{app.path(:foo, '/foo'){}}.should raise_error(Roda::RodaError)
47
+ proc{app.path(:foo, '/foo'){}}.must_raise(Roda::RodaError)
48
48
  end
49
49
 
50
50
  it "raises if neither path nor block are given" do
51
51
  app.plugin :path
52
- proc{app.path(:foo)}.should raise_error(Roda::RodaError)
52
+ proc{app.path(:foo)}.must_raise(Roda::RodaError)
53
53
  end
54
54
 
55
55
  it "raises if two options hashes are given" do
56
56
  app.plugin :path
57
- proc{app.path(:foo, {:name=>'a'}, :add_script_name=>true)}.should raise_error(Roda::RodaError)
57
+ proc{app.path(:foo, {:name=>'a'}, :add_script_name=>true)}.must_raise(Roda::RodaError)
58
58
  end
59
59
 
60
60
  it "supports :name option for naming the method" do
61
61
  path_app(:foo, :name=>'foobar_route'){"/bar/foo"}
62
- body("foobar_route").should == "/bar/foo"
62
+ body("foobar_route").must_equal "/bar/foo"
63
63
  end
64
64
 
65
65
  it "supports :add_script_name option for automatically adding the script name" do
66
66
  path_app(:foo, :add_script_name=>true){"/bar/foo"}
67
- body("foo_path", 'SCRIPT_NAME'=>'/baz').should == "/baz/bar/foo"
67
+ body("foo_path", 'SCRIPT_NAME'=>'/baz').must_equal "/baz/bar/foo"
68
68
  end
69
69
 
70
70
  it "respects :add_script_name app option for automatically adding the script name" do
71
71
  path_script_name_app(:foo){"/bar/foo"}
72
- body("foo_path", 'SCRIPT_NAME'=>'/baz').should == "/baz/bar/foo"
72
+ body("foo_path", 'SCRIPT_NAME'=>'/baz').must_equal "/baz/bar/foo"
73
73
  end
74
74
 
75
75
  it "supports :add_script_name=>false option for not automatically adding the script name" do
76
76
  path_script_name_app(:foo, :add_script_name=>false){"/bar/foo"}
77
- body("foo_path", 'SCRIPT_NAME'=>'/baz').should == "/bar/foo"
77
+ body("foo_path", 'SCRIPT_NAME'=>'/baz').must_equal "/bar/foo"
78
78
  end
79
79
 
80
80
  it "supports path method accepting a block when using :add_script_name" do
81
81
  path_block_app(lambda{"c"}, :foo, :add_script_name=>true){|&block| "/bar/foo/#{block.call}"}
82
- body("foo_path", 'SCRIPT_NAME'=>'/baz').should == "/baz/bar/foo/c"
82
+ body("foo_path", 'SCRIPT_NAME'=>'/baz').must_equal "/baz/bar/foo/c"
83
83
  end
84
84
 
85
85
  it "supports :url option for also creating a *_url method" do
86
86
  path_app(:foo, :url=>true){"/bar/foo"}
87
- body("foo_path", 'HTTP_HOST'=>'example.org', "rack.url_scheme"=>'http', 'SERVER_PORT'=>80).should == "/bar/foo"
88
- body("foo_url", 'HTTP_HOST'=>'example.org', "rack.url_scheme"=>'http', 'SERVER_PORT'=>80).should == "http://example.org/bar/foo"
87
+ body("foo_path", 'HTTP_HOST'=>'example.org', "rack.url_scheme"=>'http', 'SERVER_PORT'=>80).must_equal "/bar/foo"
88
+ body("foo_url", 'HTTP_HOST'=>'example.org', "rack.url_scheme"=>'http', 'SERVER_PORT'=>80).must_equal "http://example.org/bar/foo"
89
89
  end
90
90
 
91
91
  it "supports url method accepting a block when using :url" do
92
92
  path_block_app(lambda{"c"}, :foo, :url=>true){|&block| "/bar/foo/#{block.call}"}
93
- body("foo_url", 'HTTP_HOST'=>'example.org', "rack.url_scheme"=>'http', 'SERVER_PORT'=>80).should == "http://example.org/bar/foo/c"
93
+ body("foo_url", 'HTTP_HOST'=>'example.org', "rack.url_scheme"=>'http', 'SERVER_PORT'=>80).must_equal "http://example.org/bar/foo/c"
94
94
  end
95
95
 
96
96
  it "supports url method name specified in :url option" do
97
97
  path_app(:foo, :url=>:foobar_uri){"/bar/foo"}
98
- body("foo_path", 'HTTP_HOST'=>'example.org', "rack.url_scheme"=>'http', 'SERVER_PORT'=>80).should == "/bar/foo"
99
- body("foobar_uri", 'HTTP_HOST'=>'example.org', "rack.url_scheme"=>'http', 'SERVER_PORT'=>80).should == "http://example.org/bar/foo"
98
+ body("foo_path", 'HTTP_HOST'=>'example.org', "rack.url_scheme"=>'http', 'SERVER_PORT'=>80).must_equal "/bar/foo"
99
+ body("foobar_uri", 'HTTP_HOST'=>'example.org', "rack.url_scheme"=>'http', 'SERVER_PORT'=>80).must_equal "http://example.org/bar/foo"
100
100
  end
101
101
 
102
102
  it "supports :url_only option for not creating a path method" do
103
103
  path_app(:foo, :url_only=>true){"/bar/foo"}
104
- proc{body("foo_path")}.should raise_error(NoMethodError)
105
- body("foo_url", 'HTTP_HOST'=>'example.org', "rack.url_scheme"=>'http', 'SERVER_PORT'=>80).should == "http://example.org/bar/foo"
104
+ proc{body("foo_path")}.must_raise(NoMethodError)
105
+ body("foo_url", 'HTTP_HOST'=>'example.org', "rack.url_scheme"=>'http', 'SERVER_PORT'=>80).must_equal "http://example.org/bar/foo"
106
106
  end
107
107
 
108
108
  it "handles non-default ports in url methods" do
109
109
  path_app(:foo, :url=>true){"/bar/foo"}
110
- body("foo_url", 'HTTP_HOST'=>'example.org', "rack.url_scheme"=>'http', 'SERVER_PORT'=>81).should == "http://example.org:81/bar/foo"
110
+ body("foo_url", 'HTTP_HOST'=>'example.org', "rack.url_scheme"=>'http', 'SERVER_PORT'=>81).must_equal "http://example.org:81/bar/foo"
111
111
  end
112
112
  end
113
113
 
@@ -127,42 +127,42 @@ describe "path plugin" do
127
127
 
128
128
  it "Roda#path respects classes and symbols registered via Roda.path" do
129
129
  # Strings
130
- body('path'=>'/foo/bar').should == '/foo/bar'
130
+ body('path'=>'/foo/bar').must_equal '/foo/bar'
131
131
 
132
132
  # Classes
133
- body('path'=>@obj).should == '/d/1/'
134
- body('path'=>[@obj, 'foo']).should == '/d/1/foo'
135
- body('path'=>[@obj, 'foo', 'bar']).should == '/d/1/foo/bar'
133
+ body('path'=>@obj).must_equal '/d/1/'
134
+ body('path'=>[@obj, 'foo']).must_equal '/d/1/foo'
135
+ body('path'=>[@obj, 'foo', 'bar']).must_equal '/d/1/foo/bar'
136
136
  end
137
137
 
138
138
  it "Roda#path raises an error for an unrecognized class" do
139
139
  # Strings
140
- proc{body('path'=>:foo)}.should raise_error(Roda::RodaError)
140
+ proc{body('path'=>:foo)}.must_raise(Roda::RodaError)
141
141
  end
142
142
 
143
143
  it "Roda#path respects :add_script_name app option" do
144
144
  app.opts[:add_script_name] = true
145
145
 
146
146
  # Strings
147
- body('path'=>'/foo/bar', 'SCRIPT_NAME'=>'/baz').should == '/baz/foo/bar'
147
+ body('path'=>'/foo/bar', 'SCRIPT_NAME'=>'/baz').must_equal '/baz/foo/bar'
148
148
 
149
149
  # Classes
150
- body('path'=>@obj, 'SCRIPT_NAME'=>'/baz').should == '/baz/d/1/'
151
- body('path'=>[@obj, 'foo'], 'SCRIPT_NAME'=>'/baz').should == '/baz/d/1/foo'
152
- body('path'=>[@obj, 'foo', 'bar'], 'SCRIPT_NAME'=>'/baz').should == '/baz/d/1/foo/bar'
150
+ body('path'=>@obj, 'SCRIPT_NAME'=>'/baz').must_equal '/baz/d/1/'
151
+ body('path'=>[@obj, 'foo'], 'SCRIPT_NAME'=>'/baz').must_equal '/baz/d/1/foo'
152
+ body('path'=>[@obj, 'foo', 'bar'], 'SCRIPT_NAME'=>'/baz').must_equal '/baz/d/1/foo/bar'
153
153
  end
154
154
 
155
155
  it "Roda#path works in subclasses" do
156
156
  old_app = @app
157
157
  @app = Class.new(@app)
158
158
  @app.route{|r| path('/a')}
159
- body.should == '/a'
159
+ body.must_equal '/a'
160
160
 
161
161
  @app.path(String){|b| "/foo#{b}"}
162
- body.should == '/foo/a'
162
+ body.must_equal '/foo/a'
163
163
 
164
164
  @app = old_app
165
- body('path'=>'/a').should == '/a'
165
+ body('path'=>'/a').must_equal '/a'
166
166
  end
167
167
 
168
168
  it "registers classes by reference by default" do
@@ -172,8 +172,8 @@ describe "path plugin" do
172
172
  def c2.name; 'C'; end
173
173
  @app.path(c1){'/c'}
174
174
  @app.route{|r| path(r.env['c'])}
175
- body('c'=>c1.new).should == '/c'
176
- proc{body('c'=>c2.new)}.should raise_error(Roda::RodaError)
175
+ body('c'=>c1.new).must_equal '/c'
176
+ proc{body('c'=>c2.new)}.must_raise(Roda::RodaError)
177
177
  end
178
178
 
179
179
  it ":by_name => option registers classes by name" do
@@ -184,29 +184,30 @@ describe "path plugin" do
184
184
  @app.plugin :path, :by_name=>true
185
185
  @app.path(c1){'/c'}
186
186
  @app.route{|r| path(r.env['c'])}
187
- body('c'=>c1.new).should == '/c'
188
- body('c'=>c2.new).should == '/c'
187
+ body('c'=>c1.new).must_equal '/c'
188
+ body('c'=>c2.new).must_equal '/c'
189
189
  end
190
190
 
191
191
  it "Roda.path_block returns the block used" do
192
192
  c = Class.new
193
193
  b = proc{|x| x.to_s}
194
194
  @app.path(c, &b)
195
- @app.path_block(c).should == b
195
+ # Work around minitest bug
196
+ assert_equal @app.path_block(c), b
196
197
  end
197
198
 
198
199
  it "Roda.path doesn't work with classes without blocks" do
199
- proc{app.path(Class.new)}.should raise_error(Roda::RodaError)
200
+ proc{app.path(Class.new)}.must_raise(Roda::RodaError)
200
201
  end
201
202
 
202
203
  it "Roda.path doesn't work with classes with paths or options" do
203
- proc{app.path(Class.new, '/a'){}}.should raise_error(Roda::RodaError)
204
- proc{app.path(Class.new, nil, :a=>1){}}.should raise_error(Roda::RodaError)
204
+ proc{app.path(Class.new, '/a'){}}.must_raise(Roda::RodaError)
205
+ proc{app.path(Class.new, nil, :a=>1){}}.must_raise(Roda::RodaError)
205
206
  end
206
207
 
207
208
  it "Roda.path doesn't work after freezing the app" do
208
209
  app.freeze
209
- proc{app.path(Class.new){|obj| ''}}.should raise_error
210
+ proc{app.path(Class.new){|obj| ''}}.must_raise FrozenError
210
211
  end
211
212
  end
212
213
 
@@ -16,12 +16,12 @@ describe "per_thread_caching plugin" do
16
16
  (0..10).map do |n|
17
17
  Thread.new do
18
18
  Thread.current[:n] = n
19
- body('/a').should == '2'
20
- body('/a').should == '22'
21
- body('/a').should == '222'
22
- body('/b').should == '2'
23
- body('/b').should == '22'
24
- body('/b').should == '222'
19
+ _(body('/a')).must_equal '2'
20
+ _(body('/a')).must_equal '22'
21
+ _(body('/a')).must_equal '222'
22
+ _(body('/b')).must_equal '2'
23
+ _(body('/b')).must_equal '22'
24
+ _(body('/b')).must_equal '222'
25
25
  end
26
26
  end.map{|t| t.join}
27
27
  end
@@ -0,0 +1,74 @@
1
+ require File.expand_path("spec_helper", File.dirname(File.dirname(__FILE__)))
2
+
3
+ begin
4
+ require 'tilt/erb'
5
+ rescue LoadError
6
+ warn "tilt not installed, skipping precompiled_templates plugin test"
7
+ else
8
+ describe "precompile_templates plugin" do
9
+ it "adds support for template precompilation" do
10
+ app(:bare) do
11
+ plugin :render, :views=>'spec/views'
12
+ plugin :precompile_templates
13
+ route do |r|
14
+ @a = 1
15
+ render('iv')
16
+ end
17
+ end
18
+
19
+ app.render_opts[:cache][File.expand_path('spec/views/iv.erb')].must_equal nil
20
+ app.precompile_templates 'spec/views/iv.erb'
21
+ app.render_opts[:cache][File.expand_path('spec/views/iv.erb')].wont_equal nil
22
+ app.render_opts[:cache][File.expand_path('spec/views/iv.erb')].instance_variable_get(:@compiled_method)[[]].wont_equal nil
23
+ body.strip.must_equal '1'
24
+ end
25
+
26
+ it "adds support for template precompilation with :locals" do
27
+ app(:bare) do
28
+ plugin :render, :views=>'spec/views'
29
+ plugin :precompile_templates
30
+ route do |r|
31
+ render('about', :locals=>{:title=>'1'})
32
+ end
33
+ end
34
+
35
+ app.render_opts[:cache][File.expand_path('spec/views/about.erb')].must_equal nil
36
+ app.precompile_templates 'spec/views/about.erb', :locals=>[:title]
37
+ app.render_opts[:cache][File.expand_path('spec/views/about.erb')].wont_equal nil
38
+ app.render_opts[:cache][File.expand_path('spec/views/about.erb')].instance_variable_get(:@compiled_method)[[:title]].wont_equal nil
39
+ body.strip.must_equal '<h1>1</h1>'
40
+ end
41
+
42
+ it "adds support for template precompilation with sorting :locals" do
43
+ app(:bare) do
44
+ plugin :render, :views=>'spec/views'
45
+ plugin :precompile_templates, :sort_locals=>true
46
+ route do |r|
47
+ render('home', :locals=>{:name => "Agent Smith", :title => "Home"})
48
+ end
49
+ end
50
+
51
+ app.render_opts[:cache][File.expand_path('spec/views/home.erb')].must_equal nil
52
+ app.precompile_templates 'spec/views/h*.erb', :locals=>[:title, :name]
53
+ app.render_opts[:cache][File.expand_path('spec/views/home.erb')].wont_equal nil
54
+ app.render_opts[:cache][File.expand_path('spec/views/home.erb')].instance_variable_get(:@compiled_method)[[:name, :title]].wont_equal nil
55
+ body.strip.must_equal "<h1>Home</h1>\n<p>Hello Agent Smith</p>"
56
+ end
57
+
58
+ it "adds support for template precompilation with :inline" do
59
+ app(:bare) do
60
+ plugin :render, :views=>'spec/views'
61
+ plugin :precompile_templates
62
+ route do |r|
63
+ render(:inline=>'a', :cache_key=>'a')
64
+ end
65
+ end
66
+
67
+ app.render_opts[:cache]['a'].must_equal nil
68
+ app.precompile_templates :inline=>'a', :cache_key=>'a'
69
+ app.render_opts[:cache]['a'].wont_equal nil
70
+ app.render_opts[:cache]['a'].instance_variable_get(:@compiled_method)[[]].wont_equal nil
71
+ body.strip.must_equal "a"
72
+ end
73
+ end
74
+ end