customerio 0.2.0 → 0.3.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/CHANGELOG.markdown CHANGED
@@ -1,3 +1,8 @@
1
+ ## Customerio 0.3.0 - Dec 28, 2012 ##
2
+
3
+ * Now raise an error if an API call doesn't respond with a 200 response code
4
+ * Removed dependency on ActiveSupport
5
+
1
6
  ## Customerio 0.2.0 - Nov 21, 2012 ##
2
7
 
3
8
  * Allow raw hashes to be passed into `identify` and `track` methods rather than a customer object.
data/customerio.gemspec CHANGED
@@ -16,7 +16,6 @@ Gem::Specification.new do |gem|
16
16
  gem.version = Customerio::VERSION
17
17
 
18
18
  gem.add_dependency('httparty', '~> 0.9.0')
19
- gem.add_dependency('activesupport')
20
19
 
21
20
  gem.add_development_dependency('rake')
22
21
  gem.add_development_dependency('rspec')
data/lib/customerio.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  require "customerio/version"
2
2
 
3
3
  module Customerio
4
- autoload :Client, 'customerio/client'
4
+ require "customerio/client"
5
5
  end
@@ -1,32 +1,31 @@
1
1
  require 'httparty'
2
- require 'active_support/hash_with_indifferent_access'
3
2
 
4
3
  module Customerio
5
4
  class Client
6
- include HTTParty
7
- base_uri 'https://app.customer.io'
5
+ include HTTParty
6
+ base_uri 'https://app.customer.io'
8
7
 
9
8
  CustomerProxy = Struct.new("Customer", :id)
10
9
 
11
10
  class MissingIdAttributeError < RuntimeError; end
12
11
  class InvalidResponse < RuntimeError; end
13
12
 
14
- @@id_block = nil
13
+ @@id_block = nil
15
14
 
16
- def self.id(&block)
15
+ def self.id(&block)
17
16
  warn "[DEPRECATION] Customerio::Client.id customization is deprecated."
18
17
  @@id_block = block
19
- end
18
+ end
20
19
 
21
- def self.default_config
22
- @@id_block = nil
23
- end
20
+ def self.default_config
21
+ @@id_block = nil
22
+ end
24
23
 
25
- def initialize(site_id, secret_key)
26
- @auth = { :username => site_id, :password => secret_key }
27
- end
24
+ def initialize(site_id, secret_key)
25
+ @auth = { :username => site_id, :password => secret_key }
26
+ end
28
27
 
29
- def identify(*args)
28
+ def identify(*args)
30
29
  attributes = extract_attributes(args)
31
30
 
32
31
  if args.any?
@@ -34,10 +33,10 @@ module Customerio
34
33
  attributes = attributes_from(customer).merge(attributes)
35
34
  end
36
35
 
37
- create_or_update(attributes)
38
- end
36
+ create_or_update(attributes)
37
+ end
39
38
 
40
- def track(*args)
39
+ def track(*args)
41
40
  attributes = extract_attributes(args)
42
41
 
43
42
  if args.length == 1
@@ -52,35 +51,35 @@ module Customerio
52
51
  identify(attributes_from(customer))
53
52
  create_customer_event(id_from(customer), event_name, attributes)
54
53
  end
55
- end
54
+ end
56
55
 
57
- private
56
+ private
58
57
 
59
- def create_or_update(attributes = {})
58
+ def create_or_update(attributes = {})
60
59
  raise MissingIdAttributeError.new("Must provide an customer id") unless attributes[:id]
61
60
 
62
61
  url = customer_path(attributes[:id])
63
62
  attributes[:id] = custom_id(attributes[:id])
64
63
 
65
- verify_response(self.class.put(url, options.merge(:body => attributes)))
66
- end
64
+ verify_response(self.class.put(url, options.merge(:body => attributes)))
65
+ end
67
66
 
68
- def create_customer_event(customer_id, event_name, attributes = {})
67
+ def create_customer_event(customer_id, event_name, attributes = {})
69
68
  create_event("#{customer_path(customer_id)}/events", event_name, attributes)
70
- end
69
+ end
71
70
 
72
71
  def create_anonymous_event(event_name, attributes = {})
73
72
  create_event("/api/v1/events", event_name, attributes)
74
73
  end
75
74
 
76
- def create_event(url, event_name, attributes = {})
77
- body = { :name => event_name, :data => attributes }
78
- verify_response(self.class.post(url, options.merge(:body => body)))
79
- end
75
+ def create_event(url, event_name, attributes = {})
76
+ body = { :name => event_name, :data => attributes }
77
+ verify_response(self.class.post(url, options.merge(:body => body)))
78
+ end
80
79
 
81
- def customer_path(id)
82
- "/api/v1/customers/#{custom_id(id)}"
83
- end
80
+ def customer_path(id)
81
+ "/api/v1/customers/#{custom_id(id)}"
82
+ end
84
83
 
85
84
  def verify_response(response)
86
85
  if response.code >= 200 && response.code < 300
@@ -91,18 +90,19 @@ module Customerio
91
90
  end
92
91
 
93
92
  def extract_attributes(args)
94
- HashWithIndifferentAccess.new(args.last.is_a?(Hash) ? args.pop : {})
93
+ hash = args.last.is_a?(Hash) ? args.pop : {}
94
+ hash.inject({}){ |hash, (k,v)| hash[k.to_sym] = v; hash }
95
95
  end
96
96
 
97
97
  def attributes_from(customer)
98
98
  if id?(customer)
99
- HashWithIndifferentAccess.new(:id => customer)
99
+ { :id => customer }
100
100
  else
101
- HashWithIndifferentAccess.new(
101
+ {
102
102
  :id => id_from(customer),
103
103
  :email => customer.email,
104
104
  :created_at => customer.created_at.to_i
105
- )
105
+ }
106
106
  end
107
107
  end
108
108
 
@@ -115,16 +115,16 @@ module Customerio
115
115
  end
116
116
  end
117
117
 
118
- def custom_id(id)
119
- @@id_block ? @@id_block.call(id) : id
120
- end
118
+ def custom_id(id)
119
+ @@id_block ? @@id_block.call(id) : id
120
+ end
121
121
 
122
122
  def id?(object)
123
123
  object.is_a?(Integer) || object.is_a?(String)
124
124
  end
125
125
 
126
- def options
127
- { :basic_auth => @auth }
128
- end
126
+ def options
127
+ { :basic_auth => @auth }
128
+ end
129
129
  end
130
130
  end
@@ -1,3 +1,3 @@
1
1
  module Customerio
2
- VERSION = "0.2.0"
2
+ VERSION = "0.3.0"
3
3
  end
data/spec/client_spec.rb CHANGED
@@ -3,7 +3,7 @@ require 'spec_helper'
3
3
  describe Customerio::Client do
4
4
  let(:client) { Customerio::Client.new("SITE_ID", "API_KEY") }
5
5
  let(:customer) { mock("Customer", :id => 5, :email => "customer@example.com", :created_at => Time.now) }
6
- let(:response) { mock("Response", code: 200) }
6
+ let(:response) { mock("Response", :code => 200) }
7
7
 
8
8
  before do
9
9
  # Dont call out to customer.io
@@ -24,7 +24,7 @@ describe Customerio::Client do
24
24
  end
25
25
 
26
26
  it "raises an error if PUT doesn't return a 2xx response code" do
27
- Customerio::Client.should_receive(:put).and_return(mock("Response", code: 500))
27
+ Customerio::Client.should_receive(:put).and_return(mock("Response", :code => 500))
28
28
  lambda { client.identify(:id => 5) }.should raise_error(Customerio::Client::InvalidResponse)
29
29
  end
30
30
 
@@ -46,7 +46,7 @@ describe Customerio::Client do
46
46
  :created_at => Time.now.to_i,
47
47
  :first_name => "Bob",
48
48
  :plan => "basic"
49
- }.stringify_keys
49
+ }
50
50
  }).and_return(response)
51
51
 
52
52
  client.identify(:id => 5, :email => "customer@example.com", :created_at => Time.now.to_i, :first_name => "Bob", :plan => "basic")
@@ -64,7 +64,7 @@ describe Customerio::Client do
64
64
  :id => 5,
65
65
  :email => "customer@example.com",
66
66
  :created_at => Time.now.to_i
67
- }.stringify_keys
67
+ }
68
68
  }).and_return(response)
69
69
 
70
70
  client.identify(customer)
@@ -79,11 +79,26 @@ describe Customerio::Client do
79
79
  :created_at => Time.now.to_i,
80
80
  :first_name => "Bob",
81
81
  :plan => "basic"
82
- }.stringify_keys
82
+ }
83
83
  }).and_return(response)
84
84
 
85
85
  client.identify(customer, :first_name => "Bob", :plan => "basic")
86
86
  end
87
+
88
+ it "allows customer object attributes to be overriden" do
89
+ Customerio::Client.should_receive(:put).with("/api/v1/customers/5", {
90
+ :basic_auth => anything(),
91
+ :body => {
92
+ :id => 5,
93
+ :email => "customer2@example.com",
94
+ :created_at => Time.now.to_i,
95
+ :first_name => "Bob",
96
+ :plan => "basic"
97
+ }
98
+ }).and_return(response)
99
+
100
+ client.identify(customer, "email" => "customer2@example.com", :first_name => "Bob", :plan => "basic")
101
+ end
87
102
  end
88
103
 
89
104
  context "client has customized identities" do
@@ -100,7 +115,7 @@ describe Customerio::Client do
100
115
  :id => "production_5",
101
116
  :email => "customer@example.com",
102
117
  :created_at => Time.now.to_i
103
- }.stringify_keys
118
+ }
104
119
  }).and_return(response)
105
120
 
106
121
  client.identify(customer)
@@ -113,7 +128,7 @@ describe Customerio::Client do
113
128
  :id => "production_5",
114
129
  :email => "customer@example.com",
115
130
  :created_at => Time.now.to_i
116
- }.stringify_keys
131
+ }
117
132
  }).and_return(response)
118
133
 
119
134
  client.identify(:id => 5, :email => "customer@example.com", :created_at => Time.now.to_i)
@@ -128,12 +143,12 @@ describe Customerio::Client do
128
143
  end
129
144
 
130
145
  it "raises an error if POST doesn't return a 2xx response code" do
131
- Customerio::Client.should_receive(:post).and_return(mock("Response", code: 500))
146
+ Customerio::Client.should_receive(:post).and_return(mock("Response", :code => 500))
132
147
  lambda { client.track(customer, "purchase") }.should raise_error(Customerio::Client::InvalidResponse)
133
148
  end
134
149
 
135
150
  it "calls identify with the user's attributes to ensure they've been properly identified" do
136
- client.should_receive(:identify).with({ :id => 5, :email => "customer@example.com", :created_at => Time.now.to_i }.stringify_keys).and_return(response)
151
+ client.should_receive(:identify).with({ :id => 5, :email => "customer@example.com", :created_at => Time.now.to_i }).and_return(response)
137
152
  client.track(customer, "purchase")
138
153
  end
139
154
 
@@ -160,7 +175,7 @@ describe Customerio::Client do
160
175
  :basic_auth => anything(),
161
176
  :body => {
162
177
  :name => "purchase",
163
- :data => { :type => "socks", :price => "13.99" }.stringify_keys
178
+ :data => { :type => "socks", :price => "13.99" }
164
179
  }
165
180
  }).and_return(response)
166
181
 
@@ -172,7 +187,7 @@ describe Customerio::Client do
172
187
  :basic_auth => anything(),
173
188
  :body => {
174
189
  :name => "purchase",
175
- :data => { :type => "socks", :price => "13.99" }.stringify_keys
190
+ :data => { :type => "socks", :price => "13.99" }
176
191
  }
177
192
  }).and_return(response)
178
193
 
@@ -234,7 +249,7 @@ describe Customerio::Client do
234
249
  :basic_auth => anything(),
235
250
  :body => {
236
251
  :name => "purchase",
237
- :data => { :type => "socks", :price => "13.99" }.stringify_keys
252
+ :data => { :type => "socks", :price => "13.99" }
238
253
  }
239
254
  }).and_return(response)
240
255
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: customerio
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-11-22 00:00:00.000000000 Z
12
+ date: 2012-12-28 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: httparty
@@ -27,22 +27,6 @@ dependencies:
27
27
  - - ~>
28
28
  - !ruby/object:Gem::Version
29
29
  version: 0.9.0
30
- - !ruby/object:Gem::Dependency
31
- name: activesupport
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
30
  - !ruby/object:Gem::Dependency
47
31
  name: rake
48
32
  requirement: !ruby/object:Gem::Requirement