barometer 0.9.4 → 0.9.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (36) hide show
  1. checksums.yaml +7 -0
  2. data/.travis.yml +2 -5
  3. data/Gemfile +11 -7
  4. data/LICENSE +1 -1
  5. data/README.md +3 -3
  6. data/barometer.gemspec +7 -10
  7. data/lib/barometer/utils/json_reader.rb +2 -3
  8. data/lib/barometer/utils/payload.rb +6 -87
  9. data/lib/barometer/utils/translations/zone_codes.yml +1 -0
  10. data/lib/barometer/version.rb +1 -1
  11. data/lib/barometer/weather_service.rb +0 -1
  12. data/spec/barometer_spec.rb +6 -0
  13. data/spec/spec_helper.rb +0 -11
  14. data/spec/utils/payload_spec.rb +20 -153
  15. data/spec/weather_services/wunderground_v1/current_response_spec.rb +5 -4
  16. data/spec/weather_services/wunderground_v1/forecast_response_spec.rb +23 -22
  17. metadata +32 -170
  18. data/.pelusa.yml +0 -7
  19. data/lib/barometer/weather_services/weather_bug.rb +0 -41
  20. data/lib/barometer/weather_services/weather_bug/current_api.rb +0 -26
  21. data/lib/barometer/weather_services/weather_bug/current_response.rb +0 -33
  22. data/lib/barometer/weather_services/weather_bug/forecast_api.rb +0 -26
  23. data/lib/barometer/weather_services/weather_bug/forecast_response.rb +0 -29
  24. data/lib/barometer/weather_services/weather_bug/query.rb +0 -42
  25. data/lib/barometer/weather_services/weather_bug/response/current_weather.rb +0 -82
  26. data/lib/barometer/weather_services/weather_bug/response/forecasted_weather.rb +0 -67
  27. data/lib/barometer/weather_services/weather_bug/response/location.rb +0 -23
  28. data/lib/barometer/weather_services/weather_bug/response/station.rb +0 -43
  29. data/lib/barometer/weather_services/weather_bug/response/sun.rb +0 -32
  30. data/lib/barometer/weather_services/weather_bug/response/time_helper.rb +0 -52
  31. data/lib/barometer/weather_services/weather_bug/response/timezone.rb +0 -15
  32. data/spec/cassettes/WeatherService_WeatherBug.json +0 -1
  33. data/spec/weather_services/weather_bug/current_response_spec.rb +0 -64
  34. data/spec/weather_services/weather_bug/forecast_response_spec.rb +0 -23
  35. data/spec/weather_services/weather_bug/query_spec.rb +0 -44
  36. data/spec/weather_services/weather_bug_spec.rb +0 -80
@@ -1,52 +0,0 @@
1
- module Barometer
2
- module WeatherService
3
- class WeatherBug
4
- class Response
5
- class TimeHelper
6
- def initialize(payload, timezone)
7
- @payload = payload
8
- @timezone = timezone
9
- end
10
-
11
- def parse(key)
12
- return unless local_time(key)
13
- timezone.local_to_utc(local_time(key))
14
- end
15
-
16
- private
17
-
18
- attr_reader :payload, :timezone, :key
19
-
20
- def local_time(key)
21
- @key = key
22
- @local_time ||= Utils::Time.parse(year, month, day, hour, minute, second)
23
- end
24
-
25
- def year
26
- payload.fetch(key, 'year', '@number')
27
- end
28
-
29
- def month
30
- payload.fetch(key, 'month', '@number')
31
- end
32
-
33
- def day
34
- payload.fetch(key, 'day', '@number')
35
- end
36
-
37
- def hour
38
- payload.fetch(key, 'hour', '@hour_24')
39
- end
40
-
41
- def minute
42
- payload.fetch(key, 'minute', '@number')
43
- end
44
-
45
- def second
46
- payload.fetch(key, 'second', '@number')
47
- end
48
- end
49
- end
50
- end
51
- end
52
- end
@@ -1,15 +0,0 @@
1
- module Barometer
2
- module WeatherService
3
- class WeatherBug
4
- class Response
5
- class TimeZone < WeatherService::Response::TimeZone
6
- private
7
-
8
- def time_zone
9
- payload.fetch('ob_date', 'time_zone', '@abbrv')
10
- end
11
- end
12
- end
13
- end
14
- end
15
- end
@@ -1 +0,0 @@
1
- {"http_interactions":[{"request":{"method":"get","uri":"http://WEATHERBUG_CODE.api.wxbug.net/getLiveWeatherRSS.aspx?ACode=WEATHERBUG_CODE&OutputType=1&UnitType=1&zipCode=90210","body":{"encoding":"UTF-8","string":""},"headers":{}},"response":{"status":{"code":200,"message":"OK"},"headers":{"Cache-Control":["private"],"Content-Type":["application/xml; charset=utf-8"],"Date":["Sat, 26 Oct 2013 14:55:07 GMT"],"Server":["Microsoft-IIS/7.5"],"Set-Cookie":["ASP.NET_SessionId=2q2lm10ejga21x3jdps0f0rm; path=/; HttpOnly"],"X-Aspnet-Version":["4.0.30319"],"X-Powered-By":["ASP.NET"],"Content-Length":["4076"],"Connection":["keep-alive"]},"body":{"encoding":"UTF-8","string":"<aws:weather xmlns:aws=\"http://www.aws.com/aws\"><aws:api version=\"2.0\" /><aws:WebURL>http://weather.weatherbug.com/CA/Valley Village-weather.html?ZCode=Z5546&amp;Units=1&amp;stat=NRTSH</aws:WebURL><aws:InputLocationURL>http://weather.weatherbug.com/CA/Beverly Hills-weather.html?ZCode=Z5546&amp;Units=1</aws:InputLocationURL><aws:ob><aws:ob-date><aws:year number=\"2013\" /><aws:month number=\"10\" text=\"October\" abbrv=\"Oct\" /><aws:day number=\"26\" text=\"Saturday\" abbrv=\"Sat\" /><aws:hour number=\"7\" hour-24=\"07\" /><aws:minute number=\"54\" /><aws:second number=\"00\" /><aws:am-pm abbrv=\"AM\" /><aws:time-zone offset=\"-7\" text=\"Pacific Daylight Time (USA)\" abbrv=\"PDT\" /></aws:ob-date><aws:requested-station-id /><aws:station-id>NRTSH</aws:station-id><aws:station>Campbell Hall School</aws:station><aws:city-state zipcode=\"91617\">Valley Village, CA</aws:city-state><aws:country>USA</aws:country><aws:latitude>34.1536102294922</aws:latitude><aws:longitude>-118.398056030273</aws:longitude><aws:site-url>http://www.campbell.pvt.k12.ca.us/</aws:site-url><aws:aux-temp units=\"&amp;deg;C\">18</aws:aux-temp><aws:aux-temp-rate units=\"&amp;deg;C\">0.0</aws:aux-temp-rate><aws:current-condition icon=\"http://deskwx.weatherbug.com/images/Forecast/icons/cond026.gif\">Mostly Sunny</aws:current-condition><aws:dew-point units=\"&amp;deg;C\">11</aws:dew-point><aws:elevation units=\"m\">192</aws:elevation><aws:feels-like units=\"&amp;deg;C\">12</aws:feels-like><aws:gust-time><aws:year number=\"2013\" /><aws:month number=\"10\" text=\"October\" abbrv=\"Oct\" /><aws:day number=\"26\" text=\"Saturday\" abbrv=\"Sat\" /><aws:hour number=\"12\" hour-24=\"00\" /><aws:minute number=\"59\" /><aws:second number=\"00\" /><aws:am-pm abbrv=\"AM\" /><aws:time-zone offset=\"-7\" text=\"Pacific Daylight Time (USA)\" abbrv=\"PDT\" /></aws:gust-time><aws:gust-direction>S</aws:gust-direction><aws:gust-direction-degrees>174</aws:gust-direction-degrees><aws:gust-speed units=\"km/h\">2</aws:gust-speed><aws:humidity units=\"%\">97</aws:humidity><aws:humidity-high units=\"%\">97</aws:humidity-high><aws:humidity-low units=\"%\">89</aws:humidity-low><aws:humidity-rate>0</aws:humidity-rate><aws:indoor-temp units=\"&amp;deg;C\">24</aws:indoor-temp><aws:indoor-temp-rate units=\"&amp;deg;C\">0</aws:indoor-temp-rate><aws:light>0</aws:light><aws:light-rate>0</aws:light-rate><aws:moon-phase moon-phase-img=\"http://api.wxbug.net/images/moonphase/mphase19.gif\">59</aws:moon-phase><aws:pressure units=\"mb\">1017.27</aws:pressure><aws:pressure-high units=\"mb\">1017.27</aws:pressure-high><aws:pressure-low units=\"mb\">1016.60</aws:pressure-low><aws:pressure-rate units=\"mb/h\">0.68</aws:pressure-rate><aws:rain-month units=\"mm\">0.00</aws:rain-month><aws:rain-rate units=\"mm/h\">0.00</aws:rain-rate><aws:rain-rate-max units=\"mm/h\">0.00</aws:rain-rate-max><aws:rain-today units=\"mm\">0.00</aws:rain-today><aws:rain-year units=\"mm\">87.63</aws:rain-year><aws:temp units=\"&amp;deg;C\">11.9</aws:temp><aws:temp-high units=\"&amp;deg;C\">16</aws:temp-high><aws:temp-low units=\"&amp;deg;C\">11</aws:temp-low><aws:temp-rate units=\"&amp;deg;C/h\">0.6</aws:temp-rate><aws:sunrise><aws:year number=\"2013\" /><aws:month number=\"10\" text=\"October\" abbrv=\"Oct\" /><aws:day number=\"26\" text=\"Saturday\" abbrv=\"Sat\" /><aws:hour number=\"7\" hour-24=\"07\" /><aws:minute number=\"07\" /><aws:second number=\"55\" /><aws:am-pm abbrv=\"AM\" /><aws:time-zone offset=\"-7\" text=\"Pacific Daylight Time (USA)\" abbrv=\"PDT\" /></aws:sunrise><aws:sunset><aws:year number=\"2013\" /><aws:month number=\"10\" text=\"October\" abbrv=\"Oct\" /><aws:day number=\"26\" text=\"Saturday\" abbrv=\"Sat\" /><aws:hour number=\"6\" hour-24=\"18\" /><aws:minute number=\"06\" /><aws:second number=\"47\" /><aws:am-pm abbrv=\"PM\" /><aws:time-zone offset=\"-7\" text=\"Pacific Daylight Time (USA)\" abbrv=\"PDT\" /></aws:sunset><aws:wet-bulb units=\"&amp;deg;C\">11.65</aws:wet-bulb><aws:wind-speed units=\"km/h\">0</aws:wind-speed><aws:wind-speed-avg units=\"km/h\">0</aws:wind-speed-avg><aws:wind-direction>S</aws:wind-direction><aws:wind-direction-degrees>173</aws:wind-direction-degrees><aws:wind-direction-avg>S</aws:wind-direction-avg></aws:ob></aws:weather>\r\n"},"http_version":null},"recorded_at":"Sat, 26 Oct 2013 14:55:07 GMT"},{"request":{"method":"get","uri":"http://WEATHERBUG_CODE.api.wxbug.net/getForecastRSS.aspx?ACode=WEATHERBUG_CODE&OutputType=1&UnitType=1&zipCode=90210","body":{"encoding":"UTF-8","string":""},"headers":{}},"response":{"status":{"code":200,"message":"OK"},"headers":{"Cache-Control":["private"],"Content-Type":["application/xml; charset=utf-8"],"Date":["Sat, 26 Oct 2013 14:55:07 GMT"],"Server":["Microsoft-IIS/7.5"],"Set-Cookie":["ASP.NET_SessionId=ppstsmui0taeaponkcny3cjz; path=/; HttpOnly"],"X-Aspnet-Version":["4.0.30319"],"X-Powered-By":["ASP.NET"],"Content-Length":["4096"],"Connection":["keep-alive"]},"body":{"encoding":"UTF-8","string":"<aws:weather xmlns:aws=\"http://www.aws.com/aws\"><aws:api version=\"2.0\" /><aws:WebURL>http://weather.weatherbug.com/CA/Beverly Hills-weather/local-forecast/7-day-forecast.html?ZCode=Z5546&amp;Units=1</aws:WebURL><aws:forecasts type=\"Detailed\" date=\"10/26/2013 3:15:00 AM\"><aws:location><aws:city>Beverly Hills</aws:city><aws:state>CA</aws:state><aws:zip>90210</aws:zip><aws:zone>CA041</aws:zone></aws:location><aws:forecast><aws:title alttitle=\"SAT\">Saturday</aws:title><aws:short-prediction>Partly Cloudy</aws:short-prediction><aws:image isNight=\"0\" icon=\"cond003.gif\">http://deskwx.weatherbug.com/images/Forecast/icons/cond003.gif</aws:image><aws:description>Saturday</aws:description><aws:prediction>Areas of low clouds and fog in the morning then sunny. Highs from the lower to mid 70s at the beaches to around 80 inland.</aws:prediction><aws:high units=\"&amp;deg;C\">27</aws:high><aws:low units=\"&amp;deg;C\">15</aws:low></aws:forecast><aws:forecast><aws:title alttitle=\"SUN\">Sunday</aws:title><aws:short-prediction>Partly Cloudy</aws:short-prediction><aws:image isNight=\"0\" icon=\"cond003.gif\">http://deskwx.weatherbug.com/images/Forecast/icons/cond003.gif</aws:image><aws:description>Sunday</aws:description><aws:prediction>Areas of low clouds and fog in the morning then sunny. Highs from the upper 60s at the beaches to the upper 70s inland.</aws:prediction><aws:high units=\"&amp;deg;C\">26</aws:high><aws:low units=\"&amp;deg;C\">13</aws:low></aws:forecast><aws:forecast><aws:title alttitle=\"MON\">Monday</aws:title><aws:short-prediction>40% Chance Rain Shower</aws:short-prediction><aws:image isNight=\"0\" icon=\"cond109.gif\">http://deskwx.weatherbug.com/images/Forecast/icons/cond109.gif</aws:image><aws:description>Monday</aws:description><aws:prediction>Mostly cloudy. A slight chance of showers in the morning then a chance of showers in the afternoon. Highs in the 60s. Southeast winds around 15 mph in the afternoon. Chance of precipitation 40 percent.</aws:prediction><aws:high units=\"&amp;deg;C\">18</aws:high><aws:low units=\"&amp;deg;C\">11</aws:low></aws:forecast><aws:forecast><aws:title alttitle=\"TUE\">Tuesday</aws:title><aws:short-prediction>Partly Cloudy</aws:short-prediction><aws:image isNight=\"0\" icon=\"cond003.gif\">http://deskwx.weatherbug.com/images/Forecast/icons/cond003.gif</aws:image><aws:description>Tuesday</aws:description><aws:prediction>Mostly cloudy with a 20 percent chance of showers in the morning then partly cloudy in the afternoon. Highs in the lower to mid 60s.</aws:prediction><aws:high units=\"&amp;deg;C\">17</aws:high><aws:low units=\"&amp;deg;C\">12</aws:low></aws:forecast><aws:forecast><aws:title alttitle=\"WED\">Wednesday</aws:title><aws:short-prediction>Mostly Sunny</aws:short-prediction><aws:image isNight=\"0\" icon=\"cond026.gif\">http://deskwx.weatherbug.com/images/Forecast/icons/cond026.gif</aws:image><aws:description>Wednesday</aws:description><aws:prediction>Mostly clear. Highs from the mid 60s at the beaches to the mid 70s inland. Lows in the 50s.</aws:prediction><aws:high units=\"&amp;deg;C\">22</aws:high><aws:low units=\"&amp;deg;C\">12</aws:low></aws:forecast><aws:forecast><aws:title alttitle=\"THU\">Thursday</aws:title><aws:short-prediction>Mostly Sunny</aws:short-prediction><aws:image isNight=\"0\" icon=\"cond026.gif\">http://deskwx.weatherbug.com/images/Forecast/icons/cond026.gif</aws:image><aws:description>Thursday</aws:description><aws:prediction>Mostly clear. Highs from the mid 60s at the beaches to the mid 70s inland. Lows in the 50s.</aws:prediction><aws:high units=\"&amp;deg;C\">23</aws:high><aws:low units=\"&amp;deg;C\">13</aws:low></aws:forecast><aws:forecast><aws:title alttitle=\"FRI\">Friday</aws:title><aws:short-prediction>Sunny</aws:short-prediction><aws:image isNight=\"0\" icon=\"cond007.gif\">http://deskwx.weatherbug.com/images/Forecast/icons/cond007.gif</aws:image><aws:description>Friday</aws:description><aws:prediction>Sunny. Highs from around 70 at the beaches to around 80 inland.</aws:prediction><aws:high units=\"&amp;deg;C\">26</aws:high><aws:low units=\"&amp;deg;C\">--</aws:low></aws:forecast></aws:forecasts></aws:weather>\r\n"},"http_version":null},"recorded_at":"Sat, 26 Oct 2013 14:55:07 GMT"}],"recorded_with":"VCR 2.6.0"}
@@ -1,64 +0,0 @@
1
- require_relative '../../spec_helper'
2
-
3
- module Barometer::WeatherService
4
- describe WeatherBug::CurrentResponse do
5
- it "parses the timezones correctly" do
6
- payload = Barometer::Utils::Payload.new({
7
- 'ob_date' => {
8
- 'year' => { '@number' => '2013' },
9
- 'month' => { '@number' => '5' },
10
- 'day' => { '@number' => '18' },
11
- 'hour' => { '@hour_24' => '10' },
12
- 'minute' => { '@number' => '46' },
13
- 'second' => { '@number' => '0' },
14
- 'time_zone' => { '@abbrv' => 'PDT' }
15
- }
16
- })
17
- response = WeatherBug::CurrentResponse.new.parse(payload)
18
-
19
- utc_observed_at = Time.utc(2013,5,18,17,46,0)
20
- utc_stale_at = Time.utc(2013,5,18,18,46,0)
21
-
22
- expect( response.current.observed_at.utc ).to eq utc_observed_at
23
- expect( response.current.stale_at.utc ).to eq utc_stale_at
24
- expect( response.timezone.to_s ).to eq 'PDT'
25
- end
26
-
27
- it "parses sun timezones correctly" do
28
- payload = Barometer::Utils::Payload.new({
29
- 'ob_date' => {
30
- 'year' => { '@number' => '2013' },
31
- 'month' => { '@number' => '4' },
32
- 'day' => { '@number' => '13' },
33
- 'hour' => { '@hour_24' => '10' },
34
- 'minute' => { '@number' => '23' },
35
- 'second' => { '@number' => '0' },
36
- 'time_zone' => { '@abbrv' => 'PDT' }
37
- },
38
- 'sunrise' => {
39
- 'year' => { '@number' => '2013' },
40
- 'month' => { '@number' => '4' },
41
- 'day' => { '@number' => '13' },
42
- 'hour' => { '@hour_24' => '6' },
43
- 'minute' => { '@number' => '44' },
44
- 'second' => { '@number' => '19' },
45
- },
46
- 'sunset' => {
47
- 'year' => { '@number' => '2013' },
48
- 'month' => { '@number' => '4' },
49
- 'day' => { '@number' => '13' },
50
- 'hour' => { '@hour_24' => '17' },
51
- 'minute' => { '@number' => '31' },
52
- 'second' => { '@number' => '50' },
53
- }
54
- })
55
- response = WeatherBug::CurrentResponse.new.parse(payload)
56
-
57
- utc_current_sun_rise = Time.utc(2013,4,13,13,44,19)
58
- utc_current_sun_set = Time.utc(2013,4,14,0,31,50)
59
-
60
- expect( response.current.sun.rise.utc ).to eq utc_current_sun_rise
61
- expect( response.current.sun.set.utc ).to eq utc_current_sun_set
62
- end
63
- end
64
- end
@@ -1,23 +0,0 @@
1
- require_relative '../../spec_helper'
2
-
3
- module Barometer::WeatherService
4
- describe WeatherBug::ForecastResponse do
5
- let(:current_response) { Barometer::Response.new }
6
-
7
- it "parses the timezones correctly" do
8
- current_response.timezone = Barometer::Data::Zone.new('PDT')
9
-
10
- payload = Barometer::Utils::Payload.new({
11
- "@date" => "4/13/2013 10:23:00 AM",
12
- "forecast" => [{"high" => "13"}]
13
- })
14
- response = WeatherBug::ForecastResponse.new(current_response).parse(payload)
15
-
16
- utc_starts_at = Time.utc(2013,4,13,7,0,0)
17
- utc_ends_at = Time.utc(2013,4,14,6,59,59)
18
-
19
- expect( response.forecast[0].starts_at.utc ).to eq utc_starts_at
20
- expect( response.forecast[0].ends_at.utc ).to eq utc_ends_at
21
- end
22
- end
23
- end
@@ -1,44 +0,0 @@
1
- require_relative '../../spec_helper'
2
-
3
- module Barometer::WeatherService
4
- describe WeatherBug::Query do
5
- describe '#to_param' do
6
- let(:converted_query) { double(:converted_query).as_null_object }
7
- let(:query) { WeatherBug::Query.new(converted_query) }
8
-
9
- context 'when the query is a :short_zipcode' do
10
- before { converted_query.stub(format: :short_zipcode, q: '90210') }
11
-
12
- it 'includes the correct parameters' do
13
- expect( query.to_param[:zipCode] ).to eq '90210'
14
- end
15
- end
16
-
17
- context 'and the query is a :coordinates' do
18
- let(:geo) { double(:geo, latitude: '11.22', longitude: '33.44') }
19
- before { converted_query.stub(format: :coordinates, geo: geo) }
20
-
21
- it 'includes the correct parameters' do
22
- expect( query.to_param[:lat] ).to eq '11.22'
23
- expect( query.to_param[:long] ).to eq '33.44'
24
- end
25
- end
26
-
27
- context 'and the query is metric' do
28
- before { converted_query.stub(metric?: true) }
29
-
30
- it 'includes the correct parameters' do
31
- expect( query.to_param[:UnitType] ).to eq '1'
32
- end
33
- end
34
-
35
- context 'and the query is imperial' do
36
- before { converted_query.stub(metric?: false) }
37
-
38
- it 'includes the correct parameters' do
39
- expect( query.to_param[:UnitType] ).to eq '0'
40
- end
41
- end
42
- end
43
- end
44
- end
@@ -1,80 +0,0 @@
1
- require_relative '../spec_helper'
2
-
3
- module Barometer
4
- describe WeatherService::WeatherBug, vcr: {
5
- cassette_name: 'WeatherService::WeatherBug'
6
- } do
7
-
8
- it 'auto-registers this weather service as :weather_bug' do
9
- expect( WeatherService.source(:weather_bug) ).to eq WeatherService::WeatherBug
10
- end
11
-
12
- describe '.call' do
13
- context 'when no keys are provided' do
14
- let(:query) { build_query }
15
-
16
- it 'raises an error' do
17
- expect {
18
- WeatherService::WeatherBug.call(query)
19
- }.to raise_error(WeatherService::KeyRequired)
20
- end
21
- end
22
-
23
- context 'when keys are provided' do
24
- let(:converted_query) { Barometer::ConvertedQuery.new('90210', :short_zipcode, :metric) }
25
- let(:query) { build_query.tap{|q|q.stub(:convert! => converted_query)} }
26
- let(:config) { {keys: {code: WEATHERBUG_CODE}} }
27
-
28
- subject { WeatherService::WeatherBug.call(query, config) }
29
-
30
- it 'converts the query to accepted formats' do
31
- subject
32
- expect( query ).to have_received(:convert!).with(:short_zipcode, :coordinates).at_least(:once)
33
- end
34
-
35
- it 'includes the expected data' do
36
- expect( subject.query ).to eq '90210'
37
- expect( subject.format ).to eq :short_zipcode
38
- expect( subject ).to be_metric
39
-
40
- should have_data(:current, :observed_at).as_format(:time)
41
- should have_data(:current, :stale_at).as_format(:time)
42
-
43
- should have_data(:current, :humidity).as_format(:float)
44
- should have_data(:current, :condition).as_format(:string)
45
- should have_data(:current, :icon).as_format(:number)
46
- should have_data(:current, :temperature).as_format(:temperature)
47
- should have_data(:current, :dew_point).as_format(:temperature)
48
- should have_data(:current, :wind_chill).as_format(:temperature)
49
- should have_data(:current, :wind).as_format(:vector)
50
- should have_data(:current, :pressure).as_format(:pressure)
51
- should have_data(:current, :sun, :rise).as_format(:time)
52
- should have_data(:current, :sun, :set).as_format(:time)
53
-
54
- should have_data(:station, :id).as_value('NRTSH')
55
- should have_data(:station, :name).as_value('Campbell Hall School')
56
- should have_data(:station, :city).as_value('Valley Village')
57
- should have_data(:station, :state_code).as_value('CA')
58
- should have_data(:station, :country).as_value('USA')
59
- should have_data(:station, :zip_code).as_value('91617')
60
- should have_data(:station, :latitude).as_value(34.1536102294922)
61
- should have_data(:station, :longitude).as_value(-118.398056030273)
62
-
63
- should have_data(:location, :city).as_value('Beverly Hills')
64
- should have_data(:location, :state_code).as_value('CA')
65
- should have_data(:location, :zip_code).as_value('90210')
66
-
67
- should have_data(:timezone, :to_s).as_format(/^P[DS]T$/i)
68
-
69
- expect( subject.forecast.size ).to eq 7
70
- should have_forecast(:starts_at).as_format(:time)
71
- should have_forecast(:ends_at).as_format(:time)
72
- should have_forecast(:condition).as_format(:string)
73
- should have_forecast(:icon).as_format(:number)
74
- should have_forecast(:high).as_format(:temperature)
75
- should have_forecast(:low).as_format(:temperature)
76
- end
77
- end
78
- end
79
- end
80
- end