opal-jquery 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +5 -0
- data/.travis.yml +8 -0
- data/Gemfile +11 -0
- data/LICENSE +19 -0
- data/README.md +297 -0
- data/Rakefile +57 -0
- data/docs/post.html +3 -0
- data/docs/pre.html +18 -0
- data/lib/opal-jquery.rb +4 -0
- data/lib/opal-jquery/document.rb +47 -0
- data/lib/opal-jquery/element.rb +380 -0
- data/lib/opal-jquery/event.rb +39 -0
- data/lib/opal-jquery/http.rb +113 -0
- data/lib/opal-jquery/kernel.rb +6 -0
- data/lib/opal-jquery/local_storage.rb +25 -0
- data/opal-jquery.gemspec +16 -0
- data/spec/data/simple.txt +1 -0
- data/spec/data/user.json +4 -0
- data/spec/document_spec.rb +91 -0
- data/spec/element/after_spec.rb +33 -0
- data/spec/element/animations_spec.rb +50 -0
- data/spec/element/append_spec.rb +36 -0
- data/spec/element/append_to_spec.rb +25 -0
- data/spec/element/at_spec.rb +41 -0
- data/spec/element/attributes_spec.rb +202 -0
- data/spec/element/before_spec.rb +33 -0
- data/spec/element/class_name_spec.rb +82 -0
- data/spec/element/css_spec.rb +52 -0
- data/spec/element/display_spec.rb +45 -0
- data/spec/element/inspect_spec.rb +26 -0
- data/spec/element/length_spec.rb +5 -0
- data/spec/element/traversing_spec.rb +150 -0
- data/spec/element_spec.rb +107 -0
- data/spec/event_spec.rb +66 -0
- data/spec/http_spec.rb +49 -0
- data/spec/index.html +13 -0
- data/spec/local_storage_spec.rb +51 -0
- data/spec/spec_helper.rb +1 -0
- data/vendor/jquery.js +4 -0
- metadata +105 -0
@@ -0,0 +1,25 @@
|
|
1
|
+
module LocalStorage
|
2
|
+
def self.[](key)
|
3
|
+
%x{
|
4
|
+
var val = localStorage.getItem(key);
|
5
|
+
return val === null ? nil : val;
|
6
|
+
}
|
7
|
+
end
|
8
|
+
|
9
|
+
def self.[]=(key, value)
|
10
|
+
`localStorage.setItem(key, value)`
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.clear
|
14
|
+
`localStorage.clear()`
|
15
|
+
self
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.delete(key)
|
19
|
+
%x{
|
20
|
+
var val = localStorage.getItem(key);
|
21
|
+
localStorage.removeItem(key);
|
22
|
+
return val === null ? nil : val;
|
23
|
+
}
|
24
|
+
end
|
25
|
+
end
|
data/opal-jquery.gemspec
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
Gem::Specification.new do |s|
|
4
|
+
s.name = 'opal-jquery'
|
5
|
+
s.version = '0.0.1'
|
6
|
+
s.author = 'Adam Beynon'
|
7
|
+
s.email = 'adam.beynon@gmail.com'
|
8
|
+
s.homepage = 'http://opalrb.org'
|
9
|
+
s.summary = 'Opal access to jquery'
|
10
|
+
s.description = 'Opal DOM library for jquery'
|
11
|
+
|
12
|
+
s.files = `git ls-files`.split("\n")
|
13
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map { |f| File.basename(f) }
|
14
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
15
|
+
s.require_paths = ['lib']
|
16
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
hey
|
data/spec/data/user.json
ADDED
@@ -0,0 +1,91 @@
|
|
1
|
+
describe Document do
|
2
|
+
before do
|
3
|
+
@div = Document.parse <<-HTML
|
4
|
+
<div id="foo" class="bar"></div>
|
5
|
+
<div class="woosh"></div>
|
6
|
+
<div class="woosh"></div>
|
7
|
+
<div class="find-foo"></div>
|
8
|
+
<div class="find-bar"></div>
|
9
|
+
<div class="find-foo"></div>
|
10
|
+
HTML
|
11
|
+
|
12
|
+
@div.append_to_body
|
13
|
+
end
|
14
|
+
|
15
|
+
after do
|
16
|
+
@div.remove
|
17
|
+
end
|
18
|
+
|
19
|
+
describe ".[]" do
|
20
|
+
it "should be able to find elements with given id" do
|
21
|
+
Document['#foo'].class_name.should == "bar"
|
22
|
+
Document['#foo'].size.should == 1
|
23
|
+
end
|
24
|
+
|
25
|
+
it "should be able to match any valid CSS selector" do
|
26
|
+
Document['.woosh'].should be_kind_of(Element)
|
27
|
+
Document['.woosh'].size.should == 2
|
28
|
+
end
|
29
|
+
|
30
|
+
it "should return an empty Elements instance when not matching any elements" do
|
31
|
+
dom = Document['.some-non-existing-class']
|
32
|
+
|
33
|
+
dom.should be_kind_of(Element)
|
34
|
+
dom.size.should == 0
|
35
|
+
end
|
36
|
+
|
37
|
+
it "should accept an HTML string and parse it into a Elements instance" do
|
38
|
+
el = Document['<div id="foo-bar-baz"></div>']
|
39
|
+
|
40
|
+
el.should be_kind_of(Element)
|
41
|
+
el.id.should == "foo-bar-baz"
|
42
|
+
el.size.should == 1
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
describe ".find" do
|
47
|
+
it "should find all elements matching CSS selector" do
|
48
|
+
foo = Document.find '.find-foo'
|
49
|
+
foo.should be_kind_of(Element)
|
50
|
+
foo.length.should == 2
|
51
|
+
|
52
|
+
bar = Document.find '.find-bar'
|
53
|
+
bar.should be_kind_of(Element)
|
54
|
+
bar.length.should == 1
|
55
|
+
end
|
56
|
+
|
57
|
+
it "should return an empty Element instance with length 0 when no matching" do
|
58
|
+
baz = Document.find '.find-baz'
|
59
|
+
baz.should be_kind_of(Element)
|
60
|
+
baz.length.should == 0
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
describe '.id' do
|
65
|
+
it "should return a new instance with the element with given id" do
|
66
|
+
Document.id('foo').should be_kind_of(Element)
|
67
|
+
Document.id('foo').id.should == 'foo'
|
68
|
+
end
|
69
|
+
|
70
|
+
it "should return nil if no element could be found" do
|
71
|
+
Document.id('bad-element-id').should be_nil
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
describe '.parse' do
|
76
|
+
it "should return a new instance with parsed element as single element" do
|
77
|
+
foo = Document.parse '<div id="foo" class="bar"></div>'
|
78
|
+
foo.id.should == 'foo'
|
79
|
+
foo.class_name.should == 'bar'
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
describe '.title and .title=' do
|
84
|
+
it 'sets/gets the page title' do
|
85
|
+
current = Document.title
|
86
|
+
Document.title = 'hello from opal'
|
87
|
+
Document.title.should == 'hello from opal'
|
88
|
+
Document.title = current
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
describe "Element#after" do
|
2
|
+
before do
|
3
|
+
@div = Document.parse <<-HTML
|
4
|
+
<div id="after-spec">
|
5
|
+
<div id="some-header" class="kapow"></div>
|
6
|
+
<div id="foo" class="after-spec-first"></div>
|
7
|
+
<div id="bar" class="after-spec-first"></div>
|
8
|
+
<div id="baz"></div>
|
9
|
+
</div>
|
10
|
+
HTML
|
11
|
+
|
12
|
+
@div.append_to_body
|
13
|
+
end
|
14
|
+
|
15
|
+
after do
|
16
|
+
@div.remove
|
17
|
+
end
|
18
|
+
|
19
|
+
it "should insert the given html string after each element" do
|
20
|
+
el = Document['.after-spec-first']
|
21
|
+
el.size.should == 2
|
22
|
+
|
23
|
+
el.after '<p class="woosh"></p>'
|
24
|
+
|
25
|
+
Document.id('foo').next.class_name.should == "woosh"
|
26
|
+
Document.id('bar').next.class_name.should == "woosh"
|
27
|
+
end
|
28
|
+
|
29
|
+
it "should insert the given DOM element after this element" do
|
30
|
+
Document.id('baz').after Document.id('some-header')
|
31
|
+
Document.id('baz').next.id.should == "some-header"
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
describe "Element animation methods" do
|
2
|
+
before do
|
3
|
+
@div = Document.parse <<-HTML
|
4
|
+
<div id="animate-foo"></div>
|
5
|
+
HTML
|
6
|
+
|
7
|
+
@div.append_to_body
|
8
|
+
|
9
|
+
Document.id("animate-foo").css("width", "0px")
|
10
|
+
end
|
11
|
+
|
12
|
+
after do
|
13
|
+
@div.remove
|
14
|
+
end
|
15
|
+
|
16
|
+
describe "#animate" do
|
17
|
+
### HACKY
|
18
|
+
# jQUery's animate method doesn't *always* finish on time
|
19
|
+
# so the values are being compared using greater than
|
20
|
+
|
21
|
+
it "should animate a set of properties and values" do
|
22
|
+
foo = Document.id "animate-foo"
|
23
|
+
foo.animate :width => "200px"
|
24
|
+
|
25
|
+
set_timeout 400 do
|
26
|
+
(foo.css("width").to_f > 199).should be_true
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
it "should allow you to set a speed in the params" do
|
31
|
+
foo = Document.id "animate-foo"
|
32
|
+
foo.animate :width => "200px", :speed => 100
|
33
|
+
|
34
|
+
set_timeout 105 do
|
35
|
+
(foo.css("width").to_f > 199).should be_true
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
it "should accept a block as a callback" do
|
40
|
+
foo = Document.id "animate-foo"
|
41
|
+
foo.animate :width => "200px" do
|
42
|
+
foo.add_class "finished"
|
43
|
+
end
|
44
|
+
|
45
|
+
set_timeout 405 do
|
46
|
+
foo.class_name.should equal("finished")
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
describe "Element#append" do
|
2
|
+
before do
|
3
|
+
@div = Document.parse <<-HTML
|
4
|
+
<div id="append-spec">
|
5
|
+
<div id="foo" class="first-append"></div>
|
6
|
+
<div id="bar" class="first-append"></div>
|
7
|
+
<div id="baz"></div>
|
8
|
+
<div id="buz"></div>
|
9
|
+
</div>
|
10
|
+
HTML
|
11
|
+
|
12
|
+
@div.append_to_body
|
13
|
+
end
|
14
|
+
|
15
|
+
after do
|
16
|
+
@div.remove
|
17
|
+
end
|
18
|
+
|
19
|
+
it "should insert the HTML string to the end of each element" do
|
20
|
+
Document.find('.first-append').append '<p class="woosh"></p>'
|
21
|
+
|
22
|
+
Document.id('foo').children.class_name.should == "woosh"
|
23
|
+
Document.id('bar').children.class_name.should == "woosh"
|
24
|
+
end
|
25
|
+
|
26
|
+
it "should insert the given DOM node at the end of the element" do
|
27
|
+
baz = Document.id 'baz'
|
28
|
+
buz = Document.id 'buz'
|
29
|
+
|
30
|
+
baz.children.size.should == 0
|
31
|
+
baz.append buz
|
32
|
+
|
33
|
+
baz.children.size.should == 1
|
34
|
+
baz.children.id.should == "buz"
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
describe "Element#append_to" do
|
2
|
+
before do
|
3
|
+
@div = Document.parse <<-HTML
|
4
|
+
<div id="foo"></div>
|
5
|
+
<div id="bar"></div>
|
6
|
+
<div id="baz"></div>
|
7
|
+
HTML
|
8
|
+
|
9
|
+
@div.append_to_body
|
10
|
+
end
|
11
|
+
|
12
|
+
after do
|
13
|
+
@div.remove
|
14
|
+
end
|
15
|
+
|
16
|
+
it "should insert the receiver into the target element" do
|
17
|
+
Document.id('foo').children.size.should == 0
|
18
|
+
|
19
|
+
Document.parse('<ul class="kapow"></ul>').append_to Document.id('foo')
|
20
|
+
Document.id('foo').children.class_name.should == "kapow"
|
21
|
+
|
22
|
+
Document.id('bar').append_to Document.id('baz')
|
23
|
+
Document.id('baz').children.id.should == "bar"
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
describe "Element#at" do
|
2
|
+
before do
|
3
|
+
@div = Document.parse <<-HTML
|
4
|
+
<div id="at-spec">
|
5
|
+
<div class="foo" id="blah"></div>
|
6
|
+
<div class="foo" id="bleh"></div>
|
7
|
+
<div class="foo" id="bluh"></div>
|
8
|
+
</div>
|
9
|
+
HTML
|
10
|
+
|
11
|
+
@div.append_to_body
|
12
|
+
end
|
13
|
+
|
14
|
+
after do
|
15
|
+
@div.remove
|
16
|
+
end
|
17
|
+
|
18
|
+
it "returns the element at the given index" do
|
19
|
+
foos = Document.find '.foo'
|
20
|
+
foos.length.should == 3
|
21
|
+
|
22
|
+
foos.at(0).id.should == "blah"
|
23
|
+
foos.at(1).id.should == "bleh"
|
24
|
+
foos.at(2).id.should == "bluh"
|
25
|
+
end
|
26
|
+
|
27
|
+
it "counts from the last index for negative values" do
|
28
|
+
foos = Document.find '.foo'
|
29
|
+
|
30
|
+
foos.at(-1).id.should == "bluh"
|
31
|
+
foos.at(-2).id.should == "bleh"
|
32
|
+
foos.at(-3).id.should == "blah"
|
33
|
+
end
|
34
|
+
|
35
|
+
it "returns nil for indexes outside range" do
|
36
|
+
foos = Document.find '.foo'
|
37
|
+
|
38
|
+
foos.at(-4).should == nil
|
39
|
+
foos.at(4).should == nil
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,202 @@
|
|
1
|
+
describe Element do
|
2
|
+
before do
|
3
|
+
@div = Document.parse <<-HTML
|
4
|
+
<div id="attributes-spec">
|
5
|
+
<div id="foo"></div>
|
6
|
+
<div id="bar" class="apples"></div>
|
7
|
+
<div id="baz" class="lemons"></div>
|
8
|
+
|
9
|
+
<div id="attr-foo" title="Hello there!"></div>
|
10
|
+
<div id="attr-bar"></div>
|
11
|
+
<div id="attr-baz" title=""></div>
|
12
|
+
<div id="attr-woosh"></div>
|
13
|
+
<div id="attr-kapow" title="Apples"></div>
|
14
|
+
|
15
|
+
<div id="has-foo" class="apples"></div>
|
16
|
+
<div id="has-bar" class="lemons bananas"></div>
|
17
|
+
|
18
|
+
<div id="html-foo">Hey there</div>
|
19
|
+
<div id="html-bar"><p>Erm</p></div>
|
20
|
+
|
21
|
+
<div class="html-bridge">Hello</div>
|
22
|
+
<div class="html-bridge">Hello as well</div>
|
23
|
+
|
24
|
+
<div id="remove-foo"></div>
|
25
|
+
|
26
|
+
<div id="remove-bar" class="lemons"></div>
|
27
|
+
<div id="remove-baz" class="apples oranges"></div>
|
28
|
+
<div id="remove-buz" class="pineapples mangos"></div>
|
29
|
+
|
30
|
+
<div id="remove-bleh" class="fruit"></div>
|
31
|
+
|
32
|
+
<select id="value-foo">
|
33
|
+
<option selected="selected">Hello</option>
|
34
|
+
<option>World</option>
|
35
|
+
</select>
|
36
|
+
|
37
|
+
<input id="value-bar" type="text" value="Blah"></input>
|
38
|
+
<div id="value-baz"></div>
|
39
|
+
|
40
|
+
<input type="text" id="value-woosh" value=""></input>
|
41
|
+
</div>
|
42
|
+
HTML
|
43
|
+
|
44
|
+
@div.append_to_body
|
45
|
+
end
|
46
|
+
|
47
|
+
after do
|
48
|
+
@div.remove
|
49
|
+
end
|
50
|
+
|
51
|
+
describe '#[]' do
|
52
|
+
it 'should retrieve the attr value from the element' do
|
53
|
+
Document.id('attr-foo')[:title].should == "Hello there!"
|
54
|
+
end
|
55
|
+
|
56
|
+
it 'should return an empty string for an empty attribute value' do
|
57
|
+
Document.id('attr-bar')[:title].should == ""
|
58
|
+
Document.id('attr-baz')[:title].should == ""
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
describe '#[]=' do
|
63
|
+
it 'should set the attr value on the element' do
|
64
|
+
woosh = Document.id 'attr-woosh'
|
65
|
+
woosh[:title].should == ""
|
66
|
+
|
67
|
+
woosh[:title] = "Oranges"
|
68
|
+
woosh[:title].should == "Oranges"
|
69
|
+
end
|
70
|
+
|
71
|
+
it 'should replace the old value for the attribute' do
|
72
|
+
kapow = Document.id 'attr-kapow'
|
73
|
+
kapow[:title].should == "Apples"
|
74
|
+
|
75
|
+
kapow[:title] = "Pineapple"
|
76
|
+
kapow[:title].should == "Pineapple"
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
describe "#add_class" do
|
81
|
+
it "should add the given class name to the element" do
|
82
|
+
foo = Document.id 'foo'
|
83
|
+
foo.has_class?('lemons').should be_false
|
84
|
+
foo.add_class 'lemons'
|
85
|
+
foo.has_class?('lemons').should be_true
|
86
|
+
end
|
87
|
+
|
88
|
+
it "should not duplicate class names on an element" do
|
89
|
+
bar = Document.id 'bar'
|
90
|
+
bar.has_class?('apples').should be_true
|
91
|
+
bar.add_class 'apples'
|
92
|
+
bar.class_name.should == 'apples'
|
93
|
+
end
|
94
|
+
|
95
|
+
it "should return self" do
|
96
|
+
baz = Document.id 'baz'
|
97
|
+
baz.add_class('oranges').should equal(baz)
|
98
|
+
baz.add_class('oranges').should equal(baz)
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
describe '#has_class?' do
|
103
|
+
it "should return true if the element has the given class" do
|
104
|
+
Document.id('has-foo').has_class?("apples").should be_true
|
105
|
+
Document.id('has-foo').has_class?("oranges").should be_false
|
106
|
+
Document.id('has-bar').has_class?("lemons").should be_true
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
describe '#html' do
|
111
|
+
it "should return the html content of the element" do
|
112
|
+
Document.id('html-foo').html.should == "Hey there"
|
113
|
+
Document.id('html-bar').html.downcase.should == "<p>erm</p>"
|
114
|
+
end
|
115
|
+
|
116
|
+
it "should only return html for first matched element" do
|
117
|
+
Document.find('.html-bridge').html.should == "Hello"
|
118
|
+
end
|
119
|
+
|
120
|
+
it "should return empty string for empty set" do
|
121
|
+
Document.find('.html-nothing-here').html.should == ""
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
describe '#remove_class' do
|
126
|
+
it "should have no effect on elements without class" do
|
127
|
+
foo = Document.id 'remove-foo'
|
128
|
+
foo.class_name.should == ''
|
129
|
+
foo.remove_class 'blah'
|
130
|
+
foo.class_name.should == ''
|
131
|
+
end
|
132
|
+
|
133
|
+
it "should remove the given class from the element" do
|
134
|
+
bar = Document.id 'remove-bar'
|
135
|
+
bar.remove_class "lemons"
|
136
|
+
bar.class_name.should == ''
|
137
|
+
|
138
|
+
baz = Document.id 'remove-baz'
|
139
|
+
baz.remove_class 'lemons'
|
140
|
+
baz.class_name.should == 'apples oranges'
|
141
|
+
|
142
|
+
baz.remove_class 'apples'
|
143
|
+
baz.class_name.should == 'oranges'
|
144
|
+
|
145
|
+
buz = Document.id 'remove-buz'
|
146
|
+
buz.remove_class 'mangos'
|
147
|
+
buz.class_name.should == 'pineapples'
|
148
|
+
|
149
|
+
buz.remove_class 'pineapples'
|
150
|
+
buz.class_name.should == ''
|
151
|
+
end
|
152
|
+
|
153
|
+
it "should return self" do
|
154
|
+
bleh = Document.id 'remove-bleh'
|
155
|
+
bleh.remove_class('fruit').should equal(bleh)
|
156
|
+
bleh.remove_class('hmmmm').should equal(bleh)
|
157
|
+
end
|
158
|
+
end
|
159
|
+
|
160
|
+
describe '#toggle_class' do
|
161
|
+
it 'adds the given class name to the element if not already present' do
|
162
|
+
foo = Document['#foo']
|
163
|
+
foo.has_class?('oranges').should be_false
|
164
|
+
foo.toggle_class 'oranges'
|
165
|
+
foo.has_class?('oranges').should be_true
|
166
|
+
end
|
167
|
+
|
168
|
+
it 'removes the class if the element already has it' do
|
169
|
+
bar = Document['#bar']
|
170
|
+
bar.has_class?('apples').should be_true
|
171
|
+
bar.toggle_class 'apples'
|
172
|
+
bar.has_class?('apples').should be_false
|
173
|
+
end
|
174
|
+
end
|
175
|
+
|
176
|
+
describe "#value" do
|
177
|
+
it "should return the selected value of select elements" do
|
178
|
+
Document.id('value-foo').value.should == "Hello"
|
179
|
+
end
|
180
|
+
|
181
|
+
it "should return the value of normal input fields" do
|
182
|
+
Document.id('value-bar').value.should == "Blah"
|
183
|
+
end
|
184
|
+
|
185
|
+
it "should return an empty string for elements with no value attr" do
|
186
|
+
Document.id('value-baz').value.should == ""
|
187
|
+
end
|
188
|
+
end
|
189
|
+
|
190
|
+
describe "#value=" do
|
191
|
+
it "should set the value of the element to the given value" do
|
192
|
+
foo = Document.id 'value-woosh'
|
193
|
+
foo.value.should == ""
|
194
|
+
|
195
|
+
foo.value = "Hi"
|
196
|
+
foo.value.should == "Hi"
|
197
|
+
|
198
|
+
foo.value = "There"
|
199
|
+
foo.value.should == "There"
|
200
|
+
end
|
201
|
+
end
|
202
|
+
end
|