intercom 2.2.0 → 2.2.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: f26bb35b88b669bfc5225edd1fc7838411dcefe7
4
- data.tar.gz: 1636c5b0708ed2ffb05d75e4d381a9cd4e35df87
3
+ metadata.gz: c9111e19a82bb7d9ffba1c0677d77c629266ac7c
4
+ data.tar.gz: 02a3c89982a481e6b2b3410d4cbec80630556daa
5
5
  SHA512:
6
- metadata.gz: 81ec8dad83ea630bfb9dc59c400d190fb8c299a5024b06c8a486563dd45d2be084e6dda5d0e12927f3d0eb09b7fb4be8f2903a4c266e5858301ae5eacae43076
7
- data.tar.gz: d34a0ebe575bf3d365eba99f3a3f9e3203e21759213919f616fdf4c2035a4ad4fb850fddf9f9c185e7e4e6f5f541896553017b1c47a04c41473f17a31dd61096
6
+ metadata.gz: 0695acd0c2f7227c16a2253f90e18b8be2398d2032175ac69c5067e6d6bbfe13d64a5ab85d0c0b1aa734f7aa0bf6acbadc202649c715370a07dd3c405a1d6f73
7
+ data.tar.gz: 0b6a49e6137e4794199175cdc9b8dca25b71be86b5413146c1cf379a3a324ce6a92a9ffdd1e1ea67e5384c1e13e326e54504dd055ccfe3da2dd0691c1d1b6022
data/README.md CHANGED
@@ -19,7 +19,7 @@ Additionally, the new version uses Ruby 2.
19
19
 
20
20
  Using bundler:
21
21
 
22
- gem 'intercom', "~> 2.2.0"
22
+ gem 'intercom', "~> 2.2.1"
23
23
 
24
24
  ## Basic Usage
25
25
 
@@ -43,6 +43,9 @@ Resources this API supports:
43
43
  https://api.intercom.io/conversations
44
44
  https://api.intercom.io/messages
45
45
  https://api.intercom.io/counts
46
+ https://api.intercom.io/subscriptions
47
+
48
+ Additionally, the library can handle incoming webhooks from Intercom and convert to `Intercom::` models.
46
49
 
47
50
  ### Examples
48
51
 
@@ -290,6 +293,39 @@ The metadata key values in the example are treated as follows-
290
293
  - order_number: a Rich Link (value contains 'url' and 'value' keys)
291
294
  - price: An Amount in US Dollars (value contains 'amount' and 'currency' keys)
292
295
 
296
+ ### Subscriptions
297
+
298
+ Subscribe to events in Intercom to receive webhooks.
299
+
300
+ ```ruby
301
+ # create a subscription
302
+ Intercom::Subscription.create(:url => "http://example.com", :topics => ["user.created"])
303
+
304
+ # fetch a subscription
305
+ Intercom::Subscription.find(:id => "nsub_123456789")
306
+
307
+ # list subscriptions
308
+ Intercom::Subscription.all
309
+ ```
310
+
311
+ ### Webhooks
312
+
313
+ ```ruby
314
+ # create a payload from the notification hash (from json).
315
+ payload = Intercom::Notification.new(notification_hash)
316
+
317
+ payload.type
318
+ # => 'user.created'
319
+
320
+ payload.model_type
321
+ # => Intercom::User
322
+
323
+ user = payload.model
324
+ # => Instance of Intercom::User
325
+ ```
326
+
327
+ Note that models generated from webhook notifications might differ slightly from models directly acquired via the API. If this presents a problem, calling `payload.load` will load the model from the API using the `id` field.
328
+
293
329
  ### Errors
294
330
  You do not need to deal with the HTTP response from an API call directly. If there is an unsuccessful response then an error that is a subclass of Intercom:Error will be raised. If desired, you can get at the http_code of an Intercom::Error via it's `http_code` method.
295
331
 
@@ -1,3 +1,7 @@
1
+ 2.2.1
2
+ - Webhook Notification support
3
+ - Webhook Subscription support
4
+
1
5
  2.2.0
2
6
  - Handle blanks on identity attributes (e.g. email) better.
3
7
 
@@ -10,6 +10,8 @@ require "intercom/message"
10
10
  require "intercom/admin"
11
11
  require "intercom/count"
12
12
  require "intercom/request"
13
+ require "intercom/subscription"
14
+ require "intercom/notification"
13
15
  require "intercom/utils"
14
16
  require "intercom/errors"
15
17
  require "json"
@@ -47,7 +47,11 @@ module Intercom
47
47
 
48
48
  def deserialize_response_hash(response_hash, block)
49
49
  top_level_type = response_hash.delete('type')
50
- top_level_entity_key = Utils.entity_key_from_type(top_level_type)
50
+ if resource_name == 'subscriptions'
51
+ top_level_entity_key = 'items'
52
+ else
53
+ top_level_entity_key = Utils.entity_key_from_type(top_level_type)
54
+ end
51
55
  response_hash[top_level_entity_key].each do |object_json|
52
56
  block.call Lib::TypedJsonDeserializer.new(object_json).deserialize
53
57
  end
@@ -0,0 +1,20 @@
1
+ require 'intercom/traits/api_resource'
2
+
3
+ module Intercom
4
+ class Notification
5
+ include Traits::ApiResource
6
+
7
+ def model
8
+ data.item
9
+ end
10
+
11
+ def model_type
12
+ model.class
13
+ end
14
+
15
+ def load
16
+ model.load
17
+ end
18
+
19
+ end
20
+ end
@@ -0,0 +1,15 @@
1
+ require 'intercom/api_operations/list'
2
+ require 'intercom/api_operations/find_all'
3
+ require 'intercom/api_operations/save'
4
+ require 'intercom/api_operations/delete'
5
+ require 'intercom/traits/api_resource'
6
+
7
+ module Intercom
8
+ class Subscription
9
+ include ApiOperations::List
10
+ include ApiOperations::Find
11
+ include ApiOperations::Save
12
+ include ApiOperations::Delete
13
+ include Traits::ApiResource
14
+ end
15
+ end
@@ -1,3 +1,3 @@
1
1
  module Intercom #:nodoc:
2
- VERSION = "2.2.0"
2
+ VERSION = "2.2.1"
3
3
  end
@@ -132,6 +132,163 @@ def test_tag
132
132
  }
133
133
  end
134
134
 
135
+ def test_user_notification
136
+ {
137
+ "type" => "notification_event",
138
+ "id" => "notif_123456-56465-546546",
139
+ "topic" => "user.created",
140
+ "app_id" => "aaaaaa",
141
+ "data" =>
142
+ {
143
+ "type" => "notification_event_data",
144
+ "item" =>
145
+ {
146
+ "type" => "user",
147
+ "id" => "aaaaaaaaaaaaaaaaaaaaaaaa",
148
+ "user_id" => nil,
149
+ "email" => "joe@example.com",
150
+ "name" => "Joe Schmoe",
151
+ "avatar" =>
152
+ {
153
+ "type" => "avatar",
154
+ "image_url" => nil
155
+ },
156
+ "app_id" => "aaaaa",
157
+ "companies" =>
158
+ {
159
+ "type" => "company.list",
160
+ "companies" => [ ]
161
+ },
162
+ "location_data" =>
163
+ {
164
+ },
165
+ "last_request_at" => nil,
166
+ "created_at" => "1401970114",
167
+ "remote_created_at" => nil,
168
+ "updated_at" => "1401970114",
169
+ "session_count" => 0,
170
+ "social_profiles" =>
171
+ {
172
+ "type" => "social_profile.list",
173
+ "social_profiles" => [ ]
174
+ },
175
+ "unsubscribed_from_emails" => false,
176
+ "user_agent_data" => nil,
177
+ "tags" =>
178
+ {
179
+ "type" => "tag.list",
180
+ "tags" => [ ]
181
+ },
182
+ "segments" =>
183
+ {
184
+ "type" => "segment.list",
185
+ "segments" => [ ]
186
+ },
187
+ "custom_attributes" =>
188
+ {
189
+ }
190
+ }
191
+ },
192
+ "delivery_status" => nil,
193
+ "delivery_attempts" => 1,
194
+ "delivered_at" => 0,
195
+ "first_sent_at" => 1410188629,
196
+ "created_at" => 1410188628,
197
+ "links" => { },
198
+ "self" => nil
199
+ }
200
+ end
201
+
202
+ def test_conversation_notification
203
+ {
204
+ "type"=>"notification_event",
205
+ "id"=>"notif_123456-56465-546546",
206
+ "topic"=>"conversation.user.created",
207
+ "app_id"=>"aaaaa",
208
+ "data"=>
209
+ {
210
+ "type"=>"notification_event_data",
211
+ "item"=>
212
+ {
213
+ "type"=>"conversation",
214
+ "id"=>"123456789",
215
+ "created_at"=>"1410335293",
216
+ "updated_at"=>"1410335293",
217
+ "user"=>
218
+ {
219
+ "type"=>"user",
220
+ "id"=>"540f1de7112d3d1d51001637",
221
+ "name"=>"Kill Bill",
222
+ "email"=>"bill@bill.bill"},
223
+ "assignee"=>
224
+ {
225
+ "type"=>"nobody_admin",
226
+ "id"=>nil
227
+ },
228
+ "conversation_message"=>
229
+ {
230
+ "type"=>"conversation_message",
231
+ "id"=>"321546",
232
+ "subject"=>"",
233
+ "body"=>"<p>An important message</p>",
234
+ "author"=>
235
+ {
236
+ "type"=>"user",
237
+ "id"=>"aaaaaaaaaaaaaaaaaaaaaa",
238
+ "name"=>"Kill Bill",
239
+ "email"=>"bill@bill.bill"},
240
+ "attachments"=>[]
241
+ },
242
+ "conversation_parts"=>
243
+ {
244
+ "type"=>"conversation_part.list",
245
+ "conversation_parts"=>[]
246
+ },
247
+ "open"=>nil,
248
+ "read"=>true,
249
+ "links"=>
250
+ {
251
+ "conversation_web"=>
252
+ "https://app.intercom.io/a/apps/aaaaaa/inbox/all/conversations/123456789"}
253
+ }
254
+ },
255
+ "delivery_status"=>nil,
256
+ "delivery_attempts"=>1,
257
+ "delivered_at"=>0,
258
+ "first_sent_at"=>1410335293,
259
+ "created_at"=>1410335293,
260
+ "links"=>{},
261
+ "self"=>nil
262
+ }
263
+ end
264
+
265
+ def test_subscription
266
+ {"request"=>
267
+ {"type"=>"notification_subscription",
268
+ "id"=>"nsub_123456789",
269
+ "created_at"=>1410368642,
270
+ "updated_at"=>1410368642,
271
+ "service_type"=>"web",
272
+ "app_id"=>"3qmk5gyg",
273
+ "url"=>
274
+ "http://example.com",
275
+ "self"=>
276
+ "https://api.intercom.io/subscriptions/nsub_123456789",
277
+ "topics"=>["user.created", "conversation.user.replied", "conversation.admin.replied"],
278
+ "active"=>true,
279
+ "metadata"=>{},
280
+ "hub_secret"=>nil,
281
+ "mode"=>"point",
282
+ "links"=>
283
+ {"sent"=>
284
+ "https://api.intercom.io/subscriptions/nsub_123456789/sent",
285
+ "retry"=>
286
+ "https://api.intercom.io/subscriptions/nsub_123456789/retry",
287
+ "errors"=>
288
+ "https://api.intercom.io/subscriptions/nsub_123456789/errors"},
289
+ "notes"=>[]}}
290
+ end
291
+
135
292
  def error_on_modify_frozen
136
293
  RUBY_VERSION =~ /1.8/ ? TypeError : RuntimeError
137
294
  end
@@ -0,0 +1,45 @@
1
+ require 'spec_helper'
2
+
3
+ describe "Intercom::Notification" do
4
+
5
+ it "converts notification hash to object" do
6
+ payload = Intercom::Notification.new(test_user_notification)
7
+ payload.must_be_instance_of Intercom::Notification
8
+ end
9
+
10
+ it "returns correct model type for User" do
11
+ payload = Intercom::Notification.new(test_user_notification)
12
+ payload.model_type.must_equal Intercom::User
13
+ end
14
+
15
+ it "returns correct notification topic" do
16
+ payload = Intercom::Notification.new(test_user_notification)
17
+ payload.topic.must_equal "user.created"
18
+ end
19
+
20
+ it "returns instance of User" do
21
+ payload = Intercom::Notification.new(test_user_notification)
22
+ payload.model.must_be_instance_of Intercom::User
23
+ end
24
+
25
+ it "returns instance of Conversation" do
26
+ payload = Intercom::Notification.new(test_conversation_notification)
27
+ payload.model.must_be_instance_of Intercom::Conversation
28
+ end
29
+
30
+ it "returns correct model type for User" do
31
+ payload = Intercom::Notification.new(test_conversation_notification)
32
+ payload.model_type.must_equal Intercom::Conversation
33
+ end
34
+
35
+ it "returns correct notification topic" do
36
+ payload = Intercom::Notification.new(test_conversation_notification)
37
+ payload.topic.must_equal "conversation.user.created"
38
+ end
39
+
40
+ it "returns inner User object for Conversation" do
41
+ payload = Intercom::Notification.new(test_conversation_notification)
42
+ payload.model.user.must_be_instance_of Intercom::User
43
+ end
44
+
45
+ end
@@ -0,0 +1,18 @@
1
+ require 'spec_helper'
2
+
3
+ describe "Intercom::Subscription" do
4
+ it "gets a subscription" do
5
+ Intercom.expects(:get).with("/subscriptions/nsub_123456789", {}).returns(test_subscription)
6
+ subscription = Intercom::Subscription.find(:id => "nsub_123456789")
7
+ subscription.request.topics[0].must_equal "user.created"
8
+ subscription.request.topics[1].must_equal "conversation.user.replied"
9
+ end
10
+
11
+ it "creates a subscription" do
12
+ Intercom.expects(:post).with("/subscriptions", {'url' => "http://example.com", 'topics' => ["user.created"]}).returns(test_subscription)
13
+ subscription = Intercom::Subscription.create(:url => "http://example.com", :topics => ["user.created"])
14
+ subscription.request.topics[0].must_equal "user.created"
15
+ subscription.request.url.must_equal "http://example.com"
16
+ end
17
+
18
+ end
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: 2.2.0
4
+ version: 2.2.1
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: 2014-09-04 00:00:00.000000000 Z
18
+ date: 2014-09-11 00:00:00.000000000 Z
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
21
21
  name: minitest
@@ -141,8 +141,10 @@ files:
141
141
  - lib/intercom/lib/typed_json_deserializer.rb
142
142
  - lib/intercom/message.rb
143
143
  - lib/intercom/note.rb
144
+ - lib/intercom/notification.rb
144
145
  - lib/intercom/request.rb
145
146
  - lib/intercom/segment.rb
147
+ - lib/intercom/subscription.rb
146
148
  - lib/intercom/tag.rb
147
149
  - lib/intercom/traits/api_resource.rb
148
150
  - lib/intercom/traits/dirty_tracking.rb
@@ -157,6 +159,8 @@ files:
157
159
  - spec/unit/intercom/event_spec.rb
158
160
  - spec/unit/intercom/lib/flat_store_spec.rb
159
161
  - spec/unit/intercom/note_spec.rb
162
+ - spec/unit/intercom/notification_spec.rb
163
+ - spec/unit/intercom/subscription_spec.rb
160
164
  - spec/unit/intercom/tag_spec.rb
161
165
  - spec/unit/intercom/traits/api_resource_spec.rb
162
166
  - spec/unit/intercom/user_spec.rb
@@ -192,6 +196,8 @@ test_files:
192
196
  - spec/unit/intercom/event_spec.rb
193
197
  - spec/unit/intercom/lib/flat_store_spec.rb
194
198
  - spec/unit/intercom/note_spec.rb
199
+ - spec/unit/intercom/notification_spec.rb
200
+ - spec/unit/intercom/subscription_spec.rb
195
201
  - spec/unit/intercom/tag_spec.rb
196
202
  - spec/unit/intercom/traits/api_resource_spec.rb
197
203
  - spec/unit/intercom/user_spec.rb