htmless 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.
@@ -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: