roda 2.2.0 → 2.3.0

Sign up to get free protection for your applications and to get access to all the features.
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