intercom 3.5.26 → 3.6.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/README.md +7 -5
- data/lib/intercom/client.rb +21 -2
- data/lib/intercom/request.rb +11 -7
- data/lib/intercom/service/company.rb +12 -2
- data/lib/intercom/version.rb +1 -1
- data/spec/unit/intercom/client_spec.rb +21 -0
- data/spec/unit/intercom/company_spec.rb +20 -16
- data/spec/unit/intercom/request_spec.rb +9 -8
- metadata +2 -3
- data/lib/intercom/extended_api_operations/users.rb +0 -16
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: da3b7fbe7b404dd5989bd60385c83931f9d58460
|
4
|
+
data.tar.gz: 2ee3931952cc325396e6d43d6c6b2cf08504b6f7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 30eec0038ac5ab50f2c031fffc9596bb563060ae72dab806921dd78fedf44683c7b48d57b9c2c083c5f50bfafc5f8bd44ae9f3fe72c727d8db8a3271a2a608d9
|
7
|
+
data.tar.gz: 301ca8d4de5e006b41046de14d6498fa9b03a0c72d4f82fca15e10a12a7ca2f80c00d6fbe85efbef118a524a910a5bd1f725f6e55752920fd431fbf7f8cbffcd
|
data/README.md
CHANGED
@@ -22,7 +22,7 @@ This version of the gem is compatible with `Ruby 2.1` and above.
|
|
22
22
|
|
23
23
|
Using bundler:
|
24
24
|
|
25
|
-
gem 'intercom', '~> 3.
|
25
|
+
gem 'intercom', '~> 3.6.0'
|
26
26
|
|
27
27
|
## Basic Usage
|
28
28
|
|
@@ -132,8 +132,10 @@ intercom.companies.save(company)
|
|
132
132
|
# Iterate over all companies
|
133
133
|
intercom.companies.all.each {|company| puts %Q(#{company.name} - #{company.custom_attributes["referral_source"]}) }
|
134
134
|
intercom.companies.all.map {|company| company.name }
|
135
|
-
# Get a list of users in a company
|
136
|
-
intercom.companies.
|
135
|
+
# Get a list of users in a company by Intercom Company ID
|
136
|
+
intercom.companies.users_by_intercom_company_id(company.id)
|
137
|
+
# Get a list of users in a company by external company_id
|
138
|
+
intercom.companies.users_by_company_id(company.company_id)
|
137
139
|
# Get a large list of companies using scroll
|
138
140
|
intercom.companies.scroll.each { |comp| puts comp.name}
|
139
141
|
# Please see users scroll for more details of how to use scroll
|
@@ -149,7 +151,7 @@ intercom.tags.untag(name: 'blue', users: [{user_id: "42ea2f1b93891f6a99000427"}
|
|
149
151
|
intercom.tags.all.each {|tag| "#{tag.id} - #{tag.name}" }
|
150
152
|
intercom.tags.all.map {|tag| tag.name }
|
151
153
|
# Tag companies
|
152
|
-
tag = intercom.tags.tag(name: 'blue', companies: [{
|
154
|
+
tag = intercom.tags.tag(name: 'blue', companies: [{company_id: "42ea2f1b93891f6a99000427"}])
|
153
155
|
```
|
154
156
|
|
155
157
|
#### Segments
|
@@ -469,7 +471,7 @@ intercom.rate_limit_details
|
|
469
471
|
```
|
470
472
|
|
471
473
|
You can handle the rate limits yourself but a simple option is to use the handle_rate_limit flag.
|
472
|
-
This will automatically catch the 429 rate limit exceeded error and wait until the reset time to retry.
|
474
|
+
This will automatically catch the 429 rate limit exceeded error and wait until the reset time to retry. After three retries a rate limit exception will be raised. Encountering this error frequently may require a revisiting of your usage of the API.
|
473
475
|
|
474
476
|
```
|
475
477
|
intercom = Intercom::Client.new(token: ENV['AT'], handle_rate_limit: true)
|
data/lib/intercom/client.rb
CHANGED
@@ -2,7 +2,7 @@ module Intercom
|
|
2
2
|
class MisconfiguredClientError < StandardError; end
|
3
3
|
class Client
|
4
4
|
include Options
|
5
|
-
attr_reader :base_url, :rate_limit_details, :username_part, :password_part, :handle_rate_limit
|
5
|
+
attr_reader :base_url, :rate_limit_details, :username_part, :password_part, :handle_rate_limit, :timeouts
|
6
6
|
|
7
7
|
class << self
|
8
8
|
def set_base_url(base_url)
|
@@ -12,6 +12,17 @@ module Intercom
|
|
12
12
|
Proc.new { |obj| set_base_url(old_url).call(o) }
|
13
13
|
end
|
14
14
|
end
|
15
|
+
|
16
|
+
def set_timeouts(open_timeout: nil, read_timeout: nil)
|
17
|
+
return Proc.new do |o|
|
18
|
+
old_timeouts = o.timeouts
|
19
|
+
timeouts = {}
|
20
|
+
timeouts[:open_timeout] = open_timeout if open_timeout
|
21
|
+
timeouts[:read_timeout] = read_timeout if read_timeout
|
22
|
+
o.send(:timeouts=, timeouts)
|
23
|
+
Proc.new { |obj| set_timeouts(old_timeouts).call(o) }
|
24
|
+
end
|
25
|
+
end
|
15
26
|
end
|
16
27
|
|
17
28
|
def initialize(app_id: 'my_app_id', api_key: 'my_api_key', token: nil, base_url:'https://api.intercom.io', handle_rate_limit: false)
|
@@ -27,6 +38,10 @@ module Intercom
|
|
27
38
|
@base_url = base_url
|
28
39
|
@rate_limit_details = {}
|
29
40
|
@handle_rate_limit = handle_rate_limit
|
41
|
+
@timeouts = {
|
42
|
+
open_timeout: 30,
|
43
|
+
read_timeout: 90
|
44
|
+
}
|
30
45
|
end
|
31
46
|
|
32
47
|
def admins
|
@@ -110,7 +125,7 @@ module Intercom
|
|
110
125
|
|
111
126
|
def execute_request(request)
|
112
127
|
request.handle_rate_limit = handle_rate_limit
|
113
|
-
request.execute(@base_url, username: @username_part, secret: @password_part)
|
128
|
+
request.execute(@base_url, username: @username_part, secret: @password_part, **timeouts)
|
114
129
|
ensure
|
115
130
|
@rate_limit_details = request.rate_limit_details
|
116
131
|
end
|
@@ -118,5 +133,9 @@ module Intercom
|
|
118
133
|
def base_url=(new_url)
|
119
134
|
@base_url = new_url
|
120
135
|
end
|
136
|
+
|
137
|
+
def timeouts=(timeouts)
|
138
|
+
@timeouts = @timeouts.merge(timeouts)
|
139
|
+
end
|
121
140
|
end
|
122
141
|
end
|
data/lib/intercom/request.rb
CHANGED
@@ -46,25 +46,25 @@ module Intercom
|
|
46
46
|
{'Accept-Encoding' => 'gzip, deflate', 'Accept' => 'application/vnd.intercom.3+json', 'User-Agent' => "Intercom-Ruby/#{Intercom::VERSION}"}
|
47
47
|
end
|
48
48
|
|
49
|
-
def client(uri)
|
49
|
+
def client(uri, read_timeout:, open_timeout:)
|
50
50
|
net = Net::HTTP.new(uri.host, uri.port)
|
51
51
|
if uri.is_a?(URI::HTTPS)
|
52
52
|
net.use_ssl = true
|
53
53
|
net.verify_mode = OpenSSL::SSL::VERIFY_PEER
|
54
54
|
net.ca_file = File.join(File.dirname(__FILE__), '../data/cacert.pem')
|
55
55
|
end
|
56
|
-
net.read_timeout =
|
57
|
-
net.open_timeout =
|
56
|
+
net.read_timeout = read_timeout
|
57
|
+
net.open_timeout = open_timeout
|
58
58
|
net
|
59
59
|
end
|
60
60
|
|
61
|
-
def execute(target_base_url=nil, username:, secret: nil)
|
61
|
+
def execute(target_base_url=nil, username:, secret: nil, read_timeout: 90, open_timeout: 30)
|
62
62
|
retries = 3
|
63
63
|
base_uri = URI.parse(target_base_url)
|
64
64
|
set_common_headers(net_http_method, base_uri)
|
65
65
|
set_basic_auth(net_http_method, username, secret)
|
66
66
|
begin
|
67
|
-
client(base_uri).start do |http|
|
67
|
+
client(base_uri, read_timeout: read_timeout, open_timeout: open_timeout).start do |http|
|
68
68
|
begin
|
69
69
|
response = http.request(net_http_method)
|
70
70
|
set_rate_limit_details(response)
|
@@ -75,8 +75,12 @@ module Intercom
|
|
75
75
|
rescue Intercom::RateLimitExceeded => e
|
76
76
|
if @handle_rate_limit
|
77
77
|
seconds_to_retry = (@rate_limit_details[:reset_at] - Time.now.utc).ceil
|
78
|
-
|
79
|
-
|
78
|
+
if (retries -= 1) < 0
|
79
|
+
raise Intercom::RateLimitExceeded.new('Rate limit retries exceeded. Please examine current API Usage.')
|
80
|
+
else
|
81
|
+
sleep seconds_to_retry unless seconds_to_retry < 0
|
82
|
+
retry
|
83
|
+
end
|
80
84
|
else
|
81
85
|
raise e
|
82
86
|
end
|
@@ -5,7 +5,6 @@ require 'intercom/api_operations/find'
|
|
5
5
|
require 'intercom/api_operations/find_all'
|
6
6
|
require 'intercom/api_operations/save'
|
7
7
|
require 'intercom/api_operations/load'
|
8
|
-
require 'intercom/extended_api_operations/users'
|
9
8
|
require 'intercom/extended_api_operations/tags'
|
10
9
|
require 'intercom/extended_api_operations/segments'
|
11
10
|
|
@@ -18,13 +17,24 @@ module Intercom
|
|
18
17
|
include ApiOperations::List
|
19
18
|
include ApiOperations::Scroll
|
20
19
|
include ApiOperations::Save
|
21
|
-
include ExtendedApiOperations::Users
|
22
20
|
include ExtendedApiOperations::Tags
|
23
21
|
include ExtendedApiOperations::Segments
|
24
22
|
|
25
23
|
def collection_class
|
26
24
|
Intercom::Company
|
27
25
|
end
|
26
|
+
|
27
|
+
def users_by_intercom_company_id(id)
|
28
|
+
get_users(url: "/companies/#{id}/users")
|
29
|
+
end
|
30
|
+
|
31
|
+
def users_by_company_id(id)
|
32
|
+
get_users(url: "/companies", params: { company_id: id, type: "user" })
|
33
|
+
end
|
34
|
+
|
35
|
+
private def get_users(url:, params: {})
|
36
|
+
ClientCollectionProxy.new("users", finder_details: { url: url, params: params }, client: @client)
|
37
|
+
end
|
28
38
|
end
|
29
39
|
end
|
30
40
|
end
|
data/lib/intercom/version.rb
CHANGED
@@ -17,6 +17,27 @@ module Intercom
|
|
17
17
|
client.base_url.must_equal('https://api.intercom.io')
|
18
18
|
end
|
19
19
|
|
20
|
+
it 'should be able to change the timeouts' do
|
21
|
+
prev = client.options(Intercom::Client.set_timeouts(open_timeout: 10, read_timeout: 15))
|
22
|
+
client.timeouts.must_equal(open_timeout: 10, read_timeout: 15)
|
23
|
+
client.options(prev)
|
24
|
+
client.timeouts.must_equal(open_timeout: 30, read_timeout: 90)
|
25
|
+
end
|
26
|
+
|
27
|
+
it 'should be able to change the open timeout individually' do
|
28
|
+
prev = client.options(Intercom::Client.set_timeouts(open_timeout: 50))
|
29
|
+
client.timeouts.must_equal(open_timeout: 50, read_timeout: 90)
|
30
|
+
client.options(prev)
|
31
|
+
client.timeouts.must_equal(open_timeout: 30, read_timeout: 90)
|
32
|
+
end
|
33
|
+
|
34
|
+
it 'should be able to change the read timeout individually' do
|
35
|
+
prev = client.options(Intercom::Client.set_timeouts(read_timeout: 50))
|
36
|
+
client.timeouts.must_equal(open_timeout: 30, read_timeout: 50)
|
37
|
+
client.options(prev)
|
38
|
+
client.timeouts.must_equal(open_timeout: 30, read_timeout: 90)
|
39
|
+
end
|
40
|
+
|
20
41
|
it 'should raise on nil credentials' do
|
21
42
|
proc { Client.new(app_id: nil, api_key: nil) }.must_raise MisconfiguredClientError
|
22
43
|
end
|
@@ -1,36 +1,40 @@
|
|
1
|
-
require
|
1
|
+
require "spec_helper"
|
2
2
|
|
3
3
|
describe Intercom::Company do
|
4
|
-
let (:client) { Intercom::Client.new(app_id:
|
4
|
+
let (:client) { Intercom::Client.new(app_id: "app_id", api_key: "api_key") }
|
5
5
|
|
6
|
-
describe
|
7
|
-
it
|
8
|
-
client.expects(:get).with("/companies", {:company_id =>
|
9
|
-
proc {client.companies.find(:company_id =>
|
6
|
+
describe "when no response raises error" do
|
7
|
+
it "on find" do
|
8
|
+
client.expects(:get).with("/companies", {:company_id => "4"}).returns(nil)
|
9
|
+
proc {client.companies.find(:company_id => "4")}.must_raise Intercom::HttpError
|
10
10
|
end
|
11
11
|
|
12
|
-
it
|
12
|
+
it "on find_all" do
|
13
13
|
client.expects(:get).with("/companies", {}).returns(nil)
|
14
14
|
proc {client.companies.all.each {|company| }}.must_raise Intercom::HttpError
|
15
15
|
end
|
16
16
|
|
17
|
-
it
|
18
|
-
client.expects(:get).with("/companies", {:company_id =>
|
19
|
-
company = client.companies.find(:company_id =>
|
20
|
-
client.expects(:get).with(
|
17
|
+
it "on load" do
|
18
|
+
client.expects(:get).with("/companies", {:company_id => "4"}).returns({"type" =>"user", "id" =>"aaaaaaaaaaaaaaaaaaaaaaaa", "company_id" => "4", "name" => "MyCo"})
|
19
|
+
company = client.companies.find(:company_id => "4")
|
20
|
+
client.expects(:get).with("/companies/aaaaaaaaaaaaaaaaaaaaaaaa", {}).returns(nil)
|
21
21
|
proc {client.companies.load(company)}.must_raise Intercom::HttpError
|
22
22
|
end
|
23
23
|
end
|
24
24
|
|
25
|
-
it
|
25
|
+
it "gets users in a company by intercom ID" do
|
26
26
|
client.expects(:get).with("/companies/abc123/users", {}).returns(page_of_users(false))
|
27
|
-
client.companies.
|
28
|
-
|
27
|
+
client.companies.users_by_intercom_company_id("abc123").each { |u| }
|
28
|
+
end
|
29
|
+
|
30
|
+
it "gets users in a company by external company ID" do
|
31
|
+
client.expects(:get).with("/companies", { company_id: "abc123", type: "user" }).returns(page_of_users(false))
|
32
|
+
client.companies.users_by_company_id("abc123").each { |u| }
|
29
33
|
end
|
30
34
|
|
31
|
-
it
|
35
|
+
it "finds a company" do
|
32
36
|
client.expects(:get).with("/companies/531ee472cce572a6ec000006", {}).returns(test_company)
|
33
|
-
company = client.companies.find(id:
|
37
|
+
company = client.companies.find(id: "531ee472cce572a6ec000006")
|
34
38
|
company.name.must_equal("Blue Sun")
|
35
39
|
end
|
36
40
|
end
|
@@ -30,14 +30,15 @@ describe 'Intercom::Request' do
|
|
30
30
|
client.handle_rate_limit.must_equal(true)
|
31
31
|
end
|
32
32
|
|
33
|
-
it 'should call sleep for rate limit error three times' do
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
33
|
+
it 'should call sleep for rate limit error three times and raise a rate limit error otherwise' do
|
34
|
+
expect {
|
35
|
+
stub_request(:any, uri).\
|
36
|
+
to_return(status: [429, "Too Many Requests"], headers: { 'X-RateLimit-Reset' => (Time.now.utc + 10).to_i.to_s })
|
37
|
+
req = Intercom::Request.get(uri, "")
|
38
|
+
req.handle_rate_limit=true
|
39
|
+
req.expects(:sleep).times(3).with(any_parameters)
|
40
|
+
req.execute(target_base_url=uri, username: "ted", secret: "")
|
41
|
+
}.must_raise(Intercom::RateLimitExceeded)
|
41
42
|
end
|
42
43
|
|
43
44
|
it 'should not call sleep for rate limit error' do
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: intercom
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.
|
4
|
+
version: 3.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ben McRedmond
|
@@ -15,7 +15,7 @@ authors:
|
|
15
15
|
autorequire:
|
16
16
|
bindir: bin
|
17
17
|
cert_chain: []
|
18
|
-
date: 2018-
|
18
|
+
date: 2018-10-02 00:00:00.000000000 Z
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
21
21
|
name: minitest
|
@@ -152,7 +152,6 @@ files:
|
|
152
152
|
- lib/intercom/event.rb
|
153
153
|
- lib/intercom/extended_api_operations/segments.rb
|
154
154
|
- lib/intercom/extended_api_operations/tags.rb
|
155
|
-
- lib/intercom/extended_api_operations/users.rb
|
156
155
|
- lib/intercom/job.rb
|
157
156
|
- lib/intercom/lib/dynamic_accessors.rb
|
158
157
|
- lib/intercom/lib/dynamic_accessors_on_method_missing.rb
|
@@ -1,16 +0,0 @@
|
|
1
|
-
require 'intercom/client_collection_proxy'
|
2
|
-
require 'intercom/utils'
|
3
|
-
|
4
|
-
module Intercom
|
5
|
-
module ExtendedApiOperations
|
6
|
-
module Users
|
7
|
-
def users(id)
|
8
|
-
collection_name = Utils.resource_class_to_collection_name(collection_class)
|
9
|
-
finder_details = {}
|
10
|
-
finder_details[:url] = "/#{collection_name}/#{id}/users"
|
11
|
-
finder_details[:params] = {}
|
12
|
-
ClientCollectionProxy.new("users", finder_details: finder_details, client: @client)
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|