open-weather-api 0.0.5 → 0.0.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CONTRIBUTING.md +9 -0
- data/README.md +49 -14
- data/lib/open-weather-api.rb +8 -1
- data/lib/open-weather-api/api.rb +10 -1
- data/lib/open-weather-api/resources/base.rb +5 -1
- data/lib/open-weather-api/resources/current.rb +10 -10
- data/lib/open-weather-api/resources/forecast_daily.rb +19 -0
- data/lib/open-weather-api/resources/forecast_hourly.rb +4 -4
- data/lib/open-weather-api/resources/handlers/base.rb +68 -66
- data/lib/open-weather-api/resources/handlers/current.rb +2 -3
- data/lib/open-weather-api/resources/raw.rb +15 -0
- data/lib/open-weather-api/version.rb +1 -1
- data/spec/forecast_daily_spec.rb +34 -0
- data/spec/raw_spec.rb +17 -0
- metadata +8 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 81a5a0437a5df3681e01d999042349f65a262edd
|
4
|
+
data.tar.gz: 58658dab6c7aae11b3946d73de3f61aabf3c32e0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 81e3fcf7f66b33d7b64af4ba6d3ddab30b80c63cdfa37c31150b2bbff313c3c9aea6071ddb728ab09592acebb4da15db9346fd8283d9791717216b2a28de8a4c
|
7
|
+
data.tar.gz: d64654935917d1ef3342685b77edf356d14ea6f490e8a1da4e983736fe595cad4a9a26840b01fa7ef2948f6be66f40fb20b186b859e3ad665d4aecdd7060b1d1
|
data/CONTRIBUTING.md
ADDED
@@ -0,0 +1,9 @@
|
|
1
|
+
# Contributing
|
2
|
+
|
3
|
+
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) )
|
4
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
5
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
6
|
+
- Feel free to add yourself to *README.md*'s authors :smile:.
|
7
|
+
4. Run tests (`rake test`)
|
8
|
+
5. Push to the branch (`git push origin my-new-feature`)
|
9
|
+
6. Create new Merge Request
|
data/README.md
CHANGED
@@ -106,9 +106,7 @@ json = open_weather_api.current circle: { lat: -16.3319, lon: 28.5046 }, cities_
|
|
106
106
|
|
107
107
|
For more information about the API, visit [http://openweathermap.org/current](http://openweathermap.org/current).
|
108
108
|
|
109
|
-
###
|
110
|
-
|
111
|
-
#### Hourly (actually, every 3 hours, up to 5 days)
|
109
|
+
### Hourly forecast (actually, every 3 hours, up to 5 days)
|
112
110
|
|
113
111
|
By city name:
|
114
112
|
|
@@ -130,6 +128,52 @@ json = open_weather_api.forecast :hourly, lon: -16.20302, lat: 28.53924
|
|
130
128
|
|
131
129
|
For more information about the API, visit [http://openweathermap.org/forecast5](http://openweathermap.org/forecast5).
|
132
130
|
|
131
|
+
#### Daily forecast (up to 16 days)
|
132
|
+
|
133
|
+
Same as above, but changing `:hourly` to `:daily`. Also, you must add the `:days` to the resquests. Default is `1`.
|
134
|
+
|
135
|
+
By city name:
|
136
|
+
|
137
|
+
````ruby
|
138
|
+
json = open_weather_api.forecast :daily, city: 'Santa Cruz de Tenerife', country_code: 'es', days: 2
|
139
|
+
````
|
140
|
+
|
141
|
+
By city id:
|
142
|
+
|
143
|
+
````ruby
|
144
|
+
json = open_weather_api.forecast :daily, id: 6360638, days: 2
|
145
|
+
````
|
146
|
+
|
147
|
+
By geolocation:
|
148
|
+
|
149
|
+
````ruby
|
150
|
+
json = open_weather_api.forecast :daily, lon: -16.20302, lat: 28.53924, days: 2
|
151
|
+
````
|
152
|
+
|
153
|
+
For more information about the API, visit [http://openweathermap.org/forecast5](http://openweathermap.org/forecast5).
|
154
|
+
|
155
|
+
### Historical data
|
156
|
+
|
157
|
+
TODO
|
158
|
+
|
159
|
+
### Weather stations
|
160
|
+
|
161
|
+
TODO
|
162
|
+
|
163
|
+
### UV index
|
164
|
+
|
165
|
+
TODO
|
166
|
+
|
167
|
+
### Raw requests
|
168
|
+
|
169
|
+
You can also make your very own calls to the api:
|
170
|
+
|
171
|
+
````ruby
|
172
|
+
json = open_weather_api.raw 'route/to/my/resource', param1: 'param', param2: 'param', lang: 'es'
|
173
|
+
````
|
174
|
+
|
175
|
+
Note that it's not necessary to add `APPID` parameter to the call.
|
176
|
+
|
133
177
|
### Other
|
134
178
|
|
135
179
|
Retrieve icon url:
|
@@ -143,7 +187,7 @@ end
|
|
143
187
|
You can add manually any parameter you need for each request, and they will override the computed parameters:
|
144
188
|
|
145
189
|
````ruby
|
146
|
-
open_weather_api.current city: 'Balashikha', country_code:
|
190
|
+
open_weather_api.current city: 'Balashikha', country_code: 'ru', lang: 'ru', mypara: 'param'
|
147
191
|
````
|
148
192
|
|
149
193
|
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`):
|
@@ -168,13 +212,4 @@ This project has been developed by:
|
|
168
212
|
|
169
213
|
| Avatar | Name | Nickname | Email |
|
170
214
|
| ------- | ------------- | --------- | ------------------ |
|
171
|
-
| ![](http://www.gravatar.com/avatar/2ae6d81e0605177ba9e17b19f54e6b6c.jpg?s=64) | Daniel Herzog | Wikiti | [wikiti.doghound@gmail.com](mailto:wikiti.doghound@gmail.com)
|
172
|
-
|
173
|
-
## Contributing
|
174
|
-
|
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) )
|
176
|
-
2. Create your feature branch (`git checkout -b my-new-feature`)
|
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
|
215
|
+
| ![](http://www.gravatar.com/avatar/2ae6d81e0605177ba9e17b19f54e6b6c.jpg?s=64) | Daniel Herzog | Wikiti | [wikiti.doghound@gmail.com](mailto:wikiti.doghound@gmail.com) |
|
data/lib/open-weather-api.rb
CHANGED
@@ -5,11 +5,18 @@ require 'uri'
|
|
5
5
|
require 'rest-client'
|
6
6
|
require 'json'
|
7
7
|
|
8
|
-
#
|
8
|
+
# Resources
|
9
9
|
require 'open-weather-api/resources/base'
|
10
|
+
require 'open-weather-api/resources/raw'
|
10
11
|
require 'open-weather-api/resources/current'
|
11
12
|
require 'open-weather-api/resources/forecast_hourly'
|
13
|
+
|
14
|
+
# Handlers
|
12
15
|
require 'open-weather-api/resources/handlers/base'
|
13
16
|
require 'open-weather-api/resources/handlers/current'
|
17
|
+
|
18
|
+
# Configuration
|
14
19
|
require 'open-weather-api/config'
|
20
|
+
|
21
|
+
# Main file
|
15
22
|
require 'open-weather-api/api'
|
data/lib/open-weather-api/api.rb
CHANGED
@@ -16,11 +16,16 @@ module OpenWeatherAPI
|
|
16
16
|
fetch_current.execute(**args, &block)
|
17
17
|
end
|
18
18
|
|
19
|
-
# Not yet implemented
|
20
19
|
def forecast(type = :hourly, **args, &block)
|
20
|
+
raise "Invalid '#type' forecast type" unless valid_forecast_type?(type)
|
21
|
+
|
21
22
|
self.send("fetch_forecast_#{type}").execute(**args, &block)
|
22
23
|
end
|
23
24
|
|
25
|
+
def raw(path = "/", **args, &block)
|
26
|
+
fetch_raw.execute(path, **args, &block)
|
27
|
+
end
|
28
|
+
|
24
29
|
def icon_url(icon_code)
|
25
30
|
"http://openweathermap.org/img/w/#{icon_code}.png"
|
26
31
|
end
|
@@ -33,6 +38,10 @@ module OpenWeatherAPI
|
|
33
38
|
VALID_FORECAST_TYPES.include? type.to_sym
|
34
39
|
end
|
35
40
|
|
41
|
+
def fetch_raw
|
42
|
+
@current ||= Resources::Raw.new self
|
43
|
+
end
|
44
|
+
|
36
45
|
def fetch_current
|
37
46
|
@current ||= Resources::Current.new self
|
38
47
|
end
|
@@ -3,10 +3,10 @@ module OpenWeatherAPI
|
|
3
3
|
class Current < Base
|
4
4
|
|
5
5
|
def base_url
|
6
|
-
return super + 'group' if city_id.multiple?
|
7
|
-
return super + 'weather' if [city, city_id, geolocation, zipcode].any? { |h| h.can? }
|
8
|
-
return super + 'box/city' if bbox.can?
|
9
|
-
return super + 'find' if circle.can?
|
6
|
+
return super + 'group/' if city_id.multiple?
|
7
|
+
return super + 'weather/' if [city, city_id, geolocation, zipcode].any? { |h| h.can? }
|
8
|
+
return super + 'box/city/' if bbox.can?
|
9
|
+
return super + 'find/' if circle.can?
|
10
10
|
end
|
11
11
|
|
12
12
|
def build_params(parameters = {})
|
@@ -15,29 +15,29 @@ module OpenWeatherAPI
|
|
15
15
|
|
16
16
|
# Simple handlers
|
17
17
|
def city
|
18
|
-
City.new @api_obj, @parameters
|
18
|
+
Handlers::City.new @api_obj, @parameters
|
19
19
|
end
|
20
20
|
|
21
21
|
def city_id
|
22
|
-
CityID.new @api_obj, @parameters
|
22
|
+
Handlers::CityID.new @api_obj, @parameters
|
23
23
|
end
|
24
24
|
|
25
25
|
def geolocation
|
26
|
-
Geolocation.new @api_obj, @parameters
|
26
|
+
Handlers::Geolocation.new @api_obj, @parameters
|
27
27
|
end
|
28
28
|
|
29
29
|
def zipcode
|
30
|
-
Zipcode.new @api_obj, @parameters
|
30
|
+
Handlers::Zipcode.new @api_obj, @parameters
|
31
31
|
end
|
32
32
|
|
33
33
|
# Other handlers
|
34
34
|
# ------------------
|
35
35
|
def bbox
|
36
|
-
BoundingBox.new @api_obj, @parameters
|
36
|
+
Handlers::BoundingBox.new @api_obj, @parameters
|
37
37
|
end
|
38
38
|
|
39
39
|
def circle
|
40
|
-
Circle.new @api_obj, @parameters
|
40
|
+
Handlers::Circle.new @api_obj, @parameters
|
41
41
|
end
|
42
42
|
|
43
43
|
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module OpenWeatherAPI
|
2
|
+
module Resources
|
3
|
+
class ForecastDaily < ForecastHourly
|
4
|
+
|
5
|
+
def base_url
|
6
|
+
return super + 'daily/'
|
7
|
+
end
|
8
|
+
|
9
|
+
def build_params(parameters = {})
|
10
|
+
parameters.merge!(cnt: days)
|
11
|
+
super(parameters)
|
12
|
+
end
|
13
|
+
|
14
|
+
def days
|
15
|
+
@parameters[:days] || @parameters[:n_days] || @parameters[:cnt] || @parameters[:count]
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -3,7 +3,7 @@ module OpenWeatherAPI
|
|
3
3
|
class ForecastHourly < Base
|
4
4
|
|
5
5
|
def base_url
|
6
|
-
return super + 'forecast'
|
6
|
+
return super + 'forecast/'
|
7
7
|
end
|
8
8
|
|
9
9
|
def build_params(parameters = {})
|
@@ -12,15 +12,15 @@ module OpenWeatherAPI
|
|
12
12
|
|
13
13
|
# Simple handlers
|
14
14
|
def city
|
15
|
-
City.new @api_obj, @parameters
|
15
|
+
Handlers::City.new @api_obj, @parameters
|
16
16
|
end
|
17
17
|
|
18
18
|
def city_id
|
19
|
-
CityID.new @api_obj, @parameters
|
19
|
+
Handlers::CityID.new @api_obj, @parameters
|
20
20
|
end
|
21
21
|
|
22
22
|
def geolocation
|
23
|
-
Geolocation.new @api_obj, @parameters
|
23
|
+
Handlers::Geolocation.new @api_obj, @parameters
|
24
24
|
end
|
25
25
|
|
26
26
|
end
|
@@ -1,97 +1,99 @@
|
|
1
1
|
module OpenWeatherAPI
|
2
2
|
module Resources
|
3
|
+
module Handlers
|
3
4
|
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
5
|
+
class QueryHandler
|
6
|
+
def initialize(api_obj, parameters = {})
|
7
|
+
@api_obj = api_obj
|
8
|
+
@parameters = parameters
|
9
|
+
end
|
9
10
|
|
10
|
-
|
11
|
-
|
12
|
-
|
11
|
+
def handle
|
12
|
+
build if can?
|
13
|
+
end
|
13
14
|
|
14
|
-
|
15
|
-
|
16
|
-
|
15
|
+
def can?
|
16
|
+
value != nil
|
17
|
+
end
|
17
18
|
|
18
|
-
|
19
|
+
private
|
19
20
|
|
20
|
-
|
21
|
-
|
22
|
-
|
21
|
+
def value
|
22
|
+
true
|
23
|
+
end
|
23
24
|
|
24
|
-
|
25
|
-
|
26
|
-
|
25
|
+
def build
|
26
|
+
@parameters
|
27
|
+
end
|
27
28
|
|
28
|
-
|
29
|
-
|
30
|
-
|
29
|
+
def country_code
|
30
|
+
@parameters[:country_code] || @parameters[:cc] || @api_obj.default_country_code
|
31
|
+
end
|
31
32
|
|
32
|
-
|
33
|
-
|
34
|
-
|
33
|
+
def cities_count
|
34
|
+
@parameters[:count] || @parameters[:cnt] || @parameters[:cities_count]
|
35
|
+
end
|
35
36
|
|
36
|
-
|
37
|
-
|
38
|
-
|
37
|
+
def cluster
|
38
|
+
@parameters[:cluster] if @parameters[:cluster].to_s == 'yes' || @parameters[:cluster].to_s == 'no'
|
39
|
+
end
|
39
40
|
|
40
|
-
|
41
|
-
|
42
|
-
|
41
|
+
def fill(hash)
|
42
|
+
hash[:cnt] = cities_count if cities_count
|
43
|
+
hash[:cluster] = cluster if cluster
|
43
44
|
|
44
|
-
|
45
|
+
hash
|
46
|
+
end
|
45
47
|
end
|
46
48
|
|
47
|
-
|
48
|
-
|
49
|
-
class City < QueryHandler
|
50
|
-
private
|
49
|
+
class City < QueryHandler
|
50
|
+
private
|
51
51
|
|
52
|
-
|
53
|
-
|
52
|
+
def build
|
53
|
+
{ q: [value, country_code].compact.flatten.join(',') }
|
54
|
+
end
|
55
|
+
|
56
|
+
def value
|
57
|
+
@parameters[:city]
|
58
|
+
end
|
54
59
|
end
|
55
|
-
|
56
|
-
def value
|
57
|
-
@parameters[:city]
|
58
|
-
end
|
59
|
-
end
|
60
60
|
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
61
|
+
class CityID < QueryHandler
|
62
|
+
def multiple?
|
63
|
+
value.is_a? Array
|
64
|
+
end
|
65
65
|
|
66
|
-
|
66
|
+
private
|
67
67
|
|
68
|
-
|
69
|
-
|
70
|
-
|
68
|
+
def build
|
69
|
+
{ id: [value].flatten.compact.join(',') }
|
70
|
+
end
|
71
71
|
|
72
|
-
|
73
|
-
|
72
|
+
def value
|
73
|
+
@parameters[:id] || @parameters[:city_id]
|
74
|
+
end
|
74
75
|
end
|
75
|
-
end
|
76
76
|
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
77
|
+
class Geolocation < QueryHandler
|
78
|
+
def can?
|
79
|
+
latitude != nil && longitude != nil
|
80
|
+
end
|
81
81
|
|
82
|
-
|
82
|
+
private
|
83
83
|
|
84
|
-
|
85
|
-
|
86
|
-
|
84
|
+
def build
|
85
|
+
{ lat: latitude, lon: longitude }
|
86
|
+
end
|
87
87
|
|
88
|
-
|
89
|
-
|
90
|
-
|
88
|
+
def latitude
|
89
|
+
@parameters[:latitude] || @parameters[:lat]
|
90
|
+
end
|
91
91
|
|
92
|
-
|
93
|
-
|
92
|
+
def longitude
|
93
|
+
@parameters[:longitude] || @parameters[:lon]
|
94
|
+
end
|
94
95
|
end
|
96
|
+
|
95
97
|
end
|
96
98
|
end
|
97
99
|
end
|
@@ -1,8 +1,6 @@
|
|
1
1
|
module OpenWeatherAPI
|
2
2
|
module Resources
|
3
|
-
|
4
|
-
class Current
|
5
|
-
private
|
3
|
+
module Handlers
|
6
4
|
|
7
5
|
class Zipcode < QueryHandler
|
8
6
|
private
|
@@ -51,6 +49,7 @@ module OpenWeatherAPI
|
|
51
49
|
fill lat: value[:lat], lon: value[:lon]
|
52
50
|
end
|
53
51
|
end
|
52
|
+
|
54
53
|
end
|
55
54
|
end
|
56
55
|
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe OpenWeatherAPI::API do
|
4
|
+
let(:api) { OpenWeatherAPI::API.new( api_key: ENV['OPEN_WEATHER_API_KEY'], default_language: 'es', default_country_code: 'es' ) }
|
5
|
+
|
6
|
+
describe 'When fetching daily forecast weather' do
|
7
|
+
it 'should retrieve data by city name' do
|
8
|
+
expect(api.forecast(:daily, city: 'Santa Cruz de Tenerife', days: 3)[:cod].to_i).to eq(200)
|
9
|
+
end
|
10
|
+
|
11
|
+
it 'should retrieve data by city id' do
|
12
|
+
expect(api.forecast(:daily, id: 6360638, days: 3)[:cod].to_i).to eq(200)
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'should retrieve data by geolocation' do
|
16
|
+
expect(api.forecast(:daily, lon: -16.20302, lat: 28.53924, days: 3)[: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(:daily, city: 'Santa Cruz de Tenerife', days: 3) { |json| json2 = json }
|
22
|
+
|
23
|
+
expect(json1).to eq(json2)
|
24
|
+
end
|
25
|
+
|
26
|
+
it 'works with xml format' do
|
27
|
+
expect(api.forecast(:daily, city: 'Santa Cruz de Tenerife', days: 3, mode: :xml)).not_to be_nil
|
28
|
+
end
|
29
|
+
|
30
|
+
it 'works with html format' do
|
31
|
+
expect(api.forecast(:daily, city: 'Santa Cruz de Tenerife', days: 3, mode: :html)).not_to be_nil
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
data/spec/raw_spec.rb
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe OpenWeatherAPI::API do
|
4
|
+
let(:api) { OpenWeatherAPI::API.new( api_key: ENV['OPEN_WEATHER_API_KEY'], default_language: 'es', default_country_code: 'es' ) }
|
5
|
+
|
6
|
+
describe 'When fetching raw rest requests with valid data' do
|
7
|
+
it 'should work' do
|
8
|
+
expect(api.raw("weather", q: 'Santa Cruz de Tenerife,ES')[:cod].to_i).to eq(200)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
describe 'When fetching raw rest requests with invalid data' do
|
13
|
+
it 'should fail' do
|
14
|
+
expect { api.raw("undefined_resource", q: 'whatever', mode: :raw) }.to raise_error
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
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
|
+
version: 0.0.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Wikiti
|
@@ -62,6 +62,7 @@ extra_rdoc_files: []
|
|
62
62
|
files:
|
63
63
|
- .gitignore
|
64
64
|
- .rspec
|
65
|
+
- CONTRIBUTING.md
|
65
66
|
- Gemfile
|
66
67
|
- LICENSE.txt
|
67
68
|
- README.md
|
@@ -71,14 +72,18 @@ files:
|
|
71
72
|
- lib/open-weather-api/config.rb
|
72
73
|
- lib/open-weather-api/resources/base.rb
|
73
74
|
- lib/open-weather-api/resources/current.rb
|
75
|
+
- lib/open-weather-api/resources/forecast_daily.rb
|
74
76
|
- lib/open-weather-api/resources/forecast_hourly.rb
|
75
77
|
- lib/open-weather-api/resources/handlers/base.rb
|
76
78
|
- lib/open-weather-api/resources/handlers/current.rb
|
79
|
+
- lib/open-weather-api/resources/raw.rb
|
77
80
|
- lib/open-weather-api/version.rb
|
78
81
|
- open-weather-api.gemspec
|
79
82
|
- rakefile
|
80
83
|
- spec/current_weather_spec.rb
|
84
|
+
- spec/forecast_daily_spec.rb
|
81
85
|
- spec/forecast_hourly_spec.rb
|
86
|
+
- spec/raw_spec.rb
|
82
87
|
- spec/spec_helper.rb
|
83
88
|
homepage: https://gitlab.com/wikiti-random-stuff/open-weather-api
|
84
89
|
licenses:
|
@@ -106,6 +111,8 @@ specification_version: 4
|
|
106
111
|
summary: Simple wrapper for Open Weather Map API
|
107
112
|
test_files:
|
108
113
|
- spec/current_weather_spec.rb
|
114
|
+
- spec/forecast_daily_spec.rb
|
109
115
|
- spec/forecast_hourly_spec.rb
|
116
|
+
- spec/raw_spec.rb
|
110
117
|
- spec/spec_helper.rb
|
111
118
|
has_rdoc:
|