barometer 0.7.0 → 0.7.1
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +2 -11
- data/VERSION.yml +1 -1
- data/barometer.gemspec +2 -2
- data/bin/barometer +18 -58
- metadata +3 -16
- data/lib/demometer/demometer.rb +0 -104
- data/lib/demometer/public/css/master.css +0 -188
- data/lib/demometer/public/css/print.css +0 -93
- data/lib/demometer/public/css/syntax.css +0 -63
- data/lib/demometer/public/images/go.png +0 -0
- data/lib/demometer/public/images/link-out.gif +0 -0
- data/lib/demometer/views/about.erb +0 -10
- data/lib/demometer/views/contributing.erb +0 -32
- data/lib/demometer/views/forecast.erb +0 -35
- data/lib/demometer/views/index.erb +0 -88
- data/lib/demometer/views/layout.erb +0 -38
- data/lib/demometer/views/measurement.erb +0 -102
- data/lib/demometer/views/readme.erb +0 -453
@@ -1,453 +0,0 @@
|
|
1
|
-
<h1>barometer</h1>
|
2
|
-
<p>
|
3
|
-
A multi API consuming weather forecasting superstar.
|
4
|
-
</p>
|
5
|
-
<p>
|
6
|
-
Barometer provides a common public API to one or more weather services
|
7
|
-
(APIs) of your choice. Weather services can co-exist to retrieve extensive
|
8
|
-
information, or they can be used in a hierarchical configuration where
|
9
|
-
lower preferred weather services are only used if previous services are
|
10
|
-
unavailable.
|
11
|
-
</p>
|
12
|
-
<p>
|
13
|
-
Barometer handles all conversions of the supplied query, so that the same
|
14
|
-
query can be used for all (or most) services, even if they don’t
|
15
|
-
support the query directly. See the "Query" section for more
|
16
|
-
information on this.
|
17
|
-
</p>
|
18
|
-
<h2>version</h2>
|
19
|
-
<p>
|
20
|
-
Version 0.6.3 is the current release of this gem. The gem is available from
|
21
|
-
github (attack-barometer) or rubyforge (barometer). It is fully functional
|
22
|
-
(for five weather service APIs).
|
23
|
-
</p>
|
24
|
-
<h2>status</h2>
|
25
|
-
<p>
|
26
|
-
Currently this project is in development and will only work for a few
|
27
|
-
weather services (wunderground, google, yahoo, weather.com, weather_bug).
|
28
|
-
</p>
|
29
|
-
<p>
|
30
|
-
Features to be added next:
|
31
|
-
</p>
|
32
|
-
<ul>
|
33
|
-
<li>even more weather service drivers (noaa)
|
34
|
-
|
35
|
-
</li>
|
36
|
-
<li>icon support
|
37
|
-
|
38
|
-
</li>
|
39
|
-
</ul>
|
40
|
-
<h1>dependencies</h1>
|
41
|
-
<h2>Google API key</h2>
|
42
|
-
<p>
|
43
|
-
In most cases you will need to have a free google geocode api key. Get one
|
44
|
-
here: <a href="http://code.google.com/apis/maps/signup.html">code.google.com/apis/maps/signup.html</a>
|
45
|
-
Then put it in the file ’~/.barometer’ by adding the lines:
|
46
|
-
</p>
|
47
|
-
<pre>
|
48
|
-
google:
|
49
|
-
geocode: YOUR_KEY_HERE
|
50
|
-
</pre>
|
51
|
-
<p>
|
52
|
-
You will need this for:
|
53
|
-
</p>
|
54
|
-
<ul>
|
55
|
-
<li>using the Barometer gem (unless you use queries that are directly supported
|
56
|
-
by the weather source API, ie yahoo will take a zip code directly and
|
57
|
-
doesn’t require any geocoding)
|
58
|
-
|
59
|
-
</li>
|
60
|
-
<li>running the Barometer binary
|
61
|
-
|
62
|
-
</li>
|
63
|
-
<li>running the Barometer Web Demo
|
64
|
-
|
65
|
-
</li>
|
66
|
-
</ul>
|
67
|
-
<h3>other keys</h3>
|
68
|
-
<p>
|
69
|
-
The same file can hold all your weather service API keys.
|
70
|
-
</p>
|
71
|
-
<p>
|
72
|
-
eg. weather.com
|
73
|
-
</p>
|
74
|
-
<pre>
|
75
|
-
weather:
|
76
|
-
partner: YOUR_PARTNER_KEY
|
77
|
-
license: YOUR_LICENSE_KEY
|
78
|
-
</pre>
|
79
|
-
<p>
|
80
|
-
eg. weatherbug.com
|
81
|
-
</p>
|
82
|
-
<pre>
|
83
|
-
weather_bug:
|
84
|
-
code: YOUR_API_CODE
|
85
|
-
</pre>
|
86
|
-
<h2>HTTParty</h2>
|
87
|
-
<p>
|
88
|
-
Why? HTTParty was created and designed specifically for consuming web
|
89
|
-
services. I choose to use this over using the Net::HTTP library directly to
|
90
|
-
allow for faster development of this project.
|
91
|
-
</p>
|
92
|
-
<p>
|
93
|
-
HTTParty is also extended to include configurable Timeout support.
|
94
|
-
</p>
|
95
|
-
<h2>tzinfo</h2>
|
96
|
-
<p>
|
97
|
-
Why? Barometer deals with time information for locations all over the
|
98
|
-
world. This information doesn’t mean that much if it can’t be
|
99
|
-
converted to times that don’t correspond to the applicable timezone.
|
100
|
-
Tzinfo handles this time zone manipulation.
|
101
|
-
</p>
|
102
|
-
<h1>queries</h1>
|
103
|
-
<p>
|
104
|
-
The query handling is one of the most beneficial and powerful features of
|
105
|
-
Barometer. Every weather service accepts a different set of possible
|
106
|
-
queries, so it usually the case that the same query can only be used for a
|
107
|
-
couple weather services.
|
108
|
-
</p>
|
109
|
-
<p>
|
110
|
-
Barometer will allow the use of all query formats for all services
|
111
|
-
(mostly). It does this by first determining the original query format, then
|
112
|
-
converting the query to a compatible format for each specific weather
|
113
|
-
service.
|
114
|
-
</p>
|
115
|
-
<p>
|
116
|
-
For example, Yahoo! only accepts US Zip Code or Weather.com ID. With
|
117
|
-
Barometer you can query Yahoo! with a simple location (ie: Paris) or even
|
118
|
-
an Airport code (ICAO) and it will return the weather as expected.
|
119
|
-
</p>
|
120
|
-
<h2>acceptable formats</h2>
|
121
|
-
<ul>
|
122
|
-
<li>zipcode
|
123
|
-
|
124
|
-
</li>
|
125
|
-
<li>icao (international airport code)
|
126
|
-
|
127
|
-
</li>
|
128
|
-
<li>coordinates (latitude and longitude)
|
129
|
-
|
130
|
-
</li>
|
131
|
-
<li>postal code
|
132
|
-
|
133
|
-
</li>
|
134
|
-
<li>weather.com ID
|
135
|
-
|
136
|
-
</li>
|
137
|
-
<li>location name (ie address, city, state, landmark, etc.)
|
138
|
-
|
139
|
-
</li>
|
140
|
-
<li>if the query is of the formats zipcode or postal code it may not support
|
141
|
-
conversion to other formats.
|
142
|
-
|
143
|
-
</li>
|
144
|
-
</ul>
|
145
|
-
<h2>conversion caching</h2>
|
146
|
-
<p>
|
147
|
-
Barometer has internal conversion caching. No conversion will be repeated
|
148
|
-
during a measurement, thus limiting the number of web queries needed.
|
149
|
-
</p>
|
150
|
-
<p>
|
151
|
-
Example: If you configure Barometer to use both Yahoo and Weather.com, then
|
152
|
-
use a query like "denver", this will require a conversion from
|
153
|
-
"denver" to its weather.com weather_id. This conversion is needed
|
154
|
-
for both web services but will only happen once and be cached.
|
155
|
-
</p>
|
156
|
-
<h1>usage</h1>
|
157
|
-
<p>
|
158
|
-
You can use barometer right out of the box, as it is configured to use one
|
159
|
-
register-less (no API key required) international weather service
|
160
|
-
(wunderground.com).
|
161
|
-
</p>
|
162
|
-
<p>
|
163
|
-
For better results, signup for a google-map key and enhance your barometer
|
164
|
-
with geo-coding.
|
165
|
-
</p>
|
166
|
-
<pre>
|
167
|
-
require 'barometer'
|
168
|
-
|
169
|
-
Barometer.google_geocode_key = "THE_GOOGLE_API_KEY"
|
170
|
-
barometer = Barometer.new("Paris")
|
171
|
-
weather = barometer.measure
|
172
|
-
|
173
|
-
puts weather.current.temperture
|
174
|
-
</pre>
|
175
|
-
<h2>sources</h2>
|
176
|
-
<p>
|
177
|
-
The available sources are:
|
178
|
-
</p>
|
179
|
-
<pre>
|
180
|
-
Wunderground.com (:wunderground) [default]
|
181
|
-
Yahoo! Weather (:yahoo)
|
182
|
-
Google Weather (:google)
|
183
|
-
Weather.com (:weather_dot_com)
|
184
|
-
WeatherBug.com (:weather_bug)
|
185
|
-
</pre>
|
186
|
-
<h2>source configuration</h2>
|
187
|
-
<p>
|
188
|
-
Barometer can be configured to use multiple weather service APIs (either in
|
189
|
-
a primary/failover config or in parallel). Each weather service can also
|
190
|
-
have its own config.
|
191
|
-
</p>
|
192
|
-
<p>
|
193
|
-
Weather services in parallel
|
194
|
-
</p>
|
195
|
-
<pre>
|
196
|
-
Barometer.config = { 1 => [:yahoo, :google] }
|
197
|
-
</pre>
|
198
|
-
<p>
|
199
|
-
Weather services in primary/failover
|
200
|
-
</p>
|
201
|
-
<pre>
|
202
|
-
Barometer.config = { 1 => [:yahoo], 2 => :wunderground }
|
203
|
-
</pre>
|
204
|
-
<p>
|
205
|
-
Weather services, one with some configuration. In this case we are setting
|
206
|
-
a weight value, this weight is respected when calculating averages.
|
207
|
-
</p>
|
208
|
-
<pre>
|
209
|
-
Barometer.config = { 1 => [{:wunderground => {:weight => 2}}, :google] }
|
210
|
-
</pre>
|
211
|
-
<p>
|
212
|
-
Weather services, one with keys.
|
213
|
-
</p>
|
214
|
-
<pre>
|
215
|
-
Barometer.config = { 1 => [:yahoo, {:weather_dot_com => {:keys => {:partner => PARTNER_KEY, :license => LICENSE_KEY } }}] }
|
216
|
-
</pre>
|
217
|
-
<h3>multiple weather API, with hierarchy</h3>
|
218
|
-
<pre>
|
219
|
-
require 'barometer'
|
220
|
-
|
221
|
-
Barometer.google_geocode_key = "THE_GOOGLE_API_KEY"
|
222
|
-
# use yahoo and google, if they both fail, use wunderground
|
223
|
-
Barometer.config = { 1 => [:yahoo, :google], 2 => :wunderground }
|
224
|
-
|
225
|
-
barometer = Barometer.new("Paris")
|
226
|
-
weather = barometer.measure
|
227
|
-
|
228
|
-
puts weather.current.temperture
|
229
|
-
</pre>
|
230
|
-
<h2>command line</h2>
|
231
|
-
<p>
|
232
|
-
You can use barometer from the command line.
|
233
|
-
</p>
|
234
|
-
<pre>
|
235
|
-
# barometer berlin
|
236
|
-
</pre>
|
237
|
-
<p>
|
238
|
-
This will output the weather information for the given query. See the help
|
239
|
-
for more command line information.
|
240
|
-
</p>
|
241
|
-
<pre>
|
242
|
-
# barometer -h
|
243
|
-
</pre>
|
244
|
-
<h3>web demo</h3>
|
245
|
-
<p>
|
246
|
-
There is a Sinatra application that demos the functionality of Barometer,
|
247
|
-
and provides Barometer information. Start this local demo with:
|
248
|
-
</p>
|
249
|
-
<pre>
|
250
|
-
# barometer -w
|
251
|
-
</pre>
|
252
|
-
<p>
|
253
|
-
NOTE: This requires the gems "sinatra" and "vegas".
|
254
|
-
</p>
|
255
|
-
<h3>fail</h3>
|
256
|
-
<p>
|
257
|
-
What would cause a weather service to fail? The most obvious is that the
|
258
|
-
particular weather service in currently unavailable or not reachable. Other
|
259
|
-
possible reasons would include not having the API (or a valid API key for
|
260
|
-
the particular weather service, if required), not providing a valid query,
|
261
|
-
or providing a query for a location not supported by the weather service.
|
262
|
-
</p>
|
263
|
-
<p>
|
264
|
-
For example, if you look at the example above, the query of
|
265
|
-
"Paris" refers to a city in France. Yahoo weather services only
|
266
|
-
supports weather results for USA (at least at the time of writing).
|
267
|
-
Therefore, Barometer would not use Yahoo, just Google and failover to use
|
268
|
-
Wunderground (if needed).
|
269
|
-
</p>
|
270
|
-
<h2>searching</h2>
|
271
|
-
<p>
|
272
|
-
After you have measured the data, Barometer provides several methods to
|
273
|
-
help you get the data you are after. All examples assume you already have
|
274
|
-
measured the data as shown in the above examples.
|
275
|
-
</p>
|
276
|
-
<h3>by preference (default service)</h3>
|
277
|
-
<pre>
|
278
|
-
weather.default # returns measurement for default source
|
279
|
-
weather.current # returns current_measurement for default
|
280
|
-
weather.now # returns current_measurement for default
|
281
|
-
weather.forecast # returns all forecast_measurements for default
|
282
|
-
weather.today # returns forecast_measurement for default today
|
283
|
-
weather.tomorrow # returns forecast_measurement for default tomorrow
|
284
|
-
|
285
|
-
puts weather.now.temperature.c
|
286
|
-
puts weather.tomorrow.high.c
|
287
|
-
</pre>
|
288
|
-
<h3>by source</h3>
|
289
|
-
<pre>
|
290
|
-
weather.source(:wunderground) # returns measurement for specified source
|
291
|
-
weather.sources # lists all successful sources
|
292
|
-
|
293
|
-
puts weather.source(:wunderground).current.temperature.c
|
294
|
-
</pre>
|
295
|
-
<h3>by date</h3>
|
296
|
-
<pre>
|
297
|
-
# note, the date is the date of the locations weather, not the date of the
|
298
|
-
# user measuring the weather
|
299
|
-
date = Date.parse("01-01-2009")
|
300
|
-
weather.for(date) # returns forecast_measurement for default on date
|
301
|
-
weather.source(:wunderground).for(date) # same as above but specific source
|
302
|
-
|
303
|
-
puts weather.source(:wunderground).for(date).high.c
|
304
|
-
</pre>
|
305
|
-
<h3>by time</h3>
|
306
|
-
<pre>
|
307
|
-
# note, the time is the time of the locations weather, not the time of the
|
308
|
-
# user measuring the weather
|
309
|
-
time = Time.parse("13:00 01-01-2009")
|
310
|
-
weather.for(time) # returns forecast_measurement for default at time
|
311
|
-
weather.source(:wunderground).for(time) # same as above but specific source
|
312
|
-
|
313
|
-
puts weather.source(:wunderground).for(time).low.f
|
314
|
-
</pre>
|
315
|
-
<h2>averages</h2>
|
316
|
-
<p>
|
317
|
-
If you consume more then one weather service, Barometer can provide
|
318
|
-
averages for the values (currently only for the ‘current’
|
319
|
-
values and not the forecasted values).
|
320
|
-
</p>
|
321
|
-
<pre>
|
322
|
-
require 'barometer'
|
323
|
-
|
324
|
-
Barometer.google_geocode_key = "THE_GOOGLE_API_KEY"
|
325
|
-
# use yahoo and wunderground
|
326
|
-
Barometer.config = { 1 => [:yahoo, :wunderground] }
|
327
|
-
|
328
|
-
barometer = Barometer.new("90210")
|
329
|
-
weather = barometer.measure
|
330
|
-
|
331
|
-
puts weather.temperture
|
332
|
-
</pre>
|
333
|
-
<p>
|
334
|
-
This will calculate the average temperature as given by :yahoo and
|
335
|
-
:wunderground
|
336
|
-
</p>
|
337
|
-
<h3>weights</h3>
|
338
|
-
<p>
|
339
|
-
You can weight the values from a weather service so that the values from
|
340
|
-
that web service have more influence then other values. The weights are set
|
341
|
-
in the config … see the config section
|
342
|
-
</p>
|
343
|
-
<h2>simple answers</h2>
|
344
|
-
<p>
|
345
|
-
After you have measured the data, Barometer provides several "simple
|
346
|
-
answer" methods to help you get answers to some basic questions. All
|
347
|
-
examples assume you already have measured the data as shown in the above
|
348
|
-
examples.
|
349
|
-
</p>
|
350
|
-
<p>
|
351
|
-
All of these questions are ultimately specific to the weather source(s) you
|
352
|
-
are configured to use. All sources that have successfully measured data
|
353
|
-
will be asked, but if there is no data that can answer the question then
|
354
|
-
there will be no answer.
|
355
|
-
</p>
|
356
|
-
<h3>is it windy?</h3>
|
357
|
-
<pre>
|
358
|
-
# 1st parameter is the threshold wind speed for being windy
|
359
|
-
# 2nd parameter is the utc_time for which you want to know the answer,
|
360
|
-
# this defaults to the current time
|
361
|
-
# NOTE: in my example the values are metric, so the threshold is 10 kph
|
362
|
-
|
363
|
-
weather.windy?(10)
|
364
|
-
</pre>
|
365
|
-
<h3>is it wet?</h3>
|
366
|
-
<pre>
|
367
|
-
# 1st parameter is the threshold pop (%) for being wet
|
368
|
-
# 2nd parameter is the utc_time for which you want to know the answer,
|
369
|
-
# this defaults to the current time
|
370
|
-
# NOTE: in my example the threshold is 50 %
|
371
|
-
|
372
|
-
weather.wet?(50)
|
373
|
-
</pre>
|
374
|
-
<h3>is it sunny?</h3>
|
375
|
-
<pre>
|
376
|
-
# 1st parameter is the utc_time for which you want to know the answer,
|
377
|
-
# this defaults to the current time
|
378
|
-
|
379
|
-
weather.sunny?
|
380
|
-
</pre>
|
381
|
-
<h3>is it day?</h3>
|
382
|
-
<pre>
|
383
|
-
# 1st parameter is the utc_time for which you want to know the answer,
|
384
|
-
# this defaults to the current time
|
385
|
-
|
386
|
-
weather.day?
|
387
|
-
</pre>
|
388
|
-
<h3>is it night?</h3>
|
389
|
-
<pre>
|
390
|
-
# 1st parameter is the utc_time for which you want to know the answer,
|
391
|
-
# this defaults to the current time
|
392
|
-
|
393
|
-
weather.night?
|
394
|
-
</pre>
|
395
|
-
<h1>design</h1>
|
396
|
-
<ul>
|
397
|
-
<li>create a Barometer instance
|
398
|
-
|
399
|
-
</li>
|
400
|
-
<li>supply a query, there are very little restrictions on the format:
|
401
|
-
|
402
|
-
<ul>
|
403
|
-
<li>city, country, specific address (basically anything Google will geocode)
|
404
|
-
|
405
|
-
</li>
|
406
|
-
<li>US zip code (skips conversion if weather service accepts this directly)
|
407
|
-
|
408
|
-
</li>
|
409
|
-
<li>postal code (skips conversion if weather service accepts this directly)
|
410
|
-
|
411
|
-
</li>
|
412
|
-
<li>latitude and longitude (skips conversion if weather service accepts this
|
413
|
-
directly)
|
414
|
-
|
415
|
-
</li>
|
416
|
-
<li>weather.com weather id (even if the service you are using doesn’t use
|
417
|
-
it)
|
418
|
-
|
419
|
-
</li>
|
420
|
-
<li>international airport code (skips conversion if weather service accepts
|
421
|
-
this directly)
|
422
|
-
|
423
|
-
</li>
|
424
|
-
</ul>
|
425
|
-
</li>
|
426
|
-
<li>determine which weather services will be queried (one or multiple)
|
427
|
-
|
428
|
-
</li>
|
429
|
-
<li>if query conversion required for specific weather service, convert the
|
430
|
-
query
|
431
|
-
|
432
|
-
</li>
|
433
|
-
<li>query the weather services
|
434
|
-
|
435
|
-
</li>
|
436
|
-
<li>save the data
|
437
|
-
|
438
|
-
</li>
|
439
|
-
<li>repeat weather service queries as needed
|
440
|
-
|
441
|
-
</li>
|
442
|
-
</ul>
|
443
|
-
<h1>extending</h1>
|
444
|
-
<p>
|
445
|
-
Barometer attempts to be a common API to any weather service API. I have
|
446
|
-
included several weather service ‘drivers’, but I know there
|
447
|
-
are many more available. Please use the provided ones as examples to create
|
448
|
-
more.
|
449
|
-
</p>
|
450
|
-
<h2>copyright</h2>
|
451
|
-
<p>
|
452
|
-
Copyright © 2009 Mark G. See LICENSE for details.
|
453
|
-
</p>
|