Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 0 additions & 2 deletions .travis.yml
Original file line number Diff line number Diff line change
@@ -1,6 +1,4 @@
language: ruby
rvm:
- 1.9.3
- 2.0.0
- 2.1.0
- 2.2.0
195 changes: 74 additions & 121 deletions README.md

Large diffs are not rendered by default.

3 changes: 3 additions & 0 deletions changes.txt
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
3.0.0
- New version, client-based access.

2.5.4
- Acquire support

Expand Down
2 changes: 1 addition & 1 deletion intercom.gemspec
Original file line number Diff line number Diff line change
Expand Up @@ -25,5 +25,5 @@ Gem::Specification.new do |spec|
spec.add_development_dependency "fakeweb", ["~> 1.3"]

spec.add_dependency 'json', '~> 1.8'
spec.required_ruby_version = '>= 1.9.3'
spec.required_ruby_version = '>= 2.1.0'
end
166 changes: 13 additions & 153 deletions lib/intercom.rb
Original file line number Diff line number Diff line change
@@ -1,4 +1,17 @@
require "intercom/version"
require 'intercom/service/admin'
require 'intercom/service/company'
require 'intercom/service/contact'
require 'intercom/service/conversation'
require 'intercom/service/event'
require 'intercom/service/message'
require 'intercom/service/note'
require 'intercom/service/subscription'
require 'intercom/service/segment'
require 'intercom/service/tag'
require 'intercom/service/user'
require 'intercom/options'
require 'intercom/client'
require "intercom/contact"
require "intercom/user"
require "intercom/company"
Expand All @@ -9,10 +22,8 @@
require "intercom/conversation"
require "intercom/message"
require "intercom/admin"
require "intercom/count"
require "intercom/request"
require "intercom/subscription"
require "intercom/notification"
require "intercom/utils"
require "intercom/errors"
require "json"
Expand All @@ -21,156 +32,5 @@
# Intercom is a customer relationship management and messaging tool for web app owners
#
# This library provides ruby bindings for the Intercom API (https://api.intercom.io)
#
# == Basic Usage
# === Configure Intercom with your access credentials
# Intercom.app_id = "my_app_id"
# Intercom.app_api_key = "my_api_key"
# === Make requests to the API
# Intercom::User.find(:email => "bob@example.com")
#
module Intercom
@hostname = "api.intercom.io"
@protocol = "https"

@endpoints = nil
@current_endpoint = nil
@app_id = nil
@app_api_key = nil
@rate_limit_details = {}

def self.app_id=(app_id)
@app_id = app_id
end

def self.app_id
@app_id
end

def self.app_api_key=(app_api_key)
@app_api_key = app_api_key
end

def self.app_api_key
@app_api_key
end

def self.rate_limit_details=(rate_limit_details)
@rate_limit_details = rate_limit_details
end

def self.rate_limit_details
@rate_limit_details
end

# This method is obsolete and used to warn of backwards incompatible changes on upgrading
def self.api_key=(val)
raise ArgumentError, "#{compatibility_warning_text} #{compatibility_workaround_text} #{related_docs_text}"
end

private

def self.target_base_url
raise ArgumentError, "#{configuration_required_text} #{related_docs_text}" if [@app_id, @app_api_key].any?(&:nil?)
basic_auth_part = "#{@app_id}:#{@app_api_key}@"
current_endpoint.gsub(/(https?:\/\/)(.*)/, "\\1#{basic_auth_part}\\2")
end

def self.related_docs_text
"See https://github.com/intercom/intercom-ruby for usage examples."
end

def self.compatibility_warning_text
"It looks like you are upgrading from an older version of the intercom-ruby gem. Please note that this new version (#{Intercom::VERSION}) is not backwards compatible. "
end

def self.compatibility_workaround_text
"To get rid of this error please set Intercom.app_api_key and don't set Intercom.api_key."
end

def self.configuration_required_text
"You must set both Intercom.app_id and Intercom.app_api_key to use this client."
end

def self.send_request_to_path(request)
request.execute(target_base_url)
rescue Intercom::ServiceUnavailableError => e
if endpoints.length > 1
retry_on_alternative_endpoint(request)
else
raise e
end
end

def self.retry_on_alternative_endpoint(request)
@current_endpoint = alternative_random_endpoint
request.execute(target_base_url)
end

def self.current_endpoint
return @current_endpoint if @current_endpoint && @endpoint_randomized_at > (Time.now - (60 * 5))
@endpoint_randomized_at = Time.now
@current_endpoint = random_endpoint
end

def self.random_endpoint
endpoints.shuffle.first
end

def self.alternative_random_endpoint
(endpoints.shuffle - [@current_endpoint]).first
end

def self.post(path, payload_hash)
send_request_to_path(Intercom::Request.post(path, payload_hash))
end

def self.delete(path, payload_hash)
send_request_to_path(Intercom::Request.delete(path, payload_hash))
end

def self.put(path, payload_hash)
send_request_to_path(Intercom::Request.put(path, payload_hash))
end

def self.get(path, params)
send_request_to_path(Intercom::Request.get(path, params))
end

def self.check_required_params(params, path=nil) #nodoc
return if path.eql?("users")
raise ArgumentError.new("Expected params Hash, got #{params.class}") unless params.is_a?(Hash)
raise ArgumentError.new("Either email or user_id must be specified") unless params.keys.any? { |key| %W(email user_id).include?(key.to_s) }
end

def self.protocol #nodoc
@protocol
end

def self.protocol=(override) #nodoc
@protocol = override
end

def self.hostname #nodoc
@hostname
end

def self.hostname=(override) #nodoc
@hostname = override
end

def self.endpoint=(endpoint) #nodoc
self.endpoints = [endpoint]
@current_endpoint = nil
end

def self.endpoints=(endpoints) #nodoc
@endpoints = endpoints
@current_endpoint = nil
end

def self.endpoints
@endpoints || ["#{@protocol}://#{hostname}"]
end

end
2 changes: 0 additions & 2 deletions lib/intercom/admin.rb
Original file line number Diff line number Diff line change
@@ -1,9 +1,7 @@
require 'intercom/api_operations/list'
require 'intercom/traits/api_resource'

module Intercom
class Admin
include ApiOperations::List
include Traits::ApiResource
end
end
10 changes: 5 additions & 5 deletions lib/intercom/api_operations/convert.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,13 @@
module Intercom
module ApiOperations
module Convert
def convert(user)
from_response(
Intercom.post(
def convert(contact, user)
Intercom::User.new.from_response(
@client.post(
"/contacts/convert",
{
contact: { user_id: user_id },
user: user.identity_hash
contact: { user_id: contact.user_id },
user: identity_hash(user)
}
)
)
Expand Down
16 changes: 0 additions & 16 deletions lib/intercom/api_operations/count.rb

This file was deleted.

10 changes: 4 additions & 6 deletions lib/intercom/api_operations/delete.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,11 @@
module Intercom
module ApiOperations
module Delete

def delete
collection_name = Utils.resource_class_to_collection_name(self.class)
Intercom.delete("/#{collection_name}/#{id}", {})
self
def delete(object)
collection_name = Utils.resource_class_to_collection_name(collection_class)
@client.delete("/#{collection_name}/#{object.id}", {})
object
end

end
end
end
24 changes: 9 additions & 15 deletions lib/intercom/api_operations/find.rb
Original file line number Diff line number Diff line change
@@ -1,22 +1,16 @@
module Intercom
module ApiOperations
module Find
module ClassMethods
def find(params)
raise BadRequestError, "#{self}#find takes a hash as its parameter but you supplied #{params.inspect}" unless params.is_a? Hash
collection_name = Utils.resource_class_to_collection_name(self)
if params[:id]
response = Intercom.get("/#{collection_name}/#{params[:id]}", {})
else
response = Intercom.get("/#{collection_name}", params)
end
raise Intercom::HttpError.new('Http Error - No response entity returned') unless response
from_api(response)
def find(params)
raise BadRequestError, "#{self}#find takes a hash as its parameter but you supplied #{params.inspect}" unless params.is_a? Hash
collection_name = Utils.resource_class_to_collection_name(collection_class)
if params[:id]
response = @client.get("/#{collection_name}/#{params[:id]}", {})
else
response = @client.get("/#{collection_name}", params)
end
end

def self.included(base)
base.extend(ClassMethods)
raise Intercom::HttpError.new('Http Error - No response entity returned') unless response
from_api(response)
end
end
end
Expand Down
37 changes: 16 additions & 21 deletions lib/intercom/api_operations/find_all.rb
Original file line number Diff line number Diff line change
@@ -1,32 +1,27 @@
require 'intercom/collection_proxy'
require 'intercom/client_collection_proxy'

module Intercom
module ApiOperations
module FindAll
module ClassMethods
def find_all(params)
raise BadRequestError, "#{self}#find takes a hash as its parameter but you supplied #{params.inspect}" unless params.is_a? Hash
collection_name = Utils.resource_class_to_collection_name(self)
finder_details = {}
if params[:id] && !type_switched_finder?(params)
finder_details[:url] = "/#{collection_name}/#{params[:id]}"
finder_details[:params] = {}
else
finder_details[:url] = "/#{collection_name}"
finder_details[:params] = params
end
CollectionProxy.new(collection_name, finder_details)
end

private

def type_switched_finder?(params)
params.include?(:type)
def find_all(params)
raise BadRequestError, "#find takes a hash as its parameter but you supplied #{params.inspect}" unless params.is_a? Hash
collection_name = Utils.resource_class_to_collection_name(collection_class)
finder_details = {}
if params[:id] && !type_switched_finder?(params)
finder_details[:url] = "/#{collection_name}/#{params[:id]}"
finder_details[:params] = {}
else
finder_details[:url] = "/#{collection_name}"
finder_details[:params] = params
end
ClientCollectionProxy.new(collection_name, finder_details: finder_details, client: @client)
end

def self.included(base)
base.extend(ClassMethods)
private

def type_switched_finder?(params)
params.include?(:type)
end
end
end
Expand Down
14 changes: 4 additions & 10 deletions lib/intercom/api_operations/list.rb
Original file line number Diff line number Diff line change
@@ -1,16 +1,10 @@
require 'intercom/collection_proxy'
require 'intercom/client_collection_proxy'

module Intercom
module ApiOperations
module List # TODO: Should we rename to All
module ClassMethods
def all
CollectionProxy.new(Utils.resource_class_to_collection_name(self))
end
end

def self.included(base)
base.extend(ClassMethods)
module List
def all
ClientCollectionProxy.new(Utils.resource_class_to_collection_name(collection_class), client: @client)
end
end
end
Expand Down
12 changes: 6 additions & 6 deletions lib/intercom/api_operations/load.rb
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
module Intercom
module ApiOperations
module Load
def load
collection_name = Utils.resource_class_to_collection_name(self.class)
if id
response = Intercom.get("/#{collection_name}/#{id}", {})
def load(object)
collection_name = Utils.resource_class_to_collection_name(collection_class)
if object.id
response = @client.get("/#{collection_name}/#{object.id}", {})
else
raise "Cannot load #{self.class} as it does not have a valid id."
raise "Cannot load #{collection_class} as it does not have a valid id."
end
raise Intercom::HttpError.new('Http Error - No response entity returned') unless response
from_response(response)
object.from_response(response)
end
end
end
Expand Down
Loading