barometer 0.3.2 → 0.5.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.rdoc +78 -70
- data/VERSION.yml +2 -2
- data/bin/barometer +100 -37
- data/lib/barometer.rb +12 -8
- data/lib/barometer/base.rb +48 -20
- data/lib/barometer/data.rb +5 -1
- data/lib/barometer/data/current.rb +23 -15
- data/lib/barometer/data/distance.rb +15 -5
- data/lib/barometer/data/forecast.rb +23 -5
- data/lib/barometer/data/geo.rb +16 -54
- data/lib/barometer/data/local_datetime.rb +137 -0
- data/lib/barometer/data/local_time.rb +134 -0
- data/lib/barometer/data/location.rb +6 -1
- data/lib/barometer/data/measurement.rb +71 -42
- data/lib/barometer/data/night.rb +69 -0
- data/lib/barometer/data/pressure.rb +15 -5
- data/lib/barometer/data/speed.rb +16 -5
- data/lib/barometer/data/sun.rb +8 -20
- data/lib/barometer/data/temperature.rb +22 -9
- data/lib/barometer/data/units.rb +10 -19
- data/lib/barometer/data/zone.rb +135 -9
- data/lib/barometer/formats.rb +12 -0
- data/lib/barometer/formats/coordinates.rb +42 -0
- data/lib/barometer/formats/format.rb +46 -0
- data/lib/barometer/formats/geocode.rb +51 -0
- data/lib/barometer/formats/icao.rb +37 -0
- data/lib/barometer/formats/postalcode.rb +22 -0
- data/lib/barometer/formats/short_zipcode.rb +17 -0
- data/lib/barometer/formats/weather_id.rb +107 -0
- data/lib/barometer/formats/zipcode.rb +31 -0
- data/lib/barometer/query.rb +61 -232
- data/lib/barometer/services.rb +14 -4
- data/lib/barometer/translations/icao_country_codes.yml +9 -0
- data/lib/barometer/translations/weather_country_codes.yml +17 -0
- data/lib/barometer/weather.rb +51 -30
- data/lib/barometer/{services → weather_services}/google.rb +23 -26
- data/lib/barometer/weather_services/noaa.rb +6 -0
- data/lib/barometer/{services → weather_services}/service.rb +101 -92
- data/lib/barometer/weather_services/weather_bug.rb +6 -0
- data/lib/barometer/weather_services/weather_dot_com.rb +261 -0
- data/lib/barometer/{services → weather_services}/wunderground.rb +58 -76
- data/lib/barometer/{services → weather_services}/yahoo.rb +91 -121
- data/lib/barometer/web_services/geocode.rb +33 -0
- data/lib/barometer/web_services/weather_id.rb +37 -0
- data/lib/barometer/web_services/web_service.rb +32 -0
- data/lib/demometer/demometer.rb +31 -4
- data/lib/demometer/views/forecast.erb +20 -0
- data/lib/demometer/views/index.erb +10 -3
- data/lib/demometer/views/measurement.erb +8 -3
- data/lib/demometer/views/readme.erb +63 -24
- data/spec/barometer_spec.rb +18 -36
- data/spec/{data_current_spec.rb → data/current_spec.rb} +73 -49
- data/spec/{data_distance_spec.rb → data/distance_spec.rb} +30 -30
- data/spec/{data_forecast_spec.rb → data/forecast_spec.rb} +57 -15
- data/spec/data/geo_spec.rb +91 -0
- data/spec/data/local_datetime_spec.rb +269 -0
- data/spec/data/local_time_spec.rb +239 -0
- data/spec/{data_location_spec.rb → data/location_spec.rb} +12 -1
- data/spec/{data_measurement_spec.rb → data/measurement_spec.rb} +135 -66
- data/spec/data/night_measurement_spec.rb +136 -0
- data/spec/{data_pressure_spec.rb → data/pressure_spec.rb} +29 -29
- data/spec/{data_speed_spec.rb → data/speed_spec.rb} +30 -30
- data/spec/data/sun_spec.rb +49 -0
- data/spec/{data_temperature_spec.rb → data/temperature_spec.rb} +44 -44
- data/spec/{units_spec.rb → data/units_spec.rb} +6 -6
- data/spec/{data_zone_spec.rb → data/zone_spec.rb} +15 -15
- data/spec/fixtures/formats/weather_id/90210.xml +1 -0
- data/spec/fixtures/formats/weather_id/atlanta.xml +1 -0
- data/spec/fixtures/formats/weather_id/from_USGA0028.xml +1 -0
- data/spec/fixtures/formats/weather_id/new_york.xml +1 -0
- data/spec/fixtures/{geocode_40_73.xml → geocode/40_73.xml} +0 -0
- data/spec/fixtures/{geocode_90210.xml → geocode/90210.xml} +0 -0
- data/spec/fixtures/{geocode_T5B4M9.xml → geocode/T5B4M9.xml} +0 -0
- data/spec/fixtures/geocode/atlanta.xml +1 -0
- data/spec/fixtures/{geocode_calgary_ab.xml → geocode/calgary_ab.xml} +0 -0
- data/spec/fixtures/{geocode_ksfo.xml → geocode/ksfo.xml} +0 -0
- data/spec/fixtures/{geocode_newyork_ny.xml → geocode/newyork_ny.xml} +0 -0
- data/spec/fixtures/{google_calgary_ab.xml → services/google/calgary_ab.xml} +0 -0
- data/spec/fixtures/services/weather_dot_com/90210.xml +1 -0
- data/spec/fixtures/{current_calgary_ab.xml → services/wunderground/current_calgary_ab.xml} +0 -0
- data/spec/fixtures/{forecast_calgary_ab.xml → services/wunderground/forecast_calgary_ab.xml} +0 -0
- data/spec/fixtures/{yahoo_90210.xml → services/yahoo/90210.xml} +0 -0
- data/spec/formats/coordinates_spec.rb +158 -0
- data/spec/formats/format_spec.rb +73 -0
- data/spec/formats/geocode_spec.rb +179 -0
- data/spec/formats/icao_spec.rb +61 -0
- data/spec/formats/postalcode_spec.rb +59 -0
- data/spec/formats/short_zipcode_spec.rb +53 -0
- data/spec/formats/weather_id_spec.rb +191 -0
- data/spec/formats/zipcode_spec.rb +111 -0
- data/spec/query_spec.rb +261 -288
- data/spec/spec_helper.rb +128 -4
- data/spec/{service_google_spec.rb → weather_services/google_spec.rb} +46 -46
- data/spec/weather_services/services_spec.rb +1118 -0
- data/spec/weather_services/weather_dot_com_spec.rb +327 -0
- data/spec/weather_services/wunderground_spec.rb +332 -0
- data/spec/{service_yahoo_spec.rb → weather_services/yahoo_spec.rb} +65 -81
- data/spec/weather_spec.rb +73 -61
- data/spec/web_services/geocode_spec.rb +45 -0
- data/spec/web_services/web_services_spec.rb +26 -0
- metadata +88 -36
- data/lib/barometer/services/noaa.rb +0 -6
- data/lib/barometer/services/weather_bug.rb +0 -6
- data/lib/barometer/services/weather_dot_com.rb +0 -6
- data/spec/data_geo_spec.rb +0 -94
- data/spec/data_sun_spec.rb +0 -76
- data/spec/service_wunderground_spec.rb +0 -330
- data/spec/services_spec.rb +0 -1106
@@ -5,7 +5,7 @@ describe "Units" do
|
|
5
5
|
describe "when initialized" do
|
6
6
|
|
7
7
|
before(:each) do
|
8
|
-
@units =
|
8
|
+
@units = Data::Units.new
|
9
9
|
end
|
10
10
|
|
11
11
|
it "responds to metric, defaults to true" do
|
@@ -15,7 +15,7 @@ describe "Units" do
|
|
15
15
|
it "allows metric to be set" do
|
16
16
|
@units.metric.should be_true
|
17
17
|
|
18
|
-
@units2 =
|
18
|
+
@units2 = Data::Units.new(false)
|
19
19
|
@units2.metric.should be_false
|
20
20
|
end
|
21
21
|
|
@@ -32,7 +32,7 @@ describe "Units" do
|
|
32
32
|
describe "changing units" do
|
33
33
|
|
34
34
|
before(:each) do
|
35
|
-
@units =
|
35
|
+
@units = Data::Units.new
|
36
36
|
end
|
37
37
|
|
38
38
|
it "indicates if metric?" do
|
@@ -62,7 +62,7 @@ describe "Units" do
|
|
62
62
|
|
63
63
|
before(:each) do
|
64
64
|
module Barometer
|
65
|
-
class Units
|
65
|
+
class Data::Units
|
66
66
|
attr_accessor :a, :b
|
67
67
|
def metric_default=(value)
|
68
68
|
self.a = value
|
@@ -72,8 +72,8 @@ describe "Units" do
|
|
72
72
|
end
|
73
73
|
end
|
74
74
|
end
|
75
|
-
@units_metric =
|
76
|
-
@units_imperial =
|
75
|
+
@units_metric = Data::Units.new(true)
|
76
|
+
@units_imperial = Data::Units.new(false)
|
77
77
|
@test_value_a = 5.5
|
78
78
|
@test_value_b = 9.9
|
79
79
|
end
|
@@ -1,17 +1,17 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
describe "Zone" do
|
3
|
+
describe "Data::Zone" do
|
4
4
|
|
5
5
|
describe "and class methods" do
|
6
6
|
|
7
7
|
it "responds to now and returns Time object" do
|
8
|
-
|
9
|
-
|
8
|
+
Data::Zone.respond_to?("now").should be_true
|
9
|
+
Data::Zone.now.is_a?(Time).should be_true
|
10
10
|
end
|
11
11
|
|
12
12
|
it "responds to today and returns Date object" do
|
13
|
-
|
14
|
-
|
13
|
+
Data::Zone.respond_to?("today").should be_true
|
14
|
+
Data::Zone.today.is_a?(Date).should be_true
|
15
15
|
end
|
16
16
|
|
17
17
|
end
|
@@ -21,7 +21,7 @@ describe "Zone" do
|
|
21
21
|
before(:each) do
|
22
22
|
@utc = Time.now.utc
|
23
23
|
@timezone = "Europe/Paris"
|
24
|
-
@zone =
|
24
|
+
@zone = Data::Zone.new(@timezone)
|
25
25
|
end
|
26
26
|
|
27
27
|
it "responds to timezone" do
|
@@ -30,26 +30,26 @@ describe "Zone" do
|
|
30
30
|
end
|
31
31
|
|
32
32
|
it "responds to tz" do
|
33
|
-
lambda {
|
33
|
+
lambda { Data::Zone.new("invalid timezone") }.should raise_error(TZInfo::InvalidTimezoneIdentifier)
|
34
34
|
|
35
|
-
zone =
|
35
|
+
zone = Data::Zone.new(@timezone)
|
36
36
|
zone.tz.should_not be_nil
|
37
37
|
end
|
38
38
|
|
39
39
|
it "responds to code" do
|
40
40
|
@zone.respond_to?("code").should be_true
|
41
|
-
zone =
|
41
|
+
zone = Data::Zone.new(@timezone)
|
42
42
|
zone.tz = nil
|
43
43
|
zone.tz.should be_nil
|
44
44
|
zone.code.should == ""
|
45
45
|
|
46
|
-
zone =
|
46
|
+
zone = Data::Zone.new(@timezone)
|
47
47
|
zone.code.should == "CEST"
|
48
48
|
end
|
49
49
|
|
50
50
|
it "responds to dst?" do
|
51
51
|
@zone.respond_to?("dst?").should be_true
|
52
|
-
zone =
|
52
|
+
zone = Data::Zone.new(@timezone)
|
53
53
|
zone.tz = nil
|
54
54
|
zone.tz.should be_nil
|
55
55
|
zone.dst?.should be_nil
|
@@ -66,11 +66,11 @@ describe "Zone" do
|
|
66
66
|
end
|
67
67
|
|
68
68
|
it "responds to now" do
|
69
|
-
|
69
|
+
Data::Zone.respond_to?("now").should be_true
|
70
70
|
end
|
71
71
|
|
72
72
|
it "responds to today" do
|
73
|
-
|
73
|
+
Data::Zone.respond_to?("today").should be_true
|
74
74
|
end
|
75
75
|
|
76
76
|
it "converts local_time to utc" do
|
@@ -104,7 +104,7 @@ describe "Zone" do
|
|
104
104
|
# in two UTC times that are off by the same offset
|
105
105
|
original_difference = local_offset - target_offset
|
106
106
|
|
107
|
-
target_utc_time =
|
107
|
+
target_utc_time = Data::Zone.code_to_utc(target_time, target_zone)
|
108
108
|
local_utc_time = local_time.utc
|
109
109
|
|
110
110
|
(target_utc_time - local_time.utc).to_i.should == original_difference.to_i
|
@@ -118,7 +118,7 @@ describe "Zone" do
|
|
118
118
|
date = Date.parse(merge_date)
|
119
119
|
time = Time.parse(merge_time)
|
120
120
|
|
121
|
-
utc_time =
|
121
|
+
utc_time = Data::Zone.merge(merge_time, merge_date, merge_zonecode)
|
122
122
|
|
123
123
|
utc_time.year.should == date.year
|
124
124
|
utc_time.month.should == date.month
|
@@ -0,0 +1 @@
|
|
1
|
+
<?xml version='1.0' encoding='ISO-8859-1'?> <!-- This document is intended only for use by authorized licensees of The --> <!-- Weather Channel. Unauthorized use is prohibited. Copyright 1995-2009, --> <!-- The Weather Channel Interactive, Inc. All Rights Reserved. --> <search ver='3.0'> <loc id='USCA0090' type='1'> Beverly Hills, CA </loc> </search>
|
@@ -0,0 +1 @@
|
|
1
|
+
<?xml version='1.0' encoding='ISO-8859-1'?> <!-- This document is intended only for use by authorized licensees of The --> <!-- Weather Channel. Unauthorized use is prohibited. Copyright 1995-2009, --> <!-- The Weather Channel Interactive, Inc. All Rights Reserved. --> <search ver='3.0'> <loc id='USGA0028' type='1'> Atlanta, GA </loc> <loc id='USGA0029' type='1'> Atlanta/Fulton County Arpt, GA </loc> </search>
|
@@ -0,0 +1 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?> <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#"> <channel> <title>Yahoo! Weather - Atlanta, GA</title> <link>http://us.rd.yahoo.com/dailynews/rss/weather/Atlanta__GA/*http://weather.yahoo.com/forecast/USGA0028_f.html</link> <description>Yahoo! Weather for Atlanta, GA</description> <language>en-us</language> <lastBuildDate>Mon, 04 May 2009 2:52 am EDT</lastBuildDate> <ttl>60</ttl> <yweather:location city="Atlanta" region="GA" country="US"/> <yweather:units temperature="F" distance="mi" pressure="in" speed="mph"/> <yweather:wind chill="63" direction="230" speed="8" /> <yweather:atmosphere humidity="90" visibility="10" pressure="29.96" rising="0" /> <yweather:astronomy sunrise="6:47 am" sunset="8:23 pm"/> <image> <title>Yahoo! Weather</title> <width>142</width> <height>18</height> <link>http://weather.yahoo.com</link> <url>http://l.yimg.com/a/i/us/nws/th/main_142b.gif</url> </image> <item> <title>Conditions for Atlanta, GA at 2:52 am EDT</title> <geo:lat>33.75</geo:lat> <geo:long>-84.39</geo:long> <link>http://us.rd.yahoo.com/dailynews/rss/weather/Atlanta__GA/*http://weather.yahoo.com/forecast/USGA0028_f.html</link> <pubDate>Mon, 04 May 2009 2:52 am EDT</pubDate> <yweather:condition text="Mostly Cloudy" code="27" temp="63" date="Mon, 04 May 2009 2:52 am EDT" /> <description><![CDATA[ <img src="http://l.yimg.com/a/i/us/we/52/27.gif"/><br /> <b>Current Conditions:</b><br /> Mostly Cloudy, 63 F<BR /> <BR /><b>Forecast:</b><BR /> Mon - Strong Storms. High: 77 Low: 64<br /> Tue - Thunderstorms. High: 70 Low: 59<br /> <br /> <a href="http://us.rd.yahoo.com/dailynews/rss/weather/Atlanta__GA/*http://weather.yahoo.com/forecast/USGA0028_f.html">Full Forecast at Yahoo! Weather</a><BR/> (provided by The Weather Channel)<br/> ]]></description> <yweather:forecast day="Mon" date="4 May 2009" low="64" high="77" text="Strong Storms" code="3" /> <yweather:forecast day="Tue" date="5 May 2009" low="59" high="70" text="Thunderstorms" code="4" /> <guid isPermaLink="false">USGA0028_2009_05_04_2_52_EDT</guid> </item> </channel> </rss><!-- api4.weather.sp1.yahoo.com compressed/chunked Mon May 4 00:02:14 PDT 2009 -->
|
@@ -0,0 +1 @@
|
|
1
|
+
<?xml version='1.0' encoding='ISO-8859-1'?> <!-- This document is intended only for use by authorized licensees of The --> <!-- Weather Channel. Unauthorized use is prohibited. Copyright 1995-2009, --> <!-- The Weather Channel Interactive, Inc. All Rights Reserved. --> <search ver='3.0'> <loc id='USNY0996' type='1'> New York, NY </loc> <loc id='USNY0011' type='1'> Albany, NY </loc> <loc id='USNY0181' type='1'> Buffalo, NY </loc> <loc id='USNY1232' type='1'> Rochester, NY </loc> <loc id='USNY1434' type='1'> Syracuse, NY </loc> <loc id='USNY1010' type='1'> Niagara Falls, NY </loc> <loc id='USNY1630' type='1'> York, NY </loc> <loc id='USNY0997' type='1'> New York Mills, NY </loc> <loc id='USNY0819' type='1'> Little York, NY </loc> <loc id='USNY0998' type='1'> New York/Central Park, NY </loc> </search>
|
File without changes
|
File without changes
|
File without changes
|
@@ -0,0 +1 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8" ?> <kml xmlns="http://earth.google.com/kml/2.0"><Response> <name>Atlanta, GA, US</name> <Status> <code>200</code> <request>geocode</request> </Status> <Placemark id="p1"> <address>Atlanta, GA, USA</address> <AddressDetails Accuracy="4" xmlns="urn:oasis:names:tc:ciq:xsdschema:xAL:2.0"><Country><CountryNameCode>US</CountryNameCode><CountryName>USA</CountryName><AdministrativeArea><AdministrativeAreaName>GA</AdministrativeAreaName><Locality><LocalityName>Atlanta</LocalityName></Locality></AdministrativeArea></Country></AddressDetails> <ExtendedData> <LatLonBox north="33.8869080" south="33.6478380" east="-84.2894180" west="-84.5466630" /> </ExtendedData> <Point><coordinates>-84.3896630,33.7544870,0</coordinates></Point> </Placemark> </Response></kml>
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
@@ -0,0 +1 @@
|
|
1
|
+
<?xml version="1.0" encoding="ISO-8859-1"?> <!-- This document is intended only for use by authorized licensees of The --> <!-- Weather Channel. Unauthorized use is prohibited. Copyright 1995-2009, --> <!-- The Weather Channel Interactive, Inc. All Rights Reserved. --> <weather ver="2.0"> <head> <locale>en_US</locale> <form>MEDIUM</form> <ut>C</ut> <ud>km</ud> <us>km/h</us> <up>mb</up> <ur>mm</ur> </head> <loc id="90210"> <dnam>Beverly Hills, CA (90210)</dnam> <tm>1:26 AM</tm> <lat>34.10</lat> <lon>-118.41</lon> <sunr>6:01 AM</sunr> <suns>7:40 PM</suns> <zone>-7</zone> </loc> <lnks type="prmo"> <link pos="1"> <l>http://www.weather.com/allergies?par=xoap&site=textlink&cm_ven=XOAP&cm_cat=TextLink&cm_pla=Link1&cm_ite=Allergies</l> <t>Local Pollen Reports</t> </link> <link pos="2"> <l>http://www.weather.com/flights?par=xoap&site=textlink&cm_ven=XOAP&cm_cat=TextLink&cm_pla=Link2&cm_ite=BusinessTraveler</l> <t>Airport Conditions</t> </link> <link pos="3"> <l>http://www.weather.com/garden?par=xoap&site=textlink&cm_ven=XOAP&cm_cat=TextLink&cm_pla=Link3&cm_ite=Garden</l> <t>Lawn and Garden Weather</t> </link> <link pos="4"> <l>http://www.weather.com/traffic?par=xoap&site=textlink&cm_ven=XOAP&cm_cat=TextLink&cm_pla=Link4&cm_ite=Traffic</l> <t>Rush Hour Traffic</t> </link> </lnks> <cc> <lsup>5/4/09 12:51 AM PDT</lsup> <obst>Santa Monica, CA</obst> <tmp>16</tmp> <flik>16</flik> <t>Fair</t> <icon>33</icon> <bar> <r>1016.6</r> <d>rising</d> </bar> <wind> <s>5</s> <gust>N/A</gust> <d>80</d> <t>E</t> </wind> <hmid>75</hmid> <vis>16.1</vis> <uv> <i>0</i> <t>Low</t> </uv> <dewp>12</dewp> <moon> <icon>9</icon> <t>Waxing Gibbous</t> </moon> </cc> <dayf> <lsup>5/4/09 12:25 AM PDT</lsup> <day d="0" t="Sunday" dt="May 3"> <hi>N/A</hi> <low>14</low> <sunr>6:02 AM</sunr> <suns>7:40 PM</suns> <part p="d"> <icon>30</icon> <t>Partly Cloudy</t> <wind> <s>16</s> <gust>N/A</gust> <d>288</d> <t>WNW</t> </wind> <bt>P Cloudy</bt> <ppcp>10</ppcp> <hmid>65</hmid> </part> <part p="n"> <icon>29</icon> <t>Partly Cloudy</t> <wind> <s>14</s> <gust>N/A</gust> <d>335</d> <t>NNW</t> </wind> <bt>P Cloudy</bt> <ppcp>10</ppcp> <hmid>71</hmid> </part> </day> <day d="1" t="Monday" dt="May 4"> <hi>25</hi> <low>14</low> <sunr>6:01 AM</sunr> <suns>7:40 PM</suns> <part p="d"> <icon>30</icon> <t>Partly Cloudy</t> <wind> <s>18</s> <gust>N/A</gust> <d>260</d> <t>W</t> </wind> <bt>P Cloudy</bt> <ppcp>10</ppcp> <hmid>53</hmid> </part> <part p="n"> <icon>29</icon> <t>Partly Cloudy</t> <wind> <s>13</s> <gust>N/A</gust> <d>334</d> <t>NNW</t> </wind> <bt>P Cloudy</bt> <ppcp>0</ppcp> <hmid>67</hmid> </part> </day> <day d="2" t="Tuesday" dt="May 5"> <hi>26</hi> <low>16</low> <sunr>6:00 AM</sunr> <suns>7:41 PM</suns> <part p="d"> <icon>30</icon> <t>Partly Cloudy</t> <wind> <s>19</s> <gust>N/A</gust> <d>279</d> <t>W</t> </wind> <bt>P Cloudy</bt> <ppcp>0</ppcp> <hmid>53</hmid> </part> <part p="n"> <icon>33</icon> <t>Mostly Clear</t> <wind> <s>10</s> <gust>N/A</gust> <d>313</d> <t>NW</t> </wind> <bt>M Clear</bt> <ppcp>0</ppcp> <hmid>63</hmid> </part> </day> <day d="3" t="Wednesday" dt="May 6"> <hi>27</hi> <low>16</low> <sunr>5:59 AM</sunr> <suns>7:42 PM</suns> <part p="d"> <icon>34</icon> <t>Mostly Sunny</t> <wind> <s>13</s> <gust>N/A</gust> <d>286</d> <t>WNW</t> </wind> <bt>M Sunny</bt> <ppcp>0</ppcp> <hmid>55</hmid> </part> <part p="n"> <icon>31</icon> <t>Clear</t> <wind> <s>8</s> <gust>N/A</gust> <d>313</d> <t>NW</t> </wind> <bt>Clear</bt> <ppcp>0</ppcp> <hmid>56</hmid> </part> </day> <day d="4" t="Thursday" dt="May 7"> <hi>26</hi> <low>16</low> <sunr>5:58 AM</sunr> <suns>7:43 PM</suns> <part p="d"> <icon>32</icon> <t>Sunny</t> <wind> <s>14</s> <gust>N/A</gust> <d>318</d> <t>NW</t> </wind> <bt>Sunny</bt> <ppcp>0</ppcp> <hmid>49</hmid> </part> <part p="n"> <icon>31</icon> <t>Clear</t> <wind> <s>6</s> <gust>N/A</gust> <d>13</d> <t>NNE</t> </wind> <bt>Clear</bt> <ppcp>0</ppcp> <hmid>50</hmid> </part> </day> </dayf> </weather>
|
File without changes
|
data/spec/fixtures/{forecast_calgary_ab.xml → services/wunderground/forecast_calgary_ab.xml}
RENAMED
File without changes
|
File without changes
|
@@ -0,0 +1,158 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe "Query::Coordinates" do
|
4
|
+
|
5
|
+
before(:each) do
|
6
|
+
@short_zipcode = "90210"
|
7
|
+
@zipcode = @short_zipcode
|
8
|
+
@long_zipcode = "90210-5555"
|
9
|
+
@weather_id = "USGA0028"
|
10
|
+
@postal_code = "T5B 4M9"
|
11
|
+
@coordinates = "40.756054,-73.986951"
|
12
|
+
@geocode = "New York, NY"
|
13
|
+
@icao = "KSFO"
|
14
|
+
end
|
15
|
+
|
16
|
+
describe "and class methods" do
|
17
|
+
|
18
|
+
it "returns a format" do
|
19
|
+
Query::Format::Coordinates.format.should == :coordinates
|
20
|
+
end
|
21
|
+
|
22
|
+
it "returns a country" do
|
23
|
+
Query::Format::Coordinates.country_code.should be_nil
|
24
|
+
end
|
25
|
+
|
26
|
+
it "returns a regex" do
|
27
|
+
Query::Format::Coordinates.regex.should_not be_nil
|
28
|
+
Query::Format::Coordinates.regex.is_a?(Regexp).should be_true
|
29
|
+
end
|
30
|
+
|
31
|
+
it "returns the convertable_formats" do
|
32
|
+
Query::Format::Coordinates.convertable_formats.should_not be_nil
|
33
|
+
Query::Format::Coordinates.convertable_formats.is_a?(Array).should be_true
|
34
|
+
Query::Format::Coordinates.convertable_formats.include?(:short_zipcode).should be_true
|
35
|
+
Query::Format::Coordinates.convertable_formats.include?(:zipcode).should be_true
|
36
|
+
Query::Format::Coordinates.convertable_formats.include?(:postalcode).should be_true
|
37
|
+
Query::Format::Coordinates.convertable_formats.include?(:weather_id).should be_true
|
38
|
+
Query::Format::Coordinates.convertable_formats.include?(:coordinates).should be_true
|
39
|
+
Query::Format::Coordinates.convertable_formats.include?(:icao).should be_true
|
40
|
+
Query::Format::Coordinates.convertable_formats.include?(:geocode).should be_true
|
41
|
+
end
|
42
|
+
|
43
|
+
describe "is?," do
|
44
|
+
|
45
|
+
before(:each) do
|
46
|
+
@valid = "40.756054,-73.986951"
|
47
|
+
@invalid = "invalid"
|
48
|
+
end
|
49
|
+
|
50
|
+
it "recognizes a valid format" do
|
51
|
+
Query::Format::Coordinates.is?(@valid).should be_true
|
52
|
+
end
|
53
|
+
|
54
|
+
it "recognizes non-valid format" do
|
55
|
+
Query::Format::Coordinates.is?(@invalid).should be_false
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
59
|
+
|
60
|
+
describe "when converting using 'to'," do
|
61
|
+
|
62
|
+
it "requires a Query::Format object" do
|
63
|
+
lambda { Query::Format::Coordinates.to }.should raise_error(ArgumentError)
|
64
|
+
lambda { Query::Format::Coordinates.to("invalid") }.should raise_error(ArgumentError)
|
65
|
+
query = Barometer::Query.new(@zipcode)
|
66
|
+
query.is_a?(Barometer::Query).should be_true
|
67
|
+
lambda { Query::Format::Coordinates.to(original_query) }.should_not raise_error(ArgumentError)
|
68
|
+
end
|
69
|
+
|
70
|
+
it "returns a Barometer::Query" do
|
71
|
+
query = Barometer::Query.new(@short_zipcode)
|
72
|
+
Query::Format::Coordinates.to(query).is_a?(Barometer::Query).should be_true
|
73
|
+
end
|
74
|
+
|
75
|
+
it "converts from short_zipcode" do
|
76
|
+
query = Barometer::Query.new(@short_zipcode)
|
77
|
+
query.format.should == :short_zipcode
|
78
|
+
new_query = Query::Format::Coordinates.to(query)
|
79
|
+
new_query.q.should == "34.1030032,-118.4104684"
|
80
|
+
new_query.country_code.should == "US"
|
81
|
+
new_query.format.should == :coordinates
|
82
|
+
new_query.geo.should_not be_nil
|
83
|
+
end
|
84
|
+
|
85
|
+
it "converts from zipcode" do
|
86
|
+
query = Barometer::Query.new(@zipcode)
|
87
|
+
query.format = :zipcode
|
88
|
+
query.format.should == :zipcode
|
89
|
+
new_query = Query::Format::Coordinates.to(query)
|
90
|
+
new_query.q.should == "34.1030032,-118.4104684"
|
91
|
+
new_query.country_code.should == "US"
|
92
|
+
new_query.format.should == :coordinates
|
93
|
+
new_query.geo.should_not be_nil
|
94
|
+
end
|
95
|
+
|
96
|
+
it "converts from weather_id" do
|
97
|
+
query = Barometer::Query.new(@weather_id)
|
98
|
+
query.format.should == :weather_id
|
99
|
+
new_query = Query::Format::Coordinates.to(query)
|
100
|
+
new_query.q.should == "33.754487,-84.389663"
|
101
|
+
new_query.country_code.should == "US"
|
102
|
+
new_query.format.should == :coordinates
|
103
|
+
new_query.geo.should_not be_nil
|
104
|
+
end
|
105
|
+
|
106
|
+
it "converts from geocode" do
|
107
|
+
query = Barometer::Query.new(@geocode)
|
108
|
+
query.format.should == :geocode
|
109
|
+
new_query = Query::Format::Coordinates.to(query)
|
110
|
+
new_query.q.should == "40.756054,-73.986951"
|
111
|
+
new_query.country_code.should == "US"
|
112
|
+
new_query.format.should == :coordinates
|
113
|
+
new_query.geo.should_not be_nil
|
114
|
+
end
|
115
|
+
|
116
|
+
it "converts from postal_code" do
|
117
|
+
query = Barometer::Query.new(@postal_code)
|
118
|
+
query.format.should == :postalcode
|
119
|
+
new_query = Query::Format::Coordinates.to(query)
|
120
|
+
new_query.q.should == "53.570447,-113.456083"
|
121
|
+
new_query.country_code.should == "CA"
|
122
|
+
new_query.format.should == :coordinates
|
123
|
+
new_query.geo.should_not be_nil
|
124
|
+
end
|
125
|
+
|
126
|
+
it "converts from icao" do
|
127
|
+
query = Barometer::Query.new(@icao)
|
128
|
+
query.format.should == :icao
|
129
|
+
new_query = Query::Format::Coordinates.to(query)
|
130
|
+
new_query.q.should == "37.615223,-122.389979"
|
131
|
+
new_query.country_code.should == "US"
|
132
|
+
new_query.format.should == :coordinates
|
133
|
+
new_query.geo.should_not be_nil
|
134
|
+
end
|
135
|
+
|
136
|
+
it "returns nil for other formats" do
|
137
|
+
query = Barometer::Query.new(@coordinates)
|
138
|
+
query.format.should == :coordinates
|
139
|
+
new_query = Query::Format::Coordinates.to(query)
|
140
|
+
new_query.q.should == "40.756201,-73.986513"
|
141
|
+
new_query.country_code.should == "US"
|
142
|
+
new_query.format.should == :coordinates
|
143
|
+
new_query.geo.should_not be_nil
|
144
|
+
end
|
145
|
+
|
146
|
+
it "skips conversion when no API key" do
|
147
|
+
Barometer.google_geocode_key = nil
|
148
|
+
Barometer.google_geocode_key.should be_nil
|
149
|
+
query = Barometer::Query.new(@short_zipcode)
|
150
|
+
Query::Format::Coordinates.to(query).q.should be_nil
|
151
|
+
Barometer.google_geocode_key = KEY
|
152
|
+
end
|
153
|
+
|
154
|
+
end
|
155
|
+
|
156
|
+
end
|
157
|
+
|
158
|
+
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe "Query::Format" do
|
4
|
+
|
5
|
+
describe "and class methods" do
|
6
|
+
|
7
|
+
describe "is?," do
|
8
|
+
|
9
|
+
it "requires a String" do
|
10
|
+
invalid = 1
|
11
|
+
lambda { Barometer::Query::Format.is?(invalid) }.should raise_error(ArgumentError)
|
12
|
+
|
13
|
+
valid = "string"
|
14
|
+
valid.is_a?(String).should be_true
|
15
|
+
lambda { Barometer::Query::Format.is?(valid) }.should_not raise_error(ArgumentError)
|
16
|
+
end
|
17
|
+
|
18
|
+
it "calls a stubbed undefined method" do
|
19
|
+
lambda { Barometer::Query::Format.is?("valid") }.should raise_error(NotImplementedError)
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
|
24
|
+
describe "converts?," do
|
25
|
+
|
26
|
+
it "requires a Query object" do
|
27
|
+
invalid = 1
|
28
|
+
Barometer::Query::Format.converts?(invalid).should be_false
|
29
|
+
|
30
|
+
valid = Barometer::Query.new
|
31
|
+
valid.is_a?(Barometer::Query).should be_true
|
32
|
+
lambda { Barometer::Query::Format.converts?(valid) }.should_not raise_error(ArgumentError)
|
33
|
+
end
|
34
|
+
|
35
|
+
it "returns false" do
|
36
|
+
valid = Barometer::Query.new
|
37
|
+
Barometer::Query::Format.converts?(valid).should be_false
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
41
|
+
|
42
|
+
it "detects a Query object" do
|
43
|
+
invalid = 1
|
44
|
+
Barometer::Query::Format.is_a_query?.should be_false
|
45
|
+
Barometer::Query::Format.is_a_query?(invalid).should be_false
|
46
|
+
valid = Barometer::Query.new
|
47
|
+
valid.is_a?(Barometer::Query).should be_true
|
48
|
+
Barometer::Query::Format.is_a_query?(valid).should be_true
|
49
|
+
end
|
50
|
+
|
51
|
+
it "stubs regex" do
|
52
|
+
lambda { Barometer::Query::Format.regex }.should raise_error(NotImplementedError)
|
53
|
+
end
|
54
|
+
|
55
|
+
it "stubs format" do
|
56
|
+
lambda { Barometer::Query::Format.format }.should raise_error(NotImplementedError)
|
57
|
+
end
|
58
|
+
|
59
|
+
it "stubs to" do
|
60
|
+
Barometer::Query::Format.to.should be_nil
|
61
|
+
end
|
62
|
+
|
63
|
+
it "stubs country_code" do
|
64
|
+
Barometer::Query::Format.country_code.should be_nil
|
65
|
+
end
|
66
|
+
|
67
|
+
it "stubs convertable_formats" do
|
68
|
+
Barometer::Query::Format.convertable_formats.should == []
|
69
|
+
end
|
70
|
+
|
71
|
+
end
|
72
|
+
|
73
|
+
end
|
@@ -0,0 +1,179 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe "Query::Geocode" do
|
4
|
+
|
5
|
+
before(:each) do
|
6
|
+
@short_zipcode = "90210"
|
7
|
+
@zipcode = @short_zipcode
|
8
|
+
@long_zipcode = "90210-5555"
|
9
|
+
@weather_id = "USGA0028"
|
10
|
+
@postal_code = "T5B 4M9"
|
11
|
+
@coordinates = "40.756054,-73.986951"
|
12
|
+
@geocode = "New York, NY"
|
13
|
+
@icao = "KSFO"
|
14
|
+
end
|
15
|
+
|
16
|
+
describe "and class methods" do
|
17
|
+
|
18
|
+
it "returns a format" do
|
19
|
+
Query::Format::Geocode.format.should == :geocode
|
20
|
+
end
|
21
|
+
|
22
|
+
it "returns a country" do
|
23
|
+
Query::Format::Geocode.country_code.should be_nil
|
24
|
+
end
|
25
|
+
|
26
|
+
it "returns the convertable_formats" do
|
27
|
+
Query::Format::Geocode.convertable_formats.should_not be_nil
|
28
|
+
Query::Format::Geocode.convertable_formats.is_a?(Array).should be_true
|
29
|
+
Query::Format::Geocode.convertable_formats.include?(:short_zipcode).should be_true
|
30
|
+
Query::Format::Geocode.convertable_formats.include?(:zipcode).should be_true
|
31
|
+
Query::Format::Geocode.convertable_formats.include?(:coordinates).should be_true
|
32
|
+
Query::Format::Geocode.convertable_formats.include?(:weather_id).should be_true
|
33
|
+
Query::Format::Geocode.convertable_formats.include?(:icao).should be_true
|
34
|
+
end
|
35
|
+
|
36
|
+
describe "is?," do
|
37
|
+
|
38
|
+
before(:each) do
|
39
|
+
@valid = "New York, NY"
|
40
|
+
end
|
41
|
+
|
42
|
+
it "recognizes a valid format" do
|
43
|
+
Query::Format::Geocode.is?(@valid).should be_true
|
44
|
+
Query::Format::Geocode.is?.should be_false
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
48
|
+
|
49
|
+
describe "when converting using 'to'," do
|
50
|
+
|
51
|
+
before(:each) do
|
52
|
+
Barometer.force_geocode = false
|
53
|
+
end
|
54
|
+
|
55
|
+
it "requires a Barometer::Query object" do
|
56
|
+
lambda { Query::Format::Geocode.to }.should raise_error(ArgumentError)
|
57
|
+
lambda { Query::Format::Geocode.to("invalid") }.should raise_error(ArgumentError)
|
58
|
+
query = Barometer::Query.new(@zipcode)
|
59
|
+
query.is_a?(Barometer::Query).should be_true
|
60
|
+
lambda { Query::Format::Geocode.to(query) }.should_not raise_error(ArgumentError)
|
61
|
+
end
|
62
|
+
|
63
|
+
it "returns a Barometer::Query" do
|
64
|
+
query = Barometer::Query.new(@short_zipcode)
|
65
|
+
Query::Format::Geocode.to(query).is_a?(Barometer::Query).should be_true
|
66
|
+
end
|
67
|
+
|
68
|
+
it "converts from short_zipcode" do
|
69
|
+
query = Barometer::Query.new(@short_zipcode)
|
70
|
+
query.format.should == :short_zipcode
|
71
|
+
new_query = Query::Format::Geocode.to(query)
|
72
|
+
new_query.q.should == "Beverly Hills, CA, USA"
|
73
|
+
new_query.country_code.should == "US"
|
74
|
+
new_query.format.should == :geocode
|
75
|
+
new_query.geo.should_not be_nil
|
76
|
+
end
|
77
|
+
|
78
|
+
it "converts from zipcode" do
|
79
|
+
query = Barometer::Query.new(@zipcode)
|
80
|
+
query.format = :zipcode
|
81
|
+
query.format.should == :zipcode
|
82
|
+
new_query = Query::Format::Geocode.to(query)
|
83
|
+
new_query.q.should == "Beverly Hills, CA, USA"
|
84
|
+
new_query.country_code.should == "US"
|
85
|
+
new_query.format.should == :geocode
|
86
|
+
new_query.geo.should_not be_nil
|
87
|
+
end
|
88
|
+
|
89
|
+
it "converts from weather_id" do
|
90
|
+
query = Barometer::Query.new(@weather_id)
|
91
|
+
query.format.should == :weather_id
|
92
|
+
new_query = Query::Format::Geocode.to(query)
|
93
|
+
new_query.q.should == "Atlanta, GA, US"
|
94
|
+
new_query.country_code.should be_nil
|
95
|
+
new_query.format.should == :geocode
|
96
|
+
new_query.geo.should be_nil
|
97
|
+
end
|
98
|
+
|
99
|
+
it "converts from coordinates" do
|
100
|
+
query = Barometer::Query.new(@coordinates)
|
101
|
+
query.format.should == :coordinates
|
102
|
+
new_query = Query::Format::Geocode.to(query)
|
103
|
+
new_query.q.should == "New York, NY, USA"
|
104
|
+
new_query.country_code.should == "US"
|
105
|
+
new_query.format.should == :geocode
|
106
|
+
new_query.geo.should_not be_nil
|
107
|
+
end
|
108
|
+
|
109
|
+
it "converts from icao" do
|
110
|
+
query = Barometer::Query.new(@icao)
|
111
|
+
query.format.should == :icao
|
112
|
+
new_query = Query::Format::Geocode.to(query)
|
113
|
+
new_query.q.should == "San Francisco Airport, USA"
|
114
|
+
new_query.country_code.should == "US"
|
115
|
+
new_query.format.should == :geocode
|
116
|
+
new_query.geo.should_not be_nil
|
117
|
+
end
|
118
|
+
|
119
|
+
it "does not convert postalcode" do
|
120
|
+
query = Barometer::Query.new(@postal_code)
|
121
|
+
query.format.should == :postalcode
|
122
|
+
new_query = Query::Format::Geocode.to(query)
|
123
|
+
new_query.should be_nil
|
124
|
+
end
|
125
|
+
|
126
|
+
it "leaves geocode untouched" do
|
127
|
+
query = Barometer::Query.new(@geocode)
|
128
|
+
query.format.should == :geocode
|
129
|
+
new_query = Query::Format::Geocode.to(query)
|
130
|
+
new_query.q.should == "New York, NY"
|
131
|
+
new_query.country_code.should be_nil
|
132
|
+
new_query.format.should == :geocode
|
133
|
+
new_query.geo.should be_nil
|
134
|
+
end
|
135
|
+
|
136
|
+
it "skips conversion when no API key" do
|
137
|
+
Barometer.google_geocode_key = nil
|
138
|
+
Barometer.google_geocode_key.should be_nil
|
139
|
+
query = Barometer::Query.new(@coordinates)
|
140
|
+
Query::Format::Geocode.to(query).q.should be_nil
|
141
|
+
Barometer.google_geocode_key = KEY
|
142
|
+
end
|
143
|
+
|
144
|
+
end
|
145
|
+
|
146
|
+
describe "when geocoding" do
|
147
|
+
|
148
|
+
it "requires a Barometer::Query object" do
|
149
|
+
lambda { Query::Format::Geocode.geocode }.should raise_error(ArgumentError)
|
150
|
+
lambda { Query::Format::Geocode.geocode("invalid") }.should raise_error(ArgumentError)
|
151
|
+
query = Barometer::Query.new(@zipcode)
|
152
|
+
query.is_a?(Barometer::Query).should be_true
|
153
|
+
lambda { Query::Format::Geocode.geocode(original_query) }.should_not raise_error(ArgumentError)
|
154
|
+
end
|
155
|
+
|
156
|
+
it "returns a Barometer::Query" do
|
157
|
+
query = Barometer::Query.new(@short_zipcode)
|
158
|
+
Query::Format::Geocode.geocode(query).is_a?(Barometer::Query).should be_true
|
159
|
+
end
|
160
|
+
|
161
|
+
it "converts from short_zipcode" do
|
162
|
+
query = Barometer::Query.new(@short_zipcode)
|
163
|
+
query.format.should == :short_zipcode
|
164
|
+
new_query = Query::Format::Geocode.geocode(query)
|
165
|
+
new_query.q.should == "Beverly Hills, CA, USA"
|
166
|
+
new_query.country_code.should == "US"
|
167
|
+
new_query.format.should == :geocode
|
168
|
+
new_query.geo.should_not be_nil
|
169
|
+
end
|
170
|
+
|
171
|
+
end
|
172
|
+
|
173
|
+
it "doesn't define a regex" do
|
174
|
+
lambda { Query::Format::Geocode.regex }.should raise_error(NotImplementedError)
|
175
|
+
end
|
176
|
+
|
177
|
+
end
|
178
|
+
|
179
|
+
end
|