intercom 0.1.19 → 0.2.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e0f05d2c37716b065556503a2b8f4db41bb80431
4
- data.tar.gz: f0ab697881c32c597a7ab7a176936f3f9b0e327d
3
+ metadata.gz: 4283247105b0839f88ceccb190267097afc7a811
4
+ data.tar.gz: 82c9527868644929a6df8449a738815eef91a848
5
5
  SHA512:
6
- metadata.gz: fe1d59e7f7aa6b898803b3a49649524d8de5fdb718996d9b86af0b70d98f29de67ecc988e47ae501ae1aeb95024892669757e6c06685a9f8150b3496b9a9379e
7
- data.tar.gz: e0490f3a22078191de4d259c558181cc12871e183665b481aabc90600ceb5b5747e706bc0399ee62a23152bdde804d4aec98710583402645a5c0f2ef02df3024
6
+ metadata.gz: cf0d49c2e3d446f37ee45a0896efa479caa196927a6439fd100210c3236bb680fa89df935330540d42178cb32316e73a25eb286ed8803dfc3289a69ce60c3bd6
7
+ data.tar.gz: 5710c4604f076ad7e5ffadb6f54aab2f0c8d99d9666b9e37bf6b7c9b28c465dcdd46bff2b722fc38714ec3515b51de4f5e3f077c467205555a6144e6b0d6c20d
data/changes.txt CHANGED
@@ -1,3 +1,6 @@
1
+ 0.2.0
2
+ - Add UserEvents.
3
+
1
4
  0.1.19
2
5
  - Update DELETE request to fix issue.
3
6
 
@@ -62,7 +62,7 @@ module Intercom
62
62
  response = http.request(net_http_method)
63
63
  raise_errors_on_failure(response)
64
64
  decoded = decode(response['content-encoding'], response.body)
65
- JSON.parse(decoded)
65
+ JSON.parse(decoded) unless decoded.empty?
66
66
  end
67
67
  rescue Timeout::Error
68
68
  raise Intercom::ServiceUnavailableError
data/lib/intercom/user.rb CHANGED
@@ -335,6 +335,16 @@ module Intercom
335
335
  raise ArgumentError.new("Companies requires an array of hashes of companies") unless companies.is_a?(Array) && companies.all? {|company| company.is_a?(Hash)}
336
336
  @attributes["companies"] = companies.collect {|company| FlatStore.new(company) }
337
337
  end
338
+
339
+ ##
340
+ # Creates a UserEvent for the given User
341
+ # @param {Hash} options, keys for :created (Unix timestamp) and :company_id (String)
342
+ def log_event(event_name, options={})
343
+ attributes = {:event_name => event_name, :user => self}
344
+ attributes[:created] = options[:created] unless options[:created].nil?
345
+ attributes[:company_id] = options[:company_id] unless options[:company_id].nil?
346
+ UserEvent.create(attributes)
347
+ end
338
348
 
339
349
  protected
340
350
  def social_profiles=(social_profiles) #:nodoc:
@@ -0,0 +1,102 @@
1
+ require 'intercom/requires_parameters'
2
+ require 'intercom/hashable_object'
3
+
4
+
5
+ module Intercom
6
+
7
+ ##
8
+ # Represents a User Event
9
+ #
10
+ # A user event consists of an event_name and a user the event applies to. The user is identified via email or id.
11
+ # Additionally, a created timestamp is required.
12
+ #
13
+ # == Examples
14
+ #
15
+ # user_event = Intercom::UserEvent.create(:event_name => "post", :user => current_user, :created => Time.now)
16
+ #
17
+ # You can also create an user-event and save it like this:
18
+ # user_event = Intercom::UserEvent.new
19
+ # user_event.event_name = "publish-post"
20
+ # user_event.user = current_user
21
+ # user_event.created = Time.now
22
+ # user_event.metadata = {
23
+ # :title => 'Gravity Review',
24
+ # :link => 'https://example.org/posts/22',
25
+ # :comments => 'https://example.org/posts/22/comments'
26
+ # }
27
+ # user_event.save
28
+ #
29
+ # == Batch
30
+ #
31
+ # User events can be created in batches, and sent as one request. To do some, create user events
32
+ # without calling .create, as follows:
33
+ #
34
+ # user_event = Intercom::UserEvent.new
35
+ # user_event.event_name = "publish-post"
36
+ # user_event.user = current_user
37
+ #
38
+ # Then pass them to the save_batch_events class method, along with an (optional) default user:
39
+ #
40
+ # Intercom::UserEvent.save_batch_events(events, default_user)
41
+ #
42
+ # Any events without a user will be assigned to the default_user.
43
+ #
44
+ # Note: if you do not supply a created time, the current time in UTC will be used. Events that have the same
45
+ # user, name, and created time (to second granularity) may be treated as duplicates by the server.
46
+
47
+ class UserEvent
48
+ extend RequiresParameters
49
+ include HashableObject
50
+
51
+ attr_accessor :event_name, :user, :created_at # required
52
+ attr_accessor :metadata, :type
53
+
54
+ def initialize(attributes={})
55
+ from_hash(attributes)
56
+ end
57
+
58
+ ##
59
+ # Creates a new User Event using params and saves it
60
+ # @see #save
61
+ def self.create(params)
62
+ params[:created_at] ||= Time.now
63
+ requires_parameters(params, %W(event_name user created_at))
64
+ UserEvent.new(params).save
65
+ end
66
+
67
+ ##
68
+ # Save the User Event
69
+ def save
70
+ raise ArgumentError.new("Missing User") if user.nil?
71
+ UserEvent.save_batch_events([self])
72
+ self
73
+ end
74
+
75
+ ##
76
+ # Save a list of User Events, with an optional base_user
77
+ def self.save_batch_events(events, base_user=nil)
78
+ hash = { :type => 'event.list', :data => []}
79
+ hash[:user] = { :user_id => base_user.user_id } if base_user
80
+ events.each do |event|
81
+ hash[:data] << event.event_hash
82
+ end
83
+ post_to_intercom(hash)
84
+ end
85
+
86
+ def self.post_to_intercom(hash)
87
+ Intercom.post('/events', hash)
88
+ end
89
+
90
+ def user_hash
91
+ { :user_id => user.user_id }
92
+ end
93
+
94
+ def event_hash
95
+ event = { :event_name => event_name, :created => created_at.nil? ? Time.now.utc.to_i : created_at.to_i }
96
+ event[:type] = type.nil? ? 'event' : type
97
+ event[:user] = user_hash unless user.nil?
98
+ event[:metadata] = metadata unless metadata.nil?
99
+ event
100
+ end
101
+ end
102
+ end
@@ -1,3 +1,3 @@
1
1
  module Intercom #:nodoc:
2
- VERSION = "0.1.19"
2
+ VERSION = "0.2.0"
3
3
  end
data/lib/intercom.rb CHANGED
@@ -6,6 +6,7 @@ require "intercom/impression"
6
6
  require "intercom/note"
7
7
  require "intercom/tag"
8
8
  require "intercom/request"
9
+ require "intercom/user_event"
9
10
  require "json"
10
11
 
11
12
  ##
@@ -69,7 +69,37 @@ describe "api.intercom.io dummy data requests" do
69
69
  note.html.must_equal "<p>This is a note</p>"
70
70
  note.user.email.must_equal "somebody@example.com"
71
71
  end
72
-
72
+
73
+ it "should create a user event" do
74
+ FakeWeb.register_uri(:get, %r(v1/users\?email=), :body => fixture('v1-user'))
75
+ user = Intercom::User.find(:email => "somebody@example.com")
76
+ FakeWeb.register_uri(:post, %r(/events), :status => ["202", "Created"])
77
+ Intercom::UserEvent.create(:event_name => "signup", :created_at => 1391691571, :user => user).event_name.must_equal "signup"
78
+ end
79
+
80
+ it "should create batch user events" do
81
+ FakeWeb.register_uri(:get, %r(v1/users\?email=), :body => fixture('v1-user'))
82
+ user = Intercom::User.find(:email => "somebody@example.com")
83
+
84
+ first_event = Intercom::UserEvent.new
85
+ first_event.event_name = "first event"
86
+ first_event.created_at = Time.now
87
+ first_event.user = user
88
+
89
+ second_event = Intercom::UserEvent.new
90
+ second_event.event_name = "second event"
91
+ second_event.created_at = Time.now
92
+
93
+ FakeWeb.register_uri(:post, %r(/events), :status => ["202", "Created"])
94
+ Intercom::UserEvent.save_batch_events([first_event, second_event], user)
95
+ end
96
+
97
+ it "should create a user event from a user" do
98
+ FakeWeb.register_uri(:get, %r(v1/users\?email=), :body => fixture('v1-user'))
99
+ user = Intercom::User.find(:email => "somebody@example.com")
100
+ FakeWeb.register_uri(:post, %r(/events), :status => ["202", "Created"])
101
+ user.log_event("signup").event_name.must_equal "signup"
102
+ end
73
103
 
74
104
  it "should failover to good endpoint when first one is un-reachable" do
75
105
  FakeWeb.allow_net_connect = %r(127.0.0.7)
@@ -0,0 +1,72 @@
1
+ require 'spec_helper'
2
+
3
+ describe "Intercom::UserEvent" do
4
+
5
+ let (:user) {Intercom::User.new("email" => "jim@example.com", :user_id => "12345", :created_at => Time.now, :name => "Jim Bob")}
6
+ let (:created_time) {Time.now - 300}
7
+
8
+ it "creates a user event" do
9
+ Intercom.expects(:post).with("/events",
10
+ { :type => 'event.list',
11
+ :data => [ {:event_name => "signup", :created => created_time.to_i, :type => 'event',
12
+ :user => { :user_id => user.user_id}, :metadata => {:some => "data"}
13
+ }]}).returns(:status => 200)
14
+
15
+ Intercom::UserEvent.create({ :event_name => "signup", :user => user, :created_at => created_time, :metadata => {:some => "data"} })
16
+ end
17
+
18
+ it 'automatically adds a created time upon creation' do
19
+ Intercom.expects(:post).with("/events",
20
+ { :type => 'event.list',
21
+ :data => [ {:event_name => "sale of item", :created => Time.now.to_i, :type => 'event', :user => { :user_id => user.user_id}
22
+ }]}).returns(:status => 200)
23
+
24
+ Intercom::UserEvent.create({ :event_name => "sale of item", :user => user })
25
+ end
26
+
27
+ it "creates a user event with metadata" do
28
+ Intercom.expects(:post).with("/events",
29
+ { :type => 'event.list',
30
+ :data => [ {:event_name => "signup", :created => created_time.to_i, :type => 'event', :user => { :user_id => user.user_id}, :metadata => { :something => "here"}
31
+ }]}).returns(:status => 200)
32
+ Intercom::UserEvent.create({ :event_name => "signup", :user => user, :created_at => created_time, :metadata => { :something => "here"} })
33
+ end
34
+
35
+ it 'fails when no user supplied' do
36
+ user_event = Intercom::UserEvent.new
37
+ user_event.event_name = "some event"
38
+ user_event.created_at = Time.now
39
+ proc { user_event.save }.must_raise ArgumentError, "Missing User"
40
+ end
41
+
42
+ describe 'while batching events' do
43
+
44
+ let (:event1) do
45
+ user_event = Intercom::UserEvent.new
46
+ user_event.event_name = "first event"
47
+ user_event.created_at = Time.now
48
+ user_event.user = user
49
+ user_event
50
+ end
51
+
52
+ let (:event2) do
53
+ user_event = Intercom::UserEvent.new
54
+ user_event.event_name = "second event"
55
+ user_event.created_at = Time.now
56
+ user_event
57
+ end
58
+
59
+ it 'creates batched events' do
60
+ Intercom.expects(:post).with("/events",
61
+ { :type => 'event.list',
62
+ :data => [
63
+ {:event_name => "first event", :created => event1.created_at.to_i,
64
+ :type => 'event', :user => {:user_id => user.user_id}},
65
+ {:event_name => "second event", :created => event2.created_at.to_i,
66
+ :type => 'event'},
67
+ ],
68
+ :user => { :user_id => user.user_id}}).returns(:status => 200)
69
+ Intercom::UserEvent.save_batch_events([event1, event2], user)
70
+ end
71
+ end
72
+ end
@@ -262,4 +262,13 @@ describe "Intercom::User" do
262
262
  first_company_as_hash["created_at"].must_equal time.to_i
263
263
  second_company_as_hash["created_at"].must_equal time.to_i
264
264
  end
265
+
266
+ it "logs user events" do
267
+ user = Intercom::User.new("email" => "jim@example.com", :user_id => "12345", :created_at => Time.now, :name => "Jim Bob")
268
+ Intercom::UserEvent.expects(:create).with(:event_name => 'registration', :user => user)
269
+ event = user.log_event('registration')
270
+
271
+ Intercom::UserEvent.expects(:create).with(:event_name => 'another', :user => user, :created => 1391691571, :company_id => "6")
272
+ event = user.log_event("another", {:created => 1391691571, :company_id => "6"})
273
+ end
265
274
  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: 0.1.19
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ben McRedmond
@@ -12,7 +12,7 @@ authors:
12
12
  autorequire:
13
13
  bindir: bin
14
14
  cert_chain: []
15
- date: 2014-01-21 00:00:00.000000000 Z
15
+ date: 2014-02-26 00:00:00.000000000 Z
16
16
  dependencies:
17
17
  - !ruby/object:Gem::Dependency
18
18
  name: minitest
@@ -119,6 +119,7 @@ files:
119
119
  - lib/intercom/unix_timestamp_unwrapper.rb
120
120
  - lib/intercom/user.rb
121
121
  - lib/intercom/user_collection_proxy.rb
122
+ - lib/intercom/user_event.rb
122
123
  - lib/intercom/user_resource.rb
123
124
  - lib/intercom/version.rb
124
125
  - spec/integration/fixtures/v1-user.json
@@ -135,6 +136,7 @@ files:
135
136
  - spec/unit/intercom/note_spec.rb
136
137
  - spec/unit/intercom/tag_spec.rb
137
138
  - spec/unit/intercom/user_collection_proxy_spec.rb
139
+ - spec/unit/intercom/user_event_spec.rb
138
140
  - spec/unit/intercom/user_resource_spec.rb
139
141
  - spec/unit/intercom/user_spec.rb
140
142
  - spec/unit/intercom_spec.rb
@@ -177,6 +179,7 @@ test_files:
177
179
  - spec/unit/intercom/note_spec.rb
178
180
  - spec/unit/intercom/tag_spec.rb
179
181
  - spec/unit/intercom/user_collection_proxy_spec.rb
182
+ - spec/unit/intercom/user_event_spec.rb
180
183
  - spec/unit/intercom/user_resource_spec.rb
181
184
  - spec/unit/intercom/user_spec.rb
182
185
  - spec/unit/intercom_spec.rb