lab628 1.0.0
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 +7 -0
- data/.gitignore +5 -0
- data/.rubocop.yml +9 -0
- data/.travis.yml +19 -0
- data/Gemfile +2 -0
- data/README.md +50 -0
- data/Rakefile +10 -0
- data/lab628-ruby.gemspec +27 -0
- data/lib/lab628/version.rb +3 -0
- data/lib/lab628.rb +68 -0
- data/test/lab628_test.rb +59 -0
- data/test/test_helper.rb +28 -0
- metadata +139 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 7637fb458789554095236875089f242cf13652c5
|
4
|
+
data.tar.gz: 97296a84e24b9cd0b5283ca184ddefb487f252b3
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 5bdb56f142951e25df06b065fbb231fac801f68fd0b37240d935b08cd46b65f33e1322d57debdaf5f9dd0796a987d08f6531e2b59c2eb8264570c41a702b47b2
|
7
|
+
data.tar.gz: a9d569ee8635ad9727409388df291257aca689f824d0d2bdf870b25054d7a5a8c996ba921eadec71fd4072a19fc1fe9c22ebe796720f227cd1164d10ad4fba74
|
data/.rubocop.yml
ADDED
data/.travis.yml
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
language: ruby
|
2
|
+
cache: bundler
|
3
|
+
rvm:
|
4
|
+
- 2.3.0
|
5
|
+
- 2.2
|
6
|
+
- 2.1
|
7
|
+
- 2.0
|
8
|
+
- 1.9.3
|
9
|
+
- ruby-head
|
10
|
+
- jruby
|
11
|
+
- jruby-head
|
12
|
+
matrix:
|
13
|
+
allow_failures:
|
14
|
+
- rvm: ruby-head
|
15
|
+
fast_finish: true
|
16
|
+
before_install:
|
17
|
+
- gem install bundler
|
18
|
+
before_script:
|
19
|
+
- bundle update
|
data/Gemfile
ADDED
data/README.md
ADDED
@@ -0,0 +1,50 @@
|
|
1
|
+
# lab628-ruby
|
2
|
+
[](https://travis-ci.org/lab628/lab628-ruby) [](https://gemnasium.com/github.com/lab628/lab628-ruby) [](https://codeclimate.com/github/lab628/lab628-ruby)
|
3
|
+
|
4
|
+
This is the official Lab628 ruby integration library.
|
5
|
+
|
6
|
+
## Installation
|
7
|
+
|
8
|
+
Add the gem to your Gemfile:
|
9
|
+
|
10
|
+
```ruby
|
11
|
+
gem 'lab628'
|
12
|
+
```
|
13
|
+
|
14
|
+
## Usage
|
15
|
+
|
16
|
+
### Initialization
|
17
|
+
|
18
|
+
For configuring a single access key globaly, put this in an initializer (e.g. for Rails, `config/initializers/lab628.rb`):
|
19
|
+
```ruby
|
20
|
+
Lab628.api_key = 'your api key'
|
21
|
+
Lab628.secret = 'your shared secret'
|
22
|
+
```
|
23
|
+
Both of these values are available in the [**Access Keys** section of the Lab628 dashboard](http://www.lab628.com/credentials), for each of your keys.
|
24
|
+
|
25
|
+
To use multiple keys, an instance can be used to supply or override these globals:
|
26
|
+
```ruby
|
27
|
+
tracker = Lab628.new(api_key: 'your api key', secret: 'your shared secret')
|
28
|
+
```
|
29
|
+
|
30
|
+
### Tracking activities
|
31
|
+
|
32
|
+
You can track any hash:
|
33
|
+
|
34
|
+
```ruby
|
35
|
+
Lab628.activity(user_id: 7, topic: 'excitement')
|
36
|
+
```
|
37
|
+
|
38
|
+
The hash will be converted to JSON, which means Ruby objects that don't correspond to JSON types will be converted to strings.
|
39
|
+
|
40
|
+
If you have an object that is already in JSON form, you can pass it directly:
|
41
|
+
|
42
|
+
```ruby
|
43
|
+
Lab628.activity("{\"this\":\"json\",\"is\":[\"already\",\"encoded\"]}")
|
44
|
+
```
|
45
|
+
|
46
|
+
The same method can be used on instances:
|
47
|
+
|
48
|
+
```ruby
|
49
|
+
Lab628.new(api_key: 'your api key', secret: 'your shared secret').activity(user_id: 7, topic: 'excitement')
|
50
|
+
```
|
data/Rakefile
ADDED
data/lab628-ruby.gemspec
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
$LOAD_PATH << File.expand_path('../lib', __FILE__)
|
2
|
+
require 'lab628/version'
|
3
|
+
|
4
|
+
Gem::Specification.new do |s|
|
5
|
+
s.name = 'lab628'
|
6
|
+
s.version = Lab628::VERSION
|
7
|
+
s.authors = ['Lab628']
|
8
|
+
s.email = ['support@lab628.com']
|
9
|
+
|
10
|
+
s.summary = 'Lab628 Ruby library'
|
11
|
+
s.description = 'Official Ruby library for the Lab628 service.'
|
12
|
+
s.homepage = 'http://lab628.com/'
|
13
|
+
s.licenses = ['MIT']
|
14
|
+
|
15
|
+
s.files = `git ls-files -z`.split("\x0")
|
16
|
+
s.require_paths = ['lib']
|
17
|
+
|
18
|
+
s.required_ruby_version = '>= 1.9.3'
|
19
|
+
|
20
|
+
s.add_runtime_dependency 'faraday', ['~> 0']
|
21
|
+
|
22
|
+
s.add_development_dependency 'bundler', ['~> 1.10']
|
23
|
+
s.add_development_dependency 'rake', ['~> 10.0']
|
24
|
+
s.add_development_dependency 'minitest', ['~> 0']
|
25
|
+
s.add_development_dependency 'mocha', ['~> 0']
|
26
|
+
s.add_development_dependency 'pry', ['~> 0']
|
27
|
+
end
|
data/lib/lab628.rb
ADDED
@@ -0,0 +1,68 @@
|
|
1
|
+
require 'lab628/version'
|
2
|
+
require 'faraday'
|
3
|
+
require 'json'
|
4
|
+
|
5
|
+
class Lab628 # :nodoc:
|
6
|
+
BASE_URL = 'http://www.lab628.com'.freeze
|
7
|
+
ConfigurationError = Class.new StandardError
|
8
|
+
PayloadError = Class.new StandardError
|
9
|
+
|
10
|
+
class << self
|
11
|
+
# default API configuration
|
12
|
+
attr_accessor :api_key
|
13
|
+
attr_accessor :secret
|
14
|
+
|
15
|
+
def activity(data)
|
16
|
+
send_activity @api_key, @secret, data
|
17
|
+
end
|
18
|
+
|
19
|
+
def send_activity(key, sec, data)
|
20
|
+
raise ConfigurationError, 'Lab628 api key is not set' unless key
|
21
|
+
raise ConfigurationError, 'Lab628 shared secret is not set' unless sec
|
22
|
+
|
23
|
+
response = connection.post do |req|
|
24
|
+
req.url "/api/track/#{key}"
|
25
|
+
req.headers['X-Secret'] = sec
|
26
|
+
req.headers['Content-Type'] = 'application/json'
|
27
|
+
req.body = validate_payload data
|
28
|
+
end
|
29
|
+
|
30
|
+
response.status == 200
|
31
|
+
end
|
32
|
+
|
33
|
+
private
|
34
|
+
|
35
|
+
def connection
|
36
|
+
@connection ||= Faraday.new url: BASE_URL do |faraday|
|
37
|
+
faraday.request :url_encoded
|
38
|
+
faraday.adapter Faraday.default_adapter
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def validate_payload(payload)
|
43
|
+
if payload.is_a? String
|
44
|
+
unless JSON.parse(payload).is_a? Hash
|
45
|
+
raise PayloadError, "Activity payload '#{payload}' is not a single JSON object."
|
46
|
+
end
|
47
|
+
return payload
|
48
|
+
end
|
49
|
+
return JSON.generate payload if payload.is_a? Hash
|
50
|
+
raise PayloadError, "Activity payload '#{payload}' is not a JSON string or hash."
|
51
|
+
rescue JSON::ParserError => e
|
52
|
+
raise PayloadError, "Activity payload '#{payload}' is a non-JSON string: #{e.message}"
|
53
|
+
rescue => e
|
54
|
+
raise PayloadError, "Error converting activity payload '#{payload}' to JSON: #{e.message}"
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
def initialize(opts = {})
|
59
|
+
@api_key = opts[:api_key] || Lab628.api_key
|
60
|
+
raise ConfigurationError, 'Lab628 api key is not set' unless @api_key
|
61
|
+
@secret = opts[:secret] || Lab628.secret
|
62
|
+
raise ConfigurationError, 'Lab628 shared secret is not set' unless @secret
|
63
|
+
end
|
64
|
+
|
65
|
+
def activity(data)
|
66
|
+
self.class.send_activity(@api_key, @secret, data)
|
67
|
+
end
|
68
|
+
end
|
data/test/lab628_test.rb
ADDED
@@ -0,0 +1,59 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class TrackTest < Minitest::Test
|
4
|
+
def test_configs
|
5
|
+
# no default key and secret have been supplied
|
6
|
+
assert_raises Lab628::ConfigurationError do
|
7
|
+
Lab628.new
|
8
|
+
end
|
9
|
+
|
10
|
+
Lab628.api_key = 'key'
|
11
|
+
Lab628.secret = 'sec'
|
12
|
+
|
13
|
+
assert_equal 'key', Lab628.instance_variable_get(:@api_key)
|
14
|
+
assert_equal 'sec', Lab628.instance_variable_get(:@secret)
|
15
|
+
|
16
|
+
activity_tracker = Lab628.new
|
17
|
+
assert_equal 'key', activity_tracker.instance_variable_get(:@api_key)
|
18
|
+
assert_equal 'sec', activity_tracker.instance_variable_get(:@secret)
|
19
|
+
|
20
|
+
activity_tracker = Lab628.new(api_key: 'key2', secret: 'sec2')
|
21
|
+
assert_equal 'key2', activity_tracker.instance_variable_get(:@api_key)
|
22
|
+
assert_equal 'sec2', activity_tracker.instance_variable_get(:@secret)
|
23
|
+
end
|
24
|
+
|
25
|
+
def val(payload)
|
26
|
+
Lab628.send(:validate_payload, payload)
|
27
|
+
end
|
28
|
+
|
29
|
+
def test_validation
|
30
|
+
a1 = '{"a":1}'
|
31
|
+
assert_equal a1, val(a1)
|
32
|
+
assert_equal a1, val(a: 1)
|
33
|
+
|
34
|
+
e = assert_raises(Lab628::PayloadError) { val 'not JSON' }
|
35
|
+
assert_match 'non-JSON string', e.message
|
36
|
+
|
37
|
+
e = assert_raises(Lab628::PayloadError) { val '["not", "single", "object"]' }
|
38
|
+
assert_match 'not a single JSON object', e.message
|
39
|
+
|
40
|
+
e = assert_raises(Lab628::PayloadError) { val [1, 2] }
|
41
|
+
assert_match 'not a JSON string or hash', e.message
|
42
|
+
end
|
43
|
+
|
44
|
+
def test_activity
|
45
|
+
# missing default key
|
46
|
+
assert_raises Lab628::ConfigurationError do
|
47
|
+
Lab628.activity(a: 1)
|
48
|
+
end
|
49
|
+
|
50
|
+
Lab628.api_key = '123'
|
51
|
+
Lab628.secret = 'abc'
|
52
|
+
|
53
|
+
assert Lab628.activity(a: 1)
|
54
|
+
|
55
|
+
Lab628.api_key = 'failkey'
|
56
|
+
|
57
|
+
refute Lab628.activity(a: 1)
|
58
|
+
end
|
59
|
+
end
|
data/test/test_helper.rb
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
$LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
|
2
|
+
require 'lab628'
|
3
|
+
|
4
|
+
require 'minitest/autorun'
|
5
|
+
require 'mocha/mini_test'
|
6
|
+
|
7
|
+
def test_connection
|
8
|
+
Faraday.new do |builder|
|
9
|
+
builder.adapter :test do |stubs|
|
10
|
+
stubs.post 'api/track/123' do
|
11
|
+
[200, {}, '']
|
12
|
+
end
|
13
|
+
stubs.post 'api/track/failkey' do
|
14
|
+
[422, {}, '']
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
module Minitest
|
21
|
+
class Test
|
22
|
+
def setup
|
23
|
+
Lab628.api_key = nil
|
24
|
+
Lab628.secret = nil
|
25
|
+
Lab628.stubs(:connection).returns(test_connection)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
metadata
ADDED
@@ -0,0 +1,139 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: lab628
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Lab628
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2016-04-12 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: faraday
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: bundler
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '1.10'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '1.10'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rake
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '10.0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '10.0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: minitest
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: mocha
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: pry
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
97
|
+
description: Official Ruby library for the Lab628 service.
|
98
|
+
email:
|
99
|
+
- support@lab628.com
|
100
|
+
executables: []
|
101
|
+
extensions: []
|
102
|
+
extra_rdoc_files: []
|
103
|
+
files:
|
104
|
+
- ".gitignore"
|
105
|
+
- ".rubocop.yml"
|
106
|
+
- ".travis.yml"
|
107
|
+
- Gemfile
|
108
|
+
- README.md
|
109
|
+
- Rakefile
|
110
|
+
- lab628-ruby.gemspec
|
111
|
+
- lib/lab628.rb
|
112
|
+
- lib/lab628/version.rb
|
113
|
+
- test/lab628_test.rb
|
114
|
+
- test/test_helper.rb
|
115
|
+
homepage: http://lab628.com/
|
116
|
+
licenses:
|
117
|
+
- MIT
|
118
|
+
metadata: {}
|
119
|
+
post_install_message:
|
120
|
+
rdoc_options: []
|
121
|
+
require_paths:
|
122
|
+
- lib
|
123
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
124
|
+
requirements:
|
125
|
+
- - ">="
|
126
|
+
- !ruby/object:Gem::Version
|
127
|
+
version: 1.9.3
|
128
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
129
|
+
requirements:
|
130
|
+
- - ">="
|
131
|
+
- !ruby/object:Gem::Version
|
132
|
+
version: '0'
|
133
|
+
requirements: []
|
134
|
+
rubyforge_project:
|
135
|
+
rubygems_version: 2.4.6
|
136
|
+
signing_key:
|
137
|
+
specification_version: 4
|
138
|
+
summary: Lab628 Ruby library
|
139
|
+
test_files: []
|