barometer 0.3.2 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +78 -70
- data/VERSION.yml +2 -2
- data/bin/barometer +100 -37
- data/lib/barometer.rb +12 -8
- data/lib/barometer/base.rb +48 -20
- data/lib/barometer/data.rb +5 -1
- data/lib/barometer/data/current.rb +23 -15
- data/lib/barometer/data/distance.rb +15 -5
- data/lib/barometer/data/forecast.rb +23 -5
- data/lib/barometer/data/geo.rb +16 -54
- data/lib/barometer/data/local_datetime.rb +137 -0
- data/lib/barometer/data/local_time.rb +134 -0
- data/lib/barometer/data/location.rb +6 -1
- data/lib/barometer/data/measurement.rb +71 -42
- data/lib/barometer/data/night.rb +69 -0
- data/lib/barometer/data/pressure.rb +15 -5
- data/lib/barometer/data/speed.rb +16 -5
- data/lib/barometer/data/sun.rb +8 -20
- data/lib/barometer/data/temperature.rb +22 -9
- data/lib/barometer/data/units.rb +10 -19
- data/lib/barometer/data/zone.rb +135 -9
- data/lib/barometer/formats.rb +12 -0
- data/lib/barometer/formats/coordinates.rb +42 -0
- data/lib/barometer/formats/format.rb +46 -0
- data/lib/barometer/formats/geocode.rb +51 -0
- data/lib/barometer/formats/icao.rb +37 -0
- data/lib/barometer/formats/postalcode.rb +22 -0
- data/lib/barometer/formats/short_zipcode.rb +17 -0
- data/lib/barometer/formats/weather_id.rb +107 -0
- data/lib/barometer/formats/zipcode.rb +31 -0
- data/lib/barometer/query.rb +61 -232
- data/lib/barometer/services.rb +14 -4
- data/lib/barometer/translations/icao_country_codes.yml +9 -0
- data/lib/barometer/translations/weather_country_codes.yml +17 -0
- data/lib/barometer/weather.rb +51 -30
- data/lib/barometer/{services → weather_services}/google.rb +23 -26
- data/lib/barometer/weather_services/noaa.rb +6 -0
- data/lib/barometer/{services → weather_services}/service.rb +101 -92
- data/lib/barometer/weather_services/weather_bug.rb +6 -0
- data/lib/barometer/weather_services/weather_dot_com.rb +261 -0
- data/lib/barometer/{services → weather_services}/wunderground.rb +58 -76
- data/lib/barometer/{services → weather_services}/yahoo.rb +91 -121
- data/lib/barometer/web_services/geocode.rb +33 -0
- data/lib/barometer/web_services/weather_id.rb +37 -0
- data/lib/barometer/web_services/web_service.rb +32 -0
- data/lib/demometer/demometer.rb +31 -4
- data/lib/demometer/views/forecast.erb +20 -0
- data/lib/demometer/views/index.erb +10 -3
- data/lib/demometer/views/measurement.erb +8 -3
- data/lib/demometer/views/readme.erb +63 -24
- data/spec/barometer_spec.rb +18 -36
- data/spec/{data_current_spec.rb → data/current_spec.rb} +73 -49
- data/spec/{data_distance_spec.rb → data/distance_spec.rb} +30 -30
- data/spec/{data_forecast_spec.rb → data/forecast_spec.rb} +57 -15
- data/spec/data/geo_spec.rb +91 -0
- data/spec/data/local_datetime_spec.rb +269 -0
- data/spec/data/local_time_spec.rb +239 -0
- data/spec/{data_location_spec.rb → data/location_spec.rb} +12 -1
- data/spec/{data_measurement_spec.rb → data/measurement_spec.rb} +135 -66
- data/spec/data/night_measurement_spec.rb +136 -0
- data/spec/{data_pressure_spec.rb → data/pressure_spec.rb} +29 -29
- data/spec/{data_speed_spec.rb → data/speed_spec.rb} +30 -30
- data/spec/data/sun_spec.rb +49 -0
- data/spec/{data_temperature_spec.rb → data/temperature_spec.rb} +44 -44
- data/spec/{units_spec.rb → data/units_spec.rb} +6 -6
- data/spec/{data_zone_spec.rb → data/zone_spec.rb} +15 -15
- data/spec/fixtures/formats/weather_id/90210.xml +1 -0
- data/spec/fixtures/formats/weather_id/atlanta.xml +1 -0
- data/spec/fixtures/formats/weather_id/from_USGA0028.xml +1 -0
- data/spec/fixtures/formats/weather_id/new_york.xml +1 -0
- data/spec/fixtures/{geocode_40_73.xml → geocode/40_73.xml} +0 -0
- data/spec/fixtures/{geocode_90210.xml → geocode/90210.xml} +0 -0
- data/spec/fixtures/{geocode_T5B4M9.xml → geocode/T5B4M9.xml} +0 -0
- data/spec/fixtures/geocode/atlanta.xml +1 -0
- data/spec/fixtures/{geocode_calgary_ab.xml → geocode/calgary_ab.xml} +0 -0
- data/spec/fixtures/{geocode_ksfo.xml → geocode/ksfo.xml} +0 -0
- data/spec/fixtures/{geocode_newyork_ny.xml → geocode/newyork_ny.xml} +0 -0
- data/spec/fixtures/{google_calgary_ab.xml → services/google/calgary_ab.xml} +0 -0
- data/spec/fixtures/services/weather_dot_com/90210.xml +1 -0
- data/spec/fixtures/{current_calgary_ab.xml → services/wunderground/current_calgary_ab.xml} +0 -0
- data/spec/fixtures/{forecast_calgary_ab.xml → services/wunderground/forecast_calgary_ab.xml} +0 -0
- data/spec/fixtures/{yahoo_90210.xml → services/yahoo/90210.xml} +0 -0
- data/spec/formats/coordinates_spec.rb +158 -0
- data/spec/formats/format_spec.rb +73 -0
- data/spec/formats/geocode_spec.rb +179 -0
- data/spec/formats/icao_spec.rb +61 -0
- data/spec/formats/postalcode_spec.rb +59 -0
- data/spec/formats/short_zipcode_spec.rb +53 -0
- data/spec/formats/weather_id_spec.rb +191 -0
- data/spec/formats/zipcode_spec.rb +111 -0
- data/spec/query_spec.rb +261 -288
- data/spec/spec_helper.rb +128 -4
- data/spec/{service_google_spec.rb → weather_services/google_spec.rb} +46 -46
- data/spec/weather_services/services_spec.rb +1118 -0
- data/spec/weather_services/weather_dot_com_spec.rb +327 -0
- data/spec/weather_services/wunderground_spec.rb +332 -0
- data/spec/{service_yahoo_spec.rb → weather_services/yahoo_spec.rb} +65 -81
- data/spec/weather_spec.rb +73 -61
- data/spec/web_services/geocode_spec.rb +45 -0
- data/spec/web_services/web_services_spec.rb +26 -0
- metadata +88 -36
- data/lib/barometer/services/noaa.rb +0 -6
- data/lib/barometer/services/weather_bug.rb +0 -6
- data/lib/barometer/services/weather_dot_com.rb +0 -6
- data/spec/data_geo_spec.rb +0 -94
- data/spec/data_sun_spec.rb +0 -76
- data/spec/service_wunderground_spec.rb +0 -330
- data/spec/services_spec.rb +0 -1106
@@ -7,9 +7,29 @@
|
|
7
7
|
<%= data("High", forecast.high) %>
|
8
8
|
<%= data("Low", forecast.low) %>
|
9
9
|
<%= data("POP", forecast.pop) %>
|
10
|
+
<%= data("Humidity", forecast.humidity) %>
|
11
|
+
<% if forecast.wind %>
|
12
|
+
<%= data("Wind Speed", forecast.wind) %>
|
13
|
+
<%= data("Wind Direction", forecast.wind.direction) %>
|
14
|
+
<%= data("Wind Degrees", forecast.wind.degrees) %>
|
15
|
+
<% end %>
|
10
16
|
<% if forecast.sun %>
|
11
17
|
<%= data("Sun Rise", forecast.sun.rise) %>
|
12
18
|
<%= data("Sun Set", forecast.sun.set) %>
|
13
19
|
<% end %>
|
14
20
|
</ul>
|
21
|
+
<% if forecast.night %>
|
22
|
+
<ul>- Night -
|
23
|
+
<%= data("Date", forecast.night.date) %>
|
24
|
+
<%= data("Date", forecast.night.icon) %>
|
25
|
+
<%= data("Date", forecast.night.condition) %>
|
26
|
+
<%= data("Date", forecast.night.pop) %>
|
27
|
+
<%= data("Date", forecast.night.humidity) %>
|
28
|
+
<% if forecast.night.wind %>
|
29
|
+
<%= data("Wind Speed", forecast.night.wind) %>
|
30
|
+
<%= data("Wind Direction", forecast.night.wind.direction) %>
|
31
|
+
<%= data("Wind Degrees", forecast.night.wind.degrees) %>
|
32
|
+
<% end %>
|
33
|
+
</ul>
|
34
|
+
<% end %>
|
15
35
|
</p>
|
@@ -17,6 +17,7 @@
|
|
17
17
|
<input type="checkbox" name="query[source]" value="wunderground" checked="checked" /> Wunderground
|
18
18
|
<input type="checkbox" name="query[source]" value="yahoo" /> Yahoo
|
19
19
|
<input type="checkbox" name="query[source]" value="google" /> Google
|
20
|
+
<input type="checkbox" name="query[source]" value="weather_dot_com" /> Weather.com
|
20
21
|
<br/>
|
21
22
|
Force Geocode? :
|
22
23
|
<input id="query_geocode" name="query[geocode]" type="checkbox" value="1" checked="checked" />
|
@@ -60,16 +61,22 @@
|
|
60
61
|
<h3>Query</h3>
|
61
62
|
<p>
|
62
63
|
<ul>
|
64
|
+
<%= data("Query", @barometer.query.q) %>
|
63
65
|
<%= data("Format", @barometer.query.format) %>
|
64
|
-
|
66
|
+
<%= data("Country Code", @barometer.query.country_code) %>
|
67
|
+
</ul>
|
68
|
+
<% if @barometer.query.geo %>
|
69
|
+
<ul> - Geo -
|
70
|
+
<%= data("Query", @barometer.query.geo.query) %>
|
71
|
+
<%= data("Address", @barometer.query.geo.address) %>
|
65
72
|
<%= data("Locality", @barometer.query.geo.locality) %>
|
66
73
|
<%= data("Region", @barometer.query.geo.region) %>
|
67
74
|
<%= data("Country", @barometer.query.geo.country) %>
|
68
75
|
<%= data("Country Code", @barometer.query.geo.country_code) %>
|
69
76
|
<%= data("Latitude", @barometer.query.geo.latitude) %>
|
70
77
|
<%= data("Longitude", @barometer.query.geo.longitude) %>
|
71
|
-
|
72
|
-
|
78
|
+
</ul>
|
79
|
+
<% end %>
|
73
80
|
</p>
|
74
81
|
<% end %>
|
75
82
|
|
@@ -1,11 +1,16 @@
|
|
1
1
|
<h2><%= measurement.source.to_s.capitalize %></h2>
|
2
2
|
<p>
|
3
3
|
<ul>
|
4
|
+
<%= data("Measured At", measurement.measured_at) %>
|
4
5
|
<%= data("Source", measurement.source) %>
|
5
|
-
<%= data("Time", measurement.
|
6
|
+
<%= data("Time Stamp", measurement.utc_time_stamp) %>
|
6
7
|
<%= data("Metric", measurement.metric?) %>
|
7
8
|
<%= data("Success", measurement.success?) %>
|
8
9
|
</ul>
|
10
|
+
<ul>- Modified Query -
|
11
|
+
<%= data("Query", measurement.query) %>
|
12
|
+
<%= data("Format", measurement.format) %>
|
13
|
+
</ul>
|
9
14
|
</p>
|
10
15
|
|
11
16
|
<% if measurement.location %>
|
@@ -60,8 +65,8 @@
|
|
60
65
|
<h3>Current</h3>
|
61
66
|
<p>
|
62
67
|
<ul>
|
63
|
-
<%= data("
|
64
|
-
<%= data("
|
68
|
+
<%= data("Measured At", measurement.current.current_at) %>
|
69
|
+
<%= data("Updated At", measurement.current.updated_at) %>
|
65
70
|
<%= data("Humidity", measurement.current.humidity) %>
|
66
71
|
<%= data("Icon", measurement.current.icon) %>
|
67
72
|
<%= data("Condition", measurement.current.condition) %>
|
@@ -11,12 +11,12 @@ unavailable.
|
|
11
11
|
</p>
|
12
12
|
<h2>version</h2>
|
13
13
|
<p>
|
14
|
-
|
15
|
-
Version 0.3.1 is the current release of this gem. The gem is available from
|
14
|
+
Version 0.3.3 is the current release of this gem. The gem is available from
|
16
15
|
github (attack-barometer) or rubyforge (barometer). It is fully functional
|
17
16
|
(for three weather service APIs).
|
18
17
|
</p>
|
19
18
|
<h2>status</h2>
|
19
|
+
|
20
20
|
<p>
|
21
21
|
Currently this project is in development and will only work for a few
|
22
22
|
weather services (wunderground, google, yahoo).
|
@@ -31,10 +31,10 @@ Features to be added next:
|
|
31
31
|
</ul>
|
32
32
|
<h1>dependencies</h1>
|
33
33
|
<h3>Google API key</h3>
|
34
|
-
|
35
34
|
<p>
|
36
35
|
In most cases you will need to have a free google geocode api key. Get one
|
37
36
|
here: <a href="http://code.google.com/apis/maps/signup.html">code.google.com/apis/maps/signup.html</a>
|
37
|
+
|
38
38
|
Then put it in the file ’~/.barometer’ by adding the line:
|
39
39
|
geocode_google: YOUR_KEY_HERE
|
40
40
|
</p>
|
@@ -44,10 +44,17 @@ You will need this for:
|
|
44
44
|
<ul>
|
45
45
|
<li>using the Barometer gem (unless you use queries that are directly supported
|
46
46
|
by the weather source API, ie yahoo will take a zip code directly and
|
47
|
-
doesn’t require any geocoding)
|
48
|
-
|
49
|
-
|
47
|
+
doesn’t require any geocoding)
|
48
|
+
|
49
|
+
</li>
|
50
|
+
<li>running the Barometer binary
|
51
|
+
|
52
|
+
</li>
|
53
|
+
<li>running the Barometer Web Demo
|
54
|
+
|
55
|
+
</li>
|
50
56
|
</ul>
|
57
|
+
|
51
58
|
<h3>HTTParty</h3>
|
52
59
|
<p>
|
53
60
|
Why? HTTParty was created and designed specifically for consuming web
|
@@ -63,9 +70,9 @@ Why? Barometer deals with time information for locations all over the
|
|
63
70
|
world. This information doesn’t mean that much if it can’t be
|
64
71
|
converted to times that don’t correspond to the applicable timezone.
|
65
72
|
Tzinfo handles this time zone manipulation.
|
66
|
-
|
67
73
|
</p>
|
68
74
|
<h3>graticule (very soft dependency)</h3>
|
75
|
+
|
69
76
|
<p>
|
70
77
|
Why? Barometer returns the weather for a given location. Most weather
|
71
78
|
service APIs are somewhat restricted on the query format they receive. To
|
@@ -85,11 +92,11 @@ Graticule gem, HTTParty will be used instead to provide the same geocoding.
|
|
85
92
|
Basically Graticule is only used if it exists.
|
86
93
|
</p>
|
87
94
|
<p>
|
88
|
-
|
89
95
|
NOTE: you can force Barometer not to use Graticule, even if you have it
|
90
96
|
installed using the following:
|
91
97
|
</p>
|
92
98
|
<pre>
|
99
|
+
|
93
100
|
Barometer.skip_graticule = true
|
94
101
|
</pre>
|
95
102
|
<h1>usage</h1>
|
@@ -106,26 +113,53 @@ with geo-coding.
|
|
106
113
|
require 'barometer'
|
107
114
|
|
108
115
|
Barometer.google_geocode_key = "THE_GOOGLE_API_KEY"
|
109
|
-
|
110
116
|
barometer = Barometer.new("Paris")
|
111
117
|
weather = barometer.measure
|
112
118
|
|
113
119
|
puts weather.current.temperture
|
120
|
+
|
121
|
+
</pre>
|
122
|
+
<h2>source configuration</h2>
|
123
|
+
<p>
|
124
|
+
Barometer can be configured to use multiple weather service APIs (either in
|
125
|
+
a primary/failover config or in parallel). Each weather service can also
|
126
|
+
have its own config.
|
127
|
+
</p>
|
128
|
+
<p>
|
129
|
+
Weather services in parallel
|
130
|
+
</p>
|
131
|
+
<pre>
|
132
|
+
Barometer.config = { 1 => [:yahoo, :google] }
|
133
|
+
</pre>
|
134
|
+
<p>
|
135
|
+
Weather services in primary/failover
|
136
|
+
|
137
|
+
</p>
|
138
|
+
<pre>
|
139
|
+
Barometer.config = { 1 => [:yahoo], 2 => :wunderground }
|
140
|
+
</pre>
|
141
|
+
<p>
|
142
|
+
Weather services, one with some configuration. In this case we are setting
|
143
|
+
a weight value, this weight is respected when calculating averages.
|
144
|
+
</p>
|
145
|
+
<pre>
|
146
|
+
Barometer.config = { 1 => [{:wunderground => {:weight => 2}}, :google] }
|
147
|
+
|
114
148
|
</pre>
|
115
|
-
<
|
149
|
+
<h3>multiple weather API, with hierarchy</h3>
|
116
150
|
<pre>
|
117
151
|
require 'barometer'
|
118
152
|
|
119
153
|
Barometer.google_geocode_key = "THE_GOOGLE_API_KEY"
|
120
154
|
# use yahoo and google, if they both fail, use wunderground
|
121
|
-
Barometer.
|
155
|
+
Barometer.config = { 1 => [:yahoo, :google], 2 => :wunderground }
|
122
156
|
|
123
157
|
barometer = Barometer.new("Paris")
|
124
158
|
weather = barometer.measure
|
125
159
|
|
126
160
|
puts weather.current.temperture
|
127
|
-
|
128
161
|
</pre>
|
162
|
+
|
129
163
|
<h2>command line</h2>
|
130
164
|
<p>
|
131
165
|
You can use barometer from the command line.
|
@@ -140,8 +174,8 @@ for more command line information.
|
|
140
174
|
<pre>
|
141
175
|
# barometer -h
|
142
176
|
</pre>
|
143
|
-
|
144
177
|
<h3>web demo</h3>
|
178
|
+
|
145
179
|
<p>
|
146
180
|
There is a Sinatra application that demos the functionality of Barometer,
|
147
181
|
and provides Barometer information. Start this local demo with:
|
@@ -152,8 +186,8 @@ and provides Barometer information. Start this local demo with:
|
|
152
186
|
<p>
|
153
187
|
NOTE: This requires the gems "sinatra" and "vegas".
|
154
188
|
</p>
|
155
|
-
|
156
189
|
<h3>fail</h3>
|
190
|
+
|
157
191
|
<p>
|
158
192
|
What would cause a weather service to fail? The most obvious is that the
|
159
193
|
particular weather service in currently unavailable or not reachable. Other
|
@@ -175,7 +209,6 @@ Wunderground, but since the driver interface is abstracted it will be the
|
|
175
209
|
same for all supported services.
|
176
210
|
</p>
|
177
211
|
<pre>
|
178
|
-
|
179
212
|
require 'barometer'
|
180
213
|
Barometer.google_geocode_key = "THE_GOOGLE_API_KEY"
|
181
214
|
|
@@ -201,9 +234,9 @@ string instead of directly feeding the query string to the service (as in
|
|
201
234
|
bootstrap example #1). The Barometer::Query object has behavior required by
|
202
235
|
the service that a regular String doesn’t have. Using a driver
|
203
236
|
directly WILL accept a String (as in bootstrap example #2).
|
204
|
-
|
205
237
|
</p>
|
206
238
|
<h2>searching</h2>
|
239
|
+
|
207
240
|
<p>
|
208
241
|
After you have measured the data, Barometer provides several methods to
|
209
242
|
help you get the data you are after. All examples assume you already have
|
@@ -227,8 +260,8 @@ measured the data as shown in the above examples.
|
|
227
260
|
weather.sources # lists all successful sources
|
228
261
|
|
229
262
|
puts weather.source(:wunderground).current.temperature.c
|
230
|
-
|
231
263
|
</pre>
|
264
|
+
|
232
265
|
<h3>by date</h3>
|
233
266
|
<pre>
|
234
267
|
# note, the date is the date of the locations weather, not the date of the
|
@@ -248,9 +281,9 @@ measured the data as shown in the above examples.
|
|
248
281
|
weather.source(:wunderground).for(time) # same as above but specific source
|
249
282
|
|
250
283
|
puts weather.source(:wunderground).for(time).low.f
|
251
|
-
|
252
284
|
</pre>
|
253
285
|
<h2>averages</h2>
|
286
|
+
|
254
287
|
<p>
|
255
288
|
If you consume more then one weather service, Barometer can provide
|
256
289
|
averages for the values (currently only for the ‘current’
|
@@ -261,7 +294,7 @@ values and not the forecasted values).
|
|
261
294
|
|
262
295
|
Barometer.google_geocode_key = "THE_GOOGLE_API_KEY"
|
263
296
|
# use yahoo and wunderground
|
264
|
-
Barometer.
|
297
|
+
Barometer.config = { 1 => [:yahoo, :wunderground] }
|
265
298
|
|
266
299
|
barometer = Barometer.new("90210")
|
267
300
|
weather = barometer.measure
|
@@ -273,12 +306,19 @@ values and not the forecasted values).
|
|
273
306
|
This will calculate the average temperature as given by :yahoo and
|
274
307
|
:wunderground
|
275
308
|
</p>
|
309
|
+
<h3>weights</h3>
|
310
|
+
<p>
|
311
|
+
You can weight the values from a weather service so that the values from
|
312
|
+
that web service have more influence then other values. The weights are set
|
313
|
+
in the config … see the config section
|
314
|
+
</p>
|
276
315
|
<h2>simple answers</h2>
|
277
316
|
<p>
|
278
317
|
After you have measured the data, Barometer provides several "simple
|
279
318
|
answer" methods to help you get answers to some basic questions. All
|
280
319
|
examples assume you already have measured the data as shown in the above
|
281
320
|
examples.
|
321
|
+
|
282
322
|
</p>
|
283
323
|
<p>
|
284
324
|
All of these questions are ultimately specific to the weather source(s) you
|
@@ -287,7 +327,6 @@ will be asked, but if there is no data that can answer the question then
|
|
287
327
|
there will be no answer.
|
288
328
|
</p>
|
289
329
|
<h3>is it windy?</h3>
|
290
|
-
|
291
330
|
<pre>
|
292
331
|
# 1st parameter is the threshold wind speed for being windy
|
293
332
|
# 2nd parameter is the utc_time for which you want to know the answer,
|
@@ -306,6 +345,7 @@ there will be no answer.
|
|
306
345
|
weather.wet?(50)
|
307
346
|
</pre>
|
308
347
|
<h3>is it sunny?</h3>
|
348
|
+
|
309
349
|
<pre>
|
310
350
|
# 1st parameter is the utc_time for which you want to know the answer,
|
311
351
|
# this defaults to the current time
|
@@ -313,7 +353,6 @@ there will be no answer.
|
|
313
353
|
weather.sunny?
|
314
354
|
</pre>
|
315
355
|
<h3>is it day?</h3>
|
316
|
-
|
317
356
|
<pre>
|
318
357
|
# 1st parameter is the utc_time for which you want to know the answer,
|
319
358
|
# this defaults to the current time
|
@@ -328,6 +367,7 @@ there will be no answer.
|
|
328
367
|
weather.night?
|
329
368
|
</pre>
|
330
369
|
<h1>design</h1>
|
370
|
+
|
331
371
|
<ul>
|
332
372
|
<li>create a Barometer instance
|
333
373
|
|
@@ -335,7 +375,6 @@ there will be no answer.
|
|
335
375
|
<li>supply a query, there are very little restrictions on the format:
|
336
376
|
|
337
377
|
<ul>
|
338
|
-
|
339
378
|
<li>city, country, specific address (basically anything Google will geocode)
|
340
379
|
|
341
380
|
</li>
|
@@ -355,6 +394,7 @@ accepts this directly)
|
|
355
394
|
</li>
|
356
395
|
</ul>
|
357
396
|
</li>
|
397
|
+
|
358
398
|
<li>if geocoding required, geocode the query
|
359
399
|
|
360
400
|
</li>
|
@@ -363,7 +403,6 @@ accepts this directly)
|
|
363
403
|
</li>
|
364
404
|
<li>query the weather services
|
365
405
|
|
366
|
-
|
367
406
|
</li>
|
368
407
|
<li>save the data
|
369
408
|
|
@@ -378,9 +417,9 @@ Barometer attempts to be a common API to any weather service API. I have
|
|
378
417
|
included several weather service ‘drivers’, but I know there
|
379
418
|
are many more available. Please use the provided ones as examples to create
|
380
419
|
more.
|
420
|
+
|
381
421
|
</p>
|
382
422
|
<h2>copyright</h2>
|
383
423
|
<p>
|
384
424
|
Copyright © 2009 Mark G. See LICENSE for details.
|
385
|
-
|
386
425
|
</p>
|
data/spec/barometer_spec.rb
CHANGED
@@ -3,22 +3,22 @@ require 'spec_helper'
|
|
3
3
|
describe "Barometer" do
|
4
4
|
|
5
5
|
before(:each) do
|
6
|
-
@
|
6
|
+
@config_hash = { 1 => [:wunderground] }
|
7
7
|
@key = KEY
|
8
8
|
end
|
9
9
|
|
10
10
|
describe "and class methods" do
|
11
11
|
|
12
12
|
it "defines selection" do
|
13
|
-
Barometer::Base.respond_to?("
|
14
|
-
Barometer::Base.
|
15
|
-
Barometer::Base.
|
16
|
-
Barometer::Base.
|
17
|
-
Barometer.
|
13
|
+
Barometer::Base.respond_to?("config").should be_true
|
14
|
+
Barometer::Base.config.should == { 1 => [:wunderground] }
|
15
|
+
Barometer::Base.config = { 1 => [:yahoo] }
|
16
|
+
Barometer::Base.config.should == { 1 => [:yahoo] }
|
17
|
+
Barometer.config = @config_hash
|
18
18
|
end
|
19
19
|
|
20
20
|
it "returns a Weather Service driver" do
|
21
|
-
Barometer.source(:wunderground).should == Barometer::Wunderground
|
21
|
+
Barometer.source(:wunderground).should == Barometer::WeatherService::Wunderground
|
22
22
|
end
|
23
23
|
|
24
24
|
it "sets the Graticule Google geocoding API key" do
|
@@ -28,13 +28,6 @@ describe "Barometer" do
|
|
28
28
|
Barometer.google_geocode_key.should == @key
|
29
29
|
end
|
30
30
|
|
31
|
-
it "skips the use of Graticule" do
|
32
|
-
Barometer.respond_to?("skip_graticule").should be_true
|
33
|
-
Barometer.skip_graticule.should be_false
|
34
|
-
Barometer.skip_graticule = true
|
35
|
-
Barometer.skip_graticule.should be_true
|
36
|
-
end
|
37
|
-
|
38
31
|
it "forces the geocoding of queries" do
|
39
32
|
Barometer.respond_to?("force_geocode").should be_true
|
40
33
|
Barometer.force_geocode.should be_false
|
@@ -107,41 +100,24 @@ describe "Barometer" do
|
|
107
100
|
FakeWeb.register_uri(:get,
|
108
101
|
"http://api.wunderground.com/auto/wui/geo/WXCurrentObXML/index.xml?query=#{CGI.escape(query_term)}",
|
109
102
|
:string => File.read(File.join(File.dirname(__FILE__),
|
110
|
-
'fixtures',
|
103
|
+
'fixtures/services/wunderground',
|
111
104
|
'current_calgary_ab.xml')
|
112
105
|
)
|
113
106
|
)
|
114
107
|
FakeWeb.register_uri(:get,
|
115
108
|
"http://api.wunderground.com/auto/wui/geo/ForecastXML/index.xml?query=#{CGI.escape(query_term)}",
|
116
109
|
:string => File.read(File.join(File.dirname(__FILE__),
|
117
|
-
'fixtures',
|
110
|
+
'fixtures/services/wunderground',
|
118
111
|
'forecast_calgary_ab.xml')
|
119
112
|
)
|
120
113
|
)
|
121
114
|
FakeWeb.register_uri(:get,
|
122
115
|
"http://maps.google.com:80/maps/geo?gl=&q=Calgary%2CAB&output=xml&key=#{@key}",
|
123
116
|
:string => File.read(File.join(File.dirname(__FILE__),
|
124
|
-
'fixtures',
|
125
|
-
'
|
126
|
-
)
|
127
|
-
)
|
128
|
-
|
129
|
-
|
130
|
-
FakeWeb.register_uri(:get,
|
131
|
-
"http://api.wunderground.com/auto/wui/geo/WXCurrentObXML/index.xml?query=51.055149%2C-114.062438",
|
132
|
-
:string => File.read(File.join(File.dirname(__FILE__),
|
133
|
-
'fixtures',
|
134
|
-
'current_calgary_ab.xml')
|
135
|
-
)
|
136
|
-
)
|
137
|
-
FakeWeb.register_uri(:get,
|
138
|
-
"http://api.wunderground.com/auto/wui/geo/ForecastXML/index.xml?query=51.055149%2C-114.062438",
|
139
|
-
:string => File.read(File.join(File.dirname(__FILE__),
|
140
|
-
'fixtures',
|
141
|
-
'forecast_calgary_ab.xml')
|
117
|
+
'fixtures/geocode',
|
118
|
+
'calgary_ab.xml')
|
142
119
|
)
|
143
120
|
)
|
144
|
-
|
145
121
|
end
|
146
122
|
|
147
123
|
it "responds to measure" do
|
@@ -153,10 +129,16 @@ describe "Barometer" do
|
|
153
129
|
end
|
154
130
|
|
155
131
|
it "raises OutOfSources if no services successful" do
|
156
|
-
Barometer::Base.
|
132
|
+
Barometer::Base.config = { 1 => [] }
|
157
133
|
lambda { @barometer.measure }.should raise_error(Barometer::OutOfSources)
|
158
134
|
end
|
159
135
|
|
136
|
+
it "sets the weight" do
|
137
|
+
Barometer::Base.config = { 1 => {:wunderground => {:weight => 2}} }
|
138
|
+
@barometer.measure
|
139
|
+
@barometer.weather.measurements.first.weight.should == 2
|
140
|
+
end
|
141
|
+
|
160
142
|
end
|
161
143
|
|
162
144
|
end
|