klaviyo 0.9.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.
data/klaviyo.gemspec ADDED
@@ -0,0 +1,18 @@
1
+ files = ['klaviyo.gemspec', '{lib}/**/*'].map {|f| Dir[f]}.flatten
2
+
3
+ Gem::Specification.new do |s|
4
+ s.name = 'klaviyo'
5
+ s.version = '0.9.0'
6
+ s.date = '2012-07-10'
7
+ s.summary = 'Ruby wrapper for the Klaviyo API'
8
+ s.description = 'You heard us, a Ruby wrapper for the Klaviyo API'
9
+ s.authors = ['Andrew Bialecki']
10
+ s.email = 'andrew@klaviyo.com'
11
+ s.files = files
12
+ s.homepage = 'http://www.klaviyo.com/'
13
+ s.require_path = 'lib'
14
+ s.has_rdoc = false
15
+ s.add_dependency 'json'
16
+ s.add_dependency 'rack'
17
+ s.add_dependency 'escape'
18
+ end
data/lib/klaviyo.rb ADDED
@@ -0,0 +1 @@
1
+ require 'klaviyo/client'
@@ -0,0 +1,73 @@
1
+ require 'open-uri'
2
+ require 'base64'
3
+ require 'json'
4
+ require 'klaviyo/client/middleware'
5
+
6
+ module Klaviyo
7
+ class KlaviyoError < StandardError; end
8
+
9
+ class Client
10
+ def initialize(api_key, env, url = 'http://a.klaviyo.com/')
11
+ @api_key = api_key
12
+ @env = env
13
+ @url = url
14
+ end
15
+
16
+ def track(event, kwargs = {})
17
+ defaults = {:id => nil, :email => nil, :properties => {}, :customer_properties => {}}
18
+ kwargs = defaults.merge(kwargs)
19
+
20
+ if kwargs[:email].to_s.empty? and kwargs[:id].to_s.empty?
21
+ raise KlaviyoError.new('You must identify a user by email or ID')
22
+ end
23
+
24
+ customer_properties = kwargs[:customer_properties]
25
+ customer_properties[:email] = kwargs[:email] unless kwargs[:email].to_s.empty?
26
+ customer_properties[:id] = kwargs[:id] unless kwargs[:id].to_s.empty?
27
+
28
+ params = build_params({
29
+ :token => @api_key,
30
+ :event => event,
31
+ :properties => kwargs[:properties],
32
+ :customer_properties => customer_properties,
33
+ :ip => ''
34
+ })
35
+ request('crm/api/track', params)
36
+ end
37
+
38
+ def track_once(event, customer_properties = {}, properties = {})
39
+ properties.update('__track_once__' => true)
40
+ track(event, email, id, properties, customer_properties)
41
+ end
42
+
43
+ def identify(kwargs = {})
44
+ defaults = {:id => nil, :email => nil, :properties => {}}
45
+ kwargs = defaults.merge(kwargs)
46
+
47
+ if kwargs[:email].to_s.empty? and kwargs[:id].to_s.empty?
48
+ raise KlaviyoError.new('You must identify a user by email or ID')
49
+ end
50
+
51
+ properties = kwargs[:properties]
52
+ properties[:email] = kwargs[:email] unless kwargs[:email].to_s.empty?
53
+ properties[:id] = kwargs[:id] unless kwargs[:id].to_s.empty?
54
+
55
+ params = build_params({
56
+ :token => @api_key,
57
+ :properties => properties
58
+ })
59
+ request('crm/api/identify', params)
60
+ end
61
+
62
+ private
63
+
64
+ def build_params(params)
65
+ 'data=' + Base64.encode64(JSON.generate(params)).gsub(/\n/,'')
66
+ end
67
+
68
+ def request(path, params)
69
+ url = @url + path + '?' + params
70
+ open(url).read == '1' ? true : false
71
+ end
72
+ end
73
+ end
@@ -0,0 +1,72 @@
1
+ require 'rack'
2
+
3
+ module Klaviyo
4
+ class Client
5
+ class Middleware
6
+ def initialize(app, api_key, options={})
7
+ @app = app
8
+ @api_key = api_key
9
+ @options = {
10
+ :insert_js_last => true
11
+ }.merge(options)
12
+ end
13
+
14
+ def call(env)
15
+ @env = env
16
+
17
+ @status, @headers, @response = @app.call(env)
18
+
19
+ if is_trackable_response?
20
+ update_response!
21
+ update_content_length!
22
+ end
23
+
24
+ [@status, @headers, @response]
25
+ end
26
+
27
+ private
28
+
29
+ def update_response!
30
+ @response.each do |part|
31
+ insert_at = part.index(@options[:insert_js_last] ? '</body' : '</head')
32
+ unless insert_at.nil?
33
+ part.insert(insert_at, render_script)
34
+ end
35
+ end
36
+ end
37
+
38
+ def update_content_length!
39
+ new_size = 0
40
+ @response.each{|part| new_size += part.bytesize}
41
+ @headers.merge!('Content-Length' => new_size.to_s)
42
+ end
43
+
44
+ def is_ajax_request?
45
+ @env.has_key?('HTTP_X_REQUESTED_WITH') && @env['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest'
46
+ end
47
+
48
+ def is_html_response?
49
+ @headers['Content-Type'].include?('text/html') if @headers.has_key?('Content-Type')
50
+ end
51
+
52
+ def is_trackable_response?
53
+ is_html_response? && !is_ajax_request?
54
+ end
55
+
56
+ def render_script
57
+ <<-EOT
58
+ <script text="text/javascript">
59
+ var _learnq = _learnq || [];
60
+ _learnq.push(['account', '#{@api_key}']);
61
+
62
+ (function () {
63
+ var b = document.createElement('script'); b.type = 'text/javascript'; b.async = true;
64
+ b.src = ('https:' == document.location.protocol ? 'https://' : 'http://') + 'a.klaviyo.com/media/js/learnmarklet.js';
65
+ var a = document.getElementsByTagName('script')[0]; a.parentNode.insertBefore(b, a);
66
+ })();
67
+ </script>
68
+ EOT
69
+ end
70
+ end
71
+ end
72
+ end
metadata ADDED
@@ -0,0 +1,96 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: klaviyo
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.9.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Andrew Bialecki
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-07-10 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: json
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
30
+ - !ruby/object:Gem::Dependency
31
+ name: rack
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ type: :runtime
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ - !ruby/object:Gem::Dependency
47
+ name: escape
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :runtime
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ description: You heard us, a Ruby wrapper for the Klaviyo API
63
+ email: andrew@klaviyo.com
64
+ executables: []
65
+ extensions: []
66
+ extra_rdoc_files: []
67
+ files:
68
+ - klaviyo.gemspec
69
+ - lib/klaviyo/client/middleware.rb
70
+ - lib/klaviyo/client.rb
71
+ - lib/klaviyo.rb
72
+ homepage: http://www.klaviyo.com/
73
+ licenses: []
74
+ post_install_message:
75
+ rdoc_options: []
76
+ require_paths:
77
+ - lib
78
+ required_ruby_version: !ruby/object:Gem::Requirement
79
+ none: false
80
+ requirements:
81
+ - - ! '>='
82
+ - !ruby/object:Gem::Version
83
+ version: '0'
84
+ required_rubygems_version: !ruby/object:Gem::Requirement
85
+ none: false
86
+ requirements:
87
+ - - ! '>='
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ requirements: []
91
+ rubyforge_project:
92
+ rubygems_version: 1.8.24
93
+ signing_key:
94
+ specification_version: 3
95
+ summary: Ruby wrapper for the Klaviyo API
96
+ test_files: []