checkability 0.4.0 → 0.6.2
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 +5 -5
- data/Rakefile +2 -0
- data/bin/checkability +1 -0
- data/lib/checkability.rb +4 -0
- data/lib/checkability/acts_as_checkable.rb +13 -9
- data/lib/checkability/chain_of_resp/abstract_handler.rb +42 -0
- data/lib/checkability/chain_of_resp/handler.rb +31 -0
- data/lib/checkability/checkable.rb +31 -19
- data/lib/checkability/external_api_checker.rb +17 -11
- data/lib/checkability/external_api_connector.rb +2 -0
- data/lib/checkability/railtie.rb +2 -0
- data/lib/checkability/storage_checker.rb +9 -5
- data/lib/checkability/validator.rb +6 -4
- data/lib/checkability/version.rb +3 -1
- data/lib/tasks/checkability_tasks.rake +1 -0
- metadata +9 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: b81bedd5fd904185fc57a5627f6848dbb608ba3fa5155653c6d096aed6f4c95c
|
4
|
+
data.tar.gz: 29948f5309901c9769b899e4660c8d7a0677e29dbf2b1f36af663525dfc1d957
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 693df60213127f59a954ef39977c86ad78ac32198b478f7f55e45a8b4df900c3b61cd1d58ac3540db9557979545908266bb2a9c3de60f5051227e079ae6d6444
|
7
|
+
data.tar.gz: 45e80fe8b9b1bf424e529c93b48d66329772bc776dfbccf8055539ca832f219ac3f67685a11621ff4dfb32c23f6d7cebe819f92530d864fda84f60aa74c04aee
|
data/Rakefile
CHANGED
data/bin/checkability
CHANGED
data/lib/checkability.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'active_record'
|
2
4
|
require 'active_support'
|
3
5
|
require_relative 'checkability/version'
|
@@ -7,5 +9,7 @@ require_relative 'checkability/external_api_checker'
|
|
7
9
|
require_relative 'checkability/external_api_connector'
|
8
10
|
require_relative 'checkability/validator'
|
9
11
|
require_relative 'checkability/acts_as_checkable'
|
12
|
+
require_relative 'checkability/chain_of_resp/handler'
|
13
|
+
require_relative 'checkability/chain_of_resp/abstract_handler'
|
10
14
|
|
11
15
|
ActiveRecord::Base.include Checkability::ActsAsCheckable
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Checkability
|
2
4
|
# Adding class and instance methods
|
3
5
|
#
|
@@ -10,9 +12,7 @@ module Checkability
|
|
10
12
|
|
11
13
|
class_methods do
|
12
14
|
def acts_as_checkable(options = {})
|
13
|
-
if !options.is_a?(Hash) && !options.empty?
|
14
|
-
raise ArgumentError, "Hash expected, got #{options.class.name}"
|
15
|
-
end
|
15
|
+
raise ArgumentError, "Hash expected, got #{options.class.name}" if !options.is_a?(Hash) && !options.empty?
|
16
16
|
|
17
17
|
class_attribute :checkable_conf
|
18
18
|
|
@@ -24,12 +24,20 @@ module Checkability
|
|
24
24
|
|
25
25
|
def perform_check
|
26
26
|
_setup
|
27
|
-
self.allowed =
|
28
|
-
messages << "'#{
|
27
|
+
self.allowed = Checkability::Checkable.new(self).check(checkable_conf)
|
28
|
+
messages << "#{allowed}::'#{_value}' is #{_allowness}. "
|
29
29
|
end
|
30
30
|
|
31
31
|
private
|
32
32
|
|
33
|
+
def _value
|
34
|
+
send(_attr_name)
|
35
|
+
end
|
36
|
+
|
37
|
+
def _attr_name
|
38
|
+
checkable_conf[:attr_name] || :value
|
39
|
+
end
|
40
|
+
|
33
41
|
def _setup
|
34
42
|
self.allowed = nil
|
35
43
|
self.messages = []
|
@@ -38,9 +46,5 @@ module Checkability
|
|
38
46
|
def _allowness
|
39
47
|
allowed ? 'ALLOWED' : 'NOT allowed'
|
40
48
|
end
|
41
|
-
|
42
|
-
def _check
|
43
|
-
Checkability::Checkable.new(self).check(checkable_conf)
|
44
|
-
end
|
45
49
|
end
|
46
50
|
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative 'handler'
|
4
|
+
|
5
|
+
module ChainOfResp
|
6
|
+
# @abstract
|
7
|
+
class AbstractHandler < ChainOfResp::Handler
|
8
|
+
# @return [Handler]
|
9
|
+
attr_reader :stop_process_on_failure, :stop_process_on_success
|
10
|
+
attr_accessor :handler, :result
|
11
|
+
|
12
|
+
def initialize(opts = {})
|
13
|
+
@stop_process_on_failure = opts[:stop_process_on_failure] || false
|
14
|
+
@stop_process_on_success = opts[:stop_process_on_success] || false
|
15
|
+
@next_handler = nil
|
16
|
+
post_initialize(opts) # implemented in subclass
|
17
|
+
end
|
18
|
+
|
19
|
+
# @param [Handler] handler
|
20
|
+
#
|
21
|
+
# @return [Handler]
|
22
|
+
def next_handler(handler)
|
23
|
+
@handler = handler if handler
|
24
|
+
|
25
|
+
handler
|
26
|
+
end
|
27
|
+
|
28
|
+
# @abstract
|
29
|
+
#
|
30
|
+
# @param [String] request
|
31
|
+
#
|
32
|
+
# @return [Boolean, nil]
|
33
|
+
def handle(request)
|
34
|
+
check = check_value(request) # imlemented in subclass
|
35
|
+
return true if check && stop_process_on_success
|
36
|
+
|
37
|
+
return false if !check && stop_process_on_failure
|
38
|
+
|
39
|
+
handler&.handle(request)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ChainOfResp
|
4
|
+
# @abstract
|
5
|
+
class Handler
|
6
|
+
# @abstract
|
7
|
+
#
|
8
|
+
# @param [Handler] handler
|
9
|
+
def next_handler=(_handler)
|
10
|
+
raise NotImplementedError, "#{self.class} has not implemented method '#{__method__}'"
|
11
|
+
end
|
12
|
+
|
13
|
+
# @abstract
|
14
|
+
#
|
15
|
+
# @param [String] request
|
16
|
+
#
|
17
|
+
# @return [String, nil]
|
18
|
+
def handle(_request)
|
19
|
+
raise NotImplementedError, "#{self.class} has not implemented method '#{__method__}'"
|
20
|
+
end
|
21
|
+
|
22
|
+
# @abstract
|
23
|
+
#
|
24
|
+
# @param [String] request
|
25
|
+
#
|
26
|
+
# @return [Boolean, true|false]
|
27
|
+
def check_value(_request)
|
28
|
+
raise NotImplementedError, "#{self.class} has not implemented method '#{__method__}'"
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Checkability
|
2
4
|
# Implements check method to Iterate on chechers
|
3
5
|
# Possible to implemet as Iterator in future
|
@@ -7,32 +9,42 @@ module Checkability
|
|
7
9
|
|
8
10
|
def initialize(checkable)
|
9
11
|
@checkable = checkable
|
12
|
+
@checkable.messages = []
|
10
13
|
end
|
11
14
|
|
12
|
-
#
|
13
|
-
#
|
14
|
-
#
|
15
|
-
#
|
16
|
-
#
|
17
|
-
#
|
15
|
+
# As in result handlers should behave like this:
|
16
|
+
# validator .set_next(storage)
|
17
|
+
# storage .set_next(api_validator)
|
18
|
+
# api_validator.set_next(api_finder)
|
19
|
+
# api_validator.set_next(nil)
|
20
|
+
#
|
21
|
+
# validator.handle(request)
|
22
|
+
#
|
18
23
|
def check(opts = {})
|
19
|
-
|
20
|
-
opts[
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
end
|
25
|
-
opts[:strategy].call(results)
|
24
|
+
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
29
|
end
|
27
30
|
|
28
31
|
private
|
29
32
|
|
30
|
-
def
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
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
|
39
|
+
handlers.each do |handler_name, handler|
|
40
|
+
next_handler_name = handler_confs[handler_name][:next_handler]
|
41
|
+
handler.next_handler(handlers[next_handler_name])
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def _make_handler(_name, conf)
|
46
|
+
k = Checkability.const_get conf[:name].to_s.camelize
|
47
|
+
k.new(conf)
|
36
48
|
end
|
37
49
|
end
|
38
50
|
end
|
@@ -1,16 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'faraday'
|
2
4
|
require 'net/http'
|
3
5
|
require 'net/https'
|
4
6
|
require 'json'
|
5
7
|
|
8
|
+
# frozen_string_literal: true
|
9
|
+
|
10
|
+
require_relative 'chain_of_resp/abstract_handler'
|
6
11
|
module Checkability
|
7
12
|
# Checks if postcode exists in external API
|
8
13
|
#
|
9
|
-
class ExternalApiChecker
|
14
|
+
class ExternalApiChecker < ChainOfResp::AbstractHandler
|
10
15
|
attr_reader :path, :path_suffix, :check_method, :connection, :http_verb,
|
11
16
|
:failure_message, :success_message
|
12
17
|
|
13
|
-
def
|
18
|
+
def post_initialize(conf = {})
|
14
19
|
@path = conf[:path]
|
15
20
|
@http_verb = conf[:http_verb] || :get
|
16
21
|
@path_suffix = conf[:path_suffix] || ''
|
@@ -21,8 +26,9 @@ module Checkability
|
|
21
26
|
end
|
22
27
|
|
23
28
|
def check_value(checkable)
|
24
|
-
@resp = connection
|
25
|
-
|
29
|
+
@resp = connection
|
30
|
+
.connect
|
31
|
+
.send(http_verb, "#{checkable.value.delete(' ')}#{path_suffix}")
|
26
32
|
result, message = _result_and_message
|
27
33
|
checkable.messages << message
|
28
34
|
result
|
@@ -30,8 +36,8 @@ module Checkability
|
|
30
36
|
|
31
37
|
private
|
32
38
|
|
33
|
-
def _message(str)
|
34
|
-
"#{path}: #{str}"
|
39
|
+
def _message(str, res)
|
40
|
+
"#{res}::#{path}: #{str}"
|
35
41
|
end
|
36
42
|
|
37
43
|
def _parsed(resp)
|
@@ -39,14 +45,14 @@ module Checkability
|
|
39
45
|
end
|
40
46
|
|
41
47
|
def _result_and_message
|
42
|
-
return [false, _message(@resp.status)] unless @resp.status == 200
|
48
|
+
return [false, _message(@resp.status, false)] unless @resp.status == 200
|
43
49
|
|
44
|
-
return [true, _message(success_message)] if check_method
|
45
|
-
|
50
|
+
return [true, _message(success_message, true)] if check_method
|
51
|
+
.call(_parsed(@resp))
|
46
52
|
|
47
|
-
[false, _message(failure_message)]
|
53
|
+
[false, _message(failure_message, false)]
|
48
54
|
rescue StandardError => e
|
49
|
-
[false, _message(e)]
|
55
|
+
[false, _message(e, false)]
|
50
56
|
end
|
51
57
|
end
|
52
58
|
end
|
data/lib/checkability/railtie.rb
CHANGED
@@ -1,17 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative 'chain_of_resp/abstract_handler'
|
1
4
|
module Checkability
|
2
5
|
# Checks if postcode exists in Storage
|
3
6
|
#
|
4
|
-
class StorageChecker
|
7
|
+
class StorageChecker < ChainOfResp::AbstractHandler
|
5
8
|
attr_reader :storage_class
|
6
9
|
|
7
|
-
def
|
10
|
+
def post_initialize(conf = {})
|
8
11
|
@storage_class = conf[:storage_class]
|
9
12
|
end
|
10
13
|
|
11
14
|
def check_value(checkable)
|
12
15
|
value = checkable.value.upcase
|
13
16
|
result = _present_in_storage(value)
|
14
|
-
checkable.messages << (
|
17
|
+
checkable.messages << (
|
18
|
+
result ? _message('Found', result) : _message('Not found', result))
|
15
19
|
result
|
16
20
|
end
|
17
21
|
|
@@ -22,8 +26,8 @@ module Checkability
|
|
22
26
|
.present?
|
23
27
|
end
|
24
28
|
|
25
|
-
def _message(str)
|
26
|
-
"Allowed #{storage_class}s list: #{str}."
|
29
|
+
def _message(str, res)
|
30
|
+
"#{res}::Allowed #{storage_class}s list: #{str}."
|
27
31
|
end
|
28
32
|
end
|
29
33
|
end
|
@@ -1,10 +1,12 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Checkability
|
2
4
|
# Checks if postcode comply with regex
|
3
5
|
#
|
4
|
-
class Validator
|
6
|
+
class Validator < ChainOfResp::AbstractHandler
|
5
7
|
attr_reader :format
|
6
8
|
|
7
|
-
def
|
9
|
+
def post_initialize(conf = {})
|
8
10
|
@format = conf[:format]
|
9
11
|
end
|
10
12
|
|
@@ -18,9 +20,9 @@ module Checkability
|
|
18
20
|
|
19
21
|
def _result_and_message(checkable)
|
20
22
|
if (checkable.value.delete(' ') =~ format[:regex]).nil?
|
21
|
-
[false, "Value is NOT COMPLY with format of #{format[:name]}."]
|
23
|
+
[false, "false::Value is NOT COMPLY with format of #{format[:name]}."]
|
22
24
|
else
|
23
|
-
[true, "Value is COMPLY with format of #{format[:name]}."]
|
25
|
+
[true, "true::Value is COMPLY with format of #{format[:name]}."]
|
24
26
|
end
|
25
27
|
end
|
26
28
|
end
|
data/lib/checkability/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: checkability
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.6.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andrey Eremeev
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-04-
|
11
|
+
date: 2021-04-03 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: Provide Checkers functionality.
|
14
14
|
email:
|
@@ -24,6 +24,8 @@ files:
|
|
24
24
|
- bin/checkability
|
25
25
|
- lib/checkability.rb
|
26
26
|
- lib/checkability/acts_as_checkable.rb
|
27
|
+
- lib/checkability/chain_of_resp/abstract_handler.rb
|
28
|
+
- lib/checkability/chain_of_resp/handler.rb
|
27
29
|
- lib/checkability/checkable.rb
|
28
30
|
- lib/checkability/external_api_checker.rb
|
29
31
|
- lib/checkability/external_api_connector.rb
|
@@ -40,7 +42,7 @@ metadata:
|
|
40
42
|
homepage_uri: https://github.com/azazelo/checkability
|
41
43
|
source_code_uri: https://rubygems.org
|
42
44
|
changelog_uri: https://rubygems.org
|
43
|
-
post_install_message:
|
45
|
+
post_install_message:
|
44
46
|
rdoc_options: []
|
45
47
|
require_paths:
|
46
48
|
- lib
|
@@ -48,16 +50,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
48
50
|
requirements:
|
49
51
|
- - ">="
|
50
52
|
- !ruby/object:Gem::Version
|
51
|
-
version:
|
53
|
+
version: 2.6.2
|
52
54
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
53
55
|
requirements:
|
54
56
|
- - ">="
|
55
57
|
- !ruby/object:Gem::Version
|
56
58
|
version: '0'
|
57
59
|
requirements: []
|
58
|
-
|
59
|
-
|
60
|
-
signing_key:
|
60
|
+
rubygems_version: 3.0.3
|
61
|
+
signing_key:
|
61
62
|
specification_version: 4
|
62
63
|
summary: Provide Checkers functionality.
|
63
64
|
test_files: []
|