open_weather_client 0.1.0 → 0.1.3

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
  SHA256:
3
- metadata.gz: 7e71860d474b67b88ec968c56ca18bfcd98029b9078bbd73fef481bd1dcf8736
4
- data.tar.gz: 8eb818af6393f4cbbac4dddea37800911ebe58a0dd10bc323f337251596cd088
3
+ metadata.gz: 0dec682ab56d84b58d75c7cee7e1741ea87e5a38e8cedec1ef927b35014108be
4
+ data.tar.gz: ed092b5ca8ddeb5bffdb77d1abcacbb52cc5c37a317cee41aacd4063fd680a25
5
5
  SHA512:
6
- metadata.gz: 85a0e87c06cfa1753b6c3b2baaa251fd864fc03e50af861b86d015dc5a37739f043361c82fafea26794877b0652821a65b27f04efaab905ffb903bca22fedba5
7
- data.tar.gz: 31ad8150d112bfcfd0b7b5e0b62830d3d5336968a76754dad1dc16e255ff0916901fd176fe8557688492101e2ed147392210cda1e4c6dd1920166d3c1bff477b
6
+ metadata.gz: 84de4f4266c121d44033694c6dbca2519db1f87976dd420ec64711831e45957ceb827a33b60a30a045ac6b7734760c85f7404654332c4d22fd9a7fb1423c05be
7
+ data.tar.gz: 037bcb2ff6e0fdf53023520b290fc0cfc821c0184a94208dfd9d108a86852998d5af7ff23a1aa4d8ceb73f2dacc46d9bb64d0e01a7e096c198ff121aab7a2fff
data/.rubocop.yml ADDED
@@ -0,0 +1,6 @@
1
+ AllCops:
2
+ TargetRubyVersion: 3.0
3
+
4
+ Metrics/BlockLength:
5
+ Exclude:
6
+ - spec/**/*
data/CHANGES.md CHANGED
@@ -1,5 +1,19 @@
1
1
  # Open Weather Client Changelog
2
2
 
3
+ ## 0.1.3
4
+ Re-release of 0.1.2 since this version was released from an incorrect branch.
5
+
6
+ ## 0.1.2 [yanked]
7
+ - Enable Rubocop Linter
8
+ - Add caching of requests (#1)
9
+ - Add location quantization (#3)
10
+ - Reset gem before every example in spec (#2)
11
+
12
+ ## 0.1.1
13
+ - Raise `OpenWeatherClient::AuthenticationError` if the request is not authorized
14
+ - Raise `RangeError` if latitude or longitude is out of the allowed range
15
+ - Raise `Faraday::Error` if the request fails otherwise
16
+
3
17
  ## 0.1.0
4
18
  - Initial commit of the Open Weather Client gem
5
19
  - Configuration of OpenWeatherClient
data/Gemfile CHANGED
@@ -1,6 +1,8 @@
1
- source "https://rubygems.org"
1
+ # frozen_string_literal: true
2
2
 
3
- git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
3
+ source 'https://rubygems.org'
4
+
5
+ git_source(:github) { |repo_name| "https://github.com/#{repo_name}" }
4
6
 
5
7
  # Specify your gem's dependencies in open_weather_client.gemspec
6
8
  gemspec
data/README.md CHANGED
@@ -3,7 +3,7 @@
3
3
  [![Gem Version](https://badge.fury.io/rb/open_weather_client.svg)](https://badge.fury.io/rb/open_weather_client)
4
4
  ![RSpec](https://github.com/qurasoft/open_weather_client/actions/workflows/ruby.yml/badge.svg)
5
5
 
6
- Welcome to Open Weather Client. This gem allows you to easily send messages from your ruby project to Microsoft Teams channels.
6
+ Welcome to Open Weather Client. This gem allows you to easily request weather information from OpenWeatherMap.
7
7
  It integrates in your rails project, when you are using bundler or even in plain ruby projects.
8
8
 
9
9
  ## Installation
@@ -35,6 +35,11 @@ end
35
35
  OpenWeatherClient::Weather.current(lat: 50.3569, lon: 7.5890)
36
36
  ```
37
37
 
38
+ ### Exceptions during requests
39
+ When an error occurs during a request, an exception is raised.
40
+ If the request is not authorized `OpenWeatherClient::AutheniticationError` is raied.
41
+ When attributes like latitude or longitude are outside of the expected range a `RangeError` is raised.
42
+
38
43
  ### Secure Configuration
39
44
  In Rails provides the credentials functionality for [environmental security](https://edgeguides.rubyonrails.org/security.html#environmental-security). This mechanism can be used by OpenWeatherClient to load the API key from an encrypted file. This also allows easy separation of production and development channel configuration.
40
45
  All settings are defined under the top-level entry `open_weather_client`.
@@ -53,6 +58,46 @@ OpenWeatherClient.configure do |config|
53
58
  end
54
59
  ```
55
60
 
61
+ ### Caching
62
+ By default Open Weather Client does not cache any data and every request will be send to the OpenWeatherMap servers.
63
+
64
+ To speed up requests and reduce the number network requests caching can be enabled.
65
+ When Open Weather Client is reset, the cache is also reset.
66
+ The cache may be accessed directly through the singleton `OpenWeatherClient.cache`.
67
+
68
+ Whether requests are only performed when the requested time is within the last hour.
69
+ If caching is enabled, requests with a time older than one hour might still be answered with a response.
70
+
71
+ ```ruby
72
+ OpenWeatherClient.configure do |config|
73
+ config.caching = OpenWeatherClient::Caching::Memory
74
+ config.max_memory_entries = 100 # Maximum number of entries in memory cache
75
+ end
76
+ ```
77
+
78
+ #### Memory Caching
79
+ `OpenWeatherClient` supports simple in memory caching.
80
+ A hash is used to store and look up the cached responses.
81
+
82
+ #### Custom Caching
83
+ To implement custom caching, the interface of `OpenWeatherClient::Caching` is used.
84
+ A custom caching solution must implement its specific `caching_get(key)`, `caching_store(key, data)` and `present?(key)` methods.
85
+
86
+ ### Spatial Quantization
87
+ Since weather is more often than not a wider phenomenon, the high resolution location data, commonly available today may interfere with the performance even when using caching.
88
+ Caching uses the full resolution of the location data.
89
+ By default no quantization is performed.
90
+
91
+ OpenWeatherClient allows defining a quantization function to transform the latitude and longitude data before making requests or hitting the cache.
92
+ The quantization receives latitude and longitude.
93
+ The result is coerced back into latitude and longitude.
94
+
95
+ ```ruby
96
+ OpenWeatherClient.configure do |config|
97
+ config.spatial_quantization = proc { |lat, lon| [lat.round(2), lon.round(2)] }
98
+ end
99
+ ```
100
+
56
101
  ## Development
57
102
 
58
103
  After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
data/Rakefile CHANGED
@@ -1,6 +1,8 @@
1
- require "bundler/gem_tasks"
2
- require "rspec/core/rake_task"
1
+ # frozen_string_literal: true
2
+
3
+ require 'bundler/gem_tasks'
4
+ require 'rspec/core/rake_task'
3
5
 
4
6
  RSpec::Core::RakeTask.new(:spec)
5
7
 
6
- task :default => :spec
8
+ task default: :spec
data/bin/console CHANGED
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
2
3
 
3
4
  require 'bundler/setup'
4
5
  require 'open_weather_client'
@@ -0,0 +1,49 @@
1
+ # frozen_string_literal: true
2
+
3
+ module OpenWeatherClient
4
+ class Caching
5
+ ##
6
+ # Memory cache of OpenWeatherMap requests
7
+ #
8
+ # The requests are cached in memory up to the number specified in config.max_memory_entries.
9
+ # When the limit is reached the least recently used entry is evicted.
10
+ class Memory < OpenWeatherClient::Caching
11
+ # Memory cache to store a hash of keys and request data
12
+ attr :memory_cache
13
+ # Key registry of the memory cache. The first entry is the key of the least recently accessed data
14
+ attr :memory_keys
15
+
16
+ ##
17
+ # Initialize an empty cache
18
+ def initialize
19
+ super
20
+ @memory_cache = {}
21
+ @memory_keys = []
22
+ end
23
+
24
+ private
25
+
26
+ def caching_get(key)
27
+ @memory_keys.delete(key)
28
+ @memory_keys << key if @memory_cache.key? key
29
+ @memory_cache[key]
30
+ end
31
+
32
+ def caching_store(key, data)
33
+ @memory_cache[key] = data
34
+ @memory_keys.delete(key)
35
+ @memory_keys << key
36
+
37
+ if @memory_keys.count > OpenWeatherClient.configuration.max_memory_entries
38
+ @memory_cache.delete(@memory_keys.shift)
39
+ end
40
+
41
+ data
42
+ end
43
+
44
+ def present?(key)
45
+ @memory_keys.include?(key)
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,90 @@
1
+ # frozen_string_literal: true
2
+
3
+ module OpenWeatherClient
4
+ ##
5
+ # Caching of OpenWeatherMap requests
6
+ #
7
+ # The entries are cached according to latitude, longitude and time of the request.
8
+ # The time is clamped to the current hour
9
+ #
10
+ # This is the caching interface and equals a none cache. Get requests raise an error.
11
+ class Caching
12
+ ##
13
+ # Get an entry out of the cache defined by its +lat+, +lon+ and +time+.
14
+ #
15
+ # @param lat[Float] latitude of the requests location
16
+ # @param lon[Float] longitude of the requests location
17
+ # @param time[Time] time of the request
18
+ #
19
+ # @raise [KeyError] if no entry is present
20
+ # @raise [NotImplementedError] if an unsupported caching method is used
21
+ #
22
+ # @return [Hash] the stored data
23
+ def get(lat:, lon:, time:)
24
+ key = cache_key(lat, lon, time)
25
+ raise KeyError unless present?(key)
26
+
27
+ caching_get(key)
28
+ end
29
+
30
+ ##
31
+ # Store the data by its +lat+, +lon+ and +time+.
32
+ #
33
+ # @param data[Hash] data to be stored, must be able to be formatted and parsed as text
34
+ # @param lat[Float] latitude of the requests location
35
+ # @param lon[Float] longitude of the requests location
36
+ # @param time[Time] time of the request
37
+ #
38
+ # @return [Hash] the input data
39
+ def store(data:, lat:, lon:, time:)
40
+ key = cache_key(lat, lon, time)
41
+
42
+ caching_store(key, data)
43
+
44
+ data
45
+ end
46
+
47
+ private
48
+
49
+ ##
50
+ # Calculate the key for storage in the cache
51
+ #
52
+ # @param lat[Float] latitude of the requests location
53
+ # @param lon[Float] longitude of the requests location
54
+ # @param time[Time] time of the request
55
+ def cache_key(lat, lon, time)
56
+ "#{lat}_#{lon}_#{time.strftime('%Y-%m-%dT%H')}"
57
+ end
58
+
59
+ ##
60
+ # Read an entry out of the memory cache
61
+ #
62
+ # @param key[String] key into the cache. Is stored at the end of the key registry
63
+ #
64
+ # @return [Hash] the stored data
65
+ def caching_get(key)
66
+ raise NotImplementedError
67
+ end
68
+
69
+ ##
70
+ # Store an entry in the memory cache
71
+ #
72
+ # Evicts the entry with the least recent access if the memory cache is full
73
+ #
74
+ # @param key[String] key into the cache. Is stored at the end of the key registry
75
+ # @param data[Hash] data to be stored, must be able to be formatted and parsed as text
76
+ #
77
+ # @return [Hash] the input data
78
+ def caching_store(key, data)
79
+ data
80
+ end
81
+
82
+ ##
83
+ # Check whether a key is present in the cache
84
+ #
85
+ # @return always false when the cache method is not supported or caching is not enabled
86
+ def present?(_key)
87
+ false
88
+ end
89
+ end
90
+ end
@@ -1,18 +1,53 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module OpenWeatherClient
4
+ ##
5
+ # Configuratin of OpenWeatherClient
2
6
  class Configuration
3
- attr_accessor :appid, :lang, :units, :url, :user_agent
7
+ # [String] API key to access OpenWeatherMap
8
+ attr_accessor :appid
9
+ # Caching method. One of :none, :memory
10
+ attr_reader :caching
11
+ # [String] Requested language of the result
12
+ attr_accessor :lang
13
+ # [Integer] Maximum allowed number of entries when using caching method :memory
14
+ attr_accessor :max_memory_entries
15
+ # [Proc] Quantization of latitude and longitude
16
+ attr_accessor :spatial_quantization
17
+ # [String] Requested units of the result
18
+ attr_accessor :units
19
+ # [String] Base URL of the requests to OpenWeatherMap
20
+ attr_accessor :url
21
+ # [String] User-Agent of the requests made to OpenWeatherMap
22
+ attr_accessor :user_agent
4
23
 
24
+ ##
25
+ # Initialize a new Configuration with the default settings
5
26
  def initialize
27
+ @caching = OpenWeatherClient::Caching.new
6
28
  @lang = 'de'
29
+ @max_memory_entries = 10_000
7
30
  @units = 'metric'
8
31
  @url = 'https://api.openweathermap.org/data'
9
32
  @user_agent = "Open Weather Client/#{OpenWeatherClient::VERSION}"
10
33
  end
11
34
 
35
+ ##
36
+ # Set the caching method
37
+ #
38
+ # @param cache_class[Class] class definition adhering to the OpenWeatherClient::Caching interface
39
+ def caching=(cache_class)
40
+ @caching = cache_class.new
41
+ end
42
+
43
+ ##
44
+ # Load appid from Rails credentials
45
+ #
46
+ # Load the appid from Rails credentials using the top-level key 'open_weather_client'
47
+ #
48
+ # @raise [RuntimeError] if not using Rails
12
49
  def load_from_rails_credentials
13
- unless defined? Rails
14
- raise RuntimeError, 'This method is only available in Ruby on Rails.'
15
- end
50
+ raise 'This method is only available in Ruby on Rails.' unless defined? Rails
16
51
 
17
52
  settings = Rails.application.credentials.open_weather_client!
18
53
  self.appid = settings[:appid]
@@ -0,0 +1,48 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'faraday'
4
+
5
+ module OpenWeatherClient
6
+ ##
7
+ # Request the weather from OpenWeatherMap
8
+ class Request
9
+ ##
10
+ # Request the current weather
11
+ #
12
+ # @param lat[Float] latitude of the requests location
13
+ # @param lon[Float] longitude of the requests location
14
+ # @param time[Time] time of the request
15
+ #
16
+ # @raise [AuthenticationError] if the request is not authorized, e.g in case the API key is not correct
17
+ # @raise [NotCurrentError] if the requested time is older than 1 hour
18
+ #
19
+ # @return the response body
20
+ def self.get(lat:, lon:, time: Time.now)
21
+ raise OpenWeatherClient::NotCurrentError if time < Time.now - 1 * 60 * 60
22
+
23
+ connection = Faraday.new(
24
+ url: OpenWeatherClient.configuration.url,
25
+ params: {
26
+ appid: OpenWeatherClient.configuration.appid,
27
+ lat: lat,
28
+ lon: lon,
29
+ lang: OpenWeatherClient.configuration.lang,
30
+ units: OpenWeatherClient.configuration.units
31
+ },
32
+ headers: {
33
+ 'User-Agent': OpenWeatherClient.configuration.user_agent
34
+ }
35
+ ) do |f|
36
+ f.response :raise_error
37
+ f.response :json
38
+ end
39
+
40
+ begin
41
+ response = connection.get('2.5/weather')
42
+ OpenWeatherClient.cache.store(lat: lat, lon: lon, data: response.body, time: time)
43
+ rescue Faraday::UnauthorizedError
44
+ raise OpenWeatherClient::AuthenticationError
45
+ end
46
+ end
47
+ end
48
+ end
@@ -1,3 +1,7 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module OpenWeatherClient
2
- VERSION = "0.1.0"
4
+ ##
5
+ # Version of OpenWeatherClient
6
+ VERSION = '0.1.3'
3
7
  end
@@ -1,27 +1,47 @@
1
- require 'faraday'
1
+ # frozen_string_literal: true
2
2
 
3
3
  module OpenWeatherClient
4
+ ##
5
+ # Request weather information from OpenWeatherMap or the cache
4
6
  class Weather
5
- def self.current(lat:, lon:)
6
- connection = Faraday.new(
7
- url: OpenWeatherClient.configuration.url,
8
- params: {
9
- appid: OpenWeatherClient.configuration.appid,
10
- lat: lat,
11
- lon: lon,
12
- lang: OpenWeatherClient.configuration.lang,
13
- units: OpenWeatherClient.configuration.units
14
- },
15
- headers: {
16
- 'User-Agent': OpenWeatherClient.configuration.user_agent
17
- }
18
- ) do |f|
19
- f.response :json
7
+ # [Float] latitude of the requested location
8
+ attr_accessor :lat
9
+ # [Float] longitude of the requested location
10
+ attr_accessor :lon
11
+ # [Time] time of the requested weather
12
+ attr_accessor :time
13
+
14
+ ##
15
+ # Initialize a new Weather request
16
+ #
17
+ # @param lat[Float] latitude of the requests location
18
+ # @param lon[Float] longitude of the requests location
19
+ # @param time[Time] time of the request
20
+ #
21
+ # @raise [RangeError] if one +lat+ or +lon+ are out of the expected ranges
22
+ def initialize(lat:, lon:, time: Time.now)
23
+ if OpenWeatherClient.configuration.spatial_quantization.respond_to?(:call)
24
+ lat, lon = OpenWeatherClient.configuration.spatial_quantization.call(lat, lon)
20
25
  end
21
26
 
22
- response = connection.get('2.5/weather')
27
+ raise RangeError unless (-90..90).member?(lat)
28
+ raise RangeError unless (-180..180).member?(lon)
29
+
30
+ @lat = lat
31
+ @lon = lon
32
+ @time = time
33
+ end
23
34
 
24
- response.body
35
+ ##
36
+ # get the weather according to the specified parameters
37
+ #
38
+ # @raise [AuthenticationError] if the request is not authorized, e.g in case the API key is not correct
39
+ #
40
+ # @return the stored or received data
41
+ def get
42
+ OpenWeatherClient.cache.get(lat: lat, lon: lon, time: time)
43
+ rescue KeyError
44
+ OpenWeatherClient::Request.get(lat: lat, lon: lon)
25
45
  end
26
46
  end
27
47
  end
@@ -1,38 +1,71 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'open_weather_client/caching'
1
4
  require 'open_weather_client/configuration'
5
+ require 'open_weather_client/request'
2
6
  require 'open_weather_client/version'
3
7
  require 'open_weather_client/weather'
4
8
 
9
+ ##
10
+ # Get weather data from OpenWeatherMap
5
11
  module OpenWeatherClient
12
+ # Error during authentication with the OpenWeatherMap servers
13
+ class AuthenticationError < StandardError; end
14
+
15
+ # The rquested time is not current enough for getting weather data from the OpenWeatherMap server
16
+ class NotCurrentError < StandardError; end
17
+
6
18
  class << self
7
- attr_accessor :configuration, :testing
19
+ # Caching singleton to access the cache
20
+ attr_writer :cache
21
+ # Configuration singleton to access the configuration
22
+ attr_writer :configuration
8
23
  end
9
24
 
25
+ ##
26
+ # Get the singleton cache instance
27
+ #
28
+ # @return [Caching] the cache
29
+ def self.cache
30
+ @cache ||= Caching.new
31
+ end
32
+
33
+ ##
34
+ # Get the singleton configuration instance
35
+ #
36
+ # @return [Configuration] the configuration
10
37
  def self.configuration
11
38
  @configuration ||= Configuration.new
12
39
  end
13
40
 
41
+ ##
42
+ # Reset cache and configuration
14
43
  def self.reset
44
+ @cache = Caching.new
15
45
  @configuration = Configuration.new
16
46
  end
17
47
 
48
+ ##
49
+ # Configure OpenWeatherClient
18
50
  def self.configure
19
51
  yield configuration
20
52
  end
21
53
 
54
+ ##
55
+ # Get the project root
22
56
  def self.project_root
23
- if defined?(Rails)
24
- return Rails.root
25
- end
26
-
27
- if defined?(Bundler)
28
- return Bundler.root
29
- end
57
+ return Rails.root if defined?(Rails)
58
+ return Bundler.root if defined?(Bundler)
30
59
 
31
60
  Dir.pwd
32
61
  end
33
62
 
63
+ ##
64
+ # Get the gem root
34
65
  def self.gem_root
35
- spec = Gem::Specification.find_by_name("open_weather_client")
36
- spec.gem_dir rescue project_root
66
+ spec = Gem::Specification.find_by_name('open_weather_client')
67
+ spec.gem_dir
68
+ rescue NoMethodError
69
+ project_root
37
70
  end
38
71
  end
@@ -1,43 +1,41 @@
1
+ # frozen_string_literal: true
1
2
 
2
- lib = File.expand_path("../lib", __FILE__)
3
+ lib = File.expand_path('../lib', __FILE__)
3
4
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
- require "open_weather_client/version"
5
+ require 'open_weather_client/version'
5
6
 
6
7
  Gem::Specification.new do |spec|
7
- spec.name = "open_weather_client"
8
+ spec.name = 'open_weather_client'
8
9
  spec.version = OpenWeatherClient::VERSION
9
- spec.authors = ["Lucas Keune"]
10
- spec.email = ["lucas.keune@qurasoft.de"]
10
+ spec.required_ruby_version = '>= 3.0'
11
+ spec.required_rubygems_version = '>= 2'
12
+ spec.authors = ['Lucas Keune']
13
+ spec.email = ['lucas.keune@qurasoft.de']
11
14
 
12
- spec.summary = %q{Access weather data from OpenWeatherMap}
13
- spec.description = %q{}
14
- spec.homepage = "https://github.com/Qurasoft/open_weather_client"
15
- spec.license = "MIT"
15
+ spec.summary = 'Access weather data from OpenWeatherMap'
16
+ spec.description = ''
17
+ spec.homepage = 'https://github.com/Qurasoft/open_weather_client'
18
+ spec.license = 'MIT'
16
19
 
17
- # Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
18
- # to allow pushing to a single host or delete this section to allow pushing to any host.
19
- if spec.respond_to?(:metadata)
20
- spec.metadata["homepage_uri"] = spec.homepage
21
- spec.metadata["source_code_uri"] = "https://github.com/Qurasoft/open_weather_client"
22
- spec.metadata["changelog_uri"] = "https://github.com/Qurasoft/open_weather_client/blob/main/CHANGES.md"
23
- else
24
- raise "RubyGems 2.0 or newer is required to protect against public gem pushes."
25
- end
20
+ spec.metadata['homepage_uri'] = spec.homepage
21
+ spec.metadata['source_code_uri'] = 'https://github.com/Qurasoft/open_weather_client'
22
+ spec.metadata['changelog_uri'] = 'https://github.com/Qurasoft/open_weather_client/blob/main/CHANGES.md'
26
23
 
27
24
  # Specify which files should be added to the gem when it is released.
28
25
  # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
29
26
  spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
30
27
  `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
31
28
  end
32
- spec.bindir = "exe"
33
- spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
34
- spec.require_paths = ["lib"]
29
+ spec.bindir = 'bin'
30
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
31
+ spec.require_paths = ['lib']
35
32
 
36
- spec.add_dependency "faraday", ">= 2"
33
+ spec.add_dependency 'faraday', '>= 2'
37
34
 
38
- spec.add_development_dependency "bundler", ">= 1.17"
39
- spec.add_development_dependency "rake", ">= 10.0"
40
- spec.add_development_dependency "rspec", ">= 3.0"
41
- spec.add_development_dependency "webmock"
42
- spec.add_development_dependency "simplecov"
35
+ spec.add_development_dependency 'bundler', '>= 1.17'
36
+ spec.add_development_dependency 'rake', '>= 10.0'
37
+ spec.add_development_dependency 'rspec', '>= 3.0'
38
+ spec.add_development_dependency 'rubocop'
39
+ spec.add_development_dependency 'simplecov'
40
+ spec.add_development_dependency 'webmock'
43
41
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: open_weather_client
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Lucas Keune
8
8
  autorequire:
9
- bindir: exe
9
+ bindir: bin
10
10
  cert_chain: []
11
- date: 2023-01-26 00:00:00.000000000 Z
11
+ date: 2023-01-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: faraday
@@ -67,7 +67,7 @@ dependencies:
67
67
  - !ruby/object:Gem::Version
68
68
  version: '3.0'
69
69
  - !ruby/object:Gem::Dependency
70
- name: webmock
70
+ name: rubocop
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
73
  - - ">="
@@ -94,10 +94,27 @@ dependencies:
94
94
  - - ">="
95
95
  - !ruby/object:Gem::Version
96
96
  version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: webmock
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
97
111
  description: ''
98
112
  email:
99
113
  - lucas.keune@qurasoft.de
100
- executables: []
114
+ executables:
115
+ - ".gitignore"
116
+ - console
117
+ - setup
101
118
  extensions: []
102
119
  extra_rdoc_files: []
103
120
  files:
@@ -106,6 +123,7 @@ files:
106
123
  - ".github/workflows/ruby.yml"
107
124
  - ".gitignore"
108
125
  - ".rspec"
126
+ - ".rubocop.yml"
109
127
  - ".travis.yml"
110
128
  - CHANGES.md
111
129
  - Gemfile
@@ -116,7 +134,10 @@ files:
116
134
  - bin/console
117
135
  - bin/setup
118
136
  - lib/open_weather_client.rb
137
+ - lib/open_weather_client/caching.rb
138
+ - lib/open_weather_client/caching/memory.rb
119
139
  - lib/open_weather_client/configuration.rb
140
+ - lib/open_weather_client/request.rb
120
141
  - lib/open_weather_client/version.rb
121
142
  - lib/open_weather_client/weather.rb
122
143
  - open_weather_client.gemspec
@@ -135,12 +156,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
135
156
  requirements:
136
157
  - - ">="
137
158
  - !ruby/object:Gem::Version
138
- version: '0'
159
+ version: '3.0'
139
160
  required_rubygems_version: !ruby/object:Gem::Requirement
140
161
  requirements:
141
162
  - - ">="
142
163
  - !ruby/object:Gem::Version
143
- version: '0'
164
+ version: '2'
144
165
  requirements: []
145
166
  rubygems_version: 3.4.1
146
167
  signing_key: