intercom 2.5.4 → 3.0.0b1
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/.travis.yml +0 -2
- data/README.md +97 -118
- data/changes.txt +3 -0
- data/intercom.gemspec +1 -1
- data/lib/intercom.rb +13 -153
- data/lib/intercom/admin.rb +0 -2
- data/lib/intercom/api_operations/convert.rb +5 -5
- data/lib/intercom/api_operations/delete.rb +4 -6
- data/lib/intercom/api_operations/find.rb +9 -15
- data/lib/intercom/api_operations/find_all.rb +16 -21
- data/lib/intercom/api_operations/list.rb +4 -10
- data/lib/intercom/api_operations/load.rb +6 -6
- data/lib/intercom/api_operations/save.rb +23 -28
- data/lib/intercom/client.rb +95 -0
- data/lib/intercom/{collection_proxy.rb → client_collection_proxy.rb} +5 -8
- data/lib/intercom/company.rb +0 -16
- data/lib/intercom/contact.rb +0 -11
- data/lib/intercom/conversation.rb +0 -10
- data/lib/intercom/event.rb +0 -2
- data/lib/intercom/extended_api_operations/segments.rb +13 -0
- data/lib/intercom/extended_api_operations/tags.rb +4 -5
- data/lib/intercom/extended_api_operations/users.rb +3 -5
- data/lib/intercom/message.rb +0 -2
- data/lib/intercom/note.rb +1 -10
- data/lib/intercom/options.rb +11 -0
- data/lib/intercom/request.rb +9 -5
- data/lib/intercom/segment.rb +0 -7
- data/lib/intercom/service/admin.rb +14 -0
- data/lib/intercom/service/base_service.rb +21 -0
- data/lib/intercom/service/company.rb +28 -0
- data/lib/intercom/service/contact.rb +22 -0
- data/lib/intercom/service/conversation.rb +31 -0
- data/lib/intercom/service/event.rb +14 -0
- data/lib/intercom/service/message.rb +14 -0
- data/lib/intercom/service/note.rb +22 -0
- data/lib/intercom/service/segment.rb +16 -0
- data/lib/intercom/service/subscription.rb +21 -0
- data/lib/intercom/service/tag.rb +30 -0
- data/lib/intercom/service/user.rb +28 -0
- data/lib/intercom/subscription.rb +0 -8
- data/lib/intercom/tag.rb +0 -16
- data/lib/intercom/user.rb +0 -16
- data/lib/intercom/utils.rb +0 -1
- data/lib/intercom/version.rb +1 -1
- data/spec/spec_helper.rb +117 -0
- data/spec/unit/intercom/admin_spec.rb +11 -4
- data/spec/unit/intercom/client_collection_proxy_spec.rb +35 -0
- data/spec/unit/intercom/client_spec.rb +21 -0
- data/spec/unit/intercom/company_spec.rb +24 -11
- data/spec/unit/intercom/contact_spec.rb +7 -5
- data/spec/unit/intercom/conversation_spec.rb +28 -0
- data/spec/unit/intercom/event_spec.rb +6 -5
- data/spec/unit/intercom/message_spec.rb +9 -8
- data/spec/unit/intercom/note_spec.rb +9 -2
- data/spec/unit/intercom/segment_spec.rb +12 -0
- data/spec/unit/intercom/subscription_spec.rb +7 -5
- data/spec/unit/intercom/tag_spec.rb +13 -7
- data/spec/unit/intercom/user_spec.rb +41 -33
- data/spec/unit/intercom_spec.rb +0 -83
- metadata +30 -20
- data/lib/intercom/api_operations/count.rb +0 -16
- data/lib/intercom/count.rb +0 -21
- data/lib/intercom/extended_api_operations/reply.rb +0 -16
- data/lib/intercom/generic_handlers/base_handler.rb +0 -22
- data/lib/intercom/generic_handlers/count.rb +0 -59
- data/lib/intercom/generic_handlers/tag.rb +0 -71
- data/lib/intercom/generic_handlers/tag_find_all.rb +0 -47
- data/lib/intercom/notification.rb +0 -20
- data/lib/intercom/traits/generic_handler_binding.rb +0 -29
- data/spec/unit/intercom/collection_proxy_spec.rb +0 -34
- data/spec/unit/intercom/notification_spec.rb +0 -68
data/lib/intercom/admin.rb
CHANGED
@@ -3,13 +3,13 @@ require 'intercom/traits/api_resource'
|
|
3
3
|
module Intercom
|
4
4
|
module ApiOperations
|
5
5
|
module Convert
|
6
|
-
def convert(user)
|
7
|
-
from_response(
|
8
|
-
|
6
|
+
def convert(contact, user)
|
7
|
+
Intercom::User.new.from_response(
|
8
|
+
@client.post(
|
9
9
|
"/contacts/convert",
|
10
10
|
{
|
11
|
-
contact: { user_id: user_id },
|
12
|
-
user: user
|
11
|
+
contact: { user_id: contact.user_id },
|
12
|
+
user: identity_hash(user)
|
13
13
|
}
|
14
14
|
)
|
15
15
|
)
|
@@ -3,13 +3,11 @@ require 'intercom/traits/api_resource'
|
|
3
3
|
module Intercom
|
4
4
|
module ApiOperations
|
5
5
|
module Delete
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
self
|
6
|
+
def delete(object)
|
7
|
+
collection_name = Utils.resource_class_to_collection_name(collection_class)
|
8
|
+
@client.delete("/#{collection_name}/#{object.id}", {})
|
9
|
+
object
|
11
10
|
end
|
12
|
-
|
13
11
|
end
|
14
12
|
end
|
15
13
|
end
|
@@ -1,22 +1,16 @@
|
|
1
1
|
module Intercom
|
2
2
|
module ApiOperations
|
3
3
|
module Find
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
response = Intercom.get("/#{collection_name}", params)
|
12
|
-
end
|
13
|
-
raise Intercom::HttpError.new('Http Error - No response entity returned') unless response
|
14
|
-
from_api(response)
|
4
|
+
def find(params)
|
5
|
+
raise BadRequestError, "#{self}#find takes a hash as its parameter but you supplied #{params.inspect}" unless params.is_a? Hash
|
6
|
+
collection_name = Utils.resource_class_to_collection_name(collection_class)
|
7
|
+
if params[:id]
|
8
|
+
response = @client.get("/#{collection_name}/#{params[:id]}", {})
|
9
|
+
else
|
10
|
+
response = @client.get("/#{collection_name}", params)
|
15
11
|
end
|
16
|
-
|
17
|
-
|
18
|
-
def self.included(base)
|
19
|
-
base.extend(ClassMethods)
|
12
|
+
raise Intercom::HttpError.new('Http Error - No response entity returned') unless response
|
13
|
+
from_api(response)
|
20
14
|
end
|
21
15
|
end
|
22
16
|
end
|
@@ -1,32 +1,27 @@
|
|
1
|
-
require 'intercom/
|
1
|
+
require 'intercom/client_collection_proxy'
|
2
2
|
|
3
3
|
module Intercom
|
4
4
|
module ApiOperations
|
5
5
|
module FindAll
|
6
|
-
module ClassMethods
|
7
|
-
def find_all(params)
|
8
|
-
raise BadRequestError, "#{self}#find takes a hash as its parameter but you supplied #{params.inspect}" unless params.is_a? Hash
|
9
|
-
collection_name = Utils.resource_class_to_collection_name(self)
|
10
|
-
finder_details = {}
|
11
|
-
if params[:id] && !type_switched_finder?(params)
|
12
|
-
finder_details[:url] = "/#{collection_name}/#{params[:id]}"
|
13
|
-
finder_details[:params] = {}
|
14
|
-
else
|
15
|
-
finder_details[:url] = "/#{collection_name}"
|
16
|
-
finder_details[:params] = params
|
17
|
-
end
|
18
|
-
CollectionProxy.new(collection_name, finder_details)
|
19
|
-
end
|
20
|
-
|
21
|
-
private
|
22
6
|
|
23
|
-
|
24
|
-
|
7
|
+
def find_all(params)
|
8
|
+
raise BadRequestError, "#find takes a hash as its parameter but you supplied #{params.inspect}" unless params.is_a? Hash
|
9
|
+
collection_name = Utils.resource_class_to_collection_name(collection_class)
|
10
|
+
finder_details = {}
|
11
|
+
if params[:id] && !type_switched_finder?(params)
|
12
|
+
finder_details[:url] = "/#{collection_name}/#{params[:id]}"
|
13
|
+
finder_details[:params] = {}
|
14
|
+
else
|
15
|
+
finder_details[:url] = "/#{collection_name}"
|
16
|
+
finder_details[:params] = params
|
25
17
|
end
|
18
|
+
ClientCollectionProxy.new(collection_name, finder_details: finder_details, client: @client)
|
26
19
|
end
|
27
20
|
|
28
|
-
|
29
|
-
|
21
|
+
private
|
22
|
+
|
23
|
+
def type_switched_finder?(params)
|
24
|
+
params.include?(:type)
|
30
25
|
end
|
31
26
|
end
|
32
27
|
end
|
@@ -1,16 +1,10 @@
|
|
1
|
-
require 'intercom/
|
1
|
+
require 'intercom/client_collection_proxy'
|
2
2
|
|
3
3
|
module Intercom
|
4
4
|
module ApiOperations
|
5
|
-
module List
|
6
|
-
|
7
|
-
|
8
|
-
CollectionProxy.new(Utils.resource_class_to_collection_name(self))
|
9
|
-
end
|
10
|
-
end
|
11
|
-
|
12
|
-
def self.included(base)
|
13
|
-
base.extend(ClassMethods)
|
5
|
+
module List
|
6
|
+
def all
|
7
|
+
ClientCollectionProxy.new(Utils.resource_class_to_collection_name(collection_class), client: @client)
|
14
8
|
end
|
15
9
|
end
|
16
10
|
end
|
@@ -1,15 +1,15 @@
|
|
1
1
|
module Intercom
|
2
2
|
module ApiOperations
|
3
3
|
module Load
|
4
|
-
def load
|
5
|
-
collection_name = Utils.resource_class_to_collection_name(
|
6
|
-
if id
|
7
|
-
response =
|
4
|
+
def load(object)
|
5
|
+
collection_name = Utils.resource_class_to_collection_name(collection_class)
|
6
|
+
if object.id
|
7
|
+
response = @client.get("/#{collection_name}/#{object.id}", {})
|
8
8
|
else
|
9
|
-
raise "Cannot load #{
|
9
|
+
raise "Cannot load #{collection_class} as it does not have a valid id."
|
10
10
|
end
|
11
11
|
raise Intercom::HttpError.new('Http Error - No response entity returned') unless response
|
12
|
-
from_response(response)
|
12
|
+
object.from_response(response)
|
13
13
|
end
|
14
14
|
end
|
15
15
|
end
|
@@ -3,48 +3,43 @@ require 'intercom/traits/api_resource'
|
|
3
3
|
module Intercom
|
4
4
|
module ApiOperations
|
5
5
|
module Save
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
end
|
15
|
-
|
16
|
-
instance = self.new(params)
|
17
|
-
instance.mark_fields_as_changed!(params.keys)
|
18
|
-
instance.save
|
6
|
+
PARAMS_NOT_PROVIDED = Object.new
|
7
|
+
private_constant :PARAMS_NOT_PROVIDED
|
8
|
+
|
9
|
+
def create(params = PARAMS_NOT_PROVIDED)
|
10
|
+
if collection_class.ancestors.include?(Intercom::Contact) && params == PARAMS_NOT_PROVIDED
|
11
|
+
params = Hash.new
|
12
|
+
elsif params == PARAMS_NOT_PROVIDED
|
13
|
+
raise ArgumentError, '.create requires 1 parameter'
|
19
14
|
end
|
20
|
-
end
|
21
15
|
|
22
|
-
|
23
|
-
|
16
|
+
instance = collection_class.new(params)
|
17
|
+
instance.mark_fields_as_changed!(params.keys)
|
18
|
+
save(instance)
|
24
19
|
end
|
25
20
|
|
26
|
-
def save
|
27
|
-
collection_name = Utils.resource_class_to_collection_name(
|
28
|
-
if id_present? && !posted_updates?
|
29
|
-
response =
|
21
|
+
def save(object)
|
22
|
+
collection_name = Utils.resource_class_to_collection_name(collection_class)
|
23
|
+
if id_present?(object) && !posted_updates?(object)
|
24
|
+
response = @client.put("/#{collection_name}/#{id}", object.to_submittable_hash)
|
30
25
|
else
|
31
|
-
response =
|
26
|
+
response = @client.post("/#{collection_name}", object.to_submittable_hash.merge(identity_hash(object)))
|
32
27
|
end
|
33
|
-
from_response(response) if response # may be nil we received back a 202
|
28
|
+
object.from_response(response) if response # may be nil we received back a 202
|
34
29
|
end
|
35
30
|
|
36
|
-
def identity_hash
|
37
|
-
respond_to?(:identity_vars) ? SliceableHash.new(to_hash).slice(*(identity_vars.map(&:to_s))) : {}
|
31
|
+
def identity_hash(object)
|
32
|
+
object.respond_to?(:identity_vars) ? SliceableHash.new(object.to_hash).slice(*(object.identity_vars.map(&:to_s))) : {}
|
38
33
|
end
|
39
34
|
|
40
35
|
private
|
41
36
|
|
42
|
-
def id_present?
|
43
|
-
id && id.to_s != ''
|
37
|
+
def id_present?(object)
|
38
|
+
object.id && object.id.to_s != ''
|
44
39
|
end
|
45
40
|
|
46
|
-
def posted_updates?
|
47
|
-
respond_to?(:update_verb) && update_verb == 'post'
|
41
|
+
def posted_updates?(object)
|
42
|
+
object.respond_to?(:update_verb) && object.update_verb == 'post'
|
48
43
|
end
|
49
44
|
end
|
50
45
|
end
|
@@ -0,0 +1,95 @@
|
|
1
|
+
module Intercom
|
2
|
+
class Client
|
3
|
+
include Options
|
4
|
+
attr_reader :base_url, :rate_limit_details
|
5
|
+
|
6
|
+
class << self
|
7
|
+
def set_base_url(base_url)
|
8
|
+
return Proc.new do |o|
|
9
|
+
old_url = o.base_url
|
10
|
+
o.send(:base_url=, base_url)
|
11
|
+
Proc.new { |obj| set_base_url(old_url).call(o) }
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def initialize(app_id: 'my_app_id', api_key: 'my_api_key')
|
17
|
+
@app_id = app_id
|
18
|
+
@api_key = api_key
|
19
|
+
@base_url = 'https://api.intercom.io'
|
20
|
+
@rate_limit_details = {}
|
21
|
+
end
|
22
|
+
|
23
|
+
def admins
|
24
|
+
Intercom::Service::Admin.new(self)
|
25
|
+
end
|
26
|
+
|
27
|
+
def companies
|
28
|
+
Intercom::Service::Company.new(self)
|
29
|
+
end
|
30
|
+
|
31
|
+
def contacts
|
32
|
+
Intercom::Service::Contact.new(self)
|
33
|
+
end
|
34
|
+
|
35
|
+
def conversations
|
36
|
+
Intercom::Service::Conversation.new(self)
|
37
|
+
end
|
38
|
+
|
39
|
+
def events
|
40
|
+
Intercom::Service::Event.new(self)
|
41
|
+
end
|
42
|
+
|
43
|
+
def messages
|
44
|
+
Intercom::Service::Message.new(self)
|
45
|
+
end
|
46
|
+
|
47
|
+
def notes
|
48
|
+
Intercom::Service::Note.new(self)
|
49
|
+
end
|
50
|
+
|
51
|
+
def subscriptions
|
52
|
+
Intercom::Service::Subscription.new(self)
|
53
|
+
end
|
54
|
+
|
55
|
+
def segments
|
56
|
+
Intercom::Service::Segment.new(self)
|
57
|
+
end
|
58
|
+
|
59
|
+
def tags
|
60
|
+
Intercom::Service::Tag.new(self)
|
61
|
+
end
|
62
|
+
|
63
|
+
def users
|
64
|
+
Intercom::Service::User.new(self)
|
65
|
+
end
|
66
|
+
|
67
|
+
def get(path, params)
|
68
|
+
execute_request Intercom::Request.get(path, params)
|
69
|
+
end
|
70
|
+
|
71
|
+
def post(path, payload_hash)
|
72
|
+
execute_request Intercom::Request.post(path, payload_hash)
|
73
|
+
end
|
74
|
+
|
75
|
+
def put(path, payload_hash)
|
76
|
+
execute_request Intercom::Request.put(path, payload_hash)
|
77
|
+
end
|
78
|
+
|
79
|
+
def delete(path, payload_hash)
|
80
|
+
execute_request Intercom::Request.delete(path, payload_hash)
|
81
|
+
end
|
82
|
+
|
83
|
+
private
|
84
|
+
|
85
|
+
def execute_request(request)
|
86
|
+
result = request.execute(@base_url, username: @app_id, secret: @api_key)
|
87
|
+
@rate_limit_details = request.rate_limit_details
|
88
|
+
result
|
89
|
+
end
|
90
|
+
|
91
|
+
def base_url=(new_url)
|
92
|
+
@base_url = new_url
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
@@ -2,24 +2,25 @@ require "intercom/utils"
|
|
2
2
|
require "ext/sliceable_hash"
|
3
3
|
|
4
4
|
module Intercom
|
5
|
-
class
|
5
|
+
class ClientCollectionProxy
|
6
6
|
|
7
7
|
attr_reader :resource_name
|
8
8
|
|
9
|
-
def initialize(resource_name, finder_details
|
9
|
+
def initialize(resource_name, finder_details: {}, client: client)
|
10
10
|
@resource_name = resource_name
|
11
11
|
@resource_class = Utils.constantize_resource_name(resource_name)
|
12
12
|
@finder_url = (finder_details[:url] || "/#{@resource_name}")
|
13
13
|
@finder_params = (finder_details[:params] || {})
|
14
|
+
@client = client
|
14
15
|
end
|
15
16
|
|
16
17
|
def each(&block)
|
17
18
|
next_page = nil
|
18
19
|
loop do
|
19
20
|
if next_page
|
20
|
-
response_hash =
|
21
|
+
response_hash = @client.get(next_page, {})
|
21
22
|
else
|
22
|
-
response_hash =
|
23
|
+
response_hash = @client.get(@finder_url, @finder_params)
|
23
24
|
end
|
24
25
|
raise Intercom::HttpError.new('Http Error - No response entity returned') unless response_hash
|
25
26
|
deserialize_response_hash(response_hash, block)
|
@@ -38,10 +39,6 @@ module Intercom
|
|
38
39
|
|
39
40
|
include Enumerable
|
40
41
|
|
41
|
-
def count
|
42
|
-
raise NoMethodError, "undefined method `count' for #{self.class}. Consider using the dedicated Intercom::Count interface if suitable"
|
43
|
-
end
|
44
|
-
|
45
42
|
private
|
46
43
|
|
47
44
|
def resource_class; @resource_class; end
|
data/lib/intercom/company.rb
CHANGED
@@ -1,24 +1,8 @@
|
|
1
|
-
require 'intercom/api_operations/count'
|
2
|
-
require 'intercom/api_operations/list'
|
3
|
-
require 'intercom/api_operations/find'
|
4
|
-
require 'intercom/api_operations/find_all'
|
5
|
-
require 'intercom/api_operations/save'
|
6
|
-
require 'intercom/api_operations/load'
|
7
|
-
require 'intercom/extended_api_operations/users'
|
8
|
-
require 'intercom/extended_api_operations/tags'
|
9
1
|
require 'intercom/traits/incrementable_attributes'
|
10
2
|
require 'intercom/traits/api_resource'
|
11
3
|
|
12
4
|
module Intercom
|
13
5
|
class Company
|
14
|
-
include ApiOperations::Count
|
15
|
-
include ApiOperations::List
|
16
|
-
include ApiOperations::Find
|
17
|
-
include ApiOperations::FindAll
|
18
|
-
include ApiOperations::Save
|
19
|
-
include ApiOperations::Load
|
20
|
-
include ExtendedApiOperations::Users
|
21
|
-
include ExtendedApiOperations::Tags
|
22
6
|
include Traits::IncrementableAttributes
|
23
7
|
include Traits::ApiResource
|
24
8
|
|
data/lib/intercom/contact.rb
CHANGED
@@ -1,18 +1,7 @@
|
|
1
|
-
require 'intercom/api_operations/count'
|
2
|
-
require 'intercom/api_operations/load'
|
3
|
-
require 'intercom/api_operations/find'
|
4
|
-
require 'intercom/api_operations/find_all'
|
5
|
-
require 'intercom/api_operations/save'
|
6
|
-
require 'intercom/api_operations/convert'
|
7
1
|
require 'intercom/traits/api_resource'
|
8
2
|
|
9
3
|
module Intercom
|
10
4
|
class Contact
|
11
|
-
include ApiOperations::Load
|
12
|
-
include ApiOperations::Find
|
13
|
-
include ApiOperations::FindAll
|
14
|
-
include ApiOperations::Save
|
15
|
-
include ApiOperations::Convert
|
16
5
|
include Traits::ApiResource
|
17
6
|
|
18
7
|
def identity_vars ; [:email, :user_id] ; end
|
@@ -1,17 +1,7 @@
|
|
1
|
-
require 'intercom/extended_api_operations/reply'
|
2
|
-
require 'intercom/api_operations/find_all'
|
3
|
-
require 'intercom/api_operations/find'
|
4
|
-
require 'intercom/api_operations/load'
|
5
|
-
require 'intercom/api_operations/save'
|
6
1
|
require 'intercom/traits/api_resource'
|
7
2
|
|
8
3
|
module Intercom
|
9
4
|
class Conversation
|
10
|
-
include ExtendedApiOperations::Reply
|
11
|
-
include ApiOperations::FindAll
|
12
|
-
include ApiOperations::Find
|
13
|
-
include ApiOperations::Load
|
14
|
-
include ApiOperations::Save
|
15
5
|
include Traits::ApiResource
|
16
6
|
end
|
17
7
|
end
|