devcenter 0.0.1
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.
- data/.gitignore +18 -0
- data/Gemfile +8 -0
- data/LICENSE.txt +22 -0
- data/README.md +39 -0
- data/Rakefile +2 -0
- data/bin/devcenter +7 -0
- data/devcenter.gemspec +30 -0
- data/lib/devcenter.rb +6 -0
- data/lib/devcenter/cli.rb +45 -0
- data/lib/devcenter/coderay_extensions.rb +70 -0
- data/lib/devcenter/commands.rb +4 -0
- data/lib/devcenter/commands/base.rb +47 -0
- data/lib/devcenter/commands/open.rb +34 -0
- data/lib/devcenter/commands/preview.rb +28 -0
- data/lib/devcenter/commands/pull.rb +37 -0
- data/lib/devcenter/helpers.rb +41 -0
- data/lib/devcenter/layout.html +299 -0
- data/lib/devcenter/md_parser.rb +87 -0
- data/lib/devcenter/previewer.rb +36 -0
- data/lib/devcenter/previewer/assets/images/public/article-icon-large.png +0 -0
- data/lib/devcenter/previewer/assets/images/public/article-icon.png +0 -0
- data/lib/devcenter/previewer/assets/images/public/aside_accordion_indicator_default.png +0 -0
- data/lib/devcenter/previewer/assets/images/public/aside_accordion_indicator_open.png +0 -0
- data/lib/devcenter/previewer/assets/images/public/body_bg.png +0 -0
- data/lib/devcenter/previewer/assets/images/public/callout_bg.png +0 -0
- data/lib/devcenter/previewer/assets/images/public/feed-icon-sprite.png +0 -0
- data/lib/devcenter/previewer/assets/images/public/heroku-header-logo-mobile.png +0 -0
- data/lib/devcenter/previewer/assets/images/public/heroku-header-logo.png +0 -0
- data/lib/devcenter/previewer/assets/images/public/heroku-logo.png +0 -0
- data/lib/devcenter/previewer/assets/images/public/icon_sprite_16.png +0 -0
- data/lib/devcenter/previewer/assets/images/public/index_li_bullet.png +0 -0
- data/lib/devcenter/previewer/assets/images/public/intro_bg.png +0 -0
- data/lib/devcenter/previewer/assets/images/public/jive_discussion_arrow.png +0 -0
- data/lib/devcenter/previewer/assets/images/public/jive_discussion_glyph.png +0 -0
- data/lib/devcenter/previewer/assets/images/public/line.png +0 -0
- data/lib/devcenter/previewer/assets/images/public/pre_code_background.png +0 -0
- data/lib/devcenter/previewer/assets/images/public/search-icon.png +0 -0
- data/lib/devcenter/previewer/assets/images/public/search_glyph.png +0 -0
- data/lib/devcenter/previewer/assets/images/public/search_return.png +0 -0
- data/lib/devcenter/previewer/assets/images/public/tag-icon-large.png +0 -0
- data/lib/devcenter/previewer/assets/images/public/toc-icon.png +0 -0
- data/lib/devcenter/previewer/assets/public.css +2125 -0
- data/lib/devcenter/previewer/assets/public/article-icon-large.png +0 -0
- data/lib/devcenter/previewer/assets/public/article-icon.png +0 -0
- data/lib/devcenter/previewer/assets/public/aside_accordion_indicator_default.png +0 -0
- data/lib/devcenter/previewer/assets/public/aside_accordion_indicator_open.png +0 -0
- data/lib/devcenter/previewer/assets/public/body_bg.png +0 -0
- data/lib/devcenter/previewer/assets/public/callout_bg.png +0 -0
- data/lib/devcenter/previewer/assets/public/feed-icon-sprite.png +0 -0
- data/lib/devcenter/previewer/assets/public/heroku-header-logo-mobile.png +0 -0
- data/lib/devcenter/previewer/assets/public/heroku-header-logo.png +0 -0
- data/lib/devcenter/previewer/assets/public/heroku-logo.png +0 -0
- data/lib/devcenter/previewer/assets/public/icon_sprite_16.png +0 -0
- data/lib/devcenter/previewer/assets/public/index_li_bullet.png +0 -0
- data/lib/devcenter/previewer/assets/public/intro_bg.png +0 -0
- data/lib/devcenter/previewer/assets/public/jive_discussion_arrow.png +0 -0
- data/lib/devcenter/previewer/assets/public/jive_discussion_glyph.png +0 -0
- data/lib/devcenter/previewer/assets/public/line.png +0 -0
- data/lib/devcenter/previewer/assets/public/pre_code_background.png +0 -0
- data/lib/devcenter/previewer/assets/public/public.css +2125 -0
- data/lib/devcenter/previewer/assets/public/search-icon.png +0 -0
- data/lib/devcenter/previewer/assets/public/search_glyph.png +0 -0
- data/lib/devcenter/previewer/assets/public/search_return.png +0 -0
- data/lib/devcenter/previewer/assets/public/tag-icon-large.png +0 -0
- data/lib/devcenter/previewer/assets/public/toc-icon.png +0 -0
- data/lib/devcenter/previewer/file_listener.rb +23 -0
- data/lib/devcenter/previewer/views/article.erb +345 -0
- data/lib/devcenter/previewer/web_app.rb +53 -0
- data/lib/devcenter/previewer/web_server.rb +29 -0
- data/lib/devcenter/version.rb +3 -0
- data/vendor/sinatra/.gitignore +6 -0
- data/vendor/sinatra/.travis.yml +16 -0
- data/vendor/sinatra/.yardopts +4 -0
- data/vendor/sinatra/AUTHORS +61 -0
- data/vendor/sinatra/Gemfile +91 -0
- data/vendor/sinatra/LICENSE +22 -0
- data/vendor/sinatra/README.de.rdoc +2116 -0
- data/vendor/sinatra/README.es.rdoc +2106 -0
- data/vendor/sinatra/README.fr.rdoc +2133 -0
- data/vendor/sinatra/README.hu.rdoc +608 -0
- data/vendor/sinatra/README.jp.rdoc +1056 -0
- data/vendor/sinatra/README.ko.rdoc +1932 -0
- data/vendor/sinatra/README.pt-br.rdoc +778 -0
- data/vendor/sinatra/README.pt-pt.rdoc +647 -0
- data/vendor/sinatra/README.rdoc +2049 -0
- data/vendor/sinatra/README.ru.rdoc +2033 -0
- data/vendor/sinatra/README.zh.rdoc +1816 -0
- data/vendor/sinatra/Rakefile +182 -0
- data/vendor/sinatra/examples/chat.rb +61 -0
- data/vendor/sinatra/examples/simple.rb +3 -0
- data/vendor/sinatra/examples/stream.ru +26 -0
- data/vendor/sinatra/lib/sinatra.rb +5 -0
- data/vendor/sinatra/lib/sinatra/base.rb +1820 -0
- data/vendor/sinatra/lib/sinatra/images/404.png +0 -0
- data/vendor/sinatra/lib/sinatra/images/500.png +0 -0
- data/vendor/sinatra/lib/sinatra/main.rb +30 -0
- data/vendor/sinatra/lib/sinatra/showexceptions.rb +345 -0
- data/vendor/sinatra/lib/sinatra/version.rb +3 -0
- data/vendor/sinatra/sinatra.gemspec +18 -0
- data/vendor/sinatra/test/base_test.rb +172 -0
- data/vendor/sinatra/test/builder_test.rb +91 -0
- data/vendor/sinatra/test/coffee_test.rb +90 -0
- data/vendor/sinatra/test/compile_test.rb +139 -0
- data/vendor/sinatra/test/contest.rb +98 -0
- data/vendor/sinatra/test/creole_test.rb +65 -0
- data/vendor/sinatra/test/delegator_test.rb +160 -0
- data/vendor/sinatra/test/encoding_test.rb +20 -0
- data/vendor/sinatra/test/erb_test.rb +98 -0
- data/vendor/sinatra/test/extensions_test.rb +98 -0
- data/vendor/sinatra/test/filter_test.rb +437 -0
- data/vendor/sinatra/test/haml_test.rb +91 -0
- data/vendor/sinatra/test/helper.rb +123 -0
- data/vendor/sinatra/test/helpers_test.rb +1768 -0
- data/vendor/sinatra/test/integration/app.rb +62 -0
- data/vendor/sinatra/test/integration_helper.rb +222 -0
- data/vendor/sinatra/test/integration_test.rb +87 -0
- data/vendor/sinatra/test/less_test.rb +69 -0
- data/vendor/sinatra/test/liquid_test.rb +59 -0
- data/vendor/sinatra/test/mapped_error_test.rb +305 -0
- data/vendor/sinatra/test/markaby_test.rb +80 -0
- data/vendor/sinatra/test/markdown_test.rb +82 -0
- data/vendor/sinatra/test/middleware_test.rb +68 -0
- data/vendor/sinatra/test/nokogiri_test.rb +67 -0
- data/vendor/sinatra/test/public/favicon.ico +0 -0
- data/vendor/sinatra/test/rabl_test.rb +89 -0
- data/vendor/sinatra/test/rack_test.rb +45 -0
- data/vendor/sinatra/test/radius_test.rb +59 -0
- data/vendor/sinatra/test/rdoc_test.rb +66 -0
- data/vendor/sinatra/test/readme_test.rb +120 -0
- data/vendor/sinatra/test/request_test.rb +45 -0
- data/vendor/sinatra/test/response_test.rb +64 -0
- data/vendor/sinatra/test/result_test.rb +76 -0
- data/vendor/sinatra/test/route_added_hook_test.rb +59 -0
- data/vendor/sinatra/test/routing_test.rb +1175 -0
- data/vendor/sinatra/test/sass_test.rb +116 -0
- data/vendor/sinatra/test/scss_test.rb +89 -0
- data/vendor/sinatra/test/server_test.rb +48 -0
- data/vendor/sinatra/test/settings_test.rb +561 -0
- data/vendor/sinatra/test/sinatra_test.rb +12 -0
- data/vendor/sinatra/test/slim_test.rb +84 -0
- data/vendor/sinatra/test/static_test.rb +219 -0
- data/vendor/sinatra/test/streaming_test.rb +149 -0
- data/vendor/sinatra/test/templates_test.rb +333 -0
- data/vendor/sinatra/test/textile_test.rb +65 -0
- data/vendor/sinatra/test/views/a/in_a.str +1 -0
- data/vendor/sinatra/test/views/ascii.erb +2 -0
- data/vendor/sinatra/test/views/b/in_b.str +1 -0
- data/vendor/sinatra/test/views/calc.html.erb +1 -0
- data/vendor/sinatra/test/views/error.builder +3 -0
- data/vendor/sinatra/test/views/error.erb +3 -0
- data/vendor/sinatra/test/views/error.haml +3 -0
- data/vendor/sinatra/test/views/error.sass +2 -0
- data/vendor/sinatra/test/views/explicitly_nested.str +1 -0
- data/vendor/sinatra/test/views/foo/hello.test +1 -0
- data/vendor/sinatra/test/views/hello.builder +1 -0
- data/vendor/sinatra/test/views/hello.coffee +1 -0
- data/vendor/sinatra/test/views/hello.creole +1 -0
- data/vendor/sinatra/test/views/hello.erb +1 -0
- data/vendor/sinatra/test/views/hello.haml +1 -0
- data/vendor/sinatra/test/views/hello.less +5 -0
- data/vendor/sinatra/test/views/hello.liquid +1 -0
- data/vendor/sinatra/test/views/hello.mab +1 -0
- data/vendor/sinatra/test/views/hello.md +1 -0
- data/vendor/sinatra/test/views/hello.nokogiri +1 -0
- data/vendor/sinatra/test/views/hello.rabl +2 -0
- data/vendor/sinatra/test/views/hello.radius +1 -0
- data/vendor/sinatra/test/views/hello.rdoc +1 -0
- data/vendor/sinatra/test/views/hello.sass +2 -0
- data/vendor/sinatra/test/views/hello.scss +3 -0
- data/vendor/sinatra/test/views/hello.slim +1 -0
- data/vendor/sinatra/test/views/hello.str +1 -0
- data/vendor/sinatra/test/views/hello.test +1 -0
- data/vendor/sinatra/test/views/hello.textile +1 -0
- data/vendor/sinatra/test/views/hello.wlang +1 -0
- data/vendor/sinatra/test/views/hello.yajl +1 -0
- data/vendor/sinatra/test/views/layout2.builder +3 -0
- data/vendor/sinatra/test/views/layout2.erb +2 -0
- data/vendor/sinatra/test/views/layout2.haml +2 -0
- data/vendor/sinatra/test/views/layout2.liquid +2 -0
- data/vendor/sinatra/test/views/layout2.mab +2 -0
- data/vendor/sinatra/test/views/layout2.nokogiri +3 -0
- data/vendor/sinatra/test/views/layout2.rabl +3 -0
- data/vendor/sinatra/test/views/layout2.radius +2 -0
- data/vendor/sinatra/test/views/layout2.slim +3 -0
- data/vendor/sinatra/test/views/layout2.str +2 -0
- data/vendor/sinatra/test/views/layout2.test +1 -0
- data/vendor/sinatra/test/views/layout2.wlang +2 -0
- data/vendor/sinatra/test/views/nested.str +1 -0
- data/vendor/sinatra/test/views/utf8.erb +2 -0
- data/vendor/sinatra/test/wlang_test.rb +70 -0
- data/vendor/sinatra/test/yajl_test.rb +86 -0
- metadata +414 -0
|
@@ -0,0 +1,333 @@
|
|
|
1
|
+
# encoding: UTF-8
|
|
2
|
+
require File.expand_path('../helper', __FILE__)
|
|
3
|
+
File.delete(File.dirname(__FILE__) + '/views/layout.test') rescue nil
|
|
4
|
+
|
|
5
|
+
class TestTemplate < Tilt::Template
|
|
6
|
+
def prepare
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def evaluate(scope, locals={}, &block)
|
|
10
|
+
inner = block ? block.call : ''
|
|
11
|
+
data + inner
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
Tilt.register 'test', self
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
class TemplatesTest < Test::Unit::TestCase
|
|
18
|
+
def render_app(base=Sinatra::Base, options = {}, &block)
|
|
19
|
+
base, options = Sinatra::Base, base if base.is_a? Hash
|
|
20
|
+
mock_app(base) do
|
|
21
|
+
set :views, File.dirname(__FILE__) + '/views'
|
|
22
|
+
set options
|
|
23
|
+
get('/', &block)
|
|
24
|
+
template(:layout3) { "Layout 3!\n" }
|
|
25
|
+
end
|
|
26
|
+
get '/'
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def with_default_layout
|
|
30
|
+
layout = File.dirname(__FILE__) + '/views/layout.test'
|
|
31
|
+
File.open(layout, 'wb') { |io| io.write "Layout!\n" }
|
|
32
|
+
yield
|
|
33
|
+
ensure
|
|
34
|
+
File.unlink(layout) rescue nil
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
it 'falls back to engine layout' do
|
|
38
|
+
mock_app do
|
|
39
|
+
template(:layout3) { 'Layout 3!<%= yield %>' }
|
|
40
|
+
set :erb, :layout => :layout3
|
|
41
|
+
|
|
42
|
+
get('/') do
|
|
43
|
+
erb('Hello World!', { :layout => true })
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
get '/'
|
|
48
|
+
assert ok?
|
|
49
|
+
assert_equal "Layout 3!Hello World!", body
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
it 'falls back to default layout if engine layout is true' do
|
|
53
|
+
mock_app do
|
|
54
|
+
template(:layout) { 'Layout!!! <%= yield %>' }
|
|
55
|
+
set :erb, :layout => true
|
|
56
|
+
|
|
57
|
+
get('/') do
|
|
58
|
+
erb('Hello World!', { :layout => true })
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
get '/'
|
|
63
|
+
assert ok?
|
|
64
|
+
assert_equal "Layout!!! Hello World!", body
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
it 'renders String templates directly' do
|
|
68
|
+
render_app { render(:test, 'Hello World') }
|
|
69
|
+
assert ok?
|
|
70
|
+
assert_equal 'Hello World', body
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
it 'renders Proc templates using the call result' do
|
|
74
|
+
render_app { render(:test, Proc.new {'Hello World'}) }
|
|
75
|
+
assert ok?
|
|
76
|
+
assert_equal 'Hello World', body
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
it 'looks up Symbol templates in views directory' do
|
|
80
|
+
render_app { render(:test, :hello) }
|
|
81
|
+
assert ok?
|
|
82
|
+
assert_equal "Hello World!\n", body
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
it 'uses the default layout template if not explicitly overridden' do
|
|
86
|
+
with_default_layout do
|
|
87
|
+
render_app { render(:test, :hello) }
|
|
88
|
+
assert ok?
|
|
89
|
+
assert_equal "Layout!\nHello World!\n", body
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
it 'uses the default layout template if not really overriden' do
|
|
94
|
+
with_default_layout do
|
|
95
|
+
render_app { render(:test, :hello, :layout => true) }
|
|
96
|
+
assert ok?
|
|
97
|
+
assert_equal "Layout!\nHello World!\n", body
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
it 'uses the layout template specified' do
|
|
102
|
+
render_app { render(:test, :hello, :layout => :layout2) }
|
|
103
|
+
assert ok?
|
|
104
|
+
assert_equal "Layout 2!\nHello World!\n", body
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
it 'uses layout templates defined with the #template method' do
|
|
108
|
+
render_app { render(:test, :hello, :layout => :layout3) }
|
|
109
|
+
assert ok?
|
|
110
|
+
assert_equal "Layout 3!\nHello World!\n", body
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
it 'avoids wrapping layouts around nested templates' do
|
|
114
|
+
render_app { render(:str, :nested, :layout => :layout2) }
|
|
115
|
+
assert ok?
|
|
116
|
+
assert_equal(
|
|
117
|
+
"<h1>String Layout!</h1>\n<content><h1>Hello From String</h1></content>",
|
|
118
|
+
body
|
|
119
|
+
)
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
it 'allows explicitly wrapping layouts around nested templates' do
|
|
123
|
+
render_app { render(:str, :explicitly_nested, :layout => :layout2) }
|
|
124
|
+
assert ok?
|
|
125
|
+
assert_equal(
|
|
126
|
+
"<h1>String Layout!</h1>\n<content><h1>String Layout!</h1>\n<h1>Hello From String</h1></content>",
|
|
127
|
+
body
|
|
128
|
+
)
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
it 'two independent render calls do not disable layouts' do
|
|
132
|
+
render_app do
|
|
133
|
+
render :str, :explicitly_nested, :layout => :layout2
|
|
134
|
+
render :str, :nested, :layout => :layout2
|
|
135
|
+
end
|
|
136
|
+
assert ok?
|
|
137
|
+
assert_equal(
|
|
138
|
+
"<h1>String Layout!</h1>\n<content><h1>Hello From String</h1></content>",
|
|
139
|
+
body
|
|
140
|
+
)
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
it 'is possible to use partials in layouts' do
|
|
144
|
+
render_app do
|
|
145
|
+
settings.layout { "<%= erb 'foo' %><%= yield %>" }
|
|
146
|
+
erb 'bar'
|
|
147
|
+
end
|
|
148
|
+
assert ok?
|
|
149
|
+
assert_equal "foobar", body
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
it 'loads templates from source file' do
|
|
153
|
+
mock_app { enable(:inline_templates) }
|
|
154
|
+
assert_equal "this is foo\n\n", @app.templates[:foo][0]
|
|
155
|
+
assert_equal "X\n= yield\nX\n", @app.templates[:layout][0]
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
it 'ignores spaces after names of inline templates' do
|
|
159
|
+
mock_app { enable(:inline_templates) }
|
|
160
|
+
assert_equal "There's a space after 'bar'!\n\n", @app.templates[:bar][0]
|
|
161
|
+
assert_equal "this is not foo\n\n", @app.templates[:"foo bar"][0]
|
|
162
|
+
end
|
|
163
|
+
|
|
164
|
+
it 'loads templates from given source file' do
|
|
165
|
+
mock_app { set(:inline_templates, __FILE__) }
|
|
166
|
+
assert_equal "this is foo\n\n", @app.templates[:foo][0]
|
|
167
|
+
end
|
|
168
|
+
|
|
169
|
+
test 'inline_templates ignores IO errors' do
|
|
170
|
+
assert_nothing_raised { mock_app { set(:inline_templates, '/foo/bar') } }
|
|
171
|
+
|
|
172
|
+
assert @app.templates.empty?
|
|
173
|
+
end
|
|
174
|
+
|
|
175
|
+
it 'allows unicode in inline templates' do
|
|
176
|
+
mock_app { set(:inline_templates, __FILE__) }
|
|
177
|
+
assert_equal(
|
|
178
|
+
"Den som tror at hemma det är där man bor har aldrig vart hos mig.\n\n",
|
|
179
|
+
@app.templates[:umlaut][0]
|
|
180
|
+
)
|
|
181
|
+
end
|
|
182
|
+
|
|
183
|
+
it 'loads templates from specified views directory' do
|
|
184
|
+
render_app { render( :test, :hello, :views => settings.views + '/foo') }
|
|
185
|
+
|
|
186
|
+
assert_equal "from another views directory\n", body
|
|
187
|
+
end
|
|
188
|
+
|
|
189
|
+
it 'passes locals to the layout' do
|
|
190
|
+
mock_app do
|
|
191
|
+
template(:my_layout) { 'Hello <%= name %>!<%= yield %>' }
|
|
192
|
+
|
|
193
|
+
get('/') do
|
|
194
|
+
erb('<p>content</p>', { :layout => :my_layout }, { :name => 'Mike'})
|
|
195
|
+
end
|
|
196
|
+
end
|
|
197
|
+
|
|
198
|
+
get '/'
|
|
199
|
+
assert ok?
|
|
200
|
+
assert_equal 'Hello Mike!<p>content</p>', body
|
|
201
|
+
end
|
|
202
|
+
|
|
203
|
+
it 'loads templates defined in subclasses' do
|
|
204
|
+
base = Class.new(Sinatra::Base)
|
|
205
|
+
base.template(:foo) { 'bar' }
|
|
206
|
+
render_app(base) { render(:test, :foo) }
|
|
207
|
+
assert ok?
|
|
208
|
+
assert_equal 'bar', body
|
|
209
|
+
end
|
|
210
|
+
|
|
211
|
+
it 'allows setting default content type per template engine' do
|
|
212
|
+
render_app(:str => { :content_type => :txt }) {
|
|
213
|
+
render :str, 'foo'
|
|
214
|
+
}
|
|
215
|
+
assert_equal 'text/plain;charset=utf-8', response['Content-Type']
|
|
216
|
+
end
|
|
217
|
+
|
|
218
|
+
it 'setting default content type does not affect other template engines' do
|
|
219
|
+
render_app(:str => { :content_type => :txt }) {
|
|
220
|
+
render :test, 'foo'
|
|
221
|
+
}
|
|
222
|
+
assert_equal 'text/html;charset=utf-8', response['Content-Type']
|
|
223
|
+
end
|
|
224
|
+
|
|
225
|
+
it 'setting default content type per template engine does not override content_type' do
|
|
226
|
+
render_app :str => { :content_type => :txt } do
|
|
227
|
+
content_type :html
|
|
228
|
+
render :str, 'foo'
|
|
229
|
+
end
|
|
230
|
+
assert_equal 'text/html;charset=utf-8', response['Content-Type']
|
|
231
|
+
end
|
|
232
|
+
|
|
233
|
+
it 'uses templates in superclasses before subclasses' do
|
|
234
|
+
base = Class.new(Sinatra::Base)
|
|
235
|
+
base.template(:foo) { 'template in superclass' }
|
|
236
|
+
assert_equal 'template in superclass', base.templates[:foo].first.call
|
|
237
|
+
|
|
238
|
+
mock_app(base) do
|
|
239
|
+
set :views, File.dirname(__FILE__) + '/views'
|
|
240
|
+
template(:foo) { 'template in subclass' }
|
|
241
|
+
get('/') { render :test, :foo }
|
|
242
|
+
end
|
|
243
|
+
assert_equal 'template in subclass', @app.templates[:foo].first.call
|
|
244
|
+
|
|
245
|
+
get '/'
|
|
246
|
+
assert ok?
|
|
247
|
+
assert_equal 'template in subclass', body
|
|
248
|
+
end
|
|
249
|
+
|
|
250
|
+
it "is possible to use a different engine for the layout than for the template itself explicitely" do
|
|
251
|
+
render_app do
|
|
252
|
+
settings.template(:layout) { 'Hello <%= yield %>!' }
|
|
253
|
+
render :str, "<%= 'World' %>", :layout_engine => :erb
|
|
254
|
+
end
|
|
255
|
+
assert_equal "Hello <%= 'World' %>!", body
|
|
256
|
+
end
|
|
257
|
+
|
|
258
|
+
it "is possible to use a different engine for the layout than for the template itself globally" do
|
|
259
|
+
render_app :str => { :layout_engine => :erb } do
|
|
260
|
+
settings.template(:layout) { 'Hello <%= yield %>!' }
|
|
261
|
+
render :str, "<%= 'World' %>"
|
|
262
|
+
end
|
|
263
|
+
assert_equal "Hello <%= 'World' %>!", body
|
|
264
|
+
end
|
|
265
|
+
|
|
266
|
+
it "does not leak the content type to the template" do
|
|
267
|
+
render_app :str => { :layout_engine => :erb } do
|
|
268
|
+
settings.template(:layout) { 'Hello <%= yield %>!' }
|
|
269
|
+
render :str, "<%= 'World' %>", :content_type => :txt
|
|
270
|
+
end
|
|
271
|
+
assert_equal "text/html;charset=utf-8", headers['Content-Type']
|
|
272
|
+
end
|
|
273
|
+
|
|
274
|
+
it "is possible to register another template" do
|
|
275
|
+
Tilt.register "html.erb", Tilt[:erb]
|
|
276
|
+
render_app { render :erb, :calc }
|
|
277
|
+
assert_equal '2', body
|
|
278
|
+
end
|
|
279
|
+
|
|
280
|
+
it "passes scope to the template" do
|
|
281
|
+
mock_app do
|
|
282
|
+
template(:scoped) { 'Hello <%= foo %>' }
|
|
283
|
+
|
|
284
|
+
get('/') do
|
|
285
|
+
some_scope = Object.new
|
|
286
|
+
def some_scope.foo() 'World!' end
|
|
287
|
+
erb :scoped, :scope => some_scope
|
|
288
|
+
end
|
|
289
|
+
end
|
|
290
|
+
|
|
291
|
+
get '/'
|
|
292
|
+
assert ok?
|
|
293
|
+
assert_equal 'Hello World!', body
|
|
294
|
+
end
|
|
295
|
+
|
|
296
|
+
it "is possible to use custom logic for finding template files" do
|
|
297
|
+
mock_app do
|
|
298
|
+
set :views, ["a", "b"].map { |d| File.dirname(__FILE__) + '/views/' + d }
|
|
299
|
+
def find_template(views, name, engine, &block)
|
|
300
|
+
Array(views).each { |v| super(v, name, engine, &block) }
|
|
301
|
+
end
|
|
302
|
+
|
|
303
|
+
get('/:name') { render(:str, params[:name].to_sym) }
|
|
304
|
+
end
|
|
305
|
+
|
|
306
|
+
get '/in_a'
|
|
307
|
+
assert_body 'Gimme an A!'
|
|
308
|
+
|
|
309
|
+
get '/in_b'
|
|
310
|
+
assert_body 'Gimme a B!'
|
|
311
|
+
end
|
|
312
|
+
end
|
|
313
|
+
|
|
314
|
+
# __END__ : this is not the real end of the script.
|
|
315
|
+
|
|
316
|
+
__END__
|
|
317
|
+
|
|
318
|
+
@@ foo
|
|
319
|
+
this is foo
|
|
320
|
+
|
|
321
|
+
@@ bar
|
|
322
|
+
There's a space after 'bar'!
|
|
323
|
+
|
|
324
|
+
@@ foo bar
|
|
325
|
+
this is not foo
|
|
326
|
+
|
|
327
|
+
@@ umlaut
|
|
328
|
+
Den som tror at hemma det är där man bor har aldrig vart hos mig.
|
|
329
|
+
|
|
330
|
+
@@ layout
|
|
331
|
+
X
|
|
332
|
+
= yield
|
|
333
|
+
X
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
require File.expand_path('../helper', __FILE__)
|
|
2
|
+
|
|
3
|
+
begin
|
|
4
|
+
require 'redcloth'
|
|
5
|
+
|
|
6
|
+
class TextileTest < Test::Unit::TestCase
|
|
7
|
+
def textile_app(&block)
|
|
8
|
+
mock_app do
|
|
9
|
+
set :views, File.dirname(__FILE__) + '/views'
|
|
10
|
+
get('/', &block)
|
|
11
|
+
end
|
|
12
|
+
get '/'
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
it 'renders inline textile strings' do
|
|
16
|
+
textile_app { textile('h1. Hiya') }
|
|
17
|
+
assert ok?
|
|
18
|
+
assert_equal "<h1>Hiya</h1>", body
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
it 'renders .textile files in views path' do
|
|
22
|
+
textile_app { textile(:hello) }
|
|
23
|
+
assert ok?
|
|
24
|
+
assert_equal "<h1>Hello From Textile</h1>", body
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
it "raises error if template not found" do
|
|
28
|
+
mock_app { get('/') { textile(:no_such_template) } }
|
|
29
|
+
assert_raise(Errno::ENOENT) { get('/') }
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
it "renders with inline layouts" do
|
|
33
|
+
mock_app do
|
|
34
|
+
layout { 'THIS. IS. #{yield.upcase}!' }
|
|
35
|
+
get('/') { textile('Sparta', :layout_engine => :str) }
|
|
36
|
+
end
|
|
37
|
+
get '/'
|
|
38
|
+
assert ok?
|
|
39
|
+
assert_like 'THIS. IS. <P>SPARTA</P>!', body
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
it "renders with file layouts" do
|
|
43
|
+
textile_app {
|
|
44
|
+
textile('Hello World', :layout => :layout2, :layout_engine => :erb)
|
|
45
|
+
}
|
|
46
|
+
assert ok?
|
|
47
|
+
assert_body "ERB Layout!\n<p>Hello World</p>"
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
it "can be used in a nested fashion for partials and whatnot" do
|
|
51
|
+
mock_app do
|
|
52
|
+
template(:inner) { "hi" }
|
|
53
|
+
template(:outer) { "<outer><%= textile :inner %></outer>" }
|
|
54
|
+
get('/') { erb :outer }
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
get '/'
|
|
58
|
+
assert ok?
|
|
59
|
+
assert_like '<outer><p>hi</p></outer>', body
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
rescue LoadError
|
|
64
|
+
warn "#{$!.to_s}: skipping textile tests"
|
|
65
|
+
end
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Gimme an A!
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Gimme a B!
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<%= 1 + 1 %>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<content>#{render :str, :hello, :layout => :layout2}</content>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
from another views directory
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
xml.exclaim "You're my boy, #{@name}!"
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
alert "Aye!"
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
= Hello From Creole
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Hello <%= 'World' %>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
%h1 Hello From Haml
|