tamber 0.1.4 → 0.1.6
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 +4 -4
- data/test/behavior_test.rb +2 -0
- data/test/discover_test.rb +10 -0
- data/test/event_test.rb +2 -0
- data/test/user_test.rb +40 -8
- metadata +20 -89
- data/.gitignore +0 -5
- data/.travis.yml +0 -8
- data/Gemfile +0 -2
- data/LICENSE +0 -22
- data/README.rdoc +0 -74
- data/Rakefile +0 -7
- data/VERSION +0 -1
- data/bin/tamber-0.1.3.gem +0 -0
- data/lib/security/ca-bundle.crt +0 -3893
- data/lib/tamber.rb +0 -202
- data/lib/tamber/api_operations/create.rb +0 -10
- data/lib/tamber/api_operations/remove.rb +0 -10
- data/lib/tamber/api_operations/request.rb +0 -21
- data/lib/tamber/api_operations/retrieve.rb +0 -10
- data/lib/tamber/api_operations/update.rb +0 -10
- data/lib/tamber/api_resource.rb +0 -21
- data/lib/tamber/behavior.rb +0 -6
- data/lib/tamber/discover.rb +0 -54
- data/lib/tamber/event.rb +0 -24
- data/lib/tamber/item.rb +0 -8
- data/lib/tamber/tamber_error.rb +0 -10
- data/lib/tamber/tamber_object.rb +0 -35
- data/lib/tamber/user.rb +0 -7
- data/lib/tamber/util.rb +0 -89
- data/lib/tamber/version.rb +0 -3
- data/tamber.gemspec +0 -35
data/lib/tamber.rb
DELETED
@@ -1,202 +0,0 @@
|
|
1
|
-
# Tamber Ruby bindings
|
2
|
-
# API spec at https://tamber.com/docs/api
|
3
|
-
require 'cgi'
|
4
|
-
require 'openssl'
|
5
|
-
require 'rbconfig'
|
6
|
-
require 'set'
|
7
|
-
require 'socket'
|
8
|
-
require 'base64'
|
9
|
-
|
10
|
-
require 'rest-client'
|
11
|
-
require 'json'
|
12
|
-
|
13
|
-
require 'tamber/version'
|
14
|
-
|
15
|
-
require 'tamber/api_operations/create'
|
16
|
-
require 'tamber/api_operations/update'
|
17
|
-
require 'tamber/api_operations/remove'
|
18
|
-
require 'tamber/api_operations/retrieve'
|
19
|
-
require 'tamber/api_operations/request'
|
20
|
-
|
21
|
-
require 'tamber/tamber_object'
|
22
|
-
require 'tamber/util'
|
23
|
-
require 'tamber/api_resource'
|
24
|
-
require 'tamber/discover'
|
25
|
-
require 'tamber/event'
|
26
|
-
require 'tamber/user'
|
27
|
-
require 'tamber/item'
|
28
|
-
require 'tamber/behavior'
|
29
|
-
|
30
|
-
|
31
|
-
require 'tamber/tamber_error'
|
32
|
-
|
33
|
-
|
34
|
-
module Tamber
|
35
|
-
DEFAULT_CA_BUNDLE_PATH = File.dirname(__FILE__) + '/security/ca-bundle.crt'
|
36
|
-
|
37
|
-
@ca_bundle_path = DEFAULT_CA_BUNDLE_PATH
|
38
|
-
@verify_ssl_certs = true
|
39
|
-
|
40
|
-
@api_url = 'https://api.tamber.com/v1'
|
41
|
-
@open_timeout = 30
|
42
|
-
@read_timeout = 80
|
43
|
-
|
44
|
-
class << self
|
45
|
-
attr_accessor :project_key, :engine_key, :api_version, :verify_ssl_certs, :open_timeout, :read_timeout
|
46
|
-
end
|
47
|
-
|
48
|
-
|
49
|
-
def self.api_url(api_base_url=nil, url='')
|
50
|
-
(api_base_url || @api_url) + url
|
51
|
-
end
|
52
|
-
|
53
|
-
def self.ca_bundle_path
|
54
|
-
@ca_bundle_path
|
55
|
-
end
|
56
|
-
|
57
|
-
def self.ca_bundle_path=(path)
|
58
|
-
@ca_bundle_path = path
|
59
|
-
end
|
60
|
-
|
61
|
-
def self.request(method, url, params={})
|
62
|
-
|
63
|
-
if project_key =~ /\s/
|
64
|
-
raise TamberError.new('Your project key is invalid, as it contains ' \
|
65
|
-
'whitespace. (HINT: You can double-check your project key from the ' \
|
66
|
-
'Tamber dashboard. See https://dashboard.tamber.com to get your engine\'s key, or ' \
|
67
|
-
'email support@tamber.com if you have any questions.)')
|
68
|
-
end
|
69
|
-
|
70
|
-
if engine_key =~ /\s/
|
71
|
-
raise TamberError.new('Your engine key is invalid, as it contains ' \
|
72
|
-
'whitespace. (HINT: You can double-check your project key from the ' \
|
73
|
-
'Tamber dashboard. See https://dashboard.tamber.com to get your engine\'s key, or ' \
|
74
|
-
'email support@tamber.com if you have any questions.)')
|
75
|
-
end
|
76
|
-
|
77
|
-
if verify_ssl_certs
|
78
|
-
request_opts = {:verify_ssl => OpenSSL::SSL::VERIFY_PEER,
|
79
|
-
:ssl_ca_file => @ca_bundle_path}
|
80
|
-
else
|
81
|
-
request_opts = {:verify_ssl => false}
|
82
|
-
unless @verify_ssl_warned
|
83
|
-
@verify_ssl_warned = true
|
84
|
-
$stderr.puts("WARNING: Running without SSL cert verification. " \
|
85
|
-
"You should never do this in production. " \
|
86
|
-
"Execute 'Tamber.verify_ssl_certs = true' to enable verification.")
|
87
|
-
end
|
88
|
-
end
|
89
|
-
|
90
|
-
url = @api_url + url
|
91
|
-
|
92
|
-
case method.to_s.downcase.to_sym
|
93
|
-
when :get, :head, :delete
|
94
|
-
# Make params into GET parameters
|
95
|
-
url += "#{URI.parse(url).query ? '&' : '?'}#{Util.encode_parameters(params)}" if params && params.any?
|
96
|
-
payload = nil
|
97
|
-
else
|
98
|
-
payload = Util.encode_parameters(params)
|
99
|
-
end
|
100
|
-
|
101
|
-
request_opts.update(:headers => request_headers(project_key, engine_key, method),
|
102
|
-
:method => method, :open_timeout => open_timeout,
|
103
|
-
:payload => payload, :url => url, :timeout => read_timeout)
|
104
|
-
|
105
|
-
response = execute_request_with_rescues(request_opts)
|
106
|
-
|
107
|
-
[parse(response)]
|
108
|
-
end
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
def self.request_headers(pkey, ekey, method)
|
113
|
-
pkey ||= ''
|
114
|
-
ekey ||= ''
|
115
|
-
encoded_key = Base64.encode64(pkey + ':' + ekey)
|
116
|
-
headers = {
|
117
|
-
:user_agent => "Tamber/v1 RubyBindings/#{Tamber::VERSION}",
|
118
|
-
:authorization => "Basic "+encoded_key,
|
119
|
-
:content_type => 'application/x-www-form-urlencoded'
|
120
|
-
}
|
121
|
-
|
122
|
-
headers[:tamber_version] = api_version if api_version
|
123
|
-
|
124
|
-
begin
|
125
|
-
headers.update(:x_tamber_client_user_agent => JSON.generate(user_agent))
|
126
|
-
rescue => e
|
127
|
-
headers.update(:x_tamber_client_raw_user_agent => user_agent.inspect,
|
128
|
-
:error => "#{e} (#{e.class})")
|
129
|
-
end
|
130
|
-
end
|
131
|
-
|
132
|
-
def self.user_agent
|
133
|
-
lang_version = "#{RUBY_VERSION} p#{RUBY_PATCHLEVEL} (#{RUBY_RELEASE_DATE})"
|
134
|
-
|
135
|
-
{
|
136
|
-
:bindings_version => Tamber::VERSION,
|
137
|
-
:lang => 'ruby',
|
138
|
-
:lang_version => lang_version,
|
139
|
-
:platform => RUBY_PLATFORM,
|
140
|
-
:engine => defined?(RUBY_ENGINE) ? RUBY_ENGINE : '',
|
141
|
-
:publisher => 'tamber',
|
142
|
-
:hostname => Socket.gethostname,
|
143
|
-
}
|
144
|
-
|
145
|
-
end
|
146
|
-
|
147
|
-
def self.general_api_error(rbody)
|
148
|
-
TamberError.new("Invalid response object from API: "+rbody.inspect)
|
149
|
-
end
|
150
|
-
|
151
|
-
def self.handle_restclient_error(e, request_opts)
|
152
|
-
parse(e)
|
153
|
-
end
|
154
|
-
|
155
|
-
def self.execute_request(opts)
|
156
|
-
RestClient::Request.execute(opts)
|
157
|
-
end
|
158
|
-
|
159
|
-
def self.parse(response)
|
160
|
-
begin
|
161
|
-
response = JSON.parse(response.body)
|
162
|
-
if response["success"]
|
163
|
-
response = response["result"]
|
164
|
-
else
|
165
|
-
raise TamberError.new("Error: "+response["error"])
|
166
|
-
end
|
167
|
-
rescue JSON::ParserError
|
168
|
-
raise general_api_error(response.body)
|
169
|
-
end
|
170
|
-
Util.symbolize_names(response)
|
171
|
-
end
|
172
|
-
|
173
|
-
private
|
174
|
-
|
175
|
-
def self.execute_request_with_rescues(request_opts)
|
176
|
-
# response = execute_request(request_opts)
|
177
|
-
begin
|
178
|
-
response = execute_request(request_opts)
|
179
|
-
rescue SocketError => e
|
180
|
-
response = handle_restclient_error(e, request_opts)
|
181
|
-
rescue NoMethodError => e
|
182
|
-
# Work around RestClient bug
|
183
|
-
if e.message =~ /\WRequestFailed\W/
|
184
|
-
raise TamberError.new('Error: Unexpected HTTP response code')
|
185
|
-
else
|
186
|
-
raise
|
187
|
-
end
|
188
|
-
rescue RestClient::ExceptionWithResponse => e
|
189
|
-
puts "ExceptionWithResponse: #{e}"
|
190
|
-
if e.response
|
191
|
-
puts "e.response"
|
192
|
-
parse(e.response)
|
193
|
-
else
|
194
|
-
response = handle_restclient_error(e, request_opts)
|
195
|
-
end
|
196
|
-
rescue RestClient::Exception, Errno::ECONNREFUSED => e
|
197
|
-
response = handle_restclient_error(e, request_opts)
|
198
|
-
end
|
199
|
-
|
200
|
-
response
|
201
|
-
end
|
202
|
-
end
|
@@ -1,21 +0,0 @@
|
|
1
|
-
module Tamber
|
2
|
-
module APIOperations
|
3
|
-
module Request
|
4
|
-
module ClassMethods
|
5
|
-
def request(method, url, params={})
|
6
|
-
response = Tamber.request(method, url, params)
|
7
|
-
end
|
8
|
-
end
|
9
|
-
|
10
|
-
def self.included(base)
|
11
|
-
base.extend(ClassMethods)
|
12
|
-
end
|
13
|
-
|
14
|
-
protected
|
15
|
-
|
16
|
-
def request(method, url, params={})
|
17
|
-
self.class.request(method, url, params)
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
data/lib/tamber/api_resource.rb
DELETED
@@ -1,21 +0,0 @@
|
|
1
|
-
module Tamber
|
2
|
-
class APIResource < TamberObject
|
3
|
-
include Tamber::APIOperations::Request
|
4
|
-
|
5
|
-
def self.class_name
|
6
|
-
self.name.split('::')[-1]
|
7
|
-
end
|
8
|
-
|
9
|
-
def self.url
|
10
|
-
if self == APIResource
|
11
|
-
raise TamberError.new('APIResource is an abstract class. You should perform actions on its subclasses (Event, Discover, etc.)')
|
12
|
-
end
|
13
|
-
"/#{CGI.escape(class_name.downcase)}"
|
14
|
-
end
|
15
|
-
|
16
|
-
def url
|
17
|
-
"#{self.class.url}"
|
18
|
-
end
|
19
|
-
|
20
|
-
end
|
21
|
-
end
|
data/lib/tamber/behavior.rb
DELETED
data/lib/tamber/discover.rb
DELETED
@@ -1,54 +0,0 @@
|
|
1
|
-
module Tamber
|
2
|
-
class Discover < APIResource
|
3
|
-
|
4
|
-
def self.recommended(params={})
|
5
|
-
response = request(:get, self.recommended_url, params)
|
6
|
-
Util.convert_to_tamber_object(response)
|
7
|
-
end
|
8
|
-
|
9
|
-
def self.similar(params={})
|
10
|
-
response = request(:get, self.similar_url, params)
|
11
|
-
Util.convert_to_tamber_object(response)
|
12
|
-
end
|
13
|
-
|
14
|
-
def self.recommendedSimilar(params={})
|
15
|
-
response = request(:get, self.recommendedSimilar_url, params)
|
16
|
-
Util.convert_to_tamber_object(response)
|
17
|
-
end
|
18
|
-
|
19
|
-
def self.popular(params={})
|
20
|
-
response = request(:get, self.popular_url, params)
|
21
|
-
Util.convert_to_tamber_object(response)
|
22
|
-
end
|
23
|
-
|
24
|
-
def self.hot(params={})
|
25
|
-
response = request(:get, self.hot_url, params)
|
26
|
-
Util.convert_to_tamber_object(response)
|
27
|
-
end
|
28
|
-
|
29
|
-
def self.recommended_url
|
30
|
-
url + '/recommended'
|
31
|
-
end
|
32
|
-
|
33
|
-
def self.similar_url
|
34
|
-
url + '/similar'
|
35
|
-
end
|
36
|
-
|
37
|
-
def self.recommendedSimilar_url
|
38
|
-
url + '/recommended_similar'
|
39
|
-
end
|
40
|
-
|
41
|
-
def self.popular_url
|
42
|
-
url + '/popular'
|
43
|
-
end
|
44
|
-
|
45
|
-
def self.hot_url
|
46
|
-
url + '/hot'
|
47
|
-
end
|
48
|
-
|
49
|
-
end
|
50
|
-
|
51
|
-
# Discover requests return an array of 'discovery' objects
|
52
|
-
class Discovery < TamberObject
|
53
|
-
end
|
54
|
-
end
|
data/lib/tamber/event.rb
DELETED
@@ -1,24 +0,0 @@
|
|
1
|
-
module Tamber
|
2
|
-
class Event < APIResource
|
3
|
-
|
4
|
-
extend Tamber::APIOperations::Retrieve
|
5
|
-
|
6
|
-
def self.track_url
|
7
|
-
url + '/track'
|
8
|
-
end
|
9
|
-
|
10
|
-
def self.batch_url
|
11
|
-
url + '/batch'
|
12
|
-
end
|
13
|
-
|
14
|
-
def self.track(params={})
|
15
|
-
response = request(:post, self.track_url, params)
|
16
|
-
Util.convert_to_tamber_object(response)
|
17
|
-
end
|
18
|
-
|
19
|
-
def self.batch(params={})
|
20
|
-
response = request(:post, self.batch_url, params)
|
21
|
-
Util.convert_to_tamber_object(response)
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
data/lib/tamber/item.rb
DELETED
data/lib/tamber/tamber_error.rb
DELETED
data/lib/tamber/tamber_object.rb
DELETED
@@ -1,35 +0,0 @@
|
|
1
|
-
module Tamber
|
2
|
-
class TamberObject
|
3
|
-
|
4
|
-
def initialize(values={})
|
5
|
-
values.each do |k,v|
|
6
|
-
val = self.class.curvert(v)
|
7
|
-
self.instance_variable_set("@#{k}", val)
|
8
|
-
self.singleton_class.send(:attr_accessor, k)
|
9
|
-
end
|
10
|
-
end
|
11
|
-
|
12
|
-
def self.construct_from(values)
|
13
|
-
values = Tamber::Util.symbolize_names(values)
|
14
|
-
self.new(values)
|
15
|
-
end
|
16
|
-
|
17
|
-
def self.curvert(values={})
|
18
|
-
case values
|
19
|
-
when Hash
|
20
|
-
if values.has_key?(:object)
|
21
|
-
Tamber::Util.object_classes.fetch(values[:object],TamberObject).new(values)
|
22
|
-
else
|
23
|
-
values.each do |k,v|
|
24
|
-
values[k] = curvert(v)
|
25
|
-
end
|
26
|
-
end
|
27
|
-
when Array
|
28
|
-
values.map { |i| curvert(i) }
|
29
|
-
else
|
30
|
-
values
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
end
|
35
|
-
end
|