joho-Markaby 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,12 @@
1
+ html {
2
+ head {
3
+ title "List 'o Monkeys"
4
+ }
5
+ body {
6
+ ul {
7
+ monkeys.each { |monkey|
8
+ li monkey.name
9
+ }
10
+ }
11
+ }
12
+ }
@@ -0,0 +1,7 @@
1
+ div {
2
+ ul {
3
+ li 'one'
4
+ li 'two'
5
+ li supercalifragilisticexpialidocious
6
+ }
7
+ }
@@ -0,0 +1,9 @@
1
+ unless flash[:message].nil?
2
+ p { flash[:message] }
3
+ end
4
+
5
+ form_tag '/monkeys' do
6
+ div {
7
+ submit_tag 'Save'
8
+ }
9
+ end
@@ -0,0 +1,7 @@
1
+ ul {
2
+ check_ivar_exists :monkeys
3
+
4
+ @monkeys.each { |monkey|
5
+ li monkey.name
6
+ }
7
+ }
@@ -0,0 +1,13 @@
1
+ <html>
2
+ <head>
3
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
4
+ <title>List 'o Monkeys</title>
5
+ </head>
6
+ <body>
7
+ <ul>
8
+ <li>Frank</li>
9
+ <li>Benny</li>
10
+ <li>Paul</li>
11
+ </ul>
12
+ </body>
13
+ </html>
@@ -0,0 +1,7 @@
1
+ module TestHelper
2
+ def check_ivar_exists(name)
3
+ unless instance_variables.include?(ivar_name = "@#{name}")
4
+ raise "#{ivar_name} does not exist"
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,30 @@
1
+ require 'test/unit'
2
+
3
+ MARKABY_ROOT = File.join(File.dirname(__FILE__), '..', '..')
4
+
5
+ require File.join(MARKABY_ROOT,
6
+ '..', # plugins/
7
+ '..', # vendor/
8
+ '..', # RAILS_ROOT
9
+ 'config',
10
+ 'boot'
11
+ )
12
+
13
+ Rails::Initializer.run
14
+
15
+ require 'action_controller/test_process'
16
+
17
+ Dependencies.load_paths.unshift File.dirname(__FILE__)
18
+
19
+ $:.unshift MARKABY_ROOT
20
+
21
+ require 'init'
22
+
23
+ require 'markaby/kernel_method'
24
+
25
+
26
+ class Monkey < Struct.new(:name)
27
+ def self.find(*args)
28
+ @@monkeys ||= ['Frank', 'Benny', 'Paul'].map { |name| Monkey.new name }
29
+ end
30
+ end
@@ -0,0 +1,99 @@
1
+ require File.join(File.dirname(__FILE__), 'rails', 'test_preamble')
2
+
3
+ class MarkabyController < ActionController::Base
4
+
5
+ helper :test
6
+
7
+ @@locals = { :monkeys => Monkey.find(:all) }
8
+
9
+ def rescue_action(e) raise e end;
10
+
11
+ def index
12
+ @monkeys = Monkey.find(:all)
13
+ end
14
+
15
+ def create
16
+ flash[:message] = 'Hello World'
17
+ end
18
+
19
+ def broken
20
+ end
21
+
22
+ def partial_rendering
23
+ render :partial => 'monkeys', :locals => @@locals
24
+ end
25
+
26
+ def partial_rendering_with_stringy_keys_in_local_assigns
27
+ render :partial => 'monkeys', :locals => { 'monkeys' => Monkey.find(:all) }
28
+ end
29
+
30
+ def inline_helper_rendering
31
+ render_markaby(:locals => @@locals) { ul { monkeys.each { |m| li m.name } } }
32
+ end
33
+
34
+ def basic_inline_rendering
35
+ render :inline => mab { ul { Monkey.find(:all).each { |m| li m.name } } }
36
+ end
37
+
38
+ end
39
+
40
+ class MarkabyOnRailsTest < Test::Unit::TestCase
41
+ def setup
42
+ @request = ActionController::TestRequest.new
43
+ @response = ActionController::TestResponse.new
44
+ @controller = MarkabyController.new
45
+ @controller.template_root = File.join(File.dirname(__FILE__), 'rails')
46
+ @expected_monkey_names = '<ul><li>Frank</li><li>Benny</li><li>Paul</li></ul>'
47
+ end
48
+
49
+ def test_index
50
+ process :index
51
+ assert_response :success
52
+ assert_template 'markaby/index'
53
+ assert_equal @expected_monkey_names, @response.body
54
+ end
55
+
56
+ def test_partial_rendering
57
+ Markaby::Builder.set :indent, 2
58
+ process :partial_rendering
59
+ expected_html = File.read(File.join(File.dirname(__FILE__), 'rails', 'monkeys.html'))
60
+ assert_response :success
61
+ assert_template 'markaby/_monkeys'
62
+ assert_equal expected_html, @response.body
63
+
64
+ # From actionpack/lib/action_view/base.rb:
65
+ # String keys are deprecated and will be removed shortly.
66
+ #
67
+ assert_raises ActionView::TemplateError do
68
+ process :partial_rendering_with_stringy_keys_in_local_assigns
69
+ end
70
+ end
71
+
72
+ def test_inline_helper_rendering
73
+ process :inline_helper_rendering
74
+ assert_response :success
75
+ assert_equal @expected_monkey_names, @response.body
76
+ end
77
+
78
+ def test_basic_inline_rendering
79
+ process :basic_inline_rendering
80
+ assert_response :success
81
+ assert_equal @expected_monkey_names, @response.body
82
+ end
83
+
84
+ def test_flash_and_form_tag
85
+ process :create
86
+ assert_response :success
87
+ assert_select 'form div input[type=submit]', 1
88
+ assert_select 'p', 'Hello World'
89
+ end
90
+
91
+ def test_template_error_has_correct_line_number
92
+ begin
93
+ process :broken
94
+ rescue ActionView::TemplateError => error
95
+ assert_equal 5, error.line_number.to_i
96
+ end
97
+ end
98
+
99
+ end
@@ -0,0 +1,126 @@
1
+ require 'test/unit'
2
+
3
+ $:.unshift File.expand_path(File.join(File.dirname(__FILE__), '..', 'lib'))
4
+
5
+ require 'markaby'
6
+ require 'markaby/kernel_method'
7
+
8
+ module MarkabyTestHelpers
9
+ def link_to(obj)
10
+ %{<a href="">#{obj}</a>}
11
+ end
12
+ def pluralize(string)
13
+ string + "s"
14
+ end
15
+ module_function :link_to, :pluralize
16
+ end
17
+
18
+ class MarkabyTest < Test::Unit::TestCase
19
+
20
+ def assert_exception(exclass, exmsg, *mab_args, &block)
21
+ begin
22
+ mab(*mab_args, &block)
23
+ rescue Exception => e
24
+ assert_equal exclass, e.class
25
+ assert_equal exmsg, e.message
26
+ end
27
+ end
28
+
29
+ def test_simple
30
+ assert_equal "<hr/>", mab { hr }
31
+ assert_equal "<hr/><br/>", mab { hr; br }
32
+ assert_equal "<p>foo</p>", mab { p 'foo' }
33
+ assert_equal "<p>foo</p>", mab { p { 'foo' } }
34
+ end
35
+
36
+ def test_classes_and_ids
37
+ assert_equal %{<div class="one"></div>}, mab { div.one '' }
38
+ assert_equal %{<div class="one two"></div>}, mab { div.one.two '' }
39
+ assert_equal %{<div id="three"></div>}, mab { div.three! '' }
40
+ assert_equal %{<hr class="hidden"/>}, mab { hr.hidden }
41
+ assert_equal %{<input class="foo" name="bar" id="bar"/>}, mab { input.foo :id => 'bar' }
42
+ end
43
+
44
+ def test_escaping
45
+ assert_equal "<h1>Apples &amp; Oranges</h1>", mab { h1 'Apples & Oranges' }
46
+ assert_equal "<h1>Apples & Oranges</h1>", mab { h1 { 'Apples & Oranges' } }
47
+ assert_equal "<h1 class=\"fruits&amp;floots\">Apples</h1>", mab { h1 'Apples', :class => 'fruits&floots' }
48
+ end
49
+
50
+ def test_capture
51
+ builder = Markaby::Builder.new
52
+ assert builder.to_s.empty?
53
+ assert_equal "<h1>TEST</h1>", builder.capture { h1 'TEST' }
54
+ assert builder.to_s.empty?
55
+ assert mab { capture { h1 'hello world' }; nil }.empty?
56
+ assert_equal mab { div { h1 'TEST' } }, mab { div { capture { h1 'TEST' } } }
57
+ end
58
+
59
+ def test_ivars
60
+ html = "<div><h1>Steve</h1><div><h2>Gerald</h2></div><h3>Gerald</h3></div>"
61
+ assert_equal html, mab { div { @name = 'Steve'; h1 @name; div { @name = 'Gerald'; h2 @name }; h3 @name } }
62
+ assert_equal html, mab { div { @name = 'Steve'; h1 @name; self << capture { div { @name = 'Gerald'; h2 @name } }; h3 @name } }
63
+ assert_equal html, mab(:name => 'Steve') { div { h1 @name; self << capture { div { @name = 'Gerald'; h2 @name } }; h3 @name } }
64
+ end
65
+
66
+ def test_ivars_without_at_symbol
67
+ assert_equal "<h1>Hello World</h1>", mab { @message = 'Hello World'; h1 message }
68
+ end
69
+
70
+ def test_helpers
71
+ Markaby::Builder.ignored_helpers.clear
72
+ assert_equal %{squirrels}, mab({}, MarkabyTestHelpers) { pluralize('squirrel') }
73
+ assert_equal %{<a href="">edit</a>}, mab({}, MarkabyTestHelpers) { link_to('edit') }
74
+ assert mab({}, MarkabyTestHelpers) { @output_helpers = false; link_to('edit'); nil }.empty?
75
+ Markaby::Builder.ignore_helpers :pluralize
76
+ assert_exception(NoMethodError, "no such method `pluralize'", {}, MarkabyTestHelpers) { pluralize('squirrel') }
77
+ end
78
+
79
+ def test_builder_bang_methods
80
+ assert_equal "<?xml version=\"1.0\" encoding=\"UTF-8\"?>", mab { instruct! }
81
+ end
82
+
83
+ def test_fragments
84
+ assert_equal %{<div><h1>Monkeys</h1><h2>Giraffes <small>Miniature</small> and <strong>Large</strong></h2><h3>Donkeys</h3><h4>Parakeet <b><i>Innocent IV</i></b> in Classic Chartreuse</h4></div>},
85
+ mab { div { h1 "Monkeys"; h2 { "Giraffes #{small 'Miniature' } and #{strong 'Large'}" }; h3 "Donkeys"; h4 { "Parakeet #{b { i 'Innocent IV' }} in Classic Chartreuse" } } }
86
+ assert_equal %{<div><h1>Monkeys</h1><h2>Giraffes <strong>Miniature</strong></h2><h3>Donkeys</h3></div>},
87
+ mab { div { h1 "Monkeys"; h2 { "Giraffes #{strong 'Miniature' }" }; h3 "Donkeys" } }
88
+ 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>},
89
+ mab { div { @a = small 'Miniature'; @b = strong 'Large'; h1 "Monkeys"; h2 { "Giraffes #{@a} and #{@b}" }; h3 "Donkeys"; h4 { "Parakeet #{@b} as well..." } } }
90
+ end
91
+
92
+ def test_invalid_xhtml
93
+ assert_exception(NoMethodError, "no such method `dav'") { dav {} }
94
+ assert_exception(Markaby::InvalidXhtmlError, "no attribute `styl' on div elements") { div(:styl => 'ok') {} }
95
+ assert_exception(Markaby::InvalidXhtmlError, "no attribute `class' on tbody elements") { tbody.okay {} }
96
+ end
97
+
98
+ def test_full_doc_transitional
99
+ doc = mab { xhtml_transitional { head { title 'OKay' } } }
100
+ assert doc =~ /^<\?xml version="1.0" encoding="UTF-8"\?>/
101
+ assert doc.include?(%{"-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">})
102
+ assert doc.include?(%{<title>OKay</title>})
103
+ end
104
+
105
+ def test_full_doc_strict
106
+ doc = mab { xhtml_strict { head { title 'OKay' } } }
107
+ assert doc =~ /^<\?xml version="1.0" encoding="UTF-8"\?>/
108
+ assert doc.include?(%{"-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">})
109
+ assert doc.include?(%{<title>OKay</title>})
110
+ end
111
+
112
+ def test_full_doc_frameset
113
+ doc = mab { xhtml_frameset { head { title 'OKay' } } }
114
+ assert doc =~ /^<\?xml version="1.0" encoding="UTF-8"\?>/
115
+ assert doc.include?(%{"-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">})
116
+ assert doc.include?(%{<title>OKay</title>})
117
+ end
118
+
119
+ def test_root_attributes_can_be_changed
120
+ doc = mab { xhtml_strict(:lang => 'fr') { head { title { 'Salut!' } } } }
121
+ assert doc.include?(%{"-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">})
122
+ assert doc.include?(%{<title>Salut!</title>})
123
+ assert doc.include?(%{ lang="fr"})
124
+ end
125
+
126
+ end
data/tools/rakehelp.rb ADDED
@@ -0,0 +1,106 @@
1
+
2
+ def make(makedir)
3
+ Dir.chdir(makedir) do
4
+ sh 'make'
5
+ end
6
+ end
7
+
8
+
9
+ def extconf(dir)
10
+ Dir.chdir(dir) do ruby "extconf.rb" end
11
+ end
12
+
13
+
14
+ def setup_tests
15
+ Rake::TestTask.new do |t|
16
+ t.libs << "test"
17
+ t.test_files = FileList['test/test*.rb']
18
+ t.verbose = true
19
+ end
20
+ end
21
+
22
+
23
+ def setup_clean otherfiles
24
+ files = ['build/*', '**/*.o', '**/*.so', '**/*.a', 'lib/*-*', '**/*.log'] + otherfiles
25
+ CLEAN.include(files)
26
+ end
27
+
28
+
29
+ def setup_rdoc files
30
+ Rake::RDocTask.new do |rdoc|
31
+ rdoc.rdoc_dir = 'doc/rdoc'
32
+ rdoc.options << '--line-numbers'
33
+ rdoc.rdoc_files.add(files)
34
+ end
35
+ end
36
+
37
+
38
+ def setup_extension(dir, extension)
39
+ ext = "ext/#{dir}"
40
+ ext_so = "#{ext}/#{extension}.#{Config::CONFIG['DLEXT']}"
41
+ ext_files = FileList[
42
+ "#{ext}/*.c",
43
+ "#{ext}/*.h",
44
+ "#{ext}/extconf.rb",
45
+ "#{ext}/Makefile",
46
+ "lib"
47
+ ]
48
+
49
+ task "lib" do
50
+ directory "lib"
51
+ end
52
+
53
+ desc "Builds just the #{extension} extension"
54
+ task extension.to_sym => ["#{ext}/Makefile", ext_so ]
55
+
56
+ file "#{ext}/Makefile" => ["#{ext}/extconf.rb"] do
57
+ extconf "#{ext}"
58
+ end
59
+
60
+ file ext_so => ext_files do
61
+ make "#{ext}"
62
+ cp ext_so, "lib"
63
+ end
64
+ end
65
+
66
+
67
+ def setup_gem(pkg_name, pkg_version, author, summary, dependencies, test_file)
68
+ pkg_version = pkg_version
69
+ pkg_name = pkg_name
70
+ pkg_file_name = "#{pkg_name}-#{pkg_version}"
71
+
72
+ spec = Gem::Specification.new do |s|
73
+ s.name = pkg_name
74
+ s.version = pkg_version
75
+ s.platform = Gem::Platform::RUBY
76
+ s.author = author
77
+ s.summary = summary
78
+ s.test_file = test_file
79
+ s.has_rdoc = true
80
+ s.extra_rdoc_files = [ "README" ]
81
+ dependencies.each do |dep|
82
+ s.add_dependency(*dep)
83
+ end
84
+ s.files = %w(README Rakefile setup.rb) +
85
+ Dir.glob("{bin,doc,test,lib}/**/*") +
86
+ Dir.glob("ext/**/*.{h,c,rb}") +
87
+ Dir.glob("examples/**/*.rb") +
88
+ Dir.glob("tools/*.rb")
89
+
90
+ s.require_path = "lib"
91
+ s.extensions = FileList["ext/**/extconf.rb"].to_a
92
+
93
+ s.bindir = "bin"
94
+ end
95
+
96
+ Rake::GemPackageTask.new(spec) do |p|
97
+ p.gem_spec = spec
98
+ p.need_tar = true
99
+ end
100
+
101
+ task :install do
102
+ sh %{rake package}
103
+ sh %{gem install pkg/#{pkg_name}-#{pkg_version}}
104
+ end
105
+
106
+ end
metadata ADDED
@@ -0,0 +1,94 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: joho-Markaby
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.6.0
5
+ platform: ruby
6
+ authors:
7
+ - _why
8
+ - Tim Fletcher
9
+ - John Barton
10
+ - spox
11
+ - smtlaissezfaire
12
+ autorequire:
13
+ bindir: bin
14
+ cert_chain: []
15
+
16
+ date: 2009-08-23 00:00:00 -07:00
17
+ default_executable:
18
+ dependencies:
19
+ - !ruby/object:Gem::Dependency
20
+ name: builder
21
+ type: :runtime
22
+ version_requirement:
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - ">="
26
+ - !ruby/object:Gem::Version
27
+ version: 2.0.0
28
+ version:
29
+ description: Tim Fletcher and _why's ruby driven HTML templating system
30
+ email: jrbarton@gmail.com
31
+ executables: []
32
+
33
+ extensions: []
34
+
35
+ extra_rdoc_files:
36
+ - README
37
+ files:
38
+ - CHANGELOG
39
+ - Markaby.gemspec
40
+ - README
41
+ - Rakefile
42
+ - VERSION
43
+ - init.rb
44
+ - lib/markaby.rb
45
+ - lib/markaby/builder.rb
46
+ - lib/markaby/cssproxy.rb
47
+ - lib/markaby/kernel_method.rb
48
+ - lib/markaby/metaid.rb
49
+ - lib/markaby/rails.rb
50
+ - lib/markaby/tags.rb
51
+ - lib/markaby/template.rb
52
+ - setup.rb
53
+ - test/rails/markaby/_monkeys.mab
54
+ - test/rails/markaby/broken.mab
55
+ - test/rails/markaby/create.mab
56
+ - test/rails/markaby/index.mab
57
+ - test/rails/monkeys.html
58
+ - test/rails/test_helper.rb
59
+ - test/rails/test_preamble.rb
60
+ - test/rails_test.rb
61
+ - test/test_markaby.rb
62
+ - tools/rakehelp.rb
63
+ has_rdoc: false
64
+ homepage: http://joho.github.com/markaby/
65
+ licenses:
66
+ post_install_message:
67
+ rdoc_options:
68
+ - --charset=UTF-8
69
+ require_paths:
70
+ - lib
71
+ required_ruby_version: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: "0"
76
+ version:
77
+ required_rubygems_version: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - ">="
80
+ - !ruby/object:Gem::Version
81
+ version: "0"
82
+ version:
83
+ requirements: []
84
+
85
+ rubyforge_project:
86
+ rubygems_version: 1.3.5
87
+ signing_key:
88
+ specification_version: 3
89
+ summary: Markup as Ruby, write HTML in your native Ruby tongue
90
+ test_files:
91
+ - test/rails/test_helper.rb
92
+ - test/rails/test_preamble.rb
93
+ - test/rails_test.rb
94
+ - test/test_markaby.rb