yahoo_weatherman_extended 1.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/i18n/pt-br.yml +62 -0
- data/lib/yahoo_weatherman.rb +69 -0
- data/lib/yahoo_weatherman/i18n.rb +58 -0
- data/lib/yahoo_weatherman/image.rb +16 -0
- data/lib/yahoo_weatherman/response.rb +201 -0
- data/spec/files/belo_horizonte_c.rss +49 -0
- data/spec/files/belo_horizonte_f.rss +49 -0
- data/spec/spec_helper.rb +36 -0
- data/spec/yahoo_weatherman/i18n_spec.rb +27 -0
- data/spec/yahoo_weatherman/response_spec.rb +117 -0
- data/spec/yahoo_weatherman/yahoo_weatherman_spec.rb +13 -0
- data/yahoo_weatherman.gemspec +22 -0
- metadata +61 -0
data/i18n/pt-br.yml
ADDED
@@ -0,0 +1,62 @@
|
|
1
|
+
0: Tornado
|
2
|
+
1: Tempestade Tropical
|
3
|
+
2: Furacão
|
4
|
+
3: Tempestades Severas
|
5
|
+
4: Tempestades
|
6
|
+
5: Chuva com Neve
|
7
|
+
6: Chuva com Granizo
|
8
|
+
7: Chova com Neve e Granizo
|
9
|
+
8: Geada
|
10
|
+
9: Garoa
|
11
|
+
10: Geada
|
12
|
+
11: Chuva
|
13
|
+
12: Chuva
|
14
|
+
13: Flocos de Neve
|
15
|
+
14: Neve Calma
|
16
|
+
15: Nevasca
|
17
|
+
16: Neve
|
18
|
+
17: Granizo
|
19
|
+
18: Granizo
|
20
|
+
19: Poeira
|
21
|
+
20: Neblina
|
22
|
+
21: Nevoeiro
|
23
|
+
22: Nevoeiro
|
24
|
+
23: Tempestuoso
|
25
|
+
24: Ventoso
|
26
|
+
25: Frio
|
27
|
+
26: Nublado
|
28
|
+
27: Predominantemente Nublado (noite)
|
29
|
+
28: Predominantemente Nublado
|
30
|
+
29: Parcialmente Nublado (noite)
|
31
|
+
30: Parcialmente Nublado
|
32
|
+
31: Céu Limpo
|
33
|
+
32: Ensolarado
|
34
|
+
33: Limpo
|
35
|
+
34: Limpo
|
36
|
+
35: Misto de Chuva e Granizo
|
37
|
+
36: Quente
|
38
|
+
37: Tempestades Isoladas
|
39
|
+
38: Tempestades Intermitentes
|
40
|
+
39: Tempestades Intermitentes
|
41
|
+
40: Chuvas Intermitentes
|
42
|
+
41: Bastante Neve
|
43
|
+
42: Neve
|
44
|
+
43: Bastante Neve
|
45
|
+
44: Parcialmente Nublado
|
46
|
+
45: Tempestade
|
47
|
+
46: Neve
|
48
|
+
47: Chuvas Isoladas
|
49
|
+
3200: Não Disponível
|
50
|
+
|
51
|
+
locations:
|
52
|
+
Brazil: Brasil
|
53
|
+
|
54
|
+
forecasts:
|
55
|
+
days:
|
56
|
+
Mon: Segunda-feira
|
57
|
+
Tue: Terça-feira
|
58
|
+
Wed: Quarta-feira
|
59
|
+
Thu: Quinta-feira
|
60
|
+
Fri: Sexta-feira
|
61
|
+
Sat: Sábado
|
62
|
+
Sun: Domingo
|
@@ -0,0 +1,69 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
path = File.expand_path(File.dirname(__FILE__))
|
3
|
+
$LOAD_PATH.unshift(path) unless $LOAD_PATH.include?(path)
|
4
|
+
|
5
|
+
require 'rubygems'
|
6
|
+
|
7
|
+
require 'yaml'
|
8
|
+
require 'open-uri'
|
9
|
+
require 'nokogiri'
|
10
|
+
|
11
|
+
require 'yahoo_weatherman/i18n'
|
12
|
+
require 'yahoo_weatherman/image'
|
13
|
+
require 'yahoo_weatherman/response'
|
14
|
+
|
15
|
+
module Weatherman
|
16
|
+
|
17
|
+
VERSION = '1.0.3'
|
18
|
+
|
19
|
+
URI = 'http://weather.yahooapis.com/forecastrss'
|
20
|
+
|
21
|
+
# = Client
|
22
|
+
#
|
23
|
+
# The weatherman client. Where it all begins.
|
24
|
+
#
|
25
|
+
class Client
|
26
|
+
attr_reader :options
|
27
|
+
|
28
|
+
#
|
29
|
+
# Accepts a optional hash containing the client options.
|
30
|
+
#
|
31
|
+
# Options:
|
32
|
+
#
|
33
|
+
# +unit+: the unit used for the temperature (defaults to Celsius).
|
34
|
+
# "f" => Fahrenheight
|
35
|
+
# "c" => Celsius
|
36
|
+
#
|
37
|
+
# +lang+: the language used in the response
|
38
|
+
#
|
39
|
+
def initialize(options = {})
|
40
|
+
@options = options
|
41
|
+
@uri = options[:url] || URI
|
42
|
+
end
|
43
|
+
|
44
|
+
#
|
45
|
+
# Just pass in a +woeid+ and it will return a Weatherman::Response object:w
|
46
|
+
#
|
47
|
+
def lookup_by_city_code(city_code)
|
48
|
+
raw = get request_url(city_code)
|
49
|
+
Response.new(raw, options[:lang])
|
50
|
+
end
|
51
|
+
|
52
|
+
private
|
53
|
+
def request_url(city_code)
|
54
|
+
@uri + query_string(city_code)
|
55
|
+
end
|
56
|
+
|
57
|
+
def query_string(city_code)
|
58
|
+
"?p=#{city_code}&u=#{degrees_units}"
|
59
|
+
end
|
60
|
+
|
61
|
+
def degrees_units
|
62
|
+
(options[:unit] || 'c').downcase
|
63
|
+
end
|
64
|
+
|
65
|
+
def get(url)
|
66
|
+
open(url) { |stream| stream.read }
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
module Weatherman
|
3
|
+
class I18N
|
4
|
+
I18N_YAML_DIR = File.expand_path(File.join(File.dirname(__FILE__), '..', '..', 'i18n'))
|
5
|
+
|
6
|
+
LANGUAGES = {}
|
7
|
+
|
8
|
+
attr_accessor :language
|
9
|
+
|
10
|
+
def initialize(language)
|
11
|
+
@language = language
|
12
|
+
end
|
13
|
+
|
14
|
+
def translate!(attributes)
|
15
|
+
if i18n?
|
16
|
+
translate_text! attributes
|
17
|
+
translate_days! attributes
|
18
|
+
translate_locations! attributes
|
19
|
+
end
|
20
|
+
attributes
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
def translate_text!(attributes)
|
25
|
+
translate_attribute('text', attributes, language_translations, 'code')
|
26
|
+
end
|
27
|
+
|
28
|
+
def translate_days!(attributes)
|
29
|
+
translate_attribute('day', attributes, language_translations['forecasts']['days'])
|
30
|
+
end
|
31
|
+
|
32
|
+
def translate_locations!(attributes)
|
33
|
+
(%w(city country region) & attributes.keys).each do |key|
|
34
|
+
translate_attribute(key, attributes, language_translations['locations'])
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def translate_attribute(name, attributes, translations, change_by = nil)
|
39
|
+
translation_key = attributes[(change_by || name)]
|
40
|
+
|
41
|
+
if attributes[name] and translations[translation_key]
|
42
|
+
attributes[name] = translations[translation_key]
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def language_translations
|
47
|
+
LANGUAGES[language] ||= load_language_yaml!
|
48
|
+
end
|
49
|
+
|
50
|
+
def load_language_yaml!
|
51
|
+
YAML::load File.read(File.join(I18N_YAML_DIR, language + '.yml'))
|
52
|
+
end
|
53
|
+
|
54
|
+
def i18n?
|
55
|
+
!!@language
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
module Weatherman
|
3
|
+
# == Image
|
4
|
+
#
|
5
|
+
# A hash-like object with the weather image attributes (width, height, url, etc..)
|
6
|
+
#
|
7
|
+
class Image
|
8
|
+
def initialize(doc)
|
9
|
+
@image_root = doc
|
10
|
+
end
|
11
|
+
|
12
|
+
def [](attr)
|
13
|
+
@image_root.xpath(attr).first.content
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,201 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
module Weatherman
|
3
|
+
|
4
|
+
# = Response
|
5
|
+
#
|
6
|
+
# This is where we get access to the contents parsed by Nokogiri in a object-oriented way.
|
7
|
+
# We also use this class to do the i18n stuff.
|
8
|
+
#
|
9
|
+
class Response
|
10
|
+
|
11
|
+
attr_accessor :document_root
|
12
|
+
|
13
|
+
def initialize(raw, language = nil)
|
14
|
+
@document_root = Nokogiri::XML(raw).xpath('rss/channel')
|
15
|
+
@i18n = Weatherman::I18N.new(language)
|
16
|
+
end
|
17
|
+
|
18
|
+
#
|
19
|
+
# Returns a hash containing the actual weather condition details:
|
20
|
+
#
|
21
|
+
# condition = response.condition
|
22
|
+
# condition['text'] => "Tornado"
|
23
|
+
# condition['code'] => 0
|
24
|
+
# condition['temp'] => 21
|
25
|
+
# condition['date'] => #<Date: -1/2,0,2299161>
|
26
|
+
#
|
27
|
+
def condition
|
28
|
+
condition = item_attribute('yweather:condition')
|
29
|
+
translate! do_convertions(condition, [:code, :to_i], [:temp, :to_i], [:date, :to_date], :text)
|
30
|
+
end
|
31
|
+
|
32
|
+
#
|
33
|
+
# Wind's details:
|
34
|
+
#
|
35
|
+
# wind = response.wind
|
36
|
+
# wind['chill'] => 21
|
37
|
+
# wind['direction'] => 340
|
38
|
+
# wind['chill'] => 9.66
|
39
|
+
#
|
40
|
+
def wind
|
41
|
+
do_convertions(attribute('yweather:wind'), [:chill, :to_i], [:direction, :to_i], [:speed, :to_f])
|
42
|
+
end
|
43
|
+
|
44
|
+
#
|
45
|
+
# Forecasts for the next 2 days.
|
46
|
+
#
|
47
|
+
# forecast = response.forecasts.first
|
48
|
+
# forecast['low'] => 20
|
49
|
+
# forecast['high'] => 31
|
50
|
+
# forecast['text'] => "Tornado"
|
51
|
+
# forecast['code'] => 0
|
52
|
+
# forecast['day'] => "Sat"
|
53
|
+
#
|
54
|
+
def forecasts
|
55
|
+
convertions = [[:date, :to_date], [:low, :to_i], [:high, :to_i], [:code, :to_i], :day, :text]
|
56
|
+
item_attribute('yweather:forecast').collect do |forecast|
|
57
|
+
translate! do_convertions(forecast, *convertions)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
#
|
62
|
+
# Location:
|
63
|
+
#
|
64
|
+
# location = response.location
|
65
|
+
# location['country'] => "Brazil"
|
66
|
+
# location['region'] => "MG"
|
67
|
+
# location['city'] => Belo Horizonte
|
68
|
+
#
|
69
|
+
def location
|
70
|
+
translate! attribute('yweather:location')
|
71
|
+
end
|
72
|
+
|
73
|
+
# Units:
|
74
|
+
#
|
75
|
+
# units = response.units
|
76
|
+
# units['temperature'] => "C"
|
77
|
+
# units['distance'] => "km"
|
78
|
+
# units['pressure'] => "mb"
|
79
|
+
# units['speed'] => "km/h"
|
80
|
+
#
|
81
|
+
def units
|
82
|
+
attribute('yweather:units')
|
83
|
+
end
|
84
|
+
|
85
|
+
#
|
86
|
+
# Astronomy:
|
87
|
+
#
|
88
|
+
# astronomy = response.astronomy
|
89
|
+
# astronomy['sunrise'] => "6:01 am"
|
90
|
+
# astronomy['sunset'] => "7:20 pm"
|
91
|
+
#
|
92
|
+
def astronomy
|
93
|
+
attribute('yweather:astronomy')
|
94
|
+
end
|
95
|
+
|
96
|
+
#
|
97
|
+
# Atmosphere :
|
98
|
+
#
|
99
|
+
# atmosphere = response.atmosphere
|
100
|
+
# atmosphere['humidity'] => "62"
|
101
|
+
# atmosphere['visibility'] => "9.99"
|
102
|
+
# atmosphere['pressure'] => "982.05"
|
103
|
+
# atmosphere['rising'] => "0"
|
104
|
+
#
|
105
|
+
def atmosphere
|
106
|
+
atm = attribute('yweather:atmosphere')
|
107
|
+
do_convertions(atm, [:humidity, :to_f], [:visibility, :to_f], [:pressure, :to_f], [:rising, :to_f])
|
108
|
+
end
|
109
|
+
|
110
|
+
#
|
111
|
+
# Latitude:
|
112
|
+
#
|
113
|
+
# response.latitude => -49.90
|
114
|
+
def latitude
|
115
|
+
geo_attribute('lat')
|
116
|
+
end
|
117
|
+
|
118
|
+
#
|
119
|
+
# Longitude;
|
120
|
+
#
|
121
|
+
# response.longitude => -45.32
|
122
|
+
#
|
123
|
+
def longitude
|
124
|
+
geo_attribute('long')
|
125
|
+
end
|
126
|
+
|
127
|
+
#
|
128
|
+
# A hash like object providing image info:
|
129
|
+
#
|
130
|
+
# image = reponse.image
|
131
|
+
# image['width'] => 142
|
132
|
+
# image['height'] => 18
|
133
|
+
# image['title'] => "Yahoo! Weather"
|
134
|
+
# image['link'] => "http://weather.yahoo.com"
|
135
|
+
#
|
136
|
+
def image
|
137
|
+
image = Weatherman::Image.new(attribute('image'))
|
138
|
+
do_convertions(image, [:width, :to_i], [:height, :to_i], :title, :link, :url)
|
139
|
+
end
|
140
|
+
|
141
|
+
#
|
142
|
+
# Description image. You might gonna need this if you have to customize the
|
143
|
+
# forecast summary.
|
144
|
+
#
|
145
|
+
def description_image
|
146
|
+
parsed_description.css('img').first # there's only one
|
147
|
+
end
|
148
|
+
|
149
|
+
#
|
150
|
+
# A short HTML snippet (raw text) with a simple weather description.
|
151
|
+
#
|
152
|
+
def description
|
153
|
+
text_attribute('description')
|
154
|
+
end
|
155
|
+
alias :summary :description
|
156
|
+
|
157
|
+
#
|
158
|
+
# Description parsed by Nokogiri. This is better then #description
|
159
|
+
# if you have to walk through its nodes.
|
160
|
+
#
|
161
|
+
def parsed_description
|
162
|
+
@parsed_description ||= Nokogiri::HTML(description)
|
163
|
+
end
|
164
|
+
|
165
|
+
private
|
166
|
+
def attribute(attr, root = @document_root)
|
167
|
+
elements = root.xpath(attr)
|
168
|
+
elements.size == 1 ? elements.first : elements
|
169
|
+
end
|
170
|
+
|
171
|
+
def item_attribute(attr)
|
172
|
+
attribute(attr, document_root.xpath('item').first)
|
173
|
+
end
|
174
|
+
|
175
|
+
def geo_attribute(attr)
|
176
|
+
item_attribute('geo:' + attr).children.first.text.to_f
|
177
|
+
end
|
178
|
+
|
179
|
+
def text_attribute(attr)
|
180
|
+
item_attribute(attr).content
|
181
|
+
end
|
182
|
+
|
183
|
+
def do_convertions(attributes, *pairs)
|
184
|
+
pairs.inject({}) do |hash, (attr, method)|
|
185
|
+
key = attr.to_s
|
186
|
+
hash[key] = convert(attributes[key], method)
|
187
|
+
hash
|
188
|
+
end
|
189
|
+
end
|
190
|
+
|
191
|
+
def convert(value, method)
|
192
|
+
return value unless method
|
193
|
+
method == :to_date ? Date.parse(value) : value.send(method)
|
194
|
+
end
|
195
|
+
|
196
|
+
def translate!(attributes)
|
197
|
+
@i18n.translate! attributes
|
198
|
+
end
|
199
|
+
end
|
200
|
+
end
|
201
|
+
|
@@ -0,0 +1,49 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
|
2
|
+
<rss version="2.0" xmlns:yweather="http://xml.weather.yahoo.com/ns/rss/1.0" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#">
|
3
|
+
<channel>
|
4
|
+
|
5
|
+
<title>Yahoo! Weather - Belo Horizonte, BR</title>
|
6
|
+
<link>http://us.rd.yahoo.com/dailynews/rss/weather/Belo_Horizonte__BR/*http://weather.yahoo.com/forecast/BRXX0033_c.html</link>
|
7
|
+
<description>Yahoo! Weather for Belo Horizonte, BR</description>
|
8
|
+
<language>en-us</language>
|
9
|
+
<lastBuildDate>Sat, 13 Mar 2010 6:00 pm LST</lastBuildDate>
|
10
|
+
<ttl>60</ttl>
|
11
|
+
<yweather:location city="Belo Horizonte" region="MG" country="Brazil"/>
|
12
|
+
|
13
|
+
<yweather:units temperature="C" distance="km" pressure="mb" speed="km/h"/>
|
14
|
+
<yweather:wind chill="28" direction="340" speed="9.66" />
|
15
|
+
<yweather:atmosphere humidity="62" visibility="9.99" pressure="982.05" rising="0" />
|
16
|
+
<yweather:astronomy sunrise="5:57 am" sunset="6:13 pm"/>
|
17
|
+
<image>
|
18
|
+
<title>Yahoo! Weather</title>
|
19
|
+
<width>142</width>
|
20
|
+
<height>18</height>
|
21
|
+
<link>http://weather.yahoo.com</link>
|
22
|
+
<url>http://l.yimg.com/a/i/us/nws/th/main_142b.gif</url>
|
23
|
+
</image>
|
24
|
+
<item>
|
25
|
+
|
26
|
+
<title>Conditions for Belo Horizonte, BR at 6:00 pm LST</title>
|
27
|
+
<geo:lat>-19.95</geo:lat>
|
28
|
+
<geo:long>-43.93</geo:long>
|
29
|
+
<link>http://us.rd.yahoo.com/dailynews/rss/weather/Belo_Horizonte__BR/*http://weather.yahoo.com/forecast/BRXX0033_c.html</link>
|
30
|
+
<pubDate>Sat, 13 Mar 2010 6:00 pm LST</pubDate>
|
31
|
+
<yweather:condition text="Mostly Cloudy" code="28" temp="28" date="Sat, 13 Mar 2010 6:00 pm LST" />
|
32
|
+
<description><![CDATA[
|
33
|
+
<img src="http://l.yimg.com/a/i/us/we/52/28.gif"/><br />
|
34
|
+
<b>Current Conditions:</b><br />
|
35
|
+
Mostly Cloudy, 28 C<BR />
|
36
|
+
<BR /><b>Forecast:</b><BR />
|
37
|
+
Sat - Showers. High: 27 Low: 18<br />
|
38
|
+
Sun - Scattered Thunderstorms. High: 27 Low: 18<br />
|
39
|
+
<br />
|
40
|
+
<a href="http://us.rd.yahoo.com/dailynews/rss/weather/Belo_Horizonte__BR/*http://weather.yahoo.com/forecast/BRXX0033_c.html">Full Forecast at Yahoo! Weather</a><BR/><BR/>
|
41
|
+
(provided by <a href="http://www.weather.com" >The Weather Channel</a>)<br/>
|
42
|
+
]]></description>
|
43
|
+
<yweather:forecast day="Sat" date="13 Mar 2010" low="18" high="27" text="Showers" code="11" />
|
44
|
+
<yweather:forecast day="Sun" date="14 Mar 2010" low="18" high="27" text="Scattered Thunderstorms" code="38" />
|
45
|
+
<guid isPermaLink="false">BRXX0033_2010_03_13_18_00_LST</guid>
|
46
|
+
</item>
|
47
|
+
|
48
|
+
</channel>
|
49
|
+
</rss><!-- api5.weather.ac4.yahoo.com compressed/chunked Sat Mar 13 14:29:51 PST 2010 -->
|
@@ -0,0 +1,49 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
|
2
|
+
<rss version="2.0" xmlns:yweather="http://xml.weather.yahoo.com/ns/rss/1.0" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#">
|
3
|
+
<channel>
|
4
|
+
|
5
|
+
<title>Yahoo! Weather - Belo Horizonte, BR</title>
|
6
|
+
<link>http://us.rd.yahoo.com/dailynews/rss/weather/Belo_Horizonte__BR/*http://weather.yahoo.com/forecast/BRXX0033_f.html</link>
|
7
|
+
<description>Yahoo! Weather for Belo Horizonte, BR</description>
|
8
|
+
<language>en-us</language>
|
9
|
+
<lastBuildDate>Thu, 18 Mar 2010 12:00 am LST</lastBuildDate>
|
10
|
+
<ttl>60</ttl>
|
11
|
+
<yweather:location city="Belo Horizonte" region="MG" country="Brazil"/>
|
12
|
+
|
13
|
+
<yweather:units temperature="F" distance="mi" pressure="in" speed="mph"/>
|
14
|
+
<yweather:wind chill="66" direction="100" speed="2" />
|
15
|
+
<yweather:atmosphere humidity="88" visibility="6.21" pressure="30.15" rising="0" />
|
16
|
+
<yweather:astronomy sunrise="5:59 am" sunset="6:08 pm"/>
|
17
|
+
<image>
|
18
|
+
<title>Yahoo! Weather</title>
|
19
|
+
<width>142</width>
|
20
|
+
<height>18</height>
|
21
|
+
<link>http://weather.yahoo.com</link>
|
22
|
+
<url>http://l.yimg.com/a/i/us/nws/th/main_142b.gif</url>
|
23
|
+
</image>
|
24
|
+
<item>
|
25
|
+
|
26
|
+
<title>Conditions for Belo Horizonte, BR at 12:00 am LST</title>
|
27
|
+
<geo:lat>-19.95</geo:lat>
|
28
|
+
<geo:long>-43.93</geo:long>
|
29
|
+
<link>http://us.rd.yahoo.com/dailynews/rss/weather/Belo_Horizonte__BR/*http://weather.yahoo.com/forecast/BRXX0033_f.html</link>
|
30
|
+
<pubDate>Thu, 18 Mar 2010 12:00 am LST</pubDate>
|
31
|
+
<yweather:condition text="Fair" code="33" temp="66" date="Thu, 18 Mar 2010 12:00 am LST" />
|
32
|
+
<description><![CDATA[
|
33
|
+
<img src="http://l.yimg.com/a/i/us/we/52/33.gif"/><br />
|
34
|
+
<b>Current Conditions:</b><br />
|
35
|
+
Fair, 66 F<BR />
|
36
|
+
<BR /><b>Forecast:</b><BR />
|
37
|
+
Thu - Showers. High: 75 Low: 63<br />
|
38
|
+
Fri - Scattered Thunderstorms. High: 79 Low: 63<br />
|
39
|
+
<br />
|
40
|
+
<a href="http://us.rd.yahoo.com/dailynews/rss/weather/Belo_Horizonte__BR/*http://weather.yahoo.com/forecast/BRXX0033_f.html">Full Forecast at Yahoo! Weather</a><BR/><BR/>
|
41
|
+
(provided by <a href="http://www.weather.com" >The Weather Channel</a>)<br/>
|
42
|
+
]]></description>
|
43
|
+
<yweather:forecast day="Thu" date="18 Mar 2010" low="63" high="75" text="Showers" code="11" />
|
44
|
+
<yweather:forecast day="Fri" date="19 Mar 2010" low="63" high="79" text="Scattered Thunderstorms" code="38" />
|
45
|
+
<guid isPermaLink="false">BRXX0033_2010_03_18_0_00_LST</guid>
|
46
|
+
</item>
|
47
|
+
|
48
|
+
</channel>
|
49
|
+
</rss>
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
path = File.expand_path(File.join([File.dirname(__FILE__), "..", "lib"]))
|
2
|
+
$LOAD_PATH.unshift(path) unless $LOAD_PATH.include?(path)
|
3
|
+
|
4
|
+
require 'rubygems'
|
5
|
+
require 'fakeweb'
|
6
|
+
require 'yahoo_weatherman'
|
7
|
+
require 'spec'
|
8
|
+
|
9
|
+
def celsius_fixture
|
10
|
+
filepath = File.expand_path(File.join([File.dirname(__FILE__), "files", "belo_horizonte_c.rss"]))
|
11
|
+
File.read filepath
|
12
|
+
end
|
13
|
+
|
14
|
+
def fahrenheight_fixture
|
15
|
+
filepath = File.expand_path(File.join([File.dirname(__FILE__), "files", "belo_horizonte_f.rss"]))
|
16
|
+
File.read filepath
|
17
|
+
end
|
18
|
+
|
19
|
+
FakeWeb.allow_net_connect = false
|
20
|
+
FakeWeb.register_uri(:get, "http://weather.yahooapis.com/forecastrss?w=455821&u=c", :body => celsius_fixture)
|
21
|
+
FakeWeb.register_uri(:get, "http://weather.yahooapis.com/forecastrss?w=455821&u=f", :body => fahrenheight_fixture)
|
22
|
+
|
23
|
+
module YAML
|
24
|
+
class << self
|
25
|
+
|
26
|
+
alias original_load load
|
27
|
+
def load(ignored_arg)
|
28
|
+
original_load(test_translation_file_stream)
|
29
|
+
end
|
30
|
+
|
31
|
+
def test_translation_file_stream
|
32
|
+
File.read(File.join([File.dirname(__FILE__), 'files', 'test_i18n.yml']))
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
require 'spec_helper'
|
3
|
+
|
4
|
+
describe Weatherman::I18N do
|
5
|
+
before do
|
6
|
+
@response = Weatherman::Client.new(:lang => 'pt-br').lookup_by_woeid 455821
|
7
|
+
end
|
8
|
+
|
9
|
+
it 'should translate the conditions details' do
|
10
|
+
@response.condition['text'].should == 'Predominantemente Nublado'
|
11
|
+
end
|
12
|
+
|
13
|
+
it 'should translate the location details' do
|
14
|
+
@response.location['country'].should == 'Brasil'
|
15
|
+
@response.location['city'].should == 'Santa Luzia'
|
16
|
+
@response.location['region'].should == 'Minas Gerais'
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'should translate the forecasts details' do
|
20
|
+
@response.forecasts.first['text'].should == 'Chuva'
|
21
|
+
@response.forecasts.last['text'].should == 'Tempestades Intermitentes'
|
22
|
+
@response.forecasts.first['day'].should == 'Sábado'
|
23
|
+
@response.forecasts.last['day'].should == 'Domingo'
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
|
@@ -0,0 +1,117 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
require 'spec_helper'
|
3
|
+
|
4
|
+
describe Weatherman::Response do
|
5
|
+
before do
|
6
|
+
@response = Weatherman::Client.new.lookup_by_woeid 455821
|
7
|
+
end
|
8
|
+
|
9
|
+
it 'should provide a location' do
|
10
|
+
@response.location['city'].should == 'Belo Horizonte'
|
11
|
+
@response.location['region'].should == 'MG'
|
12
|
+
@response.location['country'].should == 'Brazil'
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'should provide a weather condition' do
|
16
|
+
@response.condition['code'].should == 28
|
17
|
+
@response.condition['temp'].should == 28
|
18
|
+
@response.condition['text'].should == 'Mostly Cloudy'
|
19
|
+
@response.condition['date'].should == Date.parse('Sat, 13 Mar 2010 11:00 pm LST')
|
20
|
+
end
|
21
|
+
|
22
|
+
it 'should provide the units used' do
|
23
|
+
@response.units['temperature'].should == 'C'
|
24
|
+
@response.units['distance'].should == 'km'
|
25
|
+
@response.units['pressure'].should == 'mb'
|
26
|
+
@response.units['speed'].should == 'km/h'
|
27
|
+
end
|
28
|
+
|
29
|
+
it 'should provide information about the wind' do
|
30
|
+
@response.wind['chill'].should == 28
|
31
|
+
@response.wind['direction'].should == 340
|
32
|
+
@response.wind['speed'].should == 9.66
|
33
|
+
end
|
34
|
+
|
35
|
+
it 'should provide astronomy information' do
|
36
|
+
@response.astronomy['sunrise'].should == '5:57 am'
|
37
|
+
@response.astronomy['sunset'].should == '6:13 pm'
|
38
|
+
end
|
39
|
+
|
40
|
+
it 'should provide atmosphere information' do
|
41
|
+
@response.atmosphere['humidity'].should == 62
|
42
|
+
@response.atmosphere['visibility'].should == 9.99
|
43
|
+
@response.atmosphere['pressure'].should == 982.05
|
44
|
+
@response.atmosphere['rising'].should be_zero
|
45
|
+
end
|
46
|
+
|
47
|
+
it 'should get the next 2 forecasts' do
|
48
|
+
first = @response.forecasts.first
|
49
|
+
first['day'].should == 'Sat'
|
50
|
+
first['date'].should == Date.parse('13 Mar 2010')
|
51
|
+
first['low'].should == 18
|
52
|
+
first['high'].should == 27
|
53
|
+
first['text'].should == 'Showers'
|
54
|
+
first['code'].should == 11
|
55
|
+
|
56
|
+
last = @response.forecasts.last
|
57
|
+
last['day'].should == 'Sun'
|
58
|
+
last['date'].should == Date.parse('14 Mar 2010')
|
59
|
+
last['low'].should == 18
|
60
|
+
last['high'].should == 27
|
61
|
+
last['text'].should == 'Scattered Thunderstorms'
|
62
|
+
last['code'].should == 38
|
63
|
+
end
|
64
|
+
|
65
|
+
it 'should provide latitude and longitude' do
|
66
|
+
@response.latitude.should == -19.95
|
67
|
+
@response.longitude.should == -43.93
|
68
|
+
end
|
69
|
+
|
70
|
+
it 'should provide a description' do
|
71
|
+
description = <<-DESCRIPTION
|
72
|
+
|
73
|
+
<img src="http://l.yimg.com/a/i/us/we/52/28.gif"/><br />
|
74
|
+
<b>Current Conditions:</b><br />
|
75
|
+
Mostly Cloudy, 28 C<BR />
|
76
|
+
<BR /><b>Forecast:</b><BR />
|
77
|
+
Sat - Showers. High: 27 Low: 18<br />
|
78
|
+
Sun - Scattered Thunderstorms. High: 27 Low: 18<br />
|
79
|
+
<br />
|
80
|
+
<a href="http://us.rd.yahoo.com/dailynews/rss/weather/Belo_Horizonte__BR/*http://weather.yahoo.com/forecast/BRXX0033_c.html">Full Forecast at Yahoo! Weather</a><BR/><BR/>
|
81
|
+
(provided by <a href="http://www.weather.com" >The Weather Channel</a>)<br/>
|
82
|
+
DESCRIPTION
|
83
|
+
|
84
|
+
@response.description.should == description
|
85
|
+
@response.description.should == @response.summary
|
86
|
+
end
|
87
|
+
|
88
|
+
it 'should provide the weather image attributes' do
|
89
|
+
image = @response.image
|
90
|
+
image['width'].should == 142
|
91
|
+
image['height'].should == 18
|
92
|
+
image['title'].should == 'Yahoo! Weather'
|
93
|
+
image['link'].should == 'http://weather.yahoo.com'
|
94
|
+
image['url'].should == 'http://l.yimg.com/a/i/us/nws/th/main_142b.gif'
|
95
|
+
end
|
96
|
+
|
97
|
+
it 'should provide the forecast description icon' do
|
98
|
+
image = @response.description_image
|
99
|
+
image['src'].should == 'http://l.yimg.com/a/i/us/we/52/28.gif'
|
100
|
+
end
|
101
|
+
|
102
|
+
context 'using fahrenheiht as temperature unit' do
|
103
|
+
|
104
|
+
it 'should return the temperature as fahrenheight' do
|
105
|
+
client = Weatherman::Client.new :unit => 'F'
|
106
|
+
response = client.lookup_by_woeid 455821
|
107
|
+
|
108
|
+
response.units['temperature'].should == 'F'
|
109
|
+
response.forecasts.first['low'].should == 63
|
110
|
+
response.forecasts.last['low'].should == 63
|
111
|
+
response.forecasts.first['high'].should == 75
|
112
|
+
response.forecasts.last['high'].should == 79
|
113
|
+
response.condition['temp'].should == 66
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Weatherman::Client do
|
4
|
+
before do
|
5
|
+
@client = Weatherman::Client.new
|
6
|
+
end
|
7
|
+
|
8
|
+
it 'should lookup by woeid' do
|
9
|
+
response = @client.lookup_by_woeid 455821
|
10
|
+
response.should be_instance_of(Weatherman::Response)
|
11
|
+
end
|
12
|
+
|
13
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
Gem::Specification.new do |gem|
|
2
|
+
gem.name = "yahoo_weatherman_extended"
|
3
|
+
gem.version = "1.2.0"
|
4
|
+
gem.authors = ["Dalto Curvelano Junior", "Mahmoud Said"]
|
5
|
+
gem.description = "a fork of leandroo/yahoo_weatherman, A ruby wrapper to the Yahoo! Weather feed with i18n support, to handle the updated parameters for yahoo weather service parameters."
|
6
|
+
gem.summary = "A ruby wrapper to the Yahoo! Weather feed with i18n support."
|
7
|
+
gem.files = [
|
8
|
+
"yahoo_weatherman.gemspec",
|
9
|
+
"lib/yahoo_weatherman/image.rb",
|
10
|
+
"lib/yahoo_weatherman/response.rb",
|
11
|
+
"lib/yahoo_weatherman/i18n.rb",
|
12
|
+
"lib/yahoo_weatherman.rb",
|
13
|
+
"i18n/pt-br.yml",
|
14
|
+
"spec/files/belo_horizonte_c.rss",
|
15
|
+
"spec/files/belo_horizonte_f.rss",
|
16
|
+
"spec/spec_helper.rb",
|
17
|
+
"spec/yahoo_weatherman/response_spec.rb",
|
18
|
+
"spec/yahoo_weatherman/yahoo_weatherman_spec.rb",
|
19
|
+
"spec/yahoo_weatherman/i18n_spec.rb"
|
20
|
+
]
|
21
|
+
gem.homepage = "http://github.com/modsaid/yahoo_weatherman"
|
22
|
+
end
|
metadata
ADDED
@@ -0,0 +1,61 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: yahoo_weatherman_extended
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.2.0
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Dalto Curvelano Junior
|
9
|
+
- Mahmoud Said
|
10
|
+
autorequire:
|
11
|
+
bindir: bin
|
12
|
+
cert_chain: []
|
13
|
+
date: 2011-05-09 00:00:00.000000000 +02:00
|
14
|
+
default_executable:
|
15
|
+
dependencies: []
|
16
|
+
description: a fork of leandroo/yahoo_weatherman, A ruby wrapper to the Yahoo! Weather
|
17
|
+
feed with i18n support, to handle the updated parameters for yahoo weather service
|
18
|
+
parameters.
|
19
|
+
email:
|
20
|
+
executables: []
|
21
|
+
extensions: []
|
22
|
+
extra_rdoc_files: []
|
23
|
+
files:
|
24
|
+
- yahoo_weatherman.gemspec
|
25
|
+
- lib/yahoo_weatherman/image.rb
|
26
|
+
- lib/yahoo_weatherman/response.rb
|
27
|
+
- lib/yahoo_weatherman/i18n.rb
|
28
|
+
- lib/yahoo_weatherman.rb
|
29
|
+
- i18n/pt-br.yml
|
30
|
+
- spec/files/belo_horizonte_c.rss
|
31
|
+
- spec/files/belo_horizonte_f.rss
|
32
|
+
- spec/spec_helper.rb
|
33
|
+
- spec/yahoo_weatherman/response_spec.rb
|
34
|
+
- spec/yahoo_weatherman/yahoo_weatherman_spec.rb
|
35
|
+
- spec/yahoo_weatherman/i18n_spec.rb
|
36
|
+
has_rdoc: true
|
37
|
+
homepage: http://github.com/modsaid/yahoo_weatherman
|
38
|
+
licenses: []
|
39
|
+
post_install_message:
|
40
|
+
rdoc_options: []
|
41
|
+
require_paths:
|
42
|
+
- lib
|
43
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
44
|
+
none: false
|
45
|
+
requirements:
|
46
|
+
- - ! '>='
|
47
|
+
- !ruby/object:Gem::Version
|
48
|
+
version: '0'
|
49
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
50
|
+
none: false
|
51
|
+
requirements:
|
52
|
+
- - ! '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
requirements: []
|
56
|
+
rubyforge_project:
|
57
|
+
rubygems_version: 1.6.2
|
58
|
+
signing_key:
|
59
|
+
specification_version: 3
|
60
|
+
summary: A ruby wrapper to the Yahoo! Weather feed with i18n support.
|
61
|
+
test_files: []
|