strum-cache 0.1.2 → 0.1.3

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: efaba98c772965cd918f40d6e2cb276869a045076f6847445188623547bec63d
4
- data.tar.gz: 53ece08bc876602d5279f0b794cfb312322dcdedaf0b16e16d89b442c8cf93c1
3
+ metadata.gz: '02513390f401ce8a38fe1ce2b718def9e485bec07e70b6991bc59e54374a7daa'
4
+ data.tar.gz: da63fa1d376507d2e556f5be5819d1449c127cb014fb237a5a44db2950aa76c6
5
5
  SHA512:
6
- metadata.gz: bedc338386c5d7c0af603a8af5b86ae8bba15fc7c3c613127ab9c6e2c218aa85a659a01c8da1e0264f6edb660fd742b81b74e42a8327156017999ba93bcd288d
7
- data.tar.gz: ccd5267452450fdcde534e386fc94e768f20a5e430f05c820823979c4b8772fbf574ff9dbbe3cd75d8a1600a85b37cab964c61b5f7289e01cd85b48cba2169ad
6
+ metadata.gz: 45e3dd0e9921dfb795ced1722b8c9e6426f1ebdb5bed5f1f7e29e2b41b826af4f8c5ccb378ca884d7aba144c5e3f685455b2ac4b4aca2e2a41402e810effa966
7
+ data.tar.gz: 0ee7672065f0c14ce9cb6dbe42a2c2c9cd3d61f40ba1222c2f8f36888c0e1ce68dfdec9da3a53b841ba6afb37cb3fe13b5deaa22944134e6e0f0354706c5cb8a
data/lib/strum/cache.rb CHANGED
@@ -81,7 +81,13 @@ module Strum
81
81
  end
82
82
 
83
83
  define_method :find_by_id do |resource_id|
84
- Strum::CacheUtils::Find.call(resource_code: resource_code, resource_id: resource_id)
84
+ Strum::CacheUtils::Find.call(resource_code: resource_code, resource_id: resource_id) do |m|
85
+ m.success { |result| result }
86
+ m.failure do |errors|
87
+ add_errors(errors)
88
+ nil
89
+ end
90
+ end
85
91
  end
86
92
 
87
93
  define_method :not_found do
@@ -115,7 +121,13 @@ module Strum
115
121
  end
116
122
 
117
123
  define_method :search_by_params do
118
- Strum::CacheUtils::Search.call(resource_code: resource_code, params: input)
124
+ Strum::CacheUtils::Search.call(resource_code: resource_code, params: input) do |m|
125
+ m.success { |result| result }
126
+ m.failure do |errors|
127
+ add_errors(errors)
128
+ nil
129
+ end
130
+ end
119
131
  end
120
132
 
121
133
  define_method :not_found do
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Strum
4
4
  module Cache
5
- VERSION = "0.1.2"
5
+ VERSION = "0.1.3"
6
6
  end
7
7
  end
@@ -1,5 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "strum/cache_utils/shared/mixins/url"
3
4
  require "strum/cache_utils/build_resources_url"
4
5
 
5
6
  module Strum
@@ -7,34 +8,24 @@ module Strum
7
8
  # Resource url builder
8
9
  class BuildResourceUrl
9
10
  include Strum::Service
10
-
11
- def call
12
- output(url: File.join(base_url, resource_id.to_s))
13
- rescue KeyError
14
- Strum::CacheUtils::BuildResourcesUrl.call(resource_code: resource_code, params: { id: resource_id }) do |m|
15
- m.success { |result| output(result) }
16
- m.failure { |errors| add_errors(errors) }
17
- end
18
- end
19
-
20
- def audit
21
- required(:resource_code, :resource_id)
22
- end
11
+ include Shared::Mixins::Url
23
12
 
24
13
  private
25
14
 
26
- def inflector
27
- @inflector ||= Dry::Inflector.new
28
- end
15
+ RESOURCE_SUFIX_URL = "RESOURCE_URL"
16
+ HOST = "BASE_RESOURCE_URL"
29
17
 
30
- def underscore_resource_code
31
- inflector.underscore(resource_code)
18
+ def audit
19
+ required(:resource_code, :resource_id)
20
+ sliced(:resource_code, :resource_id)
32
21
  end
33
22
 
34
- def base_url
35
- ENV.fetch("#{underscore_resource_code.upcase}_RESOURCE_URL") do
36
- host = ENV.fetch("BASE_RESOURCE_URL")
37
- File.join(host, inflector.pluralize(underscore_resource_code.gsub(/_/, "-")))
23
+ def call
24
+ output(url: File.join(base_url, resource_id.to_s))
25
+ rescue KeyError
26
+ Strum::CacheUtils::BuildResourcesUrl.call(resource_code: resource_code, params: { id: resource_id }) do |m|
27
+ m.success { |result| output(result) }
28
+ m.failure { |errors| add_errors(errors) }
38
29
  end
39
30
  end
40
31
  end
@@ -1,33 +1,31 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "uri"
4
+ require "strum/cache_utils/shared/mixins/url"
4
5
 
5
6
  module Strum
6
7
  module CacheUtils
7
8
  # Build url to resource
8
9
  class BuildResourcesUrl
9
10
  include Strum::Service
11
+ include Shared::Mixins::Url
10
12
 
11
- def call
12
- underscore_resource_code = inflector.underscore(resource_code)
13
- base_url = ENV.fetch("#{underscore_resource_code.upcase}_RESOURCE_SEARCH_URL") do
14
- host = ENV.fetch("BASE_RESOURCE_SEARCH_URL")
15
- File.join(host, inflector.pluralize(underscore_resource_code.gsub(/_/, "-")))
16
- end
17
- output(url: base_url, params: params)
18
- rescue KeyError
19
- add_error("#{resource_code} SEARCH ENV", :not_found)
20
- end
13
+ private
21
14
 
22
- def audit
23
- required(:resource_code, :params)
24
- add_error(:params, :hash_required) unless params.is_a?(Hash)
25
- end
15
+ RESOURCE_SUFIX_URL = "RESOURCE_SEARCH_URL"
16
+ HOST = "BASE_RESOURCE_SEARCH_URL"
26
17
 
27
- private
18
+ def audit
19
+ required(:resource_code, :params)
20
+ sliced(:resource_code, :params)
21
+
22
+ add_error(:params, :hash_required) unless params.is_a?(Hash)
23
+ end
28
24
 
29
- def inflector
30
- @inflector ||= Dry::Inflector.new
25
+ def call
26
+ output(url: base_url, params: params)
27
+ rescue KeyError
28
+ add_error("#{resource_code} SEARCH ENV", :not_found)
31
29
  end
32
30
  end
33
31
  end
@@ -8,6 +8,11 @@ module Strum
8
8
  class Find
9
9
  include Strum::Service
10
10
 
11
+ def audit
12
+ required(:resource_code, :resource_id)
13
+ sliced(:resource_code, :resource_id)
14
+ end
15
+
11
16
  def call
12
17
  Strum::Pipe.call(Strum::CacheUtils::BuildResourceUrl,
13
18
  Strum::CacheUtils::SendRequest,
@@ -17,10 +22,6 @@ module Strum
17
22
  m.failure { |errors| add_errors(errors) }
18
23
  end
19
24
  end
20
-
21
- def audit
22
- required(:resource_code, :resource_id)
23
- end
24
25
  end
25
26
  end
26
27
  end
@@ -10,20 +10,20 @@ module Strum
10
10
  class Redis
11
11
  include Strum::Service
12
12
 
13
- def call
14
- if (entity = redis_connection.hgetall(resource_id)).key?("id")
15
- redis_connection.expire(resource_id, redis_resource_expire)
16
- output(entity)
17
- else
18
- add_error(:entity, :not_found)
19
- end
20
- end
13
+ private
21
14
 
22
- def audit
23
- required(:resource_code, :resource_id)
24
- end
15
+ def audit
16
+ required(:resource_code, :resource_id)
17
+ end
25
18
 
26
- private
19
+ def call
20
+ if (entity = redis_connection.hgetall(resource_id)).key?("id")
21
+ redis_connection.expire(resource_id, redis_resource_expire)
22
+ output(entity)
23
+ else
24
+ add_error(:entity, :not_found)
25
+ end
26
+ end
27
27
 
28
28
  def redis_connection
29
29
  Strum::CacheUtils::RedisStorage.const_get(resource_code.to_s.capitalize, false).instance.redis
@@ -1,6 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "strum/pipe"
4
3
  require "strum/cache_utils/build_resources_url"
5
4
  require "strum/cache_utils/send_request"
6
5
 
@@ -10,6 +9,11 @@ module Strum
10
9
  class Search
11
10
  include Strum::Service
12
11
 
12
+ def audit
13
+ required(:resource_code, :params)
14
+ sliced(:resource_code, :params)
15
+ end
16
+
13
17
  def call
14
18
  Strum::Pipe.call(Strum::CacheUtils::BuildResourcesUrl,
15
19
  Strum::CacheUtils::SendRequest,
@@ -19,10 +23,6 @@ module Strum
19
23
  m.failure { |errors| add_errors(errors) }
20
24
  end
21
25
  end
22
-
23
- def audit
24
- required(:resource_code, :params)
25
- end
26
26
  end
27
27
  end
28
28
  end
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "faraday"
4
- require "json"
4
+ require "faraday_middleware"
5
5
 
6
6
  module Strum
7
7
  module CacheUtils
@@ -9,36 +9,96 @@ module Strum
9
9
  class SendRequest
10
10
  include Strum::Service
11
11
 
12
- def call
13
- (resp = send_request).success? && output(JSON.parse(resp.body))
14
- rescue Faraday::Error => e
15
- add_error(:connection, e)
16
- rescue JSON::JSONError => e
17
- add_error(:payload, e)
18
- end
19
-
20
- def audit
21
- required :url
22
- end
23
-
24
12
  private
25
13
 
26
- def cache_headers
27
- Strum::Cache.config.cache_headers.is_a?(Hash) ? Strum::Cache.config.cache_headers : {}
14
+ TIMEOUT = ENV.fetch("STRUM_CACHE_TIMEOUT", 50).to_i.freeze
15
+ OPEN_TIMEOUT = ENV.fetch("STRUM_CACHE_OPEN_TIMEOUT", 5).to_i.freeze
16
+
17
+ def audit
18
+ required(:url)
19
+ sliced(:url, :params)
28
20
  end
29
21
 
30
- def conn
31
- Faraday.new(url: url)
22
+ def call
23
+ output(send_request.body)
24
+ rescue Faraday::ConnectionFailed => e
25
+ connection_error_handler(e)
26
+ rescue Faraday::TimeoutError => e
27
+ timeout_error_handler(e)
28
+ rescue Faraday::ParsingError => e
29
+ parsing_error_handler(e)
30
+ rescue Faraday::Error => e
31
+ error_handler(e)
32
32
  end
33
33
 
34
34
  def send_request
35
- conn.get do |req|
36
- req.params = params if input[:params]
37
- req.headers["Content-Type"] = "application/json"
35
+ create_faraday_inst.get do |req|
38
36
  req.headers["Accept"] = "application/json"
37
+ req.headers["Content-Type"] = "application/json"
38
+ req.params = params if input[:params]
39
39
  cache_headers.each { |k, v| req.headers[k] = v }
40
40
  end
41
41
  end
42
+
43
+ def create_faraday_inst
44
+ Faraday.new(url: url) do |f|
45
+ f.response :json
46
+ f.options.timeout = TIMEOUT
47
+ f.options.open_timeout = OPEN_TIMEOUT
48
+ f.use Faraday::Response::RaiseError
49
+ end
50
+ end
51
+
52
+ def cache_headers
53
+ Strum::Cache.config.cache_headers.is_a?(Hash) ? Strum::Cache.config.cache_headers : {}
54
+ end
55
+
56
+ def connection_error_handler(error)
57
+ add_error(:send_request, :connection_error)
58
+ add_error(:connection_error, [{ info: { error_message: error.message, url: url, method: :get } }])
59
+ end
60
+
61
+ def timeout_error_handler(error)
62
+ add_error(:send_request, :timeout_error)
63
+ add_error(:timeout_error, [{ info: { error_message: error.message, url: url, method: :get } }])
64
+ end
65
+
66
+ def parsing_error_handler(error) # rubocop: disable Metrics/AbcSize, Style/CommentedKeyword
67
+ info = {
68
+ error_message: error.message,
69
+ request_headers: error.response.env.request_headers,
70
+ response_status: error.response.env.status,
71
+ response_headers: error.response.env.response_headers,
72
+ response_body: error.response.env.response_body
73
+ }
74
+ add_error(:payload, error)
75
+ add_error(:send_request, :json_parse_error)
76
+ add_error(:json_parse_error, [build_format_info(info)])
77
+ end
78
+
79
+ def error_handler(error)
80
+ info = {
81
+ error_message: error.message,
82
+ request_headers: error.response[:request][:headers],
83
+ response_status: error.response[:status],
84
+ response_headers: error.response[:headers],
85
+ response_body: error.response[:body]
86
+ }
87
+
88
+ add_error(:connection, error)
89
+ add_error(:send_request, :http_error)
90
+ add_error(:http_error, [build_format_info(info)])
91
+ end
92
+
93
+ def build_format_info(info)
94
+ {
95
+ info: {
96
+ error_message: info[:error_message], method: :get, url: url,
97
+ request: { headers: info[:request_headers] },
98
+ response: { status: info[:response_status], headers: info[:response_headers], body: info[:response_body] }
99
+ }
100
+ }
101
+ end
42
102
  end
43
103
  end
44
104
  end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Strum
4
+ module CacheUtils
5
+ module Shared
6
+ module Mixins
7
+ # General methods for url builders
8
+ module Url
9
+ def base_url
10
+ ENV.fetch("#{underscore_resource_code.upcase}_#{self.class::RESOURCE_SUFIX_URL}") do
11
+ host = ENV.fetch(self.class::HOST)
12
+ File.join(host, inflector.pluralize(underscore_resource_code.gsub(/_/, "-")))
13
+ end
14
+ end
15
+
16
+ def underscore_resource_code
17
+ @underscore_resource_code ||= inflector.underscore(resource_code)
18
+ end
19
+
20
+ def inflector
21
+ @inflector ||= Dry::Inflector.new
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
data/strum-cache.gemspec CHANGED
@@ -33,7 +33,8 @@ Gem::Specification.new do |spec|
33
33
 
34
34
  spec.add_runtime_dependency "dry-configurable", "~> 0.12.1"
35
35
  spec.add_runtime_dependency "dry-inflector", "~> 0.2"
36
- spec.add_runtime_dependency "faraday", "~> 1.1"
36
+ spec.add_runtime_dependency "faraday", "~> 1.4"
37
+ spec.add_runtime_dependency "faraday_middleware", "~> 1.0"
37
38
  spec.add_runtime_dependency "json", "~> 2.3"
38
39
  spec.add_runtime_dependency "redis", "~> 4.2"
39
40
  spec.add_runtime_dependency "strum-json", "~> 0.0.3"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: strum-cache
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Serhiy Nazarov
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-08-04 00:00:00.000000000 Z
11
+ date: 2021-08-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: dry-configurable
@@ -44,14 +44,28 @@ dependencies:
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: '1.1'
47
+ version: '1.4'
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: '1.1'
54
+ version: '1.4'
55
+ - !ruby/object:Gem::Dependency
56
+ name: faraday_middleware
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '1.0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '1.0'
55
69
  - !ruby/object:Gem::Dependency
56
70
  name: json
57
71
  requirement: !ruby/object:Gem::Requirement
@@ -144,6 +158,7 @@ files:
144
158
  - lib/strum/cache_utils/redis_storage.rb
145
159
  - lib/strum/cache_utils/search.rb
146
160
  - lib/strum/cache_utils/send_request.rb
161
+ - lib/strum/cache_utils/shared/mixins/url.rb
147
162
  - strum-cache.gemspec
148
163
  homepage: https://gitlab.com/strum-rb/strum-cache
149
164
  licenses: []