tamber 0.1.4 → 0.1.6

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