intercom 4.1.0 → 4.1.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +83 -31
- data/changes.txt +17 -0
- data/lib/intercom/base_collection_proxy.rb +1 -0
- data/lib/intercom/client.rb +4 -0
- data/lib/intercom/contact.rb +1 -0
- data/lib/intercom/lib/dynamic_accessors.rb +9 -10
- data/lib/intercom/scroll_collection_proxy.rb +6 -5
- data/lib/intercom/segment.rb +4 -0
- data/lib/intercom/service/company.rb +2 -0
- data/lib/intercom/service/contact.rb +10 -0
- data/lib/intercom/service/conversation.rb +1 -1
- data/lib/intercom/version.rb +1 -1
- data/spec/unit/intercom/base_collection_proxy_spec.rb +18 -1
- data/spec/unit/intercom/company_spec.rb +6 -0
- data/spec/unit/intercom/contact_spec.rb +41 -0
- data/spec/unit/intercom/conversation_spec.rb +1 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 02dd1486f502ecd7d6cd6c5ac0eda0dd7aa0efa2f127caee9eb4d5c2f87d131d
|
4
|
+
data.tar.gz: 618094ddfd695421006362dc450cf42d9e09f8fd70238dd9a783c1e98821112e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d551de01dc64b86f6e414234e0b0bdb8f207f2387cab6f15254ff5aa9f8561232fa1b6412ad067eaef768d9a6fffcbf0677330f8aee8667a0fd597bae5d7c7a7
|
7
|
+
data.tar.gz: 843174258835ec50702e28c10b16592d954e67a95318314f1c3eb544ee48705b2115ff82924c67eee32a280670c91c0885bbd04bb816d8ce59bb4db10258d1ca
|
data/README.md
CHANGED
@@ -1,12 +1,26 @@
|
|
1
1
|
# intercom-ruby
|
2
2
|
|
3
|
-
|
3
|
+
[![Circle CI](https://circleci.com/gh/intercom/intercom-ruby.png?style=shield)](https://circleci.com/gh/intercom/intercom-ruby)
|
4
|
+
[![gem](https://img.shields.io/gem/v/intercom)](https://rubygems.org/gems/intercom)
|
5
|
+
![Intercom API Version](https://img.shields.io/badge/Intercom%20API%20Version-2.2-blue)
|
6
|
+
|
7
|
+
> Ruby bindings for the [Intercom API](https://developers.intercom.io/reference).
|
8
|
+
|
9
|
+
## Project Updates
|
10
|
+
|
11
|
+
### Maintenance
|
12
|
+
|
13
|
+
We're currently building a new team to provide in-depth and dedicated SDK support.
|
14
|
+
|
15
|
+
In the meantime, we'll be operating on limited capacity, meaning all pull requests will be evaluated on a best effort basis and will be limited to critical issues.
|
16
|
+
|
17
|
+
We'll communicate all relevant updates as we build this new team and support strategy in the coming months.
|
4
18
|
|
5
19
|
[API Documentation](https://developers.intercom.io/docs)
|
6
20
|
|
7
21
|
[Gem Documentation](http://rubydoc.info/github/intercom/intercom-ruby/master/frames)
|
8
22
|
|
9
|
-
For generating Intercom JavaScript script tags for Rails, please see https://github.com/intercom/intercom-rails
|
23
|
+
For generating Intercom JavaScript script tags for Rails, please see [intercom/intercom-rails](https://github.com/intercom/intercom-rails)
|
10
24
|
|
11
25
|
## Upgrading information
|
12
26
|
|
@@ -16,12 +30,15 @@ This version of the gem is compatible with `Ruby 2.1` and above.
|
|
16
30
|
|
17
31
|
## Installation
|
18
32
|
|
19
|
-
|
20
|
-
|
33
|
+
```bash
|
34
|
+
gem install intercom
|
35
|
+
```
|
21
36
|
|
22
37
|
Using bundler:
|
23
38
|
|
24
|
-
|
39
|
+
```bundler
|
40
|
+
gem 'intercom', '~> 4.1'
|
41
|
+
```
|
25
42
|
|
26
43
|
## Basic Usage
|
27
44
|
|
@@ -36,7 +53,7 @@ intercom = Intercom::Client.new(token: 'my_token')
|
|
36
53
|
|
37
54
|
```ruby
|
38
55
|
# With a versioned app:
|
39
|
-
intercom = Intercom::Client.new(token: 'my_token', api_version: '2.
|
56
|
+
intercom = Intercom::Client.new(token: 'my_token', api_version: '2.2')
|
40
57
|
```
|
41
58
|
|
42
59
|
If you are building a third party application you can get your access_tokens by [setting-up-oauth](https://developers.intercom.io/page/setting-up-oauth) for Intercom.
|
@@ -46,29 +63,31 @@ You can also use the [omniauth-intercom lib](https://github.com/intercom/omniaut
|
|
46
63
|
|
47
64
|
Resources this API supports:
|
48
65
|
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
66
|
+
```text
|
67
|
+
https://api.intercom.io/contacts
|
68
|
+
https://api.intercom.io/visitors
|
69
|
+
https://api.intercom.io/companies
|
70
|
+
https://api.intercom.io/data_attributes
|
71
|
+
https://api.intercom.io/events
|
72
|
+
https://api.intercom.io/tags
|
73
|
+
https://api.intercom.io/notes
|
74
|
+
https://api.intercom.io/segments
|
75
|
+
https://api.intercom.io/conversations
|
76
|
+
https://api.intercom.io/messages
|
77
|
+
https://api.intercom.io/admins
|
78
|
+
https://api.intercom.io/teams
|
79
|
+
https://api.intercom.io/counts
|
80
|
+
https://api.intercom.io/subscriptions
|
81
|
+
https://api.intercom.io/jobs
|
82
|
+
https://api.intercom.io/articles
|
83
|
+
https://api.intercom.io/help_center/collections
|
84
|
+
https://api.intercom.io/help_center/sections
|
85
|
+
```
|
68
86
|
|
69
87
|
### Examples
|
70
88
|
|
71
89
|
#### Contacts
|
90
|
+
|
72
91
|
Note that this is a new resource compatible only with the new [Contacts API](https://developers.intercom.com/intercom-api-reference/reference#contacts-model) released in API v2.0.
|
73
92
|
|
74
93
|
```ruby
|
@@ -86,6 +105,12 @@ intercom.contacts.save(contact)
|
|
86
105
|
contact.role = "user"
|
87
106
|
intercom.contacts.save(contact)
|
88
107
|
|
108
|
+
# Archive a contact
|
109
|
+
intercom.contacts.archive(contact)
|
110
|
+
|
111
|
+
# Unarchive a contact
|
112
|
+
intercom.contacts.unarchive(contact)
|
113
|
+
|
89
114
|
# Delete a contact permanently
|
90
115
|
intercom.contacts.delete(contact)
|
91
116
|
|
@@ -125,6 +150,9 @@ contact.create_note(body: "<p>Text for the note</p>")
|
|
125
150
|
# List notes for a contact
|
126
151
|
contact.notes.each {|n| p n.body}
|
127
152
|
|
153
|
+
# List segments for a contact
|
154
|
+
contact.segments.each {|segment| p segment.name}
|
155
|
+
|
128
156
|
# Add a contact to a company
|
129
157
|
company = intercom.companies.find(id: "123")
|
130
158
|
contact.add_company(id: company.id)
|
@@ -137,6 +165,7 @@ contact.companies.each {|c| p c.name}
|
|
137
165
|
```
|
138
166
|
|
139
167
|
#### Visitors
|
168
|
+
|
140
169
|
```ruby
|
141
170
|
# Get and update a visitor
|
142
171
|
visitor = intercom.visitors.find(id: "5dd570e7b1b922452676af23")
|
@@ -152,6 +181,7 @@ intercom.visitors.convert(visitor, user)
|
|
152
181
|
```
|
153
182
|
|
154
183
|
#### Companies
|
184
|
+
|
155
185
|
```ruby
|
156
186
|
# Find a company by company_id
|
157
187
|
company = intercom.companies.find(company_id: "44")
|
@@ -166,6 +196,9 @@ company = intercom.companies.find(id: "41e66f0313708347cb0000d0")
|
|
166
196
|
company.name = 'Updated company name'
|
167
197
|
intercom.companies.save(company)
|
168
198
|
|
199
|
+
# Delete a company
|
200
|
+
intercom.companies.delete(company)
|
201
|
+
|
169
202
|
# Iterate over all companies
|
170
203
|
intercom.companies.all.each {|company| puts %Q(#{company.name} - #{company.custom_attributes["referral_source"]}) }
|
171
204
|
intercom.companies.all.map {|company| company.name }
|
@@ -176,7 +209,9 @@ intercom.companies.scroll.each { |comp| puts comp.name}
|
|
176
209
|
```
|
177
210
|
|
178
211
|
#### Data Attributes
|
212
|
+
|
179
213
|
Data Attributes are a type of metadata used to describe your customer and company models. These include standard and custom attributes.
|
214
|
+
|
180
215
|
```ruby
|
181
216
|
# Create a new custom data attribute
|
182
217
|
intercom.data_attributes.create({ name: "test_attribute", model: "contact", data_type: "string" })
|
@@ -196,10 +231,11 @@ intercom.data_attributes.save(attribute)
|
|
196
231
|
|
197
232
|
# Find all customer attributes including archived
|
198
233
|
customer_attributes_incl_archived = intercom.data_attributes.find_all({"model": "contact", "include_archived": true})
|
199
|
-
customer_attributes_incl_archived.each { |attr| p
|
234
|
+
customer_attributes_incl_archived.each { |attr| p attr.name }
|
200
235
|
```
|
201
236
|
|
202
237
|
#### Events
|
238
|
+
|
203
239
|
```ruby
|
204
240
|
intercom.events.create(
|
205
241
|
event_name: "invited-friend",
|
@@ -245,7 +281,8 @@ intercom.events.create(
|
|
245
281
|
)
|
246
282
|
```
|
247
283
|
|
248
|
-
The metadata key values in the example are treated as follows
|
284
|
+
The metadata key values in the example are treated as follows:
|
285
|
+
|
249
286
|
- order_date: a Date (key ends with '_date')
|
250
287
|
- stripe_invoice: The identifier of the Stripe invoice (has a 'stripe_invoice' key)
|
251
288
|
- order_number: a Rich Link (value contains 'url' and 'value' keys)
|
@@ -254,6 +291,7 @@ The metadata key values in the example are treated as follows-
|
|
254
291
|
*NB:* This version of the gem reserves the field name `type` in Event data.
|
255
292
|
|
256
293
|
#### Tags
|
294
|
+
|
257
295
|
```ruby
|
258
296
|
# Iterate over all tags
|
259
297
|
intercom.tags.all.each {|tag| "#{tag.id} - #{tag.name}" }
|
@@ -261,15 +299,20 @@ intercom.tags.all.map {|tag| tag.name }
|
|
261
299
|
|
262
300
|
# Tag companies
|
263
301
|
tag = intercom.tags.tag(name: 'blue', companies: [{company_id: "42ea2f1b93891f6a99000427"}])
|
302
|
+
|
303
|
+
# Untag Companies
|
304
|
+
tag = intercom.tags.untag(name: 'blue', companies: [{ company_id: "42ea2f1b93891f6a99000427" }])
|
264
305
|
```
|
265
306
|
|
266
307
|
#### Notes
|
308
|
+
|
267
309
|
```ruby
|
268
310
|
# Find a note by id
|
269
311
|
note = intercom.notes.find(id: "123")
|
270
312
|
```
|
271
313
|
|
272
314
|
#### Segments
|
315
|
+
|
273
316
|
```ruby
|
274
317
|
# Find a segment
|
275
318
|
segment = intercom.segments.find(id: segment_id)
|
@@ -279,6 +322,7 @@ intercom.segments.all.each {|segment| puts "id: #{segment.id} name: #{segment.na
|
|
279
322
|
```
|
280
323
|
|
281
324
|
#### Conversations
|
325
|
+
|
282
326
|
```ruby
|
283
327
|
# Iterate over all conversations for your app
|
284
328
|
intercom.conversations.all.each { |convo| ... }
|
@@ -409,6 +453,7 @@ conversation.remove_contact(id: contact.id, admin_id: admin.id)
|
|
409
453
|
```
|
410
454
|
|
411
455
|
#### Full loading of an embedded entity
|
456
|
+
|
412
457
|
```ruby
|
413
458
|
# Given a conversation with a partial contact, load the full contact. This can be
|
414
459
|
# done for any entity
|
@@ -416,6 +461,7 @@ intercom.contacts.load(conversation.contacts.first)
|
|
416
461
|
```
|
417
462
|
|
418
463
|
#### Sending messages
|
464
|
+
|
419
465
|
```ruby
|
420
466
|
|
421
467
|
# InApp message from admin to user
|
@@ -482,6 +528,7 @@ intercom.messages.create({
|
|
482
528
|
```
|
483
529
|
|
484
530
|
#### Admins
|
531
|
+
|
485
532
|
```ruby
|
486
533
|
# Find access token owner (only with Personal Access Token and OAuth)
|
487
534
|
intercom.admins.me
|
@@ -492,6 +539,7 @@ intercom.admins.all.each {|admin| puts admin.email }
|
|
492
539
|
```
|
493
540
|
|
494
541
|
#### Teams
|
542
|
+
|
495
543
|
```ruby
|
496
544
|
# Find a team by id
|
497
545
|
intercom.teams.find(id: team_id)
|
@@ -529,6 +577,7 @@ intercom.subscriptions.all
|
|
529
577
|
```
|
530
578
|
|
531
579
|
#### Articles
|
580
|
+
|
532
581
|
```ruby
|
533
582
|
# Create an article
|
534
583
|
article = intercom.articles.create(title: "New Article", author_id: "123456")
|
@@ -562,6 +611,7 @@ intercom.articles.delete(article)
|
|
562
611
|
```
|
563
612
|
|
564
613
|
#### Collections
|
614
|
+
|
565
615
|
```ruby
|
566
616
|
# Create a collection
|
567
617
|
collection = intercom.collections.create(name: "New Collection")
|
@@ -594,6 +644,7 @@ intercom.collections.delete(collection)
|
|
594
644
|
```
|
595
645
|
|
596
646
|
#### Sections
|
647
|
+
|
597
648
|
```ruby
|
598
649
|
# Create a section
|
599
650
|
section = intercom.sections.create(name: "New Section", parent_id: "123456")
|
@@ -645,6 +696,7 @@ Intercom::RateLimitExceeded
|
|
645
696
|
Intercom::AttributeNotSetError # Raised when you try to call a getter that does not exist on an object
|
646
697
|
Intercom::MultipleMatchingUsersError
|
647
698
|
Intercom::HttpError # Raised when response object is unexpectedly nil
|
699
|
+
Intercom::GatewayTimeoutError
|
648
700
|
```
|
649
701
|
|
650
702
|
### Rate Limiting
|
@@ -659,7 +711,7 @@ intercom.rate_limit_details
|
|
659
711
|
You can handle the rate limits yourself but a simple option is to use the handle_rate_limit flag.
|
660
712
|
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.
|
661
713
|
|
662
|
-
```
|
714
|
+
```ruby
|
663
715
|
intercom = Intercom::Client.new(token: ENV['AT'], handle_rate_limit: true)
|
664
716
|
```
|
665
717
|
|
@@ -685,13 +737,13 @@ intercom = Intercom::Client.new(token: ENV['AT'], handle_rate_limit: true)
|
|
685
737
|
|
686
738
|
```bash
|
687
739
|
# all tests
|
688
|
-
bundle exec spec
|
740
|
+
bundle exec rake spec
|
689
741
|
|
690
742
|
# unit tests
|
691
|
-
bundle exec spec:unit
|
743
|
+
bundle exec rake spec:unit
|
692
744
|
|
693
745
|
# integration tests
|
694
|
-
bundle exec spec:integration
|
746
|
+
bundle exec rake spec:integration
|
695
747
|
|
696
748
|
# single test file
|
697
749
|
bundle exec m spec/unit/intercom/job_spec.rb
|
data/changes.txt
CHANGED
@@ -1,3 +1,20 @@
|
|
1
|
+
4.1.2
|
2
|
+
- Adding support for company delete.
|
3
|
+
- Adding support for archiving/unarchiving contacts.
|
4
|
+
- Adding support for listing contact segments.
|
5
|
+
- Fixed issue with scroll collection proxy.
|
6
|
+
- Fixed issue with running assignment rules on a conversation.
|
7
|
+
|
8
|
+
4.1.1
|
9
|
+
- Fixed bug with deprecated lead resource.
|
10
|
+
|
11
|
+
4.1.0
|
12
|
+
- Added support for new Articles API.
|
13
|
+
- Added support for new Collections API.
|
14
|
+
- Added support for new Sections API.
|
15
|
+
- Added support to equate two resources.
|
16
|
+
- Fixed issue for dirty tracking nested typed objects.
|
17
|
+
|
1
18
|
4.0.1
|
2
19
|
- Fixed bug with nested resources.
|
3
20
|
- Support for add/remove contact on conversation object.
|
data/lib/intercom/client.rb
CHANGED
data/lib/intercom/contact.rb
CHANGED
@@ -13,6 +13,7 @@ module Intercom
|
|
13
13
|
nested_resource_methods :tag, operations: %i[add delete list]
|
14
14
|
nested_resource_methods :note, operations: %i[create list]
|
15
15
|
nested_resource_methods :company, operations: %i[add delete list]
|
16
|
+
nested_resource_methods :segment, operations: %i[list]
|
16
17
|
|
17
18
|
def self.collection_proxy_class
|
18
19
|
Intercom::BaseCollectionProxy
|
@@ -5,20 +5,19 @@ module Intercom
|
|
5
5
|
class << self
|
6
6
|
|
7
7
|
def define_accessors(attribute, value, object)
|
8
|
-
klass = object.class
|
9
8
|
if attribute.to_s.end_with?('_at') && attribute.to_s != 'update_last_request_at'
|
10
|
-
define_date_based_accessors(attribute, value,
|
9
|
+
define_date_based_accessors(attribute, value, object)
|
11
10
|
elsif object.flat_store_attribute?(attribute)
|
12
|
-
define_flat_store_based_accessors(attribute, value,
|
11
|
+
define_flat_store_based_accessors(attribute, value, object)
|
13
12
|
else
|
14
|
-
define_standard_accessors(attribute, value,
|
13
|
+
define_standard_accessors(attribute, value, object)
|
15
14
|
end
|
16
15
|
end
|
17
16
|
|
18
17
|
private
|
19
18
|
|
20
|
-
def define_flat_store_based_accessors(attribute, value,
|
21
|
-
|
19
|
+
def define_flat_store_based_accessors(attribute, value, object)
|
20
|
+
object.instance_eval %Q"
|
22
21
|
def #{attribute}=(value)
|
23
22
|
mark_field_as_changed!(:#{attribute})
|
24
23
|
@#{attribute} = Intercom::Lib::FlatStore.new(value)
|
@@ -29,8 +28,8 @@ module Intercom
|
|
29
28
|
"
|
30
29
|
end
|
31
30
|
|
32
|
-
def define_date_based_accessors(attribute, value,
|
33
|
-
|
31
|
+
def define_date_based_accessors(attribute, value, object)
|
32
|
+
object.instance_eval %Q"
|
34
33
|
def #{attribute}=(value)
|
35
34
|
mark_field_as_changed!(:#{attribute})
|
36
35
|
@#{attribute} = value.nil? ? nil : value.to_i
|
@@ -41,8 +40,8 @@ module Intercom
|
|
41
40
|
"
|
42
41
|
end
|
43
42
|
|
44
|
-
def define_standard_accessors(attribute, value,
|
45
|
-
|
43
|
+
def define_standard_accessors(attribute, value, object)
|
44
|
+
object.instance_eval %Q"
|
46
45
|
def #{attribute}=(value)
|
47
46
|
mark_field_as_changed!(:#{attribute})
|
48
47
|
@#{attribute} = value
|
@@ -26,7 +26,7 @@ module Intercom
|
|
26
26
|
raise Intercom::HttpError, 'Http Error - No response entity returned' unless response_hash
|
27
27
|
|
28
28
|
@scroll_param = extract_scroll_param(response_hash)
|
29
|
-
top_level_entity_key =
|
29
|
+
top_level_entity_key = entity_key_from_response(response_hash)
|
30
30
|
response_hash[top_level_entity_key] = response_hash[top_level_entity_key].map do |object_json|
|
31
31
|
Lib::TypedJsonDeserializer.new(object_json, @client).deserialize
|
32
32
|
end
|
@@ -44,7 +44,8 @@ module Intercom
|
|
44
44
|
end
|
45
45
|
raise Intercom::HttpError, 'Http Error - No response entity returned' unless response_hash
|
46
46
|
|
47
|
-
|
47
|
+
top_level_entity_key = entity_key_from_response(response_hash)
|
48
|
+
response_hash[top_level_entity_key].each do |object_json|
|
48
49
|
block.call Lib::TypedJsonDeserializer.new(object_json, @client).deserialize
|
49
50
|
end
|
50
51
|
scroll_param = extract_scroll_param(response_hash)
|
@@ -55,8 +56,8 @@ module Intercom
|
|
55
56
|
|
56
57
|
private
|
57
58
|
|
58
|
-
def
|
59
|
-
top_level_type = response_hash
|
59
|
+
def entity_key_from_response(response_hash)
|
60
|
+
top_level_type = response_hash['type']
|
60
61
|
if resource_name == 'subscriptions'
|
61
62
|
'items'
|
62
63
|
else
|
@@ -65,7 +66,7 @@ module Intercom
|
|
65
66
|
end
|
66
67
|
|
67
68
|
def records_present?(response_hash)
|
68
|
-
!response_hash[
|
69
|
+
!response_hash[entity_key_from_response(response_hash)].empty?
|
69
70
|
end
|
70
71
|
|
71
72
|
def extract_scroll_param(response_hash)
|
data/lib/intercom/segment.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'intercom/service/base_service'
|
2
|
+
require 'intercom/api_operations/delete'
|
2
3
|
require 'intercom/api_operations/list'
|
3
4
|
require 'intercom/api_operations/scroll'
|
4
5
|
require 'intercom/api_operations/find'
|
@@ -11,6 +12,7 @@ require 'intercom/extended_api_operations/segments'
|
|
11
12
|
module Intercom
|
12
13
|
module Service
|
13
14
|
class Company < BaseService
|
15
|
+
include ApiOperations::Delete
|
14
16
|
include ApiOperations::Find
|
15
17
|
include ApiOperations::FindAll
|
16
18
|
include ApiOperations::Load
|
@@ -33,6 +33,16 @@ module Intercom
|
|
33
33
|
user.from_response(response)
|
34
34
|
end
|
35
35
|
|
36
|
+
def archive(contact)
|
37
|
+
@client.post("/#{collection_name}/#{contact.id}/archive", {})
|
38
|
+
contact
|
39
|
+
end
|
40
|
+
|
41
|
+
def unarchive(contact)
|
42
|
+
@client.post("/#{collection_name}/#{contact.id}/unarchive", {})
|
43
|
+
contact
|
44
|
+
end
|
45
|
+
|
36
46
|
private def raise_invalid_merge_error
|
37
47
|
raise Intercom::InvalidMergeError, 'Merging can only be performed on a lead into a user'
|
38
48
|
end
|
@@ -58,7 +58,7 @@ module Intercom
|
|
58
58
|
|
59
59
|
def run_assignment_rules(id)
|
60
60
|
collection_name = Utils.resource_class_to_collection_name(collection_class)
|
61
|
-
response = @client.post("/#{collection_name}/#{id}/run_assignment_rules")
|
61
|
+
response = @client.post("/#{collection_name}/#{id}/run_assignment_rules", {})
|
62
62
|
collection_class.new.from_response(response)
|
63
63
|
end
|
64
64
|
end
|
data/lib/intercom/version.rb
CHANGED
@@ -4,7 +4,7 @@ describe Intercom::BaseCollectionProxy do
|
|
4
4
|
let(:client) { Intercom::Client.new(token: 'token') }
|
5
5
|
|
6
6
|
it "stops iterating if no starting after value" do
|
7
|
-
client.expects(:get).with("/contacts", {}).
|
7
|
+
client.expects(:get).with("/contacts", {}).returns(page_of_contacts(false))
|
8
8
|
emails = []
|
9
9
|
client.contacts.all.each { |contact| emails << contact.email }
|
10
10
|
_(emails).must_equal %w[test1@example.com test2@example.com test3@example.com]
|
@@ -15,6 +15,7 @@ describe Intercom::BaseCollectionProxy do
|
|
15
15
|
client.expects(:get).with('/contacts', { starting_after: "EnCrYpTeDsTrInG" }).returns(page_of_contacts(false))
|
16
16
|
emails = []
|
17
17
|
client.contacts.all.each { |contact| emails << contact.email }
|
18
|
+
_(emails).must_equal %w[test1@example.com test2@example.com test3@example.com test1@example.com test2@example.com test3@example.com]
|
18
19
|
end
|
19
20
|
|
20
21
|
it "supports indexed array access" do
|
@@ -27,4 +28,20 @@ describe Intercom::BaseCollectionProxy do
|
|
27
28
|
emails = client.contacts.all.map { |contact| contact.email }
|
28
29
|
_(emails).must_equal %w[test1@example.com test2@example.com test3@example.com]
|
29
30
|
end
|
31
|
+
|
32
|
+
it "keeps entire collection iterable after first iteration" do
|
33
|
+
contacts = client.contacts.all
|
34
|
+
emails_iter1 = []
|
35
|
+
emails_iter2 = []
|
36
|
+
expects_pagination = proc do
|
37
|
+
client.expects(:get).with("/contacts", {}).returns(page_of_contacts(true))
|
38
|
+
client.expects(:get).with("/contacts", { starting_after: "EnCrYpTeDsTrInG" }).returns(page_of_contacts(false))
|
39
|
+
end
|
40
|
+
|
41
|
+
expects_pagination.call
|
42
|
+
contacts.each { |contact| emails_iter1 << contact.email }
|
43
|
+
expects_pagination.call
|
44
|
+
contacts.each { |contact| emails_iter2 << contact.email }
|
45
|
+
_(emails_iter1).must_equal emails_iter2
|
46
|
+
end
|
30
47
|
end
|
@@ -35,4 +35,10 @@ describe Intercom::Company do
|
|
35
35
|
_(proxy.url).must_equal '/companies/1/contacts'
|
36
36
|
_(proxy.resource_class).must_equal Intercom::Contact
|
37
37
|
end
|
38
|
+
|
39
|
+
it "deletes a company" do
|
40
|
+
company = Intercom::Company.new("id" => "1")
|
41
|
+
client.expects(:delete).with("/companies/1", {})
|
42
|
+
client.companies.delete(company)
|
43
|
+
end
|
38
44
|
end
|
@@ -248,6 +248,18 @@ describe Intercom::Contact do
|
|
248
248
|
client.contacts.delete(contact)
|
249
249
|
end
|
250
250
|
|
251
|
+
it 'archives a contact' do
|
252
|
+
contact = Intercom::Contact.new('id' => '1')
|
253
|
+
client.expects(:post).with('/contacts/1/archive', {})
|
254
|
+
client.contacts.archive(contact)
|
255
|
+
end
|
256
|
+
|
257
|
+
it 'unarchives a contact' do
|
258
|
+
contact = Intercom::Contact.new('id' => '1')
|
259
|
+
client.expects(:post).with('/contacts/1/unarchive', {})
|
260
|
+
client.contacts.unarchive(contact)
|
261
|
+
end
|
262
|
+
|
251
263
|
describe 'merging' do
|
252
264
|
let(:lead) { Intercom::Contact.from_api(external_id: 'contact_id', role: 'lead') }
|
253
265
|
let(:user) { Intercom::Contact.from_api(id: 'external_id', role: 'user') }
|
@@ -262,6 +274,7 @@ describe Intercom::Contact do
|
|
262
274
|
|
263
275
|
describe 'nested resources' do
|
264
276
|
let(:contact) { Intercom::Contact.new(id: '1', client: client) }
|
277
|
+
let(:contact_no_tags) { Intercom::Contact.new(id: '2', client: client, tags: []) }
|
265
278
|
let(:company) { Intercom::Company.new(id: '1') }
|
266
279
|
let(:tag) { Intercom::Tag.new(id: '1') }
|
267
280
|
let(:note) { Intercom::Note.new(body: "<p>Text for the note</p>") }
|
@@ -273,6 +286,13 @@ describe Intercom::Contact do
|
|
273
286
|
_(proxy.resource_class).must_equal Intercom::Note
|
274
287
|
end
|
275
288
|
|
289
|
+
it 'returns a collection proxy for listing segments' do
|
290
|
+
proxy = contact.segments
|
291
|
+
_(proxy.resource_name).must_equal 'segments'
|
292
|
+
_(proxy.url).must_equal '/contacts/1/segments'
|
293
|
+
_(proxy.resource_class).must_equal Intercom::Segment
|
294
|
+
end
|
295
|
+
|
276
296
|
it 'returns a collection proxy for listing tags' do
|
277
297
|
proxy = contact.tags
|
278
298
|
_(proxy.resource_name).must_equal 'tags'
|
@@ -280,6 +300,27 @@ describe Intercom::Contact do
|
|
280
300
|
_(proxy.resource_class).must_equal Intercom::Tag
|
281
301
|
end
|
282
302
|
|
303
|
+
it 'returns correct tags from differring contacts' do
|
304
|
+
client.expects(:get).with('/contacts/1/tags', {}).returns({
|
305
|
+
'type' => 'tag.list',
|
306
|
+
'tags' => [
|
307
|
+
{
|
308
|
+
'type' => 'tag',
|
309
|
+
'id' => '1',
|
310
|
+
'name' => 'VIP Customer'
|
311
|
+
},
|
312
|
+
{
|
313
|
+
'type' => 'tag',
|
314
|
+
'id' => '2',
|
315
|
+
'name' => 'Test tag'
|
316
|
+
}
|
317
|
+
]
|
318
|
+
})
|
319
|
+
|
320
|
+
_(contact_no_tags.tags.map{ |t| t.id }).must_equal []
|
321
|
+
_(contact.tags.map{ |t| t.id }).must_equal ['1', '2']
|
322
|
+
end
|
323
|
+
|
283
324
|
it 'returns a collection proxy for listing companies' do
|
284
325
|
proxy = contact.companies
|
285
326
|
_(proxy.resource_name).must_equal 'companies'
|
@@ -54,7 +54,7 @@ describe "Intercom::Conversation" do
|
|
54
54
|
end
|
55
55
|
|
56
56
|
it 'runs assignment rules on a conversation' do
|
57
|
-
client.expects(:post).with('/conversations/147/run_assignment_rules').returns(test_conversation)
|
57
|
+
client.expects(:post).with('/conversations/147/run_assignment_rules', {}).returns(test_conversation)
|
58
58
|
client.conversations.run_assignment_rules('147')
|
59
59
|
end
|
60
60
|
|
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: 4.1.
|
4
|
+
version: 4.1.3
|
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:
|
18
|
+
date: 2022-03-01 00:00:00.000000000 Z
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
21
21
|
name: minitest
|
@@ -271,7 +271,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
271
271
|
- !ruby/object:Gem::Version
|
272
272
|
version: '0'
|
273
273
|
requirements: []
|
274
|
-
rubygems_version: 3.
|
274
|
+
rubygems_version: 3.2.16
|
275
275
|
signing_key:
|
276
276
|
specification_version: 4
|
277
277
|
summary: Ruby bindings for the Intercom API
|