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.
Files changed (73) hide show
  1. data/.gitignore +19 -3
  2. data/CHANGELOG.rdoc +4 -0
  3. data/Gemfile +8 -0
  4. data/Gemfile.lock +22 -0
  5. data/Markaby.gemspec +20 -118
  6. data/README.rdoc +20 -96
  7. data/Rakefile +20 -50
  8. data/VERSION +1 -1
  9. data/lib/markaby/builder.rb +25 -4
  10. data/lib/markaby/builder_tags.rb +22 -2
  11. data/lib/markaby/kernel_method.rb +1 -0
  12. data/lib/markaby/tags.rb +97 -1
  13. data/lib/markaby/version.rb +3 -0
  14. data/lib/markaby.rb +2 -6
  15. data/spec/markaby/css_proxy_spec.rb +12 -17
  16. data/spec/markaby/html5_spec.rb +100 -0
  17. data/spec/markaby/markaby_spec.rb +10 -69
  18. data/spec/markaby/markaby_test_unit_spec.rb +251 -0
  19. data/spec/spec_helper.rb +4 -6
  20. metadata +85 -124
  21. data/garlic.rb +0 -29
  22. data/init.rb +0 -6
  23. data/lib/markaby/rails/current.rb +0 -85
  24. data/lib/markaby/rails/deprecated.rb +0 -124
  25. data/lib/markaby/rails/rails_builder.rb +0 -74
  26. data/lib/markaby/rails.rb +0 -75
  27. data/lib/markaby/sinatra.rb +0 -18
  28. data/lib/markaby/tilt.rb +0 -42
  29. data/spec/markaby/markaby_other_static.mab +0 -1
  30. data/spec/markaby/rails/spec_helper.rb +0 -29
  31. data/spec/markaby/rails/views/layouts/layout.mab +0 -11
  32. data/spec/markaby/rails/views/markaby/_a_partial.mab +0 -3
  33. data/spec/markaby/rails/views/markaby/_partial_child_with_locals.mab +0 -1
  34. data/spec/markaby/rails/views/markaby/access_to_helpers.mab +0 -1
  35. data/spec/markaby/rails/views/markaby/broken.mab +0 -7
  36. data/spec/markaby/rails/views/markaby/commented_out_template.mab +0 -1
  37. data/spec/markaby/rails/views/markaby/correct_template_values.mab +0 -5
  38. data/spec/markaby/rails/views/markaby/double_output.mab +0 -8
  39. data/spec/markaby/rails/views/markaby/form_for.mab +0 -2
  40. data/spec/markaby/rails/views/markaby/form_for_with_fields.mab +0 -3
  41. data/spec/markaby/rails/views/markaby/form_for_with_multiple_fields.mab +0 -4
  42. data/spec/markaby/rails/views/markaby/no_values_passed.mab +0 -3
  43. data/spec/markaby/rails/views/markaby/partial_parent.mab +0 -1
  44. data/spec/markaby/rails/views/markaby/partial_parent_with_locals.mab +0 -7
  45. data/spec/markaby/rails/views/markaby/render_erb_without_explicit_render_call.erb +0 -1
  46. data/spec/markaby/rails/views/markaby/render_explicit_but_empty_markaby_layout.mab +0 -0
  47. data/spec/markaby/rails/views/markaby/render_mab_without_explicit_render_call.mab +0 -3
  48. data/spec/markaby/rails/views/markaby/render_with_ivar.mab +0 -3
  49. data/spec/markaby/rails/views/markaby/renders_erb.rhtml +0 -1
  50. data/spec/markaby/rails/views/markaby/routes.mab +0 -1
  51. data/spec/markaby/rails/views/markaby/yielding.mab +0 -3
  52. data/spec/markaby/rails/views/markaby/yielding_content_for_with_block_helper.mab +0 -5
  53. data/spec/markaby/rails/views/markaby/yielding_two.mab +0 -7
  54. data/spec/markaby/rails/views/markaby/yielding_with_content_for.mab +0 -3
  55. data/spec/markaby/rails_spec.rb +0 -361
  56. data/spec/markaby/rails_version_spec.rb +0 -37
  57. data/spec/markaby/sinatra/app.rb +0 -49
  58. data/spec/markaby/sinatra/sinatra_spec.rb +0 -64
  59. data/spec/markaby/sinatra/views/helpers.mab +0 -1
  60. data/spec/markaby/sinatra/views/layout.mab +0 -7
  61. data/spec/markaby/sinatra/views/markaby_template.mab +0 -0
  62. data/spec/markaby/sinatra/views/scope_instance_variables.mab +0 -3
  63. data/spec/markaby/sinatra/views/simple_html.mab +0 -4
  64. data/spec/markaby/sinatra/views/variables.mab +0 -3
  65. data/spec/markaby/tilt/erb.erb +0 -1
  66. data/spec/markaby/tilt/locals.mab +0 -1
  67. data/spec/markaby/tilt/markaby.mab +0 -1
  68. data/spec/markaby/tilt/markaby_other_static.mab +0 -1
  69. data/spec/markaby/tilt/render_twice.mab +0 -1
  70. data/spec/markaby/tilt/scope.mab +0 -1
  71. data/spec/markaby/tilt/yielding.mab +0 -2
  72. data/spec/markaby/tilt_spec.rb +0 -75
  73. /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 = [ :base, :meta, :link, :hr, :br, :param, :img, :area, :input, :col, :frame ]
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
@@ -0,0 +1,3 @@
1
+ module Markaby
2
+ VERSION = '0.8.0'
3
+ 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
- version_file = File.expand_path(File.dirname(__FILE__) + "/../VERSION")
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
- class CssProxyTest < Test::Unit::TestCase
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
- def test_responds_to_everything
17
+ it "responds_to_everything" do
18
18
  proxy = Markaby::CssProxy.new(mock_builder, 'stream', :sym)
19
-
20
- assert proxy.respond_to?(:any_method)
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
- def test_does_not_respond_to_method_missing
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
- def test_does_respond_to_private_instance_methods_with_private_flag_set_to_true
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
- def test_does_not_respond_to_private_instance_methods_with_private_flag_set_to_false
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
- def test_respond_to_should_always_return_boolean
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
- 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 &amp; Oranges</h1>", mab { h1 'Apples & Oranges' }
28
- assert_equal "<h1>Apples & Oranges</h1>", mab { h1 { 'Apples & Oranges' } }
29
- assert_equal "<h1 class=\"fruits&amp;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 = mock 'helper', :foo => :bar
5
+ helper = double 'helper', :foo => :bar
72
6
 
73
7
  builder = Markaby::Builder.new
74
8
  builder.helper = helper
75
- assert_equal :bar, builder.foo
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 &amp; Oranges</h1>", mab { h1 'Apples & Oranges' }
28
+ assert_equal "<h1>Apples & Oranges</h1>", mab { h1 { 'Apples & Oranges' } }
29
+ assert_equal "<h1 class=\"fruits&amp;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 'spec'
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