Skip to content
This repository has been archived by the owner on Aug 9, 2022. It is now read-only.

Commit

Permalink
first step towards new campaign interface
Browse files Browse the repository at this point in the history
  • Loading branch information
joshgoebel committed Feb 26, 2009
1 parent 86bec6c commit ce09a4a
Show file tree
Hide file tree
Showing 8 changed files with 76 additions and 35 deletions.
3 changes: 2 additions & 1 deletion lib/campaign_monitor.rb
Expand Up @@ -108,6 +108,7 @@ def request(method, params)
'forcearray' => %w[List Campaign Subscriber Client SubscriberOpen SubscriberUnsubscribe SubscriberClick SubscriberBounce],
'noattr' => true })
response.delete('d1p1:type')
response.delete("d1p1:http://www.w3.org/2001/XMLSchema-instance:type")
response
rescue XML::Parser::ParseError
{ "Code" => 500, "Message" => request_xml.split(/\r?\n/).first, "FullError" => request_xml }
Expand Down Expand Up @@ -190,7 +191,7 @@ def timezones
# end
def campaigns(client_id)
handle_response(Client_GetCampaigns("ClientID" => client_id)) do |response|
response["Campaign"].collect{|c| Campaign.new(c["CampaignID"], c["Subject"], c["SentDate"], c["TotalRecipients"].to_i)}
response["Campaign"].collect{|c| Campaign.new(c) }
end
end

Expand Down
2 changes: 1 addition & 1 deletion lib/campaign_monitor/base.rb
Expand Up @@ -2,7 +2,7 @@ class CampaignMonitor
# Provides access to the lists and campaigns associated with a client
class Base

attr_reader :result
attr_reader :result, :attributes

@@client=nil

Expand Down
86 changes: 63 additions & 23 deletions lib/campaign_monitor/campaign.rb
@@ -1,16 +1,47 @@
class CampaignMonitor
# Provides access to the information about a campaign
class Campaign

# The Client class aims to impliment the full functionality of the CampaignMonitor
# Clients API as detailed at: http://www.campaignmonitor.com/api/
# === Attributes
#
# Attriutes can be read and set as if Campaign were a Hash
#
# @client["CompanyName"]="Road Running, Inc."
# @client["ContactName"] => "Wiley Coyote"
#
# Convenience attribute readers are provided for name and id
#
# @campaign.id == @client["CampaignID"]
# @campaign.name == @client["CampaignName"]
#
# === API calls supported
#
# * Campaign.Create
# * Campaign.Send
# * Campaign.GetBounces
# * Campaign.GetLists
# * Campaign.GetOpens
# * Campaign.GetSubscriberClicks
# * Campaign.GetUnsubscribes
# * Campaign.GetSummary
#
# === Not yet supported
#
#
class Campaign < Base
include CampaignMonitor::Helpers
id_field "CampaignID"
name_field "Subject"

attr_reader :id, :subject, :sent_date, :total_recipients, :cm_client
# attr_reader :id, :subject, :sent_date, :total_recipients, :cm_client

data_types "TotalRecipients" => "to_i"

def initialize(id=nil, subject=nil, sent_date=nil, total_recipients=nil)
@id = id
@subject = subject
@sent_date = sent_date
@total_recipients = total_recipients
@cm_client = CampaignMonitor.new
attr_reader :cm_client

def initialize(attrs={})
super
@attributes=attrs
end

# Example
Expand All @@ -20,11 +51,12 @@ def initialize(id=nil, subject=nil, sent_date=nil, total_recipients=nil)
# for subscriber in @subscriber_opens
# puts subscriber.email
# end
def opens
def GetOpens
handle_response(cm_client.Campaign_GetOpens("CampaignID" => self.id)) do |response|
response["SubscriberOpen"].collect{|s| SubscriberOpen.new(s["EmailAddress"], s["ListID"], s["NumberOfOpens"])}
end
end
alias opens GetOpens

# Example
# @campaign = Campaign.new(12345)
Expand All @@ -33,11 +65,12 @@ def opens
# for subscriber in @subscriber_bounces
# puts subscriber.email
# end
def bounces
def GetBounces
handle_response(cm_client.Campaign_GetBounces("CampaignID"=> self.id)) do |response|
response["SubscriberBounce"].collect{|s| SubscriberBounce.new(s["EmailAddress"], s["ListID"], s["BounceType"])}
end
end
alias bounces GetBounces

# Example
# @campaign = Campaign.new(12345)
Expand All @@ -46,11 +79,12 @@ def bounces
# for subscriber in @subscriber_clicks
# puts subscriber.email
# end
def clicks
def GetSubscriberClicks
handle_response(cm_client.Campaign_GetSubscriberClicks("CampaignID" => self.id)) do |response|
response["SubscriberClick"].collect{|s| SubscriberClick.new(s["EmailAddress"], s["ListID"], s["ClickedLinks"])}
end
end
alias clicks GetSubscriberClicks

# Example
# @campaign = Campaign.new(12345)
Expand All @@ -59,61 +93,67 @@ def clicks
# for subscriber in @subscriber_unsubscribes
# puts subscriber.email
# end
def unsubscribes
def GetUnsubscribes
handle_response(cm_client.Campaign_GetUnsubscribes("CampaignID" => self.id)) do |response|
response["SubscriberUnsubscribe"].collect{|s| SubscriberUnsubscribe.new(s["EmailAddress"], s["ListID"])}
end
end
alias unsubscribes GetUnsubscribes

def GetSummary
@result=Result.new(cm_client.Campaign_GetSummary('CampaignID' => self.id))
@summary=@result.raw if @result.success?
@result.success?
end

# Example
# @campaign = Campaign.new(12345)
# puts @campaign.number_recipients
def number_recipients
@number_recipients ||= attributes[:number_recipients]
@number_recipients ||= summary[:number_recipients]
end

# Example
# @campaign = Campaign.new(12345)
# puts @campaign.number_opened
def number_opened
@number_opened ||= attributes[:number_opened]
@number_opened ||= summary[:number_opened]
end

# Example
# @campaign = Campaign.new(12345)
# puts @campaign.number_clicks
def number_clicks
@number_clicks ||= attributes[:number_clicks]
@number_clicks ||= summary[:number_clicks]
end

# Example
# @campaign = Campaign.new(12345)
# puts @campaign.number_unsubscribed
def number_unsubscribed
@number_unsubscribed ||= attributes[:number_unsubscribed]
@number_unsubscribed ||= summary[:number_unsubscribed]
end

# Example
# @campaign = Campaign.new(12345)
# puts @campaign.number_bounced
def number_bounced
@number_bounced ||= attributes[:number_bounced]
@number_bounced ||= summary[:number_bounced]
end

private
def attributes
if @attributes.nil?
def summary
if @summary.nil?
summary = cm_client.Campaign_GetSummary('CampaignID' => self.id)
@attributes = {
@summary = {
:number_recipients => summary['Recipients'].to_i,
:number_opened => summary['TotalOpened'].to_i,
:number_clicks => summary['Click'].to_i,
:number_unsubscribed => summary['Unsubscribed'].to_i,
:number_bounced => summary['Bounced'].to_i
}
end

@attributes
@summary
end
end
end
10 changes: 3 additions & 7 deletions lib/campaign_monitor/result.rb
@@ -1,20 +1,20 @@
class CampaignMonitor
# Encapsulates the response received from the CampaignMonitor webservice.
class Result
attr_reader :message, :code
attr_reader :message, :code, :raw

def initialize(response)
@message = response["Message"]
@code = response["Code"].to_i
@raw=response
@raw = response
end

def success?
code == 0
end

def failed?
!succeeded?
not success?
end

def content
Expand All @@ -24,9 +24,5 @@ def content
alias :succeeded? :success?
alias :failure? :failed?

def raw
@raw
end

end
end
2 changes: 1 addition & 1 deletion test/campaign_monitor_test.rb
@@ -1,5 +1,5 @@
require 'rubygems'
require 'campaign_monitor'
require 'lib/campaign_monitor'
require 'test/unit'
require 'test/test_helper'

Expand Down
2 changes: 1 addition & 1 deletion test/client_test.rb
@@ -1,5 +1,5 @@
require 'rubygems'
require 'campaign_monitor'
require 'lib/campaign_monitor'
require 'test/unit'
require 'test/test_helper'

Expand Down
4 changes: 3 additions & 1 deletion test/list_test.rb
@@ -1,5 +1,5 @@
require 'rubygems'
require 'campaign_monitor'
require 'lib/campaign_monitor'
require 'test/unit'
require 'test/test_helper'

Expand All @@ -8,6 +8,8 @@

class CampaignMonitorTest < Test::Unit::TestCase

$debug=true

def setup
@cm = CampaignMonitor.new(ENV["API_KEY"])
# find an existing client
Expand Down
2 changes: 2 additions & 0 deletions test/test_helper.rb
@@ -1,3 +1,5 @@
CAMPAIGN_MONITOR_API_KEY=nil

if ENV["API_KEY"].nil?
puts "Please specify the API_KEY on the command line for testing."
exit
Expand Down

0 comments on commit ce09a4a

Please sign in to comment.