barometer 0.3.2 → 0.5.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.
- 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
|