fron 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (59) hide show
  1. checksums.yaml +4 -4
  2. data/.ruby-gemset +1 -0
  3. data/.ruby-version +1 -0
  4. data/Gemfile +4 -0
  5. data/Gemfile.lock +35 -0
  6. data/Rakefile +18 -0
  7. data/docs/configuration.md +8 -8
  8. data/lib/fron/version.rb +1 -1
  9. data/opal/fron/core.rb +1 -1
  10. data/opal/fron/core/adapters/{local-storage.rb → local.rb} +7 -6
  11. data/opal/fron/core/application.rb +13 -11
  12. data/opal/fron/core/configuration.rb +3 -4
  13. data/opal/fron/core/controller.rb +2 -2
  14. data/opal/fron/core/eventable.rb +5 -2
  15. data/opal/fron/core/logger.rb +7 -0
  16. data/opal/fron/core/model.rb +10 -8
  17. data/opal/fron/core/router.rb +1 -1
  18. data/opal/fron/dom.rb +1 -0
  19. data/opal/fron/dom/document.rb +4 -0
  20. data/opal/fron/dom/element.rb +22 -6
  21. data/opal/fron/dom/event.rb +71 -68
  22. data/opal/fron/dom/fragment.rb +1 -3
  23. data/opal/fron/dom/modules/classlist.rb +2 -2
  24. data/opal/fron/dom/modules/dimensions.rb +7 -8
  25. data/opal/fron/dom/modules/events.rb +57 -12
  26. data/opal/fron/dom/node.rb +45 -11
  27. data/opal/fron/dom/nodelist.rb +14 -0
  28. data/opal/fron/dom/style.rb +17 -15
  29. data/opal/fron/dom/text.rb +2 -4
  30. data/opal/fron/dom/window.rb +2 -3
  31. data/opal/fron/request/request.rb +17 -14
  32. data/opal/fron/storage/local-storage.rb +29 -13
  33. data/spec/core-ext/hash_spec.rb +18 -0
  34. data/spec/core/adapter/local_spec.rb +65 -0
  35. data/spec/core/adapter/rails_spec.rb +72 -0
  36. data/spec/core/application_spec.rb +35 -0
  37. data/spec/core/component_spec.rb +107 -0
  38. data/spec/core/configuration_spec.rb +20 -0
  39. data/spec/core/controlller_spec.rb +68 -0
  40. data/spec/core/eventable_spec.rb +74 -0
  41. data/spec/core/logger_spec.rb +28 -0
  42. data/spec/core/model_spec.rb +125 -0
  43. data/spec/core/router_spec.rb +127 -0
  44. data/spec/dom/document_spec.rb +41 -0
  45. data/spec/dom/element_spec.rb +164 -0
  46. data/spec/dom/event_spec.rb +121 -0
  47. data/spec/dom/fragment_spec.rb +13 -0
  48. data/spec/dom/modules/classlist_spec.rb +72 -0
  49. data/spec/dom/modules/dimensions_spec.rb +55 -0
  50. data/spec/dom/modules/events_spec.rb +73 -0
  51. data/spec/dom/node_spec.rb +189 -0
  52. data/spec/dom/nodelist_spec.rb +12 -0
  53. data/spec/dom/style_spec.rb +31 -0
  54. data/spec/dom/text_spec.rb +12 -0
  55. data/spec/dom/window_spec.rb +30 -0
  56. data/spec/request/request_spec.rb +71 -0
  57. data/spec/request/response_spec.rb +46 -0
  58. data/spec/storage/local-storage_spec.rb +58 -0
  59. metadata +36 -4
@@ -0,0 +1,13 @@
1
+ require 'fron/dom'
2
+
3
+ describe DOM::Fragment do
4
+
5
+ subject { described_class.new }
6
+
7
+ describe '#initailize' do
8
+ it 'should create a document fragment' do
9
+ el = subject.instance_variable_get("@el")
10
+ `el instanceof DocumentFragment`.should be true
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,72 @@
1
+ require 'fron/dom'
2
+
3
+ describe DOM::ClassList do
4
+
5
+ let(:element) { DOM::Element.new 'div' }
6
+ subject { element['class'] }
7
+
8
+ describe '#addClass' do
9
+ it 'should add a class' do
10
+ element.addClass 'test'
11
+ subject.should eq 'test'
12
+ end
13
+
14
+ it 'should add multiple classes' do
15
+ element.addClass 'test', 'help'
16
+ subject.should eq 'test help'
17
+ end
18
+ end
19
+
20
+ describe '#removeClass' do
21
+ before do
22
+ element['class'] = 'test help'
23
+ end
24
+
25
+ it 'should add a class' do
26
+ element.removeClass 'test'
27
+ subject.should eq 'help'
28
+ end
29
+
30
+ it 'should add multiple classes' do
31
+ element.removeClass 'test', 'help'
32
+ subject.should eq ''
33
+ end
34
+ end
35
+
36
+ describe '#hasClass' do
37
+ it 'should return true if the element has given class' do
38
+ element['class'] = 'test'
39
+ element.hasClass('test').should eq true
40
+ end
41
+
42
+ it 'should return flase if the element does not have the given class' do
43
+ element.hasClass('test').should eq false
44
+ end
45
+ end
46
+
47
+ describe '#toggleClass' do
48
+ before do
49
+ element['class'] = 'test'
50
+ end
51
+
52
+ it 'should remove class if the element has the given class' do
53
+ element.toggleClass 'test'
54
+ subject.should eq ''
55
+ end
56
+
57
+ it 'should add class if the element does not have the given class' do
58
+ element.toggleClass 'help'
59
+ subject.should eq 'test help'
60
+ end
61
+
62
+ it 'should add class if the second argument is true' do
63
+ element.toggleClass 'help', true
64
+ subject.should eq 'test help'
65
+ end
66
+
67
+ it 'should remove class if the second argument if false' do
68
+ element.toggleClass 'test', false
69
+ subject.should eq ''
70
+ end
71
+ end
72
+ end
@@ -0,0 +1,55 @@
1
+ require 'fron/dom'
2
+
3
+ describe DOM::Dimensions do
4
+
5
+ let(:element) { DOM::Element.new 'div' }
6
+
7
+ before do
8
+ element >> DOM::Document.body
9
+ element.style.position = 'absolute'
10
+ element.style.width = '100px'
11
+ element.style.top = '40px'
12
+ element.style.left = '60px'
13
+ element.style.height = '80px'
14
+ end
15
+
16
+ after do
17
+ element.remove!
18
+ end
19
+
20
+ describe '#top' do
21
+ it 'should return the top position of the element' do
22
+ element.top.should eq 40
23
+ end
24
+ end
25
+
26
+ describe '#left' do
27
+ it 'should return the left position of the element' do
28
+ element.left.should eq 60
29
+ end
30
+ end
31
+
32
+ describe '#right' do
33
+ it 'should return the right position of the element' do
34
+ element.right.should eq 160
35
+ end
36
+ end
37
+
38
+ describe '#bottom' do
39
+ it 'should return the bottom position of the element' do
40
+ element.bottom.should eq 120
41
+ end
42
+ end
43
+
44
+ describe '#width' do
45
+ it 'should return the width of the element' do
46
+ element.width.should eq 100
47
+ end
48
+ end
49
+
50
+ describe '#height' do
51
+ it 'should return the height of the element' do
52
+ element.height.should eq 80
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,73 @@
1
+ require 'fron/dom'
2
+
3
+ describe DOM::Events do
4
+
5
+ let(:element) { DOM::Element.new 'div' }
6
+ subject { element.instance_variable_get("@listeners") }
7
+
8
+ describe '#on' do
9
+ async 'should register for event' do
10
+ listener = element.on 'click' do |event|
11
+ run_async do
12
+ subject.should_not be nil
13
+ subject[:click].should_not be nil
14
+ subject[:click].length.should eq 1
15
+ subject[:click].include?(listener).should eq true
16
+ element.off 'click'
17
+ end
18
+ end
19
+ element.trigger 'click'
20
+ end
21
+ end
22
+
23
+ describe '#off' do
24
+ context "two arguments" do
25
+ it 'should unregister for event' do
26
+ listener = element.on 'click' do end
27
+ subject[:click].include?(listener).should eq true
28
+ element.off 'click', listener
29
+ subject[:click].include?(listener).should eq false
30
+ end
31
+ end
32
+
33
+ context "one argument" do
34
+ it 'should unregister all events for type' do
35
+ listener = element.on 'click' do end
36
+ subject[:click].include?(listener).should eq true
37
+ element.off 'click'
38
+ subject[:click].include?(listener).should eq false
39
+ end
40
+ end
41
+
42
+ context "no argument" do
43
+ it 'should unregister all events' do
44
+ listener = element.on 'click' do end
45
+ subject[:click].include?(listener).should eq true
46
+ element.off
47
+ subject[:click].include?(listener).should eq false
48
+ end
49
+ end
50
+ end
51
+
52
+ describe '#delegate' do
53
+ async 'should call the listener if the element matches the selector' do
54
+ element.delegate 'click', 'div' do
55
+ run_async do
56
+ element.off 'click'
57
+ end
58
+ end
59
+ element.trigger 'click'
60
+ end
61
+ end
62
+
63
+ describe '#trigger' do
64
+ async 'should trigger the event' do
65
+ element.on 'click' do |event|
66
+ run_async do
67
+ element.off 'click'
68
+ end
69
+ end
70
+ element.trigger 'click'
71
+ end
72
+ end
73
+ end
@@ -0,0 +1,189 @@
1
+ require 'fron/dom'
2
+
3
+ class TestNode < DOM::NODE
4
+ attr_reader :el
5
+ end
6
+
7
+ describe TestNode do
8
+
9
+ let(:el) { DOM::Element.new('div') }
10
+ let(:body) { DOM::Document.body }
11
+ subject { described_class.new `document.createElement('div')` }
12
+
13
+ after do
14
+ subject.remove!
15
+ el.remove!
16
+ end
17
+
18
+ describe "#dup" do
19
+
20
+ let(:node) { subject.dup }
21
+
22
+ it 'should clone the node' do
23
+ node.should_not eq subject
24
+ end
25
+
26
+ it 'should have the same class' do
27
+ node.class.should eq TestNode
28
+ end
29
+ end
30
+
31
+ describe "#dup!" do
32
+ it 'should clone with children' do
33
+ subject << el
34
+ subject.children.length.should eq 1
35
+ node = subject.dup!
36
+ node.children.length.should eq 1
37
+ end
38
+ end
39
+
40
+ describe '#parent' do
41
+ it 'should return nil if there is no parent node' do
42
+ subject.parent.should eq nil
43
+ end
44
+
45
+ it 'should return a new NODE' do
46
+ subject >> body
47
+ subject.parent.class.should eq DOM::NODE
48
+ end
49
+ end
50
+
51
+ describe "#parentNode" do
52
+ it 'should return nil if there is no parent node' do
53
+ subject.parentNode.should eq nil
54
+ end
55
+
56
+ it 'should return a new NODE' do
57
+ subject >> body
58
+ subject.parentNode.class.should eq DOM::NODE
59
+ end
60
+ end
61
+
62
+ describe '#empty?' do
63
+ it 'should return true for no children' do
64
+ subject.empty?.should be true
65
+ end
66
+
67
+ it 'should return false for children' do
68
+ subject << el
69
+ subject.empty?.should be false
70
+ end
71
+ end
72
+
73
+ describe '#children' do
74
+ it 'should return a list of children' do
75
+ subject << el
76
+ subject.children.length.should be 1
77
+ subject.children.class.should eq DOM::NodeList
78
+ end
79
+ end
80
+
81
+ describe '#remove' do
82
+ it 'should remove the given node from this node' do
83
+ subject << el
84
+ el.parent.should_not eq nil
85
+ subject.remove el
86
+ el.parent.should eq nil
87
+ end
88
+ end
89
+
90
+ describe '#remove!' do
91
+ it 'should remove the node for its parent node' do
92
+ subject >> body
93
+ subject.parent.should_not eq nil
94
+ subject.remove!
95
+ subject.parent.should eq nil
96
+ end
97
+ end
98
+
99
+ describe '#<<' do
100
+ it 'should append given node to the node' do
101
+ subject << el
102
+ subject.children.length.should eq 1
103
+ el.parent.should_not be nil
104
+ el.parent.should eq subject
105
+ subject.children.include?(el).should be true
106
+ end
107
+ end
108
+
109
+ describe '#>>' do
110
+ it 'should append the node to the given node' do
111
+ subject >> body
112
+ subject.parent.should_not be nil
113
+ subject.parent.should eq body
114
+ end
115
+ end
116
+
117
+ describe '#insertBefore' do
118
+ let(:otherEl) { DOM::Element.new 'div' }
119
+
120
+ it 'should insert given node before the other given node' do
121
+ subject << el
122
+ subject << otherEl
123
+ el.should > otherEl
124
+ otherEl.should < el
125
+ end
126
+ end
127
+
128
+ describe "#text" do
129
+ it 'should return the nodes textContent' do
130
+ `#{subject.el}.textContent = 'Test'`
131
+ subject.text.should eq 'Test'
132
+ end
133
+ end
134
+
135
+ describe "#text=" do
136
+ it 'should set the nodes textContent' do
137
+ subject.text = 'Asd'
138
+ `#{subject.el}.textContent`.should eq 'Asd'
139
+ end
140
+ end
141
+
142
+ describe '#normalize!' do
143
+ it 'should normalize the node' do
144
+ subject << DOM::Text.new('a')
145
+ subject << DOM::Text.new('b')
146
+ subject.children.length.should eq 2
147
+ subject.normalize!
148
+ subject.children.length.should eq 1
149
+ end
150
+ end
151
+
152
+ describe '#==' do
153
+ it 'should return true for same el' do
154
+ subject >> el
155
+ subject.should == el.children[0]
156
+ end
157
+
158
+ it 'should return false for not same el' do
159
+ expect(subject != el).to eq true
160
+ end
161
+ end
162
+
163
+ describe "<=>" do
164
+ it 'should return 0 if nodes are the same' do
165
+ subject >> el
166
+ expect(el.children[0] <=> subject).to eq 0
167
+ end
168
+
169
+ it 'should throw if the nodes are not in the same parent' do
170
+ subject >> body
171
+ expect(Proc.new { el <=> subject } ).to raise_error
172
+ end
173
+
174
+ it 'should compare indexes if the nodes are in the same parent' do
175
+ subject >> body
176
+ el >> body
177
+ expect(el <=> subject).to eq -1
178
+ expect(subject <=> el).to eq 1
179
+ end
180
+ end
181
+
182
+ describe 'index' do
183
+ it 'should return index (position) of the node' do
184
+ el << DOM::Text.new('Test')
185
+ subject >> el
186
+ subject.index.should eq 1
187
+ end
188
+ end
189
+ end
@@ -0,0 +1,12 @@
1
+ require 'fron/dom'
2
+
3
+ describe DOM::NodeList do
4
+
5
+ describe '#initialize' do
6
+ it 'should map nodes to elements' do
7
+ DOM::Document.body.children.each do |node|
8
+ node.class.should eq DOM::NODE
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,31 @@
1
+ describe DOM::Style do
2
+
3
+ subject { DOM::Element.new 'div' }
4
+ let(:el) { subject.instance_variable_get("@el") }
5
+
6
+ describe "method_missing" do
7
+ it 'should call []= if the methods ends with =' do
8
+ expect(subject.style).to receive(:[]=).with 'display', 'none'
9
+ subject.style.display = 'none'
10
+ end
11
+
12
+ it 'should call [] if the method does not end with =' do
13
+ expect(subject.style).to receive(:[]).with 'display'
14
+ subject.style.display
15
+ end
16
+ end
17
+
18
+ describe "[]=" do
19
+ it 'should set the given style' do
20
+ subject.style['display'] = 'none'
21
+ `#{el}.style.display`.should eq 'none'
22
+ end
23
+ end
24
+
25
+ describe "[]" do
26
+ it 'should return with the value of the given style' do
27
+ `#{el}.style.display = 'block'`
28
+ subject.style['display'].should eq 'block'
29
+ end
30
+ end
31
+ end