fron 0.1.0 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.ruby-gemset +1 -0
- data/.ruby-version +1 -0
- data/Gemfile +4 -0
- data/Gemfile.lock +35 -0
- data/Rakefile +18 -0
- data/docs/configuration.md +8 -8
- data/lib/fron/version.rb +1 -1
- data/opal/fron/core.rb +1 -1
- data/opal/fron/core/adapters/{local-storage.rb → local.rb} +7 -6
- data/opal/fron/core/application.rb +13 -11
- data/opal/fron/core/configuration.rb +3 -4
- data/opal/fron/core/controller.rb +2 -2
- data/opal/fron/core/eventable.rb +5 -2
- data/opal/fron/core/logger.rb +7 -0
- data/opal/fron/core/model.rb +10 -8
- data/opal/fron/core/router.rb +1 -1
- data/opal/fron/dom.rb +1 -0
- data/opal/fron/dom/document.rb +4 -0
- data/opal/fron/dom/element.rb +22 -6
- data/opal/fron/dom/event.rb +71 -68
- data/opal/fron/dom/fragment.rb +1 -3
- data/opal/fron/dom/modules/classlist.rb +2 -2
- data/opal/fron/dom/modules/dimensions.rb +7 -8
- data/opal/fron/dom/modules/events.rb +57 -12
- data/opal/fron/dom/node.rb +45 -11
- data/opal/fron/dom/nodelist.rb +14 -0
- data/opal/fron/dom/style.rb +17 -15
- data/opal/fron/dom/text.rb +2 -4
- data/opal/fron/dom/window.rb +2 -3
- data/opal/fron/request/request.rb +17 -14
- data/opal/fron/storage/local-storage.rb +29 -13
- data/spec/core-ext/hash_spec.rb +18 -0
- data/spec/core/adapter/local_spec.rb +65 -0
- data/spec/core/adapter/rails_spec.rb +72 -0
- data/spec/core/application_spec.rb +35 -0
- data/spec/core/component_spec.rb +107 -0
- data/spec/core/configuration_spec.rb +20 -0
- data/spec/core/controlller_spec.rb +68 -0
- data/spec/core/eventable_spec.rb +74 -0
- data/spec/core/logger_spec.rb +28 -0
- data/spec/core/model_spec.rb +125 -0
- data/spec/core/router_spec.rb +127 -0
- data/spec/dom/document_spec.rb +41 -0
- data/spec/dom/element_spec.rb +164 -0
- data/spec/dom/event_spec.rb +121 -0
- data/spec/dom/fragment_spec.rb +13 -0
- data/spec/dom/modules/classlist_spec.rb +72 -0
- data/spec/dom/modules/dimensions_spec.rb +55 -0
- data/spec/dom/modules/events_spec.rb +73 -0
- data/spec/dom/node_spec.rb +189 -0
- data/spec/dom/nodelist_spec.rb +12 -0
- data/spec/dom/style_spec.rb +31 -0
- data/spec/dom/text_spec.rb +12 -0
- data/spec/dom/window_spec.rb +30 -0
- data/spec/request/request_spec.rb +71 -0
- data/spec/request/response_spec.rb +46 -0
- data/spec/storage/local-storage_spec.rb +58 -0
- metadata +36 -4
@@ -0,0 +1,127 @@
|
|
1
|
+
require 'fron/core'
|
2
|
+
|
3
|
+
module Fron
|
4
|
+
class Router
|
5
|
+
attr_reader :routes
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
class TestRouteController < Fron::Controller
|
10
|
+
route "show/:id", :show
|
11
|
+
route "*", :test
|
12
|
+
|
13
|
+
before :empty, [:show]
|
14
|
+
|
15
|
+
def empty
|
16
|
+
end
|
17
|
+
def show
|
18
|
+
end
|
19
|
+
def test
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
describe Fron::Router do
|
24
|
+
|
25
|
+
subject { described_class.new [], config }
|
26
|
+
let(:window) { DOM::Window }
|
27
|
+
let(:window_listeners) {window.instance_variable_get("@listeners")}
|
28
|
+
let(:controller) { TestRouteController.new }
|
29
|
+
let(:config) { double :config, {
|
30
|
+
logger: double(:logger,info: true),
|
31
|
+
main: double(:main, :"<<" => true, "empty" => true)
|
32
|
+
}
|
33
|
+
}
|
34
|
+
|
35
|
+
before { window.off }
|
36
|
+
|
37
|
+
describe "DSL" do
|
38
|
+
describe "#map" do
|
39
|
+
it "should retrun '*' path for action only" do
|
40
|
+
result = described_class.map :test
|
41
|
+
result[:path].should eq "*"
|
42
|
+
result[:action].should eq :test
|
43
|
+
end
|
44
|
+
|
45
|
+
it "should return regexp for path" do
|
46
|
+
result = described_class.map "/test", :test
|
47
|
+
result[:path][:regexp].should eq Regexp.new "^/test"
|
48
|
+
result[:path][:map].should eq nil
|
49
|
+
result[:action].should eq :test
|
50
|
+
end
|
51
|
+
|
52
|
+
it 'should parse string as action' do
|
53
|
+
result = described_class.map :test
|
54
|
+
result[:action].should eq :test
|
55
|
+
result[:controller].should be nil
|
56
|
+
end
|
57
|
+
|
58
|
+
it 'should parse controllers as controller' do
|
59
|
+
result = described_class.map Fron::Controller
|
60
|
+
result[:controller].should_not be nil
|
61
|
+
result[:controller].class.should eq Fron::Controller
|
62
|
+
result[:action].should eq nil
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
describe "#route" do
|
68
|
+
it "should deletage if controller is given" do
|
69
|
+
subject.routes << {path: "*", controller: controller}
|
70
|
+
subject.should receive(:route).twice.and_call_original
|
71
|
+
subject.route
|
72
|
+
end
|
73
|
+
|
74
|
+
it "should call controller action" do
|
75
|
+
subject.routes << {path: "*", controller: controller}
|
76
|
+
controller.should receive(:test).once
|
77
|
+
subject.route
|
78
|
+
end
|
79
|
+
|
80
|
+
it "should call controller action with params" do
|
81
|
+
controller.should receive(:show).once.with({id: '10'})
|
82
|
+
subject.routes << {path: "*", controller: controller}
|
83
|
+
subject.route 'show/10'
|
84
|
+
end
|
85
|
+
|
86
|
+
it "should remove the matched portion of the hash" do
|
87
|
+
controller.should receive(:show).once.with({id: '10'})
|
88
|
+
subject.routes << {path: {regexp: Regexp.new("test/")}, controller: controller}
|
89
|
+
subject.route 'test/show/10'
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
describe "#applyRoute" do
|
94
|
+
it "should call before methods" do
|
95
|
+
controller.should receive(:empty).once
|
96
|
+
subject.applyRoute controller, {action: 'show'}
|
97
|
+
end
|
98
|
+
|
99
|
+
it "should call action method" do
|
100
|
+
controller.should receive(:show).once
|
101
|
+
subject.applyRoute controller, {action: 'show'}
|
102
|
+
end
|
103
|
+
|
104
|
+
it 'should log the route' do
|
105
|
+
config.logger.should receive(:info).once
|
106
|
+
subject.applyRoute controller, {action: 'show'}
|
107
|
+
end
|
108
|
+
|
109
|
+
it "should append it the the main" do
|
110
|
+
config.main.should receive(:<<).once
|
111
|
+
subject.applyRoute controller, {action: 'show'}
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
describe "#initalize" do
|
116
|
+
it 'should listen on window load' do
|
117
|
+
subject
|
118
|
+
window_listeners['load'].should_not be nil
|
119
|
+
end
|
120
|
+
|
121
|
+
it 'should listen on window hashchange' do
|
122
|
+
subject
|
123
|
+
window_listeners['hashchange'].should_not be nil
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'fron/dom'
|
2
|
+
|
3
|
+
describe DOM::Document do
|
4
|
+
|
5
|
+
subject { DOM::Document }
|
6
|
+
|
7
|
+
describe "head" do
|
8
|
+
it 'should return the head element' do
|
9
|
+
DOM::Element.new(`document.head`).should eq subject.head
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
describe "body" do
|
14
|
+
it 'should return the body element' do
|
15
|
+
DOM::Element.new(`document.body`).should eq subject.body
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
describe 'title' do
|
20
|
+
it 'should return the title of the document' do
|
21
|
+
subject.title.should eq "Opal Server"
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
describe 'title=' do
|
26
|
+
it 'should set the title of the document' do
|
27
|
+
subject.title = 'test'
|
28
|
+
`document.title`.should eq 'test'
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
describe 'find' do
|
33
|
+
it 'should return nil if no element is found' do
|
34
|
+
subject.find('list').should eq nil
|
35
|
+
end
|
36
|
+
|
37
|
+
it 'should return element' do
|
38
|
+
subject.find('body').class.should eq DOM::Element
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,164 @@
|
|
1
|
+
require 'fron/dom'
|
2
|
+
|
3
|
+
describe DOM::Element do
|
4
|
+
|
5
|
+
subject { described_class.new 'div' }
|
6
|
+
let(:el) { subject.instance_variable_get("@el") }
|
7
|
+
let(:a) { described_class.new 'a' }
|
8
|
+
|
9
|
+
describe "#initailize" do
|
10
|
+
context "string argument" do
|
11
|
+
it 'should create an element with tagname' do
|
12
|
+
described_class.new('div').tag.should eq 'div'
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'should add classes' do
|
16
|
+
el = described_class.new('div.test.help')
|
17
|
+
el.hasClass('test').should be true
|
18
|
+
el.hasClass('help').should be true
|
19
|
+
end
|
20
|
+
|
21
|
+
it 'should set the id' do
|
22
|
+
el = described_class.new('div#test')
|
23
|
+
el.id.should eq 'test'
|
24
|
+
end
|
25
|
+
|
26
|
+
it 'should set attributes' do
|
27
|
+
el = described_class.new('div[href=test][link=rel]')
|
28
|
+
el['href'].should eq 'test'
|
29
|
+
el['link'].should eq 'rel'
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
context "node argument" do
|
34
|
+
it 'should link given node' do
|
35
|
+
el = described_class.new `document.body`
|
36
|
+
el.tag.should eq 'body'
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
context "other argument" do
|
41
|
+
it "should throw error" do
|
42
|
+
expect(Proc.new { described_class.new({}) } ).to raise_error
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
describe '#matches' do
|
48
|
+
it 'should return if matches selector' do
|
49
|
+
subject.matches('div').should be true
|
50
|
+
end
|
51
|
+
|
52
|
+
it 'should return flase unless matches selector' do
|
53
|
+
subject.matches('body').should be false
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
describe '#hide' do
|
58
|
+
it 'should hide the element' do
|
59
|
+
subject.hide
|
60
|
+
subject.style.display.should eq 'none'
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
describe '#show' do
|
65
|
+
it 'should show the element' do
|
66
|
+
subject.show
|
67
|
+
subject.style.display.should eq 'block'
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
describe '#[]' do
|
72
|
+
it 'should return the given attribute value' do
|
73
|
+
`#{el}.setAttribute('test','data')`
|
74
|
+
subject['test'].should eq 'data'
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
describe '#[]=' do
|
79
|
+
it 'should set the given attribute with the given value' do
|
80
|
+
subject['test'] = 'data'
|
81
|
+
`#{el}.getAttribute('test')`.should eq 'data'
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
describe '#find' do
|
86
|
+
it 'should find a descendant element' do
|
87
|
+
a >> subject
|
88
|
+
subject.find('a').should eq a
|
89
|
+
end
|
90
|
+
|
91
|
+
it 'should return nil if no element is found' do
|
92
|
+
subject.find('p').should eq nil
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
describe "#html" do
|
97
|
+
it 'should get the html of the element' do
|
98
|
+
`#{el}.innerHTML = 'test'`
|
99
|
+
subject.html.should eq 'test'
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
describe '#html=' do
|
104
|
+
it 'should set the html of the element' do
|
105
|
+
subject.html = 'test'
|
106
|
+
`#{el}.innerHTML`.should eq 'test'
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
describe '#empty' do
|
111
|
+
it 'should empty the element' do
|
112
|
+
subject << a
|
113
|
+
subject.empty
|
114
|
+
subject.children.length.should eq 0
|
115
|
+
subject.html.should eq ""
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
describe "#value" do
|
120
|
+
it 'should get the value of the element' do
|
121
|
+
`#{el}.value = 'test'`
|
122
|
+
subject.value.should eq 'test'
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
describe '#value=' do
|
127
|
+
it 'should set the value of the element' do
|
128
|
+
subject.value = 'test'
|
129
|
+
`#{el}.value`.should eq 'test'
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
133
|
+
describe '#checked' do
|
134
|
+
it 'should return false unless the element is checked' do
|
135
|
+
subject.checked.should be false
|
136
|
+
end
|
137
|
+
|
138
|
+
it 'should return true if the element is checked' do
|
139
|
+
`#{el}.checked = true`
|
140
|
+
subject.checked.should be true
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
144
|
+
describe '#checked=' do
|
145
|
+
it 'should set the checked property' do
|
146
|
+
subject.checked = true
|
147
|
+
`#{el}.checked == true`
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
describe '#tag' do
|
152
|
+
it 'should return the elements tagName' do
|
153
|
+
subject.tag.should eq 'div'
|
154
|
+
a.tag.should eq 'a'
|
155
|
+
end
|
156
|
+
end
|
157
|
+
|
158
|
+
describe '#id' do
|
159
|
+
it 'should return the id of the element' do
|
160
|
+
`#{el}.id = 'test'`
|
161
|
+
subject.id.should eq 'test'
|
162
|
+
end
|
163
|
+
end
|
164
|
+
end
|
@@ -0,0 +1,121 @@
|
|
1
|
+
describe DOM::Event do
|
2
|
+
|
3
|
+
subject { described_class.new data, Hash }
|
4
|
+
|
5
|
+
let(:data) {%x{
|
6
|
+
return { charCode: 1,
|
7
|
+
keyCode: 2,
|
8
|
+
pageX: 3,
|
9
|
+
pageY: 4,
|
10
|
+
screenX: 5,
|
11
|
+
screenY: 6,
|
12
|
+
clientX: 7,
|
13
|
+
clientY: 8,
|
14
|
+
altKey: true,
|
15
|
+
shiftKey: false,
|
16
|
+
ctrlKey: true,
|
17
|
+
metaKey: false,
|
18
|
+
preventDefault: function(){return 1},
|
19
|
+
stopPropagation: function(){return 2},
|
20
|
+
target: {test: 'data'} }
|
21
|
+
}}
|
22
|
+
|
23
|
+
describe '#stop' do
|
24
|
+
it "should call stopPropagation and preventDefault" do
|
25
|
+
expect(subject).to receive(:stopPropagation).once
|
26
|
+
expect(subject).to receive(:preventDefault).once
|
27
|
+
subject.stop
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
describe "#stopPropagation" do
|
32
|
+
it 'should call stopPropagation of the event' do
|
33
|
+
subject.stopPropagation.should eq 2
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
describe "#preventDefault" do
|
38
|
+
it 'should call preventDefault of the event' do
|
39
|
+
subject.preventDefault.should eq 1
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
describe "#target" do
|
44
|
+
it 'should return the target' do
|
45
|
+
subject.target['test'].should eq 'data'
|
46
|
+
subject.target.class.should eq Hash
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
describe "#charCode" do
|
51
|
+
it 'should return the charCode' do
|
52
|
+
subject.charCode.should eq 1
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
describe "#keyCode" do
|
57
|
+
it 'should return the keyCode' do
|
58
|
+
subject.keyCode.should eq 2
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
describe "#pageX" do
|
63
|
+
it 'should return the pageX' do
|
64
|
+
subject.pageX.should eq 3
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
describe "#pageY" do
|
69
|
+
it 'should return the pageY' do
|
70
|
+
subject.pageY.should eq 4
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
describe "#screenX" do
|
75
|
+
it 'should return the screenX' do
|
76
|
+
subject.screenX.should eq 5
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
describe "#screenY" do
|
81
|
+
it 'should return the screenY' do
|
82
|
+
subject.screenY.should eq 6
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
describe "#clientX" do
|
87
|
+
it 'should return the clientX' do
|
88
|
+
subject.clientX.should eq 7
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
describe "#clientY" do
|
93
|
+
it 'should return the clientY' do
|
94
|
+
subject.clientY.should eq 8
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
describe "#alt?" do
|
99
|
+
it 'should return the alt?' do
|
100
|
+
subject.alt?.should eq true
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
describe "#shift?" do
|
105
|
+
it 'should return the shift?' do
|
106
|
+
subject.shift?.should eq false
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
describe "#ctrl?" do
|
111
|
+
it 'should return the ctrl?' do
|
112
|
+
subject.ctrl?.should eq true
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
describe "#meta?" do
|
117
|
+
it 'should return the meta?' do
|
118
|
+
subject.meta?.should eq false
|
119
|
+
end
|
120
|
+
end
|
121
|
+
end
|