intercom 2.5.4 → 3.0.0b1
Sign up to get free protection for your applications and to get access to all the features.
- 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
@@ -1,16 +0,0 @@
|
|
1
|
-
module Intercom
|
2
|
-
module ApiOperations
|
3
|
-
module Count
|
4
|
-
module ClassMethods
|
5
|
-
def count
|
6
|
-
singular_resource_name = Utils.resource_class_to_singular_name(self)
|
7
|
-
Intercom::Count.send("#{singular_resource_name}_count")
|
8
|
-
end
|
9
|
-
end
|
10
|
-
|
11
|
-
def self.included(base)
|
12
|
-
base.extend(ClassMethods)
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|
data/lib/intercom/count.rb
DELETED
@@ -1,21 +0,0 @@
|
|
1
|
-
require 'intercom/traits/api_resource'
|
2
|
-
require 'intercom/api_operations/find'
|
3
|
-
require 'intercom/traits/generic_handler_binding'
|
4
|
-
require 'intercom/generic_handlers/count'
|
5
|
-
|
6
|
-
module Intercom
|
7
|
-
class Count
|
8
|
-
include ApiOperations::Find
|
9
|
-
include Traits::ApiResource
|
10
|
-
include Traits::GenericHandlerBinding
|
11
|
-
include GenericHandlers::Count
|
12
|
-
|
13
|
-
def self.fetch_for_app
|
14
|
-
Intercom::Count.find({})
|
15
|
-
end
|
16
|
-
|
17
|
-
def self.fetch_broken_down_count(entity_to_count, count_context)
|
18
|
-
Intercom::Count.find(:type => entity_to_count, :count => count_context)
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
@@ -1,16 +0,0 @@
|
|
1
|
-
require 'intercom/traits/api_resource'
|
2
|
-
|
3
|
-
module Intercom
|
4
|
-
module ExtendedApiOperations
|
5
|
-
module Reply
|
6
|
-
|
7
|
-
def reply(reply_data)
|
8
|
-
collection_name = Utils.resource_class_to_collection_name(self.class)
|
9
|
-
# TODO: For server, we should not need to merge in :conversation_id here (already in the URL)
|
10
|
-
response = Intercom.post("/#{collection_name}/#{id}/reply", reply_data.merge(:conversation_id => id))
|
11
|
-
from_response(response)
|
12
|
-
end
|
13
|
-
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|
@@ -1,22 +0,0 @@
|
|
1
|
-
module Intercom
|
2
|
-
module GenericHandlers
|
3
|
-
class BaseHandler
|
4
|
-
attr_reader :method_sym, :arguments, :entity
|
5
|
-
|
6
|
-
def initialize(method_sym, arguments, entity)
|
7
|
-
@method_sym = method_sym
|
8
|
-
@arguments = arguments
|
9
|
-
@entity = entity
|
10
|
-
end
|
11
|
-
|
12
|
-
def method_string
|
13
|
-
method_sym.to_s
|
14
|
-
end
|
15
|
-
|
16
|
-
def raise_no_method_missing_handler
|
17
|
-
raise Intercom::NoMethodMissingHandler, "Could not handle '#{method_string}'"
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
end
|
22
|
-
end
|
@@ -1,59 +0,0 @@
|
|
1
|
-
require 'intercom/generic_handlers/base_handler'
|
2
|
-
|
3
|
-
module Intercom
|
4
|
-
module GenericHandlers
|
5
|
-
module Count
|
6
|
-
module ClassMethods
|
7
|
-
def generic_count(method_sym, *arguments, &block)
|
8
|
-
|
9
|
-
handler_class = Class.new(GenericHandlers::BaseHandler) do
|
10
|
-
def handle
|
11
|
-
match = method_string.match(GenericHandlers::Count.count_breakdown_matcher)
|
12
|
-
if match && match[1] && match[2] && match[3].nil?
|
13
|
-
do_broken_down_count(match[1], match[2])
|
14
|
-
elsif method_string.end_with? '_count'
|
15
|
-
return do_count
|
16
|
-
else
|
17
|
-
raise_no_method_missing_handler
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
private
|
22
|
-
|
23
|
-
def do_count
|
24
|
-
entity.fetch_for_app.send(appwide_entity_to_count)['count']
|
25
|
-
rescue Intercom::AttributeNotSetError
|
26
|
-
# Indicates this this kind of counting is not supported
|
27
|
-
raise_no_method_missing_handler
|
28
|
-
end
|
29
|
-
|
30
|
-
def do_broken_down_count(entity_to_count, count_context)
|
31
|
-
result = entity.fetch_broken_down_count(entity_to_count, count_context)
|
32
|
-
result.send(entity_to_count)[count_context]
|
33
|
-
rescue Intercom::BadRequestError => ex
|
34
|
-
# Indicates this this kind of counting is not supported
|
35
|
-
ex.application_error_code == 'parameter_invalid' ? raise_no_method_missing_handler : raise
|
36
|
-
end
|
37
|
-
|
38
|
-
def appwide_entity_to_count; method_string.gsub(/_count$/, ''); end
|
39
|
-
end
|
40
|
-
|
41
|
-
handler_class.new(method_sym, arguments, self).handle
|
42
|
-
end
|
43
|
-
|
44
|
-
end
|
45
|
-
|
46
|
-
def self.count_breakdown_matcher
|
47
|
-
/([[:alnum:]]+)_counts_for_each_([[:alnum:]]+)/
|
48
|
-
end
|
49
|
-
|
50
|
-
def self.handles_method?(method_sym)
|
51
|
-
method_sym.to_s.end_with? '_count' or method_sym.to_s.match(count_breakdown_matcher)
|
52
|
-
end
|
53
|
-
|
54
|
-
def self.included(base)
|
55
|
-
base.extend(ClassMethods)
|
56
|
-
end
|
57
|
-
end
|
58
|
-
end
|
59
|
-
end
|
@@ -1,71 +0,0 @@
|
|
1
|
-
require 'intercom/generic_handlers/base_handler'
|
2
|
-
|
3
|
-
module Intercom
|
4
|
-
module GenericHandlers
|
5
|
-
module Tag
|
6
|
-
module ClassMethods
|
7
|
-
def generic_tag(method_sym, *arguments, &block)
|
8
|
-
|
9
|
-
handler_class = Class.new(GenericHandlers::BaseHandler) do
|
10
|
-
def handle
|
11
|
-
if method_string.start_with? 'tag_'
|
12
|
-
return do_tagging
|
13
|
-
elsif method_string.start_with? 'untag_'
|
14
|
-
return do_untagging
|
15
|
-
else
|
16
|
-
raise_no_method_missing_handler
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
private
|
21
|
-
|
22
|
-
def do_tagging
|
23
|
-
entity.create(:name => arguments[0], tagging_context.to_sym => tag_object_list(arguments))
|
24
|
-
end
|
25
|
-
|
26
|
-
def do_untagging
|
27
|
-
current_tag = find_tag(arguments[0])
|
28
|
-
return untag_via_save(current_tag) if current_tag
|
29
|
-
end
|
30
|
-
|
31
|
-
def find_tag(name_arg)
|
32
|
-
Intercom::Tag.find(:name => name_arg)
|
33
|
-
rescue Intercom::ResourceNotFound
|
34
|
-
return nil # Ignore if tag has since been deleted
|
35
|
-
end
|
36
|
-
|
37
|
-
def untag_via_save(current_tag)
|
38
|
-
current_tag.name = arguments[0]
|
39
|
-
current_tag.send("#{untagging_context}=", untag_object_list(arguments))
|
40
|
-
current_tag.save
|
41
|
-
end
|
42
|
-
|
43
|
-
def tag_object_list(args)
|
44
|
-
args[1].map { |id| { :id => id } }
|
45
|
-
end
|
46
|
-
|
47
|
-
def untag_object_list(args)
|
48
|
-
to_tag = tag_object_list(args)
|
49
|
-
to_tag.map { |tag_object| tag_object[:untag] = true }
|
50
|
-
to_tag
|
51
|
-
end
|
52
|
-
|
53
|
-
def tagging_context; method_string.gsub(/^tag_/, ''); end
|
54
|
-
def untagging_context; method_string.gsub(/^untag_/, ''); end
|
55
|
-
end
|
56
|
-
|
57
|
-
handler_class.new(method_sym, arguments, self).handle
|
58
|
-
end
|
59
|
-
|
60
|
-
end
|
61
|
-
|
62
|
-
def self.handles_method?(method_sym)
|
63
|
-
method_sym.to_s.start_with?('tag_') || method_sym.to_s.start_with?('untag_')
|
64
|
-
end
|
65
|
-
|
66
|
-
def self.included(base)
|
67
|
-
base.extend(ClassMethods)
|
68
|
-
end
|
69
|
-
end
|
70
|
-
end
|
71
|
-
end
|
@@ -1,47 +0,0 @@
|
|
1
|
-
require 'intercom/generic_handlers/base_handler'
|
2
|
-
|
3
|
-
module Intercom
|
4
|
-
module GenericHandlers
|
5
|
-
module TagFindAll
|
6
|
-
module ClassMethods
|
7
|
-
def generic_tag_find_all(method_sym, *arguments, &block)
|
8
|
-
|
9
|
-
handler_class = Class.new(GenericHandlers::BaseHandler) do
|
10
|
-
def handle
|
11
|
-
if method_string.start_with? 'find_all_for_'
|
12
|
-
return do_tag_find_all
|
13
|
-
else
|
14
|
-
raise_no_method_missing_handler
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
|
-
private
|
19
|
-
|
20
|
-
def do_tag_find_all
|
21
|
-
Intercom::Tag.find_all(cleaned_arguments.merge(:taggable_type => Utils.singularize(context)))
|
22
|
-
end
|
23
|
-
|
24
|
-
def cleaned_arguments
|
25
|
-
cleaned_args = arguments[0]
|
26
|
-
cleaned_args[:taggable_id] = cleaned_args.delete(:id) if cleaned_args.has_key?(:id)
|
27
|
-
cleaned_args
|
28
|
-
end
|
29
|
-
|
30
|
-
def context; method_string.gsub(/^find_all_for_/, ''); end
|
31
|
-
end
|
32
|
-
|
33
|
-
handler_class.new(method_sym, arguments, self).handle
|
34
|
-
end
|
35
|
-
|
36
|
-
end
|
37
|
-
|
38
|
-
def self.handles_method?(method_sym)
|
39
|
-
method_sym.to_s.start_with? 'find_all_for_'
|
40
|
-
end
|
41
|
-
|
42
|
-
def self.included(base)
|
43
|
-
base.extend(ClassMethods)
|
44
|
-
end
|
45
|
-
end
|
46
|
-
end
|
47
|
-
end
|
@@ -1,29 +0,0 @@
|
|
1
|
-
module Intercom
|
2
|
-
module Traits
|
3
|
-
|
4
|
-
# Allows us to have one class level method missing handler across all entities
|
5
|
-
# which can dispatch to the appropriate function based on the method name
|
6
|
-
module GenericHandlerBinding
|
7
|
-
|
8
|
-
module ClassMethods
|
9
|
-
def method_missing(method_sym, *arguments, &block)
|
10
|
-
if respond_to? :generic_tag and GenericHandlers::Tag.handles_method?(method_sym)
|
11
|
-
return generic_tag(method_sym, *arguments, block)
|
12
|
-
elsif respond_to? :generic_tag_find_all and GenericHandlers::TagFindAll.handles_method?(method_sym)
|
13
|
-
return generic_tag_find_all(method_sym, *arguments, block)
|
14
|
-
elsif respond_to? :generic_count and GenericHandlers::Count.handles_method?(method_sym)
|
15
|
-
return generic_count(method_sym, *arguments, block)
|
16
|
-
end
|
17
|
-
super
|
18
|
-
rescue Intercom::NoMethodMissingHandler
|
19
|
-
super
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
def self.included(base)
|
24
|
-
base.extend(ClassMethods)
|
25
|
-
end
|
26
|
-
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|
@@ -1,34 +0,0 @@
|
|
1
|
-
require "spec_helper"
|
2
|
-
|
3
|
-
describe Intercom::CollectionProxy do
|
4
|
-
|
5
|
-
it "stops iterating if no next link" do
|
6
|
-
Intercom.expects(:get).with("/users", {}).returns(page_of_users(false))
|
7
|
-
emails = []
|
8
|
-
Intercom::User.all.each { |user| emails << user.email }
|
9
|
-
emails.must_equal %W(user1@example.com user2@example.com user3@example.com)
|
10
|
-
end
|
11
|
-
|
12
|
-
it "keeps iterating if next link" do
|
13
|
-
Intercom.expects(:get).with("/users", {}).returns(page_of_users(true))
|
14
|
-
Intercom.expects(:get).with('https://api.intercom.io/users?per_page=50&page=2', {}).returns(page_of_users(false))
|
15
|
-
emails = []
|
16
|
-
Intercom::User.all.each { |user| emails << user.email }
|
17
|
-
end
|
18
|
-
|
19
|
-
it "supports indexed array access" do
|
20
|
-
Intercom.expects(:get).with("/users", {}).returns(page_of_users(false))
|
21
|
-
Intercom::User.all[0].email.must_equal 'user1@example.com'
|
22
|
-
end
|
23
|
-
|
24
|
-
it "supports map" do
|
25
|
-
Intercom.expects(:get).with("/users", {}).returns(page_of_users(false))
|
26
|
-
emails = Intercom::User.all.map { |user| user.email }
|
27
|
-
emails.must_equal %W(user1@example.com user2@example.com user3@example.com)
|
28
|
-
end
|
29
|
-
|
30
|
-
it "supports querying" do
|
31
|
-
Intercom.expects(:get).with("/users", {:tag_name => 'Taggart J'}).returns(page_of_users(false))
|
32
|
-
Intercom::User.find_all(:tag_name => 'Taggart J').map(&:email).must_equal %W(user1@example.com user2@example.com user3@example.com)
|
33
|
-
end
|
34
|
-
end
|
@@ -1,68 +0,0 @@
|
|
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 User 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 Conversation" do
|
31
|
-
payload = Intercom::Notification.new(test_conversation_notification)
|
32
|
-
payload.model_type.must_equal Intercom::Conversation
|
33
|
-
end
|
34
|
-
|
35
|
-
it "returns correct Conversation 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
|
-
it "returns inner User object with nil tags" do
|
46
|
-
user_notification = {
|
47
|
-
"type" => "notification_event",
|
48
|
-
"app_id" => "aa11aa",
|
49
|
-
"data" => {
|
50
|
-
"type" => "notification_event_data",
|
51
|
-
"item" => {
|
52
|
-
"type" => "user",
|
53
|
-
"id" => "abc123def",
|
54
|
-
"user_id" => "666",
|
55
|
-
"email" => "joe@example.com",
|
56
|
-
"name" => "Joe",
|
57
|
-
"tags" => {
|
58
|
-
"type" => "tag.list",
|
59
|
-
"tags" => nil
|
60
|
-
}
|
61
|
-
}
|
62
|
-
},
|
63
|
-
}
|
64
|
-
payload = Intercom::Notification.new(user_notification)
|
65
|
-
payload.model.tags.must_equal([])
|
66
|
-
end
|
67
|
-
|
68
|
-
end
|