fullcontact-api-ruby 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: d09d3cb3e713202cecef58ccc41d7eb20d24d44bdb3003d0f39d94ac9702ef77
4
+ data.tar.gz: d772eff4a0feb59dd6d91adfa129379e13684cedecdd0fc79c51608b13aef909
5
+ SHA512:
6
+ metadata.gz: 6ff2ffdaec6ba000e42c0eb25f15a55d415c4d0ece8ba36a665dcb2ae2ab1c45c6f149a5a49a3760f2c2c95c1ca82c5d2419d076eddc74377c0150b38e61864e
7
+ data.tar.gz: ed657af10f2aedddc0ed806efc1a909eaea8025ea3d23587d83bd2b42d0cbfbd03404e15a74444585d0a73fa73bdd6ef59495a2285f43730e16229543580b79e
data/.document ADDED
@@ -0,0 +1,5 @@
1
+ lib/**/*.rb
2
+ bin/*
3
+ -
4
+ features/**/*.feature
5
+ LICENSE.md
data/.gitignore ADDED
@@ -0,0 +1,53 @@
1
+ # rcov generated
2
+ coverage
3
+
4
+ # rdoc generated
5
+ rdoc
6
+
7
+ # yard generated
8
+ doc
9
+ .yardoc
10
+
11
+ # bundler
12
+ .bundle
13
+
14
+ # jeweler generated
15
+ pkg
16
+
17
+ # Have editor/IDE/OS specific files you need to ignore? Consider using a global gitignore:
18
+ #
19
+ # * Create a file at ~/.gitignore
20
+ # * Include files you want ignored
21
+ # * Run: git config --global core.excludesfile ~/.gitignore
22
+ #
23
+ # After doing this, these files will be ignored in all your git projects,
24
+ # saving you from having to 'pollute' every project you touch with them
25
+ #
26
+ # Not sure what to needs to be ignored for particular editors/OSes? Here's some ideas to get you started. (Remember, remove the leading # of the line)
27
+ #
28
+ # For MacOS:
29
+ #
30
+ #.DS_Store
31
+
32
+ # For TextMate
33
+ #*.tmproj
34
+ #tmtags
35
+
36
+ # For emacs:
37
+ #*~
38
+ #\#*
39
+ #.\#*
40
+
41
+ # For vim:
42
+ #*.swp
43
+
44
+ # For redcar:
45
+ #.redcar
46
+
47
+ # For rubinius:
48
+ #*.rbc
49
+
50
+ .idea/
51
+ *.lock
52
+
53
+ *.gem
data/.rspec ADDED
@@ -0,0 +1,3 @@
1
+ --color
2
+ --format=documentation
3
+ --backtrace
data/.travis.yml ADDED
@@ -0,0 +1,18 @@
1
+ language: ruby
2
+
3
+ rvm:
4
+ - 2.4.2
5
+
6
+ gemfile:
7
+ - Gemfile
8
+
9
+ sudo: false
10
+
11
+ cache: bundler
12
+
13
+ before_script: "bundle update"
14
+
15
+ script: "bundle exec rake test"
16
+
17
+ after_success:
18
+ - "bundle exec codeclimate-test-reporter"
data/Gemfile ADDED
@@ -0,0 +1,6 @@
1
+ source "http://rubygems.org"
2
+ ruby "2.7.5"
3
+
4
+ gemspec
5
+ gem 'nokogiri', '~> 1.12.5' # >= 1.7 is incompatible with Ruby 2.0
6
+ gem 'codeclimate-test-reporter', group: :test, require: nil
data/LICENSE.md ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2016 FullContact Inc. and contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,153 @@
1
+ FullContact Ruby Gem
2
+ ====================
3
+ A Ruby wrapper for the [FullContact API](http://www.fullcontact.com/)
4
+
5
+ [![Build Status](https://travis-ci.org/fullcontact/fullcontact-api-ruby.svg?branch=master)](https://travis-ci.org/fullcontact/fullcontact-api-ruby)
6
+ [![Gem Version](https://badge.fury.io/rb/fullcontact.svg)](http://badge.fury.io/rb/fullcontact)
7
+ [![Code Climate](https://codeclimate.com/github/fullcontact/fullcontact-api-ruby/badges/gpa.svg)](https://codeclimate.com/github/fullcontact/fullcontact-api-ruby)
8
+ [![Test Coverage](https://codeclimate.com/github/fullcontact/fullcontact-api-ruby/badges/coverage.svg)](https://codeclimate.com/github/fullcontact/fullcontact-api-ruby)
9
+
10
+ Changes
11
+ -------
12
+ - 0.18.1
13
+ - Always use the token in header even when the option is given as query.
14
+ - 0.18.0
15
+ - Add ability to query Company API by company name
16
+ - Fix XML bug in Company API module
17
+ - 0.17.0 - Upgrade Faraday plugin to ~> 0.11.0
18
+ - 0.16.0 - Upgrade Faraday plugin to ~> 0.10.0.
19
+ - 0.15.0 - Add header-based auth via `config.auth_type = :header` control.
20
+ - 0.14.0 - Remove `plissken` gem to support Rails 5 (#42)
21
+ - 0.13.0
22
+ - Raise `ArgumentError` if query by Facebook ID/username is used.
23
+ - Remove deprecated messages.
24
+ - 0.12.0 - `include_headers_in_response = true` includes response headers in returned payload
25
+ - Accessible as `http_headers` in response. Also accessible on thrown errors (e.g. RateLimited)
26
+ - 0.11.0 - Plisskin transformation can be disabled by specifying a `skip_rubyize = true` in config block.
27
+ - 0.10.0 - Support for FullContact Company API
28
+ - 0.9.0 - Removed Rash gem and replaced with Mashify + Plisskin
29
+ - 0.8.2 - Fix for 0.8.0 constant resolution issue.
30
+ - 0.8.0
31
+ - Hashie now allowed from [2.2, 4.0) to support a wide range of other applications
32
+ - Default useragent includes version number for our own information
33
+ - Useless XML mode and dep on `multi_xml` removed
34
+ - Code reformatting & basic code hygiene, prep for new features in 0.9.0
35
+ - 0.7.0 - Faraday 0.9.0
36
+ - 0.6.0 - Removal of timeoutSeconds parameter. This parameter is automatically stripped from your request if included.
37
+
38
+ Installation
39
+ ------------
40
+ gem install fullcontact
41
+
42
+ Documentation
43
+ -------------
44
+ [http://rdoc.info/gems/fullcontact](http://rdoc.info/gems/fullcontact)
45
+
46
+ Usage Examples
47
+ --------------
48
+ ```ruby
49
+ require 'fullcontact'
50
+
51
+ # This could go in an initializer
52
+ FullContact.configure do |config|
53
+ config.api_key = 'fullcontact_api_key_goes_here'
54
+ end
55
+
56
+ # Get information about an email address
57
+ person = FullContact.person(email: 'bart@fullcontact.com')
58
+ ```
59
+ All returned values are Hashie structs. You can access fields as if they were fields:
60
+
61
+ ```ruby
62
+ # Get person's family_name
63
+ person.contact_info.family_name
64
+ => "Lorang"
65
+ ```
66
+
67
+ But you can also turn it into a normal hash
68
+
69
+ ```ruby
70
+ # Get person's family_name
71
+ person.to_hash['contact_info']['family_name']
72
+ => "Lorang"
73
+ ```
74
+ Authentication is done through query parameters by default. If you want to use headers instead:
75
+
76
+ ```ruby
77
+ # This could go in an initializer
78
+ FullContact.configure do |config|
79
+ config.api_key = 'fullcontact_api_key_goes_here'
80
+ config.auth_type = :headers # :header or :query
81
+ end
82
+ ```
83
+
84
+ There's other ways you can query the Person API:
85
+ ```ruby
86
+ # Get information about an email address, organized by hashes vs. lists
87
+ person2 = FullContact.person(email: 'bart@fullcontact.com', style: 'dictionary')
88
+
89
+ # You can pass in any arbitrary parameters the Person API supports
90
+ person3 = FullContact.person(email: 'bart@fullcontact.com', style: 'dictionary', webhookUrl: 'https://...')
91
+
92
+ # Get information about a twitter handle
93
+ person4 = FullContact.person(twitter: "bartlorang")
94
+
95
+ # Get information from a phone number
96
+ person6 = FullContact.person(phone:13037170414)
97
+
98
+ # Get information about a twitter and ensure a 30s socket open timeout and a 15s socket read timeout
99
+ # Can throw a Faraday::Error::TimeoutError if timeouts are exceeded
100
+ person7 = FullContact.person({:twitter => "bartlorang"}, {:request => {:timeout => 15, :open_timeout => 30}})
101
+
102
+ ```
103
+
104
+ Response formats can more closely mirror FullContact's APIs by disabling snake_case transformation:
105
+ ```ruby
106
+ FullContact.configure do |config|
107
+ config.api_key = "fullcontact_api_key_goes_here"
108
+ config.skip_rubyize = true
109
+ end
110
+
111
+ person8 = FullContact.person(email: "bart@fullcontact.com")
112
+
113
+ => #<Hashie::Mash contactInfo=#<Hashie::Mash chats=[#<Hashie::Mash client="gtalk" handle="lorangb@gmail.com">,
114
+ #<Hashie::Mash client="skype" handle="bart.lorang">] familyName="Lorang" fullName="Bart Lorang" givenName="Bart...
115
+ ```
116
+
117
+ You can also query the Company API
118
+ ```ruby
119
+ # Get information about a company
120
+ company1 = FullContact.company(domain: 'fullcontact.com')
121
+
122
+ company1.organization.name
123
+ => "FullContact Inc."
124
+ ```
125
+
126
+ The Company API also supports searching by company name.
127
+ Please see [our API documentation](https://www.fullcontact.com/developer/docs/company/#lookup-by-company-name) for more details.
128
+ ```ruby
129
+ # Gets a list of search results for a company name ordered by relevance
130
+ companies = FullContact.company(companyName: 'FullContact')
131
+
132
+ # Get the API url for full company profile lookup (append api key to use)
133
+ # Note the array access, we are just grabbing the first (top) result
134
+ companies[0].company_api_link
135
+ => "https://api.fullcontact.com/v2/company/lookup?domain=fullcontact.com&apiKey="
136
+
137
+ companies[0].org_name
138
+ => "FullContact Inc."
139
+ ```
140
+
141
+
142
+ Contributions
143
+ -------------
144
+ A full list of contributors can be found in
145
+ [GitHub](https://github.com/fullcontact/fullcontact-api-ruby/graphs/contributors)
146
+
147
+ License
148
+ ---------
149
+ Copyright (c) 2016 FullContact Inc. and contributors
150
+
151
+
152
+
153
+ See [LICENSE](https://github.com/fullcontact/fullcontact-api-ruby/blob/master/LICENSE.md) for details.
data/Rakefile ADDED
@@ -0,0 +1,25 @@
1
+ #!/usr/bin/env rake
2
+
3
+ require 'bundler'
4
+ Bundler::GemHelper.install_tasks
5
+
6
+ require 'rspec/core/rake_task'
7
+ RSpec::Core::RakeTask.new(:spec)
8
+
9
+ task :test => :spec
10
+ task :default => :spec
11
+
12
+ namespace :doc do
13
+ require 'yard'
14
+ YARD::Rake::YardocTask.new do |task|
15
+ task.files = ['HISTORY.md', 'LICENSE.md', 'lib/**/*.rb']
16
+ task.options = [
17
+ '--protected',
18
+ '--output-dir', 'doc',
19
+ '--tag', 'format:Supported formats',
20
+ '--tag', 'authenticated:Requires Authentication',
21
+ '--tag', 'rate_limited:Rate Limited',
22
+ '--markup', 'markdown',
23
+ ]
24
+ end
25
+ end
@@ -0,0 +1,34 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path('../lib', __FILE__)
3
+ require 'fullcontact/version'
4
+
5
+ Gem::Specification.new do |s|
6
+ s.add_development_dependency 'maruku', '~> 0.7'
7
+ s.add_development_dependency 'nokogiri', '~> 1.6'
8
+ s.add_development_dependency 'rake', '~> 0.9'
9
+ s.add_development_dependency 'rspec', '~> 3.1'
10
+ s.add_development_dependency 'simplecov'
11
+ s.add_development_dependency 'codeclimate-test-reporter', '~> 1.0.0'
12
+ s.add_development_dependency 'webmock', '~> 1.6'
13
+ s.add_development_dependency 'yard', '~> 0.9.11'
14
+ s.add_runtime_dependency 'hashie', ['>= 2.0', '< 4.0']
15
+ s.add_runtime_dependency 'faraday', '~> 1'
16
+ s.add_runtime_dependency 'faraday_middleware', '~> 1'
17
+
18
+ s.author = 'Ratnam Yadav'
19
+ s.description = %q{A Ruby wrapper for the FullContact API}
20
+ s.email = ['support@fullcontact.com']
21
+ s.license = 'MIT'
22
+
23
+ s.post_install_message = ''
24
+
25
+ s.executables = `git ls-files -- bin/*`.split("\n").map{|f| File.basename(f)}
26
+ s.files = `git ls-files`.split("\n")
27
+ s.homepage = 'https://github.com/ratnamyadav/fullcontact-api-ruby'
28
+ s.name = 'fullcontact-api-ruby'
29
+ s.require_paths = ['lib']
30
+ s.required_rubygems_version = Gem::Requirement.new('>= 1.3.6')
31
+ s.summary = %q{Ruby wrapper for the FullContact API}
32
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
33
+ s.version = FullContact::VERSION
34
+ end
@@ -0,0 +1,18 @@
1
+ require 'faraday'
2
+
3
+ # @private
4
+ module Faraday
5
+ # @private
6
+ class Request::Gateway < Faraday::Middleware
7
+ def call(env)
8
+ url = env[:url].dup
9
+ url.host = @gateway
10
+ env[:url] = url
11
+ @app.call(env)
12
+ end
13
+
14
+ def initialize(app, gateway)
15
+ @app, @gateway = app, gateway
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,8 @@
1
+ module Faraday
2
+ class Response::AddHeaders < Response::Middleware
3
+ def on_complete(env)
4
+ env.body[:http_headers] = env.response_headers
5
+ env.body
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,36 @@
1
+ module Faraday
2
+ class Response::FullContactErrors < Response::Middleware
3
+ def on_complete(env)
4
+ case env[:status]
5
+ when 400
6
+ raise FullContact::BadRequest.new(error_message(env), env[:response_headers])
7
+ when 401
8
+ raise FullContact::Unauthorized.new(error_message(env), env[:response_headers])
9
+ when 403
10
+ raise FullContact::Forbidden.new(error_message(env), env[:response_headers])
11
+ when 404
12
+ raise FullContact::NotFound.new(error_message(env), env[:response_headers])
13
+ when 422
14
+ raise FullContact::Invalid.new(error_message(env), env[:response_headers])
15
+ when 429
16
+ # Note: not currently in use
17
+ raise FullContact::RateLimited.new(error_message(env), env[:response_headers])
18
+ when 500
19
+ raise FullContact::InternalServerError.new(error_message(env), env[:response_headers])
20
+ when 502
21
+ raise FullContact::BadGateway.new(error_message(env), env[:response_headers])
22
+ when 503
23
+ raise FullContact::ServiceUnavailable.new(error_message(env), env[:response_headers])
24
+ end
25
+ end
26
+
27
+ def error_message(env)
28
+ "#{env[:method].to_s.upcase} #{env[:url].to_s}: #{env[:status]}"
29
+ end
30
+
31
+ def initialize(app)
32
+ super
33
+ @parser = nil
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,14 @@
1
+ module Faraday
2
+ class Response::Rubyize < Response::Middleware
3
+ def parse(body)
4
+ case body
5
+ when Hash
6
+ body.to_snake_keys
7
+ when Array
8
+ body.map { |item| parse(item) }
9
+ else
10
+ body
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,21 @@
1
+ require 'fullcontact/connection'
2
+ require 'fullcontact/request'
3
+
4
+ module FullContact
5
+ # @private
6
+ class API
7
+ # @private
8
+ attr_accessor *Configuration::VALID_OPTIONS_KEYS
9
+
10
+ # Creates a new API
11
+ def initialize(options={})
12
+ options = FullContact.options.merge(options)
13
+ Configuration::VALID_OPTIONS_KEYS.each do |key|
14
+ send("#{key}=", options[key])
15
+ end
16
+ end
17
+
18
+ include Connection
19
+ include Request
20
+ end
21
+ end
@@ -0,0 +1,16 @@
1
+ module FullContact
2
+ class Client
3
+ module Company
4
+ # Returns extended information for a given company (email, phone, twitter or facebook)
5
+ #
6
+ def company(options={}, faraday_options={})
7
+ url = "company/lookup"
8
+ if options[:companyName]
9
+ url = "company/search"
10
+ end
11
+ response = get(url, options, false, faraday_options)
12
+ format.to_s.downcase == 'xml' ? response['response'] : response
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,20 @@
1
+ module FullContact
2
+ class Client
3
+ module Person
4
+ # Returns extended information for a given person (email, phone, twitter or facebook)
5
+ #
6
+ def person(options={}, faraday_options={})
7
+ if options.is_a?(String)
8
+ raise ArgumentError, "Supplying an email address directly is not supported. Please use {email: #{options}} instead."
9
+ end
10
+
11
+ if options.has_key?(:facebookUsername) || options.has_key?(:facebookId)
12
+ raise ArgumentError, "Querying by Facebook ID or username is no longer supported. Please contact support@fullcontact.com for more information."
13
+ end
14
+
15
+ response = get('person', options, false, faraday_options)
16
+ format.to_s.downcase == 'xml' ? response['person'] : response
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,16 @@
1
+ module FullContact
2
+ # Wrapper for the FullContact REST API
3
+
4
+ class Client < API
5
+ # Require client method modules after initializing the Client class in
6
+ # order to avoid a superclass mismatch error, allowing those modules to be
7
+ # Client-namespaced.
8
+ require 'fullcontact/client/person'
9
+ require 'fullcontact/client/company'
10
+
11
+ alias :api_endpoint :endpoint
12
+
13
+ include FullContact::Client::Person
14
+ include FullContact::Client::Company
15
+ end
16
+ end
@@ -0,0 +1,94 @@
1
+ require 'faraday'
2
+ require 'fullcontact/version'
3
+
4
+ module FullContact
5
+ # Defines constants and methods related to configuration
6
+ module Configuration
7
+ # An array of valid keys in the options hash when configuring a {FullContact::API}
8
+ VALID_OPTIONS_KEYS = [
9
+ :adapter,
10
+ :api_key,
11
+ :auth_type,
12
+ :endpoint,
13
+ :format,
14
+ :skip_rubyize,
15
+ :include_headers_in_response,
16
+ :gateway,
17
+ :proxy,
18
+ :user_agent].freeze
19
+
20
+ # An array of valid request/response formats
21
+ VALID_FORMATS = [:json].freeze
22
+
23
+ # The adapter that will be used to connect if none is set
24
+ #
25
+ # @note The default faraday adapter is Net::HTTP.
26
+ DEFAULT_ADAPTER = Faraday.default_adapter
27
+
28
+ # By default, don't set an application key
29
+ DEFAULT_API_KEY = nil
30
+
31
+ # By default, use query parameters
32
+ DEFAULT_AUTH_TYPE = :query
33
+
34
+ # The endpoint that will be used to connect if none is set
35
+ #
36
+ DEFAULT_ENDPOINT = 'https://api.fullcontact.com/v2/'.freeze
37
+
38
+ # The response format appended to the path and sent in the 'Accept' header if none is set
39
+ #
40
+ # @note JSON is preferred over XML because it is more concise and faster to parse.
41
+ DEFAULT_FORMAT = :json
42
+
43
+ # Default transformation done to response
44
+ DEFAULT_SKIP_RUBYIZE = false
45
+
46
+ # Includes response headers
47
+ DEFAULT_INCLUDE_HEADERS_IN_RESPONSE = false
48
+
49
+ # By default, don't use a proxy server
50
+ DEFAULT_PROXY = nil
51
+
52
+ # The user agent that will be sent to the API endpoint if none is set
53
+ DEFAULT_USER_AGENT = "FullContact Ruby Client/#{FullContact::VERSION}".freeze
54
+
55
+ DEFAULT_GATEWAY = nil
56
+
57
+ AUTH_HEADER_NAME = 'X-FullContact-APIKey'.freeze
58
+
59
+ # @private
60
+ attr_accessor *VALID_OPTIONS_KEYS
61
+
62
+ # When this module is extended, set all configuration options to their default values
63
+ def self.extended(base)
64
+ base.reset
65
+ end
66
+
67
+ # Convenience method to allow configuration options to be set in a block
68
+ def configure
69
+ yield self
70
+ end
71
+
72
+ # Create a hash of options and their values
73
+ def options
74
+ options = {}
75
+ VALID_OPTIONS_KEYS.each { |k| options[k] = send(k) }
76
+ options
77
+ end
78
+
79
+ # Reset all configuration options to defaults
80
+ def reset
81
+ self.adapter = DEFAULT_ADAPTER
82
+ self.api_key = DEFAULT_API_KEY
83
+ self.auth_type = DEFAULT_AUTH_TYPE
84
+ self.endpoint = DEFAULT_ENDPOINT
85
+ self.format = DEFAULT_FORMAT
86
+ self.skip_rubyize = DEFAULT_SKIP_RUBYIZE
87
+ self.include_headers_in_response = DEFAULT_INCLUDE_HEADERS_IN_RESPONSE
88
+ self.proxy = DEFAULT_PROXY
89
+ self.user_agent = DEFAULT_USER_AGENT
90
+ self.gateway = DEFAULT_GATEWAY
91
+ self
92
+ end
93
+ end
94
+ end
@@ -0,0 +1,39 @@
1
+ require 'faraday_middleware'
2
+ require 'faraday/request/gateway'
3
+ require 'faraday/response/fullcontact_errors'
4
+ require 'faraday/response/add_headers'
5
+ require 'faraday/response/rubyize'
6
+ require 'faraday_middleware/response/mashify'
7
+
8
+
9
+ module FullContact
10
+ # @private
11
+ module Connection
12
+ private
13
+
14
+ def connection(raw=false, faraday_options={})
15
+ options = {
16
+ :headers => {'Accept' => "application/#{format}", 'User-Agent' => user_agent},
17
+ :proxy => proxy,
18
+ :ssl => {:verify => false},
19
+ :url => api_endpoint,
20
+ }.merge(faraday_options)
21
+
22
+ Faraday.new(options) do |builder|
23
+ builder.use Faraday::Request::UrlEncoded
24
+ builder.use Faraday::Request::Gateway, gateway if gateway
25
+ builder.use FaradayMiddleware::Mashify unless raw
26
+ builder.use Faraday::Response::AddHeaders if FullContact.include_headers_in_response
27
+ builder.use Faraday::Response::Rubyize unless raw or FullContact.skip_rubyize
28
+ unless raw
29
+ case format.to_s.downcase
30
+ when 'json'
31
+ builder.use Faraday::Response::ParseJson
32
+ end
33
+ end
34
+ builder.use Faraday::Response::FullContactErrors
35
+ builder.adapter Faraday.default_adapter
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,47 @@
1
+ module FullContact
2
+ # Custom error class for rescuing from all FullContact errors
3
+ class Error < StandardError
4
+ attr_reader :http_headers
5
+
6
+ def initialize(message, http_headers)
7
+ @http_headers = Hash[http_headers]
8
+ super message
9
+ end
10
+ end
11
+
12
+ # Raised when FullContact returns the HTTP status code 400
13
+ class BadRequest < Error;
14
+ end
15
+
16
+ # Raised when FullContact returns the HTTP status code 401
17
+ class Unauthorized < Error;
18
+ end
19
+
20
+ # Raised when FullContact returns the HTTP status code 403
21
+ class Forbidden < Error;
22
+ end
23
+
24
+ # Raised when FullContact returns the HTTP status code 404
25
+ class NotFound < Error;
26
+ end
27
+
28
+ # Raised when FullContact returns the HTTP status code 422
29
+ class Invalid < Error;
30
+ end
31
+
32
+ # Raised when FullContact returns the HTTP status code 429
33
+ class RateLimited < Error;
34
+ end
35
+
36
+ # Raised when FullContact returns the HTTP status code 500
37
+ class InternalServerError < Error;
38
+ end
39
+
40
+ # Raised when FullContact returns the HTTP status code 502
41
+ class BadGateway < Error;
42
+ end
43
+
44
+ # Raised when FullContact returns the HTTP status code 503
45
+ class ServiceUnavailable < Error;
46
+ end
47
+ end