weather_report 0.0.1 → 0.0.2
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/History.txt +8 -0
- data/README.rdoc +7 -3
- data/lib/weather_report.rb +14 -9
- data/test/test_weather_report.rb +8 -0
- metadata +2 -2
data/History.txt
CHANGED
@@ -2,3 +2,11 @@
|
|
2
2
|
|
3
3
|
* 1 major enhancement:
|
4
4
|
* Initial release
|
5
|
+
|
6
|
+
== 0.0.2 2009-07-16
|
7
|
+
|
8
|
+
* 4 bug fixes
|
9
|
+
* Added accessors for description on observation and description, advance_days, image_url on forecasts
|
10
|
+
* Change Backstage url string
|
11
|
+
* Throw a FormatException if there is no data from the Backstage service
|
12
|
+
* Added simple webpage
|
data/README.rdoc
CHANGED
@@ -65,12 +65,14 @@ The full set of attributes is:
|
|
65
65
|
londonWeather.observation.pressure_state
|
66
66
|
londonWeather.observation.visibility
|
67
67
|
londonWeather.observation.humidity
|
68
|
+
londonWeather.observation.description
|
68
69
|
|
69
70
|
londonWeather.forecast.reading_date
|
70
71
|
londonWeather.forecast.name
|
71
72
|
londonWeather.forecast.country
|
72
73
|
londonWeather.forecast.latitude
|
73
74
|
londonWeather.forecast.longtitude
|
75
|
+
londonWeather.forecast.image_url
|
74
76
|
londonWeather.forecast.for_today.date
|
75
77
|
londonWeather.forecast.for_today.max_temperature
|
76
78
|
londonWeather.forecast.for_today.min_temperature
|
@@ -80,10 +82,12 @@ The full set of attributes is:
|
|
80
82
|
londonWeather.forecast.for_today.pressure
|
81
83
|
londonWeather.forecast.for_today.visibility
|
82
84
|
londonWeather.forecast.for_today.humidity
|
85
|
+
londonWeather.forecast.for_today.description
|
86
|
+
londonWeather.forecast.for_today.advance_days
|
83
87
|
|
84
88
|
== REQUIREMENTS:
|
85
89
|
|
86
|
-
The only external dependencies are REXML and net/http which are
|
90
|
+
The only external dependencies are REXML and net/http which are included as part of most Ruby installations.
|
87
91
|
|
88
92
|
== INSTALL:
|
89
93
|
|
@@ -91,13 +95,13 @@ The weather_report library is distributed itself as a RubyGem and is available i
|
|
91
95
|
|
92
96
|
sudo gem install weather_report
|
93
97
|
|
94
|
-
Alternately, download the gem and install manually.
|
98
|
+
Alternately, download the gem here[http://www.cordinc.com/projects/weather_report/download/weather_report-0.0.2.gem] or the tgz here[http://www.cordinc.com/projects/weather_report/download/weather_report-0.0.2.tgz] and install manually.
|
95
99
|
|
96
100
|
== LICENSE:
|
97
101
|
|
98
102
|
(The MIT License)
|
99
103
|
|
100
|
-
Copyright (c) 2009
|
104
|
+
Copyright (c) 2009 Charles Cordingley
|
101
105
|
|
102
106
|
Permission is hereby granted, free of charge, to any person obtaining
|
103
107
|
a copy of this software and associated documentation files (the
|
data/lib/weather_report.rb
CHANGED
@@ -7,7 +7,7 @@ $:.unshift(File.dirname(__FILE__)) unless
|
|
7
7
|
# Class containing weather observations and forecasts for the location specified by id in the constructor.
|
8
8
|
class WeatherReport
|
9
9
|
|
10
|
-
VERSION = '0.0.
|
10
|
+
VERSION = '0.0.2'
|
11
11
|
|
12
12
|
# The id is the number (1..9999) the BBC uses to identify cities for weather reports
|
13
13
|
attr_reader :id
|
@@ -53,12 +53,12 @@ class WeatherReport
|
|
53
53
|
|
54
54
|
# The url for getting current weather observations from BBC Backstage
|
55
55
|
def observation_url()
|
56
|
-
"http://
|
56
|
+
"http://newsrss.bbc.co.uk/weather/forecast/#{@id}/ObservationsRSS.xml"
|
57
57
|
end
|
58
58
|
|
59
59
|
# The url for getting weather forecasts from BBC Backstage
|
60
60
|
def forecast_url()
|
61
|
-
"http://
|
61
|
+
"http://newsrss.bbc.co.uk/weather/forecast/#{@id}/Next3DaysRSS.xml"
|
62
62
|
end
|
63
63
|
|
64
64
|
end
|
@@ -90,7 +90,7 @@ class WeatherReportObservation
|
|
90
90
|
DESCRIPTION = /Temperature: ([-\d\.]+|N\/A|NA|\(none\))(.+)Wind Direction: ([\w -\/\(\)]*), Wind Speed: ([-\d\.]+|N\/A|NA|\(none\))mph, Relative Humidity: ([\d\.]+|N\/A|NA|\(none\))(.*), Pressure: ([\d\.]+|N\/A|NA|\(none\))mB, ([\w -\/]+), Visibility: ([\w -\/]+)/
|
91
91
|
SUMMARY = /(.+):(\W+)([\w -\/\(\)]+). (.+)/m
|
92
92
|
|
93
|
-
attr_reader :temperature, :wind_direction, :wind_speed, :visibility, :pressure, :pressure_state, :humidity, :reading_date
|
93
|
+
attr_reader :temperature, :wind_direction, :wind_speed, :visibility, :pressure, :pressure_state, :humidity, :reading_date, :description
|
94
94
|
|
95
95
|
# Constructs the weather observation from an XML string or file containing the XML in BBC Backstage weather format
|
96
96
|
def initialize(document)
|
@@ -103,7 +103,9 @@ class WeatherReportObservation
|
|
103
103
|
@description = md[3]
|
104
104
|
}
|
105
105
|
|
106
|
+
hasDesc = false
|
106
107
|
doc.elements.each("rss/channel/item[1]/description[1]") { |element|
|
108
|
+
hasDesc = true
|
107
109
|
md = DESCRIPTION.match(element.text)
|
108
110
|
@temperature = md[1].to_f
|
109
111
|
@wind_direction = md[3]
|
@@ -113,6 +115,7 @@ class WeatherReportObservation
|
|
113
115
|
@pressure_state = md[8]
|
114
116
|
@visibility = md[9]
|
115
117
|
}
|
118
|
+
raise WeatherReport::FormatError unless hasDesc
|
116
119
|
|
117
120
|
rescue
|
118
121
|
raise WeatherReport::FormatError
|
@@ -124,7 +127,7 @@ end
|
|
124
127
|
class WeatherReportForecasts < Array
|
125
128
|
include Location
|
126
129
|
|
127
|
-
attr_reader :reading_date
|
130
|
+
attr_reader :reading_date, :image_url
|
128
131
|
|
129
132
|
# Constructs the weather forecasts from an XML string or file containing the XML in BBC Backstage weather format
|
130
133
|
def initialize(document)
|
@@ -137,6 +140,8 @@ class WeatherReportForecasts < Array
|
|
137
140
|
self << WeatherReportForecast.new(element)
|
138
141
|
}
|
139
142
|
|
143
|
+
raise WeatherReport::FormatError if length == 0
|
144
|
+
|
140
145
|
rescue
|
141
146
|
raise WeatherReport::FormatError
|
142
147
|
end
|
@@ -178,16 +183,16 @@ class WeatherReportForecasts < Array
|
|
178
183
|
SUMMARY = /([\w -\/]+): ([\w -]+|N\/A|NA|\(none\)), Max Temp: (.*)/m
|
179
184
|
DESCRIPTION = /Max Temp: ([-\d\.]+|N\/A|NA|\(none\))(.+)Min Temp: ([-\d\.]+|N\/A|NA|\(none\))(.+)Wind Direction: ([\w -\/\(\)]*), Wind Speed: ([-\d\.]+|N\/A|NA|\(none\))mph, Visibility: ([\w -\/]+), Pressure: ([\d\.]+|N\/A|NA|\(none\))mB, Humidity: ([\d\.]+|N\/A|NA|\(none\))(.*), (.+)/m
|
180
185
|
|
181
|
-
attr_reader :max_temperature, :min_temperature, :wind_direction, :wind_speed, :visibility, :pressure, :humidity, :date
|
186
|
+
attr_reader :max_temperature, :min_temperature, :wind_direction, :wind_speed, :visibility, :pressure, :humidity, :date, :description, :advance_days
|
182
187
|
|
183
188
|
# Constructs the single day forecast from an REXML element containing the forecast in BBC Backstage weather format
|
184
189
|
def initialize(item)
|
185
190
|
item.elements.each("title[1]") { |element|
|
186
191
|
md = SUMMARY.match(element.text)
|
187
192
|
@description = md[2]
|
188
|
-
|
189
|
-
raise(WeatherReport::FormatError, "WeatherReport Error: Day mismatch.") if
|
190
|
-
@date = Date.today
|
193
|
+
@advance_days = day_diff(md[1])
|
194
|
+
raise(WeatherReport::FormatError, "WeatherReport Error: Day mismatch.") if @advance_days.nil?
|
195
|
+
@date = Date.today+@advance_days
|
191
196
|
}
|
192
197
|
|
193
198
|
item.elements.each("description[1]") { |element|
|
data/test/test_weather_report.rb
CHANGED
@@ -51,6 +51,14 @@ class TestWeatherReport < Test::Unit::TestCase
|
|
51
51
|
assert_raise(WeatherReport::FormatError) { WeatherReportForecasts.new(File.read(File.dirname(__FILE__) + '/error.rss'))}
|
52
52
|
end
|
53
53
|
|
54
|
+
def test_moved_forecast
|
55
|
+
assert_raise(WeatherReport::FormatError) { WeatherReportForecasts.new(File.read(File.dirname(__FILE__) + '/moved.rss'))}
|
56
|
+
end
|
57
|
+
|
58
|
+
def test_moved_observation
|
59
|
+
assert_raise(WeatherReport::FormatError) { WeatherReportObservation.new(File.read(File.dirname(__FILE__) + '/moved.rss'))}
|
60
|
+
end
|
61
|
+
|
54
62
|
def test_current_forecast
|
55
63
|
doc = File.read(File.dirname(__FILE__) + '/BBC_Next3DaysRSS.rss')
|
56
64
|
doc = doc.gsub("<TODAY>", Date::DAYNAMES[Date.today.wday]).gsub("<TOMORROW>", Date::DAYNAMES[(Date.today+1).wday]).gsub("<DAY_AFTER_TOMORROW>", Date::DAYNAMES[(Date.today+2).wday])
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: weather_report
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Charles Cordingley
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-
|
12
|
+
date: 2009-07-18 00:00:00 +01:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|