open-weather-ruby-client 0.5.0 → 0.6.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 50db5335dc75a5a05dceb8c71b9de5a46b325e15f3a4a7a61ea04e7667be4937
4
- data.tar.gz: f0666d4eab1829d74d4a76c0ea484e8b555199ffdbfd6684f0dd259587e2f930
3
+ metadata.gz: 3c8876fceee8fa7e6f946be1b82161cfbfc8ef8b4aad00497d62b92eade54d63
4
+ data.tar.gz: 9ca8ab329c506558cde05eb20c33c29c6a88f9b8f74816d560e23afbeb07e270
5
5
  SHA512:
6
- metadata.gz: d6cb7dc0addc30dbc76108b055ac1a36dcc5b9d91049af28ce8ee3c5e046c19a0431218ce037f2f7d1be550ae06c7faddf8ff33073a924b767d6ac4edcaed158
7
- data.tar.gz: 818a28e582b0f359ce1005fcc0fead12135a2f0b1c8f0d2cd8a46dbebf11e66901937a351b09ce66589d9f98525a53cdc3c476a164e1f8ab98a259f183f2e68c
6
+ metadata.gz: 319c7c0dd8477f8ba00efae26150a56a390a7ca15e5522a87d46b80896a16356406df8d07a4a9f79969e0008be79850683aa13bc8e29ee62f42b5892594bc0da
7
+ data.tar.gz: 7b085b56ec87b9f397b83b49946cc4ed91fe52c24797a8b43dd643d3634285da4cf0fd95b46796c17cb98578e75c5d6928be0b1033fd117e50722706f60a9005
data/CHANGELOG.md CHANGED
@@ -1,3 +1,10 @@
1
+ ### 0.6.0 (2024/10/19)
2
+
3
+ * [#40](https://github.com/dblock/open-weather-ruby-client/pull/40): Fixing rubocop violations and improved .rubocop.yml - [@troya2](https://github.com/troya2).
4
+ * [#41](https://github.com/dblock/open-weather-ruby-client/pull/41): Added additional tests for hourly forecast that include all data types - i.e. rain and snow - [@troya2](https://github.com/troya2).
5
+ * [#42](https://github.com/dblock/open-weather-ruby-client/pull/42): Added support for the thirty day forecast in the pro 2.5 API - [@troya2](https://github.com/troya2).
6
+ * [#45](https://github.com/dblock/open-weather-ruby-client/pull/45): Added support for One Call 3.0 API on base plan - [@dblock](https://github.com/dblock).
7
+
1
8
  ### 0.5.0 (2024/07/03)
2
9
 
3
10
  * [#25](https://github.com/dblock/open-weather-ruby-client/pull/25): Exposed the national weather alerts response in the One Call API - [@troya2](https://github.com/troya2).
data/README.md CHANGED
@@ -21,6 +21,7 @@ Unlike other clients, including [open-weather](https://github.com/coderhs/ruby_o
21
21
  - [Current and Forecast Weather](#current-and-forecast-weather)
22
22
  - [Historical Weather](#historical-weather)
23
23
  - [Hourly Forecast (Pro)](#hourly-forecast-pro)
24
+ - [30 Day Forecast (Pro)](#30-day-forecast-pro)
24
25
  - [Stations](#stations)
25
26
  - [Register a Station](#register-a-station)
26
27
  - [List Stations](#list-stations)
@@ -192,6 +193,7 @@ data.lat # => 33.44
192
193
  data.lon # => -94.04
193
194
  data.timezone # => 'America/Chicago'
194
195
  data.current # => OpenWeather::Models::OneCall::CurrentWeather
196
+ data.data # => Array]OpenWeather::Models::OneCall::CurrentWeather] (on base plan)
195
197
  data.minutely # => Array[OpenWeather::Models::OneCall::MinutelyWeather]
196
198
  data.hourly # => Array[OpenWeather::Models::OneCall::HourlyWeather]
197
199
  data.daily # => Array[OpenWeather::Models::OneCall::DailyWeather]
@@ -218,12 +220,13 @@ data.hourly # => Array[OpenWeather::Models::OneCall::HourlyWeather]
218
220
 
219
221
  ### Hourly Forecast (Pro)
220
222
 
221
- The [Hourly Forecast API](https://openweathermap.org/api/hourly-forecast) provides hourly weather forecast for 4 days. Note: This API requires a piad api-key from [OpenWeather.org](https://openweathermap.org/full-price#current).
223
+ The [Hourly Forecast API](https://openweathermap.org/api/hourly-forecast) provides hourly weather forecast for 4 days. Note: This API requires a paid api-key from [OpenWeather.org](https://openweathermap.org/full-price#current).
222
224
 
223
225
  ```ruby
224
- data = client.client.hourly(lat: 33.5312, lon: -111.9426) # => OpenWeather::Models::Forecast::Hourly
226
+ data = client.client.hourly(lat: 33.5312, lon: -111.9426, appid: "<your api key>") # => OpenWeather::Models::Forecast::Hourly
225
227
 
226
228
  data.cnt # => 96 (number of entries)
229
+ data.city # => OpenWeather::Models::Forecast::City
227
230
  data.list.first # => OpenWeather::Models::Forecast::Forecast
228
231
  data.list.first.dt # => Time
229
232
  data.list.first.main # => OpenWeather::Models::Forecast::Main
@@ -238,6 +241,31 @@ data.list.first.sys # => OpenWeather::Models::Forecast::Sys or nil
238
241
  data.list.first.dt_txt # => String (Time of data forecasted, ISO, UTC)
239
242
  ```
240
243
 
244
+ ### 30 Day Forecast (Pro)
245
+
246
+ The [30 Day Forecast API](https://openweathermap.org/api/forecast30) provides daily weather forecast for 30 days. Note: This API requires a paid api-key from [OpenWeather.org](https://openweathermap.org/full-price#current).
247
+
248
+ ```ruby
249
+ data = client.client.forecast(lat: 33.5312, lon: -111.9426, appid: "<your api key>") # => OpenWeather::Models::Forecast::ThirtyDay::ThirtyDay
250
+
251
+ data.cnt # => 30 (number of entries - sometimes this is 29)
252
+ data.city # => OpenWeather::Models::Forecast::City
253
+ data.list.first # => OpenWeather::Models::Forecast::ThirtyDay::Forecast
254
+ data.list.first.dt # => Time - time of data forcasted, UTC
255
+ data.list.first.sunrise # => Time - Sunrise time, UTC
256
+ data.list.first.sunset # => Time - Sunset time, UTC
257
+ data.list.first.temp # => OpenWeather::Models::Forecast::ThirtyDay::Temp
258
+ data.list.first.feels_like # => OpenWeather::Models::OneCall::FeelsLike
259
+ data.list.first.pressure # => int - Atmospheric pressure on the sea level, hPa
260
+ data.list.first.humidity # => int - Humidity, % (e.g. integer 24 means 24% cloudiness)
261
+ data.list.first.weather # => Array[OpenWeather::Models::Weather]
262
+ data.list.first.speed # => double - Wind speed. Unit Default: meter/sec, Metric: meter/sec, Imperial: miles/hour
263
+ data.list.first.deg # => int - Wind direction, degrees (meteorological)
264
+ data.list.first.clouds # => int - Cloudiness, % (e.g. integer 78 means 78% cloudiness)
265
+ data.list.first.rain # => double or nil - Precipitation volume, mm. Please note that only mm as units of measurement are available for this parameter
266
+ data.list.first.snow # => double or nil - Snow volume, mm. Please note that only mm as units of measurement are available for this parameter
267
+ ```
268
+
241
269
  ### Stations
242
270
 
243
271
  The [Stations API](https://openweathermap.org/stations) lets your manage personal weather stations and measurements.
@@ -341,19 +369,19 @@ end
341
369
 
342
370
  The following settings are supported.
343
371
 
344
- setting | description
345
- --------------------|------------
346
- api_key | Required API key.
347
- lang | Default language in API responses.
348
- units | Default units in API responses.
349
- endpoint | Defaults to `https://api.openweathermap.org/data`.
350
- user_agent | User-agent, defaults to _OpenWeather Ruby Client/version_.
351
- proxy | Optional HTTP proxy.
352
- ca_path | Optional SSL certificates path.
353
- ca_file | Optional SSL certificates file.
354
- logger | Optional `Logger` instance that logs HTTP requests.
355
- timeout | Optional open/read timeout in seconds.
356
- open_timeout | Optional connection open timeout in seconds.
372
+ | setting | description |
373
+ | ------------ | ---------------------------------------------------------- |
374
+ | api_key | Required API key. |
375
+ | lang | Default language in API responses. |
376
+ | units | Default units in API responses. |
377
+ | endpoint | Defaults to `https://api.openweathermap.org/data`. |
378
+ | user_agent | User-agent, defaults to _OpenWeather Ruby Client/version_. |
379
+ | proxy | Optional HTTP proxy. |
380
+ | ca_path | Optional SSL certificates path. |
381
+ | ca_file | Optional SSL certificates file. |
382
+ | logger | Optional `Logger` instance that logs HTTP requests. |
383
+ | timeout | Optional open/read timeout in seconds. |
384
+ | open_timeout | Optional connection open timeout in seconds. |
357
385
 
358
386
  ### Units
359
387
 
@@ -6,6 +6,7 @@ module OpenWeather
6
6
  include Request
7
7
  include Endpoints::Current
8
8
  include Endpoints::Hourly
9
+ include Endpoints::ThirtyDayForecast
9
10
  include Endpoints::OneCall
10
11
  include Endpoints::Stations
11
12
 
@@ -46,7 +46,7 @@ module OpenWeather
46
46
  private
47
47
 
48
48
  def validate_id(id)
49
- raise ArgumentError, 'Invalid ID' unless id&.is_a?(String)
49
+ raise ArgumentError, 'Invalid ID' unless id.is_a?(String)
50
50
  end
51
51
  end
52
52
  end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module OpenWeather
4
+ module Endpoints
5
+ module ThirtyDayForecast
6
+ def thirty_day_forecast(lat, lon = nil, options = {})
7
+ # default to the pro endpoint if not specified
8
+ endpoint = options.delete(:endpoint) || pro_endpoint
9
+ options = options.merge(endpoint: endpoint)
10
+
11
+ options = lat.is_a?(Hash) ? options.merge(lat) : options.merge(lat: lat, lon: lon)
12
+ OpenWeather::Models::Forecast::ThirtyDay::ThirtyDay.new(get('2.5/forecast/climate', options), options)
13
+ end
14
+ end
15
+ end
16
+ end
@@ -4,3 +4,4 @@ require_relative 'endpoints/current'
4
4
  require_relative 'endpoints/one_call'
5
5
  require_relative 'endpoints/stations'
6
6
  require_relative 'endpoints/hourly'
7
+ require_relative 'endpoints/thirty_day_forecast'
@@ -6,7 +6,7 @@ module OpenWeather
6
6
  class Logger < ::Logger
7
7
  def self.logger
8
8
  @logger ||= begin
9
- logger = new STDOUT
9
+ logger = new $stdout
10
10
  logger.level = Logger::WARN
11
11
  logger
12
12
  end
@@ -11,6 +11,7 @@ module OpenWeather
11
11
  property 'timezone' # shift in seconds from UTC
12
12
  property 'sunrise', transform_with: ->(v) { Time.at(v).utc } # Sunrise time, UTC
13
13
  property 'sunset', transform_with: ->(v) { Time.at(v).utc } # Sunset time, UTC
14
+ property 'population' # City population
14
15
  end
15
16
  end
16
17
  end
@@ -13,7 +13,7 @@ module OpenWeather
13
13
  property 'rain'
14
14
  property 'snow'
15
15
  property 'visibility' # Average visibility, metres. The maximum value of the visibility is 10km
16
- property 'pop' # Probability of precipitation. The values of the parameter vary between 0 and 1, where 0 is equal to 0%, 1 is equal to 100%
16
+ property 'pop' # Probability of precipitation. Varies from 0 and 1, where 0 is equal to 0%, 1 is equal to 100%
17
17
  property 'sys'
18
18
 
19
19
  def initialize(args = nil, options = {})
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ module OpenWeather
4
+ module Models
5
+ module Forecast
6
+ module ThirtyDay
7
+ class Forecast < Model
8
+ property 'dt', transform_with: ->(v) { Time.at(v).utc } # time of data forcasted, UTC
9
+ property 'sunrise', transform_with: ->(v) { Time.at(v).utc } # Sunrise time, UTC
10
+ property 'sunset', transform_with: ->(v) { Time.at(v).utc } # Sunset time, UTC
11
+ property 'temp' # Array of OpenWeather::Models::Forecast::ThityDay::Temp
12
+ property 'feels_like' # OpenWeather::Models::OneCall::FeelsLike
13
+ property 'pressure' # Atmospheric pressure on the sea level, hPa
14
+ property 'humidity' # Humidity, % (e.g. integer 24 means 24% cloudiness)
15
+ property 'weather' # Array of OpenWeather::Models::Weather
16
+ property 'speed' # Wind speed. Unit Default: meter/sec, Metric: meter/sec, Imperial: miles/hour
17
+ property 'deg' # Wind direction, degrees (meteorological)
18
+ property 'clouds' # Cloudiness, % (e.g. integer 78 means 78% cloudiness)
19
+ property 'rain' # Precipitation volume, mm. Unit will only be in mm
20
+ property 'snow' # Snow volume, mm. Unit will only be in mm
21
+
22
+ def initialize(args = nil, options = {})
23
+ super args, options
24
+
25
+ self.temp = Temp.new(temp, options) if temp
26
+ self.feels_like = OpenWeather::Models::OneCall::FeelsLike.new(feels_like, options) if feels_like
27
+ self.weather = weather.map { |w| OpenWeather::Models::Weather.new(w, options) } if weather
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module OpenWeather
4
+ module Models
5
+ module Forecast
6
+ module ThirtyDay
7
+ class Temp < Model
8
+ temperature_property 'day' # Day temperature. Default: Kelvin, Metric: Celsius, Imperial: Fahrenheit
9
+ temperature_property 'min' # Min daily temperature. Default: Kelvin, Metric: Celsius, Imperial: Fahrenheit
10
+ temperature_property 'max' # Max daily temperature. Default: Kelvin, Metric: Celsius, Imperial: Fahrenheit
11
+ temperature_property 'night' # Night temperature. Default: Kelvin, Metric: Celsius, Imperial: Fahrenheit
12
+ temperature_property 'eve' # Evening temperature. Default: Kelvin, Metric: Celsius, Imperial: Fahrenheit
13
+ temperature_property 'morn' # Morning temperature. Default: Kelvin, Metric: Celsius, Imperial: Fahrenheit
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ module OpenWeather
4
+ module Models
5
+ module Forecast
6
+ module ThirtyDay
7
+ class ThirtyDay < Model
8
+ include Enumerable
9
+
10
+ property 'cod' # Internal parameter
11
+ property 'message' # Internal parameter
12
+ property 'city'
13
+ property 'cnt' # Number of items in list
14
+ property 'list' # List of ??? objects
15
+
16
+ def initialize(args = nil, options = {})
17
+ super args, options
18
+
19
+ self.list = list.map { |forecast| Forecast.new(forecast, options) } if list
20
+ self.city = OpenWeather::Models::Forecast::City.new(city, options) if city
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'thirty_day/thirty_day'
4
+ require_relative 'thirty_day/forecast'
5
+ require_relative 'thirty_day/temp'
@@ -1,5 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative 'forecast/hourly'
4
+ require_relative 'forecast/thirty_day'
4
5
  require_relative 'forecast/forecast'
5
6
  require_relative 'forecast/city'
@@ -31,7 +31,7 @@ module OpenWeather
31
31
  when :metric
32
32
  (value.to_f + 273.15).round(2)
33
33
  when :imperial
34
- ((value.to_f - 32) * 5 / 9 + 273.15).round(2)
34
+ (((value.to_f - 32) * 5 / 9) + 273.15).round(2)
35
35
  else
36
36
  value
37
37
  end
@@ -55,7 +55,7 @@ module OpenWeather
55
55
  when :imperial
56
56
  value
57
57
  else
58
- ((value.to_f - 273.15) * 9 / 5 + 32).round(2)
58
+ (((value.to_f - 273.15) * 9 / 5) + 32).round(2)
59
59
  end
60
60
  end
61
61
  end
@@ -11,7 +11,9 @@ module OpenWeather
11
11
  temperature_property 'feels_like' # temperature, accounts for the human perception of weather
12
12
  property 'pressure' # atmospheric pressure on the sea level, hPa
13
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
14
+ # atmospheric temperature (varying according to pressure and humidity)
15
+ # below which water droplets begin to condense and dew can form
16
+ temperature_property 'dew_point'
15
17
  property 'clouds' # cloudiness, %
16
18
  property 'uvi' # UV index
17
19
  property 'visibility' # average visibility, meters
@@ -11,7 +11,9 @@ module OpenWeather
11
11
  property 'feels_like'
12
12
  property 'pressure' # atmospheric pressure on the sea level, hPa
13
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
14
+ # atmospheric temperature (varying according to pressure and humidity)
15
+ # below which water droplets begin to condense and dew can form
16
+ temperature_property 'dew_point'
15
17
  speed_property 'wind_speed' # wind speed
16
18
  speed_property 'wind_gust' # wind gust
17
19
  property 'wind_deg' # wind direction, degrees (meteorological)
@@ -9,7 +9,9 @@ module OpenWeather
9
9
  temperature_property 'feels_like'
10
10
  property 'pressure' # atmospheric pressure on the sea level, hPa
11
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
12
+ # atmospheric temperature (varying according to pressure and humidity)
13
+ # below which water droplets begin to condense and dew can form
14
+ temperature_property 'dew_point'
13
15
  property 'clouds' # cloudiness, %
14
16
  property 'visibility' # average visibility, meters
15
17
  speed_property 'wind_speed' # wind speed.
@@ -12,11 +12,13 @@ module OpenWeather
12
12
  property 'hourly' # hourly forecast weather
13
13
  property 'daily' # daily forecast weather
14
14
  property 'alerts' # weather alerts for the location
15
+ property 'data' # weather data
15
16
 
16
17
  def initialize(args = nil, options = {})
17
18
  super args, options
18
19
 
19
20
  self.current = OpenWeather::Models::OneCall::CurrentWeather.new(current, options) if current
21
+ self.data = data.map { |i| OpenWeather::Models::OneCall::CurrentWeather.new(i, options) } if data
20
22
  self.minutely = minutely.map { |i| OpenWeather::Models::OneCall::MinutelyWeather.new(i, options) } if minutely
21
23
  self.hourly = hourly.map { |i| OpenWeather::Models::OneCall::HourlyWeather.new(i, options) } if hourly
22
24
  self.daily = daily.map { |i| OpenWeather::Models::OneCall::DailyWeather.new(i, options) } if daily
@@ -5,7 +5,7 @@ module OpenWeather
5
5
  module Stations
6
6
  class Measurement < Model
7
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
8
+ property 'type' # Type of the aggregated data - minute, hour or day - the letters m, h or d respectively
9
9
  property 'date' # Time of measurement
10
10
  property 'temp'
11
11
  property 'humidity'
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module OpenWeather
4
- VERSION = '0.5.0'
4
+ VERSION = '0.6.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.5.0
4
+ version: 0.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Daniel Doubrovkine
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-07-03 00:00:00.000000000 Z
11
+ date: 2024-10-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -210,6 +210,7 @@ files:
210
210
  - lib/open_weather/endpoints/hourly.rb
211
211
  - lib/open_weather/endpoints/one_call.rb
212
212
  - lib/open_weather/endpoints/stations.rb
213
+ - lib/open_weather/endpoints/thirty_day_forecast.rb
213
214
  - lib/open_weather/errors.rb
214
215
  - lib/open_weather/errors/fault.rb
215
216
  - lib/open_weather/logger.rb
@@ -222,6 +223,10 @@ files:
222
223
  - lib/open_weather/models/forecast/city.rb
223
224
  - lib/open_weather/models/forecast/forecast.rb
224
225
  - lib/open_weather/models/forecast/hourly.rb
226
+ - lib/open_weather/models/forecast/thirty_day.rb
227
+ - lib/open_weather/models/forecast/thirty_day/forecast.rb
228
+ - lib/open_weather/models/forecast/thirty_day/temp.rb
229
+ - lib/open_weather/models/forecast/thirty_day/thirty_day.rb
225
230
  - lib/open_weather/models/list.rb
226
231
  - lib/open_weather/models/main.rb
227
232
  - lib/open_weather/models/mixins.rb
@@ -270,7 +275,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
270
275
  - !ruby/object:Gem::Version
271
276
  version: 1.3.6
272
277
  requirements: []
273
- rubygems_version: 3.5.6
278
+ rubygems_version: 3.3.7
274
279
  signing_key:
275
280
  specification_version: 4
276
281
  summary: OpenWeather API Ruby client.