snov 0.1.0
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/.gitignore +13 -0
- data/.rspec +3 -0
- data/.rubocop.yml +13 -0
- data/.travis.yml +15 -0
- data/CHANGELOG.md +5 -0
- data/README.md +143 -0
- data/Rakefile +6 -0
- data/bin/console +14 -0
- data/bin/rspec +29 -0
- data/bin/rubocop +29 -0
- data/bin/setup +8 -0
- data/gems.rb +11 -0
- data/lib/snov.rb +26 -0
- data/lib/snov/client.rb +104 -0
- data/lib/snov/fake_client.rb +14 -0
- data/lib/snov/fake_client/get_v1_get-user-lists.json +46 -0
- data/lib/snov/fake_client/post_v1_get-profile-by-email.json +103 -0
- data/lib/snov/fake_client/post_v1_get-prospects-by-email.json +75 -0
- data/lib/snov/fake_client/post_v1_prospect-list.json +55 -0
- data/lib/snov/get_all_prospects_from_list.rb +26 -0
- data/lib/snov/get_profile_by_email.rb +84 -0
- data/lib/snov/get_prospect_list.rb +59 -0
- data/lib/snov/get_prospects_by_email.rb +92 -0
- data/lib/snov/get_user_lists.rb +47 -0
- data/lib/snov/types/date_details.rb +9 -0
- data/lib/snov/version.rb +3 -0
- data/snov.gemspec +30 -0
- metadata +128 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 66024313d2ed01c16ffeeaec3f536f93b00957250903c5d18e3d30458ba4e413
|
4
|
+
data.tar.gz: e915c4231981bd3fad2d4fd6a7eb18dfcdcc2005058d97202a7374cc76df25a0
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: ba368d2617e6b8ca49cb9bcde3c75ed8b43348dd187f7a1f60a459b596f9e1999b282eb940114dae99354330583cc33dcc90e95c8c0a1b13d2fe482daf713058
|
7
|
+
data.tar.gz: eef471ba1b9bdcf927fa489addafaf3283f083a6067d7a7b3bba8b414dcbccbf31edc2769ad405fb4abc59cb3129753dee699ab86080faced65e1855435ee4d5
|
data/.gitignore
ADDED
data/.rspec
ADDED
data/.rubocop.yml
ADDED
data/.travis.yml
ADDED
data/CHANGELOG.md
ADDED
data/README.md
ADDED
@@ -0,0 +1,143 @@
|
|
1
|
+
[](https://travis-ci.org/NEXL-LTS/snov-ruby)
|
2
|
+
|
3
|
+
## Installation
|
4
|
+
|
5
|
+
Add this line to your application's Gemfile:
|
6
|
+
|
7
|
+
```ruby
|
8
|
+
gem 'snov'
|
9
|
+
```
|
10
|
+
|
11
|
+
And then execute:
|
12
|
+
|
13
|
+
$ bundle install
|
14
|
+
|
15
|
+
Or install it yourself as:
|
16
|
+
|
17
|
+
$ gem install snov
|
18
|
+
|
19
|
+
## Usage
|
20
|
+
|
21
|
+
set `SNOV_USER_ID` and `SNOV_SECRET` environment variables
|
22
|
+
|
23
|
+
|
24
|
+
### GetProfileByEmail
|
25
|
+
|
26
|
+
see https://snov.io/api#GetProfileByEmail
|
27
|
+
|
28
|
+
```ruby
|
29
|
+
prospect = Snov::GetProfileByEmail.new(email: "gavin.vanrooyen@octagon.com")
|
30
|
+
|
31
|
+
puts prospect.success
|
32
|
+
puts prospect.id
|
33
|
+
puts prospect.name
|
34
|
+
puts prospect.first_name
|
35
|
+
puts prospect.last_name
|
36
|
+
puts prospect.industry
|
37
|
+
puts prospect.country
|
38
|
+
puts prospect.locality
|
39
|
+
prospect.social.each do |social_info|
|
40
|
+
puts social.link
|
41
|
+
puts social.type
|
42
|
+
end
|
43
|
+
prospect.current_jobs.each do |social_info|
|
44
|
+
puts social.company_name
|
45
|
+
puts social.position
|
46
|
+
# etc
|
47
|
+
end
|
48
|
+
# etc
|
49
|
+
```
|
50
|
+
|
51
|
+
### GetProspectList
|
52
|
+
|
53
|
+
see https://snov.io/api#FindProspectbyEmail
|
54
|
+
|
55
|
+
```ruby
|
56
|
+
prospects = Snov::GetProspectsByEmail.new(email: "gavin.vanrooyen@octagon.com")
|
57
|
+
prospects.each do |prospect|
|
58
|
+
puts prospect.id
|
59
|
+
puts prospect.name
|
60
|
+
puts prospect.first_name
|
61
|
+
puts prospect.last_name
|
62
|
+
puts prospect.industry
|
63
|
+
puts prospect.country
|
64
|
+
puts prospect.locality
|
65
|
+
prospect.social.each do |social_info|
|
66
|
+
puts social.link
|
67
|
+
puts social.type
|
68
|
+
end
|
69
|
+
# etc
|
70
|
+
end
|
71
|
+
```
|
72
|
+
|
73
|
+
### GetUserLists
|
74
|
+
|
75
|
+
see https://snov.io/api#UserLists
|
76
|
+
|
77
|
+
```ruby
|
78
|
+
lists = Snov::GetUserLists.new
|
79
|
+
lists.each do |list|
|
80
|
+
puts list.id
|
81
|
+
puts list.name
|
82
|
+
puts list.is_deleted
|
83
|
+
puts list.contacts
|
84
|
+
puts list.creation_date.date
|
85
|
+
puts list.deletion_date.date
|
86
|
+
end
|
87
|
+
```
|
88
|
+
|
89
|
+
### GetProspectList
|
90
|
+
|
91
|
+
see https://snov.io/api#ViewProspectsInList
|
92
|
+
|
93
|
+
```ruby
|
94
|
+
prospects = Snov::GetProspectList.new(list_id: 1, page: 1, per_page: 100)
|
95
|
+
prospects.each do |prospect|
|
96
|
+
puts prospect.id
|
97
|
+
puts prospect.name
|
98
|
+
puts prospect.first_name
|
99
|
+
puts prospect.last_name
|
100
|
+
puts prospect.source
|
101
|
+
prospect.emails.each do |email_info|
|
102
|
+
puts email_info.email
|
103
|
+
puts email_info.is_verified
|
104
|
+
puts email_info.job_status
|
105
|
+
# etc
|
106
|
+
end
|
107
|
+
end
|
108
|
+
```
|
109
|
+
|
110
|
+
### GetAllProspectsFromList
|
111
|
+
|
112
|
+
convenience wrapper for `GetProspectList` to get all the prospects on all the pages
|
113
|
+
|
114
|
+
see https://snov.io/api#ViewProspectsInList
|
115
|
+
|
116
|
+
```ruby
|
117
|
+
prospects = Snov::GetAllProspectsFromList.new(list_id: 1)
|
118
|
+
prospects.each do |prospect|
|
119
|
+
puts prospect.id
|
120
|
+
puts prospect.name
|
121
|
+
puts prospect.first_name
|
122
|
+
puts prospect.last_name
|
123
|
+
puts prospect.source
|
124
|
+
prospect.emails.each do |email_info|
|
125
|
+
puts email_info.email
|
126
|
+
puts email_info.is_verified
|
127
|
+
puts email_info.job_status
|
128
|
+
# etc
|
129
|
+
end
|
130
|
+
end
|
131
|
+
```
|
132
|
+
|
133
|
+
|
134
|
+
## Development
|
135
|
+
|
136
|
+
After checking out the repo, run `bin/setup` to install dependencies. Then, run `bin/rspec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
137
|
+
|
138
|
+
To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
|
139
|
+
|
140
|
+
## Contributing
|
141
|
+
|
142
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/snov.
|
143
|
+
|
data/Rakefile
ADDED
data/bin/console
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require "bundler/setup"
|
4
|
+
require "snov"
|
5
|
+
|
6
|
+
# You can add fixtures and/or initialization code here to make experimenting
|
7
|
+
# with your gem easier. You can also use a different console, if you like.
|
8
|
+
|
9
|
+
# (If you use this, don't forget to add pry to your Gemfile!)
|
10
|
+
# require "pry"
|
11
|
+
# Pry.start
|
12
|
+
|
13
|
+
require "irb"
|
14
|
+
IRB.start(__FILE__)
|
data/bin/rspec
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
#
|
5
|
+
# This file was generated by Bundler.
|
6
|
+
#
|
7
|
+
# The application 'rspec' is installed as part of a gem, and
|
8
|
+
# this file is here to facilitate running it.
|
9
|
+
#
|
10
|
+
|
11
|
+
require "pathname"
|
12
|
+
ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../gems.rb",
|
13
|
+
Pathname.new(__FILE__).realpath)
|
14
|
+
|
15
|
+
bundle_binstub = File.expand_path("../bundle", __FILE__)
|
16
|
+
|
17
|
+
if File.file?(bundle_binstub)
|
18
|
+
if File.read(bundle_binstub, 300) =~ /This file was generated by Bundler/
|
19
|
+
load(bundle_binstub)
|
20
|
+
else
|
21
|
+
abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run.
|
22
|
+
Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.")
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
require "rubygems"
|
27
|
+
require "bundler/setup"
|
28
|
+
|
29
|
+
load Gem.bin_path("rspec-core", "rspec")
|
data/bin/rubocop
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
#
|
5
|
+
# This file was generated by Bundler.
|
6
|
+
#
|
7
|
+
# The application 'rubocop' is installed as part of a gem, and
|
8
|
+
# this file is here to facilitate running it.
|
9
|
+
#
|
10
|
+
|
11
|
+
require "pathname"
|
12
|
+
ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../gems.rb",
|
13
|
+
Pathname.new(__FILE__).realpath)
|
14
|
+
|
15
|
+
bundle_binstub = File.expand_path("../bundle", __FILE__)
|
16
|
+
|
17
|
+
if File.file?(bundle_binstub)
|
18
|
+
if File.read(bundle_binstub, 300) =~ /This file was generated by Bundler/
|
19
|
+
load(bundle_binstub)
|
20
|
+
else
|
21
|
+
abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run.
|
22
|
+
Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.")
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
require "rubygems"
|
27
|
+
require "bundler/setup"
|
28
|
+
|
29
|
+
load Gem.bin_path("rubocop", "rubocop")
|
data/bin/setup
ADDED
data/gems.rb
ADDED
data/lib/snov.rb
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
require "snov/version"
|
2
|
+
|
3
|
+
module Snov
|
4
|
+
class Error < StandardError; end
|
5
|
+
|
6
|
+
def self.client
|
7
|
+
if !use_fake?
|
8
|
+
Client.new(client_id: ENV['SNOV_USER_ID'], client_secret: ENV['SNOV_SECRET'])
|
9
|
+
else
|
10
|
+
FakeClient.new
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.use_fake?
|
15
|
+
ENV['SNOV_USE_FAKE'].present? || (!ENV.key?('SNOV_USER_ID') && !ENV.key?('SNOV_SECRET'))
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
require 'active_model'
|
20
|
+
require 'snov/client'
|
21
|
+
require 'snov/fake_client'
|
22
|
+
require 'snov/get_profile_by_email'
|
23
|
+
require 'snov/get_all_prospects_from_list'
|
24
|
+
require 'snov/get_prospects_by_email'
|
25
|
+
require 'snov/get_prospect_list'
|
26
|
+
require 'snov/get_user_lists'
|
data/lib/snov/client.rb
ADDED
@@ -0,0 +1,104 @@
|
|
1
|
+
require 'faraday'
|
2
|
+
require 'multi_json'
|
3
|
+
|
4
|
+
module Snov
|
5
|
+
class Client
|
6
|
+
class SnovError < ::Snov::Error; end
|
7
|
+
|
8
|
+
class TimedOut < SnovError; end
|
9
|
+
|
10
|
+
class UnauthorizedError < SnovError; end
|
11
|
+
|
12
|
+
class BadGatewayError < SnovError; end
|
13
|
+
|
14
|
+
class ForbiddenError < SnovError; end
|
15
|
+
|
16
|
+
class GatewayTimeOut < SnovError; end
|
17
|
+
|
18
|
+
class BadRequest < SnovError; end
|
19
|
+
|
20
|
+
class AuthError < SnovError; end
|
21
|
+
|
22
|
+
class MethodNotAllowed < SnovError; end
|
23
|
+
ERROR_CLASSES = { 401 => UnauthorizedError, 502 => BadGatewayError, 403 => ForbiddenError,
|
24
|
+
504 => GatewayTimeOut, 400 => BadRequest, 405 => MethodNotAllowed }
|
25
|
+
|
26
|
+
def initialize(client_id:, client_secret:, access_token: nil, timeout_seconds: 60)
|
27
|
+
self.client_id = client_id.to_str
|
28
|
+
self.client_secret = client_secret.to_str
|
29
|
+
@access_token = access_token
|
30
|
+
@timeout_seconds = timeout_seconds.to_int
|
31
|
+
end
|
32
|
+
|
33
|
+
def get(path, params = {})
|
34
|
+
resp = conn.get(path) do |req|
|
35
|
+
req.body = MultiJson.dump(params.merge('access_token' => access_token))
|
36
|
+
req.options.timeout = timeout_seconds # open/read timeout in seconds
|
37
|
+
req.options.open_timeout = timeout_seconds # connection open timeout in seconds
|
38
|
+
end
|
39
|
+
parse_response(resp, path, params)
|
40
|
+
rescue Faraday::TimeoutError, Timeout::Error => e
|
41
|
+
raise TimedOut, e.message
|
42
|
+
end
|
43
|
+
|
44
|
+
def post(path, params = {})
|
45
|
+
resp = conn.post(path) do |req|
|
46
|
+
req.body = MultiJson.dump(params.merge('access_token' => access_token))
|
47
|
+
req.options.timeout = timeout_seconds # open/read timeout in seconds
|
48
|
+
req.options.open_timeout = timeout_seconds # connection open timeout in seconds
|
49
|
+
end
|
50
|
+
parse_response(resp, path, params)
|
51
|
+
rescue Faraday::TimeoutError, Timeout::Error => e
|
52
|
+
raise TimedOut, e.message
|
53
|
+
end
|
54
|
+
|
55
|
+
private
|
56
|
+
|
57
|
+
def parse_response(resp, path, _params)
|
58
|
+
unless resp.success?
|
59
|
+
raise ERROR_CLASSES.fetch(resp.status, SnovError),
|
60
|
+
"#{path} (#{resp.status})"
|
61
|
+
end
|
62
|
+
MultiJson.load(resp.body)
|
63
|
+
end
|
64
|
+
|
65
|
+
attr_accessor :client_id, :client_secret, :timeout_seconds
|
66
|
+
|
67
|
+
def access_token
|
68
|
+
return @access_token if @access_token
|
69
|
+
|
70
|
+
@access_token = generate_access_token
|
71
|
+
end
|
72
|
+
|
73
|
+
def access_token_params
|
74
|
+
{ 'grant_type' => 'client_credentials', 'client_id' => client_id, 'client_secret' => client_secret }
|
75
|
+
end
|
76
|
+
|
77
|
+
def generate_access_token
|
78
|
+
resp = conn.post('/v1/oauth/access_token') do |req|
|
79
|
+
req.body = MultiJson.dump(access_token_params)
|
80
|
+
req.options.timeout = timeout_seconds # open/read timeout in seconds
|
81
|
+
req.options.open_timeout = timeout_seconds # connection open timeout in seconds
|
82
|
+
end
|
83
|
+
handle_error(resp, "POST /v1/oauth/access_token")
|
84
|
+
raise AuthError, 'Snov auth failed' if resp.body.blank?
|
85
|
+
|
86
|
+
MultiJson.load(resp.body).fetch("access_token")
|
87
|
+
rescue Timeout::Error => e
|
88
|
+
raise TimedOut, e.message
|
89
|
+
end
|
90
|
+
|
91
|
+
def handle_error(resp, prefix)
|
92
|
+
return if resp.success?
|
93
|
+
|
94
|
+
raise ERROR_CLASSES.fetch(resp.status, SnovError), "#{prefix} (#{resp.status})"
|
95
|
+
end
|
96
|
+
|
97
|
+
def conn
|
98
|
+
@conn ||= Faraday.new(
|
99
|
+
url: 'https://api.snov.io',
|
100
|
+
headers: { 'Content-Type' => 'application/json' }
|
101
|
+
)
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module Snov
|
2
|
+
class FakeClient
|
3
|
+
def get(path)
|
4
|
+
data = File.read("#{__dir__}/fake_client/get#{path.tr("/", "_")}.json")
|
5
|
+
MultiJson.load(data)
|
6
|
+
end
|
7
|
+
|
8
|
+
def post(path, params = {})
|
9
|
+
params.to_a.map(&:join).join("&")
|
10
|
+
data = File.read("#{__dir__}/fake_client/post#{path.tr("/", "_")}.json")
|
11
|
+
MultiJson.load(data)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
[
|
2
|
+
{
|
3
|
+
"id": 1818597,
|
4
|
+
"name": "FirstSend",
|
5
|
+
"contacts": 1,
|
6
|
+
"isDeleted": false,
|
7
|
+
"creationDate": {
|
8
|
+
"date": "2020-04-07 08:25:44.000000",
|
9
|
+
"timezone_type": 3,
|
10
|
+
"timezone": "UTC"
|
11
|
+
},
|
12
|
+
"deletionDate": null
|
13
|
+
},
|
14
|
+
{
|
15
|
+
"id": 1505383,
|
16
|
+
"name": "All prospects",
|
17
|
+
"contacts": 10,
|
18
|
+
"isDeleted": true,
|
19
|
+
"creationDate": {
|
20
|
+
"date": "2019-12-17 15:07:30.000000",
|
21
|
+
"timezone_type": 3,
|
22
|
+
"timezone": "UTC"
|
23
|
+
},
|
24
|
+
"deletionDate": {
|
25
|
+
"date": "2020-02-17 14:05:44.000000",
|
26
|
+
"timezone_type": 3,
|
27
|
+
"timezone": "UTC"
|
28
|
+
}
|
29
|
+
},
|
30
|
+
{
|
31
|
+
"id": 1479070,
|
32
|
+
"name": "EMAIL",
|
33
|
+
"contacts": 13,
|
34
|
+
"isDeleted": true,
|
35
|
+
"creationDate": {
|
36
|
+
"date": "2019-12-06 10:51:01.000000",
|
37
|
+
"timezone_type": 3,
|
38
|
+
"timezone": "UTC"
|
39
|
+
},
|
40
|
+
"deletionDate": {
|
41
|
+
"date": "2020-02-17 14:05:48.000000",
|
42
|
+
"timezone_type": 3,
|
43
|
+
"timezone": "UTC"
|
44
|
+
}
|
45
|
+
}
|
46
|
+
]
|
@@ -0,0 +1,103 @@
|
|
1
|
+
{
|
2
|
+
"success": true,
|
3
|
+
"id": 301592,
|
4
|
+
"source": "linkedIn",
|
5
|
+
"name": "Lizi Hamer",
|
6
|
+
"firstName": "Lizi",
|
7
|
+
"lastName": "Hamer",
|
8
|
+
"logo": "https://app.snov.io/img/peoples/010fcf23c70dfa68d880545ec89a9215.jpg",
|
9
|
+
"industry": null,
|
10
|
+
"country": "Singapore",
|
11
|
+
"locality": "Singapore",
|
12
|
+
"social": [
|
13
|
+
{
|
14
|
+
"link": "https://www.linkedin.com/in/lizihamer/",
|
15
|
+
"type": "linkedIn"
|
16
|
+
},
|
17
|
+
{
|
18
|
+
"link": "https://twitter.com/LiziHamer",
|
19
|
+
"type": "twitter"
|
20
|
+
}
|
21
|
+
],
|
22
|
+
"currentJobs": [
|
23
|
+
{
|
24
|
+
"companyName": "Octagon",
|
25
|
+
"position": "Regional Creative Director",
|
26
|
+
"socialLink": "https://www.linkedin.com/company/165282",
|
27
|
+
"site": "www.octagon.com",
|
28
|
+
"locality": "Greater New York City Area",
|
29
|
+
"state": "Connecticut",
|
30
|
+
"city": "Stamford",
|
31
|
+
"street": "290 Harbor Dr",
|
32
|
+
"street2": "2nd Floor",
|
33
|
+
"postal": "06902",
|
34
|
+
"founded": "1983",
|
35
|
+
"startDate": "2016-01-31",
|
36
|
+
"endDate": null,
|
37
|
+
"size": "1-10",
|
38
|
+
"industry": "Marketing and Advertising",
|
39
|
+
"companyType": "Public Company",
|
40
|
+
"country": "United States"
|
41
|
+
},
|
42
|
+
{
|
43
|
+
"companyName": "SisuGirls",
|
44
|
+
"position": "Co Founder",
|
45
|
+
"socialLink": "https://www.linkedin.com/company/3841118",
|
46
|
+
"site": "http://www.sisugirls.org",
|
47
|
+
"locality": null,
|
48
|
+
"state": "SG",
|
49
|
+
"city": "Singapore",
|
50
|
+
"street": "33-03 Hong Leong Building",
|
51
|
+
"street2": null,
|
52
|
+
"postal": null,
|
53
|
+
"founded": "2014",
|
54
|
+
"startDate": "2015-07-31",
|
55
|
+
"endDate": null,
|
56
|
+
"size": "1-10",
|
57
|
+
"industry": "Health, Wellness and Fitness",
|
58
|
+
"companyType": null,
|
59
|
+
"country": "Singapore"
|
60
|
+
}
|
61
|
+
],
|
62
|
+
"previousJobs": [
|
63
|
+
{
|
64
|
+
"companyName": "Fusion Co-innovation Labs",
|
65
|
+
"position": "Creative Entrepreneur",
|
66
|
+
"socialLink": null,
|
67
|
+
"site": null,
|
68
|
+
"locality": null,
|
69
|
+
"state": null,
|
70
|
+
"city": null,
|
71
|
+
"street": null,
|
72
|
+
"street2": null,
|
73
|
+
"postal": null,
|
74
|
+
"founded": null,
|
75
|
+
"startDate": "2013-05-31",
|
76
|
+
"endDate": "2013-10-31",
|
77
|
+
"size": null,
|
78
|
+
"industry": null,
|
79
|
+
"companyType": null,
|
80
|
+
"country": null
|
81
|
+
},
|
82
|
+
{
|
83
|
+
"companyName": "Russell Commission",
|
84
|
+
"position": "Youth Advisory Board Member",
|
85
|
+
"socialLink": null,
|
86
|
+
"site": null,
|
87
|
+
"locality": null,
|
88
|
+
"state": null,
|
89
|
+
"city": null,
|
90
|
+
"street": null,
|
91
|
+
"street2": null,
|
92
|
+
"postal": null,
|
93
|
+
"founded": null,
|
94
|
+
"startDate": "2004-06-30",
|
95
|
+
"endDate": "2006-06-30",
|
96
|
+
"size": null,
|
97
|
+
"industry": null,
|
98
|
+
"companyType": null,
|
99
|
+
"country": null
|
100
|
+
}
|
101
|
+
],
|
102
|
+
"lastUpdateDate": "2018-02-07 10:12:28"
|
103
|
+
}
|
@@ -0,0 +1,75 @@
|
|
1
|
+
{
|
2
|
+
"success": true,
|
3
|
+
"data": [
|
4
|
+
{
|
5
|
+
"id": "xusD3-T_K5IktGoaa8Jc8A==",
|
6
|
+
"name": "Gavin Vanrooyen",
|
7
|
+
"firstName": "Gavin",
|
8
|
+
"lastName": "Vanrooyen",
|
9
|
+
"industry": "Entertainment",
|
10
|
+
"country": "United States",
|
11
|
+
"locality": "Greater Atlanta Area",
|
12
|
+
"social": [
|
13
|
+
{
|
14
|
+
"link": "https:\/\/www.linkedin.com\/in\/gavin-vanrooyen-809073755\/",
|
15
|
+
"type": "linkedIn"
|
16
|
+
}
|
17
|
+
],
|
18
|
+
"lastUpdateDate": {
|
19
|
+
"date": "2019-09-11 12:37:58.000000",
|
20
|
+
"timezone_type": 3,
|
21
|
+
"timezone": "UTC"
|
22
|
+
},
|
23
|
+
"currentJob": [
|
24
|
+
{
|
25
|
+
"companyName": "Octagon",
|
26
|
+
"position": "Senior Brand Director",
|
27
|
+
"socialLink": "https:\/\/www.linkedin.com\/company\/659333",
|
28
|
+
"site": "http:\/\/octagon.com",
|
29
|
+
"locality": "United States",
|
30
|
+
"state": null,
|
31
|
+
"city": null,
|
32
|
+
"street": null,
|
33
|
+
"street2": null,
|
34
|
+
"postal": null,
|
35
|
+
"founded": null,
|
36
|
+
"startDate": "2018-07-31",
|
37
|
+
"endDate": null,
|
38
|
+
"size": "1-10",
|
39
|
+
"industry": "Entertainment",
|
40
|
+
"companyType": "Public Company",
|
41
|
+
"country": "United States"
|
42
|
+
}
|
43
|
+
],
|
44
|
+
"previousJob": [
|
45
|
+
{
|
46
|
+
"companyName": "UPS",
|
47
|
+
"position": "Manager, Sponsorships and Events",
|
48
|
+
"socialLink": "https:\/\/www.linkedin.com\/company\/1523574",
|
49
|
+
"site": "http:\/\/www.ups.com\/",
|
50
|
+
"locality": "United States",
|
51
|
+
"state": "GA",
|
52
|
+
"city": "Atlanta",
|
53
|
+
"street": "55 Glenlake Parkway, NE",
|
54
|
+
"street2": null,
|
55
|
+
"postal": "30328",
|
56
|
+
"founded": "1907",
|
57
|
+
"startDate": null,
|
58
|
+
"endDate": null,
|
59
|
+
"size": "10001+",
|
60
|
+
"industry": "Logistics and Supply Chain",
|
61
|
+
"companyType": "Public Company",
|
62
|
+
"country": "United States"
|
63
|
+
}
|
64
|
+
],
|
65
|
+
"lists": [
|
66
|
+
{
|
67
|
+
"id": 1250344,
|
68
|
+
"name": "People List"
|
69
|
+
}
|
70
|
+
],
|
71
|
+
"campaigns": []
|
72
|
+
}
|
73
|
+
]
|
74
|
+
}
|
75
|
+
|
@@ -0,0 +1,55 @@
|
|
1
|
+
{
|
2
|
+
"success": true,
|
3
|
+
"list": {
|
4
|
+
"name": "Lead LIST",
|
5
|
+
"contacts": 3,
|
6
|
+
"creationDate": {
|
7
|
+
"date": "2020-05-19 17:34:39.000000",
|
8
|
+
"timezone_type": 3,
|
9
|
+
"timezone": "UTC"
|
10
|
+
},
|
11
|
+
"emailsCount": []
|
12
|
+
},
|
13
|
+
"prospects": [
|
14
|
+
{
|
15
|
+
"id": "226db935fc93422496fda5d5209e8cbf77cc77ec685891706028009b86608f7ce5877a3faf",
|
16
|
+
"name": "Andrew Garfiled",
|
17
|
+
"firstName": "Andrew",
|
18
|
+
"lastName": "Garfiled",
|
19
|
+
"emails": [
|
20
|
+
{
|
21
|
+
"email": "andrewexp@exp.com",
|
22
|
+
"probability": 99,
|
23
|
+
"isVerified": null,
|
24
|
+
"jobStatus": "any",
|
25
|
+
"domainType": "linkedin_email",
|
26
|
+
"isValidFormat": null,
|
27
|
+
"isDisposable": null,
|
28
|
+
"isWebmail": null,
|
29
|
+
"isGibberish": null,
|
30
|
+
"smtpStatus": null
|
31
|
+
}
|
32
|
+
]
|
33
|
+
},
|
34
|
+
{
|
35
|
+
"id": "f20d30219b039d1408d837a748a1e2ab843c97e65080f6cf8fa7d948477d9093d87413f05f",
|
36
|
+
"name": "John Doe",
|
37
|
+
"firstName": "John",
|
38
|
+
"lastName": "Doe",
|
39
|
+
"emails": [
|
40
|
+
{
|
41
|
+
"email": "johndoe@gmail.com",
|
42
|
+
"probability": 99,
|
43
|
+
"isVerified": null,
|
44
|
+
"jobStatus": "any",
|
45
|
+
"domainType": "linkedin_email",
|
46
|
+
"isValidFormat": true,
|
47
|
+
"isDisposable": false,
|
48
|
+
"isWebmail": true,
|
49
|
+
"isGibberish": false,
|
50
|
+
"smtpStatus": 3
|
51
|
+
}
|
52
|
+
]
|
53
|
+
}
|
54
|
+
]
|
55
|
+
}
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module Snov
|
2
|
+
class GetAllProspectsFromList
|
3
|
+
include Enumerable
|
4
|
+
|
5
|
+
attr_reader :client, :list_id, :max, :per_page
|
6
|
+
|
7
|
+
def initialize(list_id:, max: 9999, per_page: 100, client: Snov.client)
|
8
|
+
@client = client
|
9
|
+
@list_id = list_id
|
10
|
+
@max = max.to_int
|
11
|
+
@per_page = per_page
|
12
|
+
end
|
13
|
+
|
14
|
+
def each(&block)
|
15
|
+
(1..max).each do |page|
|
16
|
+
list = GetProspectList.new(list_id: list_id, page: page, per_page: per_page,
|
17
|
+
client: client)
|
18
|
+
prospects = list.prospects
|
19
|
+
|
20
|
+
prospects.each(&block)
|
21
|
+
|
22
|
+
break if prospects.size < per_page
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,84 @@
|
|
1
|
+
require 'active_support/core_ext/array'
|
2
|
+
|
3
|
+
module Snov
|
4
|
+
class GetProfileByEmail
|
5
|
+
attr_reader :client, :email
|
6
|
+
|
7
|
+
def initialize(email:, client: Snov.client)
|
8
|
+
@client = client
|
9
|
+
@email = email.to_str
|
10
|
+
end
|
11
|
+
|
12
|
+
def each(&block)
|
13
|
+
prospects.each(&block)
|
14
|
+
end
|
15
|
+
|
16
|
+
def prospect
|
17
|
+
@prospect ||= ProspectResult.new(raw_result)
|
18
|
+
end
|
19
|
+
|
20
|
+
def method_missing(method_name, *arguments, &block)
|
21
|
+
if prospect.respond_to?(method_name)
|
22
|
+
prospect.public_send(method_name, *arguments, &block)
|
23
|
+
else
|
24
|
+
super
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def respond_to_missing?(method_name, include_private = false)
|
29
|
+
prospect.respond_to?(method_name) || super
|
30
|
+
end
|
31
|
+
|
32
|
+
def raw_result
|
33
|
+
@raw_result ||= client.post("/v1/get-profile-by-email",
|
34
|
+
'email' => email)
|
35
|
+
.deep_transform_keys! { |key| key.underscore }
|
36
|
+
end
|
37
|
+
|
38
|
+
class Job
|
39
|
+
include ActiveModel::Model
|
40
|
+
|
41
|
+
attr_accessor :company_name, :position, :social_link, :site, :locality, :state, :city
|
42
|
+
attr_accessor :street, :street2, :postal, :founded, :start_date, :end_date, :size
|
43
|
+
attr_accessor :industry, :company_type, :country
|
44
|
+
end
|
45
|
+
|
46
|
+
class Social
|
47
|
+
include ActiveModel::Model
|
48
|
+
|
49
|
+
attr_accessor :link, :type
|
50
|
+
end
|
51
|
+
|
52
|
+
class List
|
53
|
+
include ActiveModel::Model
|
54
|
+
|
55
|
+
attr_accessor :id, :name
|
56
|
+
end
|
57
|
+
|
58
|
+
class ProspectResult
|
59
|
+
include ActiveModel::Model
|
60
|
+
|
61
|
+
attr_accessor :id, :name, :first_name, :last_name, :industry, :country, :locality, :success, :source
|
62
|
+
attr_accessor :logo, :last_update_date, :message
|
63
|
+
attr_reader :social, :current_jobs, :previous_jobs
|
64
|
+
|
65
|
+
def social=(val)
|
66
|
+
@social = Array.wrap(val).map do |rel|
|
67
|
+
Social.new(rel)
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
def current_jobs=(val)
|
72
|
+
@current_jobs = Array.wrap(val).map do |rel|
|
73
|
+
Job.new(rel)
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
def previous_jobs=(val)
|
78
|
+
@previous_jobs = Array.wrap(val).map do |rel|
|
79
|
+
Job.new(rel)
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
require 'active_support/core_ext/array'
|
2
|
+
|
3
|
+
module Snov
|
4
|
+
class GetProspectList
|
5
|
+
include Enumerable
|
6
|
+
|
7
|
+
attr_reader :client, :list_id, :page, :per_page
|
8
|
+
|
9
|
+
def initialize(list_id:, page:, per_page: 100, client: Snov.client)
|
10
|
+
@client = client
|
11
|
+
@list_id = list_id
|
12
|
+
@page = page
|
13
|
+
@per_page = per_page
|
14
|
+
end
|
15
|
+
|
16
|
+
def each(&block)
|
17
|
+
prospects.each(&block)
|
18
|
+
end
|
19
|
+
|
20
|
+
def prospects
|
21
|
+
@prospects ||= raw_result.fetch('prospects').map do |result|
|
22
|
+
ProspectResult.new(result)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def raw_result
|
27
|
+
@raw_result ||= client.post("/v1/prospect-list",
|
28
|
+
'listId' => list_id.to_s,
|
29
|
+
'page' => page.to_s,
|
30
|
+
'perPage' => per_page.to_s)
|
31
|
+
.deep_transform_keys! { |key| key.underscore }
|
32
|
+
end
|
33
|
+
|
34
|
+
class ProspectEmail
|
35
|
+
include ActiveModel::Model
|
36
|
+
|
37
|
+
attr_accessor :email, :is_verified, :job_status, :domain_type, :is_valid_format
|
38
|
+
attr_accessor :is_disposable, :is_webmail, :is_gibberish, :smtp_status, :probability
|
39
|
+
attr_accessor :status_type_text, :status_verify_text, :email_verify_text
|
40
|
+
end
|
41
|
+
|
42
|
+
class ProspectResult
|
43
|
+
include ActiveModel::Model
|
44
|
+
|
45
|
+
attr_accessor :id, :name, :first_name, :last_name, :source
|
46
|
+
attr_reader :emails
|
47
|
+
|
48
|
+
def emails=(val)
|
49
|
+
@emails = Array.wrap(val).map do |rel|
|
50
|
+
ProspectEmail.new(rel)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def email
|
55
|
+
emails.first&.email
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
@@ -0,0 +1,92 @@
|
|
1
|
+
require 'active_support/core_ext/array'
|
2
|
+
require_relative 'types/date_details'
|
3
|
+
|
4
|
+
module Snov
|
5
|
+
class GetProspectsByEmail
|
6
|
+
include Enumerable
|
7
|
+
|
8
|
+
attr_reader :client, :email
|
9
|
+
|
10
|
+
def initialize(email:, client: Snov.client)
|
11
|
+
@client = client
|
12
|
+
@email = email.to_str
|
13
|
+
end
|
14
|
+
|
15
|
+
def each(&block)
|
16
|
+
prospects.each(&block)
|
17
|
+
end
|
18
|
+
|
19
|
+
def prospects
|
20
|
+
@prospects ||= raw_result.fetch('data', []).map do |result|
|
21
|
+
ProspectResult.new(result)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def raw_result
|
26
|
+
@raw_result ||= client.post("/v1/get-prospects-by-email",
|
27
|
+
'email' => email)
|
28
|
+
.deep_transform_keys! { |key| key.underscore }
|
29
|
+
end
|
30
|
+
|
31
|
+
class Job
|
32
|
+
include ActiveModel::Model
|
33
|
+
|
34
|
+
attr_accessor :company_name, :position, :social_link, :site, :locality, :state, :city
|
35
|
+
attr_accessor :street, :street2, :postal, :founded, :start_date, :end_date, :size
|
36
|
+
attr_accessor :industry, :company_type, :country
|
37
|
+
end
|
38
|
+
|
39
|
+
class Social
|
40
|
+
include ActiveModel::Model
|
41
|
+
|
42
|
+
attr_accessor :link, :type
|
43
|
+
end
|
44
|
+
|
45
|
+
class List
|
46
|
+
include ActiveModel::Model
|
47
|
+
|
48
|
+
attr_accessor :id, :name
|
49
|
+
end
|
50
|
+
|
51
|
+
class ProspectResult
|
52
|
+
include ActiveModel::Model
|
53
|
+
|
54
|
+
attr_accessor :id, :name, :first_name, :last_name, :industry, :country, :locality
|
55
|
+
attr_reader :social, :current_job, :previous_job, :lists, :campaigns, :last_update_date
|
56
|
+
|
57
|
+
def social=(val)
|
58
|
+
@social = Array.wrap(val).map do |rel|
|
59
|
+
Social.new(rel)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def current_job=(val)
|
64
|
+
@current_job = Array.wrap(val).map do |rel|
|
65
|
+
Job.new(rel)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
def previous_job=(val)
|
70
|
+
@previous_job = Array.wrap(val).map do |rel|
|
71
|
+
Job.new(rel)
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
def lists=(val)
|
76
|
+
@lists = Array.wrap(val).map do |rel|
|
77
|
+
List.new(rel)
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
def campaigns=(val)
|
82
|
+
@campaigns = Array.wrap(val).map do |rel|
|
83
|
+
OpenStruct.new(rel)
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
def last_update_date=(val)
|
88
|
+
@last_update_date = Types::DateDetails.new(val.to_hash)
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
require_relative 'types/date_details'
|
2
|
+
|
3
|
+
module Snov
|
4
|
+
class GetUserLists
|
5
|
+
include Enumerable
|
6
|
+
|
7
|
+
attr_reader :client
|
8
|
+
|
9
|
+
def initialize(client: Snov.client)
|
10
|
+
@client = client
|
11
|
+
end
|
12
|
+
|
13
|
+
def each(&block)
|
14
|
+
all.each(&block)
|
15
|
+
end
|
16
|
+
|
17
|
+
def all
|
18
|
+
@all ||= raw_result.map { |result| UserList.new(result) }
|
19
|
+
end
|
20
|
+
|
21
|
+
def raw_result
|
22
|
+
@raw_result ||= client.get("/v1/get-user-lists").map do |val|
|
23
|
+
val.deep_transform_keys! { |key| key.underscore }
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
class UserList
|
28
|
+
include ActiveModel::Model
|
29
|
+
|
30
|
+
attr_accessor :id, :name, :is_deleted, :contacts
|
31
|
+
attr_reader :creation_date, :deletion_date
|
32
|
+
|
33
|
+
def creation_date=(val)
|
34
|
+
@creation_date = Types::DateDetails.new(val.to_hash)
|
35
|
+
end
|
36
|
+
|
37
|
+
def deletion_date=(val)
|
38
|
+
@deletion_date = val
|
39
|
+
@deletion_date = Types::DateDetails.new(val.to_hash) if val
|
40
|
+
end
|
41
|
+
|
42
|
+
def to_h
|
43
|
+
{ id: id, is_deleted: is_deleted, name: name, contacts: contacts }
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
data/lib/snov/version.rb
ADDED
data/snov.gemspec
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
require_relative 'lib/snov/version'
|
2
|
+
|
3
|
+
Gem::Specification.new do |spec|
|
4
|
+
spec.name = "snov"
|
5
|
+
spec.version = Snov::VERSION
|
6
|
+
spec.authors = ["Grant Petersen-Speelman"]
|
7
|
+
spec.email = ["grantspeelman@gmail.com"]
|
8
|
+
|
9
|
+
spec.summary = %q{Snov client to interact with snov api}
|
10
|
+
spec.description = %q{Snov client to interact with snov api}
|
11
|
+
spec.homepage = "https://github.com/NEXL-LTS/snov-ruby"
|
12
|
+
spec.required_ruby_version = Gem::Requirement.new(">= 2.4.0")
|
13
|
+
|
14
|
+
spec.metadata["homepage_uri"] = spec.homepage
|
15
|
+
spec.metadata["source_code_uri"] = "https://github.com/NEXL-LTS/snov-ruby"
|
16
|
+
spec.metadata["changelog_uri"] = "https://github.com/NEXL-LTS/snov-ruby/CHANGELOG.md"
|
17
|
+
|
18
|
+
# Specify which files should be added to the gem when it is released.
|
19
|
+
# The `git ls-files -z` loads the files in the RubyGem that have been added into git.
|
20
|
+
spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
|
21
|
+
`git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
22
|
+
end
|
23
|
+
spec.bindir = "exe"
|
24
|
+
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
25
|
+
spec.require_paths = ["lib"]
|
26
|
+
spec.add_dependency 'activemodel'
|
27
|
+
spec.add_dependency 'activesupport'
|
28
|
+
spec.add_dependency 'faraday'
|
29
|
+
spec.add_dependency 'multi_json'
|
30
|
+
end
|
metadata
ADDED
@@ -0,0 +1,128 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: snov
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Grant Petersen-Speelman
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2020-11-28 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: activemodel
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: activesupport
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: faraday
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: multi_json
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
description: Snov client to interact with snov api
|
70
|
+
email:
|
71
|
+
- grantspeelman@gmail.com
|
72
|
+
executables: []
|
73
|
+
extensions: []
|
74
|
+
extra_rdoc_files: []
|
75
|
+
files:
|
76
|
+
- ".gitignore"
|
77
|
+
- ".rspec"
|
78
|
+
- ".rubocop.yml"
|
79
|
+
- ".travis.yml"
|
80
|
+
- CHANGELOG.md
|
81
|
+
- README.md
|
82
|
+
- Rakefile
|
83
|
+
- bin/console
|
84
|
+
- bin/rspec
|
85
|
+
- bin/rubocop
|
86
|
+
- bin/setup
|
87
|
+
- gems.rb
|
88
|
+
- lib/snov.rb
|
89
|
+
- lib/snov/client.rb
|
90
|
+
- lib/snov/fake_client.rb
|
91
|
+
- lib/snov/fake_client/get_v1_get-user-lists.json
|
92
|
+
- lib/snov/fake_client/post_v1_get-profile-by-email.json
|
93
|
+
- lib/snov/fake_client/post_v1_get-prospects-by-email.json
|
94
|
+
- lib/snov/fake_client/post_v1_prospect-list.json
|
95
|
+
- lib/snov/get_all_prospects_from_list.rb
|
96
|
+
- lib/snov/get_profile_by_email.rb
|
97
|
+
- lib/snov/get_prospect_list.rb
|
98
|
+
- lib/snov/get_prospects_by_email.rb
|
99
|
+
- lib/snov/get_user_lists.rb
|
100
|
+
- lib/snov/types/date_details.rb
|
101
|
+
- lib/snov/version.rb
|
102
|
+
- snov.gemspec
|
103
|
+
homepage: https://github.com/NEXL-LTS/snov-ruby
|
104
|
+
licenses: []
|
105
|
+
metadata:
|
106
|
+
homepage_uri: https://github.com/NEXL-LTS/snov-ruby
|
107
|
+
source_code_uri: https://github.com/NEXL-LTS/snov-ruby
|
108
|
+
changelog_uri: https://github.com/NEXL-LTS/snov-ruby/CHANGELOG.md
|
109
|
+
post_install_message:
|
110
|
+
rdoc_options: []
|
111
|
+
require_paths:
|
112
|
+
- lib
|
113
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - ">="
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: 2.4.0
|
118
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
119
|
+
requirements:
|
120
|
+
- - ">="
|
121
|
+
- !ruby/object:Gem::Version
|
122
|
+
version: '0'
|
123
|
+
requirements: []
|
124
|
+
rubygems_version: 3.1.4
|
125
|
+
signing_key:
|
126
|
+
specification_version: 4
|
127
|
+
summary: Snov client to interact with snov api
|
128
|
+
test_files: []
|