amplitude-api 0.0.7 → 0.0.8

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 233332597b10167395db959e0066e1f8b2adf1ad
4
- data.tar.gz: 574f6162547e34a3e2003abf0410146064de2279
3
+ metadata.gz: 67727755b54bfef1fc3ffa5889e11c7931420a13
4
+ data.tar.gz: 52feec8f51522d7f2c17b0db39d4e033f76efe2b
5
5
  SHA512:
6
- metadata.gz: 860998aada7dc9516f451d1e83d1c92abc1247eab787eb67ed186efa63c30e650f94e6e31afe422119a1f55da6c058d606df6a5b3529ad669f32781f3bb33b11
7
- data.tar.gz: 22b4a53df0df781db7f2efeac562481546b8551bee4e31b2be1918189a8b5cb145cb14e2eb70b366965dd56b27310ef95832d73125bdcb7ffa157818382a1ba6
6
+ metadata.gz: f3b3bf19725cda0082c7cf0acb7ca40614430a63ff5d929e803c3074955d9b35e5674987745a5fb17d2cc0e030fb7319a5903e012d40c98f5e171efea8f3b0f6
7
+ data.tar.gz: 09b6ca4ddb4ec2bdbed9980a41356b6f0096feace6819209c98ce37eb2a83722f509ca60762ccd7731a10308693bdce1eddf88f9e5cb27338fdf92be84dffd74
@@ -1,5 +1,6 @@
1
1
  language: ruby
2
2
  cache: bundler
3
3
  rvm:
4
+ - 2.3.1
4
5
  - 2.2.2
5
6
  - 2.1.6
@@ -20,13 +20,38 @@ class AmplitudeAPI
20
20
  # @return [ String ] IP address of the user
21
21
  attr_accessor :ip
22
22
 
23
+ # @!attribute [ rw ] insert_id
24
+ # @return [ String ] the unique identifier to be sent to Amplitude
25
+ attr_accessor :insert_id
26
+
27
+ # @!attribute [ rw ] price
28
+ # @return [ String ] (required for revenue data) price of the item purchased
29
+ attr_accessor :price
30
+
31
+ # @!attribute [ rw ] quantity
32
+ # @return [ String ] (required for revenue data, defaults to 1 if not specified) quantity of the item purchased
33
+ attr_accessor :quantity
34
+
35
+ # @!attribute [ rw ] product_id
36
+ # @return [ String ] an identifier for the product. (Note: you must send a price and quantity with this field)
37
+ attr_accessor :product_id
38
+
39
+ # @!attribute [ rw ] revenue_type
40
+ # @return [ String ] type of revenue. (Note: you must send a price and quantity with this field)
41
+ attr_accessor :revenue_type
42
+
23
43
  # Create a new Event
24
44
  #
25
45
  # @param [ String ] user_id a user_id to associate with the event
26
46
  # @param [ String ] event_type a name for the event
27
47
  # @param [ Hash ] event_properties various properties to attach to the event
28
48
  # @param [ Time ] Time that the event occurred (defaults to now)
49
+ # @param [ Double ] price (optional, but required for revenue data) price of the item purchased
50
+ # @param [ Integer ] quantity (optional, but required for revenue data) quantity of the item purchased
51
+ # @param [ String ] product_id (optional) an identifier for the product.
52
+ # @param [ String ] revenue_type (optional) type of revenue
29
53
  # @param [ String ] IP address of the user
54
+ # @param [ String ] insert_id a unique identifier for the event
30
55
  def initialize(options = {})
31
56
  self.user_id = options.fetch(:user_id, '')
32
57
  self.event_type = options.fetch(:event_type, '')
@@ -34,6 +59,8 @@ class AmplitudeAPI
34
59
  self.user_properties = options.fetch(:user_properties, {})
35
60
  self.time = options[:time]
36
61
  self.ip = options.fetch(:ip, '')
62
+ self.insert_id = options[:insert_id]
63
+ validate_revenue_arguments(options)
37
64
  end
38
65
 
39
66
  def user_id=(value)
@@ -56,7 +83,9 @@ class AmplitudeAPI
56
83
  serialized_event[:user_properties] = user_properties
57
84
  serialized_event[:time] = formatted_time if time
58
85
  serialized_event[:ip] = ip if ip
59
- serialized_event
86
+ serialized_event[:insert_id] = insert_id if insert_id
87
+
88
+ serialized_event.merge(revenue_hash)
60
89
  end
61
90
 
62
91
  # @return [ true, false ]
@@ -75,5 +104,24 @@ class AmplitudeAPI
75
104
  def formatted_time
76
105
  time.to_i * 1_000
77
106
  end
107
+
108
+ def validate_revenue_arguments(options)
109
+ self.price = options[:price]
110
+ self.quantity = options[:quantity] || 1 if price
111
+ self.product_id = options[:product_id]
112
+ self.revenue_type = options[:revenue_type]
113
+ return if price
114
+ raise ArgumentError, 'You must provide a price in order to use the product_id' if product_id
115
+ raise ArgumentError, 'You must provide a price in order to use the revenue_type' if revenue_type
116
+ end
117
+
118
+ def revenue_hash
119
+ revenue_hash = {}
120
+ revenue_hash[:productId] = product_id if product_id
121
+ revenue_hash[:revenueType] = revenue_type if revenue_type
122
+ revenue_hash[:quantity] = quantity if quantity
123
+ revenue_hash[:price] = price if price
124
+ revenue_hash
125
+ end
78
126
  end
79
127
  end
@@ -1,3 +1,3 @@
1
1
  class AmplitudeAPI
2
- VERSION = '0.0.7'.freeze
2
+ VERSION = '0.0.8'.freeze
3
3
  end
data/readme.md CHANGED
@@ -21,6 +21,7 @@ event = AmplitudeAPI::Event.new({
21
21
  user_id: "123",
22
22
  event_type: "clicked on home",
23
23
  time: Time.now,
24
+ insert_id: 'f47ac10b-58cc-4372-a567-0e02b2c3d479',
24
25
  event_properties: {
25
26
  cause: "button",
26
27
  arbitrary: "properties"
@@ -40,7 +41,7 @@ Currently, we are using this in Rails and using ActiveJob to dispatch events asy
40
41
  ## Other useful resources
41
42
  * [Amplitude HTTP Api Documentation](https://amplitude.zendesk.com/hc/en-us/articles/204771828)
42
43
  * [Segment.io Amplitude integration](https://segment.com/docs/integrations/amplitude/)
43
-
44
+
44
45
  ## Contributing
45
46
 
46
47
  I'd love to hear how you're using this. Please check out the [issues](https://github.com/toothrot/amplitude-api/issues).
@@ -39,6 +39,30 @@ describe AmplitudeAPI::Event do
39
39
  end
40
40
  end
41
41
 
42
+ describe 'init' do
43
+ context 'the user does not send in a price' do
44
+ it 'raises an error if the user sends in a product_id' do
45
+ expect do
46
+ described_class.new(
47
+ user_id: 123,
48
+ event_type: 'bad event',
49
+ product_id: 'hopscotch.4lyfe'
50
+ )
51
+ end.to raise_error(ArgumentError)
52
+ end
53
+
54
+ it 'raises an error if the user sends in a revenue_type' do
55
+ expect do
56
+ described_class.new(
57
+ user_id: 123,
58
+ event_type: 'bad event',
59
+ revenue_type: 'tax return'
60
+ )
61
+ end.to raise_error(ArgumentError)
62
+ end
63
+ end
64
+ end
65
+
42
66
  describe '#body' do
43
67
  it 'includes the event type' do
44
68
  event = described_class.new(
@@ -57,22 +81,109 @@ describe AmplitudeAPI::Event do
57
81
  expect(event.to_hash[:event_properties]).to eq(abc: :def)
58
82
  end
59
83
 
60
- it 'includes a time for the event' do
61
- time = Time.parse('2016-01-01 00:00:00 -0000')
62
- event = described_class.new(
63
- user_id: 123,
64
- event_type: 'clicked on home',
65
- time: time
66
- )
67
- expect(event.to_hash[:time]).to eq(1_451_606_400_000)
84
+ describe 'time' do
85
+ it 'includes a time for the event' do
86
+ time = Time.parse('2016-01-01 00:00:00 -0000')
87
+ event = described_class.new(
88
+ user_id: 123,
89
+ event_type: 'clicked on home',
90
+ time: time
91
+ )
92
+ expect(event.to_hash[:time]).to eq(1_451_606_400_000)
93
+ end
94
+
95
+ it 'does not include time if it is not set' do
96
+ event = described_class.new(
97
+ user_id: 123,
98
+ event_type: 'clicked on home'
99
+ )
100
+ expect(event.to_hash).not_to have_key(:time)
101
+ end
68
102
  end
69
103
 
70
- it 'does not include time if it is not set' do
71
- event = described_class.new(
72
- user_id: 123,
73
- event_type: 'clicked on home'
74
- )
75
- expect(event.to_hash).not_to have_key(:time)
104
+ describe 'insert_id' do
105
+ it 'includes an insert_id for the event' do
106
+ event = described_class.new(
107
+ user_id: 123,
108
+ event_type: 'clicked on home',
109
+ insert_id: 'foo-bar'
110
+ )
111
+ expect(event.to_hash[:insert_id]).to eq('foo-bar')
112
+ end
113
+
114
+ it 'does not include insert_id if it is not set' do
115
+ event = described_class.new(
116
+ user_id: 123,
117
+ event_type: 'clicked on home'
118
+ )
119
+ expect(event.to_hash).not_to have_key(:insert_id)
120
+ end
121
+ end
122
+
123
+ describe 'revenue params' do
124
+ it 'includes the price if it is set' do
125
+ price = 100_000.99
126
+ event = described_class.new(
127
+ user_id: 123,
128
+ event_type: 'clicked on home',
129
+ price: price
130
+ )
131
+ expect(event.to_hash[:price]).to eq(price)
132
+ end
133
+
134
+ it 'sets the quantity to 1 if the price is set and the quantity is not' do
135
+ price = 100_000.99
136
+ event = described_class.new(
137
+ user_id: 123,
138
+ event_type: 'clicked on home',
139
+ price: price
140
+ )
141
+ expect(event.to_hash[:quantity]).to eq(1)
142
+ end
143
+
144
+ it 'includes the quantity if it is set' do
145
+ quantity = 100
146
+ event = described_class.new(
147
+ user_id: 123,
148
+ event_type: 'clicked on home',
149
+ quantity: quantity,
150
+ price: 10.99
151
+ )
152
+ expect(event.to_hash[:quantity]).to eq(quantity)
153
+ end
154
+
155
+ it 'includes the productID if set' do
156
+ product_id = 'hopscotch.subscriptions.rule'
157
+ event = described_class.new(
158
+ user_id: 123,
159
+ event_type: 'clicked on home',
160
+ price: 199.99,
161
+ product_id: product_id
162
+ )
163
+ expect(event.to_hash[:productId]).to eq(product_id)
164
+ end
165
+
166
+ it 'includes the revenueType if set' do
167
+ revenue_type = 'income'
168
+ event = described_class.new(
169
+ user_id: 123,
170
+ event_type: 'clicked on home',
171
+ price: 199.99,
172
+ revenue_type: revenue_type
173
+ )
174
+ expect(event.to_hash[:revenueType]).to eq(revenue_type)
175
+ end
176
+
177
+ it 'does not include revenue params if they are not set' do
178
+ event = described_class.new(
179
+ user_id: 123,
180
+ event_type: 'clicked on home'
181
+ )
182
+ expect(event.to_hash).not_to have_key(:quantity)
183
+ expect(event.to_hash).not_to have_key(:revenueType)
184
+ expect(event.to_hash).not_to have_key(:productId)
185
+ expect(event.to_hash).not_to have_key(:price)
186
+ end
76
187
  end
77
188
  end
78
189
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: amplitude-api
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.7
4
+ version: 0.0.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alex Rakoczy
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-08-01 00:00:00.000000000 Z
11
+ date: 2016-08-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rspec