markaby 0.7.0 → 0.8.0
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 +19 -3
- data/CHANGELOG.rdoc +4 -0
- data/Gemfile +8 -0
- data/Gemfile.lock +22 -0
- data/Markaby.gemspec +20 -118
- data/README.rdoc +20 -96
- data/Rakefile +20 -50
- data/VERSION +1 -1
- data/lib/markaby/builder.rb +25 -4
- data/lib/markaby/builder_tags.rb +22 -2
- data/lib/markaby/kernel_method.rb +1 -0
- data/lib/markaby/tags.rb +97 -1
- data/lib/markaby/version.rb +3 -0
- data/lib/markaby.rb +2 -6
- data/spec/markaby/css_proxy_spec.rb +12 -17
- data/spec/markaby/html5_spec.rb +100 -0
- data/spec/markaby/markaby_spec.rb +10 -69
- data/spec/markaby/markaby_test_unit_spec.rb +251 -0
- data/spec/spec_helper.rb +4 -6
- metadata +85 -124
- data/garlic.rb +0 -29
- data/init.rb +0 -6
- data/lib/markaby/rails/current.rb +0 -85
- data/lib/markaby/rails/deprecated.rb +0 -124
- data/lib/markaby/rails/rails_builder.rb +0 -74
- data/lib/markaby/rails.rb +0 -75
- data/lib/markaby/sinatra.rb +0 -18
- data/lib/markaby/tilt.rb +0 -42
- data/spec/markaby/markaby_other_static.mab +0 -1
- data/spec/markaby/rails/spec_helper.rb +0 -29
- data/spec/markaby/rails/views/layouts/layout.mab +0 -11
- data/spec/markaby/rails/views/markaby/_a_partial.mab +0 -3
- data/spec/markaby/rails/views/markaby/_partial_child_with_locals.mab +0 -1
- data/spec/markaby/rails/views/markaby/access_to_helpers.mab +0 -1
- data/spec/markaby/rails/views/markaby/broken.mab +0 -7
- data/spec/markaby/rails/views/markaby/commented_out_template.mab +0 -1
- data/spec/markaby/rails/views/markaby/correct_template_values.mab +0 -5
- data/spec/markaby/rails/views/markaby/double_output.mab +0 -8
- data/spec/markaby/rails/views/markaby/form_for.mab +0 -2
- data/spec/markaby/rails/views/markaby/form_for_with_fields.mab +0 -3
- data/spec/markaby/rails/views/markaby/form_for_with_multiple_fields.mab +0 -4
- data/spec/markaby/rails/views/markaby/no_values_passed.mab +0 -3
- data/spec/markaby/rails/views/markaby/partial_parent.mab +0 -1
- data/spec/markaby/rails/views/markaby/partial_parent_with_locals.mab +0 -7
- data/spec/markaby/rails/views/markaby/render_erb_without_explicit_render_call.erb +0 -1
- data/spec/markaby/rails/views/markaby/render_explicit_but_empty_markaby_layout.mab +0 -0
- data/spec/markaby/rails/views/markaby/render_mab_without_explicit_render_call.mab +0 -3
- data/spec/markaby/rails/views/markaby/render_with_ivar.mab +0 -3
- data/spec/markaby/rails/views/markaby/renders_erb.rhtml +0 -1
- data/spec/markaby/rails/views/markaby/routes.mab +0 -1
- data/spec/markaby/rails/views/markaby/yielding.mab +0 -3
- data/spec/markaby/rails/views/markaby/yielding_content_for_with_block_helper.mab +0 -5
- data/spec/markaby/rails/views/markaby/yielding_two.mab +0 -7
- data/spec/markaby/rails/views/markaby/yielding_with_content_for.mab +0 -3
- data/spec/markaby/rails_spec.rb +0 -361
- data/spec/markaby/rails_version_spec.rb +0 -37
- data/spec/markaby/sinatra/app.rb +0 -49
- data/spec/markaby/sinatra/sinatra_spec.rb +0 -64
- data/spec/markaby/sinatra/views/helpers.mab +0 -1
- data/spec/markaby/sinatra/views/layout.mab +0 -7
- data/spec/markaby/sinatra/views/markaby_template.mab +0 -0
- data/spec/markaby/sinatra/views/scope_instance_variables.mab +0 -3
- data/spec/markaby/sinatra/views/simple_html.mab +0 -4
- data/spec/markaby/sinatra/views/variables.mab +0 -3
- data/spec/markaby/tilt/erb.erb +0 -1
- data/spec/markaby/tilt/locals.mab +0 -1
- data/spec/markaby/tilt/markaby.mab +0 -1
- data/spec/markaby/tilt/markaby_other_static.mab +0 -1
- data/spec/markaby/tilt/render_twice.mab +0 -1
- data/spec/markaby/tilt/scope.mab +0 -1
- data/spec/markaby/tilt/yielding.mab +0 -2
- data/spec/markaby/tilt_spec.rb +0 -75
- /data/{spec/spec.opts → .rspec} +0 -0
data/lib/markaby/tags.rb
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
module Markaby
|
|
2
2
|
FORM_TAGS = [ :form, :input, :select, :textarea ]
|
|
3
|
-
SELF_CLOSING_TAGS = [
|
|
3
|
+
SELF_CLOSING_TAGS = [:area, :base, :br, :col, :command, :embed, :frame, :hr,
|
|
4
|
+
:img, :input, :keygen, :link, :meta, :param, :source,
|
|
5
|
+
:track, :wbr]
|
|
4
6
|
|
|
5
7
|
# Common sets of attributes.
|
|
6
8
|
AttrCore = [:id, :class, :style, :title]
|
|
@@ -20,6 +22,13 @@ module Markaby
|
|
|
20
22
|
AttrVAlign = [:valign]
|
|
21
23
|
Attrs = AttrCore + AttrI18n + AttrEvents
|
|
22
24
|
|
|
25
|
+
AttrsBoolean = [
|
|
26
|
+
:checked, :disabled, :multiple, :readonly, :selected, # standard forms
|
|
27
|
+
:autofocus, :required, :novalidate, :formnovalidate, # HTML5 forms
|
|
28
|
+
:defer, :ismap, # <script defer>, <img ismap>
|
|
29
|
+
:compact, :declare, :noresize, :noshade, :nowrap # deprecated or unused
|
|
30
|
+
]
|
|
31
|
+
|
|
23
32
|
# All the tags and attributes from XHTML 1.0 Strict
|
|
24
33
|
class XHTMLStrict
|
|
25
34
|
class << self
|
|
@@ -190,4 +199,91 @@ module Markaby
|
|
|
190
199
|
@forms = @tags & FORM_TAGS
|
|
191
200
|
@self_closing = @tags & SELF_CLOSING_TAGS
|
|
192
201
|
end
|
|
202
|
+
|
|
203
|
+
class HTML5
|
|
204
|
+
class << self
|
|
205
|
+
attr_accessor :tags, :tagset, :forms, :self_closing, :doctype
|
|
206
|
+
end
|
|
207
|
+
|
|
208
|
+
@doctype = ['html']
|
|
209
|
+
@tagset = XHTMLTransitional.tagset.merge({
|
|
210
|
+
:abbr => Attrs,
|
|
211
|
+
:article => Attrs,
|
|
212
|
+
:aside => Attrs,
|
|
213
|
+
:audio => Attrs,
|
|
214
|
+
:bdi => Attrs,
|
|
215
|
+
:canvas => Attrs,
|
|
216
|
+
:command => Attrs,
|
|
217
|
+
:datalist => Attrs,
|
|
218
|
+
:details => Attrs,
|
|
219
|
+
:embed => Attrs,
|
|
220
|
+
:figure => Attrs,
|
|
221
|
+
:figcaption => Attrs,
|
|
222
|
+
:footer => Attrs,
|
|
223
|
+
:header => Attrs,
|
|
224
|
+
:hgroup => Attrs,
|
|
225
|
+
:keygen => Attrs,
|
|
226
|
+
:mark => Attrs,
|
|
227
|
+
:menu => Attrs,
|
|
228
|
+
:meter => Attrs,
|
|
229
|
+
:nav => Attrs,
|
|
230
|
+
:output => Attrs,
|
|
231
|
+
:progress => Attrs,
|
|
232
|
+
:rp => Attrs,
|
|
233
|
+
:rt => Attrs,
|
|
234
|
+
:ruby => Attrs,
|
|
235
|
+
:section => Attrs,
|
|
236
|
+
:source => Attrs,
|
|
237
|
+
:time => Attrs,
|
|
238
|
+
:track => Attrs,
|
|
239
|
+
:video => Attrs,
|
|
240
|
+
:wbr => Attrs
|
|
241
|
+
})
|
|
242
|
+
|
|
243
|
+
# Additional attributes found in HTML5
|
|
244
|
+
additional_tags = {
|
|
245
|
+
:a => [:media, :download, :ping],
|
|
246
|
+
:area => [:media, :download, :ping, :hreflang, :rel, :type],
|
|
247
|
+
:base => [:target],
|
|
248
|
+
:button => [:autofocus, :form, :formaction, :formenctype, :formmethod,
|
|
249
|
+
:formnovalidate, :formtarget],
|
|
250
|
+
:fieldset => [:form, :disabled, :name],
|
|
251
|
+
:form => [:novalidate],
|
|
252
|
+
:label => [:form],
|
|
253
|
+
:html => [:manifest],
|
|
254
|
+
:iframe => [:sandbox, :seamless, :srcdoc],
|
|
255
|
+
:img => [:crossorigin],
|
|
256
|
+
:input => [:autofocus, :placeholder, :form, :required, :autocomplete,
|
|
257
|
+
:min, :max, :multiple, :pattern, :step, :list, :width, :height,
|
|
258
|
+
:dirname, :formaction, :formenctype, :formmethod,
|
|
259
|
+
:formnovalidate, :formtarget],
|
|
260
|
+
:link => [:sizes],
|
|
261
|
+
:meta => [:charset],
|
|
262
|
+
:menu => [:type, :label],
|
|
263
|
+
:object => [:form],
|
|
264
|
+
:ol => [:reversed],
|
|
265
|
+
:object => [:typemustmatch],
|
|
266
|
+
:output => [:form],
|
|
267
|
+
:script => [:async],
|
|
268
|
+
:select => [:autofocus, :form, :required],
|
|
269
|
+
:style => [:scoped],
|
|
270
|
+
:textarea => [:autofocus, :placeholder, :form, :required, :dirname,
|
|
271
|
+
:maxlength, :wrap],
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
AttrsHTML5 = [:contenteditable, :contextmentu, :draggable, :dropzone,
|
|
275
|
+
:hidden, :role, :spellcheck, :translate]
|
|
276
|
+
|
|
277
|
+
additional_tags.each do |k, v|
|
|
278
|
+
@tagset[k] += v
|
|
279
|
+
end
|
|
280
|
+
|
|
281
|
+
@tagset.each do |k, v|
|
|
282
|
+
@tagset[k] += AttrsHTML5
|
|
283
|
+
end
|
|
284
|
+
|
|
285
|
+
@tags = @tagset.keys
|
|
286
|
+
@forms = @tags & FORM_TAGS
|
|
287
|
+
@self_closing = @tags & SELF_CLOSING_TAGS
|
|
288
|
+
end
|
|
193
289
|
end
|
data/lib/markaby.rb
CHANGED
|
@@ -16,15 +16,11 @@ $:.unshift File.expand_path(File.dirname(__FILE__))
|
|
|
16
16
|
# * Markaby::MetAid: metaprogramming helper methods.
|
|
17
17
|
# * Markaby::Tags: lists the roles of various XHTML tags to help Builder
|
|
18
18
|
# use these tags as they are intended.
|
|
19
|
-
# * Markaby::Template: a class for hooking Markaby into Rails as a
|
|
20
|
-
# proper templating language.
|
|
21
19
|
module Markaby
|
|
22
|
-
|
|
23
|
-
VERSION = File.read(version_file).strip
|
|
24
|
-
|
|
25
|
-
class InvalidXhtmlError < Exception; end
|
|
20
|
+
class InvalidXhtmlError < StandardError; end
|
|
26
21
|
end
|
|
27
22
|
|
|
23
|
+
require "markaby/version"
|
|
28
24
|
require 'builder' unless defined?(Builder)
|
|
29
25
|
require 'markaby/builder'
|
|
30
26
|
require 'markaby/cssproxy'
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
require File.expand_path(File.dirname(__FILE__) + "/../spec_helper")
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
describe Markaby::CssProxy do
|
|
4
4
|
it "should have method_missing as private" do
|
|
5
5
|
methods = Markaby::CssProxy.private_instance_methods.dup
|
|
6
6
|
methods.map! { |m| m.to_sym }
|
|
@@ -14,34 +14,29 @@ class CssProxyTest < Test::Unit::TestCase
|
|
|
14
14
|
end.new
|
|
15
15
|
end
|
|
16
16
|
|
|
17
|
-
|
|
17
|
+
it "responds_to_everything" do
|
|
18
18
|
proxy = Markaby::CssProxy.new(mock_builder, 'stream', :sym)
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
assert proxy.respond_to?(:foobarbazasdfasdfadfs)
|
|
19
|
+
proxy.respond_to?(:any_method).should be_true
|
|
20
|
+
proxy.respond_to?(:foobarbazasdfasdfadfs).should be_true
|
|
22
21
|
end
|
|
23
22
|
|
|
24
|
-
|
|
23
|
+
it "does_not_respond_to_method_missing" do
|
|
25
24
|
proxy = Markaby::CssProxy.new(mock_builder, 'stream', :sym)
|
|
26
|
-
|
|
27
|
-
assert !proxy.respond_to?(:method_missing)
|
|
25
|
+
proxy.should_not respond_to(:method_missing)
|
|
28
26
|
end
|
|
29
27
|
|
|
30
|
-
|
|
28
|
+
it "does_respond_to_private_instance_methods_with_private_flag_set_to_true" do
|
|
31
29
|
proxy = Markaby::CssProxy.new(mock_builder, 'stream', :sym)
|
|
32
|
-
|
|
33
|
-
assert proxy.respond_to?(:method_missing, true)
|
|
30
|
+
proxy.respond_to?(:method_missing, true).should be_true
|
|
34
31
|
end
|
|
35
32
|
|
|
36
|
-
|
|
33
|
+
it "does_not_respond_to_private_instance_methods_with_private_flag_set_to_false" do
|
|
37
34
|
proxy = Markaby::CssProxy.new(mock_builder, 'stream', :sym)
|
|
38
|
-
|
|
39
|
-
assert !proxy.respond_to?(:method_missing, false)
|
|
35
|
+
proxy.respond_to?(:method_missing, false).should be_false
|
|
40
36
|
end
|
|
41
37
|
|
|
42
|
-
|
|
38
|
+
it "respond_to_should_always_return_boolean" do
|
|
43
39
|
proxy = Markaby::CssProxy.new(mock_builder, 'stream', :sym)
|
|
44
|
-
|
|
45
|
-
assert_equal proxy.respond_to?(:method_missing, :a_value), true
|
|
40
|
+
proxy.respond_to?(:method_missing, :a_value).should be_true
|
|
46
41
|
end
|
|
47
42
|
end
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + "/../spec_helper")
|
|
2
|
+
|
|
3
|
+
describe Markaby do
|
|
4
|
+
it "should insert an html5 doctype" do
|
|
5
|
+
document = mab { html5 { head { title 'OKay' } } }
|
|
6
|
+
document.should include("<!DOCTYPE html>")
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
it "should not have xmlns in html5 html tag" do
|
|
10
|
+
document = mab { html5 { head { title 'OKay' } } }
|
|
11
|
+
document.should_not include("xmlns")
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
it "should make html5-specific tags" do
|
|
15
|
+
document = mab { html5 { tag! :header } }
|
|
16
|
+
document.should include("header")
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
it "should accept html5-specific tag as a block" do
|
|
20
|
+
document = mab { html5 { header { h1 "Wow" } } }
|
|
21
|
+
document.should include("<header><h1>Wow</h1></header>")
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
it "should make html5-specific tags in partials" do
|
|
25
|
+
document = mab { html5 { header { h1 "Wow" } } }
|
|
26
|
+
document.should include("<header><h1>Wow</h1></header>")
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
it "should put correct xhtml charset meta" do
|
|
30
|
+
document = mab { xhtml_strict { head { title 'OKay' } } }
|
|
31
|
+
document.should include('<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>')
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
it "should put correct html5 charset meta" do
|
|
35
|
+
document = mab { html5 { head { title 'OKay' } } }
|
|
36
|
+
document.should include('<meta charset="utf-8"/>')
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
it "should add a class to a html5 tag" do
|
|
40
|
+
document = mab { html5 { canvas.big "yo look" } }
|
|
41
|
+
document.should include('<canvas class="big">yo look</canvas>')
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
it "should add an id to a html5 tag" do
|
|
45
|
+
document = mab { html5 { canvas.only! "yo look" } }
|
|
46
|
+
document.should include('<canvas id="only">yo look</canvas>')
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
it "should add a closing slash to self-closing tags in xhtml" do
|
|
50
|
+
document = mab { br }
|
|
51
|
+
document.should include('<br/>')
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
it "should not add a closing slash to self-closing tags in html5" do
|
|
55
|
+
pending do
|
|
56
|
+
document = mab { html5 { br } }
|
|
57
|
+
document.should include('<br>')
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
it "should close empty non-self-closing tags in html5" do
|
|
62
|
+
pending do
|
|
63
|
+
document = mab { html5 { header } }
|
|
64
|
+
document.should include("<header></header>")
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
it "should not allow fake attributes" do
|
|
69
|
+
expect {
|
|
70
|
+
mab do
|
|
71
|
+
html5 do
|
|
72
|
+
input "something", :fake => "fake", :foo => "bar"
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
}.to raise_error
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
it "should allow new attributes" do
|
|
79
|
+
expect {
|
|
80
|
+
mab do
|
|
81
|
+
html5 do
|
|
82
|
+
input "something", :placeholder => "placeholder"
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
}.not_to raise_error
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
it "should allow a placeholder on an input" do
|
|
89
|
+
doc = mab do
|
|
90
|
+
html5 do
|
|
91
|
+
input :type => "text",
|
|
92
|
+
:name => "foo",
|
|
93
|
+
:value => "bar",
|
|
94
|
+
:placeholder => "something"
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
doc.should == "<!DOCTYPE html><html><input type=\"text\" name=\"foo\" value=\"bar\" placeholder=\"something\"/></html>"
|
|
99
|
+
end
|
|
100
|
+
end
|
|
@@ -1,78 +1,12 @@
|
|
|
1
1
|
require File.expand_path(File.dirname(__FILE__) + "/../spec_helper")
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
def teardown
|
|
5
|
-
Markaby::Builder.restore_defaults!
|
|
6
|
-
end
|
|
7
|
-
|
|
8
|
-
def test_simple
|
|
9
|
-
assert_equal "<hr/>", mab { hr }
|
|
10
|
-
assert_equal "<hr/><br/>", mab { hr; br }
|
|
11
|
-
assert_equal "<p>foo</p>", mab { p 'foo' }
|
|
12
|
-
assert_equal "<p>foo</p>", mab { p { 'foo' } }
|
|
13
|
-
end
|
|
14
|
-
|
|
15
|
-
def test_classes_and_ids
|
|
16
|
-
assert_equal %{<div class="one"></div>}, mab { div.one '' }
|
|
17
|
-
assert_equal %{<div class="one two"></div>}, mab { div.one.two '' }
|
|
18
|
-
assert_equal %{<div id="three"></div>}, mab { div.three! '' }
|
|
19
|
-
assert_equal %{<hr class="hidden"/>}, mab { hr.hidden }
|
|
20
|
-
|
|
21
|
-
out = mab { input.foo :id => 'bar' }
|
|
22
|
-
out.should match("<input.*class=\"foo\".*/>")
|
|
23
|
-
out.should match("<input.*name=\"bar\".*/>")
|
|
24
|
-
end
|
|
25
|
-
|
|
26
|
-
def test_escaping
|
|
27
|
-
assert_equal "<h1>Apples & Oranges</h1>", mab { h1 'Apples & Oranges' }
|
|
28
|
-
assert_equal "<h1>Apples & Oranges</h1>", mab { h1 { 'Apples & Oranges' } }
|
|
29
|
-
assert_equal "<h1 class=\"fruits&floots\">Apples</h1>", mab { h1 'Apples', :class => 'fruits&floots' }
|
|
30
|
-
end
|
|
31
|
-
|
|
32
|
-
def test_capture
|
|
33
|
-
builder = Markaby::Builder.new
|
|
34
|
-
assert builder.to_s.empty?
|
|
35
|
-
assert_equal "<h1>TEST</h1>", builder.capture { h1 'TEST' }
|
|
36
|
-
assert builder.to_s.empty?
|
|
37
|
-
assert mab { capture { h1 'hello world' }; nil }.empty?
|
|
38
|
-
assert_equal mab { div { h1 'TEST' } }, mab { div { capture { h1 'TEST' } } }
|
|
39
|
-
end
|
|
40
|
-
|
|
41
|
-
def test_ivars
|
|
42
|
-
html = "<div><h1>Steve</h1><div><h2>Gerald</h2></div><h3>Gerald</h3></div>"
|
|
43
|
-
assert_equal html, mab { div { @name = 'Steve'; h1 @name; div { @name = 'Gerald'; h2 @name }; h3 @name } }
|
|
44
|
-
assert_equal html, mab { div { @name = 'Steve'; h1 @name; self << capture { div { @name = 'Gerald'; h2 @name } }; h3 @name } }
|
|
45
|
-
assert_equal html, mab(:name => 'Steve') { div { h1 @name; self << capture { div { @name = 'Gerald'; h2 @name } }; h3 @name } }
|
|
46
|
-
end
|
|
47
|
-
|
|
48
|
-
def test_ivars_without_at_symbol
|
|
49
|
-
assert_equal "<h1>Hello World</h1>", mab { @message = 'Hello World'; h1 message }
|
|
50
|
-
end
|
|
51
|
-
|
|
52
|
-
def spec_helpers
|
|
53
|
-
Markaby::Builder.ignored_helpers.clear
|
|
54
|
-
assert_equal %{squirrels}, mab({}, MarkabyTestHelpers) { pluralize('squirrel') }
|
|
55
|
-
assert_equal %{<a href="">edit</a>}, mab({}, MarkabyTestHelpers) { link_to('edit') }
|
|
56
|
-
assert mab({}, MarkabyTestHelpers) { @output_helpers = false; link_to('edit'); nil }.empty?
|
|
57
|
-
Markaby::Builder.ignore_helpers :pluralize
|
|
58
|
-
assert_exception(NoMethodError, "undefined method `pluralize'", {}, MarkabyTestHelpers) { pluralize('squirrel') }
|
|
59
|
-
end
|
|
60
|
-
|
|
61
|
-
def test_uses_helper_instance_variable
|
|
62
|
-
helper = Module.new do
|
|
63
|
-
@some_ivar = :ivar_value
|
|
64
|
-
end
|
|
65
|
-
|
|
66
|
-
builder = Markaby::Builder.new({}, helper)
|
|
67
|
-
assert_equal :ivar_value, builder.some_ivar
|
|
68
|
-
end
|
|
69
|
-
|
|
3
|
+
describe Markaby do
|
|
70
4
|
it "can assign helpers after instantiation" do
|
|
71
|
-
helper =
|
|
5
|
+
helper = double 'helper', :foo => :bar
|
|
72
6
|
|
|
73
7
|
builder = Markaby::Builder.new
|
|
74
8
|
builder.helper = helper
|
|
75
|
-
|
|
9
|
+
builder.foo.should == :bar
|
|
76
10
|
end
|
|
77
11
|
|
|
78
12
|
it "should be able to set a local" do
|
|
@@ -240,4 +174,11 @@ class MarkabyTest < Test::Unit::TestCase
|
|
|
240
174
|
builder = Markaby::Builder.new({}, klass.new)
|
|
241
175
|
builder.capture { @hello }.should == "hello there"
|
|
242
176
|
end
|
|
177
|
+
|
|
178
|
+
describe Markaby::InvalidXhtmlError do
|
|
179
|
+
it "should inherit from StandardError" do
|
|
180
|
+
Markaby::InvalidXhtmlError.superclass.should == StandardError
|
|
181
|
+
end
|
|
182
|
+
end
|
|
243
183
|
end
|
|
184
|
+
|
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + "/../spec_helper")
|
|
2
|
+
|
|
3
|
+
class MarkabyTest < Test::Unit::TestCase
|
|
4
|
+
def teardown
|
|
5
|
+
Markaby::Builder.restore_defaults!
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def test_simple
|
|
9
|
+
assert_equal "<hr/>", mab { hr }
|
|
10
|
+
assert_equal "<hr/><br/>", mab { hr; br }
|
|
11
|
+
assert_equal "<p>foo</p>", mab { p 'foo' }
|
|
12
|
+
assert_equal "<p>foo</p>", mab { p { 'foo' } }
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def test_classes_and_ids
|
|
16
|
+
assert_equal %{<div class="one"></div>}, mab { div.one '' }
|
|
17
|
+
assert_equal %{<div class="one two"></div>}, mab { div.one.two '' }
|
|
18
|
+
assert_equal %{<div id="three"></div>}, mab { div.three! '' }
|
|
19
|
+
assert_equal %{<hr class="hidden"/>}, mab { hr.hidden }
|
|
20
|
+
|
|
21
|
+
out = mab { input.foo :id => 'bar' }
|
|
22
|
+
out.should match("<input.*class=\"foo\".*/>")
|
|
23
|
+
out.should match("<input.*name=\"bar\".*/>")
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def test_escaping
|
|
27
|
+
assert_equal "<h1>Apples & Oranges</h1>", mab { h1 'Apples & Oranges' }
|
|
28
|
+
assert_equal "<h1>Apples & Oranges</h1>", mab { h1 { 'Apples & Oranges' } }
|
|
29
|
+
assert_equal "<h1 class=\"fruits&floots\">Apples</h1>", mab { h1 'Apples', :class => 'fruits&floots' }
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def test_capture
|
|
33
|
+
builder = Markaby::Builder.new
|
|
34
|
+
assert builder.to_s.empty?
|
|
35
|
+
assert_equal "<h1>TEST</h1>", builder.capture { h1 'TEST' }
|
|
36
|
+
assert builder.to_s.empty?
|
|
37
|
+
assert mab { capture { h1 'hello world' }; nil }.empty?
|
|
38
|
+
assert_equal mab { div { h1 'TEST' } }, mab { div { capture { h1 'TEST' } } }
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def test_ivars
|
|
42
|
+
html = "<div><h1>Steve</h1><div><h2>Gerald</h2></div><h3>Gerald</h3></div>"
|
|
43
|
+
assert_equal html, mab { div { @name = 'Steve'; h1 @name; div { @name = 'Gerald'; h2 @name }; h3 @name } }
|
|
44
|
+
assert_equal html, mab { div { @name = 'Steve'; h1 @name; self << capture { div { @name = 'Gerald'; h2 @name } }; h3 @name } }
|
|
45
|
+
assert_equal html, mab(:name => 'Steve') { div { h1 @name; self << capture { div { @name = 'Gerald'; h2 @name } }; h3 @name } }
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def test_ivars_without_at_symbol
|
|
49
|
+
assert_equal "<h1>Hello World</h1>", mab { @message = 'Hello World'; h1 message }
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def spec_helpers
|
|
53
|
+
Markaby::Builder.ignored_helpers.clear
|
|
54
|
+
assert_equal %{squirrels}, mab({}, MarkabyTestHelpers) { pluralize('squirrel') }
|
|
55
|
+
assert_equal %{<a href="">edit</a>}, mab({}, MarkabyTestHelpers) { link_to('edit') }
|
|
56
|
+
assert mab({}, MarkabyTestHelpers) { @output_helpers = false; link_to('edit'); nil }.empty?
|
|
57
|
+
Markaby::Builder.ignore_helpers :pluralize
|
|
58
|
+
assert_exception(NoMethodError, "undefined method `pluralize'", {}, MarkabyTestHelpers) { pluralize('squirrel') }
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def test_uses_helper_instance_variable
|
|
62
|
+
helper = Module.new do
|
|
63
|
+
@some_ivar = :ivar_value
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
builder = Markaby::Builder.new({}, helper)
|
|
67
|
+
assert_equal :ivar_value, builder.some_ivar
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
describe Markaby do
|
|
72
|
+
it "can assign helpers after instantiation" do
|
|
73
|
+
helper = double 'helper', :foo => :bar
|
|
74
|
+
|
|
75
|
+
builder = Markaby::Builder.new
|
|
76
|
+
builder.helper = helper
|
|
77
|
+
builder.foo.should == :bar
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
it "should be able to set a local" do
|
|
81
|
+
builder = Markaby::Builder.new
|
|
82
|
+
builder.locals = { :foo => "bar" }
|
|
83
|
+
builder.foo.should == "bar"
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
it "should be able to set a different local value" do
|
|
87
|
+
builder = Markaby::Builder.new
|
|
88
|
+
builder.locals = { :foo => "baz" }
|
|
89
|
+
builder.foo.should == "baz"
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
it "should assign the correct key" do
|
|
93
|
+
builder = Markaby::Builder.new
|
|
94
|
+
builder.locals = { :key => :value }
|
|
95
|
+
builder.key.should == :value
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
it "should be able to assign multiple locals" do
|
|
99
|
+
builder = Markaby::Builder.new
|
|
100
|
+
|
|
101
|
+
builder.locals = { :one => "two", :three => "four" }
|
|
102
|
+
|
|
103
|
+
builder.one.should == "two"
|
|
104
|
+
builder.three.should == "four"
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
def test_builder_bang_methods
|
|
108
|
+
assert_equal "<?xml version=\"1.0\" encoding=\"UTF-8\"?>", mab { instruct! }
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
it "should be able to produce the correct html from a fragment" do
|
|
112
|
+
str = ""
|
|
113
|
+
str += "<div>"
|
|
114
|
+
str += "<h1>Monkeys</h1>"
|
|
115
|
+
str += "<h2>Giraffes <small>Miniature</small> and <strong>Large</strong></h2>"
|
|
116
|
+
str += "<h3>Donkeys</h3>"
|
|
117
|
+
str += "<h4>Parakeet <b><i>Innocent IV</i></b> in Classic Chartreuse</h4>"
|
|
118
|
+
str += "</div>"
|
|
119
|
+
|
|
120
|
+
generated = mab {
|
|
121
|
+
div {
|
|
122
|
+
h1 "Monkeys"
|
|
123
|
+
h2 {
|
|
124
|
+
"Giraffes #{small('Miniature')} and #{strong 'Large'}"
|
|
125
|
+
}
|
|
126
|
+
h3 "Donkeys"
|
|
127
|
+
h4 { "Parakeet #{b { i 'Innocent IV' }} in Classic Chartreuse" }
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
generated.should == str
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
def test_fragments
|
|
135
|
+
assert_equal %{<div><h1>Monkeys</h1><h2>Giraffes <strong>Miniature</strong></h2><h3>Donkeys</h3></div>},
|
|
136
|
+
mab { div { h1 "Monkeys"; h2 { "Giraffes #{strong 'Miniature' }" }; h3 "Donkeys" } }
|
|
137
|
+
|
|
138
|
+
assert_equal %{<div><h1>Monkeys</h1><h2>Giraffes <small>Miniature</small> and <strong>Large</strong></h2><h3>Donkeys</h3><h4>Parakeet <strong>Large</strong> as well...</h4></div>},
|
|
139
|
+
mab { div { @a = small 'Miniature'; @b = strong 'Large'; h1 "Monkeys"; h2 { "Giraffes #{@a} and #{@b}" }; h3 "Donkeys"; h4 { "Parakeet #{@b} as well..." } } }
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
def test_invalid_xhtml
|
|
143
|
+
assert_exception(NoMethodError, "undefined method `dav'") { dav {} }
|
|
144
|
+
assert_exception(Markaby::InvalidXhtmlError, "no attribute `styl' on div elements") { div(:styl => 'ok') {} }
|
|
145
|
+
assert_exception(Markaby::InvalidXhtmlError, "no attribute `class' on tbody elements") { tbody.okay {} }
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
def test_full_doc_transitional
|
|
149
|
+
doc = mab { xhtml_transitional { head { title 'OKay' } } }
|
|
150
|
+
assert doc =~ /^<\?xml version="1.0" encoding="UTF-8"\?>/
|
|
151
|
+
assert doc.include?(%{"-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">})
|
|
152
|
+
assert doc.include?(%{<title>OKay</title>})
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
def test_full_doc_strict
|
|
156
|
+
doc = mab { xhtml_strict { head { title 'OKay' } } }
|
|
157
|
+
assert doc =~ /^<\?xml version="1.0" encoding="UTF-8"\?>/
|
|
158
|
+
assert doc.include?(%{"-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">})
|
|
159
|
+
assert doc.include?(%{<title>OKay</title>})
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
def test_full_doc_frameset
|
|
163
|
+
doc = mab { xhtml_frameset { head { title 'OKay' } } }
|
|
164
|
+
assert doc =~ /^<\?xml version="1.0" encoding="UTF-8"\?>/
|
|
165
|
+
assert doc.include?(%{"-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">})
|
|
166
|
+
assert doc.include?(%{<title>OKay</title>})
|
|
167
|
+
end
|
|
168
|
+
|
|
169
|
+
def test_root_attributes_can_be_changed
|
|
170
|
+
doc = mab { xhtml_strict(:lang => 'fr') { head { title { 'Salut!' } } } }
|
|
171
|
+
assert doc.include?(%{"-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">})
|
|
172
|
+
assert doc.include?(%{<title>Salut!</title>})
|
|
173
|
+
assert doc.include?(%{ lang="fr"})
|
|
174
|
+
end
|
|
175
|
+
|
|
176
|
+
def version_file
|
|
177
|
+
File.expand_path(File.dirname(__FILE__) + "/../../VERSION")
|
|
178
|
+
end
|
|
179
|
+
|
|
180
|
+
def test_markaby_should_have_correct_version
|
|
181
|
+
assert_equal Markaby::VERSION, File.read(version_file).strip
|
|
182
|
+
end
|
|
183
|
+
|
|
184
|
+
def test_duplicate_usage_of_same_id
|
|
185
|
+
assert_raises Markaby::InvalidXhtmlError do
|
|
186
|
+
mab do
|
|
187
|
+
p.one!
|
|
188
|
+
p.one!
|
|
189
|
+
end
|
|
190
|
+
end
|
|
191
|
+
end
|
|
192
|
+
|
|
193
|
+
# auto validation
|
|
194
|
+
|
|
195
|
+
def test_tagging_with_invalid_tag_should_raise_error
|
|
196
|
+
assert_raises Markaby::InvalidXhtmlError do
|
|
197
|
+
mab do
|
|
198
|
+
tag! :an_invalid_tag
|
|
199
|
+
end
|
|
200
|
+
end
|
|
201
|
+
end
|
|
202
|
+
|
|
203
|
+
def test_self_closing_html_tag_with_block_throws_errors
|
|
204
|
+
assert_raises Markaby::InvalidXhtmlError do
|
|
205
|
+
mab do
|
|
206
|
+
html_tag :img do
|
|
207
|
+
end
|
|
208
|
+
end
|
|
209
|
+
end
|
|
210
|
+
end
|
|
211
|
+
|
|
212
|
+
def test_local_assigning
|
|
213
|
+
builder = Markaby::Builder.new(:variable => :a_value)
|
|
214
|
+
|
|
215
|
+
assert_equal :a_value, builder.variable
|
|
216
|
+
end
|
|
217
|
+
|
|
218
|
+
def test_local_assignment_with_strings
|
|
219
|
+
builder = Markaby::Builder.new("variable" => :a_value)
|
|
220
|
+
assert_equal :a_value, builder.variable
|
|
221
|
+
end
|
|
222
|
+
|
|
223
|
+
def test_local_assignment_prefers_symbols_to_strings
|
|
224
|
+
builder = Markaby::Builder.new("variable" => "string_value", :variable => :symbol_value)
|
|
225
|
+
assert_equal :symbol_value, builder.variable
|
|
226
|
+
end
|
|
227
|
+
|
|
228
|
+
def test_method_missing_should_call_tag_if_no_tagset_present
|
|
229
|
+
Markaby::Builder.set(:tagset, nil)
|
|
230
|
+
|
|
231
|
+
builder = Markaby::Builder.new
|
|
232
|
+
builder.something.should == "<something/>"
|
|
233
|
+
end
|
|
234
|
+
|
|
235
|
+
it "should copy instance variables from a helper object" do
|
|
236
|
+
klass = Class.new do
|
|
237
|
+
def initialize
|
|
238
|
+
@hello = "hello there"
|
|
239
|
+
end
|
|
240
|
+
end
|
|
241
|
+
|
|
242
|
+
builder = Markaby::Builder.new({}, klass.new)
|
|
243
|
+
builder.capture { @hello }.should == "hello there"
|
|
244
|
+
end
|
|
245
|
+
|
|
246
|
+
describe Markaby::InvalidXhtmlError do
|
|
247
|
+
it "should inherit from StandardError" do
|
|
248
|
+
Markaby::InvalidXhtmlError.superclass.should == StandardError
|
|
249
|
+
end
|
|
250
|
+
end
|
|
251
|
+
end
|
data/spec/spec_helper.rb
CHANGED
|
@@ -1,15 +1,10 @@
|
|
|
1
1
|
require 'test/unit'
|
|
2
|
-
require '
|
|
3
|
-
require 'spec/interop/test'
|
|
2
|
+
require 'rspec'
|
|
4
3
|
|
|
5
4
|
$:.unshift File.expand_path(File.join(File.dirname(__FILE__), '..', 'lib'))
|
|
6
5
|
|
|
7
6
|
require 'markaby'
|
|
8
7
|
require 'markaby/kernel_method'
|
|
9
|
-
require 'markaby/rails'
|
|
10
|
-
|
|
11
|
-
require 'markaby/sinatra'
|
|
12
|
-
require 'erb'
|
|
13
8
|
|
|
14
9
|
module MarkabyTestHelpers
|
|
15
10
|
def link_to(obj)
|
|
@@ -36,6 +31,9 @@ module Test
|
|
|
36
31
|
module Unit
|
|
37
32
|
class TestCase
|
|
38
33
|
include TestHelpers
|
|
34
|
+
def self.it(name, &blk)
|
|
35
|
+
define_method("test_#{name}", &blk)
|
|
36
|
+
end
|
|
39
37
|
end
|
|
40
38
|
end
|
|
41
39
|
end
|