diff --git a/Gemfile.lock b/Gemfile.lock index 8f79859..4084c6c 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -13,7 +13,7 @@ GEM rspec-expectations (2.13.0) diff-lcs (>= 1.1.3, < 2.0) rspec-mocks (2.13.0) - safe_yaml (1.0.3) + safe_yaml (1.0.4) vcr (2.9.2) webmock (1.18.0) addressable (>= 2.3.6) diff --git a/lib/open_weather/base.rb b/lib/open_weather/base.rb index 364a8b1..6a1de6a 100644 --- a/lib/open_weather/base.rb +++ b/lib/open_weather/base.rb @@ -7,14 +7,26 @@ class Base attr_reader :url, :options, :weather_info, :status, :message def initialize(url, options) - @status = false - @url = url - @options = extract_options!(options) + @status = false + @url = url + @options = extract_options!(options) + @weather_info = { 'cod': nil, 'message': '' } end def retrive response = send_request unless @options.empty? - parse_response(response) + + if ![200, 404].include?(response.code.to_i) + @weather_info['cod'] = response.code.to_i + @weather_info['message'] = response.message + else + parse_response(response.body) + end + + @status = @weather_info['cod'] + @message = @weather_info['message'] + + @weather_info end def success? @@ -40,16 +52,21 @@ def extract_options!(options) def parse_response(response) return if response.nil? - @weather_info = JSON.parse(response) - @status = @weather_info['cod'] - @message = @weather_info['message'] unless @status + + begin + @weather_info = JSON.parse(response) + rescue JSON::ParserError + @weather_info['cod'] = 500 + @weather_info['message'] = 'JSON parse error' + end + @weather_info end def send_request uri = URI(@url) uri.query = URI.encode_www_form(options) - Net::HTTP.get(uri) + Net::HTTP.get_response(uri) end end end diff --git a/spec/fixtures/cassettes/api/forecast_json_parse_error.yml b/spec/fixtures/cassettes/api/forecast_json_parse_error.yml new file mode 100644 index 0000000..4c016ea --- /dev/null +++ b/spec/fixtures/cassettes/api/forecast_json_parse_error.yml @@ -0,0 +1,46 @@ +--- +http_interactions: +- request: + method: get + uri: http://api.openweathermap.org/data/2.5/forecast?q=,Cochin,%20In + body: + encoding: US-ASCII + string: '' + headers: + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + User-Agent: + - Ruby + Host: + - api.openweathermap.org + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Sun, 31 May 2015 11:38:18 GMT + Content-Type: + - application/json; charset=utf-8 + Transfer-Encoding: + - chunked + Connection: + - keep-alive + X-Source: + - back + Access-Control-Allow-Origin: + - "*" + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET, POST + body: + encoding: UTF-8 + string: "500" + http_version: + recorded_at: Sun, 31 May 2015 11:38:18 GMT +recorded_with: VCR 2.9.2 diff --git a/spec/fixtures/cassettes/api/forecast_server_error.yml b/spec/fixtures/cassettes/api/forecast_server_error.yml new file mode 100644 index 0000000..95145af --- /dev/null +++ b/spec/fixtures/cassettes/api/forecast_server_error.yml @@ -0,0 +1,47 @@ +--- +http_interactions: +- request: + method: get + uri: http://api.openweathermap.org/data/2.5/forecast?q=,Cochin,%20In + body: + encoding: US-ASCII + string: '' + headers: + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + User-Agent: + - Ruby + Host: + - api.openweathermap.org + response: + status: + code: 500 + message: Internal Server Error + headers: + Server: + - nginx + Date: + - Sun, 31 May 2015 11:50:07 GMT + Content-Type: + - application/json; charset=utf-8 + Transfer-Encoding: + - chunked + Connection: + - keep-alive + X-Source: + - redis + Access-Control-Allow-Origin: + - "*" + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET, POST + body: + encoding: UTF-8 + string: | + {"cod":"200","message":0.0321,"city":{"id":"1273874","name":"Kochi","coord":{"lon":76.2615,"lat":9.93606},"country":"India","population":0},"cnt":37,"list":[{"dt":1433062800,"main":{"temp":296.85,"temp_min":296.85,"temp_max":298.934,"pressure":1015.57,"sea_level":1020.85,"grnd_level":1015.57,"humidity":100,"temp_kf":-2.09},"weather":[{"id":500,"main":"Rain","description":"light rain","icon":"10d"}],"clouds":{"all":92},"wind":{"speed":1.51,"deg":165.503},"rain":{"3h":2.075},"sys":{"pod":"d"},"dt_txt":"2015-05-31 09:00:00"},{"dt":1433073600,"main":{"temp":295.18,"temp_min":295.18,"temp_max":296.848,"pressure":1014.83,"sea_level":1020.15,"grnd_level":1014.83,"humidity":100,"temp_kf":-1.67},"weather":[{"id":501,"main":"Rain","description":"moderate rain","icon":"10d"}],"clouds":{"all":92},"wind":{"speed":1.51,"deg":163.001},"rain":{"3h":10.74},"sys":{"pod":"d"},"dt_txt":"2015-05-31 12:00:00"},{"dt":1433084400,"main":{"temp":295.74,"temp_min":295.74,"temp_max":296.996,"pressure":1016.28,"sea_level":1021.72,"grnd_level":1016.28,"humidity":100,"temp_kf":-1.25},"weather":[{"id":501,"main":"Rain","description":"moderate rain","icon":"10n"}],"clouds":{"all":92},"wind":{"speed":2.41,"deg":108.502},"rain":{"3h":3.34},"sys":{"pod":"n"},"dt_txt":"2015-05-31 15:00:00"},{"dt":1433095200,"main":{"temp":296.27,"temp_min":296.27,"temp_max":297.103,"pressure":1016.68,"sea_level":1022.14,"grnd_level":1016.68,"humidity":100,"temp_kf":-0.83},"weather":[{"id":500,"main":"Rain","description":"light rain","icon":"10n"}],"clouds":{"all":88},"wind":{"speed":1.76,"deg":116.501},"rain":{"3h":2.28},"sys":{"pod":"n"},"dt_txt":"2015-05-31 18:00:00"},{"dt":1433106000,"main":{"temp":296.49,"temp_min":296.49,"temp_max":296.912,"pressure":1014.92,"sea_level":1020.49,"grnd_level":1014.92,"humidity":100,"temp_kf":-0.42},"weather":[{"id":501,"main":"Rain","description":"moderate rain","icon":"10n"}],"clouds":{"all":92},"wind":{"speed":1.42,"deg":132.003},"rain":{"3h":3.885},"sys":{"pod":"n"},"dt_txt":"2015-05-31 21:00:00"},{"dt":1433116800,"main":{"temp":296.309,"temp_min":296.309,"temp_max":296.309,"pressure":1014.97,"sea_level":1020.43,"grnd_level":1014.97,"humidity":100},"weather":[{"id":500,"main":"Rain","description":"light rain","icon":"10n"}],"clouds":{"all":92},"wind":{"speed":1.96,"deg":132.502},"rain":{"3h":2.99},"sys":{"pod":"n"},"dt_txt":"2015-06-01 00:00:00"},{"dt":1433127600,"main":{"temp":296.972,"temp_min":296.972,"temp_max":296.972,"pressure":1016.8,"sea_level":1022.34,"grnd_level":1016.8,"humidity":100},"weather":[{"id":500,"main":"Rain","description":"light rain","icon":"10d"}],"clouds":{"all":92},"wind":{"speed":2.16,"deg":124},"rain":{"3h":0.83},"sys":{"pod":"d"},"dt_txt":"2015-06-01 03:00:00"},{"dt":1433138400,"main":{"temp":299.151,"temp_min":299.151,"temp_max":299.151,"pressure":1016.73,"sea_level":1022,"grnd_level":1016.73,"humidity":100},"weather":[{"id":500,"main":"Rain","description":"light rain","icon":"10d"}],"clouds":{"all":80},"wind":{"speed":2.42,"deg":133.001},"rain":{"3h":0.14},"sys":{"pod":"d"},"dt_txt":"2015-06-01 06:00:00"},{"dt":1433149200,"main":{"temp":301.601,"temp_min":301.601,"temp_max":301.601,"pressure":1015.12,"sea_level":1020.54,"grnd_level":1015.12,"humidity":99},"weather":[{"id":500,"main":"Rain","description":"light rain","icon":"10d"}],"clouds":{"all":92},"wind":{"speed":2.31,"deg":193.501},"rain":{"3h":0.010000000000005},"sys":{"pod":"d"},"dt_txt":"2015-06-01 09:00:00"},{"dt":1433160000,"main":{"temp":298.076,"temp_min":298.076,"temp_max":298.076,"pressure":1015.34,"sea_level":1020.66,"grnd_level":1015.34,"humidity":100},"weather":[{"id":501,"main":"Rain","description":"moderate rain","icon":"10d"}],"clouds":{"all":88},"wind":{"speed":1.87,"deg":203.506},"rain":{"3h":10.82},"sys":{"pod":"d"},"dt_txt":"2015-06-01 12:00:00"},{"dt":1433170800,"main":{"temp":297.092,"temp_min":297.092,"temp_max":297.092,"pressure":1017.18,"sea_level":1022.54,"grnd_level":1017.18,"humidity":100},"weather":[{"id":501,"main":"Rain","description":"moderate rain","icon":"10n"}],"clouds":{"all":92},"wind":{"speed":1.86,"deg":127.507},"rain":{"3h":3.6},"sys":{"pod":"n"},"dt_txt":"2015-06-01 15:00:00"},{"dt":1433181600,"main":{"temp":297.46,"temp_min":297.46,"temp_max":297.46,"pressure":1017.59,"sea_level":1023.16,"grnd_level":1017.59,"humidity":100},"weather":[{"id":500,"main":"Rain","description":"light rain","icon":"10n"}],"clouds":{"all":88},"wind":{"speed":1.4,"deg":116.502},"rain":{"3h":0.62},"sys":{"pod":"n"},"dt_txt":"2015-06-01 18:00:00"},{"dt":1433192400,"main":{"temp":297.239,"temp_min":297.239,"temp_max":297.239,"pressure":1016.09,"sea_level":1021.47,"grnd_level":1016.09,"humidity":100},"weather":[{"id":500,"main":"Rain","description":"light rain","icon":"10n"}],"clouds":{"all":88},"wind":{"speed":1.21,"deg":99.5039},"rain":{"3h":2.15},"sys":{"pod":"n"},"dt_txt":"2015-06-01 21:00:00"},{"dt":1433203200,"main":{"temp":297.689,"temp_min":297.689,"temp_max":297.689,"pressure":1015.45,"sea_level":1020.9,"grnd_level":1015.45,"humidity":100},"weather":[{"id":500,"main":"Rain","description":"light rain","icon":"10n"}],"clouds":{"all":88},"wind":{"speed":1.18,"deg":85},"rain":{"3h":0.080000000000013},"sys":{"pod":"n"},"dt_txt":"2015-06-02 00:00:00"},{"dt":1433214000,"main":{"temp":299.37,"temp_min":299.37,"temp_max":299.37,"pressure":1016.72,"sea_level":1022.24,"grnd_level":1016.72,"humidity":100},"weather":[{"id":500,"main":"Rain","description":"light rain","icon":"10d"}],"clouds":{"all":80},"wind":{"speed":1.52,"deg":108},"rain":{"3h":0.0099999999999909},"sys":{"pod":"d"},"dt_txt":"2015-06-02 03:00:00"},{"dt":1433224800,"main":{"temp":301.417,"temp_min":301.417,"temp_max":301.417,"pressure":1016.58,"sea_level":1022,"grnd_level":1016.58,"humidity":100},"weather":[{"id":500,"main":"Rain","description":"light rain","icon":"10d"}],"clouds":{"all":88},"wind":{"speed":1.97,"deg":229.502},"rain":{"3h":0.010000000000005},"sys":{"pod":"d"},"dt_txt":"2015-06-02 06:00:00"},{"dt":1433235600,"main":{"temp":302.35,"temp_min":302.35,"temp_max":302.35,"pressure":1014.62,"sea_level":1020.14,"grnd_level":1014.62,"humidity":94},"weather":[{"id":803,"main":"Clouds","description":"broken clouds","icon":"04d"}],"clouds":{"all":64},"wind":{"speed":2.86,"deg":247.5},"rain":{"3h":0},"sys":{"pod":"d"},"dt_txt":"2015-06-02 09:00:00"},{"dt":1433246400,"main":{"temp":301.616,"temp_min":301.616,"temp_max":301.616,"pressure":1014.3,"sea_level":1019.8,"grnd_level":1014.3,"humidity":92},"weather":[{"id":803,"main":"Clouds","description":"broken clouds","icon":"04d"}],"clouds":{"all":68},"wind":{"speed":3.36,"deg":261.001},"rain":{"3h":0},"sys":{"pod":"d"},"dt_txt":"2015-06-02 12:00:00"},{"dt":1433257200,"main":{"temp":300.449,"temp_min":300.449,"temp_max":300.449,"pressure":1015.8,"sea_level":1021.4,"grnd_level":1015.8,"humidity":97},"weather":[{"id":802,"main":"Clouds","description":"scattered clouds","icon":"03n"}],"clouds":{"all":48},"wind":{"speed":2.21,"deg":270.5},"rain":{"3h":0},"sys":{"pod":"n"},"dt_txt":"2015-06-02 15:00:00"},{"dt":1433268000,"main":{"temp":299.586,"temp_min":299.586,"temp_max":299.586,"pressure":1016.81,"sea_level":1022.27,"grnd_level":1016.81,"humidity":100},"weather":[{"id":500,"main":"Rain","description":"light rain","icon":"10n"}],"clouds":{"all":76},"wind":{"speed":1.21,"deg":334.501},"rain":{"3h":0.83},"sys":{"pod":"n"},"dt_txt":"2015-06-02 18:00:00"},{"dt":1433278800,"main":{"temp":299.032,"temp_min":299.032,"temp_max":299.032,"pressure":1015.22,"sea_level":1020.76,"grnd_level":1015.22,"humidity":100},"weather":[{"id":500,"main":"Rain","description":"light rain","icon":"10n"}],"clouds":{"all":64},"wind":{"speed":0.92,"deg":57.5003},"rain":{"3h":1.76},"sys":{"pod":"n"},"dt_txt":"2015-06-02 21:00:00"},{"dt":1433289600,"main":{"temp":298.733,"temp_min":298.733,"temp_max":298.733,"pressure":1015.04,"sea_level":1020.44,"grnd_level":1015.04,"humidity":100},"weather":[{"id":500,"main":"Rain","description":"light rain","icon":"10n"}],"clouds":{"all":68},"wind":{"speed":0.93,"deg":220.503},"rain":{"3h":0.11999999999999},"sys":{"pod":"n"},"dt_txt":"2015-06-03 00:00:00"},{"dt":1433300400,"main":{"temp":300.464,"temp_min":300.464,"temp_max":300.464,"pressure":1016.28,"sea_level":1021.59,"grnd_level":1016.28,"humidity":100},"weather":[{"id":803,"main":"Clouds","description":"broken clouds","icon":"04d"}],"clouds":{"all":76},"wind":{"speed":1.22,"deg":183.001},"rain":{"3h":0},"sys":{"pod":"d"},"dt_txt":"2015-06-03 03:00:00"},{"dt":1433311200,"main":{"temp":302.266,"temp_min":302.266,"temp_max":302.266,"pressure":1015.83,"sea_level":1021.45,"grnd_level":1015.83,"humidity":95},"weather":[{"id":804,"main":"Clouds","description":"overcast clouds","icon":"04d"}],"clouds":{"all":88},"wind":{"speed":2.16,"deg":253.001},"rain":{"3h":0},"sys":{"pod":"d"},"dt_txt":"2015-06-03 06:00:00"},{"dt":1433322000,"main":{"temp":302.308,"temp_min":302.308,"temp_max":302.308,"pressure":1014.27,"sea_level":1019.64,"grnd_level":1014.27,"humidity":93},"weather":[{"id":500,"main":"Rain","description":"light rain","icon":"10d"}],"clouds":{"all":88},"wind":{"speed":3.18,"deg":266.003},"rain":{"3h":0.02000000000001},"sys":{"pod":"d"},"dt_txt":"2015-06-03 09:00:00"},{"dt":1433332800,"main":{"temp":301.998,"temp_min":301.998,"temp_max":301.998,"pressure":1013.55,"sea_level":1018.96,"grnd_level":1013.55,"humidity":90},"weather":[{"id":803,"main":"Clouds","description":"broken clouds","icon":"04d"}],"clouds":{"all":64},"wind":{"speed":2.87,"deg":264.504},"rain":{"3h":0},"sys":{"pod":"d"},"dt_txt":"2015-06-03 12:00:00"},{"dt":1433343600,"main":{"temp":301.266,"temp_min":301.266,"temp_max":301.266,"pressure":1015.04,"sea_level":1020.69,"grnd_level":1015.04,"humidity":93},"weather":[{"id":804,"main":"Clouds","description":"overcast clouds","icon":"04n"}],"clouds":{"all":92},"wind":{"speed":1.95,"deg":265.5},"rain":{"3h":0},"sys":{"pod":"n"},"dt_txt":"2015-06-03 15:00:00"},{"dt":1433354400,"main":{"temp":300.402,"temp_min":300.402,"temp_max":300.402,"pressure":1015.91,"sea_level":1021.56,"grnd_level":1015.91,"humidity":98},"weather":[{"id":500,"main":"Rain","description":"light rain","icon":"10n"}],"clouds":{"all":80},"wind":{"speed":1.43,"deg":254.001},"rain":{"3h":1.525},"sys":{"pod":"n"},"dt_txt":"2015-06-03 18:00:00"},{"dt":1433365200,"main":{"temp":299.893,"temp_min":299.893,"temp_max":299.893,"pressure":1014.61,"sea_level":1020.2,"grnd_level":1014.61,"humidity":100},"weather":[{"id":500,"main":"Rain","description":"light rain","icon":"10n"}],"clouds":{"all":92},"wind":{"speed":1.31,"deg":295.504},"rain":{"3h":1.925},"sys":{"pod":"n"},"dt_txt":"2015-06-03 21:00:00"},{"dt":1433376000,"main":{"temp":298.636,"temp_min":298.636,"temp_max":298.636,"pressure":1014.23,"sea_level":1019.74,"grnd_level":1014.23,"humidity":100},"weather":[{"id":500,"main":"Rain","description":"light rain","icon":"10n"}],"clouds":{"all":76},"wind":{"speed":1.62,"deg":0.00268555},"rain":{"3h":1.325},"sys":{"pod":"n"},"dt_txt":"2015-06-04 00:00:00"},{"dt":1433386800,"main":{"temp":300.191,"temp_min":300.191,"temp_max":300.191,"pressure":1015.29,"sea_level":1020.89,"grnd_level":1015.29,"humidity":100},"weather":[{"id":803,"main":"Clouds","description":"broken clouds","icon":"04d"}],"clouds":{"all":68},"wind":{"speed":1.07,"deg":104.009},"rain":{"3h":0},"sys":{"pod":"d"},"dt_txt":"2015-06-04 03:00:00"},{"dt":1433397600,"main":{"temp":302.66,"temp_min":302.66,"temp_max":302.66,"pressure":1015.99,"sea_level":1021.51,"grnd_level":1015.99,"humidity":95},"weather":[{"id":803,"main":"Clouds","description":"broken clouds","icon":"04d"}],"clouds":{"all":56},"wind":{"speed":1.68,"deg":267},"rain":{"3h":0},"sys":{"pod":"d"},"dt_txt":"2015-06-04 06:00:00"},{"dt":1433408400,"main":{"temp":301.491,"temp_min":301.491,"temp_max":301.491,"pressure":1014.37,"sea_level":1019.8,"grnd_level":1014.37,"humidity":100},"weather":[{"id":500,"main":"Rain","description":"light rain","icon":"10d"}],"clouds":{"all":24},"wind":{"speed":2.21,"deg":237.501},"rain":{"3h":2.725},"sys":{"pod":"d"},"dt_txt":"2015-06-04 09:00:00"},{"dt":1433419200,"main":{"temp":300.839,"temp_min":300.839,"temp_max":300.839,"pressure":1013.77,"sea_level":1019.16,"grnd_level":1013.77,"humidity":97},"weather":[{"id":500,"main":"Rain","description":"light rain","icon":"10d"}],"clouds":{"all":92},"wind":{"speed":3.02,"deg":242.003},"rain":{"3h":0.8},"sys":{"pod":"d"},"dt_txt":"2015-06-04 12:00:00"},{"dt":1433430000,"main":{"temp":300.024,"temp_min":300.024,"temp_max":300.024,"pressure":1015.3,"sea_level":1020.73,"grnd_level":1015.3,"humidity":99},"weather":[{"id":500,"main":"Rain","description":"light rain","icon":"10n"}],"clouds":{"all":88},"wind":{"speed":1.21,"deg":282.505},"rain":{"3h":0.8},"sys":{"pod":"n"},"dt_txt":"2015-06-04 15:00:00"},{"dt":1433440800,"main":{"temp":299.236,"temp_min":299.236,"temp_max":299.236,"pressure":1015.97,"sea_level":1021.53,"grnd_level":1015.97,"humidity":100},"weather":[{"id":500,"main":"Rain","description":"light rain","icon":"10n"}],"clouds":{"all":68},"wind":{"speed":1.55,"deg":355.002},"rain":{"3h":1.55},"sys":{"pod":"n"},"dt_txt":"2015-06-04 18:00:00"},{"dt":1433451600,"main":{"temp":299.128,"temp_min":299.128,"temp_max":299.128,"pressure":1014.06,"sea_level":1019.66,"grnd_level":1014.06,"humidity":100},"weather":[{"id":803,"main":"Clouds","description":"broken clouds","icon":"04n"}],"clouds":{"all":80},"wind":{"speed":0.52,"deg":146.505},"rain":{"3h":0},"sys":{"pod":"n"},"dt_txt":"2015-06-04 21:00:00"}]} + http_version: + recorded_at: Sun, 31 May 2015 11:50:07 GMT +recorded_with: VCR 2.9.2 diff --git a/spec/open_weather/api_spec.rb b/spec/open_weather/api_spec.rb index d26be8a..28884a3 100644 --- a/spec/open_weather/api_spec.rb +++ b/spec/open_weather/api_spec.rb @@ -80,6 +80,20 @@ end response['cod'].to_s.should eq('404') end + + it 'returns error if json parse error' do + response = VCR.use_cassette('api/forecast_json_parse_error') do + OpenWeather::Forecast.city('Cochin, In') + end + response['cod'].to_s.should eq('500') + end + + it 'returns error if server return 500' do + response = VCR.use_cassette('api/forecast_server_error') do + OpenWeather::Forecast.city('Cochin, In') + end + response['cod'].to_s.should eq('500') + end end context '.city_id' do diff --git a/spec/open_weather/version_spec.rb b/spec/open_weather/version_spec.rb index ffd1d9c..71a049f 100644 --- a/spec/open_weather/version_spec.rb +++ b/spec/open_weather/version_spec.rb @@ -1,5 +1,5 @@ describe 'Version' do - it 'should be version 0.10.0' do - OpenWeather::VERSION.should == '0.10.0' + it 'should be version 0.11.0' do + OpenWeather::VERSION.should == '0.11.0' end end