htmless 0.4

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,290 @@
1
+ require 'simplecov'
2
+ require 'htmless'
3
+
4
+ #RSpec.configure do |config|
5
+ # config.mock_with :rspec
6
+ #end
7
+
8
+ describe Htmless do
9
+ shared_examples "pool" do
10
+ it('should return correct instance') { pool.get.should be_kind_of(Htmless::Formatted) }
11
+ it "should return instance into pool" do
12
+ pool.get.release
13
+ pool.size.should == 1
14
+ pool.get.to_html!
15
+ pool.size.should == 1
16
+ end
17
+ end
18
+
19
+ describe Htmless::Pool do
20
+ let(:pool) { Htmless::Pool.new Htmless::Formatted }
21
+ include_examples 'pool'
22
+ end
23
+
24
+ describe Htmless::SynchronizedPool do
25
+ let(:pool) { Htmless::SynchronizedPool.new Htmless::Formatted }
26
+ include_examples 'pool'
27
+ end
28
+
29
+ describe 'object with HammerBuilder::Helper' do
30
+ let(:pool) { Htmless::Pool.new Htmless::Standard }
31
+
32
+ class User
33
+ extend Htmless::Helper
34
+
35
+ builder :detail do |_, arg|
36
+ div arg
37
+ end
38
+
39
+ def detail2(b, arg)
40
+ b.div { b.text arg }
41
+ end
42
+ end
43
+
44
+ describe 'User.new' do
45
+ it { User.new.should be_respond_to(:detail) }
46
+ it "should render correctly" do
47
+ pool.get.dive(User.new) do |user|
48
+ render user, :detail, 'content'
49
+ render user, :detail2, 'content'
50
+ end.to_html!.should == "<div>content</div><div>content</div>"
51
+ end
52
+ end
53
+
54
+ end
55
+
56
+ describe Htmless::DynamicClasses do
57
+ class Parent
58
+ extend Htmless::DynamicClasses
59
+ dc do
60
+ def_class :LeftEye do
61
+ def to_s;
62
+ 'left eye';
63
+ end
64
+ end
65
+
66
+ def_class :RightEye, :LeftEye do
67
+ class_eval <<-RUBYCODE, __FILE__, __LINE__+1
68
+ def to_s; 'next to ' + super; end
69
+ RUBYCODE
70
+ end
71
+ end
72
+ end
73
+
74
+ class AChild < Parent
75
+ end
76
+
77
+ class AMutant < Parent
78
+ dc do
79
+ extend_class :LeftEye do
80
+ def to_s;
81
+ 'laser ' + super;
82
+ end
83
+ end
84
+ end
85
+ end
86
+
87
+ it '#to_s should print correct values' do
88
+ Parent.dc[:LeftEye].new.to_s.should == 'left eye'
89
+ Parent.dc[:RightEye].new.to_s.should == 'next to left eye'
90
+ AChild.dc[:LeftEye].new.to_s.should == 'left eye'
91
+ AChild.dc[:RightEye].new.to_s.should == 'next to left eye'
92
+ AMutant.dc[:LeftEye].new.to_s.should == 'laser left eye'
93
+ AMutant.dc[:RightEye].new.to_s.should == 'next to laser left eye'
94
+ end
95
+
96
+ it 'should create different classes for each carrying class' do
97
+ Parent.dc[:LeftEye].should_not == AChild.dc[:LeftEye]
98
+ Parent.dc[:LeftEye].should_not == AMutant.dc[:LeftEye]
99
+ end
100
+
101
+ describe 'Parent.dc.class_names' do
102
+ it do
103
+ Parent.dc.class_names.should include(:LeftEye, :RightEye)
104
+ Parent.dc.class_names.should have(2).items
105
+ end
106
+ end
107
+ end
108
+
109
+ describe Htmless::Standard do
110
+ let(:pool) { Htmless::Pool.new Htmless::Standard }
111
+ let(:builder) { pool.get }
112
+
113
+ def quick_render &block
114
+ builder.dive(&block).to_html!
115
+ end
116
+
117
+ it 'should render #content' do
118
+ quick_render { div 'content' }.should == '<div>content</div>'
119
+ quick_render { div.content 'content' }.should == '<div>content</div>'
120
+ quick_render { div :content => 'content' }.should == '<div>content</div>'
121
+ quick_render { div { text 'content' } }.should == '<div>content</div>'
122
+ quick_render { div.with { text 'content' } }.should == '<div>content</div>'
123
+ end
124
+
125
+ it 'should render #id' do
126
+ quick_render { div.id :an_id }.should == '<div id="an_id"></div>'
127
+ quick_render { div.an_id! }.should == '<div id="an-id"></div>'
128
+ quick_render { div.an_id! { text 'content' } }.should == '<div id="an-id">content</div>'
129
+ quick_render { div.an_id! 'content' }.should == '<div id="an-id">content</div>'
130
+ quick_render { div.an_id! }.should == '<div id="an-id"></div>'
131
+ quick_render { div :id => 12 }.should == '<div id="12"></div>'
132
+ quick_render { div 'asd', :id => 12 }.should == '<div id="12">asd</div>'
133
+ quick_render { hr.id 'an_id' }.should == '<hr id="an_id" />'
134
+ quick_render { hr.an_id! }.should == '<hr id="an-id" />'
135
+ quick_render { hr :id => 'an_id' }.should == '<hr id="an_id" />'
136
+
137
+ quick_render { hr.id 'an', 'id', nil, false }.should == '<hr id="an-id" />'
138
+ quick_render { div.id 'an', 'id', nil, false }.should == '<div id="an-id"></div>'
139
+
140
+ quick_render { div.an_id! :class => 'big' }.should == '<div id="an-id" class="big"></div>'
141
+ quick_render { div.an_id!(:class => 'big') { text 'content' } }.should ==
142
+ '<div id="an-id" class="big">content</div>'
143
+ quick_render { div.an_id! 'content', :class => 'big' }.should == '<div id="an-id" class="big">content</div>'
144
+ quick_render { div.an_id! 'content' }.should == '<div id="an-id">content</div>'
145
+ quick_render { hr.an_id! :class => 'big' }.should == '<hr id="an-id" class="big" />'
146
+ end
147
+
148
+ it 'should render #class' do
149
+ #noinspection RubyArgCount
150
+ quick_render { div.class 'an_class' }.should == '<div class="an_class"></div>'
151
+ quick_render { div.an_class }.should == '<div class="an-class"></div>'
152
+ quick_render { div :class => 'an_class' }.should == '<div class="an_class"></div>'
153
+ #noinspection RubyArgCount
154
+ quick_render { hr.class 'an_class' }.should == '<hr class="an_class" />'
155
+ quick_render { hr.an_class }.should == '<hr class="an-class" />'
156
+ quick_render { hr :class => 'an_class' }.should == '<hr class="an_class" />'
157
+
158
+ quick_render { div.an_class.another_class }.should == '<div class="an-class another-class"></div>'
159
+ #noinspection RubyArgCount
160
+ quick_render { div.class 'an_class', 'another_class' }.should == '<div class="an_class another_class"></div>'
161
+ quick_render { div :class => ['an_class', 'another_class'] }.should == '<div class="an_class another_class"></div>'
162
+ #noinspection RubyArgCount
163
+ quick_render { div.class(false, nil, 'an_class', true && 'another_class') }.should ==
164
+ '<div class="an_class another_class"></div>'
165
+ end
166
+
167
+ it "#attribute" do
168
+ quick_render { div.attribute 'xml:ns', 'gibris' }.should == '<div xml:ns="gibris"></div>'
169
+ quick_render { div.attribute(:class, 'a') { text 'asd' } }.should == '<div class="a">asd</div>'
170
+ end
171
+
172
+ it '#[]' do
173
+ obj = Object.new
174
+ quick_render { div[obj] }.should == %Q(<div id="object-#{obj.object_id}" class="object"></div>)
175
+
176
+ class AnObject
177
+ def self.htmless_ref
178
+ "a"
179
+ end
180
+
181
+ def htmless_ref
182
+ 'b'
183
+ end
184
+ end
185
+ obj = AnObject.new
186
+ quick_render { div[obj] }.should == %Q(<div id="b" class="a"></div>)
187
+
188
+ obj = Object.new.extend(Module.new do
189
+ def id;
190
+ "an_id";
191
+ end
192
+ end)
193
+ quick_render { div[obj] }.should == %Q(<div id="object-an_id" class="object"></div>)
194
+ quick_render { div.mimic(obj) { text 'a' } }.should == %Q(<div id="object-an_id" class="object">a</div>)
195
+ end
196
+
197
+ it "#data-secret" do
198
+ quick_render { div('a').data_secret("I won't tell.") }.should == '<div data-secret="I won\'t tell.">a</div>'
199
+ end
200
+
201
+ it '#data' do
202
+ quick_render { hr.data(:secret => true) }.should == '<hr data-secret="true" />'
203
+ quick_render { div('a', :data => { :secret => "I won't tell." }) }.should ==
204
+ '<div data-secret="I won\'t tell.">a</div>'
205
+ quick_render { div('a').data(:secret => "I won't tell.") { text 'a' } }.should ==
206
+ '<div data-secret="I won\'t tell.">a</div>'
207
+ end
208
+
209
+ it 'tags should have all the attributes' do
210
+ builder.tags.each do |tag|
211
+ builder.should be_respond_to(tag)
212
+ tag_instance = builder.send(tag)
213
+ (Htmless::Data::HTML5.abstract_attributes.map(&:name) +
214
+ (Htmless::Data::HTML5.single_tags + Htmless::Data::HTML5.double_tags).
215
+ find { |t| t.name.to_s == tag }.attributes.map(&:name)).each do |attr|
216
+ tag_instance.should be_respond_to(attr)
217
+ end
218
+ end
219
+ end
220
+
221
+ it "boolean attributes should render correctly" do
222
+ quick_render { input.readonly }.should == '<input readonly="readonly" />'
223
+ quick_render { option.selected { text 'asd' } }.should == '<option selected="selected">asd</option>'
224
+ quick_render { option.selected(true) }.should == '<option selected="selected"></option>'
225
+ quick_render { option.selected(1) }.should == '<option selected="selected"></option>'
226
+ quick_render { option.selected(false) }.should == '<option></option>'
227
+ quick_render { div.hidden('asd') }.should == '<div hidden="hidden"></div>'
228
+ end
229
+
230
+ it "should render correctly" do
231
+ quick_render do
232
+ html5
233
+ html do
234
+ head do
235
+ title.an_id! 'a_title'
236
+ meta.charset "utf-8"
237
+ end
238
+ body.id 'content' do
239
+ text 'asd'
240
+ div.left.style nil do
241
+ raw 'asd'
242
+ hr
243
+ end
244
+ br
245
+ div.left do
246
+ hr
247
+ js 'asd'
248
+ js 'asd', :cdata => true
249
+ end
250
+ comment 'asd'
251
+ end
252
+ comment 'asd'
253
+ end
254
+ end.should == '<!DOCTYPE html>' + "\n" +
255
+ '<html xmlns="http://www.w3.org/1999/xhtml"><head><title id="an-id">a_title</title><meta charset="utf-8" />'+
256
+ '</head><body id="content">asd<div style="" class="left">asd<hr /></div><br /><div class="left"><hr />'+
257
+ '<script type="text/javascript">asd</script><script type="text/javascript"><![CDATA[asd]]></script>'+
258
+ '</div><!--asd--></body><!--asd--></html>'
259
+ end
260
+
261
+ it "#set variables" do
262
+ r = builder.set_variables(:a => 'a') do |b|
263
+ b.dive { p @a }
264
+ end.to_html!
265
+
266
+ r.should == '<p>a</p>'
267
+ builder.instance_variable_get(:@a).should be_nil
268
+ end
269
+
270
+ it "#join" do
271
+ quick_render { join([1, 2]) { |n| text n } }.should == '12'
272
+ quick_render { join([1, 2], 'a') { |n| text n } }.should == '1a2'
273
+ quick_render { join([lambda { text 1 }, 2], 'a') { |n| text n } }.should == '1a2'
274
+ quick_render { join([lambda { text 1 }, 2], lambda { text 'a' }) { |n| text n } }.should == '1a2'
275
+ end
276
+ end
277
+
278
+ describe Htmless::Formatted do
279
+ let(:pool) { Htmless::Pool.new Htmless::Formatted }
280
+ let(:builder) { pool.get }
281
+
282
+ def quick_render &block
283
+ builder.dive(&block).to_html!
284
+ end
285
+
286
+ it "should be formatted" do
287
+ quick_render { div { comment 'asd'; br }; p }.should == "\n<div>\n <!--asd-->\n <br />\n</div>\n<p></p>"
288
+ end
289
+ end
290
+ end
metadata ADDED
@@ -0,0 +1,279 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: htmless
3
+ version: !ruby/object:Gem::Version
4
+ version: '0.4'
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Petr Chalupa
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-05-12 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rspec
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
30
+ - !ruby/object:Gem::Dependency
31
+ name: yard
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ type: :development
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ - !ruby/object:Gem::Dependency
47
+ name: kramdown
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ - !ruby/object:Gem::Dependency
63
+ name: nokogiri
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ! '>='
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ type: :development
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
78
+ - !ruby/object:Gem::Dependency
79
+ name: erubis
80
+ requirement: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ! '>='
84
+ - !ruby/object:Gem::Version
85
+ version: '0'
86
+ type: :development
87
+ prerelease: false
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ! '>='
92
+ - !ruby/object:Gem::Version
93
+ version: '0'
94
+ - !ruby/object:Gem::Dependency
95
+ name: tenjin
96
+ requirement: !ruby/object:Gem::Requirement
97
+ none: false
98
+ requirements:
99
+ - - ! '>='
100
+ - !ruby/object:Gem::Version
101
+ version: '0'
102
+ type: :development
103
+ prerelease: false
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ! '>='
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ - !ruby/object:Gem::Dependency
111
+ name: erector
112
+ requirement: !ruby/object:Gem::Requirement
113
+ none: false
114
+ requirements:
115
+ - - ! '>='
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ none: false
122
+ requirements:
123
+ - - ! '>='
124
+ - !ruby/object:Gem::Version
125
+ version: '0'
126
+ - !ruby/object:Gem::Dependency
127
+ name: markaby
128
+ requirement: !ruby/object:Gem::Requirement
129
+ none: false
130
+ requirements:
131
+ - - ! '>='
132
+ - !ruby/object:Gem::Version
133
+ version: '0'
134
+ type: :development
135
+ prerelease: false
136
+ version_requirements: !ruby/object:Gem::Requirement
137
+ none: false
138
+ requirements:
139
+ - - ! '>='
140
+ - !ruby/object:Gem::Version
141
+ version: '0'
142
+ - !ruby/object:Gem::Dependency
143
+ name: tagz
144
+ requirement: !ruby/object:Gem::Requirement
145
+ none: false
146
+ requirements:
147
+ - - ! '>='
148
+ - !ruby/object:Gem::Version
149
+ version: '0'
150
+ type: :development
151
+ prerelease: false
152
+ version_requirements: !ruby/object:Gem::Requirement
153
+ none: false
154
+ requirements:
155
+ - - ! '>='
156
+ - !ruby/object:Gem::Version
157
+ version: '0'
158
+ - !ruby/object:Gem::Dependency
159
+ name: simplecov
160
+ requirement: !ruby/object:Gem::Requirement
161
+ none: false
162
+ requirements:
163
+ - - ! '>='
164
+ - !ruby/object:Gem::Version
165
+ version: '0'
166
+ type: :development
167
+ prerelease: false
168
+ version_requirements: !ruby/object:Gem::Requirement
169
+ none: false
170
+ requirements:
171
+ - - ! '>='
172
+ - !ruby/object:Gem::Version
173
+ version: '0'
174
+ - !ruby/object:Gem::Dependency
175
+ name: simplecov-rcov
176
+ requirement: !ruby/object:Gem::Requirement
177
+ none: false
178
+ requirements:
179
+ - - ! '>='
180
+ - !ruby/object:Gem::Version
181
+ version: '0'
182
+ type: :development
183
+ prerelease: false
184
+ version_requirements: !ruby/object:Gem::Requirement
185
+ none: false
186
+ requirements:
187
+ - - ! '>='
188
+ - !ruby/object:Gem::Version
189
+ version: '0'
190
+ - !ruby/object:Gem::Dependency
191
+ name: pry
192
+ requirement: !ruby/object:Gem::Requirement
193
+ none: false
194
+ requirements:
195
+ - - ! '>='
196
+ - !ruby/object:Gem::Version
197
+ version: '0'
198
+ type: :development
199
+ prerelease: false
200
+ version_requirements: !ruby/object:Gem::Requirement
201
+ none: false
202
+ requirements:
203
+ - - ! '>='
204
+ - !ruby/object:Gem::Version
205
+ version: '0'
206
+ - !ruby/object:Gem::Dependency
207
+ name: multi_json
208
+ requirement: !ruby/object:Gem::Requirement
209
+ none: false
210
+ requirements:
211
+ - - ! '>='
212
+ - !ruby/object:Gem::Version
213
+ version: '0'
214
+ type: :development
215
+ prerelease: false
216
+ version_requirements: !ruby/object:Gem::Requirement
217
+ none: false
218
+ requirements:
219
+ - - ! '>='
220
+ - !ruby/object:Gem::Version
221
+ version: '0'
222
+ description: Fast extensible html5 builder in pure Ruby
223
+ email: git@pitr.ch
224
+ executables: []
225
+ extensions: []
226
+ extra_rdoc_files:
227
+ - README.md
228
+ - README_FULL.md
229
+ - MIT-LICENSE
230
+ files:
231
+ - lib/copy_to_doc.rb
232
+ - lib/htmless/abstract/abstract_double_tag.rb
233
+ - lib/htmless/abstract/abstract_single_tag.rb
234
+ - lib/htmless/abstract/abstract_tag.rb
235
+ - lib/htmless/abstract.rb
236
+ - lib/htmless/data/html5.rb
237
+ - lib/htmless/data.rb
238
+ - lib/htmless/doc.rb
239
+ - lib/htmless/dynamic_classes.rb
240
+ - lib/htmless/formatted.rb
241
+ - lib/htmless/helper.rb
242
+ - lib/htmless/pool.rb
243
+ - lib/htmless/rails.rb
244
+ - lib/htmless/standard.rb
245
+ - lib/htmless/strings_injector.rb
246
+ - lib/htmless.rb
247
+ - lib/js.rb
248
+ - README.md
249
+ - README_FULL.md
250
+ - MIT-LICENSE
251
+ - spec/htmless_spec.rb
252
+ homepage: https://github.com/pitr-ch/htmless
253
+ licenses:
254
+ - MIT
255
+ post_install_message:
256
+ rdoc_options: []
257
+ require_paths:
258
+ - lib
259
+ required_ruby_version: !ruby/object:Gem::Requirement
260
+ none: false
261
+ requirements:
262
+ - - ! '>='
263
+ - !ruby/object:Gem::Version
264
+ version: '0'
265
+ required_rubygems_version: !ruby/object:Gem::Requirement
266
+ none: false
267
+ requirements:
268
+ - - ! '>='
269
+ - !ruby/object:Gem::Version
270
+ version: '0'
271
+ requirements: []
272
+ rubyforge_project:
273
+ rubygems_version: 1.8.23
274
+ signing_key:
275
+ specification_version: 3
276
+ summary: Fast extensible html5 builder in pure Ruby
277
+ test_files:
278
+ - spec/htmless_spec.rb
279
+ has_rdoc: