emailable 3.0.1 → 3.2.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 +4 -4
- data/.ruby-version +1 -1
- data/.travis.yml +2 -2
- data/Gemfile.lock +2 -17
- data/LICENSE.txt +1 -1
- data/README.md +2 -2
- data/bin/console +4 -4
- data/emailable.gemspec +0 -3
- data/lib/emailable/batch.rb +10 -5
- data/lib/emailable/client.rb +73 -39
- data/lib/emailable/email_validator.rb +1 -1
- data/lib/emailable/errors.rb +12 -0
- data/lib/emailable/resources/api_resource.rb +14 -6
- data/lib/emailable/resources/batch_status.rb +1 -1
- data/lib/emailable/resources/verification.rb +5 -0
- data/lib/emailable/response.rb +12 -0
- data/lib/emailable/version.rb +1 -1
- data/lib/emailable.rb +11 -24
- data/test/email_validator_test.rb +1 -0
- data/test/emailable/batch_test.rb +1 -2
- data/test/emailable/resources/api_resource_test.rb +49 -0
- data/test/test_helper.rb +0 -2
- metadata +10 -48
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA256:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 59b57b0948d78b837e5a3f82a0a0e5c5446742f57e50ebbd2c5b0817f0aabfc5
         | 
| 4 | 
            +
              data.tar.gz: 58ce6a2ac2a9846e5daa63157014cbe0b557f4c94f30c71d9252db8e169cc12f
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 033fe8af379957fdee488fca886d3e3ac4818a7f8587b80554424c7ec824bd9dd1ed949268bc246da1460d0afc449df640cdca8e7bf4fcfbef6790c6c5b1fb1a
         | 
| 7 | 
            +
              data.tar.gz: 9d9ff16f6db49bc2c8791ae46be20dfdc7e5d8e58cc9b603e9e04492b85d97bc0bf48b7933ca46a1362469cba4ca923b35a4444c056699716a15417518454897
         | 
    
        data/.ruby-version
    CHANGED
    
    | @@ -1 +1 @@ | |
| 1 | 
            -
            2. | 
| 1 | 
            +
            2.7.4
         | 
    
        data/.travis.yml
    CHANGED
    
    
    
        data/Gemfile.lock
    CHANGED
    
    | @@ -1,10 +1,7 @@ | |
| 1 1 | 
             
            PATH
         | 
| 2 2 | 
             
              remote: .
         | 
| 3 3 | 
             
              specs:
         | 
| 4 | 
            -
                emailable (3. | 
| 5 | 
            -
                  faraday
         | 
| 6 | 
            -
                  faraday_middleware
         | 
| 7 | 
            -
                  net-http-persistent
         | 
| 4 | 
            +
                emailable (3.1.1)
         | 
| 8 5 |  | 
| 9 6 | 
             
            GEM
         | 
| 10 7 | 
             
              remote: https://rubygems.org/
         | 
| @@ -22,14 +19,6 @@ GEM | |
| 22 19 | 
             
                builder (3.2.3)
         | 
| 23 20 | 
             
                coderay (1.1.2)
         | 
| 24 21 | 
             
                concurrent-ruby (1.1.7)
         | 
| 25 | 
            -
                connection_pool (2.2.3)
         | 
| 26 | 
            -
                faraday (1.3.0)
         | 
| 27 | 
            -
                  faraday-net_http (~> 1.0)
         | 
| 28 | 
            -
                  multipart-post (>= 1.2, < 3)
         | 
| 29 | 
            -
                  ruby2_keywords
         | 
| 30 | 
            -
                faraday-net_http (1.0.1)
         | 
| 31 | 
            -
                faraday_middleware (1.0.0)
         | 
| 32 | 
            -
                  faraday (~> 1.0)
         | 
| 33 22 | 
             
                i18n (1.8.5)
         | 
| 34 23 | 
             
                  concurrent-ruby (~> 1.0)
         | 
| 35 24 | 
             
                method_source (0.9.2)
         | 
| @@ -39,15 +28,11 @@ GEM | |
| 39 28 | 
             
                  builder
         | 
| 40 29 | 
             
                  minitest (>= 5.0)
         | 
| 41 30 | 
             
                  ruby-progressbar
         | 
| 42 | 
            -
                multipart-post (2.1.1)
         | 
| 43 | 
            -
                net-http-persistent (4.0.1)
         | 
| 44 | 
            -
                  connection_pool (~> 2.2)
         | 
| 45 31 | 
             
                pry (0.12.2)
         | 
| 46 32 | 
             
                  coderay (~> 1.1.0)
         | 
| 47 33 | 
             
                  method_source (~> 0.9.0)
         | 
| 48 34 | 
             
                rake (13.0.1)
         | 
| 49 35 | 
             
                ruby-progressbar (1.10.1)
         | 
| 50 | 
            -
                ruby2_keywords (0.0.4)
         | 
| 51 36 | 
             
                thread_safe (0.3.6)
         | 
| 52 37 | 
             
                tzinfo (1.2.8)
         | 
| 53 38 | 
             
                  thread_safe (~> 0.1)
         | 
| @@ -67,4 +52,4 @@ DEPENDENCIES | |
| 67 52 | 
             
              rake (~> 13.0)
         | 
| 68 53 |  | 
| 69 54 | 
             
            BUNDLED WITH
         | 
| 70 | 
            -
               1. | 
| 55 | 
            +
               2.1.4
         | 
    
        data/LICENSE.txt
    CHANGED
    
    | @@ -1,6 +1,6 @@ | |
| 1 1 | 
             
            The MIT License (MIT)
         | 
| 2 2 |  | 
| 3 | 
            -
            Copyright (c)  | 
| 3 | 
            +
            Copyright (c) 2021 Emailable. https://emailable.com
         | 
| 4 4 |  | 
| 5 5 | 
             
            Permission is hereby granted, free of charge, to any person obtaining a copy
         | 
| 6 6 | 
             
            of this software and associated documentation files (the "Software"), to deal
         | 
    
        data/README.md
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            # Emailable Ruby Library
         | 
| 2 2 |  | 
| 3 | 
            -
            [](https://travis-ci.com/emailable/emailable-ruby)
         | 
| 4 | 
            -
            [](https://app.travis-ci.com/emailable/emailable-ruby)
         | 
| 4 | 
            +
            [](https://codeclimate.com/github/emailable/emailable-ruby/maintainability)
         | 
| 5 5 |  | 
| 6 6 | 
             
            This is the official ruby wrapper for the Emailable API.
         | 
| 7 7 |  | 
    
        data/bin/console
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            #!/usr/bin/env ruby
         | 
| 2 2 |  | 
| 3 | 
            -
            require  | 
| 4 | 
            -
            require  | 
| 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  | 
| 10 | 
            +
            # require 'pry'
         | 
| 11 11 | 
             
            # Pry.start
         | 
| 12 12 |  | 
| 13 | 
            -
            require  | 
| 13 | 
            +
            require 'irb'
         | 
| 14 14 | 
             
            IRB.start(__FILE__)
         | 
    
        data/emailable.gemspec
    CHANGED
    
    | @@ -27,9 +27,6 @@ Gem::Specification.new do |s| | |
| 27 27 | 
             
              end
         | 
| 28 28 | 
             
              s.require_paths = ['lib']
         | 
| 29 29 |  | 
| 30 | 
            -
              s.add_dependency 'faraday'
         | 
| 31 | 
            -
              s.add_dependency 'faraday_middleware'
         | 
| 32 | 
            -
              s.add_dependency 'net-http-persistent'
         | 
| 33 30 | 
             
              s.add_development_dependency 'bundler'
         | 
| 34 31 | 
             
              s.add_development_dependency 'rake', '~> 13.0'
         | 
| 35 32 | 
             
              s.add_development_dependency 'pry'
         | 
    
        data/lib/emailable/batch.rb
    CHANGED
    
    | @@ -4,31 +4,36 @@ module Emailable | |
| 4 4 |  | 
| 5 5 | 
             
                def initialize(id_or_emails, callback: nil)
         | 
| 6 6 | 
             
                  if id_or_emails.is_a?(Array)
         | 
| 7 | 
            +
                    @id = nil
         | 
| 7 8 | 
             
                    @emails = id_or_emails
         | 
| 8 9 | 
             
                    @callback = callback
         | 
| 9 10 | 
             
                  elsif id_or_emails.is_a?(String)
         | 
| 10 11 | 
             
                    @id = id_or_emails
         | 
| 12 | 
            +
                    @emails = nil
         | 
| 13 | 
            +
                    @callback = nil
         | 
| 11 14 | 
             
                  else
         | 
| 12 15 | 
             
                    raise ArgumentError, 'expected an array of emails or batch id'
         | 
| 13 16 | 
             
                  end
         | 
| 14 17 |  | 
| 15 18 | 
             
                  @client = Emailable::Client.new
         | 
| 19 | 
            +
                  @status = nil
         | 
| 16 20 | 
             
                end
         | 
| 17 21 |  | 
| 18 | 
            -
                def verify
         | 
| 22 | 
            +
                def verify(simulate: nil)
         | 
| 19 23 | 
             
                  return @id unless @id.nil?
         | 
| 20 24 |  | 
| 21 | 
            -
                  opts = { emails: @emails.join(','), url: @callback }
         | 
| 25 | 
            +
                  opts = { emails: @emails.join(','), url: @callback, simulate: simulate }
         | 
| 22 26 | 
             
                  response = @client.request(:post, 'batch', opts)
         | 
| 23 27 |  | 
| 24 28 | 
             
                  @id = response.body['id']
         | 
| 25 29 | 
             
                end
         | 
| 26 30 |  | 
| 27 | 
            -
                def status
         | 
| 31 | 
            +
                def status(simulate: nil, partial: nil)
         | 
| 28 32 | 
             
                  return nil unless @id
         | 
| 29 33 | 
             
                  return @status if @status
         | 
| 30 34 |  | 
| 31 | 
            -
                   | 
| 35 | 
            +
                  body = { id: @id, simulate: simulate, partial: partial }
         | 
| 36 | 
            +
                  response = @client.request(:get, 'batch', body)
         | 
| 32 37 | 
             
                  bs = BatchStatus.new(response.body)
         | 
| 33 38 | 
             
                  @status = bs if bs.complete?
         | 
| 34 39 |  | 
| @@ -36,7 +41,7 @@ module Emailable | |
| 36 41 | 
             
                end
         | 
| 37 42 |  | 
| 38 43 | 
             
                def complete?
         | 
| 39 | 
            -
                   | 
| 44 | 
            +
                  status.complete?
         | 
| 40 45 | 
             
                end
         | 
| 41 46 |  | 
| 42 47 | 
             
                def inspect
         | 
    
        data/lib/emailable/client.rb
    CHANGED
    
    | @@ -1,28 +1,41 @@ | |
| 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 | 
            -
                  @ | 
| 6 | 
            -
             | 
| 7 | 
            -
                    f.response :json, content_type: /\bjson$/
         | 
| 8 | 
            -
                    f.adapter :net_http_persistent
         | 
| 9 | 
            -
                  end
         | 
| 15 | 
            +
                  @base_url = 'https://api.emailable.com/v1'
         | 
| 16 | 
            +
                  @connection = create_connection(URI(@base_url))
         | 
| 10 17 | 
             
                end
         | 
| 11 18 |  | 
| 12 | 
            -
                def request(method, endpoint,  | 
| 19 | 
            +
                def request(method, endpoint, params = {})
         | 
| 13 20 | 
             
                  begin
         | 
| 14 | 
            -
                    tries ||=  | 
| 21 | 
            +
                    tries ||= 3
         | 
| 15 22 |  | 
| 16 | 
            -
                     | 
| 23 | 
            +
                    uri = URI("#{@base_url}/#{endpoint}")
         | 
| 24 | 
            +
                    params[:api_key] = Emailable.api_key
         | 
| 17 25 |  | 
| 18 | 
            -
                     | 
| 26 | 
            +
                    http_response =
         | 
| 19 27 | 
             
                      if method == :get
         | 
| 20 | 
            -
                         | 
| 28 | 
            +
                        uri.query = URI.encode_www_form(params)
         | 
| 29 | 
            +
                        @connection.get(uri)
         | 
| 21 30 | 
             
                      elsif method == :post
         | 
| 22 | 
            -
                         | 
| 31 | 
            +
                        request = Net::HTTP::Post.new(uri, 'Content-Type': 'application/json')
         | 
| 32 | 
            +
                        request.body = params.to_json
         | 
| 33 | 
            +
                        @connection.request(request)
         | 
| 23 34 | 
             
                      end
         | 
| 35 | 
            +
             | 
| 36 | 
            +
                    response = Response.new(http_response)
         | 
| 24 37 | 
             
                  rescue => e
         | 
| 25 | 
            -
                    retry if self.class.should_retry?(e, tries)
         | 
| 38 | 
            +
                    retry if (tries -= 1) > 0 && self.class.should_retry?(e, tries)
         | 
| 26 39 |  | 
| 27 40 | 
             
                    raise e
         | 
| 28 41 | 
             
                  end
         | 
| @@ -30,41 +43,62 @@ module Emailable | |
| 30 43 | 
             
                  status = response.status
         | 
| 31 44 | 
             
                  return response if status.between?(200, 299)
         | 
| 32 45 |  | 
| 33 | 
            -
                   | 
| 34 | 
            -
             | 
| 35 | 
            -
             | 
| 36 | 
            -
             | 
| 37 | 
            -
             | 
| 38 | 
            -
             | 
| 39 | 
            -
             | 
| 40 | 
            -
             | 
| 41 | 
            -
             | 
| 42 | 
            -
             | 
| 43 | 
            -
             | 
| 44 | 
            -
             | 
| 45 | 
            -
             | 
| 46 | 
            -
                   | 
| 47 | 
            -
             | 
| 48 | 
            -
                   | 
| 46 | 
            +
                  raise ERRORS[status].new(response.body['message'])
         | 
| 47 | 
            +
                end
         | 
| 48 | 
            +
             | 
| 49 | 
            +
                private
         | 
| 50 | 
            +
             | 
| 51 | 
            +
                def create_connection(uri)
         | 
| 52 | 
            +
                  connection = Net::HTTP.new(uri.host, uri.port)
         | 
| 53 | 
            +
             | 
| 54 | 
            +
                  # Time in seconds within which Net::HTTP will try to reuse an already
         | 
| 55 | 
            +
                  # open connection when issuing a new operation. Outside this window, Ruby
         | 
| 56 | 
            +
                  # will transparently close and re-open the connection without trying to
         | 
| 57 | 
            +
                  # reuse it.
         | 
| 58 | 
            +
                  #
         | 
| 59 | 
            +
                  # Ruby's default of 2 seconds is almost certainly too short. Here I've
         | 
| 60 | 
            +
                  # reused Go's default for `DefaultTransport`.
         | 
| 61 | 
            +
                  connection.keep_alive_timeout = 30
         | 
| 62 | 
            +
             | 
| 63 | 
            +
                  connection.open_timeout = Emailable.open_timeout
         | 
| 64 | 
            +
                  connection.read_timeout = Emailable.read_timeout
         | 
| 65 | 
            +
                  if connection.respond_to?(:write_timeout=)
         | 
| 66 | 
            +
                    connection.write_timeout = Emailable.write_timeout
         | 
| 67 | 
            +
                  end
         | 
| 68 | 
            +
                  connection.use_ssl = uri.scheme == "https"
         | 
| 69 | 
            +
             | 
| 70 | 
            +
                  connection
         | 
| 49 71 | 
             
                end
         | 
| 50 72 |  | 
| 51 73 | 
             
                def self.should_retry?(error, num_retries)
         | 
| 52 74 | 
             
                  return false if num_retries >= Emailable.max_network_retries
         | 
| 53 75 |  | 
| 54 | 
            -
                   | 
| 55 | 
            -
                   | 
| 76 | 
            +
                  case error
         | 
| 77 | 
            +
                  when Net::OpenTimeout, Net::ReadTimeout
         | 
| 78 | 
            +
                    # Retry on timeout-related problems (either on open or read).
         | 
| 79 | 
            +
                    true
         | 
| 80 | 
            +
                  when EOFError, Errno::ECONNREFUSED, Errno::ECONNRESET,
         | 
| 81 | 
            +
                    Errno::EHOSTUNREACH, Errno::ETIMEDOUT, SocketError
         | 
| 82 | 
            +
                    # Destination refused the connection, the connection was reset, or a
         | 
| 83 | 
            +
                    # variety of other connection failures. This could occur from a single
         | 
| 84 | 
            +
                    # saturated server, so retry in case it's intermittent.
         | 
| 85 | 
            +
                    true
         | 
| 86 | 
            +
                  when Net::HTTPError
         | 
| 87 | 
            +
                    # 409 Conflict
         | 
| 88 | 
            +
                    return true if error.http_status == 409
         | 
| 56 89 |  | 
| 57 | 
            -
             | 
| 58 | 
            -
             | 
| 59 | 
            -
                  # saturated server, so retry in case it's intermittent.
         | 
| 60 | 
            -
                  return true if error.is_a?(Faraday::ConnectionFailed)
         | 
| 90 | 
            +
                    # 429 Too Many Requests
         | 
| 91 | 
            +
                    return true if error.http_status == 429
         | 
| 61 92 |  | 
| 62 | 
            -
             | 
| 63 | 
            -
                     | 
| 64 | 
            -
                    return true if error.response[:status] == 409
         | 
| 65 | 
            -
                  end
         | 
| 93 | 
            +
                    # 500 Internal Server Error
         | 
| 94 | 
            +
                    return true if error.http_status == 500
         | 
| 66 95 |  | 
| 67 | 
            -
             | 
| 96 | 
            +
                    # 503 Service Unavailable
         | 
| 97 | 
            +
                    error.http_status == 503
         | 
| 98 | 
            +
                  else
         | 
| 99 | 
            +
                    false
         | 
| 100 | 
            +
                  end
         | 
| 68 101 | 
             
                end
         | 
| 102 | 
            +
             | 
| 69 103 | 
             
              end
         | 
| 70 104 | 
             
            end
         | 
| @@ -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  | 
| 11 | 
            -
                   | 
| 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 | 
            -
             | 
| 15 | 
            -
             | 
| 16 | 
            -
             | 
| 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
         | 
    
        data/lib/emailable/version.rb
    CHANGED
    
    
    
        data/lib/emailable.rb
    CHANGED
    
    | @@ -1,7 +1,10 @@ | |
| 1 | 
            -
            require ' | 
| 2 | 
            -
            require ' | 
| 1 | 
            +
            require 'net/http'
         | 
| 2 | 
            +
            require 'json'
         | 
| 3 | 
            +
             | 
| 3 4 | 
             
            require 'emailable/version'
         | 
| 5 | 
            +
            require 'emailable/errors'
         | 
| 4 6 | 
             
            require 'emailable/client'
         | 
| 7 | 
            +
            require 'emailable/response'
         | 
| 5 8 | 
             
            require 'emailable/batch'
         | 
| 6 9 | 
             
            require 'emailable/resources/api_resource'
         | 
| 7 10 | 
             
            require 'emailable/resources/account'
         | 
| @@ -14,9 +17,13 @@ end | |
| 14 17 |  | 
| 15 18 | 
             
            module Emailable
         | 
| 16 19 | 
             
              @max_network_retries = 1
         | 
| 20 | 
            +
              @open_timeout = 30
         | 
| 21 | 
            +
              @read_timeout = 60
         | 
| 22 | 
            +
              @write_timeout = 30
         | 
| 17 23 |  | 
| 18 24 | 
             
              class << self
         | 
| 19 | 
            -
                attr_accessor :api_key, :max_network_retries
         | 
| 25 | 
            +
                attr_accessor :api_key, :max_network_retries, :open_timeout, :read_timeout,
         | 
| 26 | 
            +
                  :write_timeout
         | 
| 20 27 | 
             
              end
         | 
| 21 28 |  | 
| 22 29 | 
             
              module_function
         | 
| @@ -30,9 +37,7 @@ module Emailable | |
| 30 37 | 
             
                response = client.request(:get, 'verify', opts)
         | 
| 31 38 |  | 
| 32 39 | 
             
                if response.status == 249
         | 
| 33 | 
            -
                  raise Emailable::TimeoutError.new(
         | 
| 34 | 
            -
                    code: response.status, message: response.body
         | 
| 35 | 
            -
                  )
         | 
| 40 | 
            +
                  raise Emailable::TimeoutError.new(response.body)
         | 
| 36 41 | 
             
                else
         | 
| 37 42 | 
             
                  Verification.new(response.body)
         | 
| 38 43 | 
             
                end
         | 
| @@ -44,22 +49,4 @@ module Emailable | |
| 44 49 | 
             
                Account.new(response.body)
         | 
| 45 50 | 
             
              end
         | 
| 46 51 |  | 
| 47 | 
            -
             | 
| 48 | 
            -
              class Error < StandardError
         | 
| 49 | 
            -
                attr_accessor :code, :message
         | 
| 50 | 
            -
             | 
| 51 | 
            -
                def initialize(code: nil, message: nil)
         | 
| 52 | 
            -
                  @code = code
         | 
| 53 | 
            -
                  @message = message
         | 
| 54 | 
            -
                end
         | 
| 55 | 
            -
              end
         | 
| 56 | 
            -
              class BadRequestError < Error; end
         | 
| 57 | 
            -
              class UnauthorizedError < Error; end
         | 
| 58 | 
            -
              class PaymentRequiredError < Error; end
         | 
| 59 | 
            -
              class ForbiddenError < Error; end
         | 
| 60 | 
            -
              class NotFoundError < Error; end
         | 
| 61 | 
            -
              class TooManyRequestsError < Error; end
         | 
| 62 | 
            -
              class InternalServerError < Error; end
         | 
| 63 | 
            -
              class ServiceUnavailableError < Error; end
         | 
| 64 | 
            -
              class TimeoutError < Error; end
         | 
| 65 52 | 
             
            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
    
    
    
        metadata
    CHANGED
    
    | @@ -1,57 +1,15 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: emailable
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 3.0 | 
| 4 | 
            +
              version: 3.2.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:  | 
| 11 | 
            +
            date: 2022-01-17 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 | 
            -
            - !ruby/object:Gem::Dependency
         | 
| 14 | 
            -
              name: faraday
         | 
| 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: faraday_middleware
         | 
| 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: net-http-persistent
         | 
| 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 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 56 14 | 
             
              name: bundler
         | 
| 57 15 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| @@ -176,13 +134,16 @@ files: | |
| 176 134 | 
             
            - lib/emailable/batch.rb
         | 
| 177 135 | 
             
            - lib/emailable/client.rb
         | 
| 178 136 | 
             
            - lib/emailable/email_validator.rb
         | 
| 137 | 
            +
            - lib/emailable/errors.rb
         | 
| 179 138 | 
             
            - lib/emailable/resources/account.rb
         | 
| 180 139 | 
             
            - lib/emailable/resources/api_resource.rb
         | 
| 181 140 | 
             
            - lib/emailable/resources/batch_status.rb
         | 
| 182 141 | 
             
            - lib/emailable/resources/verification.rb
         | 
| 142 | 
            +
            - lib/emailable/response.rb
         | 
| 183 143 | 
             
            - lib/emailable/version.rb
         | 
| 184 144 | 
             
            - test/email_validator_test.rb
         | 
| 185 145 | 
             
            - test/emailable/batch_test.rb
         | 
| 146 | 
            +
            - test/emailable/resources/api_resource_test.rb
         | 
| 186 147 | 
             
            - test/emailable_test.rb
         | 
| 187 148 | 
             
            - test/test_helper.rb
         | 
| 188 149 | 
             
            homepage: https://emailable.com
         | 
| @@ -192,7 +153,7 @@ metadata: | |
| 192 153 | 
             
              bug_tracker_uri: https://github.com/emailable/emailable-ruby/issues
         | 
| 193 154 | 
             
              documentation_uri: https://docs.emailable.com/?ruby
         | 
| 194 155 | 
             
              source_code_uri: https://github.com/emailable/emailable-ruby
         | 
| 195 | 
            -
            post_install_message:
         | 
| 156 | 
            +
            post_install_message: 
         | 
| 196 157 | 
             
            rdoc_options: []
         | 
| 197 158 | 
             
            require_paths:
         | 
| 198 159 | 
             
            - lib
         | 
| @@ -207,12 +168,13 @@ required_rubygems_version: !ruby/object:Gem::Requirement | |
| 207 168 | 
             
                - !ruby/object:Gem::Version
         | 
| 208 169 | 
             
                  version: '0'
         | 
| 209 170 | 
             
            requirements: []
         | 
| 210 | 
            -
            rubygems_version: 3. | 
| 211 | 
            -
            signing_key:
         | 
| 171 | 
            +
            rubygems_version: 3.1.6
         | 
| 172 | 
            +
            signing_key: 
         | 
| 212 173 | 
             
            specification_version: 4
         | 
| 213 174 | 
             
            summary: Ruby bindings for the Emailable API
         | 
| 214 175 | 
             
            test_files:
         | 
| 215 176 | 
             
            - test/email_validator_test.rb
         | 
| 216 177 | 
             
            - test/emailable/batch_test.rb
         | 
| 178 | 
            +
            - test/emailable/resources/api_resource_test.rb
         | 
| 217 179 | 
             
            - test/emailable_test.rb
         | 
| 218 180 | 
             
            - test/test_helper.rb
         |