slim 2.1.0 → 3.0.0.beta.2
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.
- checksums.yaml +4 -4
- data/.travis.yml +10 -24
- data/CHANGES +8 -0
- data/Gemfile +5 -7
- data/README.jp.md +29 -31
- data/README.md +34 -34
- data/Rakefile +9 -7
- data/benchmarks/context.rb +3 -3
- data/benchmarks/run-benchmarks.rb +9 -9
- data/benchmarks/view.slim +1 -1
- data/doc/jp/logic_less.md +7 -7
- data/doc/logic_less.md +7 -7
- data/lib/slim/command.rb +6 -16
- data/lib/slim/embedded.rb +10 -13
- data/lib/slim/engine.rb +21 -23
- data/lib/slim/erb_converter.rb +2 -1
- data/lib/slim/include.rb +2 -2
- data/lib/slim/logic_less.rb +1 -2
- data/lib/slim/logic_less/filter.rb +3 -3
- data/lib/slim/parser.rb +43 -19
- data/lib/slim/smart.rb +3 -3
- data/lib/slim/smart/escaper.rb +1 -1
- data/lib/slim/smart/filter.rb +3 -3
- data/lib/slim/smart/parser.rb +6 -4
- data/lib/slim/splat/builder.rb +9 -4
- data/lib/slim/splat/filter.rb +3 -4
- data/lib/slim/template.rb +5 -5
- data/lib/slim/translator.rb +12 -13
- data/lib/slim/version.rb +1 -1
- data/slim.gemspec +3 -1
- data/test/core/helper.rb +3 -3
- data/test/core/test_code_escaping.rb +14 -14
- data/test/core/test_code_evaluation.rb +1 -1
- data/test/core/test_code_output.rb +1 -1
- data/test/core/test_embedded_engines.rb +16 -16
- data/test/core/test_encoding.rb +4 -4
- data/test/core/test_html_attributes.rb +9 -9
- data/test/core/test_html_structure.rb +20 -20
- data/test/core/test_parser_errors.rb +1 -1
- data/test/core/test_pretty.rb +4 -4
- data/test/core/test_ruby_errors.rb +5 -5
- data/test/core/test_slim_template.rb +2 -2
- data/test/core/test_tabs.rb +5 -5
- data/test/core/test_thread_options.rb +4 -4
- data/test/core/test_unicode.rb +11 -13
- data/test/include/test_include.rb +2 -2
- data/test/literate/TESTS.md +37 -8
- data/test/literate/helper.rb +2 -2
- data/test/logic_less/test_logic_less.rb +37 -37
- data/test/rails/app/controllers/slim_controller.rb +3 -3
- data/test/rails/config/initializers/session_store.rb +1 -1
- data/test/rails/config/routes.rb +4 -4
- data/test/rails/test/test_slim.rb +9 -15
- data/test/smart/test_smart_text.rb +5 -9
- data/test/translator/test_translator.rb +14 -14
- metadata +7 -7
data/test/literate/TESTS.md
CHANGED
@@ -259,7 +259,7 @@ Hello, World!
|
|
259
259
|
You can also write loops like this
|
260
260
|
|
261
261
|
~~~ slim
|
262
|
-
- items = [{:
|
262
|
+
- items = [{name: 'table', price: 10}, {name: 'chair', price: 5}]
|
263
263
|
table#items
|
264
264
|
- for item in items do
|
265
265
|
tr
|
@@ -293,7 +293,7 @@ which renders as
|
|
293
293
|
The `do` keyword can be omitted.
|
294
294
|
|
295
295
|
~~~ slim
|
296
|
-
- items = [{:
|
296
|
+
- items = [{name: 'table', price: 10}, {name: 'chair', price: 5}]
|
297
297
|
table#items
|
298
298
|
- for item in items
|
299
299
|
tr
|
@@ -1099,7 +1099,7 @@ with the :tag key.
|
|
1099
1099
|
~~~ slim
|
1100
1100
|
ruby:
|
1101
1101
|
def a_unless_current
|
1102
|
-
@page_current ? {:
|
1102
|
+
@page_current ? {tag: 'span'} : {tag: 'a', href: 'http://slim-lang.com/'}
|
1103
1103
|
end
|
1104
1104
|
- @page_current = true
|
1105
1105
|
*a_unless_current Link
|
@@ -1120,7 +1120,7 @@ renders as
|
|
1120
1120
|
We add tag shortcuts by setting the option `:shortcut`.
|
1121
1121
|
|
1122
1122
|
~~~ options
|
1123
|
-
:shortcut => {'c' => {:
|
1123
|
+
:shortcut => {'c' => {tag: 'container'}, 'sec' => {tag:'section'}, '#' => {attr: 'id'}, '.' => {attr: 'class'} }
|
1124
1124
|
~~~
|
1125
1125
|
|
1126
1126
|
~~~ slim
|
@@ -1140,7 +1140,7 @@ renders to
|
|
1140
1140
|
We add `&` to create a shortcut for the input elements with type attribute by setting the option `:shortcut`.
|
1141
1141
|
|
1142
1142
|
~~~ options
|
1143
|
-
:shortcut => {'&' => {:
|
1143
|
+
:shortcut => {'&' => {tag: 'input', attr: 'type'}, '#' => {attr: 'id'}, '.' => {attr: 'class'} }
|
1144
1144
|
~~~
|
1145
1145
|
|
1146
1146
|
~~~ slim
|
@@ -1158,7 +1158,7 @@ renders to
|
|
1158
1158
|
This is stupid, but you can also use multiple character shortcuts.
|
1159
1159
|
|
1160
1160
|
~~~ options
|
1161
|
-
:shortcut => {'&' => {:
|
1161
|
+
:shortcut => {'&' => {tag: 'input', attr: 'type'}, '#<' => {attr: 'id'}, '#>' => {attr: 'class'} }
|
1162
1162
|
~~~
|
1163
1163
|
|
1164
1164
|
~~~ slim
|
@@ -1176,7 +1176,7 @@ renders to
|
|
1176
1176
|
You can also set multiple attributes per shortcut.
|
1177
1177
|
|
1178
1178
|
~~~ options
|
1179
|
-
:shortcut => {'.' => {:
|
1179
|
+
:shortcut => {'.' => {attr: %w(id class)} }
|
1180
1180
|
~~~
|
1181
1181
|
|
1182
1182
|
~~~ slim
|
@@ -1192,7 +1192,7 @@ renders to
|
|
1192
1192
|
Shortcuts can also have multiple characters.
|
1193
1193
|
|
1194
1194
|
~~~ options
|
1195
|
-
:shortcut => {'.' => {:
|
1195
|
+
:shortcut => {'.' => {attr: 'class'}, '#' => {attr: 'id'}, '.#' => {attr: %w(class id)} }
|
1196
1196
|
~~~
|
1197
1197
|
|
1198
1198
|
~~~ slim
|
@@ -1254,6 +1254,35 @@ renders as
|
|
1254
1254
|
</h1>
|
1255
1255
|
~~~
|
1256
1256
|
|
1257
|
+
## Pretty printing of XML
|
1258
|
+
|
1259
|
+
We can enable XML mode with
|
1260
|
+
|
1261
|
+
~~~ options
|
1262
|
+
:format => :xml
|
1263
|
+
~~~
|
1264
|
+
|
1265
|
+
~~~ slim
|
1266
|
+
doctype xml
|
1267
|
+
document
|
1268
|
+
closed-element/
|
1269
|
+
element(boolean-attribute)
|
1270
|
+
child attribute="value"
|
1271
|
+
| content
|
1272
|
+
~~~
|
1273
|
+
|
1274
|
+
~~~ html
|
1275
|
+
<?xml version="1.0" encoding="utf-8" ?>
|
1276
|
+
<document>
|
1277
|
+
<closed-element />
|
1278
|
+
<element boolean-attribute="">
|
1279
|
+
<child attribute="value">
|
1280
|
+
content
|
1281
|
+
</child>
|
1282
|
+
</element>
|
1283
|
+
</document>
|
1284
|
+
~~~
|
1285
|
+
|
1257
1286
|
## Embedded engines
|
1258
1287
|
|
1259
1288
|
## Configuring Slim
|
data/test/literate/helper.rb
CHANGED
@@ -4,9 +4,9 @@ require 'slim/translator'
|
|
4
4
|
require 'slim/grammar'
|
5
5
|
require 'minitest/autorun'
|
6
6
|
|
7
|
-
Slim::Engine.after Slim::Parser, Temple::Filters::Validator, :
|
7
|
+
Slim::Engine.after Slim::Parser, Temple::Filters::Validator, grammar: Slim::Grammar
|
8
8
|
Slim::Engine.before :Pretty, Temple::Filters::Validator
|
9
|
-
Slim::Engine.
|
9
|
+
Slim::Engine.set_options tr: false, logic_less: false
|
10
10
|
|
11
11
|
class MiniTest::Spec
|
12
12
|
def render(source, options = {}, &block)
|
@@ -5,9 +5,9 @@ class TestSlimLogicLess < TestSlim
|
|
5
5
|
class Scope
|
6
6
|
def initialize
|
7
7
|
@hash = {
|
8
|
-
:
|
9
|
-
{ :
|
10
|
-
{ :
|
8
|
+
person: [
|
9
|
+
{ name: 'Joe', age: 1, selected: true },
|
10
|
+
{ name: 'Jack', age: 2 }
|
11
11
|
]
|
12
12
|
}
|
13
13
|
end
|
@@ -25,22 +25,22 @@ p
|
|
25
25
|
}
|
26
26
|
|
27
27
|
hash = {
|
28
|
-
:
|
29
|
-
:
|
28
|
+
hello: 'Hello!',
|
29
|
+
person: lambda do |&block|
|
30
30
|
%w(Joe Jack).map do |name|
|
31
|
-
"<b>#{block.call(:
|
31
|
+
"<b>#{block.call(name: name)}</b>"
|
32
32
|
end.join
|
33
33
|
end,
|
34
|
-
:
|
34
|
+
simple: lambda do |&block|
|
35
35
|
"<div class=\"simple\">#{block.call}</div>"
|
36
36
|
end,
|
37
|
-
:
|
38
|
-
list = [{:
|
37
|
+
list: lambda do |&block|
|
38
|
+
list = [{key: 'First'}, {key: 'Second'}]
|
39
39
|
"<ul>#{block.call(*list)}</ul>"
|
40
40
|
end
|
41
41
|
}
|
42
42
|
|
43
|
-
assert_html '<p><b><div class="name">Joe</div></b><b><div class="name">Jack</div></b><div class="simple"><div class="hello">Hello!</div></div><ul><li>First</li><li>Second</li></ul></p>', source, :
|
43
|
+
assert_html '<p><b><div class="name">Joe</div></b><b><div class="name">Jack</div></b><div class="simple"><div class="hello">Hello!</div></div><ul><li>First</li><li>Second</li></ul></p>', source, scope: hash
|
44
44
|
end
|
45
45
|
|
46
46
|
def test_symbol_hash
|
@@ -51,13 +51,13 @@ p
|
|
51
51
|
}
|
52
52
|
|
53
53
|
hash = {
|
54
|
-
:
|
55
|
-
{ :
|
56
|
-
{ :
|
54
|
+
person: [
|
55
|
+
{ name: 'Joe', },
|
56
|
+
{ name: 'Jack', }
|
57
57
|
]
|
58
58
|
}
|
59
59
|
|
60
|
-
assert_html '<p><div class="name">Joe</div><div class="name">Jack</div></p>', source, :
|
60
|
+
assert_html '<p><div class="name">Joe</div><div class="name">Jack</div></p>', source, scope: hash
|
61
61
|
end
|
62
62
|
|
63
63
|
def test_string_access
|
@@ -74,7 +74,7 @@ p
|
|
74
74
|
]
|
75
75
|
}
|
76
76
|
|
77
|
-
assert_html '<p><div class="name">Joe</div><div class="name">Jack</div></p>', source, :
|
77
|
+
assert_html '<p><div class="name">Joe</div><div class="name">Jack</div></p>', source, scope: hash, dictionary_access: :string
|
78
78
|
end
|
79
79
|
|
80
80
|
def test_symbol_access
|
@@ -85,13 +85,13 @@ p
|
|
85
85
|
}
|
86
86
|
|
87
87
|
hash = {
|
88
|
-
:
|
89
|
-
{ :
|
90
|
-
{ :
|
88
|
+
person: [
|
89
|
+
{ name: 'Joe', },
|
90
|
+
{ name: 'Jack', }
|
91
91
|
]
|
92
92
|
}
|
93
93
|
|
94
|
-
assert_html '<p><div class="name">Joe</div><div class="name">Jack</div></p>', source, :
|
94
|
+
assert_html '<p><div class="name">Joe</div><div class="name">Jack</div></p>', source, scope: hash, dictionary_access: :symbol
|
95
95
|
end
|
96
96
|
|
97
97
|
def test_method_access
|
@@ -113,7 +113,7 @@ p
|
|
113
113
|
end
|
114
114
|
end
|
115
115
|
|
116
|
-
assert_html '<p><div class="name">Joe</div><div class="name">Jack</div></p>', source, :
|
116
|
+
assert_html '<p><div class="name">Joe</div><div class="name">Jack</div></p>', source, scope: object, dictionary_access: :method
|
117
117
|
end
|
118
118
|
|
119
119
|
def test_instance_variable_access
|
@@ -130,7 +130,7 @@ p
|
|
130
130
|
person
|
131
131
|
end)
|
132
132
|
|
133
|
-
assert_html '<p><div class="name">Joe</div><div class="name">Jack</div></p>', source, :
|
133
|
+
assert_html '<p><div class="name">Joe</div><div class="name">Jack</div></p>', source, scope: object, dictionary_access: :instance_variable
|
134
134
|
end
|
135
135
|
|
136
136
|
def test_to_s_access
|
@@ -141,13 +141,13 @@ p
|
|
141
141
|
}
|
142
142
|
|
143
143
|
hash = {
|
144
|
-
:
|
144
|
+
people: [
|
145
145
|
'Joe',
|
146
146
|
'Jack'
|
147
147
|
]
|
148
148
|
}
|
149
149
|
|
150
|
-
assert_html '<p><div class="name">Joe</div><div class="name">Jack</div></p>', source, :
|
150
|
+
assert_html '<p><div class="name">Joe</div><div class="name">Jack</div></p>', source, scope: hash, dictionary_access: :symbol
|
151
151
|
end
|
152
152
|
|
153
153
|
def test_string_hash
|
@@ -164,7 +164,7 @@ p
|
|
164
164
|
]
|
165
165
|
}
|
166
166
|
|
167
|
-
assert_html '<p><div class="name">Joe</div><div class="name">Jack</div></p>', source, :
|
167
|
+
assert_html '<p><div class="name">Joe</div><div class="name">Jack</div></p>', source, scope: hash
|
168
168
|
end
|
169
169
|
|
170
170
|
def test_dictionary_option
|
@@ -174,7 +174,7 @@ p
|
|
174
174
|
.name = name
|
175
175
|
}
|
176
176
|
|
177
|
-
assert_html '<p><div class="name">Joe</div><div class="name">Jack</div></p>', source, :
|
177
|
+
assert_html '<p><div class="name">Joe</div><div class="name">Jack</div></p>', source, scope: Scope.new, dictionary: '@hash'
|
178
178
|
end
|
179
179
|
|
180
180
|
def test_flag_section
|
@@ -188,14 +188,14 @@ p
|
|
188
188
|
}
|
189
189
|
|
190
190
|
hash = {
|
191
|
-
:
|
192
|
-
:
|
193
|
-
{ :
|
194
|
-
{ :
|
191
|
+
show_person: true,
|
192
|
+
person: [
|
193
|
+
{ name: 'Joe', },
|
194
|
+
{ name: 'Jack', }
|
195
195
|
]
|
196
196
|
}
|
197
197
|
|
198
|
-
assert_html '<p><div class="name">Joe</div><div class="name">Jack</div>shown</p>', source, :
|
198
|
+
assert_html '<p><div class="name">Joe</div><div class="name">Jack</div>shown</p>', source, scope: hash
|
199
199
|
end
|
200
200
|
|
201
201
|
def test_inverted_section
|
@@ -211,7 +211,7 @@ p
|
|
211
211
|
|
212
212
|
hash = {}
|
213
213
|
|
214
|
-
assert_html '<p>No person No person 2</p>', source, :
|
214
|
+
assert_html '<p>No person No person 2</p>', source, scope: hash
|
215
215
|
end
|
216
216
|
|
217
217
|
def test_escaped_interpolation
|
@@ -232,7 +232,7 @@ p
|
|
232
232
|
Person
|
233
233
|
}
|
234
234
|
|
235
|
-
assert_html '<p><b name="Joe">Person</b><a id="Joe">1</a><span class="Joe"><Person></Person></span><b name="Jack">Person</b><a id="Jack">2</a><span class="Jack"><Person></Person></span></p>', source, :
|
235
|
+
assert_html '<p><b name="Joe">Person</b><a id="Joe">1</a><span class="Joe"><Person></Person></span><b name="Jack">Person</b><a id="Jack">2</a><span class="Jack"><Person></Person></span></p>', source, scope: Scope.new, dictionary: '@hash'
|
236
236
|
end
|
237
237
|
|
238
238
|
def test_boolean_attributes
|
@@ -242,7 +242,7 @@ p
|
|
242
242
|
input checked=selected = name
|
243
243
|
}
|
244
244
|
|
245
|
-
assert_html '<p><input checked="">Joe</input><input>Jack</input></p>', source, :
|
245
|
+
assert_html '<p><input checked="">Joe</input><input>Jack</input></p>', source, scope: Scope.new, dictionary: '@hash'
|
246
246
|
end
|
247
247
|
|
248
248
|
def test_sections
|
@@ -251,7 +251,7 @@ p
|
|
251
251
|
- person
|
252
252
|
.name = name
|
253
253
|
}
|
254
|
-
assert_html '<p><div class="name">Joe</div><div class="name">Jack</div></p>', source, :
|
254
|
+
assert_html '<p><div class="name">Joe</div><div class="name">Jack</div></p>', source, dictionary: 'ViewEnv.new'
|
255
255
|
end
|
256
256
|
|
257
257
|
def test_with_array
|
@@ -261,14 +261,14 @@ ul
|
|
261
261
|
li = name
|
262
262
|
li = city
|
263
263
|
}
|
264
|
-
assert_html '<ul><li>Andy</li><li>Atlanta</li><li>Fred</li><li>Melbourne</li><li>Daniel</li><li>Karlsruhe</li></ul>', source, :
|
264
|
+
assert_html '<ul><li>Andy</li><li>Atlanta</li><li>Fred</li><li>Melbourne</li><li>Daniel</li><li>Karlsruhe</li></ul>', source, dictionary: 'ViewEnv.new'
|
265
265
|
end
|
266
266
|
|
267
267
|
def test_method
|
268
268
|
source = %q{
|
269
269
|
a href=output_number Link
|
270
270
|
}
|
271
|
-
assert_html '<a href="1337">Link</a>', source, :
|
271
|
+
assert_html '<a href="1337">Link</a>', source, dictionary: 'ViewEnv.new'
|
272
272
|
end
|
273
273
|
|
274
274
|
def test_conditional_parent
|
@@ -279,7 +279,7 @@ a href=output_number Link
|
|
279
279
|
- next_page
|
280
280
|
li.next
|
281
281
|
a href=next_page Newer}
|
282
|
-
assert_html'<li class="previous"><a href="prev">Older</a></li><li class="next"><a href="next">Newer</a></li>', source, :
|
282
|
+
assert_html'<li class="previous"><a href="prev">Older</a></li><li class="next"><a href="next">Newer</a></li>', source, scope: {prev_page: 'prev', next_page: 'next'}
|
283
283
|
end
|
284
284
|
|
285
285
|
def test_render_with_yield
|
@@ -6,7 +6,7 @@ class SlimController < ApplicationController
|
|
6
6
|
end
|
7
7
|
|
8
8
|
def no_layout
|
9
|
-
render :
|
9
|
+
render layout: false
|
10
10
|
end
|
11
11
|
|
12
12
|
def variables
|
@@ -18,7 +18,7 @@ class SlimController < ApplicationController
|
|
18
18
|
|
19
19
|
def streaming
|
20
20
|
@hello = "Hello Streaming!"
|
21
|
-
render :content_for, :
|
21
|
+
render :content_for, stream: true
|
22
22
|
end
|
23
23
|
|
24
24
|
def integers
|
@@ -26,7 +26,7 @@ class SlimController < ApplicationController
|
|
26
26
|
end
|
27
27
|
|
28
28
|
def thread_options
|
29
|
-
Slim::Engine.with_options(:
|
29
|
+
Slim::Engine.with_options(shortcut: {'@' => { attr: params[:attr] }}) do
|
30
30
|
render
|
31
31
|
end
|
32
32
|
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# Be sure to restart your server when you modify this file.
|
2
2
|
|
3
|
-
Dummy::Application.config.session_store :cookie_store, :
|
3
|
+
Dummy::Application.config.session_store :cookie_store, key: '_dummy_session'
|
4
4
|
|
5
5
|
# Use the database for sessions instead of the cookie-based default,
|
6
6
|
# which shouldn't be used to store highly confidential information
|
data/test/rails/config/routes.rb
CHANGED
@@ -9,8 +9,8 @@ Dummy::Application.routes.draw do
|
|
9
9
|
# Keep in mind you can assign values other than :controller and :action
|
10
10
|
|
11
11
|
# Sample of named route:
|
12
|
-
# match 'products/:id/purchase' => 'catalog#purchase', :
|
13
|
-
# This route can be invoked with purchase_url(:
|
12
|
+
# match 'products/:id/purchase' => 'catalog#purchase', as: :purchase
|
13
|
+
# This route can be invoked with purchase_url(id: product.id)
|
14
14
|
|
15
15
|
# Sample resource route (maps HTTP verbs to controller actions automatically):
|
16
16
|
# resources :products
|
@@ -37,7 +37,7 @@ Dummy::Application.routes.draw do
|
|
37
37
|
# resources :products do
|
38
38
|
# resources :comments
|
39
39
|
# resources :sales do
|
40
|
-
# get 'recent', :
|
40
|
+
# get 'recent', on: :collection
|
41
41
|
# end
|
42
42
|
# end
|
43
43
|
|
@@ -50,7 +50,7 @@ Dummy::Application.routes.draw do
|
|
50
50
|
|
51
51
|
# You can have the root of your site routed with "root"
|
52
52
|
# just remember to delete public/index.html.
|
53
|
-
# root :
|
53
|
+
# root to: "welcome#index"
|
54
54
|
|
55
55
|
# See how all your routes lay out with "rake routes"
|
56
56
|
|
@@ -33,7 +33,7 @@ class TestSlim < ActionDispatch::IntegrationTest
|
|
33
33
|
test "view without a layout" do
|
34
34
|
get "slim/no_layout"
|
35
35
|
assert_template "slim/no_layout"
|
36
|
-
assert_html "<h1>Hello Slim without a layout!</h1>", :
|
36
|
+
assert_html "<h1>Hello Slim without a layout!</h1>", skip_layout: true
|
37
37
|
end
|
38
38
|
|
39
39
|
test "view with variables" do
|
@@ -46,17 +46,11 @@ class TestSlim < ActionDispatch::IntegrationTest
|
|
46
46
|
assert_html "<h1>Hello Slim!</h1><p>With a partial!</p>"
|
47
47
|
end
|
48
48
|
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
get "slim/streaming"
|
55
|
-
output = "2f\r\n<!DOCTYPE html><html><head><title>Dummy</title>\r\nd\r\n</head><body>\r\n17\r\nHeading set from a view\r\n15\r\n<div class=\"content\">\r\n53\r\n<p>Page content</p><h1><p>Hello Streaming!</p></h1><h2><p>Hello Streaming!</p></h2>\r\n14\r\n</div></body></html>\r\n0\r\n\r\n"
|
56
|
-
assert_equal output, @response.body
|
57
|
-
end
|
58
|
-
else
|
59
|
-
puts 'Streaming test disabled'
|
49
|
+
puts 'Streaming test enabled'
|
50
|
+
test "streaming" do
|
51
|
+
get "slim/streaming"
|
52
|
+
output = "2f\r\n<!DOCTYPE html><html><head><title>Dummy</title>\r\nd\r\n</head><body>\r\n17\r\nHeading set from a view\r\n15\r\n<div class=\"content\">\r\n53\r\n<p>Page content</p><h1><p>Hello Streaming!</p></h1><h2><p>Hello Streaming!</p></h2>\r\n14\r\n</div></body></html>\r\n0\r\n\r\n"
|
53
|
+
assert_equal output, @response.body
|
60
54
|
end
|
61
55
|
|
62
56
|
test "render integers" do
|
@@ -65,15 +59,15 @@ class TestSlim < ActionDispatch::IntegrationTest
|
|
65
59
|
end
|
66
60
|
|
67
61
|
test "render thread_options" do
|
68
|
-
get "slim/thread_options", :
|
62
|
+
get "slim/thread_options", attr: 'role'
|
69
63
|
assert_html '<p role="empty">Test</p>'
|
70
|
-
get "slim/thread_options", :
|
64
|
+
get "slim/thread_options", attr: 'id' # Overwriting doesn't work because of caching
|
71
65
|
assert_html '<p role="empty">Test</p>'
|
72
66
|
end
|
73
67
|
|
74
68
|
test "content_for" do
|
75
69
|
get "slim/content_for"
|
76
|
-
assert_html "<p>Page content</p><h1><p>Hello Slim!</p></h1><h2><p>Hello Slim!</p></h2>", :
|
70
|
+
assert_html "<p>Page content</p><h1><p>Hello Slim!</p></h1><h2><p>Hello Slim!</p></h2>", heading: 'Heading set from a view'
|
77
71
|
end
|
78
72
|
|
79
73
|
test "form_for" do
|
@@ -112,7 +112,7 @@ Escaped &#xx; &#1f; &;.</p>}
|
|
112
112
|
end
|
113
113
|
|
114
114
|
def test_smart_text_disabled_escaping
|
115
|
-
Slim::Engine.with_options( :
|
115
|
+
Slim::Engine.with_options( smart_text_escaping: false ) do
|
116
116
|
source = %q{
|
117
117
|
p Not escaped <&>.
|
118
118
|
| Not escaped <&>.
|
@@ -250,7 +250,7 @@ which stops
|
|
250
250
|
|
251
251
|
assert_html result, source
|
252
252
|
end
|
253
|
-
|
253
|
+
|
254
254
|
# Without unicode support, we can't distinguish uppercase and lowercase
|
255
255
|
# unicode characters reliably. So we only test the basic text, not tag names.
|
256
256
|
def test_basic_unicode_smart_text
|
@@ -272,11 +272,8 @@ p
|
|
272
272
|
assert_html result, source
|
273
273
|
end
|
274
274
|
|
275
|
-
|
276
|
-
|
277
|
-
def test_unicode_smart_text
|
278
|
-
|
279
|
-
source = %q{
|
275
|
+
def test_unicode_smart_text
|
276
|
+
source = %q{
|
280
277
|
p
|
281
278
|
是
|
282
279
|
čip
|
@@ -294,7 +291,6 @@ p
|
|
294
291
|
šíp
|
295
292
|
<div class="řek">.</div></p>}
|
296
293
|
|
297
|
-
|
298
|
-
end
|
294
|
+
assert_html result, source
|
299
295
|
end
|
300
296
|
end
|