open-weather-ruby-client 0.1.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +17 -1
  3. data/README.md +178 -11
  4. data/lib/open-weather-ruby-client.rb +1 -3
  5. data/lib/open_weather/client.rb +2 -0
  6. data/lib/open_weather/config.rb +3 -3
  7. data/lib/open_weather/connection.rb +22 -17
  8. data/lib/open_weather/endpoints/current.rb +4 -4
  9. data/lib/open_weather/endpoints/one_call.rb +15 -0
  10. data/lib/open_weather/endpoints/stations.rb +53 -0
  11. data/lib/open_weather/endpoints.rb +2 -0
  12. data/lib/open_weather/models/city/weather.rb +38 -0
  13. data/lib/open_weather/models/city.rb +3 -0
  14. data/lib/open_weather/models/list.rb +7 -1
  15. data/lib/open_weather/models/main.rb +4 -4
  16. data/lib/open_weather/models/mixins/speed.rb +45 -0
  17. data/lib/open_weather/models/mixins/temp.rb +64 -0
  18. data/lib/open_weather/models/mixins.rb +4 -0
  19. data/lib/open_weather/models/model.rb +14 -0
  20. data/lib/open_weather/models/one_call/current_weather.rb +35 -0
  21. data/lib/open_weather/models/one_call/daily_weather.rb +34 -0
  22. data/lib/open_weather/models/one_call/feels_like.rb +14 -0
  23. data/lib/open_weather/models/one_call/hourly_weather.rb +32 -0
  24. data/lib/open_weather/models/one_call/minutely_weather.rb +12 -0
  25. data/lib/open_weather/models/one_call/temp.rb +16 -0
  26. data/lib/open_weather/models/one_call/weather.rb +26 -0
  27. data/lib/open_weather/models/one_call.rb +9 -0
  28. data/lib/open_weather/models/station.rb +35 -0
  29. data/lib/open_weather/models/stations/humidity.rb +12 -0
  30. data/lib/open_weather/models/stations/measurement.rb +27 -0
  31. data/lib/open_weather/models/stations/precipitation.rb +11 -0
  32. data/lib/open_weather/models/stations/pressure.rb +14 -0
  33. data/lib/open_weather/models/stations/temp.rb +14 -0
  34. data/lib/open_weather/models/sys.rb +1 -0
  35. data/lib/open_weather/models/weather.rb +1 -0
  36. data/lib/open_weather/models/wind.rb +1 -1
  37. data/lib/open_weather/models.rb +9 -1
  38. data/lib/open_weather/raise_error.rb +2 -2
  39. data/lib/open_weather/request.rb +14 -1
  40. data/lib/open_weather/version.rb +1 -1
  41. metadata +30 -10
  42. data/lib/open_weather/models/city_weather.rb +0 -23
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 317dd6924aee3127f7a350a47ad0d4873db645af7d307d07a2f7f5102a058c03
4
- data.tar.gz: cd4a8bd78a0170ada43260fd0897ba388c54ddff5f9233ea79477c292affd5e4
3
+ metadata.gz: 3b61381c999fcbbcefa63521936ee96cc28eb7648a9b2b13cc9d01a608d8b12f
4
+ data.tar.gz: aaa00190d52e86a471f2dca1e52c5c4f5fbf67cdfdf5639fe9302d793d1326e2
5
5
  SHA512:
6
- metadata.gz: df44462ca143dcd462d45ba7cb2cfc38ba1c951a705709e4b4b59d80b1b1d78057fff3cfa8aedc2d9f9c26fce1cf2b9c4a5c66178ed939055c0b4afca5083c15
7
- data.tar.gz: 256c0bac00841ba60a5ce65e10e3b66103c8756e5c619bf93479b74660d092e22973b6e8e07eaac4cdd370be243eb6382ea7f33829fd2db9d65bbe675b61d736
6
+ metadata.gz: 890ef7edc806545a9b83f99a87133d7ff83900593f17e5aadcf76f7389cfa7c6a3249d0f4911d6d257d493a00dd572880f8848ee68a6ba0cd5ffd9561c53c75f
7
+ data.tar.gz: 3094f7b9d058070590db2ddfabc99d9f799f00b3b185fb9efd93b348d9abd8f124ec8d2f0552f7430850bf08dc7cb698e802c648a32aa9dbaf333b343c0521b4
data/CHANGELOG.md CHANGED
@@ -1,3 +1,19 @@
1
- ### 0.1.0 (5/1/2020)
1
+ ### 0.3.0 (2023/03/25)
2
+
3
+ * [#30](https://github.com/dblock/open-weather-ruby-client/pull/30): Added support for Ruby 3.2 - [@petergoldstein](https://github.com/petergoldstein).
4
+ * [#27](https://github.com/dblock/open-weather-ruby-client/pull/27): Removed default values for Faraday’s SSL settings ca_file and ca_path - [@sunny](https://github.com/sunny).
5
+ * [#21](https://github.com/dblock/open-weather-ruby-client/pull/21), [#20](https://github.com/dblock/open-weather-ruby-client/pull/20), [#19](https://github.com/dblock/open-weather-ruby-client/pull/19), [#18](https://github.com/dblock/open-weather-ruby-client/pull/18): Added support for Stations API - [@wasabigeek](https://github.com/wasabigeek).
6
+ * [#22](https://github.com/dblock/open-weather-ruby-client/pull/23): Removed API version from `Config#endpoint` - [@dblock](https://github.com/dblock).
7
+
8
+ ### 0.2.0 (2020/05/17)
9
+
10
+ * [#14](https://github.com/dblock/open-weather-ruby-client/pull/14): Added support for One Call API - [@dblock](https://github.com/dblock).
11
+ * [#16](https://github.com/dblock/open-weather-ruby-client/pull/16): Added support for temperature and wind speed conversion - [@dblock](https://github.com/dblock).
12
+ * [#16](https://github.com/dblock/open-weather-ruby-client/pull/16): Added `weather#icon_url` returning a parsed `URI` - [@dblock](https://github.com/dblock).
13
+ * [#15](https://github.com/dblock/open-weather-ruby-client/pull/15): Renamed `CityWeather` to `OpenWeather::Models::City::Weather` - [@dblock](https://github.com/dblock).
14
+ * [#12](https://github.com/dblock/open-weather-ruby-client/pull/12): Cache `Faraday::Connection` for persistent adapters - [@dblock](https://github.com/dblock).
15
+ * [#13](https://github.com/dblock/open-weather-ruby-client/pull/13): Require Faraday >= 1.0 - [@dblock](https://github.com/dblock).
16
+
17
+ ### 0.1.0 (2020/05/01)
2
18
 
3
19
  * Initial public release - [@dblock](https://github.com/dblock).
data/README.md CHANGED
@@ -2,11 +2,11 @@ OpenWeather Ruby Client
2
2
  =======================
3
3
 
4
4
  [![Gem Version](https://badge.fury.io/rb/open-weather-ruby-client.svg)](https://badge.fury.io/rb/open-weather-ruby-client)
5
- [![Build Status](https://travis-ci.org/dblock/open-weather-ruby-client.svg?branch=master)](https://travis-ci.org/dblock/open-weather-ruby-client)
5
+ [![Tests Status](https://github.com/dblock/open-weather-ruby-client/actions/workflows/test.yml/badge.svg)](https://github.com/dblock/open-weather-ruby-client/actions)
6
6
 
7
- A Ruby client for the [OpenWeather API v3](https://openweathermap.org/api).
7
+ A Ruby client for the [OpenWeather API v2.5 and v3.0](https://openweathermap.org/api).
8
8
 
9
- Unlike other clients, including [open-weather](https://github.com/coderhs/ruby_open_weather_map), provides a rich first class interface to OpenWeather models, implements more consistent error handling, and is built with thorough test coverage using actual OpenWeather data.
9
+ Unlike other clients, including [open-weather](https://github.com/coderhs/ruby_open_weather_map), provides a rich first class interface to OpenWeather models, structured timestamps, built-in metrics conversion for temperature and wind speed, offers more consistent error handling, and is implemented with thorough test coverage using actual OpenWeather data.
10
10
 
11
11
  ## Table of Contents
12
12
 
@@ -17,8 +17,21 @@ Unlike other clients, including [open-weather](https://github.com/coderhs/ruby_o
17
17
  - [Cities Within a Rectangle Zone](#cities-within-a-rectangle-zone)
18
18
  - [Cities Within a Circle](#cities-within-a-circle)
19
19
  - [Multiple Cities by Id](#multiple-cities-by-id)
20
+ - [One Call](#one-call)
21
+ - [Current and Forecast Weather](#current-and-forecast-weather)
22
+ - [Historical Weather](#historical-weather)
23
+ - [Stations](#stations)
24
+ - [Register a Station](#register-a-station)
25
+ - [List Stations](#list-stations)
26
+ - [Get Station](#get-station)
27
+ - [Update Station](#update-station)
28
+ - [Delete Station](#delete-station)
29
+ - [Create Measurements](#create-measurements)
30
+ - [Get Measurements](#get-measurements)
20
31
  - [Configuration](#configuration)
21
32
  - [Units](#units)
33
+ - [Converting Temperature](#converting-temperature)
34
+ - [Converting Wind Speed](#converting-wind-speed)
22
35
  - [Language](#language)
23
36
  - [Errors](#errors)
24
37
  - [Resources](#resources)
@@ -50,21 +63,24 @@ client = OpenWeather::Client.new(
50
63
  Returns [current weather](https://openweathermap.org/current).
51
64
 
52
65
  ```ruby
53
- data = client.current_weather(city: 'London') # => OpenWeather::Models::CityWeather
66
+ data = client.current_weather(city: 'London') # => OpenWeather::Models::City::Weather
54
67
 
55
68
  data.name # => 'London'
69
+ data.dt # => Time
56
70
  data.main.feels_like # => 277.73
57
71
  data.main.humidity # => 81
58
72
  data.main.pressure # => 1005
59
73
  data.main.temp # => 282.57
60
- data.main.temp_max # => 283.15
74
+ data.main.temp_max # => 283.15, degrees Kelvin
75
+ data.main.temp_max_c # => 10, degrees Celcius
76
+ data.main.temp_max_f # => 50.0, degrees Farenheit
61
77
  data.main.temp_min # => 281.48
62
78
  ```
63
79
 
64
80
  Returns the current weather in metric units and Russian metadata.
65
81
 
66
82
  ```ruby
67
- data = client.current_weather(city: 'Moscow', units: 'metric', lang: 'ru') # => OpenWeather::Models::CityWeather
83
+ data = client.current_weather(city: 'Moscow', units: 'metric', lang: 'ru') # => OpenWeather::Models::City::Weather
68
84
 
69
85
  data.name # => 'Москва'
70
86
  data.main.temp # => 12
@@ -98,10 +114,12 @@ client.current_zip(10018, 'US') # => weather in New York, 10018
98
114
  client.current_weather(zip: 10018, country: 'US') # => weather in New York, 10018
99
115
  ```
100
116
 
101
- See [OpenWeather::Models::CityWeather](lib/open_weather/models/data.rb) for all available properties.
117
+ See [OpenWeather::Models::City::Weather](lib/open_weather/models/city/weather.rb) and related [OpenWeather::Models](lib/open_weather/models) for all available properties.
102
118
 
103
119
  ### Current Weather for Several Cities
104
120
 
121
+ Collection APIs return [OpenWeather::Models::List](lib/open_weather/models/list.rb), which includes multiple instances of [OpenWeather::Models::City::Weather](lib/open_weather/models/city/weather.rb).
122
+
105
123
  #### Cities Within a Rectangle Zone
106
124
 
107
125
  ```ruby
@@ -147,6 +165,132 @@ data.first.name # 'Moscow'
147
165
  data.main.temp # => 285.15
148
166
  ```
149
167
 
168
+ ### One Call
169
+
170
+ [One Call API](https://openweathermap.org/api/one-call-api) provides current weather, minute forecast for 1 hour, hourly forecast for 48 hours, daily forecast for 7 days, and historical weather data for 5 previous days for any geographical coordinate.
171
+
172
+ See [OpenWeather::Models::OneCall](lib/open_weather/models/one_call) for all available models and properties.
173
+
174
+ #### Current and Forecast Weather
175
+
176
+ ```ruby
177
+ data = client.one_call(lat: 33.441792, lon: -94.037689) # => OpenWeather::Models::OneCall::Weather
178
+ data.lat # => 33.44
179
+ data.lon # => -94.04
180
+ data.timezone # => 'America/Chicago'
181
+ data.current # => OpenWeather::Models::OneCall::CurrentWeather
182
+ data.minutely # => Array[OpenWeather::Models::OneCall::MinutelyWeather]
183
+ data.hourly # => Array[OpenWeather::Models::OneCall::HourlyWeather]
184
+ data.daily # => Array[OpenWeather::Models::OneCall::DailyWeather]
185
+ ```
186
+
187
+ Exclude minutely and hourly data.
188
+
189
+ ```ruby
190
+ client.one_call(lat: 33.441792, lon: -94.037689, exclude: ['minutely', 'hourly'])
191
+ ```
192
+
193
+ #### Historical Weather
194
+
195
+ ```ruby
196
+ data = client.one_call(lat: 33.441792, lon: -94.037689, dt: Time.now - 24 * 60 * 60) # => OpenWeather::Models::OneCall::Weather
197
+ data.lat # => 33.44
198
+ data.lon # => -94.04
199
+ data.timezone # => 'America/Chicago'
200
+ data.current # => OpenWeather::Models::OneCall::CurrentWeather
201
+ data.hourly # => Array[OpenWeather::Models::OneCall::HourlyWeather]
202
+ ```
203
+
204
+ ### Stations
205
+
206
+ The [Stations API](https://openweathermap.org/stations) lets your manage personal weather stations and measurements.
207
+
208
+ #### Register a Station
209
+
210
+ To register a station, you can call the client method:
211
+ ```ruby
212
+ data = client.register_station(external_id: 'SF_TEST001', ...) # => OpenWeather::Models::Station
213
+ data.id # => '5ed2118acca8ce0001f1aeg1'
214
+ data.external_id # => 'SF_TEST001'
215
+ ```
216
+ Alternatively, call `register!` on an instance of `Station`:
217
+ ```ruby
218
+ model = OpenWeather::Models::Station.new(external_id: 'SF_TEST001', ...)
219
+ model.register!
220
+ model.id # => '5ed2118acca8ce0001f1aeg1'
221
+ ```
222
+
223
+ #### List Stations
224
+
225
+ To list all stations, call the client method:
226
+ ```ruby
227
+ client.list_stations # => Array[OpenWeather::Models::Station]
228
+ ```
229
+
230
+ #### Get Station
231
+
232
+ To get a station, call the client method:
233
+ ```ruby
234
+ client.get_station('5ed2118acca8ce0001f1aeg1') # => OpenWeather::Models::Station
235
+ ```
236
+
237
+ #### Update Station
238
+
239
+ To update a station, call the client method:
240
+ ```ruby
241
+ client.update_station('5ed2118acca8ce0001f1aeg1', external_id: 'SF_TEST002') # => OpenWeather::Models::Station
242
+ ```
243
+ Alternatively, call `update!` on an instance of `Station`:
244
+ ```ruby
245
+ model = OpenWeather::Models::Station.new(external_id: 'SF_TEST001', ...)
246
+ model.register!
247
+ model.update!(external_id: 'SF_TEST002')
248
+ model.external_id # => 'SF_TEST002'
249
+ ```
250
+
251
+ #### Delete Station
252
+
253
+ To delete a station, call the client method:
254
+ ```ruby
255
+ data = client.delete_station('5ed2118acca8ce0001f1aeg1') # => nil
256
+ ```
257
+
258
+ #### Create Measurements
259
+
260
+ To create measurements, call the client method:
261
+ ```ruby
262
+ client.create_measurements([
263
+ {
264
+ "station_id": -1,
265
+ "dt": 1479817340,
266
+ "temperature": 18.7,
267
+ "wind_speed": 1.2,
268
+ "wind_gust": 3.4,
269
+ "pressure": 1021,
270
+ "humidity": 87,
271
+ "rain_1h": 2,
272
+ "clouds": [
273
+ {
274
+ "condition": 'NSC'
275
+ }
276
+ ]
277
+ }
278
+ ]) # => nil
279
+ ```
280
+
281
+ #### Get Measurements
282
+
283
+ To get measurements, call the client method with the required parameters:
284
+ ```ruby
285
+ client.get_measurements(
286
+ station_id: '5ed21a12cca8ce0001f1aef1',
287
+ type: 'd',
288
+ limit: 100,
289
+ from: 1469817340,
290
+ to: 1591620047
291
+ ) # => Array[OpenWeather::Models::Stations::Measurement]
292
+ ```
293
+
150
294
  ## Configuration
151
295
 
152
296
  You can configure client options, globally.
@@ -165,7 +309,7 @@ setting | description
165
309
  api_key | Required API key.
166
310
  lang | Default language in API responses.
167
311
  units | Default units in API responses.
168
- endpoint | Defaults to `https://api.openweathermap.org/data/2.5/`.
312
+ endpoint | Defaults to `https://api.openweathermap.org/data`.
169
313
  user_agent | User-agent, defaults to _OpenWeather Ruby Client/version_.
170
314
  proxy | Optional HTTP proxy.
171
315
  ca_path | Optional SSL certificates path.
@@ -181,7 +325,7 @@ The OpenWeather API returns responses in `standard`, `metric`, and `imperial` un
181
325
  ```ruby
182
326
  data = client.weather(id: 2643743, units: 'metric')
183
327
  data.name # => 'London'
184
- data.main.temp # => 12 (degrees Celsius)
328
+ data.main.temp # => 12, degrees Celcius
185
329
  ```
186
330
 
187
331
  ```ruby
@@ -191,7 +335,30 @@ end
191
335
 
192
336
  data = client.weather(id: 2643743)
193
337
  data.name # => 'London'
194
- data.main.temp # => 12 (degrees Celsius)
338
+ data.main.temp # => 12, degrees Celcius
339
+ ```
340
+
341
+ #### Converting Temperature
342
+
343
+ APIs that return temperature support conversion between default, metric and imperial units, regardless of what units were requested. The following example requests current weather in metric units in Moscow. Use `_k` for Kelvin, `_c` for Celcius and `_f` for Farenheit.
344
+
345
+ ```ruby
346
+ data = client.current_weather(city: 'Moscow', units: 'metric') # => OpenWeather::Models::City::Weather
347
+
348
+ data.main.temp_max # => 12, degrees Celcius, metric as requested
349
+ data.main.temp_max_c # => 12, degrees Celcius
350
+ data.main.temp_max_k # => 285.15, degrees Kelvin
351
+ data.main.temp_max_f # => 53.6, degrees Farenheit
352
+ ```
353
+
354
+ #### Converting Wind Speed
355
+
356
+ Use `_mps` for wind speed in meters-per-second, and `_mph` for miles-per-second.
357
+
358
+ ```ruby
359
+ data.wind.speed # => 3, in meters per second, metric as requested
360
+ data.main.speed_mph # => 6.71, miles per hour
361
+ data.main.speed_mps # 3, meters per second
195
362
  ```
196
363
 
197
364
  ### Language
@@ -214,7 +381,7 @@ data.name # => 'Лондон'
214
381
 
215
382
  ## Errors
216
383
 
217
- All errors that return HTTP codes 400-600 result in either `Faraday::Error::ResourceNotFound`, `Faraday::Error::ConnectionFailed` or [OpenWeather::Errors::Fault](lib/open_weather/errors/fault.rb) exceptions.
384
+ All errors that return HTTP codes 400-600 result in either `Faraday::ResourceNotFound`, `Faraday::ConnectionFailed` or [OpenWeather::Errors::Fault](lib/open_weather/errors/fault.rb) exceptions.
218
385
 
219
386
  ## Resources
220
387
 
@@ -16,13 +16,11 @@ require_relative 'open_weather/logger'
16
16
 
17
17
  require_relative 'open_weather/errors/fault'
18
18
 
19
- require_relative 'open_weather/models/model'
20
-
19
+ require_relative 'open_weather/models'
21
20
  require_relative 'open_weather/raise_error'
22
21
  require_relative 'open_weather/connection'
23
22
  require_relative 'open_weather/request'
24
23
  require_relative 'open_weather/config'
25
24
  require_relative 'open_weather/errors'
26
- require_relative 'open_weather/models'
27
25
  require_relative 'open_weather/endpoints'
28
26
  require_relative 'open_weather/client'
@@ -5,6 +5,8 @@ module OpenWeather
5
5
  include Connection
6
6
  include Request
7
7
  include Endpoints::Current
8
+ include Endpoints::OneCall
9
+ include Endpoints::Stations
8
10
 
9
11
  attr_accessor(*Config::ATTRIBUTES)
10
12
 
@@ -21,11 +21,11 @@ module OpenWeather
21
21
  attr_accessor(*Config::ATTRIBUTES)
22
22
 
23
23
  def reset
24
- self.endpoint = 'https://api.openweathermap.org/data/2.5'
24
+ self.endpoint = 'https://api.openweathermap.org/data'
25
25
  self.api_key = nil
26
26
  self.user_agent = "OpenWeather Ruby Client/#{OpenWeather::VERSION}"
27
- self.ca_path = defined?(OpenSSL) ? OpenSSL::X509::DEFAULT_CERT_DIR : nil
28
- self.ca_file = defined?(OpenSSL) ? OpenSSL::X509::DEFAULT_CERT_FILE : nil
27
+ self.ca_path = nil
28
+ self.ca_file = nil
29
29
  self.proxy = nil
30
30
  self.logger = nil
31
31
  self.timeout = nil
@@ -9,26 +9,31 @@ module OpenWeather
9
9
  end
10
10
 
11
11
  def connection
12
- options = {
13
- headers: headers.merge('Accept' => 'application/json; charset=utf-8')
14
- }
12
+ @connection ||= begin
13
+ options = {
14
+ headers: headers.merge(
15
+ 'Accept' => 'application/json; charset=utf-8',
16
+ 'Content-Type' => 'application/json'
17
+ )
18
+ }
15
19
 
16
- options[:headers]['User-Agent'] = user_agent if user_agent
17
- options[:proxy] = proxy if proxy
18
- options[:ssl] = { ca_path: ca_path, ca_file: ca_file } if ca_path || ca_file
20
+ options[:headers]['User-Agent'] = user_agent if user_agent
21
+ options[:proxy] = proxy if proxy
22
+ options[:ssl] = { ca_path: ca_path, ca_file: ca_file } if ca_path || ca_file
19
23
 
20
- request_options = {}
21
- request_options[:timeout] = timeout if timeout
22
- request_options[:open_timeout] = open_timeout if open_timeout
23
- options[:request] = request_options if request_options.any?
24
+ request_options = {}
25
+ request_options[:timeout] = timeout if timeout
26
+ request_options[:open_timeout] = open_timeout if open_timeout
27
+ options[:request] = request_options if request_options.any?
24
28
 
25
- ::Faraday::Connection.new(endpoint, options) do |connection|
26
- connection.use ::Faraday::Request::Multipart
27
- connection.use ::Faraday::Request::UrlEncoded
28
- connection.use ::OpenWeather::Response::RaiseError
29
- connection.use ::FaradayMiddleware::ParseJson, content_type: /\bjson$/
30
- connection.response :logger, logger if logger
31
- connection.adapter ::Faraday.default_adapter
29
+ ::Faraday::Connection.new(endpoint, options) do |connection|
30
+ connection.use ::Faraday::Request::Multipart
31
+ connection.use ::Faraday::Request::UrlEncoded
32
+ connection.use ::OpenWeather::Response::RaiseError
33
+ connection.use ::FaradayMiddleware::ParseJson, content_type: /\bjson$/
34
+ connection.response :logger, logger if logger
35
+ connection.adapter ::Faraday.default_adapter
36
+ end
32
37
  end
33
38
  end
34
39
  end
@@ -38,7 +38,7 @@ module OpenWeather
38
38
  options.delete(:country)
39
39
  ].compact.join(',')
40
40
  end
41
- OpenWeather::Models::CityWeather.new(get('weather', options))
41
+ OpenWeather::Models::City::Weather.new(get('2.5/weather', options), options)
42
42
  end
43
43
 
44
44
  def current_cities_geo_box(*args)
@@ -51,7 +51,7 @@ module OpenWeather
51
51
  options.delete(:lat_top),
52
52
  options.delete(:zoom)
53
53
  ].join(',')
54
- OpenWeather::Models::List.new(get('box/city', options))
54
+ OpenWeather::Models::List.new(get('2.5/box/city', options), options)
55
55
  end
56
56
 
57
57
  def current_cities_geo_circle(*args)
@@ -63,7 +63,7 @@ module OpenWeather
63
63
  options[:cnt] = args.shift || 1
64
64
  end
65
65
 
66
- OpenWeather::Models::List.new(get('find', options))
66
+ OpenWeather::Models::List.new(get('2.5/find', options), options)
67
67
  end
68
68
 
69
69
  def current_cities_id(*args)
@@ -71,7 +71,7 @@ module OpenWeather
71
71
  options[:id] = args.join(',') if args.any?
72
72
  options[:id] = options.delete(:ids) if options.key?(:ids)
73
73
  options[:id] = options[:id].join(',') if options[:id].is_a?(Array)
74
- OpenWeather::Models::List.new(get('group', options))
74
+ OpenWeather::Models::List.new(get('2.5/group', options), options)
75
75
  end
76
76
  end
77
77
  end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module OpenWeather
4
+ module Endpoints
5
+ module OneCall
6
+ def one_call(lat, lon = nil, options = {})
7
+ options = lat.is_a?(Hash) ? options.merge(lat) : options.merge(lat: lat, lon: lon)
8
+ options[:exclude] = options[:exclude].join(',') if options[:exclude].is_a?(Array)
9
+ options[:dt] = options[:dt].to_i if options[:dt].is_a?(Time)
10
+ path = options.key?(:dt) ? '2.5/onecall/timemachine' : '2.5/onecall'
11
+ OpenWeather::Models::OneCall::Weather.new(get(path, options), options)
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,53 @@
1
+ # frozen_string_literal: true
2
+
3
+ module OpenWeather
4
+ module Endpoints
5
+ module Stations
6
+ def register_station(options = {})
7
+ OpenWeather::Models::Station.new(post('3.0/stations', options))
8
+ end
9
+
10
+ def list_stations
11
+ get('3.0/stations').map { |data| OpenWeather::Models::Station.new(data) }
12
+ end
13
+
14
+ def get_station(id)
15
+ validate_id(id)
16
+
17
+ OpenWeather::Models::Station.new(get("3.0/stations/#{id}"))
18
+ end
19
+
20
+ def update_station(id, options = {})
21
+ validate_id(id)
22
+
23
+ OpenWeather::Models::Station.new(put("3.0/stations/#{id}", options))
24
+ end
25
+
26
+ def delete_station(id)
27
+ validate_id(id)
28
+
29
+ delete("3.0/stations/#{id}")
30
+ nil
31
+ end
32
+
33
+ def create_measurements(measurements, options = {})
34
+ post('3.0/measurements', options.merge(body: measurements))
35
+ nil
36
+ end
37
+
38
+ def get_measurements(options)
39
+ required_keys = %i[station_id type limit from to]
40
+ missing_keys = required_keys - options.keys
41
+ raise ArgumentError, "Missing params: #{missing_keys.join(', ')}" if missing_keys.any?
42
+
43
+ get('3.0/measurements', options).map { |m| OpenWeather::Models::Stations::Measurement.new(m) }
44
+ end
45
+
46
+ private
47
+
48
+ def validate_id(id)
49
+ raise ArgumentError, 'Invalid ID' unless id&.is_a?(String)
50
+ end
51
+ end
52
+ end
53
+ end
@@ -1,3 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative 'endpoints/current'
4
+ require_relative 'endpoints/one_call'
5
+ require_relative 'endpoints/stations'
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ module OpenWeather
4
+ module Models
5
+ module City
6
+ class Weather < Model
7
+ property 'coord'
8
+ property 'weather'
9
+ property 'base' # internal parameter
10
+ property 'main'
11
+ property 'visibility'
12
+ property 'wind'
13
+ property 'clouds'
14
+ property 'rain'
15
+ property 'snow'
16
+ property 'dt', transform_with: ->(v) { Time.at(v).utc } # time of data calculation, UTC
17
+ property 'sys'
18
+ property 'id' # city id
19
+ property 'timezone' # shift in seconds from UTC
20
+ property 'name' # city name
21
+ property 'cod' # internal parameter
22
+
23
+ def initialize(args = nil, options = {})
24
+ super args, options
25
+
26
+ self.coord = OpenWeather::Models::Coord.new(coord, options) if coord
27
+ self.weather = weather.map { |i| OpenWeather::Models::Weather.new(i, options) } if weather
28
+ self.main = OpenWeather::Models::Main.new(main, options) if main
29
+ self.wind = OpenWeather::Models::Wind.new(wind, options) if wind
30
+ self.clouds = OpenWeather::Models::Clouds.new(clouds, options) if clouds
31
+ self.rain = OpenWeather::Models::Rain.new(rain, options) if rain
32
+ self.snow = OpenWeather::Models::Snow.new(snow, options) if snow
33
+ self.sys = OpenWeather::Models::Sys.new(sys, options) if sys
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,3 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'city/weather'
@@ -8,9 +8,15 @@ module OpenWeather
8
8
  property 'cod'
9
9
  property 'calctime'
10
10
  property 'cnt', from: 'count'
11
- property 'list', transform_with: ->(v) { v.map { |i| OpenWeather::Models::CityWeather.new(i) } }
11
+ property 'list'
12
12
  property 'message'
13
13
 
14
+ def initialize(args = nil, options = {})
15
+ super args, options
16
+
17
+ self.list = list.map { |i| OpenWeather::Models::City::Weather.new(i, options) } if list
18
+ end
19
+
14
20
  def each(&block)
15
21
  list.each(&block)
16
22
  end
@@ -3,12 +3,12 @@
3
3
  module OpenWeather
4
4
  module Models
5
5
  class Main < Model
6
- property 'temp' # temperature in requested unit
6
+ temperature_property 'temp' # temperature in requested unit
7
7
  property 'pressure' # atmospheric pressure on the sea_level or grnd_level when unavailable, hPa
8
8
  property 'humidity' # humidity in %
9
- property 'feels_like' # temperature, accounting for the human perception of weather, in requested unit
10
- property 'temp_min' # minimal currently observed temperature
11
- property 'temp_max' # maximal currently observed temperature
9
+ temperature_property 'feels_like' # temperature, accounting for the human perception of weather, in requested unit
10
+ temperature_property 'temp_min' # minimal currently observed temperature
11
+ temperature_property 'temp_max' # maximal currently observed temperature
12
12
  property 'sea_level' # atmospheric pressure on the sea level, hPa
13
13
  property 'grnd_level' # atmospheric pressure on the ground level, hPa
14
14
  end
@@ -0,0 +1,45 @@
1
+ # frozen_string_literal: true
2
+
3
+ module OpenWeather
4
+ module Models
5
+ module Mixins
6
+ module Speed
7
+ extend ActiveSupport::Concern
8
+
9
+ class_methods do
10
+ def speed_property(field)
11
+ property field
12
+
13
+ define_method "#{field}_mps" do
14
+ to_meters_per_sec(send(field))
15
+ end
16
+
17
+ define_method "#{field}_mph" do
18
+ to_miles_per_hour(send(field))
19
+ end
20
+ end
21
+ end
22
+
23
+ private
24
+
25
+ def to_meters_per_sec(value)
26
+ case units
27
+ when :imperial
28
+ (value.to_f / 2.23694).round(2)
29
+ else
30
+ value
31
+ end
32
+ end
33
+
34
+ def to_miles_per_hour(value)
35
+ case units
36
+ when :metric
37
+ (value * 2.23694).round(2)
38
+ else
39
+ value
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,64 @@
1
+ # frozen_string_literal: true
2
+
3
+ module OpenWeather
4
+ module Models
5
+ module Mixins
6
+ module Temp
7
+ extend ActiveSupport::Concern
8
+
9
+ class_methods do
10
+ def temperature_property(field)
11
+ property field
12
+
13
+ define_method "#{field}_k" do
14
+ to_kelvin(send(field))
15
+ end
16
+
17
+ define_method "#{field}_c" do
18
+ to_celcius(send(field))
19
+ end
20
+
21
+ define_method "#{field}_f" do
22
+ to_farenheit(send(field))
23
+ end
24
+ end
25
+ end
26
+
27
+ private
28
+
29
+ def to_kelvin(value)
30
+ case units
31
+ when :metric
32
+ (value.to_f + 273.15).round(2)
33
+ when :imperial
34
+ ((value.to_f - 32) * 5 / 9 + 273.15).round(2)
35
+ else
36
+ value
37
+ end
38
+ end
39
+
40
+ def to_celcius(value)
41
+ case units
42
+ when :metric
43
+ value
44
+ when :imperial
45
+ ((value.to_f - 32) * 5 / 9).round(2)
46
+ else
47
+ (value.to_f - 273.15).round(2)
48
+ end
49
+ end
50
+
51
+ def to_farenheit(value)
52
+ case units
53
+ when :metric
54
+ ((value.to_f * 9 / 5) + 32).round(2)
55
+ when :imperial
56
+ value
57
+ else
58
+ ((value.to_f - 273.15) * 9 / 5 + 32).round(2)
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'mixins/temp'
4
+ require_relative 'mixins/speed'
@@ -4,6 +4,20 @@ module OpenWeather
4
4
  module Models
5
5
  class Model < Hashie::Trash
6
6
  include Hashie::Extensions::IgnoreUndeclared
7
+ include OpenWeather::Models::Mixins::Temp
8
+ include OpenWeather::Models::Mixins::Speed
9
+
10
+ attr_reader :options
11
+
12
+ def initialize(args = nil, options = {})
13
+ transformed_args = args.respond_to?(:transform_keys) ? args.transform_keys(&:to_s) : args
14
+ super transformed_args
15
+ @options = { units: OpenWeather.config.units }.merge(options || {})
16
+ end
17
+
18
+ def units
19
+ options && options[:units]&.to_sym
20
+ end
7
21
  end
8
22
  end
9
23
  end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ module OpenWeather
4
+ module Models
5
+ module OneCall
6
+ class CurrentWeather < Model
7
+ property 'dt', transform_with: ->(v) { Time.at(v).utc } # time of the forecasted data UTC
8
+ property 'sunrise', transform_with: ->(v) { Time.at(v).utc } # sunrise time, UTC
9
+ property 'sunset', transform_with: ->(v) { Time.at(v).utc } # sunset time, UTC
10
+ temperature_property 'temp' # temperature
11
+ temperature_property 'feels_like' # temperature, accounts for the human perception of weather
12
+ property 'pressure' # atmospheric pressure on the sea level, hPa
13
+ property 'humidity' # humidity, %
14
+ temperature_property 'dew_point' # atmospheric temperature (varying according to pressure and humidity) below which water droplets begin to condense and dew can form
15
+ property 'clouds' # cloudiness, %
16
+ property 'uvi' # UV index
17
+ property 'visibility' # average visibility, meters
18
+ speed_property 'wind_speed' # wind speed
19
+ speed_property 'wind_gust' # wind gust
20
+ property 'wind_deg' # wind direction, degrees (meteorological)
21
+ property 'rain'
22
+ property 'snow'
23
+ property 'weather'
24
+
25
+ def initialize(args = nil, options = {})
26
+ super args, options
27
+
28
+ self.rain = OpenWeather::Models::Rain.new(rain, options) if rain
29
+ self.snow = OpenWeather::Models::Snow.new(snow, options) if snow
30
+ self.weather = weather.map { |i| OpenWeather::Models::Weather.new(i, options) } if weather
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ module OpenWeather
4
+ module Models
5
+ module OneCall
6
+ class DailyWeather < Model
7
+ property 'dt', transform_with: ->(v) { Time.at(v).utc } # time of the forecasted data UTC
8
+ property 'sunrise', transform_with: ->(v) { Time.at(v).utc } # sunrise time, UTC
9
+ property 'sunset', transform_with: ->(v) { Time.at(v).utc } # sunset time, UTC
10
+ property 'temp'
11
+ property 'feels_like'
12
+ property 'pressure' # atmospheric pressure on the sea level, hPa
13
+ property 'humidity' # humidity, %
14
+ temperature_property 'dew_point' # atmospheric temperature (varying according to pressure and humidity) below which water droplets begin to condense and dew can form
15
+ speed_property 'wind_speed' # wind speed
16
+ speed_property 'wind_gust' # wind gust
17
+ property 'wind_deg' # wind direction, degrees (meteorological)
18
+ property 'clouds' # cloudiness, %
19
+ property 'uvi' # UV index
20
+ property 'rain' # precipitation volume, mm
21
+ property 'snow' # snow volume, mm
22
+ property 'weather'
23
+
24
+ def initialize(args = nil, options = {})
25
+ super args, options
26
+
27
+ self.temp = OpenWeather::Models::OneCall::Temp.new(temp, options) if temp
28
+ self.feels_like = OpenWeather::Models::OneCall::FeelsLike.new(feels_like, options) if feels_like
29
+ self.weather = weather.map { |i| OpenWeather::Models::Weather.new(i, options) } if weather
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ module OpenWeather
4
+ module Models
5
+ module OneCall
6
+ class FeelsLike < Model
7
+ temperature_property 'morn'
8
+ temperature_property 'day'
9
+ temperature_property 'eve'
10
+ temperature_property 'night'
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ module OpenWeather
4
+ module Models
5
+ module OneCall
6
+ class HourlyWeather < Model
7
+ property 'dt', transform_with: ->(v) { Time.at(v).utc } # Time of the forecasted data UTC
8
+ temperature_property 'temp'
9
+ temperature_property 'feels_like'
10
+ property 'pressure' # atmospheric pressure on the sea level, hPa
11
+ property 'humidity' # humidity, %
12
+ temperature_property 'dew_point' # atmospheric temperature (varying according to pressure and humidity) below which water droplets begin to condense and dew can form
13
+ property 'clouds' # cloudiness, %
14
+ property 'visibility' # average visibility, meters
15
+ speed_property 'wind_speed' # wind speed.
16
+ speed_property 'wind_gust' # wind gust.
17
+ property 'wind_deg' # wind direction, degrees (meteorological)
18
+ property 'rain'
19
+ property 'snow'
20
+ property 'weather'
21
+
22
+ def initialize(args = nil, options = {})
23
+ super args, options
24
+
25
+ self.rain = OpenWeather::Models::Rain.new(rain, options) if rain
26
+ self.snow = OpenWeather::Models::Snow.new(snow, options) if snow
27
+ self.weather = weather.map { |i| OpenWeather::Models::Weather.new(i, options) } if weather
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ module OpenWeather
4
+ module Models
5
+ module OneCall
6
+ class MinutelyWeather < Model
7
+ property 'dt', transform_with: ->(v) { Time.at(v).utc } # time of the forecasted data UTC
8
+ property 'precipitation'
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module OpenWeather
4
+ module Models
5
+ module OneCall
6
+ class Temp < Model
7
+ temperature_property 'morn'
8
+ temperature_property 'day'
9
+ temperature_property 'eve'
10
+ temperature_property 'night'
11
+ temperature_property 'min'
12
+ temperature_property 'max'
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ module OpenWeather
4
+ module Models
5
+ module OneCall
6
+ class Weather < Model
7
+ property 'lat' # geographical coordinates of the location (latitude)
8
+ property 'lon' # geographical coordinates of the location (longitude)
9
+ property 'timezone' # timezone name for the requested location
10
+ property 'current' # current weather
11
+ property 'minutely' # minute forecast weather
12
+ property 'hourly' # hourly forecast weather
13
+ property 'daily' # daily forecast weather
14
+
15
+ def initialize(args = nil, options = {})
16
+ super args, options
17
+
18
+ self.current = OpenWeather::Models::OneCall::CurrentWeather.new(current, options) if current
19
+ self.minutely = minutely.map { |i| OpenWeather::Models::OneCall::MinutelyWeather.new(i, options) } if minutely
20
+ self.hourly = hourly.map { |i| OpenWeather::Models::OneCall::HourlyWeather.new(i, options) } if hourly
21
+ self.daily = daily.map { |i| OpenWeather::Models::OneCall::DailyWeather.new(i, options) } if daily
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'one_call/temp'
4
+ require_relative 'one_call/feels_like'
5
+ require_relative 'one_call/current_weather'
6
+ require_relative 'one_call/daily_weather'
7
+ require_relative 'one_call/hourly_weather'
8
+ require_relative 'one_call/minutely_weather'
9
+ require_relative 'one_call/weather'
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ module OpenWeather
4
+ module Models
5
+ class Station < Model
6
+ property 'id', from: 'ID' # internal identifier for the station
7
+ property 'external_id' # external identifier for the station
8
+ property 'name' # name of the station
9
+ property 'latitude' # geographical coordinates of the location (latitude)
10
+ property 'longitude' # geographical coordinates of the location (longitude)
11
+ property 'altitude' # height of station above sea level
12
+ property 'created_at' # timestamp when station was created
13
+ property 'updated_at' # timestamp when station was updated
14
+ property 'rank' # rank of station
15
+
16
+ def register!
17
+ data = OpenWeather::Client.new.register_station(to_h)
18
+ update_attributes!(data)
19
+
20
+ self
21
+ end
22
+
23
+ def update!(attributes)
24
+ data = OpenWeather::Client.new.update_station(id, attributes)
25
+ update_attributes!(data)
26
+
27
+ self
28
+ end
29
+
30
+ def delete!
31
+ OpenWeather::Client.new.delete_station(id)
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ module OpenWeather
4
+ module Models
5
+ module Stations
6
+ class Humidity < Model
7
+ property 'average'
8
+ property 'weight'
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ module OpenWeather
4
+ module Models
5
+ module Stations
6
+ class Measurement < Model
7
+ property 'station_id' # The internal ID of the station
8
+ property 'type' # Type of the aggregated data - minute, hour or day. Specifies the letters m, h or d respectively
9
+ property 'date' # Time of measurement
10
+ property 'temp'
11
+ property 'humidity'
12
+ property 'wind'
13
+ property 'precipitation'
14
+ property 'pressure'
15
+
16
+ def initialize(args = nil, options = {})
17
+ super args, options
18
+
19
+ self.temp = OpenWeather::Models::Stations::Temp.new(temp, options) if temp
20
+ self.humidity = OpenWeather::Models::Stations::Humidity.new(humidity, options) if humidity
21
+ self.pressure = OpenWeather::Models::Stations::Pressure.new(pressure, options) if pressure
22
+ self.precipitation = OpenWeather::Models::Stations::Precipitation.new(precipitation, options) if precipitation
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module OpenWeather
4
+ module Models
5
+ module Stations
6
+ class Precipitation < Model
7
+ property 'rain'
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ module OpenWeather
4
+ module Models
5
+ module Stations
6
+ class Pressure < Model
7
+ property 'min'
8
+ property 'max'
9
+ property 'average'
10
+ property 'weight'
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ module OpenWeather
4
+ module Models
5
+ module Stations
6
+ class Temp < Model
7
+ temperature_property 'min'
8
+ temperature_property 'max'
9
+ temperature_property 'average'
10
+ property 'weight'
11
+ end
12
+ end
13
+ end
14
+ end
@@ -3,6 +3,7 @@
3
3
  module OpenWeather
4
4
  module Models
5
5
  class Sys < Model
6
+ property 'timezone' # shift in seconds from UTC
6
7
  property 'type' # internal parameter
7
8
  property 'id' # internal parameter
8
9
  property 'message' # internal parameter
@@ -6,6 +6,7 @@ module OpenWeather
6
6
  property 'id' # weather condition id
7
7
  property 'main' # group of weather parameters (Rain, Snow, Extreme, etc.)
8
8
  property 'description' # weather condition within the group, in your language
9
+ property 'icon_uri', from: 'icon', transform_with: ->(v) { URI.parse("http://openweathermap.org/img/wn/#{v}@2x.png") }
9
10
  property 'icon' # weather icon id
10
11
  end
11
12
  end
@@ -3,7 +3,7 @@
3
3
  module OpenWeather
4
4
  module Models
5
5
  class Wind < Model
6
- property 'speed' # wind speed in meter/sec or miles/hour
6
+ speed_property 'speed' # wind speed in meter/sec or miles/hour
7
7
  property 'deg' # wind direction in degrees (meteorological)
8
8
  end
9
9
  end
@@ -1,9 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require_relative 'models/mixins'
3
4
  require_relative 'models/model'
4
5
  require_relative 'models/clouds'
5
6
  require_relative 'models/coord'
6
- require_relative 'models/city_weather'
7
7
  require_relative 'models/main'
8
8
  require_relative 'models/sys'
9
9
  require_relative 'models/weather'
@@ -11,3 +11,11 @@ require_relative 'models/wind'
11
11
  require_relative 'models/rain'
12
12
  require_relative 'models/snow'
13
13
  require_relative 'models/list'
14
+ require_relative 'models/city'
15
+ require_relative 'models/one_call'
16
+ require_relative 'models/station'
17
+ require_relative 'models/stations/measurement'
18
+ require_relative 'models/stations/temp'
19
+ require_relative 'models/stations/humidity'
20
+ require_relative 'models/stations/pressure'
21
+ require_relative 'models/stations/precipitation'
@@ -6,10 +6,10 @@ module OpenWeather
6
6
  def on_complete(env)
7
7
  case env[:status]
8
8
  when 404
9
- raise Faraday::Error::ResourceNotFound, response_values(env)
9
+ raise Faraday::ResourceNotFound, response_values(env)
10
10
  when 407
11
11
  # mimic the behavior that we get with proxy requests with HTTPS
12
- raise Faraday::Error::ConnectionFailed, %(407 "Proxy Authentication Required ")
12
+ raise Faraday::ConnectionFailed, %(407 "Proxy Authentication Required ")
13
13
  when (400...600).freeze
14
14
  raise OpenWeather::Errors::Fault, response_values(env)
15
15
  end
@@ -20,6 +20,14 @@ module OpenWeather
20
20
 
21
21
  private
22
22
 
23
+ #
24
+ # @param [Symbol] method - Faraday HTTP method.
25
+ # @param [String] path - URL to send.
26
+ # @param [Hash] options - :appid, :lang, :units, :endpoint, :body keys will configure the request.
27
+ # The rest will be converted to query params for GET/DELETE, or jsonified for POST/PUT.
28
+ #
29
+ # @return [Object] - the Faraday::Response#body.
30
+ #
23
31
  def request(method, path, options)
24
32
  options = options.dup
25
33
  options[:appid] ||= api_key if api_key.present?
@@ -33,7 +41,12 @@ module OpenWeather
33
41
  request.url(path, options)
34
42
  when :post, :put
35
43
  request.path = path
36
- request.body = options unless options.empty?
44
+ request.params = { appid: options.delete(:appid) }
45
+ if options.key?(:body)
46
+ request.body = options.delete(:body).to_json
47
+ elsif !options.empty?
48
+ request.body = options.to_json
49
+ end
37
50
  end
38
51
  request.options.merge!(options.delete(:request)) if options.key?(:request)
39
52
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module OpenWeather
4
- VERSION = '0.1.0'
4
+ VERSION = '0.3.0'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: open-weather-ruby-client
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Daniel Doubrovkine
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-05-01 00:00:00.000000000 Z
11
+ date: 2023-03-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -30,14 +30,14 @@ dependencies:
30
30
  requirements:
31
31
  - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: '0.9'
33
+ version: 1.0.0
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - ">="
39
39
  - !ruby/object:Gem::Version
40
- version: '0.9'
40
+ version: 1.0.0
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: faraday_middleware
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -66,7 +66,7 @@ dependencies:
66
66
  - - ">="
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
- description:
69
+ description:
70
70
  email: dblock@dblock.org
71
71
  executables: []
72
72
  extensions: []
@@ -81,18 +81,38 @@ files:
81
81
  - lib/open_weather/connection.rb
82
82
  - lib/open_weather/endpoints.rb
83
83
  - lib/open_weather/endpoints/current.rb
84
+ - lib/open_weather/endpoints/one_call.rb
85
+ - lib/open_weather/endpoints/stations.rb
84
86
  - lib/open_weather/errors.rb
85
87
  - lib/open_weather/errors/fault.rb
86
88
  - lib/open_weather/logger.rb
87
89
  - lib/open_weather/models.rb
88
- - lib/open_weather/models/city_weather.rb
90
+ - lib/open_weather/models/city.rb
91
+ - lib/open_weather/models/city/weather.rb
89
92
  - lib/open_weather/models/clouds.rb
90
93
  - lib/open_weather/models/coord.rb
91
94
  - lib/open_weather/models/list.rb
92
95
  - lib/open_weather/models/main.rb
96
+ - lib/open_weather/models/mixins.rb
97
+ - lib/open_weather/models/mixins/speed.rb
98
+ - lib/open_weather/models/mixins/temp.rb
93
99
  - lib/open_weather/models/model.rb
100
+ - lib/open_weather/models/one_call.rb
101
+ - lib/open_weather/models/one_call/current_weather.rb
102
+ - lib/open_weather/models/one_call/daily_weather.rb
103
+ - lib/open_weather/models/one_call/feels_like.rb
104
+ - lib/open_weather/models/one_call/hourly_weather.rb
105
+ - lib/open_weather/models/one_call/minutely_weather.rb
106
+ - lib/open_weather/models/one_call/temp.rb
107
+ - lib/open_weather/models/one_call/weather.rb
94
108
  - lib/open_weather/models/rain.rb
95
109
  - lib/open_weather/models/snow.rb
110
+ - lib/open_weather/models/station.rb
111
+ - lib/open_weather/models/stations/humidity.rb
112
+ - lib/open_weather/models/stations/measurement.rb
113
+ - lib/open_weather/models/stations/precipitation.rb
114
+ - lib/open_weather/models/stations/pressure.rb
115
+ - lib/open_weather/models/stations/temp.rb
96
116
  - lib/open_weather/models/sys.rb
97
117
  - lib/open_weather/models/weather.rb
98
118
  - lib/open_weather/models/wind.rb
@@ -103,7 +123,7 @@ homepage: http://github.com/dblock/open-weather-ruby-client
103
123
  licenses:
104
124
  - MIT
105
125
  metadata: {}
106
- post_install_message:
126
+ post_install_message:
107
127
  rdoc_options: []
108
128
  require_paths:
109
129
  - lib
@@ -118,8 +138,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
118
138
  - !ruby/object:Gem::Version
119
139
  version: 1.3.6
120
140
  requirements: []
121
- rubygems_version: 3.0.3
122
- signing_key:
141
+ rubygems_version: 3.1.3
142
+ signing_key:
123
143
  specification_version: 4
124
144
  summary: OpenWeather API Ruby client.
125
145
  test_files: []
@@ -1,23 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module OpenWeather
4
- module Models
5
- class CityWeather < Model
6
- property 'coord', transform_with: ->(v) { OpenWeather::Models::Coord.new(v) }
7
- property 'weather', transform_with: ->(v) { v.map { |i| OpenWeather::Models::Weather.new(i) } }
8
- property 'base' # internal parameter
9
- property 'main', transform_with: ->(v) { OpenWeather::Models::Main.new(v) }
10
- property 'visibility'
11
- property 'wind', transform_with: ->(v) { OpenWeather::Models::Wind.new(v) }
12
- property 'clouds', transform_with: ->(v) { OpenWeather::Models::Clouds.new(v) }
13
- property 'rain', transform_with: ->(v) { OpenWeather::Models::Rain.new(v) }
14
- property 'snow', transform_with: ->(v) { OpenWeather::Models::Snow.new(v) }
15
- property 'dt', transform_with: ->(v) { Time.at(v).utc } # time of data calculation, UTC
16
- property 'sys', transform_with: ->(v) { OpenWeather::Models::Sys.new(v) }
17
- property 'id' # city id
18
- property 'timezone' # shift in seconds from UTC
19
- property 'name' # city name
20
- property 'cod' # internal parameter
21
- end
22
- end
23
- end