createsend 2.5.1 → 3.0.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/.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
|