mab-cj 0.0.4

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 (48) hide show
  1. checksums.yaml +7 -0
  2. data/COPYING +19 -0
  3. data/Gemfile +14 -0
  4. data/README.md +224 -0
  5. data/Rakefile +16 -0
  6. data/lib/mab.rb +6 -0
  7. data/lib/mab/builder.rb +45 -0
  8. data/lib/mab/indentation.rb +33 -0
  9. data/lib/mab/kernel_method.rb +6 -0
  10. data/lib/mab/mixin.rb +262 -0
  11. data/lib/mab/rails.rb +20 -0
  12. data/lib/mab/tilt.rb +42 -0
  13. data/lib/mab/version.rb +4 -0
  14. data/mab.gemspec +20 -0
  15. data/test/helper.rb +4 -0
  16. data/test/rails/Rakefile +7 -0
  17. data/test/rails/app/assets/images/rails.png +0 -0
  18. data/test/rails/app/assets/javascripts/application.js +15 -0
  19. data/test/rails/app/assets/stylesheets/application.css +13 -0
  20. data/test/rails/app/controllers/application_controller.rb +17 -0
  21. data/test/rails/app/helpers/application_helper.rb +2 -0
  22. data/test/rails/app/views/application/content_for.html.mab +6 -0
  23. data/test/rails/app/views/application/normal.html.mab +2 -0
  24. data/test/rails/app/views/application/variables.html.mab +2 -0
  25. data/test/rails/app/views/layouts/application.html.mab +15 -0
  26. data/test/rails/config.ru +4 -0
  27. data/test/rails/config/application.rb +54 -0
  28. data/test/rails/config/boot.rb +6 -0
  29. data/test/rails/config/environment.rb +5 -0
  30. data/test/rails/config/environments/development.rb +27 -0
  31. data/test/rails/config/environments/production.rb +67 -0
  32. data/test/rails/config/environments/test.rb +29 -0
  33. data/test/rails/config/initializers/backtrace_silencers.rb +7 -0
  34. data/test/rails/config/initializers/inflections.rb +15 -0
  35. data/test/rails/config/initializers/mime_types.rb +5 -0
  36. data/test/rails/config/initializers/secret_token.rb +7 -0
  37. data/test/rails/config/initializers/session_store.rb +8 -0
  38. data/test/rails/config/initializers/wrap_parameters.rb +14 -0
  39. data/test/rails/config/locales/en.yml +5 -0
  40. data/test/rails/config/routes.rb +3 -0
  41. data/test/rails/script/rails +6 -0
  42. data/test/rails/test/helper.rb +7 -0
  43. data/test/rails/test/test_mab.rb +40 -0
  44. data/test/test_mab_builder.rb +56 -0
  45. data/test/test_mab_indentation.rb +66 -0
  46. data/test/test_mab_kernel_method.rb +10 -0
  47. data/test/test_mab_mixin.rb +250 -0
  48. metadata +118 -0
@@ -0,0 +1,14 @@
1
+ # Be sure to restart your server when you modify this file.
2
+ #
3
+ # This file contains settings for ActionController::ParamsWrapper which
4
+ # is enabled by default.
5
+
6
+ # Enable parameter wrapping for JSON. You can disable this by setting :format to an empty array.
7
+ ActiveSupport.on_load(:action_controller) do
8
+ wrap_parameters :format => [:json]
9
+ end
10
+
11
+ # Disable root element in JSON by default.
12
+ ActiveSupport.on_load(:active_record) do
13
+ self.include_root_in_json = false
14
+ end
@@ -0,0 +1,5 @@
1
+ # Sample localization file for English. Add more files in this directory for other locales.
2
+ # See https://github.com/svenfuchs/rails-i18n/tree/master/rails%2Flocale for starting points.
3
+
4
+ en:
5
+ hello: "Hello world"
@@ -0,0 +1,3 @@
1
+ Dummy::Application.routes.draw do
2
+ get ':controller(/:action(/:id(.:format)))'
3
+ end
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env ruby
2
+ # This command will automatically be run when you run "rails" with Rails 3 gems installed from the root of your application.
3
+
4
+ APP_PATH = File.expand_path('../../config/application', __FILE__)
5
+ require File.expand_path('../../config/boot', __FILE__)
6
+ require 'rails/commands'
@@ -0,0 +1,7 @@
1
+ # Configure Rails Envinronment
2
+ ENV["RAILS_ENV"] = "test"
3
+
4
+ require File.expand_path("../../config/environment.rb", __FILE__)
5
+ require "rails/test_help"
6
+
7
+ Rails.backtrace_cleaner.remove_silencers!
@@ -0,0 +1,40 @@
1
+ require File.expand_path('../helper', __FILE__)
2
+
3
+ class TestMab < ActionDispatch::IntegrationTest
4
+ test "normal view" do
5
+ get "application/normal"
6
+ assert_response :success
7
+ assert_template "application/normal"
8
+ assert_template "layouts/application"
9
+ assert_html "<h1>Hello Mab!</h1>"
10
+ end
11
+
12
+ test "no layout" do
13
+ get "application/no_layout"
14
+ assert_response :success
15
+ assert_template "application/normal"
16
+ assert_equal "<h1>Hello Mab!</h1>", @response.body
17
+ end
18
+
19
+ test "variables" do
20
+ get "application/variables"
21
+ assert_response :success
22
+ assert_template "application/variables"
23
+ assert_template "layouts/application"
24
+ assert_html "<h1>Hello world!</h1>"
25
+ end
26
+
27
+ test "content for" do
28
+ get "application/content_for"
29
+ assert_response :success
30
+ assert_template "application/content_for"
31
+ assert_template "layouts/application"
32
+ assert_html "<h2>Sub</h2>", :heading => "<h1>Heading</h1>"
33
+ end
34
+
35
+ def assert_html(expected, options = {})
36
+ expected = "<!DOCTYPE html><html><head><title>Dummy</title></head><body>#{options[:heading]}<div class=\"content\">#{expected}</div></body></html>" unless options[:skip_layout]
37
+ assert_equal expected, @response.body
38
+ end
39
+ end
40
+
@@ -0,0 +1,56 @@
1
+ require 'helper'
2
+
3
+ class TestMabBuilder < MiniTest::Unit::TestCase
4
+ def test_assigns
5
+ b = Mab::Builder.new(:title => 'Mab') do
6
+ title @title
7
+ end
8
+
9
+ assert_equal '<title>Mab</title>', b.to_s
10
+ end
11
+
12
+ def test_capture
13
+ b = Mab::Builder.new do
14
+ %w[name address].map do |key|
15
+ mab do
16
+ p key
17
+ end
18
+ end.join('<br>')
19
+ end
20
+
21
+ assert_equal "<p>name</p><br><p>address</p>", b.to_s
22
+ end
23
+
24
+ def test_helper
25
+ obj = Class.new {
26
+ def initialize
27
+ @a = 1
28
+ @b = 2
29
+ end
30
+
31
+ def c; @a + @b end
32
+ }.new
33
+
34
+ b = Mab::Builder.new({}, obj) do
35
+ p @a
36
+ p @b
37
+ p c
38
+ end
39
+
40
+ assert_equal '<p>1</p><p>2</p><p>3</p>', b.to_s
41
+ end
42
+
43
+ def test_pretty
44
+ b = Mab::PrettyBuilder.new do
45
+ doctype!
46
+ html do
47
+ body do
48
+ h1 "Nice"
49
+ end
50
+ end
51
+ end
52
+
53
+ assert_equal "<!DOCTYPE html>\n<html>\n <body>\n <h1>Nice</h1>\n </body>\n</html>", b.to_s
54
+ end
55
+ end
56
+
@@ -0,0 +1,66 @@
1
+ require 'helper'
2
+
3
+ class TestMabIndentation < MiniTest::Unit::TestCase
4
+ def setup
5
+ super
6
+ @obj = Object.new
7
+ @obj.extend Mab::Mixin
8
+ @obj.extend Mab::Indentation
9
+ end
10
+
11
+ def test_simple
12
+ assert_equal "<p>Hello</p>", @obj.mab { tag! :p, 'Hello' }
13
+ end
14
+
15
+ def test_block
16
+ assert_equal "<p>\n Hello\n</p>", @obj.mab { tag!(:p) { text 'Hello' } }
17
+ end
18
+
19
+ def test_chaining
20
+ res = <<HTML.strip
21
+ <p class="hello">
22
+ <br>
23
+ </p>
24
+ HTML
25
+
26
+ assert_equal res, @obj.mab {
27
+ tag!(:p).hello do
28
+ tag! :br
29
+ end
30
+ }
31
+ end
32
+
33
+ def test_reindent
34
+ res = <<HTML.strip
35
+ <p>
36
+ Hello
37
+ World
38
+ </p>
39
+ HTML
40
+
41
+ assert_equal res, @obj.mab {
42
+ tag! :p do
43
+ reindent! "Hello\nWorld"
44
+ end
45
+ }
46
+ end
47
+
48
+ def test_stringification
49
+ res = <<HTML.strip
50
+ <h1>
51
+ <div><span>Hello</span> | <span>Hello</span></div>
52
+ </h1>
53
+ HTML
54
+
55
+ assert_equal res, @obj.mab {
56
+ tag!(:h1) do
57
+ s = tag!(:span, 'Hello')
58
+ tag!(:div) do
59
+ [s, s].join(' | ')
60
+ end
61
+ end
62
+
63
+ }
64
+ end
65
+ end
66
+
@@ -0,0 +1,10 @@
1
+ require 'helper'
2
+
3
+ class TestMabKernelMethod < MiniTest::Unit::TestCase
4
+ def test_kernel_method
5
+ require 'mab/kernel_method'
6
+ @a = 1
7
+ assert_equal "<p>\n <p>3</p>\n</p>", mab { p { p { @a + 2 } } }
8
+ end
9
+ end
10
+
@@ -0,0 +1,250 @@
1
+ require 'helper'
2
+
3
+ class TestMabMixin < MiniTest::Unit::TestCase
4
+ def setup
5
+ super
6
+ @obj = Object.new
7
+ end
8
+
9
+ def test_tag
10
+ @obj.extend Mab::Mixin
11
+
12
+ assert_equal '<br>', @obj.mab {
13
+ tag! :br
14
+ }
15
+
16
+ assert_equal '<br></br>', @obj.mab {
17
+ tag! :br, nil
18
+ }
19
+
20
+ assert_equal '<p>Hello</p>', @obj.mab {
21
+ tag! :p, 'Hello'
22
+ }
23
+
24
+ assert_equal '<p class="intro">Hello</p>', @obj.mab {
25
+ tag! :p, 'Hello', :class => "intro"
26
+ }
27
+
28
+ assert_equal '<p><br></p>', @obj.mab {
29
+ tag! :p do
30
+ tag! :br
31
+ end
32
+ }
33
+
34
+ assert_equal '<br class="intro">', @obj.mab {
35
+ tag! :br, :class => 'intro'
36
+ }
37
+
38
+ assert_equal '<br>', @obj.mab {
39
+ tag! :br, :class => nil
40
+ }
41
+
42
+ assert_raises Mab::Mixin::Error do
43
+ @obj.mab do
44
+ tag! :p, "content" do
45
+ "and block"
46
+ end
47
+ end
48
+ end
49
+ end
50
+
51
+ def test_multile_attrs
52
+ @obj.extend Mab::Mixin
53
+
54
+ assert_equal '<br class="intro" id="yay">', @obj.mab {
55
+ tag! :br, { :class => "intro" }, { :id => "yay" }
56
+ }
57
+ end
58
+
59
+ def test_escaping
60
+ @obj.extend Mab::Mixin
61
+
62
+ assert_equal '<p>&amp;</p>', @obj.mab {
63
+ tag! :p, '&'
64
+ }
65
+
66
+ assert_equal '<p>&</p>', @obj.mab {
67
+ tag! :p do '&' end
68
+ }
69
+
70
+ assert_equal '&amp;', @obj.mab { text '&' }
71
+ end
72
+
73
+ def test_chaining
74
+ @obj.extend Mab::Mixin
75
+
76
+ assert_equal '<p class="intro" id="first">Hello</p>', @obj.mab {
77
+ tag!(:p).intro.first!('Hello')
78
+ }
79
+
80
+ assert_equal '<div class="content">Hello</div>', @obj.mab {
81
+ tag!(:div).content("Hello")
82
+ }
83
+
84
+ assert_raises(Mab::Mixin::Error) do
85
+ @obj.mab do
86
+ tag!(:p).intro('Hello').first!('Hello')
87
+ end
88
+ end
89
+
90
+ assert_raises(Mab::Mixin::Error) do
91
+ @obj.mab do
92
+ tag!(:p).intro(:class => 'bar').first!('Hello')
93
+ end
94
+ end
95
+ end
96
+
97
+ def test_html5_chaining
98
+ @obj.extend Mab::Mixin::HTML5
99
+
100
+ assert_equal '<p class="intro" id="first">Hello</p>', @obj.mab {
101
+ p.intro.first!('Hello')
102
+ }
103
+ end
104
+
105
+ def test_mab_done
106
+ @obj.extend Mab::Mixin
107
+ def @obj.mab_done(tag)
108
+ tag._attributes = { :nope => 123 }
109
+ end
110
+
111
+ assert_equal '<p nope="123"><br nope="123"></p>', @obj.mab {
112
+ tag! :p, :hello => :world do
113
+ tag!(:br).klass(:hello => :world)
114
+ end
115
+ }
116
+ end
117
+
118
+ def test_mab_done_ignore_block
119
+ @obj.extend Mab::Mixin
120
+ def @obj.mab_done(tag)
121
+ tag._block = nil
122
+ tag._content = ''
123
+ end
124
+
125
+ assert_equal '<p></p>', @obj.mab {
126
+ tag! :p do
127
+ tag!(:br).klass(:hello => :world)
128
+ end
129
+ }
130
+ end
131
+
132
+ def test_mab_done_wrap_block
133
+ @obj.extend Mab::Mixin
134
+ def @obj.mab_done(tag)
135
+ tag._block do |blk|
136
+ tag! :p, 'nice'
137
+ blk.call
138
+ end if tag._name == :body
139
+ end
140
+
141
+ assert_equal "<body><p>nice</p><br></body>", @obj.mab {
142
+ tag! :body do
143
+ tag! :br
144
+ end
145
+ }
146
+ end
147
+
148
+ def test_mab_insert
149
+ @obj.extend Mab::Mixin
150
+ def @obj.mab_insert(tag)
151
+ tag._name = :nope if tag.respond_to?(:_name=)
152
+ super
153
+ end
154
+
155
+ assert_equal '<nope>', @obj.mab {
156
+ tag! :br
157
+ }
158
+ end
159
+
160
+ def test_stringification
161
+ @obj.extend Mab::Mixin
162
+
163
+ assert_equal '<h1>My name is: <span>Bob</span></h1>', @obj.mab {
164
+ tag!(:h1) do
165
+ "My name is: #{tag!(:span, 'Bob')}"
166
+ end
167
+ }
168
+
169
+ assert_equal '<h1><div><span>Hello</span> | <span>Hello</span></div></h1>', @obj.mab {
170
+ tag!(:h1) do
171
+ s = tag!(:span, 'Hello')
172
+ tag!(:div) do
173
+ [s, s].join(' | ')
174
+ end
175
+ end
176
+ }
177
+ end
178
+
179
+ def test_xml
180
+ @obj.extend Mab::Mixin
181
+ @obj.mab_options[:xml] = true
182
+
183
+ assert_equal '<br /><br></br><br>hello</br>', @obj.mab {
184
+ tag! :br
185
+ tag! :br, ''
186
+ tag! :br, 'hello'
187
+ }
188
+ end
189
+
190
+ def test_html5
191
+ @obj.extend Mab::Mixin::HTML5
192
+ assert_equal '<!DOCTYPE html><html><body><p></p><br></body></html>', @obj.mab {
193
+ doctype!
194
+ html do
195
+ body do
196
+ p
197
+ br
198
+ end
199
+ end
200
+ }
201
+
202
+ assert_raises Mab::Mixin::Error do
203
+ @obj.mab { br { } }
204
+ end
205
+
206
+ assert_raises Mab::Mixin::Error do
207
+ @obj.mab { br "hello" }
208
+ end
209
+
210
+ assert_raises Mab::Mixin::Error do
211
+ @obj.mab { br.klass "hello" }
212
+ end
213
+
214
+ assert_includes [
215
+ '<input class="text" value="name">',
216
+ '<input value="name" class="text">',
217
+ ], @obj.mab {
218
+ input.text :value => 'name'
219
+ }
220
+ end
221
+
222
+ def test_xhtml5
223
+ @obj.extend Mab::Mixin::XHTML5
224
+ assert_equal '<!DOCTYPE html><html><body><p></p><br /></body></html>', @obj.mab {
225
+ doctype!
226
+ html do
227
+ body do
228
+ p
229
+ br
230
+ end
231
+ end
232
+ }
233
+
234
+ assert_raises Mab::Mixin::Error do
235
+ @obj.mab { br { } }
236
+ end
237
+
238
+ assert_raises Mab::Mixin::Error do
239
+ @obj.mab { br "hello" }
240
+ end
241
+ end
242
+
243
+ def test_core_xml
244
+ @obj.extend Mab::Mixin::XML
245
+ assert_equal '<br />', @obj.mab {
246
+ tag! :br
247
+ }
248
+ end
249
+ end
250
+