-
Notifications
You must be signed in to change notification settings - Fork 120
/
client.rb
143 lines (112 loc) · 3.86 KB
/
client.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
require 'time'
require 'thread'
require 'analytics/defaults'
require 'analytics/consumer'
require 'analytics/request'
module Analytics
class Client
# public: Creates a new client
#
# options - Hash
# :secret - String of your project's secret
# :max_queue_size - Fixnum of the max calls to remain queued (optional)
# :on_error - Proc which handles error calls from the API
def initialize (options = {})
@queue = Queue.new
@secret = options[:secret]
@max_queue_size = options[:max_queue_size] || Analytics::Defaults::Queue::MAX_SIZE
check_secret
@consumer = Analytics::Consumer.new(@queue, @secret, options)
Thread.new { @consumer.run }
end
# public: Tracks an event
#
# options - Hash
# :event - String of event name.
# :user_id - String of the user id.
# :properties - Hash of event properties. (optional)
# :timestamp - Time of when the event occurred. (optional)
# :context - Hash of context. (optional)
def track(options)
check_secret
event = options[:event]
user_id = options[:user_id]
properties = options[:properties] || {}
timestamp = options[:timestamp] || Time.new
context = options[:context] || {}
ensure_user(user_id)
check_timestamp(timestamp)
if event.nil? || event.empty?
fail ArgumentError, 'Must supply event as a non-empty string'
end
add_context(context)
enqueue({ event: event,
userId: user_id,
context: context,
properties: properties,
timestamp: timestamp.iso8601,
action: 'track' })
end
# public: Identifies a user
#
# options - Hash
# :user_id - String of the user id
# :traits - Hash of user traits. (optional)
# :timestamp - Time of when the event occurred. (optional)
# :context - Hash of context. (optional)
def identify(options)
check_secret
user_id = options[:user_id]
traits = options[:traits] || {}
timestamp = options[:timestamp] || Time.new
context = options[:context] || {}
ensure_user(user_id)
check_timestamp(timestamp)
fail ArgumentError, 'Must supply traits as a hash' unless traits.is_a? Hash
add_context(context)
enqueue({ userId: user_id,
context: context,
traits: traits,
timestamp: timestamp.iso8601,
action: 'identify' })
end
# public: Returns the number of queued messages
#
# returns Fixnum of messages in the queue
def queued_messages
@queue.length
end
private
# private: Enqueues the action.
#
# returns Boolean of whether the item was added to the queue.
def enqueue(action)
queue_full = @queue.length >= @max_queue_size
@queue << action unless queue_full
!queue_full
end
# private: Ensures that a user id was passed in.
#
# user_id - String of the user id
#
def ensure_user(user_id)
message = 'Must supply a non-empty user_id'
valid = user_id.is_a?(String) && !user_id.empty?
fail ArgumentError, message unless valid
end
# private: Adds contextual information to the call
#
# context - Hash of call context
def add_context(context)
context[:library] = 'analytics-ruby'
end
# private: Checks that the secret is properly initialized
def check_secret
fail 'Secret must be initialized' if @secret.nil?
end
# private: Checks the timstamp option to make sure it is a Time.
def check_timestamp(timestamp)
fail ArgumentError, 'Timestamp must be a Time' unless timestamp.is_a? Time
end
end
end