barometer 0.5.0 → 0.6.1

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 (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