tamber 0.1.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/.travis.yml +8 -0
- data/Gemfile +2 -0
- data/LICENSE +22 -0
- data/README.rdoc +71 -0
- data/Rakefile +17 -0
- data/VERSION +1 -0
- data/lib/security/ca-bundle.crt +3893 -0
- data/lib/tamber.rb +202 -0
- data/lib/tamber/api_operations/create.rb +10 -0
- data/lib/tamber/api_operations/remove.rb +10 -0
- data/lib/tamber/api_operations/request.rb +21 -0
- data/lib/tamber/api_operations/retrieve.rb +10 -0
- data/lib/tamber/api_operations/update.rb +10 -0
- data/lib/tamber/api_resource.rb +21 -0
- data/lib/tamber/behavior.rb +6 -0
- data/lib/tamber/discover.rb +54 -0
- data/lib/tamber/event.rb +24 -0
- data/lib/tamber/item.rb +8 -0
- data/lib/tamber/property.rb +6 -0
- data/lib/tamber/tamber_error.rb +10 -0
- data/lib/tamber/tamber_object.rb +35 -0
- data/lib/tamber/user.rb +7 -0
- data/lib/tamber/util.rb +90 -0
- data/lib/tamber/version.rb +3 -0
- data/tamber.gemspec +34 -0
- data/test/discover_test.rb +40 -0
- data/test/event_test.rb +53 -0
- data/test/test_helper.rb +17 -0
- data/test/user_test.rb +64 -0
- metadata +165 -0
data/lib/tamber/user.rb
ADDED
data/lib/tamber/util.rb
ADDED
@@ -0,0 +1,90 @@
|
|
1
|
+
require "cgi"
|
2
|
+
require "json"
|
3
|
+
|
4
|
+
module Tamber
|
5
|
+
module Util
|
6
|
+
|
7
|
+
def self.encode_parameters(params)
|
8
|
+
Util.flatten_params(params).
|
9
|
+
map { |k,v| "#{url_encode(k)}=#{url_encode(v)}" }.join('&')
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.url_encode(key)
|
13
|
+
CGI.escape(key.to_s).
|
14
|
+
gsub('%5B', '[').gsub('%5D', ']')
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.flatten_params(params, parent_key=nil)
|
18
|
+
result = []
|
19
|
+
|
20
|
+
params.sort_by { |(k, v)| k.to_s }.each do |key, value|
|
21
|
+
calculated_key = parent_key ? "#{parent_key}[#{key}]" : "#{key}"
|
22
|
+
if value.is_a?(Hash) || value.is_a?(Array) || value.is_a?(APIResource)
|
23
|
+
result << [calculated_key, value.to_json]
|
24
|
+
else
|
25
|
+
result << [calculated_key, value]
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
result
|
30
|
+
end
|
31
|
+
|
32
|
+
def self.object_classes
|
33
|
+
@object_classes ||= {
|
34
|
+
# Core
|
35
|
+
'event' => Event,
|
36
|
+
'discovery' => Discovery,
|
37
|
+
|
38
|
+
# Expanded
|
39
|
+
'user' => User,
|
40
|
+
'item' => Item,
|
41
|
+
'behavior' => Behavior,
|
42
|
+
'property' => Property,
|
43
|
+
}
|
44
|
+
end
|
45
|
+
|
46
|
+
def self.convert_full(resp)
|
47
|
+
case resp
|
48
|
+
when Hash
|
49
|
+
object_classes.fetch(resp[:object],TamberObject).construct_from(resp)
|
50
|
+
when Array
|
51
|
+
resp.map { |i| convert_full(i) }
|
52
|
+
else
|
53
|
+
resp
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
def self.convert_to_tamber_object(resp)
|
58
|
+
case resp
|
59
|
+
when Hash
|
60
|
+
object_classes.fetch(resp[:object],TamberObject).construct_from(resp)
|
61
|
+
when Array
|
62
|
+
if resp.size == 1
|
63
|
+
resp = resp[0]
|
64
|
+
self.convert_full(resp)
|
65
|
+
else
|
66
|
+
resp.map { |i| convert_full(i) }
|
67
|
+
end
|
68
|
+
else
|
69
|
+
resp
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
def self.symbolize_names(object)
|
74
|
+
case object
|
75
|
+
when Hash
|
76
|
+
new_hash = {}
|
77
|
+
object.each do |key, value|
|
78
|
+
key = (key.to_sym rescue key) || key
|
79
|
+
new_hash[key] = symbolize_names(value)
|
80
|
+
end
|
81
|
+
new_hash
|
82
|
+
when Array
|
83
|
+
object.map { |value| symbolize_names(value) }
|
84
|
+
else
|
85
|
+
object
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
end
|
90
|
+
end
|
data/tamber.gemspec
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
$:.unshift(File.join(File.dirname(__FILE__), 'lib'))
|
2
|
+
|
3
|
+
require 'tamber/version'
|
4
|
+
|
5
|
+
spec = Gem::Specification.new do |s|
|
6
|
+
s.name = 'tamber'
|
7
|
+
s.version = Tamber::VERSION
|
8
|
+
s.required_ruby_version = '>= 1.9.3'
|
9
|
+
s.summary = 'Ruby bindings for the Tamber API'
|
10
|
+
s.description = 'Tamber is the easiest way to put head-scratchingly accurate, real time recommendations in your app. See https://tamber.com for details.'
|
11
|
+
s.homepage = 'https://tamber.com/docs/api'
|
12
|
+
s.license = 'MIT'
|
13
|
+
s.authors = ['Alexi Robbins', 'Mark Canning']
|
14
|
+
s.email = ['alexi@tamber.com', 'argusdusty@tamber.com']
|
15
|
+
|
16
|
+
s.add_dependency('rest-client', '~> 1.4')
|
17
|
+
s.add_dependency('json', '~> 1.8.1')
|
18
|
+
|
19
|
+
s.add_development_dependency('mocha', '~> 0.13.2')
|
20
|
+
s.add_development_dependency('shoulda', '~> 3.4.0')
|
21
|
+
s.add_development_dependency('test-unit')
|
22
|
+
s.add_development_dependency('rake')
|
23
|
+
|
24
|
+
if Gem::Version.new(RUBY_VERSION.dup) > Gem::Version.new('2.0.0')
|
25
|
+
s.add_development_dependency("byebug")
|
26
|
+
s.add_development_dependency("pry")
|
27
|
+
s.add_development_dependency("pry-byebug")
|
28
|
+
end
|
29
|
+
|
30
|
+
s.files = `git ls-files`.split("\n")
|
31
|
+
s.test_files = `git ls-files -- test/*`.split("\n")
|
32
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
33
|
+
s.require_paths = ['lib']
|
34
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require File.expand_path('../test_helper', __FILE__)
|
2
|
+
|
3
|
+
module Tamber
|
4
|
+
class DiscoverTest < Test::Unit::TestCase
|
5
|
+
# should "return recommendations" do
|
6
|
+
# begin
|
7
|
+
# d = Tamber::Discover.recommended(
|
8
|
+
# :user => 'user_jctzgisbru'
|
9
|
+
# )
|
10
|
+
# d.each { |rec| puts "item: #{rec.item}, score: #{rec.score}"}
|
11
|
+
# rescue TamberError => error
|
12
|
+
# puts error.message
|
13
|
+
# end
|
14
|
+
# end
|
15
|
+
|
16
|
+
# should "return similar" do
|
17
|
+
# begin
|
18
|
+
# d = Tamber::Discover.similar(
|
19
|
+
# :item => 'item_i5gq90scc1'
|
20
|
+
# )
|
21
|
+
# puts d
|
22
|
+
# rescue TamberError => error
|
23
|
+
# puts error.message
|
24
|
+
# end
|
25
|
+
# end
|
26
|
+
|
27
|
+
# should "return recommendedSimilar" do
|
28
|
+
# begin
|
29
|
+
# d = Tamber::Discover.recommendedSimilar(
|
30
|
+
# :user => 'user_jctzgisbru',
|
31
|
+
# :item => 'item_i5gq90scc1'
|
32
|
+
# )
|
33
|
+
# puts d
|
34
|
+
# rescue TamberError => error
|
35
|
+
# puts error.message
|
36
|
+
# end
|
37
|
+
# end
|
38
|
+
|
39
|
+
end
|
40
|
+
end
|
data/test/event_test.rb
ADDED
@@ -0,0 +1,53 @@
|
|
1
|
+
require File.expand_path('../test_helper', __FILE__)
|
2
|
+
|
3
|
+
module Tamber
|
4
|
+
class EventTest < Test::Unit::TestCase
|
5
|
+
# should "be trackable" do
|
6
|
+
# begin
|
7
|
+
# e = Tamber::Event.track(
|
8
|
+
# :user => 'user_jctzgisbru',
|
9
|
+
# :item => 'item_i5gq90scc1',
|
10
|
+
# :behavior => 'mention',
|
11
|
+
# :getRecs => {}
|
12
|
+
# )
|
13
|
+
# e.recommended.each { |rec| puts "item: #{rec.item}, score: #{rec.score}"}
|
14
|
+
# rescue TamberError => error
|
15
|
+
# puts error.message
|
16
|
+
# end
|
17
|
+
# end
|
18
|
+
|
19
|
+
should "be retrievable" do
|
20
|
+
begin
|
21
|
+
e = Tamber::Event.retrieve(
|
22
|
+
:user => 'user_jctzgisbru',
|
23
|
+
)
|
24
|
+
puts e
|
25
|
+
rescue TamberError => error
|
26
|
+
puts error.message
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
# should "be batchable" do
|
31
|
+
# begin
|
32
|
+
# e = Tamber::Event.batch(
|
33
|
+
# :events => [
|
34
|
+
# {
|
35
|
+
# :user => 'user_y7u9sv6we0',
|
36
|
+
# :item => 'item_u9nlytt3w5',
|
37
|
+
# :behavior => 'like'
|
38
|
+
# },
|
39
|
+
# {
|
40
|
+
# :user => 'user_y7u9sv6we0',
|
41
|
+
# :item => 'item_i5gq90scc1',
|
42
|
+
# :behavior => 'like'
|
43
|
+
# }
|
44
|
+
# ]
|
45
|
+
# )
|
46
|
+
# puts e
|
47
|
+
# rescue TamberError => error
|
48
|
+
# puts error.message
|
49
|
+
# end
|
50
|
+
# end
|
51
|
+
|
52
|
+
end
|
53
|
+
end
|
data/test/test_helper.rb
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'tamber'
|
2
|
+
require 'test/unit'
|
3
|
+
require 'mocha/setup'
|
4
|
+
require 'stringio'
|
5
|
+
require 'shoulda'
|
6
|
+
|
7
|
+
class Test::Unit::TestCase
|
8
|
+
include Mocha
|
9
|
+
|
10
|
+
setup do
|
11
|
+
Tamber.api_key = "IVRiX25dr5rsJ0TDdVOD"
|
12
|
+
end
|
13
|
+
|
14
|
+
teardown do
|
15
|
+
Tamber.api_key = nil
|
16
|
+
end
|
17
|
+
end
|
data/test/user_test.rb
ADDED
@@ -0,0 +1,64 @@
|
|
1
|
+
require File.expand_path('../test_helper', __FILE__)
|
2
|
+
|
3
|
+
module Tamber
|
4
|
+
class UserTest < Test::Unit::TestCase
|
5
|
+
|
6
|
+
# should "create user" do
|
7
|
+
# begin
|
8
|
+
# u = Tamber::User.create(
|
9
|
+
# :id => 'user_rubytestA',
|
10
|
+
# :events => [
|
11
|
+
# {
|
12
|
+
# :item => 'item_u9nlytt3w5',
|
13
|
+
# :behavior => 'like'
|
14
|
+
# },
|
15
|
+
# {
|
16
|
+
# :item => 'item_i5gq90scc1',
|
17
|
+
# :behavior => 'like'
|
18
|
+
# }
|
19
|
+
# ]
|
20
|
+
# )
|
21
|
+
# puts u
|
22
|
+
# rescue TamberError => error
|
23
|
+
# puts error.message
|
24
|
+
# end
|
25
|
+
# end
|
26
|
+
|
27
|
+
# should "users should be able to be updated" do
|
28
|
+
# begin
|
29
|
+
# id = 'user_rubytestA'
|
30
|
+
# metadata = {
|
31
|
+
# 'name' => 'Rob Pike',
|
32
|
+
# 'city' => 'Mountain View, CA'
|
33
|
+
# }
|
34
|
+
# u = Tamber::User.update(
|
35
|
+
# :id => id,
|
36
|
+
# :metadata => metadata
|
37
|
+
# )
|
38
|
+
# assert u.id == id
|
39
|
+
# rescue TamberError => error
|
40
|
+
# puts error.message
|
41
|
+
# end
|
42
|
+
# end
|
43
|
+
|
44
|
+
|
45
|
+
should "retrieve user" do
|
46
|
+
begin
|
47
|
+
id = 'user_rubytestA'
|
48
|
+
u = Tamber::User.retrieve(
|
49
|
+
:id => id,
|
50
|
+
:getRecs => {
|
51
|
+
:number => 10
|
52
|
+
}
|
53
|
+
)
|
54
|
+
puts u.inspect
|
55
|
+
puts u.metadata
|
56
|
+
puts u.metadata[:name]
|
57
|
+
assert u.id == id
|
58
|
+
rescue TamberError => error
|
59
|
+
puts error.message
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
end
|
64
|
+
end
|
metadata
ADDED
@@ -0,0 +1,165 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: tamber
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Alexi Robbins
|
8
|
+
- Mark Canning
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2016-02-10 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: rest-client
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
requirements:
|
18
|
+
- - "~>"
|
19
|
+
- !ruby/object:Gem::Version
|
20
|
+
version: '1.4'
|
21
|
+
type: :runtime
|
22
|
+
prerelease: false
|
23
|
+
version_requirements: !ruby/object:Gem::Requirement
|
24
|
+
requirements:
|
25
|
+
- - "~>"
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
version: '1.4'
|
28
|
+
- !ruby/object:Gem::Dependency
|
29
|
+
name: json
|
30
|
+
requirement: !ruby/object:Gem::Requirement
|
31
|
+
requirements:
|
32
|
+
- - "~>"
|
33
|
+
- !ruby/object:Gem::Version
|
34
|
+
version: 1.8.1
|
35
|
+
type: :runtime
|
36
|
+
prerelease: false
|
37
|
+
version_requirements: !ruby/object:Gem::Requirement
|
38
|
+
requirements:
|
39
|
+
- - "~>"
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
version: 1.8.1
|
42
|
+
- !ruby/object:Gem::Dependency
|
43
|
+
name: mocha
|
44
|
+
requirement: !ruby/object:Gem::Requirement
|
45
|
+
requirements:
|
46
|
+
- - "~>"
|
47
|
+
- !ruby/object:Gem::Version
|
48
|
+
version: 0.13.2
|
49
|
+
type: :development
|
50
|
+
prerelease: false
|
51
|
+
version_requirements: !ruby/object:Gem::Requirement
|
52
|
+
requirements:
|
53
|
+
- - "~>"
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
version: 0.13.2
|
56
|
+
- !ruby/object:Gem::Dependency
|
57
|
+
name: shoulda
|
58
|
+
requirement: !ruby/object:Gem::Requirement
|
59
|
+
requirements:
|
60
|
+
- - "~>"
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: 3.4.0
|
63
|
+
type: :development
|
64
|
+
prerelease: false
|
65
|
+
version_requirements: !ruby/object:Gem::Requirement
|
66
|
+
requirements:
|
67
|
+
- - "~>"
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: 3.4.0
|
70
|
+
- !ruby/object:Gem::Dependency
|
71
|
+
name: test-unit
|
72
|
+
requirement: !ruby/object:Gem::Requirement
|
73
|
+
requirements:
|
74
|
+
- - ">="
|
75
|
+
- !ruby/object:Gem::Version
|
76
|
+
version: '0'
|
77
|
+
type: :development
|
78
|
+
prerelease: false
|
79
|
+
version_requirements: !ruby/object:Gem::Requirement
|
80
|
+
requirements:
|
81
|
+
- - ">="
|
82
|
+
- !ruby/object:Gem::Version
|
83
|
+
version: '0'
|
84
|
+
- !ruby/object:Gem::Dependency
|
85
|
+
name: rake
|
86
|
+
requirement: !ruby/object:Gem::Requirement
|
87
|
+
requirements:
|
88
|
+
- - ">="
|
89
|
+
- !ruby/object:Gem::Version
|
90
|
+
version: '0'
|
91
|
+
type: :development
|
92
|
+
prerelease: false
|
93
|
+
version_requirements: !ruby/object:Gem::Requirement
|
94
|
+
requirements:
|
95
|
+
- - ">="
|
96
|
+
- !ruby/object:Gem::Version
|
97
|
+
version: '0'
|
98
|
+
description: Tamber is the easiest way to put head-scratchingly accurate, real time
|
99
|
+
recommendations in your app. See https://tamber.com for details.
|
100
|
+
email:
|
101
|
+
- alexi@tamber.com
|
102
|
+
- argusdusty@tamber.com
|
103
|
+
executables: []
|
104
|
+
extensions: []
|
105
|
+
extra_rdoc_files: []
|
106
|
+
files:
|
107
|
+
- ".gitignore"
|
108
|
+
- ".travis.yml"
|
109
|
+
- Gemfile
|
110
|
+
- LICENSE
|
111
|
+
- README.rdoc
|
112
|
+
- Rakefile
|
113
|
+
- VERSION
|
114
|
+
- lib/security/ca-bundle.crt
|
115
|
+
- lib/tamber.rb
|
116
|
+
- lib/tamber/api_operations/create.rb
|
117
|
+
- lib/tamber/api_operations/remove.rb
|
118
|
+
- lib/tamber/api_operations/request.rb
|
119
|
+
- lib/tamber/api_operations/retrieve.rb
|
120
|
+
- lib/tamber/api_operations/update.rb
|
121
|
+
- lib/tamber/api_resource.rb
|
122
|
+
- lib/tamber/behavior.rb
|
123
|
+
- lib/tamber/discover.rb
|
124
|
+
- lib/tamber/event.rb
|
125
|
+
- lib/tamber/item.rb
|
126
|
+
- lib/tamber/property.rb
|
127
|
+
- lib/tamber/tamber_error.rb
|
128
|
+
- lib/tamber/tamber_object.rb
|
129
|
+
- lib/tamber/user.rb
|
130
|
+
- lib/tamber/util.rb
|
131
|
+
- lib/tamber/version.rb
|
132
|
+
- tamber.gemspec
|
133
|
+
- test/discover_test.rb
|
134
|
+
- test/event_test.rb
|
135
|
+
- test/test_helper.rb
|
136
|
+
- test/user_test.rb
|
137
|
+
homepage: https://tamber.com/docs/api
|
138
|
+
licenses:
|
139
|
+
- MIT
|
140
|
+
metadata: {}
|
141
|
+
post_install_message:
|
142
|
+
rdoc_options: []
|
143
|
+
require_paths:
|
144
|
+
- lib
|
145
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
146
|
+
requirements:
|
147
|
+
- - ">="
|
148
|
+
- !ruby/object:Gem::Version
|
149
|
+
version: 1.9.3
|
150
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
151
|
+
requirements:
|
152
|
+
- - ">="
|
153
|
+
- !ruby/object:Gem::Version
|
154
|
+
version: '0'
|
155
|
+
requirements: []
|
156
|
+
rubyforge_project:
|
157
|
+
rubygems_version: 2.4.8
|
158
|
+
signing_key:
|
159
|
+
specification_version: 4
|
160
|
+
summary: Ruby bindings for the Tamber API
|
161
|
+
test_files:
|
162
|
+
- test/discover_test.rb
|
163
|
+
- test/event_test.rb
|
164
|
+
- test/test_helper.rb
|
165
|
+
- test/user_test.rb
|