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.
Files changed (192) hide show
  1. data/.gitignore +18 -0
  2. data/Gemfile +8 -0
  3. data/LICENSE.txt +22 -0
  4. data/README.md +39 -0
  5. data/Rakefile +2 -0
  6. data/bin/devcenter +7 -0
  7. data/devcenter.gemspec +30 -0
  8. data/lib/devcenter.rb +6 -0
  9. data/lib/devcenter/cli.rb +45 -0
  10. data/lib/devcenter/coderay_extensions.rb +70 -0
  11. data/lib/devcenter/commands.rb +4 -0
  12. data/lib/devcenter/commands/base.rb +47 -0
  13. data/lib/devcenter/commands/open.rb +34 -0
  14. data/lib/devcenter/commands/preview.rb +28 -0
  15. data/lib/devcenter/commands/pull.rb +37 -0
  16. data/lib/devcenter/helpers.rb +41 -0
  17. data/lib/devcenter/layout.html +299 -0
  18. data/lib/devcenter/md_parser.rb +87 -0
  19. data/lib/devcenter/previewer.rb +36 -0
  20. data/lib/devcenter/previewer/assets/images/public/article-icon-large.png +0 -0
  21. data/lib/devcenter/previewer/assets/images/public/article-icon.png +0 -0
  22. data/lib/devcenter/previewer/assets/images/public/aside_accordion_indicator_default.png +0 -0
  23. data/lib/devcenter/previewer/assets/images/public/aside_accordion_indicator_open.png +0 -0
  24. data/lib/devcenter/previewer/assets/images/public/body_bg.png +0 -0
  25. data/lib/devcenter/previewer/assets/images/public/callout_bg.png +0 -0
  26. data/lib/devcenter/previewer/assets/images/public/feed-icon-sprite.png +0 -0
  27. data/lib/devcenter/previewer/assets/images/public/heroku-header-logo-mobile.png +0 -0
  28. data/lib/devcenter/previewer/assets/images/public/heroku-header-logo.png +0 -0
  29. data/lib/devcenter/previewer/assets/images/public/heroku-logo.png +0 -0
  30. data/lib/devcenter/previewer/assets/images/public/icon_sprite_16.png +0 -0
  31. data/lib/devcenter/previewer/assets/images/public/index_li_bullet.png +0 -0
  32. data/lib/devcenter/previewer/assets/images/public/intro_bg.png +0 -0
  33. data/lib/devcenter/previewer/assets/images/public/jive_discussion_arrow.png +0 -0
  34. data/lib/devcenter/previewer/assets/images/public/jive_discussion_glyph.png +0 -0
  35. data/lib/devcenter/previewer/assets/images/public/line.png +0 -0
  36. data/lib/devcenter/previewer/assets/images/public/pre_code_background.png +0 -0
  37. data/lib/devcenter/previewer/assets/images/public/search-icon.png +0 -0
  38. data/lib/devcenter/previewer/assets/images/public/search_glyph.png +0 -0
  39. data/lib/devcenter/previewer/assets/images/public/search_return.png +0 -0
  40. data/lib/devcenter/previewer/assets/images/public/tag-icon-large.png +0 -0
  41. data/lib/devcenter/previewer/assets/images/public/toc-icon.png +0 -0
  42. data/lib/devcenter/previewer/assets/public.css +2125 -0
  43. data/lib/devcenter/previewer/assets/public/article-icon-large.png +0 -0
  44. data/lib/devcenter/previewer/assets/public/article-icon.png +0 -0
  45. data/lib/devcenter/previewer/assets/public/aside_accordion_indicator_default.png +0 -0
  46. data/lib/devcenter/previewer/assets/public/aside_accordion_indicator_open.png +0 -0
  47. data/lib/devcenter/previewer/assets/public/body_bg.png +0 -0
  48. data/lib/devcenter/previewer/assets/public/callout_bg.png +0 -0
  49. data/lib/devcenter/previewer/assets/public/feed-icon-sprite.png +0 -0
  50. data/lib/devcenter/previewer/assets/public/heroku-header-logo-mobile.png +0 -0
  51. data/lib/devcenter/previewer/assets/public/heroku-header-logo.png +0 -0
  52. data/lib/devcenter/previewer/assets/public/heroku-logo.png +0 -0
  53. data/lib/devcenter/previewer/assets/public/icon_sprite_16.png +0 -0
  54. data/lib/devcenter/previewer/assets/public/index_li_bullet.png +0 -0
  55. data/lib/devcenter/previewer/assets/public/intro_bg.png +0 -0
  56. data/lib/devcenter/previewer/assets/public/jive_discussion_arrow.png +0 -0
  57. data/lib/devcenter/previewer/assets/public/jive_discussion_glyph.png +0 -0
  58. data/lib/devcenter/previewer/assets/public/line.png +0 -0
  59. data/lib/devcenter/previewer/assets/public/pre_code_background.png +0 -0
  60. data/lib/devcenter/previewer/assets/public/public.css +2125 -0
  61. data/lib/devcenter/previewer/assets/public/search-icon.png +0 -0
  62. data/lib/devcenter/previewer/assets/public/search_glyph.png +0 -0
  63. data/lib/devcenter/previewer/assets/public/search_return.png +0 -0
  64. data/lib/devcenter/previewer/assets/public/tag-icon-large.png +0 -0
  65. data/lib/devcenter/previewer/assets/public/toc-icon.png +0 -0
  66. data/lib/devcenter/previewer/file_listener.rb +23 -0
  67. data/lib/devcenter/previewer/views/article.erb +345 -0
  68. data/lib/devcenter/previewer/web_app.rb +53 -0
  69. data/lib/devcenter/previewer/web_server.rb +29 -0
  70. data/lib/devcenter/version.rb +3 -0
  71. data/vendor/sinatra/.gitignore +6 -0
  72. data/vendor/sinatra/.travis.yml +16 -0
  73. data/vendor/sinatra/.yardopts +4 -0
  74. data/vendor/sinatra/AUTHORS +61 -0
  75. data/vendor/sinatra/Gemfile +91 -0
  76. data/vendor/sinatra/LICENSE +22 -0
  77. data/vendor/sinatra/README.de.rdoc +2116 -0
  78. data/vendor/sinatra/README.es.rdoc +2106 -0
  79. data/vendor/sinatra/README.fr.rdoc +2133 -0
  80. data/vendor/sinatra/README.hu.rdoc +608 -0
  81. data/vendor/sinatra/README.jp.rdoc +1056 -0
  82. data/vendor/sinatra/README.ko.rdoc +1932 -0
  83. data/vendor/sinatra/README.pt-br.rdoc +778 -0
  84. data/vendor/sinatra/README.pt-pt.rdoc +647 -0
  85. data/vendor/sinatra/README.rdoc +2049 -0
  86. data/vendor/sinatra/README.ru.rdoc +2033 -0
  87. data/vendor/sinatra/README.zh.rdoc +1816 -0
  88. data/vendor/sinatra/Rakefile +182 -0
  89. data/vendor/sinatra/examples/chat.rb +61 -0
  90. data/vendor/sinatra/examples/simple.rb +3 -0
  91. data/vendor/sinatra/examples/stream.ru +26 -0
  92. data/vendor/sinatra/lib/sinatra.rb +5 -0
  93. data/vendor/sinatra/lib/sinatra/base.rb +1820 -0
  94. data/vendor/sinatra/lib/sinatra/images/404.png +0 -0
  95. data/vendor/sinatra/lib/sinatra/images/500.png +0 -0
  96. data/vendor/sinatra/lib/sinatra/main.rb +30 -0
  97. data/vendor/sinatra/lib/sinatra/showexceptions.rb +345 -0
  98. data/vendor/sinatra/lib/sinatra/version.rb +3 -0
  99. data/vendor/sinatra/sinatra.gemspec +18 -0
  100. data/vendor/sinatra/test/base_test.rb +172 -0
  101. data/vendor/sinatra/test/builder_test.rb +91 -0
  102. data/vendor/sinatra/test/coffee_test.rb +90 -0
  103. data/vendor/sinatra/test/compile_test.rb +139 -0
  104. data/vendor/sinatra/test/contest.rb +98 -0
  105. data/vendor/sinatra/test/creole_test.rb +65 -0
  106. data/vendor/sinatra/test/delegator_test.rb +160 -0
  107. data/vendor/sinatra/test/encoding_test.rb +20 -0
  108. data/vendor/sinatra/test/erb_test.rb +98 -0
  109. data/vendor/sinatra/test/extensions_test.rb +98 -0
  110. data/vendor/sinatra/test/filter_test.rb +437 -0
  111. data/vendor/sinatra/test/haml_test.rb +91 -0
  112. data/vendor/sinatra/test/helper.rb +123 -0
  113. data/vendor/sinatra/test/helpers_test.rb +1768 -0
  114. data/vendor/sinatra/test/integration/app.rb +62 -0
  115. data/vendor/sinatra/test/integration_helper.rb +222 -0
  116. data/vendor/sinatra/test/integration_test.rb +87 -0
  117. data/vendor/sinatra/test/less_test.rb +69 -0
  118. data/vendor/sinatra/test/liquid_test.rb +59 -0
  119. data/vendor/sinatra/test/mapped_error_test.rb +305 -0
  120. data/vendor/sinatra/test/markaby_test.rb +80 -0
  121. data/vendor/sinatra/test/markdown_test.rb +82 -0
  122. data/vendor/sinatra/test/middleware_test.rb +68 -0
  123. data/vendor/sinatra/test/nokogiri_test.rb +67 -0
  124. data/vendor/sinatra/test/public/favicon.ico +0 -0
  125. data/vendor/sinatra/test/rabl_test.rb +89 -0
  126. data/vendor/sinatra/test/rack_test.rb +45 -0
  127. data/vendor/sinatra/test/radius_test.rb +59 -0
  128. data/vendor/sinatra/test/rdoc_test.rb +66 -0
  129. data/vendor/sinatra/test/readme_test.rb +120 -0
  130. data/vendor/sinatra/test/request_test.rb +45 -0
  131. data/vendor/sinatra/test/response_test.rb +64 -0
  132. data/vendor/sinatra/test/result_test.rb +76 -0
  133. data/vendor/sinatra/test/route_added_hook_test.rb +59 -0
  134. data/vendor/sinatra/test/routing_test.rb +1175 -0
  135. data/vendor/sinatra/test/sass_test.rb +116 -0
  136. data/vendor/sinatra/test/scss_test.rb +89 -0
  137. data/vendor/sinatra/test/server_test.rb +48 -0
  138. data/vendor/sinatra/test/settings_test.rb +561 -0
  139. data/vendor/sinatra/test/sinatra_test.rb +12 -0
  140. data/vendor/sinatra/test/slim_test.rb +84 -0
  141. data/vendor/sinatra/test/static_test.rb +219 -0
  142. data/vendor/sinatra/test/streaming_test.rb +149 -0
  143. data/vendor/sinatra/test/templates_test.rb +333 -0
  144. data/vendor/sinatra/test/textile_test.rb +65 -0
  145. data/vendor/sinatra/test/views/a/in_a.str +1 -0
  146. data/vendor/sinatra/test/views/ascii.erb +2 -0
  147. data/vendor/sinatra/test/views/b/in_b.str +1 -0
  148. data/vendor/sinatra/test/views/calc.html.erb +1 -0
  149. data/vendor/sinatra/test/views/error.builder +3 -0
  150. data/vendor/sinatra/test/views/error.erb +3 -0
  151. data/vendor/sinatra/test/views/error.haml +3 -0
  152. data/vendor/sinatra/test/views/error.sass +2 -0
  153. data/vendor/sinatra/test/views/explicitly_nested.str +1 -0
  154. data/vendor/sinatra/test/views/foo/hello.test +1 -0
  155. data/vendor/sinatra/test/views/hello.builder +1 -0
  156. data/vendor/sinatra/test/views/hello.coffee +1 -0
  157. data/vendor/sinatra/test/views/hello.creole +1 -0
  158. data/vendor/sinatra/test/views/hello.erb +1 -0
  159. data/vendor/sinatra/test/views/hello.haml +1 -0
  160. data/vendor/sinatra/test/views/hello.less +5 -0
  161. data/vendor/sinatra/test/views/hello.liquid +1 -0
  162. data/vendor/sinatra/test/views/hello.mab +1 -0
  163. data/vendor/sinatra/test/views/hello.md +1 -0
  164. data/vendor/sinatra/test/views/hello.nokogiri +1 -0
  165. data/vendor/sinatra/test/views/hello.rabl +2 -0
  166. data/vendor/sinatra/test/views/hello.radius +1 -0
  167. data/vendor/sinatra/test/views/hello.rdoc +1 -0
  168. data/vendor/sinatra/test/views/hello.sass +2 -0
  169. data/vendor/sinatra/test/views/hello.scss +3 -0
  170. data/vendor/sinatra/test/views/hello.slim +1 -0
  171. data/vendor/sinatra/test/views/hello.str +1 -0
  172. data/vendor/sinatra/test/views/hello.test +1 -0
  173. data/vendor/sinatra/test/views/hello.textile +1 -0
  174. data/vendor/sinatra/test/views/hello.wlang +1 -0
  175. data/vendor/sinatra/test/views/hello.yajl +1 -0
  176. data/vendor/sinatra/test/views/layout2.builder +3 -0
  177. data/vendor/sinatra/test/views/layout2.erb +2 -0
  178. data/vendor/sinatra/test/views/layout2.haml +2 -0
  179. data/vendor/sinatra/test/views/layout2.liquid +2 -0
  180. data/vendor/sinatra/test/views/layout2.mab +2 -0
  181. data/vendor/sinatra/test/views/layout2.nokogiri +3 -0
  182. data/vendor/sinatra/test/views/layout2.rabl +3 -0
  183. data/vendor/sinatra/test/views/layout2.radius +2 -0
  184. data/vendor/sinatra/test/views/layout2.slim +3 -0
  185. data/vendor/sinatra/test/views/layout2.str +2 -0
  186. data/vendor/sinatra/test/views/layout2.test +1 -0
  187. data/vendor/sinatra/test/views/layout2.wlang +2 -0
  188. data/vendor/sinatra/test/views/nested.str +1 -0
  189. data/vendor/sinatra/test/views/utf8.erb +2 -0
  190. data/vendor/sinatra/test/wlang_test.rb +70 -0
  191. data/vendor/sinatra/test/yajl_test.rb +86 -0
  192. 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,2 @@
1
+ This file has no unicode in it!
2
+ <%= value %>
@@ -0,0 +1 @@
1
+ Gimme a B!
@@ -0,0 +1 @@
1
+ <%= 1 + 1 %>
@@ -0,0 +1,3 @@
1
+ xml.error do
2
+ raise "goodbye"
3
+ end
@@ -0,0 +1,3 @@
1
+ Hello <%= 'World' %>
2
+ <% raise 'Goodbye' unless defined?(french) && french %>
3
+ <% raise 'Au revoir' if defined?(french) && french %>
@@ -0,0 +1,3 @@
1
+ %h1 Hello From Haml
2
+ = raise 'goodbye' unless defined?(french) && french
3
+ = raise 'au revoir' if defined?(french) && french
@@ -0,0 +1,2 @@
1
+ #sass
2
+ +argle-bargle
@@ -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