exact-target 0.0.5 → 0.1.8

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 CHANGED
@@ -1,3 +1,21 @@
1
+ v0.1.8. Bump version to 0.1 to reflect use in production environments. Also incorporate
2
+ enhancements from Jeff Ching:
3
+
4
+ The "adddefinition" and "updatedefinition" API calls were not documented clearly
5
+ enough to implement a clean solution.
6
+
7
+ v0.0.6. Pull in enhancements from Paul Nock and add as contributor:
8
+
9
+ I added some triggered send support, and also switched 'send_to_exact_target' to
10
+ http POST instead of GET. In our case, we were starting to generate some long xml
11
+ parameters and we didn't want to run into size limits for GET. I'm not completely
12
+ sure how generic the triggered send xml is, but it works well in our case. I'm not
13
+ sure if the different Exact Target Account types affect this.
14
+
15
+ Additionally, we were seeing some issues trying to register Facebook proxy email
16
+ addresses with Exact Target, for example app+asdfadsfasdfasdf@proxymail.facebook.com.
17
+ It was easier to simply POST this data than trying to properly escape the + in the data.
18
+
1
19
  v0.0.5. Fix corrupted gem
2
20
  v0.0.4. Fix gem to include CHANGELOG
3
21
  v0.0.3. Allow for passing ExactTarget::Subscriber into subscriber_add and subscriber_edit
data/Manifest CHANGED
@@ -5,6 +5,7 @@ LICENSE
5
5
  Manifest
6
6
  README.rdoc
7
7
  Rakefile
8
+ exact-target.gemspec
8
9
  lib/exact-target.rb
9
10
  lib/exact_target.rb
10
11
  lib/exact_target/builder_ext.rb
@@ -164,6 +164,16 @@ tracking functionality is yet implemented.
164
164
  :send_time => '17:35',
165
165
  :test_send => true)
166
166
 
167
+ === Triggered Sends
168
+
169
+ # Kick off a triggered send
170
+ ExactTarget.triggered_send_add(external_key,
171
+ channel_member_id,
172
+ email_addresses =[],
173
+ options = {})
174
+ email_addresses is an array of addresses of subscribers
175
+ options is a hash of name value attributes to pass to the triggered send to add custom data to the email message
176
+
167
177
  ---
168
178
  Author:: David McCullars <mailto:dmccullars@ePublishing.com>
169
179
  Copyright:: (C) 2011 ePublishing
data/Rakefile CHANGED
@@ -6,9 +6,9 @@ require 'spec/rake/spectask'
6
6
  task :default => :gem
7
7
 
8
8
  Echoe.new("exact-target") do |s|
9
- s.author = "David McCullars"
9
+ s.author = ["David McCullars", "Paul Nock", "Jeff Ching"]
10
10
  s.project = "exact-target"
11
- s.email = "dmccullars@ePublishing.com"
11
+ s.email = ["dmccullars@ePublishing.com", "nocksf@gmail.com"]
12
12
  s.url = "http://github.com/ePublishing/exact_target"
13
13
  s.docs_host = "http://rdoc.info/github/ePublishing/exact_target/master/frames"
14
14
  s.rdoc_pattern = /README|TODO|LICENSE|CHANGELOG|BENCH|COMPAT|exceptions|behaviors|exact-target.rb/
@@ -2,15 +2,15 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = "exact-target"
5
- s.version = "0.0.5"
5
+ s.version = "0.1.8"
6
6
 
7
7
  s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
8
- s.authors = ["David McCullars"]
9
- s.date = "2011-10-25"
8
+ s.authors = ["David McCullars, Paul Nock, Jeff Ching"]
9
+ s.date = "2012-02-09"
10
10
  s.description = "This is a pure-ruby implementation of the ExactTarget api.\nFor more information consule http://www.exacttarget.com/.\n"
11
- s.email = "dmccullars@ePublishing.com"
11
+ s.email = ["dmccullars@ePublishing.com", "nocksf@gmail.com"]
12
12
  s.extra_rdoc_files = ["CHANGELOG", "LICENSE", "README.rdoc", "lib/exact-target.rb"]
13
- s.files = ["CHANGELOG", "Gemfile", "Gemfile.lock", "LICENSE", "Manifest", "README.rdoc", "Rakefile", "lib/exact-target.rb", "lib/exact_target.rb", "lib/exact_target/builder_ext.rb", "lib/exact_target/configuration.rb", "lib/exact_target/error.rb", "lib/exact_target/net_https_hack.rb", "lib/exact_target/request_builder.rb", "lib/exact_target/response_class.erb", "lib/exact_target/response_classes.rb", "lib/exact_target/response_handler.rb", "lib/exact_target/string_ext.rb", "lib/exacttarget.rb", "spec/exact_target/net_https_hack_spec.rb", "spec/exact_target/response_handler_spec.rb", "spec/exact_target/string_ext_spec.rb", "spec/exact_target_data.yml", "spec/exact_target_spec.rb", "spec/spec.opts", "spec/spec_helper.rb", "exact-target.gemspec"]
13
+ s.files = ["CHANGELOG", "Gemfile", "Gemfile.lock", "LICENSE", "Manifest", "README.rdoc", "Rakefile", "exact-target.gemspec", "lib/exact-target.rb", "lib/exact_target.rb", "lib/exact_target/builder_ext.rb", "lib/exact_target/configuration.rb", "lib/exact_target/error.rb", "lib/exact_target/net_https_hack.rb", "lib/exact_target/request_builder.rb", "lib/exact_target/response_class.erb", "lib/exact_target/response_classes.rb", "lib/exact_target/response_handler.rb", "lib/exact_target/string_ext.rb", "lib/exacttarget.rb", "spec/exact_target/net_https_hack_spec.rb", "spec/exact_target/response_handler_spec.rb", "spec/exact_target/string_ext_spec.rb", "spec/exact_target_data.yml", "spec/exact_target_spec.rb", "spec/spec.opts", "spec/spec_helper.rb"]
14
14
  s.homepage = "http://github.com/ePublishing/exact_target"
15
15
  s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Exact-target", "--main", "README.rdoc"]
16
16
  s.require_paths = ["lib"]
@@ -71,12 +71,21 @@ module ExactTarget
71
71
 
72
72
  def send_to_exact_target(request)
73
73
  verify_configure
74
- uri = URI.parse "#{configuration.base_url}?qf=xml&xml=#{URI.escape request}"
74
+
75
+ data = "qf=xml&xml=#{URI.escape(URI.escape(request), "&")}"
76
+ uri = URI.parse(configuration.base_url)
77
+
75
78
  http = net_http_or_proxy.new(uri.host, uri.port)
76
79
  http.use_ssl = configuration.secure?
77
80
  http.open_timeout = configuration.http_open_timeout
78
81
  http.read_timeout = configuration.http_read_timeout
79
- resp = http.get(uri.request_uri)
82
+
83
+ if configuration.http_method.to_s == "post"
84
+ resp = http.post(uri.request_uri, data)
85
+ else
86
+ resp = http.get(uri.request_uri + "?" + data)
87
+ end
88
+
80
89
  if resp.is_a?(Net::HTTPSuccess)
81
90
  resp.body
82
91
  else
@@ -84,10 +93,11 @@ module ExactTarget
84
93
  end
85
94
  end
86
95
 
96
+
87
97
  # Define ExactTarget methods
88
98
  (RequestBuilder.instance_methods(false) & ResponseHandler.instance_methods(false)).each do |m|
89
- define_method(m) do |*args, &block|
90
- call(m, *args, &block)
99
+ define_method(m) do |*args|
100
+ call(m, *args)
91
101
  end
92
102
  end
93
103
 
@@ -2,8 +2,11 @@ module ExactTarget
2
2
  # Used to set up and modify settings for ExactTarget
3
3
  class Configuration
4
4
 
5
- OPTIONS = [:base_url, :username, :password,
6
- :http_open_timeout, :http_read_timeout, :http_proxy].freeze
5
+ OPTIONS = [:base_url, :username, :password, :readonly, :email_whitelist, :email_blacklist,
6
+ :http_method, :http_open_timeout, :http_read_timeout, :http_proxy].freeze
7
+ STANDARD_READONLY_CALLS = [:list_add, :list_edit, :list_import, :list_delete,
8
+ :subscriber_add, :subscriber_edit, :subscriber_delete, :subscriber_masterunsub,
9
+ :email_add, :email_add_text, :job_send].freeze
7
10
 
8
11
  # The (optional) base URL for accessing ExactTarget (can be http or https).
9
12
  # Defaults to 'https://api.dc1.exacttarget.com/integrate.aspx'
@@ -27,10 +30,31 @@ module ExactTarget
27
30
  # The (optional) HTTP proxy url
28
31
  attr_accessor :http_proxy
29
32
 
33
+ # The HTTP method to make the request with
34
+ attr_accessor :http_method
35
+
36
+ # The (optional) readonly flag (defaults to false)
37
+ attr_accessor :readonly
38
+
39
+ # (optional) limiting triggeredsend email addresses
40
+ attr_accessor :email_whitelist
41
+ attr_accessor :email_blacklist
42
+
43
+ # optional params for batch
44
+ attr_accessor :ftp_base_url
45
+ attr_accessor :ftp_username
46
+ attr_accessor :ftp_password
47
+ attr_accessor :export_folder
48
+ attr_accessor :import_folder
49
+
30
50
  def initialize
31
51
  @base_url = 'https://api.dc1.exacttarget.com/integrate.aspx'
32
52
  @http_open_timeout = 2
33
53
  @http_read_timeout = 5
54
+ @http_method = "get"
55
+ @readonly = []
56
+ @export_folder = 'Export'
57
+ @import_folder = 'Import'
34
58
  end
35
59
 
36
60
  def valid?
@@ -13,4 +13,34 @@ module ExactTarget
13
13
  end
14
14
 
15
15
  end
16
+
17
+ class EmailAddressError < Error
18
+ def initialize(email)
19
+ @email = email
20
+ end
21
+ end
22
+
23
+ class BlacklistError < EmailAddressError
24
+ def to_s
25
+ "#{@email} is on the email address blacklist"
26
+ end
27
+ end
28
+
29
+ class WhitelistError < EmailAddressError
30
+ def to_s
31
+ "#{@email} is not on the email address whitelist"
32
+ end
33
+ end
34
+
35
+ class ReadonlyError < Error
36
+ def initialize(name)
37
+ @name = name
38
+ end
39
+
40
+ def to_s
41
+ "#{@name} is not allowed when the client is set to readonly"
42
+ end
43
+ end
44
+
45
+
16
46
  end
@@ -8,10 +8,12 @@ module ExactTarget
8
8
  end
9
9
 
10
10
  def accountinfo_retrieve_attrbs
11
+ ensure_executable!("accountinfo_retrieve_attrbs")
11
12
  build(:accountinfo, :retrieve_attrbs)
12
13
  end
13
14
 
14
15
  def list_add(list_name, list_type=nil)
16
+ ensure_executable!("list_add")
15
17
  list_type = :public unless %w(public private salesforce).include?(list_type.to_s)
16
18
  build(:list, :add) do |li|
17
19
  li.list_type list_type.to_s
@@ -20,12 +22,14 @@ module ExactTarget
20
22
  end
21
23
 
22
24
  def list_edit(list_id, new_list_name)
25
+ ensure_executable!("list_edit")
23
26
  build(:list, :edit, :listid, list_id) do |li|
24
27
  li.list_name new_list_name.to_s
25
28
  end
26
29
  end
27
30
 
28
31
  def list_retrieve(id_or_name=nil)
32
+ ensure_executable!("list_retrieve")
29
33
  if id_or_name.is_a?(Fixnum) or id_or_name =~ /^\d+$/
30
34
  build(:list, :retrieve, :listid, id_or_name.to_i)
31
35
  else
@@ -34,6 +38,7 @@ module ExactTarget
34
38
  end
35
39
 
36
40
  def list_import(list_id, file_name, file_mapping, options={})
41
+ ensure_executable!("list_import")
37
42
  options = list_import_default_options(options, file_name)
38
43
  build(:list, :import, :listid, list_id) do |li|
39
44
  li.tags_from_options! options, :file_name, :email_address, :file_type, :column_headings
@@ -45,6 +50,7 @@ module ExactTarget
45
50
  end
46
51
 
47
52
  def list_importstatus(import_id)
53
+ ensure_executable!("list_importstatus")
48
54
  build(
49
55
  :list, :import,
50
56
  :sub_action => :importstatus,
@@ -54,6 +60,7 @@ module ExactTarget
54
60
  end
55
61
 
56
62
  def list_retrieve_sub(list_id, status=nil)
63
+ ensure_executable!("list_retrieve_sub")
57
64
  unless status.nil? or %w(Active Unsubscribed Returned Undeliverable Deleted).include?(status)
58
65
  raise "Invalid status: #{status}"
59
66
  end
@@ -63,14 +70,17 @@ module ExactTarget
63
70
  end
64
71
 
65
72
  def list_delete(id)
73
+ ensure_executable!("list_delete")
66
74
  build(:list, :delete, :listid, id)
67
75
  end
68
76
 
69
77
  def list_retrievegroups
78
+ ensure_executable!("list_retrievegroups")
70
79
  build(:list, :retrievegroups, :groups)
71
80
  end
72
81
 
73
82
  def list_refresh_group(group_id)
83
+ ensure_executable!("list_refresh_group")
74
84
  build(
75
85
  :list, :refresh_group,
76
86
  :sub_action => nil,
@@ -81,6 +91,7 @@ module ExactTarget
81
91
  end
82
92
 
83
93
  def batch_inquire(batch_id)
94
+ ensure_executable!("batch_inquire")
84
95
  build(
85
96
  :batch, :inquire, :batchid, batch_id,
86
97
  :sub_action => nil,
@@ -90,11 +101,31 @@ module ExactTarget
90
101
 
91
102
  ###################################################################
92
103
 
104
+ def triggered_send_add(external_key, channel_member_id, email_addresses, options={})
105
+ build(:triggeredsend, :add, :search_type => :omit, :search_value => :omit) do |operation|
106
+ operation.TriggeredSend('xmlns:xsi' => 'http://www.w3.org/2001/XMLSchema-instance',
107
+ 'xmlns:xsd' => 'http://www.w3.org/2001/XMLSchema',
108
+ 'xmlns' => 'http://exacttarget.com/wsdl/partnerAPI') do |ts|
109
+ ts.TriggeredSendDefinition do |tsd|
110
+ tsd.CustomerKey external_key
111
+ tsd.Priority 'High'
112
+ end
113
+ email_addresses.each do |addr|
114
+ build_ts_subscriber(ts, channel_member_id, addr, options)
115
+ end
116
+ end
117
+ end
118
+ end
119
+
120
+ ###################################################################
121
+
93
122
  def subscriber_add(list_id, subscriber, options={})
123
+ ensure_executable!("subscriber_add")
94
124
  subscriber_edit(list_id, nil, subscriber, options)
95
125
  end
96
126
 
97
127
  def subscriber_edit(list_id, orig_email, subscriber, options={})
128
+ ensure_executable!("subscriber_edit")
98
129
  options = subscriber_edit_default_options(options)
99
130
  subscriber = subscriber.to_et_hash if subscriber.is_a?(Subscriber)
100
131
  action = orig_email.nil? ? :add : :edit
@@ -112,16 +143,19 @@ module ExactTarget
112
143
  end
113
144
 
114
145
  def subscriber_retrieve(id, email=nil)
146
+ ensure_executable!("subscriber_retrieve")
115
147
  type = email.blank? ? :subid : :listid
116
148
  build(:subscriber, :retrieve, type, id, :search_value2 => email)
117
149
  end
118
150
 
119
151
  def subscriber_delete(id, email=nil)
152
+ ensure_executable!("subscriber_delete")
120
153
  type = email.blank? ? :subid : :listid
121
154
  build(:subscriber, :delete, type, id, :search_value2 => email)
122
155
  end
123
156
 
124
157
  def subscriber_masterunsub(*email_addresses)
158
+ ensure_executable!("subscriber_masterunsub")
125
159
  build(:subscriber, :masterunsub, :emailaddress, :search_value => :omit) do |sub|
126
160
  sub.search_value do |sv|
127
161
  email_addresses.flatten.each { |a| sv.emailaddress(a) }
@@ -132,6 +166,7 @@ module ExactTarget
132
166
  ###################################################################
133
167
 
134
168
  def email_retrieve(name=nil, options={})
169
+ ensure_executable!("email_retrieve")
135
170
  name, options = nil, name if name.is_a?(Hash)
136
171
  start_date, end_date = %w(start_date end_date).map do |n|
137
172
  et_date options[n.to_sym]
@@ -150,6 +185,7 @@ module ExactTarget
150
185
  end
151
186
 
152
187
  def email_add(name, subject, options)
188
+ ensure_executable!("email_add")
153
189
  build(:email, :add, :search_type => :omit, :search_value => :omit, :sub_action => 'HTMLPaste') do |em|
154
190
  em.category
155
191
  em.email_name name
@@ -163,6 +199,7 @@ module ExactTarget
163
199
  end
164
200
 
165
201
  def email_add_text(email_id, options)
202
+ ensure_executable!("email_add_text")
166
203
  build(:email, :add, :search_type => :emailid,
167
204
  :search_value => email_id, :sub_action => :text) do |em|
168
205
  if options.has_key? :body
@@ -174,6 +211,7 @@ module ExactTarget
174
211
  end
175
212
 
176
213
  def email_retrieve_body(email_id)
214
+ ensure_executable!("email_retrieve_body")
177
215
  build(:email, :retrieve, :emailid, email_id, :sub_action => :htmlemail) do |em|
178
216
  em.search_value2
179
217
  em.search_value3
@@ -182,7 +220,33 @@ module ExactTarget
182
220
 
183
221
  ###################################################################
184
222
 
223
+ def triggeredsend_add(email, customer_key, attributes = {})
224
+ ensure_executable!("triggeredsend_add", email)
225
+ build(:triggeredsend, :add) do |xml|
226
+ xml.TriggeredSend :"xmlns:xsi" => "http://www.w3.org/2001/XMLSchemainstance",
227
+ :"xmlns:xsd" => "http://www.w3.org/2001/XMLSchema",
228
+ :"xmlns" => "http://exacttarget.com/wsdl/partnerAPI" do
229
+ xml.TriggeredSendDefinition do
230
+ xml.CustomerKey customer_key
231
+ end
232
+ xml.Subscribers do
233
+ xml.EmailAddress email
234
+ xml.SubscriberKey email
235
+ end
236
+ attributes.each do |key, value|
237
+ xml.Attributes do
238
+ xml.Name key.to_s
239
+ xml.Value {|v| v.cdata! value.to_s }
240
+ end
241
+ end
242
+ end
243
+ end
244
+ end
245
+
246
+ ###################################################################
247
+
185
248
  def job_send(email_id, list_ids, options={})
249
+ ensure_executable!("job_send")
186
250
  options = job_send_default_options(options)
187
251
 
188
252
  build(:job, :send, :emailid, email_id) do |job|
@@ -195,6 +259,82 @@ module ExactTarget
195
259
  end
196
260
  end
197
261
 
262
+ ###################################################################
263
+
264
+ def list_bulkasync(list_id, list_status = nil)
265
+ build(
266
+ :list, :bulkasync,
267
+ :sub_action => 'Subs_ToFTP',
268
+ :search_type => :listid,
269
+ :search_value => list_id
270
+ ) do |xml|
271
+ xml.search_status list_status if list_status
272
+ end
273
+ end
274
+
275
+ def subscriber_bulkasync(list_id)
276
+ build(:subscriber, :BulkAsync,
277
+ :sub_action => "SubsStatus_ToFTP",
278
+ :search_type => "lid",
279
+ :search_value => list_id)
280
+ end
281
+
282
+ # "retrieves complete tracking data for an email send"
283
+ def tracking_bulkasync_all(job_id, start_date = nil, end_date = nil)
284
+ build(:tracking, :BulkAsync,
285
+ :sub_action => "all_ToFTP",
286
+ :search_type => "jobID",
287
+ :search_value => job_id) do |xml|
288
+ if start_date || end_date
289
+ start_date = start_date.strftime("%m/%d/%Y") if start_date.respond_to?(:strftime)
290
+ end_date = end_date.strftime("%m/%d/%Y") if end_date.respond_to?(:strftime)
291
+ xml.daterange do
292
+ xml.startdate start_date
293
+ xml.enddate end_date
294
+ end
295
+ end
296
+ end
297
+ end
298
+
299
+ def tracking_bulkasync_all_attributes(job_id, start_date = nil, end_date = nil)
300
+ build(:tracking, :BulkAsync,
301
+ :sub_action => "all_attributes_ToFTP",
302
+ :search_type => "jobID",
303
+ :search_value => job_id) do |xml|
304
+ if start_date || end_date
305
+ start_date = start_date.strftime("%m/%d/%Y") if start_date.respond_to?(:strftime)
306
+ end_date = end_date.strftime("%m/%d/%Y") if end_date.respond_to?(:strftime)
307
+ xml.daterange do
308
+ xml.startdate start_date
309
+ xml.enddate end_date
310
+ end
311
+ end
312
+ end
313
+ end
314
+
315
+ def tracking_sent_bulkasync_all(job_id)
316
+ build(:tracking, :Sent_BulkAsync,
317
+ :sub_action => "all_ToFTP",
318
+ :search_type => "jobID",
319
+ :search_value => job_id)
320
+ end
321
+
322
+ def tracking_sent_bulkasync_all_attributes(job_id, start_date = nil, end_date = nil)
323
+ build(:tracking, :Sent_BulkAsync,
324
+ :sub_action => "all_attributes_ToFTP",
325
+ :search_type => "jobID",
326
+ :search_value => job_id) do |xml|
327
+ if start_date || end_date
328
+ start_date = start_date.strftime("%m/%d/%Y") if start_date.respond_to?(:strftime)
329
+ end_date = end_date.strftime("%m/%d/%Y") if end_date.respond_to?(:strftime)
330
+ xml.daterange do
331
+ xml.startdate start_date
332
+ xml.enddate end_date
333
+ end
334
+ end
335
+ end
336
+ end
337
+
198
338
  ###################################################################
199
339
  private
200
340
  ###################################################################
@@ -279,5 +419,40 @@ module ExactTarget
279
419
  end
280
420
  end
281
421
 
422
+ def build_ts_subscriber(triggered_send, channel_member_id, email_address, options ={})
423
+ triggered_send.Subscribers('xmlns' => 'http://exacttarget.com/wsdl/partnerAPI') do |sub|
424
+ sub.Owner do |owner|
425
+ owner.Client do |client|
426
+ client.ID channel_member_id
427
+ end
428
+ end
429
+ sub.SubscriberKey email_address
430
+ sub.EmailAddress email_address
431
+ options.each do |key, value|
432
+ sub.Attributes do |atts|
433
+ atts.Name key.to_s
434
+ atts.Value value
435
+ end
436
+ end if options.present?
437
+ end
438
+ end
439
+
440
+ def ensure_executable!(method, email = nil)
441
+ # stop if the method is readonly
442
+ raise ReadonlyError.new(method) if @config.readonly && @config.readonly.include?(method.to_sym)
443
+
444
+ ensure_sendable!(email) if email
445
+ end
446
+
447
+ def ensure_sendable!(email)
448
+ if @config.email_whitelist && !@config.email_whitelist.match(email)
449
+ raise WhitelistError.new(email)
450
+ end
451
+
452
+ if @config.email_blacklist && @config.email_blacklist.match(email)
453
+ raise BlacklistError.new(email)
454
+ end
455
+ end
456
+
282
457
  end
283
458
  end
@@ -28,6 +28,9 @@ module ExactTarget
28
28
  class_from_et_attributes base, :EmailInformation,
29
29
  :emailname, :emailid, :emailsubject, :emailcreateddate, :categoryid
30
30
 
31
+ class_from_et_attributes base, :BatchStatus,
32
+ :status, :batchid, :filename
33
+
31
34
  def base.subscriber_class
32
35
  @subscriber_class ||= ResponseClasses.class_from_et_attributes(
33
36
  self, :Subscriber, accountinfo_retrieve_attrbs.map(&:name), :Status
@@ -15,9 +15,9 @@ module ExactTarget
15
15
  handle_id_result resp, :import_info, :importid, /is being imported/i
16
16
  end
17
17
 
18
- %w(email job list subscriber).each do |t|
18
+ %w(email job list subscriber triggered_send).each do |t|
19
19
  define_method "handle_#{t}_id_result", lambda { |resp|
20
- handle_id_result resp, "#{t}_info", "#{t}_description", /success/i
20
+ handle_id_result resp, "#{t}_info", "#{t}_description", /success|sucess/i
21
21
  }
22
22
  end
23
23
 
@@ -29,6 +29,8 @@ module ExactTarget
29
29
  end
30
30
  end
31
31
 
32
+ alias :triggered_send_add :handle_triggered_send_id_result
33
+
32
34
  alias :list_add :handle_list_id_result
33
35
 
34
36
  alias :list_edit :handle_list_id_result
@@ -71,7 +73,7 @@ module ExactTarget
71
73
  end
72
74
 
73
75
  def batch_inquire(resp)
74
- resp.xpath('//Batch/status[1]').first.text
76
+ create_result(BatchStatus, resp.xpath('//Batch').first)
75
77
  end
76
78
 
77
79
  ###################################################################
@@ -118,8 +120,33 @@ module ExactTarget
118
120
 
119
121
  ###################################################################
120
122
 
123
+ def triggeredsend_add(resp)
124
+ resp.xpath('//triggered_send_description[1]').first.text.to_i
125
+ end
126
+
127
+ ###################################################################
128
+
121
129
  alias :job_send :handle_job_id_result
122
130
 
131
+ ###################################################################
132
+
133
+ def list_bulkasync(resp)
134
+ resp.xpath('//batchID').first.text.to_i
135
+ end
136
+
137
+ def subscriber_bulkasync(resp)
138
+ resp.xpath('//batchID').first.text.to_i
139
+ end
140
+
141
+ def tracking_sent_bulkasync_all(resp)
142
+ resp.xpath('//batchID').first.text.to_i
143
+ end
144
+
145
+ def tracking_sent_bulkasync_all_attributes(resp)
146
+ resp.xpath('//batchID').first.text.to_i
147
+ end
148
+
149
+
123
150
  ###################################################################
124
151
  private
125
152
  ###################################################################
@@ -122,6 +122,12 @@ email_retrieve_body:
122
122
 
123
123
  ####################################################################################
124
124
 
125
+ triggeredsend_add:
126
+ request: <system_name>triggeredsend</system_name><action>add</action><search_type></search_type><search_value></search_value><TriggeredSend xmlns:xsi="http://www.w3.org/2001/XMLSchemainstance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://exacttarget.com/wsdl/partnerAPI"><TriggeredSendDefinition><CustomerKey>email_name</CustomerKey></TriggeredSendDefinition><Subscribers><EmailAddress>recipient@foo.com</EmailAddress><SubscriberKey>recipient@foo.com</SubscriberKey></Subscribers><Attributes><Name>attr_1</Name><Value><![CDATA[val_1]]></Value></Attributes><Attributes><Name>attr_2</Name><Value><![CDATA[val_2]]></Value></Attributes></TriggeredSend>
127
+ response: <triggeredsend><triggered_send_info>Triggered Send was added successfully</triggered_send_info><triggered_send_description>0</triggered_send_description></triggeredsend>
128
+
129
+ ####################################################################################
130
+
125
131
  job_send:
126
132
  request: <system_name>job</system_name><action>send</action><search_type>emailid</search_type><search_value>112233</search_value><from_name>FrName</from_name><from_email>fr.email@nowhere.com</from_email><additional>addit</additional><multipart_mime>true</multipart_mime><track_links>false</track_links><send_date>5/3/2011</send_date><send_time>17:35</send_time><lists><list>12345</list><list>12346</list></lists><suppress><list>35612</list></suppress><test_send>true</test_send>
127
133
  response: <job><job_info>Job was successfully created.</job_info><job_description>2030602</job_description></job>
@@ -154,7 +154,7 @@ describe ExactTarget do
154
154
  end
155
155
 
156
156
  test_et :batch_inquire, 8912 do
157
- @res.should == 'Completed'
157
+ @res.status.should == 'Completed'
158
158
  end
159
159
 
160
160
  #################################################################
@@ -283,6 +283,12 @@ describe ExactTarget do
283
283
 
284
284
  #################################################################
285
285
 
286
+ test_et :triggeredsend_add, 'recipient@foo.com', 'email_name', {:attr_1 => 'val_1', :attr_2 => 'val_2'} do
287
+ @res.should == 0
288
+ end
289
+
290
+ #################################################################
291
+
286
292
  test_et :job_send, 112233, [12345, 12346],
287
293
  :suppress_ids => 35612,
288
294
  :from_name => 'FrName',
@@ -309,7 +315,8 @@ describe ExactTarget do
309
315
 
310
316
  context :send_to_exact_target do
311
317
  before(:each) do
312
- @path = '/foo?qf=xml&xml=%3Csomexml/%3E'
318
+ @path = '/foo'
319
+ @data = 'qf=xml&xml=%3Csomexml/%3E'
313
320
  @http = mock('Net::HTTP')
314
321
  @http.should_receive(:use_ssl=).with(true)
315
322
  @http.should_receive(:open_timeout=).with(2)
@@ -317,15 +324,18 @@ describe ExactTarget do
317
324
  Net::HTTP.should_receive(:new).with('base.url.com', 443).and_return(@http)
318
325
  end
319
326
 
327
+ after { ExactTarget.configuration.http_method = nil }
328
+
320
329
  specify :success do
321
330
  resp = stub('Net::HTTPSuccess', :is_a? => true, :body => 'xyz')
322
- @http.should_receive(:get).with(@path).and_return(resp)
331
+ @http.should_receive(:get).with("#{@path}?#{@data}").and_return(resp)
323
332
  ExactTarget.send_to_exact_target('<somexml/>').should == 'xyz'
324
333
  end
325
334
 
326
335
  specify :error do
336
+ ExactTarget.configuration.http_method = :post
327
337
  resp = stub('Net::HTTPFailure', :error! => 'err')
328
- @http.should_receive(:get).with(@path).and_return(resp)
338
+ @http.should_receive(:post).with(@path, @data).and_return(resp)
329
339
  ExactTarget.send_to_exact_target('<somexml/>').should == 'err'
330
340
  end
331
341
  end
metadata CHANGED
@@ -2,22 +2,24 @@
2
2
  name: exact-target
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.0.5
5
+ version: 0.1.8
6
6
  platform: ruby
7
7
  authors:
8
- - David McCullars
8
+ - David McCullars, Paul Nock, Jeff Ching
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2011-10-25 00:00:00 Z
13
+ date: 2012-02-09 00:00:00 Z
14
14
  dependencies: []
15
15
 
16
16
  description: |
17
17
  This is a pure-ruby implementation of the ExactTarget api.
18
18
  For more information consule http://www.exacttarget.com/.
19
19
 
20
- email: dmccullars@ePublishing.com
20
+ email:
21
+ - dmccullars@ePublishing.com
22
+ - nocksf@gmail.com
21
23
  executables: []
22
24
 
23
25
  extensions: []
@@ -35,6 +37,7 @@ files:
35
37
  - Manifest
36
38
  - README.rdoc
37
39
  - Rakefile
40
+ - exact-target.gemspec
38
41
  - lib/exact-target.rb
39
42
  - lib/exact_target.rb
40
43
  - lib/exact_target/builder_ext.rb
@@ -54,7 +57,6 @@ files:
54
57
  - spec/exact_target_spec.rb
55
58
  - spec/spec.opts
56
59
  - spec/spec_helper.rb
57
- - exact-target.gemspec
58
60
  homepage: http://github.com/ePublishing/exact_target
59
61
  licenses: []
60
62