bubble-wrap 1.7.1 → 1.8.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.
- checksums.yaml +4 -4
- data/.gitignore +0 -1
- data/.travis.yml +1 -1
- data/GETTING_STARTED.md +1 -1
- data/Gemfile.lock +10 -10
- data/README.md +266 -122
- data/Rakefile +1 -1
- data/bubble-wrap.gemspec +7 -6
- data/lib/bubble-wrap.rb +0 -1
- data/lib/bubble-wrap/all.rb +13 -1
- data/lib/bubble-wrap/location.rb +1 -1
- data/lib/bubble-wrap/motion.rb +10 -0
- data/lib/bubble-wrap/rss_parser.rb +0 -1
- data/lib/bubble-wrap/test.rb +1 -0
- data/lib/bubble-wrap/version.rb +1 -1
- data/motion/core/device/ios/camera.rb +12 -1
- data/motion/core/ios/device.rb +7 -1
- data/motion/core/json.rb +1 -1
- data/motion/core/osx/app.rb +11 -1
- data/motion/core/time.rb +27 -4
- data/motion/location/location.rb +6 -2
- data/motion/mail/mail.rb +4 -0
- data/motion/media/player.rb +2 -1
- data/motion/motion/motion.rb +421 -0
- data/motion/reactor/deferrable.rb +29 -3
- data/motion/reactor/eventable.rb +3 -1
- data/motion/reactor/thread_aware_deferrable.rb +37 -0
- data/motion/rss_parser.rb +11 -21
- data/motion/sms/sms.rb +4 -0
- data/motion/ui/ui_alert_view.rb +3 -1
- data/motion/ui/ui_control_wrapper.rb +27 -0
- data/motion/ui/ui_view_wrapper.rb +1 -7
- data/motion/util/constants.rb +1 -1
- data/samples/alert/Gemfile +1 -0
- data/samples/alert/Gemfile.lock +16 -0
- data/samples/alert/Rakefile +1 -1
- data/samples/camera/Gemfile +2 -1
- data/samples/camera/Gemfile.lock +16 -0
- data/samples/camera/Rakefile +1 -1
- data/samples/gesture/Gemfile +2 -1
- data/samples/gesture/Gemfile.lock +9 -3
- data/samples/gesture/Rakefile +1 -1
- data/samples/location/Gemfile +3 -1
- data/samples/location/Gemfile.lock +18 -0
- data/samples/location/Rakefile +4 -2
- data/samples/location/app/controllers/{image_list_controller.rb → places_list_controller.rb} +0 -0
- data/samples/media/Gemfile +4 -0
- data/samples/media/Gemfile.lock +16 -0
- data/samples/media/Rakefile +1 -1
- data/samples/osx/Gemfile +3 -1
- data/samples/osx/Gemfile.lock +5 -1
- data/spec/lib/bubble-wrap/requirement_spec.rb +2 -2
- data/spec/motion/core/app_spec.rb +23 -0
- data/spec/motion/core/device/ios/camera_spec.rb +1 -1
- data/spec/motion/core/device/ios/device_spec.rb +6 -0
- data/spec/motion/core/ios/app_spec.rb +9 -24
- data/spec/motion/core/json_spec.rb +30 -10
- data/spec/motion/core/osx/app_spec.rb +2 -1
- data/spec/motion/core/time_spec.rb +34 -1
- data/spec/motion/location/location_spec.rb +6 -0
- data/spec/motion/mail/mail_spec.rb +20 -16
- data/spec/motion/motion/core_motion_spec.rb +231 -0
- data/spec/motion/reactor/deferrable_spec.rb +81 -0
- data/spec/motion/reactor/eventable_spec.rb +11 -0
- data/spec/motion/reactor/thread_aware_deferrable_spec.rb +85 -0
- data/spec/motion/rss_parser_spec.rb +11 -21
- data/spec/motion/sms/sms_spec.rb +11 -6
- data/spec/motion/ui/ui_alert_view_spec.rb +23 -0
- data/spec/motion/ui/ui_control_wrapper_spec.rb +24 -0
- metadata +58 -38
- data/lib/bubble-wrap/http.rb +0 -7
@@ -0,0 +1,231 @@
|
|
1
|
+
describe BubbleWrap::Motion do
|
2
|
+
|
3
|
+
it 'should be able to instantiate all the things' do
|
4
|
+
mgr = CMMotionManager.alloc.init
|
5
|
+
mgr.should.be.kind_of(CMMotionManager)
|
6
|
+
|
7
|
+
accelerometer = BubbleWrap::Motion::Accelerometer.new(mgr)
|
8
|
+
accelerometer.should.be.kind_of(BubbleWrap::Motion::Accelerometer)
|
9
|
+
|
10
|
+
gyroscope = BubbleWrap::Motion::Gyroscope.new(mgr)
|
11
|
+
gyroscope.should.be.kind_of(BubbleWrap::Motion::Gyroscope)
|
12
|
+
|
13
|
+
magnetometer = BubbleWrap::Motion::Magnetometer.new(mgr)
|
14
|
+
magnetometer.should.be.kind_of(BubbleWrap::Motion::Magnetometer)
|
15
|
+
|
16
|
+
devicemotion = BubbleWrap::Motion::DeviceMotion.new(mgr)
|
17
|
+
devicemotion.should.be.kind_of(BubbleWrap::Motion::DeviceMotion)
|
18
|
+
end
|
19
|
+
|
20
|
+
describe 'BubbleWrap::Motion.manager' do
|
21
|
+
it 'should return a CMMotionManager' do
|
22
|
+
BubbleWrap::Motion.manager.should.be.kind_of(CMMotionManager)
|
23
|
+
end
|
24
|
+
it 'should be a shared instance' do
|
25
|
+
mgr1 = BubbleWrap::Motion.manager
|
26
|
+
mgr2 = BubbleWrap::Motion.manager
|
27
|
+
mgr1.should.equal? mgr2
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
describe 'BubbleWrap::Motion.accelerometer' do
|
32
|
+
it 'should be a BubbleWrap::Motion::Accelerometer' do
|
33
|
+
BubbleWrap::Motion.accelerometer.should.be.kind_of(BubbleWrap::Motion::Accelerometer)
|
34
|
+
end
|
35
|
+
it 'should be shared instanceAccelerometer' do
|
36
|
+
obj1 = BubbleWrap::Motion.accelerometer
|
37
|
+
obj2 = BubbleWrap::Motion.accelerometer
|
38
|
+
obj1.should.equal? obj2
|
39
|
+
end
|
40
|
+
it 'should not be available in the simulator' do
|
41
|
+
BubbleWrap::Motion.accelerometer.available?.should == false
|
42
|
+
end
|
43
|
+
it 'should not be active in the simulator' do
|
44
|
+
BubbleWrap::Motion.accelerometer.active?.should == false
|
45
|
+
end
|
46
|
+
it 'should not have data' do
|
47
|
+
BubbleWrap::Motion.accelerometer.data.should == nil
|
48
|
+
end
|
49
|
+
it 'should be able to start with a block' do
|
50
|
+
-> do
|
51
|
+
BubbleWrap::Motion.accelerometer.start {}
|
52
|
+
BubbleWrap::Motion.accelerometer.stop
|
53
|
+
end.should.not.raise
|
54
|
+
end
|
55
|
+
it 'should be able to start without a block' do
|
56
|
+
-> do
|
57
|
+
BubbleWrap::Motion.accelerometer.start
|
58
|
+
BubbleWrap::Motion.accelerometer.stop
|
59
|
+
end.should.not.raise
|
60
|
+
end
|
61
|
+
it 'should be able to repeat' do
|
62
|
+
-> do
|
63
|
+
BubbleWrap::Motion.accelerometer.repeat {}
|
64
|
+
BubbleWrap::Motion.accelerometer.stop
|
65
|
+
end.should.not.raise
|
66
|
+
end
|
67
|
+
it 'should be able to repeat via every' do
|
68
|
+
-> do
|
69
|
+
BubbleWrap::Motion.accelerometer.every(5) {}
|
70
|
+
BubbleWrap::Motion.accelerometer.stop
|
71
|
+
end.should.not.raise
|
72
|
+
end
|
73
|
+
it 'should be able to run once' do
|
74
|
+
-> do
|
75
|
+
BubbleWrap::Motion.accelerometer.once {}
|
76
|
+
BubbleWrap::Motion.accelerometer.stop
|
77
|
+
end.should.not.raise
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
describe 'BubbleWrap::Motion.gyroscope' do
|
82
|
+
it 'should be a BubbleWrap::Motion::Gyroscope' do
|
83
|
+
BubbleWrap::Motion.gyroscope.should.be.kind_of(BubbleWrap::Motion::Gyroscope)
|
84
|
+
end
|
85
|
+
it 'should be a shared instance' do
|
86
|
+
obj1 = BubbleWrap::Motion.gyroscope
|
87
|
+
obj2 = BubbleWrap::Motion.gyroscope
|
88
|
+
obj1.should.equal? obj2
|
89
|
+
end
|
90
|
+
it 'should not be available in the simulator' do
|
91
|
+
BubbleWrap::Motion.gyroscope.available?.should == false
|
92
|
+
end
|
93
|
+
it 'should not be active in the simulator' do
|
94
|
+
BubbleWrap::Motion.gyroscope.active?.should == false
|
95
|
+
end
|
96
|
+
it 'should not have data' do
|
97
|
+
BubbleWrap::Motion.gyroscope.data.should == nil
|
98
|
+
end
|
99
|
+
it 'should be able to start with a block' do
|
100
|
+
-> do
|
101
|
+
BubbleWrap::Motion.gyroscope.start {}
|
102
|
+
BubbleWrap::Motion.gyroscope.stop
|
103
|
+
end.should.not.raise
|
104
|
+
end
|
105
|
+
it 'should be able to start without a block' do
|
106
|
+
-> do
|
107
|
+
BubbleWrap::Motion.gyroscope.start
|
108
|
+
BubbleWrap::Motion.gyroscope.stop
|
109
|
+
end.should.not.raise
|
110
|
+
end
|
111
|
+
it 'should be able to repeat' do
|
112
|
+
-> do
|
113
|
+
BubbleWrap::Motion.gyroscope.repeat {}
|
114
|
+
BubbleWrap::Motion.gyroscope.stop
|
115
|
+
end.should.not.raise
|
116
|
+
end
|
117
|
+
it 'should be able to repeat via every' do
|
118
|
+
-> do
|
119
|
+
BubbleWrap::Motion.gyroscope.every(5) {}
|
120
|
+
BubbleWrap::Motion.gyroscope.stop
|
121
|
+
end.should.not.raise
|
122
|
+
end
|
123
|
+
it 'should be able to run once' do
|
124
|
+
-> do
|
125
|
+
BubbleWrap::Motion.gyroscope.once {}
|
126
|
+
BubbleWrap::Motion.gyroscope.stop
|
127
|
+
end.should.not.raise
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
describe 'BubbleWrap::Motion.magnetometer' do
|
132
|
+
it 'should be a BubbleWrap::Motion::Magnetometer' do
|
133
|
+
BubbleWrap::Motion.magnetometer.should.be.kind_of(BubbleWrap::Motion::Magnetometer)
|
134
|
+
end
|
135
|
+
it 'should be a shared instance' do
|
136
|
+
obj1 = BubbleWrap::Motion.magnetometer
|
137
|
+
obj2 = BubbleWrap::Motion.magnetometer
|
138
|
+
obj1.should.equal? obj2
|
139
|
+
end
|
140
|
+
it 'should not be available in the simulator' do
|
141
|
+
BubbleWrap::Motion.magnetometer.available?.should == false
|
142
|
+
end
|
143
|
+
it 'should not be active in the simulator' do
|
144
|
+
BubbleWrap::Motion.magnetometer.active?.should == false
|
145
|
+
end
|
146
|
+
it 'should not have data' do
|
147
|
+
BubbleWrap::Motion.magnetometer.data.should == nil
|
148
|
+
end
|
149
|
+
it 'should be able to start with a block' do
|
150
|
+
-> do
|
151
|
+
BubbleWrap::Motion.magnetometer.start {}
|
152
|
+
BubbleWrap::Motion.magnetometer.stop
|
153
|
+
end.should.not.raise
|
154
|
+
end
|
155
|
+
it 'should be able to start without a block' do
|
156
|
+
-> do
|
157
|
+
BubbleWrap::Motion.magnetometer.start
|
158
|
+
BubbleWrap::Motion.magnetometer.stop
|
159
|
+
end.should.not.raise
|
160
|
+
end
|
161
|
+
it 'should be able to repeat' do
|
162
|
+
-> do
|
163
|
+
BubbleWrap::Motion.magnetometer.repeat {}
|
164
|
+
BubbleWrap::Motion.magnetometer.stop
|
165
|
+
end.should.not.raise
|
166
|
+
end
|
167
|
+
it 'should be able to repeat via every' do
|
168
|
+
-> do
|
169
|
+
BubbleWrap::Motion.magnetometer.every(5) {}
|
170
|
+
BubbleWrap::Motion.magnetometer.stop
|
171
|
+
end.should.not.raise
|
172
|
+
end
|
173
|
+
it 'should be able to run once' do
|
174
|
+
-> do
|
175
|
+
BubbleWrap::Motion.magnetometer.once {}
|
176
|
+
BubbleWrap::Motion.magnetometer.stop
|
177
|
+
end.should.not.raise
|
178
|
+
end
|
179
|
+
end
|
180
|
+
|
181
|
+
describe 'BubbleWrap::Motion.device' do
|
182
|
+
it 'should be a BubbleWrap::Motion::DeviceMotion' do
|
183
|
+
BubbleWrap::Motion.device.should.be.kind_of(BubbleWrap::Motion::DeviceMotion)
|
184
|
+
end
|
185
|
+
it 'should be a shared instance' do
|
186
|
+
obj1 = BubbleWrap::Motion.device
|
187
|
+
obj2 = BubbleWrap::Motion.device
|
188
|
+
obj1.should.equal? obj2
|
189
|
+
end
|
190
|
+
it 'should not be available in the simulator' do
|
191
|
+
BubbleWrap::Motion.device.available?.should == false
|
192
|
+
end
|
193
|
+
it 'should not be active in the simulator' do
|
194
|
+
BubbleWrap::Motion.device.active?.should == false
|
195
|
+
end
|
196
|
+
it 'should not have data' do
|
197
|
+
BubbleWrap::Motion.device.data.should == nil
|
198
|
+
end
|
199
|
+
it 'should be able to start with a block' do
|
200
|
+
-> do
|
201
|
+
BubbleWrap::Motion.device.start {}
|
202
|
+
BubbleWrap::Motion.device.stop
|
203
|
+
end.should.not.raise
|
204
|
+
end
|
205
|
+
it 'should be able to start without a block' do
|
206
|
+
-> do
|
207
|
+
BubbleWrap::Motion.device.start
|
208
|
+
BubbleWrap::Motion.device.stop
|
209
|
+
end.should.not.raise
|
210
|
+
end
|
211
|
+
it 'should be able to repeat' do
|
212
|
+
-> do
|
213
|
+
BubbleWrap::Motion.device.repeat {}
|
214
|
+
BubbleWrap::Motion.device.stop
|
215
|
+
end.should.not.raise
|
216
|
+
end
|
217
|
+
it 'should be able to repeat via every' do
|
218
|
+
-> do
|
219
|
+
BubbleWrap::Motion.device.every(5) {}
|
220
|
+
BubbleWrap::Motion.device.stop
|
221
|
+
end.should.not.raise
|
222
|
+
end
|
223
|
+
it 'should be able to run once' do
|
224
|
+
-> do
|
225
|
+
BubbleWrap::Motion.device.once {}
|
226
|
+
BubbleWrap::Motion.device.stop
|
227
|
+
end.should.not.raise
|
228
|
+
end
|
229
|
+
end
|
230
|
+
|
231
|
+
end
|
@@ -0,0 +1,81 @@
|
|
1
|
+
describe BubbleWrap::Reactor::Deferrable do
|
2
|
+
|
3
|
+
before do
|
4
|
+
@subject = Class.new do
|
5
|
+
include BubbleWrap::Reactor::Deferrable
|
6
|
+
end
|
7
|
+
@object = @subject.new
|
8
|
+
end
|
9
|
+
|
10
|
+
describe '.callback' do
|
11
|
+
|
12
|
+
it "calls the callback block with arguments after .succeed" do
|
13
|
+
args = [1, 2]
|
14
|
+
@object.callback do |*passed_args|
|
15
|
+
passed_args.should.equal args
|
16
|
+
end
|
17
|
+
@object.succeed *args
|
18
|
+
end
|
19
|
+
|
20
|
+
it "calls the callback if even if the deferrable already suceeded" do
|
21
|
+
@object.succeed :succeeded
|
22
|
+
@object.callback do |*args|
|
23
|
+
args[0].should.equal :succeeded
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
|
29
|
+
describe '.errback' do
|
30
|
+
it "calls the errback block after the deferrable fails" do
|
31
|
+
args = [1, 2]
|
32
|
+
@object.errback do |*passed_args|
|
33
|
+
passed_args.should.equal args
|
34
|
+
end
|
35
|
+
@object.fail *args
|
36
|
+
end
|
37
|
+
|
38
|
+
it "calls the errback block even if the deferrable failed first" do
|
39
|
+
@object.fail :err
|
40
|
+
@object.errback do |err|
|
41
|
+
err.should.equal :err
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
describe '.delegate' do
|
47
|
+
it "passes the delegate to both .errback_delegate and .callback_delegate" do
|
48
|
+
@object.define_singleton_method(:callback_delegate) { |d| @callback_delegated = true }
|
49
|
+
@object.define_singleton_method(:errback_delegate) { |d| @errback_delegated = true }
|
50
|
+
|
51
|
+
@object.delegate(@subject.new)
|
52
|
+
@object.instance_variable_get("@callback_delegated").should.equal true
|
53
|
+
@object.instance_variable_get("@errback_delegated").should.equal true
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
describe '.errback_delegate' do
|
58
|
+
it "calls the delegate errback method when the deferrable fails" do
|
59
|
+
delegate = @subject.new
|
60
|
+
@object.errback_delegate delegate
|
61
|
+
|
62
|
+
delegate.errback do |*args|
|
63
|
+
args[0].should.equal :err
|
64
|
+
end
|
65
|
+
@object.fail :err
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
describe '.callback_delegate' do
|
70
|
+
it "calls the delegate callback when the deferrable suceeds" do
|
71
|
+
delegate = @subject.new
|
72
|
+
@object.callback_delegate delegate
|
73
|
+
|
74
|
+
delegate.callback do |*args|
|
75
|
+
args[0].should.equal :passed
|
76
|
+
end
|
77
|
+
@object.succeed :passed
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
end
|
@@ -48,6 +48,17 @@ describe BubbleWrap::Reactor::Eventable do
|
|
48
48
|
events[:foo].member?(proof).should == false
|
49
49
|
end
|
50
50
|
|
51
|
+
it 'unregisters all events' do
|
52
|
+
def bar; end
|
53
|
+
proof = method(:bar)
|
54
|
+
@subject.on(:foo, proof)
|
55
|
+
proof_2 = proc { }
|
56
|
+
@subject.on(:foo, &proof_2)
|
57
|
+
events = @subject.instance_variable_get(:@__events__)
|
58
|
+
@subject.off(:foo)
|
59
|
+
events[:foo].should == []
|
60
|
+
end
|
61
|
+
|
51
62
|
it 'unregisters method events after kvo' do
|
52
63
|
observing_object = Class.new do
|
53
64
|
include BubbleWrap::KVO
|
@@ -0,0 +1,85 @@
|
|
1
|
+
shared :queue_caching_deferrable_method do
|
2
|
+
it "stores the current queue that is being used when a callback is added" do
|
3
|
+
@subject.send(@method, &@blk)
|
4
|
+
cache = @subject.instance_variable_get("@queue_cache")
|
5
|
+
cache.should.not.be.nil
|
6
|
+
cache[@blk.object_id].to_s.should.equal Dispatch::Queue.main.to_s
|
7
|
+
end
|
8
|
+
|
9
|
+
it "stores the queue, even if its not the main" do
|
10
|
+
@queue.async do
|
11
|
+
@subject.send(@method, &@blk)
|
12
|
+
Dispatch::Queue.main.async { resume }
|
13
|
+
end
|
14
|
+
wait do
|
15
|
+
cache = @subject.instance_variable_get("@queue_cache")
|
16
|
+
cache.should.not.be.nil
|
17
|
+
cache[@blk.object_id].to_s.should.equal @queue.to_s
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
shared :queue_block_execution do
|
23
|
+
it "calls the block on the right thread, with deferred argument once the deferrable is finished" do
|
24
|
+
@queue.async do
|
25
|
+
@subject.send(@block_method) do |*args|
|
26
|
+
Dispatch::Queue.current.to_s.should.equal @queue.to_s
|
27
|
+
args.should.equal [true]
|
28
|
+
Dispatch::Queue.main.async { resume }
|
29
|
+
end
|
30
|
+
end
|
31
|
+
@subject.send(@status_method, true)
|
32
|
+
|
33
|
+
wait {}
|
34
|
+
end
|
35
|
+
|
36
|
+
it "removes the queue from internal cache once the deferrable is finished" do
|
37
|
+
@subject.send(@block_method) do |*args|
|
38
|
+
Dispatch::Queue.main.async { resume }
|
39
|
+
end
|
40
|
+
@subject.send(@status_method, true)
|
41
|
+
|
42
|
+
wait do
|
43
|
+
@subject.instance_variable_get("@queue_cache").length.should.equal 0
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
describe BubbleWrap::Reactor::ThreadAwareDeferrable do
|
49
|
+
|
50
|
+
before do
|
51
|
+
@subject = BubbleWrap::Reactor::ThreadAwareDeferrable.new
|
52
|
+
@queue = Dispatch::Queue.new(:test_queue.to_s)
|
53
|
+
@blk = Proc.new {|*args| }
|
54
|
+
end
|
55
|
+
|
56
|
+
describe '.callback' do
|
57
|
+
before do
|
58
|
+
@method = :callback
|
59
|
+
end
|
60
|
+
behaves_like :queue_caching_deferrable_method
|
61
|
+
end
|
62
|
+
|
63
|
+
describe '.errback' do
|
64
|
+
before do
|
65
|
+
@method = :errback
|
66
|
+
end
|
67
|
+
behaves_like :queue_caching_deferrable_method
|
68
|
+
end
|
69
|
+
|
70
|
+
describe '.succeed' do
|
71
|
+
before do
|
72
|
+
@block_method = :callback
|
73
|
+
@status_method = :succeed
|
74
|
+
end
|
75
|
+
behaves_like :queue_block_execution
|
76
|
+
end
|
77
|
+
|
78
|
+
describe '.fail' do
|
79
|
+
before do
|
80
|
+
@block_method = :callback
|
81
|
+
@status_method = :succeed
|
82
|
+
end
|
83
|
+
behaves_like :queue_block_execution
|
84
|
+
end
|
85
|
+
end
|
@@ -1,4 +1,5 @@
|
|
1
1
|
describe "RSSParser" do
|
2
|
+
extend WebStub::SpecHelpers
|
2
3
|
|
3
4
|
before do
|
4
5
|
@feed_url = 'https://raw.github.com/gist/2952427/9f1522cbe5d77a72c7c96c4fdb4b77bd58d7681e/atom.xml'
|
@@ -32,6 +33,11 @@ describe "RSSParser" do
|
|
32
33
|
end
|
33
34
|
|
34
35
|
it "parses url data" do
|
36
|
+
string = File.read(File.join(App.resources_path, 'atom.xml'))
|
37
|
+
|
38
|
+
stub_request(:get, @feed_url).
|
39
|
+
to_return(body: string, content_type: "application/xml")
|
40
|
+
|
35
41
|
parser = BW::RSSParser.new(@feed_url)
|
36
42
|
episodes = []
|
37
43
|
parser.parse { |episode| episodes << episode }
|
@@ -40,28 +46,12 @@ describe "RSSParser" do
|
|
40
46
|
end
|
41
47
|
|
42
48
|
it "handles errors" do
|
43
|
-
|
44
|
-
parser.parse
|
45
|
-
parser.state.should.equal :errors
|
46
|
-
end
|
49
|
+
error_url = 'http://doesnotexist.com'
|
47
50
|
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
# for the RSSParser spec.
|
53
|
-
alias_method :original_get, :get
|
54
|
-
def get(url, options = {}, &block)
|
55
|
-
if url == 'https://raw.github.com/gist/2952427/9f1522cbe5d77a72c7c96c4fdb4b77bd58d7681e/atom.xml'
|
56
|
-
string = File.read(File.join(App.resources_path, 'atom.xml'))
|
57
|
-
yield BW::HTTP::Response.new(body: string.to_data, status_code: 200)
|
58
|
-
elsif url == 'http://doesnotexist.com'
|
59
|
-
yield BW::HTTP::Response.new(status_code: nil)
|
60
|
-
else
|
61
|
-
original_get(url, options, &block)
|
62
|
-
end
|
63
|
-
end
|
64
|
-
end
|
51
|
+
parser = BW::RSSParser.new(error_url)
|
52
|
+
parser.parse
|
53
|
+
wait 0.1 do
|
54
|
+
parser.state.should.equal :errors
|
65
55
|
end
|
66
56
|
end
|
67
57
|
end
|