emailable 3.0.2 → 4.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 569f2990e697b4682c76a2d659760562572c175f8649e273bf821965fd2df76f
4
- data.tar.gz: cc16ed03e3a287e558a2d681f4c9d08ecadcc56a2bb5ec0242ad05ec4ed4a931
3
+ metadata.gz: 02e893db37f9960d70d4a0ed17f712ef1e02f13f707d57e7428c3f2b07e36b6d
4
+ data.tar.gz: 7ab4fc1440cc5cd172059f4d2bb53cc51f169f5f21cb7a9bb919d97f04b2b543
5
5
  SHA512:
6
- metadata.gz: c8d2241faf3fc8b8bfce8a6f1bef348558b109800f428d67edcc3744c0daac4cd9a5c47b490d4622ff0dbcdf22b09efff69167ccc50b315b90212633b1ef67c5
7
- data.tar.gz: 1300dc96e81a82de3ac19bfd392ecafd1f22751fbf261d5528e775f1b9bfab88b224dcbe2da9e3534ed9898b30b022cbc6bf64ae9a2e89cc3df3c5b518168851
6
+ metadata.gz: eb96ef05631762f2e6fa53e13a621e6006f23af42dba60fa36a86adc978b8b537def118e7547c8af4da8925109a7b671e7cfba4c5eab031a4c874f2e15e64f1d
7
+ data.tar.gz: c1292e55f4ba32a80da7a30e9d9f401d51f0747d23ccac2f1e8cd336020b9cda45413e7f423eb0b00fee24bb618704e596d20203f8334f532a9d364b97df218f
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- emailable (3.0.2)
4
+ emailable (4.0.0)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
@@ -17,20 +17,20 @@ GEM
17
17
  ansi (1.5.0)
18
18
  awesome_print (1.8.0)
19
19
  builder (3.2.3)
20
- coderay (1.1.2)
20
+ coderay (1.1.3)
21
21
  concurrent-ruby (1.1.7)
22
22
  i18n (1.8.5)
23
23
  concurrent-ruby (~> 1.0)
24
- method_source (0.9.2)
24
+ method_source (1.0.0)
25
25
  minitest (5.11.3)
26
26
  minitest-reporters (1.3.6)
27
27
  ansi
28
28
  builder
29
29
  minitest (>= 5.0)
30
30
  ruby-progressbar
31
- pry (0.12.2)
32
- coderay (~> 1.1.0)
33
- method_source (~> 0.9.0)
31
+ pry (0.14.1)
32
+ coderay (~> 1.1)
33
+ method_source (~> 1.0)
34
34
  rake (13.0.1)
35
35
  ruby-progressbar (1.10.1)
36
36
  thread_safe (0.3.6)
data/README.md CHANGED
@@ -1,7 +1,7 @@
1
1
  # Emailable Ruby Library
2
2
 
3
- [![Build Status](https://travis-ci.com/emailable/emailable-ruby.svg)](https://travis-ci.com/emailable/emailable-ruby)
4
- [![Maintainability](https://api.codeclimate.com/v1/badges/2d74c69a9155109058a7/maintainability)](https://codeclimate.com/github/emailable/emailable-ruby/maintainability)
3
+ [![Build Status](https://app.travis-ci.com/emailable/emailable-ruby.svg)](https://app.travis-ci.com/emailable/emailable-ruby)
4
+ [![Maintainability](https://api.codeclimate.com/v1/badges/e7eef54e491adec95e6d/maintainability)](https://codeclimate.com/github/emailable/emailable-ruby/maintainability)
5
5
 
6
6
  This is the official ruby wrapper for the Emailable API.
7
7
 
@@ -29,7 +29,9 @@ Or install it yourself as:
29
29
 
30
30
  ## Usage
31
31
 
32
- The library needs to be configured with your account's API key which is available in your [Emailable Dashboard](https://app.emailable.com/api). Set `Emailable.api_key` to its value:
32
+ The library needs to be configured with your account's API key which is
33
+ available in your [Emailable Dashboard](https://app.emailable.com/api). Set
34
+ `Emailable.api_key` to its value:
33
35
 
34
36
  ### Setup
35
37
 
@@ -47,6 +49,9 @@ Emailable.api_key = 'live_...'
47
49
  Emailable.verify('jarrett@emailable.com')
48
50
  ```
49
51
 
52
+ All supported parameters for the verify endpoint can be passed in as hash
53
+ arguments to the `verify` method.
54
+
50
55
  #### Slow Email Server Handling
51
56
 
52
57
  Some email servers are slow to respond. As a result, the timeout may be reached
@@ -60,23 +65,29 @@ email `slow@example.com`.
60
65
 
61
66
  ### Batch Verification
62
67
 
68
+ First, create an `Emailable::Batch` object. Then, call the `verify` method to
69
+ start the batch. All supported parameters for the batch verification endpoint
70
+ can be passed in as hash arguments to the `verify` method.
71
+
63
72
  #### Start a batch
64
73
 
65
74
  ```ruby
66
75
  emails = ['jarrett@emailable.com', 'support@emailable.com', ...]
67
76
  batch = Emailable::Batch.new(emails)
68
77
 
69
- # you can optionally pass in a callback url that we'll POST to when the
70
- # batch is complete.
71
- batch = Emailable::Batch.new(emails, callback: 'https://emailable.com/')
72
-
73
78
  # start verifying the batch
74
79
  batch.verify
80
+
81
+ # you can optionally pass in a callback url that we'll POST to when the batch
82
+ # is complete.
83
+ batch.verify(url: 'https://emailable.com/')
75
84
  ```
76
85
 
77
86
  #### Get the status / results of a batch
78
87
 
79
- Calling `status` on a batch will return the status. It will contain the results as well once complete. You can also `results` to get just the results.
88
+ Calling `status` on a batch will return the status. It will contain the results
89
+ as well once complete. All supported parameters for the status endpoint can be
90
+ passed in as hash arguments to the `status` method.
80
91
 
81
92
  ```ruby
82
93
  id = '5cfcbfdeede34200693c4319'
@@ -85,6 +96,9 @@ batch = Emailable::Batch.new(id)
85
96
  # get status of batch
86
97
  batch.status
87
98
 
99
+ # get the status of a batch, with partial results if the batch is incomplete
100
+ batch.status(partial: true)
101
+
88
102
  # gets the results
89
103
  batch.status.emails
90
104
 
@@ -126,10 +140,17 @@ attr_accessor :email_verification_result
126
140
 
127
141
  ## Development
128
142
 
129
- After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
143
+ After checking out the repo, run `bin/setup` to install dependencies. Then, run
144
+ `rake test` to run the tests. You can also run `bin/console` for an interactive
145
+ prompt that will allow you to experiment.
130
146
 
131
- 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).
147
+ To install this gem onto your local machine, run `bundle exec rake install`. To
148
+ release a new version, update the version number in `version.rb`, and then run
149
+ `bundle exec rake release`, which will create a git tag for the version, push
150
+ git commits and tags, and push the `.gem` file to
151
+ [rubygems.org](https://rubygems.org).
132
152
 
133
153
  ## Contributing
134
154
 
135
- Bug reports and pull requests are welcome on GitHub at https://github.com/emailable/emailable-ruby.
155
+ Bug reports and pull requests are welcome on GitHub at
156
+ https://github.com/emailable/emailable-ruby.
data/bin/console CHANGED
@@ -1,14 +1,14 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- require "bundler/setup"
4
- require "emailable/ruby"
3
+ require 'bundler/setup'
4
+ require 'emailable'
5
5
 
6
6
  # You can add fixtures and/or initialization code here to make experimenting
7
7
  # with your gem easier. You can also use a different console, if you like.
8
8
 
9
9
  # (If you use this, don't forget to add pry to your Gemfile!)
10
- # require "pry"
10
+ # require 'pry'
11
11
  # Pry.start
12
12
 
13
- require "irb"
13
+ require 'irb'
14
14
  IRB.start(__FILE__)
@@ -2,15 +2,13 @@ module Emailable
2
2
  class Batch
3
3
  attr_accessor :id
4
4
 
5
- def initialize(id_or_emails, callback: nil)
5
+ def initialize(id_or_emails)
6
6
  if id_or_emails.is_a?(Array)
7
7
  @id = nil
8
8
  @emails = id_or_emails
9
- @callback = callback
10
9
  elsif id_or_emails.is_a?(String)
11
10
  @id = id_or_emails
12
11
  @emails = nil
13
- @callback = nil
14
12
  else
15
13
  raise ArgumentError, 'expected an array of emails or batch id'
16
14
  end
@@ -19,20 +17,21 @@ module Emailable
19
17
  @status = nil
20
18
  end
21
19
 
22
- def verify
20
+ def verify(parameters = {})
23
21
  return @id unless @id.nil?
24
22
 
25
- opts = { emails: @emails.join(','), url: @callback }
26
- response = @client.request(:post, 'batch', opts)
23
+ parameters[:emails] = @emails.join(',')
24
+ response = @client.request(:post, 'batch', parameters)
27
25
 
28
26
  @id = response.body['id']
29
27
  end
30
28
 
31
- def status
29
+ def status(parameters = {})
32
30
  return nil unless @id
33
31
  return @status if @status
34
32
 
35
- response = @client.request(:get, 'batch', { id: @id })
33
+ parameters[:id] = @id
34
+ response = @client.request(:get, 'batch', parameters)
36
35
  bs = BatchStatus.new(response.body)
37
36
  @status = bs if bs.complete?
38
37
 
@@ -40,7 +39,7 @@ module Emailable
40
39
  end
41
40
 
42
41
  def complete?
43
- !status.complete?
42
+ status.complete?
44
43
  end
45
44
 
46
45
  def inspect
@@ -1,5 +1,15 @@
1
1
  module Emailable
2
2
  class Client
3
+ ERRORS = {
4
+ 400 => BadRequestError,
5
+ 401 => UnauthorizedError,
6
+ 402 => PaymentRequiredError,
7
+ 403 => ForbiddenError,
8
+ 404 => NotFoundError,
9
+ 429 => TooManyRequestsError,
10
+ 500 => InternalServerError,
11
+ 503 => ServiceUnavailableError
12
+ }.freeze
3
13
 
4
14
  def initialize
5
15
  @base_url = 'https://api.emailable.com/v1'
@@ -33,22 +43,7 @@ module Emailable
33
43
  status = response.status
34
44
  return response if status.between?(200, 299)
35
45
 
36
- error_attributes = {
37
- message: response.body['message'],
38
- code: status
39
- }
40
- error_map = {
41
- '400' => BadRequestError,
42
- '401' => UnauthorizedError,
43
- '402' => PaymentRequiredError,
44
- '403' => ForbiddenError,
45
- '404' => NotFoundError,
46
- '429' => TooManyRequestsError,
47
- '500' => InternalServerError,
48
- '503' => ServiceUnavailableError
49
- }
50
-
51
- raise error_map[status.to_s].new(error_attributes)
46
+ raise ERRORS[status].new(response.body['message'])
52
47
  end
53
48
 
54
49
  private
@@ -38,7 +38,7 @@ class EmailValidator < ActiveModel::EachValidator
38
38
 
39
39
  api_options = { timeout: timeout, smtp: smtp }
40
40
  api_options[:accept_all] = true unless accept_all
41
- ev = Emailable.verify(value, **api_options)
41
+ ev = Emailable.verify(value, api_options)
42
42
 
43
43
  result_accessor = "#{attribute}_verification_result"
44
44
  if record.respond_to?(result_accessor)
@@ -0,0 +1,12 @@
1
+ module Emailable
2
+ class Error < StandardError; end
3
+ class BadRequestError < Error; end
4
+ class UnauthorizedError < Error; end
5
+ class PaymentRequiredError < Error; end
6
+ class ForbiddenError < Error; end
7
+ class NotFoundError < Error; end
8
+ class TooManyRequestsError < Error; end
9
+ class InternalServerError < Error; end
10
+ class ServiceUnavailableError < Error; end
11
+ class TimeoutError < Error; end
12
+ end
@@ -7,13 +7,21 @@ module Emailable
7
7
  end
8
8
  end
9
9
 
10
- def inspect
11
- ivars = instance_variables.map do |e|
12
- [e.to_s.delete('@'), instance_variable_get(e)]
10
+ def to_h
11
+ instance_variables.map do |e|
12
+ [e.to_s.delete('@').to_sym, instance_variable_get(e)]
13
13
  end.to_h
14
- fmtted_email = @email ? " #{@email}" : ''
15
- "#<#{self.class}:0x#{(object_id << 1).to_s(16)}#{fmtted_email}> JSON: " +
16
- JSON.pretty_generate(ivars)
14
+ end
15
+
16
+ alias_method :to_hash, :to_h
17
+
18
+ def to_json
19
+ JSON.generate(to_h)
20
+ end
21
+
22
+ def inspect
23
+ "#<#{self.class}:0x#{(object_id << 1).to_s(16)}> JSON: " +
24
+ JSON.pretty_generate(to_h)
17
25
  end
18
26
 
19
27
  end
@@ -4,7 +4,7 @@ module Emailable
4
4
  :processed, :total
5
5
 
6
6
  def complete?
7
- !emails.nil?
7
+ message.include?('completed')
8
8
  end
9
9
  end
10
10
  end
@@ -11,5 +11,10 @@ module Emailable
11
11
  end
12
12
  end
13
13
 
14
+ def inspect
15
+ "#<#{self.class}:0x#{(object_id << 1).to_s(16)}#{@email}> JSON: " +
16
+ JSON.pretty_generate(to_h)
17
+ end
18
+
14
19
  end
15
20
  end
@@ -1,3 +1,3 @@
1
1
  module Emailable
2
- VERSION = '3.0.2'
2
+ VERSION = '4.0.0'
3
3
  end
data/lib/emailable.rb CHANGED
@@ -1,4 +1,8 @@
1
+ require 'net/http'
2
+ require 'json'
3
+
1
4
  require 'emailable/version'
5
+ require 'emailable/errors'
2
6
  require 'emailable/client'
3
7
  require 'emailable/response'
4
8
  require 'emailable/batch'
@@ -24,18 +28,14 @@ module Emailable
24
28
 
25
29
  module_function
26
30
 
27
- def verify(email, smtp: nil, accept_all: nil, timeout: nil)
28
- opts = {
29
- email: email, smtp: smtp, accept_all: accept_all, timeout: timeout
30
- }
31
+ def verify(email, parameters = {})
32
+ parameters[:email] = email
31
33
 
32
34
  client = Emailable::Client.new
33
- response = client.request(:get, 'verify', opts)
35
+ response = client.request(:get, 'verify', parameters)
34
36
 
35
37
  if response.status == 249
36
- raise Emailable::TimeoutError.new(
37
- code: response.status, message: response.body
38
- )
38
+ raise Emailable::TimeoutError.new(response.body)
39
39
  else
40
40
  Verification.new(response.body)
41
41
  end
@@ -47,22 +47,4 @@ module Emailable
47
47
  Account.new(response.body)
48
48
  end
49
49
 
50
-
51
- class Error < StandardError
52
- attr_accessor :code, :message
53
-
54
- def initialize(code: nil, message: nil)
55
- @code = code
56
- @message = message
57
- end
58
- end
59
- class BadRequestError < Error; end
60
- class UnauthorizedError < Error; end
61
- class PaymentRequiredError < Error; end
62
- class ForbiddenError < Error; end
63
- class NotFoundError < Error; end
64
- class TooManyRequestsError < Error; end
65
- class InternalServerError < Error; end
66
- class ServiceUnavailableError < Error; end
67
- class TimeoutError < Error; end
68
50
  end
@@ -1,3 +1,4 @@
1
+ require 'active_model'
1
2
  require 'test_helper'
2
3
 
3
4
  class EmailValidatorTest < Minitest::Test
@@ -22,8 +22,7 @@ module Emailable
22
22
  end
23
23
 
24
24
  def test_batch_complete
25
- complete = @batch.complete?
26
- assert complete == true || complete == false
25
+ assert @batch.complete?
27
26
  end
28
27
 
29
28
  end
@@ -0,0 +1,49 @@
1
+ require 'test_helper'
2
+
3
+ module Emailable
4
+ module Resources
5
+ class APIResourceTest < Minitest::Test
6
+ class Example < APIResource
7
+ attr_accessor :foo, :bar, :baz
8
+ end
9
+
10
+ def setup
11
+ @e = Example.new(foo: 'abc', bar: 123, baz: true)
12
+ end
13
+
14
+ def test_init
15
+ assert_equal 'abc', @e.foo
16
+ assert_equal 123, @e.bar
17
+ assert_equal true, @e.baz
18
+ end
19
+
20
+ def test_to_h
21
+ correct = {
22
+ foo: 'abc',
23
+ bar: 123,
24
+ baz: true,
25
+ }
26
+ assert_equal correct, @e.to_h
27
+ assert_equal correct, @e.to_hash
28
+ end
29
+
30
+ def test_to_json
31
+ correct = %q|{"foo":"abc","bar":123,"baz":true}|
32
+ assert_equal correct, @e.to_json
33
+ end
34
+
35
+ def test_inspect
36
+ correct = <<~STR.chomp
37
+ #<> JSON: {
38
+ "foo": "abc",
39
+ "bar": 123,
40
+ "baz": true
41
+ }
42
+ STR
43
+ output = @e.inspect.gsub(/<.*>/, '<>')
44
+ assert_equal correct, output
45
+ end
46
+ end
47
+
48
+ end
49
+ end
data/test/test_helper.rb CHANGED
@@ -1,5 +1,3 @@
1
- $LOAD_PATH.unshift File.expand_path("../../lib", __FILE__)
2
- require 'active_model'
3
1
  require 'emailable'
4
2
 
5
3
  require 'pry'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: emailable
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.0.2
4
+ version: 4.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Emailable
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-07-27 00:00:00.000000000 Z
11
+ date: 2022-02-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -134,6 +134,7 @@ files:
134
134
  - lib/emailable/batch.rb
135
135
  - lib/emailable/client.rb
136
136
  - lib/emailable/email_validator.rb
137
+ - lib/emailable/errors.rb
137
138
  - lib/emailable/resources/account.rb
138
139
  - lib/emailable/resources/api_resource.rb
139
140
  - lib/emailable/resources/batch_status.rb
@@ -142,6 +143,7 @@ files:
142
143
  - lib/emailable/version.rb
143
144
  - test/email_validator_test.rb
144
145
  - test/emailable/batch_test.rb
146
+ - test/emailable/resources/api_resource_test.rb
145
147
  - test/emailable_test.rb
146
148
  - test/test_helper.rb
147
149
  homepage: https://emailable.com
@@ -151,7 +153,7 @@ metadata:
151
153
  bug_tracker_uri: https://github.com/emailable/emailable-ruby/issues
152
154
  documentation_uri: https://docs.emailable.com/?ruby
153
155
  source_code_uri: https://github.com/emailable/emailable-ruby
154
- post_install_message:
156
+ post_install_message:
155
157
  rdoc_options: []
156
158
  require_paths:
157
159
  - lib
@@ -167,11 +169,12 @@ required_rubygems_version: !ruby/object:Gem::Requirement
167
169
  version: '0'
168
170
  requirements: []
169
171
  rubygems_version: 3.1.6
170
- signing_key:
172
+ signing_key:
171
173
  specification_version: 4
172
174
  summary: Ruby bindings for the Emailable API
173
175
  test_files:
174
176
  - test/email_validator_test.rb
175
177
  - test/emailable/batch_test.rb
178
+ - test/emailable/resources/api_resource_test.rb
176
179
  - test/emailable_test.rb
177
180
  - test/test_helper.rb