barometer 0.3.2 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (108) hide show
  1. data/README.rdoc +78 -70
  2. data/VERSION.yml +2 -2
  3. data/bin/barometer +100 -37
  4. data/lib/barometer.rb +12 -8
  5. data/lib/barometer/base.rb +48 -20
  6. data/lib/barometer/data.rb +5 -1
  7. data/lib/barometer/data/current.rb +23 -15
  8. data/lib/barometer/data/distance.rb +15 -5
  9. data/lib/barometer/data/forecast.rb +23 -5
  10. data/lib/barometer/data/geo.rb +16 -54
  11. data/lib/barometer/data/local_datetime.rb +137 -0
  12. data/lib/barometer/data/local_time.rb +134 -0
  13. data/lib/barometer/data/location.rb +6 -1
  14. data/lib/barometer/data/measurement.rb +71 -42
  15. data/lib/barometer/data/night.rb +69 -0
  16. data/lib/barometer/data/pressure.rb +15 -5
  17. data/lib/barometer/data/speed.rb +16 -5
  18. data/lib/barometer/data/sun.rb +8 -20
  19. data/lib/barometer/data/temperature.rb +22 -9
  20. data/lib/barometer/data/units.rb +10 -19
  21. data/lib/barometer/data/zone.rb +135 -9
  22. data/lib/barometer/formats.rb +12 -0
  23. data/lib/barometer/formats/coordinates.rb +42 -0
  24. data/lib/barometer/formats/format.rb +46 -0
  25. data/lib/barometer/formats/geocode.rb +51 -0
  26. data/lib/barometer/formats/icao.rb +37 -0
  27. data/lib/barometer/formats/postalcode.rb +22 -0
  28. data/lib/barometer/formats/short_zipcode.rb +17 -0
  29. data/lib/barometer/formats/weather_id.rb +107 -0
  30. data/lib/barometer/formats/zipcode.rb +31 -0
  31. data/lib/barometer/query.rb +61 -232
  32. data/lib/barometer/services.rb +14 -4
  33. data/lib/barometer/translations/icao_country_codes.yml +9 -0
  34. data/lib/barometer/translations/weather_country_codes.yml +17 -0
  35. data/lib/barometer/weather.rb +51 -30
  36. data/lib/barometer/{services → weather_services}/google.rb +23 -26
  37. data/lib/barometer/weather_services/noaa.rb +6 -0
  38. data/lib/barometer/{services → weather_services}/service.rb +101 -92
  39. data/lib/barometer/weather_services/weather_bug.rb +6 -0
  40. data/lib/barometer/weather_services/weather_dot_com.rb +261 -0
  41. data/lib/barometer/{services → weather_services}/wunderground.rb +58 -76
  42. data/lib/barometer/{services → weather_services}/yahoo.rb +91 -121
  43. data/lib/barometer/web_services/geocode.rb +33 -0
  44. data/lib/barometer/web_services/weather_id.rb +37 -0
  45. data/lib/barometer/web_services/web_service.rb +32 -0
  46. data/lib/demometer/demometer.rb +31 -4
  47. data/lib/demometer/views/forecast.erb +20 -0
  48. data/lib/demometer/views/index.erb +10 -3
  49. data/lib/demometer/views/measurement.erb +8 -3
  50. data/lib/demometer/views/readme.erb +63 -24
  51. data/spec/barometer_spec.rb +18 -36
  52. data/spec/{data_current_spec.rb → data/current_spec.rb} +73 -49
  53. data/spec/{data_distance_spec.rb → data/distance_spec.rb} +30 -30
  54. data/spec/{data_forecast_spec.rb → data/forecast_spec.rb} +57 -15
  55. data/spec/data/geo_spec.rb +91 -0
  56. data/spec/data/local_datetime_spec.rb +269 -0
  57. data/spec/data/local_time_spec.rb +239 -0
  58. data/spec/{data_location_spec.rb → data/location_spec.rb} +12 -1
  59. data/spec/{data_measurement_spec.rb → data/measurement_spec.rb} +135 -66
  60. data/spec/data/night_measurement_spec.rb +136 -0
  61. data/spec/{data_pressure_spec.rb → data/pressure_spec.rb} +29 -29
  62. data/spec/{data_speed_spec.rb → data/speed_spec.rb} +30 -30
  63. data/spec/data/sun_spec.rb +49 -0
  64. data/spec/{data_temperature_spec.rb → data/temperature_spec.rb} +44 -44
  65. data/spec/{units_spec.rb → data/units_spec.rb} +6 -6
  66. data/spec/{data_zone_spec.rb → data/zone_spec.rb} +15 -15
  67. data/spec/fixtures/formats/weather_id/90210.xml +1 -0
  68. data/spec/fixtures/formats/weather_id/atlanta.xml +1 -0
  69. data/spec/fixtures/formats/weather_id/from_USGA0028.xml +1 -0
  70. data/spec/fixtures/formats/weather_id/new_york.xml +1 -0
  71. data/spec/fixtures/{geocode_40_73.xml → geocode/40_73.xml} +0 -0
  72. data/spec/fixtures/{geocode_90210.xml → geocode/90210.xml} +0 -0
  73. data/spec/fixtures/{geocode_T5B4M9.xml → geocode/T5B4M9.xml} +0 -0
  74. data/spec/fixtures/geocode/atlanta.xml +1 -0
  75. data/spec/fixtures/{geocode_calgary_ab.xml → geocode/calgary_ab.xml} +0 -0
  76. data/spec/fixtures/{geocode_ksfo.xml → geocode/ksfo.xml} +0 -0
  77. data/spec/fixtures/{geocode_newyork_ny.xml → geocode/newyork_ny.xml} +0 -0
  78. data/spec/fixtures/{google_calgary_ab.xml → services/google/calgary_ab.xml} +0 -0
  79. data/spec/fixtures/services/weather_dot_com/90210.xml +1 -0
  80. data/spec/fixtures/{current_calgary_ab.xml → services/wunderground/current_calgary_ab.xml} +0 -0
  81. data/spec/fixtures/{forecast_calgary_ab.xml → services/wunderground/forecast_calgary_ab.xml} +0 -0
  82. data/spec/fixtures/{yahoo_90210.xml → services/yahoo/90210.xml} +0 -0
  83. data/spec/formats/coordinates_spec.rb +158 -0
  84. data/spec/formats/format_spec.rb +73 -0
  85. data/spec/formats/geocode_spec.rb +179 -0
  86. data/spec/formats/icao_spec.rb +61 -0
  87. data/spec/formats/postalcode_spec.rb +59 -0
  88. data/spec/formats/short_zipcode_spec.rb +53 -0
  89. data/spec/formats/weather_id_spec.rb +191 -0
  90. data/spec/formats/zipcode_spec.rb +111 -0
  91. data/spec/query_spec.rb +261 -288
  92. data/spec/spec_helper.rb +128 -4
  93. data/spec/{service_google_spec.rb → weather_services/google_spec.rb} +46 -46
  94. data/spec/weather_services/services_spec.rb +1118 -0
  95. data/spec/weather_services/weather_dot_com_spec.rb +327 -0
  96. data/spec/weather_services/wunderground_spec.rb +332 -0
  97. data/spec/{service_yahoo_spec.rb → weather_services/yahoo_spec.rb} +65 -81
  98. data/spec/weather_spec.rb +73 -61
  99. data/spec/web_services/geocode_spec.rb +45 -0
  100. data/spec/web_services/web_services_spec.rb +26 -0
  101. metadata +88 -36
  102. data/lib/barometer/services/noaa.rb +0 -6
  103. data/lib/barometer/services/weather_bug.rb +0 -6
  104. data/lib/barometer/services/weather_dot_com.rb +0 -6
  105. data/spec/data_geo_spec.rb +0 -94
  106. data/spec/data_sun_spec.rb +0 -76
  107. data/spec/service_wunderground_spec.rb +0 -330
  108. data/spec/services_spec.rb +0 -1106
@@ -1,6 +1,6 @@
1
1
  module Barometer
2
2
  #
3
- # = Yahoo Weather
3
+ # = Yahoo! Weather
4
4
  # www.yahoo.com
5
5
  #
6
6
  # - key required: NO
@@ -15,8 +15,6 @@ module Barometer
15
15
  # - sun rise/set: YES (today only)
16
16
  # - provides timezone: PARTIAL (just short code)
17
17
  # - requires TZInfo: NO
18
- # NOTE: since this only supports US, the short code can be used
19
- # to convert times (until yahoo location id support is added)
20
18
  #
21
19
  # == resources
22
20
  # - API: http://developer.yahoo.com/weather/
@@ -28,22 +26,27 @@ module Barometer
28
26
  #
29
27
  # where query can be:
30
28
  # - zipcode (US)
31
- # - Yahoo Location ID (International) - not currently supported
29
+ # - Yahoo! Location ID [actually weather.com id] (International)
30
+ #
31
+ # = Yahoo! terms of use
32
+ # The feeds are provided free of charge for use by individuals and non-profit
33
+ # organizations for personal, non-commercial uses. We ask that you provide
34
+ # attribution to Yahoo! Weather in connection with your use of the feeds.
35
+ # If you provide this attribution in text, please use: "Yahoo! Weather." If you
36
+ # provide this attribution with a graphic, please use the Yahoo! Weather logo that
37
+ # we have included in the feed itself.
38
+ # We reserve all rights in and to the Yahoo! Weather logo, and your right to use
39
+ # the Yahoo! Weather logo is limited to providing attribution in connection with
40
+ # these RSS feeds. Yahoo! also reserves the right to require you to cease
41
+ # distributing these feeds at any time for any reason.
32
42
  #
33
43
  # == notes
34
- # - the Yahoo Location ID is a propreitary number (possibly shared with weather.com)
35
- # so this driver currently does not provide a way to get/use this number,
36
- # therefore International support is currently missing
44
+ # - the Yahoo! Location ID is a propreitary number (shared with weather.com)
37
45
  #
38
- class Yahoo < Service
39
-
40
- def self.accepted_formats
41
- [:zipcode]
42
- end
46
+ class WeatherService::Yahoo < WeatherService
43
47
 
44
- def self.source_name
45
- :yahoo
46
- end
48
+ def self.source_name; :yahoo; end
49
+ def self.accepted_formats; [:zipcode, :weather_id]; end
47
50
 
48
51
  # these are the icon codes that indicate "wet", used by wet? function
49
52
  def self.wet_icon_codes
@@ -54,19 +57,14 @@ module Barometer
54
57
  codes = (29..34).to_a + [36]
55
58
  codes.collect {|c| c.to_s}
56
59
  end
57
-
58
- # override, only currently supports US
59
- def self.supports_country?(query=nil)
60
- query && query.country_code && query.country_code.downcase == "us"
61
- end
62
60
 
63
61
  def self._measure(measurement, query, metric=true)
64
- raise ArgumentError unless measurement.is_a?(Barometer::Measurement)
62
+ raise ArgumentError unless measurement.is_a?(Data::Measurement)
65
63
  raise ArgumentError unless query.is_a?(Barometer::Query)
66
64
  measurement.source = self.source_name
67
65
 
68
66
  begin
69
- result = self.get_all(query.preferred, metric)
67
+ result = self.fetch(query.q, metric)
70
68
  rescue Timeout::Error => e
71
69
  return measurement
72
70
  end
@@ -75,7 +73,10 @@ module Barometer
75
73
  measurement.forecast = self.build_forecast(result, metric)
76
74
  measurement.location = self.build_location(result, query.geo)
77
75
 
78
- # add to current
76
+ if result["title"] && result["link"]
77
+ measurement.links[result["title"]] = result["link"]
78
+ end
79
+
79
80
  sun = nil
80
81
  if measurement.current
81
82
  sun = self.build_sun(result)
@@ -83,42 +84,87 @@ module Barometer
83
84
  end
84
85
  # use todays sun data for all future days
85
86
  if measurement.forecast && sun
86
- start_date = Date.parse(measurement.current.local_time)
87
87
  measurement.forecast.each do |forecast|
88
- days_in_future = forecast.date - start_date
89
- forecast.sun = Barometer::Sun.add_days!(sun,days_in_future.to_i)
88
+ forecast.sun = sun
90
89
  end
91
90
  end
92
91
 
92
+ local_time = self.build_local_time(result)
93
+ if local_time
94
+ measurement.measured_at = local_time
95
+ measurement.current.current_at = local_time
96
+ end
97
+
93
98
  measurement
94
99
  end
95
100
 
101
+ def self.build_local_time(data)
102
+ if data
103
+ if data['item']
104
+ # what time is it now?
105
+ now_utc = Time.now.utc
106
+
107
+ # get published date
108
+ pub_date = data['item']['pubDate']
109
+
110
+ # get the TIME ZONE CODE
111
+ zone_match = pub_date.match(/ ([A-Z]*)$/) if pub_date
112
+
113
+ if zone_match
114
+ zone = zone_match[1]
115
+
116
+ # try converting pub_date to utc
117
+ # pub_date_utc = Data::Zone.code_to_utc(Time.parse(pub_date), zone) if zone
118
+
119
+ # how far back was this?
120
+ # data_age_in_seconds = now_utc - pub_date_utc
121
+
122
+ # is this older then 2 hours
123
+ # if (data_age_in_seconds < 0) || (data_age_in_seconds > (60 * 60 * 2))
124
+ # we may have converted the time wrong.
125
+ # if pub_date in the future, then?
126
+ # if pub_date too far back, then?
127
+
128
+ # for now do nothing ... don't set measured_time
129
+ # return nil
130
+ # else
131
+ # everything seems fine
132
+ # convert now to the local time
133
+ offset = Data::Zone.zone_to_offset(zone)
134
+ return Data::LocalTime.parse(now_utc + offset)
135
+ # end
136
+ end
137
+ nil
138
+ end
139
+ end
140
+ end
141
+
96
142
  def self.build_current(data, metric=true)
97
143
  raise ArgumentError unless data.is_a?(Hash)
98
- current = CurrentMeasurement.new
144
+ current = Data::CurrentMeasurement.new
99
145
  if data
100
146
  if data['item'] && data['item']['yweather:condition']
101
147
  condition_result = data['item']['yweather:condition']
102
- current.local_time = condition_result['date']
148
+ current.updated_at = Data::LocalDateTime.parse(condition_result['date'])
103
149
  current.icon = condition_result['code']
104
150
  current.condition = condition_result['text']
105
- current.temperature = Temperature.new(metric)
151
+ current.temperature = Data::Temperature.new(metric)
106
152
  current.temperature << condition_result['temp']
107
153
  end
108
154
  if data['yweather:atmosphere']
109
155
  atmosphere_result = data['yweather:atmosphere']
110
156
  current.humidity = atmosphere_result['humidity'].to_i
111
- current.pressure = Pressure.new(metric)
157
+ current.pressure = Data::Pressure.new(metric)
112
158
  current.pressure << atmosphere_result['pressure']
113
- current.visibility = Distance.new(metric)
159
+ current.visibility = Data::Distance.new(metric)
114
160
  current.visibility << atmosphere_result['visibility']
115
161
  end
116
162
  if data['yweather:wind']
117
163
  wind_result = data['yweather:wind']
118
- current.wind = Speed.new(metric)
164
+ current.wind = Data::Speed.new(metric)
119
165
  current.wind << wind_result['speed']
120
166
  current.wind.degrees = wind_result['degrees'].to_f
121
- current.wind_chill = Temperature.new(metric)
167
+ current.wind_chill = Data::Temperature.new(metric)
122
168
  current.wind_chill << wind_result['chill']
123
169
  end
124
170
  end
@@ -133,13 +179,13 @@ module Barometer
133
179
  forecast_result = data['item']['yweather:forecast']
134
180
 
135
181
  forecast_result.each do |forecast|
136
- forecast_measurement = ForecastMeasurement.new
182
+ forecast_measurement = Data::ForecastMeasurement.new
137
183
  forecast_measurement.icon = forecast['code']
138
184
  forecast_measurement.date = Date.parse(forecast['date'])
139
185
  forecast_measurement.condition = forecast['text']
140
- forecast_measurement.high = Temperature.new(metric)
186
+ forecast_measurement.high = Data::Temperature.new(metric)
141
187
  forecast_measurement.high << forecast['high'].to_f
142
- forecast_measurement.low = Temperature.new(metric)
188
+ forecast_measurement.low = Data::Temperature.new(metric)
143
189
  forecast_measurement.low << forecast['low'].to_f
144
190
  forecasts << forecast_measurement
145
191
  end
@@ -149,8 +195,8 @@ module Barometer
149
195
 
150
196
  def self.build_location(data, geo=nil)
151
197
  raise ArgumentError unless data.is_a?(Hash)
152
- raise ArgumentError unless (geo.nil? || geo.is_a?(Barometer::Geo))
153
- location = Location.new
198
+ raise ArgumentError unless (geo.nil? || geo.is_a?(Data::Geo))
199
+ location = Data::Location.new
154
200
  # use the geocoded data if available, otherwise get data from result
155
201
  if geo
156
202
  location.city = geo.locality
@@ -177,41 +223,16 @@ module Barometer
177
223
  raise ArgumentError unless data.is_a?(Hash)
178
224
  sun = nil
179
225
  if data && data['yweather:astronomy'] && data['item']
180
- # get the TIME ZONE CODE
181
- zone_match = data['item']['pubDate'].match(/ ([A-Z]*)$/)
182
- zone = zone_match[1] if zone_match
183
- # get the sun rise and set
184
- rise = Barometer::Zone.merge(
185
- data['yweather:astronomy']['sunrise'],
186
- data['item']['pubDate'],
187
- zone
188
- )
189
- set = Barometer::Zone.merge(
190
- data['yweather:astronomy']['sunset'],
191
- data['item']['pubDate'],
192
- zone
193
- )
194
- sun = Sun.new(rise, set)
226
+ local_rise = Data::LocalTime.parse(data['yweather:astronomy']['sunrise'])
227
+ local_set = Data::LocalTime.parse(data['yweather:astronomy']['sunset'])
228
+ sun = Data::Sun.new(local_rise, local_set)
195
229
  end
196
- sun || Sun.new
230
+ sun || Data::Sun.new
197
231
  end
198
232
 
199
- # def self.build_timezone(data)
200
- # raise ArgumentError unless data.is_a?(Hash)
201
- #
202
- # timezone = nil
203
- # if data && data['simpleforecast'] &&
204
- # data['simpleforecast']['forecastday'] &&
205
- # data['simpleforecast']['forecastday'].first &&
206
- # data['simpleforecast']['forecastday'].first['date']
207
- # timezone = Barometer::Zone.new(Time.now.utc,data['simpleforecast']['forecastday'].first['date']['tz_long'])
208
- # end
209
- # timezone
210
- # end
211
-
212
233
  # use HTTParty to get the current weather
213
- def self.get_all(query, metric=true)
214
- Barometer::Yahoo.get(
234
+ def self.fetch(query, metric=true)
235
+ self.get(
215
236
  "http://weather.yahooapis.com/forecastrss",
216
237
  :query => {:p => query, :u => (metric ? 'c' : 'f')},
217
238
  :format => :xml,
@@ -220,55 +241,4 @@ module Barometer
220
241
  end
221
242
 
222
243
  end
223
- end
224
-
225
- # Condition Codes
226
- # 0 tornado
227
- # 1 tropical storm
228
- # 2 hurricane
229
- # 3 severe thunderstorms
230
- # 4 thunderstorms
231
- # 5 mixed rain and snow
232
- # 6 mixed rain and sleet
233
- # 7 mixed snow and sleet
234
- # 8 freezing drizzle
235
- # 9 drizzle
236
- # 10 freezing rain
237
- # 11 showers
238
- # 12 showers
239
- # 13 snow flurries
240
- # 14 light snow showers
241
- # 15 blowing snow
242
- # 16 snow
243
- # 17 hail
244
- # 18 sleet
245
- # 19 dust
246
- # 20 foggy
247
- # 21 haze
248
- # 22 smoky
249
- # 23 blustery
250
- # 24 windy
251
- # 25 cold
252
- # 26 cloudy
253
- # 27 mostly cloudy (night)
254
- # 28 mostly cloudy (day)
255
- # 29 partly cloudy (night)
256
- # 30 partly cloudy (day)
257
- # 31 clear (night)
258
- # 32 sunny
259
- # 33 fair (night)
260
- # 34 fair (day)
261
- # 35 mixed rain and hail
262
- # 36 hot
263
- # 37 isolated thunderstorms
264
- # 38 scattered thunderstorms
265
- # 39 scattered thunderstorms
266
- # 40 scattered showers
267
- # 41 heavy snow
268
- # 42 scattered snow showers
269
- # 43 heavy snow
270
- # 44 partly cloudy
271
- # 45 thundershowers
272
- # 46 snow showers
273
- # 47 isolated thundershowers
274
- # 3200 not available
244
+ end
@@ -0,0 +1,33 @@
1
+ module Barometer
2
+ #
3
+ # Web Service: Geocode
4
+ #
5
+ # uses Google Maps Geocoding service
6
+ #
7
+ class WebService::Geocode < WebService
8
+
9
+ def self.fetch(query)
10
+ raise ArgumentError unless _is_a_query?(query)
11
+ return nil unless _has_geocode_key?
12
+ location = self.get(
13
+ "http://maps.google.com/maps/geo",
14
+ :query => {
15
+ :gl => query.country_code, :key => Barometer.google_geocode_key,
16
+ :output => "xml", :q => query.q
17
+ },
18
+ :format => :xml, :timeout => Barometer.timeout
19
+ )
20
+ location = location['kml']['Response'] if location && location['kml']
21
+ location ? (geo = Data::Geo.new(location)) : nil
22
+ end
23
+
24
+ private
25
+
26
+ def self._has_geocode_key?
27
+ !Barometer.google_geocode_key.nil?
28
+ end
29
+
30
+ end
31
+ end
32
+
33
+
@@ -0,0 +1,37 @@
1
+ module Barometer
2
+ #
3
+ # Web Service: WeatherID
4
+ #
5
+ # uses Weather.com search to obtain a weather id
6
+ #
7
+ class WebService::WeatherID < WebService
8
+
9
+ # get the weather_id for a given query
10
+ #
11
+ def self.fetch(query)
12
+ return nil unless query
13
+ raise ArgumentError unless _is_a_query?(query)
14
+ response = self.get(
15
+ "http://xoap.weather.com/search/search",
16
+ :query => { :where => query.q }, :format => :plain,
17
+ :timeout => Barometer.timeout
18
+ )
19
+ end
20
+
21
+ # get the location_date (geocode) for a given weather_id
22
+ #
23
+ def self.reverse(query)
24
+ return nil unless query
25
+ raise ArgumentError unless _is_a_query?(query)
26
+ self.get(
27
+ "http://weather.yahooapis.com/forecastrss",
28
+ :query => { :p => query.q },
29
+ :format => :xml,
30
+ :timeout => Barometer.timeout
31
+ )['rss']['channel']["yweather:location"]
32
+ end
33
+
34
+ end
35
+ end
36
+
37
+
@@ -0,0 +1,32 @@
1
+ require 'rubygems'
2
+ require 'httparty'
3
+
4
+ $:.unshift(File.dirname(__FILE__))
5
+ require 'extensions/httparty'
6
+
7
+ module Barometer
8
+ #
9
+ # Web Service Class
10
+ #
11
+ # This is a base class for creating web service api-consuming
12
+ # drivers. Each driver inherits from this class.
13
+ #
14
+ # Basically, all a service is required to do is take a query
15
+ # (ie "Paris") and return it corresponding data class
16
+ #
17
+ class WebService
18
+ # all web_service drivers will use the HTTParty gem
19
+ include HTTParty
20
+
21
+ # STUB: define this method to actually retireve the data
22
+ def self.fetch(query=nil); raise NotImplementedError; end
23
+
24
+ private
25
+
26
+ def self._is_a_query?(object=nil)
27
+ return false unless object
28
+ object.is_a?(Barometer::Query)
29
+ end
30
+
31
+ end
32
+ end
@@ -3,15 +3,35 @@ require 'sinatra'
3
3
  require 'barometer'
4
4
 
5
5
  # load API keys
6
- keys = YAML.load_file(File.expand_path(File.join('~', '.barometer')))
7
- if keys["geocode_google"]
8
- Barometer.google_geocode_key = keys["geocode_google"]
6
+ @@config_file ||= File.expand_path(File.join('~', '.barometer'))
7
+ keys = YAML.load_file(@@config_file)
8
+ if keys["google"] && keys["google"]["geocode"]
9
+ Barometer.google_geocode_key = keys["google"]["geocode"]
9
10
  else
11
+ raise RunTimeError "no geocoding keys"
10
12
  exit
11
13
  end
12
14
 
13
15
  class Demometer < Sinatra::Default
14
16
 
17
+ def config_weather_dot_com
18
+ if File.exists?(@@config_file)
19
+ keys = YAML.load_file(@@config_file)
20
+ if keys["weather"] && keys["weather"]["partner"] && keys["weather"]["license"]
21
+ partner_key = keys["weather"]["partner"].to_s
22
+ license_key = keys["weather"]["license"].to_s
23
+ else
24
+ raise RunTimeError "no weather.com keys"
25
+ exit
26
+ end
27
+ else
28
+ File.open(@@config_file, 'w') {|f| f << "\nweather:\n partner: PARTNER_KEY\n license: LICENSE_KEY" }
29
+ raise RunTimeError "no weather.com keys"
30
+ exit
31
+ end
32
+ { :weather_dot_com => { :keys => { :partner => partner_key, :license => license_key } } }
33
+ end
34
+
15
35
  helpers do
16
36
  def data(title, value)
17
37
  return if value.nil?
@@ -29,7 +49,14 @@ class Demometer < Sinatra::Default
29
49
  metric = (params[:query][:metric].to_s == "1" ? true : false)
30
50
 
31
51
  # determine sources
32
- Barometer.selection = { 1 => params[:query][:source].collect{|s| s.to_sym } }
52
+ Barometer.config = { 1 => params[:query][:source].collect{|s| s.to_sym } }
53
+
54
+ # setup weather.com
55
+ if Barometer::Base.config && Barometer::Base.config[1] &&
56
+ Barometer::Base.config[1].include?(:weather_dot_com)
57
+ Barometer::Base.config[1].delete(:weather_dot_com)
58
+ Barometer::Base.config[1] << config_weather_dot_com
59
+ end
33
60
 
34
61
  if params[:query] && !params[:query][:q].empty?
35
62
  @barometer = Barometer.new(params[:query][:q])