email_predictor 0.0.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 +7 -0
- data/lib/email_predictor/base.rb +17 -0
- data/lib/email_predictor/data_analyser.rb +66 -0
- data/lib/email_predictor/predictor.rb +43 -0
- data/lib/email_predictor/rules.rb +78 -0
- data/lib/email_predictor.rb +5 -0
- metadata +128 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: bc3838f87246bf751929a1a07b00a62cf648efd7
|
4
|
+
data.tar.gz: 683347dace43d89d75630ffb7f442c4650c3b6d7
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: a0edcd07228ff5348e4916bde3d1ad59f18c6dcc90a5a3f491fc9930b913a0a55620e2c9ba1602f8fe779679ed961ce9bedab5114ae149d65743edadb624fda5
|
7
|
+
data.tar.gz: 1e5e6c64a48d2d9a02e8a4d03c301b4a14bc22bee60c7ba938c5ea6efac316f721e0aedf3fad3f26e7b0d2ccdbb6557700540ea3e5fb0577b8f1b356fd2a4465
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module EmailPredictor
|
2
|
+
class Base
|
3
|
+
|
4
|
+
attr_reader :name
|
5
|
+
|
6
|
+
def initialize(opts)
|
7
|
+
@name = opts[:name].downcase
|
8
|
+
end
|
9
|
+
|
10
|
+
#Validate that the name should be in format of firstname lastname
|
11
|
+
def validate!
|
12
|
+
unless @name.split(" ").count.eql?(2)
|
13
|
+
raise TypeError.new("Oops, the name is not in valid format. Should be like 'Firstname lastname', Eg: John Ferguson")
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
#This is responsible for predicting the rules on the knowledge of existing data.
|
2
|
+
# Usage
|
3
|
+
|
4
|
+
# EmailPredictor::DataAnalyser.all
|
5
|
+
# This gives the analysis for all the existing records
|
6
|
+
|
7
|
+
# To find for a particular company
|
8
|
+
# Usage
|
9
|
+
# EmailPredictor::DataAnalyser.find('google')
|
10
|
+
module EmailPredictor
|
11
|
+
|
12
|
+
class DataAnalyser
|
13
|
+
|
14
|
+
attr_reader :company,:rules
|
15
|
+
|
16
|
+
def initialize(opts)
|
17
|
+
@company = opts[:company]
|
18
|
+
@rules = opts[:rules]
|
19
|
+
end
|
20
|
+
|
21
|
+
class << self
|
22
|
+
def all
|
23
|
+
collection = []
|
24
|
+
group_by_company.each_pair do |key,value|
|
25
|
+
collection << new(company: key,rules: get_rules(value))
|
26
|
+
end
|
27
|
+
collection
|
28
|
+
end
|
29
|
+
|
30
|
+
|
31
|
+
def get_rules(employees)
|
32
|
+
EmailPredictor::Rules.get(employees)
|
33
|
+
end
|
34
|
+
|
35
|
+
#Sample dataset
|
36
|
+
#TODO: should be flexible and via a .yml or .json file
|
37
|
+
def dataset
|
38
|
+
{
|
39
|
+
'John Ferguson' => 'john.ferguson@alphasights.com',
|
40
|
+
'Damon Aw' => 'damon.aw@alphasights.com',
|
41
|
+
'Linda Li' => 'linda.li@alphasights.com',
|
42
|
+
'Larry Page' => 'larry.p@google.com',
|
43
|
+
'Sergey Brin' => 's.brin@google.com',
|
44
|
+
'Steve Jobs' => 's.j@apple.com'
|
45
|
+
}
|
46
|
+
end
|
47
|
+
|
48
|
+
def find(company)
|
49
|
+
all.find {|i| i.company == company}
|
50
|
+
end
|
51
|
+
|
52
|
+
# We need to group the dataset by the company and the number of people associated with
|
53
|
+
# it
|
54
|
+
def group_by_company
|
55
|
+
hsh = Hash.new
|
56
|
+
dataset.each_pair do |key,value|
|
57
|
+
company = value.split('@')[1].split('.')[0] #get the company name
|
58
|
+
username = value.split('@')[0]
|
59
|
+
hsh[company] ||= []
|
60
|
+
hsh[company] << { name: key,username: username }
|
61
|
+
end
|
62
|
+
hsh
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
#This is reponsible for the call to the engine.
|
2
|
+
# A sample usage can look like
|
3
|
+
|
4
|
+
# EmailPredictor::Predictor.predict(name: 'Ankit Gupta',company: 'google')
|
5
|
+
|
6
|
+
module EmailPredictor
|
7
|
+
class Predictor < Base
|
8
|
+
|
9
|
+
attr_reader :company,:predicted_emails,:message
|
10
|
+
|
11
|
+
def initialize(opts = {})
|
12
|
+
super
|
13
|
+
@company = opts[:company]
|
14
|
+
@predicted_emails = []
|
15
|
+
validate!
|
16
|
+
end
|
17
|
+
|
18
|
+
class << self
|
19
|
+
def predict(opts)
|
20
|
+
obj = new(opts).predict
|
21
|
+
obj
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def predict
|
26
|
+
obj = EmailPredictor::Rules.new(name: @name)
|
27
|
+
unless applicable_rules.empty?
|
28
|
+
applicable_rules.collect do |rule|
|
29
|
+
@predicted_emails << "#{obj.send(rule)}@#{@company}.com"
|
30
|
+
@message = 'Successfully predicted emails.'
|
31
|
+
end
|
32
|
+
else
|
33
|
+
@message = "Prediction cannot be done for #{@name.titleize} as we don't have any historical data for #{@company} company."
|
34
|
+
end
|
35
|
+
self
|
36
|
+
end
|
37
|
+
|
38
|
+
def applicable_rules
|
39
|
+
data_analyser = EmailPredictor::DataAnalyser.find(@company)
|
40
|
+
data_analyser ? data_analyser.rules : []
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,78 @@
|
|
1
|
+
# This is responsible for the prediction of existing data
|
2
|
+
module EmailPredictor
|
3
|
+
class Rules < Base
|
4
|
+
|
5
|
+
attr_reader :name,:username
|
6
|
+
|
7
|
+
def initialize(opts = {})
|
8
|
+
super
|
9
|
+
@username = opts[:username]
|
10
|
+
validate!
|
11
|
+
end
|
12
|
+
|
13
|
+
def some_fake_rule
|
14
|
+
"Holla!"
|
15
|
+
end
|
16
|
+
|
17
|
+
def first_name_dot_last_name
|
18
|
+
"#{first_name}.#{last_name}"
|
19
|
+
end
|
20
|
+
|
21
|
+
def first_name_dot_last_initial
|
22
|
+
"#{first_name}.#{last_name_initial}"
|
23
|
+
end
|
24
|
+
|
25
|
+
def first_initial_dot_last_name
|
26
|
+
"#{first_name_initial}.#{last_name}"
|
27
|
+
end
|
28
|
+
|
29
|
+
def first_initial_dot_last_initial
|
30
|
+
"#{first_name_initial}.#{last_name_initial}"
|
31
|
+
end
|
32
|
+
|
33
|
+
def first_name
|
34
|
+
@name.split(' ').first
|
35
|
+
end
|
36
|
+
|
37
|
+
def last_name
|
38
|
+
@name.split(' ').last
|
39
|
+
end
|
40
|
+
|
41
|
+
def first_name_initial
|
42
|
+
first_name[0,1]
|
43
|
+
end
|
44
|
+
|
45
|
+
def last_name_initial
|
46
|
+
last_name[0,1]
|
47
|
+
end
|
48
|
+
|
49
|
+
def username_first
|
50
|
+
@username.split('.').first
|
51
|
+
end
|
52
|
+
|
53
|
+
def username_last
|
54
|
+
@username.split('.').last
|
55
|
+
end
|
56
|
+
|
57
|
+
def predict
|
58
|
+
if first_name.eql?(username_first) && last_name.eql?(username_last)
|
59
|
+
'first_name_dot_last_name'
|
60
|
+
elsif first_name_initial.eql?(username_first) && last_name.eql?(username_last)
|
61
|
+
'first_initial_dot_last_name'
|
62
|
+
elsif first_name_initial.eql?(username_first) && last_name_initial.eql?(username_last)
|
63
|
+
'first_initial_dot_last_initial'
|
64
|
+
elsif first_name.eql?(username_first) && last_name_initial.eql?(username_last)
|
65
|
+
'first_name_dot_last_initial'
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
class << self
|
70
|
+
def get(employees)
|
71
|
+
employees.collect do |employee|
|
72
|
+
rule = new(employee)
|
73
|
+
rule.predict
|
74
|
+
end.uniq
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
metadata
ADDED
@@ -0,0 +1,128 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: email_predictor
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- ankit8898
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2015-02-16 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rspec
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '3.2'
|
20
|
+
- - ">="
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: 3.2.0
|
23
|
+
type: :development
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: !ruby/object:Gem::Requirement
|
26
|
+
requirements:
|
27
|
+
- - "~>"
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '3.2'
|
30
|
+
- - ">="
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: 3.2.0
|
33
|
+
- !ruby/object:Gem::Dependency
|
34
|
+
name: rspec-collection_matchers
|
35
|
+
requirement: !ruby/object:Gem::Requirement
|
36
|
+
requirements:
|
37
|
+
- - "~>"
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: '1.1'
|
40
|
+
- - ">="
|
41
|
+
- !ruby/object:Gem::Version
|
42
|
+
version: 1.1.2
|
43
|
+
type: :development
|
44
|
+
prerelease: false
|
45
|
+
version_requirements: !ruby/object:Gem::Requirement
|
46
|
+
requirements:
|
47
|
+
- - "~>"
|
48
|
+
- !ruby/object:Gem::Version
|
49
|
+
version: '1.1'
|
50
|
+
- - ">="
|
51
|
+
- !ruby/object:Gem::Version
|
52
|
+
version: 1.1.2
|
53
|
+
- !ruby/object:Gem::Dependency
|
54
|
+
name: rake
|
55
|
+
requirement: !ruby/object:Gem::Requirement
|
56
|
+
requirements:
|
57
|
+
- - "~>"
|
58
|
+
- !ruby/object:Gem::Version
|
59
|
+
version: '10.4'
|
60
|
+
- - ">="
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: 10.4.2
|
63
|
+
type: :development
|
64
|
+
prerelease: false
|
65
|
+
version_requirements: !ruby/object:Gem::Requirement
|
66
|
+
requirements:
|
67
|
+
- - "~>"
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '10.4'
|
70
|
+
- - ">="
|
71
|
+
- !ruby/object:Gem::Version
|
72
|
+
version: 10.4.2
|
73
|
+
- !ruby/object:Gem::Dependency
|
74
|
+
name: activesupport
|
75
|
+
requirement: !ruby/object:Gem::Requirement
|
76
|
+
requirements:
|
77
|
+
- - "~>"
|
78
|
+
- !ruby/object:Gem::Version
|
79
|
+
version: '4.2'
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: 4.2.0
|
83
|
+
type: :development
|
84
|
+
prerelease: false
|
85
|
+
version_requirements: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '4.2'
|
90
|
+
- - ">="
|
91
|
+
- !ruby/object:Gem::Version
|
92
|
+
version: 4.2.0
|
93
|
+
description: Predict emails on a historical pattern for a company
|
94
|
+
email: ankit.gupta8898@gmail.com
|
95
|
+
executables: []
|
96
|
+
extensions: []
|
97
|
+
extra_rdoc_files: []
|
98
|
+
files:
|
99
|
+
- lib/email_predictor.rb
|
100
|
+
- lib/email_predictor/base.rb
|
101
|
+
- lib/email_predictor/data_analyser.rb
|
102
|
+
- lib/email_predictor/predictor.rb
|
103
|
+
- lib/email_predictor/rules.rb
|
104
|
+
homepage: https://rubygems.org/gems/email_predictor
|
105
|
+
licenses:
|
106
|
+
- MIT
|
107
|
+
metadata: {}
|
108
|
+
post_install_message: Thanks for installing!
|
109
|
+
rdoc_options: []
|
110
|
+
require_paths:
|
111
|
+
- lib
|
112
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
113
|
+
requirements:
|
114
|
+
- - ">="
|
115
|
+
- !ruby/object:Gem::Version
|
116
|
+
version: '0'
|
117
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
118
|
+
requirements:
|
119
|
+
- - ">="
|
120
|
+
- !ruby/object:Gem::Version
|
121
|
+
version: '0'
|
122
|
+
requirements: []
|
123
|
+
rubyforge_project:
|
124
|
+
rubygems_version: 2.4.5
|
125
|
+
signing_key:
|
126
|
+
specification_version: 4
|
127
|
+
summary: This is an email predictor!
|
128
|
+
test_files: []
|