roda 0.9.0 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG +62 -0
- data/README.rdoc +362 -167
- data/Rakefile +2 -2
- data/doc/release_notes/1.0.0.txt +329 -0
- data/lib/roda.rb +553 -180
- data/lib/roda/plugins/_erubis_escaping.rb +28 -0
- data/lib/roda/plugins/all_verbs.rb +7 -9
- data/lib/roda/plugins/backtracking_array.rb +92 -0
- data/lib/roda/plugins/content_for.rb +46 -0
- data/lib/roda/plugins/csrf.rb +60 -0
- data/lib/roda/plugins/flash.rb +53 -7
- data/lib/roda/plugins/halt.rb +8 -14
- data/lib/roda/plugins/head.rb +56 -0
- data/lib/roda/plugins/header_matchers.rb +2 -2
- data/lib/roda/plugins/json.rb +84 -0
- data/lib/roda/plugins/multi_route.rb +50 -10
- data/lib/roda/plugins/not_allowed.rb +140 -0
- data/lib/roda/plugins/pass.rb +13 -6
- data/lib/roda/plugins/per_thread_caching.rb +70 -0
- data/lib/roda/plugins/render.rb +20 -33
- data/lib/roda/plugins/render_each.rb +61 -0
- data/lib/roda/plugins/symbol_matchers.rb +79 -0
- data/lib/roda/plugins/symbol_views.rb +40 -0
- data/lib/roda/plugins/view_subdirs.rb +53 -0
- data/lib/roda/version.rb +3 -0
- data/spec/matchers_spec.rb +61 -5
- data/spec/plugin/_erubis_escaping_spec.rb +29 -0
- data/spec/plugin/backtracking_array_spec.rb +38 -0
- data/spec/plugin/content_for_spec.rb +34 -0
- data/spec/plugin/csrf_spec.rb +49 -0
- data/spec/plugin/flash_spec.rb +69 -5
- data/spec/plugin/head_spec.rb +35 -0
- data/spec/plugin/json_spec.rb +50 -0
- data/spec/plugin/multi_route_spec.rb +22 -6
- data/spec/plugin/not_allowed_spec.rb +55 -0
- data/spec/plugin/pass_spec.rb +8 -2
- data/spec/plugin/per_thread_caching_spec.rb +28 -0
- data/spec/plugin/render_each_spec.rb +30 -0
- data/spec/plugin/render_spec.rb +7 -1
- data/spec/plugin/symbol_matchers_spec.rb +68 -0
- data/spec/plugin/symbol_views_spec.rb +32 -0
- data/spec/plugin/view_subdirs_spec.rb +45 -0
- data/spec/plugin_spec.rb +11 -1
- data/spec/redirect_spec.rb +21 -4
- data/spec/request_spec.rb +9 -0
- metadata +49 -5
@@ -0,0 +1,28 @@
|
|
1
|
+
require File.expand_path("spec_helper", File.dirname(File.dirname(__FILE__)))
|
2
|
+
|
3
|
+
describe "per_thread_caching plugin" do
|
4
|
+
it "should use a per thread cache instead of a shared cache" do
|
5
|
+
app(:bare) do
|
6
|
+
plugin :per_thread_caching
|
7
|
+
@c = thread_safe_cache
|
8
|
+
def self.c; @c end
|
9
|
+
route do |r|
|
10
|
+
r.on :id do |i|
|
11
|
+
((self.class.c[i] ||= []) << 2).join
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
(0..10).map do |n|
|
17
|
+
Thread.new do
|
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'
|
25
|
+
end
|
26
|
+
end.map{|t| t.join}
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require File.expand_path("spec_helper", File.dirname(File.dirname(__FILE__)))
|
2
|
+
|
3
|
+
describe "render_each plugin" do
|
4
|
+
it "calls render with each argument, returning joined string with all results" do
|
5
|
+
app(:bare) do
|
6
|
+
plugin :render_each
|
7
|
+
def render(t, opts)
|
8
|
+
"r#{t}#{opts[:locals][:foo] if opts[:locals]}#{opts[:bar]} "
|
9
|
+
end
|
10
|
+
|
11
|
+
route do |r|
|
12
|
+
r.root do
|
13
|
+
render_each([1,2,3], :foo)
|
14
|
+
end
|
15
|
+
|
16
|
+
r.is 'a' do
|
17
|
+
render_each([1,2,3], :bar, :local=>:foo, :bar=>4)
|
18
|
+
end
|
19
|
+
|
20
|
+
r.is 'b' do
|
21
|
+
render_each([1,2,3], :bar, :local=>nil)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
body.should == 'rfoo1 rfoo2 rfoo3 '
|
27
|
+
body("/a").should == 'rbar14 rbar24 rbar34 '
|
28
|
+
body("/b").should == 'rbar rbar rbar '
|
29
|
+
end
|
30
|
+
end
|
data/spec/plugin/render_spec.rb
CHANGED
@@ -1,7 +1,8 @@
|
|
1
1
|
require File.expand_path("spec_helper", File.dirname(File.dirname(__FILE__)))
|
2
2
|
|
3
3
|
begin
|
4
|
-
require 'tilt'
|
4
|
+
require 'tilt/erb'
|
5
|
+
require 'tilt/string'
|
5
6
|
rescue LoadError
|
6
7
|
warn "tilt not installed, skipping render plugin test"
|
7
8
|
else
|
@@ -27,6 +28,10 @@ describe "render plugin" do
|
|
27
28
|
r.on "path" do
|
28
29
|
render(:path=>"./spec/views/about.erb", :locals=>{:title => "Path"}, :layout_opts=>{:locals=>{:title=>"Home"}})
|
29
30
|
end
|
31
|
+
|
32
|
+
r.on "content" do
|
33
|
+
view(:content=>'bar', :layout_opts=>{:locals=>{:title=>"Home"}})
|
34
|
+
end
|
30
35
|
end
|
31
36
|
end
|
32
37
|
end
|
@@ -36,6 +41,7 @@ describe "render plugin" do
|
|
36
41
|
body("/home").strip.should == "<title>Roda: Home</title>\n<h1>Home</h1>\n<p>Hello Agent Smith</p>"
|
37
42
|
body("/inline").strip.should == "Hello Agent Smith"
|
38
43
|
body("/path").strip.should == "<h1>Path</h1>"
|
44
|
+
body("/content").strip.should == "<title>Roda: Home</title>\nbar"
|
39
45
|
end
|
40
46
|
|
41
47
|
it "with str as engine" do
|
@@ -0,0 +1,68 @@
|
|
1
|
+
require File.expand_path("spec_helper", File.dirname(File.dirname(__FILE__)))
|
2
|
+
|
3
|
+
describe "symbol_matchers plugin" do
|
4
|
+
it "allows symbol specific regexps" do
|
5
|
+
app(:bare) do
|
6
|
+
plugin :symbol_matchers
|
7
|
+
symbol_matcher(:f, /(f+)/)
|
8
|
+
|
9
|
+
route do |r|
|
10
|
+
r.is :d do |d|
|
11
|
+
"d#{d}"
|
12
|
+
end
|
13
|
+
|
14
|
+
r.is "foo:optd" do |o|
|
15
|
+
"foo#{o.inspect}"
|
16
|
+
end
|
17
|
+
|
18
|
+
r.is "bar:opt" do |o|
|
19
|
+
"bar#{o.inspect}"
|
20
|
+
end
|
21
|
+
|
22
|
+
r.is "format:format" do |f|
|
23
|
+
"format#{f.inspect}"
|
24
|
+
end
|
25
|
+
|
26
|
+
r.is :f do |f|
|
27
|
+
"f#{f}"
|
28
|
+
end
|
29
|
+
|
30
|
+
r.is 'q:rest' do |r|
|
31
|
+
"rest#{r}"
|
32
|
+
end
|
33
|
+
|
34
|
+
r.is :w do |w|
|
35
|
+
"w#{w}"
|
36
|
+
end
|
37
|
+
|
38
|
+
r.is ':d/:w/:f' do |d, w, f|
|
39
|
+
"dwf#{d}#{w}#{f}"
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
status.should == 404
|
45
|
+
body("/1").should == 'd1'
|
46
|
+
body("/11232135").should == 'd11232135'
|
47
|
+
body("/a").should == 'wa'
|
48
|
+
body("/1az0").should == 'w1az0'
|
49
|
+
body("/f").should == 'ff'
|
50
|
+
body("/foo").should == 'foonil'
|
51
|
+
body("/foo/123").should == 'foo"123"'
|
52
|
+
status("/foo/bar").should == 404
|
53
|
+
status("/foo/123/a").should == 404
|
54
|
+
body("/bar").should == 'barnil'
|
55
|
+
body("/bar/foo").should == 'bar"foo"'
|
56
|
+
status("/bar/foo/baz").should == 404
|
57
|
+
body("/format").should == 'formatnil'
|
58
|
+
body("/format.json").should == 'format"json"'
|
59
|
+
status("/format.").should == 404
|
60
|
+
body("/ffffffffffffffff").should == 'fffffffffffffffff'
|
61
|
+
status("/-").should == 404
|
62
|
+
body("/1/1a/f").should == 'dwf11af'
|
63
|
+
body("/12/1azy/fffff").should == 'dwf121azyfffff'
|
64
|
+
status("/1/f/a").should == 404
|
65
|
+
body("/qa/b/c/d//f/g").should == 'resta/b/c/d//f/g'
|
66
|
+
body('/q').should == 'rest'
|
67
|
+
end
|
68
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require File.expand_path("spec_helper", File.dirname(File.dirname(__FILE__)))
|
2
|
+
|
3
|
+
describe "symbol_views plugin" do
|
4
|
+
before do
|
5
|
+
app(:bare) do
|
6
|
+
plugin :symbol_views
|
7
|
+
|
8
|
+
def view(s)
|
9
|
+
"v#{s}"
|
10
|
+
end
|
11
|
+
|
12
|
+
route do |r|
|
13
|
+
r.root do
|
14
|
+
:sym
|
15
|
+
end
|
16
|
+
|
17
|
+
r.is "string" do
|
18
|
+
'string'
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
it "should call view with the symbol" do
|
25
|
+
body.should == "vsym"
|
26
|
+
end
|
27
|
+
|
28
|
+
it "should not affect other return types" do
|
29
|
+
body("/string").should == 'string'
|
30
|
+
body("/foo").should == ''
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,45 @@
|
|
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 view_subdirs plugin test"
|
7
|
+
else
|
8
|
+
describe "view_subdirs plugin" do
|
9
|
+
before do
|
10
|
+
app(:bare) do
|
11
|
+
plugin :render
|
12
|
+
render_opts[:views] = "./spec"
|
13
|
+
plugin :view_subdirs
|
14
|
+
|
15
|
+
route do |r|
|
16
|
+
r.on "home" do
|
17
|
+
set_view_subdir 'views'
|
18
|
+
view("home", :locals=>{:name => "Agent Smith", :title => "Home"}, :layout_opts=>{:locals=>{:title=>"Home"}})
|
19
|
+
end
|
20
|
+
|
21
|
+
r.on "about" do
|
22
|
+
set_view_subdir 'views'
|
23
|
+
render("views/about", :locals=>{:title => "About Roda"})
|
24
|
+
end
|
25
|
+
|
26
|
+
r.on "path" do
|
27
|
+
render('views/about', :locals=>{:title => "Path"}, :layout_opts=>{:locals=>{:title=>"Home"}})
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
it "should use set subdir if template name does not contain a slash" do
|
34
|
+
body("/home").strip.should == "<title>Roda: Home</title>\n<h1>Home</h1>\n<p>Hello Agent Smith</p>"
|
35
|
+
end
|
36
|
+
|
37
|
+
it "should not use set subdir if template name contains a slash" do
|
38
|
+
body("/about").strip.should == "<h1>About Roda</h1>"
|
39
|
+
end
|
40
|
+
|
41
|
+
it "should not change behavior when subdir is not set" do
|
42
|
+
body("/path").strip.should == "<h1>Path</h1>"
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
data/spec/plugin_spec.rb
CHANGED
@@ -15,10 +15,20 @@ describe "plugins" do
|
|
15
15
|
end
|
16
16
|
self::RequestMethods = Module.new do
|
17
17
|
def hello(&block)
|
18
|
-
on
|
18
|
+
on self.class.hello, &block
|
19
|
+
end
|
20
|
+
end
|
21
|
+
self::RequestClassMethods = Module.new do
|
22
|
+
def hello(&block)
|
23
|
+
'hello'
|
19
24
|
end
|
20
25
|
end
|
21
26
|
self::ResponseMethods = Module.new do
|
27
|
+
def foobar
|
28
|
+
self.class.foobar
|
29
|
+
end
|
30
|
+
end
|
31
|
+
self::ResponseClassMethods = Module.new do
|
22
32
|
def foobar
|
23
33
|
"Default "
|
24
34
|
end
|
data/spec/redirect_spec.rb
CHANGED
@@ -3,14 +3,25 @@ require File.expand_path("spec_helper", File.dirname(__FILE__))
|
|
3
3
|
describe "redirects" do
|
4
4
|
it "should be immediately processed" do
|
5
5
|
app do |r|
|
6
|
-
r.
|
7
|
-
r.redirect "/hello"
|
6
|
+
r.root do
|
7
|
+
r.redirect "/hello"
|
8
8
|
"Foo"
|
9
9
|
end
|
10
|
-
|
11
|
-
|
10
|
+
|
11
|
+
r.is "about" do
|
12
|
+
r.redirect "/hello", 301
|
12
13
|
"Foo"
|
13
14
|
end
|
15
|
+
|
16
|
+
r.is 'foo' do
|
17
|
+
r.get do
|
18
|
+
r.redirect
|
19
|
+
end
|
20
|
+
|
21
|
+
r.post do
|
22
|
+
r.redirect
|
23
|
+
end
|
24
|
+
end
|
14
25
|
end
|
15
26
|
|
16
27
|
status.should == 302
|
@@ -20,5 +31,11 @@ describe "redirects" do
|
|
20
31
|
status("/about").should == 301
|
21
32
|
header('Location', "/about").should == '/hello'
|
22
33
|
body("/about").should == ''
|
34
|
+
|
35
|
+
status("/foo", 'REQUEST_METHOD'=>'POST').should == 302
|
36
|
+
header('Location', "/foo", 'REQUEST_METHOD'=>'POST').should == '/foo'
|
37
|
+
body("/foo", 'REQUEST_METHOD'=>'POST').should == ''
|
38
|
+
|
39
|
+
proc{req('/foo')}.should raise_error(Roda::RodaError)
|
23
40
|
end
|
24
41
|
end
|
data/spec/request_spec.rb
CHANGED
@@ -20,6 +20,15 @@ describe "request.halt" do
|
|
20
20
|
|
21
21
|
body.should == "foo"
|
22
22
|
end
|
23
|
+
|
24
|
+
it "should use current response if no argument is given" do
|
25
|
+
app do |r|
|
26
|
+
response.write('foo')
|
27
|
+
r.halt
|
28
|
+
end
|
29
|
+
|
30
|
+
body.should == "foo"
|
31
|
+
end
|
23
32
|
end
|
24
33
|
|
25
34
|
describe "request.scope" do
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: roda
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jeremy Evans
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-08-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rack
|
@@ -39,7 +39,7 @@ dependencies:
|
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
|
-
name:
|
42
|
+
name: tilt
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
45
|
- - ">="
|
@@ -53,7 +53,21 @@ dependencies:
|
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '0'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
|
-
name:
|
56
|
+
name: erubis
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: rack_csrf
|
57
71
|
requirement: !ruby/object:Gem::Requirement
|
58
72
|
requirements:
|
59
73
|
- - ">="
|
@@ -71,49 +85,79 @@ email:
|
|
71
85
|
- code@jeremyevans.net
|
72
86
|
executables: []
|
73
87
|
extensions: []
|
74
|
-
extra_rdoc_files:
|
88
|
+
extra_rdoc_files:
|
89
|
+
- README.rdoc
|
90
|
+
- MIT-LICENSE
|
91
|
+
- CHANGELOG
|
92
|
+
- doc/release_notes/1.0.0.txt
|
75
93
|
files:
|
76
94
|
- CHANGELOG
|
77
95
|
- MIT-LICENSE
|
78
96
|
- README.rdoc
|
79
97
|
- Rakefile
|
98
|
+
- doc/release_notes/1.0.0.txt
|
80
99
|
- lib/roda.rb
|
100
|
+
- lib/roda/plugins/_erubis_escaping.rb
|
81
101
|
- lib/roda/plugins/all_verbs.rb
|
102
|
+
- lib/roda/plugins/backtracking_array.rb
|
103
|
+
- lib/roda/plugins/content_for.rb
|
104
|
+
- lib/roda/plugins/csrf.rb
|
82
105
|
- lib/roda/plugins/default_headers.rb
|
83
106
|
- lib/roda/plugins/error_handler.rb
|
84
107
|
- lib/roda/plugins/flash.rb
|
85
108
|
- lib/roda/plugins/h.rb
|
86
109
|
- lib/roda/plugins/halt.rb
|
110
|
+
- lib/roda/plugins/head.rb
|
87
111
|
- lib/roda/plugins/header_matchers.rb
|
88
112
|
- lib/roda/plugins/hooks.rb
|
89
113
|
- lib/roda/plugins/indifferent_params.rb
|
114
|
+
- lib/roda/plugins/json.rb
|
90
115
|
- lib/roda/plugins/middleware.rb
|
91
116
|
- lib/roda/plugins/multi_route.rb
|
117
|
+
- lib/roda/plugins/not_allowed.rb
|
92
118
|
- lib/roda/plugins/not_found.rb
|
93
119
|
- lib/roda/plugins/pass.rb
|
120
|
+
- lib/roda/plugins/per_thread_caching.rb
|
94
121
|
- lib/roda/plugins/render.rb
|
122
|
+
- lib/roda/plugins/render_each.rb
|
95
123
|
- lib/roda/plugins/streaming.rb
|
124
|
+
- lib/roda/plugins/symbol_matchers.rb
|
125
|
+
- lib/roda/plugins/symbol_views.rb
|
126
|
+
- lib/roda/plugins/view_subdirs.rb
|
127
|
+
- lib/roda/version.rb
|
96
128
|
- spec/composition_spec.rb
|
97
129
|
- spec/env_spec.rb
|
98
130
|
- spec/integration_spec.rb
|
99
131
|
- spec/matchers_spec.rb
|
100
132
|
- spec/module_spec.rb
|
101
133
|
- spec/opts_spec.rb
|
134
|
+
- spec/plugin/_erubis_escaping_spec.rb
|
102
135
|
- spec/plugin/all_verbs_spec.rb
|
136
|
+
- spec/plugin/backtracking_array_spec.rb
|
137
|
+
- spec/plugin/content_for_spec.rb
|
138
|
+
- spec/plugin/csrf_spec.rb
|
103
139
|
- spec/plugin/default_headers_spec.rb
|
104
140
|
- spec/plugin/error_handler_spec.rb
|
105
141
|
- spec/plugin/flash_spec.rb
|
106
142
|
- spec/plugin/h_spec.rb
|
107
143
|
- spec/plugin/halt_spec.rb
|
144
|
+
- spec/plugin/head_spec.rb
|
108
145
|
- spec/plugin/header_matchers_spec.rb
|
109
146
|
- spec/plugin/hooks_spec.rb
|
110
147
|
- spec/plugin/indifferent_params_spec.rb
|
148
|
+
- spec/plugin/json_spec.rb
|
111
149
|
- spec/plugin/middleware_spec.rb
|
112
150
|
- spec/plugin/multi_route_spec.rb
|
151
|
+
- spec/plugin/not_allowed_spec.rb
|
113
152
|
- spec/plugin/not_found_spec.rb
|
114
153
|
- spec/plugin/pass_spec.rb
|
154
|
+
- spec/plugin/per_thread_caching_spec.rb
|
155
|
+
- spec/plugin/render_each_spec.rb
|
115
156
|
- spec/plugin/render_spec.rb
|
116
157
|
- spec/plugin/streaming_spec.rb
|
158
|
+
- spec/plugin/symbol_matchers_spec.rb
|
159
|
+
- spec/plugin/symbol_views_spec.rb
|
160
|
+
- spec/plugin/view_subdirs_spec.rb
|
117
161
|
- spec/plugin_spec.rb
|
118
162
|
- spec/redirect_spec.rb
|
119
163
|
- spec/request_spec.rb
|