valid_email2 3.3.0 → 3.3.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b11e62f82282c1cc81c9698a17a44af5d2a0baec3dc9a1f147e8b9f6201885cd
4
- data.tar.gz: 24b9024326e7f3ad965802c320901f2ecbd42cfcfc7c0b06e757f73767a6ae92
3
+ metadata.gz: fe834d489ba46cf4a8262cb077bf2f88b0fd866b604bf1ae628d877bbfdbb57b
4
+ data.tar.gz: af8e27efffae003ed85189ae10d1f9b6e30817e8529deb4064811156a332208e
5
5
  SHA512:
6
- metadata.gz: cbb94d6b281464231ef30464b775fcbe1d404a8651105b2fe4b488182bc3cdcce9b2140d0a24431db7570c302c85e353f16e4f4444cd4edda009645a64f54ed4
7
- data.tar.gz: f5783382e56e570a02dd5abb0e7190d4f4e457a5b47e523bd21ddc4eab51fac7680811e2913e56e1db9ee1593f4c368c7f594558227ce635252c1a1e731a8484
6
+ metadata.gz: 300c5f449125f0d6bd1abfd224aa88c65caa0377fe2b2a56ec6bc695bb3c0e9bac4ea03f2c091509c19f5cb8614137578ec8fc52a844cfd0765f9da7d5707615
7
+ data.tar.gz: ce9dfe893b11555a195f4777e3146f0065c3d49c26b289e874d01cb40da0f02f575f5a3efd8430e57bffdd2aaf52a36f05056986b789b3bd982b14d889bea0e2
@@ -1,3 +1,6 @@
1
+ ## Version 3.3.1
2
+ * Fix some performance regressions (https://github.com/micke/valid_email2/pull/150)
3
+
1
4
  ## Version 3.3.0
2
5
  * Allow multiple addresses separated by comma (https://github.com/micke/valid_email2/pull/156)
3
6
  * Make prohibited_domain_characters_regex changeable (https://github.com/micke/valid_email2/pull/157)
@@ -7,23 +7,35 @@ module ValidEmail2
7
7
  WHITELIST_FILE = "config/whitelisted_email_domains.yml"
8
8
  DISPOSABLE_FILE = File.expand_path('../config/disposable_email_domains.txt', __dir__)
9
9
 
10
- def self.disposable_emails
11
- @disposable_emails ||= File.open(DISPOSABLE_FILE){ |f| f.read }.split("\n")
12
- end
10
+ class << self
11
+ def disposable_emails
12
+ @disposable_emails ||= load_file(DISPOSABLE_FILE)
13
+ end
13
14
 
14
- def self.blacklist
15
- @blacklist ||= if File.exist?(BLACKLIST_FILE)
16
- YAML.load_file(File.expand_path(BLACKLIST_FILE))
17
- else
18
- []
19
- end
20
- end
15
+ def blacklist
16
+ @blacklist ||= load_if_exists(BLACKLIST_FILE)
17
+ end
18
+
19
+ def whitelist
20
+ @whitelist ||= load_if_exists(WHITELIST_FILE)
21
+ end
22
+
23
+ private
24
+
25
+ def load_if_exists(path)
26
+ File.exist?(path) ? load_file(path) : Set.new
27
+ end
21
28
 
22
- def self.whitelist
23
- @whitelist ||= if File.exist?(WHITELIST_FILE)
24
- YAML.load_file(File.expand_path(WHITELIST_FILE))
25
- else
26
- []
27
- end
29
+ def load_file(path)
30
+ # This method MUST return a Set, otherwise the
31
+ # performance will suffer!
32
+ if path.end_with?(".yml")
33
+ Set.new(YAML.load_file(path))
34
+ else
35
+ File.open(path, "r").each_line.each_with_object(Set.new) do |domain, set|
36
+ set << domain.tap(&:chomp!)
37
+ end
38
+ end
39
+ end
28
40
  end
29
41
  end
@@ -32,25 +32,20 @@ module ValidEmail2
32
32
  end
33
33
 
34
34
  def valid?
35
- @valid ||= begin
36
- return false if @parse_error
35
+ return @valid unless @valid.nil?
36
+ return false if @parse_error
37
37
 
38
+ @valid = begin
38
39
  if address.domain && address.address == @raw_address
39
40
  domain = address.domain
40
41
 
41
42
  domain !~ self.class.prohibited_domain_characters_regex &&
42
- # Domain needs to have at least one dot
43
- domain =~ /\./ &&
44
- # Domain may not have two consecutive dots
45
- domain !~ /\.{2,}/ &&
46
- # Domain may not start with a dot
47
- domain !~ /^\./ &&
48
- # Domain may not start with a dash
49
- domain !~ /^-/ &&
50
- # Domain name may not end with a dash
51
- domain !~ /-\./ &&
52
- # Address may not contain a dot directly before @
53
- address.address !~ /\.@/
43
+ domain.include?('.') &&
44
+ !domain.include?('..') &&
45
+ !domain.start_with?('.') &&
46
+ !domain.start_with?('-') &&
47
+ !domain.include?('-.') &&
48
+ !address.local.end_with?('.')
54
49
  else
55
50
  false
56
51
  end
@@ -70,7 +65,7 @@ module ValidEmail2
70
65
  end
71
66
 
72
67
  def disposable_domain?
73
- valid? && domain_is_in?(ValidEmail2.disposable_emails)
68
+ domain_is_in?(ValidEmail2.disposable_emails)
74
69
  end
75
70
 
76
71
  def disposable_mx_server?
@@ -1,3 +1,3 @@
1
1
  module ValidEmail2
2
- VERSION = "3.3.0"
2
+ VERSION = "3.3.1"
3
3
  end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "spec_helper"
4
+
5
+ describe "Performance testing" do
6
+ let(:disposable_domain) { ValidEmail2.disposable_emails.first }
7
+
8
+ it "has acceptable lookup performance" do
9
+ address = ValidEmail2::Address.new("test@example.com")
10
+
11
+ # preload list and check size
12
+ expect(ValidEmail2.disposable_emails).to be_a(Set)
13
+ expect(ValidEmail2.disposable_emails.count).to be > 30000
14
+
15
+ # check lookup timing
16
+ expect { address.disposable_domain? }.to perform_under(0.0001).sample(10).times
17
+ end
18
+ end
@@ -1,6 +1,15 @@
1
1
  $:.unshift File.expand_path("../lib",__FILE__)
2
2
  require "valid_email2"
3
3
 
4
+ # Include and configure benchmark
5
+ require 'rspec-benchmark'
6
+ RSpec.configure do |config|
7
+ config.include RSpec::Benchmark::Matchers
8
+ end
9
+ RSpec::Benchmark.configure do |config|
10
+ config.disable_gc = true
11
+ end
12
+
4
13
  class TestModel
5
14
  include ActiveModel::Validations
6
15
 
@@ -87,16 +87,11 @@ describe ValidEmail2 do
87
87
  expect(user.valid?).to be_falsey
88
88
  end
89
89
 
90
- it "is invalid if the domain contains emoticons" do
90
+ it "is invalid if the email contains emoticons" do
91
91
  user = TestUser.new(email: "foo🙈@gmail.com")
92
92
  expect(user.valid?).to be_falsy
93
93
  end
94
94
 
95
- it "is invalid if the domain contains .@ consecutively" do
96
- user = TestUser.new(email: "foo.@gmail.com")
97
- expect(user.valid?).to be_falsy
98
- end
99
-
100
95
  it "is invalid if the domain contains spaces" do
101
96
  user = TestUser.new(email: "user@gmail .com")
102
97
  expect(user.valid?).to be_falsy
@@ -23,6 +23,7 @@ Gem::Specification.new do |spec|
23
23
  spec.add_development_dependency "bundler", "~> 2.0"
24
24
  spec.add_development_dependency "rake", "~> 12.3.3"
25
25
  spec.add_development_dependency "rspec", "~> 3.5.0"
26
+ spec.add_development_dependency "rspec-benchmark", "~> 0.6"
26
27
  spec.add_development_dependency "pry"
27
28
  spec.add_runtime_dependency "mail", "~> 2.5"
28
29
  spec.add_runtime_dependency "activemodel", ">= 3.2"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: valid_email2
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.3.0
4
+ version: 3.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Micke Lisinge
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-08-07 00:00:00.000000000 Z
11
+ date: 2020-08-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -52,6 +52,20 @@ dependencies:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
54
  version: 3.5.0
55
+ - !ruby/object:Gem::Dependency
56
+ name: rspec-benchmark
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '0.6'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '0.6'
55
69
  - !ruby/object:Gem::Dependency
56
70
  name: pry
57
71
  requirement: !ruby/object:Gem::Requirement
@@ -120,6 +134,7 @@ files:
120
134
  - lib/valid_email2/email_validator.rb
121
135
  - lib/valid_email2/version.rb
122
136
  - pull_mailchecker_emails.rb
137
+ - spec/benchmark_spec.rb
123
138
  - spec/spec_helper.rb
124
139
  - spec/valid_email2_spec.rb
125
140
  - valid_email2.gemspec
@@ -148,5 +163,6 @@ specification_version: 4
148
163
  summary: ActiveModel validation for email. Including MX lookup and disposable email
149
164
  blacklist
150
165
  test_files:
166
+ - spec/benchmark_spec.rb
151
167
  - spec/spec_helper.rb
152
168
  - spec/valid_email2_spec.rb