drip-ruby 0.0.7 → 0.0.8

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 5d4e777f5ca779726700304adcdce97c48cd8537
4
- data.tar.gz: bd5ed6afa3f0c4c436fabf4b8d3f759bbf07aea4
3
+ metadata.gz: 88627464a71686f9b3adcf9be0e40fc818856bb4
4
+ data.tar.gz: 20acf82185d43a600bab243510c58a9c0828ad2b
5
5
  SHA512:
6
- metadata.gz: e1be434ca69b2b16b0c6b192d1cd30cb8a7853426d477f30c2a1c761ffa5cfe129658d73854b8622697f784e0a7089dab1e194f036a11671fd0ff6d45ba7adba
7
- data.tar.gz: f9b0b6e8ea3631d3f67ef935177106d497627170f6b2f11c82f135c68929860dbf05b350c91269c6e1b9883377d00e5d70a5653594222ec1a5be32e0769f5527
6
+ metadata.gz: df49725e0364d09f2f5b48552e829d6726e2ea402cd390fc6ea2a6cd8b091d6b8ba49a5644e7f4bf4d19a08b17fcf63bc620101cfa4311bedd614ca425b22849
7
+ data.tar.gz: 69bd895065c5d133f164b5c3fe05caf9e1607fbf801a384cadac9da46b2ccc4e8ddd7dc07df6310282d02e8159668a25dd9a221da3c4858b4865f09af4c83bd1
@@ -3,5 +3,3 @@ sudo: false
3
3
  rvm:
4
4
  - 2.1.0
5
5
  - jruby-19mode
6
- - rbx-2
7
- - ruby-head
data/README.md CHANGED
@@ -5,6 +5,8 @@ A Ruby toolkit for the [Drip](https://www.getdrip.com/) API.
5
5
  [![Build Status](https://travis-ci.org/DripEmail/drip-ruby.svg?branch=master)](https://travis-ci.org/DripEmail/drip-ruby)
6
6
  [![Code Climate](https://codeclimate.com/github/DripEmail/drip-ruby/badges/gpa.svg)](https://codeclimate.com/github/DripEmail/drip-ruby)
7
7
 
8
+
9
+
8
10
  ## Installation
9
11
 
10
12
  Add this line to your application's Gemfile:
@@ -69,12 +71,15 @@ as methods on the client object. The following methods are currently available:
69
71
  | Subscribe to a campaign | `#subscribe(email, campaign_id, options = {})` |
70
72
  | Unsubscribe | `#unsubscribe(id_or_email, options = {})` |
71
73
  | Delete | `#delete_subscriber(id_or_email)` |
74
+ | List tags | `#tags` |
72
75
  | Apply a tag | `#apply_tag(email, tag)` |
73
76
  | Remove a tag | `#remove_tag(email, tag)` |
74
77
  | Track an event | `#track_event(email, action, properties = {})` |
75
78
  | Track a batch of events | `#track_events(events)` |
76
79
  | List campaigns | `#campaigns` |
77
-
80
+ | Create a purchase         | `#create_purchase(email, amount, options = {})` |
81
+ | List purchases for a subscriber | `#purchases(email)` |
82
+ | Fetch a purchase | `#purchase(email, id)` |
78
83
 
79
84
  **Note:** We do not have complete API coverage yet. If we are missing an API method
80
85
  that you need to use in your application, please file an issue and/or open a
@@ -18,6 +18,8 @@ Gem::Specification.new do |spec|
18
18
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
19
  spec.require_paths = ["lib"]
20
20
 
21
+ spec.required_ruby_version = '>= 1.9.3'
22
+
21
23
  spec.add_development_dependency "bundler", "~> 1.6"
22
24
  spec.add_development_dependency "rake", "~> 10.0"
23
25
  spec.add_development_dependency "shoulda-context", "~> 1.0"
@@ -26,5 +28,4 @@ Gem::Specification.new do |spec|
26
28
 
27
29
  spec.add_runtime_dependency "faraday", "~> 0.9"
28
30
  spec.add_runtime_dependency "faraday_middleware", "~> 0.9"
29
- spec.add_runtime_dependency "json", "~> 1.8"
30
31
  end
@@ -4,6 +4,7 @@ require "drip/client/subscribers"
4
4
  require "drip/client/tags"
5
5
  require "drip/client/events"
6
6
  require "drip/client/campaigns"
7
+ require "drip/client/purchases"
7
8
  require "faraday"
8
9
  require "faraday_middleware"
9
10
  require "json"
@@ -15,6 +16,7 @@ module Drip
15
16
  include Tags
16
17
  include Events
17
18
  include Campaigns
19
+ include Purchases
18
20
 
19
21
  attr_accessor :access_token, :api_key, :account_id
20
22
 
@@ -34,37 +36,31 @@ module Drip
34
36
  end
35
37
 
36
38
  def get(url, options = {})
37
- build_response do
38
- connection.get do |req|
39
- req.url url
40
- req.params = options
41
- end
42
- end
39
+ make_request(:get, url, options)
43
40
  end
44
41
 
45
42
  def post(url, options = {})
46
- build_response do
47
- connection.post do |req|
48
- req.url url
49
- req.body = options.to_json
50
- end
51
- end
43
+ make_request(:post, url, options)
52
44
  end
53
45
 
54
46
  def put(url, options = {})
55
- build_response do
56
- connection.put do |req|
57
- req.url url
58
- req.body = options.to_json
59
- end
60
- end
47
+ make_request(:put, url, options)
61
48
  end
62
49
 
63
50
  def delete(url, options = {})
51
+ make_request(:delete, url, options)
52
+ end
53
+
54
+ def make_request(verb, url, options)
64
55
  build_response do
65
- connection.delete do |req|
56
+ connection.send(verb) do |req|
66
57
  req.url url
67
- req.body = options.to_json
58
+
59
+ if verb == :get
60
+ req.params = options
61
+ else
62
+ req.body = options.to_json
63
+ end
68
64
  end
69
65
  end
70
66
  end
@@ -8,100 +8,6 @@ module Drip
8
8
  def accounts
9
9
  get "accounts"
10
10
  end
11
-
12
- # Public: Create or update a subscriber.
13
- #
14
- # options - A Hash of options.
15
- # - email - Required. The String subscriber email address.
16
- # - new_email - Optional. A new email address for the subscriber.
17
- # If provided and a subscriber with the email above
18
- # does not exist, this address will be used to
19
- # create a new subscriber.
20
- # - time_zone - Optional. The subscriber's time zone (in Olsen
21
- # format). Defaults to Etc/UTC.
22
- # - custom_fields - Optional. A Hash of custom field data.
23
- # - tags - Optional. An Array of tags.
24
- #
25
- # Returns a Drip::Response.
26
- # See https://www.getdrip.com/docs/rest-api#create_or_update_subscriber
27
- def create_or_update_subscriber(email, options = {})
28
- data = options.merge(:email => email)
29
- post "#{account_id}/subscribers", generate_resource("subscribers", data)
30
- end
31
-
32
- # Public: Create or update a collection of subscribers.
33
- #
34
- # subscribers - Required. An Array of between 1 and 1000 Hashes of subscriber data.
35
- # - email - Required. The String subscriber email address.
36
- # - new_email - Optional. A new email address for the subscriber.
37
- # If provided and a subscriber with the email above
38
- # does not exist, this address will be used to
39
- # create a new subscriber.
40
- # - time_zone - Optional. The subscriber's time zone (in Olsen
41
- # format). Defaults to Etc/UTC.
42
- # - custom_fields - Optional. A Hash of custom field data.
43
- # - tags - Optional. An Array of tags.
44
- #
45
- # Returns a Drip::Response
46
- # See https://www.getdrip.com/docs/rest-api#subscriber_batches
47
- def create_or_update_subscribers(subscribers)
48
- url = "#{account_id}/subscribers/batches"
49
- post url, generate_resource("batches", { "subscribers" => subscribers })
50
- end
51
-
52
- # Public: Unsubscribe a subscriber globally or from a specific campaign.
53
- #
54
- # id_or_email - Required. The String id or email address of the subscriber.
55
- # options - A Hash of options.
56
- # - campaign_id - Optional. The campaign from which to
57
- # unsubscribe the subscriber. Defaults to all.
58
- #
59
- # Returns a Drip::Response.
60
- # See https://www.getdrip.com/docs/rest-api#unsubscribe
61
- def unsubscribe(id_or_email, options = {})
62
- url = "#{account_id}/subscribers/#{CGI.escape id_or_email}/unsubscribe"
63
- url += options[:campaign_id] ? "?campaign_id=#{options[:campaign_id]}" : ""
64
- post url
65
- end
66
-
67
- # Public: Subscribe to a campaign.
68
- #
69
- # email - Required. The String email address of the subscriber.
70
- # campaign_id - Required. The String campaign id.
71
- # options - Optional. A Hash of options.
72
- # - double_optin - Optional. If true, the double opt-in confirmation
73
- # email is sent; if false, the confirmation
74
- # email is skipped. Defaults to the value set
75
- # on the campaign.
76
- # - starting_email_index - Optional. The index (zero-based) of
77
- # the email to send first. Defaults to 0.
78
- # - time_zone - Optional. The subscriber's time zone (in Olsen
79
- # format). Defaults to Etc/UTC.
80
- # - custom_fields - Optional. A Hash of custom field data.
81
- # - tags - Optional. An Array of tags.
82
- # - reactivate_if_removed - Optional. If true, re-subscribe
83
- # the subscriber to the campaign if there
84
- # is a removed subscriber in Drip with the same
85
- # email address; otherwise, respond with
86
- # 422 Unprocessable Entity. Defaults to true.
87
- #
88
- # Returns a Drip::Response.
89
- # See https://www.getdrip.com/docs/rest-api#subscribe
90
- def subscribe(email, campaign_id, options = {})
91
- data = options.merge("email" => email)
92
- url = "#{account_id}/campaigns/#{campaign_id}/subscribers"
93
- post url, generate_resource("subscribers", data)
94
- end
95
-
96
- # Public: Delete a subscriber.
97
- #
98
- # id_or_email - Required. The String id or email address of the subscriber.
99
- #
100
- # Returns No Content.
101
- # See https://www.getdrip.com/docs/rest-api#fdelete_subscriber
102
- def delete_subscriber(id_or_email)
103
- delete "#{account_id}/subscribers/#{CGI.escape id_or_email}"
104
- end
105
11
  end
106
12
  end
107
13
  end
@@ -0,0 +1,66 @@
1
+ require "cgi"
2
+
3
+ module Drip
4
+ class Client
5
+ module Purchases
6
+ # Public: Create a purchase.
7
+ #
8
+ # email - Required. The String email address of the subscriber.
9
+ # amount - Required. The total amount of the purchase in cents.
10
+ # options - A Hash of options.
11
+ # - properties - Optional. An Object containing properties about
12
+ # the order.
13
+ # - items - Optional. An Array of objects containing information
14
+ # about specific order items.
15
+ # - name - Required. The product name.
16
+ # - amount - Required. The line total (in
17
+ # cents).
18
+ # - quantity - Optional. The quantity of the
19
+ # item purchased (if omitted,
20
+ # defaults to 1).
21
+ # - product_id - Optional. A unique identifier
22
+ # for the specific product.
23
+ # - sku - Optional. The product SKU number.
24
+ # - properties - Optional. An Object containing
25
+ # properties about the line item.
26
+ # - provider - Optional. The identifier for the provider from
27
+ # which the purchase data was received
28
+ # - order_id - Optional. A unique identifier for the order
29
+ # (generally the primary key generated by the
30
+ # order management system).
31
+ # - permalink - Optional. A URL for the human-readable
32
+ # interface to view the order details.
33
+ # - occurred_at - Optional. The String time at which the event
34
+ # occurred in ISO-8601 format. Defaults to the
35
+ # current time.
36
+ #
37
+ # Returns a Drip::Response.
38
+ # See https://www.getdrip.com/docs/rest-api#create_purchase
39
+ def create_purchase(email, amount, options = {})
40
+ data = options.merge(:amount => amount)
41
+ post "#{account_id}/subscribers/#{CGI.escape email}/purchases", generate_resource("purchases", data)
42
+ end
43
+
44
+ # Public: Fetch a list of purchases for a subscriber.
45
+ #
46
+ # email - The String email address of the subscriber.
47
+ #
48
+ # Returns a Drip::Response.
49
+ # See https://www.getdrip.com/docs/rest-api#list_purchases
50
+ def purchases(email)
51
+ get "#{account_id}/subscribers/#{CGI.escape email}/purchases"
52
+ end
53
+
54
+ # Public: Fetch a purchase.
55
+ #
56
+ # email - The String email address of the subscriber.
57
+ # id - The String ID of the purchase
58
+ #
59
+ # Returns a Drip::Response.
60
+ # See https://www.getdrip.com/docs/rest-api#list_purchases
61
+ def purchase(email, id)
62
+ get "#{account_id}/subscribers/#{CGI.escape email}/purchases/#{id}"
63
+ end
64
+ end
65
+ end
66
+ end
@@ -31,8 +31,8 @@ module Drip
31
31
 
32
32
  # Public: Create or update a subscriber.
33
33
  #
34
+ # email - Required. The String subscriber email address.
34
35
  # options - A Hash of options.
35
- # - email - Required. The String subscriber email address.
36
36
  # - new_email - Optional. A new email address for the subscriber.
37
37
  # If provided and a subscriber with the email above
38
38
  # does not exist, this address will be used to
@@ -3,6 +3,14 @@ require "cgi"
3
3
  module Drip
4
4
  class Client
5
5
  module Tags
6
+ # Public: Get all tags for the account.
7
+ #
8
+ # Returns a Drip::Response.
9
+ # See https://www.getdrip.com/docs/rest-api#tags
10
+ def tags
11
+ get "#{account_id}/tags"
12
+ end
13
+
6
14
  # Public: Apply a tag to a subscriber.
7
15
  #
8
16
  # email - The String email address of the subscriber.
@@ -1,6 +1,8 @@
1
1
  require "drip/collections/accounts"
2
2
  require "drip/collections/subscribers"
3
+ require "drip/collections/tags"
3
4
  require "drip/collections/errors"
5
+ require "drip/collections/purchases"
4
6
 
5
7
  module Drip
6
8
  module Collections
@@ -8,7 +10,9 @@ module Drip
8
10
  [
9
11
  Drip::Accounts,
10
12
  Drip::Subscribers,
11
- Drip::Errors
13
+ Drip::Errors,
14
+ Drip::Tags,
15
+ Drip::Purchases
12
16
  ]
13
17
  end
14
18
 
@@ -0,0 +1,13 @@
1
+ require "drip/collection"
2
+
3
+ module Drip
4
+ class Purchases < Collection
5
+ def self.collection_name
6
+ "purchases"
7
+ end
8
+
9
+ def self.resource_name
10
+ "purchase"
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ require "drip/collection"
2
+
3
+ module Drip
4
+ class Tags < Collection
5
+ def self.collection_name
6
+ "tags"
7
+ end
8
+
9
+ def self.resource_name
10
+ "tag"
11
+ end
12
+ end
13
+ end
@@ -1,6 +1,8 @@
1
1
  require "drip/resources/account"
2
2
  require "drip/resources/subscriber"
3
+ require "drip/resources/tag"
3
4
  require "drip/resources/error"
5
+ require "drip/resources/purchase"
4
6
 
5
7
  module Drip
6
8
  module Resources
@@ -8,7 +10,9 @@ module Drip
8
10
  [
9
11
  Drip::Account,
10
12
  Drip::Subscriber,
11
- Drip::Error
13
+ Drip::Error,
14
+ Drip::Tags,
15
+ Drip::Purchase
12
16
  ]
13
17
  end
14
18
 
@@ -0,0 +1,9 @@
1
+ require "drip/resource"
2
+
3
+ module Drip
4
+ class Purchase < Resource
5
+ def self.resource_name
6
+ "purchase"
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ require "drip/resource"
2
+
3
+ module Drip
4
+ class Tag < Resource
5
+ def self.resource_name
6
+ "tag"
7
+ end
8
+ end
9
+ end
@@ -1,3 +1,3 @@
1
1
  module Drip
2
- VERSION = "0.0.7"
2
+ VERSION = "0.0.8"
3
3
  end
@@ -0,0 +1,94 @@
1
+ require File.dirname(__FILE__) + '/../../test_helper.rb'
2
+
3
+ class Drip::Client::PurchasesTest < Drip::TestCase
4
+ def setup
5
+ @stubs = Faraday::Adapter::Test::Stubs.new
6
+
7
+ @connection = Faraday.new do |builder|
8
+ builder.adapter :test, @stubs
9
+ end
10
+
11
+ @client = Drip::Client.new { |c| c.account_id = "12345" }
12
+ @client.expects(:connection).at_least_once.returns(@connection)
13
+ end
14
+
15
+ context "#create_purchase" do
16
+ setup do
17
+ @email = "derrick@getdrip.com"
18
+ @amount = 3900
19
+ @properties = {
20
+ address: '123 Anywhere St'
21
+ }
22
+
23
+ @items = [
24
+ {
25
+ name: 'foo',
26
+ amount: 100
27
+ },
28
+ {
29
+ name: 'bar',
30
+ amount: 200
31
+ }
32
+ ]
33
+
34
+ @payload = {
35
+ purchases: [{
36
+ properties: @properties,
37
+ items: @items,
38
+ amount: @amount
39
+ }]
40
+ }.to_json
41
+
42
+ @response_status = 201
43
+ @response_body = stub
44
+
45
+ @stubs.post "12345/subscribers/#{CGI.escape @email}/purchases", @payload do
46
+ [@response_status, {}, @response_body]
47
+ end
48
+ end
49
+
50
+ should "send the right request" do
51
+ expected = Drip::Response.new(@response_status, @response_body)
52
+ assert_equal expected, @client.create_purchase(@email, @amount, {
53
+ properties: @properties,
54
+ items: @items
55
+ })
56
+ end
57
+ end
58
+
59
+ context "#purchases" do
60
+ setup do
61
+ @email = "derrick@getdrip.com"
62
+ @response_status = 201
63
+ @response_body = stub
64
+
65
+ @stubs.get "12345/subscribers/#{CGI.escape @email}/purchases" do
66
+ [@response_status, {}, @response_body]
67
+ end
68
+ end
69
+
70
+ should "send the right request" do
71
+ expected = Drip::Response.new(@response_status, @response_body)
72
+ assert_equal expected, @client.purchases(@email)
73
+ end
74
+ end
75
+
76
+ context "#purchase" do
77
+ setup do
78
+ @email = "derrick@getdrip.com"
79
+ @id = '23456'
80
+ @response_status = 201
81
+ @response_body = stub
82
+
83
+ @stubs.get "12345/subscribers/#{CGI.escape @email}/purchases/#{@id}" do
84
+ [@response_status, {}, @response_body]
85
+ end
86
+ end
87
+
88
+ should "send the right request" do
89
+ expected = Drip::Response.new(@response_status, @response_body)
90
+ assert_equal expected, @client.purchase(@email, @id)
91
+ end
92
+ end
93
+
94
+ end
@@ -12,6 +12,22 @@ class Drip::Client::TagsTest < Drip::TestCase
12
12
  @client.expects(:connection).at_least_once.returns(@connection)
13
13
  end
14
14
 
15
+ context "#tags" do
16
+ setup do
17
+ @response_status = 200
18
+ @response_body = stub
19
+
20
+ @stubs.get "12345/tags" do
21
+ [@response_status, {}, @response_body]
22
+ end
23
+ end
24
+
25
+ should "send the right request" do
26
+ expected = Drip::Response.new(@response_status, @response_body)
27
+ assert_equal expected, @client.tags
28
+ end
29
+ end
30
+
15
31
  context "#apply_tag" do
16
32
  setup do
17
33
  @email = "derrick@getdrip.com"
@@ -5,6 +5,7 @@ class Drip::CollectionsTest < Drip::TestCase
5
5
  assert_equal Drip::Subscribers, Drip::Collections.find_class("subscribers")
6
6
  assert_equal Drip::Accounts, Drip::Collections.find_class("accounts")
7
7
  assert_equal Drip::Errors, Drip::Collections.find_class("errors")
8
+ assert_equal Drip::Purchases, Drip::Collections.find_class("purchases")
8
9
  end
9
10
 
10
11
  should "return base collection by default" do
@@ -4,6 +4,7 @@ class Drip::ResourcesTest < Drip::TestCase
4
4
  should "find resources" do
5
5
  assert_equal Drip::Subscriber, Drip::Resources.find_class("subscriber")
6
6
  assert_equal Drip::Error, Drip::Resources.find_class("error")
7
+ assert_equal Drip::Purchase, Drip::Resources.find_class("purchase")
7
8
  end
8
9
 
9
10
  should "return base resource by default" do
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: drip-ruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.7
4
+ version: 0.0.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Derrick Reimer
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-10-11 00:00:00.000000000 Z
11
+ date: 2017-02-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -108,20 +108,6 @@ dependencies:
108
108
  - - "~>"
109
109
  - !ruby/object:Gem::Version
110
110
  version: '0.9'
111
- - !ruby/object:Gem::Dependency
112
- name: json
113
- requirement: !ruby/object:Gem::Requirement
114
- requirements:
115
- - - "~>"
116
- - !ruby/object:Gem::Version
117
- version: '1.8'
118
- type: :runtime
119
- prerelease: false
120
- version_requirements: !ruby/object:Gem::Requirement
121
- requirements:
122
- - - "~>"
123
- - !ruby/object:Gem::Version
124
- version: '1.8'
125
111
  description: A simple wrapper for the Drip API
126
112
  email:
127
113
  - derrickreimer@gmail.com
@@ -141,23 +127,29 @@ files:
141
127
  - lib/drip/client/accounts.rb
142
128
  - lib/drip/client/campaigns.rb
143
129
  - lib/drip/client/events.rb
130
+ - lib/drip/client/purchases.rb
144
131
  - lib/drip/client/subscribers.rb
145
132
  - lib/drip/client/tags.rb
146
133
  - lib/drip/collection.rb
147
134
  - lib/drip/collections.rb
148
135
  - lib/drip/collections/accounts.rb
149
136
  - lib/drip/collections/errors.rb
137
+ - lib/drip/collections/purchases.rb
150
138
  - lib/drip/collections/subscribers.rb
139
+ - lib/drip/collections/tags.rb
151
140
  - lib/drip/resource.rb
152
141
  - lib/drip/resources.rb
153
142
  - lib/drip/resources/account.rb
154
143
  - lib/drip/resources/error.rb
144
+ - lib/drip/resources/purchase.rb
155
145
  - lib/drip/resources/subscriber.rb
146
+ - lib/drip/resources/tag.rb
156
147
  - lib/drip/response.rb
157
148
  - lib/drip/version.rb
158
149
  - test/drip/client/accounts_test.rb
159
150
  - test/drip/client/campaigns_test.rb
160
151
  - test/drip/client/events_test.rb
152
+ - test/drip/client/purchases_test.rb
161
153
  - test/drip/client/subscribers_test.rb
162
154
  - test/drip/client/tags_test.rb
163
155
  - test/drip/client_test.rb
@@ -183,7 +175,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
183
175
  requirements:
184
176
  - - ">="
185
177
  - !ruby/object:Gem::Version
186
- version: '0'
178
+ version: 1.9.3
187
179
  required_rubygems_version: !ruby/object:Gem::Requirement
188
180
  requirements:
189
181
  - - ">="
@@ -191,7 +183,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
191
183
  version: '0'
192
184
  requirements: []
193
185
  rubyforge_project:
194
- rubygems_version: 2.4.5
186
+ rubygems_version: 2.5.1
195
187
  signing_key:
196
188
  specification_version: 4
197
189
  summary: A Ruby gem for interacting with the Drip API
@@ -199,6 +191,7 @@ test_files:
199
191
  - test/drip/client/accounts_test.rb
200
192
  - test/drip/client/campaigns_test.rb
201
193
  - test/drip/client/events_test.rb
194
+ - test/drip/client/purchases_test.rb
202
195
  - test/drip/client/subscribers_test.rb
203
196
  - test/drip/client/tags_test.rb
204
197
  - test/drip/client_test.rb