lab628 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
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: []