iron-web 1.0.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.
- data/.rspec +1 -0
- data/History.txt +8 -0
- data/LICENSE +20 -0
- data/README.rdoc +91 -0
- data/Version.txt +1 -0
- data/lib/iron/web.rb +8 -0
- data/lib/iron/web/color.rb +267 -0
- data/lib/iron/web/html.rb +150 -0
- data/lib/iron/web/html/element.rb +154 -0
- data/lib/iron/web/string.rb +60 -0
- data/lib/iron/web/url.rb +228 -0
- data/spec/spec_helper.rb +9 -0
- data/spec/web/color_spec.rb +58 -0
- data/spec/web/element_spec.rb +69 -0
- data/spec/web/html_safe_string_spec.rb +25 -0
- data/spec/web/html_spec.rb +20 -0
- data/spec/web/string_spec.rb +16 -0
- data/spec/web/url_spec.rb +101 -0
- metadata +87 -0
@@ -0,0 +1,58 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), '..', 'spec_helper')
|
2
|
+
|
3
|
+
SAMPLE_LIBRARY = {
|
4
|
+
:red => '#FF0000',
|
5
|
+
:purplish => '#FF20EE',
|
6
|
+
:orange => '#F0FF00'
|
7
|
+
}
|
8
|
+
|
9
|
+
describe Color do
|
10
|
+
|
11
|
+
it 'should default to white' do
|
12
|
+
Color.new.r.should == 255
|
13
|
+
Color.new.g.should == 255
|
14
|
+
Color.new.b.should == 255
|
15
|
+
Color.new.a.should == 255
|
16
|
+
end
|
17
|
+
|
18
|
+
it 'should convert to string as a web string' do
|
19
|
+
Color.parse(1,2,3).to_s.should == '#010203'
|
20
|
+
end
|
21
|
+
|
22
|
+
it 'should parse web colors' do
|
23
|
+
Color.new('#f8019c').should == Color.new(248,1,156)
|
24
|
+
end
|
25
|
+
|
26
|
+
it 'should make the global rgb() method available' do
|
27
|
+
defined?(:rgb).should be_true
|
28
|
+
end
|
29
|
+
|
30
|
+
it 'should parse values with rgb()' do
|
31
|
+
['#fa8', Color::BLACK].each do |test|
|
32
|
+
rgb(test).should == Color.parse(test)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
it 'should support alpha' do
|
37
|
+
c = rgb('abc')
|
38
|
+
c.a.should == 255
|
39
|
+
c.trans?.should be_false
|
40
|
+
c.opaque?.should be_true
|
41
|
+
c.to_s.should == '#AABBCC'
|
42
|
+
|
43
|
+
c.a = 38
|
44
|
+
c.a.should == 38
|
45
|
+
c.trans?.should be_true
|
46
|
+
c.opaque?.should be_false
|
47
|
+
c.to_s.should == '#AABBCC26'
|
48
|
+
end
|
49
|
+
|
50
|
+
it 'should support a definable callback for symbols' do
|
51
|
+
Color.lookup_callback = lambda{|val| SAMPLE_LIBRARY[val]}
|
52
|
+
SAMPLE_LIBRARY.each_pair do |k,v|
|
53
|
+
rgb(k).should == rgb(v)
|
54
|
+
end
|
55
|
+
Color.parse(:purplish).should == SAMPLE_LIBRARY[:purplish]
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
describe Html::Element do
|
2
|
+
|
3
|
+
# Helper to shortcut a lot of typing...
|
4
|
+
def build(*args, &block)
|
5
|
+
Html::Element.build(*args, &block)
|
6
|
+
end
|
7
|
+
|
8
|
+
it 'should build standard tags' do
|
9
|
+
Html::Element.new('b').render.should == '<b></b>'
|
10
|
+
Html::Element.build('script').should include('<script></script>')
|
11
|
+
end
|
12
|
+
|
13
|
+
it 'should build singleton tags' do
|
14
|
+
build('img').should == '<img>'
|
15
|
+
build('input').should == '<input>'
|
16
|
+
end
|
17
|
+
|
18
|
+
it 'should build attributes' do
|
19
|
+
build('img', :src => '/foo.jpg').should == '<img src="/foo.jpg">'
|
20
|
+
build('span', :id => 'alpha', :class => 'bold').should == '<span id="alpha" class="bold"></span>'
|
21
|
+
end
|
22
|
+
|
23
|
+
it 'should support basic text' do
|
24
|
+
build('span', 'heya').should == '<span>heya</span>'
|
25
|
+
end
|
26
|
+
|
27
|
+
it 'should html escape basic text' do
|
28
|
+
build('span', '"boo!"').should == '<span>"boo!"</span>'
|
29
|
+
end
|
30
|
+
|
31
|
+
it 'should html escape attr values' do
|
32
|
+
build('a', :alt => 'We had "fun"').should == '<a alt="We had "fun""></a>'
|
33
|
+
end
|
34
|
+
|
35
|
+
it 'should support indenting' do
|
36
|
+
Html::Element.new('div', 'indent!').render.should == "\n<div>\n indent!\n</div>\n"
|
37
|
+
end
|
38
|
+
|
39
|
+
it 'should support block indenting by skipping initial newline' do
|
40
|
+
Html::Element.new('div', 'indent!').render(0,true).should == "<div>\n indent!\n</div>\n"
|
41
|
+
end
|
42
|
+
|
43
|
+
it 'should add attributes when called as setters' do
|
44
|
+
span = Html::Element.new(:span)
|
45
|
+
span.class = 'dynamic'
|
46
|
+
span.id = 'header'
|
47
|
+
span.attrs.keys.should include(:class, :id)
|
48
|
+
span.render.should == '<span class="dynamic" id="header"></span>'
|
49
|
+
end
|
50
|
+
|
51
|
+
it 'should yield a block for customization on creation' do
|
52
|
+
Html::Element.new(:span) {|span|
|
53
|
+
span.id = 'fun'
|
54
|
+
}.render.should == '<span id="fun"></span>'
|
55
|
+
end
|
56
|
+
|
57
|
+
it 'should contain HTML' do
|
58
|
+
Html::Element.new(:span).html.should be_a(Html)
|
59
|
+
end
|
60
|
+
|
61
|
+
it 'should allow setting the inner html' do
|
62
|
+
span = Html::Element.new(:span)
|
63
|
+
span.html = 'some text'
|
64
|
+
span.render.should == '<span>some text</span>'
|
65
|
+
span.html = Html.new.strong('more text!')
|
66
|
+
span.render.should == '<span><strong>more text!</strong></span>'
|
67
|
+
end
|
68
|
+
|
69
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# Don't run specs if HtmlSafeString is not present, eg when running in a rails environment
|
2
|
+
if defined?(HtmlSafeString)
|
3
|
+
|
4
|
+
describe HtmlSafeString do
|
5
|
+
|
6
|
+
it 'should be html safe at creation' do
|
7
|
+
HtmlSafeString.new.should be_html_safe
|
8
|
+
end
|
9
|
+
|
10
|
+
it 'should stay html safe after concatenation' do
|
11
|
+
s = HtmlSafeString.new('alpha')
|
12
|
+
s += 'beta'
|
13
|
+
s.should == 'alphabeta'
|
14
|
+
s.should be_html_safe
|
15
|
+
end
|
16
|
+
|
17
|
+
it 'should safely escape dangerous chars on concatenation' do
|
18
|
+
s = HtmlSafeString.new('alpha')
|
19
|
+
s += 'b&ta'
|
20
|
+
s.should == 'alphab&ta'
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
describe Html do
|
2
|
+
|
3
|
+
it 'should generate simple HTML' do
|
4
|
+
Html.build do |html|
|
5
|
+
html.span('hello wwworld')
|
6
|
+
end.should == '<span>hello wwworld</span>'
|
7
|
+
end
|
8
|
+
|
9
|
+
it 'should escape unsafe characters' do
|
10
|
+
Html.escape_once('"hi&<guy>"').should == '"hi&<guy>"'
|
11
|
+
end
|
12
|
+
|
13
|
+
it 'should support comments' do
|
14
|
+
Html.build do |html|
|
15
|
+
html.comment! 'Important stuff'
|
16
|
+
html.h1 'Da header'
|
17
|
+
end.should == "<!-- Important stuff -->\n\n<h1>\n Da header\n</h1>\n"
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
describe String do
|
2
|
+
|
3
|
+
it 'should not be html safe' do
|
4
|
+
String.new.should_not be_html_safe
|
5
|
+
'bob'.should_not be_html_safe
|
6
|
+
end
|
7
|
+
|
8
|
+
it 'should become a safe string on calls to #html_safe' do
|
9
|
+
'abc'.html_safe.should be_a(HtmlSafeString)
|
10
|
+
end
|
11
|
+
|
12
|
+
it 'should not change contents on calls to #html_safe' do
|
13
|
+
'<span class="fun">'.html_safe.should == '<span class="fun">'
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
@@ -0,0 +1,101 @@
|
|
1
|
+
describe Url do
|
2
|
+
|
3
|
+
it 'should parse url paths' do
|
4
|
+
{
|
5
|
+
'/' => '/',
|
6
|
+
'http://google.com' => '',
|
7
|
+
'/site/main-bar?foo=123bar#some_bit' => '/site/main-bar'
|
8
|
+
}.each_pair do |url, path|
|
9
|
+
Url.parse(url).path.should == path
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
it 'should parse servers' do
|
14
|
+
{
|
15
|
+
'/' => nil,
|
16
|
+
'google.com' => nil,
|
17
|
+
'http://google.com' => 'google.com',
|
18
|
+
'http://google.com:8080' => 'google.com',
|
19
|
+
'http://www3.text-mates.org.uk:1234?foo' => 'www3.text-mates.org.uk',
|
20
|
+
'http://abc.com/yes.com/no.com#fun' => 'abc.com'
|
21
|
+
}.each_pair do |url, server|
|
22
|
+
Url.parse(url).server.should == server
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
it 'should parse a really complex url' do
|
27
|
+
u = Url.parse('sftp://mondo122.goober.com:819/this/is-a-bunch.jpg?of=crazy&free[]=55#now')
|
28
|
+
u.scheme.should == 'sftp'
|
29
|
+
u.server.should == 'mondo122.goober.com'
|
30
|
+
u.port.should == 819
|
31
|
+
u.path.should == '/this/is-a-bunch.jpg'
|
32
|
+
u.params['of'].should == 'crazy'
|
33
|
+
u.params['free[]'].should == '55'
|
34
|
+
u.fragment.should == 'now'
|
35
|
+
end
|
36
|
+
|
37
|
+
it 'should construct a simple url' do
|
38
|
+
u = Url.new
|
39
|
+
u.path = '/bob.jpg'
|
40
|
+
u.to_s.should == '/bob.jpg'
|
41
|
+
end
|
42
|
+
|
43
|
+
it 'should construct a complex url' do
|
44
|
+
u = Url.new
|
45
|
+
u.server = 'jimbo.net.org'
|
46
|
+
u.port = 1044
|
47
|
+
u.path = '/south-west'
|
48
|
+
u.add_param('site', 'http://goober.com?123')
|
49
|
+
u.fragment = 'boggle-noggle'
|
50
|
+
u.to_s.should == 'http://jimbo.net.org:1044/south-west?site=http%3A%2F%2Fgoober.com%3F123#boggle-noggle'
|
51
|
+
end
|
52
|
+
|
53
|
+
it 'should allow adding params' do
|
54
|
+
u = Url.parse('http://irongaze.com')
|
55
|
+
u.params['foo'] = 'bar'
|
56
|
+
u.to_s.should == 'http://irongaze.com?foo=bar'
|
57
|
+
end
|
58
|
+
|
59
|
+
it 'should allow multiple values for a single param' do
|
60
|
+
u = Url.new('/scores')
|
61
|
+
u.add_param('soccer', '123')
|
62
|
+
u.add_param('soccer', '456')
|
63
|
+
u = Url.parse(u.to_s)
|
64
|
+
val = u.params['soccer']
|
65
|
+
val.should be_an(Array)
|
66
|
+
val.length.should == 2
|
67
|
+
val[1].should == '456'
|
68
|
+
end
|
69
|
+
|
70
|
+
it 'should allow resetting params' do
|
71
|
+
u = Url.parse('/?a=1&b=2')
|
72
|
+
u.params.length.should == 2
|
73
|
+
u.reset_params
|
74
|
+
u.should_not have_params
|
75
|
+
end
|
76
|
+
|
77
|
+
it 'should allow removing a param' do
|
78
|
+
u = Url.parse('/?a=1&b=2')
|
79
|
+
u.remove_param('a')
|
80
|
+
u.params.length.should == 1
|
81
|
+
u.to_s.should == '/?b=2'
|
82
|
+
end
|
83
|
+
|
84
|
+
it 'should support adding to the path' do
|
85
|
+
u = Url.parse('/')
|
86
|
+
u += 'main/site'
|
87
|
+
u.to_s.should == '/main/site'
|
88
|
+
end
|
89
|
+
|
90
|
+
it 'should make relative urls absolute' do
|
91
|
+
u = Url.parse('/bar')
|
92
|
+
u.relative?.should be_true
|
93
|
+
Url.default_server = 'irongaze.com'
|
94
|
+
u.make_absolute.should == 'http://irongaze.com/bar'
|
95
|
+
end
|
96
|
+
|
97
|
+
it 'should escape params correctly' do
|
98
|
+
Url.build('/foo', 'one:two' => 'http://other.com').should == '/foo?one%3Atwo=http%3A%2F%2Fother.com'
|
99
|
+
end
|
100
|
+
|
101
|
+
end
|
metadata
ADDED
@@ -0,0 +1,87 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: iron-web
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Rob Morris
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-03-05 00:00:00.000000000Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: iron-extensions
|
16
|
+
requirement: &2152615480 !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ~>
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '1.0'
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: *2152615480
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: rspec
|
27
|
+
requirement: &2152608900 !ruby/object:Gem::Requirement
|
28
|
+
none: false
|
29
|
+
requirements:
|
30
|
+
- - ~>
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '2.6'
|
33
|
+
type: :development
|
34
|
+
prerelease: false
|
35
|
+
version_requirements: *2152608900
|
36
|
+
description: Html builder, color helper class and url parser/builder class for use
|
37
|
+
in Rails projects or other web-based content generation.
|
38
|
+
email:
|
39
|
+
- rob@irongaze.com
|
40
|
+
executables: []
|
41
|
+
extensions: []
|
42
|
+
extra_rdoc_files: []
|
43
|
+
files:
|
44
|
+
- lib/iron/web/color.rb
|
45
|
+
- lib/iron/web/html/element.rb
|
46
|
+
- lib/iron/web/html.rb
|
47
|
+
- lib/iron/web/string.rb
|
48
|
+
- lib/iron/web/url.rb
|
49
|
+
- lib/iron/web.rb
|
50
|
+
- spec/spec_helper.rb
|
51
|
+
- spec/web/color_spec.rb
|
52
|
+
- spec/web/element_spec.rb
|
53
|
+
- spec/web/html_safe_string_spec.rb
|
54
|
+
- spec/web/html_spec.rb
|
55
|
+
- spec/web/string_spec.rb
|
56
|
+
- spec/web/url_spec.rb
|
57
|
+
- LICENSE
|
58
|
+
- History.txt
|
59
|
+
- Version.txt
|
60
|
+
- README.rdoc
|
61
|
+
- .rspec
|
62
|
+
homepage: http://irongaze.com
|
63
|
+
licenses:
|
64
|
+
- MIT
|
65
|
+
post_install_message:
|
66
|
+
rdoc_options: []
|
67
|
+
require_paths:
|
68
|
+
- lib
|
69
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
70
|
+
none: false
|
71
|
+
requirements:
|
72
|
+
- - ! '>='
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
version: 1.9.2
|
75
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
76
|
+
none: false
|
77
|
+
requirements:
|
78
|
+
- - ! '>='
|
79
|
+
- !ruby/object:Gem::Version
|
80
|
+
version: '0'
|
81
|
+
requirements: []
|
82
|
+
rubyforge_project:
|
83
|
+
rubygems_version: 1.8.10
|
84
|
+
signing_key:
|
85
|
+
specification_version: 3
|
86
|
+
summary: Helper classes for generating web content
|
87
|
+
test_files: []
|