yahoo-weather 1.1.0 → 1.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.rdoc +22 -0
- data/LICENSE +504 -0
- data/README.rdoc +35 -21
- data/Rakefile +1 -2
- data/examples/example.rb +11 -8
- data/lib/yahoo-weather.rb +15 -296
- data/lib/yahoo-weather/astronomy.rb +13 -0
- data/lib/yahoo-weather/atmosphere.rb +40 -0
- data/lib/yahoo-weather/client.rb +70 -0
- data/lib/yahoo-weather/condition.rb +20 -0
- data/lib/yahoo-weather/forecast.rb +29 -0
- data/lib/yahoo-weather/image.rb +25 -0
- data/lib/yahoo-weather/location.rb +17 -0
- data/lib/yahoo-weather/response.rb +85 -0
- data/lib/yahoo-weather/units.rb +24 -0
- data/lib/yahoo-weather/wind.rb +17 -0
- data/test/test_api.rb +113 -91
- metadata +18 -8
- data/TODO +0 -6
@@ -0,0 +1,13 @@
|
|
1
|
+
# Describes astronomy information for a particular location.
|
2
|
+
class YahooWeather::Astronomy
|
3
|
+
# a Time object detailing the sunrise time for a location.
|
4
|
+
attr_reader :sunrise
|
5
|
+
|
6
|
+
# a Time object detailing the sunset time for a location.
|
7
|
+
attr_reader :sunset
|
8
|
+
|
9
|
+
def initialize (payload)
|
10
|
+
@sunrise = YahooWeather._parse_time(payload['sunrise'])
|
11
|
+
@sunset = YahooWeather._parse_time(payload['sunset'])
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
# Describes the specific atmospheric conditions at a location.
|
2
|
+
class YahooWeather::Atmosphere
|
3
|
+
# Constants representing the state of the barometric pressure.
|
4
|
+
#
|
5
|
+
class Barometer
|
6
|
+
STEADY = 'steady'
|
7
|
+
RISING = 'rising'
|
8
|
+
FALLING = 'falling'
|
9
|
+
|
10
|
+
# lists all possible barometer constants
|
11
|
+
ALL = [ STEADY, RISING, FALLING ]
|
12
|
+
end
|
13
|
+
|
14
|
+
# the humidity of the surroundings.
|
15
|
+
attr_reader :humidity
|
16
|
+
|
17
|
+
# the visibility level of the surroundings
|
18
|
+
attr_reader :visibility
|
19
|
+
|
20
|
+
# the pressure level of the surroundings.
|
21
|
+
attr_reader :pressure
|
22
|
+
|
23
|
+
# the state of the barometer, defined as one of the
|
24
|
+
# YahooWeather::Atmosphere::Barometer constants.
|
25
|
+
attr_reader :barometer
|
26
|
+
|
27
|
+
def initialize (payload)
|
28
|
+
@humidity = payload['humidity'].to_i
|
29
|
+
@visibility = payload['visibility'].to_i
|
30
|
+
@pressure = payload['pressure'].to_f
|
31
|
+
|
32
|
+
# map barometric pressure direction to appropriate constant
|
33
|
+
@barometer = nil
|
34
|
+
case payload['rising'].to_i
|
35
|
+
when 0: @barometer = Barometer::STEADY
|
36
|
+
when 1: @barometer = Barometer::RISING
|
37
|
+
when 2: @barometer = Barometer::FALLING
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
# The main client object through which the Yahoo! Weather service may be accessed.
|
2
|
+
class YahooWeather::Client
|
3
|
+
# the url with which we obtain weather information from yahoo
|
4
|
+
@@API_URL = "http://weather.yahooapis.com/forecastrss"
|
5
|
+
|
6
|
+
def initialize (api_url = @@API_URL)
|
7
|
+
@api_url = api_url
|
8
|
+
end
|
9
|
+
|
10
|
+
# Returns a YahooWeather::Response object detailing the current weather
|
11
|
+
# information for the specified location.
|
12
|
+
#
|
13
|
+
# The lookup requires the unique WOEID for the location whose
|
14
|
+
# weather is sought.. To find your WOEID, browse or search for your
|
15
|
+
# city from the Weather (http://weather.yahoo.com/) home page. The
|
16
|
+
# WOEID is in the URL for the forecast page for that city. You can
|
17
|
+
# also get the WOEID by entering your zip code on the home page. For
|
18
|
+
# example, if you search for Los Angeles on the Weather home page,
|
19
|
+
# the forecast page for that city is
|
20
|
+
# http://weather.yahoo.com/united-states/california/los-angeles-2442047/. The
|
21
|
+
# WOEID is 2442047.
|
22
|
+
#
|
23
|
+
# +units+ allows specifying whether to retrieve information in
|
24
|
+
# +Fahrenheit+ as YahooWeather::Units::FAHRENHEIT, or +Celsius+ as
|
25
|
+
# YahooWeather::Units::CELSIUS, and defaults to fahrenheit.
|
26
|
+
#
|
27
|
+
def lookup_by_woeid (woeid, units = 'f')
|
28
|
+
url = @api_url + '?w=' + CGI.escape(woeid.to_s) + '&u=' + CGI.escape(units)
|
29
|
+
_lookup(woeid, url)
|
30
|
+
end
|
31
|
+
|
32
|
+
# Returns a YahooWeather::Response object detailing the current weather
|
33
|
+
# information for the specified location.
|
34
|
+
#
|
35
|
+
# NOTE: This method is deprecated as Yahoo has deprecated this
|
36
|
+
# non-WOEID-based lookup function. Please use the new
|
37
|
+
# +lookup_by_woeid+ method instead.
|
38
|
+
#
|
39
|
+
# +location+ can be either a US zip code or a location code. Location
|
40
|
+
# codes can be looked up at http://weather.yahoo.com, where it will appear
|
41
|
+
# in the URL that results from searching on the city or zip code. For
|
42
|
+
# instance, searching on 'Seattle, WA' results in a URL ending in
|
43
|
+
# 'USWA0395.html', so the location code for Seattle is 'USWA0395'.
|
44
|
+
#
|
45
|
+
# +units+ allows specifying whether to retrieve information in
|
46
|
+
# +Fahrenheit+ as YahooWeather::Units::FAHRENHEIT, or +Celsius+ as
|
47
|
+
# YahooWeather::Units::CELSIUS, and defaults to fahrenheit.
|
48
|
+
#
|
49
|
+
def lookup_location (location, units = 'f')
|
50
|
+
url = @api_url + '?p=' + CGI.escape(location) + '&u=' + CGI.escape(units)
|
51
|
+
_lookup(location, url)
|
52
|
+
end
|
53
|
+
|
54
|
+
private
|
55
|
+
|
56
|
+
def _lookup (src, url)
|
57
|
+
begin
|
58
|
+
response = Net::HTTP.get_response(URI.parse(url)).body.to_s
|
59
|
+
|
60
|
+
rescue => e
|
61
|
+
raise RuntimeError.new("failed to get weather [src=#{src}, " +
|
62
|
+
"url=#{url}, e=#{e}].")
|
63
|
+
end
|
64
|
+
|
65
|
+
# create the response object
|
66
|
+
doc = Nokogiri::XML.parse(response)
|
67
|
+
YahooWeather::Response.new(src, url, doc)
|
68
|
+
end
|
69
|
+
|
70
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
class YahooWeather::Condition
|
2
|
+
# the Yahoo! Weather condition code, as detailed at http://developer.yahoo.com/weather.
|
3
|
+
attr_reader :code
|
4
|
+
|
5
|
+
# the date and time associated with these conditions.
|
6
|
+
attr_reader :date
|
7
|
+
|
8
|
+
# the temperature of the location.
|
9
|
+
attr_reader :temp
|
10
|
+
|
11
|
+
# the brief prose text description of the weather conditions of the location.
|
12
|
+
attr_reader :text
|
13
|
+
|
14
|
+
def initialize (payload)
|
15
|
+
@code = payload['code'].to_i
|
16
|
+
@date = YahooWeather._parse_time(payload['date'])
|
17
|
+
@temp = payload['temp'].to_i
|
18
|
+
@text = payload['text']
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# The forecasted weather conditions for a specific location.
|
2
|
+
class YahooWeather::Forecast
|
3
|
+
# the brief name of the day associated with the forecast.
|
4
|
+
attr_reader :day
|
5
|
+
|
6
|
+
# the date associated with the forecast.
|
7
|
+
attr_reader :date
|
8
|
+
|
9
|
+
# the low temperature forecasted.
|
10
|
+
attr_reader :low
|
11
|
+
|
12
|
+
# the high temperature forecasted.
|
13
|
+
attr_reader :high
|
14
|
+
|
15
|
+
# the brief prose text description of the forecasted weather conditions.
|
16
|
+
attr_reader :text
|
17
|
+
|
18
|
+
# the Yahoo! Weather code associated with the forecast, per http://developer.yahoo.com/weather.
|
19
|
+
attr_reader :code
|
20
|
+
|
21
|
+
def initialize (payload)
|
22
|
+
@day = payload['day']
|
23
|
+
@date = YahooWeather._parse_time(payload['date'])
|
24
|
+
@low = payload['low'].to_i
|
25
|
+
@high = payload['high'].to_i
|
26
|
+
@text = payload['text']
|
27
|
+
@code = payload['code'].to_i
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
class YahooWeather::Image
|
2
|
+
# the height of the image in pixels.
|
3
|
+
attr_reader :height
|
4
|
+
|
5
|
+
# the url intended to be used as a link wrapping the image, for
|
6
|
+
# instance, to send the user to the main Yahoo Weather home page.
|
7
|
+
attr_reader :link
|
8
|
+
|
9
|
+
# the title of hte image.
|
10
|
+
attr_reader :title
|
11
|
+
|
12
|
+
# the full url to the image.
|
13
|
+
attr_reader :url
|
14
|
+
|
15
|
+
# the width of the image in pixels.
|
16
|
+
attr_reader :width
|
17
|
+
|
18
|
+
def initialize (payload)
|
19
|
+
@title = payload.xpath('title').first.content
|
20
|
+
@link = payload.xpath('link').first.content
|
21
|
+
@url = payload.xpath('url').first.content
|
22
|
+
@height = payload.xpath('height').first.content.to_i
|
23
|
+
@width = payload.xpath('width').first.content.to_i
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# Describes a geographical location.
|
2
|
+
class YahooWeather::Location
|
3
|
+
# the name of the city.
|
4
|
+
attr_reader :city
|
5
|
+
|
6
|
+
# the name of the country.
|
7
|
+
attr_reader :country
|
8
|
+
|
9
|
+
# the name of the region, such as a state.
|
10
|
+
attr_reader :region
|
11
|
+
|
12
|
+
def initialize (payload)
|
13
|
+
@city = payload['city']
|
14
|
+
@country = payload['country']
|
15
|
+
@region = payload['region']
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,85 @@
|
|
1
|
+
# Describes the weather conditions for a particular requested location.
|
2
|
+
class YahooWeather::Response
|
3
|
+
# a YahooWeather::Astronomy object detailing the sunrise and sunset
|
4
|
+
# information for the requested location.
|
5
|
+
attr_reader :astronomy
|
6
|
+
|
7
|
+
# a YahooWeather::Location object detailing the precise geographical names
|
8
|
+
# to which the requested location was mapped.
|
9
|
+
attr_reader :location
|
10
|
+
|
11
|
+
# a YahooWeather::Units object detailing the units corresponding to the
|
12
|
+
# information detailed in the response.
|
13
|
+
attr_reader :units
|
14
|
+
|
15
|
+
# a YahooWeather::Wind object detailing the wind information at the
|
16
|
+
# requested location.
|
17
|
+
attr_reader :wind
|
18
|
+
|
19
|
+
# a YahooWeather::Atmosphere object detailing the atmosphere information
|
20
|
+
# of the requested location.
|
21
|
+
attr_reader :atmosphere
|
22
|
+
|
23
|
+
# a YahooWeather::Condition object detailing the current conditions of the
|
24
|
+
# requested location.
|
25
|
+
attr_reader :condition
|
26
|
+
|
27
|
+
# a list of YahooWeather::Forecast objects detailing the high-level
|
28
|
+
# forecasted weather conditions for upcoming days.
|
29
|
+
attr_reader :forecasts
|
30
|
+
|
31
|
+
# the raw HTML generated by the Yahoo! Weather service summarizing current
|
32
|
+
# weather conditions for the requested location.
|
33
|
+
attr_reader :description
|
34
|
+
|
35
|
+
# a YahooWeather::Image record describing an image icon
|
36
|
+
# representing the current weather.
|
37
|
+
attr_reader :image
|
38
|
+
|
39
|
+
# the latitude of the location for which weather is detailed.
|
40
|
+
attr_reader :latitude
|
41
|
+
|
42
|
+
# the longitude of the location for which weather is detailed.
|
43
|
+
attr_reader :longitude
|
44
|
+
|
45
|
+
# a link to the Yahoo! Weather page with full detailed information on the
|
46
|
+
# requested location's current weather conditions.
|
47
|
+
attr_reader :page_url
|
48
|
+
|
49
|
+
# the location string initially requested of the service.
|
50
|
+
attr_reader :request_location
|
51
|
+
|
52
|
+
# the url with which the Yahoo! Weather service was accessed to build the response.
|
53
|
+
attr_reader :request_url
|
54
|
+
|
55
|
+
# the prose descriptive title of the weather information.
|
56
|
+
attr_reader :title
|
57
|
+
|
58
|
+
def initialize (request_location, request_url, doc)
|
59
|
+
# save off the request params
|
60
|
+
@request_location = request_location
|
61
|
+
@request_url = request_url
|
62
|
+
|
63
|
+
# parse the nokogiri xml document to gather response data
|
64
|
+
root = doc.xpath('/rss/channel').first
|
65
|
+
|
66
|
+
@astronomy = YahooWeather::Astronomy.new(root.xpath('yweather:astronomy').first)
|
67
|
+
@location = YahooWeather::Location.new(root.xpath('yweather:location').first)
|
68
|
+
@units = YahooWeather::Units.new(root.xpath('yweather:units').first)
|
69
|
+
@wind = YahooWeather::Wind.new(root.xpath('yweather:wind').first)
|
70
|
+
@atmosphere = YahooWeather::Atmosphere.new(root.xpath('yweather:atmosphere').first)
|
71
|
+
@image = YahooWeather::Image.new(root.xpath('image').first)
|
72
|
+
|
73
|
+
item = root.xpath('item').first
|
74
|
+
@condition = YahooWeather::Condition.
|
75
|
+
new(item.xpath('yweather:condition').first)
|
76
|
+
@forecasts = []
|
77
|
+
item.xpath('yweather:forecast').each { |forecast|
|
78
|
+
@forecasts << YahooWeather::Forecast.new(forecast) }
|
79
|
+
@latitude = item.xpath('geo:lat').first.content.to_f
|
80
|
+
@longitude = item.xpath('geo:long').first.content.to_f
|
81
|
+
@page_url = item.xpath('link').first.content
|
82
|
+
@title = item.xpath('title').first.content
|
83
|
+
@description = item.xpath('description').first.content
|
84
|
+
end
|
85
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# Describes the units of measure with which weather information is provided.
|
2
|
+
class YahooWeather::Units
|
3
|
+
FAHRENHEIT = 'f'
|
4
|
+
CELSIUS = 'c'
|
5
|
+
|
6
|
+
# the units in which temperature is measured, e.g. +F+ for +Fahrenheit+ or +C+ for +Celsius+.
|
7
|
+
attr_reader :temperature
|
8
|
+
|
9
|
+
# the units in which distance is measured, e.g. +mi+ for +miles+.
|
10
|
+
attr_reader :distance
|
11
|
+
|
12
|
+
# the units in which pressure is measured, e.g. +in+ for +inches+.
|
13
|
+
attr_reader :pressure
|
14
|
+
|
15
|
+
# the units in which speed is measured, e.g. +mph+ for <tt>miles per hour</tt>.
|
16
|
+
attr_reader :speed
|
17
|
+
|
18
|
+
def initialize (payload)
|
19
|
+
@temperature = payload['temperature']
|
20
|
+
@distance = payload['distance']
|
21
|
+
@pressure = payload['pressure']
|
22
|
+
@speed = payload['speed']
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# Describes the specific wind conditions at a location.
|
2
|
+
class YahooWeather::Wind
|
3
|
+
# the temperature factoring in wind chill.
|
4
|
+
attr_reader :chill
|
5
|
+
|
6
|
+
# the direction of the wind in degrees.
|
7
|
+
attr_reader :direction
|
8
|
+
|
9
|
+
# the speed of the wind.
|
10
|
+
attr_reader :speed
|
11
|
+
|
12
|
+
def initialize (payload)
|
13
|
+
@chill = payload['chill'].to_i
|
14
|
+
@direction = payload['direction'].to_i
|
15
|
+
@speed = payload['speed'].to_i
|
16
|
+
end
|
17
|
+
end
|
data/test/test_api.rb
CHANGED
@@ -11,7 +11,9 @@ class TestAPI < Test::Unit::TestCase
|
|
11
11
|
# check a seattle, wa zipcode
|
12
12
|
request_location = '98103'
|
13
13
|
response = @client.lookup_location(request_location)
|
14
|
-
_assert_valid_response(response, request_location,
|
14
|
+
_assert_valid_response(response, request_location,
|
15
|
+
YahooWeather::Units::FAHRENHEIT,
|
16
|
+
'Seattle', 'WA', 'US')
|
15
17
|
end
|
16
18
|
|
17
19
|
def test_lookup_location
|
@@ -19,7 +21,9 @@ class TestAPI < Test::Unit::TestCase
|
|
19
21
|
# yahoo weather developer page
|
20
22
|
request_location = 'FRXX0076'
|
21
23
|
response = @client.lookup_location(request_location)
|
22
|
-
_assert_valid_response(response, request_location,
|
24
|
+
_assert_valid_response(response, request_location,
|
25
|
+
YahooWeather::Units::FAHRENHEIT,
|
26
|
+
'Paris', '', 'FR')
|
23
27
|
end
|
24
28
|
|
25
29
|
def test_units
|
@@ -29,100 +33,118 @@ class TestAPI < Test::Unit::TestCase
|
|
29
33
|
country = 'US'
|
30
34
|
|
31
35
|
# check explicitly specifying fahrenheit units
|
32
|
-
response = @client.lookup_location(request_location,
|
33
|
-
|
36
|
+
response = @client.lookup_location(request_location,
|
37
|
+
YahooWeather::Units::FAHRENHEIT)
|
38
|
+
_assert_valid_response(response, request_location,
|
39
|
+
YahooWeather::Units::FAHRENHEIT,
|
40
|
+
city, region, country)
|
34
41
|
|
35
42
|
# check alternate units
|
36
|
-
response = @client.lookup_location(request_location,
|
37
|
-
|
43
|
+
response = @client.lookup_location(request_location,
|
44
|
+
YahooWeather::Units::CELSIUS)
|
45
|
+
_assert_valid_response(response, request_location,
|
46
|
+
YahooWeather::Units::CELSIUS,
|
47
|
+
city, region, country)
|
38
48
|
end
|
39
|
-
|
49
|
+
|
50
|
+
def test_lookup_by_woeid
|
51
|
+
woeid_sf = '12797168'
|
52
|
+
response = @client.lookup_by_woeid(woeid_sf)
|
53
|
+
_assert_valid_response(response, woeid_sf,
|
54
|
+
YahooWeather::Units::FAHRENHEIT,
|
55
|
+
'San Francisco', 'CA', 'United States')
|
56
|
+
end
|
57
|
+
|
40
58
|
private
|
41
59
|
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
60
|
+
def _assert_valid_response (response, request_location, units,
|
61
|
+
city, region, country)
|
62
|
+
assert_not_nil response
|
63
|
+
|
64
|
+
# check the request location and url explicitly against what we
|
65
|
+
# know they should be
|
66
|
+
assert_equal response.request_location, request_location
|
67
|
+
assert_match(/http:\/\/weather\.yahooapis\.com\/forecastrss\?[pw]=#{request_location}&u=#{units}/, response.request_url)
|
68
|
+
|
69
|
+
# check the astronomy info
|
70
|
+
assert_instance_of YahooWeather::Astronomy, response.astronomy
|
71
|
+
assert_instance_of Time, response.astronomy.sunrise
|
72
|
+
assert_instance_of Time, response.astronomy.sunset
|
73
|
+
assert(response.astronomy.sunrise < response.astronomy.sunset)
|
74
|
+
|
75
|
+
# check the location
|
76
|
+
assert_instance_of YahooWeather::Location, response.location
|
77
|
+
assert_equal response.location.city, city
|
78
|
+
assert_equal response.location.region, region
|
79
|
+
assert_equal response.location.country, country
|
80
|
+
|
81
|
+
# check the default units
|
82
|
+
_assert_valid_units(response.units,
|
83
|
+
(units == YahooWeather::Units::FAHRENHEIT))
|
84
|
+
|
85
|
+
# check the wind info
|
86
|
+
assert_instance_of YahooWeather::Wind, response.wind
|
87
|
+
assert(response.wind.chill <= response.condition.temp)
|
88
|
+
assert_kind_of Numeric, response.wind.direction
|
89
|
+
assert_kind_of Numeric, response.wind.speed
|
90
|
+
|
91
|
+
# check the atmosphere info
|
92
|
+
assert_instance_of YahooWeather::Atmosphere, response.atmosphere
|
93
|
+
assert_kind_of Numeric, response.atmosphere.humidity
|
94
|
+
assert_kind_of Numeric, response.atmosphere.visibility
|
95
|
+
assert_kind_of Numeric, response.atmosphere.pressure
|
96
|
+
assert(YahooWeather::Atmosphere::Barometer::ALL.include?(response.atmosphere.barometer))
|
97
|
+
|
98
|
+
# check the condition info
|
99
|
+
assert_instance_of YahooWeather::Condition, response.condition
|
100
|
+
_assert_valid_weather_code response.condition.code
|
101
|
+
assert_instance_of Time, response.condition.date
|
102
|
+
assert_kind_of Numeric, response.condition.temp
|
103
|
+
assert(response.condition.text && response.condition.text.length > 0)
|
104
|
+
|
105
|
+
# check the forecast info
|
106
|
+
assert_not_nil response.forecasts
|
107
|
+
assert_kind_of Array, response.forecasts
|
108
|
+
assert_equal response.forecasts.length, 2
|
109
|
+
response.forecasts.each do |forecast|
|
110
|
+
assert_instance_of YahooWeather::Forecast, forecast
|
111
|
+
assert(forecast.day && forecast.day.length == 3)
|
112
|
+
assert_instance_of Time, forecast.date
|
113
|
+
assert_kind_of Numeric, forecast.low
|
114
|
+
assert_kind_of Numeric, forecast.high
|
115
|
+
assert(forecast.low <= forecast.high)
|
116
|
+
assert(forecast.text && forecast.text.length > 0)
|
117
|
+
_assert_valid_weather_code forecast.code
|
118
|
+
end
|
119
|
+
|
120
|
+
# check the basic attributes
|
121
|
+
assert(response.description && response.description.length > 0)
|
122
|
+
assert(response.image.url =~ /yimg\.com/)
|
123
|
+
assert_kind_of Numeric, response.latitude
|
124
|
+
assert_kind_of Numeric, response.longitude
|
125
|
+
assert(response.page_url =~ /\.html$/)
|
126
|
+
assert(response.title && response.title.length > 0)
|
127
|
+
assert_not_nil(response.title.index("#{response.location.city}, #{response.location.region}"))
|
97
128
|
end
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
assert(response.image_url =~ /yimg\.com/)
|
102
|
-
assert_kind_of Numeric, response.latitude
|
103
|
-
assert_kind_of Numeric, response.longitude
|
104
|
-
assert(response.page_url =~ /\.html$/)
|
105
|
-
assert(response.title && response.title.length > 0)
|
106
|
-
assert_not_nil (response.title.index("#{response.location.city}, #{response.location.region}"))
|
107
|
-
end
|
108
|
-
|
109
|
-
def _assert_valid_weather_code (code)
|
110
|
-
(((code >= 0) && (code <= 47)) || (code == 3200))
|
111
|
-
end
|
112
|
-
|
113
|
-
def _assert_valid_units (units, fahrenheit_based)
|
114
|
-
assert_instance_of YahooWeather::Units, units
|
115
|
-
if fahrenheit_based
|
116
|
-
assert_equal units.temperature, 'F'
|
117
|
-
assert_equal units.distance, 'mi'
|
118
|
-
assert_equal units.pressure, 'in'
|
119
|
-
assert_equal units.speed, 'mph'
|
120
|
-
|
121
|
-
else
|
122
|
-
assert_equal units.temperature, 'C'
|
123
|
-
assert_equal units.distance, 'km'
|
124
|
-
assert_equal units.pressure, 'mb'
|
125
|
-
assert_equal units.speed, 'kph'
|
129
|
+
|
130
|
+
def _assert_valid_weather_code (code)
|
131
|
+
(((code >= 0) && (code <= 47)) || (code == 3200))
|
126
132
|
end
|
127
|
-
|
133
|
+
|
134
|
+
def _assert_valid_units (units, fahrenheit_based)
|
135
|
+
assert_instance_of YahooWeather::Units, units
|
136
|
+
if fahrenheit_based
|
137
|
+
assert_equal units.temperature, 'F'
|
138
|
+
assert_equal units.distance, 'mi'
|
139
|
+
assert_equal units.pressure, 'in'
|
140
|
+
assert_equal units.speed, 'mph'
|
141
|
+
|
142
|
+
else
|
143
|
+
assert_equal units.temperature, 'C'
|
144
|
+
assert_equal units.distance, 'km'
|
145
|
+
assert_equal units.pressure, 'mb'
|
146
|
+
assert_equal units.speed, 'km/h'
|
147
|
+
end
|
148
|
+
end
|
149
|
+
|
128
150
|
end
|