lob 2.5.1 → 3.0.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/.travis.yml +2 -2
- data/CHANGELOG.md +9 -0
- data/CONTRIBUTING.md +19 -0
- data/Gemfile +0 -2
- data/README.md +19 -36
- data/examples/README.md +14 -6
- data/examples/checks.rb +6 -7
- data/examples/csv_checks/create_checks.rb +47 -0
- data/examples/csv_checks/input.csv +6 -0
- data/examples/csv_letters/create_letters.rb +40 -0
- data/examples/csv_letters/input.csv +6 -0
- data/examples/csv_letters/letter_template.html +33 -0
- data/examples/csv_postcards/create_postcards.rb +2 -3
- data/examples/letters.rb +4 -5
- data/examples/postcards.rb +4 -5
- data/examples/verify/verify.rb +3 -4
- data/lib/lob.rb +1 -91
- data/lib/lob/client.rb +61 -0
- data/lib/lob/resources/address.rb +24 -0
- data/lib/lob/resources/area.rb +16 -0
- data/lib/lob/resources/bank_account.rb +24 -0
- data/lib/lob/resources/check.rb +14 -0
- data/lib/lob/resources/country.rb +16 -0
- data/lib/lob/resources/letter.rb +14 -0
- data/lib/lob/resources/postcard.rb +14 -0
- data/lib/lob/resources/resource_base.rb +108 -0
- data/lib/lob/resources/route.rb +24 -0
- data/lib/lob/resources/state.rb +16 -0
- data/lib/lob/version.rb +1 -1
- data/spec/lob/{v1 → resources}/address_spec.rb +15 -14
- data/spec/lob/{v1 → resources}/area_spec.rb +2 -2
- data/spec/lob/{v1 → resources}/bank_account_spec.rb +2 -2
- data/spec/lob/{v1 → resources}/check_spec.rb +3 -2
- data/spec/lob/{v1 → resources}/country_spec.rb +2 -2
- data/spec/lob/{v1 → resources}/letter_spec.rb +2 -2
- data/spec/lob/{v1 → resources}/postcard_spec.rb +2 -2
- data/spec/lob/resources/resource_base_spec.rb +53 -0
- data/spec/lob/{v1 → resources}/route_spec.rb +2 -2
- data/spec/lob/{v1 → resources}/state_spec.rb +2 -2
- data/spec/lob_spec.rb +12 -45
- data/spec/spec_helper.rb +2 -0
- metadata +86 -89
- data/examples/jobs.rb +0 -91
- data/lib/lob/v1/address.rb +0 -41
- data/lib/lob/v1/area.rb +0 -27
- data/lib/lob/v1/bank_account.rb +0 -37
- data/lib/lob/v1/check.rb +0 -33
- data/lib/lob/v1/country.rb +0 -21
- data/lib/lob/v1/job.rb +0 -39
- data/lib/lob/v1/letter.rb +0 -33
- data/lib/lob/v1/object.rb +0 -33
- data/lib/lob/v1/postcard.rb +0 -33
- data/lib/lob/v1/resource.rb +0 -69
- data/lib/lob/v1/route.rb +0 -27
- data/lib/lob/v1/setting.rb +0 -25
- data/lib/lob/v1/state.rb +0 -21
- data/spec/lob/v1/job_spec.rb +0 -161
- data/spec/lob/v1/object_spec.rb +0 -72
- data/spec/lob/v1/resource_spec.rb +0 -41
- data/spec/lob/v1/setting_spec.rb +0 -21
    
        data/examples/letters.rb
    CHANGED
    
    | @@ -2,8 +2,7 @@ $:.unshift File.expand_path("../lib", File.dirname(__FILE__)) | |
| 2 2 | 
             
            require 'lob'
         | 
| 3 3 |  | 
| 4 4 | 
             
            # initialize Lob object
         | 
| 5 | 
            -
            Lob.api_key  | 
| 6 | 
            -
            @lob = Lob.load
         | 
| 5 | 
            +
            lob = Lob::Client.new(api_key: 'test_799ff27291c166d10ba191902ad02fb059c')
         | 
| 7 6 |  | 
| 8 7 | 
             
            html = %{
         | 
| 9 8 | 
             
            <html>
         | 
| @@ -42,7 +41,7 @@ html = %{ | |
| 42 41 | 
             
            }
         | 
| 43 42 |  | 
| 44 43 | 
             
            # create a to address
         | 
| 45 | 
            -
            to_address =  | 
| 44 | 
            +
            to_address = lob.addresses.create(
         | 
| 46 45 | 
             
              name: "ToAddress",
         | 
| 47 46 | 
             
              address_line1: "120 6th Ave",
         | 
| 48 47 | 
             
              address_city: "Boston",
         | 
| @@ -52,7 +51,7 @@ to_address = @lob.addresses.create( | |
| 52 51 | 
             
            )
         | 
| 53 52 |  | 
| 54 53 | 
             
            # create a from address
         | 
| 55 | 
            -
            from_address =  | 
| 54 | 
            +
            from_address = lob.addresses.create(
         | 
| 56 55 | 
             
              name: "FromAddress",
         | 
| 57 56 | 
             
              address_line1: "120 6th Ave",
         | 
| 58 57 | 
             
              address_city: "Boston",
         | 
| @@ -62,7 +61,7 @@ from_address = @lob.addresses.create( | |
| 62 61 | 
             
            )
         | 
| 63 62 |  | 
| 64 63 | 
             
            # send the letter
         | 
| 65 | 
            -
            puts  | 
| 64 | 
            +
            puts lob.letters.create(
         | 
| 66 65 | 
             
              description: "Test letter",
         | 
| 67 66 | 
             
              to: to_address["id"],
         | 
| 68 67 | 
             
              from: from_address["id"],
         | 
    
        data/examples/postcards.rb
    CHANGED
    
    | @@ -2,8 +2,7 @@ $:.unshift File.expand_path("../lib", File.dirname(__FILE__)) | |
| 2 2 | 
             
            require 'lob'
         | 
| 3 3 |  | 
| 4 4 | 
             
            # initialize Lob object
         | 
| 5 | 
            -
            Lob.api_key  | 
| 6 | 
            -
            @lob = Lob.load
         | 
| 5 | 
            +
            lob = Lob::Client.new(api_key: 'test_799ff27291c166d10ba191902ad02fb059c')
         | 
| 7 6 |  | 
| 8 7 | 
             
            # HTML to send to the server
         | 
| 9 8 | 
             
            html = %{
         | 
| @@ -56,7 +55,7 @@ html = %{ | |
| 56 55 | 
             
            }
         | 
| 57 56 |  | 
| 58 57 | 
             
            # create a to address
         | 
| 59 | 
            -
            to_address =  | 
| 58 | 
            +
            to_address = lob.addresses.create(
         | 
| 60 59 | 
             
              name: "ToAddress",
         | 
| 61 60 | 
             
              address_line1: "120 6th Ave",
         | 
| 62 61 | 
             
              address_city: "Boston",
         | 
| @@ -66,7 +65,7 @@ to_address = @lob.addresses.create( | |
| 66 65 | 
             
            )
         | 
| 67 66 |  | 
| 68 67 | 
             
            # create a from address
         | 
| 69 | 
            -
            from_address =  | 
| 68 | 
            +
            from_address = lob.addresses.create(
         | 
| 70 69 | 
             
              name: "FromAddress",
         | 
| 71 70 | 
             
              address_line1: "120 6th Ave",
         | 
| 72 71 | 
             
              address_city: "Boston",
         | 
| @@ -76,7 +75,7 @@ from_address = @lob.addresses.create( | |
| 76 75 | 
             
            )
         | 
| 77 76 |  | 
| 78 77 | 
             
            # send a postcard
         | 
| 79 | 
            -
            puts  | 
| 78 | 
            +
            puts lob.postcards.create(
         | 
| 80 79 | 
             
              description: "Beach Postcard",
         | 
| 81 80 | 
             
              to: to_address["id"],
         | 
| 82 81 | 
             
              from: from_address["id"],
         | 
    
        data/examples/verify/verify.rb
    CHANGED
    
    | @@ -7,18 +7,17 @@ require 'lob' | |
| 7 7 | 
             
            require 'street_address'
         | 
| 8 8 |  | 
| 9 9 | 
             
            # Initialize Lob object
         | 
| 10 | 
            -
            Lob.api_key  | 
| 11 | 
            -
            @lob = Lob.load
         | 
| 10 | 
            +
            lob = Lob::Client.new(api_key: 'test_799ff27291c166d10ba191902ad02fb059c')
         | 
| 12 11 |  | 
| 13 12 | 
             
            output = File.open(File.expand_path('../output.csv', __FILE__), 'w')
         | 
| 14 13 |  | 
| 15 14 | 
             
            output.puts ['address_line1', 'address_city', 'address_state', 'address_zip', 'address_country'].join(',')
         | 
| 16 15 |  | 
| 17 | 
            -
            # Parse the  | 
| 16 | 
            +
            # Parse the input file and verify the addresses
         | 
| 18 17 | 
             
            File.open(File.expand_path('../input.txt', __FILE__)).each_line do |line|
         | 
| 19 18 | 
             
              parsed_address = StreetAddress::US.parse(line)
         | 
| 20 19 |  | 
| 21 | 
            -
              verified_address =  | 
| 20 | 
            +
              verified_address = lob.addresses.verify(
         | 
| 22 21 | 
             
                address_line1: parsed_address.to_s(:line1),
         | 
| 23 22 | 
             
                address_city: parsed_address.city,
         | 
| 24 23 | 
             
                address_state: parsed_address.state,
         | 
    
        data/lib/lob.rb
    CHANGED
    
    | @@ -1,97 +1,7 @@ | |
| 1 | 
            -
            require " | 
| 2 | 
            -
            require "json"
         | 
| 3 | 
            -
            require 'uri'
         | 
| 1 | 
            +
            require "lob/client"
         | 
| 4 2 | 
             
            require "lob/version"
         | 
| 5 3 | 
             
            require "lob/errors/lob_error"
         | 
| 6 4 | 
             
            require "lob/errors/invalid_request_error"
         | 
| 7 5 |  | 
| 8 | 
            -
            # Dynamically require files
         | 
| 9 | 
            -
            Dir[File.join(File.dirname(__FILE__), 'lob', 'v*', '*.rb')].each {|file| require file }
         | 
| 10 | 
            -
             | 
| 11 6 | 
             
            module Lob
         | 
| 12 | 
            -
              class << self
         | 
| 13 | 
            -
                attr_accessor :api_key, :api_version, :protocol, :api_host
         | 
| 14 | 
            -
             | 
| 15 | 
            -
                def configure
         | 
| 16 | 
            -
                  yield self
         | 
| 17 | 
            -
                  true
         | 
| 18 | 
            -
                end
         | 
| 19 | 
            -
                alias :config :configure
         | 
| 20 | 
            -
              end
         | 
| 21 | 
            -
             | 
| 22 | 
            -
              def self.submit(method, url, parameters={})
         | 
| 23 | 
            -
                clientVersion = Lob::VERSION
         | 
| 24 | 
            -
             | 
| 25 | 
            -
                begin
         | 
| 26 | 
            -
                  if method == :get || method == :delete
         | 
| 27 | 
            -
                    # Hack to URL encode nested objects like metadata.
         | 
| 28 | 
            -
                    url = "#{url}?#{build_nested_query(parameters)}"
         | 
| 29 | 
            -
                    response = RestClient.send(method, url, {
         | 
| 30 | 
            -
                      user_agent: 'Lob/v1 RubyBindings/' + clientVersion,
         | 
| 31 | 
            -
                      "Lob-Version" => self.api_version
         | 
| 32 | 
            -
                    })
         | 
| 33 | 
            -
                  else
         | 
| 34 | 
            -
                    response = RestClient.send(method, url, parameters, {
         | 
| 35 | 
            -
                      user_agent: 'Lob/v1 RubyBindings/' + clientVersion,
         | 
| 36 | 
            -
                      "Lob-Version" => self.api_version
         | 
| 37 | 
            -
                    })
         | 
| 38 | 
            -
                  end
         | 
| 39 | 
            -
             | 
| 40 | 
            -
                  body = JSON.parse(response)
         | 
| 41 | 
            -
             | 
| 42 | 
            -
                  body.define_singleton_method(:_response) do
         | 
| 43 | 
            -
                    response
         | 
| 44 | 
            -
                  end
         | 
| 45 | 
            -
             | 
| 46 | 
            -
                  return body
         | 
| 47 | 
            -
             | 
| 48 | 
            -
                rescue RestClient::ExceptionWithResponse => e
         | 
| 49 | 
            -
                  handle_api_error(e)
         | 
| 50 | 
            -
                end
         | 
| 51 | 
            -
              end
         | 
| 52 | 
            -
             | 
| 53 | 
            -
              def self.load(options={})
         | 
| 54 | 
            -
                Lob(options)
         | 
| 55 | 
            -
              end
         | 
| 56 | 
            -
             | 
| 57 | 
            -
              def self.handle_api_error(error)
         | 
| 58 | 
            -
                begin
         | 
| 59 | 
            -
                  response = JSON.parse(error.http_body.to_s)
         | 
| 60 | 
            -
                  message = response.fetch("error").fetch("message")
         | 
| 61 | 
            -
                  raise InvalidRequestError.new(message, error.http_code, error.http_body, error.response)
         | 
| 62 | 
            -
                rescue JSON::ParserError, KeyError
         | 
| 63 | 
            -
                  # :nocov:
         | 
| 64 | 
            -
                  raise LobError.new("Invalid response object:", error.http_code, error.http_body)
         | 
| 65 | 
            -
                  # :nocov:
         | 
| 66 | 
            -
                end
         | 
| 67 | 
            -
              end
         | 
| 68 | 
            -
             | 
| 69 | 
            -
              def self.build_nested_query(value, prefix = nil)
         | 
| 70 | 
            -
                case value
         | 
| 71 | 
            -
                when Array
         | 
| 72 | 
            -
                  value.map { |v|
         | 
| 73 | 
            -
                    build_nested_query(v, "#{prefix}[]")
         | 
| 74 | 
            -
                  }.join("&")
         | 
| 75 | 
            -
                when Hash
         | 
| 76 | 
            -
                  value.map { |k, v|
         | 
| 77 | 
            -
                    build_nested_query(v, prefix ? "#{prefix}[#{URI.encode_www_form_component(k)}]" : URI.encode_www_form_component(k))
         | 
| 78 | 
            -
                  }.reject(&:empty?).join('&')
         | 
| 79 | 
            -
                else
         | 
| 80 | 
            -
                  raise ArgumentError, "value must be an Array or Hash" if prefix.nil?
         | 
| 81 | 
            -
                  "#{prefix}=#{URI.encode_www_form_component(value)}"
         | 
| 82 | 
            -
                end
         | 
| 83 | 
            -
              end
         | 
| 84 | 
            -
            end
         | 
| 85 | 
            -
             | 
| 86 | 
            -
            def Lob(options={})
         | 
| 87 | 
            -
              options[:api_host]     ||= Lob.api_host    || "api.lob.com"
         | 
| 88 | 
            -
              options[:protocol]     ||= Lob.protocol    || "https"
         | 
| 89 | 
            -
              options[:api_version]  ||= Lob.api_version
         | 
| 90 | 
            -
              options[:api_key]      ||= Lob.api_key
         | 
| 91 | 
            -
             | 
| 92 | 
            -
              if options[:api_key].nil?
         | 
| 93 | 
            -
                raise ArgumentError.new(":api_key is a required argument to initialize Lob")
         | 
| 94 | 
            -
              end
         | 
| 95 | 
            -
             | 
| 96 | 
            -
              Lob::V1::Resource.new(options)
         | 
| 97 7 | 
             
            end
         | 
    
        data/lib/lob/client.rb
    ADDED
    
    | @@ -0,0 +1,61 @@ | |
| 1 | 
            +
            require "lob/resources/address"
         | 
| 2 | 
            +
            require "lob/resources/area"
         | 
| 3 | 
            +
            require "lob/resources/bank_account"
         | 
| 4 | 
            +
            require "lob/resources/check"
         | 
| 5 | 
            +
            require "lob/resources/country"
         | 
| 6 | 
            +
            require "lob/resources/letter"
         | 
| 7 | 
            +
            require "lob/resources/postcard"
         | 
| 8 | 
            +
            require "lob/resources/route"
         | 
| 9 | 
            +
            require "lob/resources/state"
         | 
| 10 | 
            +
             | 
| 11 | 
            +
            module Lob
         | 
| 12 | 
            +
              class Client
         | 
| 13 | 
            +
             | 
| 14 | 
            +
                attr_reader :config
         | 
| 15 | 
            +
             | 
| 16 | 
            +
                def initialize(config = nil)
         | 
| 17 | 
            +
                  if config.nil? || config[:api_key].nil?
         | 
| 18 | 
            +
                    raise ArgumentError.new(":api_key is a required argument to initialize Lob")
         | 
| 19 | 
            +
                  end
         | 
| 20 | 
            +
             | 
| 21 | 
            +
                  @config = config
         | 
| 22 | 
            +
                end
         | 
| 23 | 
            +
             | 
| 24 | 
            +
                def areas
         | 
| 25 | 
            +
                  Lob::Resources::Area.new(config)
         | 
| 26 | 
            +
                end
         | 
| 27 | 
            +
             | 
| 28 | 
            +
                def addresses
         | 
| 29 | 
            +
                  Lob::Resources::Address.new(config)
         | 
| 30 | 
            +
                end
         | 
| 31 | 
            +
             | 
| 32 | 
            +
                def bank_accounts
         | 
| 33 | 
            +
                  Lob::Resources::BankAccount.new(config)
         | 
| 34 | 
            +
                end
         | 
| 35 | 
            +
             | 
| 36 | 
            +
                def checks
         | 
| 37 | 
            +
                  Lob::Resources::Check.new(config)
         | 
| 38 | 
            +
                end
         | 
| 39 | 
            +
             | 
| 40 | 
            +
                def countries
         | 
| 41 | 
            +
                  Lob::Resources::Country.new(config)
         | 
| 42 | 
            +
                end
         | 
| 43 | 
            +
             | 
| 44 | 
            +
                def letters
         | 
| 45 | 
            +
                  Lob::Resources::Letter.new(config)
         | 
| 46 | 
            +
                end
         | 
| 47 | 
            +
             | 
| 48 | 
            +
                def postcards
         | 
| 49 | 
            +
                  Lob::Resources::Postcard.new(config)
         | 
| 50 | 
            +
                end
         | 
| 51 | 
            +
             | 
| 52 | 
            +
                def routes
         | 
| 53 | 
            +
                  Lob::Resources::Route.new(config)
         | 
| 54 | 
            +
                end
         | 
| 55 | 
            +
             | 
| 56 | 
            +
                def states
         | 
| 57 | 
            +
                  Lob::Resources::State.new(config)
         | 
| 58 | 
            +
                end
         | 
| 59 | 
            +
             | 
| 60 | 
            +
              end
         | 
| 61 | 
            +
            end
         | 
| @@ -0,0 +1,24 @@ | |
| 1 | 
            +
            require "lob/resources/resource_base"
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module Lob
         | 
| 4 | 
            +
              module Resources
         | 
| 5 | 
            +
                class Address < Lob::Resources::ResourceBase
         | 
| 6 | 
            +
             | 
| 7 | 
            +
                  def initialize(config)
         | 
| 8 | 
            +
                    super(config)
         | 
| 9 | 
            +
                    @endpoint = "addresses"
         | 
| 10 | 
            +
                  end
         | 
| 11 | 
            +
             | 
| 12 | 
            +
                  def verify(options={})
         | 
| 13 | 
            +
                    submit :post, address_verify_url, options
         | 
| 14 | 
            +
                  end
         | 
| 15 | 
            +
             | 
| 16 | 
            +
                  private
         | 
| 17 | 
            +
             | 
| 18 | 
            +
                  def address_verify_url
         | 
| 19 | 
            +
                    "#{base_url}/verify"
         | 
| 20 | 
            +
                  end
         | 
| 21 | 
            +
             | 
| 22 | 
            +
                end
         | 
| 23 | 
            +
              end
         | 
| 24 | 
            +
            end
         | 
| @@ -0,0 +1,24 @@ | |
| 1 | 
            +
            require "lob/resources/resource_base"
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module Lob
         | 
| 4 | 
            +
              module Resources
         | 
| 5 | 
            +
                class BankAccount < Lob::Resources::ResourceBase
         | 
| 6 | 
            +
             | 
| 7 | 
            +
                  def initialize(config)
         | 
| 8 | 
            +
                    super(config)
         | 
| 9 | 
            +
                    @endpoint = "bank_accounts"
         | 
| 10 | 
            +
                  end
         | 
| 11 | 
            +
             | 
| 12 | 
            +
                  def verify(bank_account_id, options = {})
         | 
| 13 | 
            +
                    submit :post, verify_url(bank_account_id), options
         | 
| 14 | 
            +
                  end
         | 
| 15 | 
            +
             | 
| 16 | 
            +
                  private
         | 
| 17 | 
            +
             | 
| 18 | 
            +
                  def verify_url(bank_account_id)
         | 
| 19 | 
            +
                    "#{resource_url(bank_account_id)}/verify"
         | 
| 20 | 
            +
                  end
         | 
| 21 | 
            +
             | 
| 22 | 
            +
                end
         | 
| 23 | 
            +
              end
         | 
| 24 | 
            +
            end
         | 
| @@ -0,0 +1,16 @@ | |
| 1 | 
            +
            require "lob/resources/resource_base"
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module Lob
         | 
| 4 | 
            +
              module Resources
         | 
| 5 | 
            +
                class Country < Lob::Resources::ResourceBase
         | 
| 6 | 
            +
             | 
| 7 | 
            +
                  undef_method :find, :create, :destroy
         | 
| 8 | 
            +
             | 
| 9 | 
            +
                  def initialize(config)
         | 
| 10 | 
            +
                    super(config)
         | 
| 11 | 
            +
                    @endpoint = "countries"
         | 
| 12 | 
            +
                  end
         | 
| 13 | 
            +
             | 
| 14 | 
            +
                end
         | 
| 15 | 
            +
              end
         | 
| 16 | 
            +
            end
         | 
| @@ -0,0 +1,108 @@ | |
| 1 | 
            +
            require "rest-client"
         | 
| 2 | 
            +
            require "json"
         | 
| 3 | 
            +
            require "uri"
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            module Lob
         | 
| 6 | 
            +
              module Resources
         | 
| 7 | 
            +
                class ResourceBase
         | 
| 8 | 
            +
             | 
| 9 | 
            +
                  attr_reader :config, :endpoint
         | 
| 10 | 
            +
             | 
| 11 | 
            +
                  def initialize(config)
         | 
| 12 | 
            +
                    @config = config
         | 
| 13 | 
            +
                  end
         | 
| 14 | 
            +
             | 
| 15 | 
            +
                  def list(options={})
         | 
| 16 | 
            +
                    submit :get, endpoint_url, options
         | 
| 17 | 
            +
                  end
         | 
| 18 | 
            +
             | 
| 19 | 
            +
                  def find(resource_id)
         | 
| 20 | 
            +
                    submit :get, resource_url(resource_id)
         | 
| 21 | 
            +
                  end
         | 
| 22 | 
            +
             | 
| 23 | 
            +
                  def create(options = {})
         | 
| 24 | 
            +
                    submit :post, endpoint_url, options
         | 
| 25 | 
            +
                  end
         | 
| 26 | 
            +
             | 
| 27 | 
            +
                  def destroy(resource_id)
         | 
| 28 | 
            +
                    submit :delete, resource_url(resource_id)
         | 
| 29 | 
            +
                  end
         | 
| 30 | 
            +
             | 
| 31 | 
            +
                  private
         | 
| 32 | 
            +
             | 
| 33 | 
            +
                  def submit(method, url, parameters={})
         | 
| 34 | 
            +
                    clientVersion = Lob::VERSION
         | 
| 35 | 
            +
             | 
| 36 | 
            +
                    begin
         | 
| 37 | 
            +
                      if method == :get || method == :delete
         | 
| 38 | 
            +
                        # Hack to URL encode nested objects like metadata.
         | 
| 39 | 
            +
                        url = "#{url}?#{build_nested_query(parameters)}"
         | 
| 40 | 
            +
                        response = RestClient.send(method, url, {
         | 
| 41 | 
            +
                          user_agent: 'Lob/v1 RubyBindings/' + clientVersion,
         | 
| 42 | 
            +
                          "Lob-Version" => config[:api_version]
         | 
| 43 | 
            +
                        })
         | 
| 44 | 
            +
                      else
         | 
| 45 | 
            +
                        response = RestClient.send(method, url, parameters, {
         | 
| 46 | 
            +
                          user_agent: 'Lob/v1 RubyBindings/' + clientVersion,
         | 
| 47 | 
            +
                          "Lob-Version" => config[:api_version]
         | 
| 48 | 
            +
                        })
         | 
| 49 | 
            +
                      end
         | 
| 50 | 
            +
             | 
| 51 | 
            +
                      body = JSON.parse(response)
         | 
| 52 | 
            +
             | 
| 53 | 
            +
                      body.define_singleton_method(:_response) do
         | 
| 54 | 
            +
                        response
         | 
| 55 | 
            +
                      end
         | 
| 56 | 
            +
             | 
| 57 | 
            +
                      return body
         | 
| 58 | 
            +
             | 
| 59 | 
            +
                    rescue RestClient::ExceptionWithResponse => e
         | 
| 60 | 
            +
                      handle_api_error(e)
         | 
| 61 | 
            +
                    end
         | 
| 62 | 
            +
                  end
         | 
| 63 | 
            +
             | 
| 64 | 
            +
                  private
         | 
| 65 | 
            +
             | 
| 66 | 
            +
                  def handle_api_error(error)
         | 
| 67 | 
            +
                    begin
         | 
| 68 | 
            +
                      response = JSON.parse(error.http_body.to_s)
         | 
| 69 | 
            +
                      message = response.fetch("error").fetch("message")
         | 
| 70 | 
            +
                      raise InvalidRequestError.new(message, error.http_code, error.http_body, error.response)
         | 
| 71 | 
            +
                    rescue JSON::ParserError, KeyError
         | 
| 72 | 
            +
                      # :nocov:
         | 
| 73 | 
            +
                      raise LobError.new("Invalid response object:", error.http_code, error.http_body)
         | 
| 74 | 
            +
                      # :nocov:
         | 
| 75 | 
            +
                    end
         | 
| 76 | 
            +
                  end
         | 
| 77 | 
            +
             | 
| 78 | 
            +
                  def build_nested_query(value, prefix = nil)
         | 
| 79 | 
            +
                    case value
         | 
| 80 | 
            +
                    when Array
         | 
| 81 | 
            +
                      value.map { |v|
         | 
| 82 | 
            +
                        build_nested_query(v, "#{prefix}[]")
         | 
| 83 | 
            +
                      }.join("&")
         | 
| 84 | 
            +
                    when Hash
         | 
| 85 | 
            +
                      value.map { |k, v|
         | 
| 86 | 
            +
                        build_nested_query(v, prefix ? "#{prefix}[#{URI.encode_www_form_component(k)}]" : URI.encode_www_form_component(k))
         | 
| 87 | 
            +
                      }.reject(&:empty?).join('&')
         | 
| 88 | 
            +
                    else
         | 
| 89 | 
            +
                      raise ArgumentError, "value must be an Array or Hash" if prefix.nil?
         | 
| 90 | 
            +
                      "#{prefix}=#{URI.encode_www_form_component(value)}"
         | 
| 91 | 
            +
                    end
         | 
| 92 | 
            +
                  end
         | 
| 93 | 
            +
             | 
| 94 | 
            +
                  def base_url
         | 
| 95 | 
            +
                    "https://#{config[:api_key]}:@api.lob.com/v1"
         | 
| 96 | 
            +
                  end
         | 
| 97 | 
            +
             | 
| 98 | 
            +
                  def endpoint_url
         | 
| 99 | 
            +
                    "#{base_url}/#{endpoint}"
         | 
| 100 | 
            +
                  end
         | 
| 101 | 
            +
             | 
| 102 | 
            +
                  def resource_url(resource_id)
         | 
| 103 | 
            +
                    "#{endpoint_url}/#{resource_id}"
         | 
| 104 | 
            +
                  end
         | 
| 105 | 
            +
             | 
| 106 | 
            +
                end
         | 
| 107 | 
            +
              end
         | 
| 108 | 
            +
            end
         |