barometer-weather_bug 0.0.1 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a31444023e366197794d252581b83670556eea74
4
- data.tar.gz: 258204151d1f49d6fa32c425b299802df1cde018
3
+ metadata.gz: 4f5f4643fbfdd655e3315a979a3e28f92f225def
4
+ data.tar.gz: bb99772cb88028ab94b5c3498290ab6110c45fbe
5
5
  SHA512:
6
- metadata.gz: 3defeebf481c0ffc3aa6b60c50f43268aceeddcee5cc4bc960f8de5105e719d6bae1ee3b82db25db439dedbeb0c25b75d3084e040a1e1436503a383d4725113a
7
- data.tar.gz: a5d8c680a0aed1dab17a9c2443043202fa5af6d4d49ae7cb9950bf4e5347d2a3c3f2a26372197a7112ab90c85a55c3223c95e21214870fe922d5fcbd34e25f3f
6
+ metadata.gz: 43f7672fa16440e190c9abf9efc3107aaef15f57293de1012ace92bd4e42b963ad51ca45c491136658645d55b8bb9f0c4874e5d16e971fef43cf5e9c6889b140
7
+ data.tar.gz: 05614917e35afeedfb5d2e6f7b458f9c2d4f4e3f70ad60494e75db485e02e321512476642739c50443709231e5f987790c8e1169f73a948a5f85c2dada54feff
data/README.md CHANGED
@@ -20,7 +20,7 @@ processing.
20
20
 
21
21
  ```ruby
22
22
  query = Barometer::Query.new('42.7243,-73.6927')
23
- keys = {api: 'forecast io apikey'}
23
+ keys = {client_id: 'client_id', client_secret: 'client_secret'}
24
24
 
25
25
  result = Barometer::WeatherBug.call(query, keys: keys)
26
26
  puts result.current.temperature.c
@@ -1,5 +1,7 @@
1
1
  require 'barometer'
2
2
  require_relative 'weather_bug/version'
3
+ require_relative 'weather_bug/oauth_api'
4
+ require_relative 'weather_bug/oauth_token'
3
5
  require_relative 'weather_bug/current_api'
4
6
  require_relative 'weather_bug/current_response'
5
7
  require_relative 'weather_bug/forecast_api'
@@ -13,25 +15,32 @@ module Barometer
13
15
 
14
16
  def initialize(query, config={})
15
17
  @query = query
16
- @api_code = config[:keys][:code] if config[:keys]
18
+
19
+ if config.has_key? :keys
20
+ @api_client_id = config[:keys][:client_id]
21
+ @api_client_secret = config[:keys][:client_secret]
22
+ end
17
23
  end
18
24
 
19
25
  def measure!
20
- validate_key!
26
+ validate_keys!
27
+
28
+ oauth_token_api = OauthApi.new(api_client_id, api_client_secret)
29
+ oauth_token = OauthToken.new(oauth_token_api)
21
30
 
22
- current_weather_api = CurrentApi.new(query, api_code)
31
+ current_weather_api = CurrentApi.new(query, oauth_token)
23
32
  response = CurrentResponse.new.parse(current_weather_api.get)
24
33
 
25
- forecast_weather_api = ForecastApi.new(current_weather_api.query, api_code)
34
+ forecast_weather_api = ForecastApi.new(current_weather_api.query, oauth_token)
26
35
  ForecastResponse.new(response).parse(forecast_weather_api.get)
27
36
  end
28
37
 
29
38
  private
30
39
 
31
- attr_reader :query, :api_code
40
+ attr_reader :query, :api_client_id, :api_client_secret
32
41
 
33
- def validate_key!
34
- unless api_code && !api_code.empty?
42
+ def validate_keys!
43
+ unless api_client_id && api_client_secret
35
44
  raise Barometer::WeatherService::KeyRequired
36
45
  end
37
46
  end
@@ -3,21 +3,25 @@ require_relative 'query'
3
3
  module Barometer
4
4
  class WeatherBug
5
5
  class CurrentApi < Utils::Api
6
- def initialize(query, api_code)
6
+ def initialize(query, oauth_token)
7
7
  @query = WeatherBug::Query.new(query)
8
- @api_code = api_code
8
+ @oauth_token = oauth_token
9
9
  end
10
10
 
11
11
  def url
12
- "http://#{@api_code}.api.wxbug.net/getLiveWeatherRSS.aspx"
12
+ 'https://thepulseapi.earthnetworks.com/data/observations/v1/current'
13
13
  end
14
14
 
15
15
  def params
16
- {ACode: @api_code, OutputType: '1'}.merge(@query.to_param)
16
+ oauth2_params.merge(@query.to_param)
17
17
  end
18
18
 
19
- def unwrap_nodes
20
- ['weather', 'ob']
19
+ private
20
+
21
+ attr_reader :oauth_token
22
+
23
+ def oauth2_params
24
+ { access_token: oauth_token.access_token }
21
25
  end
22
26
  end
23
27
  end
@@ -1,6 +1,4 @@
1
- require_relative 'response/timezone'
2
1
  require_relative 'response/current_weather'
3
- require_relative 'response/station'
4
2
 
5
3
  module Barometer
6
4
  class WeatherBug
@@ -11,21 +9,13 @@ module Barometer
11
9
 
12
10
  def parse(payload)
13
11
  response.add_query(payload.query)
14
-
15
- response.timezone = WeatherBug::Response::TimeZone.new(payload).parse
16
- response.current = WeatherBug::Response::CurrentWeather.new(payload, timezone).parse
17
- response.station = WeatherBug::Response::Station.new(payload).parse
18
-
12
+ response.current = WeatherBug::Response::CurrentWeather.new(payload).parse
19
13
  response
20
14
  end
21
15
 
22
16
  private
23
17
 
24
18
  attr_reader :response
25
-
26
- def timezone
27
- response.timezone
28
- end
29
19
  end
30
20
  end
31
21
  end
@@ -3,21 +3,25 @@ require_relative 'query'
3
3
  module Barometer
4
4
  class WeatherBug
5
5
  class ForecastApi < Utils::Api
6
- def initialize(query, api_code)
6
+ def initialize(query, oauth_token)
7
7
  @query = WeatherBug::Query.new(query)
8
- @api_code = api_code
8
+ @oauth_token = oauth_token
9
9
  end
10
10
 
11
11
  def url
12
- "http://#{@api_code}.api.wxbug.net/getForecastRSS.aspx"
12
+ 'https://thepulseapi.earthnetworks.com/data/forecasts/v1/daily'
13
13
  end
14
14
 
15
15
  def params
16
- {ACode: @api_code, OutputType: '1'}.merge(@query.to_param)
16
+ oauth2_params.merge(@query.to_param)
17
17
  end
18
18
 
19
- def unwrap_nodes
20
- ['weather', 'forecasts']
19
+ private
20
+
21
+ attr_reader :oauth_token
22
+
23
+ def oauth2_params
24
+ { access_token: oauth_token.access_token }
21
25
  end
22
26
  end
23
27
  end
@@ -1,5 +1,4 @@
1
1
  require_relative 'response/forecasted_weather'
2
- require_relative 'response/location'
3
2
 
4
3
  module Barometer
5
4
  class WeatherBug
@@ -9,19 +8,13 @@ module Barometer
9
8
  end
10
9
 
11
10
  def parse(payload)
12
- response.forecast = WeatherBug::Response::ForecastedWeather.new(payload, timezone).parse
13
- response.location = WeatherBug::Response::Location.new(payload).parse
14
-
11
+ response.forecast = WeatherBug::Response::ForecastedWeather.new(payload).parse
15
12
  response
16
13
  end
17
14
 
18
15
  private
19
16
 
20
17
  attr_reader :response
21
-
22
- def timezone
23
- response.timezone
24
- end
25
18
  end
26
19
  end
27
20
  end
@@ -0,0 +1,28 @@
1
+ require_relative 'query'
2
+
3
+ module Barometer
4
+ class WeatherBug
5
+ class OauthApi < Utils::Api
6
+ def initialize(api_client_id, api_client_secret)
7
+ @api_client_id = api_client_id
8
+ @api_client_secret = api_client_secret
9
+ end
10
+
11
+ def url
12
+ 'https://thepulseapi.earthnetworks.com/oauth20/token'
13
+ end
14
+
15
+ def params
16
+ {
17
+ grant_type: 'client_credentials',
18
+ client_id: @api_client_id,
19
+ client_secret: @api_client_secret
20
+ }
21
+ end
22
+
23
+ def unwrap_nodes
24
+ ['OAuth20', 'access_token']
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,32 @@
1
+
2
+ require_relative 'query'
3
+
4
+ module Barometer
5
+ class WeatherBug
6
+ class OauthToken
7
+ def initialize(oauth_token_api)
8
+ @oauth_token_api = oauth_token_api
9
+ @access_token = nil
10
+ @expires_at = nil
11
+ end
12
+
13
+ def access_token
14
+ refresh_token if stale_token?
15
+ @access_token
16
+ end
17
+
18
+ private
19
+
20
+ def stale_token?
21
+ @access_token == nil || @expires_at == nil ||
22
+ @expires_at < Time.now.utc
23
+ end
24
+
25
+ def refresh_token
26
+ response = @oauth_token_api.get
27
+ @access_token = response.fetch(:token)
28
+ @expires_at = Time.now.utc + response.fetch(:expires_in)
29
+ end
30
+ end
31
+ end
32
+ end
@@ -6,7 +6,7 @@ module Barometer
6
6
  attr_reader :converted_query
7
7
 
8
8
  def self.accepted_formats
9
- [:short_zipcode, :coordinates]
9
+ [:coordinates]
10
10
  end
11
11
 
12
12
  def initialize(query)
@@ -15,7 +15,11 @@ module Barometer
15
15
  end
16
16
 
17
17
  def to_param
18
- {UnitType: unit_type}.merge(format_query)
18
+ {
19
+ locationtype: location_type,
20
+ units: units,
21
+ verbose: 'true'
22
+ }.merge(format_query)
19
23
  end
20
24
 
21
25
  private
@@ -24,17 +28,21 @@ module Barometer
24
28
  convert!(*self.class.accepted_formats)
25
29
  end
26
30
 
31
+ def location_type
32
+ 'latitudelongitude'
33
+ end
34
+
35
+ def units
36
+ converted_query.metric? ? 'metric' : 'english'
37
+ end
38
+
27
39
  def format_query
28
- if converted_query.format == :short_zipcode
29
- {zipCode: converted_query.q}
40
+ if converted_query.geo
41
+ { location: "#{converted_query.geo.latitude},#{converted_query.geo.longitude}" }
30
42
  else
31
- {lat: converted_query.geo.latitude, long: converted_query.geo.longitude}
43
+ { location: converted_query.to_s }
32
44
  end
33
45
  end
34
-
35
- def unit_type
36
- converted_query.metric? ? '1' : '0'
37
- end
38
46
  end
39
47
  end
40
48
  end
@@ -1,78 +1,53 @@
1
- require_relative 'time_helper'
2
- require_relative 'sun'
3
-
4
1
  module Barometer
5
2
  class WeatherBug
6
3
  class Response
7
4
  class CurrentWeather
8
- def initialize(payload, timezone)
5
+ def initialize(payload)
9
6
  @payload = payload
10
- @timezone = timezone
11
7
  @current = Barometer::Response::Current.new
12
8
  end
13
9
 
14
10
  def parse
15
11
  current.observed_at = observed_at
16
- current.stale_at = stale_at
17
12
  current.humidity = humidity
18
- current.condition = condition
19
13
  current.icon = icon
20
14
  current.temperature = temperature
21
15
  current.dew_point = dew_point
22
- current.wind_chill = wind_chill
23
16
  current.wind = wind
24
- current.pressure = pressure
25
- current.sun = WeatherBug::Response::Sun.new(payload, timezone).parse
26
17
 
27
18
  current
28
19
  end
29
20
 
30
21
  private
31
22
 
32
- attr_reader :payload, :timezone, :current
23
+ attr_reader :payload, :current
33
24
 
34
25
  def units
35
26
  payload.units
36
27
  end
37
28
 
38
29
  def observed_at
39
- @observed_at ||= TimeHelper.new(payload, timezone).parse('ob_date')
40
- end
41
-
42
- def stale_at
43
- Utils::Time.add_one_hour(observed_at)
30
+ Utils::Time.parse(payload.fetch('observationTimeUtcStr'), '%Y-%m-%dT%H:%M:%S')
44
31
  end
45
32
 
46
33
  def humidity
47
34
  payload.fetch('humidity')
48
35
  end
49
36
 
50
- def condition
51
- payload.fetch('current_condition')
52
- end
53
-
54
37
  def icon
55
- payload.using(/cond(\d*)\.gif/).fetch('current_condition', '@icon')
38
+ payload.fetch('iconCode')
56
39
  end
57
40
 
58
41
  def temperature
59
- [units, payload.fetch('temp')]
42
+ [units, payload.fetch('temperature')]
60
43
  end
61
44
 
62
45
  def dew_point
63
- [units, payload.fetch('dew_point')]
64
- end
65
-
66
- def wind_chill
67
- [units, payload.fetch('feels_like')]
46
+ [units, payload.fetch('dewPoint')]
68
47
  end
69
48
 
70
49
  def wind
71
- [units, payload.fetch('wind_speed'), payload.fetch('wind_direction_degrees')]
72
- end
73
-
74
- def pressure
75
- [units, payload.fetch('pressure')]
50
+ [units, payload.fetch('windSpeed'), payload.fetch('windDirection')]
76
51
  end
77
52
  end
78
53
  end
@@ -2,19 +2,24 @@ module Barometer
2
2
  class WeatherBug
3
3
  class Response
4
4
  class ForecastedWeather
5
- def initialize(payload, timezone)
5
+ def initialize(payload)
6
6
  @payload = payload
7
- @timezone = timezone
8
7
  @predictions = Barometer::Response::PredictionCollection.new
9
8
  end
10
9
 
11
10
  def parse
12
11
  each_prediction do |prediction, forecast_payload, index|
13
- prediction.date = date(index), timezone
12
+ prediction.starts_at = starts_at(forecast_payload)
13
+ prediction.ends_at = ends_at(prediction.starts_at)
14
14
  prediction.condition = condition(forecast_payload)
15
15
  prediction.icon = icon(forecast_payload)
16
- prediction.high = high(forecast_payload)
17
- prediction.low = low(forecast_payload)
16
+ prediction.pop = pop(forecast_payload)
17
+
18
+ if is_day?(forecast_payload)
19
+ prediction.high = high(forecast_payload)
20
+ else
21
+ prediction.low = low(forecast_payload)
22
+ end
18
23
  end
19
24
 
20
25
  predictions
@@ -22,42 +27,51 @@ module Barometer
22
27
 
23
28
  private
24
29
 
25
- attr_reader :payload, :timezone, :predictions
30
+ attr_reader :payload, :predictions
26
31
 
27
32
  def units
28
33
  payload.units
29
34
  end
30
35
 
31
36
  def each_prediction
32
- payload.fetch_each_with_index('forecast') do |forecast_payload, index|
37
+ payload.fetch_each_with_index('dailyForecastPeriods') do |forecast_payload, index|
33
38
  predictions.build do |prediction|
34
39
  yield prediction, forecast_payload, index
35
40
  end
36
41
  end
37
42
  end
38
43
 
39
- def start_date
40
- Date.strptime(payload.fetch('@date'), '%m/%d/%Y %H:%M:%S %p')
44
+ def starts_at(forecast_payload)
45
+ Utils::Time.parse(forecast_payload.fetch('forecastDateUtcStr'), '%Y-%m-%dT%H:%M:%S%z')
41
46
  end
42
47
 
43
- def date(index)
44
- start_date + index
48
+ def ends_at(starts_at)
49
+ half_a_day_minus_one_second = (12 * 60 * 60 - 1)
50
+ starts_at + half_a_day_minus_one_second
45
51
  end
46
52
 
47
53
  def condition(forecast_payload)
48
- forecast_payload.fetch('short_prediction')
54
+ forecast_payload.fetch('summaryDescription')
49
55
  end
50
56
 
51
57
  def icon(forecast_payload)
52
- forecast_payload.using(/cond0*([1-9][0-9]*)\.gif$/).fetch('image')
58
+ forecast_payload.fetch('iconCode')
53
59
  end
54
60
 
55
61
  def high(forecast_payload)
56
- [units, forecast_payload.fetch('high')]
62
+ [units, forecast_payload.fetch('temperature')]
57
63
  end
58
64
 
59
65
  def low(forecast_payload)
60
- [units, forecast_payload.fetch('low')]
66
+ [units, forecast_payload.fetch('temperature')]
67
+ end
68
+
69
+ def pop(forecast_payload)
70
+ forecast_payload.fetch('precipProbability')
71
+ end
72
+
73
+ def is_day?(forecast_payload)
74
+ !forecast_payload.fetch('isNightTimePeriod')
61
75
  end
62
76
  end
63
77
  end
@@ -1,5 +1,5 @@
1
1
  module Barometer
2
2
  class WeatherBug
3
- VERSION = '0.0.1'
3
+ VERSION = '0.1.0'
4
4
  end
5
5
  end
@@ -0,0 +1 @@
1
+ {"http_interactions":[{"request":{"method":"get","uri":"https://thepulseapi.earthnetworks.com/oauth20/token?client_id=WEATHERBUG_CLIENT_ID&client_secret=WEATHERBUG_CLIENT_SECRET&grant_type=client_credentials","body":{"encoding":"UTF-8","string":""},"headers":{"User-Agent":["HTTPClient/1.0 (2.3.4.1, ruby 2.1.1 (2014-02-24))"],"Accept":["*/*"],"Date":["Sun, 13 Apr 2014 22:12:29 GMT"]}},"response":{"status":{"code":200,"message":"OK"},"headers":{"Content-Type":["application/json"],"Content-Length":["157"],"Connection":["keep-alive"]},"body":{"encoding":"UTF-8","string":"{\"OAuth20\":{\"access_token\":{\"token\":\"WEATHERBUG_ACCESS_CODE\",\"refresh_token\":\"WEATHERBUG_ACCESS_CODE\",\"token_type\":\"bearer\",\"expires_in\":86399}}}"},"http_version":null},"recorded_at":"Sun, 13 Apr 2014 22:12:30 GMT"},{"request":{"method":"get","uri":"https://thepulseapi.earthnetworks.com/data/observations/v1/current?access_token=WEATHERBUG_ACCESS_CODE&location=39.1,77.1&locationtype=latitudelongitude&units=metric&verbose=true","body":{"encoding":"UTF-8","string":""},"headers":{"User-Agent":["HTTPClient/1.0 (2.3.4.1, ruby 2.1.1 (2014-02-24))"],"Accept":["*/*"],"Date":["Sun, 13 Apr 2014 22:12:30 GMT"]}},"response":{"status":{"code":200,"message":"OK"},"headers":{"Cache-Control":["no-cache"],"Content-Type":["application/json; charset=utf-8"],"Date":["Sun, 13 Apr 2014 22:12:29 GMT"],"Expires":["-1"],"Pragma":["no-cache"],"Server":["Microsoft-IIS/7.5"],"X-Aspnet-Version":["4.0.30319"],"X-Powered-By":["ASP.NET"],"Content-Length":["1155"],"Connection":["keep-alive"]},"body":{"encoding":"UTF-8","string":"{\r\n \"key\": null,\r\n \"stationId\": null,\r\n \"providerId\": null,\r\n \"observationTimeLocalStr\": \"2014-04-14T05:00:00\",\r\n \"observationTimeUtcStr\": \"2014-04-13T21:00:00\",\r\n \"iconCode\": 2,\r\n \"altimeter\": null,\r\n \"altimeterRate\": null,\r\n \"dewPoint\": -10.3,\r\n \"dewPointRate\": null,\r\n \"heatIndex\": null,\r\n \"humidity\": 20.0,\r\n \"humidityRate\": null,\r\n \"pressureSeaLevel\": null,\r\n \"pressureSeaLevelRate\": null,\r\n \"rainDaily\": null,\r\n \"rainRate\": 0.0,\r\n \"rainMonthly\": null,\r\n \"rainYearly\": null,\r\n \"snowDaily\": null,\r\n \"snowRate\": null,\r\n \"snowMonthly\": null,\r\n \"snowYearly\": null,\r\n \"temperature\": 11.8,\r\n \"temperatureRate\": null,\r\n \"visibility\": null,\r\n \"visibilityRate\": null,\r\n \"windChill\": null,\r\n \"windSpeed\": 14.4,\r\n \"windDirection\": 290,\r\n \"windSpeedAvg\": null,\r\n \"windDirectionAvg\": null,\r\n \"windGustHourly\": null,\r\n \"windGustTimeLocalHourlyStr\": null,\r\n \"windGustTimeUtcHourlyStr\": null,\r\n \"windGustDirectionHourly\": null,\r\n \"windGustDaily\": null,\r\n \"windGustTimeLocalDailyStr\": null,\r\n \"windGustTimeUtcDailyStr\": null,\r\n \"windGustDirectionDaily\": null,\r\n \"observationTimeAdjustedLocalStr\": null,\r\n \"feelsLike\": 11.8\r\n}"},"http_version":null},"recorded_at":"Sun, 13 Apr 2014 22:12:31 GMT"},{"request":{"method":"get","uri":"https://thepulseapi.earthnetworks.com/data/forecasts/v1/daily?access_token=WEATHERBUG_ACCESS_CODE&location=39.1,77.1&locationtype=latitudelongitude&units=metric&verbose=true","body":{"encoding":"UTF-8","string":""},"headers":{"User-Agent":["HTTPClient/1.0 (2.3.4.1, ruby 2.1.1 (2014-02-24))"],"Accept":["*/*"],"Date":["Sun, 13 Apr 2014 22:12:31 GMT"]}},"response":{"status":{"code":200,"message":"OK"},"headers":{"Cache-Control":["no-cache"],"Content-Type":["application/json; charset=utf-8"],"Date":["Sun, 13 Apr 2014 22:12:30 GMT"],"Expires":["-1"],"Pragma":["no-cache"],"Server":["Microsoft-IIS/7.5"],"X-Aspnet-Version":["4.0.30319"],"X-Powered-By":["ASP.NET"],"Content-Length":["12087"],"Connection":["keep-alive"]},"body":{"encoding":"UTF-8","string":"{\r\n \"dailyForecastPeriods\": [\r\n {\r\n \"cloudCoverPercent\": 37,\r\n \"dewPoint\": -15.0,\r\n \"iconCode\": 3,\r\n \"precipCode\": 1,\r\n \"precipProbability\": 0,\r\n \"relativeHumidity\": 13,\r\n \"summaryDescription\": \"Partly Cloudy\",\r\n \"temperature\": 20.8,\r\n \"thunderstormProbability\": 0,\r\n \"windDirectionDegrees\": 285,\r\n \"windSpeed\": 18.0,\r\n \"detailedDescription\": \"Partly cloudy. High temperature around 21C. Dew point will be around -15C with an average humidity of 13%. Winds will be 18 kph from the WNW.\",\r\n \"forecastDateLocalStr\": \"2014-04-14T07:00:00\",\r\n \"forecastDateUtcStr\": \"2014-04-13T23:00:00Z\",\r\n \"isNightTimePeriod\": false\r\n },\r\n {\r\n \"cloudCoverPercent\": 20,\r\n \"dewPoint\": -24.0,\r\n \"iconCode\": 70,\r\n \"precipCode\": 1,\r\n \"precipProbability\": 0,\r\n \"relativeHumidity\": 6,\r\n \"summaryDescription\": \"Mostly Clear\",\r\n \"temperature\": 8.2,\r\n \"thunderstormProbability\": 0,\r\n \"windDirectionDegrees\": 292,\r\n \"windSpeed\": 18.0,\r\n \"detailedDescription\": \"Mostly clear. Low temperature around 8C. Dew point will be around -24C with an average humidity of 6%. Winds will be 18 kph from the WNW.\",\r\n \"forecastDateLocalStr\": \"2014-04-14T19:00:00\",\r\n \"forecastDateUtcStr\": \"2014-04-14T11:00:00Z\",\r\n \"isNightTimePeriod\": true\r\n },\r\n {\r\n \"cloudCoverPercent\": 21,\r\n \"dewPoint\": -24.0,\r\n \"iconCode\": 26,\r\n \"precipCode\": 1,\r\n \"precipProbability\": 0,\r\n \"relativeHumidity\": 5,\r\n \"summaryDescription\": \"Mostly Sunny\",\r\n \"temperature\": 22.2,\r\n \"thunderstormProbability\": 0,\r\n \"windDirectionDegrees\": 273,\r\n \"windSpeed\": 10.8,\r\n \"detailedDescription\": \"Mostly sunny. High temperature around 22C. Dew point will be around -24C with an average humidity of 5%. Winds will be 11 kph from the W.\",\r\n \"forecastDateLocalStr\": \"2014-04-15T07:00:00\",\r\n \"forecastDateUtcStr\": \"2014-04-14T23:00:00Z\",\r\n \"isNightTimePeriod\": false\r\n },\r\n {\r\n \"cloudCoverPercent\": 42,\r\n \"dewPoint\": -22.0,\r\n \"iconCode\": 2,\r\n \"precipCode\": 1,\r\n \"precipProbability\": 0,\r\n \"relativeHumidity\": 6,\r\n \"summaryDescription\": \"Partly Cloudy\",\r\n \"temperature\": 7.4,\r\n \"thunderstormProbability\": 0,\r\n \"windDirectionDegrees\": 282,\r\n \"windSpeed\": 7.2,\r\n \"detailedDescription\": \"Partly cloudy. Low temperature around 7C. Dew point will be around -22C with an average humidity of 6%. Winds will be 7 kph from the WNW.\",\r\n \"forecastDateLocalStr\": \"2014-04-15T19:00:00\",\r\n \"forecastDateUtcStr\": \"2014-04-15T11:00:00Z\",\r\n \"isNightTimePeriod\": true\r\n },\r\n {\r\n \"cloudCoverPercent\": 55,\r\n \"dewPoint\": -21.0,\r\n \"iconCode\": 3,\r\n \"precipCode\": 1,\r\n \"precipProbability\": 0,\r\n \"relativeHumidity\": 7,\r\n \"summaryDescription\": \"Partly Cloudy\",\r\n \"temperature\": 23.5,\r\n \"thunderstormProbability\": 0,\r\n \"windDirectionDegrees\": 304,\r\n \"windSpeed\": 7.2,\r\n \"detailedDescription\": \"Partly cloudy. High temperature around 24C. Dew point will be around -21C with an average humidity of 7%. Winds will be 7 kph from the NW.\",\r\n \"forecastDateLocalStr\": \"2014-04-16T07:00:00\",\r\n \"forecastDateUtcStr\": \"2014-04-15T23:00:00Z\",\r\n \"isNightTimePeriod\": false\r\n },\r\n {\r\n \"cloudCoverPercent\": 49,\r\n \"dewPoint\": -19.0,\r\n \"iconCode\": 2,\r\n \"precipCode\": 1,\r\n \"precipProbability\": 0,\r\n \"relativeHumidity\": 9,\r\n \"summaryDescription\": \"Partly Cloudy\",\r\n \"temperature\": 7.2,\r\n \"thunderstormProbability\": 0,\r\n \"windDirectionDegrees\": 6,\r\n \"windSpeed\": 7.2,\r\n \"detailedDescription\": \"Partly cloudy. Low temperature around 7C. Dew point will be around -19C with an average humidity of 9%. Winds will be 7 kph from the N.\",\r\n \"forecastDateLocalStr\": \"2014-04-16T19:00:00\",\r\n \"forecastDateUtcStr\": \"2014-04-16T11:00:00Z\",\r\n \"isNightTimePeriod\": true\r\n },\r\n {\r\n \"cloudCoverPercent\": 71,\r\n \"dewPoint\": -16.0,\r\n \"iconCode\": 24,\r\n \"precipCode\": 1,\r\n \"precipProbability\": 0,\r\n \"relativeHumidity\": 12,\r\n \"summaryDescription\": \"Mostly Cloudy\",\r\n \"temperature\": 21.3,\r\n \"thunderstormProbability\": 0,\r\n \"windDirectionDegrees\": 50,\r\n \"windSpeed\": 7.2,\r\n \"detailedDescription\": \"Mostly cloudy. High temperature around 21C. Dew point will be around -16C with an average humidity of 12%. Winds will be 7 kph from the NE.\",\r\n \"forecastDateLocalStr\": \"2014-04-17T07:00:00\",\r\n \"forecastDateUtcStr\": \"2014-04-16T23:00:00Z\",\r\n \"isNightTimePeriod\": false\r\n },\r\n {\r\n \"cloudCoverPercent\": 99,\r\n \"dewPoint\": -15.0,\r\n \"iconCode\": 13,\r\n \"precipCode\": 1,\r\n \"precipProbability\": 0,\r\n \"relativeHumidity\": 11,\r\n \"summaryDescription\": \"Cloudy\",\r\n \"temperature\": 10.6,\r\n \"thunderstormProbability\": 0,\r\n \"windDirectionDegrees\": 78,\r\n \"windSpeed\": 7.2,\r\n \"detailedDescription\": \"Cloudy. Low temperature around 11C. Dew point will be around -15C with an average humidity of 11%. Winds will be 7 kph from the ENE.\",\r\n \"forecastDateLocalStr\": \"2014-04-17T19:00:00\",\r\n \"forecastDateUtcStr\": \"2014-04-17T11:00:00Z\",\r\n \"isNightTimePeriod\": true\r\n },\r\n {\r\n \"cloudCoverPercent\": 69,\r\n \"dewPoint\": -11.0,\r\n \"iconCode\": 3,\r\n \"precipCode\": 1,\r\n \"precipProbability\": 0,\r\n \"relativeHumidity\": 14,\r\n \"summaryDescription\": \"Partly Cloudy\",\r\n \"temperature\": 22.0,\r\n \"thunderstormProbability\": 0,\r\n \"windDirectionDegrees\": 44,\r\n \"windSpeed\": 10.8,\r\n \"detailedDescription\": \"Partly cloudy. High temperature around 22C. Dew point will be around -11C with an average humidity of 14%. Winds will be 11 kph from the NE.\",\r\n \"forecastDateLocalStr\": \"2014-04-18T07:00:00\",\r\n \"forecastDateUtcStr\": \"2014-04-17T23:00:00Z\",\r\n \"isNightTimePeriod\": false\r\n },\r\n {\r\n \"cloudCoverPercent\": 78,\r\n \"dewPoint\": -8.0,\r\n \"iconCode\": 73,\r\n \"precipCode\": 1,\r\n \"precipProbability\": 0,\r\n \"relativeHumidity\": 19,\r\n \"summaryDescription\": \"Mostly Cloudy\",\r\n \"temperature\": 10.9,\r\n \"thunderstormProbability\": 0,\r\n \"windDirectionDegrees\": 82,\r\n \"windSpeed\": 14.4,\r\n \"detailedDescription\": \"Mostly cloudy. Low temperature around 11C. Dew point will be around -8C with an average humidity of 19%. Winds will be 14 kph from the E.\",\r\n \"forecastDateLocalStr\": \"2014-04-18T19:00:00\",\r\n \"forecastDateUtcStr\": \"2014-04-18T11:00:00Z\",\r\n \"isNightTimePeriod\": true\r\n },\r\n {\r\n \"cloudCoverPercent\": 100,\r\n \"dewPoint\": -10.0,\r\n \"iconCode\": 1,\r\n \"precipCode\": 1,\r\n \"precipProbability\": 0,\r\n \"relativeHumidity\": 17,\r\n \"summaryDescription\": \"Cloudy\",\r\n \"temperature\": 20.1,\r\n \"thunderstormProbability\": 0,\r\n \"windDirectionDegrees\": 98,\r\n \"windSpeed\": 7.2,\r\n \"detailedDescription\": \"Cloudy. High temperature around 20C. Dew point will be around -10C with an average humidity of 17%. Winds will be 7 kph from the E.\",\r\n \"forecastDateLocalStr\": \"2014-04-19T07:00:00\",\r\n \"forecastDateUtcStr\": \"2014-04-18T23:00:00Z\",\r\n \"isNightTimePeriod\": false\r\n },\r\n {\r\n \"cloudCoverPercent\": 73,\r\n \"dewPoint\": -8.0,\r\n \"iconCode\": 73,\r\n \"precipCode\": 1,\r\n \"precipProbability\": 0,\r\n \"relativeHumidity\": 20,\r\n \"summaryDescription\": \"Mostly Cloudy\",\r\n \"temperature\": 8.2,\r\n \"thunderstormProbability\": 0,\r\n \"windDirectionDegrees\": 141,\r\n \"windSpeed\": 7.2,\r\n \"detailedDescription\": \"Mostly cloudy. Low temperature around 8C. Dew point will be around -8C with an average humidity of 20%. Winds will be 7 kph from the SE.\",\r\n \"forecastDateLocalStr\": \"2014-04-19T19:00:00\",\r\n \"forecastDateUtcStr\": \"2014-04-19T11:00:00Z\",\r\n \"isNightTimePeriod\": true\r\n },\r\n {\r\n \"cloudCoverPercent\": 31,\r\n \"dewPoint\": -8.0,\r\n \"iconCode\": 3,\r\n \"precipCode\": 1,\r\n \"precipProbability\": 0,\r\n \"relativeHumidity\": 21,\r\n \"summaryDescription\": \"Partly Cloudy\",\r\n \"temperature\": 22.9,\r\n \"thunderstormProbability\": 0,\r\n \"windDirectionDegrees\": 152,\r\n \"windSpeed\": 7.2,\r\n \"detailedDescription\": \"Partly cloudy. High temperature around 23C. Dew point will be around -8C with an average humidity of 21%. Winds will be 7 kph from the SSE.\",\r\n \"forecastDateLocalStr\": \"2014-04-20T07:00:00\",\r\n \"forecastDateUtcStr\": \"2014-04-19T23:00:00Z\",\r\n \"isNightTimePeriod\": false\r\n },\r\n {\r\n \"cloudCoverPercent\": 21,\r\n \"dewPoint\": -8.0,\r\n \"iconCode\": 70,\r\n \"precipCode\": 1,\r\n \"precipProbability\": 0,\r\n \"relativeHumidity\": 18,\r\n \"summaryDescription\": \"Mostly Clear\",\r\n \"temperature\": 9.6,\r\n \"thunderstormProbability\": 0,\r\n \"windDirectionDegrees\": 221,\r\n \"windSpeed\": 3.6,\r\n \"detailedDescription\": \"Mostly clear. Low temperature around 10C. Dew point will be around -8C with an average humidity of 18%. Winds will be 4 kph from the SW.\",\r\n \"forecastDateLocalStr\": \"2014-04-20T19:00:00\",\r\n \"forecastDateUtcStr\": \"2014-04-20T11:00:00Z\",\r\n \"isNightTimePeriod\": true\r\n },\r\n {\r\n \"cloudCoverPercent\": 13,\r\n \"dewPoint\": -8.0,\r\n \"iconCode\": 26,\r\n \"precipCode\": 1,\r\n \"precipProbability\": 0,\r\n \"relativeHumidity\": 18,\r\n \"summaryDescription\": \"Mostly Sunny\",\r\n \"temperature\": 25.6,\r\n \"thunderstormProbability\": 0,\r\n \"windDirectionDegrees\": 243,\r\n \"windSpeed\": 3.6,\r\n \"detailedDescription\": \"Mostly sunny. High temperature around 26C. Dew point will be around -8C with an average humidity of 18%. Winds will be 4 kph from the WSW.\",\r\n \"forecastDateLocalStr\": \"2014-04-21T07:00:00\",\r\n \"forecastDateUtcStr\": \"2014-04-20T23:00:00Z\",\r\n \"isNightTimePeriod\": false\r\n },\r\n {\r\n \"cloudCoverPercent\": 87,\r\n \"dewPoint\": -9.0,\r\n \"iconCode\": 73,\r\n \"precipCode\": 1,\r\n \"precipProbability\": 0,\r\n \"relativeHumidity\": 15,\r\n \"summaryDescription\": \"Mostly Cloudy\",\r\n \"temperature\": 11.1,\r\n \"thunderstormProbability\": 0,\r\n \"windDirectionDegrees\": 72,\r\n \"windSpeed\": 3.6,\r\n \"detailedDescription\": \"Mostly cloudy. Low temperature around 11C. Dew point will be around -9C with an average humidity of 15%. Winds will be 4 kph from the ENE.\",\r\n \"forecastDateLocalStr\": \"2014-04-21T19:00:00\",\r\n \"forecastDateUtcStr\": \"2014-04-21T11:00:00Z\",\r\n \"isNightTimePeriod\": true\r\n },\r\n {\r\n \"cloudCoverPercent\": 52,\r\n \"dewPoint\": -10.0,\r\n \"iconCode\": 3,\r\n \"precipCode\": 1,\r\n \"precipProbability\": 0,\r\n \"relativeHumidity\": 14,\r\n \"summaryDescription\": \"Partly Cloudy\",\r\n \"temperature\": 27.2,\r\n \"thunderstormProbability\": 0,\r\n \"windDirectionDegrees\": 223,\r\n \"windSpeed\": 3.6,\r\n \"detailedDescription\": \"Partly cloudy. High temperature around 27C. Dew point will be around -10C with an average humidity of 14%. Winds will be 4 kph from the SW.\",\r\n \"forecastDateLocalStr\": \"2014-04-22T07:00:00\",\r\n \"forecastDateUtcStr\": \"2014-04-21T23:00:00Z\",\r\n \"isNightTimePeriod\": false\r\n },\r\n {\r\n \"cloudCoverPercent\": 36,\r\n \"dewPoint\": -8.0,\r\n \"iconCode\": 2,\r\n \"precipCode\": 1,\r\n \"precipProbability\": 0,\r\n \"relativeHumidity\": 15,\r\n \"summaryDescription\": \"Partly Cloudy\",\r\n \"temperature\": 14.5,\r\n \"thunderstormProbability\": 0,\r\n \"windDirectionDegrees\": 275,\r\n \"windSpeed\": 10.8,\r\n \"detailedDescription\": \"Partly cloudy. Low temperature around 15C. Dew point will be around -8C with an average humidity of 15%. Winds will be 11 kph from the W.\",\r\n \"forecastDateLocalStr\": \"2014-04-22T19:00:00\",\r\n \"forecastDateUtcStr\": \"2014-04-22T11:00:00Z\",\r\n \"isNightTimePeriod\": true\r\n }\r\n ],\r\n \"forecastCreatedUtcStr\": \"2014-04-13T12:01:00.0000000Z\",\r\n \"location\": \"CH13B0005\",\r\n \"locationType\": \"city\"\r\n}"},"http_version":null},"recorded_at":"Sun, 13 Apr 2014 22:12:31 GMT"},{"request":{"method":"get","uri":"https://thepulseapi.earthnetworks.com/oauth20/token?client_id=WEATHERBUG_CLIENT_ID&client_secret=WEATHERBUG_CLIENT_SECRET&grant_type=client_credentials","body":{"encoding":"UTF-8","string":""},"headers":{"User-Agent":["HTTPClient/1.0 (2.3.4.1, ruby 2.1.1 (2014-02-24))"],"Accept":["*/*"],"Date":["Sun, 13 Apr 2014 22:12:31 GMT"]}},"response":{"status":{"code":200,"message":"OK"},"headers":{"Content-Type":["application/json"],"Content-Length":["157"],"Connection":["keep-alive"]},"body":{"encoding":"UTF-8","string":"{\"OAuth20\":{\"access_token\":{\"token\":\"KucXobMIyGIMjN8L0kJ4bpPg5GaV\",\"refresh_token\":\"KucXobMIyGIMjN8L0kJ4bpPg5GaV\",\"token_type\":\"bearer\",\"expires_in\":86399}}}"},"http_version":null},"recorded_at":"Sun, 13 Apr 2014 22:12:32 GMT"},{"request":{"method":"get","uri":"https://thepulseapi.earthnetworks.com/data/observations/v1/current?access_token=KucXobMIyGIMjN8L0kJ4bpPg5GaV&location=39.1,77.1&locationtype=latitudelongitude&units=metric&verbose=true","body":{"encoding":"UTF-8","string":""},"headers":{"User-Agent":["HTTPClient/1.0 (2.3.4.1, ruby 2.1.1 (2014-02-24))"],"Accept":["*/*"],"Date":["Sun, 13 Apr 2014 22:12:32 GMT"]}},"response":{"status":{"code":200,"message":"OK"},"headers":{"Cache-Control":["no-cache"],"Content-Type":["application/json; charset=utf-8"],"Date":["Sun, 13 Apr 2014 22:12:32 GMT"],"Expires":["-1"],"Pragma":["no-cache"],"Server":["Microsoft-IIS/7.5"],"X-Aspnet-Version":["4.0.30319"],"X-Powered-By":["ASP.NET"],"Content-Length":["1155"],"Connection":["keep-alive"]},"body":{"encoding":"UTF-8","string":"{\r\n \"key\": null,\r\n \"stationId\": null,\r\n \"providerId\": null,\r\n \"observationTimeLocalStr\": \"2014-04-14T05:00:00\",\r\n \"observationTimeUtcStr\": \"2014-04-13T21:00:00\",\r\n \"iconCode\": 2,\r\n \"altimeter\": null,\r\n \"altimeterRate\": null,\r\n \"dewPoint\": -10.3,\r\n \"dewPointRate\": null,\r\n \"heatIndex\": null,\r\n \"humidity\": 20.0,\r\n \"humidityRate\": null,\r\n \"pressureSeaLevel\": null,\r\n \"pressureSeaLevelRate\": null,\r\n \"rainDaily\": null,\r\n \"rainRate\": 0.0,\r\n \"rainMonthly\": null,\r\n \"rainYearly\": null,\r\n \"snowDaily\": null,\r\n \"snowRate\": null,\r\n \"snowMonthly\": null,\r\n \"snowYearly\": null,\r\n \"temperature\": 11.8,\r\n \"temperatureRate\": null,\r\n \"visibility\": null,\r\n \"visibilityRate\": null,\r\n \"windChill\": null,\r\n \"windSpeed\": 14.4,\r\n \"windDirection\": 290,\r\n \"windSpeedAvg\": null,\r\n \"windDirectionAvg\": null,\r\n \"windGustHourly\": null,\r\n \"windGustTimeLocalHourlyStr\": null,\r\n \"windGustTimeUtcHourlyStr\": null,\r\n \"windGustDirectionHourly\": null,\r\n \"windGustDaily\": null,\r\n \"windGustTimeLocalDailyStr\": null,\r\n \"windGustTimeUtcDailyStr\": null,\r\n \"windGustDirectionDaily\": null,\r\n \"observationTimeAdjustedLocalStr\": null,\r\n \"feelsLike\": 11.8\r\n}"},"http_version":null},"recorded_at":"Sun, 13 Apr 2014 22:12:32 GMT"},{"request":{"method":"get","uri":"https://thepulseapi.earthnetworks.com/data/forecasts/v1/daily?access_token=KucXobMIyGIMjN8L0kJ4bpPg5GaV&location=39.1,77.1&locationtype=latitudelongitude&units=metric&verbose=true","body":{"encoding":"UTF-8","string":""},"headers":{"User-Agent":["HTTPClient/1.0 (2.3.4.1, ruby 2.1.1 (2014-02-24))"],"Accept":["*/*"],"Date":["Sun, 13 Apr 2014 22:12:32 GMT"]}},"response":{"status":{"code":200,"message":"OK"},"headers":{"Cache-Control":["no-cache"],"Content-Type":["application/json; charset=utf-8"],"Date":["Sun, 13 Apr 2014 22:12:34 GMT"],"Expires":["-1"],"Pragma":["no-cache"],"Server":["Microsoft-IIS/7.5"],"X-Aspnet-Version":["4.0.30319"],"X-Powered-By":["ASP.NET"],"Content-Length":["12087"],"Connection":["keep-alive"]},"body":{"encoding":"UTF-8","string":"{\r\n \"dailyForecastPeriods\": [\r\n {\r\n \"cloudCoverPercent\": 37,\r\n \"dewPoint\": -15.0,\r\n \"iconCode\": 3,\r\n \"precipCode\": 1,\r\n \"precipProbability\": 0,\r\n \"relativeHumidity\": 13,\r\n \"summaryDescription\": \"Partly Cloudy\",\r\n \"temperature\": 20.8,\r\n \"thunderstormProbability\": 0,\r\n \"windDirectionDegrees\": 285,\r\n \"windSpeed\": 18.0,\r\n \"detailedDescription\": \"Partly cloudy. High temperature around 21C. Dew point will be around -15C with an average humidity of 13%. Winds will be 18 kph from the WNW.\",\r\n \"forecastDateLocalStr\": \"2014-04-14T07:00:00\",\r\n \"forecastDateUtcStr\": \"2014-04-13T23:00:00Z\",\r\n \"isNightTimePeriod\": false\r\n },\r\n {\r\n \"cloudCoverPercent\": 20,\r\n \"dewPoint\": -24.0,\r\n \"iconCode\": 70,\r\n \"precipCode\": 1,\r\n \"precipProbability\": 0,\r\n \"relativeHumidity\": 6,\r\n \"summaryDescription\": \"Mostly Clear\",\r\n \"temperature\": 8.2,\r\n \"thunderstormProbability\": 0,\r\n \"windDirectionDegrees\": 292,\r\n \"windSpeed\": 18.0,\r\n \"detailedDescription\": \"Mostly clear. Low temperature around 8C. Dew point will be around -24C with an average humidity of 6%. Winds will be 18 kph from the WNW.\",\r\n \"forecastDateLocalStr\": \"2014-04-14T19:00:00\",\r\n \"forecastDateUtcStr\": \"2014-04-14T11:00:00Z\",\r\n \"isNightTimePeriod\": true\r\n },\r\n {\r\n \"cloudCoverPercent\": 21,\r\n \"dewPoint\": -24.0,\r\n \"iconCode\": 26,\r\n \"precipCode\": 1,\r\n \"precipProbability\": 0,\r\n \"relativeHumidity\": 5,\r\n \"summaryDescription\": \"Mostly Sunny\",\r\n \"temperature\": 22.2,\r\n \"thunderstormProbability\": 0,\r\n \"windDirectionDegrees\": 273,\r\n \"windSpeed\": 10.8,\r\n \"detailedDescription\": \"Mostly sunny. High temperature around 22C. Dew point will be around -24C with an average humidity of 5%. Winds will be 11 kph from the W.\",\r\n \"forecastDateLocalStr\": \"2014-04-15T07:00:00\",\r\n \"forecastDateUtcStr\": \"2014-04-14T23:00:00Z\",\r\n \"isNightTimePeriod\": false\r\n },\r\n {\r\n \"cloudCoverPercent\": 42,\r\n \"dewPoint\": -22.0,\r\n \"iconCode\": 2,\r\n \"precipCode\": 1,\r\n \"precipProbability\": 0,\r\n \"relativeHumidity\": 6,\r\n \"summaryDescription\": \"Partly Cloudy\",\r\n \"temperature\": 7.4,\r\n \"thunderstormProbability\": 0,\r\n \"windDirectionDegrees\": 282,\r\n \"windSpeed\": 7.2,\r\n \"detailedDescription\": \"Partly cloudy. Low temperature around 7C. Dew point will be around -22C with an average humidity of 6%. Winds will be 7 kph from the WNW.\",\r\n \"forecastDateLocalStr\": \"2014-04-15T19:00:00\",\r\n \"forecastDateUtcStr\": \"2014-04-15T11:00:00Z\",\r\n \"isNightTimePeriod\": true\r\n },\r\n {\r\n \"cloudCoverPercent\": 55,\r\n \"dewPoint\": -21.0,\r\n \"iconCode\": 3,\r\n \"precipCode\": 1,\r\n \"precipProbability\": 0,\r\n \"relativeHumidity\": 7,\r\n \"summaryDescription\": \"Partly Cloudy\",\r\n \"temperature\": 23.5,\r\n \"thunderstormProbability\": 0,\r\n \"windDirectionDegrees\": 304,\r\n \"windSpeed\": 7.2,\r\n \"detailedDescription\": \"Partly cloudy. High temperature around 24C. Dew point will be around -21C with an average humidity of 7%. Winds will be 7 kph from the NW.\",\r\n \"forecastDateLocalStr\": \"2014-04-16T07:00:00\",\r\n \"forecastDateUtcStr\": \"2014-04-15T23:00:00Z\",\r\n \"isNightTimePeriod\": false\r\n },\r\n {\r\n \"cloudCoverPercent\": 49,\r\n \"dewPoint\": -19.0,\r\n \"iconCode\": 2,\r\n \"precipCode\": 1,\r\n \"precipProbability\": 0,\r\n \"relativeHumidity\": 9,\r\n \"summaryDescription\": \"Partly Cloudy\",\r\n \"temperature\": 7.2,\r\n \"thunderstormProbability\": 0,\r\n \"windDirectionDegrees\": 6,\r\n \"windSpeed\": 7.2,\r\n \"detailedDescription\": \"Partly cloudy. Low temperature around 7C. Dew point will be around -19C with an average humidity of 9%. Winds will be 7 kph from the N.\",\r\n \"forecastDateLocalStr\": \"2014-04-16T19:00:00\",\r\n \"forecastDateUtcStr\": \"2014-04-16T11:00:00Z\",\r\n \"isNightTimePeriod\": true\r\n },\r\n {\r\n \"cloudCoverPercent\": 71,\r\n \"dewPoint\": -16.0,\r\n \"iconCode\": 24,\r\n \"precipCode\": 1,\r\n \"precipProbability\": 0,\r\n \"relativeHumidity\": 12,\r\n \"summaryDescription\": \"Mostly Cloudy\",\r\n \"temperature\": 21.3,\r\n \"thunderstormProbability\": 0,\r\n \"windDirectionDegrees\": 50,\r\n \"windSpeed\": 7.2,\r\n \"detailedDescription\": \"Mostly cloudy. High temperature around 21C. Dew point will be around -16C with an average humidity of 12%. Winds will be 7 kph from the NE.\",\r\n \"forecastDateLocalStr\": \"2014-04-17T07:00:00\",\r\n \"forecastDateUtcStr\": \"2014-04-16T23:00:00Z\",\r\n \"isNightTimePeriod\": false\r\n },\r\n {\r\n \"cloudCoverPercent\": 99,\r\n \"dewPoint\": -15.0,\r\n \"iconCode\": 13,\r\n \"precipCode\": 1,\r\n \"precipProbability\": 0,\r\n \"relativeHumidity\": 11,\r\n \"summaryDescription\": \"Cloudy\",\r\n \"temperature\": 10.6,\r\n \"thunderstormProbability\": 0,\r\n \"windDirectionDegrees\": 78,\r\n \"windSpeed\": 7.2,\r\n \"detailedDescription\": \"Cloudy. Low temperature around 11C. Dew point will be around -15C with an average humidity of 11%. Winds will be 7 kph from the ENE.\",\r\n \"forecastDateLocalStr\": \"2014-04-17T19:00:00\",\r\n \"forecastDateUtcStr\": \"2014-04-17T11:00:00Z\",\r\n \"isNightTimePeriod\": true\r\n },\r\n {\r\n \"cloudCoverPercent\": 69,\r\n \"dewPoint\": -11.0,\r\n \"iconCode\": 3,\r\n \"precipCode\": 1,\r\n \"precipProbability\": 0,\r\n \"relativeHumidity\": 14,\r\n \"summaryDescription\": \"Partly Cloudy\",\r\n \"temperature\": 22.0,\r\n \"thunderstormProbability\": 0,\r\n \"windDirectionDegrees\": 44,\r\n \"windSpeed\": 10.8,\r\n \"detailedDescription\": \"Partly cloudy. High temperature around 22C. Dew point will be around -11C with an average humidity of 14%. Winds will be 11 kph from the NE.\",\r\n \"forecastDateLocalStr\": \"2014-04-18T07:00:00\",\r\n \"forecastDateUtcStr\": \"2014-04-17T23:00:00Z\",\r\n \"isNightTimePeriod\": false\r\n },\r\n {\r\n \"cloudCoverPercent\": 78,\r\n \"dewPoint\": -8.0,\r\n \"iconCode\": 73,\r\n \"precipCode\": 1,\r\n \"precipProbability\": 0,\r\n \"relativeHumidity\": 19,\r\n \"summaryDescription\": \"Mostly Cloudy\",\r\n \"temperature\": 10.9,\r\n \"thunderstormProbability\": 0,\r\n \"windDirectionDegrees\": 82,\r\n \"windSpeed\": 14.4,\r\n \"detailedDescription\": \"Mostly cloudy. Low temperature around 11C. Dew point will be around -8C with an average humidity of 19%. Winds will be 14 kph from the E.\",\r\n \"forecastDateLocalStr\": \"2014-04-18T19:00:00\",\r\n \"forecastDateUtcStr\": \"2014-04-18T11:00:00Z\",\r\n \"isNightTimePeriod\": true\r\n },\r\n {\r\n \"cloudCoverPercent\": 100,\r\n \"dewPoint\": -10.0,\r\n \"iconCode\": 1,\r\n \"precipCode\": 1,\r\n \"precipProbability\": 0,\r\n \"relativeHumidity\": 17,\r\n \"summaryDescription\": \"Cloudy\",\r\n \"temperature\": 20.1,\r\n \"thunderstormProbability\": 0,\r\n \"windDirectionDegrees\": 98,\r\n \"windSpeed\": 7.2,\r\n \"detailedDescription\": \"Cloudy. High temperature around 20C. Dew point will be around -10C with an average humidity of 17%. Winds will be 7 kph from the E.\",\r\n \"forecastDateLocalStr\": \"2014-04-19T07:00:00\",\r\n \"forecastDateUtcStr\": \"2014-04-18T23:00:00Z\",\r\n \"isNightTimePeriod\": false\r\n },\r\n {\r\n \"cloudCoverPercent\": 73,\r\n \"dewPoint\": -8.0,\r\n \"iconCode\": 73,\r\n \"precipCode\": 1,\r\n \"precipProbability\": 0,\r\n \"relativeHumidity\": 20,\r\n \"summaryDescription\": \"Mostly Cloudy\",\r\n \"temperature\": 8.2,\r\n \"thunderstormProbability\": 0,\r\n \"windDirectionDegrees\": 141,\r\n \"windSpeed\": 7.2,\r\n \"detailedDescription\": \"Mostly cloudy. Low temperature around 8C. Dew point will be around -8C with an average humidity of 20%. Winds will be 7 kph from the SE.\",\r\n \"forecastDateLocalStr\": \"2014-04-19T19:00:00\",\r\n \"forecastDateUtcStr\": \"2014-04-19T11:00:00Z\",\r\n \"isNightTimePeriod\": true\r\n },\r\n {\r\n \"cloudCoverPercent\": 31,\r\n \"dewPoint\": -8.0,\r\n \"iconCode\": 3,\r\n \"precipCode\": 1,\r\n \"precipProbability\": 0,\r\n \"relativeHumidity\": 21,\r\n \"summaryDescription\": \"Partly Cloudy\",\r\n \"temperature\": 22.9,\r\n \"thunderstormProbability\": 0,\r\n \"windDirectionDegrees\": 152,\r\n \"windSpeed\": 7.2,\r\n \"detailedDescription\": \"Partly cloudy. High temperature around 23C. Dew point will be around -8C with an average humidity of 21%. Winds will be 7 kph from the SSE.\",\r\n \"forecastDateLocalStr\": \"2014-04-20T07:00:00\",\r\n \"forecastDateUtcStr\": \"2014-04-19T23:00:00Z\",\r\n \"isNightTimePeriod\": false\r\n },\r\n {\r\n \"cloudCoverPercent\": 21,\r\n \"dewPoint\": -8.0,\r\n \"iconCode\": 70,\r\n \"precipCode\": 1,\r\n \"precipProbability\": 0,\r\n \"relativeHumidity\": 18,\r\n \"summaryDescription\": \"Mostly Clear\",\r\n \"temperature\": 9.6,\r\n \"thunderstormProbability\": 0,\r\n \"windDirectionDegrees\": 221,\r\n \"windSpeed\": 3.6,\r\n \"detailedDescription\": \"Mostly clear. Low temperature around 10C. Dew point will be around -8C with an average humidity of 18%. Winds will be 4 kph from the SW.\",\r\n \"forecastDateLocalStr\": \"2014-04-20T19:00:00\",\r\n \"forecastDateUtcStr\": \"2014-04-20T11:00:00Z\",\r\n \"isNightTimePeriod\": true\r\n },\r\n {\r\n \"cloudCoverPercent\": 13,\r\n \"dewPoint\": -8.0,\r\n \"iconCode\": 26,\r\n \"precipCode\": 1,\r\n \"precipProbability\": 0,\r\n \"relativeHumidity\": 18,\r\n \"summaryDescription\": \"Mostly Sunny\",\r\n \"temperature\": 25.6,\r\n \"thunderstormProbability\": 0,\r\n \"windDirectionDegrees\": 243,\r\n \"windSpeed\": 3.6,\r\n \"detailedDescription\": \"Mostly sunny. High temperature around 26C. Dew point will be around -8C with an average humidity of 18%. Winds will be 4 kph from the WSW.\",\r\n \"forecastDateLocalStr\": \"2014-04-21T07:00:00\",\r\n \"forecastDateUtcStr\": \"2014-04-20T23:00:00Z\",\r\n \"isNightTimePeriod\": false\r\n },\r\n {\r\n \"cloudCoverPercent\": 87,\r\n \"dewPoint\": -9.0,\r\n \"iconCode\": 73,\r\n \"precipCode\": 1,\r\n \"precipProbability\": 0,\r\n \"relativeHumidity\": 15,\r\n \"summaryDescription\": \"Mostly Cloudy\",\r\n \"temperature\": 11.1,\r\n \"thunderstormProbability\": 0,\r\n \"windDirectionDegrees\": 72,\r\n \"windSpeed\": 3.6,\r\n \"detailedDescription\": \"Mostly cloudy. Low temperature around 11C. Dew point will be around -9C with an average humidity of 15%. Winds will be 4 kph from the ENE.\",\r\n \"forecastDateLocalStr\": \"2014-04-21T19:00:00\",\r\n \"forecastDateUtcStr\": \"2014-04-21T11:00:00Z\",\r\n \"isNightTimePeriod\": true\r\n },\r\n {\r\n \"cloudCoverPercent\": 52,\r\n \"dewPoint\": -10.0,\r\n \"iconCode\": 3,\r\n \"precipCode\": 1,\r\n \"precipProbability\": 0,\r\n \"relativeHumidity\": 14,\r\n \"summaryDescription\": \"Partly Cloudy\",\r\n \"temperature\": 27.2,\r\n \"thunderstormProbability\": 0,\r\n \"windDirectionDegrees\": 223,\r\n \"windSpeed\": 3.6,\r\n \"detailedDescription\": \"Partly cloudy. High temperature around 27C. Dew point will be around -10C with an average humidity of 14%. Winds will be 4 kph from the SW.\",\r\n \"forecastDateLocalStr\": \"2014-04-22T07:00:00\",\r\n \"forecastDateUtcStr\": \"2014-04-21T23:00:00Z\",\r\n \"isNightTimePeriod\": false\r\n },\r\n {\r\n \"cloudCoverPercent\": 36,\r\n \"dewPoint\": -8.0,\r\n \"iconCode\": 2,\r\n \"precipCode\": 1,\r\n \"precipProbability\": 0,\r\n \"relativeHumidity\": 15,\r\n \"summaryDescription\": \"Partly Cloudy\",\r\n \"temperature\": 14.5,\r\n \"thunderstormProbability\": 0,\r\n \"windDirectionDegrees\": 275,\r\n \"windSpeed\": 10.8,\r\n \"detailedDescription\": \"Partly cloudy. Low temperature around 15C. Dew point will be around -8C with an average humidity of 15%. Winds will be 11 kph from the W.\",\r\n \"forecastDateLocalStr\": \"2014-04-22T19:00:00\",\r\n \"forecastDateUtcStr\": \"2014-04-22T11:00:00Z\",\r\n \"isNightTimePeriod\": true\r\n }\r\n ],\r\n \"forecastCreatedUtcStr\": \"2014-04-13T12:01:00.0000000Z\",\r\n \"location\": \"CH13B0005\",\r\n \"locationType\": \"city\"\r\n}"},"http_version":null},"recorded_at":"Sun, 13 Apr 2014 22:12:33 GMT"}],"recorded_with":"VCR 2.9.0"}
@@ -8,18 +8,22 @@ require_relative '../lib/barometer/weather_bug'
8
8
 
9
9
  Dir['./spec/support/**/*.rb'].sort.each {|f| require f}
10
10
 
11
- WEATHERBUG_CODE = Barometer::Support::KeyFileParser.find(:weather_bug, :code) || 'weatherbug'
12
- downcased_weatherbug_code = WEATHERBUG_CODE.to_s
13
- downcased_weatherbug_code[0] = WEATHERBUG_CODE.to_s[0..0].downcase
11
+ WEATHERBUG_CLIENT_ID = Barometer::Support::KeyFileParser.find(:weather_bug, :client_id) || 'weatherbug_id'
12
+ WEATHERBUG_CLIENT_SECRET = Barometer::Support::KeyFileParser.find(:weather_bug, :client_secret) || 'weatherbug_secret'
14
13
 
15
14
  VCR.configure do |config|
16
15
  config.cassette_library_dir = 'spec/cassettes'
17
16
  config.hook_into :webmock
18
17
  config.default_cassette_options = { record: :none, serialize_with: :json }
19
18
 
20
- config.filter_sensitive_data('WEATHERBUG_CODE') { WEATHERBUG_CODE.to_s }
21
- # weather bug uses api as host name. this is downcased when the request it made
22
- config.filter_sensitive_data('WEATHERBUG_CODE') { downcased_weatherbug_code }
19
+ config.filter_sensitive_data('WEATHERBUG_CLIENT_ID') { WEATHERBUG_CLIENT_ID.to_s }
20
+ config.filter_sensitive_data('WEATHERBUG_CLIENT_SECRET') { WEATHERBUG_CLIENT_SECRET.to_s }
21
+ config.filter_sensitive_data('WEATHERBUG_ACCESS_CODE') do |interaction|
22
+ if !defined?(WEATHERBUG_ACCESS_CODE) && interaction.request.uri =~ /thepulseapi.earthnetworks.com\/oauth20\/token/
23
+ WEATHERBUG_ACCESS_CODE = JSON.parse(interaction.response.body)['OAuth20']['access_token']['token']
24
+ end
25
+ end
26
+ config.filter_sensitive_data('WEATHERBUG_ACCESS_CODE') { defined?(WEATHERBUG_ACCESS_CODE) ? WEATHERBUG_ACCESS_CODE.to_s : 'this_should_not_match' }
23
27
 
24
28
  config.configure_rspec_metadata!
25
29
  end
@@ -3,62 +3,14 @@ require_relative '../spec_helper'
3
3
  module Barometer
4
4
  describe WeatherBug::CurrentResponse do
5
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
- })
6
+ payload = Barometer::Utils::Payload.new(
7
+ 'observationTimeUtcStr' => '2013-05-18T17:46:00'
8
+ )
17
9
  response = WeatherBug::CurrentResponse.new.parse(payload)
18
10
 
19
11
  utc_observed_at = Time.utc(2013,5,18,17,46,0)
20
- utc_stale_at = Time.utc(2013,5,18,18,46,0)
21
12
 
22
13
  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
14
  end
63
15
  end
64
16
  end
@@ -5,16 +5,15 @@ module Barometer
5
5
  let(:current_response) { Barometer::Response.new }
6
6
 
7
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
- })
8
+ payload = Barometer::Utils::Payload.new(
9
+ "dailyForecastPeriods" => [
10
+ "forecastDateUtcStr" => "2014-04-13T23:00:00Z"
11
+ ]
12
+ )
14
13
  response = WeatherBug::ForecastResponse.new(current_response).parse(payload)
15
14
 
16
- utc_starts_at = Time.utc(2013,4,13,7,0,0)
17
- utc_ends_at = Time.utc(2013,4,14,6,59,59)
15
+ utc_starts_at = Time.utc(2014,4,13,23,0,0)
16
+ utc_ends_at = Time.utc(2014,4,14,10,59,59)
18
17
 
19
18
  expect( response.forecast[0].starts_at.utc ).to eq utc_starts_at
20
19
  expect( response.forecast[0].ends_at.utc ).to eq utc_ends_at
@@ -6,21 +6,13 @@ module Barometer
6
6
  let(:converted_query) { double(:converted_query).as_null_object }
7
7
  let(:query) { WeatherBug::Query.new(converted_query) }
8
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
9
  context 'and the query is a :coordinates' do
18
10
  let(:geo) { double(:geo, latitude: '11.22', longitude: '33.44') }
19
11
  before { converted_query.stub(format: :coordinates, geo: geo) }
20
12
 
21
13
  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'
14
+ expect( query.to_param[:locationtype] ).to eq 'latitudelongitude'
15
+ expect( query.to_param[:location] ).to eq '11.22,33.44'
24
16
  end
25
17
  end
26
18
 
@@ -28,7 +20,7 @@ module Barometer
28
20
  before { converted_query.stub(metric?: true) }
29
21
 
30
22
  it 'includes the correct parameters' do
31
- expect( query.to_param[:UnitType] ).to eq '1'
23
+ expect( query.to_param[:units] ).to eq 'metric'
32
24
  end
33
25
  end
34
26
 
@@ -36,7 +28,7 @@ module Barometer
36
28
  before { converted_query.stub(metric?: false) }
37
29
 
38
30
  it 'includes the correct parameters' do
39
- expect( query.to_param[:UnitType] ).to eq '0'
31
+ expect( query.to_param[:units] ).to eq 'english'
40
32
  end
41
33
  end
42
34
  end
@@ -2,7 +2,7 @@ require_relative 'spec_helper'
2
2
 
3
3
  module Barometer
4
4
  describe WeatherBug, vcr: {
5
- cassette_name: 'WeatherService::WeatherBug'
5
+ cassette_name: 'WeatherBug'
6
6
  } do
7
7
 
8
8
  it 'auto-registers this weather service as :weather_bug' do
@@ -10,9 +10,9 @@ module Barometer
10
10
  end
11
11
 
12
12
  describe '.call' do
13
- context 'when no keys are provided' do
14
- let(:query) { build_query }
13
+ let(:query) { build_query }
15
14
 
15
+ context 'when no keys are provided' do
16
16
  it 'raises an error' do
17
17
  expect {
18
18
  WeatherBug.call(query)
@@ -21,58 +21,63 @@ module Barometer
21
21
  end
22
22
 
23
23
  context 'when keys are provided' do
24
- let(:converted_query) { 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}} }
24
+ let(:config) do
25
+ {
26
+ keys: {
27
+ client_id: WEATHERBUG_CLIENT_ID,
28
+ client_secret: WEATHERBUG_CLIENT_SECRET
29
+ }
30
+ }
31
+ end
32
+ let(:converted_query) do
33
+ ConvertedQuery.new('39.1,77.1', :coordinates, :metric)
34
+ end
27
35
 
28
36
  subject { WeatherBug.call(query, config) }
29
37
 
38
+ before do
39
+ allow(query).to receive(:convert!).with(:coordinates).
40
+ and_return(converted_query)
41
+ end
42
+
30
43
  it 'converts the query to accepted formats' do
31
- subject
32
- expect( query ).to have_received(:convert!).with(:short_zipcode, :coordinates).at_least(:once)
44
+ WeatherBug.call(query, config)
45
+
46
+ expect(query).to have_received(:convert!).with(:coordinates).at_least(:once)
33
47
  end
34
48
 
35
49
  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)
50
+ result = WeatherBug.call(query, config)
51
+
52
+ expect(result.query).to eq '39.1,77.1'
53
+ expect(result.format).to eq :coordinates
54
+ expect(result).to be_metric
55
+
56
+ expect(result).to have_data(:current, :observed_at).as_format(:time)
57
+
58
+ expect(result).to have_data(:current, :humidity).as_format(:float)
59
+ expect(result).to have_data(:current, :icon).as_format(:number)
60
+ expect(result).to have_data(:current, :temperature).as_format(:temperature)
61
+ expect(result).to have_data(:current, :dew_point).as_format(:temperature)
62
+ expect(result).to have_data(:current, :wind).as_format(:vector)
63
+
64
+ expect( subject.forecast.size ).to eq 18
65
+
66
+ day_forcast = subject.forecast.find{ |p| !p.high.nil? }
67
+ expect(day_forcast).to have_data(:high).as_format(:temperature)
68
+ expect(day_forcast).to have_data(:starts_at).as_format(:time)
69
+ expect(day_forcast).to have_data(:ends_at).as_format(:time)
70
+ expect(day_forcast).to have_data(:condition).as_format(:string)
71
+ expect(day_forcast).to have_data(:icon).as_format(:number)
72
+ expect(day_forcast).to have_data(:pop).as_format(:float)
73
+
74
+ night_forcast = subject.forecast.find{ |p| !p.low.nil? }
75
+ expect(night_forcast).to have_data(:low).as_format(:temperature)
76
+ expect(night_forcast).to have_data(:starts_at).as_format(:time)
77
+ expect(night_forcast).to have_data(:ends_at).as_format(:time)
78
+ expect(night_forcast).to have_data(:condition).as_format(:string)
79
+ expect(night_forcast).to have_data(:icon).as_format(:number)
80
+ expect(night_forcast).to have_data(:pop).as_format(:float)
76
81
  end
77
82
  end
78
83
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: barometer-weather_bug
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mark Gangl
@@ -58,16 +58,13 @@ files:
58
58
  - lib/barometer/weather_bug/current_response.rb
59
59
  - lib/barometer/weather_bug/forecast_api.rb
60
60
  - lib/barometer/weather_bug/forecast_response.rb
61
+ - lib/barometer/weather_bug/oauth_api.rb
62
+ - lib/barometer/weather_bug/oauth_token.rb
61
63
  - lib/barometer/weather_bug/query.rb
62
64
  - lib/barometer/weather_bug/response/current_weather.rb
63
65
  - lib/barometer/weather_bug/response/forecasted_weather.rb
64
- - lib/barometer/weather_bug/response/location.rb
65
- - lib/barometer/weather_bug/response/station.rb
66
- - lib/barometer/weather_bug/response/sun.rb
67
- - lib/barometer/weather_bug/response/time_helper.rb
68
- - lib/barometer/weather_bug/response/timezone.rb
69
66
  - lib/barometer/weather_bug/version.rb
70
- - spec/cassettes/WeatherService_WeatherBug.json
67
+ - spec/cassettes/WeatherBug.json
71
68
  - spec/spec_helper.rb
72
69
  - spec/weather_bug/current_response_spec.rb
73
70
  - spec/weather_bug/forecast_response_spec.rb
@@ -98,7 +95,7 @@ signing_key:
98
95
  specification_version: 4
99
96
  summary: A barometer adapter for WeatherBug
100
97
  test_files:
101
- - spec/cassettes/WeatherService_WeatherBug.json
98
+ - spec/cassettes/WeatherBug.json
102
99
  - spec/spec_helper.rb
103
100
  - spec/weather_bug/current_response_spec.rb
104
101
  - spec/weather_bug/forecast_response_spec.rb
@@ -1,21 +0,0 @@
1
- module Barometer
2
- class WeatherBug
3
- class Response
4
- class Location < WeatherService::Response::Location
5
- private
6
-
7
- def city
8
- payload.fetch('location', 'city')
9
- end
10
-
11
- def state_code
12
- payload.fetch('location', 'state')
13
- end
14
-
15
- def zip_code
16
- payload.fetch('location', 'zip')
17
- end
18
- end
19
- end
20
- end
21
- end
@@ -1,41 +0,0 @@
1
- module Barometer
2
- class WeatherBug
3
- class Response
4
- class Station < WeatherService::Response::Location
5
- private
6
-
7
- def id
8
- payload.fetch('station_id')
9
- end
10
-
11
- def name
12
- payload.fetch('station')
13
- end
14
-
15
- def city
16
- payload.using(/^([\w ]*?),/).fetch('city_state')
17
- end
18
-
19
- def state_code
20
- payload.using(/^[\w ^,]*?,([\w ^,]*)/).fetch('city_state')
21
- end
22
-
23
- def country
24
- payload.fetch('country')
25
- end
26
-
27
- def zip_code
28
- payload.fetch('city_state', '@zipcode')
29
- end
30
-
31
- def latitude
32
- payload.fetch('latitude')
33
- end
34
-
35
- def longitude
36
- payload.fetch('longitude')
37
- end
38
- end
39
- end
40
- end
41
- end
@@ -1,30 +0,0 @@
1
- require_relative 'time_helper'
2
-
3
- module Barometer
4
- class WeatherBug
5
- class Response
6
- class Sun
7
- def initialize(payload, timezone)
8
- @payload = payload
9
- @timezone = timezone
10
- end
11
-
12
- def parse
13
- Data::Sun.new(rise: local_sunrise_time, set: local_sunset_time)
14
- end
15
-
16
- private
17
-
18
- attr_reader :payload, :timezone
19
-
20
- def local_sunrise_time
21
- TimeHelper.new(payload, timezone).parse('sunrise')
22
- end
23
-
24
- def local_sunset_time
25
- TimeHelper.new(payload, timezone).parse('sunset')
26
- end
27
- end
28
- end
29
- end
30
- end
@@ -1,50 +0,0 @@
1
- module Barometer
2
- class WeatherBug
3
- class Response
4
- class TimeHelper
5
- def initialize(payload, timezone)
6
- @payload = payload
7
- @timezone = timezone
8
- end
9
-
10
- def parse(key)
11
- return unless local_time(key)
12
- timezone.local_to_utc(local_time(key))
13
- end
14
-
15
- private
16
-
17
- attr_reader :payload, :timezone, :key
18
-
19
- def local_time(key)
20
- @key = key
21
- @local_time ||= Utils::Time.parse(year, month, day, hour, minute, second)
22
- end
23
-
24
- def year
25
- payload.fetch(key, 'year', '@number')
26
- end
27
-
28
- def month
29
- payload.fetch(key, 'month', '@number')
30
- end
31
-
32
- def day
33
- payload.fetch(key, 'day', '@number')
34
- end
35
-
36
- def hour
37
- payload.fetch(key, 'hour', '@hour_24')
38
- end
39
-
40
- def minute
41
- payload.fetch(key, 'minute', '@number')
42
- end
43
-
44
- def second
45
- payload.fetch(key, 'second', '@number')
46
- end
47
- end
48
- end
49
- end
50
- end
@@ -1,13 +0,0 @@
1
- module Barometer
2
- class WeatherBug
3
- class Response
4
- class TimeZone < WeatherService::Response::TimeZone
5
- private
6
-
7
- def time_zone
8
- payload.fetch('ob_date', 'time_zone', '@abbrv')
9
- end
10
- end
11
- end
12
- end
13
- 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"}