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