intercom 0.1.7 → 0.1.8
Sign up to get free protection for your applications and to get access to all the features.
- 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
|