analytics-ruby 0.3.3 → 0.3.4
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile.lock +1 -1
- data/History.md +4 -0
- data/Makefile +5 -0
- data/lib/analytics-ruby.rb +4 -4
- data/lib/analytics-ruby/client.rb +41 -33
- data/lib/analytics-ruby/consumer.rb +5 -5
- data/lib/analytics-ruby/defaults.rb +2 -2
- data/lib/analytics-ruby/json.rb +1 -1
- data/lib/analytics-ruby/request.rb +3 -3
- data/lib/analytics-ruby/util.rb +12 -1
- data/lib/analytics-ruby/version.rb +1 -1
- data/spec/client_spec.rb +49 -10
- data/spec/consumer_spec.rb +4 -5
- data/spec/module_spec.rb +6 -6
- data/spec/spec_helper.rb +34 -27
- metadata +3 -2
data/Gemfile.lock
CHANGED
data/History.md
CHANGED
data/lib/analytics-ruby.rb
CHANGED
@@ -5,22 +5,22 @@ module AnalyticsRuby
|
|
5
5
|
module ClassMethods
|
6
6
|
# By default use a single client for the module
|
7
7
|
def init(options = {})
|
8
|
-
@client = AnalyticsRuby::Client.new
|
8
|
+
@client = AnalyticsRuby::Client.new options
|
9
9
|
end
|
10
10
|
|
11
11
|
def track(options)
|
12
12
|
return false unless @client
|
13
|
-
@client.track
|
13
|
+
@client.track options
|
14
14
|
end
|
15
15
|
|
16
16
|
def identify(options)
|
17
17
|
return false unless @client
|
18
|
-
@client.identify
|
18
|
+
@client.identify options
|
19
19
|
end
|
20
20
|
|
21
21
|
def alias(options)
|
22
22
|
return false unless @client
|
23
|
-
@client.alias
|
23
|
+
@client.alias options
|
24
24
|
end
|
25
25
|
|
26
26
|
def flush
|
@@ -18,7 +18,7 @@ module AnalyticsRuby
|
|
18
18
|
# :on_error - Proc which handles error calls from the API
|
19
19
|
def initialize(options = {})
|
20
20
|
|
21
|
-
Util.symbolize_keys!
|
21
|
+
Util.symbolize_keys! options
|
22
22
|
|
23
23
|
@queue = Queue.new
|
24
24
|
@secret = options[:secret]
|
@@ -26,7 +26,7 @@ module AnalyticsRuby
|
|
26
26
|
|
27
27
|
check_secret
|
28
28
|
|
29
|
-
@consumer = AnalyticsRuby::Consumer.new
|
29
|
+
@consumer = AnalyticsRuby::Consumer.new @queue, @secret, options
|
30
30
|
@thread = Thread.new { @consumer.run }
|
31
31
|
end
|
32
32
|
|
@@ -52,7 +52,7 @@ module AnalyticsRuby
|
|
52
52
|
|
53
53
|
check_secret
|
54
54
|
|
55
|
-
Util.symbolize_keys!
|
55
|
+
Util.symbolize_keys! options
|
56
56
|
|
57
57
|
event = options[:event]
|
58
58
|
user_id = options[:user_id].to_s
|
@@ -60,23 +60,26 @@ module AnalyticsRuby
|
|
60
60
|
timestamp = options[:timestamp] || Time.new
|
61
61
|
context = options[:context] || {}
|
62
62
|
|
63
|
-
ensure_user
|
64
|
-
check_timestamp
|
63
|
+
ensure_user user_id
|
64
|
+
check_timestamp timestamp
|
65
65
|
|
66
66
|
if event.nil? || event.empty?
|
67
67
|
fail ArgumentError, 'Must supply event as a non-empty string'
|
68
68
|
end
|
69
69
|
|
70
70
|
fail ArgumentError, 'Properties must be a Hash' unless properties.is_a? Hash
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
71
|
+
Util.isoify_dates! properties
|
72
|
+
|
73
|
+
add_context context
|
74
|
+
|
75
|
+
enqueue({
|
76
|
+
:event => event,
|
77
|
+
:userId => user_id,
|
78
|
+
:context => context,
|
79
|
+
:properties => properties,
|
80
|
+
:timestamp => timestamp.iso8601,
|
81
|
+
:action => 'track'
|
82
|
+
})
|
80
83
|
end
|
81
84
|
|
82
85
|
# public: Identifies a user
|
@@ -90,25 +93,28 @@ module AnalyticsRuby
|
|
90
93
|
|
91
94
|
check_secret
|
92
95
|
|
93
|
-
Util.symbolize_keys!
|
96
|
+
Util.symbolize_keys! options
|
94
97
|
|
95
98
|
user_id = options[:user_id].to_s
|
96
99
|
traits = options[:traits] || {}
|
97
100
|
timestamp = options[:timestamp] || Time.new
|
98
101
|
context = options[:context] || {}
|
99
102
|
|
100
|
-
ensure_user
|
101
|
-
check_timestamp
|
103
|
+
ensure_user user_id
|
104
|
+
check_timestamp timestamp
|
102
105
|
|
103
106
|
fail ArgumentError, 'Must supply traits as a hash' unless traits.is_a? Hash
|
107
|
+
Util.isoify_dates! traits
|
104
108
|
|
105
|
-
add_context
|
109
|
+
add_context context
|
106
110
|
|
107
|
-
enqueue({
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
111
|
+
enqueue({
|
112
|
+
:userId => user_id,
|
113
|
+
:context => context,
|
114
|
+
:traits => traits,
|
115
|
+
:timestamp => timestamp.iso8601,
|
116
|
+
:action => 'identify'
|
117
|
+
})
|
112
118
|
end
|
113
119
|
|
114
120
|
# public: Aliases a user from one id to another
|
@@ -122,24 +128,26 @@ module AnalyticsRuby
|
|
122
128
|
|
123
129
|
check_secret
|
124
130
|
|
125
|
-
Util.symbolize_keys!
|
131
|
+
Util.symbolize_keys! options
|
126
132
|
|
127
133
|
from = options[:from].to_s
|
128
134
|
to = options[:to].to_s
|
129
135
|
timestamp = options[:timestamp] || Time.new
|
130
136
|
context = options[:context] || {}
|
131
137
|
|
132
|
-
ensure_user
|
133
|
-
ensure_user
|
134
|
-
check_timestamp
|
138
|
+
ensure_user from
|
139
|
+
ensure_user to
|
140
|
+
check_timestamp timestamp
|
135
141
|
|
136
|
-
add_context
|
142
|
+
add_context context
|
137
143
|
|
138
|
-
enqueue({
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
144
|
+
enqueue({
|
145
|
+
:from => from,
|
146
|
+
:to => to,
|
147
|
+
:context => context,
|
148
|
+
:timestamp => timestamp.iso8601,
|
149
|
+
:action => 'alias'
|
150
|
+
})
|
143
151
|
end
|
144
152
|
|
145
153
|
# public: Returns the number of queued messages
|
@@ -19,7 +19,7 @@ module AnalyticsRuby
|
|
19
19
|
# on_error - Proc of what to do on an error
|
20
20
|
#
|
21
21
|
def initialize(queue, secret, options = {})
|
22
|
-
Util.symbolize_keys!
|
22
|
+
Util.symbolize_keys! options
|
23
23
|
|
24
24
|
@queue = queue
|
25
25
|
@secret = secret
|
@@ -43,19 +43,19 @@ module AnalyticsRuby
|
|
43
43
|
#
|
44
44
|
def flush
|
45
45
|
# Block until we have something to send
|
46
|
-
item = @queue.pop
|
46
|
+
item = @queue.pop
|
47
47
|
|
48
48
|
# Synchronize on additions to the current batch
|
49
49
|
@mutex.synchronize {
|
50
50
|
@current_batch << item
|
51
51
|
until @current_batch.length >= @batch_size || @queue.empty?
|
52
|
-
@current_batch << @queue.pop
|
52
|
+
@current_batch << @queue.pop
|
53
53
|
end
|
54
54
|
}
|
55
55
|
|
56
56
|
req = AnalyticsRuby::Request.new
|
57
|
-
res = req.post
|
58
|
-
@on_error.call
|
57
|
+
res = req.post @secret, @current_batch
|
58
|
+
@on_error.call res.status, res.error unless res.status == 200
|
59
59
|
@mutex.synchronize {
|
60
60
|
@current_batch = []
|
61
61
|
}
|
@@ -5,8 +5,8 @@ module AnalyticsRuby
|
|
5
5
|
module Request
|
6
6
|
BASE_URL = 'https://api.segment.io' unless defined? AnalyticsRuby::Defaults::Request::BASE_URL
|
7
7
|
PATH = '/v1/import' unless defined? AnalyticsRuby::Defaults::Request::PATH
|
8
|
-
SSL = { verify
|
9
|
-
HEADERS = { accept
|
8
|
+
SSL = { :verify => false } unless defined? AnalyticsRuby::Defaults::Request::SSL
|
9
|
+
HEADERS = { :accept => 'application/json' } unless defined? AnalyticsRuby::Defaults::Request::HEADERS
|
10
10
|
end
|
11
11
|
|
12
12
|
module Queue
|
data/lib/analytics-ruby/json.rb
CHANGED
@@ -18,7 +18,7 @@ module AnalyticsRuby
|
|
18
18
|
options[:headers] ||= AnalyticsRuby::Defaults::Request::HEADERS
|
19
19
|
@path = options[:path] || AnalyticsRuby::Defaults::Request::PATH
|
20
20
|
|
21
|
-
@conn = Faraday.new
|
21
|
+
@conn = Faraday.new options do |faraday|
|
22
22
|
faraday.request :json
|
23
23
|
faraday.response :json, :content_type => /\bjson$/
|
24
24
|
faraday.adapter Faraday.default_adapter
|
@@ -37,7 +37,7 @@ module AnalyticsRuby
|
|
37
37
|
req.options[:timeout] = 8
|
38
38
|
req.options[:open_timeout] = 3
|
39
39
|
req.url(@path)
|
40
|
-
req.body = AnalyticsRuby::JSON::dump
|
40
|
+
req.body = AnalyticsRuby::JSON::dump :secret => secret, :batch => batch
|
41
41
|
end
|
42
42
|
status = res.status
|
43
43
|
error = res.body["error"]
|
@@ -47,7 +47,7 @@ module AnalyticsRuby
|
|
47
47
|
error = "Connection error: #{err}"
|
48
48
|
end
|
49
49
|
|
50
|
-
AnalyticsRuby::Response.new
|
50
|
+
AnalyticsRuby::Response.new status, error
|
51
51
|
end
|
52
52
|
end
|
53
53
|
end
|
data/lib/analytics-ruby/util.rb
CHANGED
@@ -4,10 +4,21 @@ module Util
|
|
4
4
|
end
|
5
5
|
|
6
6
|
def self.symbolize_keys!(hash)
|
7
|
-
hash.replace symbolize_keys
|
7
|
+
hash.replace symbolize_keys hash
|
8
8
|
end
|
9
9
|
|
10
10
|
def self.stringify_keys(hash)
|
11
11
|
hash.inject({}) { |memo, (k,v)| memo[k.to_s] = v; memo }
|
12
12
|
end
|
13
|
+
|
14
|
+
def self.isoify_dates(hash)
|
15
|
+
hash.inject({}) { |memo, (k, v)|
|
16
|
+
memo[k] = v.respond_to?(:iso8601) ? v.iso8601 : v
|
17
|
+
memo
|
18
|
+
}
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.isoify_dates!(hash)
|
22
|
+
hash.replace isoify_dates hash
|
23
|
+
end
|
13
24
|
end
|
data/spec/client_spec.rb
CHANGED
@@ -11,7 +11,7 @@ describe Analytics::Client do
|
|
11
11
|
end
|
12
12
|
|
13
13
|
it 'should not error if a secret is supplied' do
|
14
|
-
Analytics::Client.new secret
|
14
|
+
Analytics::Client.new :secret => AnalyticsHelpers::SECRET
|
15
15
|
end
|
16
16
|
|
17
17
|
it 'should not error if a secret is supplied as a string' do
|
@@ -22,29 +22,51 @@ describe Analytics::Client do
|
|
22
22
|
describe '#track' do
|
23
23
|
|
24
24
|
before(:all) do
|
25
|
-
@client = Analytics::Client.new secret
|
25
|
+
@client = Analytics::Client.new :secret => AnalyticsHelpers::SECRET
|
26
|
+
@client.instance_variable_get(:@thread).kill
|
27
|
+
@queue = @client.instance_variable_get :@queue
|
26
28
|
end
|
27
29
|
|
28
30
|
it 'should error without an event' do
|
29
|
-
expect { @client.track(user_id
|
31
|
+
expect { @client.track(:user_id => 'user') }.to raise_error(ArgumentError)
|
30
32
|
end
|
31
33
|
|
32
34
|
it 'should error without a user_id' do
|
33
|
-
expect { @client.track(event
|
35
|
+
expect { @client.track(:event => 'Event') }.to raise_error(ArgumentError)
|
34
36
|
end
|
35
37
|
|
36
38
|
it 'should error if properties is not a hash' do
|
37
39
|
expect {
|
38
|
-
@client.track(
|
40
|
+
@client.track({
|
41
|
+
:user_id => 'user',
|
42
|
+
:event => 'Event',
|
43
|
+
:properties => [1,2,3]
|
44
|
+
})
|
39
45
|
}.to raise_error(ArgumentError)
|
40
46
|
end
|
41
47
|
|
42
48
|
it 'should not error with the required options' do
|
43
49
|
@client.track AnalyticsHelpers::Queued::TRACK
|
50
|
+
@queue.pop
|
44
51
|
end
|
45
52
|
|
46
53
|
it 'should not error when given string keys' do
|
47
54
|
@client.track Util.stringify_keys(AnalyticsHelpers::Queued::TRACK)
|
55
|
+
@queue.pop
|
56
|
+
end
|
57
|
+
|
58
|
+
it 'should convert Time properties into iso8601 format' do
|
59
|
+
@client.track({
|
60
|
+
:user_id => 'user',
|
61
|
+
:event => 'Event',
|
62
|
+
:properties => {
|
63
|
+
:time => Time.utc(2013),
|
64
|
+
:nottime => 'x'
|
65
|
+
}
|
66
|
+
})
|
67
|
+
message = @queue.pop
|
68
|
+
message[:properties][:time].should == '2013-01-01T00:00:00Z'
|
69
|
+
message[:properties][:nottime].should == 'x'
|
48
70
|
end
|
49
71
|
end
|
50
72
|
|
@@ -52,7 +74,9 @@ describe Analytics::Client do
|
|
52
74
|
describe '#identify' do
|
53
75
|
|
54
76
|
before(:all) do
|
55
|
-
@client = Analytics::Client.new secret
|
77
|
+
@client = Analytics::Client.new :secret => AnalyticsHelpers::SECRET
|
78
|
+
@client.instance_variable_get(:@thread).kill
|
79
|
+
@queue = @client.instance_variable_get :@queue
|
56
80
|
end
|
57
81
|
|
58
82
|
it 'should error without any user id' do
|
@@ -61,24 +85,39 @@ describe Analytics::Client do
|
|
61
85
|
|
62
86
|
it 'should not error with the required options' do
|
63
87
|
@client.identify AnalyticsHelpers::Queued::IDENTIFY
|
88
|
+
@queue.pop
|
64
89
|
end
|
65
90
|
|
66
91
|
it 'should not error with the required options as strings' do
|
67
92
|
@client.identify Util.stringify_keys(AnalyticsHelpers::Queued::IDENTIFY)
|
93
|
+
@queue.pop
|
94
|
+
end
|
95
|
+
|
96
|
+
it 'should convert Time traits into iso8601 format' do
|
97
|
+
@client.identify({
|
98
|
+
:user_id => 'user',
|
99
|
+
:traits => {
|
100
|
+
:time => Time.utc(2013),
|
101
|
+
:nottime => 'x'
|
102
|
+
}
|
103
|
+
})
|
104
|
+
message = @queue.pop
|
105
|
+
message[:traits][:time].should == '2013-01-01T00:00:00Z'
|
106
|
+
message[:traits][:nottime].should == 'x'
|
68
107
|
end
|
69
108
|
end
|
70
109
|
|
71
110
|
describe '#alias' do
|
72
111
|
before :all do
|
73
|
-
@client = Analytics::Client.new secret
|
112
|
+
@client = Analytics::Client.new :secret => AnalyticsHelpers::SECRET
|
74
113
|
end
|
75
114
|
|
76
115
|
it 'should error without from' do
|
77
|
-
expect { @client.alias to
|
116
|
+
expect { @client.alias :to => 1234 }.to raise_error(ArgumentError)
|
78
117
|
end
|
79
118
|
|
80
119
|
it 'should error without to' do
|
81
|
-
expect { @client.alias from
|
120
|
+
expect { @client.alias :from => 1234 }.to raise_error(ArgumentError)
|
82
121
|
end
|
83
122
|
|
84
123
|
it 'should not error with the required options' do
|
@@ -92,7 +131,7 @@ describe Analytics::Client do
|
|
92
131
|
|
93
132
|
describe '#flush' do
|
94
133
|
before(:all) do
|
95
|
-
@client = Analytics::Client.new secret
|
134
|
+
@client = Analytics::Client.new :secret => AnalyticsHelpers::SECRET
|
96
135
|
end
|
97
136
|
|
98
137
|
it 'should wait for the queue to finish on a flush' do
|
data/spec/consumer_spec.rb
CHANGED
@@ -30,9 +30,8 @@ describe Analytics::Consumer do
|
|
30
30
|
|
31
31
|
it 'should execute the error handler if the request is invalid' do
|
32
32
|
|
33
|
-
Analytics::Request.any_instance
|
34
|
-
|
35
|
-
.and_return(Analytics::Response.new(400, "Some error"))
|
33
|
+
Analytics::Request.any_instance.stub(:post).and_return(
|
34
|
+
Analytics::Response.new(400, "Some error"))
|
36
35
|
|
37
36
|
on_error = Proc.new do |status, error|
|
38
37
|
puts "#{status}, #{error}"
|
@@ -42,7 +41,7 @@ describe Analytics::Consumer do
|
|
42
41
|
|
43
42
|
queue = Queue.new
|
44
43
|
queue << {}
|
45
|
-
consumer = Analytics::Consumer.new
|
44
|
+
consumer = Analytics::Consumer.new queue, 'secret', :on_error => on_error
|
46
45
|
consumer.flush
|
47
46
|
|
48
47
|
Analytics::Request::any_instance.unstub(:post)
|
@@ -60,7 +59,7 @@ describe Analytics::Consumer do
|
|
60
59
|
|
61
60
|
queue = Queue.new
|
62
61
|
queue << AnalyticsHelpers::Requested::TRACK
|
63
|
-
consumer = Analytics::Consumer.new
|
62
|
+
consumer = Analytics::Consumer.new queue, 'testsecret', :on_error => on_error
|
64
63
|
consumer.flush
|
65
64
|
|
66
65
|
queue.should be_empty
|
data/spec/module_spec.rb
CHANGED
@@ -24,18 +24,18 @@ describe Analytics do
|
|
24
24
|
describe '#init' do
|
25
25
|
|
26
26
|
it 'should successfully init' do
|
27
|
-
Analytics.init secret
|
27
|
+
Analytics.init :secret => AnalyticsHelpers::SECRET
|
28
28
|
end
|
29
29
|
end
|
30
30
|
|
31
31
|
describe '#track' do
|
32
32
|
|
33
33
|
it 'should error without an event' do
|
34
|
-
expect { Analytics.track user_id
|
34
|
+
expect { Analytics.track :user_id => 'user' }.to raise_error(ArgumentError)
|
35
35
|
end
|
36
36
|
|
37
37
|
it 'should error without a user_id' do
|
38
|
-
expect { Analytics.track event
|
38
|
+
expect { Analytics.track :event => 'Event' }.to raise_error(ArgumentError)
|
39
39
|
end
|
40
40
|
|
41
41
|
it 'should not error with the required options' do
|
@@ -47,7 +47,7 @@ describe Analytics do
|
|
47
47
|
|
48
48
|
describe '#identify' do
|
49
49
|
it 'should error without a user_id' do
|
50
|
-
expect { Analytics.identify traits
|
50
|
+
expect { Analytics.identify :traits => {} }.to raise_error(ArgumentError)
|
51
51
|
end
|
52
52
|
|
53
53
|
it 'should not error with the required options' do
|
@@ -58,11 +58,11 @@ describe Analytics do
|
|
58
58
|
|
59
59
|
describe '#alias' do
|
60
60
|
it 'should error without from' do
|
61
|
-
expect { Analytics.alias to
|
61
|
+
expect { Analytics.alias :to => 1234 }.to raise_error(ArgumentError)
|
62
62
|
end
|
63
63
|
|
64
64
|
it 'should error without to' do
|
65
|
-
expect { Analytics.alias from
|
65
|
+
expect { Analytics.alias :from => 1234 }.to raise_error(ArgumentError)
|
66
66
|
end
|
67
67
|
|
68
68
|
it 'should not error with the required options' do
|
data/spec/spec_helper.rb
CHANGED
@@ -3,41 +3,48 @@ module AnalyticsHelpers
|
|
3
3
|
|
4
4
|
SECRET = 'testsecret'
|
5
5
|
|
6
|
-
TRACK = {
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
6
|
+
TRACK = {
|
7
|
+
:event => 'Ruby Library test event',
|
8
|
+
:properties => {
|
9
|
+
:type => 'Chocolate',
|
10
|
+
:is_a_lie => true,
|
11
|
+
:layers => 20,
|
12
|
+
:created => Time.new
|
13
|
+
}
|
14
|
+
}
|
15
|
+
|
16
|
+
IDENTIFY = {
|
17
|
+
:traits => {
|
18
|
+
:likes_animals => true,
|
19
|
+
:instrument => 'Guitar',
|
20
|
+
:age => 25
|
21
|
+
},
|
22
|
+
:action => 'identify'
|
23
|
+
}
|
24
|
+
|
25
|
+
ALIAS = {
|
26
|
+
:from => 1234,
|
27
|
+
:to => 'abcd'
|
28
|
+
}
|
25
29
|
|
26
30
|
USER_ID = 1234
|
27
31
|
|
28
32
|
# Hashes sent to the client
|
29
33
|
module Queued
|
30
|
-
TRACK = TRACK.merge
|
31
|
-
|
32
|
-
IDENTIFY = IDENTIFY.merge({ user_id: USER_ID })
|
34
|
+
TRACK = TRACK.merge :user_id => USER_ID
|
35
|
+
IDENTIFY = IDENTIFY.merge :user_id => USER_ID
|
33
36
|
end
|
34
37
|
|
35
38
|
# Hashes which are sent from the consumer
|
36
39
|
module Requested
|
37
|
-
TRACK = TRACK.merge({
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
40
|
+
TRACK = TRACK.merge({
|
41
|
+
:userId => USER_ID,
|
42
|
+
:action => 'track'
|
43
|
+
})
|
44
|
+
|
45
|
+
IDENTIFY = IDENTIFY.merge({
|
46
|
+
:userId => USER_ID,
|
47
|
+
:action => 'identify'
|
48
|
+
})
|
42
49
|
end
|
43
50
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: analytics-ruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.4
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-08-
|
12
|
+
date: 2013-08-27 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: faraday
|
@@ -122,6 +122,7 @@ files:
|
|
122
122
|
- lib/analytics-ruby/util.rb
|
123
123
|
- lib/analytics-ruby/version.rb
|
124
124
|
- lib/analytics-ruby.rb
|
125
|
+
- Makefile
|
125
126
|
- Rakefile
|
126
127
|
- README.md
|
127
128
|
- spec/client_spec.rb
|