strum-cache 0.1.2 → 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: 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: []