checkability 0.6.2 → 0.7.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: b81bedd5fd904185fc57a5627f6848dbb608ba3fa5155653c6d096aed6f4c95c
4
- data.tar.gz: 29948f5309901c9769b899e4660c8d7a0677e29dbf2b1f36af663525dfc1d957
3
+ metadata.gz: d691bd54ab262dd07d0bdf1120d632a71003cfdc730002275d10333e21045526
4
+ data.tar.gz: 104e1558d7867413f25e838d3db9aaf54d2a7f96b412dd1121149e9528c9f95d
5
5
  SHA512:
6
- metadata.gz: 693df60213127f59a954ef39977c86ad78ac32198b478f7f55e45a8b4df900c3b61cd1d58ac3540db9557979545908266bb2a9c3de60f5051227e079ae6d6444
7
- data.tar.gz: 45e80fe8b9b1bf424e529c93b48d66329772bc776dfbccf8055539ca832f219ac3f67685a11621ff4dfb32c23f6d7cebe819f92530d864fda84f60aa74c04aee
6
+ metadata.gz: 42816cf5985cfcc1d0f680496f0fdde3fd3263f87a4b12010f9d3f33694481703c8ed3785531914cfd5143982001c6fbe2977a52de789d7c559720048d3657ec
7
+ data.tar.gz: 00e84b4caa4c5fae3eea6ae4e7e1fb0c3550e29948c81df7a85aaf4ea8ae98bf1083e3559b1583d28243faecdd477ebdbb8b7eab33318cd6571f15b5a08b52a0
data/lib/checkability.rb CHANGED
@@ -9,7 +9,7 @@ require_relative 'checkability/external_api_checker'
9
9
  require_relative 'checkability/external_api_connector'
10
10
  require_relative 'checkability/validator'
11
11
  require_relative 'checkability/acts_as_checkable'
12
- require_relative 'checkability/chain_of_resp/handler'
13
- require_relative 'checkability/chain_of_resp/abstract_handler'
12
+ require_relative 'checkability/checker'
13
+ require_relative 'checkability/abstract_checker'
14
14
 
15
15
  ActiveRecord::Base.include Checkability::ActsAsCheckable
@@ -1,17 +1,20 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative 'handler'
3
+ require_relative 'checker'
4
4
 
5
- module ChainOfResp
5
+ module Checkability
6
6
  # @abstract
7
- class AbstractHandler < ChainOfResp::Handler
7
+ class AbstractChecker < Checker
8
8
  # @return [Handler]
9
9
  attr_reader :stop_process_on_failure, :stop_process_on_success
10
- attr_accessor :handler, :result
10
+ attr_accessor :success_message, :failure_message, :handler
11
11
 
12
12
  def initialize(opts = {})
13
13
  @stop_process_on_failure = opts[:stop_process_on_failure] || false
14
14
  @stop_process_on_success = opts[:stop_process_on_success] || false
15
+ @success_message = opts[:success_message] || 'Success.'
16
+ @failure_message = opts[:failure_message] || 'Failed.'
17
+
15
18
  @next_handler = nil
16
19
  post_initialize(opts) # implemented in subclass
17
20
  end
@@ -32,11 +35,32 @@ module ChainOfResp
32
35
  # @return [Boolean, nil]
33
36
  def handle(request)
34
37
  check = check_value(request) # imlemented in subclass
38
+
35
39
  return true if check && stop_process_on_success
36
40
 
37
41
  return false if !check && stop_process_on_failure
38
42
 
39
43
  handler&.handle(request)
40
44
  end
45
+
46
+ def check_value(checkable)
47
+ result, message = result_and_message(checkable)
48
+ checkable.messages << message
49
+ result
50
+ end
51
+
52
+ def result_and_message(checkable)
53
+ result = _result(checkable)
54
+ str = result ? success_message : failure_message
55
+ [result, message(str, result)]
56
+ rescue StandardError => e
57
+ [false, message(e, false)]
58
+ end
59
+
60
+ def _result; end
61
+
62
+ def message(str, res)
63
+ "#{res}::#{str}"
64
+ end
41
65
  end
42
66
  end
@@ -12,7 +12,10 @@ module Checkability
12
12
 
13
13
  class_methods do
14
14
  def acts_as_checkable(options = {})
15
- raise ArgumentError, "Hash expected, got #{options.class.name}" if !options.is_a?(Hash) && !options.empty?
15
+ if !options.is_a?(Hash) && !options.empty?
16
+ raise ArgumentError,
17
+ "Hash expected, got #{options.class.name}"
18
+ end
16
19
 
17
20
  class_attribute :checkable_conf
18
21
 
@@ -23,7 +26,8 @@ module Checkability
23
26
  attr_accessor :allowed, :messages
24
27
 
25
28
  def perform_check
26
- _setup
29
+ self.allowed = nil
30
+ self.messages = []
27
31
  self.allowed = Checkability::Checkable.new(self).check(checkable_conf)
28
32
  messages << "#{allowed}::'#{_value}' is #{_allowness}. "
29
33
  end
@@ -38,10 +42,7 @@ module Checkability
38
42
  checkable_conf[:attr_name] || :value
39
43
  end
40
44
 
41
- def _setup
42
- self.allowed = nil
43
- self.messages = []
44
- end
45
+ def _setup; end
45
46
 
46
47
  def _allowness
47
48
  allowed ? 'ALLOWED' : 'NOT allowed'
@@ -20,29 +20,34 @@ module Checkability
20
20
  #
21
21
  # validator.handle(request)
22
22
  #
23
- def check(opts = {})
23
+ def check(opts)
24
+ handler_confs = opts[:handler_confs]
24
25
  first_handler_name = opts[:first_handler]
25
- _handlers(opts)[first_handler_name].handle(checkable)
26
- rescue StandardError => e
27
- checkable.messages << "false::#{e}: #{opts}."
28
- false
26
+ first_handler = _handlers(handler_confs)[first_handler_name]
27
+
28
+ first_handler.handle(checkable)
29
+ # rescue StandardError => e
30
+ # checkable.messages << "false::#{e}: #{opts}."
31
+ # false
29
32
  end
30
33
 
31
34
  private
32
35
 
33
- def _handlers(opts)
34
- handler_confs = opts[:handler_confs]
35
- handlers = {}
36
- handler_confs.each do |handler_name, handler_conf|
37
- handlers[handler_name] = _make_handler(handler_name, handler_conf)
38
- end
36
+ def _handlers(handler_confs)
37
+ handlers = _make_handlers(handler_confs)
39
38
  handlers.each do |handler_name, handler|
40
39
  next_handler_name = handler_confs[handler_name][:next_handler]
41
- handler.next_handler(handlers[next_handler_name])
40
+ handler.next_handler(handlers[next_handler_name]) if handlers[next_handler_name]
41
+ end
42
+ end
43
+
44
+ def _make_handlers(handler_confs)
45
+ handler_confs.transform_values do |handler_conf|
46
+ _make_handler(handler_conf)
42
47
  end
43
48
  end
44
49
 
45
- def _make_handler(_name, conf)
50
+ def _make_handler(conf)
46
51
  k = Checkability.const_get conf[:name].to_s.camelize
47
52
  k.new(conf)
48
53
  end
@@ -1,8 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module ChainOfResp
3
+ module Checkability
4
4
  # @abstract
5
- class Handler
5
+ class Checker
6
6
  # @abstract
7
7
  #
8
8
  # @param [Handler] handler
@@ -15,7 +15,7 @@ module ChainOfResp
15
15
  # @param [String] request
16
16
  #
17
17
  # @return [String, nil]
18
- def handle(_request)
18
+ def handle(_handler)
19
19
  raise NotImplementedError, "#{self.class} has not implemented method '#{__method__}'"
20
20
  end
21
21
 
@@ -27,5 +27,14 @@ module ChainOfResp
27
27
  def check_value(_request)
28
28
  raise NotImplementedError, "#{self.class} has not implemented method '#{__method__}'"
29
29
  end
30
+
31
+ # @abstract
32
+ #
33
+ # @param [String] request
34
+ #
35
+ # @return [Boolean, true|false]
36
+ def result_and_message(_object)
37
+ raise NotImplementedError, "#{self.class} has not implemented method '#{__method__}'"
38
+ end
30
39
  end
31
40
  end
@@ -7,11 +7,10 @@ require 'json'
7
7
 
8
8
  # frozen_string_literal: true
9
9
 
10
- require_relative 'chain_of_resp/abstract_handler'
11
10
  module Checkability
12
11
  # Checks if postcode exists in external API
13
12
  #
14
- class ExternalApiChecker < ChainOfResp::AbstractHandler
13
+ class ExternalApiChecker < AbstractChecker
15
14
  attr_reader :path, :path_suffix, :check_method, :connection, :http_verb,
16
15
  :failure_message, :success_message
17
16
 
@@ -20,39 +19,27 @@ module Checkability
20
19
  @http_verb = conf[:http_verb] || :get
21
20
  @path_suffix = conf[:path_suffix] || ''
22
21
  @check_method = conf[:check_method]
23
- @failure_message = conf[:failure_message] || 'Failed.'
24
- @success_message = conf[:success_message] || 'Success.'
25
22
  @connection = Checkability::ExternalApiConnector.new(conf)
26
23
  end
27
24
 
28
- def check_value(checkable)
29
- @resp = connection
30
- .connect
31
- .send(http_verb, "#{checkable.value.delete(' ')}#{path_suffix}")
32
- result, message = _result_and_message
33
- checkable.messages << message
34
- result
35
- end
36
-
37
25
  private
38
26
 
39
- def _message(str, res)
40
- "#{res}::#{path}: #{str}"
41
- end
27
+ def _result(checkable)
28
+ resp = connection
29
+ .connect
30
+ .send(http_verb, "#{checkable.value.delete(' ')}#{path_suffix}")
31
+ return false unless resp.status == 200
42
32
 
43
- def _parsed(resp)
44
- JSON.parse(resp.body)
33
+ check_method.call(_parsed(resp))
45
34
  end
46
35
 
47
- def _result_and_message
48
- return [false, _message(@resp.status, false)] unless @resp.status == 200
49
-
50
- return [true, _message(success_message, true)] if check_method
51
- .call(_parsed(@resp))
36
+ def message(str, res)
37
+ str = "#{path}: #{str}"
38
+ super(str, res)
39
+ end
52
40
 
53
- [false, _message(failure_message, false)]
54
- rescue StandardError => e
55
- [false, _message(e, false)]
41
+ def _parsed(resp)
42
+ JSON.parse(resp.body)
56
43
  end
57
44
  end
58
45
  end
@@ -1,33 +1,31 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative 'chain_of_resp/abstract_handler'
3
+ require_relative 'abstract_checker'
4
4
  module Checkability
5
5
  # Checks if postcode exists in Storage
6
6
  #
7
- class StorageChecker < ChainOfResp::AbstractHandler
8
- attr_reader :storage_class
7
+ class StorageChecker < AbstractChecker
8
+ attr_reader :storage_class, :attr_name
9
9
 
10
10
  def post_initialize(conf = {})
11
11
  @storage_class = conf[:storage_class]
12
+ @attr_name = conf[:attr_name] || :value
12
13
  end
13
14
 
14
- def check_value(checkable)
15
- value = checkable.value.upcase
16
- result = _present_in_storage(value)
17
- checkable.messages << (
18
- result ? _message('Found', result) : _message('Not found', result))
19
- result
15
+ private
16
+
17
+ def _result(checkable)
18
+ value = _normalize_value(checkable.send(attr_name))
19
+ storage_class.where(attr_name => value).present?
20
20
  end
21
21
 
22
- def _present_in_storage(value)
23
- storage_class.where(value: value)
24
- .or(storage_class.where(value: value.strip))
25
- .or(storage_class.where(value: value.delete(' ')))
26
- .present?
22
+ def message(str, res)
23
+ str = "Allowed #{storage_class}s list: #{str}"
24
+ super(str, res)
27
25
  end
28
26
 
29
- def _message(str, res)
30
- "#{res}::Allowed #{storage_class}s list: #{str}."
27
+ def _normalize_value(value)
28
+ value.delete(' ').upcase
31
29
  end
32
30
  end
33
31
  end
@@ -3,27 +3,17 @@
3
3
  module Checkability
4
4
  # Checks if postcode comply with regex
5
5
  #
6
- class Validator < ChainOfResp::AbstractHandler
6
+ class Validator < AbstractChecker
7
7
  attr_reader :format
8
8
 
9
9
  def post_initialize(conf = {})
10
10
  @format = conf[:format]
11
11
  end
12
12
 
13
- def check_value(checkable)
14
- result, message = _result_and_message(checkable)
15
- checkable.messages << message
16
- result
17
- end
18
-
19
13
  private
20
14
 
21
- def _result_and_message(checkable)
22
- if (checkable.value.delete(' ') =~ format[:regex]).nil?
23
- [false, "false::Value is NOT COMPLY with format of #{format[:name]}."]
24
- else
25
- [true, "true::Value is COMPLY with format of #{format[:name]}."]
26
- end
15
+ def _result(checkable)
16
+ !(checkable.value.delete(' ') =~ format[:regex]).nil?
27
17
  end
28
18
  end
29
19
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Checkability
4
- VERSION = '0.6.2'
4
+ VERSION = '0.7.0'
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: checkability
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.2
4
+ version: 0.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrey Eremeev
@@ -23,10 +23,10 @@ files:
23
23
  - Rakefile
24
24
  - bin/checkability
25
25
  - lib/checkability.rb
26
+ - lib/checkability/abstract_checker.rb
26
27
  - lib/checkability/acts_as_checkable.rb
27
- - lib/checkability/chain_of_resp/abstract_handler.rb
28
- - lib/checkability/chain_of_resp/handler.rb
29
28
  - lib/checkability/checkable.rb
29
+ - lib/checkability/checker.rb
30
30
  - lib/checkability/external_api_checker.rb
31
31
  - lib/checkability/external_api_connector.rb
32
32
  - lib/checkability/railtie.rb