spam_guardian 0.1.0 → 0.2.0

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: 89f3e26ee5950d8bec3655f84eda27e109fa7f020373743e03efdeadb93a65ba
4
- data.tar.gz: 48be50ccebc9c0e73ad79dd58033dde0f53123275cb38ace9ee7f5ccb10345c9
3
+ metadata.gz: 244a0e9f817a4d939b9df187ba1cfb49e11a2f9a55c25e6eead4d00c55693be5
4
+ data.tar.gz: 6a8a827cb4d869a80d2ad32ad2bef8b32ecb033e76ca8a80c8b4a05237526121
5
5
  SHA512:
6
- metadata.gz: 3b71cd2a7319ce8eadb59fe78efa707de8e2728d409f3015130f5a4f94248852908b931909df715a75599f3d343bcadc4d53140bca8a85f9b46ce4773e2e5707
7
- data.tar.gz: 54ef8b01489a1e7d112ecc6c902d942baacb7b0cd67f0a625e2f8526d52d9ec87402e0b28755c62087389abd6a78431331499d9e2e7a49c64147261a0e1ed9fe
6
+ metadata.gz: 5a776c797a65f38d63b49a394c7f4d80302af6dc48b0325f6ad3b717cf09af8bfe0058b96b4d251f4eb1b961044dc498c37d82150fbaf61a135e31ec67b1c741
7
+ data.tar.gz: 4d264062fe35f4a9844d2a0cbd42d06d5c9ec10412768cd185a35cd813c2b54c99bfbfad422b8c0a6232c28055265cdb677c6a3cd8d9630bfbbd15bbf2c3849c
@@ -0,0 +1,5 @@
1
+ module SpamGuardian
2
+ class FormatError < StandardError
3
+
4
+ end
5
+ end
@@ -1,4 +1,3 @@
1
-
2
1
  module SpamGuardian
3
2
  IpCheck = Struct.new(:ip) do
4
3
  def valid?
@@ -0,0 +1,76 @@
1
+ require 'active_support'
2
+ require 'active_support/core_ext'
3
+ require 'spam_guardian/email_check'
4
+ require 'spam_guardian/ip_check'
5
+ require 'spam_guardian/value_check'
6
+ module SpamGuardian
7
+ class ParamsBuilder < ActiveSupport::HashWithIndifferentAccess
8
+ # Support string
9
+ # support nth array
10
+ # Support nth array of string
11
+ # Support nth array of hash of string
12
+ # Support nth array of hash of array
13
+ # Support hash of string
14
+ # Support hash of array of string
15
+ ALLOWED_KEYS = %i(email ip username).freeze
16
+ attr_reader :temp_params
17
+ def initialize(params={})
18
+ super Hash.new { |hash, key| hash[key] = [] }
19
+ case params
20
+ when String
21
+ self[parse_key(params)] << params
22
+ when Array
23
+ parse_array(params)
24
+ when Hash
25
+ parse_hash(params)
26
+ else
27
+ raise FormatError.new("Invalid format.")
28
+ end
29
+ end
30
+
31
+ private
32
+ def validate_hash_keys!(hash)
33
+ hash.each_key do |key|
34
+ raise FormatError.new("#{key}: invalid key.") unless key.to_sym.in?(ALLOWED_KEYS)
35
+ end
36
+ end
37
+
38
+ def parse_key(string)
39
+ if EmailCheck.new(string).valid?
40
+ 'email'
41
+ elsif IpCheck.new(string).valid?
42
+ 'ip'
43
+ else
44
+ 'username'
45
+ end
46
+ end
47
+
48
+ def parse_array(array)
49
+ array.flatten.each do |value|
50
+ case value
51
+ when String
52
+ self[parse_key(value)] << value
53
+ when Hash
54
+ parse_hash(value)
55
+ else
56
+ raise FormatError.new("Invalid format.")
57
+ end
58
+ end
59
+ end
60
+
61
+ def parse_hash(hash)
62
+ validate_hash_keys!(hash)
63
+ hash.each do |key, value|
64
+ case value
65
+ when String
66
+ self[key] << value
67
+ when Array
68
+ raise FormatError.new("Invalid format.") unless ValueCheck.new(Array).sub_class(String).check(value)
69
+ self[key].concat(value)
70
+ else
71
+ raise FormatError.new("Invalid format.")
72
+ end
73
+ end
74
+ end
75
+ end
76
+ end
@@ -5,35 +5,40 @@ require 'json'
5
5
  require 'spam_guardian/email_check'
6
6
  require 'spam_guardian/ip_check'
7
7
  require 'spam_guardian/client'
8
+ require 'spam_guardian/value_check'
9
+ require 'spam_guardian/params_builder'
8
10
  module SpamGuardian
9
- Validator = Struct.new(:ip_or_email) do
11
+ class Validator
12
+ attr_reader :params, :spams, :response
13
+ def initialize(object)
14
+ @params = ParamsBuilder.new(object)
15
+ @spams = []
16
+ end
10
17
 
11
18
  def valid?
12
- return unless ip_or_email.is_a?(String) && key.present?
13
19
  validate!
14
- @valid
20
+ spams.count.zero?
15
21
  end
16
22
 
17
23
  def validate!
18
24
  return if @validated
19
25
  @response = Client.new.get(params)
20
- @valid = @response[key].fetch('frequency', 0).to_i.zero?
26
+ params.each_key do |key|
27
+ case response[key]
28
+ when Hash
29
+ validate_response(response[key])
30
+ when Array
31
+ response[key].each do |hash|
32
+ validate_response(hash)
33
+ end
34
+ end
35
+ end
21
36
  @validated = true
22
37
  end
23
38
 
24
- def params
25
- { key => ip_or_email }
26
- end
27
-
28
- def key
29
- @key ||= begin
30
- if EmailCheck.new(ip_or_email).valid?
31
- 'email'
32
- elsif IpCheck.new(ip_or_email).valid?
33
- 'ip'
34
- else
35
- 'username'
36
- end
39
+ def validate_response(response)
40
+ unless response.fetch('frequency', 0).to_i.zero?
41
+ spams << response.fetch('value', '')
37
42
  end
38
43
  end
39
44
  end
@@ -0,0 +1,37 @@
1
+ require 'active_support'
2
+ require 'active_support/core_ext'
3
+ module SpamGuardian
4
+ class ValueCheck
5
+ attr_reader :klass
6
+ def initialize(klass)
7
+ raise FormatError("'#{klass}';Should be a class.") unless klass.is_a?(Class)
8
+ @klass = klass
9
+ end
10
+
11
+ def sub_class(klass)
12
+ raise FormatError("'#{klass}';Should be a class.") unless klass.is_a?(Class)
13
+ dup.tap do |checker|
14
+ checker.instance_eval do
15
+ if @sub_checker.is_a?(ValueCheck)
16
+ @sub_checker = @sub_checker.sub_class(klass)
17
+ else
18
+ @sub_checker = ValueCheck.new(klass)
19
+ end
20
+ end
21
+ end
22
+ end
23
+
24
+ def check(value)
25
+ return false unless value.is_a?(klass)
26
+ case value
27
+ when Array, Hash
28
+ return true unless @sub_checker.is_a?(ValueCheck)
29
+ value.all? do |(*args)|
30
+ @sub_checker.check(args.last)
31
+ end
32
+ else
33
+ true
34
+ end
35
+ end
36
+ end
37
+ end
@@ -1,3 +1,3 @@
1
1
  module SpamGuardian
2
- VERSION = "0.1.0"
2
+ VERSION = "0.2.0"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: spam_guardian
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - frank0224
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-12-19 00:00:00.000000000 Z
11
+ date: 2021-12-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -86,8 +86,11 @@ files:
86
86
  - lib/spam_guardian.rb
87
87
  - lib/spam_guardian/client.rb
88
88
  - lib/spam_guardian/email_check.rb
89
+ - lib/spam_guardian/format_error.rb
89
90
  - lib/spam_guardian/ip_check.rb
91
+ - lib/spam_guardian/params_builder.rb
90
92
  - lib/spam_guardian/validator.rb
93
+ - lib/spam_guardian/value_check.rb
91
94
  - lib/spam_guardian/version.rb
92
95
  - spam_guardian.gemspec
93
96
  homepage: https://github.com/koten0224/spam_guardian
@@ -113,7 +116,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
113
116
  - !ruby/object:Gem::Version
114
117
  version: '0'
115
118
  requirements: []
116
- rubygems_version: 3.0.8
119
+ rubygems_version: 3.1.4
117
120
  signing_key:
118
121
  specification_version: 4
119
122
  summary: Spam Guardian