rubyweather 0.9.1 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README +65 -52
- data/example/forecast.rhtml +26 -0
- data/example/weather_32/0.png +0 -0
- data/example/weather_32/1.png +0 -0
- data/example/weather_32/10.png +0 -0
- data/example/weather_32/11.png +0 -0
- data/example/weather_32/12.png +0 -0
- data/example/weather_32/13.png +0 -0
- data/example/weather_32/14.png +0 -0
- data/example/weather_32/15.png +0 -0
- data/example/weather_32/16.png +0 -0
- data/example/weather_32/17.png +0 -0
- data/example/weather_32/18.png +0 -0
- data/example/weather_32/19.png +0 -0
- data/example/weather_32/2.png +0 -0
- data/example/weather_32/20.png +0 -0
- data/example/weather_32/21.png +0 -0
- data/example/weather_32/22.png +0 -0
- data/example/weather_32/23.png +0 -0
- data/example/weather_32/24.png +0 -0
- data/example/weather_32/25.png +0 -0
- data/example/weather_32/26.png +0 -0
- data/example/weather_32/27.png +0 -0
- data/example/weather_32/28.png +0 -0
- data/example/weather_32/29.png +0 -0
- data/example/weather_32/3.png +0 -0
- data/example/weather_32/30.png +0 -0
- data/example/weather_32/31.png +0 -0
- data/example/weather_32/32.png +0 -0
- data/example/weather_32/33.png +0 -0
- data/example/weather_32/34.png +0 -0
- data/example/weather_32/35.png +0 -0
- data/example/weather_32/36.png +0 -0
- data/example/weather_32/37.png +0 -0
- data/example/weather_32/38.png +0 -0
- data/example/weather_32/39.png +0 -0
- data/example/weather_32/4.png +0 -0
- data/example/weather_32/40.png +0 -0
- data/example/weather_32/41.png +0 -0
- data/example/weather_32/42.png +0 -0
- data/example/weather_32/43.png +0 -0
- data/example/weather_32/44.png +0 -0
- data/example/weather_32/45.png +0 -0
- data/example/weather_32/46.png +0 -0
- data/example/weather_32/47.png +0 -0
- data/example/weather_32/5.png +0 -0
- data/example/weather_32/6.png +0 -0
- data/example/weather_32/7.png +0 -0
- data/example/weather_32/8.png +0 -0
- data/example/weather_32/9.png +0 -0
- data/example/weather_32/Thumbs.db +0 -0
- data/example/weather_32/WS_FTP.LOG +49 -0
- data/example/weather_32/na.png +0 -0
- data/example/weather_portlet_controller.rb +49 -0
- data/init.rb +3 -0
- data/install.rb +0 -0
- data/lib/{forecast.rb → weather/forecast.rb} +56 -20
- data/lib/{service.rb → weather/service.rb} +1 -1
- data/lib/{util.rb → weather/util.rb} +0 -0
- data/test/forecast_test.rb +9 -3
- data/test/service_test.rb +3 -3
- data/weather.rb +5 -3
- metadata +60 -5
data/README
CHANGED
@@ -8,87 +8,94 @@ License:: GNU Lesser General Public License v2.1 (LGPL 2.1)
|
|
8
8
|
|
9
9
|
Simple usage example:
|
10
10
|
|
11
|
-
require 'rubygems'
|
12
|
-
require_gem 'rubyweather'
|
11
|
+
require 'rubygems'
|
12
|
+
require_gem 'rubyweather'
|
13
13
|
|
14
|
-
require 'weather'
|
14
|
+
require 'weather/service'
|
15
15
|
|
16
|
-
service = Weather::Service.new
|
17
|
-
service.partner_id = <b>your partner id</b>
|
18
|
-
service.license_key = <b>your license key</b>
|
16
|
+
service = Weather::Service.new
|
17
|
+
service.partner_id = <b>your partner id</b>
|
18
|
+
service.license_key = <b>your license key</b>
|
19
19
|
|
20
|
-
locations = service.find_location('Toronto')
|
21
|
-
puts "Matching Locations: " + locations.inspect
|
20
|
+
locations = service.find_location('Toronto')
|
21
|
+
puts "Matching Locations: " + locations.inspect
|
22
22
|
|
23
23
|
The above will print out a list of available locations and their codes. We can
|
24
24
|
now use these codes to fetch the weather data for our city:
|
25
25
|
|
26
|
-
forecast = service.fetch_forecast("CAXX0504", 5)
|
26
|
+
forecast = service.fetch_forecast("CAXX0504", 5)
|
27
27
|
|
28
|
-
puts "Location: %s" % forecast.location_name
|
28
|
+
puts "Location: %s" % forecast.location_name
|
29
29
|
|
30
|
-
puts "Current Temperature: %s" % forecast.current.temperature
|
31
|
-
puts "Current Windspeed: %s" % forecast.current.wind.speed
|
30
|
+
puts "Current Temperature: %s" % forecast.current.temperature
|
31
|
+
puts "Current Windspeed: %s" % forecast.current.wind.speed
|
32
32
|
|
33
|
-
puts "Tomorrow's High: %s" % forecast.tomorrow.high
|
34
|
-
puts "Tomorrow's Outlook: %s" % forecast.tomorrow.outlook
|
35
|
-
puts "Tomorrow's Wind Direction: %s" % forecast.tomorrow.wind.direction
|
33
|
+
puts "Tomorrow's High: %s" % forecast.tomorrow.high
|
34
|
+
puts "Tomorrow's Outlook: %s" % forecast.tomorrow.outlook
|
35
|
+
puts "Tomorrow's Wind Direction: %s" % forecast.tomorrow.wind.direction
|
36
36
|
|
37
37
|
Forecasts for days in the future are accessed via <tt>forecast.day(#)</tt> where <tt>#</tt> is the number of day sinto the future
|
38
38
|
(assuming that you've fetched data for as many days in your <tt>service.fetch_forecast</tt> request):
|
39
39
|
|
40
|
-
puts "High 3 days from now: %s" % forecast.day(3).high
|
41
|
-
puts "Probability of precipitation 4 days from now: %s" % forecast.day(4).pop
|
40
|
+
puts "High 3 days from now: %s" % forecast.day(3).high
|
41
|
+
puts "Probability of precipitation 4 days from now: %s" % forecast.day(4).pop
|
42
42
|
|
43
43
|
There are a lot of attributes you can fetch for a forecast day. Here are just a few:
|
44
44
|
|
45
|
-
|
46
|
-
The
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
<tt>
|
54
|
-
|
55
|
-
|
56
|
-
The
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
The date that this forecast is for, returned as a ruby Time object.
|
63
|
-
<tt>sunrise</tt>::
|
64
|
-
The time of sunrise on the day of the forecast.
|
65
|
-
<tt>sunset</tt>::
|
66
|
-
The time of sunset on the day of the forecast.
|
67
|
-
|
68
|
-
Additionally, all (or at least most) of the attributes for a given day in the raw weather.com xml data are
|
69
|
-
also available. For example, you can call forecast.tomorrow.dewp to get the dewpoint, because the xml file
|
45
|
+
+temp+, +temperature+:: The temperature. For future days this is equivalent to the low for nighttime, and high for daytime.
|
46
|
+
+icon+:: The number of the icon gif file from the weather.com SDK[http://www.weather.com/services/xmloap.html] that
|
47
|
+
identifies the conditions (e.g. a little icon of a cloud with rain, or sun, or whatever).
|
48
|
+
+outlook+:: Brief text describing the conditions (e.g. "Mostly Cloudy", "Rain", "Scattered T-Storms").
|
49
|
+
+outlook_brief+:: An abbreviated version of +outlook+ (e.g. "M Cloudy", "Scat T-Storms").
|
50
|
+
+low+, +lo+:: The forecasted low temperature. (Not available for current conditions)
|
51
|
+
+high+, +hi+:: The forecasted high temperature. (Not available for current conditions)
|
52
|
+
+wind+:: Wind conditions. The <tt>wind</tt> attribute returns an object with sub-attributes that can be
|
53
|
+
addressed like <tt>wind.direction</tt>, <tt>wind.speed</tt>, <tt>wind.heading</tt>, etc.
|
54
|
+
+pop+, +ppcp+:: Probability of precipitation.
|
55
|
+
+date+:: The date that this forecast is for, returned as a ruby Time object.
|
56
|
+
+sunrise+:: The time of sunrise on the day of the forecast.
|
57
|
+
+sunset+:: The time of sunset on the day of the forecast.
|
58
|
+
+latest_update+:: The datetime when the conditions were last measured/forecast.
|
59
|
+
|
60
|
+
Additionally, most of the attributes for a given day in the raw weather.com xml data are
|
61
|
+
also directly accessible. For example, you can call forecast.tomorrow.dewp to get the dewpoint, because the xml file
|
70
62
|
contains a <tt>dewp</tt> element for that day. Have a look at #test/test_weather.xml to see what data is
|
71
63
|
available in the xml file. Note though that raw xml elements will be returned as a string, without any nice
|
72
64
|
class casting or unit conversion.
|
73
65
|
|
74
|
-
|
75
|
-
accessor methods for the underlying xml data.
|
66
|
+
Other programmers are encouraged to add more functionality to the lib/forecast.rb module to provide better
|
67
|
+
accessor methods for the underlying xml data. See below for how to obtain subversion access to contribute
|
68
|
+
your changes back to the project.
|
76
69
|
|
77
70
|
== Download
|
78
71
|
|
79
72
|
You can download the latest stable version of RubyWeather from http://rubyforge.org/projects/rubyweather/.
|
80
|
-
Alternatively, the files <em>may</em> be available from http://roughest.net/rubyweather (but no promises -- the
|
81
|
-
rubyforge site is a better bet).
|
82
73
|
|
83
|
-
You can also check out the latest copy via subversion from svn://rubyforge.org//var/svn/rubyweather/trunk.
|
84
|
-
like to contribute back your changes to the code, please contact me via the rubyforge project
|
85
|
-
account.
|
74
|
+
You can also check out the latest copy via subversion from svn://rubyforge.org//var/svn/rubyweather/trunk.
|
75
|
+
If you would like to contribute back your changes to the code, please contact me via the rubyforge project
|
76
|
+
site to obtain a subversion account.
|
86
77
|
|
87
|
-
|
78
|
+
RubyWeather can also be installed as a Rails plugin using the following command from your Rails application's
|
79
|
+
directory:
|
80
|
+
|
81
|
+
./script/plugin install -x svn://rubyforge.org//var/svn/rubyweather/trunk
|
82
|
+
|
83
|
+
== Sample Rails Controller
|
84
|
+
|
85
|
+
In the <tt>example</tt> directory you will find a sample Rails controller that uses RubyWeather to show
|
86
|
+
a simple weather forecast. To try this out:
|
87
|
+
|
88
|
+
1. Copy the controller into your Rails app's <tt>app/controllers/</tt>.
|
89
|
+
2. Copy the <tt>forecast.rhtml</tt> template into <tt>apps/view/weather_portlet/</tt>
|
90
|
+
3. Copy <tt>weather_32</tt> into <tt>public/images/</tt>.
|
91
|
+
|
92
|
+
Fire up your Rails server, and go to <tt>/weather_portlet/forecast</tt> to see the controller in action.
|
93
|
+
|
94
|
+
== Note About Weather.com Licensing & Registration
|
88
95
|
|
89
96
|
To use this library you will need a partner id and license key from
|
90
97
|
weather.com. The service is completely free, but requires that you agree
|
91
|
-
to weather.com's legal stuff, which, among other things,
|
98
|
+
to weather.com's legal stuff, which, among other things, asks that your software
|
92
99
|
to include a link back to the weather.com website (although this is not actually
|
93
100
|
enforced in any way by the service).
|
94
101
|
|
@@ -96,7 +103,13 @@ To obtain the free license visit http://www.weather.com/services/xmloap.html.
|
|
96
103
|
This will also allow you to download an SDK that includes nice weather icons for
|
97
104
|
use with the data.
|
98
105
|
|
99
|
-
|
106
|
+
Note that weather.com doesn't seem to be enforcing the partner id/license key at this time.
|
107
|
+
You can specify any value for partner id and license key (e.g. par=123456&key=abcdefg) and
|
108
|
+
the weather.com service will happily accept it (in fact, you can even leave both fields blank,
|
109
|
+
i.e. part=&key=). However, this is probably unintentional and subject to change, so it is
|
110
|
+
highly recommended that you obtain a valid id and key.
|
111
|
+
|
112
|
+
== Software License
|
100
113
|
|
101
114
|
This program is free software; you can redistribute it and/or modify
|
102
115
|
it under the terms of the GNU General Public License as published by
|
@@ -0,0 +1,26 @@
|
|
1
|
+
|
2
|
+
<table>
|
3
|
+
<thead>
|
4
|
+
<tr>
|
5
|
+
<% for d in @forecasts.first -%>
|
6
|
+
<th><%= d.date.strftime('%a') %></th>
|
7
|
+
<% end -%>
|
8
|
+
</tr>
|
9
|
+
</thead>
|
10
|
+
<tbody>
|
11
|
+
<% for f in @forecasts -%>
|
12
|
+
<tr>
|
13
|
+
<th colspan="<%= f.entries.size %>"><%= f.location_city %></th>
|
14
|
+
<!-- LATEST UPDATE: <%= f.latest_update %> -->
|
15
|
+
</tr>
|
16
|
+
<tr>
|
17
|
+
<% for d in f -%>
|
18
|
+
<td>
|
19
|
+
<%= image_tag("weather_32/"+d.icon.to_s+".png", {:alt => d.outlook, :title => outlook_tooltip(d)}) %>
|
20
|
+
<br /><%= d.temp.nil? ? "N/A" : d.temp.to_s+"°" %>
|
21
|
+
</td>
|
22
|
+
<% end -%>
|
23
|
+
</tr>
|
24
|
+
<% end -%>
|
25
|
+
</tbody>
|
26
|
+
</table>
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
@@ -0,0 +1,49 @@
|
|
1
|
+
2005.11.14 11:00 B U:\cq's\14773\wx_icons32x32\0.png <-- ftp.twc.weather.com /Server HD/Web Folder/wx_icons_pngs/wx_icons32x32 0.png
|
2
|
+
2005.11.14 11:00 B U:\cq's\14773\wx_icons32x32\1.png <-- ftp.twc.weather.com /Server HD/Web Folder/wx_icons_pngs/wx_icons32x32 1.png
|
3
|
+
2005.11.14 11:00 B U:\cq's\14773\wx_icons32x32\10.png <-- ftp.twc.weather.com /Server HD/Web Folder/wx_icons_pngs/wx_icons32x32 10.png
|
4
|
+
2005.11.14 11:00 B U:\cq's\14773\wx_icons32x32\11.png <-- ftp.twc.weather.com /Server HD/Web Folder/wx_icons_pngs/wx_icons32x32 11.png
|
5
|
+
2005.11.14 11:00 B U:\cq's\14773\wx_icons32x32\12.png <-- ftp.twc.weather.com /Server HD/Web Folder/wx_icons_pngs/wx_icons32x32 12.png
|
6
|
+
2005.11.14 11:00 B U:\cq's\14773\wx_icons32x32\13.png <-- ftp.twc.weather.com /Server HD/Web Folder/wx_icons_pngs/wx_icons32x32 13.png
|
7
|
+
2005.11.14 11:00 B U:\cq's\14773\wx_icons32x32\14.png <-- ftp.twc.weather.com /Server HD/Web Folder/wx_icons_pngs/wx_icons32x32 14.png
|
8
|
+
2005.11.14 11:00 B U:\cq's\14773\wx_icons32x32\15.png <-- ftp.twc.weather.com /Server HD/Web Folder/wx_icons_pngs/wx_icons32x32 15.png
|
9
|
+
2005.11.14 11:00 B U:\cq's\14773\wx_icons32x32\16.png <-- ftp.twc.weather.com /Server HD/Web Folder/wx_icons_pngs/wx_icons32x32 16.png
|
10
|
+
2005.11.14 11:00 B U:\cq's\14773\wx_icons32x32\17.png <-- ftp.twc.weather.com /Server HD/Web Folder/wx_icons_pngs/wx_icons32x32 17.png
|
11
|
+
2005.11.14 11:00 B U:\cq's\14773\wx_icons32x32\18.png <-- ftp.twc.weather.com /Server HD/Web Folder/wx_icons_pngs/wx_icons32x32 18.png
|
12
|
+
2005.11.14 11:00 B U:\cq's\14773\wx_icons32x32\19.png <-- ftp.twc.weather.com /Server HD/Web Folder/wx_icons_pngs/wx_icons32x32 19.png
|
13
|
+
2005.11.14 11:00 B U:\cq's\14773\wx_icons32x32\2.png <-- ftp.twc.weather.com /Server HD/Web Folder/wx_icons_pngs/wx_icons32x32 2.png
|
14
|
+
2005.11.14 11:00 B U:\cq's\14773\wx_icons32x32\20.png <-- ftp.twc.weather.com /Server HD/Web Folder/wx_icons_pngs/wx_icons32x32 20.png
|
15
|
+
2005.11.14 11:00 B U:\cq's\14773\wx_icons32x32\21.png <-- ftp.twc.weather.com /Server HD/Web Folder/wx_icons_pngs/wx_icons32x32 21.png
|
16
|
+
2005.11.14 11:00 B U:\cq's\14773\wx_icons32x32\22.png <-- ftp.twc.weather.com /Server HD/Web Folder/wx_icons_pngs/wx_icons32x32 22.png
|
17
|
+
2005.11.14 11:00 B U:\cq's\14773\wx_icons32x32\23.png <-- ftp.twc.weather.com /Server HD/Web Folder/wx_icons_pngs/wx_icons32x32 23.png
|
18
|
+
2005.11.14 11:00 B U:\cq's\14773\wx_icons32x32\24.png <-- ftp.twc.weather.com /Server HD/Web Folder/wx_icons_pngs/wx_icons32x32 24.png
|
19
|
+
2005.11.14 11:00 B U:\cq's\14773\wx_icons32x32\25.png <-- ftp.twc.weather.com /Server HD/Web Folder/wx_icons_pngs/wx_icons32x32 25.png
|
20
|
+
2005.11.14 11:00 B U:\cq's\14773\wx_icons32x32\26.png <-- ftp.twc.weather.com /Server HD/Web Folder/wx_icons_pngs/wx_icons32x32 26.png
|
21
|
+
2005.11.14 11:00 B U:\cq's\14773\wx_icons32x32\27.png <-- ftp.twc.weather.com /Server HD/Web Folder/wx_icons_pngs/wx_icons32x32 27.png
|
22
|
+
2005.11.14 11:00 B U:\cq's\14773\wx_icons32x32\28.png <-- ftp.twc.weather.com /Server HD/Web Folder/wx_icons_pngs/wx_icons32x32 28.png
|
23
|
+
2005.11.14 11:00 B U:\cq's\14773\wx_icons32x32\29.png <-- ftp.twc.weather.com /Server HD/Web Folder/wx_icons_pngs/wx_icons32x32 29.png
|
24
|
+
2005.11.14 11:00 B U:\cq's\14773\wx_icons32x32\3.png <-- ftp.twc.weather.com /Server HD/Web Folder/wx_icons_pngs/wx_icons32x32 3.png
|
25
|
+
2005.11.14 11:00 B U:\cq's\14773\wx_icons32x32\30.png <-- ftp.twc.weather.com /Server HD/Web Folder/wx_icons_pngs/wx_icons32x32 30.png
|
26
|
+
2005.11.14 11:00 B U:\cq's\14773\wx_icons32x32\31.png <-- ftp.twc.weather.com /Server HD/Web Folder/wx_icons_pngs/wx_icons32x32 31.png
|
27
|
+
2005.11.14 11:00 B U:\cq's\14773\wx_icons32x32\32.png <-- ftp.twc.weather.com /Server HD/Web Folder/wx_icons_pngs/wx_icons32x32 32.png
|
28
|
+
2005.11.14 11:00 B U:\cq's\14773\wx_icons32x32\33.png <-- ftp.twc.weather.com /Server HD/Web Folder/wx_icons_pngs/wx_icons32x32 33.png
|
29
|
+
2005.11.14 11:00 B U:\cq's\14773\wx_icons32x32\34.png <-- ftp.twc.weather.com /Server HD/Web Folder/wx_icons_pngs/wx_icons32x32 34.png
|
30
|
+
2005.11.14 11:00 B U:\cq's\14773\wx_icons32x32\35.png <-- ftp.twc.weather.com /Server HD/Web Folder/wx_icons_pngs/wx_icons32x32 35.png
|
31
|
+
2005.11.14 11:00 B U:\cq's\14773\wx_icons32x32\36.png <-- ftp.twc.weather.com /Server HD/Web Folder/wx_icons_pngs/wx_icons32x32 36.png
|
32
|
+
2005.11.14 11:00 B U:\cq's\14773\wx_icons32x32\37.png <-- ftp.twc.weather.com /Server HD/Web Folder/wx_icons_pngs/wx_icons32x32 37.png
|
33
|
+
2005.11.14 11:00 B U:\cq's\14773\wx_icons32x32\38.png <-- ftp.twc.weather.com /Server HD/Web Folder/wx_icons_pngs/wx_icons32x32 38.png
|
34
|
+
2005.11.14 11:00 B U:\cq's\14773\wx_icons32x32\39.png <-- ftp.twc.weather.com /Server HD/Web Folder/wx_icons_pngs/wx_icons32x32 39.png
|
35
|
+
2005.11.14 11:00 B U:\cq's\14773\wx_icons32x32\4.png <-- ftp.twc.weather.com /Server HD/Web Folder/wx_icons_pngs/wx_icons32x32 4.png
|
36
|
+
2005.11.14 11:00 B U:\cq's\14773\wx_icons32x32\40.png <-- ftp.twc.weather.com /Server HD/Web Folder/wx_icons_pngs/wx_icons32x32 40.png
|
37
|
+
2005.11.14 11:00 B U:\cq's\14773\wx_icons32x32\41.png <-- ftp.twc.weather.com /Server HD/Web Folder/wx_icons_pngs/wx_icons32x32 41.png
|
38
|
+
2005.11.14 11:00 B U:\cq's\14773\wx_icons32x32\42.png <-- ftp.twc.weather.com /Server HD/Web Folder/wx_icons_pngs/wx_icons32x32 42.png
|
39
|
+
2005.11.14 11:00 B U:\cq's\14773\wx_icons32x32\43.png <-- ftp.twc.weather.com /Server HD/Web Folder/wx_icons_pngs/wx_icons32x32 43.png
|
40
|
+
2005.11.14 11:00 B U:\cq's\14773\wx_icons32x32\44.png <-- ftp.twc.weather.com /Server HD/Web Folder/wx_icons_pngs/wx_icons32x32 44.png
|
41
|
+
2005.11.14 11:00 B U:\cq's\14773\wx_icons32x32\45.png <-- ftp.twc.weather.com /Server HD/Web Folder/wx_icons_pngs/wx_icons32x32 45.png
|
42
|
+
2005.11.14 11:00 B U:\cq's\14773\wx_icons32x32\46.png <-- ftp.twc.weather.com /Server HD/Web Folder/wx_icons_pngs/wx_icons32x32 46.png
|
43
|
+
2005.11.14 11:00 B U:\cq's\14773\wx_icons32x32\47.png <-- ftp.twc.weather.com /Server HD/Web Folder/wx_icons_pngs/wx_icons32x32 47.png
|
44
|
+
2005.11.14 11:00 B U:\cq's\14773\wx_icons32x32\5.png <-- ftp.twc.weather.com /Server HD/Web Folder/wx_icons_pngs/wx_icons32x32 5.png
|
45
|
+
2005.11.14 11:00 B U:\cq's\14773\wx_icons32x32\6.png <-- ftp.twc.weather.com /Server HD/Web Folder/wx_icons_pngs/wx_icons32x32 6.png
|
46
|
+
2005.11.14 11:00 B U:\cq's\14773\wx_icons32x32\7.png <-- ftp.twc.weather.com /Server HD/Web Folder/wx_icons_pngs/wx_icons32x32 7.png
|
47
|
+
2005.11.14 11:00 B U:\cq's\14773\wx_icons32x32\8.png <-- ftp.twc.weather.com /Server HD/Web Folder/wx_icons_pngs/wx_icons32x32 8.png
|
48
|
+
2005.11.14 11:00 B U:\cq's\14773\wx_icons32x32\9.png <-- ftp.twc.weather.com /Server HD/Web Folder/wx_icons_pngs/wx_icons32x32 9.png
|
49
|
+
2005.11.14 11:00 B U:\cq's\14773\wx_icons32x32\na.png <-- ftp.twc.weather.com /Server HD/Web Folder/wx_icons_pngs/wx_icons32x32 na.png
|
Binary file
|
@@ -0,0 +1,49 @@
|
|
1
|
+
require 'portlet_controller'
|
2
|
+
require_gem 'rubyweather'
|
3
|
+
require 'weather/service'
|
4
|
+
|
5
|
+
# Simple Rails controller that shows the weather forecast.
|
6
|
+
class WeatherPortletController < ActionController::Base
|
7
|
+
|
8
|
+
configurable
|
9
|
+
|
10
|
+
def rescue_action_in_public(exception)
|
11
|
+
render :text => <<ERROR
|
12
|
+
<em>Sorry, this portlet is temporarily out of service.</em>
|
13
|
+
|
14
|
+
<!--
|
15
|
+
ERROR: #{exception.message}
|
16
|
+
#{exception.backtrace.join("\n\t\t\t")}
|
17
|
+
-->
|
18
|
+
ERROR
|
19
|
+
end
|
20
|
+
|
21
|
+
def forecast
|
22
|
+
if params['locations'] and params['locations'].is_array? and params['locations'].length > 0
|
23
|
+
locations = params['locations']
|
24
|
+
else
|
25
|
+
locations = ["CAXX0504", "CAXX0301", "CAXX0054"]
|
26
|
+
end
|
27
|
+
|
28
|
+
days = params['days'] || 5
|
29
|
+
|
30
|
+
@forecasts = []
|
31
|
+
|
32
|
+
service = Weather::Service.new
|
33
|
+
locations.each do |loc|
|
34
|
+
@forecasts << service.fetch_forecast(loc, days)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
# Normally this would go in the weather_portlet_helper, but to reduce the number of files in this example it is included.
|
39
|
+
def outlook_tooltip(d)
|
40
|
+
tooltip = d.outlook.to_s
|
41
|
+
tooltip += ", PoP: "+d.pop.to_s+"%" if (not d.pop.nil?)
|
42
|
+
|
43
|
+
return tooltip
|
44
|
+
end
|
45
|
+
helper_method :outlook_tooltip
|
46
|
+
hidden_actions :outlook_tooltip
|
47
|
+
|
48
|
+
end
|
49
|
+
|
data/init.rb
ADDED
data/install.rb
ADDED
File without changes
|
@@ -4,7 +4,8 @@
|
|
4
4
|
# License:: GNU Lesser General Public License v2.1 (LGPL 2.1)
|
5
5
|
#
|
6
6
|
|
7
|
-
require
|
7
|
+
require 'time'
|
8
|
+
require File.dirname(File.expand_path(__FILE__)) + '/util'
|
8
9
|
|
9
10
|
module Weather
|
10
11
|
|
@@ -27,9 +28,16 @@ module Weather
|
|
27
28
|
end
|
28
29
|
|
29
30
|
@xml = weather_xmldoc
|
31
|
+
|
32
|
+
# add the lsup (latest update) element to individual days to make parsing easier later on
|
33
|
+
# FIXME: I can't seem to add the lsup as an element (which would be the consistent way to do it)... adding it as an attribute seems to work though
|
34
|
+
lsup = @xml.root.elements['dayf'].elements['lsup'].text
|
35
|
+
REXML::XPath.match(@xml, "//dayf/day").each do |dxml|
|
36
|
+
dxml.add_attribute "lsup", lsup
|
37
|
+
end
|
30
38
|
end
|
31
39
|
|
32
|
-
#
|
40
|
+
# The current conditions as a Conditions object.
|
33
41
|
def current
|
34
42
|
CurrentConditions.new(xml.root.elements['cc'])
|
35
43
|
end
|
@@ -39,7 +47,7 @@ module Weather
|
|
39
47
|
day(1)
|
40
48
|
end
|
41
49
|
|
42
|
-
#
|
50
|
+
# The conditions for the given day (0 = today, 1 = tomorrow, etc.)
|
43
51
|
# The maximum day number depends on the data available in the xml that was used to create this Forecast.
|
44
52
|
def day(num)
|
45
53
|
element = xml.root.elements['dayf'].elements["day[@d='#{num.to_s}']"]
|
@@ -55,7 +63,7 @@ module Weather
|
|
55
63
|
end
|
56
64
|
end
|
57
65
|
|
58
|
-
#
|
66
|
+
# The conditions for the given night (0 = tonight, 1 = tomorrow night, etc.)
|
59
67
|
# The maximum day number depends on the data available in the xml that was used to create this Forecast.
|
60
68
|
def night(num)
|
61
69
|
element = xml.root.elements['dayf'].elements["day[@d='#{num.to_s}']"]
|
@@ -79,12 +87,12 @@ module Weather
|
|
79
87
|
end
|
80
88
|
end
|
81
89
|
|
82
|
-
#
|
90
|
+
# The full human-readable name of the place that this Forecast is for.
|
83
91
|
def location_name
|
84
92
|
xml.root.elements['loc'].elements['dnam'].text
|
85
93
|
end
|
86
94
|
|
87
|
-
#
|
95
|
+
# The name of the city that this Forecast is for.
|
88
96
|
def location_city
|
89
97
|
xml.root.elements['loc'].elements['dnam'].text.split(",").first
|
90
98
|
end
|
@@ -94,10 +102,25 @@ module Weather
|
|
94
102
|
xml.root.elements['loc'].attributes['id']
|
95
103
|
end
|
96
104
|
|
97
|
-
#
|
105
|
+
# True if the units returned by this Forecast will be in the metric system (i.e. Celcius).
|
98
106
|
def metric?
|
99
107
|
xml.root.elements['head'].elements['ut'].text == "C"
|
100
108
|
end
|
109
|
+
|
110
|
+
# The date and time when the conditions were last measured/forecast.
|
111
|
+
# Returned as a Time object.
|
112
|
+
#
|
113
|
+
# Note that this is a bit misleading, because the Forecast actually contains
|
114
|
+
# two "latest update" times -- one for the current conditions and the other
|
115
|
+
# for the future forecast. This method will return the latest update time
|
116
|
+
# of the <em>future forecast</em>. If you want the latest update time of the current
|
117
|
+
# conditions, you should do:
|
118
|
+
#
|
119
|
+
# forecast.current.latest_update
|
120
|
+
#
|
121
|
+
def latest_update
|
122
|
+
Time.parse(xml.root.elements['dayf'].elements['lsup'].text)
|
123
|
+
end
|
101
124
|
end
|
102
125
|
|
103
126
|
# Abstract class that all Forecast entities (roughly "days") are based on.
|
@@ -113,15 +136,22 @@ module Weather
|
|
113
136
|
end
|
114
137
|
end
|
115
138
|
|
116
|
-
#
|
139
|
+
# The wind conditions as an anonymous object (i.e. wind.d for wind
|
117
140
|
# direction, wind.s for wind speed, etc.) See the <wind> element in the
|
118
141
|
# weather.com XML data spec for more info.
|
119
142
|
def wind
|
120
143
|
fix_wind(complex_attribute(@xml.elements['wind']))
|
121
144
|
end
|
145
|
+
|
146
|
+
# The date and time when the conditions were last measured/forecast.
|
147
|
+
# Returned as a Time object.
|
148
|
+
def latest_update
|
149
|
+
Time.parse(self.lsup)
|
150
|
+
end
|
151
|
+
|
122
152
|
|
123
153
|
private
|
124
|
-
#
|
154
|
+
# The element specified by name as a cleaned-up temperature value.
|
125
155
|
# That is, if the temperature is "N/A", then nil is returned; otherwise
|
126
156
|
# the value is converted to an integer.
|
127
157
|
def clean_temp(name)
|
@@ -134,7 +164,7 @@ module Weather
|
|
134
164
|
end
|
135
165
|
end
|
136
166
|
|
137
|
-
#
|
167
|
+
# The given xml element as an anonymous object, with the text nodes of the element's
|
138
168
|
# immediate children available as accessor methods.
|
139
169
|
# This allows for accessing attributes that have child elements (i.e. wind, bar, etc.)
|
140
170
|
# as anonymous objects (i.e. wind.d for wind direction, wind.s for wind speed, etc.)
|
@@ -182,8 +212,8 @@ module Weather
|
|
182
212
|
def temp
|
183
213
|
clean_temp('tmp')
|
184
214
|
end
|
185
|
-
|
186
|
-
|
215
|
+
alias tmp temp
|
216
|
+
alias temperature temp
|
187
217
|
|
188
218
|
def outlook
|
189
219
|
xml.elements['t'].text
|
@@ -196,7 +226,7 @@ module Weather
|
|
196
226
|
def pop
|
197
227
|
nil
|
198
228
|
end
|
199
|
-
|
229
|
+
alias ppcp pop
|
200
230
|
|
201
231
|
def date
|
202
232
|
Time.now
|
@@ -224,6 +254,12 @@ module Weather
|
|
224
254
|
end
|
225
255
|
end
|
226
256
|
|
257
|
+
# The date and time when the conditions were last measured/forecast.
|
258
|
+
# Returned as a Time object.
|
259
|
+
def latest_update
|
260
|
+
Time.parse(@xml.attributes['lsup'])
|
261
|
+
end
|
262
|
+
|
227
263
|
def wind
|
228
264
|
fix_wind(complex_attribute(mypart.elements['wind']))
|
229
265
|
end
|
@@ -241,12 +277,12 @@ module Weather
|
|
241
277
|
def high
|
242
278
|
clean_temp('hi')
|
243
279
|
end
|
244
|
-
|
280
|
+
alias hi high
|
245
281
|
|
246
282
|
def low
|
247
283
|
clean_temp('low')
|
248
284
|
end
|
249
|
-
|
285
|
+
alias lo low
|
250
286
|
|
251
287
|
|
252
288
|
def outlook
|
@@ -260,7 +296,7 @@ module Weather
|
|
260
296
|
def pop
|
261
297
|
mypart.elements['ppcp'].text.to_i
|
262
298
|
end
|
263
|
-
|
299
|
+
alias ppcp pop
|
264
300
|
|
265
301
|
def sunrise
|
266
302
|
hour,minute = @xml.elements['sunr'].text.split(" ").first.split(":")
|
@@ -287,8 +323,8 @@ module Weather
|
|
287
323
|
def temp
|
288
324
|
high
|
289
325
|
end
|
290
|
-
|
291
|
-
|
326
|
+
alias tmp temp
|
327
|
+
alias temperature temp
|
292
328
|
|
293
329
|
private
|
294
330
|
def mypart
|
@@ -305,8 +341,8 @@ module Weather
|
|
305
341
|
def temp
|
306
342
|
low
|
307
343
|
end
|
308
|
-
|
309
|
-
|
344
|
+
alias tmp temp
|
345
|
+
alias temperature temp
|
310
346
|
|
311
347
|
private
|
312
348
|
def mypart
|
File without changes
|
data/test/forecast_test.rb
CHANGED
@@ -5,9 +5,10 @@
|
|
5
5
|
#
|
6
6
|
|
7
7
|
require 'test/unit'
|
8
|
-
require
|
9
|
-
require File.dirname(__FILE__) + '/../lib/
|
10
|
-
require File.dirname(__FILE__) + '/../lib/
|
8
|
+
require 'time'
|
9
|
+
require File.dirname(__FILE__) + '/../lib/weather/service'
|
10
|
+
require File.dirname(__FILE__) + '/../lib/weather/forecast'
|
11
|
+
require File.dirname(__FILE__) + '/../lib/weather/util'
|
11
12
|
|
12
13
|
class ForecastTest < Test::Unit::TestCase
|
13
14
|
|
@@ -74,4 +75,9 @@ class ForecastTest < Test::Unit::TestCase
|
|
74
75
|
assert_equal(8, tomorrow_night.wind.speed)
|
75
76
|
end
|
76
77
|
|
78
|
+
def test_latest_update
|
79
|
+
assert_equal Time.parse("2006-07-14 14:15"), @forecast.latest_update
|
80
|
+
assert_equal Time.parse("2006-07-14 15:00"), @forecast.current.latest_update
|
81
|
+
assert_equal Time.parse("2006-07-14 14:15"), @forecast.tomorrow.latest_update
|
82
|
+
end
|
77
83
|
end
|
data/test/service_test.rb
CHANGED
@@ -5,14 +5,14 @@
|
|
5
5
|
#
|
6
6
|
|
7
7
|
require 'test/unit'
|
8
|
-
require File.dirname(__FILE__) + '/../lib/service'
|
8
|
+
require File.dirname(__FILE__) + '/../lib/weather/service'
|
9
9
|
|
10
10
|
if not ENV['WEATHER_COM_PARTNER_ID']
|
11
|
-
puts "WARNING: You should set the WEATHER_COM_PARTNER_ID env variable (i.e. export WEATHER_COM_PARTNER_ID
|
11
|
+
puts "WARNING: You should set the WEATHER_COM_PARTNER_ID env variable (i.e. export WEATHER_COM_PARTNER_ID=<your weather.com partner id>) before running this test."
|
12
12
|
end
|
13
13
|
|
14
14
|
if not ENV['WEATHER_COM_LICENSE_KEY']
|
15
|
-
puts "WARNING: You should set the WEATHER_COM_LICENSE_KEY env variable (i.e. export WEATHER_COM_LICENSE_KEY
|
15
|
+
puts "WARNING: You should set the WEATHER_COM_LICENSE_KEY env variable (i.e. export WEATHER_COM_LICENSE_KEY=<your weather.com license key>) before running this test."
|
16
16
|
end
|
17
17
|
|
18
18
|
class ServiceTest < Test::Unit::TestCase
|
data/weather.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
require '
|
1
|
+
# DEPRECATED
|
2
|
+
# This file will likely go away within the next few versions.
|
3
|
+
# Use init.rb instead, or just require 'weather/service'
|
4
|
+
|
5
|
+
require File.dirname(File.expand_path(__FILE__)) + '/init'
|
metadata
CHANGED
@@ -3,12 +3,11 @@ rubygems_version: 0.8.11
|
|
3
3
|
specification_version: 1
|
4
4
|
name: rubyweather
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.
|
6
|
+
version: 1.0.0
|
7
7
|
date: 2006-07-28 00:00:00 -04:00
|
8
8
|
summary: Client library for accessing weather.com's xoap weather data.
|
9
9
|
require_paths:
|
10
10
|
- lib
|
11
|
-
- .
|
12
11
|
email: matt@roughest.net
|
13
12
|
homepage: http://rubyforge.org/projects/rubyweather
|
14
13
|
rubyforge_project: rubyweather
|
@@ -30,14 +29,70 @@ authors:
|
|
30
29
|
- Matt Zukowski
|
31
30
|
files:
|
32
31
|
- weather.rb
|
33
|
-
-
|
34
|
-
-
|
35
|
-
- lib/
|
32
|
+
- install.rb
|
33
|
+
- init.rb
|
34
|
+
- lib/weather/service.rb
|
35
|
+
- lib/weather/forecast.rb
|
36
|
+
- lib/weather/util.rb
|
36
37
|
- LICENSE
|
37
38
|
- README
|
38
39
|
- test/forecast_test.rb
|
39
40
|
- test/service_test.rb
|
40
41
|
- test/test_weather.xml
|
42
|
+
- example/weather_32
|
43
|
+
- example/weather_portlet_controller.rb
|
44
|
+
- example/forecast.rhtml
|
45
|
+
- example/weather_32/0.png
|
46
|
+
- example/weather_32/1.png
|
47
|
+
- example/weather_32/2.png
|
48
|
+
- example/weather_32/3.png
|
49
|
+
- example/weather_32/4.png
|
50
|
+
- example/weather_32/5.png
|
51
|
+
- example/weather_32/6.png
|
52
|
+
- example/weather_32/7.png
|
53
|
+
- example/weather_32/8.png
|
54
|
+
- example/weather_32/9.png
|
55
|
+
- example/weather_32/WS_FTP.LOG
|
56
|
+
- example/weather_32/Thumbs.db
|
57
|
+
- example/weather_32/na.png
|
58
|
+
- example/weather_32/10.png
|
59
|
+
- example/weather_32/11.png
|
60
|
+
- example/weather_32/12.png
|
61
|
+
- example/weather_32/13.png
|
62
|
+
- example/weather_32/14.png
|
63
|
+
- example/weather_32/15.png
|
64
|
+
- example/weather_32/16.png
|
65
|
+
- example/weather_32/17.png
|
66
|
+
- example/weather_32/18.png
|
67
|
+
- example/weather_32/19.png
|
68
|
+
- example/weather_32/20.png
|
69
|
+
- example/weather_32/21.png
|
70
|
+
- example/weather_32/22.png
|
71
|
+
- example/weather_32/23.png
|
72
|
+
- example/weather_32/24.png
|
73
|
+
- example/weather_32/25.png
|
74
|
+
- example/weather_32/26.png
|
75
|
+
- example/weather_32/27.png
|
76
|
+
- example/weather_32/28.png
|
77
|
+
- example/weather_32/29.png
|
78
|
+
- example/weather_32/30.png
|
79
|
+
- example/weather_32/31.png
|
80
|
+
- example/weather_32/32.png
|
81
|
+
- example/weather_32/33.png
|
82
|
+
- example/weather_32/34.png
|
83
|
+
- example/weather_32/35.png
|
84
|
+
- example/weather_32/36.png
|
85
|
+
- example/weather_32/37.png
|
86
|
+
- example/weather_32/38.png
|
87
|
+
- example/weather_32/39.png
|
88
|
+
- example/weather_32/40.png
|
89
|
+
- example/weather_32/41.png
|
90
|
+
- example/weather_32/42.png
|
91
|
+
- example/weather_32/43.png
|
92
|
+
- example/weather_32/44.png
|
93
|
+
- example/weather_32/45.png
|
94
|
+
- example/weather_32/46.png
|
95
|
+
- example/weather_32/47.png
|
41
96
|
test_files:
|
42
97
|
- test/forecast_test.rb
|
43
98
|
- test/service_test.rb
|