attack-barometer 0.5.0 → 0.6.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.
Files changed (64) hide show
  1. data/README.rdoc +51 -9
  2. data/VERSION.yml +1 -1
  3. data/bin/barometer +57 -7
  4. data/lib/barometer/base.rb +3 -0
  5. data/lib/barometer/data/sun.rb +10 -0
  6. data/lib/barometer/data/zone.rb +79 -188
  7. data/lib/barometer/data.rb +11 -6
  8. data/lib/barometer/formats/coordinates.rb +4 -1
  9. data/lib/barometer/formats/geocode.rb +9 -7
  10. data/lib/barometer/formats/icao.rb +2 -2
  11. data/lib/barometer/formats/weather_id.rb +2 -2
  12. data/lib/barometer/measurements/common.rb +113 -0
  13. data/lib/barometer/{data → measurements}/current.rb +17 -42
  14. data/lib/barometer/measurements/forecast.rb +62 -0
  15. data/lib/barometer/measurements/forecast_array.rb +72 -0
  16. data/lib/barometer/{data → measurements}/measurement.rb +57 -45
  17. data/lib/barometer/measurements/night.rb +27 -0
  18. data/lib/barometer/query.rb +55 -5
  19. data/lib/barometer/services.rb +3 -1
  20. data/lib/barometer/translations/zone_codes.yml +360 -0
  21. data/lib/barometer/weather.rb +5 -4
  22. data/lib/barometer/weather_services/google.rb +19 -35
  23. data/lib/barometer/weather_services/service.rb +113 -255
  24. data/lib/barometer/weather_services/weather_bug.rb +291 -2
  25. data/lib/barometer/weather_services/weather_dot_com.rb +45 -54
  26. data/lib/barometer/weather_services/wunderground.rb +83 -89
  27. data/lib/barometer/weather_services/yahoo.rb +44 -91
  28. data/lib/barometer/web_services/geocode.rb +1 -0
  29. data/lib/barometer/web_services/timezone.rb +40 -0
  30. data/lib/barometer/web_services/weather_id.rb +17 -2
  31. data/lib/barometer.rb +11 -0
  32. data/lib/demometer/demometer.rb +28 -0
  33. data/lib/demometer/public/css/master.css +259 -1
  34. data/lib/demometer/views/index.erb +2 -0
  35. data/lib/demometer/views/layout.erb +3 -2
  36. data/lib/demometer/views/measurement.erb +4 -1
  37. data/lib/demometer/views/readme.erb +116 -88
  38. data/spec/data/sun_spec.rb +53 -0
  39. data/spec/data/zone_spec.rb +330 -100
  40. data/spec/fixtures/formats/weather_id/ksfo.xml +1 -0
  41. data/spec/fixtures/services/weather_bug/90210_current.xml +1 -0
  42. data/spec/fixtures/services/weather_bug/90210_forecast.xml +1 -0
  43. data/spec/formats/weather_id_spec.rb +10 -5
  44. data/spec/measurements/common_spec.rb +352 -0
  45. data/spec/{data → measurements}/current_spec.rb +40 -103
  46. data/spec/measurements/forecast_array_spec.rb +165 -0
  47. data/spec/measurements/forecast_spec.rb +135 -0
  48. data/spec/{data → measurements}/measurement_spec.rb +86 -107
  49. data/spec/measurements/night_measurement_spec.rb +49 -0
  50. data/spec/query_spec.rb +12 -2
  51. data/spec/spec_helper.rb +28 -1
  52. data/spec/weather_services/google_spec.rb +27 -117
  53. data/spec/weather_services/services_spec.rb +49 -1024
  54. data/spec/weather_services/weather_bug_spec.rb +274 -0
  55. data/spec/weather_services/weather_dot_com_spec.rb +45 -125
  56. data/spec/weather_services/wunderground_spec.rb +42 -136
  57. data/spec/weather_services/yahoo_spec.rb +26 -116
  58. data/spec/weather_spec.rb +45 -45
  59. metadata +23 -11
  60. data/lib/barometer/data/forecast.rb +0 -84
  61. data/lib/barometer/data/night.rb +0 -69
  62. data/lib/barometer/extensions/graticule.rb +0 -51
  63. data/spec/data/forecast_spec.rb +0 -192
  64. data/spec/data/night_measurement_spec.rb +0 -136
@@ -47,30 +47,64 @@ describe "WeatherServices" do
47
47
 
48
48
  before(:each) do
49
49
  @service = Barometer::WeatherService.new
50
+ @measurement = Barometer::Measurement.new
51
+ @query = Barometer::Query.new("test")
52
+ end
53
+
54
+ it "defaults _meets_requirements?" do
55
+ Barometer::WeatherService.send("_meets_requirements?").should be_true
56
+ end
57
+
58
+ it "stubs _source_name" do
59
+ lambda { Barometer::WeatherService.send("_source_name") }.should raise_error(NotImplementedError)
60
+ end
61
+
62
+ it "stubs _accepted_formats" do
63
+ lambda { Barometer::WeatherService.send("_accepted_formats") }.should raise_error(NotImplementedError)
50
64
  end
51
65
 
52
66
  it "stubs _measure" do
53
- lambda { Barometer::WeatherService._measure }.should raise_error(NotImplementedError)
67
+ Barometer::WeatherService._measure(@measurement,@query,true).is_a?(Barometer::Measurement).should be_true
68
+ end
69
+
70
+ it "stubs _build_extra" do
71
+ Barometer::WeatherService._build_extra.should be_nil
72
+ end
73
+
74
+ it "stubs _fetch" do
75
+ Barometer::WeatherService._fetch.should be_nil
54
76
  end
55
77
 
56
- it "stubs accepted_formats" do
57
- lambda { Barometer::WeatherService.accepted_formats }.should raise_error(NotImplementedError)
78
+ it "stubs _build_current" do
79
+ Barometer::WeatherService._build_current.should be_nil
58
80
  end
59
81
 
60
- it "defaults meets_requirements?" do
61
- Barometer::WeatherService.meets_requirements?.should be_true
82
+ it "stubs _build_forecast" do
83
+ Barometer::WeatherService._build_forecast.should be_nil
62
84
  end
63
85
 
64
- it "defaults supports_country?" do
65
- Barometer::WeatherService.supports_country?.should be_true
86
+ it "stubs _build_location" do
87
+ Barometer::WeatherService._build_location.should be_nil
66
88
  end
67
89
 
68
- it "defaults requires_keys?" do
69
- Barometer::WeatherService.requires_keys?.should be_false
90
+ it "stubs _build_sun" do
91
+ Barometer::WeatherService._build_sun.should be_nil
70
92
  end
71
93
 
72
- it "defaults has_keys?" do
73
- lambda { Barometer::WeatherService.has_keys? }.should raise_error(NotImplementedError)
94
+ it "stubs _build_links" do
95
+ Barometer::WeatherService._build_links.should == {}
96
+ end
97
+
98
+ it "defaults _supports_country?" do
99
+ Barometer::WeatherService._supports_country?.should be_true
100
+ end
101
+
102
+ it "defaults _requires_keys?" do
103
+ Barometer::WeatherService._requires_keys?.should be_false
104
+ end
105
+
106
+ it "defaults _has_keys?" do
107
+ lambda { Barometer::WeatherService._has_keys? }.should raise_error(NotImplementedError)
74
108
  end
75
109
 
76
110
  end
@@ -81,7 +115,7 @@ describe "WeatherServices" do
81
115
  Barometer::WeatherService.respond_to?("measure").should be_true
82
116
  end
83
117
 
84
- # since Barometer::WeatherService defines the measure method, you could actuall just
118
+ # since Barometer::WeatherService defines the measure method, you could actually just
85
119
  # call Barometer::WeatherService.measure ... but this will not invoke a specific
86
120
  # weather API driver. Make sure this usage raises an error.
87
121
  it "requires an actuall driver" do
@@ -94,1025 +128,16 @@ describe "WeatherServices" do
94
128
  lambda { Barometer::WeatherService.measure(@query) }.should_not raise_error(ArgumentError)
95
129
  end
96
130
 
97
- it "returns a Data::Measurement object" do
98
- @service.measure(@query).is_a?(Data::Measurement).should be_true
131
+ it "returns a Barometer::Measurement object" do
132
+ @service.measure(@query).is_a?(Barometer::Measurement).should be_true
99
133
  end
100
134
 
101
135
  it "returns current and future" do
102
136
  measurement = @service.measure(@query)
103
- measurement.current.is_a?(Data::CurrentMeasurement).should be_true
137
+ measurement.current.is_a?(Measurement::Current).should be_true
104
138
  measurement.forecast.is_a?(Array).should be_true
105
139
  end
106
140
 
107
141
  end
108
142
 
109
- describe "when answering the simple questions," do
110
-
111
- before(:each) do
112
- # the function being tested was monkey patched in an earlier test
113
- # so the original file must be reloaded
114
- load 'lib/barometer/weather_services/service.rb'
115
-
116
- @measurement = Data::Measurement.new
117
- @now = Data::LocalDateTime.parse("01-jan-2009 2:05 pm")
118
- end
119
-
120
- describe "windy?" do
121
-
122
- it "requires a measurement object" do
123
- lambda { Barometer::WeatherService.windy? }.should raise_error(ArgumentError)
124
- lambda { Barometer::WeatherService.windy?("a") }.should raise_error(ArgumentError)
125
- lambda { Barometer::WeatherService.windy?(@measurement) }.should_not raise_error(ArgumentError)
126
- end
127
-
128
- it "requires threshold as a number" do
129
- lambda { Barometer::WeatherService.windy?(@measurement,"a") }.should raise_error(ArgumentError)
130
- lambda { Barometer::WeatherService.windy?(@measurement,1) }.should_not raise_error(ArgumentError)
131
- lambda { Barometer::WeatherService.windy?(@measurement,1.1) }.should_not raise_error(ArgumentError)
132
- end
133
-
134
- it "requires time as a Data::LocalTime object" do
135
- #lambda { Barometer::WeatherService.windy?(@measurement,1,"a") }.should raise_error(ArgumentError)
136
- lambda { Barometer::WeatherService.windy?(@measurement,1,@now) }.should_not raise_error(ArgumentError)
137
- end
138
-
139
- it "stubs forecasted_windy?" do
140
- Barometer::WeatherService.forecasted_windy?(@measurement,nil,nil).should be_nil
141
- end
142
-
143
- describe "and is current" do
144
-
145
- before(:each) do
146
- module Barometer; class Data::Measurement
147
- def current?(a=nil); true; end
148
- end; end
149
- end
150
-
151
- it "returns nil" do
152
- Barometer::WeatherService.windy?(@measurement).should be_nil
153
- end
154
-
155
- it "returns true if currently_windy?" do
156
- module Barometer; class WeatherService
157
- def self.currently_windy?(a=nil,b=nil); true; end
158
- end; end
159
- Barometer::WeatherService.windy?(@measurement).should be_true
160
- end
161
-
162
- it "returns false if !currently_windy?" do
163
- module Barometer; class WeatherService
164
- def self.currently_windy?(a=nil,b=nil); false; end
165
- end; end
166
- Barometer::WeatherService.windy?(@measurement).should be_false
167
- end
168
-
169
- end
170
-
171
- describe "and is NOT current" do
172
-
173
- before(:each) do
174
- module Barometer; class Data::Measurement
175
- def current?(a=nil); false; end
176
- end; end
177
- end
178
-
179
- it "returns nil" do
180
- Barometer::WeatherService.windy?(@measurement).should be_nil
181
- end
182
-
183
- it "returns true if forecasted_windy?" do
184
- module Barometer; class WeatherService
185
- def self.forecasted_windy?(a=nil,b=nil,c=nil); true; end
186
- end; end
187
- Barometer::WeatherService.windy?(@measurement).should be_true
188
- end
189
-
190
- it "returns false if !forecasted_windy?" do
191
- module Barometer; class WeatherService
192
- def self.forecasted_windy?(a=nil,b=nil,c=nil); false; end
193
- end; end
194
- Barometer::WeatherService.windy?(@measurement).should be_false
195
- end
196
-
197
- end
198
-
199
- end
200
-
201
- describe "currently_windy?" do
202
-
203
- before(:each) do
204
- # the function being tested was monkey patched in an earlier test
205
- # so the original file must be reloaded
206
- load 'lib/barometer/weather_services/service.rb'
207
-
208
- @measurement = Data::Measurement.new
209
- @threshold = 10
210
- end
211
-
212
- it "requires a measurement object" do
213
- lambda { Barometer::WeatherService.currently_windy? }.should raise_error(ArgumentError)
214
- lambda { Barometer::WeatherService.currently_windy?("a") }.should raise_error(ArgumentError)
215
- lambda { Barometer::WeatherService.currently_windy?(@measurement) }.should_not raise_error(ArgumentError)
216
- end
217
-
218
- it "requires threshold as a number" do
219
- lambda { Barometer::WeatherService.currently_windy?(@measurement,"a") }.should raise_error(ArgumentError)
220
- lambda { Barometer::WeatherService.currently_windy?(@measurement,1) }.should_not raise_error(ArgumentError)
221
- lambda { Barometer::WeatherService.currently_windy?(@measurement,1.1) }.should_not raise_error(ArgumentError)
222
- end
223
-
224
- it "returns nil when value unavailable" do
225
- measurement = Data::Measurement.new
226
- Barometer::WeatherService.currently_windy?(measurement,@threshold).should be_nil
227
- measurement.current = Data::CurrentMeasurement.new
228
- Barometer::WeatherService.currently_windy?(measurement,@threshold).should be_nil
229
- measurement.current.wind = Data::Speed.new
230
- Barometer::WeatherService.currently_windy?(measurement,@threshold).should be_nil
231
- end
232
-
233
- describe "when metric" do
234
-
235
- before(:each) do
236
- @measurement = Data::Measurement.new
237
- @measurement.current = Data::CurrentMeasurement.new
238
- @measurement.current.wind = Data::Speed.new
239
- @measurement.metric!
240
- @measurement.metric?.should be_true
241
- end
242
-
243
- # measurement.current.wind.kph.to_f
244
- it "returns true when wind speed (kph) above threshold" do
245
- @measurement.current.wind.kph = @threshold + 1
246
- Barometer::WeatherService.currently_windy?(@measurement,@threshold).should be_true
247
- end
248
-
249
- it "returns false when wind speed (kph) below threshold" do
250
- @measurement.current.wind.kph = @threshold - 1
251
- Barometer::WeatherService.currently_windy?(@measurement,@threshold).should be_false
252
- end
253
-
254
- end
255
-
256
- describe "when imperial" do
257
-
258
- before(:each) do
259
- @measurement = Data::Measurement.new
260
- @measurement.current = Data::CurrentMeasurement.new
261
- @measurement.current.wind = Data::Speed.new
262
- @measurement.imperial!
263
- @measurement.metric?.should be_false
264
- end
265
-
266
- it "returns true when wind speed (mph) above threshold" do
267
- @measurement.current.wind.mph = @threshold - 1
268
- Barometer::WeatherService.currently_windy?(@measurement,@threshold).should be_false
269
- end
270
-
271
- it "returns false when wind speed (mph) below threshold" do
272
- @measurement.current.wind.mph = @threshold - 1
273
- Barometer::WeatherService.currently_windy?(@measurement,@threshold).should be_false
274
- end
275
-
276
- end
277
-
278
- end
279
-
280
- describe "wet?" do
281
-
282
- it "requires a measurement object" do
283
- lambda { Barometer::WeatherService.wet? }.should raise_error(ArgumentError)
284
- lambda { Barometer::WeatherService.wet?("a") }.should raise_error(ArgumentError)
285
- lambda { Barometer::WeatherService.wet?(@measurement) }.should_not raise_error(ArgumentError)
286
- end
287
-
288
- it "requires threshold as a number" do
289
- lambda { Barometer::WeatherService.wet?(@measurement,"a") }.should raise_error(ArgumentError)
290
- lambda { Barometer::WeatherService.wet?(@measurement,1) }.should_not raise_error(ArgumentError)
291
- lambda { Barometer::WeatherService.wet?(@measurement,1.1) }.should_not raise_error(ArgumentError)
292
- end
293
-
294
- it "requires time as a Data::LocalTime object" do
295
- #lambda { Barometer::WeatherService.wet?(@measurement,1,"a") }.should raise_error(ArgumentError)
296
- lambda { Barometer::WeatherService.wet?(@measurement,1,@now) }.should_not raise_error(ArgumentError)
297
- end
298
-
299
- describe "and is current" do
300
-
301
- before(:each) do
302
- module Barometer; class Data::Measurement
303
- def current?(a=nil); true; end
304
- end; end
305
- end
306
-
307
- it "returns nil" do
308
- Barometer::WeatherService.wet?(@measurement).should be_nil
309
- end
310
-
311
- it "returns true if currently_wet?" do
312
- module Barometer; class WeatherService
313
- def self.currently_wet?(a=nil,b=nil); true; end
314
- end; end
315
- Barometer::WeatherService.wet?(@measurement).should be_true
316
- end
317
-
318
- it "returns false if !currently_wet?" do
319
- module Barometer; class WeatherService
320
- def self.currently_wet?(a=nil,b=nil); false; end
321
- end; end
322
- Barometer::WeatherService.wet?(@measurement).should be_false
323
- end
324
-
325
- end
326
-
327
- describe "and is NOT current" do
328
-
329
- before(:each) do
330
- module Barometer; class Data::Measurement
331
- def current?(a=nil); false; end
332
- end; end
333
- end
334
-
335
- it "returns nil" do
336
- Barometer::WeatherService.wet?(@measurement).should be_nil
337
- end
338
-
339
- it "returns true if forecasted_wet?" do
340
- module Barometer; class WeatherService
341
- def self.forecasted_wet?(a=nil,b=nil,c=nil); true; end
342
- end; end
343
- Barometer::WeatherService.wet?(@measurement).should be_true
344
- end
345
-
346
- it "returns false if !forecasted_wet?" do
347
- module Barometer; class WeatherService
348
- def self.forecasted_wet?(a=nil,b=nil,c=nil); false; end
349
- end; end
350
- Barometer::WeatherService.wet?(@measurement).should be_false
351
- end
352
-
353
- end
354
-
355
- end
356
-
357
- describe "currently_wet?" do
358
-
359
- before(:each) do
360
- # the function being tested was monkey patched in an earlier test
361
- # so the original file must be reloaded
362
- load 'lib/barometer/weather_services/service.rb'
363
-
364
- @measurement = Data::Measurement.new
365
- @threshold = 10
366
- @temperature = 15
367
- end
368
-
369
- it "requires a measurement object" do
370
- lambda { Barometer::WeatherService.currently_wet? }.should raise_error(ArgumentError)
371
- lambda { Barometer::WeatherService.currently_wet?("a") }.should raise_error(ArgumentError)
372
- lambda { Barometer::WeatherService.currently_wet?(@measurement) }.should_not raise_error(ArgumentError)
373
- end
374
-
375
- it "requires threshold as a number" do
376
- lambda { Barometer::WeatherService.currently_wet?(@measurement,"a") }.should raise_error(ArgumentError)
377
- lambda { Barometer::WeatherService.currently_wet?(@measurement,1) }.should_not raise_error(ArgumentError)
378
- lambda { Barometer::WeatherService.currently_wet?(@measurement,1.1) }.should_not raise_error(ArgumentError)
379
- end
380
-
381
- it "returns nil when value unavailable" do
382
- measurement = Data::Measurement.new
383
- Barometer::WeatherService.currently_wet?(measurement,@threshold).should be_nil
384
- measurement.current = Data::CurrentMeasurement.new
385
- Barometer::WeatherService.currently_wet?(measurement,@threshold).should be_nil
386
- measurement.current.wind = Data::Speed.new
387
- Barometer::WeatherService.currently_wet?(measurement,@threshold).should be_nil
388
- end
389
-
390
- describe "currently_wet_by_icon?" do
391
-
392
- before(:each) do
393
- @measurement.current = Data::CurrentMeasurement.new
394
- end
395
-
396
- it "requires a Barometer::Measurement object" do
397
- lambda { Barometer::WeatherService.currently_wet_by_icon?(nil) }.should raise_error(ArgumentError)
398
- lambda { Barometer::WeatherService.currently_wet_by_icon?("invlaid") }.should raise_error(ArgumentError)
399
-
400
- lambda { Barometer::WeatherService.currently_wet_by_icon?(@measurement.current) }.should_not raise_error(ArgumentError)
401
- end
402
-
403
- it "returns nil if no icon" do
404
- @measurement.current.icon?.should be_false
405
- Barometer::WeatherService.currently_wet_by_icon?(@measurement.current).should be_nil
406
- end
407
-
408
- it "returns true if matching icon code" do
409
- module Barometer; class WeatherService; def self.wet_icon_codes
410
- ["rain"]
411
- end; end; end
412
- @measurement.current.icon = "rain"
413
- @measurement.current.icon?.should be_true
414
- Barometer::WeatherService.currently_wet_by_icon?(@measurement.current).should be_true
415
- end
416
-
417
- it "returns false if NO matching icon code" do
418
- module Barometer; class WeatherService; def self.wet_icon_codes
419
- ["rain"]
420
- end; end; end
421
- @measurement.current.icon = "sunny"
422
- @measurement.current.icon?.should be_true
423
- Barometer::WeatherService.currently_wet_by_icon?(@measurement.current).should be_false
424
- end
425
-
426
- end
427
-
428
- describe "and currently_wet_by_dewpoint?" do
429
-
430
- describe "when metric" do
431
-
432
- before(:each) do
433
- @measurement = Data::Measurement.new
434
- @measurement.current = Data::CurrentMeasurement.new
435
- @measurement.current.temperature = Data::Temperature.new
436
- @measurement.current.dew_point = Data::Temperature.new
437
- @measurement.metric!
438
- @measurement.metric?.should be_true
439
- end
440
-
441
- it "returns true when temperature < dew_point" do
442
- @measurement.current.temperature.c = @temperature
443
- @measurement.current.dew_point.c = @temperature + 1
444
- Barometer::WeatherService.currently_wet_by_dewpoint?(@measurement).should be_true
445
- end
446
-
447
- it "returns false when temperature > dew_point" do
448
- @measurement.current.temperature.c = @temperature
449
- @measurement.current.dew_point.c = @temperature - 1
450
- Barometer::WeatherService.currently_wet_by_dewpoint?(@measurement).should be_false
451
- end
452
-
453
- end
454
-
455
- describe "when imperial" do
456
-
457
- before(:each) do
458
- @measurement = Data::Measurement.new
459
- @measurement.current = Data::CurrentMeasurement.new
460
- @measurement.current.temperature = Data::Temperature.new
461
- @measurement.current.dew_point = Data::Temperature.new
462
- @measurement.imperial!
463
- @measurement.metric?.should be_false
464
- end
465
-
466
- it "returns true when temperature < dew_point" do
467
- @measurement.current.temperature.f = @temperature
468
- @measurement.current.dew_point.f = @temperature + 1
469
- Barometer::WeatherService.currently_wet_by_dewpoint?(@measurement).should be_true
470
- end
471
-
472
- it "returns false when temperature > dew_point" do
473
- @measurement.current.temperature.f = @temperature
474
- @measurement.current.dew_point.f = @temperature - 1
475
- Barometer::WeatherService.currently_wet_by_dewpoint?(@measurement).should be_false
476
- end
477
-
478
- end
479
-
480
- end
481
-
482
- describe "and currently_wet_by_humidity?" do
483
-
484
- before(:each) do
485
- @measurement = Data::Measurement.new
486
- @measurement.current = Data::CurrentMeasurement.new
487
- end
488
-
489
- it "returns true when humidity >= 99%" do
490
- @measurement.current.humidity = 99
491
- Barometer::WeatherService.currently_wet_by_humidity?(@measurement.current).should be_true
492
- @measurement.current.humidity = 100
493
- Barometer::WeatherService.currently_wet_by_humidity?(@measurement.current).should be_true
494
- end
495
-
496
- it "returns false when humidity < 99%" do
497
- @measurement.current.humidity = 98
498
- Barometer::WeatherService.currently_wet_by_humidity?(@measurement.current).should be_false
499
- end
500
-
501
- end
502
-
503
- describe "and currently_wet_by_pop?" do
504
-
505
- before(:each) do
506
- @measurement = Data::Measurement.new
507
- @measurement.forecast = [Data::ForecastMeasurement.new]
508
- @measurement.forecast.first.date = Date.today
509
- @measurement.forecast.size.should == 1
510
- end
511
-
512
- it "returns true when pop (%) above threshold" do
513
- @measurement.forecast.first.pop = @threshold + 1
514
- Barometer::WeatherService.currently_wet_by_pop?(@measurement, @threshold).should be_true
515
- end
516
-
517
- it "returns false when pop (%) below threshold" do
518
- @measurement.forecast.first.pop = @threshold - 1
519
- Barometer::WeatherService.currently_wet_by_pop?(@measurement, @threshold).should be_false
520
- end
521
-
522
- end
523
-
524
- end
525
-
526
- describe "forecasted_wet?" do
527
-
528
- before(:each) do
529
- # the function being tested was monkey patched in an earlier test
530
- # so the original file must be reloaded
531
- load 'lib/barometer/weather_services/service.rb'
532
-
533
- @measurement = Data::Measurement.new
534
- @threshold = 10
535
- @temperature = 15
536
- end
537
-
538
- it "requires a measurement object" do
539
- lambda { Barometer::WeatherService.forecasted_wet? }.should raise_error(ArgumentError)
540
- lambda { Barometer::WeatherService.forecasted_wet?("a") }.should raise_error(ArgumentError)
541
- lambda { Barometer::WeatherService.forecasted_wet?(@measurement) }.should_not raise_error(ArgumentError)
542
- end
543
-
544
- it "requires threshold as a number" do
545
- lambda { Barometer::WeatherService.forecasted_wet?(@measurement,"a") }.should raise_error(ArgumentError)
546
- lambda { Barometer::WeatherService.forecasted_wet?(@measurement,1) }.should_not raise_error(ArgumentError)
547
- lambda { Barometer::WeatherService.forecasted_wet?(@measurement,1.1) }.should_not raise_error(ArgumentError)
548
- end
549
-
550
- it "requires utc_time as a Data::LocalTime object" do
551
- #lambda { Barometer::WeatherService.forecasted_wet?(@measurement,1,"string") }.should raise_error(ArgumentError)
552
- lambda { Barometer::WeatherService.forecasted_wet?(@measurement,1,@now) }.should_not raise_error(ArgumentError)
553
- end
554
-
555
- it "returns nil when value unavailable" do
556
- measurement = Data::Measurement.new
557
- Barometer::WeatherService.forecasted_wet?(measurement,@threshold).should be_nil
558
- measurement.forecast = [Data::ForecastMeasurement.new]
559
- Barometer::WeatherService.forecasted_wet?(measurement,@threshold).should be_nil
560
- end
561
-
562
- describe "forecasted_wet_by_icon?" do
563
-
564
- before(:each) do
565
- @measurement.forecast = [Data::ForecastMeasurement.new]
566
- @measurement.forecast.first.date = Date.today
567
- @measurement.forecast.size.should == 1
568
- end
569
-
570
- it "requires a Barometer::Measurement object" do
571
- lambda { Barometer::WeatherService.forecasted_wet_by_icon?(nil) }.should raise_error(ArgumentError)
572
- lambda { Barometer::WeatherService.forecasted_wet_by_icon?("invlaid") }.should raise_error(ArgumentError)
573
-
574
- lambda { Barometer::WeatherService.forecasted_wet_by_icon?(@measurement.forecast.first) }.should_not raise_error(ArgumentError)
575
- end
576
-
577
- it "returns nil if no icon" do
578
- @measurement.forecast.first.icon?.should be_false
579
- Barometer::WeatherService.forecasted_wet_by_icon?(@measurement.forecast.first).should be_nil
580
- end
581
-
582
- it "returns true if matching icon code" do
583
- module Barometer; class WeatherService; def self.wet_icon_codes
584
- ["rain"]
585
- end; end; end
586
- @measurement.forecast.first.icon = "rain"
587
- @measurement.forecast.first.icon?.should be_true
588
- Barometer::WeatherService.forecasted_wet_by_icon?(@measurement.forecast.first).should be_true
589
- end
590
-
591
- it "returns false if NO matching icon code" do
592
- module Barometer; class WeatherService; def self.wet_icon_codes
593
- ["rain"]
594
- end; end; end
595
- @measurement.forecast.first.icon = "sunny"
596
- @measurement.forecast.first.icon?.should be_true
597
- Barometer::WeatherService.forecasted_wet_by_icon?(@measurement.forecast.first).should be_false
598
- end
599
-
600
- after(:each) do
601
- # the function being tested was monkey patched in an earlier test
602
- # so the original file must be reloaded
603
- load 'lib/barometer/weather_services/service.rb'
604
- end
605
-
606
- end
607
-
608
- describe "and forecasted_wet_by_pop?" do
609
-
610
- before(:each) do
611
- @measurement = Data::Measurement.new
612
- @measurement.forecast = [Data::ForecastMeasurement.new]
613
- @measurement.forecast.first.date = Date.today
614
- @measurement.forecast.size.should == 1
615
- end
616
-
617
- it "returns true when pop (%) above threshold" do
618
- @measurement.forecast.first.pop = @threshold + 1
619
- Barometer::WeatherService.forecasted_wet_by_pop?(@measurement.forecast.first, @threshold).should be_true
620
- end
621
-
622
- it "returns false when pop (%) below threshold" do
623
- @measurement.forecast.first.pop = @threshold - 1
624
- Barometer::WeatherService.forecasted_wet_by_pop?(@measurement.forecast.first, @threshold).should be_false
625
- end
626
-
627
- end
628
-
629
- end
630
-
631
- describe "day?" do
632
-
633
- it "requires a measurement object" do
634
- lambda { Barometer::WeatherService.day? }.should raise_error(ArgumentError)
635
- lambda { Barometer::WeatherService.day?("a") }.should raise_error(ArgumentError)
636
- lambda { Barometer::WeatherService.day?(@measurement) }.should_not raise_error(ArgumentError)
637
- end
638
-
639
- it "requires time as a Data::LocalTime object" do
640
- #lambda { Barometer::WeatherService.day?(@measurement,"a") }.should raise_error(ArgumentError)
641
- lambda { Barometer::WeatherService.day?(@measurement,@now) }.should_not raise_error(ArgumentError)
642
- end
643
-
644
- describe "and is current" do
645
-
646
- before(:each) do
647
- module Barometer; class Data::Measurement
648
- def current?(a=nil); true; end
649
- end; end
650
- end
651
-
652
- it "returns nil" do
653
- Barometer::WeatherService.day?(@measurement).should be_nil
654
- end
655
-
656
- it "returns true if currently_day?" do
657
- module Barometer; class WeatherService
658
- def self.currently_day?(a=nil); true; end
659
- end; end
660
- Barometer::WeatherService.day?(@measurement).should be_true
661
- end
662
-
663
- it "returns false if !currently_day?" do
664
- module Barometer; class WeatherService
665
- def self.currently_day?(a=nil); false; end
666
- end; end
667
- Barometer::WeatherService.day?(@measurement).should be_false
668
- end
669
-
670
- end
671
-
672
- describe "and is NOT current" do
673
-
674
- before(:each) do
675
- module Barometer; class Data::Measurement
676
- def current?(a=nil); false; end
677
- end; end
678
- end
679
-
680
- it "returns nil" do
681
- Barometer::WeatherService.day?(@measurement).should be_nil
682
- end
683
-
684
- it "returns true if forecasted_day?" do
685
- module Barometer; class WeatherService
686
- def self.forecasted_day?(a=nil,b=nil); true; end
687
- end; end
688
- Barometer::WeatherService.day?(@measurement).should be_true
689
- end
690
-
691
- it "returns false if !forecasted_day?" do
692
- module Barometer; class WeatherService
693
- def self.forecasted_day?(a=nil,b=nil); false; end
694
- end; end
695
- Barometer::WeatherService.day?(@measurement).should be_false
696
- end
697
-
698
- end
699
-
700
- end
701
-
702
- describe "currently_day?" do
703
-
704
- before(:each) do
705
- # the function being tested was monkey patched in an earlier test
706
- # so the original file must be reloaded
707
- load 'lib/barometer/weather_services/service.rb'
708
-
709
- @measurement = Data::Measurement.new
710
- end
711
-
712
- it "requires a measurement object" do
713
- lambda { Barometer::WeatherService.currently_day? }.should raise_error(ArgumentError)
714
- lambda { Barometer::WeatherService.currently_day?("a") }.should raise_error(ArgumentError)
715
- lambda { Barometer::WeatherService.currently_day?(@measurement) }.should_not raise_error(ArgumentError)
716
- end
717
-
718
- it "returns nil when value unavailable" do
719
- measurement = Data::Measurement.new
720
- Barometer::WeatherService.currently_day?(measurement).should be_nil
721
- end
722
-
723
- describe "and currently_after_sunrise?" do
724
-
725
- before(:each) do
726
- @measurement = Data::CurrentMeasurement.new
727
- @now = Data::LocalTime.parse("2:02 pm")
728
- @past = @now - (60*60)
729
- @future = @now + (60*60)
730
- end
731
-
732
- it "returns true when now is past sun_rise" do
733
- @measurement.sun = Data::Sun.new(@past)
734
- @measurement.current_at.should be_nil
735
- Barometer::WeatherService.currently_after_sunrise?(@measurement).should be_nil
736
-
737
- @measurement.current_at = @now
738
- @measurement.current_at.should_not be_nil
739
- Barometer::WeatherService.currently_after_sunrise?(@measurement).should be_true
740
- end
741
-
742
- it "returns false when now if before sun_rise" do
743
- @measurement.sun = Data::Sun.new(@future)
744
- @measurement.current_at.should be_nil
745
- Barometer::WeatherService.currently_after_sunrise?(@measurement).should be_nil
746
-
747
- @measurement.current_at = @now
748
- @measurement.current_at.should_not be_nil
749
- Barometer::WeatherService.currently_after_sunrise?(@measurement).should be_false
750
- end
751
-
752
- end
753
-
754
- describe "and currently_before_sunset?" do
755
-
756
- before(:each) do
757
- @measurement = Data::CurrentMeasurement.new
758
- @now = Data::LocalTime.parse("2:02 pm")
759
- @past = @now - (60*60)
760
- @future = @now + (60*60)
761
- end
762
-
763
- it "returns true when now is before sun_set" do
764
- @measurement.sun = Data::Sun.new(nil,@future)
765
- @measurement.current_at.should be_nil
766
- Barometer::WeatherService.currently_before_sunset?(@measurement).should be_nil
767
-
768
- @measurement.current_at = @now
769
- @measurement.current_at.should_not be_nil
770
- Barometer::WeatherService.currently_before_sunset?(@measurement).should be_true
771
- end
772
-
773
- it "returns false when now if after sun_set" do
774
- @measurement.sun = Data::Sun.new(nil,@past)
775
- @measurement.current_at.should be_nil
776
- Barometer::WeatherService.currently_before_sunset?(@measurement).should be_nil
777
-
778
- @measurement.current_at = @now
779
- @measurement.current_at.should_not be_nil
780
- Barometer::WeatherService.currently_before_sunset?(@measurement).should be_false
781
- end
782
-
783
- end
784
-
785
- end
786
-
787
- describe "forecasted_day?" do
788
-
789
- before(:each) do
790
- # the function being tested was monkey patched in an earlier test
791
- # so the original file must be reloaded
792
- load 'lib/barometer/weather_services/service.rb'
793
-
794
- @measurement = Data::Measurement.new
795
- end
796
-
797
- it "requires a measurement object" do
798
- lambda { Barometer::WeatherService.forecasted_day? }.should raise_error(ArgumentError)
799
- lambda { Barometer::WeatherService.forecasted_day?("a") }.should raise_error(ArgumentError)
800
- lambda { Barometer::WeatherService.forecasted_day?(@measurement) }.should_not raise_error(ArgumentError)
801
- end
802
-
803
- it "requires time as a Data::LocalTime object" do
804
- #lambda { Barometer::WeatherService.forecasted_day?(@measurement,"a") }.should raise_error(ArgumentError)
805
- lambda { Barometer::WeatherService.forecasted_day?(@measurement,@now) }.should_not raise_error(ArgumentError)
806
- end
807
-
808
- it "returns nil when value unavailable" do
809
- measurement = Data::Measurement.new
810
- Barometer::WeatherService.forecasted_day?(measurement).should be_nil
811
- end
812
-
813
- describe "and forecasted_after_sunrise?" do
814
-
815
- before(:each) do
816
- @measurement = Data::ForecastMeasurement.new
817
- @now = Data::LocalDateTime.parse("2:02 pm")
818
- @past = @now - (60*60)
819
- @future = @now + (60*60)
820
- end
821
-
822
- it "returns true when now is past sun_rise" do
823
- @measurement.sun = Data::Sun.new(@past)
824
- Barometer::WeatherService.forecasted_after_sunrise?(@measurement, @now).should be_true
825
- end
826
-
827
- it "returns false when now if before sun_rise" do
828
- @measurement.sun = Data::Sun.new(@future)
829
- Barometer::WeatherService.forecasted_after_sunrise?(@measurement, @now).should be_false
830
- end
831
-
832
- end
833
-
834
- describe "and forecasted_before_sunset?" do
835
-
836
- before(:each) do
837
- @measurement = Data::ForecastMeasurement.new
838
- @now = Data::LocalDateTime.parse("2:02 pm")
839
- @past = @now - (60*60)
840
- @future = @now + (60*60)
841
- end
842
-
843
- it "returns true when now is before sun_set" do
844
- @measurement.sun = Data::Sun.new(nil,@future)
845
- Barometer::WeatherService.forecasted_before_sunset?(@measurement,@now).should be_true
846
- end
847
-
848
- it "returns false when now if after sun_set" do
849
- @measurement.sun = Data::Sun.new(nil,@past)
850
- Barometer::WeatherService.forecasted_before_sunset?(@measurement,@now).should be_false
851
- end
852
-
853
- end
854
-
855
- end
856
-
857
- describe "sunny?" do
858
-
859
- it "requires a measurement object" do
860
- lambda { Barometer::WeatherService.sunny? }.should raise_error(ArgumentError)
861
- lambda { Barometer::WeatherService.sunny?("a") }.should raise_error(ArgumentError)
862
- lambda { Barometer::WeatherService.sunny?(@measurement) }.should_not raise_error(ArgumentError)
863
- end
864
-
865
- it "requires time as a Data::LocalTime object" do
866
- #lambda { Barometer::WeatherService.sunny?(@measurement,"a") }.should raise_error(ArgumentError)
867
- lambda { Barometer::WeatherService.sunny?(@measurement,@now) }.should_not raise_error(ArgumentError)
868
- end
869
-
870
- it "draws attention to this spot to fix this test"
871
- # it "returns false if night time" do
872
- # @measurement.forecast = [Data::ForecastMeasurement.new]
873
- # @measurement.forecast.size.should == 1
874
- # @measurement.forecast[0].date = Date.today
875
- # module Barometer; class WeatherService; def self.day?(a=nil, b=nil)
876
- # true
877
- # end; end; end
878
- # Barometer::WeatherService.forecasted_sunny?(@measurement).should be_true
879
- # module Barometer; class WeatherService; def self.day?(a=nil, b=nil)
880
- # false
881
- # end; end; end
882
- # Barometer::WeatherService.forecasted_sunny?(@measurement).should be_false
883
- # end
884
-
885
- describe "and is current" do
886
-
887
- before(:each) do
888
- module Barometer; class Data::Measurement
889
- def current?(a=nil); true; end
890
- end; end
891
- end
892
-
893
- it "returns nil" do
894
- Barometer::WeatherService.sunny?(@measurement).should be_nil
895
- end
896
-
897
- it "returns true if currently_sunny?" do
898
- module Barometer; class WeatherService
899
- def self.currently_sunny?(a=nil); true; end
900
- end; end
901
- Barometer::WeatherService.sunny?(@measurement).should be_true
902
- end
903
-
904
- it "returns false if !currently_sunny?" do
905
- module Barometer; class WeatherService
906
- def self.currently_sunny?(a=nil); false; end
907
- end; end
908
- Barometer::WeatherService.sunny?(@measurement).should be_false
909
- end
910
-
911
- end
912
-
913
- describe "and is NOT current" do
914
-
915
- before(:each) do
916
- module Barometer; class Data::Measurement
917
- def current?(a=nil); false; end
918
- end; end
919
- end
920
-
921
- it "returns nil" do
922
- Barometer::WeatherService.sunny?(@measurement).should be_nil
923
- end
924
-
925
- it "returns true if forecasted_sunny?" do
926
- module Barometer; class WeatherService
927
- def self.forecasted_sunny?(a=nil,b=nil); true; end
928
- end; end
929
- Barometer::WeatherService.sunny?(@measurement).should be_true
930
- end
931
-
932
- it "returns false if !forecasted_wet?" do
933
- module Barometer; class WeatherService
934
- def self.forecasted_sunny?(a=nil,b=nil); false; end
935
- end; end
936
- Barometer::WeatherService.sunny?(@measurement).should be_false
937
- end
938
-
939
- end
940
-
941
- end
942
-
943
- describe "currently_sunny?" do
944
-
945
- before(:each) do
946
- # the function being tested was monkey patched in an earlier test
947
- # so the original file must be reloaded
948
- load 'lib/barometer/weather_services/service.rb'
949
-
950
- @measurement = Data::Measurement.new
951
- end
952
-
953
- it "requires a measurement object" do
954
- lambda { Barometer::WeatherService.currently_sunny? }.should raise_error(ArgumentError)
955
- lambda { Barometer::WeatherService.currently_sunny?("a") }.should raise_error(ArgumentError)
956
- lambda { Barometer::WeatherService.currently_sunny?(@measurement) }.should_not raise_error(ArgumentError)
957
- end
958
-
959
- it "returns nil when value unavailable" do
960
- measurement = Data::Measurement.new
961
- Barometer::WeatherService.currently_sunny?(measurement).should be_nil
962
- measurement.current = Data::CurrentMeasurement.new
963
- Barometer::WeatherService.currently_sunny?(measurement).should be_nil
964
- end
965
-
966
- it "returns false if night time" do
967
- @measurement.current = Data::CurrentMeasurement.new
968
- module Barometer; class WeatherService; def self.currently_day?(a=nil)
969
- true
970
- end; end; end
971
- module Barometer; class WeatherService; def self.currently_sunny_by_icon?(a=nil)
972
- true
973
- end; end; end
974
- Barometer::WeatherService.currently_sunny?(@measurement).should be_true
975
- module Barometer; class WeatherService; def self.currently_day?(a=nil)
976
- false
977
- end; end; end
978
- Barometer::WeatherService.currently_sunny?(@measurement).should be_false
979
- end
980
-
981
- describe "currently_sunny_by_icon?" do
982
-
983
- before(:each) do
984
- @measurement.current = Data::CurrentMeasurement.new
985
- end
986
-
987
- it "requires a Barometer::Measurement object" do
988
- lambda { Barometer::WeatherService.currently_sunny_by_icon?(nil) }.should raise_error(ArgumentError)
989
- lambda { Barometer::WeatherService.currently_sunny_by_icon?("invlaid") }.should raise_error(ArgumentError)
990
-
991
- lambda { Barometer::WeatherService.currently_sunny_by_icon?(@measurement.current) }.should_not raise_error(ArgumentError)
992
- end
993
-
994
- it "returns nil if no icon" do
995
- @measurement.current.icon?.should be_false
996
- Barometer::WeatherService.currently_sunny_by_icon?(@measurement.current).should be_nil
997
- end
998
-
999
- it "returns true if matching icon code" do
1000
- module Barometer; class WeatherService; def self.sunny_icon_codes
1001
- ["sunny"]
1002
- end; end; end
1003
- @measurement.current.icon = "sunny"
1004
- @measurement.current.icon?.should be_true
1005
- Barometer::WeatherService.currently_sunny_by_icon?(@measurement.current).should be_true
1006
- end
1007
-
1008
- it "returns false if NO matching icon code" do
1009
- module Barometer; class WeatherService; def self.sunny_icon_codes
1010
- ["sunny"]
1011
- end; end; end
1012
- @measurement.current.icon = "rain"
1013
- @measurement.current.icon?.should be_true
1014
- Barometer::WeatherService.currently_sunny_by_icon?(@measurement.current).should be_false
1015
- end
1016
-
1017
- end
1018
-
1019
- end
1020
-
1021
- describe "forecasted_sunny?" do
1022
-
1023
- before(:each) do
1024
- # the function being tested was monkey patched in an earlier test
1025
- # so the original file must be reloaded
1026
- load 'lib/barometer/weather_services/service.rb'
1027
-
1028
- @measurement = Data::Measurement.new
1029
- end
1030
-
1031
- it "requires a measurement object" do
1032
- lambda { Barometer::WeatherService.forecasted_sunny? }.should raise_error(ArgumentError)
1033
- lambda { Barometer::WeatherService.forecasted_sunny?("a") }.should raise_error(ArgumentError)
1034
- lambda { Barometer::WeatherService.forecasted_sunny?(@measurement) }.should_not raise_error(ArgumentError)
1035
- end
1036
-
1037
- it "requires utc_time as a Data::LocalTime object" do
1038
- #lambda { Barometer::WeatherService.forecasted_sunny?(@measurement,"string") }.should raise_error(ArgumentError)
1039
- lambda { Barometer::WeatherService.forecasted_sunny?(@measurement,@now) }.should_not raise_error(ArgumentError)
1040
- end
1041
-
1042
- it "returns nil when value unavailable" do
1043
- measurement = Data::Measurement.new
1044
- Barometer::WeatherService.forecasted_sunny?(measurement).should be_nil
1045
- measurement.forecast = [Data::ForecastMeasurement.new]
1046
- measurement.forecast.size.should == 1
1047
- Barometer::WeatherService.forecasted_sunny?(measurement).should be_nil
1048
- end
1049
-
1050
- it "returns false if night time" do
1051
- @measurement.forecast = [Data::ForecastMeasurement.new]
1052
- @measurement.forecast.size.should == 1
1053
- target_date = Date.today
1054
- @measurement.forecast[0].date = target_date
1055
- module Barometer; class WeatherService; def self.forecasted_day?(a=nil, b=nil)
1056
- true
1057
- end; end; end
1058
- module Barometer; class WeatherService; def self.forecasted_sunny_by_icon?(a=nil, b=nil)
1059
- true
1060
- end; end; end
1061
- Barometer::WeatherService.forecasted_sunny?(@measurement, target_date).should be_true
1062
- module Barometer; class WeatherService; def self.forecasted_day?(a=nil, b=nil)
1063
- false
1064
- end; end; end
1065
- Barometer::WeatherService.forecasted_sunny?(@measurement).should be_false
1066
- end
1067
-
1068
- describe "forecasted_sunny_by_icon?" do
1069
-
1070
- before(:each) do
1071
- @measurement.forecast = [Data::ForecastMeasurement.new]
1072
- @measurement.forecast.first.date = Date.today
1073
- @measurement.forecast.size.should == 1
1074
- end
1075
-
1076
- it "requires a Barometer::Measurement object" do
1077
- lambda { Barometer::WeatherService.forecasted_sunny_by_icon?(nil) }.should raise_error(ArgumentError)
1078
- lambda { Barometer::WeatherService.forecasted_sunny_by_icon?("invlaid") }.should raise_error(ArgumentError)
1079
-
1080
- lambda { Barometer::WeatherService.forecasted_sunny_by_icon?(@measurement.forecast.first) }.should_not raise_error(ArgumentError)
1081
- end
1082
-
1083
- it "returns nil if no icon" do
1084
- @measurement.forecast.first.icon?.should be_false
1085
- Barometer::WeatherService.forecasted_sunny_by_icon?(@measurement.forecast.first).should be_nil
1086
- end
1087
-
1088
- it "returns true if matching icon code" do
1089
- module Barometer; class WeatherService; def self.sunny_icon_codes
1090
- ["sunny"]
1091
- end; end; end
1092
- @measurement.forecast.first.icon = "sunny"
1093
- @measurement.forecast.first.icon?.should be_true
1094
- Barometer::WeatherService.forecasted_sunny_by_icon?(@measurement.forecast.first).should be_true
1095
- end
1096
-
1097
- it "returns false if NO matching icon code" do
1098
- module Barometer; class WeatherService; def self.sunny_icon_codes
1099
- ["sunny"]
1100
- end; end; end
1101
- @measurement.forecast.first.icon = "rain"
1102
- @measurement.forecast.first.icon?.should be_true
1103
- Barometer::WeatherService.forecasted_sunny_by_icon?(@measurement.forecast.first).should be_false
1104
- end
1105
-
1106
- after(:each) do
1107
- # the function being tested was monkey patched in an earlier test
1108
- # so the original file must be reloaded
1109
- load 'lib/barometer/weather_services/service.rb'
1110
- end
1111
-
1112
- end
1113
-
1114
- end
1115
-
1116
- end
1117
-
1118
143
  end