intercom 4.1.2 → 4.1.3

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ebb883bd25fc8d132306baac3a22c43650701dbe42d42b95ada3819bc52cc2d6
4
- data.tar.gz: 8d1158c4d79cf19916c6cc1d413c329588d1ff36b5741517e029415e0f992360
3
+ metadata.gz: 02dd1486f502ecd7d6cd6c5ac0eda0dd7aa0efa2f127caee9eb4d5c2f87d131d
4
+ data.tar.gz: 618094ddfd695421006362dc450cf42d9e09f8fd70238dd9a783c1e98821112e
5
5
  SHA512:
6
- metadata.gz: 0a0ea848ac117043da9707f2f9689504abda06f34e218a077c0591216aa654c3e9ca73f9874f2255e7300cd3329c95ba6440232c30d58364877e7d358bf950d0
7
- data.tar.gz: 95b5ffdd05e7332fcbd53061c08c380d8632bd9f11d09e3673da65ca25b4624377b409116292b41f626a0fc6b4ad3d1c5183e5315533d3b4f94fe285c74041a6
6
+ metadata.gz: d551de01dc64b86f6e414234e0b0bdb8f207f2387cab6f15254ff5aa9f8561232fa1b6412ad067eaef768d9a6fffcbf0677330f8aee8667a0fd597bae5d7c7a7
7
+ data.tar.gz: 843174258835ec50702e28c10b16592d954e67a95318314f1c3eb544ee48705b2115ff82924c67eee32a280670c91c0885bbd04bb816d8ce59bb4db10258d1ca
data/README.md CHANGED
@@ -1,12 +1,26 @@
1
1
  # intercom-ruby
2
2
 
3
- Ruby bindings for the Intercom API (https://developers.intercom.io/reference).
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
- gem install intercom
33
+ ```bash
34
+ gem install intercom
35
+ ```
21
36
 
22
37
  Using bundler:
23
38
 
24
- gem 'intercom', '~> 4.1'
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.1')
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
- https://api.intercom.io/contacts
50
- https://api.intercom.io/visitors
51
- https://api.intercom.io/companies
52
- https://api.intercom.io/data_attributes
53
- https://api.intercom.io/events
54
- https://api.intercom.io/tags
55
- https://api.intercom.io/notes
56
- https://api.intercom.io/segments
57
- https://api.intercom.io/conversations
58
- https://api.intercom.io/messages
59
- https://api.intercom.io/admins
60
- https://api.intercom.io/teams
61
- https://api.intercom.io/counts
62
- https://api.intercom.io/subscriptions
63
- https://api.intercom.io/jobs
64
- https://api.intercom.io/articles
65
- https://api.intercom.io/help_center/collections
66
- https://api.intercom.io/help_center/sections
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
@@ -146,6 +165,7 @@ contact.companies.each {|c| p c.name}
146
165
  ```
147
166
 
148
167
  #### Visitors
168
+
149
169
  ```ruby
150
170
  # Get and update a visitor
151
171
  visitor = intercom.visitors.find(id: "5dd570e7b1b922452676af23")
@@ -161,6 +181,7 @@ intercom.visitors.convert(visitor, user)
161
181
  ```
162
182
 
163
183
  #### Companies
184
+
164
185
  ```ruby
165
186
  # Find a company by company_id
166
187
  company = intercom.companies.find(company_id: "44")
@@ -188,7 +209,9 @@ intercom.companies.scroll.each { |comp| puts comp.name}
188
209
  ```
189
210
 
190
211
  #### Data Attributes
212
+
191
213
  Data Attributes are a type of metadata used to describe your customer and company models. These include standard and custom attributes.
214
+
192
215
  ```ruby
193
216
  # Create a new custom data attribute
194
217
  intercom.data_attributes.create({ name: "test_attribute", model: "contact", data_type: "string" })
@@ -208,10 +231,11 @@ intercom.data_attributes.save(attribute)
208
231
 
209
232
  # Find all customer attributes including archived
210
233
  customer_attributes_incl_archived = intercom.data_attributes.find_all({"model": "contact", "include_archived": true})
211
- customer_attributes_incl_archived.each { |attr| p attribute.name }
234
+ customer_attributes_incl_archived.each { |attr| p attr.name }
212
235
  ```
213
236
 
214
237
  #### Events
238
+
215
239
  ```ruby
216
240
  intercom.events.create(
217
241
  event_name: "invited-friend",
@@ -257,7 +281,8 @@ intercom.events.create(
257
281
  )
258
282
  ```
259
283
 
260
- The metadata key values in the example are treated as follows-
284
+ The metadata key values in the example are treated as follows:
285
+
261
286
  - order_date: a Date (key ends with '_date')
262
287
  - stripe_invoice: The identifier of the Stripe invoice (has a 'stripe_invoice' key)
263
288
  - order_number: a Rich Link (value contains 'url' and 'value' keys)
@@ -266,6 +291,7 @@ The metadata key values in the example are treated as follows-
266
291
  *NB:* This version of the gem reserves the field name `type` in Event data.
267
292
 
268
293
  #### Tags
294
+
269
295
  ```ruby
270
296
  # Iterate over all tags
271
297
  intercom.tags.all.each {|tag| "#{tag.id} - #{tag.name}" }
@@ -279,12 +305,14 @@ tag = intercom.tags.untag(name: 'blue', companies: [{ company_id: "42ea2f1b93891
279
305
  ```
280
306
 
281
307
  #### Notes
308
+
282
309
  ```ruby
283
310
  # Find a note by id
284
311
  note = intercom.notes.find(id: "123")
285
312
  ```
286
313
 
287
314
  #### Segments
315
+
288
316
  ```ruby
289
317
  # Find a segment
290
318
  segment = intercom.segments.find(id: segment_id)
@@ -294,6 +322,7 @@ intercom.segments.all.each {|segment| puts "id: #{segment.id} name: #{segment.na
294
322
  ```
295
323
 
296
324
  #### Conversations
325
+
297
326
  ```ruby
298
327
  # Iterate over all conversations for your app
299
328
  intercom.conversations.all.each { |convo| ... }
@@ -424,6 +453,7 @@ conversation.remove_contact(id: contact.id, admin_id: admin.id)
424
453
  ```
425
454
 
426
455
  #### Full loading of an embedded entity
456
+
427
457
  ```ruby
428
458
  # Given a conversation with a partial contact, load the full contact. This can be
429
459
  # done for any entity
@@ -431,6 +461,7 @@ intercom.contacts.load(conversation.contacts.first)
431
461
  ```
432
462
 
433
463
  #### Sending messages
464
+
434
465
  ```ruby
435
466
 
436
467
  # InApp message from admin to user
@@ -497,6 +528,7 @@ intercom.messages.create({
497
528
  ```
498
529
 
499
530
  #### Admins
531
+
500
532
  ```ruby
501
533
  # Find access token owner (only with Personal Access Token and OAuth)
502
534
  intercom.admins.me
@@ -507,6 +539,7 @@ intercom.admins.all.each {|admin| puts admin.email }
507
539
  ```
508
540
 
509
541
  #### Teams
542
+
510
543
  ```ruby
511
544
  # Find a team by id
512
545
  intercom.teams.find(id: team_id)
@@ -544,6 +577,7 @@ intercom.subscriptions.all
544
577
  ```
545
578
 
546
579
  #### Articles
580
+
547
581
  ```ruby
548
582
  # Create an article
549
583
  article = intercom.articles.create(title: "New Article", author_id: "123456")
@@ -577,6 +611,7 @@ intercom.articles.delete(article)
577
611
  ```
578
612
 
579
613
  #### Collections
614
+
580
615
  ```ruby
581
616
  # Create a collection
582
617
  collection = intercom.collections.create(name: "New Collection")
@@ -609,6 +644,7 @@ intercom.collections.delete(collection)
609
644
  ```
610
645
 
611
646
  #### Sections
647
+
612
648
  ```ruby
613
649
  # Create a section
614
650
  section = intercom.sections.create(name: "New Section", parent_id: "123456")
@@ -660,6 +696,7 @@ Intercom::RateLimitExceeded
660
696
  Intercom::AttributeNotSetError # Raised when you try to call a getter that does not exist on an object
661
697
  Intercom::MultipleMatchingUsersError
662
698
  Intercom::HttpError # Raised when response object is unexpectedly nil
699
+ Intercom::GatewayTimeoutError
663
700
  ```
664
701
 
665
702
  ### Rate Limiting
@@ -674,7 +711,7 @@ intercom.rate_limit_details
674
711
  You can handle the rate limits yourself but a simple option is to use the handle_rate_limit flag.
675
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.
676
713
 
677
- ```
714
+ ```ruby
678
715
  intercom = Intercom::Client.new(token: ENV['AT'], handle_rate_limit: true)
679
716
  ```
680
717
 
@@ -700,13 +737,13 @@ intercom = Intercom::Client.new(token: ENV['AT'], handle_rate_limit: true)
700
737
 
701
738
  ```bash
702
739
  # all tests
703
- bundle exec spec
740
+ bundle exec rake spec
704
741
 
705
742
  # unit tests
706
- bundle exec spec:unit
743
+ bundle exec rake spec:unit
707
744
 
708
745
  # integration tests
709
- bundle exec spec:integration
746
+ bundle exec rake spec:integration
710
747
 
711
748
  # single test file
712
749
  bundle exec m spec/unit/intercom/job_spec.rb
data/changes.txt CHANGED
@@ -1,3 +1,10 @@
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
+
1
8
  4.1.1
2
9
  - Fixed bug with deprecated lead resource.
3
10
 
@@ -58,6 +58,7 @@ module Intercom
58
58
  @params[:starting_after] = paging_next['starting_after']
59
59
  return true
60
60
  else
61
+ @params[:starting_after] = nil
61
62
  return false
62
63
  end
63
64
  end
@@ -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, klass)
9
+ define_date_based_accessors(attribute, value, object)
11
10
  elsif object.flat_store_attribute?(attribute)
12
- define_flat_store_based_accessors(attribute, value, klass)
11
+ define_flat_store_based_accessors(attribute, value, object)
13
12
  else
14
- define_standard_accessors(attribute, value, klass)
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, klass)
21
- klass.class_eval %Q"
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, klass)
33
- klass.class_eval %Q"
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, klass)
45
- klass.class_eval %Q"
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
@@ -1,3 +1,3 @@
1
1
  module Intercom #:nodoc:
2
- VERSION = "4.1.2"
2
+ VERSION = "4.1.3"
3
3
  end
@@ -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", {}). returns(page_of_contacts(false))
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
@@ -274,6 +274,7 @@ describe Intercom::Contact do
274
274
 
275
275
  describe 'nested resources' do
276
276
  let(:contact) { Intercom::Contact.new(id: '1', client: client) }
277
+ let(:contact_no_tags) { Intercom::Contact.new(id: '2', client: client, tags: []) }
277
278
  let(:company) { Intercom::Company.new(id: '1') }
278
279
  let(:tag) { Intercom::Tag.new(id: '1') }
279
280
  let(:note) { Intercom::Note.new(body: "<p>Text for the note</p>") }
@@ -299,6 +300,27 @@ describe Intercom::Contact do
299
300
  _(proxy.resource_class).must_equal Intercom::Tag
300
301
  end
301
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
+
302
324
  it 'returns a collection proxy for listing companies' do
303
325
  proxy = contact.companies
304
326
  _(proxy.resource_name).must_equal 'companies'
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.2
4
+ version: 4.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ben McRedmond
@@ -12,10 +12,10 @@ authors:
12
12
  - Declan McGrath
13
13
  - Jamie Osler
14
14
  - Bob Long
15
- autorequire:
15
+ autorequire:
16
16
  bindir: bin
17
17
  cert_chain: []
18
- date: 2020-10-30 00:00:00.000000000 Z
18
+ date: 2022-03-01 00:00:00.000000000 Z
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
21
21
  name: minitest
@@ -256,7 +256,7 @@ homepage: https://www.intercom.io
256
256
  licenses:
257
257
  - MIT
258
258
  metadata: {}
259
- post_install_message:
259
+ post_install_message:
260
260
  rdoc_options: []
261
261
  require_paths:
262
262
  - lib
@@ -271,8 +271,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
271
271
  - !ruby/object:Gem::Version
272
272
  version: '0'
273
273
  requirements: []
274
- rubygems_version: 3.0.3
275
- signing_key:
274
+ rubygems_version: 3.2.16
275
+ signing_key:
276
276
  specification_version: 4
277
277
  summary: Ruby bindings for the Intercom API
278
278
  test_files: