weather-api 1.0.1 → 1.1.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.
Files changed (75) hide show
  1. checksums.yaml +7 -0
  2. data/.travis.yml +1 -1
  3. data/Gemfile +1 -7
  4. data/README.md +3 -4
  5. data/Rakefile +1 -1
  6. data/lib/weather-api.rb +47 -25
  7. data/lib/weather-api/astronomy.rb +3 -3
  8. data/lib/weather-api/atmosphere.rb +4 -4
  9. data/lib/weather-api/condition.rb +5 -5
  10. data/lib/weather-api/forecast.rb +7 -7
  11. data/lib/weather-api/image.rb +2 -18
  12. data/lib/weather-api/location.rb +4 -4
  13. data/lib/weather-api/response.rb +14 -18
  14. data/lib/weather-api/units.rb +5 -5
  15. data/lib/weather-api/utils.rb +3 -3
  16. data/lib/weather-api/version.rb +2 -2
  17. data/lib/weather-api/wind.rb +4 -4
  18. data/spec/fixtures/cassettes/Weather_Astronomy/should_contain_Time_objects_for_sunrise_and_sunset.yml +62 -0
  19. data/spec/fixtures/cassettes/Weather_Atmosphere/should_contain_a_float_indicating_atmospheric_pressure.yml +62 -0
  20. data/spec/fixtures/cassettes/Weather_Atmosphere/should_contain_a_string_indicating_barometric_pressure.yml +62 -0
  21. data/spec/fixtures/cassettes/Weather_Atmosphere/should_contain_integers_representing_humidity_and_visibility.yml +62 -0
  22. data/spec/fixtures/cassettes/Weather_Condition/should_contain_a_weather_condition_code_a_date_a_temperature_and_a_description.yml +62 -0
  23. data/spec/fixtures/cassettes/Weather_Forecast/should_contain_high_and_low_forecasts.yml +62 -0
  24. data/spec/fixtures/cassettes/Weather_Forecast/should_contain_the_name_of_the_day_associated_with_the_forecast.yml +62 -0
  25. data/spec/fixtures/cassettes/Weather_Forecast/should_have_a_brief_description_of_the_forecasted_conditions.yml +62 -0
  26. data/spec/fixtures/cassettes/Weather_Forecast/should_have_a_weather_condition_code.yml +62 -0
  27. data/spec/fixtures/cassettes/Weather_Forecast/should_have_an_associated_date.yml +62 -0
  28. data/spec/fixtures/cassettes/Weather_Image/should_contain_a_string_for_the_image_url.yml +62 -0
  29. data/spec/fixtures/cassettes/Weather_Location/should_be_able_to_look_up_Nice_France.yml +62 -0
  30. data/spec/fixtures/cassettes/Weather_Location/should_be_able_to_look_up_Seattle_WA.yml +62 -0
  31. data/spec/fixtures/cassettes/Weather_Location/should_be_able_to_look_up_Victoria_BC.yml +62 -0
  32. data/spec/fixtures/cassettes/Weather_Location/should_contain_city_country_and_region_as_strings.yml +62 -0
  33. data/spec/fixtures/cassettes/Weather_Response/should_contain_a_HTML_description_summarizing_weather_conditions.yml +62 -0
  34. data/spec/fixtures/cassettes/Weather_Response/should_contain_a_String_title.yml +62 -0
  35. data/spec/fixtures/cassettes/Weather_Response/should_contain_a_Weather_Astronomy_object.yml +62 -0
  36. data/spec/fixtures/cassettes/Weather_Response/should_contain_a_Weather_Atmosphere_object.yml +62 -0
  37. data/spec/fixtures/cassettes/Weather_Response/should_contain_a_Weather_Condition_object.yml +62 -0
  38. data/spec/fixtures/cassettes/Weather_Response/should_contain_a_Weather_Image_object.yml +62 -0
  39. data/spec/fixtures/cassettes/Weather_Response/should_contain_a_Weather_Location_object.yml +62 -0
  40. data/spec/fixtures/cassettes/Weather_Response/should_contain_a_Weather_Units_object.yml +62 -0
  41. data/spec/fixtures/cassettes/Weather_Response/should_contain_a_Weather_Wind_object.yml +62 -0
  42. data/spec/fixtures/cassettes/Weather_Response/should_contain_a_collection_of_Weather_Forecast_objects.yml +62 -0
  43. data/spec/fixtures/cassettes/Weather_Response/should_contain_latitude_and_longitude_in_floats.yml +62 -0
  44. data/spec/fixtures/cassettes/Weather_Response/should_contain_the_WOEID_of_the_request_location_and_the_requested_URL.yml +62 -0
  45. data/spec/fixtures/cassettes/Weather_Units/defaults/should_default_to_imperial_units.yml +62 -0
  46. data/spec/fixtures/cassettes/Weather_Units/defaults/should_switch_to_metric_if_specified.yml +62 -0
  47. data/spec/fixtures/cassettes/Weather_Wind/should_contain_chill_direction_and_speed_as_integers.yml +62 -0
  48. data/spec/lib/astronomy_spec.rb +12 -0
  49. data/spec/lib/atmosphere_spec.rb +20 -0
  50. data/spec/lib/condition_spec.rb +14 -0
  51. data/spec/lib/forecast_spec.rb +28 -0
  52. data/spec/lib/image_spec.rb +11 -0
  53. data/spec/lib/location_spec.rb +36 -0
  54. data/spec/lib/response_spec.rb +57 -0
  55. data/spec/lib/units_spec.rb +30 -0
  56. data/spec/lib/utils_spec.rb +11 -0
  57. data/spec/lib/version_spec.rb +7 -0
  58. data/spec/lib/wind_spec.rb +13 -0
  59. data/spec/{helper.rb → spec_helper.rb} +3 -5
  60. data/weather-api.gemspec +9 -11
  61. metadata +127 -88
  62. data/Guardfile +0 -19
  63. data/lib/weather-api/api.rb +0 -33
  64. data/spec/cases/api_spec.rb +0 -8
  65. data/spec/cases/astronomy_spec.rb +0 -15
  66. data/spec/cases/atmosphere_spec.rb +0 -23
  67. data/spec/cases/condition_spec.rb +0 -17
  68. data/spec/cases/forecast_spec.rb +0 -32
  69. data/spec/cases/image_spec.rb +0 -21
  70. data/spec/cases/location_spec.rb +0 -41
  71. data/spec/cases/response_spec.rb +0 -60
  72. data/spec/cases/units_spec.rb +0 -36
  73. data/spec/cases/utils_spec.rb +0 -13
  74. data/spec/cases/version_spec.rb +0 -8
  75. data/spec/cases/wind_spec.rb +0 -16
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: d6e46994f572ac298e6ad32d292a6bce10f0cf85
4
+ data.tar.gz: 1d3c9f8ffc9e794194b0ac42c070aa7dd56c6249
5
+ SHA512:
6
+ metadata.gz: 3f3011c676656e65dbc112325118f507bc9238020c10216068a20beebbca0e4bb11e6f674d1e8702c68068e2428380d4fb9f1cee70126549d71ac92100a0593a
7
+ data.tar.gz: d198fc6e28090b34bbb948440587a2ed073b3d28445676e88e18fb93dede73e7bf6778949a1ff7c728e265dcb9c80080461f2add517b60e18814424134f02f45
data/.travis.yml CHANGED
@@ -1,4 +1,4 @@
1
1
  rvm:
2
- - 1.8.7
3
2
  - 1.9.2
4
3
  - 1.9.3
4
+ - 2.0.0
data/Gemfile CHANGED
@@ -1,9 +1,3 @@
1
- source :rubygems
2
-
3
- # Give guard growl notifications, if on OS X
4
- if RUBY_PLATFORM =~ /darwin/i
5
- gem "rb-fsevent", :require => false
6
- gem "ruby_gntp", :require => false
7
- end
1
+ source 'https://rubygems.org'
8
2
 
9
3
  gemspec
data/README.md CHANGED
@@ -8,7 +8,8 @@ A Ruby wrapper for the Yahoo! Weather XML RSS feed.
8
8
 
9
9
  ## Description
10
10
 
11
- Weather-API provides an object-oriented interface to the Yahoo! Weather XML RSS feed service.
11
+ Weather-API provides an object-oriented interface to the Yahoo! Weather XML RSS
12
+ feed service.
12
13
 
13
14
  Details on the service can be found [here](http://developer.yahoo.com/weather).
14
15
 
@@ -19,11 +20,9 @@ A simple example:
19
20
  require 'rubygems'
20
21
  require 'weather-api'
21
22
 
22
- client = Weather::API.new
23
-
24
23
  # look up WOEID via http://weather.yahoo.com; enter location by city
25
24
  # name or zip and WOEID is at end of resulting page url.
26
- response = client.lookup(9830)
25
+ response = Weather.lookup(9830)
27
26
 
28
27
  print <<EOT
29
28
  #{response.title}
data/Rakefile CHANGED
@@ -8,5 +8,5 @@ RSpec::Core::RakeTask.new(:spec)
8
8
 
9
9
  desc 'Open an irb session preloaded with this library'
10
10
  task :console do
11
- sh 'pry -Ilib -rweather-api'
11
+ sh 'irb -Ilib -rweather-api'
12
12
  end
data/lib/weather-api.rb CHANGED
@@ -1,37 +1,59 @@
1
1
  require 'net/http'
2
- require 'nokogiri'
2
+ require 'json'
3
+ require 'map'
4
+
5
+ require 'weather-api/astronomy'
6
+ require 'weather-api/atmosphere'
7
+ require 'weather-api/condition'
8
+ require 'weather-api/forecast'
9
+ require 'weather-api/image'
10
+ require 'weather-api/location'
11
+ require 'weather-api/response'
12
+ require 'weather-api/units'
13
+ require 'weather-api/utils'
14
+ require 'weather-api/version'
15
+ require 'weather-api/wind'
3
16
 
4
17
  module Weather
5
18
  class << self
19
+ # Yahoo! Weather info endpoint
20
+ ROOT = "http://query.yahooapis.com/v1/public/yql"
6
21
 
7
- # Alias for Weather::API.new
22
+ # Public: Looks up current weather information using WOEID
8
23
  #
9
- # Returns a Weather::API object
10
- def new
11
- Weather::API.new
12
- end
24
+ # woeid - Int - Where On Earth IDentifier -- unique ID for
25
+ # location to get weather data for. To find
26
+ # a WOEID, refer to Yahoo!'s documentation
27
+ # at http://developer.yahoo.com/weather/
28
+ #
29
+ # units - String - whether to retrieve data in Farenheit
30
+ # or Celsius. Defaults to Farenheit
31
+ #
32
+ # Returns a Weather::Response object containing forecast
33
+ def lookup woeid, units = 'f'
34
+ url = ROOT
35
+ url += "?q=select%20*%20from%20weather.forecast%20"
36
+ url += "where%20woeid%3D#{woeid}%20and%20u%3D'#{units}'&format=json"
13
37
 
14
- # Delegate to Weather::API
15
- def method_missing(method, *args, &block)
16
- return super unless new.respond_to?(method)
17
- new.send(method, *args, &block)
38
+ doc = get_response url
39
+ Response.new woeid, url, doc
18
40
  end
19
41
 
20
- def respond_to?(method, include_private=false)
21
- new.respond_to?(method, include_private) || super(method, include_private)
42
+ private
43
+ def get_response url
44
+ begin
45
+ response = Net::HTTP.get_response(URI.parse url).body.to_s
46
+ rescue => e
47
+ raise "Failed to get weather [url=#{url}, e=#{e}]."
48
+ end
49
+
50
+ response = Map.new(JSON.parse(response))[:query][:results][:channel]
51
+
52
+ if response.nil?
53
+ raise "Failed to get weather [url=#{url}]."
54
+ end
55
+
56
+ response
22
57
  end
23
58
  end
24
-
25
- autoload :API, 'weather-api/api'
26
- autoload :Astronomy, 'weather-api/astronomy'
27
- autoload :Atmosphere, 'weather-api/atmosphere'
28
- autoload :Condition, 'weather-api/condition'
29
- autoload :Forecast, 'weather-api/forecast'
30
- autoload :Image, 'weather-api/image'
31
- autoload :Location, 'weather-api/location'
32
- autoload :Response, 'weather-api/response'
33
- autoload :Units, 'weather-api/units'
34
- autoload :Utils, 'weather-api/utils'
35
- autoload :Version, 'weather-api/version'
36
- autoload :Wind, 'weather-api/wind'
37
59
  end
@@ -6,9 +6,9 @@ module Weather
6
6
  # a Time object containing the sunset time for a location
7
7
  attr_reader :sunset
8
8
 
9
- def initialize(payload)
10
- @sunrise = Weather::Utils.parse_time payload['sunrise']
11
- @sunset = Weather::Utils.parse_time payload['sunset']
9
+ def initialize payload
10
+ @sunrise = Utils.parse_time payload[:sunrise]
11
+ @sunset = Utils.parse_time payload[:sunset]
12
12
  end
13
13
  end
14
14
  end
@@ -23,14 +23,14 @@ module Weather
23
23
  attr_reader :barometer
24
24
 
25
25
  def initialize(payload)
26
- @humidity = payload['humidity'].to_i
27
- @visibility = payload['visibility'].to_i
28
- @pressure = payload['pressure'].to_f
26
+ @humidity = payload[:humidity].to_i
27
+ @visibility = payload[:visibility].to_i
28
+ @pressure = payload[:pressure].to_f
29
29
 
30
30
  # map barometric pressure to appropriate constant
31
31
  @barometer = nil
32
32
 
33
- case payload['rising'].to_i
33
+ case payload[:rising].to_i
34
34
  when 0 then @barometer = Barometer::STEADY
35
35
  when 1 then @barometer = Barometer::RISING
36
36
  when 2 then @barometer = Barometer::FALLING
@@ -12,11 +12,11 @@ module Weather
12
12
  # the brief prose text description of the weather conditions of the location.
13
13
  attr_reader :text
14
14
 
15
- def initialize(payload)
16
- @code = payload['code'].to_i
17
- @date = Weather::Utils.parse_time(payload['date'])
18
- @temp = payload['temp'].to_i
19
- @text = payload['text']
15
+ def initialize payload
16
+ @code = payload[:code].to_i
17
+ @date = Utils.parse_time payload[:date]
18
+ @temp = payload[:temp].to_i
19
+ @text = payload[:text]
20
20
  end
21
21
  end
22
22
  end
@@ -18,13 +18,13 @@ module Weather
18
18
  # the weather condition code, detailed at http://developer.yahoo.com/weather
19
19
  attr_reader :code
20
20
 
21
- def initialize(payload)
22
- @day = payload['day']
23
- @date = Weather::Utils.parse_time(payload['date'])
24
- @low = payload['low'].to_i
25
- @high = payload['high'].to_i
26
- @text = payload['text']
27
- @code = payload['code'].to_i
21
+ def initialize payload
22
+ @day = payload[:day]
23
+ @date = Utils.parse_time payload[:date]
24
+ @low = payload[:low].to_i
25
+ @high = payload[:high].to_i
26
+ @text = payload[:text]
27
+ @code = payload[:code].to_i
28
28
  end
29
29
  end
30
30
  end
@@ -1,26 +1,10 @@
1
1
  module Weather
2
2
  class Image
3
- # the image height in pixels
4
- attr_reader :height
5
-
6
- # the image width in pixels
7
- attr_reader :width
8
-
9
3
  # the full URL to the image
10
4
  attr_reader :url
11
5
 
12
- # the link to the Yahoo! Weather home page
13
- attr_reader :link
14
-
15
- # the title of the image
16
- attr_reader :title
17
-
18
- def initialize(payload)
19
- @height = payload.xpath('height').first.content.to_i
20
- @width = payload.xpath('width').first.content.to_i
21
- @url = payload.xpath('url').first.content
22
- @link = payload.xpath('link').first.content
23
- @title = payload.xpath('title').first.content
6
+ def initialize payload
7
+ @url = payload.scan(/src=\"(.*)\"/).flatten.first
24
8
  end
25
9
  end
26
10
  end
@@ -9,10 +9,10 @@ module Weather
9
9
  # name of the region, such as a state or province
10
10
  attr_reader :region
11
11
 
12
- def initialize(payload)
13
- @city = payload['city']
14
- @country = payload['country']
15
- @region = payload['region']
12
+ def initialize payload
13
+ @city = payload[:city]
14
+ @country = payload[:country]
15
+ @region = payload[:region]
16
16
  end
17
17
  end
18
18
  end
@@ -52,34 +52,30 @@ module Weather
52
52
  # the title of the weather information for the requested location
53
53
  attr_reader :title
54
54
 
55
- def initialize(request_location, request_url, doc)
55
+ def initialize request_location, request_url, doc
56
56
  # save the request params
57
57
  @request_location = request_location
58
58
  @request_url = request_url
59
59
 
60
- # parse the xml element to get response data
61
- root = doc.xpath('/rss/channel').first
60
+ @astronomy = Astronomy.new doc[:astronomy]
61
+ @location = Location.new doc[:location]
62
+ @units = Units.new doc[:units]
63
+ @wind = Wind.new doc[:wind]
64
+ @atmosphere = Atmosphere.new doc[:atmosphere]
65
+ @image = Image.new doc[:item][:description]
62
66
 
63
- @astronomy = Weather::Astronomy.new(root.xpath('yweather:astronomy').first)
64
- @location = Weather::Location.new(root.xpath('yweather:location').first)
65
- @units = Weather::Units.new(root.xpath('yweather:units').first)
66
- @wind = Weather::Wind.new(root.xpath('yweather:wind').first)
67
- @atmosphere = Weather::Atmosphere.new(root.xpath('yweather:atmosphere').first)
68
- @image = Weather::Image.new(root.xpath('image').first)
69
-
70
- item = root.xpath('item').first
71
67
  @forecasts = []
72
68
 
73
- @condition = Weather::Condition.new(item.xpath('yweather:condition').first)
69
+ @condition = Condition.new doc[:item][:condition]
74
70
 
75
- item.xpath('yweather:forecast').each do |forecast|
76
- @forecasts << Weather::Forecast.new(forecast)
71
+ doc[:item][:forecast].each do |forecast|
72
+ @forecasts << Forecast.new(forecast)
77
73
  end
78
74
 
79
- @latitude = item.xpath('geo:lat').first.content.to_f
80
- @longitude = item.xpath('geo:long').first.content.to_f
81
- @title = item.xpath('title').first.content
82
- @description = item.xpath('description').first.content
75
+ @latitude = doc[:item][:lat].to_f
76
+ @longitude = doc[:item][:long].to_f
77
+ @title = doc[:item][:title]
78
+ @description = doc[:item][:description]
83
79
  end
84
80
  end
85
81
  end
@@ -19,11 +19,11 @@ module Weather
19
19
  # e.g. mph for miles per hour, and kph for kilometers per hour
20
20
  attr_reader :speed
21
21
 
22
- def initialize(payload)
23
- @temperature = payload['temperature']
24
- @distance = payload['distance']
25
- @pressure = payload['pressure']
26
- @speed = payload['speed']
22
+ def initialize payload
23
+ @temperature = payload[:temperature]
24
+ @distance = payload[:distance]
25
+ @pressure = payload[:pressure]
26
+ @speed = payload[:speed]
27
27
  end
28
28
  end
29
29
  end
@@ -6,15 +6,15 @@ module Weather
6
6
  # Attempts to convert passed text into a Time object
7
7
  #
8
8
  # Returns a Time object or nil
9
- def self.parse_time(text = '')
9
+ def self.parse_time text = ''
10
10
  if text == ''
11
11
  return nil
12
12
  end
13
13
 
14
14
  begin
15
- Time.parse(text)
15
+ Time.parse text
16
16
  rescue ArgumentError
17
- Chronic.parse(text)
17
+ Chronic.parse text
18
18
  end
19
19
  end
20
20
  end
@@ -12,14 +12,14 @@ module Weather
12
12
  #
13
13
  # Returns an int
14
14
  def self.minor
15
- 0
15
+ 1
16
16
  end
17
17
 
18
18
  # The current patch version number
19
19
  #
20
20
  # Returns an int
21
21
  def self.patch
22
- 1
22
+ 0
23
23
  end
24
24
 
25
25
  # The current pre version number
@@ -9,10 +9,10 @@ module Weather
9
9
  # the windspeed
10
10
  attr_reader :speed
11
11
 
12
- def initialize(payload)
13
- @chill = payload['chill'].to_i
14
- @direction = payload['direction'].to_i
15
- @speed = payload['speed'].to_i
12
+ def initialize payload
13
+ @chill = payload[:chill].to_i
14
+ @direction = payload[:direction].to_i
15
+ @speed = payload[:speed].to_i
16
16
  end
17
17
  end
18
18
  end
@@ -0,0 +1,62 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: get
5
+ uri: http://query.yahooapis.com/v1/public/yql?format=json&q=select%20*%20from%20weather.forecast%20where%20woeid=9848%20and%20u='f'
6
+ body:
7
+ encoding: US-ASCII
8
+ string: ''
9
+ headers:
10
+ Accept-Encoding:
11
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
12
+ Accept:
13
+ - '*/*'
14
+ User-Agent:
15
+ - Ruby
16
+ Host:
17
+ - query.yahooapis.com
18
+ response:
19
+ status:
20
+ code: 200
21
+ message: OK
22
+ headers:
23
+ X-Yql-Host:
24
+ - engine1.yql.ne1.yahoo.com
25
+ Access-Control-Allow-Origin:
26
+ - '*'
27
+ Cache-Control:
28
+ - public, max-age=3600
29
+ Content-Type:
30
+ - application/json;charset=utf-8
31
+ Vary:
32
+ - Accept-Encoding
33
+ Date:
34
+ - Fri, 29 Mar 2013 06:53:56 GMT
35
+ Server:
36
+ - YTS/1.20.13
37
+ Age:
38
+ - '1309'
39
+ Content-Length:
40
+ - '880'
41
+ Connection:
42
+ - keep-alive
43
+ body:
44
+ encoding: UTF-8
45
+ string: '{"query":{"count":1,"created":"2013-03-29T06:53:57Z","lang":"en-US","results":{"channel":{"title":"Yahoo!
46
+ Weather - Victoria, CA","link":"http://us.rd.yahoo.com/dailynews/rss/weather/Victoria__CA/*http://weather.yahoo.com/forecast/CAXX0523_f.html","description":"Yahoo!
47
+ Weather for Victoria, CA","language":"en-us","lastBuildDate":"Thu, 28 Mar
48
+ 2013 8:59 pm PDT","ttl":"60","location":{"city":"Victoria","country":"Canada","region":"BC"},"units":{"distance":"mi","pressure":"in","speed":"mph","temperature":"F"},"wind":{"chill":"46","direction":"230","speed":"5"},"atmosphere":{"humidity":"82","pressure":"30.11","rising":"1","visibility":""},"astronomy":{"sunrise":"6:59
49
+ am","sunset":"7:36 pm"},"image":{"title":"Yahoo! Weather","width":"142","height":"18","link":"http://weather.yahoo.com","url":"http://l.yimg.com/a/i/brand/purplelogo//uh/us/news-wea.gif"},"item":{"title":"Conditions
50
+ for Victoria, CA at 8:59 pm PDT","lat":"48.43","long":"-123.36","link":"http://us.rd.yahoo.com/dailynews/rss/weather/Victoria__CA/*http://weather.yahoo.com/forecast/CAXX0523_f.html","pubDate":"Thu,
51
+ 28 Mar 2013 8:59 pm PDT","condition":{"code":"29","date":"Thu, 28 Mar 2013
52
+ 8:59 pm PDT","temp":"48","text":"Partly Cloudy"},"description":"\n<img src=\"http://l.yimg.com/a/i/us/we/52/29.gif\"/><br
53
+ />\n<b>Current Conditions:</b><br />\nPartly Cloudy, 48 F<BR />\n<BR /><b>Forecast:</b><BR
54
+ />\nThu - Clear. High: 55 Low: 43<br />\nFri - AM Clouds/PM Sun. High: 55
55
+ Low: 44<br />\n<br />\n<a href=\"http://us.rd.yahoo.com/dailynews/rss/weather/Victoria__CA/*http://weather.yahoo.com/forecast/CAXX0523_f.html\">Full
56
+ Forecast at Yahoo! Weather</a><BR/><BR/>\n(provided by <a href=\"http://www.weather.com\"
57
+ >The Weather Channel</a>)<br/>\n","forecast":[{"code":"31","date":"28 Mar
58
+ 2013","day":"Thu","high":"55","low":"43","text":"Clear"},{"code":"30","date":"29
59
+ Mar 2013","day":"Fri","high":"55","low":"44","text":"AM Clouds/PM Sun"}],"guid":{"isPermaLink":"false","content":"CAXX0523_2013_03_29_7_00_PDT"}}}}}}'
60
+ http_version:
61
+ recorded_at: Fri, 29 Mar 2013 07:15:45 GMT
62
+ recorded_with: VCR 2.4.0