barometer 0.5.0 → 0.6.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (70) hide show
  1. data/README.rdoc +51 -9
  2. data/VERSION.yml +2 -2
  3. data/bin/barometer +57 -7
  4. data/lib/barometer.rb +11 -0
  5. data/lib/barometer/base.rb +3 -0
  6. data/lib/barometer/data.rb +11 -6
  7. data/lib/barometer/data/sun.rb +10 -0
  8. data/lib/barometer/data/zone.rb +79 -188
  9. data/lib/barometer/formats/coordinates.rb +4 -1
  10. data/lib/barometer/formats/geocode.rb +9 -7
  11. data/lib/barometer/formats/icao.rb +2 -2
  12. data/lib/barometer/formats/weather_id.rb +2 -2
  13. data/lib/barometer/measurements/common.rb +113 -0
  14. data/lib/barometer/{data → measurements}/current.rb +17 -42
  15. data/lib/barometer/measurements/forecast.rb +62 -0
  16. data/lib/barometer/measurements/forecast_array.rb +72 -0
  17. data/lib/barometer/{data → measurements}/measurement.rb +57 -45
  18. data/lib/barometer/measurements/night.rb +27 -0
  19. data/lib/barometer/query.rb +55 -5
  20. data/lib/barometer/services.rb +3 -1
  21. data/lib/barometer/translations/icao_country_codes.yml +274 -1
  22. data/lib/barometer/translations/weather_country_codes.yml +189 -6
  23. data/lib/barometer/translations/zone_codes.yml +360 -0
  24. data/lib/barometer/weather.rb +5 -4
  25. data/lib/barometer/weather_services/google.rb +19 -35
  26. data/lib/barometer/weather_services/service.rb +113 -255
  27. data/lib/barometer/weather_services/weather_bug.rb +291 -2
  28. data/lib/barometer/weather_services/weather_dot_com.rb +45 -54
  29. data/lib/barometer/weather_services/wunderground.rb +83 -89
  30. data/lib/barometer/weather_services/yahoo.rb +44 -91
  31. data/lib/barometer/web_services/geocode.rb +1 -0
  32. data/lib/barometer/web_services/timezone.rb +40 -0
  33. data/lib/barometer/web_services/weather_id.rb +17 -2
  34. data/lib/demometer/demometer.rb +28 -0
  35. data/lib/demometer/public/css/master.css +259 -1
  36. data/lib/demometer/public/css/print.css +94 -0
  37. data/lib/demometer/public/css/syntax.css +64 -0
  38. data/lib/demometer/public/images/link-out.gif +0 -0
  39. data/lib/demometer/views/about.erb +10 -0
  40. data/lib/demometer/views/index.erb +2 -0
  41. data/lib/demometer/views/layout.erb +3 -2
  42. data/lib/demometer/views/measurement.erb +4 -1
  43. data/lib/demometer/views/readme.erb +116 -88
  44. data/spec/data/sun_spec.rb +53 -0
  45. data/spec/data/zone_spec.rb +330 -100
  46. data/spec/fixtures/formats/weather_id/ksfo.xml +1 -0
  47. data/spec/fixtures/services/weather_bug/90210_current.xml +1 -0
  48. data/spec/fixtures/services/weather_bug/90210_forecast.xml +1 -0
  49. data/spec/formats/weather_id_spec.rb +10 -5
  50. data/spec/measurements/common_spec.rb +352 -0
  51. data/spec/{data → measurements}/current_spec.rb +40 -103
  52. data/spec/measurements/forecast_array_spec.rb +165 -0
  53. data/spec/measurements/forecast_spec.rb +135 -0
  54. data/spec/{data → measurements}/measurement_spec.rb +86 -107
  55. data/spec/measurements/night_measurement_spec.rb +49 -0
  56. data/spec/query_spec.rb +12 -2
  57. data/spec/spec_helper.rb +28 -1
  58. data/spec/weather_services/google_spec.rb +27 -117
  59. data/spec/weather_services/services_spec.rb +49 -1024
  60. data/spec/weather_services/weather_bug_spec.rb +274 -0
  61. data/spec/weather_services/weather_dot_com_spec.rb +45 -125
  62. data/spec/weather_services/wunderground_spec.rb +42 -136
  63. data/spec/weather_services/yahoo_spec.rb +26 -116
  64. data/spec/weather_spec.rb +45 -45
  65. metadata +27 -11
  66. data/lib/barometer/data/forecast.rb +0 -84
  67. data/lib/barometer/data/night.rb +0 -69
  68. data/lib/barometer/extensions/graticule.rb +0 -51
  69. data/spec/data/forecast_spec.rb +0 -192
  70. data/spec/data/night_measurement_spec.rb +0 -136
@@ -46,4 +46,57 @@ describe "Data::Sun" do
46
46
 
47
47
  end
48
48
 
49
+ describe "comparisons" do
50
+
51
+ before(:each) do
52
+ now = Time.local(2009,5,5,11,40,00)
53
+ @mid_time = Data::LocalTime.new.parse(now)
54
+ @early_time = Data::LocalTime.new.parse(now - (60*60*8))
55
+ @late_time = Data::LocalTime.new.parse(now + (60*60*8))
56
+ end
57
+
58
+ describe "after_rise?" do
59
+
60
+ it "requires a LocalTime object" do
61
+ sun = Data::Sun.new(@early_time,@late_time)
62
+ lambda { sun.after_rise? }.should raise_error(ArgumentError)
63
+ lambda { sun.after_rise?("invalid") }.should raise_error(ArgumentError)
64
+ lambda { sun.after_rise?(@mid_time) }.should_not raise_error(ArgumentError)
65
+ end
66
+
67
+ it "returns true when after sun rise" do
68
+ sun = Data::Sun.new(@early_time,@late_time)
69
+ sun.after_rise?(@mid_time).should be_true
70
+ end
71
+
72
+ it "returns false when before sun rise" do
73
+ sun = Data::Sun.new(@mid_time,@late_time)
74
+ sun.after_rise?(@early_time).should be_false
75
+ end
76
+
77
+ end
78
+
79
+ describe "before_set?" do
80
+
81
+ it "requires a LocalTime object" do
82
+ sun = Data::Sun.new(@early_time,@late_time)
83
+ lambda { sun.before_set? }.should raise_error(ArgumentError)
84
+ lambda { sun.before_set?("invalid") }.should raise_error(ArgumentError)
85
+ lambda { sun.before_set?(@mid_time) }.should_not raise_error(ArgumentError)
86
+ end
87
+
88
+ it "returns true when before sun set" do
89
+ sun = Data::Sun.new(@early_time,@late_time)
90
+ sun.before_set?(@mid_time).should be_true
91
+ end
92
+
93
+ it "returns false when before sun set" do
94
+ sun = Data::Sun.new(@early_time,@mid_time)
95
+ sun.before_set?(@late_time).should be_false
96
+ end
97
+
98
+ end
99
+
100
+ end
101
+
49
102
  end
@@ -2,130 +2,360 @@ require 'spec_helper'
2
2
 
3
3
  describe "Data::Zone" do
4
4
 
5
- describe "and class methods" do
6
-
7
- it "responds to now and returns Time object" do
8
- Data::Zone.respond_to?("now").should be_true
9
- Data::Zone.now.is_a?(Time).should be_true
10
- end
11
-
12
- it "responds to today and returns Date object" do
13
- Data::Zone.respond_to?("today").should be_true
14
- Data::Zone.today.is_a?(Date).should be_true
15
- end
16
-
17
- end
5
+ # describe "and class methods" do
6
+ #
7
+ # it "responds to now and returns Time object" do
8
+ # Data::Zone.respond_to?("now").should be_true
9
+ # Data::Zone.now.is_a?(Time).should be_true
10
+ # end
11
+ #
12
+ # it "responds to today and returns Date object" do
13
+ # Data::Zone.respond_to?("today").should be_true
14
+ # Data::Zone.today.is_a?(Date).should be_true
15
+ # end
16
+ #
17
+ # end
18
18
 
19
19
  describe "when initialized" do
20
20
 
21
- before(:each) do
22
- @utc = Time.now.utc
23
- @timezone = "Europe/Paris"
24
- @zone = Data::Zone.new(@timezone)
25
- end
21
+ describe "with a full zone" do
26
22
 
27
- it "responds to timezone" do
28
- @zone.timezone.should_not be_nil
29
- @zone.timezone.should == @timezone
30
- end
23
+ before(:each) do
24
+ @utc = Time.now.utc
25
+ @timezone = "Europe/Paris"
26
+ @zone = Data::Zone.new(@timezone)
27
+ end
31
28
 
32
- it "responds to tz" do
33
- lambda { Data::Zone.new("invalid timezone") }.should raise_error(TZInfo::InvalidTimezoneIdentifier)
34
-
35
- zone = Data::Zone.new(@timezone)
36
- zone.tz.should_not be_nil
37
- end
29
+ it "responds to zone_full" do
30
+ @zone.zone_full.should_not be_nil
31
+ @zone.zone_full.should == @timezone
32
+ end
38
33
 
39
- it "responds to code" do
40
- @zone.respond_to?("code").should be_true
41
- zone = Data::Zone.new(@timezone)
42
- zone.tz = nil
43
- zone.tz.should be_nil
44
- zone.code.should == ""
34
+ it "responds to zone_code" do
35
+ @zone.zone_code.should be_nil
36
+ end
37
+
38
+ it "responds to zone_offset" do
39
+ @zone.zone_offset.should be_nil
40
+ end
41
+
42
+ it "responds to tz" do
43
+ lambda { Data::Zone.new("invalid timezone") }.should raise_error(ArgumentError)
45
44
 
46
- zone = Data::Zone.new(@timezone)
47
- zone.code.should == "CEST"
48
- end
45
+ zone = Data::Zone.new(@timezone)
46
+ zone.tz.should_not be_nil
47
+ end
49
48
 
50
- it "responds to dst?" do
51
- @zone.respond_to?("dst?").should be_true
52
- zone = Data::Zone.new(@timezone)
53
- zone.tz = nil
54
- zone.tz.should be_nil
55
- zone.dst?.should be_nil
56
- end
49
+ it "responds to full" do
50
+ @zone.respond_to?("full").should be_true
51
+ zone = Data::Zone.new(@timezone)
52
+ zone.tz = nil
53
+ zone.tz.should be_nil
54
+ zone.full.should == @timezone
55
+
56
+ zone = Data::Zone.new(@timezone)
57
+ zone.full.should == @timezone
58
+ end
57
59
 
58
- it "responds to now" do
59
- @zone.respond_to?("now").should be_true
60
- @zone.now.is_a?(Time).should be_true
61
- end
60
+ it "responds to code" do
61
+ @zone.respond_to?("code").should be_true
62
+ zone = Data::Zone.new(@timezone)
63
+ zone.tz = nil
64
+ zone.tz.should be_nil
65
+ zone.code.should be_nil
62
66
 
63
- it "responds to today" do
64
- @zone.respond_to?("today").should be_true
65
- @zone.today.is_a?(Date).should be_true
66
- end
67
+ zone = Data::Zone.new(@timezone)
68
+ zone.code.should == "CEST"
69
+ end
70
+
71
+ it "responds to dst?" do
72
+ @zone.respond_to?("dst?").should be_true
73
+ zone = Data::Zone.new(@timezone)
74
+ zone.tz = nil
75
+ zone.tz.should be_nil
76
+ zone.dst?.should be_nil
77
+ end
67
78
 
68
- it "responds to now" do
69
- Data::Zone.respond_to?("now").should be_true
70
- end
79
+ it "responds to now" do
80
+ @zone.respond_to?("now").should be_true
81
+ @zone.now.is_a?(Time).should be_true
82
+
83
+ period = @zone.tz.period_for_utc(Time.now)
84
+ actual_now = Time.now.utc + period.utc_total_offset
85
+
86
+ now = @zone.now
87
+ now.hour.should == actual_now.hour
88
+ now.min.should == actual_now.min
89
+ now.sec.should == actual_now.sec
90
+ now.year.should == actual_now.year
91
+ now.month.should == actual_now.month
92
+ now.day.should == actual_now.day
93
+ end
71
94
 
72
- it "responds to today" do
73
- Data::Zone.respond_to?("today").should be_true
95
+ it "responds to today" do
96
+ @zone.respond_to?("today").should be_true
97
+ @zone.today.is_a?(Date).should be_true
98
+
99
+ period = @zone.tz.period_for_utc(Time.now)
100
+ actual_now = Time.now.utc + period.utc_total_offset
101
+
102
+ now = @zone.today
103
+ now.year.should == actual_now.year
104
+ now.month.should == actual_now.month
105
+ now.day.should == actual_now.day
106
+ end
107
+
108
+ it "converts local_time to utc" do
109
+ local_time = Time.now.utc
110
+ utc_time = @zone.local_to_utc(local_time)
111
+
112
+ offset = @zone.tz.period_for_utc(local_time).utc_total_offset
113
+ utc_time.should == (local_time - offset)
114
+ end
115
+
116
+ it "converts utc to local_time" do
117
+ utc_time = Time.now.utc
118
+ local_time = @zone.utc_to_local(utc_time)
119
+
120
+ offset = @zone.tz.period_for_utc(local_time).utc_total_offset
121
+ utc_time.should == (local_time - offset)
122
+ end
123
+
74
124
  end
75
125
 
76
- it "converts local_time to utc" do
77
- local_time = Time.now.utc
78
- utc_time = @zone.local_to_utc(local_time)
126
+ describe "with a zone code" do
79
127
 
80
- offset = @zone.tz.period_for_utc(local_time).utc_total_offset
81
- utc_time.should == (local_time - offset)
128
+ before(:each) do
129
+ @utc = Time.now.utc
130
+ @timezone = "EAST"
131
+ @zone = Data::Zone.new(@timezone)
132
+ end
133
+
134
+ it "responds to zone_code" do
135
+ @zone.zone_code.should_not be_nil
136
+ @zone.zone_code.should == @timezone
137
+ end
138
+
139
+ it "responds to zone_full" do
140
+ @zone.zone_full.should be_nil
141
+ end
142
+
143
+ it "responds to zone_offset" do
144
+ @zone.zone_offset.should be_nil
145
+ end
146
+
147
+ it "responds to tz" do
148
+ zone = Data::Zone.new(@timezone)
149
+ zone.tz.should be_nil
150
+ end
151
+
152
+ it "responds to code" do
153
+ @zone.respond_to?("code").should be_true
154
+ zone = Data::Zone.new(@timezone)
155
+ zone.tz = nil
156
+ zone.tz.should be_nil
157
+ zone.code.should == @timezone
158
+
159
+ zone = Data::Zone.new(@timezone)
160
+ zone.code.should == @timezone
161
+ end
162
+
163
+ it "responds to full" do
164
+ @zone.respond_to?("full").should be_true
165
+ zone = Data::Zone.new(@timezone)
166
+ zone.tz = nil
167
+ zone.tz.should be_nil
168
+ zone.full.should be_nil
169
+
170
+ zone = Data::Zone.new(@timezone)
171
+ zone.full.should be_nil
172
+ end
173
+
174
+ it "responds to now" do
175
+ @zone.respond_to?("now").should be_true
176
+ @zone.now.is_a?(Time).should be_true
177
+
178
+ actual_now = Time.now.utc + (-6*60*60)
179
+
180
+ now = @zone.now
181
+ now.hour.should == actual_now.hour
182
+ now.min.should == actual_now.min
183
+ now.sec.should == actual_now.sec
184
+ now.year.should == actual_now.year
185
+ now.month.should == actual_now.month
186
+ now.day.should == actual_now.day
187
+ end
188
+
189
+ it "responds to today" do
190
+ @zone.respond_to?("today").should be_true
191
+ @zone.today.is_a?(Date).should be_true
192
+
193
+ actual_now = Time.now.utc + (-6*60*60)
194
+
195
+ now = @zone.today
196
+ now.year.should == actual_now.year
197
+ now.month.should == actual_now.month
198
+ now.day.should == actual_now.day
199
+ end
200
+
201
+ it "converts local_time to utc" do
202
+ local_time = Time.now.utc
203
+ utc_time = @zone.local_to_utc(local_time)
204
+
205
+ utc_time.year.should == (local_time - @zone.offset).year
206
+ utc_time.month.should == (local_time - @zone.offset).month
207
+ utc_time.day.should == (local_time - @zone.offset).day
208
+ utc_time.hour.should == (local_time - @zone.offset).hour
209
+ utc_time.min.should == (local_time - @zone.offset).min
210
+ utc_time.sec.should == (local_time - @zone.offset).sec
211
+ end
212
+
213
+ it "converts utc to local_time" do
214
+ utc_time = Time.now.utc
215
+ local_time = @zone.utc_to_local(utc_time)
216
+
217
+ local_time.year.should == (utc_time + @zone.offset).year
218
+ local_time.month.should == (utc_time + @zone.offset).month
219
+ local_time.day.should == (utc_time + @zone.offset).day
220
+ local_time.hour.should == (utc_time + @zone.offset).hour
221
+ local_time.min.should == (utc_time + @zone.offset).min
222
+ local_time.sec.should == (utc_time + @zone.offset).sec
223
+ end
224
+
82
225
  end
83
226
 
84
- it "converts utc to local_time" do
85
- utc_time = Time.now.utc
86
- local_time = @zone.utc_to_local(utc_time)
227
+ describe "with a zone offset" do
87
228
 
88
- offset = @zone.tz.period_for_utc(local_time).utc_total_offset
89
- utc_time.should == (local_time - offset)
229
+ before(:each) do
230
+ @utc = Time.now.utc
231
+ @timezone = 8.5
232
+ @zone = Data::Zone.new(@timezone)
233
+ end
234
+
235
+ it "responds to zone_offset" do
236
+ @zone.zone_offset.should_not be_nil
237
+ @zone.zone_offset.should == @timezone
238
+ end
239
+
240
+ it "responds to zone_full" do
241
+ @zone.zone_full.should be_nil
242
+ end
243
+
244
+ it "responds to zone_code" do
245
+ @zone.zone_code.should be_nil
246
+ end
247
+
248
+ it "responds to tz" do
249
+ zone = Data::Zone.new(@timezone)
250
+ zone.tz.should be_nil
251
+ end
252
+
253
+ it "responds to offset" do
254
+ @zone.respond_to?("offset").should be_true
255
+ zone = Data::Zone.new(@timezone)
256
+ zone.tz = nil
257
+ zone.tz.should be_nil
258
+ zone.offset.should == (@timezone * 60 * 60)
259
+
260
+ zone = Data::Zone.new(@timezone)
261
+ zone.offset.should == (@timezone * 60 * 60)
262
+ end
263
+
264
+ it "responds to full" do
265
+ @zone.respond_to?("full").should be_true
266
+ zone = Data::Zone.new(@timezone)
267
+ zone.tz = nil
268
+ zone.tz.should be_nil
269
+ zone.full.should be_nil
270
+
271
+ zone = Data::Zone.new(@timezone)
272
+ zone.full.should be_nil
273
+ end
274
+
275
+ it "responds to code" do
276
+ @zone.respond_to?("code").should be_true
277
+ zone = Data::Zone.new(@timezone)
278
+ zone.tz = nil
279
+ zone.tz.should be_nil
280
+ zone.code.should be_nil
281
+
282
+ zone = Data::Zone.new(@timezone)
283
+ zone.code.should be_nil
284
+ end
285
+
286
+ it "responds to now" do
287
+ @zone.respond_to?("now").should be_true
288
+ @zone.now.is_a?(Time).should be_true
289
+
290
+ actual_now = Time.now.utc + (@timezone.to_f*60*60)
291
+
292
+ now = @zone.now
293
+ now.hour.should == actual_now.hour
294
+ now.min.should == actual_now.min
295
+ now.sec.should == actual_now.sec
296
+ now.year.should == actual_now.year
297
+ now.month.should == actual_now.month
298
+ now.day.should == actual_now.day
299
+ end
300
+
301
+ it "responds to today" do
302
+ @zone.respond_to?("today").should be_true
303
+ @zone.today.is_a?(Date).should be_true
304
+
305
+ actual_now = Time.now.utc + (@timezone.to_f*60*60)
306
+
307
+ now = @zone.today
308
+ now.year.should == actual_now.year
309
+ now.month.should == actual_now.month
310
+ now.day.should == actual_now.day
311
+ end
312
+
313
+ it "converts local_time to utc" do
314
+ local_time = Time.now.utc
315
+ utc_time = @zone.local_to_utc(local_time)
316
+
317
+ utc_time.year.should == (local_time - @zone.offset).year
318
+ utc_time.month.should == (local_time - @zone.offset).month
319
+ utc_time.day.should == (local_time - @zone.offset).day
320
+ utc_time.hour.should == (local_time - @zone.offset).hour
321
+ utc_time.min.should == (local_time - @zone.offset).min
322
+ utc_time.sec.should == (local_time - @zone.offset).sec
323
+ end
324
+
325
+ it "converts utc to local_time" do
326
+ utc_time = Time.now.utc
327
+ local_time = @zone.utc_to_local(utc_time)
328
+
329
+ local_time.year.should == (utc_time + @zone.offset).year
330
+ local_time.month.should == (utc_time + @zone.offset).month
331
+ local_time.day.should == (utc_time + @zone.offset).day
332
+ local_time.hour.should == (utc_time + @zone.offset).hour
333
+ local_time.min.should == (utc_time + @zone.offset).min
334
+ local_time.sec.should == (utc_time + @zone.offset).sec
335
+ end
336
+
90
337
  end
91
338
 
92
339
  end
93
340
 
94
- describe "when manipulating times" do
95
-
96
- it "converts a time to utc based on TimeZone Short Code" do
97
- target_zone = "PDT"
98
- target_offset = Time.zone_offset("PDT")
99
- target_time = Time.now
100
- local_time = target_time
101
- local_offset = Time.zone_offset(local_time.zone)
102
-
103
- # converting two times (ie 6am PDT and 6am MDT) to UTC should result
104
- # in two UTC times that are off by the same offset
105
- original_difference = local_offset - target_offset
106
-
107
- target_utc_time = Data::Zone.code_to_utc(target_time, target_zone)
108
- local_utc_time = local_time.utc
109
-
110
- (target_utc_time - local_time.utc).to_i.should == original_difference.to_i
341
+ describe "when detecting zones" do
342
+
343
+ it "recognozes a full time zone format" do
344
+ Data::Zone.is_zone_full?("invalid").should be_false
345
+ Data::Zone.is_zone_full?("America/New York").should be_true
346
+ end
347
+
348
+ it "matches a zone offset" do
349
+ Data::Zone.is_zone_offset?("invalid").should be_false
350
+ Data::Zone.is_zone_offset?("MST").should be_false
351
+ Data::Zone.is_zone_offset?("10").should be_false
352
+ Data::Zone.is_zone_offset?(-10).should be_true
111
353
  end
112
354
 
113
- it "merges a date and a time to one utc time (biased by TimeZone Short Code)" do
114
- merge_date = "1 March 1990"
115
- merge_time = "5:35 am"
116
- merge_zonecode = "UTC"
117
-
118
- date = Date.parse(merge_date)
119
- time = Time.parse(merge_time)
120
-
121
- utc_time = Data::Zone.merge(merge_time, merge_date, merge_zonecode)
122
-
123
- utc_time.year.should == date.year
124
- utc_time.month.should == date.month
125
- utc_time.day.should == date.day
126
- utc_time.hour.should == time.hour
127
- utc_time.min.should == time.min
128
- utc_time.sec.should == time.sec
355
+ it "matches a zone code" do
356
+ Data::Zone.is_zone_code?("invalid").should be_false
357
+ Data::Zone.is_zone_code?("MST").should be_true
358
+ Data::Zone.is_zone_code?("EAST").should be_true
129
359
  end
130
360
 
131
361
  end