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.
@@ -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,10 +0,0 @@
1
- module Tamber
2
- module APIOperations
3
- module Create
4
- def create(params={})
5
- response = request(:post, url+"/create", params)
6
- Util.convert_to_tamber_object(response)
7
- end
8
- end
9
- end
10
- end
@@ -1,10 +0,0 @@
1
- module Tamber
2
- module APIOperations
3
- module Remove
4
- def remove(params={})
5
- response = request(:get, url+"/remove", params)
6
- # initialize_from(response, opts)
7
- end
8
- end
9
- end
10
- 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
@@ -1,10 +0,0 @@
1
- module Tamber
2
- module APIOperations
3
- module Retrieve
4
- def retrieve(params={})
5
- response = request(:get, url+"/retrieve", params)
6
- Util.convert_to_tamber_object(response)
7
- end
8
- end
9
- end
10
- end
@@ -1,10 +0,0 @@
1
- module Tamber
2
- module APIOperations
3
- module Update
4
- def update(params={})
5
- response = request(:post, url+"/update", params)
6
- Util.convert_to_tamber_object(response)
7
- end
8
- end
9
- end
10
- end
@@ -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
@@ -1,6 +0,0 @@
1
- module Tamber
2
- class Behavior < APIResource
3
- extend Tamber::APIOperations::Create
4
- extend Tamber::APIOperations::Retrieve
5
- end
6
- end
@@ -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
@@ -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
@@ -1,8 +0,0 @@
1
- module Tamber
2
- class Item < APIResource
3
- extend Tamber::APIOperations::Create
4
- extend Tamber::APIOperations::Update
5
- extend Tamber::APIOperations::Retrieve
6
- extend Tamber::APIOperations::Remove
7
- end
8
- end
@@ -1,10 +0,0 @@
1
- module Tamber
2
- class TamberError < StandardError
3
- attr_reader :message
4
-
5
- def initialize(message=nil)
6
- @message = message
7
- end
8
-
9
- end
10
- end
@@ -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
@@ -1,7 +0,0 @@
1
- module Tamber
2
- class User < APIResource
3
- extend Tamber::APIOperations::Create
4
- extend Tamber::APIOperations::Update
5
- extend Tamber::APIOperations::Retrieve
6
- end
7
- end