ckozus-rweather 0.1

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 ADDED
@@ -0,0 +1,31 @@
1
+ == rweather
2
+
3
+ Ruby gem to access Weather Channel (weather.com) XML API.
4
+
5
+ This gems lets you access to the search and get current conditions features. Forecast it's not implemented yet.
6
+
7
+ In order to use the API you will need first to get your partner_id and licence key from weather.com at this address:
8
+ http://www.weather.com/services/xmloap.html
9
+
10
+ Sign up, enter all your data and you'll get an email with the partner_id, licence key and a link to download the SDK info.
11
+ If you need to read the license agreement and the API doc you can do it here:
12
+ http://download.weather.com/web/xml/sdk.zip
13
+
14
+ == Example
15
+
16
+ require 'rubygems'
17
+ require 'r_weather'
18
+
19
+ RWeather.partner_id = "xxxxxxxxxx"
20
+ RWeather.key = "yyyyyyyyyyyyyyyy"
21
+
22
+ locations = RWeather.search('tucuman') # that's where I'm from :)
23
+ unless locations.empty?
24
+ locations.each_with_index do |location, i|
25
+ puts "#{i}) #{location.id} - #{location.name}"
26
+ end
27
+ cc = RWeather.current_conditions(locations.first.id)
28
+ puts "Current conditions: "
29
+ puts " Temperature: #{cc.tmp}"
30
+ puts " Feels like: #{cc.flik}"
31
+ end
data/lib/r_weather.rb ADDED
@@ -0,0 +1,53 @@
1
+ require 'net/http'
2
+ require 'xmlsimple'
3
+ require 'r_weather_current_condition'
4
+
5
+ RWeatherLocation = Struct.new(:type, :id, :name)
6
+
7
+ class RWeather
8
+
9
+ NOT_AUTHENTICATED = 'You should set partner_id and key values on RWeather before calling data request actions.'
10
+ SEARCH_URL = 'http://xoap.weather.com/search/search?where=%s'
11
+ LOCAL_URL = 'http://xoap.weather.com/weather/local/%s?par=%s&key=%s&link=xoap&prod=xoap'
12
+
13
+ VALID_UNITS = ['s', 'm']
14
+ DEFAULT_UNIT = 's' #standard
15
+
16
+ def self.partner_id; @@partner_id; end
17
+ def self.partner_id=(value); @@partner_id = value; end
18
+
19
+ def self.key; @@key; end
20
+ def self.key=(value); @@key = value; end
21
+
22
+ def self.search(where)
23
+ if data = get_and_parse(sprintf(SEARCH_URL, URI.encode(where)))
24
+ data['loc'].map{|loc| RWeatherLocation.new(loc['type'], loc['id'], loc['content'])}
25
+ end
26
+ end
27
+
28
+ def self.current_conditions(location_id, unit = DEFAULT_UNIT)
29
+ check_authentication
30
+ url = sprintf(LOCAL_URL, location_id, partner_id, key)
31
+ url << "&cc=true"
32
+ url << "&unit=#{unit}" if VALID_UNITS.include?(unit)
33
+ if data = get_and_parse(URI.encode(url))
34
+ RWeatherCurrentCondition.parse(data)
35
+ end
36
+ end
37
+
38
+ def self.local(partner_id, key)
39
+ check_authentication
40
+ end
41
+
42
+
43
+ class << self
44
+ def check_authentication
45
+ raise Exception.new(NOT_AUTHENTICATED) if @@partner_id.nil? || @@partner_id.empty? || @@key.nil? || @@key.empty?
46
+ end
47
+
48
+ def get_and_parse(url)
49
+ xml_data = Net::HTTP.get_response(URI.parse(url)).body
50
+ XmlSimple.xml_in(xml_data)
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,31 @@
1
+ RWeatherBar = Struct.new(:r, :d)
2
+ RWeatherWind = Struct.new(:s, :gust, :d, :t)
3
+ RWeatherUv = Struct.new(:i, :t)
4
+ RWeatherMoon = Struct.new(:icon, :t)
5
+
6
+ class RWeatherCurrentCondition
7
+ attr_accessor :lsup, :obst, :tmp, :flik, :t, :icon, :bar, :wind, :hmid, :vis, :uv, :dewp, :moon
8
+
9
+ def self.parse(simple_xml)
10
+ current_condition = new
11
+ cc = simple_xml['cc'].first
12
+ cc.each do |key, value|
13
+ current_condition.send(:"#{key}=", element_value(key, value))
14
+ end
15
+ current_condition
16
+ end
17
+
18
+ class << self
19
+ def element_value(key, value)
20
+ if value.size == 1 && !value.first.is_a?(Hash)
21
+ value.first
22
+ else
23
+ data = const_get(:"RWeather#{key.capitalize}").new
24
+ value.first.each do |key, value|
25
+ data.send(:"#{key}=", value.first)
26
+ end
27
+ data
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,69 @@
1
+ <?xml version="1.0" encoding="ISO-8859-1"?>
2
+ <!--This document is intended only for use by authorized licensees of The Weather Channel. Unauthorized use is prohibited. Copyright 1995-2005, The Weather Channel Interactive, Inc. All Rights Reserved.-->
3
+ <weather ver="2.0">
4
+ <head>
5
+ <locale>en_US</locale>
6
+ <form>MEDIUM</form>
7
+ <ut>C</ut>
8
+ <ud>km</ud>
9
+ <us>km/h</us>
10
+ <up>mb</up>
11
+ <ur>mm</ur>
12
+ </head>
13
+ <loc id="ARTN0088">
14
+ <dnam>San Miguel de Tucuman, Argentina</dnam>
15
+ <tm>11:23 AM</tm>
16
+ <lat>-26.83</lat>
17
+ <lon>-65.21</lon>
18
+ <sunr>8:09 AM</sunr>
19
+ <suns>6:36 PM</suns>
20
+ <zone>-3</zone>
21
+ </loc>
22
+ <lnks type="prmo">
23
+ <link pos="1">
24
+ <l>http://www.weather.com/allergies?par=xoap&amp;site=textlink&amp;cm_ven=XOAP&amp;cm_cat=TextLink&amp;cm_pla=Link1&amp;cm_ite=Allergies</l>
25
+ <t>Local Pollen Reports</t>
26
+ </link>
27
+ <link pos="2">
28
+ <l>http://www.weather.com/flights?par=xoap&amp;site=textlink&amp;cm_ven=XOAP&amp;cm_cat=TextLink&amp;cm_pla=Link2&amp;cm_ite=BusinessTraveler</l>
29
+ <t>Airport Conditions</t>
30
+ </link>
31
+ <link pos="3">
32
+ <l>http://www.weather.com/garden?par=xoap&amp;site=textlink&amp;cm_ven=XOAP&amp;cm_cat=TextLink&amp;cm_pla=Link3&amp;cm_ite=Garden</l>
33
+ <t>Lawn and Garden Weather</t>
34
+ </link>
35
+ <link pos="4">
36
+ <l>http://www.weather.com/traffic?par=xoap&amp;site=textlink&amp;cm_ven=XOAP&amp;cm_cat=TextLink&amp;cm_pla=Link4&amp;cm_ite=Traffic</l>
37
+ <t>Rush Hour Traffic</t>
38
+ </link>
39
+ </lnks>
40
+ <cc>
41
+ <lsup>6/22/08 11:00 AM Local Time</lsup>
42
+ <obst>San Miguel de Tucuman, Argentina</obst>
43
+ <tmp>7</tmp>
44
+ <flik>5</flik>
45
+ <t>Partly Cloudy</t>
46
+ <icon>30</icon>
47
+ <bar>
48
+ <r>1026.1</r>
49
+ <d>steady</d>
50
+ </bar>
51
+ <wind>
52
+ <s>11</s>
53
+ <gust>N/A</gust>
54
+ <d>50</d>
55
+ <t>NE</t>
56
+ </wind>
57
+ <hmid>87</hmid>
58
+ <vis>6.0</vis>
59
+ <uv>
60
+ <i>2</i>
61
+ <t>Low</t>
62
+ </uv>
63
+ <dewp>5</dewp>
64
+ <moon>
65
+ <icon>18</icon>
66
+ <t>Waning Gibbous</t>
67
+ </moon>
68
+ </cc>
69
+ </weather>
@@ -0,0 +1,54 @@
1
+ require 'lib/r_weather_current_condition'
2
+ require 'xmlsimple'
3
+
4
+ describe RWeatherCurrentCondition, 'parse' do
5
+
6
+ before :each do
7
+ file_data = File.open('spec/current_condition.xml', 'r') {|f| f.read}
8
+ @xml_data = XmlSimple.xml_in(file_data)
9
+ end
10
+
11
+ it "should parse simple xml data" do
12
+ cc = RWeatherCurrentCondition.parse(@xml_data)
13
+ cc.lsup.should == '6/22/08 11:00 AM Local Time'
14
+ cc.obst.should == 'San Miguel de Tucuman, Argentina'
15
+ cc.tmp.should == "7"
16
+ cc.flik.should == "5"
17
+ cc.t.should == 'Partly Cloudy'
18
+ cc.icon.should == "30"
19
+ cc.hmid.should == "87"
20
+ cc.vis.should == "6.0"
21
+ cc.dewp.should == "5"
22
+ end
23
+
24
+ it "should parse bar xml data" do
25
+ cc = RWeatherCurrentCondition.parse(@xml_data)
26
+ cc.bar.should be_kind_of(RWeatherBar)
27
+ cc.bar.r.should == '1026.1'
28
+ cc.bar.d.should == 'steady'
29
+ end
30
+
31
+ it "should parse wind xml data" do
32
+ cc = RWeatherCurrentCondition.parse(@xml_data)
33
+ cc.wind.should be_kind_of(RWeatherWind)
34
+ cc.wind.s.should == '11'
35
+ cc.wind.gust.should == 'N/A'
36
+ cc.wind.d.should == '50'
37
+ cc.wind.t.should == 'NE'
38
+ end
39
+
40
+ it "should parse uv xml data" do
41
+ cc = RWeatherCurrentCondition.parse(@xml_data)
42
+ cc.uv.should be_kind_of(RWeatherUv)
43
+ cc.uv.i.should == '2'
44
+ cc.uv.t.should == 'Low'
45
+ end
46
+
47
+ it "should parse moon xml data" do
48
+ cc = RWeatherCurrentCondition.parse(@xml_data)
49
+ cc.moon.should be_kind_of(RWeatherMoon)
50
+ cc.moon.icon.should == '18'
51
+ cc.moon.t.should == 'Waning Gibbous'
52
+ end
53
+
54
+ end
metadata ADDED
@@ -0,0 +1,66 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ckozus-rweather
3
+ version: !ruby/object:Gem::Version
4
+ version: "0.1"
5
+ platform: ruby
6
+ authors:
7
+ - Carlos Kozuszko
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2008-09-06 00:00:00 -07:00
13
+ default_executable:
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: xml-simple
17
+ version_requirement:
18
+ version_requirements: !ruby/object:Gem::Requirement
19
+ requirements:
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: 1.0.11
23
+ version:
24
+ description: This gems lets you access to the search and get current conditions features.
25
+ email: ckozus@gmail.com
26
+ executables: []
27
+
28
+ extensions: []
29
+
30
+ extra_rdoc_files:
31
+ - README
32
+ files:
33
+ - lib/r_weather.rb
34
+ - lib/r_weather_current_condition.rb
35
+ - spec/current_condition.xml
36
+ - spec/r_weather_current_condition_spec.rb
37
+ - README
38
+ has_rdoc: true
39
+ homepage: http://github.com/ckozus/rweather
40
+ post_install_message:
41
+ rdoc_options:
42
+ - --main
43
+ - README
44
+ require_paths:
45
+ - lib
46
+ required_ruby_version: !ruby/object:Gem::Requirement
47
+ requirements:
48
+ - - ">="
49
+ - !ruby/object:Gem::Version
50
+ version: "0"
51
+ version:
52
+ required_rubygems_version: !ruby/object:Gem::Requirement
53
+ requirements:
54
+ - - ">="
55
+ - !ruby/object:Gem::Version
56
+ version: "0"
57
+ version:
58
+ requirements: []
59
+
60
+ rubyforge_project:
61
+ rubygems_version: 1.2.0
62
+ signing_key:
63
+ specification_version: 2
64
+ summary: Ruby gem to access Weather Channel (weather.com) XML API.
65
+ test_files: []
66
+