trakio-ruby 0.1.0 → 0.1.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.
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- MDA5ZmZhZjI4NThhMGE5OTA2NDg0MmFlNmE0YTFhZjIzYzRiNDdkZg==
4
+ MGY0ZDI2ZDY3MWFiYWQ3OTEwODk3NjM4YTEyMTNiMzcwMGViYjE2ZA==
5
5
  data.tar.gz: !binary |-
6
- YzU1Mzk2NDA3OGEyMzc1MDc2ZjE5NmYyODIwM2MwOGY3MDBkZDRmNA==
6
+ NzViZGQ0NTVkZjVmN2Y3NjFjM2VmNWJiZGMxYmFlNGJjY2U0MmYxNw==
7
7
  !binary "U0hBNTEy":
8
8
  metadata.gz: !binary |-
9
- YWJlYTI0ZjY1NjNmZDYzMTJiYWY5YjcyY2ZmNWY4ZDhhM2U5ZmI5ODAyODg1
10
- MDAwYTdiZDJiYzdjODJmNjBmNWJlN2Y1MDljNTllNmE3Njk2OTI5ZGM2OTZj
11
- ZGIxZGY2ZTY5ZGEwMzA2MTlmYWYwZWQ0NWViYWJlYmIwOTAyYTg=
9
+ MmQzNTAyZjg2NDIzZmFlYmM5ZGVjNWUxMzI2ZWJiYjgwZWEzMGFkZTE5M2I3
10
+ YzUwZTg5ZmQyYjA2MmZkY2UyNGU3NjdmMDI2NzA0YTVkNjA5YzFiM2NiY2I2
11
+ NjdkYzYzM2M3MDk3MzM4NzBkMTBlMzZlOThiZTFhYzg4ODE0NTY=
12
12
  data.tar.gz: !binary |-
13
- NWJmYWJlNmU3ZTU2NzcxOTk1MzY0NTY3MWEyZDhlMWE1MDk0NDgwOGE2MGEy
14
- YTllZmQyMmZmMzI5MWJiMzNjNTc4M2UyZTk1ZDZjYzcwMjc1YjA2ODYwZmFm
15
- MzAyNTgwNjQ4ZTdjMTdlZGEyMWZlOWY3NTg4NTVlMGNlMDk2OTY=
13
+ Njc2MWU5YWNiMjlkMDU1NzA1OWFlNjFkODVjMDVjMTYxNDA1NjZlMmM5N2Fh
14
+ OTcyMWVmMTIzY2QxYjM5Y2MzN2ExOGVkOTE3OWY2OWM3MGE0MjFhYTNiOTIx
15
+ YTkzNTZhNTNjNjkwMmNlZWFiOTBhNjg3ZjI3MzBhYjBhOTY4ZjM=
data/.travis.yml ADDED
@@ -0,0 +1,8 @@
1
+ language: ruby
2
+
3
+ rvm:
4
+ - 2.1.0
5
+ - 2.0.0
6
+ - 1.9.3
7
+
8
+ script: bundle exec rake test
data/README.md CHANGED
@@ -1,7 +1,5 @@
1
1
  # Official trak.io Ruby Library
2
2
 
3
- # WARNING: Work in progress, this library is incomplete, it has been published but is subject to change.
4
-
5
3
  ## Installation
6
4
 
7
5
  Add this line to your application's Gemfile:
@@ -16,9 +14,63 @@ Or install it yourself as:
16
14
 
17
15
  $ gem install trakio-ruby
18
16
 
19
- ## Usage
17
+ ## Examples
18
+
19
+ For more indepth documentation see: http://docs.trak.io/ruby.html
20
+
21
+ ### Creating an instance, and then tracking an event.
22
+ ```ruby
23
+ # create the instance
24
+ trakio = Trakio.new 'my_api_token'
25
+ # track my-event
26
+ resp = trakio.track distinct_id: 'user@example.com', event: 'my-event'
27
+ # resp will look like { 'status': 'success', 'trak_id': '12345' }
28
+ ```
29
+
30
+ ### Creating a default instance, and then tracking an event.
31
+ ```ruby
32
+ # set token on default instance
33
+ Trakio.init 'my_api_token'
34
+ # track our event
35
+ resp = Trakio.track distinct_id: 'user@example.com', event: 'my-event'
36
+ # resp will look like { 'status': 'success', 'trak_id': '12345' }
37
+ ```
38
+
39
+ ### Creating an instance and aliasing an entry
40
+ ```ruby
41
+ # set token on default instance
42
+ Trakio.init 'my_api_token'
43
+
44
+ resp = Trakio.alias distinct_id: 'u1@example.com', alias: ['u2@example.com']
45
+ # resp will look like { 'status': 'success', 'trak_id': '12345', 'distinct_ids': ['u1@example.com', 'u2@example.com'] }
46
+
47
+ # an equivilent is shown below
48
+
49
+ resp = Trakio.alias distinct_id: 'u1@example.com', alias: 'u2@example.com'
50
+ # resp will look like { 'status': 'success', 'trak_id': '12345', 'distinct_ids': ['u1@example.com', 'u2@example.com'] }
51
+ ```
52
+
53
+ ### Creating an instance and using identify
54
+ ```ruby
55
+ # set token on default instance
56
+ Trakio.init 'my_api_token'
57
+
58
+ resp = Trakio.identify distinct_id: 'user@example.com', properties: { name: 'Tobie' }
59
+ # resp will look like { 'status': 'success', 'trak_id': '12345', 'distinct_ids': ['user@example.com'] }
60
+ ```
61
+
62
+ ### Creating an instance and using annotate
63
+ ```ruby
64
+ # set token on default instance
65
+ Trakio.init 'my_api_token'
66
+
67
+ resp = Trakio.annotate event: 'event', channel: 'channel'
68
+ # resp will look like { 'status': 'success', 'trak_id': '12345', 'properties': {} }
69
+ ```
20
70
 
21
- TODO: Write usage instructions here
71
+ ## Creating and Running Tests
72
+ * Tests can be run by running the following commands `bundle exec rspec`
73
+ * Tests can be added by either adding into an existing spec file, or creating a new one.
22
74
 
23
75
  ## Contributing
24
76
 
data/Rakefile CHANGED
@@ -1 +1,5 @@
1
- require "bundler/gem_tasks"
1
+ require 'rspec/core/rake_task'
2
+
3
+ RSpec::Core::RakeTask.new(:spec)
4
+
5
+ task :test => :spec
@@ -1,3 +1,3 @@
1
1
  class Trakio
2
- VERSION = "0.1.0"
2
+ VERSION = "0.1.1"
3
3
  end
data/lib/trakio.rb CHANGED
@@ -6,9 +6,18 @@ require "json"
6
6
  class Trakio
7
7
 
8
8
  class Exceptions
9
- class Uninitiated < RuntimeError; end
10
- class InvalidToken < RuntimeError; end
11
- class NoDistinctIdForDefaultInstance < RuntimeError; end
9
+ class Uninitiated < StandardError; end
10
+ class NoDistinctIdForDefaultInstance < StandardError; end
11
+ class DataObjectInvalidJson < StandardError; end
12
+ class DataObjectInvalidBase64 < StandardError; end
13
+ class DataObjectInvalidType < StandardError; end
14
+ class InvalidToken < StandardError; end
15
+ class MissingParameter < StandardError; end
16
+ class RouteNotFound < StandardError; end
17
+ class PropertiesObjectInvalid < StandardError; end
18
+ class RequestInvalidJson < StandardError; end
19
+ class RevenuePropertyInvalid < StandardError; end
20
+ class InternalServiceError < StandardError; end
12
21
  end
13
22
 
14
23
  class << self
@@ -157,7 +166,47 @@ class Trakio
157
166
  url = "#{protocol}://#{@host}/#{endpoint}"
158
167
  data = { token: @api_token, data: params }.to_json
159
168
  resp = RestClient.post url, data, :content_type => :json, :accept => :json
160
- JSON.parse(resp.body, :symbolize_names => true)
169
+ result = JSON.parse(resp.body, :symbolize_names => true)
170
+ return result if result[:status] == 'success'
171
+
172
+ # status must be error
173
+ # here we will raise the required exception as in the API
174
+ exception = constantize(result[:exception].sub! 'TrakioAPI::', 'Trakio::') # name of the class
175
+ message = result[:message] # extra information for the exception
176
+ raise exception.new(message)
177
+ end
178
+
179
+ protected
180
+
181
+ def constantize(camel_cased_word) # Taken from ActiveSupport
182
+ names = camel_cased_word.split('::')
183
+
184
+ # Trigger a builtin NameError exception including the ill-formed constant in the message.
185
+ Object.const_get(camel_cased_word) if names.empty?
186
+
187
+ # Remove the first blank element in case of '::ClassName' notation.
188
+ names.shift if names.size > 1 && names.first.empty?
189
+
190
+ names.inject(Object) do |constant, name|
191
+ if constant == Object
192
+ constant.const_get(name)
193
+ else
194
+ candidate = constant.const_get(name)
195
+ next candidate if constant.const_defined?(name, false)
196
+ next candidate unless Object.const_defined?(name)
197
+
198
+ # Go down the ancestors to check it it's owned
199
+ # directly before we reach Object or the end of ancestors.
200
+ constant = constant.ancestors.inject do |const, ancestor|
201
+ break const if ancestor == Object
202
+ break ancestor if ancestor.const_defined?(name, false)
203
+ const
204
+ end
205
+
206
+ # owner is in Object, so raise
207
+ constant.const_get(name, false)
208
+ end
209
+ end
161
210
  end
162
211
 
163
212
  end
@@ -7,8 +7,8 @@ describe Trakio do
7
7
  after {
8
8
  Trakio.default_instance = nil
9
9
  }
10
-
11
- describe '.annotate' do
10
+
11
+ describe '.annotate' do
12
12
 
13
13
  context "when an event is provided" do
14
14
 
@@ -131,4 +131,4 @@ describe Trakio do
131
131
 
132
132
  end
133
133
 
134
- end
134
+ end
@@ -0,0 +1,65 @@
1
+ require 'spec_helper'
2
+
3
+ describe Trakio do
4
+
5
+ subject { Trakio }
6
+
7
+ after {
8
+ Trakio.default_instance = nil
9
+ }
10
+
11
+ describe '.track' do
12
+
13
+ context "when an error is returned by the API" do
14
+ it "raises an exception" do
15
+ stub = stub_request(:post, "https://api.trak.io/v1/track").
16
+ with(:body => {
17
+ token: 'my_api_token',
18
+ data: {
19
+ distinct_id: 'user@example.com',
20
+ event: 'my-event'
21
+ }
22
+ }).to_return(:body => {
23
+ status: 'error',
24
+ code: 401,
25
+ exception: "TrakioAPI::Exceptions::InvalidToken",
26
+ message: "Missing or invalid API token.",
27
+ details: "You must provide a valid API token, see http://docs.trak.io/authentication.html."
28
+ }.to_json)
29
+
30
+ trakio = Trakio.new 'my_api_token'
31
+ expect {
32
+ trakio.track distinct_id: 'user@example.com', event: 'my-event'
33
+ }.to raise_error Trakio::Exceptions::InvalidToken
34
+
35
+ stub.should have_been_requested
36
+
37
+ end
38
+ end
39
+
40
+ context "when no error is returned by the API" do
41
+ it "returns the result" do
42
+ stub = stub_request(:post, "https://api.trak.io/v1/track").
43
+ with(:body => {
44
+ token: 'my_api_token',
45
+ data: {
46
+ distinct_id: 'user@example.com',
47
+ event: 'my-event'
48
+ }
49
+ }).to_return(:body => {
50
+ status: 'success',
51
+ trak_id: '1234567890'
52
+ }.to_json)
53
+
54
+ trakio = Trakio.new 'my_api_token'
55
+ resp = trakio.track distinct_id: 'user@example.com', event: 'my-event'
56
+
57
+ expect(resp[:status]).to eql 'success'
58
+ expect(resp[:trak_id]).to eql '1234567890'
59
+
60
+ stub.should have_been_requested
61
+ end
62
+ end
63
+
64
+ end # end .track
65
+ end
data/trakio-ruby.gemspec CHANGED
@@ -25,5 +25,4 @@ Gem::Specification.new do |spec|
25
25
  spec.add_development_dependency 'fuubar'
26
26
 
27
27
  spec.add_dependency 'rest_client'
28
- spec.add_dependency 'pry'
29
28
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: trakio-ruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matthew Spence
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2014-02-04 00:00:00.000000000 Z
12
+ date: 2014-02-15 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler
@@ -95,20 +95,6 @@ dependencies:
95
95
  - - ! '>='
96
96
  - !ruby/object:Gem::Version
97
97
  version: '0'
98
- - !ruby/object:Gem::Dependency
99
- name: pry
100
- requirement: !ruby/object:Gem::Requirement
101
- requirements:
102
- - - ! '>='
103
- - !ruby/object:Gem::Version
104
- version: '0'
105
- type: :runtime
106
- prerelease: false
107
- version_requirements: !ruby/object:Gem::Requirement
108
- requirements:
109
- - - ! '>='
110
- - !ruby/object:Gem::Version
111
- version: '0'
112
98
  description: Official trak.io ruby library for Ruby
113
99
  email:
114
100
  - matt@trak.io
@@ -118,6 +104,7 @@ extensions: []
118
104
  extra_rdoc_files: []
119
105
  files:
120
106
  - .gitignore
107
+ - .travis.yml
121
108
  - Gemfile
122
109
  - LICENSE
123
110
  - README.md
@@ -128,6 +115,7 @@ files:
128
115
  - spec/trakio/alias_spec.rb
129
116
  - spec/trakio/annotate_spec.rb
130
117
  - spec/trakio/class_methods_spec.rb
118
+ - spec/trakio/exception_spec.rb
131
119
  - spec/trakio/indentify_spec.rb
132
120
  - spec/trakio/initialize_spec.rb
133
121
  - spec/trakio/instance_methods_spec.rb
@@ -162,6 +150,7 @@ test_files:
162
150
  - spec/trakio/alias_spec.rb
163
151
  - spec/trakio/annotate_spec.rb
164
152
  - spec/trakio/class_methods_spec.rb
153
+ - spec/trakio/exception_spec.rb
165
154
  - spec/trakio/indentify_spec.rb
166
155
  - spec/trakio/initialize_spec.rb
167
156
  - spec/trakio/instance_methods_spec.rb