statsmix 0.1.10 → 0.2.1
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.
- data/README.md +20 -6
- data/VERSION +1 -1
- data/lib/statsmix.rb +137 -11
- data/statsmix.gemspec +2 -2
- data/test/test_statsmix.rb +13 -2
- metadata +4 -4
data/README.md
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
A Ruby gem for the StatsMix API - http://www.statsmix.com/developers
|
1
|
+
A Ruby gem for the StatsMix API - [http://www.statsmix.com/developers](http://www.statsmix.com/developers)
|
2
2
|
|
3
3
|
## What is StatsMix?
|
4
4
|
|
@@ -8,12 +8,14 @@ StatsMix makes it easy to track, chart, and share application and business metri
|
|
8
8
|
* View a real-time chart of these application events in StatsMix's web UI
|
9
9
|
* Share the charts with users inside and outside your organization
|
10
10
|
* Create and share custom dashboards that aggregate multiple metrics together
|
11
|
-
* Example dashboard: http://www.statsmix.com/d/0e788d59208900e7e3bc
|
12
|
-
* Example embedded dashboard: http://www.statsmix.com/example-embedded
|
11
|
+
* Example dashboard: [http://www.statsmix.com/d/0e788d59208900e7e3bc](http://www.statsmix.com/d/0e788d59208900e7e3bc)
|
12
|
+
* Example embedded dashboard: [http://www.statsmix.com/example-embedded](http://www.statsmix.com/example-embedded)
|
13
13
|
|
14
|
-
To get started, you'll need an API key for StatsMix. You can get a free developer account here: http://www.statsmix.com/try?plan=developer
|
14
|
+
To get started, you'll need an API key for StatsMix. You can get a free developer account here: [http://www.statsmix.com/try?plan=developer](http://www.statsmix.com/try?plan=developer)
|
15
15
|
|
16
|
-
Full gem documentation is at http://www.statsmix.com/developers/ruby_gem
|
16
|
+
Full gem documentation is at [http://www.statsmix.com/developers/ruby_gem](http://www.statsmix.com/developers/ruby_gem)
|
17
|
+
|
18
|
+
Partner API documentation is at [http://www.statsmix.com/developers/partner_api](http://www.statsmix.com/developers/partner_api)
|
17
19
|
|
18
20
|
## Quick Start
|
19
21
|
|
@@ -57,7 +59,19 @@ To redirect all stats in dev environment to a test metric:
|
|
57
59
|
|
58
60
|
## More Documentation
|
59
61
|
|
60
|
-
The StatsMix gem supports all the methods documented at http://www.statsmix.com/developers/documentation
|
62
|
+
The StatsMix gem supports all the methods documented at [http://www.statsmix.com/developers/documentation](http://www.statsmix.com/developers/documentation)
|
63
|
+
|
64
|
+
## Partner API
|
65
|
+
We recently added ALPHA-LEVEL support for our Partner API, which allows you to provision users and metrics in StatsMix. The methods are:
|
66
|
+
|
67
|
+
|
68
|
+
StatsMix.create_user({})
|
69
|
+
StatsMix.update_user(id,{})
|
70
|
+
StatsMix.delete_user(id)
|
71
|
+
|
72
|
+
In all cases, the affected user's api key will be available via `StatsMix.user_api_key`. You can use the api key for updating and deleting users as well. In other words, __there is no need to store another identifier besides the user's api key.__
|
73
|
+
|
74
|
+
Full Partner API documentation is at [http://www.statsmix.com/developers/partner_api](http://www.statsmix.com/developers/partner_api)
|
61
75
|
|
62
76
|
## Contributing to statsmix
|
63
77
|
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.1
|
1
|
+
0.2.1
|
data/lib/statsmix.rb
CHANGED
@@ -14,6 +14,9 @@ class StatsMix
|
|
14
14
|
# Optional: value, options {:generated_at}
|
15
15
|
# Returns: Net::HTTP object
|
16
16
|
def self.track(name, value = nil, options = {})
|
17
|
+
if options.respond_to?('with_indifferent_access')
|
18
|
+
options = options.with_indifferent_access
|
19
|
+
end
|
17
20
|
self.connect('track')
|
18
21
|
@request_uri = @url.path + '.' + @format
|
19
22
|
@request = Net::HTTP::Get.new(@request_uri)
|
@@ -23,12 +26,7 @@ class StatsMix
|
|
23
26
|
end
|
24
27
|
@params[:value] = value if value != nil
|
25
28
|
@params.merge!(options)
|
26
|
-
|
27
|
-
if @params[:meta] && !@params[:meta].is_a?(String)
|
28
|
-
if @params[:meta].respond_to?('to_json')
|
29
|
-
@params[:meta] = @params[:meta].to_json
|
30
|
-
end
|
31
|
-
end
|
29
|
+
self.check_meta
|
32
30
|
return do_request
|
33
31
|
end
|
34
32
|
# Stats
|
@@ -40,6 +38,9 @@ class StatsMix
|
|
40
38
|
# Use start_date and end_date as has keys in the third param to scope the date range of stats based on the generated_at timestamp of a stat
|
41
39
|
# Returns: Net::HTTP object
|
42
40
|
def self.list_stats(metric_id, limit = nil, options = {})
|
41
|
+
if options.respond_to?('with_indifferent_access')
|
42
|
+
options = options.with_indifferent_access
|
43
|
+
end
|
43
44
|
self.connect('stats')
|
44
45
|
@request_uri = @url.path + '.' + @format
|
45
46
|
@request = Net::HTTP::Get.new(@request_uri)
|
@@ -73,26 +74,34 @@ class StatsMix
|
|
73
74
|
# Optional: value, params[:generated_at, :meta]
|
74
75
|
# Returns: Net::HTTP object
|
75
76
|
def self.create_stat(metric_id, value = nil, params = {})
|
77
|
+
if params.respond_to?('with_indifferent_access')
|
78
|
+
params = params.with_indifferent_access
|
79
|
+
end
|
76
80
|
connect('stats')
|
77
81
|
@request_uri = @url.path + '.' + @format
|
78
82
|
@request = Net::HTTP::Post.new(@request_uri)
|
79
83
|
@params[:metric_id] = metric_id
|
80
|
-
@params.merge!(params)
|
81
84
|
@params[:value] = value if value
|
85
|
+
@params.merge!(params)
|
86
|
+
self.check_meta
|
82
87
|
return do_request
|
83
88
|
end
|
84
89
|
|
85
90
|
# Update stat
|
86
91
|
#
|
87
92
|
# Required: stat_id
|
88
|
-
# Optional: value, generated_at, meta
|
93
|
+
# Optional: value, params[:generated_at, :meta]
|
89
94
|
# Returns: Net::HTTP object
|
90
95
|
def self.update_stat(stat_id, value = nil, params = {})
|
96
|
+
if params.respond_to?('with_indifferent_access')
|
97
|
+
params = params.with_indifferent_access
|
98
|
+
end
|
91
99
|
connect('stats')
|
92
100
|
@request_uri = @url.path + '/' + stat_id.to_s + '.' + @format
|
93
101
|
@request = Net::HTTP::Put.new(@request_uri)
|
102
|
+
@params[:value] = value if value
|
94
103
|
@params.merge!(params)
|
95
|
-
|
104
|
+
self.check_meta
|
96
105
|
return do_request
|
97
106
|
end
|
98
107
|
|
@@ -144,6 +153,9 @@ class StatsMix
|
|
144
153
|
# Optional: params[:profile_id, :sharing, :include_in_email]
|
145
154
|
# Returns: Net::HTTP object
|
146
155
|
def self.create_metric(name, params = {})
|
156
|
+
if params.respond_to?('with_indifferent_access')
|
157
|
+
params = params.with_indifferent_access
|
158
|
+
end
|
147
159
|
connect('metrics')
|
148
160
|
@params.merge!(params)
|
149
161
|
@params[:name] = name
|
@@ -157,7 +169,10 @@ class StatsMix
|
|
157
169
|
# Required: metric_id
|
158
170
|
# Optional: params[:profile_id, :sharing, :include_in_email]
|
159
171
|
# Returns: Net::HTTP object
|
160
|
-
def self.update_metric(metric_id, params = {})
|
172
|
+
def self.update_metric(metric_id, params = {})
|
173
|
+
if params.respond_to?('with_indifferent_access')
|
174
|
+
params = params.with_indifferent_access
|
175
|
+
end
|
161
176
|
connect('metrics')
|
162
177
|
@params = [] if @params.nil?
|
163
178
|
@params.merge!(params)
|
@@ -179,6 +194,82 @@ class StatsMix
|
|
179
194
|
return do_request
|
180
195
|
end
|
181
196
|
|
197
|
+
# partner api methods
|
198
|
+
# see http://www.statsmix.com/developers/partner_api
|
199
|
+
|
200
|
+
# list users
|
201
|
+
#
|
202
|
+
# Optional: none
|
203
|
+
# Returns: Net::HTTP object
|
204
|
+
def self.list_users
|
205
|
+
connect('partners/users')
|
206
|
+
@request_uri = @url.path
|
207
|
+
@request = Net::HTTP::Get.new(@request_uri)
|
208
|
+
return do_request
|
209
|
+
end
|
210
|
+
|
211
|
+
# Get user
|
212
|
+
#
|
213
|
+
# Required: id_or_api_key - id or api key of the user to get
|
214
|
+
# Optional: none
|
215
|
+
# Returns: Net::HTTP object
|
216
|
+
def self.get_user(id_or_api_key)
|
217
|
+
connect('partners/users')
|
218
|
+
@request_uri = @url.path + '/' + id_or_api_key.to_s + '.' + @format
|
219
|
+
@request = Net::HTTP::Get.new(@request_uri)
|
220
|
+
return do_request
|
221
|
+
end
|
222
|
+
|
223
|
+
# Create user
|
224
|
+
#
|
225
|
+
# Required: {:email => 'user@example.com'} - if the email already exists in our system, we will return the existing user
|
226
|
+
# Optional: :email,:name,:plan,:company,:url, :metrics[]
|
227
|
+
# Returns: Net::HTTP object
|
228
|
+
def self.create_user(params = {})
|
229
|
+
connect('partners/users')
|
230
|
+
@request_uri = @url.path + '.' + @format
|
231
|
+
@request = Net::HTTP::Post.new(@request_uri)
|
232
|
+
@params.merge!(params)
|
233
|
+
result = do_request
|
234
|
+
unless self.error
|
235
|
+
@user_api_key = result.scan(/<api_key>[0-9a-zA-Z]*<\/api_key>/)[0].gsub(/<\/?api_key>/,'')
|
236
|
+
end
|
237
|
+
return result
|
238
|
+
end
|
239
|
+
|
240
|
+
# Update user
|
241
|
+
#
|
242
|
+
# Required: id_or_api_key - id or api key of the user to get
|
243
|
+
# Optional: params with keys :email,:name,:plan,:company,:url
|
244
|
+
# Returns: Net::HTTP object
|
245
|
+
def self.update_user(id_or_api_key, params = {})
|
246
|
+
connect('partners/users')
|
247
|
+
@request_uri = @url.path + '/' + id_or_api_key.to_s + '.' + @format
|
248
|
+
@request = Net::HTTP::Put.new(@request_uri)
|
249
|
+
@params.merge!(params)
|
250
|
+
result = do_request
|
251
|
+
unless self.error
|
252
|
+
@user_api_key = result.scan(/<api_key>[0-9a-zA-Z]*<\/api_key>/)[0].gsub(/<\/?api_key>/,'')
|
253
|
+
end
|
254
|
+
return result
|
255
|
+
end
|
256
|
+
|
257
|
+
# Delete user
|
258
|
+
#
|
259
|
+
# Required: id_or_api_key - id or api key of the user to get
|
260
|
+
# Optional: none
|
261
|
+
# Returns: Net::HTTP object
|
262
|
+
def self.delete_user(id_or_api_key)
|
263
|
+
connect('partners/users')
|
264
|
+
@request_uri = @url.path + '/' + id_or_api_key.to_s + '.' + @format
|
265
|
+
@request = Net::HTTP::Delete.new(@request_uri)
|
266
|
+
result = do_request
|
267
|
+
unless self.error
|
268
|
+
@user_api_key = result.scan(/<api_key>[0-9a-zA-Z]*<\/api_key>/)[0].gsub(/<\/?api_key>/,'')
|
269
|
+
end
|
270
|
+
return result
|
271
|
+
end
|
272
|
+
|
182
273
|
# Returns: Net::HTTP object
|
183
274
|
def self.response
|
184
275
|
@response
|
@@ -212,6 +303,11 @@ class StatsMix
|
|
212
303
|
@ignore
|
213
304
|
end
|
214
305
|
|
306
|
+
#Return: string
|
307
|
+
def self.user_api_key
|
308
|
+
@user_api_key
|
309
|
+
end
|
310
|
+
|
215
311
|
def self.test_metric_name=(name)
|
216
312
|
@test_metric_name = name
|
217
313
|
end
|
@@ -281,13 +377,17 @@ class StatsMix
|
|
281
377
|
@request = Hash.new
|
282
378
|
@request["User-Agent"] = @user_agent
|
283
379
|
@params = Hash.new
|
380
|
+
if @params.respond_to?('with_indifferent_access')
|
381
|
+
@params = @params.with_indifferent_access
|
382
|
+
end
|
284
383
|
@params[:api_key] = @api_key
|
285
384
|
end
|
286
385
|
|
287
386
|
def self.do_request
|
288
387
|
@error = false
|
289
388
|
return if @ignore
|
290
|
-
|
389
|
+
#had to add code to support properly encoding array values. See http://blog.assimov.net/post/653645115/post-put-arrays-with-ruby-net-http-set-form-data
|
390
|
+
self.set_form_data(@params)
|
291
391
|
@response = @connection.request(@request)
|
292
392
|
if @response.is_a?(Net::HTTPClientError)
|
293
393
|
if 'xml' == @format
|
@@ -302,6 +402,32 @@ class StatsMix
|
|
302
402
|
end
|
303
403
|
@response.body
|
304
404
|
end
|
405
|
+
#based on http://blog.assimov.net/post/653645115/post-put-arrays-with-ruby-net-http-set-form-data
|
406
|
+
def self.set_form_data(params, sep = '&')
|
407
|
+
@request.body = params.map {|k,v|
|
408
|
+
if v.instance_of?(Array)
|
409
|
+
v.map {|e| "#{self.urlencode(k.to_s)}[]=#{urlencode(e.to_s)}"}.join(sep)
|
410
|
+
else
|
411
|
+
"#{self.urlencode(k.to_s)}=#{self.urlencode(v.to_s)}"
|
412
|
+
end
|
413
|
+
}.join(sep)
|
414
|
+
@request.content_type = 'application/x-www-form-urlencoded'
|
415
|
+
end
|
416
|
+
|
417
|
+
def self.urlencode(str)
|
418
|
+
str.gsub(/[^a-zA-Z0-9_\.\-]/n) {|s| sprintf('%%%02x', s[0]) }
|
419
|
+
end
|
420
|
+
|
421
|
+
def self.check_meta
|
422
|
+
if @params[:meta] && !@params[:meta].is_a?(String) && !@params[:meta].is_a?(Hash)
|
423
|
+
raise "Invalid data . :meta should be a hash or a json-encoded string. You passed an object of type: #{@params[:meta].type}"
|
424
|
+
end
|
425
|
+
if @params[:meta] && !@params[:meta].is_a?(String)
|
426
|
+
if @params[:meta].respond_to?('to_json')
|
427
|
+
@params[:meta] = @params[:meta].to_json
|
428
|
+
end
|
429
|
+
end
|
430
|
+
end
|
305
431
|
end
|
306
432
|
|
307
433
|
StatsMix.api_from_env
|
data/statsmix.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{statsmix}
|
8
|
-
s.version = "0.1
|
8
|
+
s.version = "0.2.1"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Tom Markiewicz", "Derek Scruggs"]
|
12
|
-
s.date = %q{2011-
|
12
|
+
s.date = %q{2011-11-07}
|
13
13
|
s.description = %q{A Ruby gem for the StatsMix API - http://www.statsmix.com/developers}
|
14
14
|
s.email = ["tmarkiewicz@gmail.com", "me@derekscruggs.com"]
|
15
15
|
s.extra_rdoc_files = [
|
data/test/test_statsmix.rb
CHANGED
@@ -12,10 +12,21 @@ class TestStatsmix < Test::Unit::TestCase
|
|
12
12
|
# http://www.rubyinside.com/vcr-a-recorder-for-all-your-tests-http-interactions-4169.html
|
13
13
|
# https://github.com/myronmarston/vcr
|
14
14
|
|
15
|
-
should "Track a stat and view the
|
15
|
+
should "Track a stat and view the result in xml" do
|
16
16
|
StatsMix.api_key = '59f08613db2691f28afe'
|
17
|
+
StatsMix.format = 'xml'
|
18
|
+
result = StatsMix.track('Ruby Gem Testing')
|
19
|
+
if StatsMix.error
|
20
|
+
raise "Error in gem: #{StatsMix.error}"
|
21
|
+
end
|
22
|
+
assert !StatsMix.error
|
23
|
+
puts result
|
24
|
+
end
|
25
|
+
|
26
|
+
should "Track a stat and view the result in json" do
|
27
|
+
StatsMix.api_key = '59f08613db2691f28afe'
|
28
|
+
StatsMix.format = 'json'
|
17
29
|
result = StatsMix.track('Ruby Gem Testing')
|
18
|
-
assert_response 200
|
19
30
|
if StatsMix.error
|
20
31
|
raise "Error in gem: #{StatsMix.error}"
|
21
32
|
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: statsmix
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 21
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
+
- 2
|
8
9
|
- 1
|
9
|
-
|
10
|
-
version: 0.1.10
|
10
|
+
version: 0.2.1
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Tom Markiewicz
|
@@ -16,7 +16,7 @@ autorequire:
|
|
16
16
|
bindir: bin
|
17
17
|
cert_chain: []
|
18
18
|
|
19
|
-
date: 2011-
|
19
|
+
date: 2011-11-07 00:00:00 -07:00
|
20
20
|
default_executable:
|
21
21
|
dependencies:
|
22
22
|
- !ruby/object:Gem::Dependency
|