analytics-ruby 2.2.6 → 2.2.7
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 +4 -4
- data/lib/segment/analytics.rb +1 -0
- data/lib/segment/analytics/client.rb +36 -272
- data/lib/segment/analytics/field_parser.rb +184 -0
- data/lib/segment/analytics/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6c8742471c22e19783a69dee3403ddbd1ac2785b7bbd9608840432e34f4d50a5
|
4
|
+
data.tar.gz: dad6dfe750ebf0746e2228cd29551afc23e4ce38d40c7df00184994e6d16db8b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c5d305d7a968088a3ef5488faa360ce06ad6d97072bde0d6b068aae11bcb1824814f87fe1a18e8f09a231cbe34be2954b4565605cdb8a6b8e0d370ee56a6b492
|
7
|
+
data.tar.gz: 154b45294bff8f12f2dd8bc338742889d11017983f5e516cca36e9446bbb3c0e6aa61ac35252aaf20ba39ececa96a58c264990f9a1dece39d6d5b39435ab1ad3
|
data/lib/segment/analytics.rb
CHANGED
@@ -23,9 +23,8 @@ module Segment
|
|
23
23
|
@queue = Queue.new
|
24
24
|
@write_key = opts[:write_key]
|
25
25
|
@max_queue_size = opts[:max_queue_size] || Defaults::Queue::MAX_SIZE
|
26
|
-
@options = opts
|
27
26
|
@worker_mutex = Mutex.new
|
28
|
-
@worker = Worker.new(@queue, @write_key,
|
27
|
+
@worker = Worker.new(@queue, @write_key, opts)
|
29
28
|
|
30
29
|
check_write_key!
|
31
30
|
|
@@ -43,58 +42,32 @@ module Segment
|
|
43
42
|
end
|
44
43
|
end
|
45
44
|
|
45
|
+
# @!macro common_attrs
|
46
|
+
# @option attrs [String] :anonymous_id ID for a user when you don't know
|
47
|
+
# who they are yet. (optional but you must provide either an
|
48
|
+
# `anonymous_id` or `user_id`)
|
49
|
+
# @option attrs [Hash] :context ({})
|
50
|
+
# @option attrs [Hash] :integrations What integrations this event
|
51
|
+
# goes to (optional)
|
52
|
+
# @option attrs [String] :message_id ID that uniquely
|
53
|
+
# identifies a message across the API. (optional)
|
54
|
+
# @option attrs [Time] :timestamp When the event occurred (optional)
|
55
|
+
# @option attrs [String] :user_id The ID for this user in your database
|
56
|
+
# (optional but you must provide either an `anonymous_id` or `user_id`)
|
57
|
+
# @option attrs [Hash] :options Options such as user traits (optional)
|
58
|
+
|
46
59
|
# Tracks an event
|
47
60
|
#
|
48
61
|
# @see https://segment.com/docs/sources/server/ruby/#track
|
49
62
|
#
|
50
63
|
# @param [Hash] attrs
|
51
|
-
#
|
52
|
-
# who they are yet. (optional but you must provide either an
|
53
|
-
# `anonymous_id` or `user_id`)
|
54
|
-
# @option attrs [Hash] :context ({})
|
64
|
+
#
|
55
65
|
# @option attrs [String] :event Event name
|
56
|
-
# @option attrs [Hash] :integrations What integrations this event
|
57
|
-
# goes to (optional)
|
58
|
-
# @option attrs [Hash] :options Options such as user traits (optional)
|
59
66
|
# @option attrs [Hash] :properties Event properties (optional)
|
60
|
-
# @
|
61
|
-
# @option attrs [String] :user_id The ID for this user in your database
|
62
|
-
# (optional but you must provide either an `anonymous_id` or `user_id`)
|
63
|
-
# @option attrs [String] :message_id ID that uniquely
|
64
|
-
# identifies a message across the API. (optional)
|
67
|
+
# @macro common_attrs
|
65
68
|
def track(attrs)
|
66
69
|
symbolize_keys! attrs
|
67
|
-
|
68
|
-
|
69
|
-
event = attrs[:event]
|
70
|
-
properties = attrs[:properties] || {}
|
71
|
-
timestamp = attrs[:timestamp] || Time.new
|
72
|
-
context = attrs[:context] || {}
|
73
|
-
message_id = attrs[:message_id].to_s if attrs[:message_id]
|
74
|
-
|
75
|
-
check_timestamp! timestamp
|
76
|
-
|
77
|
-
if event.nil? || event.empty?
|
78
|
-
raise ArgumentError, 'Must supply event as a non-empty string'
|
79
|
-
end
|
80
|
-
|
81
|
-
raise ArgumentError, 'Properties must be a Hash' unless properties.is_a? Hash
|
82
|
-
isoify_dates! properties
|
83
|
-
|
84
|
-
add_context context
|
85
|
-
|
86
|
-
enqueue({
|
87
|
-
:event => event,
|
88
|
-
:userId => attrs[:user_id],
|
89
|
-
:anonymousId => attrs[:anonymous_id],
|
90
|
-
:context => context,
|
91
|
-
:options => attrs[:options],
|
92
|
-
:integrations => attrs[:integrations],
|
93
|
-
:properties => properties,
|
94
|
-
:messageId => message_id,
|
95
|
-
:timestamp => datetime_in_iso8601(timestamp),
|
96
|
-
:type => 'track'
|
97
|
-
})
|
70
|
+
enqueue(FieldParser.parse_for_track(attrs))
|
98
71
|
end
|
99
72
|
|
100
73
|
# Identifies a user
|
@@ -102,46 +75,12 @@ module Segment
|
|
102
75
|
# @see https://segment.com/docs/sources/server/ruby/#identify
|
103
76
|
#
|
104
77
|
# @param [Hash] attrs
|
105
|
-
#
|
106
|
-
# who they are yet. (optional but you must provide either an
|
107
|
-
# `anonymous_id` or `user_id`)
|
108
|
-
# @option attrs [Hash] :context ({})
|
109
|
-
# @option attrs [Hash] :integrations What integrations this event
|
110
|
-
# goes to (optional)
|
111
|
-
# @option attrs [Hash] :options Options such as user traits (optional)
|
112
|
-
# @option attrs [Time] :timestamp When the event occurred (optional)
|
78
|
+
#
|
113
79
|
# @option attrs [Hash] :traits User traits (optional)
|
114
|
-
# @
|
115
|
-
# (optional but you must provide either an `anonymous_id` or `user_id`)
|
116
|
-
# @option attrs [String] :message_id ID that uniquely identifies a
|
117
|
-
# message across the API. (optional)
|
80
|
+
# @macro common_attrs
|
118
81
|
def identify(attrs)
|
119
82
|
symbolize_keys! attrs
|
120
|
-
|
121
|
-
|
122
|
-
traits = attrs[:traits] || {}
|
123
|
-
timestamp = attrs[:timestamp] || Time.new
|
124
|
-
context = attrs[:context] || {}
|
125
|
-
message_id = attrs[:message_id].to_s if attrs[:message_id]
|
126
|
-
|
127
|
-
check_timestamp! timestamp
|
128
|
-
|
129
|
-
raise ArgumentError, 'Must supply traits as a hash' unless traits.is_a? Hash
|
130
|
-
isoify_dates! traits
|
131
|
-
|
132
|
-
add_context context
|
133
|
-
|
134
|
-
enqueue({
|
135
|
-
:userId => attrs[:user_id],
|
136
|
-
:anonymousId => attrs[:anonymous_id],
|
137
|
-
:integrations => attrs[:integrations],
|
138
|
-
:context => context,
|
139
|
-
:traits => traits,
|
140
|
-
:options => attrs[:options],
|
141
|
-
:messageId => message_id,
|
142
|
-
:timestamp => datetime_in_iso8601(timestamp),
|
143
|
-
:type => 'identify'
|
144
|
-
})
|
83
|
+
enqueue(FieldParser.parse_for_identify(attrs))
|
145
84
|
end
|
146
85
|
|
147
86
|
# Aliases a user from one id to another
|
@@ -149,39 +88,12 @@ module Segment
|
|
149
88
|
# @see https://segment.com/docs/sources/server/ruby/#alias
|
150
89
|
#
|
151
90
|
# @param [Hash] attrs
|
152
|
-
#
|
153
|
-
# @option attrs [Hash] :integrations What integrations this must be
|
154
|
-
# sent to (optional)
|
155
|
-
# @option attrs [Hash] :options Options such as user traits (optional)
|
91
|
+
#
|
156
92
|
# @option attrs [String] :previous_id The ID to alias from
|
157
|
-
# @
|
158
|
-
# @option attrs [String] :user_id The ID to alias to
|
159
|
-
# @option attrs [String] :message_id ID that uniquely identifies a
|
160
|
-
# message across the API. (optional)
|
93
|
+
# @macro common_attrs
|
161
94
|
def alias(attrs)
|
162
95
|
symbolize_keys! attrs
|
163
|
-
|
164
|
-
from = attrs[:previous_id]
|
165
|
-
to = attrs[:user_id]
|
166
|
-
timestamp = attrs[:timestamp] || Time.new
|
167
|
-
context = attrs[:context] || {}
|
168
|
-
message_id = attrs[:message_id].to_s if attrs[:message_id]
|
169
|
-
|
170
|
-
check_presence! from, 'previous_id'
|
171
|
-
check_presence! to, 'user_id'
|
172
|
-
check_timestamp! timestamp
|
173
|
-
add_context context
|
174
|
-
|
175
|
-
enqueue({
|
176
|
-
:previousId => from,
|
177
|
-
:userId => to,
|
178
|
-
:integrations => attrs[:integrations],
|
179
|
-
:context => context,
|
180
|
-
:options => attrs[:options],
|
181
|
-
:messageId => message_id,
|
182
|
-
:timestamp => datetime_in_iso8601(timestamp),
|
183
|
-
:type => 'alias'
|
184
|
-
})
|
96
|
+
enqueue(FieldParser.parse_for_alias(attrs))
|
185
97
|
end
|
186
98
|
|
187
99
|
# Associates a user identity with a group.
|
@@ -189,48 +101,13 @@ module Segment
|
|
189
101
|
# @see https://segment.com/docs/sources/server/ruby/#group
|
190
102
|
#
|
191
103
|
# @param [Hash] attrs
|
192
|
-
#
|
193
|
-
# who they are yet. (optional but you must provide either an
|
194
|
-
# `anonymous_id` or `user_id`)
|
195
|
-
# @option attrs [Hash] :context ({})
|
104
|
+
#
|
196
105
|
# @option attrs [String] :group_id The ID of the group
|
197
|
-
# @option attrs [Hash] :
|
198
|
-
#
|
199
|
-
# @option attrs [Hash] :options Options such as user traits (optional)
|
200
|
-
# @option attrs [Time] :timestamp When the event occurred (optional)
|
201
|
-
# @option attrs [String] :user_id The ID for the user that is part of
|
202
|
-
# the group
|
203
|
-
# @option attrs [String] :message_id ID that uniquely identifies a
|
204
|
-
# message across the API. (optional)
|
106
|
+
# @option attrs [Hash] :traits User traits (optional)
|
107
|
+
# @macro common_attrs
|
205
108
|
def group(attrs)
|
206
109
|
symbolize_keys! attrs
|
207
|
-
|
208
|
-
|
209
|
-
group_id = attrs[:group_id]
|
210
|
-
user_id = attrs[:user_id]
|
211
|
-
traits = attrs[:traits] || {}
|
212
|
-
timestamp = attrs[:timestamp] || Time.new
|
213
|
-
context = attrs[:context] || {}
|
214
|
-
message_id = attrs[:message_id].to_s if attrs[:message_id]
|
215
|
-
|
216
|
-
raise ArgumentError, '.traits must be a hash' unless traits.is_a? Hash
|
217
|
-
isoify_dates! traits
|
218
|
-
|
219
|
-
check_presence! group_id, 'group_id'
|
220
|
-
check_timestamp! timestamp
|
221
|
-
add_context context
|
222
|
-
|
223
|
-
enqueue({
|
224
|
-
:groupId => group_id,
|
225
|
-
:userId => user_id,
|
226
|
-
:traits => traits,
|
227
|
-
:integrations => attrs[:integrations],
|
228
|
-
:options => attrs[:options],
|
229
|
-
:context => context,
|
230
|
-
:messageId => message_id,
|
231
|
-
:timestamp => datetime_in_iso8601(timestamp),
|
232
|
-
:type => 'group'
|
233
|
-
})
|
110
|
+
enqueue(FieldParser.parse_for_group(attrs))
|
234
111
|
end
|
235
112
|
|
236
113
|
# Records a page view
|
@@ -238,97 +115,26 @@ module Segment
|
|
238
115
|
# @see https://segment.com/docs/sources/server/ruby/#page
|
239
116
|
#
|
240
117
|
# @param [Hash] attrs
|
241
|
-
#
|
242
|
-
# who they are yet. (optional but you must provide either an
|
243
|
-
# `anonymous_id` or `user_id`)
|
244
|
-
# @option attrs [String] :category The page category (optional)
|
245
|
-
# @option attrs [Hash] :context ({})
|
246
|
-
# @option attrs [Hash] :integrations What integrations this event
|
247
|
-
# goes to (optional)
|
118
|
+
#
|
248
119
|
# @option attrs [String] :name Name of the page
|
249
|
-
# @option attrs [Hash] :options Options such as user traits (optional)
|
250
120
|
# @option attrs [Hash] :properties Page properties (optional)
|
251
|
-
# @
|
252
|
-
# @option attrs [String] :user_id The ID of the user viewing the page
|
253
|
-
# @option attrs [String] :message_id ID that uniquely identifies a
|
254
|
-
# message across the API. (optional)
|
121
|
+
# @macro common_attrs
|
255
122
|
def page(attrs)
|
256
123
|
symbolize_keys! attrs
|
257
|
-
|
258
|
-
|
259
|
-
name = attrs[:name].to_s
|
260
|
-
properties = attrs[:properties] || {}
|
261
|
-
timestamp = attrs[:timestamp] || Time.new
|
262
|
-
context = attrs[:context] || {}
|
263
|
-
message_id = attrs[:message_id].to_s if attrs[:message_id]
|
264
|
-
|
265
|
-
raise ArgumentError, '.properties must be a hash' unless properties.is_a? Hash
|
266
|
-
isoify_dates! properties
|
267
|
-
|
268
|
-
check_timestamp! timestamp
|
269
|
-
add_context context
|
270
|
-
|
271
|
-
enqueue({
|
272
|
-
:userId => attrs[:user_id],
|
273
|
-
:anonymousId => attrs[:anonymous_id],
|
274
|
-
:name => name,
|
275
|
-
:category => attrs[:category],
|
276
|
-
:properties => properties,
|
277
|
-
:integrations => attrs[:integrations],
|
278
|
-
:options => attrs[:options],
|
279
|
-
:context => context,
|
280
|
-
:messageId => message_id,
|
281
|
-
:timestamp => datetime_in_iso8601(timestamp),
|
282
|
-
:type => 'page'
|
283
|
-
})
|
124
|
+
enqueue(FieldParser.parse_for_page(attrs))
|
284
125
|
end
|
285
126
|
|
286
127
|
# Records a screen view (for a mobile app)
|
287
128
|
#
|
288
129
|
# @param [Hash] attrs
|
289
|
-
#
|
290
|
-
# who they are yet. (optional but you must provide either an
|
291
|
-
# `anonymous_id` or `user_id`)
|
292
|
-
# @option attrs [String] :category The screen category (optional)
|
293
|
-
# @option attrs [Hash] :context ({})
|
294
|
-
# @option attrs [Hash] :integrations What integrations this event
|
295
|
-
# goes to (optional)
|
130
|
+
#
|
296
131
|
# @option attrs [String] :name Name of the screen
|
297
|
-
# @option attrs [Hash] :
|
298
|
-
# @option attrs [
|
299
|
-
# @
|
300
|
-
# @option attrs [String] :user_id The ID of the user viewing the screen
|
301
|
-
# @option attrs [String] :message_id ID that uniquely identifies a
|
302
|
-
# message across the API. (optional)
|
132
|
+
# @option attrs [Hash] :properties Screen properties (optional)
|
133
|
+
# @option attrs [String] :category The screen category (optional)
|
134
|
+
# @macro common_attrs
|
303
135
|
def screen(attrs)
|
304
136
|
symbolize_keys! attrs
|
305
|
-
|
306
|
-
|
307
|
-
name = attrs[:name].to_s
|
308
|
-
properties = attrs[:properties] || {}
|
309
|
-
timestamp = attrs[:timestamp] || Time.new
|
310
|
-
context = attrs[:context] || {}
|
311
|
-
message_id = attrs[:message_id].to_s if attrs[:message_id]
|
312
|
-
|
313
|
-
raise ArgumentError, '.properties must be a hash' unless properties.is_a? Hash
|
314
|
-
isoify_dates! properties
|
315
|
-
|
316
|
-
check_timestamp! timestamp
|
317
|
-
add_context context
|
318
|
-
|
319
|
-
enqueue({
|
320
|
-
:userId => attrs[:user_id],
|
321
|
-
:anonymousId => attrs[:anonymous_id],
|
322
|
-
:name => name,
|
323
|
-
:properties => properties,
|
324
|
-
:category => attrs[:category],
|
325
|
-
:options => attrs[:options],
|
326
|
-
:integrations => attrs[:integrations],
|
327
|
-
:context => context,
|
328
|
-
:messageId => message_id,
|
329
|
-
:timestamp => timestamp.iso8601,
|
330
|
-
:type => 'screen'
|
331
|
-
})
|
137
|
+
enqueue(FieldParser.parse_for_screen(attrs))
|
332
138
|
end
|
333
139
|
|
334
140
|
# @return [Fixnum] number of messages in the queue
|
@@ -360,53 +166,11 @@ module Segment
|
|
360
166
|
end
|
361
167
|
end
|
362
168
|
|
363
|
-
# private: Ensures that a string is non-empty
|
364
|
-
#
|
365
|
-
# obj - String|Number that must be non-blank
|
366
|
-
# name - Name of the validated value
|
367
|
-
#
|
368
|
-
def check_presence!(obj, name)
|
369
|
-
if obj.nil? || (obj.is_a?(String) && obj.empty?)
|
370
|
-
raise ArgumentError, "#{name} must be given"
|
371
|
-
end
|
372
|
-
end
|
373
|
-
|
374
|
-
# private: Adds contextual information to the call
|
375
|
-
#
|
376
|
-
# context - Hash of call context
|
377
|
-
def add_context(context)
|
378
|
-
context[:library] = { :name => 'analytics-ruby', :version => Segment::Analytics::VERSION.to_s }
|
379
|
-
end
|
380
|
-
|
381
169
|
# private: Checks that the write_key is properly initialized
|
382
170
|
def check_write_key!
|
383
171
|
raise ArgumentError, 'Write key must be initialized' if @write_key.nil?
|
384
172
|
end
|
385
173
|
|
386
|
-
# private: Checks the timstamp option to make sure it is a Time.
|
387
|
-
def check_timestamp!(timestamp)
|
388
|
-
raise ArgumentError, 'Timestamp must be a Time' unless timestamp.is_a? Time
|
389
|
-
end
|
390
|
-
|
391
|
-
def event(attrs)
|
392
|
-
symbolize_keys! attrs
|
393
|
-
|
394
|
-
{
|
395
|
-
:userId => user_id,
|
396
|
-
:name => name,
|
397
|
-
:properties => properties,
|
398
|
-
:context => context,
|
399
|
-
:timestamp => datetime_in_iso8601(timestamp),
|
400
|
-
:type => 'screen'
|
401
|
-
}
|
402
|
-
end
|
403
|
-
|
404
|
-
def check_user_id!(attrs)
|
405
|
-
unless attrs[:user_id] || attrs[:anonymous_id]
|
406
|
-
raise ArgumentError, 'Must supply either user_id or anonymous_id'
|
407
|
-
end
|
408
|
-
end
|
409
|
-
|
410
174
|
def ensure_worker_running
|
411
175
|
return if worker_running?
|
412
176
|
@worker_mutex.synchronize do
|
@@ -0,0 +1,184 @@
|
|
1
|
+
module Segment
|
2
|
+
class Analytics
|
3
|
+
# Handles parsing fields according to the Segment Spec
|
4
|
+
#
|
5
|
+
# @see https://segment.com/docs/spec/
|
6
|
+
class FieldParser
|
7
|
+
class << self
|
8
|
+
include Segment::Analytics::Utils
|
9
|
+
|
10
|
+
# In addition to the common fields, track accepts:
|
11
|
+
#
|
12
|
+
# - "event"
|
13
|
+
# - "properties"
|
14
|
+
def parse_for_track(fields)
|
15
|
+
common = parse_common_fields(fields)
|
16
|
+
|
17
|
+
event = fields[:event]
|
18
|
+
properties = fields[:properties] || {}
|
19
|
+
|
20
|
+
check_presence!(event, 'event')
|
21
|
+
check_is_hash!(properties, 'properties')
|
22
|
+
|
23
|
+
isoify_dates! properties
|
24
|
+
|
25
|
+
common.merge({
|
26
|
+
:type => 'track',
|
27
|
+
:event => event.to_s,
|
28
|
+
:properties => properties
|
29
|
+
})
|
30
|
+
end
|
31
|
+
|
32
|
+
# In addition to the common fields, identify accepts:
|
33
|
+
#
|
34
|
+
# - "traits"
|
35
|
+
def parse_for_identify(fields)
|
36
|
+
common = parse_common_fields(fields)
|
37
|
+
|
38
|
+
traits = fields[:traits] || {}
|
39
|
+
check_is_hash!(traits, 'traits')
|
40
|
+
isoify_dates! traits
|
41
|
+
|
42
|
+
common.merge({
|
43
|
+
:type => 'identify',
|
44
|
+
:traits => traits
|
45
|
+
})
|
46
|
+
end
|
47
|
+
|
48
|
+
# In addition to the common fields, alias accepts:
|
49
|
+
#
|
50
|
+
# - "previous_id"
|
51
|
+
def parse_for_alias(fields)
|
52
|
+
common = parse_common_fields(fields)
|
53
|
+
|
54
|
+
previous_id = fields[:previous_id]
|
55
|
+
check_presence!(previous_id, 'previous_id')
|
56
|
+
|
57
|
+
common.merge({
|
58
|
+
:type => 'alias',
|
59
|
+
:previousId => previous_id
|
60
|
+
})
|
61
|
+
end
|
62
|
+
|
63
|
+
# In addition to the common fields, group accepts:
|
64
|
+
#
|
65
|
+
# - "group_id"
|
66
|
+
# - "traits"
|
67
|
+
def parse_for_group(fields)
|
68
|
+
common = parse_common_fields(fields)
|
69
|
+
|
70
|
+
group_id = fields[:group_id]
|
71
|
+
traits = fields[:traits] || {}
|
72
|
+
|
73
|
+
check_presence!(group_id, 'group_id')
|
74
|
+
check_is_hash!(traits, 'traits')
|
75
|
+
|
76
|
+
isoify_dates! traits
|
77
|
+
|
78
|
+
common.merge({
|
79
|
+
:type => 'group',
|
80
|
+
:groupId => group_id,
|
81
|
+
:traits => traits
|
82
|
+
})
|
83
|
+
end
|
84
|
+
|
85
|
+
# In addition to the common fields, page accepts:
|
86
|
+
#
|
87
|
+
# - "name"
|
88
|
+
# - "properties"
|
89
|
+
def parse_for_page(fields)
|
90
|
+
common = parse_common_fields(fields)
|
91
|
+
|
92
|
+
name = fields[:name] || ''
|
93
|
+
properties = fields[:properties] || {}
|
94
|
+
|
95
|
+
check_is_hash!(properties, 'properties')
|
96
|
+
|
97
|
+
isoify_dates! properties
|
98
|
+
|
99
|
+
common.merge({
|
100
|
+
:type => 'page',
|
101
|
+
:name => name.to_s,
|
102
|
+
:properties => properties
|
103
|
+
})
|
104
|
+
end
|
105
|
+
|
106
|
+
# In addition to the common fields, screen accepts:
|
107
|
+
#
|
108
|
+
# - "name"
|
109
|
+
# - "properties"
|
110
|
+
# - "category" (Not in spec, retained for backward compatibility"
|
111
|
+
def parse_for_screen(fields)
|
112
|
+
common = parse_common_fields(fields)
|
113
|
+
|
114
|
+
name = fields[:name]
|
115
|
+
properties = fields[:properties] || {}
|
116
|
+
category = fields[:category]
|
117
|
+
|
118
|
+
check_presence!(name, 'name')
|
119
|
+
check_is_hash!(properties, 'properties')
|
120
|
+
|
121
|
+
isoify_dates! properties
|
122
|
+
|
123
|
+
common.merge({
|
124
|
+
:type => 'screen',
|
125
|
+
:name => name,
|
126
|
+
:properties => properties,
|
127
|
+
:category => category
|
128
|
+
})
|
129
|
+
end
|
130
|
+
|
131
|
+
private
|
132
|
+
|
133
|
+
def parse_common_fields(fields)
|
134
|
+
timestamp = fields[:timestamp] || Time.new
|
135
|
+
message_id = fields[:message_id].to_s if fields[:message_id]
|
136
|
+
context = fields[:context] || {}
|
137
|
+
|
138
|
+
check_user_id! fields
|
139
|
+
check_timestamp! timestamp
|
140
|
+
|
141
|
+
add_context! context
|
142
|
+
|
143
|
+
{
|
144
|
+
:anonymousId => fields[:anonymous_id],
|
145
|
+
:context => context,
|
146
|
+
:integrations => fields[:integrations],
|
147
|
+
:messageId => message_id,
|
148
|
+
:timestamp => datetime_in_iso8601(timestamp),
|
149
|
+
:userId => fields[:user_id],
|
150
|
+
:options => fields[:options] # Not in spec, retained for backward compatibility
|
151
|
+
}
|
152
|
+
end
|
153
|
+
|
154
|
+
def check_user_id!(fields)
|
155
|
+
unless fields[:user_id] || fields[:anonymous_id]
|
156
|
+
raise ArgumentError, 'Must supply either user_id or anonymous_id'
|
157
|
+
end
|
158
|
+
end
|
159
|
+
|
160
|
+
def check_timestamp!(timestamp)
|
161
|
+
raise ArgumentError, 'Timestamp must be a Time' unless timestamp.is_a? Time
|
162
|
+
end
|
163
|
+
|
164
|
+
def add_context!(context)
|
165
|
+
context[:library] = { :name => 'analytics-ruby', :version => Segment::Analytics::VERSION.to_s }
|
166
|
+
end
|
167
|
+
|
168
|
+
# private: Ensures that a string is non-empty
|
169
|
+
#
|
170
|
+
# obj - String|Number that must be non-blank
|
171
|
+
# name - Name of the validated value
|
172
|
+
def check_presence!(obj, name)
|
173
|
+
if obj.nil? || (obj.is_a?(String) && obj.empty?)
|
174
|
+
raise ArgumentError, "#{name} must be given"
|
175
|
+
end
|
176
|
+
end
|
177
|
+
|
178
|
+
def check_is_hash!(obj, name)
|
179
|
+
raise ArgumentError, "#{name} must be a Hash" unless obj.is_a? Hash
|
180
|
+
end
|
181
|
+
end
|
182
|
+
end
|
183
|
+
end
|
184
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: analytics-ruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.2.
|
4
|
+
version: 2.2.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Segment.io
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-
|
11
|
+
date: 2019-05-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: commander
|
@@ -136,6 +136,7 @@ files:
|
|
136
136
|
- lib/segment/analytics/backoff_policy.rb
|
137
137
|
- lib/segment/analytics/client.rb
|
138
138
|
- lib/segment/analytics/defaults.rb
|
139
|
+
- lib/segment/analytics/field_parser.rb
|
139
140
|
- lib/segment/analytics/logging.rb
|
140
141
|
- lib/segment/analytics/message_batch.rb
|
141
142
|
- lib/segment/analytics/request.rb
|