open-weather-api 0.0.4 → 0.0.5

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: 82b4f646f8ec4c9b78170ef8ae612323828e46a4
4
- data.tar.gz: 63205323ef368b5682d0222c1827bb7d308e3422
3
+ metadata.gz: dcd2a1c29774ef26c4a0b443e44f2649485a8f51
4
+ data.tar.gz: f8b4a8fc6668ee26393366a6df94bd4dd339b1d8
5
5
  SHA512:
6
- metadata.gz: 1c7cfb721767d05e059e40282982579f637829e7d78607b577a630f28889fd91551ba89933f52b9cf49b824354807f43a9681f56ee2eb9c4e17066610a941e5f
7
- data.tar.gz: fa98ab5bd8d849332a1e0b6f3c0b831fdb52ac5ee5b8f6118624ff10567026d0c52e3503293d80124e0b7023882ebdc705456a8aa31bbbacdcea26b8b4e5b972
6
+ metadata.gz: 4eb042521d7463a6e7d095a2f05065d451ad794b8ed2f8a0b3c553a61d1cf19d4786cb12a042a5e9d5072e66d9cd95b7a1e8ced2ff5ecfa9424972614f9a8047
7
+ data.tar.gz: 63dda9940489f441c7ecff1d980712bbc80cd5430082969ff6e6ce789d87395efca167f9e4357bc3e6e9aea42ecc9b1009ac6b45f00acb7074f53c8c4bbfc7c2
data/README.md CHANGED
@@ -49,7 +49,7 @@ Outside of the configuration file, you can access the `api` object as follows:
49
49
  Rails.configuration.open_weather_api
50
50
  ````
51
51
 
52
- ### Other
52
+ ### Generic
53
53
 
54
54
  ```ruby
55
55
  open_weather_api = OpenWeatherAPI::API.new api_key: "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", default_language: 'es', default_units: 'metric', default_country_code: 'es'
@@ -60,8 +60,6 @@ open_weather_api = OpenWeatherAPI::API.new api_key: "xxxxxxxxxxxxxxxxxxxxxxxxxxx
60
60
 
61
61
  Finally, you can use the different resources of the API:
62
62
 
63
- **NOTE**: You can add manually any parameter you need for each request, and they will override the computed parameters.
64
-
65
63
  ### Current Weather
66
64
 
67
65
  By city name:
@@ -106,19 +104,31 @@ By a geolocated circle (**WARNING**: Unexpected behaviour by API):
106
104
  json = open_weather_api.current circle: { lat: -16.3319, lon: 28.5046 }, cities_count: 2
107
105
  ````
108
106
 
109
- You can also use ruby blocks to handle the response:
107
+ For more information about the API, visit [http://openweathermap.org/current](http://openweathermap.org/current).
108
+
109
+ ### Forecast
110
+
111
+ #### Hourly (actually, every 3 hours, up to 5 days)
112
+
113
+ By city name:
110
114
 
111
115
  ````ruby
112
- json = open_weather_api.current city: 'Santa Cruz de Tenerife', country_code: 'es' do |json|
113
- puts JSON.pretty_generate(json)
114
- end
116
+ json = open_weather_api.forecast :hourly, city: 'Santa Cruz de Tenerife', country_code: 'es'
115
117
  ````
116
118
 
117
- For more information about the API, visit [http://openweathermap.org/current](http://openweathermap.org/current).
119
+ By city id:
118
120
 
119
- ### Forecast
121
+ ````ruby
122
+ json = open_weather_api.forecast :hourly, id: 6360638
123
+ ````
120
124
 
121
- TODO.
125
+ By geolocation:
126
+
127
+ ````ruby
128
+ json = open_weather_api.forecast :hourly, lon: -16.20302, lat: 28.53924
129
+ ````
130
+
131
+ For more information about the API, visit [http://openweathermap.org/forecast5](http://openweathermap.org/forecast5).
122
132
 
123
133
  ### Other
124
134
 
@@ -130,6 +140,28 @@ open_weather_api.current city: 'Santa Cruz de Tenerife', country_code: 'es' do |
130
140
  end
131
141
  ````
132
142
 
143
+ You can add manually any parameter you need for each request, and they will override the computed parameters:
144
+
145
+ ````ruby
146
+ open_weather_api.current city: 'Balashikha', country_code: "ru", lang: "ru"
147
+ ````
148
+
149
+ Also, you can define the response format with the `:mode` parameters. Valid formats are `:json` (returns a `Hash`), `:xml` and `:html` (both return a `String`):
150
+
151
+ ````ruby
152
+ open_weather_api.current city: 'Santa Cruz de Tenerife', mode: :xml do |xml_str|
153
+ puts "XML data: #{xml_str}"
154
+ end
155
+ ````
156
+
157
+ You can use ruby blocks to handle the response:
158
+
159
+ ````ruby
160
+ open_weather_api.current city: 'Santa Cruz de Tenerife', country_code: 'es', mode: :json do |json|
161
+ puts JSON.pretty_generate(json)
162
+ end
163
+ ````
164
+
133
165
  ## Authors ##
134
166
 
135
167
  This project has been developed by:
@@ -142,6 +174,7 @@ This project has been developed by:
142
174
 
143
175
  1. Fork it ( [https://gitlab.com/wikiti-random-stuff/open-weather-api/fork/new](https://gitlab.com/wikiti-random-stuff/open-weather-api/fork/new) )
144
176
  2. Create your feature branch (`git checkout -b my-new-feature`)
145
- 3. Commit your changes (`git commit -am 'Add some feature'`)
146
- 4. Push to the branch (`git push origin my-new-feature`)
147
- 5. Create new Pull Request
177
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
178
+ 4. Run tests (`rake test`)
179
+ 5. Push to the branch (`git push origin my-new-feature`)
180
+ 6. Create new Merge Request
@@ -8,6 +8,7 @@ require 'json'
8
8
  # Main files
9
9
  require 'open-weather-api/resources/base'
10
10
  require 'open-weather-api/resources/current'
11
+ require 'open-weather-api/resources/forecast_hourly'
11
12
  require 'open-weather-api/resources/handlers/base'
12
13
  require 'open-weather-api/resources/handlers/current'
13
14
  require 'open-weather-api/config'
@@ -1,6 +1,8 @@
1
1
  module OpenWeatherAPI
2
2
  class API
3
3
 
4
+ VERSION = "2.5"
5
+
4
6
  attr_accessor :api_key, :default_language, :default_country_code, :default_units
5
7
 
6
8
  def initialize(options = {})
@@ -16,8 +18,6 @@ module OpenWeatherAPI
16
18
 
17
19
  # Not yet implemented
18
20
  def forecast(type = :hourly, **args, &block)
19
- raise ArgumentError, "Invalid #{type} forecast type."
20
-
21
21
  self.send("fetch_forecast_#{type}").execute(**args, &block)
22
22
  end
23
23
 
@@ -13,24 +13,38 @@ module OpenWeatherAPI
13
13
  setup_indifferent_access(@parameters)
14
14
 
15
15
  # Let's use json
16
- execute_json **hash, &block
16
+ response = RestClient.send :get, base_url, params: build_params(@parameters)
17
+ raise "Invalid response." unless response.code == 200
18
+
19
+ # Handle the response format
20
+ response = self.send "handle_response_#{mode}", response
21
+
22
+ # Handle the block
23
+ return block.call(response) if block_given?
24
+ response
17
25
  end
18
26
 
19
27
  private
20
28
 
21
- def execute_json(**hash, &block)
22
- response = RestClient.send :get, base_url, params: build_params(@parameters), accept: :json
23
- raise "Invalid response." unless response.code == 200
29
+ def mode
30
+ (@parameters[:mode] || 'json').to_s.to_sym
31
+ end
24
32
 
33
+ def handle_response_json(response)
25
34
  json = JSON.parse(response.body)
26
35
  setup_indifferent_access(json)
36
+ end
37
+
38
+ def handle_response_xml(response)
39
+ response.body
40
+ end
27
41
 
28
- return block.call(json) if block_given?
29
- json
42
+ def handle_response_html(response)
43
+ response.body
30
44
  end
31
45
 
32
46
  def base_url
33
- 'http://api.openweathermap.org/data/2.5/'
47
+ "http://api.openweathermap.org/data/#{API::VERSION || '2.5'}/"
34
48
  end
35
49
 
36
50
  def setup_indifferent_access(sub_hash)
@@ -0,0 +1,28 @@
1
+ module OpenWeatherAPI
2
+ module Resources
3
+ class ForecastHourly < Base
4
+
5
+ def base_url
6
+ return super + 'forecast'
7
+ end
8
+
9
+ def build_params(parameters = {})
10
+ super [city, city_id, geolocation].each{ |h| break h.handle if h.can? }
11
+ end
12
+
13
+ # Simple handlers
14
+ def city
15
+ City.new @api_obj, @parameters
16
+ end
17
+
18
+ def city_id
19
+ CityID.new @api_obj, @parameters
20
+ end
21
+
22
+ def geolocation
23
+ Geolocation.new @api_obj, @parameters
24
+ end
25
+
26
+ end
27
+ end
28
+ end
@@ -45,5 +45,53 @@ module OpenWeatherAPI
45
45
  end
46
46
 
47
47
  end
48
+
49
+ class City < QueryHandler
50
+ private
51
+
52
+ def build
53
+ { q: [value, country_code].compact.flatten.join(',') }
54
+ end
55
+
56
+ def value
57
+ @parameters[:city]
58
+ end
59
+ end
60
+
61
+ class CityID < QueryHandler
62
+ def multiple?
63
+ value.is_a? Array
64
+ end
65
+
66
+ private
67
+
68
+ def build
69
+ { id: [value].flatten.compact.join(',') }
70
+ end
71
+
72
+ def value
73
+ @parameters[:id] || @parameters[:city_id]
74
+ end
75
+ end
76
+
77
+ class Geolocation < QueryHandler
78
+ def can?
79
+ latitude != nil && longitude != nil
80
+ end
81
+
82
+ private
83
+
84
+ def build
85
+ { lat: latitude, lon: longitude }
86
+ end
87
+
88
+ def latitude
89
+ @parameters[:latitude] || @parameters[:lat]
90
+ end
91
+
92
+ def longitude
93
+ @parameters[:longitude] || @parameters[:lon]
94
+ end
95
+ end
48
96
  end
49
97
  end
@@ -4,54 +4,6 @@ module OpenWeatherAPI
4
4
  class Current
5
5
  private
6
6
 
7
- class City < QueryHandler
8
- private
9
-
10
- def build
11
- { q: [value, country_code].compact.flatten.join(',') }
12
- end
13
-
14
- def value
15
- @parameters[:city]
16
- end
17
- end
18
-
19
- class CityID < QueryHandler
20
- def multiple?
21
- value.is_a? Array
22
- end
23
-
24
- private
25
-
26
- def build
27
- { id: [value].flatten.compact.join(',') }
28
- end
29
-
30
- def value
31
- @parameters[:id] || @parameters[:city_id]
32
- end
33
- end
34
-
35
- class Geolocation < QueryHandler
36
- def can?
37
- latitude != nil && longitude != nil
38
- end
39
-
40
- private
41
-
42
- def build
43
- { lat: latitude, lon: longitude }
44
- end
45
-
46
- def latitude
47
- @parameters[:latitude] || @parameters[:lat]
48
- end
49
-
50
- def longitude
51
- @parameters[:longitude] || @parameters[:lon]
52
- end
53
- end
54
-
55
7
  class Zipcode < QueryHandler
56
8
  private
57
9
 
@@ -1,3 +1,3 @@
1
1
  module OpenWeatherAPI
2
- VERSION = '0.0.4'
2
+ VERSION = '0.0.5'
3
3
  end
@@ -39,5 +39,13 @@ describe OpenWeatherAPI::API do
39
39
 
40
40
  expect(json1).to eq(json2)
41
41
  end
42
+
43
+ it 'works with xml format' do
44
+ expect(api.current(city: 'Santa Cruz de Tenerife', mode: :xml)).not_to be_nil
45
+ end
46
+
47
+ it 'works with html format' do
48
+ expect(api.current(city: 'Santa Cruz de Tenerife', mode: :html)).not_to be_nil
49
+ end
42
50
  end
43
51
  end
@@ -0,0 +1,34 @@
1
+ require 'spec_helper'
2
+
3
+ describe OpenWeatherAPI::API do
4
+ describe 'When fetching hourly forecast weather' do
5
+ let(:api) { OpenWeatherAPI::API.new( api_key: ENV['OPEN_WEATHER_API_KEY'], default_language: 'es', default_country_code: 'es' ) }
6
+
7
+ it 'should retrieve data by city name' do
8
+ expect(api.forecast(:hourly, city: 'Santa Cruz de Tenerife')[:cod].to_i).to eq(200)
9
+ end
10
+
11
+ it 'should retrieve data by city id' do
12
+ expect(api.forecast(:hourly, id: 6360638)[:cod].to_i).to eq(200)
13
+ end
14
+
15
+ it 'should retrieve data by geolocation' do
16
+ expect(api.forecast(:hourly, lon: -16.20302, lat: 28.53924)[:cod].to_i).to eq(200)
17
+ end
18
+
19
+ it 'works with a given block' do
20
+ json1, json2 = nil
21
+ json1 = api.forecast(:hourly, city: 'Santa Cruz de Tenerife') { |json| json2 = json }
22
+
23
+ expect(json1).to eq(json2)
24
+ end
25
+
26
+ it 'works with xml format' do
27
+ expect(api.forecast(:hourly, city: 'Santa Cruz de Tenerife', mode: :xml)).not_to be_nil
28
+ end
29
+
30
+ it 'works with html format' do
31
+ expect(api.forecast(:hourly, city: 'Santa Cruz de Tenerife', mode: :html)).not_to be_nil
32
+ end
33
+ end
34
+ end
@@ -1,3 +1,5 @@
1
+ raise "You MUST setup 'OPEN_WEATHER_API_KEY' env variable before running tests!" unless ENV['OPEN_WEATHER_API_KEY']
2
+
1
3
  require 'bundler/setup'
2
4
  Bundler.setup
3
5
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: open-weather-api
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.0.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Wikiti
@@ -71,12 +71,14 @@ files:
71
71
  - lib/open-weather-api/config.rb
72
72
  - lib/open-weather-api/resources/base.rb
73
73
  - lib/open-weather-api/resources/current.rb
74
+ - lib/open-weather-api/resources/forecast_hourly.rb
74
75
  - lib/open-weather-api/resources/handlers/base.rb
75
76
  - lib/open-weather-api/resources/handlers/current.rb
76
77
  - lib/open-weather-api/version.rb
77
78
  - open-weather-api.gemspec
78
79
  - rakefile
79
80
  - spec/current_weather_spec.rb
81
+ - spec/forecast_hourly_spec.rb
80
82
  - spec/spec_helper.rb
81
83
  homepage: https://gitlab.com/wikiti-random-stuff/open-weather-api
82
84
  licenses:
@@ -104,5 +106,6 @@ specification_version: 4
104
106
  summary: Simple wrapper for Open Weather Map API
105
107
  test_files:
106
108
  - spec/current_weather_spec.rb
109
+ - spec/forecast_hourly_spec.rb
107
110
  - spec/spec_helper.rb
108
111
  has_rdoc: