createsend 2.5.1 → 3.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.travis.yml +3 -2
- data/Gemfile.lock +16 -14
- data/HISTORY.md +55 -2
- data/LICENSE +1 -1
- data/README.md +162 -44
- data/createsend.gemspec +7 -8
- data/lib/createsend.rb +1 -156
- data/lib/createsend/administrator.rb +15 -15
- data/lib/createsend/campaign.rb +29 -47
- data/lib/createsend/client.rb +11 -12
- data/lib/createsend/createsend.rb +245 -0
- data/lib/createsend/list.rb +36 -55
- data/lib/createsend/person.rb +13 -13
- data/lib/createsend/segment.rb +14 -15
- data/lib/createsend/subscriber.rb +16 -15
- data/lib/createsend/template.rb +9 -10
- data/lib/createsend/version.rb +1 -1
- data/test/administrator_test.rb +10 -12
- data/test/campaign_test.rb +23 -25
- data/test/client_test.rb +26 -28
- data/test/createsend_test.rb +202 -61
- data/test/fixtures/expired_oauth_token_api_error.json +4 -0
- data/test/fixtures/oauth_exchange_token.json +5 -0
- data/test/fixtures/oauth_exchange_token_error.json +4 -0
- data/test/fixtures/refresh_oauth_token.json +5 -0
- data/test/helper.rb +38 -5
- data/test/list_test.rb +30 -32
- data/test/person_test.rb +9 -11
- data/test/segment_test.rb +12 -14
- data/test/subscriber_test.rb +24 -26
- data/test/template_test.rb +7 -9
- metadata +22 -23
data/lib/createsend/list.rb
CHANGED
@@ -1,13 +1,11 @@
|
|
1
|
-
require 'createsend'
|
2
|
-
require 'json'
|
3
|
-
|
4
1
|
module CreateSend
|
5
2
|
# Represents a subscriber list and associated functionality.
|
6
|
-
class List
|
3
|
+
class List < CreateSend
|
7
4
|
attr_reader :list_id
|
8
5
|
|
9
|
-
def initialize(list_id)
|
6
|
+
def initialize(auth, list_id)
|
10
7
|
@list_id = list_id
|
8
|
+
super
|
11
9
|
end
|
12
10
|
|
13
11
|
# Creates a new list for a client.
|
@@ -23,7 +21,7 @@ module CreateSend
|
|
23
21
|
# unsubscribe_setting - A String which must be either "AllClientLists" or
|
24
22
|
# "OnlyThisList". See the documentation for details:
|
25
23
|
# http://www.campaignmonitor.com/api/lists/#creating_a_list
|
26
|
-
def self.create(client_id, title, unsubscribe_page, confirmed_opt_in,
|
24
|
+
def self.create(auth, client_id, title, unsubscribe_page, confirmed_opt_in,
|
27
25
|
confirmation_success_page, unsubscribe_setting="AllClientLists")
|
28
26
|
options = { :body => {
|
29
27
|
:Title => title,
|
@@ -31,13 +29,14 @@ module CreateSend
|
|
31
29
|
:ConfirmedOptIn => confirmed_opt_in,
|
32
30
|
:ConfirmationSuccessPage => confirmation_success_page,
|
33
31
|
:UnsubscribeSetting => unsubscribe_setting }.to_json }
|
34
|
-
|
32
|
+
cs = CreateSend.new auth
|
33
|
+
response = cs.post "/lists/#{client_id}.json", options
|
35
34
|
response.parsed_response
|
36
35
|
end
|
37
36
|
|
38
37
|
# Deletes this list.
|
39
38
|
def delete
|
40
|
-
response =
|
39
|
+
response = super "/lists/#{list_id}.json", {}
|
41
40
|
end
|
42
41
|
|
43
42
|
# Creates a new custom field for this list.
|
@@ -78,7 +77,7 @@ module CreateSend
|
|
78
77
|
# Deletes a custom field associated with this list.
|
79
78
|
def delete_custom_field(custom_field_key)
|
80
79
|
custom_field_key = CGI.escape(custom_field_key)
|
81
|
-
response =
|
80
|
+
response = cs_delete(
|
82
81
|
"/lists/#{list_id}/customfields/#{custom_field_key}.json", {})
|
83
82
|
end
|
84
83
|
|
@@ -94,7 +93,7 @@ module CreateSend
|
|
94
93
|
|
95
94
|
# Gets the details of this list.
|
96
95
|
def details
|
97
|
-
response =
|
96
|
+
response = cs_get "/lists/#{list_id}.json"
|
98
97
|
Hashie::Mash.new(response)
|
99
98
|
end
|
100
99
|
|
@@ -119,66 +118,36 @@ module CreateSend
|
|
119
118
|
# Gets the active subscribers for this list.
|
120
119
|
def active(date="", page=1, page_size=1000, order_field="email",
|
121
120
|
order_direction="asc")
|
122
|
-
|
123
|
-
|
124
|
-
:page => page,
|
125
|
-
:pagesize => page_size,
|
126
|
-
:orderfield => order_field,
|
127
|
-
:orderdirection => order_direction } }
|
128
|
-
response = get "active", options
|
129
|
-
Hashie::Mash.new(response)
|
121
|
+
paged_result_by_date("active", date, page, page_size, order_field,
|
122
|
+
order_direction)
|
130
123
|
end
|
131
124
|
|
132
125
|
# Gets the unconfirmed subscribers for this list.
|
133
126
|
def unconfirmed(date="", page=1, page_size=1000, order_field="email",
|
134
127
|
order_direction="asc")
|
135
|
-
|
136
|
-
|
137
|
-
:page => page,
|
138
|
-
:pagesize => page_size,
|
139
|
-
:orderfield => order_field,
|
140
|
-
:orderdirection => order_direction } }
|
141
|
-
response = get "unconfirmed", options
|
142
|
-
Hashie::Mash.new(response)
|
128
|
+
paged_result_by_date("unconfirmed", date, page, page_size, order_field,
|
129
|
+
order_direction)
|
143
130
|
end
|
144
131
|
|
145
132
|
# Gets the bounced subscribers for this list.
|
146
133
|
def bounced(date="", page=1, page_size=1000, order_field="email",
|
147
134
|
order_direction="asc")
|
148
|
-
|
149
|
-
|
150
|
-
:page => page,
|
151
|
-
:pagesize => page_size,
|
152
|
-
:orderfield => order_field,
|
153
|
-
:orderdirection => order_direction } }
|
154
|
-
response = get "bounced", options
|
155
|
-
Hashie::Mash.new(response)
|
135
|
+
paged_result_by_date("bounced", date, page, page_size, order_field,
|
136
|
+
order_direction)
|
156
137
|
end
|
157
138
|
|
158
139
|
# Gets the unsubscribed subscribers for this list.
|
159
140
|
def unsubscribed(date="", page=1, page_size=1000, order_field="email",
|
160
141
|
order_direction="asc")
|
161
|
-
|
162
|
-
|
163
|
-
:page => page,
|
164
|
-
:pagesize => page_size,
|
165
|
-
:orderfield => order_field,
|
166
|
-
:orderdirection => order_direction } }
|
167
|
-
response = get "unsubscribed", options
|
168
|
-
Hashie::Mash.new(response)
|
142
|
+
paged_result_by_date("unsubscribed", date, page, page_size, order_field,
|
143
|
+
order_direction)
|
169
144
|
end
|
170
145
|
|
171
146
|
# Gets the deleted subscribers for this list.
|
172
147
|
def deleted(date="", page=1, page_size=1000, order_field="email",
|
173
148
|
order_direction="asc")
|
174
|
-
|
175
|
-
|
176
|
-
:page => page,
|
177
|
-
:pagesize => page_size,
|
178
|
-
:orderfield => order_field,
|
179
|
-
:orderdirection => order_direction } }
|
180
|
-
response = get "deleted", options
|
181
|
-
Hashie::Mash.new(response)
|
149
|
+
paged_result_by_date("deleted", date, page, page_size, order_field,
|
150
|
+
order_direction)
|
182
151
|
end
|
183
152
|
|
184
153
|
# Updates this list.
|
@@ -209,7 +178,7 @@ module CreateSend
|
|
209
178
|
:UnsubscribeSetting => unsubscribe_setting,
|
210
179
|
:AddUnsubscribesToSuppList => add_unsubscribes_to_supp_list,
|
211
180
|
:ScrubActiveWithSuppList => scrub_active_with_supp_list }.to_json }
|
212
|
-
response =
|
181
|
+
response = cs_put "/lists/#{list_id}.json", options
|
213
182
|
end
|
214
183
|
|
215
184
|
# Gets the webhooks for this list.
|
@@ -239,7 +208,7 @@ module CreateSend
|
|
239
208
|
|
240
209
|
# Deletes a webhook associated with this list.
|
241
210
|
def delete_webhook(webhook_id)
|
242
|
-
response =
|
211
|
+
response = cs_delete(
|
243
212
|
"/lists/#{list_id}/webhooks/#{webhook_id}.json", {})
|
244
213
|
end
|
245
214
|
|
@@ -256,17 +225,29 @@ module CreateSend
|
|
256
225
|
end
|
257
226
|
|
258
227
|
private
|
228
|
+
|
229
|
+
def paged_result_by_date(resource, date, page, page_size, order_field,
|
230
|
+
order_direction)
|
231
|
+
options = { :query => {
|
232
|
+
:date => date,
|
233
|
+
:page => page,
|
234
|
+
:pagesize => page_size,
|
235
|
+
:orderfield => order_field,
|
236
|
+
:orderdirection => order_direction } }
|
237
|
+
response = get resource, options
|
238
|
+
Hashie::Mash.new(response)
|
239
|
+
end
|
259
240
|
|
260
241
|
def get(action, options = {})
|
261
|
-
|
242
|
+
super uri_for(action), options
|
262
243
|
end
|
263
244
|
|
264
245
|
def post(action, options = {})
|
265
|
-
|
246
|
+
super uri_for(action), options
|
266
247
|
end
|
267
248
|
|
268
249
|
def put(action, options = {})
|
269
|
-
|
250
|
+
super uri_for(action), options
|
270
251
|
end
|
271
252
|
|
272
253
|
def uri_for(action)
|
data/lib/createsend/person.rb
CHANGED
@@ -1,33 +1,33 @@
|
|
1
|
-
require 'createsend'
|
2
|
-
require 'json'
|
3
|
-
|
4
1
|
module CreateSend
|
5
2
|
# Represents a person and associated functionality.
|
6
|
-
class Person
|
3
|
+
class Person < CreateSend
|
7
4
|
attr_reader :client_id
|
8
5
|
attr_reader :email_address
|
9
6
|
|
10
|
-
def initialize(client_id, email_address)
|
7
|
+
def initialize(auth, client_id, email_address)
|
11
8
|
@client_id = client_id
|
12
9
|
@email_address = email_address
|
10
|
+
super
|
13
11
|
end
|
14
12
|
|
15
13
|
# Gets a person by client ID and email address.
|
16
|
-
def self.get(client_id, email_address)
|
14
|
+
def self.get(auth, client_id, email_address)
|
17
15
|
options = { :query => { :email => email_address } }
|
18
|
-
|
16
|
+
cs = CreateSend.new auth
|
17
|
+
response = cs.get "/clients/#{client_id}/people.json", options
|
19
18
|
Hashie::Mash.new(response)
|
20
19
|
end
|
21
20
|
|
22
|
-
# Adds a person to the client.
|
21
|
+
# Adds a person to the client. Password is optional. If ommitted, an
|
23
22
|
# email invitation will be sent to the person
|
24
|
-
def self.add(client_id, email_address, name, access_level, password)
|
23
|
+
def self.add(auth, client_id, email_address, name, access_level, password)
|
25
24
|
options = { :body => {
|
26
25
|
:EmailAddress => email_address,
|
27
26
|
:Name => name,
|
28
27
|
:AccessLevel => access_level,
|
29
28
|
:Password => password }.to_json }
|
30
|
-
|
29
|
+
cs = CreateSend.new auth
|
30
|
+
response = cs.post "/clients/#{client_id}/people.json", options
|
31
31
|
Hashie::Mash.new(response)
|
32
32
|
end
|
33
33
|
|
@@ -41,7 +41,7 @@ module CreateSend
|
|
41
41
|
:Name => name,
|
42
42
|
:AccessLevel => access_level,
|
43
43
|
:Password => password }.to_json }
|
44
|
-
|
44
|
+
put uri_for(client_id), options
|
45
45
|
# Update @email_address, so this object can continue to be used reliably
|
46
46
|
@email_address = new_email_address
|
47
47
|
end
|
@@ -49,11 +49,11 @@ module CreateSend
|
|
49
49
|
# deletes this person from the client
|
50
50
|
def delete
|
51
51
|
options = { :query => { :email => @email_address } }
|
52
|
-
|
52
|
+
super uri_for(client_id), options
|
53
53
|
end
|
54
54
|
|
55
55
|
def uri_for(client_id)
|
56
|
-
|
56
|
+
"/clients/#{client_id}/people.json"
|
57
57
|
end
|
58
58
|
end
|
59
59
|
end
|
data/lib/createsend/segment.rb
CHANGED
@@ -1,21 +1,20 @@
|
|
1
|
-
require 'createsend'
|
2
|
-
require 'json'
|
3
|
-
|
4
1
|
module CreateSend
|
5
2
|
# Represents a subscriber list segment and associated functionality.
|
6
|
-
class Segment
|
3
|
+
class Segment < CreateSend
|
7
4
|
attr_reader :segment_id
|
8
5
|
|
9
|
-
def initialize(segment_id)
|
6
|
+
def initialize(auth, segment_id)
|
10
7
|
@segment_id = segment_id
|
8
|
+
super
|
11
9
|
end
|
12
10
|
|
13
11
|
# Creates a new segment.
|
14
|
-
def self.create(list_id, title, rules)
|
12
|
+
def self.create(auth, list_id, title, rules)
|
15
13
|
options = { :body => {
|
16
14
|
:Title => title,
|
17
15
|
:Rules => rules }.to_json }
|
18
|
-
|
16
|
+
cs = CreateSend.new auth
|
17
|
+
response = cs.post "/segments/#{list_id}.json", options
|
19
18
|
response.parsed_response
|
20
19
|
end
|
21
20
|
|
@@ -24,7 +23,7 @@ module CreateSend
|
|
24
23
|
options = { :body => {
|
25
24
|
:Title => title,
|
26
25
|
:Rules => rules }.to_json }
|
27
|
-
response =
|
26
|
+
response = cs_put "/segments/#{segment_id}.json", options
|
28
27
|
end
|
29
28
|
|
30
29
|
# Adds a rule to this segment.
|
@@ -32,7 +31,7 @@ module CreateSend
|
|
32
31
|
options = { :body => {
|
33
32
|
:Subject => subject,
|
34
33
|
:Clauses => clauses }.to_json }
|
35
|
-
response =
|
34
|
+
response = post "rules", options
|
36
35
|
end
|
37
36
|
|
38
37
|
# Gets the active subscribers in this segment.
|
@@ -50,32 +49,32 @@ module CreateSend
|
|
50
49
|
|
51
50
|
# Gets the details of this segment
|
52
51
|
def details
|
53
|
-
response =
|
52
|
+
response = cs_get "/segments/#{segment_id}.json", {}
|
54
53
|
Hashie::Mash.new(response)
|
55
54
|
end
|
56
55
|
|
57
56
|
# Clears all rules of this segment.
|
58
57
|
def clear_rules
|
59
|
-
response =
|
58
|
+
response = cs_delete "/segments/#{segment_id}/rules.json", {}
|
60
59
|
end
|
61
60
|
|
62
61
|
# Deletes this segment.
|
63
62
|
def delete
|
64
|
-
response =
|
63
|
+
response = super "/segments/#{segment_id}.json", {}
|
65
64
|
end
|
66
65
|
|
67
66
|
private
|
68
67
|
|
69
68
|
def get(action, options = {})
|
70
|
-
|
69
|
+
super uri_for(action), options
|
71
70
|
end
|
72
71
|
|
73
72
|
def post(action, options = {})
|
74
|
-
|
73
|
+
super uri_for(action), options
|
75
74
|
end
|
76
75
|
|
77
76
|
def put(action, options = {})
|
78
|
-
|
77
|
+
super uri_for(action), options
|
79
78
|
end
|
80
79
|
|
81
80
|
def uri_for(action)
|
@@ -1,26 +1,25 @@
|
|
1
|
-
require 'createsend'
|
2
|
-
require 'json'
|
3
|
-
|
4
1
|
module CreateSend
|
5
2
|
# Represents a subscriber and associated functionality.
|
6
|
-
class Subscriber
|
3
|
+
class Subscriber < CreateSend
|
7
4
|
attr_reader :list_id
|
8
5
|
attr_reader :email_address
|
9
6
|
|
10
|
-
def initialize(list_id, email_address)
|
7
|
+
def initialize(auth, list_id, email_address)
|
11
8
|
@list_id = list_id
|
12
9
|
@email_address = email_address
|
10
|
+
super
|
13
11
|
end
|
14
12
|
|
15
13
|
# Gets a subscriber by list ID and email address.
|
16
|
-
def self.get(list_id, email_address)
|
14
|
+
def self.get(auth, list_id, email_address)
|
17
15
|
options = { :query => { :email => email_address } }
|
18
|
-
|
16
|
+
cs = CreateSend.new auth
|
17
|
+
response = cs.get "/subscribers/#{list_id}.json", options
|
19
18
|
Hashie::Mash.new(response)
|
20
19
|
end
|
21
20
|
|
22
21
|
# Adds a subscriber to a subscriber list.
|
23
|
-
def self.add(list_id, email_address, name, custom_fields, resubscribe,
|
22
|
+
def self.add(auth, list_id, email_address, name, custom_fields, resubscribe,
|
24
23
|
restart_subscription_based_autoresponders=false)
|
25
24
|
options = { :body => {
|
26
25
|
:EmailAddress => email_address,
|
@@ -29,12 +28,13 @@ module CreateSend
|
|
29
28
|
:Resubscribe => resubscribe,
|
30
29
|
:RestartSubscriptionBasedAutoresponders =>
|
31
30
|
restart_subscription_based_autoresponders }.to_json }
|
32
|
-
|
31
|
+
cs = CreateSend.new auth
|
32
|
+
response = cs.post "/subscribers/#{list_id}.json", options
|
33
33
|
response.parsed_response
|
34
34
|
end
|
35
35
|
|
36
36
|
# Imports subscribers into a subscriber list.
|
37
|
-
def self.import(list_id, subscribers, resubscribe,
|
37
|
+
def self.import(auth, list_id, subscribers, resubscribe,
|
38
38
|
queue_subscription_based_autoresponders=false,
|
39
39
|
restart_subscription_based_autoresponders=false)
|
40
40
|
options = { :body => {
|
@@ -45,7 +45,8 @@ module CreateSend
|
|
45
45
|
:RestartSubscriptionBasedAutoresponders =>
|
46
46
|
restart_subscription_based_autoresponders }.to_json }
|
47
47
|
begin
|
48
|
-
|
48
|
+
cs = CreateSend.new auth
|
49
|
+
response = cs.post(
|
49
50
|
"/subscribers/#{list_id}/import.json", options)
|
50
51
|
rescue BadRequest => br
|
51
52
|
# Subscriber import will throw BadRequest if some subscribers are not
|
@@ -75,7 +76,7 @@ module CreateSend
|
|
75
76
|
:Resubscribe => resubscribe,
|
76
77
|
:RestartSubscriptionBasedAutoresponders =>
|
77
78
|
restart_subscription_based_autoresponders }.to_json }
|
78
|
-
|
79
|
+
put "/subscribers/#{@list_id}.json", options
|
79
80
|
# Update @email_address, so this object can continue to be used reliably
|
80
81
|
@email_address = new_email_address
|
81
82
|
end
|
@@ -84,20 +85,20 @@ module CreateSend
|
|
84
85
|
def unsubscribe
|
85
86
|
options = { :body => {
|
86
87
|
:EmailAddress => @email_address }.to_json }
|
87
|
-
|
88
|
+
post "/subscribers/#{@list_id}/unsubscribe.json", options
|
88
89
|
end
|
89
90
|
|
90
91
|
# Gets the historical record of this subscriber's trackable actions.
|
91
92
|
def history
|
92
93
|
options = { :query => { :email => @email_address } }
|
93
|
-
response =
|
94
|
+
response = cs_get "/subscribers/#{@list_id}/history.json", options
|
94
95
|
response.map{|item| Hashie::Mash.new(item)}
|
95
96
|
end
|
96
97
|
|
97
98
|
# Moves this subscriber to the Deleted state in the associated list.
|
98
99
|
def delete
|
99
100
|
options = { :query => { :email => @email_address } }
|
100
|
-
|
101
|
+
super "/subscribers/#{@list_id}.json", options
|
101
102
|
end
|
102
103
|
end
|
103
104
|
end
|
data/lib/createsend/template.rb
CHANGED
@@ -1,28 +1,27 @@
|
|
1
|
-
require 'createsend'
|
2
|
-
require 'json'
|
3
|
-
|
4
1
|
module CreateSend
|
5
2
|
# Represents an email template and associated functionality.
|
6
|
-
class Template
|
3
|
+
class Template < CreateSend
|
7
4
|
attr_reader :template_id
|
8
5
|
|
9
|
-
def initialize(template_id)
|
6
|
+
def initialize(auth, template_id)
|
10
7
|
@template_id = template_id
|
8
|
+
super
|
11
9
|
end
|
12
10
|
|
13
11
|
# Creates a new email template.
|
14
|
-
def self.create(client_id, name, html_url, zip_url)
|
12
|
+
def self.create(auth, client_id, name, html_url, zip_url)
|
15
13
|
options = { :body => {
|
16
14
|
:Name => name,
|
17
15
|
:HtmlPageURL => html_url,
|
18
16
|
:ZipFileURL => zip_url }.to_json }
|
19
|
-
|
17
|
+
cs = CreateSend.new auth
|
18
|
+
response = cs.post "/templates/#{client_id}.json", options
|
20
19
|
response.parsed_response
|
21
20
|
end
|
22
21
|
|
23
22
|
# Gets the details of this email template.
|
24
23
|
def details
|
25
|
-
response =
|
24
|
+
response = get "/templates/#{template_id}.json", {}
|
26
25
|
Hashie::Mash.new(response)
|
27
26
|
end
|
28
27
|
|
@@ -32,12 +31,12 @@ module CreateSend
|
|
32
31
|
:Name => name,
|
33
32
|
:HtmlPageURL => html_url,
|
34
33
|
:ZipFileURL => zip_url }.to_json }
|
35
|
-
response =
|
34
|
+
response = put "/templates/#{template_id}.json", options
|
36
35
|
end
|
37
36
|
|
38
37
|
# Deletes this email template.
|
39
38
|
def delete
|
40
|
-
response =
|
39
|
+
response = super "/templates/#{template_id}.json", {}
|
41
40
|
end
|
42
41
|
end
|
43
42
|
end
|