intercom 0.1.7 → 0.1.8
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.
- data/changes.txt +3 -0
- data/lib/intercom/hashable_object.rb +17 -0
- data/lib/intercom/requires_parameters.rb +10 -0
- data/lib/intercom/tag.rb +18 -50
- data/lib/intercom/user.rb +18 -0
- data/lib/intercom/user_collection_proxy.rb +10 -1
- data/lib/intercom/user_resource.rb +2 -5
- data/lib/intercom/version.rb +1 -1
- data/spec/spec_helper.rb +3 -4
- data/spec/unit/intercom/tag_spec.rb +2 -1
- data/spec/unit/intercom/user_collection_proxy_spec.rb +14 -0
- metadata +4 -2
data/changes.txt
CHANGED
@@ -0,0 +1,17 @@
|
|
1
|
+
module Intercom
|
2
|
+
module HashableObject
|
3
|
+
def from_hash(hash)
|
4
|
+
hash.each do |key,value|
|
5
|
+
setter_method = "#{key.to_s}="
|
6
|
+
self.send(setter_method, value) if self.respond_to?(setter_method)
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
def to_hash
|
11
|
+
instance_variables.inject({}) do |hash, var|
|
12
|
+
hash[var.to_s.delete("@").to_sym] = instance_variable_get(var)
|
13
|
+
hash
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
module Intercom
|
2
|
+
module RequiresParameters
|
3
|
+
|
4
|
+
def requires_parameters(parameters, required)
|
5
|
+
missing = Array(required) - parameters.keys.map(&:to_s)
|
6
|
+
raise ArgumentError.new("Missing required parameters (#{missing.join(', ')}).") unless missing.empty?
|
7
|
+
end
|
8
|
+
|
9
|
+
end
|
10
|
+
end
|
data/lib/intercom/tag.rb
CHANGED
@@ -1,11 +1,12 @@
|
|
1
|
-
require 'intercom/
|
1
|
+
require 'intercom/requires_parameters'
|
2
|
+
require 'intercom/hashable_object'
|
2
3
|
|
3
4
|
module Intercom
|
4
5
|
|
5
6
|
##
|
6
7
|
# Represents a tag
|
7
8
|
#
|
8
|
-
# A tag consists of a name, and (optionally) a color and users that you would like to tag.
|
9
|
+
# A tag consists of a name, and (optionally) a color and users that you would like to tag. Returns details about the tag and a count of the number of users currently tagged.
|
9
10
|
#
|
10
11
|
# == Examples
|
11
12
|
#
|
@@ -27,17 +28,27 @@ module Intercom
|
|
27
28
|
# tag.tag_or_untag = "untag"
|
28
29
|
# tag.save
|
29
30
|
|
30
|
-
class Tag
|
31
|
+
class Tag
|
32
|
+
extend RequiresParameters
|
33
|
+
include HashableObject
|
34
|
+
|
35
|
+
attr_accessor :name, :color, :user_ids, :emails, :tag_or_untag, :segment, :tagged_user_count, :id
|
31
36
|
|
32
37
|
def initialize(attributes={})
|
33
|
-
|
38
|
+
from_hash(attributes)
|
34
39
|
end
|
35
40
|
|
36
41
|
##
|
37
42
|
# Finds a Tag using params
|
38
43
|
def self.find(params)
|
39
44
|
response = Intercom.get("/v1/tags", params)
|
40
|
-
|
45
|
+
from_api(response)
|
46
|
+
end
|
47
|
+
|
48
|
+
def self.from_api(api_response)
|
49
|
+
tag = Tag.new
|
50
|
+
tag.from_hash(api_response)
|
51
|
+
tag
|
41
52
|
end
|
42
53
|
|
43
54
|
##
|
@@ -58,51 +69,8 @@ module Intercom
|
|
58
69
|
# Saves a Tag on your application
|
59
70
|
def save
|
60
71
|
response = Intercom.post("/v1/tags", to_hash)
|
61
|
-
self.
|
72
|
+
self.from_hash(response)
|
73
|
+
self
|
62
74
|
end
|
63
|
-
|
64
|
-
##
|
65
|
-
# The name of the tag
|
66
|
-
def name=(name)
|
67
|
-
@attributes["name"] = name
|
68
|
-
end
|
69
|
-
|
70
|
-
##
|
71
|
-
# The color of the tag
|
72
|
-
def color=(color)
|
73
|
-
@attributes["color"] = color
|
74
|
-
end
|
75
|
-
|
76
|
-
##
|
77
|
-
# An array of user_ids of the users you'd like to tag or untag
|
78
|
-
def user_ids
|
79
|
-
@attributes["user_ids"] ||= []
|
80
|
-
end
|
81
|
-
|
82
|
-
##
|
83
|
-
# An array of user_ids of the users you'd like to tag or untag
|
84
|
-
def emails
|
85
|
-
@attributes["emails"] ||= []
|
86
|
-
end
|
87
|
-
|
88
|
-
##
|
89
|
-
# An array of user_ids of the users you'd like to tag or untag
|
90
|
-
def user_ids=(user_ids)
|
91
|
-
@attributes["user_ids"] = user_ids
|
92
|
-
end
|
93
|
-
|
94
|
-
##
|
95
|
-
# An array of emails of the users you'd like to tag or untag
|
96
|
-
def emails=(emails)
|
97
|
-
@attributes["emails"] = emails
|
98
|
-
end
|
99
|
-
|
100
|
-
##
|
101
|
-
# A string to specify whether to tag or untag the specified users, can be left out if only creating a new tag.
|
102
|
-
def tag_or_untag=(tag_or_untag)
|
103
|
-
return unless ["tag", "untag"].include?(tag_or_untag)
|
104
|
-
@attributes["tag_or_untag"] = tag_or_untag
|
105
|
-
end
|
106
|
-
|
107
75
|
end
|
108
76
|
end
|
data/lib/intercom/user.rb
CHANGED
@@ -21,6 +21,8 @@ module Intercom
|
|
21
21
|
# user.custom_data["number_of_applications"] = 11
|
22
22
|
# user.save
|
23
23
|
class User < UserResource
|
24
|
+
|
25
|
+
|
24
26
|
##
|
25
27
|
# Fetches an Intercom::User from our API.
|
26
28
|
#
|
@@ -80,6 +82,22 @@ module Intercom
|
|
80
82
|
UserCollectionProxy.new
|
81
83
|
end
|
82
84
|
|
85
|
+
# Retrieve all the users that match a query
|
86
|
+
# Examples:
|
87
|
+
# Intercom::User.where(:tag_name => 'Free Trial').each do |user|
|
88
|
+
# puts user.inspect
|
89
|
+
# end
|
90
|
+
# > ["user1@example.com" ,"user2@example.com" ,....]
|
91
|
+
# Intercom::User.where(:tag_name => 'Free Trial').map(&:email)
|
92
|
+
# > ["user1@example.com" ,"user2@example.com" ,....]
|
93
|
+
#
|
94
|
+
# Currently only supports tag_name and tag_id querying
|
95
|
+
#
|
96
|
+
# @return [UserCollectionProxy]
|
97
|
+
def self.where(params)
|
98
|
+
UserCollectionProxy.new(params)
|
99
|
+
end
|
100
|
+
|
83
101
|
# Fetches a count of all Users tracked on Intercom.
|
84
102
|
# Example:
|
85
103
|
# Intercom::User.all.count
|
@@ -14,13 +14,22 @@ module Intercom
|
|
14
14
|
# end
|
15
15
|
#
|
16
16
|
class UserCollectionProxy
|
17
|
+
|
18
|
+
QUERYABLE_ATTRIBUTES = [:tag_id, :tag_name]
|
19
|
+
|
20
|
+
attr_accessor :query
|
21
|
+
|
22
|
+
def initialize(attributes={})
|
23
|
+
self.query = attributes.reject{ |key, value| !QUERYABLE_ATTRIBUTES.include?(key) }
|
24
|
+
end
|
25
|
+
|
17
26
|
# yields each {User} to the block provided
|
18
27
|
# @return [void]
|
19
28
|
def each(&block)
|
20
29
|
page = 1
|
21
30
|
fetch_another_page = true
|
22
31
|
while fetch_another_page
|
23
|
-
current_page = Intercom.get("/v1/users", {:page => page})
|
32
|
+
current_page = Intercom.get("/v1/users", query.merge({:page => page}))
|
24
33
|
current_page["users"].each do |user|
|
25
34
|
block.call User.from_api(user)
|
26
35
|
end
|
@@ -1,8 +1,10 @@
|
|
1
1
|
require 'intercom/unix_timestamp_unwrapper'
|
2
|
+
require 'intercom/requires_parameters'
|
2
3
|
|
3
4
|
module Intercom
|
4
5
|
# Base class for resources tied off a {User}, all of which are scoped by either the users :email or :user_id.
|
5
6
|
class UserResource
|
7
|
+
extend RequiresParameters
|
6
8
|
include UnixTimestampUnwrapper
|
7
9
|
|
8
10
|
def initialize(attributes={})
|
@@ -76,10 +78,5 @@ module Intercom
|
|
76
78
|
return @attributes[method.to_s] if @attributes.has_key?(method.to_s)
|
77
79
|
super
|
78
80
|
end
|
79
|
-
|
80
|
-
def self.requires_parameters(parameters, required)
|
81
|
-
missing = Array(required) - parameters.keys.map(&:to_s)
|
82
|
-
raise ArgumentError.new("Missing required parameters (#{missing.join(', ')}).") unless missing.empty?
|
83
|
-
end
|
84
81
|
end
|
85
82
|
end
|
data/lib/intercom/version.rb
CHANGED
data/spec/spec_helper.rb
CHANGED
@@ -90,12 +90,11 @@ end
|
|
90
90
|
|
91
91
|
def test_tag
|
92
92
|
{
|
93
|
+
"id" => "4f73428b5e4dfc000b000112",
|
93
94
|
"name" => "Test Tag",
|
94
95
|
"color" => "red",
|
95
|
-
"
|
96
|
-
|
97
|
-
{"email" => "tom@example.com", "user_id" => "def456"}
|
98
|
-
]
|
96
|
+
"segment" => false,
|
97
|
+
"tagged_user_count" => 2
|
99
98
|
}
|
100
99
|
end
|
101
100
|
|
@@ -27,6 +27,7 @@ describe "Intercom::Tag" do
|
|
27
27
|
tag = Intercom::Tag.create(:name => "Test Tag", :color => "red", :user_ids => ["abc123", "def456"], :tag_or_untag => "tag")
|
28
28
|
tag.name.must_equal "Test Tag"
|
29
29
|
tag.color.must_equal "red"
|
30
|
-
tag.
|
30
|
+
tag.tagged_user_count.must_equal 2
|
31
31
|
end
|
32
|
+
|
32
33
|
end
|
@@ -12,6 +12,20 @@ describe Intercom::UserCollectionProxy do
|
|
12
12
|
emails.must_equal %W(user1@example.com user2@example.com user3@example.com)
|
13
13
|
end
|
14
14
|
|
15
|
+
it "supports querying for tagged users" do
|
16
|
+
Intercom.expects(:get).with("/v1/users", {:tag_id => "1234", :page => 1}).returns(page_of_users)
|
17
|
+
emails = []
|
18
|
+
Intercom::User.where(:tag_id => '1234').each { |user| emails << user.email }
|
19
|
+
emails.must_equal %W(user1@example.com user2@example.com user3@example.com)
|
20
|
+
end
|
21
|
+
|
22
|
+
it "should only pass whitelisted attributes to collection query" do
|
23
|
+
Intercom.expects(:get).with("/v1/users", {:tag_name => '1234', :page => 1}).returns(page_of_users)
|
24
|
+
emails = []
|
25
|
+
Intercom::User.where(:danger_zone => 'BOOM', :tag_name => '1234').each { |user| emails << user.email }
|
26
|
+
emails.must_equal %W(user1@example.com user2@example.com user3@example.com)
|
27
|
+
end
|
28
|
+
|
15
29
|
it "supports map" do
|
16
30
|
Intercom.expects(:get).with("/v1/users", {:page => 1}).returns(page_of_users).twice
|
17
31
|
Intercom::User.all.map { |user| user.email }.must_equal %W(user1@example.com user2@example.com user3@example.com)
|
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: 0.1.
|
4
|
+
version: 0.1.8
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -13,7 +13,7 @@ authors:
|
|
13
13
|
autorequire:
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
|
-
date: 2013-04-
|
16
|
+
date: 2013-04-09 00:00:00.000000000 Z
|
17
17
|
dependencies:
|
18
18
|
- !ruby/object:Gem::Dependency
|
19
19
|
name: minitest
|
@@ -87,10 +87,12 @@ files:
|
|
87
87
|
- lib/data/cacert.pem
|
88
88
|
- lib/intercom.rb
|
89
89
|
- lib/intercom/flat_store.rb
|
90
|
+
- lib/intercom/hashable_object.rb
|
90
91
|
- lib/intercom/impression.rb
|
91
92
|
- lib/intercom/message_thread.rb
|
92
93
|
- lib/intercom/note.rb
|
93
94
|
- lib/intercom/request.rb
|
95
|
+
- lib/intercom/requires_parameters.rb
|
94
96
|
- lib/intercom/social_profile.rb
|
95
97
|
- lib/intercom/tag.rb
|
96
98
|
- lib/intercom/unix_timestamp_unwrapper.rb
|