NeverBounce 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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 750d0e93775760d313217a7b614a3c8b4ce8f240
4
+ data.tar.gz: bdaa1506374b3943afb32656f23dceebf100bace
5
+ SHA512:
6
+ metadata.gz: 87b28a0bbe4af34d05be84a8d3709e13c6d566bcead7f7fd146f49c69fd4b0ff3f7fbe89bdfd131ff1491ecf82707fabe4595c4a325c55bcb939e381e1f7713f
7
+ data.tar.gz: e74d3be74eb2bdc15b5d0879b3bf84b00716c0ba699c9f19e5c3b537486ab2fb99fd8353fc6f19a5e1628bb7fc4357307ad7c41707bc52da0e76ddec106a898e
@@ -0,0 +1,107 @@
1
+ require 'HTTParty'
2
+ require 'json';
3
+
4
+ require './NeverBounce/Errors'
5
+ require './NeverBounce/Single'
6
+
7
+ module NeverBounce
8
+
9
+ VERSION = "0.1.0"
10
+
11
+ class API
12
+ include HTTParty
13
+ attr_accessor :host, :path, :apikey, :apiSecret, :accessToken, :options
14
+ base_uri 'https://api.neverbounce.com'
15
+ # base_uri 'http://localhost:8000'
16
+
17
+ def initialize(apiKey, apiSecret)
18
+ @apiKey = apiKey;
19
+ @apiSecret = apiSecret;
20
+ @accessToken = nil;
21
+ @options = {:headers => {
22
+ "Content-Type" => "application/x-www-form-urlencoded",
23
+ "User-Agent" => "NeverBounce-Ruby/" + VERSION}
24
+ }
25
+
26
+ raise AuthError, "You must provide a NeverBounce API key" unless @apiKey
27
+ raise AuthError, "You must provide a NeverBounce API secret key" unless @apiSecret
28
+ end
29
+
30
+ # Rescuable json parser
31
+ parser(
32
+ proc do |body, format|
33
+ begin
34
+ JSON.parse(body)
35
+ rescue JSON::ParserError => e
36
+ raise ResponseError, "The response from NeverBounce was unable " \
37
+ "to be parsed as json. Try the request " \
38
+ "again, if this error persists " \
39
+ "let us know at support@neverbounce.com." \
40
+ "\n\n(Internal error)"
41
+ end
42
+ end
43
+ )
44
+
45
+ # Call api endpoint
46
+ def call(endpoint, body)
47
+ begin
48
+ opts = body.merge({:access_token => getAccessToken})
49
+ request(endpoint, {:body => opts})
50
+ # If access token is expired we'll retry the request
51
+ rescue AccessTokenExpired
52
+ @accessToken = nil
53
+ opts = body.merge({:access_token => getAccessToken})
54
+ request(endpoint, {:body => opts})
55
+ end
56
+ end
57
+
58
+ # Makes the actual api request
59
+ def request(endpoint, params)
60
+ opts = options.merge(params)
61
+ response = self.class.post(endpoint, opts)
62
+
63
+ # Handle non successful requests
64
+ if response['success'] === false
65
+ if response['msg'] === 'Authentication failed'
66
+ raise AccessTokenExpired
67
+ end
68
+
69
+ raise RequestError, "We were unable to complete your request. " \
70
+ "The following information was supplied: " \
71
+ "#{response['msg']} " \
72
+ "\n\n(Request error)"
73
+ end
74
+ response
75
+ end
76
+
77
+ # Lets get the access token
78
+ # If we don't have one available
79
+ # already we'll request a new one
80
+ def getAccessToken
81
+ # Get existing access token if available
82
+ if @accessToken != nil
83
+ return @accessToken
84
+ end
85
+
86
+ # Perform request if no existing access token
87
+ response = request('/v3/access_token',
88
+ :body => {:grant_type => 'client_credentials', :scope => 'basic user'},
89
+ :basic_auth => {:username => @apiKey, :password => @apiSecret}
90
+ )
91
+
92
+ if response['error'] != nil
93
+ raise AuthError, "We were unable to complete your request. " \
94
+ "The following information was supplied: " \
95
+ "#{response['error_description']}" \
96
+ "\n\n(Request error [#{response['error']}])"
97
+ end
98
+
99
+ @accessToken = response['access_token']
100
+ end
101
+
102
+ # Initializes the single method
103
+ def single
104
+ Single.new(self)
105
+ end
106
+ end
107
+ end
@@ -0,0 +1,15 @@
1
+ module NeverBounce
2
+ class Error < StandardError
3
+ end
4
+ class AccessTokenExpired < Error
5
+ end
6
+ class ApiError < Error
7
+ end
8
+ class AuthError < Error
9
+ end
10
+ class ResponseError < Error
11
+ end
12
+ class RequestError < Error
13
+ end
14
+ end
15
+
@@ -0,0 +1,53 @@
1
+ module NeverBounce
2
+ class Single
3
+ attr_accessor :master
4
+
5
+ def initialize(master)
6
+ @master = master
7
+ end
8
+
9
+ # Makes verification request
10
+ # Returns VerifiedEmail instance
11
+ def verify(email)
12
+ VerifiedEmail.new(@master.call('/v3/single', {:email => email}))
13
+ end
14
+ end
15
+ class VerifiedEmail
16
+
17
+ def initialize(response)
18
+ @response = response
19
+ @textCodes = ['valid','invalid','disposable','catchall','unknown']
20
+ end
21
+
22
+ # Returns numeric result code
23
+ def getResultCode
24
+ @response['result']
25
+ end
26
+
27
+ # Returns textual result code
28
+ def getResultTextCode
29
+ @textCodes[@response['result']]
30
+ end
31
+
32
+ # Returns true if result is in the specified codes
33
+ # Accepts either array of result codes or single result code
34
+ def is(codes)
35
+ if codes.kind_of?(Array)
36
+ codes.include?(@response['result'])
37
+ else
38
+ codes === @response['result']
39
+ end
40
+ end
41
+
42
+ # Returns true if result is NOT in the specified codes
43
+ # Accepts either array of result codes or single result code
44
+ def not(codes)
45
+ if codes.kind_of?(Array)
46
+ !codes.include?(@response['result'])
47
+ else
48
+ codes != @response['result']
49
+ end
50
+ end
51
+
52
+ end
53
+ end
metadata ADDED
@@ -0,0 +1,89 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: NeverBounce
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Mike Mollick
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-02-22 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: httparty
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ~>
18
+ - !ruby/object:Gem::Version
19
+ version: 0.13.7
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: 0.13.7
27
+ - !ruby/object:Gem::Dependency
28
+ name: rspec
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ~>
32
+ - !ruby/object:Gem::Version
33
+ version: 3.4.0
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ~>
39
+ - !ruby/object:Gem::Version
40
+ version: 3.4.0
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - '>='
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ description: 'This offers '
56
+ email:
57
+ - mike@neverbounce.com
58
+ executables: []
59
+ extensions: []
60
+ extra_rdoc_files: []
61
+ files:
62
+ - ./NeverBounce.rb
63
+ - ./NeverBounce/Errors.rb
64
+ - ./NeverBounce/Single.rb
65
+ homepage: https://neverbounce.com
66
+ licenses:
67
+ - MIT
68
+ metadata: {}
69
+ post_install_message:
70
+ rdoc_options: []
71
+ require_paths:
72
+ - lib
73
+ required_ruby_version: !ruby/object:Gem::Requirement
74
+ requirements:
75
+ - - '>='
76
+ - !ruby/object:Gem::Version
77
+ version: 1.9.3
78
+ required_rubygems_version: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - '>='
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ requirements: []
84
+ rubyforge_project:
85
+ rubygems_version: 2.0.14
86
+ signing_key:
87
+ specification_version: 4
88
+ summary: The official NeverBounce API library for Ruby
89
+ test_files: []