barometer 0.7.3 → 0.8.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +1 -0
- data/.travis.yml +7 -0
- data/LICENSE +1 -1
- data/{README.rdoc → README.md} +124 -110
- data/Rakefile +1 -21
- data/TODO +8 -9
- data/barometer.gemspec +20 -19
- data/bin/barometer +36 -83
- data/lib/barometer.rb +13 -11
- data/lib/barometer/base.rb +10 -10
- data/lib/barometer/data.rb +1 -1
- data/lib/barometer/data/distance.rb +25 -25
- data/lib/barometer/data/geo.rb +9 -9
- data/lib/barometer/data/local_datetime.rb +24 -20
- data/lib/barometer/data/local_time.rb +13 -13
- data/lib/barometer/data/location.rb +6 -6
- data/lib/barometer/data/pressure.rb +24 -24
- data/lib/barometer/data/speed.rb +28 -28
- data/lib/barometer/data/sun.rb +7 -7
- data/lib/barometer/data/temperature.rb +29 -29
- data/lib/barometer/data/units.rb +9 -9
- data/lib/barometer/data/zone.rb +19 -19
- data/lib/barometer/formats.rb +1 -1
- data/lib/barometer/formats/coordinates.rb +7 -7
- data/lib/barometer/formats/format.rb +6 -6
- data/lib/barometer/formats/geocode.rb +5 -5
- data/lib/barometer/formats/icao.rb +6 -6
- data/lib/barometer/formats/postalcode.rb +3 -3
- data/lib/barometer/formats/short_zipcode.rb +2 -2
- data/lib/barometer/formats/weather_id.rb +10 -10
- data/lib/barometer/formats/woe_id.rb +20 -20
- data/lib/barometer/formats/zipcode.rb +3 -3
- data/lib/barometer/key_file_parser.rb +20 -0
- data/lib/barometer/measurements/measurement.rb +32 -32
- data/lib/barometer/measurements/result.rb +39 -39
- data/lib/barometer/measurements/result_array.rb +12 -12
- data/lib/barometer/query.rb +15 -15
- data/lib/barometer/services.rb +3 -3
- data/lib/barometer/translations/icao_country_codes.yml +20 -20
- data/lib/barometer/translations/weather_country_codes.yml +1 -1
- data/lib/barometer/translations/zone_codes.yml +2 -2
- data/lib/barometer/version.rb +3 -0
- data/lib/barometer/weather.rb +27 -27
- data/lib/barometer/weather_services/noaa.rb +314 -3
- data/lib/barometer/weather_services/service.rb +32 -30
- data/lib/barometer/weather_services/weather_bug.rb +35 -33
- data/lib/barometer/weather_services/wunderground.rb +31 -29
- data/lib/barometer/weather_services/yahoo.rb +36 -35
- data/lib/barometer/web_services/geocode.rb +5 -7
- data/lib/barometer/web_services/noaa_station_id.rb +53 -0
- data/lib/barometer/web_services/placemaker.rb +11 -13
- data/lib/barometer/web_services/timezone.rb +5 -7
- data/lib/barometer/web_services/weather_id.rb +4 -6
- data/lib/barometer/web_services/web_service.rb +4 -4
- data/spec/barometer_spec.rb +25 -27
- data/spec/cassettes/Barometer.json +1 -0
- data/spec/cassettes/Query.json +1 -0
- data/spec/cassettes/Query_Format_Coordinates.json +1 -0
- data/spec/cassettes/Query_Format_Geocode.json +1 -0
- data/spec/cassettes/Query_Format_WeatherID.json +1 -0
- data/spec/cassettes/Query_Format_WoeID.json +1 -0
- data/spec/cassettes/WeatherService.json +1 -0
- data/spec/cassettes/WeatherService_Noaa.json +1 -0
- data/spec/cassettes/WeatherService_WeatherBug.json +1 -0
- data/spec/cassettes/WeatherService_Wunderground.json +1 -0
- data/spec/cassettes/WeatherService_Yahoo.json +1 -0
- data/spec/cassettes/WebService_Geocode.json +1 -0
- data/spec/cassettes/WebService_NoaaStation.json +1 -0
- data/spec/data/distance_spec.rb +60 -60
- data/spec/data/geo_spec.rb +23 -23
- data/spec/data/local_datetime_spec.rb +44 -44
- data/spec/data/local_time_spec.rb +47 -47
- data/spec/data/location_spec.rb +16 -16
- data/spec/data/pressure_spec.rb +61 -61
- data/spec/data/speed_spec.rb +69 -69
- data/spec/data/sun_spec.rb +25 -25
- data/spec/data/temperature_spec.rb +68 -68
- data/spec/data/units_spec.rb +21 -21
- data/spec/data/zone_spec.rb +35 -35
- data/spec/formats/coordinates_spec.rb +27 -27
- data/spec/formats/format_spec.rb +17 -25
- data/spec/formats/geocode_spec.rb +23 -31
- data/spec/formats/icao_spec.rb +26 -32
- data/spec/formats/postalcode_spec.rb +22 -28
- data/spec/formats/short_zipcode_spec.rb +20 -26
- data/spec/formats/weather_id_spec.rb +57 -67
- data/spec/formats/woe_id_spec.rb +59 -59
- data/spec/formats/zipcode_spec.rb +39 -47
- data/spec/key_file_parser_spec.rb +28 -0
- data/spec/measurements/measurement_spec.rb +79 -133
- data/spec/measurements/result_array_spec.rb +23 -38
- data/spec/measurements/result_spec.rb +100 -128
- data/spec/query_spec.rb +83 -100
- data/spec/spec_helper.rb +24 -6
- data/spec/weather_services/noaa_spec.rb +179 -0
- data/spec/weather_services/services_spec.rb +28 -36
- data/spec/weather_services/weather_bug_spec.rb +57 -77
- data/spec/weather_services/wunderground_spec.rb +36 -65
- data/spec/weather_services/yahoo_spec.rb +38 -60
- data/spec/weather_spec.rb +79 -79
- data/spec/web_services/geocode_spec.rb +7 -11
- data/spec/web_services/noaa_station_id_spec.rb +33 -0
- data/spec/web_services/placemaker_spec.rb +7 -12
- data/spec/web_services/web_services_spec.rb +3 -9
- metadata +214 -163
- data/VERSION.yml +0 -5
- data/lib/barometer/weather_services/google.rb +0 -142
- data/lib/barometer/weather_services/weather_dot_com.rb +0 -279
- data/spec/fakeweb_helper.rb +0 -179
- data/spec/fixtures/formats/weather_id/90210.xml +0 -7
- data/spec/fixtures/formats/weather_id/from_USGA0028.xml +0 -3
- data/spec/fixtures/formats/weather_id/ksfo.xml +0 -1
- data/spec/fixtures/formats/weather_id/manhattan.xml +0 -7
- data/spec/fixtures/formats/weather_id/new_york.xml +0 -1
- data/spec/fixtures/formats/weather_id/the_hills.xml +0 -1
- data/spec/fixtures/geocode/40_73_v3.json +0 -497
- data/spec/fixtures/geocode/90210_v3.json +0 -63
- data/spec/fixtures/geocode/T5B4M9_v3.json +0 -68
- data/spec/fixtures/geocode/atlanta_v3.json +0 -58
- data/spec/fixtures/geocode/calgary_ab_v3.json +0 -58
- data/spec/fixtures/geocode/ksfo_v3.json +0 -73
- data/spec/fixtures/geocode/newyork_ny_v3.json +0 -58
- data/spec/fixtures/services/google/calgary_ab.xml +0 -1
- data/spec/fixtures/services/placemaker/T5B4M9.xml +0 -65
- data/spec/fixtures/services/placemaker/atlanta.xml +0 -65
- data/spec/fixtures/services/placemaker/coords.xml +0 -65
- data/spec/fixtures/services/placemaker/ksfo.xml +0 -65
- data/spec/fixtures/services/placemaker/new_york.xml +0 -65
- data/spec/fixtures/services/placemaker/the_hills.xml +0 -65
- data/spec/fixtures/services/placemaker/w615702.xml +0 -47
- data/spec/fixtures/services/weather_bug/90210_current.xml +0 -93
- data/spec/fixtures/services/weather_bug/90210_forecast.xml +0 -76
- data/spec/fixtures/services/weather_dot_com/90210.xml +0 -1
- data/spec/fixtures/services/wunderground/current_calgary_ab.xml +0 -9
- data/spec/fixtures/services/wunderground/forecast_calgary_ab.xml +0 -13
- data/spec/fixtures/services/yahoo/90210.xml +0 -3
- data/spec/weather_services/google_spec.rb +0 -181
- data/spec/weather_services/weather_dot_com_spec.rb +0 -224
data/VERSION.yml
DELETED
@@ -1,142 +0,0 @@
|
|
1
|
-
module Barometer
|
2
|
-
#
|
3
|
-
# = Google Weather
|
4
|
-
# www.google.com
|
5
|
-
# NOTE: Google does not have an official API
|
6
|
-
#
|
7
|
-
# - key required: NO
|
8
|
-
# - registration required: NO
|
9
|
-
# - supported countries: ALL
|
10
|
-
#
|
11
|
-
# === performs geo coding
|
12
|
-
# - city: YES (except postalcode query)
|
13
|
-
# - coordinates: NO
|
14
|
-
#
|
15
|
-
# === time info
|
16
|
-
# - sun rise/set: NO
|
17
|
-
# - provides timezone: NO
|
18
|
-
# - requires TZInfo: NO
|
19
|
-
#
|
20
|
-
# == resources
|
21
|
-
# - API: http://unknown
|
22
|
-
#
|
23
|
-
# === Possible queries:
|
24
|
-
# - http://google.com/ig/api?weather=perth
|
25
|
-
#
|
26
|
-
# where query can be:
|
27
|
-
# - zipcode (US or Canadian)
|
28
|
-
# - city state; city, state
|
29
|
-
# - city
|
30
|
-
# - state
|
31
|
-
# - country
|
32
|
-
#
|
33
|
-
# = Google terms of use
|
34
|
-
# This is an unoffical API. There are no terms of use.
|
35
|
-
#
|
36
|
-
class WeatherService::Google < WeatherService
|
37
|
-
|
38
|
-
#########################################################################
|
39
|
-
# PRIVATE
|
40
|
-
# If class methods could be private, the remaining methods would be.
|
41
|
-
#
|
42
|
-
|
43
|
-
def self._source_name; :google; end
|
44
|
-
def self._accepted_formats; [:zipcode, :postalcode, :geocode]; end
|
45
|
-
|
46
|
-
def self._wet_icon_codes
|
47
|
-
%w(rain chance_of_rain chance_of_storm thunderstorm mist)
|
48
|
-
end
|
49
|
-
def self._sunny_icon_codes
|
50
|
-
%w(sunny mostly_sunny partly_cloudy)
|
51
|
-
end
|
52
|
-
|
53
|
-
def self._build_current(data, metric=true)
|
54
|
-
raise ArgumentError unless data.is_a?(Hash)
|
55
|
-
current = Measurement::Result.new
|
56
|
-
|
57
|
-
if data['current_conditions']
|
58
|
-
data = data['current_conditions']
|
59
|
-
if data['icon']
|
60
|
-
icon_match = data['icon']['data'].match(/.*\/([A-Za-z_]*)\.png/)
|
61
|
-
current.icon = icon_match[1] if icon_match
|
62
|
-
end
|
63
|
-
current.condition = data['condition']['data'] if data['condition']
|
64
|
-
|
65
|
-
humidity_match = data['humidity']['data'].match(/[\d]+/)
|
66
|
-
current.humidity = humidity_match[0].to_i if humidity_match
|
67
|
-
|
68
|
-
current.temperature = Data::Temperature.new(metric)
|
69
|
-
current.temperature << [data['temp_c']['data'], data['temp_f']['data']]
|
70
|
-
|
71
|
-
current.wind = Data::Speed.new(metric)
|
72
|
-
begin
|
73
|
-
current.wind << data['wind_condition']['data'].match(/[\d]+/)[0]
|
74
|
-
current.wind.direction = data['wind_condition']['data'].match(/Wind:.*?([\w]+).*?at/)[1]
|
75
|
-
rescue
|
76
|
-
end
|
77
|
-
end
|
78
|
-
current
|
79
|
-
end
|
80
|
-
|
81
|
-
def self._build_forecast(data, metric=true)
|
82
|
-
raise ArgumentError unless data.is_a?(Hash)
|
83
|
-
|
84
|
-
forecasts = Measurement::ResultArray.new
|
85
|
-
return forecasts unless data && data['forecast_information'] &&
|
86
|
-
data['forecast_information']['forecast_date']
|
87
|
-
start_date = Date.parse(data['forecast_information']['forecast_date']['data'])
|
88
|
-
data = data['forecast_conditions'] if data['forecast_conditions']
|
89
|
-
|
90
|
-
# go through each forecast and create an instance
|
91
|
-
d = 0
|
92
|
-
data.each do |forecast|
|
93
|
-
forecast_measurement = Measurement::Result.new
|
94
|
-
if forecast['icon']
|
95
|
-
icon_match = forecast['icon']['data'].match(/.*\/([A-Za-z_]*)\.png/)
|
96
|
-
forecast_measurement.icon = icon_match[1] if icon_match
|
97
|
-
end
|
98
|
-
forecast_measurement.condition = forecast['condition']['data'] if forecast['condition']
|
99
|
-
|
100
|
-
if (start_date + d).strftime("%a").downcase == forecast['day_of_week']['data'].downcase
|
101
|
-
forecast_measurement.date = start_date + d
|
102
|
-
end
|
103
|
-
|
104
|
-
forecast_measurement.high = Data::Temperature.new(metric)
|
105
|
-
forecast_measurement.high << forecast['high']['data']
|
106
|
-
forecast_measurement.low = Data::Temperature.new(metric)
|
107
|
-
forecast_measurement.low << forecast['low']['data']
|
108
|
-
|
109
|
-
forecasts << forecast_measurement
|
110
|
-
d += 1
|
111
|
-
end
|
112
|
-
forecasts
|
113
|
-
end
|
114
|
-
|
115
|
-
def self._build_location(result=nil, geo=nil)
|
116
|
-
raise ArgumentError unless (geo.nil? || geo.is_a?(Data::Geo))
|
117
|
-
location = Data::Location.new
|
118
|
-
if geo
|
119
|
-
location.city = geo.locality
|
120
|
-
location.state_code = geo.region
|
121
|
-
location.country = geo.country
|
122
|
-
location.country_code = geo.country_code
|
123
|
-
location.latitude = geo.latitude
|
124
|
-
location.longitude = geo.longitude
|
125
|
-
end
|
126
|
-
location
|
127
|
-
end
|
128
|
-
|
129
|
-
# use HTTParty to get the current weather
|
130
|
-
def self._fetch(query, metric=true)
|
131
|
-
return unless query
|
132
|
-
puts "fetch google: #{query.q}" if Barometer::debug?
|
133
|
-
self.get(
|
134
|
-
"http://www.google.com/ig/api",
|
135
|
-
:query => {:weather => query.q, :hl => (metric ? "en-GB" : "en-US")},
|
136
|
-
:format => :xml,
|
137
|
-
:timeout => Barometer.timeout
|
138
|
-
)['xml_api_reply']['weather']
|
139
|
-
end
|
140
|
-
|
141
|
-
end
|
142
|
-
end
|
@@ -1,279 +0,0 @@
|
|
1
|
-
module Barometer
|
2
|
-
#
|
3
|
-
# = Weather.com
|
4
|
-
# www.weather.com
|
5
|
-
#
|
6
|
-
# - usage restrictions: YES ... many !!!
|
7
|
-
# - key required: YES (partnerid & licensekey)
|
8
|
-
# - registration required: YES
|
9
|
-
# - supported countries: US (by zipcode), International (by Weather Location ID)
|
10
|
-
#
|
11
|
-
# === performs geo coding
|
12
|
-
# - city: PARTIAL (just a name)
|
13
|
-
# - coordinates: YES
|
14
|
-
#
|
15
|
-
# === time info
|
16
|
-
# - sun rise/set: YES
|
17
|
-
# - provides timezone: NO, but provides a utc offset
|
18
|
-
# - requires TZInfo: NO
|
19
|
-
#
|
20
|
-
# == resources
|
21
|
-
# - API: ?
|
22
|
-
#
|
23
|
-
# === Possible queries:
|
24
|
-
# - http://xoap.weather.com/weather/local/30339?cc=*&dayf=5&link=xoap&prod=xoap&par=[PartnerID]&key=[LicenseKey]
|
25
|
-
#
|
26
|
-
# where query can be:
|
27
|
-
# - zipcode (US) [5 digits only]
|
28
|
-
# - Weather Location ID (International)
|
29
|
-
#
|
30
|
-
# = Weather.com terms of use
|
31
|
-
# There are many conditions when using weather.com. Please read the EULA you
|
32
|
-
# received when you registered for your API keys. In a nutshell (but not limited
|
33
|
-
# to), do the following:
|
34
|
-
# - display the weather.com links (all 5)
|
35
|
-
# - respect the data refresh rates
|
36
|
-
# - do not alter/delete content
|
37
|
-
# - display when weather was last updated
|
38
|
-
# - do not display data in combination with other 3rd party data (except NOAA or GOV)
|
39
|
-
# - do not reproduce, rent, lease, lend, distribute or re-market data
|
40
|
-
# - do not resell
|
41
|
-
# - do not use in combination with a service that charges a fee
|
42
|
-
# - do not use in a mobile application
|
43
|
-
# - use the images properly
|
44
|
-
# - do not display weather for more then 3 locations at a time
|
45
|
-
# - do not allow the data to be scraped (via robots, spiders, web crawlers, etc)
|
46
|
-
# - do not use the latitude and longitude information
|
47
|
-
#
|
48
|
-
# == notes
|
49
|
-
# - the Weather Location ID is a propreitary number (shared with yahoo.com)
|
50
|
-
#
|
51
|
-
# == TODO
|
52
|
-
# - improve "forecasted_wet_by_icon?" to determine if day or night and use right code
|
53
|
-
# - improve "forecasted_sunny_by_icon?" to determine if day or night and use right code
|
54
|
-
# - improve "forcasted_wet_by_humidity?" to use forecasted values
|
55
|
-
# - improve "forcasted_windy?" to use forecasted values
|
56
|
-
# - collect moon and uv information
|
57
|
-
#
|
58
|
-
class WeatherService::WeatherDotCom < WeatherService
|
59
|
-
|
60
|
-
@@partner_key = nil
|
61
|
-
@@license_key = nil
|
62
|
-
|
63
|
-
def self.keys=(keys)
|
64
|
-
raise ArgumentError unless keys.is_a?(Hash)
|
65
|
-
keys.each do |key, value|
|
66
|
-
@@partner_key = value.to_s if key.to_s.downcase == "partner"
|
67
|
-
@@license_key = value.to_s if key.to_s.downcase == "license"
|
68
|
-
end
|
69
|
-
end
|
70
|
-
|
71
|
-
#########################################################################
|
72
|
-
# PRIVATE
|
73
|
-
# If class methods could be private, the remaining methods would be.
|
74
|
-
#
|
75
|
-
|
76
|
-
def self._source_name; :weather_dot_com; end
|
77
|
-
def self._accepted_formats; [:short_zipcode, :weather_id]; end
|
78
|
-
|
79
|
-
def self._has_keys?; !@@partner_key.nil? && !@@license_key.nil?; end
|
80
|
-
def self._requires_keys?; true; end
|
81
|
-
|
82
|
-
def self._wet_icon_codes
|
83
|
-
codes = (0..18).to_a + [35] + (37..43).to_a + (45..47).to_a
|
84
|
-
codes.collect {|c| c.to_s}
|
85
|
-
end
|
86
|
-
def self._sunny_icon_codes
|
87
|
-
codes = [19, 22, 28, 30, 32, 34, 36]
|
88
|
-
codes.collect {|c| c.to_s}
|
89
|
-
end
|
90
|
-
|
91
|
-
# first try to match the zone code, otherwise use the zone offset
|
92
|
-
#
|
93
|
-
def self._build_timezone(data)
|
94
|
-
if data
|
95
|
-
if data['cc'] && data['cc']['lsup'] &&
|
96
|
-
(zone_match = data['cc']['lsup'].match(/ ([A-Z]{1,4})$/))
|
97
|
-
Data::Zone.new(zone_match[1])
|
98
|
-
elsif data['loc'] && data['loc']['zone']
|
99
|
-
Data::Zone.new(data['loc']['zone'].to_f)
|
100
|
-
end
|
101
|
-
end
|
102
|
-
end
|
103
|
-
|
104
|
-
def self._parse_local_time(data)
|
105
|
-
(data && data['loc']) ? Data::LocalTime.parse(data['loc']['tm']) : nil
|
106
|
-
end
|
107
|
-
|
108
|
-
def self._build_links(data)
|
109
|
-
links = {}
|
110
|
-
if data && data['lnks'] && data['lnks']['link']
|
111
|
-
data['lnks']['link'].each do |link_hash|
|
112
|
-
links[link_hash['t']] = link_hash['l']
|
113
|
-
end
|
114
|
-
end
|
115
|
-
links
|
116
|
-
end
|
117
|
-
|
118
|
-
def self._build_current(data, metric=true)
|
119
|
-
raise ArgumentError unless data.is_a?(Hash)
|
120
|
-
current = Measurement::Result.new
|
121
|
-
if data
|
122
|
-
if data['cc']
|
123
|
-
current.updated_at = Data::LocalDateTime.parse(data['cc']['lsup'])
|
124
|
-
current.icon = data['cc']['icon']
|
125
|
-
current.condition = data['cc']['t']
|
126
|
-
current.humidity = data['cc']['hmid'].to_i
|
127
|
-
current.temperature = Data::Temperature.new(metric)
|
128
|
-
current.temperature << data['cc']['tmp']
|
129
|
-
current.dew_point = Data::Temperature.new(metric)
|
130
|
-
current.dew_point << data['cc']['dewp']
|
131
|
-
current.wind_chill = Data::Temperature.new(metric)
|
132
|
-
current.wind_chill << data['cc']['flik']
|
133
|
-
current.visibility = Data::Distance.new(metric)
|
134
|
-
current.visibility << data['cc']['vis']
|
135
|
-
if data['cc']['wind']
|
136
|
-
current.wind = Data::Speed.new(metric)
|
137
|
-
current.wind << data['cc']['wind']['s']
|
138
|
-
current.wind.degrees = data['cc']['wind']['d'].to_f
|
139
|
-
current.wind.direction = data['cc']['wind']['t']
|
140
|
-
end
|
141
|
-
if data['cc']['bar']
|
142
|
-
current.pressure = Data::Pressure.new(metric)
|
143
|
-
current.pressure << data['cc']['bar']['r']
|
144
|
-
end
|
145
|
-
end
|
146
|
-
end
|
147
|
-
current
|
148
|
-
end
|
149
|
-
|
150
|
-
def self._build_forecast(data, metric=true)
|
151
|
-
raise ArgumentError unless data.is_a?(Hash)
|
152
|
-
forecasts = Measurement::ResultArray.new
|
153
|
-
|
154
|
-
if data && data['dayf'] && data['dayf']['day']
|
155
|
-
local_date = data['dayf']['lsup']
|
156
|
-
data['dayf']['day'].each do |forecast|
|
157
|
-
day_measurement = Measurement::Result.new
|
158
|
-
night_measurement = Measurement::Result.new
|
159
|
-
|
160
|
-
# as stated by weather.com "day = 7am-7pm"
|
161
|
-
# and "night = 7pm-7am"
|
162
|
-
date = Date.parse(forecast['dt'])
|
163
|
-
date_string = date.strftime("%b %d")
|
164
|
-
day_measurement.valid_start_date = Data::LocalDateTime.new(date.year,date.month,date.day,7,0,0)
|
165
|
-
day_measurement.valid_end_date = Data::LocalDateTime.new(date.year,date.month,date.day,18,59,59)
|
166
|
-
night_measurement.valid_start_date = Data::LocalDateTime.new(date.year,date.month,date.day,19,0,0)
|
167
|
-
night_measurement.valid_end_date = Data::LocalDateTime.new(date.year,date.month,date.day+1,6,59,59)
|
168
|
-
|
169
|
-
high = Data::Temperature.new(metric)
|
170
|
-
high << forecast['hi']
|
171
|
-
low = Data::Temperature.new(metric)
|
172
|
-
low << forecast['low']
|
173
|
-
day_measurement.high = high
|
174
|
-
day_measurement.low = low
|
175
|
-
night_measurement.high = high
|
176
|
-
night_measurement.low = low
|
177
|
-
|
178
|
-
# build sun
|
179
|
-
rise_local_time = Data::LocalTime.parse(forecast['sunr'])
|
180
|
-
set_local_time = Data::LocalTime.parse(forecast['suns'])
|
181
|
-
sun = Data::Sun.new(rise_local_time, set_local_time)
|
182
|
-
day_measurement.sun = sun
|
183
|
-
night_measurement.sun = sun
|
184
|
-
|
185
|
-
if forecast['part']
|
186
|
-
forecast['part'].each do |part|
|
187
|
-
if part['p'] == 'd'
|
188
|
-
# add this to the day
|
189
|
-
day_measurement.description = "#{date_string} - Day"
|
190
|
-
day_measurement.condition = part['t']
|
191
|
-
day_measurement.icon = part['icon']
|
192
|
-
day_measurement.pop = part['ppcp'].to_i
|
193
|
-
day_measurement.humidity = part['hmid'].to_i
|
194
|
-
|
195
|
-
if part['wind']
|
196
|
-
day_measurement.wind = Data::Speed.new(metric)
|
197
|
-
day_measurement.wind << part['wind']['s']
|
198
|
-
day_measurement.wind.degrees = part['wind']['d'].to_i
|
199
|
-
day_measurement.wind.direction = part['wind']['t']
|
200
|
-
end
|
201
|
-
|
202
|
-
elsif part['p'] == 'n'
|
203
|
-
# add this to the night
|
204
|
-
night_measurement.description = "#{date_string} - Night"
|
205
|
-
night_measurement.condition = part['t']
|
206
|
-
night_measurement.icon = part['icon']
|
207
|
-
night_measurement.pop = part['ppcp'].to_i
|
208
|
-
night_measurement.humidity = part['hmid'].to_i
|
209
|
-
|
210
|
-
if part['wind']
|
211
|
-
night_measurement.wind = Data::Speed.new(metric)
|
212
|
-
night_measurement.wind << part['wind']['s']
|
213
|
-
night_measurement.wind.degrees = part['wind']['d'].to_i
|
214
|
-
night_measurement.wind.direction = part['wind']['t']
|
215
|
-
end
|
216
|
-
|
217
|
-
end
|
218
|
-
end
|
219
|
-
end
|
220
|
-
forecasts << day_measurement
|
221
|
-
forecasts << night_measurement
|
222
|
-
end
|
223
|
-
end
|
224
|
-
forecasts
|
225
|
-
end
|
226
|
-
|
227
|
-
def self._build_location(data, geo=nil)
|
228
|
-
raise ArgumentError unless data.is_a?(Hash)
|
229
|
-
raise ArgumentError unless (geo.nil? || geo.is_a?(Data::Geo))
|
230
|
-
location = Data::Location.new
|
231
|
-
# use the geocoded data if available, otherwise get data from result
|
232
|
-
if geo
|
233
|
-
location.city = geo.locality
|
234
|
-
location.state_code = geo.region
|
235
|
-
location.country = geo.country
|
236
|
-
location.country_code = geo.country_code
|
237
|
-
location.latitude = geo.latitude
|
238
|
-
location.longitude = geo.longitude
|
239
|
-
else
|
240
|
-
if data && data['loc']
|
241
|
-
location.name = data['loc']['dnam']
|
242
|
-
location.latitude = data['loc']['lat']
|
243
|
-
location.longitude = data['loc']['lon']
|
244
|
-
end
|
245
|
-
end
|
246
|
-
location
|
247
|
-
end
|
248
|
-
|
249
|
-
def self._build_sun(data)
|
250
|
-
raise ArgumentError unless data.is_a?(Hash)
|
251
|
-
sun = nil
|
252
|
-
if data
|
253
|
-
if data['loc']
|
254
|
-
rise_local_time = Data::LocalTime.parse(data['loc']['sunr'])
|
255
|
-
set_local_time = Data::LocalTime.parse(data['loc']['suns'])
|
256
|
-
end
|
257
|
-
sun = Data::Sun.new(rise_local_time, set_local_time)
|
258
|
-
end
|
259
|
-
sun || Data::Sun.new
|
260
|
-
end
|
261
|
-
|
262
|
-
# use HTTParty to get the current weather
|
263
|
-
#
|
264
|
-
def self._fetch(query, metric=true)
|
265
|
-
return unless query
|
266
|
-
puts "fetch weather.com: #{query.q}" if Barometer::debug?
|
267
|
-
self.get(
|
268
|
-
"http://xoap.weather.com/weather/local/#{query.q}",
|
269
|
-
:query => { :par => @@partner_key, :key => @@license_key,
|
270
|
-
:prod => "xoap", :link => "xoap", :cc => "*",
|
271
|
-
:dayf => "5", :unit => (metric ? 'm' : 's')
|
272
|
-
},
|
273
|
-
:format => :xml,
|
274
|
-
:timeout => Barometer.timeout
|
275
|
-
)['weather']
|
276
|
-
end
|
277
|
-
|
278
|
-
end
|
279
|
-
end
|
data/spec/fakeweb_helper.rb
DELETED
@@ -1,179 +0,0 @@
|
|
1
|
-
require 'fakeweb'
|
2
|
-
FakeWeb.allow_net_connect = false
|
3
|
-
|
4
|
-
#
|
5
|
-
# Set random test keys
|
6
|
-
#
|
7
|
-
WEATHER_PARTNER_KEY = "1234"
|
8
|
-
WEATHER_LICENSE_KEY = "12345"
|
9
|
-
WEATHERBUG_CODE = "A9999"
|
10
|
-
YAHOO_KEY = "YAHOO"
|
11
|
-
|
12
|
-
#
|
13
|
-
# for geocoding
|
14
|
-
#
|
15
|
-
geo_url_v3 = "http://maps.googleapis.com/maps/api/geocode/json?"
|
16
|
-
|
17
|
-
# http://maps.googleapis.com/maps/api/geocode/json?region=US&sensor=false&address=90210
|
18
|
-
FakeWeb.register_uri(:get,
|
19
|
-
"#{geo_url_v3}region=US&sensor=false&address=90210",
|
20
|
-
:body => File.read(File.dirname(__FILE__) + '/fixtures/geocode/90210_v3.json')
|
21
|
-
)
|
22
|
-
# http://maps.googleapis.com/maps/api/geocode/json?region=&sensor=false&latlng=40.756054%2C-73.986951
|
23
|
-
FakeWeb.register_uri(:get,
|
24
|
-
"#{geo_url_v3}region=&sensor=false&latlng=40.756054%2C-73.986951",
|
25
|
-
:body => File.read(File.dirname(__FILE__) + '/fixtures/geocode/40_73_v3.json')
|
26
|
-
)
|
27
|
-
# http://maps.googleapis.com/maps/api/geocode/json?region=&sensor=false&address=New%20York%2C%20NY
|
28
|
-
FakeWeb.register_uri(:get,
|
29
|
-
"#{geo_url_v3}region=&sensor=false&address=New%20York%2C%20NY",
|
30
|
-
:body => File.read(File.dirname(__FILE__) + '/fixtures/geocode/newyork_ny_v3.json')
|
31
|
-
)
|
32
|
-
# http://maps.googleapis.com/maps/api/geocode/json?region=CA&sensor=false&address=T5B%204M9
|
33
|
-
FakeWeb.register_uri(:get,
|
34
|
-
"#{geo_url_v3}region=CA&sensor=false&address=T5B%204M9",
|
35
|
-
:body => File.read(File.dirname(__FILE__) + '/fixtures/geocode/T5B4M9_v3.json')
|
36
|
-
)
|
37
|
-
# http://maps.googleapis.com/maps/api/geocode/json?region=US&sensor=false&address=KSFO
|
38
|
-
FakeWeb.register_uri(:get,
|
39
|
-
"#{geo_url_v3}region=US&sensor=false&address=KSFO",
|
40
|
-
:body => File.read(File.dirname(__FILE__) + '/fixtures/geocode/ksfo_v3.json')
|
41
|
-
)
|
42
|
-
# http://maps.googleapis.com/maps/api/geocode/json?region=&sensor=false&address=Atlanta%2C%20GA%2C%20US
|
43
|
-
FakeWeb.register_uri(:get,
|
44
|
-
"#{geo_url_v3}region=&sensor=false&address=Atlanta%2C%20GA%2C%20US",
|
45
|
-
:body => File.read(File.dirname(__FILE__) + '/fixtures/geocode/atlanta_v3.json')
|
46
|
-
)
|
47
|
-
# http://maps.googleapis.com/maps/api/geocode/json?region=&sensor=false&address=Calgary%2CAB
|
48
|
-
FakeWeb.register_uri(:get,
|
49
|
-
"#{geo_url_v3}region=&sensor=false&address=Calgary%2CAB",
|
50
|
-
:body => File.read(File.dirname(__FILE__) + '/fixtures/geocode/calgary_ab_v3.json')
|
51
|
-
)
|
52
|
-
#
|
53
|
-
# for weather.com searches
|
54
|
-
#
|
55
|
-
# http://xoap.weather.com:80/search/search?where=Beverly%20Hills%2C%20CA%2C%20USA
|
56
|
-
FakeWeb.register_uri(:get,
|
57
|
-
"http://xoap.weather.com:80/search/search?where=Beverly%20Hills%2C%20CA%2C%20United%20States",
|
58
|
-
:body => File.read(File.dirname(__FILE__) + '/fixtures/formats/weather_id/the_hills.xml')
|
59
|
-
)
|
60
|
-
# http://xoap.weather.com:80/search/search?where=New%20York%2C%20NY
|
61
|
-
FakeWeb.register_uri(:get,
|
62
|
-
"http://xoap.weather.com:80/search/search?where=New%20York%2C%20NY",
|
63
|
-
:body => File.read(File.dirname(__FILE__) + '/fixtures/formats/weather_id/new_york.xml')
|
64
|
-
)
|
65
|
-
# http://xoap.weather.com:80/search/search?where=Manhattan%2C%20NY%2C%20USA
|
66
|
-
FakeWeb.register_uri(:get,
|
67
|
-
"http://xoap.weather.com:80/search/search?where=Manhattan%2C%20NY%2C%20United%20States",
|
68
|
-
:body => File.read(File.dirname(__FILE__) + '/fixtures/formats/weather_id/manhattan.xml')
|
69
|
-
)
|
70
|
-
# http://xoap.weather.com:80/search/search?where=New%20York%2C%20NY%2C%20USA
|
71
|
-
FakeWeb.register_uri(:get,
|
72
|
-
"http://xoap.weather.com:80/search/search?where=New%20York%2C%20NY%2C%20United%20States",
|
73
|
-
:body => File.read(File.dirname(__FILE__) + '/fixtures/formats/weather_id/new_york.xml')
|
74
|
-
)
|
75
|
-
# http://xoap.weather.com:80/search/search?where=90210
|
76
|
-
FakeWeb.register_uri(:get,
|
77
|
-
"http://xoap.weather.com:80/search/search?where=90210",
|
78
|
-
:body => File.read(File.dirname(__FILE__) + '/fixtures/formats/weather_id/90210.xml')
|
79
|
-
)
|
80
|
-
# http://xoap.weather.com:80/search/search?where=San%20Francisco%2C%20CA%2C%20USA
|
81
|
-
FakeWeb.register_uri(:get,
|
82
|
-
"http://xoap.weather.com:80/search/search?where=San%20Francisco%2C%20CA%2C%20United%20States",
|
83
|
-
:body => File.read(File.dirname(__FILE__) + '/fixtures/formats/weather_id/ksfo.xml')
|
84
|
-
)
|
85
|
-
#
|
86
|
-
# for yahoo.com searches
|
87
|
-
#
|
88
|
-
# http://weather.yahooapis.com:80/forecastrss?p=USGA0028
|
89
|
-
FakeWeb.register_uri(:get,
|
90
|
-
"http://weather.yahooapis.com:80/forecastrss?p=USGA0028",
|
91
|
-
:body => File.read(File.dirname(__FILE__) + '/fixtures/formats/weather_id/from_USGA0028.xml')
|
92
|
-
)
|
93
|
-
#
|
94
|
-
# for Google weather
|
95
|
-
#
|
96
|
-
# http://www.google.com/ig/api?weather=Calgary%2CAB&hl=en-GB
|
97
|
-
FakeWeb.register_uri(:get,
|
98
|
-
"http://www.google.com/ig/api?weather=#{CGI.escape('Calgary,AB')}&hl=en-GB",
|
99
|
-
:body => File.read(File.dirname(__FILE__) + '/fixtures/services/google/calgary_ab.xml')
|
100
|
-
)
|
101
|
-
#
|
102
|
-
# for WeatherBug weather
|
103
|
-
#
|
104
|
-
# http://CODE.api.wxbug.net/getLiveWeatherRSS.aspx?ACode=CODE&OutputType=1&UnitType=1&zipCode=90210
|
105
|
-
bug_url_current = "http://#{WEATHERBUG_CODE}.api.wxbug.net:80/getLiveWeatherRSS.aspx?"
|
106
|
-
FakeWeb.register_uri(:get,
|
107
|
-
"#{bug_url_current}ACode=#{WEATHERBUG_CODE}&OutputType=1&UnitType=1&zipCode=90210",
|
108
|
-
:body => File.read(File.dirname(__FILE__) + '/fixtures/services/weather_bug/90210_current.xml')
|
109
|
-
)
|
110
|
-
# http://CODE.api.wxbug.net/getForecastRSS.aspx?ACode=CODE&OutputType=1&UnitType=1&zipCode=90210
|
111
|
-
bug_url_future = "http://#{WEATHERBUG_CODE}.api.wxbug.net:80/getForecastRSS.aspx?"
|
112
|
-
FakeWeb.register_uri(:get,
|
113
|
-
"#{bug_url_future}ACode=#{WEATHERBUG_CODE}&OutputType=1&UnitType=1&zipCode=90210",
|
114
|
-
:body => File.read(File.dirname(__FILE__) + '/fixtures/services/weather_bug/90210_forecast.xml')
|
115
|
-
)
|
116
|
-
#
|
117
|
-
# for weather.com weather
|
118
|
-
#
|
119
|
-
# http://xoap.weather.com:80/weather/local/90210?dayf=5&unit=m&link=xoap&par=PKEY&prod=xoap&key=LKEY&cc=*
|
120
|
-
weather_com_url = "http://xoap.weather.com:80/weather/local/"
|
121
|
-
FakeWeb.register_uri(:get,
|
122
|
-
"#{weather_com_url}90210?dayf=5&unit=m&link=xoap&par=#{WEATHER_PARTNER_KEY}&prod=xoap&key=#{WEATHER_LICENSE_KEY}&cc=*",
|
123
|
-
:body => File.read(File.dirname(__FILE__) + '/fixtures/services/weather_dot_com/90210.xml')
|
124
|
-
)
|
125
|
-
#
|
126
|
-
# for yahoo weather
|
127
|
-
#
|
128
|
-
# http://weather.yahooapis.com:80/forecastrss?u=c&p=90210
|
129
|
-
FakeWeb.register_uri(:get,
|
130
|
-
"http://weather.yahooapis.com:80/forecastrss?u=c&p=90210",
|
131
|
-
:body => File.read(File.dirname(__FILE__) + '/fixtures/services/yahoo/90210.xml')
|
132
|
-
)
|
133
|
-
|
134
|
-
#
|
135
|
-
# For wunderground weather
|
136
|
-
#
|
137
|
-
# http://api.wunderground.com/auto/wui/geo/WXCurrentObXML/index.xml?query=51.045%2C-114.0572222
|
138
|
-
FakeWeb.register_uri(:get,
|
139
|
-
"http://api.wunderground.com/auto/wui/geo/WXCurrentObXML/index.xml?query=51.04499999999999%2C-114.0572222",
|
140
|
-
:body => File.read(File.dirname(__FILE__) + '/fixtures/services/wunderground/current_calgary_ab.xml')
|
141
|
-
)
|
142
|
-
# http://api.wunderground.com/auto/wui/geo/ForecastXML/index.xml?query=51.045%2C-114.0572222
|
143
|
-
FakeWeb.register_uri(:get,
|
144
|
-
"http://api.wunderground.com/auto/wui/geo/ForecastXML/index.xml?query=51.04499999999999%2C-114.0572222",
|
145
|
-
:body => File.read(File.dirname(__FILE__) + '/fixtures/services/wunderground/forecast_calgary_ab.xml')
|
146
|
-
)
|
147
|
-
FakeWeb.register_uri(:get,
|
148
|
-
"http://api.wunderground.com/auto/wui/geo/WXCurrentObXML/index.xml?query=#{CGI.escape('Calgary,AB')}",
|
149
|
-
:body => File.read(File.dirname(__FILE__) + '/fixtures/services/wunderground/current_calgary_ab.xml')
|
150
|
-
)
|
151
|
-
FakeWeb.register_uri(:get,
|
152
|
-
"http://api.wunderground.com/auto/wui/geo/ForecastXML/index.xml?query=#{CGI.escape('Calgary,AB')}",
|
153
|
-
:body => File.read(File.dirname(__FILE__) + '/fixtures/services/wunderground/forecast_calgary_ab.xml')
|
154
|
-
)
|
155
|
-
|
156
|
-
#
|
157
|
-
# For Placemaker
|
158
|
-
#
|
159
|
-
# curl -d "documentType=text%2Fhtml&outputType=xml&documentContent=<html><body><div class=\"geo\"><span class=\"latitude\">40.756054</span><span class=\"longitude\">-73.986951</span></div></body></html>" http://wherein.yahooapis.com/v1/document
|
160
|
-
# curl -d "documentType=text%2Fhtml&outputType=xml&documentContent=Chicago" http://wherein.yahooapis.com/v1/document
|
161
|
-
#
|
162
|
-
FakeWeb.register_uri(:post,
|
163
|
-
"http://wherein.yahooapis.com/v1/document",
|
164
|
-
[
|
165
|
-
{:body => File.read(File.dirname(__FILE__) + '/fixtures/services/placemaker/the_hills.xml')},
|
166
|
-
{:body => File.read(File.dirname(__FILE__) + '/fixtures/services/placemaker/the_hills.xml')},
|
167
|
-
{:body => File.read(File.dirname(__FILE__) + '/fixtures/services/placemaker/the_hills.xml')},
|
168
|
-
{:body => File.read(File.dirname(__FILE__) + '/fixtures/services/placemaker/T5B4M9.xml')},
|
169
|
-
{:body => File.read(File.dirname(__FILE__) + '/fixtures/services/placemaker/coords.xml')},
|
170
|
-
{:body => File.read(File.dirname(__FILE__) + '/fixtures/services/placemaker/new_york.xml')},
|
171
|
-
{:body => File.read(File.dirname(__FILE__) + '/fixtures/services/placemaker/atlanta.xml')},
|
172
|
-
{:body => File.read(File.dirname(__FILE__) + '/fixtures/services/placemaker/ksfo.xml')}
|
173
|
-
]
|
174
|
-
)
|
175
|
-
|
176
|
-
FakeWeb.register_uri(:get,
|
177
|
-
"http://weather.yahooapis.com/forecastrss?w=615702",
|
178
|
-
:body => File.read(File.dirname(__FILE__) + '/fixtures/services/placemaker/w615702.xml')
|
179
|
-
)
|