truemail 2.0.0 → 2.2.1

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.
@@ -10,7 +10,7 @@ module Truemail
10
10
  class << self
11
11
  def configuration(&block)
12
12
  @configuration ||= begin
13
- return unless block_given?
13
+ return unless block
14
14
  configuration = Truemail::Configuration.new(&block)
15
15
  raise_unless(configuration.complete?, Truemail::INCOMPLETE_CONFIG)
16
16
  configuration
@@ -21,13 +21,13 @@ module Truemail
21
21
  :blacklisted_domains,
22
22
  :logger
23
23
 
24
- attr_accessor :whitelist_validation, :not_rfc_mx_lookup_flow, :smtp_safe_check
24
+ attr_accessor :whitelist_validation, :not_rfc_mx_lookup_flow, :smtp_fail_fast, :smtp_safe_check
25
25
 
26
26
  def initialize(&block)
27
27
  instance_initializer.each do |instace_variable, value|
28
28
  instance_variable_set(:"@#{instace_variable}", value)
29
29
  end
30
- tap(&block) if block_given?
30
+ tap(&block) if block
31
31
  end
32
32
 
33
33
  %i[email_pattern smtp_error_body_pattern].each do |method|
@@ -102,6 +102,7 @@ module Truemail
102
102
  whitelist_validation: false,
103
103
  blacklisted_domains: [],
104
104
  not_rfc_mx_lookup_flow: false,
105
+ smtp_fail_fast: false,
105
106
  smtp_safe_check: false
106
107
  }
107
108
  end
@@ -32,7 +32,7 @@ module Truemail
32
32
 
33
33
  module RegexConstant
34
34
  REGEX_DOMAIN = /[\p{L}0-9]+([\-.]{1}[\p{L}0-9]+)*\.\p{L}{2,63}/i.freeze
35
- REGEX_EMAIL_PATTERN = /(?=\A.{6,255}\z)(\A([\p{L}0-9]+[\w|\-|.|+]*)@(#{REGEX_DOMAIN})\z)/.freeze
35
+ REGEX_EMAIL_PATTERN = /(?=\A.{6,255}\z)(\A([\p{L}0-9]+[\w|\-.+]*)@(#{REGEX_DOMAIN})\z)/.freeze
36
36
  REGEX_DOMAIN_PATTERN = /(?=\A.{4,255}\z)(\A#{REGEX_DOMAIN}\z)/.freeze
37
37
  REGEX_DOMAIN_FROM_EMAIL = /\A.+@(.+)\z/.freeze
38
38
  REGEX_SMTP_ERROR_BODY_PATTERN = /(?=.*550)(?=.*(user|account|customer|mailbox)).*/i.freeze
@@ -56,6 +56,7 @@ module Truemail
56
56
  whitelisted_domains: whitelisted_domains,
57
57
  blacklisted_domains: blacklisted_domains,
58
58
  not_rfc_mx_lookup_flow: executor_configuration.not_rfc_mx_lookup_flow,
59
+ smtp_fail_fast: executor_configuration.smtp_fail_fast,
59
60
  smtp_safe_check: executor_configuration.smtp_safe_check,
60
61
  email_pattern: email_pattern,
61
62
  smtp_error_body_pattern: smtp_error_body_pattern
@@ -13,6 +13,10 @@ module Truemail
13
13
 
14
14
  attr_reader :validation_type
15
15
 
16
+ def replace_invalid_chars
17
+ ->(value) { value.encode('UTF-8', invalid: :replace) }
18
+ end
19
+
16
20
  def smtp_debug
17
21
  validation_smtp_debug = executor_result.smtp_debug
18
22
  return unless validation_smtp_debug
@@ -22,7 +26,7 @@ module Truemail
22
26
  mail_host: smtp_request.host,
23
27
  port_opened: smtp_response.port_opened,
24
28
  connection: smtp_response.connection,
25
- errors: smtp_response.errors
29
+ errors: smtp_response.errors.transform_values(&replace_invalid_chars)
26
30
  }
27
31
  end
28
32
  end
@@ -30,7 +30,7 @@ module Truemail
30
30
  end
31
31
 
32
32
  def fetch_target_hosts(hosts)
33
- mail_servers.push(*hosts)
33
+ mail_servers.push(*(hosts.uniq - mail_servers))
34
34
  end
35
35
 
36
36
  def null_mx?(domain_mx_records)
@@ -24,13 +24,23 @@ module Truemail
24
24
 
25
25
  private
26
26
 
27
- def request
28
- smtp_results.last
27
+ def fail_fast?
28
+ configuration.smtp_fail_fast
29
+ end
30
+
31
+ def filtered_mail_servers_by_fail_fast_scenario
32
+ fail_fast? ? mail_servers.first(1) : mail_servers
29
33
  end
30
34
 
31
35
  def attempts
32
- @attempts ||=
33
- mail_servers.one? ? { attempts: configuration.connection_attempts } : {}
36
+ @attempts ||= begin
37
+ return {} if fail_fast? || !mail_servers.one?
38
+ { attempts: configuration.connection_attempts }
39
+ end
40
+ end
41
+
42
+ def request
43
+ smtp_results.last
34
44
  end
35
45
 
36
46
  def rcptto_error
@@ -38,7 +48,7 @@ module Truemail
38
48
  end
39
49
 
40
50
  def establish_smtp_connection
41
- mail_servers.each do |mail_server|
51
+ filtered_mail_servers_by_fail_fast_scenario.each do |mail_server|
42
52
  smtp_results << Truemail::Validate::Smtp::Request.new(
43
53
  configuration: configuration, host: mail_server, email: result.punycode_email, **attempts
44
54
  )
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Truemail
4
- VERSION = '2.0.0'
4
+ VERSION = '2.2.1'
5
5
  end
@@ -35,17 +35,17 @@ Gem::Specification.new do |spec|
35
35
 
36
36
  spec.add_development_dependency 'bundler', '~> 1.16'
37
37
  spec.add_development_dependency 'bundler-audit', '~> 0.7.0.1'
38
+ spec.add_development_dependency 'faker', '~> 2.15', '>= 2.15.1'
38
39
  spec.add_development_dependency 'fasterer', '~> 0.8.3'
39
- spec.add_development_dependency 'ffaker', '~> 2.17'
40
40
  spec.add_development_dependency 'json_matchers', '~> 0.11.1'
41
- spec.add_development_dependency 'overcommit', '~> 0.55.0'
41
+ spec.add_development_dependency 'overcommit', '~> 0.57.0'
42
42
  spec.add_development_dependency 'pry-byebug', '~> 3.9'
43
43
  spec.add_development_dependency 'rake', '~> 13.0', '>= 13.0.1'
44
- spec.add_development_dependency 'reek', '~> 6.0', '>= 6.0.1'
45
- spec.add_development_dependency 'rspec', '~> 3.9'
46
- spec.add_development_dependency 'rubocop', '~> 0.91.0'
47
- spec.add_development_dependency 'rubocop-performance', '~> 1.8', '>= 1.8.1'
48
- spec.add_development_dependency 'rubocop-rspec', '~> 1.43', '>= 1.43.2'
44
+ spec.add_development_dependency 'reek', '~> 6.0', '>= 6.0.2'
45
+ spec.add_development_dependency 'rspec', '~> 3.10'
46
+ spec.add_development_dependency 'rubocop', '~> 1.5', '>= 1.5.2'
47
+ spec.add_development_dependency 'rubocop-performance', '~> 1.9', '>= 1.9.1'
48
+ spec.add_development_dependency 'rubocop-rspec', '~> 2.0', '>= 2.0.1'
49
49
  spec.add_development_dependency 'simplecov', '~> 0.17.1'
50
- spec.add_development_dependency 'truemail-rspec', '~> 0.2.1'
50
+ spec.add_development_dependency 'truemail-rspec', '~> 0.3.3'
51
51
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: truemail
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.0
4
+ version: 2.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Vladislav Trotsenko
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-10-19 00:00:00.000000000 Z
11
+ date: 2020-12-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: simpleidn
@@ -53,33 +53,39 @@ dependencies:
53
53
  - !ruby/object:Gem::Version
54
54
  version: 0.7.0.1
55
55
  - !ruby/object:Gem::Dependency
56
- name: fasterer
56
+ name: faker
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: 0.8.3
61
+ version: '2.15'
62
+ - - ">="
63
+ - !ruby/object:Gem::Version
64
+ version: 2.15.1
62
65
  type: :development
63
66
  prerelease: false
64
67
  version_requirements: !ruby/object:Gem::Requirement
65
68
  requirements:
66
69
  - - "~>"
67
70
  - !ruby/object:Gem::Version
68
- version: 0.8.3
71
+ version: '2.15'
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ version: 2.15.1
69
75
  - !ruby/object:Gem::Dependency
70
- name: ffaker
76
+ name: fasterer
71
77
  requirement: !ruby/object:Gem::Requirement
72
78
  requirements:
73
79
  - - "~>"
74
80
  - !ruby/object:Gem::Version
75
- version: '2.17'
81
+ version: 0.8.3
76
82
  type: :development
77
83
  prerelease: false
78
84
  version_requirements: !ruby/object:Gem::Requirement
79
85
  requirements:
80
86
  - - "~>"
81
87
  - !ruby/object:Gem::Version
82
- version: '2.17'
88
+ version: 0.8.3
83
89
  - !ruby/object:Gem::Dependency
84
90
  name: json_matchers
85
91
  requirement: !ruby/object:Gem::Requirement
@@ -100,14 +106,14 @@ dependencies:
100
106
  requirements:
101
107
  - - "~>"
102
108
  - !ruby/object:Gem::Version
103
- version: 0.55.0
109
+ version: 0.57.0
104
110
  type: :development
105
111
  prerelease: false
106
112
  version_requirements: !ruby/object:Gem::Requirement
107
113
  requirements:
108
114
  - - "~>"
109
115
  - !ruby/object:Gem::Version
110
- version: 0.55.0
116
+ version: 0.57.0
111
117
  - !ruby/object:Gem::Dependency
112
118
  name: pry-byebug
113
119
  requirement: !ruby/object:Gem::Requirement
@@ -151,7 +157,7 @@ dependencies:
151
157
  version: '6.0'
152
158
  - - ">="
153
159
  - !ruby/object:Gem::Version
154
- version: 6.0.1
160
+ version: 6.0.2
155
161
  type: :development
156
162
  prerelease: false
157
163
  version_requirements: !ruby/object:Gem::Requirement
@@ -161,75 +167,81 @@ dependencies:
161
167
  version: '6.0'
162
168
  - - ">="
163
169
  - !ruby/object:Gem::Version
164
- version: 6.0.1
170
+ version: 6.0.2
165
171
  - !ruby/object:Gem::Dependency
166
172
  name: rspec
167
173
  requirement: !ruby/object:Gem::Requirement
168
174
  requirements:
169
175
  - - "~>"
170
176
  - !ruby/object:Gem::Version
171
- version: '3.9'
177
+ version: '3.10'
172
178
  type: :development
173
179
  prerelease: false
174
180
  version_requirements: !ruby/object:Gem::Requirement
175
181
  requirements:
176
182
  - - "~>"
177
183
  - !ruby/object:Gem::Version
178
- version: '3.9'
184
+ version: '3.10'
179
185
  - !ruby/object:Gem::Dependency
180
186
  name: rubocop
181
187
  requirement: !ruby/object:Gem::Requirement
182
188
  requirements:
183
189
  - - "~>"
184
190
  - !ruby/object:Gem::Version
185
- version: 0.91.0
191
+ version: '1.5'
192
+ - - ">="
193
+ - !ruby/object:Gem::Version
194
+ version: 1.5.2
186
195
  type: :development
187
196
  prerelease: false
188
197
  version_requirements: !ruby/object:Gem::Requirement
189
198
  requirements:
190
199
  - - "~>"
191
200
  - !ruby/object:Gem::Version
192
- version: 0.91.0
201
+ version: '1.5'
202
+ - - ">="
203
+ - !ruby/object:Gem::Version
204
+ version: 1.5.2
193
205
  - !ruby/object:Gem::Dependency
194
206
  name: rubocop-performance
195
207
  requirement: !ruby/object:Gem::Requirement
196
208
  requirements:
197
209
  - - "~>"
198
210
  - !ruby/object:Gem::Version
199
- version: '1.8'
211
+ version: '1.9'
200
212
  - - ">="
201
213
  - !ruby/object:Gem::Version
202
- version: 1.8.1
214
+ version: 1.9.1
203
215
  type: :development
204
216
  prerelease: false
205
217
  version_requirements: !ruby/object:Gem::Requirement
206
218
  requirements:
207
219
  - - "~>"
208
220
  - !ruby/object:Gem::Version
209
- version: '1.8'
221
+ version: '1.9'
210
222
  - - ">="
211
223
  - !ruby/object:Gem::Version
212
- version: 1.8.1
224
+ version: 1.9.1
213
225
  - !ruby/object:Gem::Dependency
214
226
  name: rubocop-rspec
215
227
  requirement: !ruby/object:Gem::Requirement
216
228
  requirements:
217
229
  - - "~>"
218
230
  - !ruby/object:Gem::Version
219
- version: '1.43'
231
+ version: '2.0'
220
232
  - - ">="
221
233
  - !ruby/object:Gem::Version
222
- version: 1.43.2
234
+ version: 2.0.1
223
235
  type: :development
224
236
  prerelease: false
225
237
  version_requirements: !ruby/object:Gem::Requirement
226
238
  requirements:
227
239
  - - "~>"
228
240
  - !ruby/object:Gem::Version
229
- version: '1.43'
241
+ version: '2.0'
230
242
  - - ">="
231
243
  - !ruby/object:Gem::Version
232
- version: 1.43.2
244
+ version: 2.0.1
233
245
  - !ruby/object:Gem::Dependency
234
246
  name: simplecov
235
247
  requirement: !ruby/object:Gem::Requirement
@@ -250,14 +262,14 @@ dependencies:
250
262
  requirements:
251
263
  - - "~>"
252
264
  - !ruby/object:Gem::Version
253
- version: 0.2.1
265
+ version: 0.3.3
254
266
  type: :development
255
267
  prerelease: false
256
268
  version_requirements: !ruby/object:Gem::Requirement
257
269
  requirements:
258
270
  - - "~>"
259
271
  - !ruby/object:Gem::Version
260
- version: 0.2.1
272
+ version: 0.3.3
261
273
  description: Configurable framework agnostic plain Ruby email validator. Verify email
262
274
  via Regex, DNS and SMTP.
263
275
  email:
@@ -268,7 +280,11 @@ extra_rdoc_files: []
268
280
  files:
269
281
  - ".circleci/config.yml"
270
282
  - ".codeclimate.yml"
271
- - ".github/ISSUE_TEMPLATE.md"
283
+ - ".github/BRANCH_NAMING_CONVENTION.md"
284
+ - ".github/ISSUE_TEMPLATE/bug_report.md"
285
+ - ".github/ISSUE_TEMPLATE/feature_request.md"
286
+ - ".github/ISSUE_TEMPLATE/issue_report.md"
287
+ - ".github/ISSUE_TEMPLATE/question.md"
272
288
  - ".github/PULL_REQUEST_TEMPLATE.md"
273
289
  - ".gitignore"
274
290
  - ".overcommit.yml"