weather-api 1.0.1 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
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