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 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/.gitignore ADDED
@@ -0,0 +1,5 @@
1
+ /Gemfile.lock
2
+ /.idea/
3
+ /*.gem
4
+ /*.iml
5
+ /bin/
data/.rubocop.yml ADDED
@@ -0,0 +1,9 @@
1
+ AllCops:
2
+ TargetRubyVersion: 2.0
3
+
4
+ Metrics/LineLength:
5
+ Max: 120
6
+ Metrics/AbcSize:
7
+ Max: 18
8
+ Metrics/MethodLength:
9
+ Max: 15
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
@@ -0,0 +1,2 @@
1
+ source 'https://rubygems.org'
2
+ gemspec
data/README.md ADDED
@@ -0,0 +1,50 @@
1
+ # lab628-ruby
2
+ [![Build Status](https://travis-ci.org/lab628/lab628-ruby.svg?branch=master)](https://travis-ci.org/lab628/lab628-ruby) [![Dependency Status](https://gemnasium.com/badges/github.com/lab628/lab628-ruby.svg)](https://gemnasium.com/github.com/lab628/lab628-ruby) [![Code Climate](https://codeclimate.com/github/lab628/lab628-ruby/badges/gpa.svg)](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
@@ -0,0 +1,10 @@
1
+ require 'bundler/gem_tasks'
2
+ require 'rake/testtask'
3
+
4
+ Rake::TestTask.new(:test) do |t|
5
+ t.libs << 'test'
6
+ t.libs << 'lib'
7
+ t.test_files = FileList['test/**/*_test.rb']
8
+ end
9
+
10
+ task default: :test
@@ -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
@@ -0,0 +1,3 @@
1
+ class Lab628
2
+ VERSION = '1.0.0'.freeze
3
+ 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
@@ -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
@@ -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: []