barometer 0.3.2 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (108) hide show
  1. data/README.rdoc +78 -70
  2. data/VERSION.yml +2 -2
  3. data/bin/barometer +100 -37
  4. data/lib/barometer.rb +12 -8
  5. data/lib/barometer/base.rb +48 -20
  6. data/lib/barometer/data.rb +5 -1
  7. data/lib/barometer/data/current.rb +23 -15
  8. data/lib/barometer/data/distance.rb +15 -5
  9. data/lib/barometer/data/forecast.rb +23 -5
  10. data/lib/barometer/data/geo.rb +16 -54
  11. data/lib/barometer/data/local_datetime.rb +137 -0
  12. data/lib/barometer/data/local_time.rb +134 -0
  13. data/lib/barometer/data/location.rb +6 -1
  14. data/lib/barometer/data/measurement.rb +71 -42
  15. data/lib/barometer/data/night.rb +69 -0
  16. data/lib/barometer/data/pressure.rb +15 -5
  17. data/lib/barometer/data/speed.rb +16 -5
  18. data/lib/barometer/data/sun.rb +8 -20
  19. data/lib/barometer/data/temperature.rb +22 -9
  20. data/lib/barometer/data/units.rb +10 -19
  21. data/lib/barometer/data/zone.rb +135 -9
  22. data/lib/barometer/formats.rb +12 -0
  23. data/lib/barometer/formats/coordinates.rb +42 -0
  24. data/lib/barometer/formats/format.rb +46 -0
  25. data/lib/barometer/formats/geocode.rb +51 -0
  26. data/lib/barometer/formats/icao.rb +37 -0
  27. data/lib/barometer/formats/postalcode.rb +22 -0
  28. data/lib/barometer/formats/short_zipcode.rb +17 -0
  29. data/lib/barometer/formats/weather_id.rb +107 -0
  30. data/lib/barometer/formats/zipcode.rb +31 -0
  31. data/lib/barometer/query.rb +61 -232
  32. data/lib/barometer/services.rb +14 -4
  33. data/lib/barometer/translations/icao_country_codes.yml +9 -0
  34. data/lib/barometer/translations/weather_country_codes.yml +17 -0
  35. data/lib/barometer/weather.rb +51 -30
  36. data/lib/barometer/{services → weather_services}/google.rb +23 -26
  37. data/lib/barometer/weather_services/noaa.rb +6 -0
  38. data/lib/barometer/{services → weather_services}/service.rb +101 -92
  39. data/lib/barometer/weather_services/weather_bug.rb +6 -0
  40. data/lib/barometer/weather_services/weather_dot_com.rb +261 -0
  41. data/lib/barometer/{services → weather_services}/wunderground.rb +58 -76
  42. data/lib/barometer/{services → weather_services}/yahoo.rb +91 -121
  43. data/lib/barometer/web_services/geocode.rb +33 -0
  44. data/lib/barometer/web_services/weather_id.rb +37 -0
  45. data/lib/barometer/web_services/web_service.rb +32 -0
  46. data/lib/demometer/demometer.rb +31 -4
  47. data/lib/demometer/views/forecast.erb +20 -0
  48. data/lib/demometer/views/index.erb +10 -3
  49. data/lib/demometer/views/measurement.erb +8 -3
  50. data/lib/demometer/views/readme.erb +63 -24
  51. data/spec/barometer_spec.rb +18 -36
  52. data/spec/{data_current_spec.rb → data/current_spec.rb} +73 -49
  53. data/spec/{data_distance_spec.rb → data/distance_spec.rb} +30 -30
  54. data/spec/{data_forecast_spec.rb → data/forecast_spec.rb} +57 -15
  55. data/spec/data/geo_spec.rb +91 -0
  56. data/spec/data/local_datetime_spec.rb +269 -0
  57. data/spec/data/local_time_spec.rb +239 -0
  58. data/spec/{data_location_spec.rb → data/location_spec.rb} +12 -1
  59. data/spec/{data_measurement_spec.rb → data/measurement_spec.rb} +135 -66
  60. data/spec/data/night_measurement_spec.rb +136 -0
  61. data/spec/{data_pressure_spec.rb → data/pressure_spec.rb} +29 -29
  62. data/spec/{data_speed_spec.rb → data/speed_spec.rb} +30 -30
  63. data/spec/data/sun_spec.rb +49 -0
  64. data/spec/{data_temperature_spec.rb → data/temperature_spec.rb} +44 -44
  65. data/spec/{units_spec.rb → data/units_spec.rb} +6 -6
  66. data/spec/{data_zone_spec.rb → data/zone_spec.rb} +15 -15
  67. data/spec/fixtures/formats/weather_id/90210.xml +1 -0
  68. data/spec/fixtures/formats/weather_id/atlanta.xml +1 -0
  69. data/spec/fixtures/formats/weather_id/from_USGA0028.xml +1 -0
  70. data/spec/fixtures/formats/weather_id/new_york.xml +1 -0
  71. data/spec/fixtures/{geocode_40_73.xml → geocode/40_73.xml} +0 -0
  72. data/spec/fixtures/{geocode_90210.xml → geocode/90210.xml} +0 -0
  73. data/spec/fixtures/{geocode_T5B4M9.xml → geocode/T5B4M9.xml} +0 -0
  74. data/spec/fixtures/geocode/atlanta.xml +1 -0
  75. data/spec/fixtures/{geocode_calgary_ab.xml → geocode/calgary_ab.xml} +0 -0
  76. data/spec/fixtures/{geocode_ksfo.xml → geocode/ksfo.xml} +0 -0
  77. data/spec/fixtures/{geocode_newyork_ny.xml → geocode/newyork_ny.xml} +0 -0
  78. data/spec/fixtures/{google_calgary_ab.xml → services/google/calgary_ab.xml} +0 -0
  79. data/spec/fixtures/services/weather_dot_com/90210.xml +1 -0
  80. data/spec/fixtures/{current_calgary_ab.xml → services/wunderground/current_calgary_ab.xml} +0 -0
  81. data/spec/fixtures/{forecast_calgary_ab.xml → services/wunderground/forecast_calgary_ab.xml} +0 -0
  82. data/spec/fixtures/{yahoo_90210.xml → services/yahoo/90210.xml} +0 -0
  83. data/spec/formats/coordinates_spec.rb +158 -0
  84. data/spec/formats/format_spec.rb +73 -0
  85. data/spec/formats/geocode_spec.rb +179 -0
  86. data/spec/formats/icao_spec.rb +61 -0
  87. data/spec/formats/postalcode_spec.rb +59 -0
  88. data/spec/formats/short_zipcode_spec.rb +53 -0
  89. data/spec/formats/weather_id_spec.rb +191 -0
  90. data/spec/formats/zipcode_spec.rb +111 -0
  91. data/spec/query_spec.rb +261 -288
  92. data/spec/spec_helper.rb +128 -4
  93. data/spec/{service_google_spec.rb → weather_services/google_spec.rb} +46 -46
  94. data/spec/weather_services/services_spec.rb +1118 -0
  95. data/spec/weather_services/weather_dot_com_spec.rb +327 -0
  96. data/spec/weather_services/wunderground_spec.rb +332 -0
  97. data/spec/{service_yahoo_spec.rb → weather_services/yahoo_spec.rb} +65 -81
  98. data/spec/weather_spec.rb +73 -61
  99. data/spec/web_services/geocode_spec.rb +45 -0
  100. data/spec/web_services/web_services_spec.rb +26 -0
  101. metadata +88 -36
  102. data/lib/barometer/services/noaa.rb +0 -6
  103. data/lib/barometer/services/weather_bug.rb +0 -6
  104. data/lib/barometer/services/weather_dot_com.rb +0 -6
  105. data/spec/data_geo_spec.rb +0 -94
  106. data/spec/data_sun_spec.rb +0 -76
  107. data/spec/service_wunderground_spec.rb +0 -330
  108. data/spec/services_spec.rb +0 -1106
@@ -5,7 +5,7 @@ describe "Location" do
5
5
  describe "when initialized" do
6
6
 
7
7
  before(:each) do
8
- @location = Barometer::Location.new
8
+ @location = Data::Location.new
9
9
  end
10
10
 
11
11
  it "responds to id" do
@@ -54,6 +54,17 @@ describe "Location" do
54
54
  @location.coordinates.should == [@location.latitude, @location.longitude].join(',')
55
55
  end
56
56
 
57
+ it "should print a string" do
58
+ @location = Data::Location.new
59
+ @location.to_s.should == ""
60
+ @location.name = "name"
61
+ @location.to_s.should == "name"
62
+ @location.city = "city"
63
+ @location.to_s.should == "name, city"
64
+ @location.country_code = "code"
65
+ @location.to_s.should == "name, city, code"
66
+ end
67
+
57
68
  end
58
69
 
59
70
  end
@@ -5,7 +5,7 @@ describe "Measurement" do
5
5
  describe "when initialized" do
6
6
 
7
7
  before(:each) do
8
- @measurement = Barometer::Measurement.new
8
+ @measurement = Data::Measurement.new
9
9
  end
10
10
 
11
11
  it "responds to source" do
@@ -14,13 +14,13 @@ describe "Measurement" do
14
14
 
15
15
  it "stores the source" do
16
16
  source = :wunderground
17
- measurement = Barometer::Measurement.new(source)
17
+ measurement = Data::Measurement.new(source)
18
18
  measurement.source.should_not be_nil
19
19
  measurement.source.should == source
20
20
  end
21
21
 
22
- it "responds to time" do
23
- @measurement.time.should be_nil
22
+ it "responds to utc_time_stamp" do
23
+ @measurement.utc_time_stamp.should be_nil
24
24
  end
25
25
 
26
26
  it "responds to current" do
@@ -55,12 +55,28 @@ describe "Measurement" do
55
55
  @measurement.metric.should be_true
56
56
  end
57
57
 
58
+ it "responds to weight" do
59
+ @measurement.weight.should == 1
60
+ end
61
+
62
+ it "responds to links" do
63
+ @measurement.links.should == {}
64
+ end
65
+
66
+ it "responds to measured_at" do
67
+ @measurement.measured_at.should be_nil
68
+ end
69
+
70
+ # it "responds to measured_for" do
71
+ # @measurement.links.should == {}
72
+ # end
73
+
58
74
  end
59
75
 
60
76
  describe "when writing data" do
61
77
 
62
78
  before(:each) do
63
- @measurement = Barometer::Measurement.new
79
+ @measurement = Data::Measurement.new
64
80
  end
65
81
 
66
82
  it "only accepts Symbol for source" do
@@ -73,23 +89,23 @@ describe "Measurement" do
73
89
  lambda { @measurement.source = valid_data }.should_not raise_error(ArgumentError)
74
90
  end
75
91
 
76
- it "only accepts Time for time" do
92
+ it "only accepts Time for utc_time_stamp" do
77
93
  invalid_data = 1
78
94
  invalid_data.class.should_not == Time
79
- lambda { @measurement.time = invalid_data }.should raise_error(ArgumentError)
95
+ lambda { @measurement.utc_time_stamp = invalid_data }.should raise_error(ArgumentError)
80
96
 
81
97
  valid_data = Time.now.utc
82
98
  valid_data.class.should == Time
83
- lambda { @measurement.time = valid_data }.should_not raise_error(ArgumentError)
99
+ lambda { @measurement.utc_time_stamp = valid_data }.should_not raise_error(ArgumentError)
84
100
  end
85
101
 
86
- it "only accepts Barometer::CurrentMeasurement for current" do
102
+ it "only accepts Data::CurrentMeasurement for current" do
87
103
  invalid_data = "invalid"
88
- invalid_data.class.should_not == Barometer::CurrentMeasurement
104
+ invalid_data.class.should_not == Data::CurrentMeasurement
89
105
  lambda { @measurement.current = invalid_data }.should raise_error(ArgumentError)
90
106
 
91
- valid_data = Barometer::CurrentMeasurement.new
92
- valid_data.class.should == Barometer::CurrentMeasurement
107
+ valid_data = Data::CurrentMeasurement.new
108
+ valid_data.class.should == Data::CurrentMeasurement
93
109
  lambda { @measurement.current = valid_data }.should_not raise_error(ArgumentError)
94
110
  end
95
111
 
@@ -103,62 +119,92 @@ describe "Measurement" do
103
119
  lambda { @measurement.forecast = valid_data }.should_not raise_error(ArgumentError)
104
120
  end
105
121
 
106
- it "only accepts Barometer::Zone for timezone" do
122
+ it "only accepts Data::Zone for timezone" do
107
123
  invalid_data = 1
108
- invalid_data.class.should_not == Barometer::Zone
124
+ invalid_data.class.should_not == Data::Zone
109
125
  lambda { @measurement.timezone = invalid_data }.should raise_error(ArgumentError)
110
126
 
111
- valid_data = Barometer::Zone.new("Europe/Paris")
112
- valid_data.class.should == Barometer::Zone
127
+ valid_data = Data::Zone.new("Europe/Paris")
128
+ valid_data.class.should == Data::Zone
113
129
  lambda { @measurement.timezone = valid_data }.should_not raise_error(ArgumentError)
114
130
  end
115
131
 
116
- it "only accepts Barometer::Location for station" do
132
+ it "only accepts Data::Location for station" do
117
133
  invalid_data = 1
118
- invalid_data.class.should_not == Barometer::Location
134
+ invalid_data.class.should_not == Data::Location
119
135
  lambda { @measurement.station = invalid_data }.should raise_error(ArgumentError)
120
136
 
121
- valid_data = Barometer::Location.new
122
- valid_data.class.should == Barometer::Location
137
+ valid_data = Data::Location.new
138
+ valid_data.class.should == Data::Location
123
139
  lambda { @measurement.station = valid_data }.should_not raise_error(ArgumentError)
124
140
  end
125
141
 
126
- it "only accepts Barometer::Location for location" do
142
+ it "only accepts Data::Location for location" do
127
143
  invalid_data = 1
128
- invalid_data.class.should_not == Barometer::Location
144
+ invalid_data.class.should_not == Data::Location
129
145
  lambda { @measurement.location = invalid_data }.should raise_error(ArgumentError)
130
146
 
131
- valid_data = Barometer::Location.new
132
- valid_data.class.should == Barometer::Location
147
+ valid_data = Data::Location.new
148
+ valid_data.class.should == Data::Location
133
149
  lambda { @measurement.location = valid_data }.should_not raise_error(ArgumentError)
134
150
  end
135
151
 
152
+ it "only accepts Fixnum for weight" do
153
+ invalid_data = "test"
154
+ invalid_data.class.should_not == Fixnum
155
+ lambda { @measurement.weight = invalid_data }.should raise_error(ArgumentError)
156
+
157
+ valid_data = 1
158
+ valid_data.class.should == Fixnum
159
+ lambda { @measurement.weight = valid_data }.should_not raise_error(ArgumentError)
160
+ end
161
+
162
+ it "only accepts Array for links" do
163
+ invalid_data = 1
164
+ invalid_data.class.should_not == Hash
165
+ lambda { @measurement.links = invalid_data }.should raise_error(ArgumentError)
166
+
167
+ valid_data = {1 => nil}
168
+ valid_data.class.should == Hash
169
+ lambda { @measurement.links = valid_data }.should_not raise_error(ArgumentError)
170
+ end
171
+
172
+ it "only accepts Data::LocalTime for measured_at" do
173
+ invalid_data = 1
174
+ invalid_data.class.should_not == Data::LocalTime
175
+ lambda { @measurement.measured_at = invalid_data }.should raise_error(ArgumentError)
176
+
177
+ valid_data = Data::LocalTime.new
178
+ valid_data.class.should == Data::LocalTime
179
+ lambda { @measurement.measured_at = valid_data }.should_not raise_error(ArgumentError)
180
+ end
181
+
136
182
  end
137
183
 
138
184
  describe "and the helpers" do
139
185
 
140
186
  before(:each) do
141
- @measurement = Barometer::Measurement.new
187
+ @measurement = Data::Measurement.new
142
188
  end
143
189
 
144
190
  it "changes state to successful (if successful)" do
145
191
  @measurement.success.should be_false
146
192
  @measurement.success!
147
- @measurement.time.should be_nil
193
+ @measurement.utc_time_stamp.should be_nil
148
194
  @measurement.current.should be_nil
149
195
  @measurement.success.should be_false
150
196
 
151
- @measurement.current = Barometer::CurrentMeasurement.new
152
- @measurement.current.temperature = Barometer::Temperature.new
197
+ @measurement.current = Data::CurrentMeasurement.new
198
+ @measurement.current.temperature = Data::Temperature.new
153
199
  @measurement.current.temperature.c = 10
154
- @measurement.time.should_not be_nil
200
+ @measurement.utc_time_stamp.should_not be_nil
155
201
  @measurement.success!
156
202
  @measurement.success.should be_true
157
203
  end
158
204
 
159
205
  it "returns successful state" do
160
- @measurement.current = Barometer::CurrentMeasurement.new
161
- @measurement.current.temperature = Barometer::Temperature.new
206
+ @measurement.current = Data::CurrentMeasurement.new
207
+ @measurement.current.temperature = Data::Temperature.new
162
208
  @measurement.current.temperature.c = 10
163
209
  @measurement.success!
164
210
  @measurement.success.should be_true
@@ -170,30 +216,46 @@ describe "Measurement" do
170
216
  @measurement.success?.should be_false
171
217
  end
172
218
 
173
- it "stamps the time" do
174
- @measurement.time.should be_nil
219
+ it "stamps the utc_time_stamp" do
220
+ @measurement.utc_time_stamp.should be_nil
175
221
  @measurement.stamp!
176
- @measurement.time.should_not be_nil
222
+ @measurement.utc_time_stamp.should_not be_nil
177
223
  end
178
224
 
179
225
  it "indicates if current" do
180
- @measurement.time.should be_nil
226
+ @measurement.current.should be_nil
181
227
  @measurement.current?.should be_false
182
- @measurement.stamp!
183
- @measurement.time.should_not be_nil
184
- @measurement.current?.should be_true
185
228
 
186
- @measurement.time -= (60*60*3)
229
+ @measurement.current = Data::CurrentMeasurement.new
230
+ @measurement.current.current_at.should be_nil
231
+ @measurement.current?.should be_false
232
+
233
+ @measurement.current.current_at = Data::LocalTime.new(9,0,0)
187
234
  @measurement.current?.should be_true
235
+ @measurement.current?("9:00 am").should be_true
236
+
188
237
 
189
- @measurement.time -= (60*60*5)
190
- @measurement.current?.should be_false
191
238
  end
239
+
240
+
241
+ # it "indicates if current" do
242
+ # #@measurement.time.should be_nil
243
+ # @measurement.current?.should be_false
244
+ # @measurement.stamp!
245
+ # @measurement.time.should_not be_nil
246
+ # @measurement.current?.should be_true
247
+ #
248
+ # @measurement.time -= (60*60*3)
249
+ # @measurement.current?.should be_true
250
+ #
251
+ # @measurement.time -= (60*60*5)
252
+ # @measurement.current?.should be_false
253
+ # end
192
254
 
193
255
  describe "changing units" do
194
256
 
195
257
  before(:each) do
196
- @measurement = Barometer::Measurement.new
258
+ @measurement = Data::Measurement.new
197
259
  end
198
260
 
199
261
  it "indicates if metric?" do
@@ -224,13 +286,13 @@ describe "Measurement" do
224
286
  describe "when searching forecasts using 'for'" do
225
287
 
226
288
  before(:each) do
227
- @measurement = Barometer::Measurement.new
289
+ @measurement = Data::Measurement.new
228
290
 
229
291
  # create a measurement object with a forecast array that includes
230
292
  # dates for 4 consecutive days starting with tommorrow
231
293
  @measurement.forecast = []
232
294
  1.upto(4) do |i|
233
- forecast_measurement = Barometer::ForecastMeasurement.new
295
+ forecast_measurement = Data::ForecastMeasurement.new
234
296
  forecast_measurement.date = Date.parse((Time.now + (i * 60 * 60 * 24)).to_s)
235
297
  @measurement.forecast << forecast_measurement
236
298
  end
@@ -268,6 +330,12 @@ describe "Measurement" do
268
330
  @measurement.for(@tommorrow).should == @measurement.forecast.first
269
331
  end
270
332
 
333
+ it "fidns the date using Data::LocalDateTime" do
334
+ tommorrow = Data::LocalDateTime.parse(@tommorrow.to_s)
335
+ tommorrow.class.should == Data::LocalDateTime
336
+ @measurement.for(tommorrow).should == @measurement.forecast.first
337
+ end
338
+
271
339
  it "finds nothing when there is not a match" do
272
340
  yesterday = (Time.now - (60 * 60 * 24))
273
341
  yesterday.class.should == Time
@@ -279,7 +347,8 @@ describe "Measurement" do
279
347
  describe "when answering the simple questions," do
280
348
 
281
349
  before(:each) do
282
- @measurement = Barometer::Measurement.new(:wunderground)
350
+ @measurement = Data::Measurement.new(:wunderground)
351
+ @now = Data::LocalDateTime.parse("2009-05-01 2:05 pm")
283
352
  end
284
353
 
285
354
  describe "windy?" do
@@ -291,19 +360,19 @@ describe "Measurement" do
291
360
  end
292
361
 
293
362
  it "requires time as a Time object" do
294
- lambda { @measurement.windy?(1,"a") }.should raise_error(ArgumentError)
295
- lambda { @measurement.windy?(1,Time.now.utc) }.should_not raise_error(ArgumentError)
363
+ #lambda { @measurement.windy?(1,false) }.should raise_error(ArgumentError)
364
+ lambda { @measurement.windy?(1,@now) }.should_not raise_error(ArgumentError)
296
365
  end
297
366
 
298
367
  it "returns true if a source returns true" do
299
- module Barometer; class Service
368
+ module Barometer; class WeatherService
300
369
  def self.windy?(a=nil,b=nil,c=nil); true; end
301
370
  end; end
302
371
  @measurement.windy?.should be_true
303
372
  end
304
373
 
305
374
  it "returns false if a measurement returns false" do
306
- module Barometer; class Service
375
+ module Barometer; class WeatherService
307
376
  def self.windy?(a=nil,b=nil,c=nil); false; end
308
377
  end; end
309
378
  @measurement.windy?.should be_false
@@ -320,19 +389,19 @@ describe "Measurement" do
320
389
  end
321
390
 
322
391
  it "requires time as a Time object" do
323
- lambda { @measurement.wet?(1,"a") }.should raise_error(ArgumentError)
324
- lambda { @measurement.wet?(1,Time.now.utc) }.should_not raise_error(ArgumentError)
392
+ #lambda { @measurement.wet?(1,"a") }.should raise_error(ArgumentError)
393
+ lambda { @measurement.wet?(1,@now) }.should_not raise_error(ArgumentError)
325
394
  end
326
395
 
327
396
  it "returns true if a source returns true" do
328
- module Barometer; class Service
397
+ module Barometer; class WeatherService
329
398
  def self.wet?(a=nil,b=nil,c=nil); true; end
330
399
  end; end
331
400
  @measurement.wet?.should be_true
332
401
  end
333
402
 
334
403
  it "returns false if a measurement returns false" do
335
- module Barometer; class Service
404
+ module Barometer; class WeatherService
336
405
  def self.wet?(a=nil,b=nil,c=nil); false; end
337
406
  end; end
338
407
  @measurement.wet?.should be_false
@@ -343,19 +412,19 @@ describe "Measurement" do
343
412
  describe "day?" do
344
413
 
345
414
  it "requires time as a Time object" do
346
- lambda { @measurement.day?("a") }.should raise_error(ArgumentError)
347
- lambda { @measurement.day?(Time.now.utc) }.should_not raise_error(ArgumentError)
415
+ #lambda { @measurement.day?("a") }.should raise_error(ArgumentError)
416
+ lambda { @measurement.day?(@now) }.should_not raise_error(ArgumentError)
348
417
  end
349
418
 
350
419
  it "returns true if a source returns true" do
351
- module Barometer; class Service
420
+ module Barometer; class WeatherService
352
421
  def self.day?(a=nil,b=nil); true; end
353
422
  end; end
354
423
  @measurement.day?.should be_true
355
424
  end
356
425
 
357
426
  it "returns false if a measurement returns false" do
358
- module Barometer; class Service
427
+ module Barometer; class WeatherService
359
428
  def self.day?(a=nil,b=nil); false; end
360
429
  end; end
361
430
  @measurement.day?.should be_false
@@ -366,39 +435,39 @@ describe "Measurement" do
366
435
  describe "sunny?" do
367
436
 
368
437
  it "requires time as a Time object" do
369
- lambda { @measurement.sunny?("a") }.should raise_error(ArgumentError)
370
- lambda { @measurement.sunny?(Time.now.utc) }.should_not raise_error(ArgumentError)
438
+ #lambda { @measurement.sunny?("a") }.should raise_error(ArgumentError)
439
+ lambda { @measurement.sunny?(@now) }.should_not raise_error(ArgumentError)
371
440
  end
372
441
 
373
442
  it "returns true if a source returns true" do
374
- module Barometer; class Service
443
+ module Barometer; class WeatherService
375
444
  def self.day?(a=nil,b=nil); true; end
376
445
  end; end
377
- module Barometer; class Service
446
+ module Barometer; class WeatherService
378
447
  def self.sunny?(a=nil,b=nil); true; end
379
448
  end; end
380
449
  @measurement.sunny?.should be_true
381
450
  end
382
451
 
383
452
  it "returns false if a measurement returns false" do
384
- module Barometer; class Service
453
+ module Barometer; class WeatherService
385
454
  def self.day?(a=nil,b=nil); true; end
386
455
  end; end
387
- module Barometer; class Service
456
+ module Barometer; class WeatherService
388
457
  def self.sunny?(a=nil,b=nil); false; end
389
458
  end; end
390
459
  @measurement.sunny?.should be_false
391
460
  end
392
461
 
393
462
  it "returns false if night time" do
394
- module Barometer; class Service
463
+ module Barometer; class WeatherService
395
464
  def self.day?(a=nil,b=nil); true; end
396
465
  end; end
397
- module Barometer; class Service
466
+ module Barometer; class WeatherService
398
467
  def self.sunny?(a=nil,b=nil); true; end
399
468
  end; end
400
469
  @measurement.sunny?.should be_true
401
- module Barometer; class Service
470
+ module Barometer; class WeatherService
402
471
  def self.day?(a=nil,b=nil); false; end
403
472
  end; end
404
473
  @measurement.sunny?.should be_false
@@ -0,0 +1,136 @@
1
+ require 'spec_helper'
2
+
3
+ describe "Forecasted Night Measurement" do
4
+
5
+ describe "when initialized" do
6
+
7
+ before(:each) do
8
+ @night = Data::NightMeasurement.new
9
+ end
10
+
11
+ it "responds to date" do
12
+ @night.date.should be_nil
13
+ end
14
+
15
+ it "responds to icon" do
16
+ @night.icon.should be_nil
17
+ end
18
+
19
+ it "responds to condition" do
20
+ @night.condition.should be_nil
21
+ end
22
+
23
+ it "responds to pop" do
24
+ @night.pop.should be_nil
25
+ end
26
+
27
+ it "responds to humidity" do
28
+ @night.humidity.should be_nil
29
+ end
30
+
31
+ it "responds to wind" do
32
+ @night.wind.should be_nil
33
+ end
34
+
35
+ end
36
+
37
+ describe "when writing data" do
38
+
39
+ before(:each) do
40
+ @night = Data::NightMeasurement.new
41
+ end
42
+
43
+ it "only accepts Date for date" do
44
+ invalid_data = 1
45
+ invalid_data.class.should_not == Date
46
+ lambda { @night.date = invalid_data }.should raise_error(ArgumentError)
47
+
48
+ valid_data = Date.new
49
+ valid_data.class.should == Date
50
+ lambda { @night.date = valid_data }.should_not raise_error(ArgumentError)
51
+ end
52
+
53
+ it "only accepts String for icon" do
54
+ invalid_data = 1
55
+ invalid_data.class.should_not == String
56
+ lambda { @night.icon = invalid_data }.should raise_error(ArgumentError)
57
+
58
+ valid_data = "valid"
59
+ valid_data.class.should == String
60
+ lambda { @night.icon = valid_data }.should_not raise_error(ArgumentError)
61
+ end
62
+
63
+ it "only accepts String for condition" do
64
+ invalid_data = 1
65
+ invalid_data.class.should_not == String
66
+ lambda { @night.condition = invalid_data }.should raise_error(ArgumentError)
67
+
68
+ valid_data = "valid"
69
+ valid_data.class.should == String
70
+ lambda { @night.condition = valid_data }.should_not raise_error(ArgumentError)
71
+ end
72
+
73
+ it "only accepts Fixnum for pop" do
74
+ invalid_data = "test"
75
+ invalid_data.class.should_not == Fixnum
76
+ lambda { @night.pop = invalid_data }.should raise_error(ArgumentError)
77
+
78
+ valid_data = 50
79
+ valid_data.class.should == Fixnum
80
+ lambda { @night.pop = valid_data }.should_not raise_error(ArgumentError)
81
+ end
82
+
83
+ it "only accepts Data::Speed for wind" do
84
+ invalid_data = "test"
85
+ invalid_data.class.should_not == Data::Speed
86
+ lambda { @night.wind = invalid_data }.should raise_error(ArgumentError)
87
+
88
+ valid_data = Data::Speed.new
89
+ valid_data.class.should == Data::Speed
90
+ lambda { @night.wind = valid_data }.should_not raise_error(ArgumentError)
91
+ end
92
+
93
+ it "only accepts Fixnum for humidity" do
94
+ invalid_data = "test"
95
+ invalid_data.class.should_not == Fixnum
96
+ lambda { @night.humidity = invalid_data }.should raise_error(ArgumentError)
97
+
98
+ valid_data = 50
99
+ valid_data.class.should == Fixnum
100
+ lambda { @night.humidity = valid_data }.should_not raise_error(ArgumentError)
101
+ end
102
+
103
+ end
104
+
105
+ describe "method missing" do
106
+
107
+ before(:each) do
108
+ @night = Data::NightMeasurement.new
109
+ end
110
+
111
+ it "responds to method + ?" do
112
+ valid_method = "pop"
113
+ @night.respond_to?(valid_method).should be_true
114
+ lambda { @night.send(valid_method + "?") }.should_not raise_error(NoMethodError)
115
+ end
116
+
117
+ it "ignores non_method + ?" do
118
+ invalid_method = "humid"
119
+ @night.respond_to?(invalid_method).should be_false
120
+ lambda { @night.send(invalid_method + "?") }.should raise_error(NoMethodError)
121
+ end
122
+
123
+ it "returns true if set" do
124
+ @night.pop = 10
125
+ @night.pop.should_not be_nil
126
+ @night.pop?.should be_true
127
+ end
128
+
129
+ it "returns false if not set" do
130
+ @night.pop.should be_nil
131
+ @night.pop?.should be_false
132
+ end
133
+
134
+ end
135
+
136
+ end