postal 0.1.5 → 0.2.2

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/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.5
1
+ 0.2.2
@@ -8,6 +8,7 @@ require 'postal/lmapi/lmapi.rb'
8
8
  require 'postal/lmapi/lmapi_driver.rb'
9
9
  require 'postal/lmapi/lmapi_mapping_registry.rb'
10
10
  require 'postal/base'
11
+ require 'postal/content'
11
12
  require 'postal/list'
12
13
  require 'postal/member'
13
14
  require 'postal/mailing'
@@ -20,14 +21,15 @@ module Postal
20
21
  class CouldNotSendMailing < StandardError; end;
21
22
  class WouldDeleteAllMembers < StandardError; end;
22
23
 
23
- VERSION = '0.1.5'
24
+ VERSION = '0.2.2'
24
25
  LOGGER = Logger.new(STDOUT)
25
26
 
26
27
  DEFAULT_OPTIONS = { :debug => false }
27
28
 
28
29
  @options = { :wsdl => nil,
29
30
  :username => nil,
30
- :password => nil }
31
+ :password => nil,
32
+ :proxy => nil }
31
33
  @driver = nil
32
34
 
33
35
  attr_accessor :options
@@ -37,6 +39,7 @@ module Postal
37
39
  unless @driver
38
40
  @driver = Postal::Lmapi::Soap.new(@options[:wsdl])
39
41
  @driver.options['protocol.http.basic_auth'] << [@options[:wsdl], @options[:username], @options[:password]]
42
+ @driver.options['protocol.http.proxy'] = @options[:proxy]
40
43
  end
41
44
  return @driver
42
45
  end
@@ -0,0 +1,82 @@
1
+ module Postal
2
+ class Content
3
+
4
+ class << self
5
+
6
+ def find_by_filter(*args)
7
+ unless args.find { |arg| arg.match(/ListName/) }
8
+ args << "ListName=#{Postal.options[:list_name]}"
9
+ end
10
+ if soap_contents = Postal.driver.selectContent(args)
11
+ contents = soap_contents.collect do |content|
12
+ puts content.inspect
13
+ Content.new(:content_id => content.contentID,
14
+ :date_created => content.dateCreated,
15
+ :description => content.description,
16
+ :doc_parts => content.docParts,
17
+ :doc_type => content.docType,
18
+ :header_from => content.headerFrom,
19
+ :header_to => content.headerTo,
20
+ :is_read_only => content.isReadOnly,
21
+ :is_template => content.isTemplate,
22
+ :list_name => content.listName,
23
+ :native_title => content.nativeTitle,
24
+ :site_name => content.siteName,
25
+ :title => content.title)
26
+ end
27
+ if contents.size == 1
28
+ return contents.first
29
+ else
30
+ return contents
31
+ end
32
+ else
33
+ return nil
34
+ end
35
+ end
36
+
37
+
38
+ # really just an alias for find_by_filter but with no options
39
+ def find_all
40
+ find_by_filter
41
+ end
42
+
43
+
44
+ end
45
+
46
+ DEFAULT_ATTRIBUTES = {:content_id => nil,
47
+ :date_created => nil,
48
+ :description => nil,
49
+ :doc_parts => nil,
50
+ :doc_type => nil,
51
+ :header_from => nil,
52
+ :header_to => nil,
53
+ :is_read_only => nil,
54
+ :is_template => nil,
55
+ :list_name => nil,
56
+ :native_title => nil,
57
+ :site_name => nil,
58
+ :title => nil}
59
+
60
+ attr_accessor :content_id ,:date_created ,:description ,:doc_parts ,:doc_type ,:header_from ,:header_to ,:is_read_only ,:is_template ,:list_name ,:native_title ,:site_name ,:title
61
+
62
+
63
+ # Create a new member instance
64
+ def initialize(attributes={})
65
+ attributes = DEFAULT_ATTRIBUTES.merge(attributes)
66
+ @content_id = attributes[:content_id]
67
+ @date_created = attributes[:date_created]
68
+ @description = attributes[:description]
69
+ @doc_parts = attributes[:doc_parts]
70
+ @doc_type = attributes[:doc_type]
71
+ @header_from = attributes[:header_from]
72
+ @header_to = attributes[:header_to]
73
+ @is_read_only = attributes[:is_read_only]
74
+ @is_template = attributes[:is_template]
75
+ @list_name = attributes[:list_name]
76
+ @native_title = attributes[:native_title]
77
+ @site_name = attributes[:site_name]
78
+ @title = attributes[:title]
79
+ end
80
+
81
+ end
82
+ end
@@ -48,6 +48,16 @@ module Postal
48
48
  @from = from
49
49
  @additionalHeaders = additionalHeaders
50
50
  end
51
+
52
+ # This lets us initialize a new MailingStruct by passing in a SimpleMailingStruct
53
+ # mail = Postal::Lmapi::MailingStruct.new(content)
54
+ def [](method)
55
+ begin
56
+ self.send(method)
57
+ rescue
58
+ return nil
59
+ end
60
+ end
51
61
  end
52
62
 
53
63
  # {http://tempuri.org/ns1.xsd}MessageStruct
@@ -655,7 +655,7 @@ module Postal
655
655
  ]
656
656
  ]
657
657
 
658
- def initialize(endpoint_url = nil)
658
+ def initialize(endpoint_url = nil, proxy = nil)
659
659
  endpoint_url ||= DefaultEndpointUrl
660
660
  super(endpoint_url, nil)
661
661
  self.mapping_registry = MappingRegistry::EncodedRegistry
@@ -3,6 +3,11 @@ module Postal
3
3
 
4
4
  class << self
5
5
 
6
+ def import(content_id)
7
+ mail = Postal.driver.importContent(content_id)
8
+ return mail
9
+ end
10
+
6
11
  end
7
12
 
8
13
 
@@ -32,7 +37,8 @@ module Postal
32
37
  :title => nil,
33
38
  :to => nil,
34
39
  :track_opens => nil,
35
- :rewrite_date_when_sent => nil }
40
+ :rewrite_date_when_sent => nil,
41
+ :mailing => nil }
36
42
 
37
43
  attr_accessor :additional_headers,
38
44
  :attachments,
@@ -60,71 +66,65 @@ module Postal
60
66
  :title,
61
67
  :to,
62
68
  :track_opens,
63
- :rewrite_date_when_sent
69
+ :rewrite_date_when_sent,
70
+ :mailing
64
71
 
65
72
  # Create a new mailing ready to send
66
73
  def initialize(args={})
67
74
  args = DEFAULT_ATTRIBUTES.merge(args)
68
- @to = args[:to]
69
- @additional_headers = args[:additional_headers]
70
- @attachments = args[:attachments]
71
- @bypass_moderation = args[:bypass_moderation]
72
- @campaign = args[:campaign]
73
- @char_set_id = args[:char_set_id]
74
- @detect_html = args[:detect_html]
75
- @dont_attempt_after_date = args[:dont_attempt_after_date]
76
- @enable_recovery = args[:enable_recovery]
77
- @from = args[:from]
78
- @html_message = args[:html_message]
79
- @html_section_encoding = args[:html_section_encoding]
80
- @is_html_section_encoded = args[:is_html_section_encoded]
81
- @is_text_section_encoded = args[:is_text_section_encoded]
75
+
82
76
  @list_name = args[:list_name] || Postal.options[:list_name]
83
- @recency_number_of_mailings = args[:recency_number_of_mailings]
84
- @recency_which = args[:recency_which]
85
- @reply_to = args[:reply_to]
86
- @resend_after_days = args[:resend_after_days]
87
- @sample_size = args[:sample_size]
88
- @scheduled_mailing_date = args[:scheduled_mailing_date]
89
- @subject = args[:subject]
90
- @text_message = args[:text_message]
91
- @text_section_encoding = args[:text_section_encoding]
92
- @title = args[:title]
93
- @to = args[:to]
94
- @track_opens = args[:track_opens]
95
- @rewrite_date_when_sent = args[:rewrite_date_when_sent]
77
+ @to = args[:to]
78
+
79
+ if args[:mailing].nil?
80
+ @additional_headers = args[:additional_headers]
81
+ @attachments = args[:attachments]
82
+ @bypass_moderation = args[:bypass_moderation]
83
+ @campaign = args[:campaign]
84
+ @char_set_id = args[:char_set_id]
85
+ @detect_html = args[:detect_html]
86
+ @dont_attempt_after_date = args[:dont_attempt_after_date]
87
+ @enable_recovery = args[:enable_recovery]
88
+ @from = args[:from]
89
+ @html_message = args[:html_message]
90
+ @html_section_encoding = args[:html_section_encoding]
91
+ @is_html_section_encoded = args[:is_html_section_encoded]
92
+ @is_text_section_encoded = args[:is_text_section_encoded]
93
+ @recency_number_of_mailings = args[:recency_number_of_mailings]
94
+ @recency_which = args[:recency_which]
95
+ @reply_to = args[:reply_to]
96
+ @resend_after_days = args[:resend_after_days]
97
+ @sample_size = args[:sample_size]
98
+ @scheduled_mailing_date = args[:scheduled_mailing_date]
99
+ @subject = args[:subject]
100
+ @text_message = args[:text_message]
101
+ @text_section_encoding = args[:text_section_encoding]
102
+ @title = args[:title]
103
+ @to = args[:to]
104
+ @track_opens = args[:track_opens]
105
+ @rewrite_date_when_sent = args[:rewrite_date_when_sent]
106
+ @mailing = args[:mailing]
107
+ else
108
+ @subject = args[:mailing].subject
109
+ @is_html_section_encoded = args[:mailing].isHtmlSectionEncoded
110
+ @html_section_encoding = args[:mailing].htmlSectionEncoding
111
+ @html_message = args[:mailing].htmlMessage
112
+ @char_set_id = args[:mailing].charSetID
113
+ @is_text_section_encoded = args[:mailing].isTextSectionEncoded
114
+ @text_section_encoding = args[:mailing].textSectionEncoding
115
+ @title = args[:mailing].title
116
+ @text_message = args[:mailing].textMessage
117
+ @attachments = args[:mailing].attachments
118
+ @from = args[:mailing].from
119
+ @additional_headers = args[:mailing].additionalHeaders
120
+ @mailing = args[:mailing]
121
+ end
96
122
  end
97
123
 
98
124
 
99
125
  # Send the mailing
100
126
  def send
101
127
  if valid?
102
- mail = Postal::Lmapi::MailingStruct.new(:additionalHeaders => @additional_headers,
103
- :attachments => @attachments,
104
- :bypassModeration => @bypass_moderation,
105
- :campaign => @campaign,
106
- :charSetID => @char_set_id,
107
- :detectHtml => @detect_html,
108
- :dontAttemptAfterDate => @dont_attempt_after_date,
109
- :enableRecovery => @enable_recovery,
110
- :from => @from,
111
- :htmlMessage => @html_message,
112
- :htmlSectionEncoding => @html_section_encoding,
113
- :isHtmlSectionEncoded => @is_html_section_encoded,
114
- :isTextSectionEncoded => @is_text_section_encoded,
115
- :listName => @list_name,
116
- :recencyNumberOfMailings => @recency_number_of_mailings,
117
- :recencyWhich => @recency_which,
118
- :replyTo => @reply_to,
119
- :resendAfterDays => @resend_after_days,
120
- :sampleSize => @sample_size,
121
- :scheduledMailingDate => @scheduled_mailing_date,
122
- :subject => @subject,
123
- :textMessage => @text_message,
124
- :textSectionEncoding => @text_section_encoding,
125
- :title => @title,
126
- :trackOpens => @track_opens,
127
- :rewriteDateWhenSent => @rewrite_date_when_sent )
128
128
 
129
129
  # are we sending to a list of email addresses or member ids
130
130
  case @to.to_a.first
@@ -135,9 +135,44 @@ module Postal
135
135
  emails = []
136
136
  member_ids = @to.to_a
137
137
  end
138
-
139
- return Postal.driver.sendMailingDirect(emails,member_ids,mail)
140
- else
138
+
139
+ if @mailing.nil?
140
+ mail = Postal::Lmapi::MailingStruct.new(:additionalHeaders => @additional_headers,
141
+ :attachments => @attachments,
142
+ :bypassModeration => @bypass_moderation,
143
+ :campaign => @campaign,
144
+ :charSetID => @char_set_id,
145
+ :detectHtml => @detect_html,
146
+ :dontAttemptAfterDate => @dont_attempt_after_date,
147
+ :enableRecovery => @enable_recovery,
148
+ :from => @from,
149
+ :htmlMessage => @html_message,
150
+ :htmlSectionEncoding => @html_section_encoding,
151
+ :isHtmlSectionEncoded => @is_html_section_encoded,
152
+ :isTextSectionEncoded => @is_text_section_encoded,
153
+ :listName => @list_name,
154
+ :recencyNumberOfMailings => @recency_number_of_mailings,
155
+ :recencyWhich => @recency_which,
156
+ :replyTo => @reply_to,
157
+ :resendAfterDays => @resend_after_days,
158
+ :sampleSize => @sample_size,
159
+ :scheduledMailingDate => @scheduled_mailing_date,
160
+ :subject => @subject,
161
+ :textMessage => @text_message,
162
+ :textSectionEncoding => @text_section_encoding,
163
+ :title => @title,
164
+ # :to => @to,
165
+ :trackOpens => @track_opens,
166
+ :rewriteDateWhenSent => @rewrite_date_when_sent )
167
+
168
+ return Postal.driver.sendMailingDirect(emails,member_ids,mail)
169
+ else
170
+ mail = Postal::Lmapi::MailingStruct.new(@mailing)
171
+ mail.listName = @list_name || Postal.options[:list_name]
172
+ return Postal.driver.sendMailingDirect(emails,member_ids,mail)
173
+ end
174
+
175
+ else # mail wasn't valid
141
176
  return false
142
177
  end
143
178
  end
@@ -8,16 +8,7 @@ module Postal
8
8
  args << "ListName=#{Postal.options[:list_name]}"
9
9
  end
10
10
  if soap_members = Postal.driver.selectMembers(args)
11
- members = soap_members.collect do |member|
12
- demographics = {}
13
- member.demographics.each { |demo| demographics.merge!({ demo.name.to_sym => demo.value }) }
14
- Member.new(:email => member.emailAddress, :name => member.fullName, :id => member.memberID, :list_name => member.listName, :demographics => demographics)
15
- end
16
- if members.size == 1
17
- return members.first
18
- else
19
- return members
20
- end
11
+ return parse_members(soap_members)
21
12
  else
22
13
  return nil
23
14
  end
@@ -52,7 +43,8 @@ module Postal
52
43
  member_id = 0
53
44
 
54
45
  begin
55
- return Postal.driver.getMemberID(Postal::Lmapi::SimpleMemberStruct.new(list_name,member_id,email))
46
+ return find_by_filter("EmailAddress=#{email}")
47
+ # return Postal.driver.getMemberID(Postal::Lmapi::SimpleMemberStruct.new(list_name,member_id,email))
56
48
  rescue SOAP::FaultError
57
49
  return nil
58
50
  end
@@ -61,7 +53,8 @@ module Postal
61
53
 
62
54
  def find_by_id(args,options)
63
55
  member_id = args.first
64
- return Postal.driver.getEmailFromMemberID(member_id)
56
+ return find_by_filter("MemberID=#{member_id}")
57
+ # return Postal.driver.getEmailFromMemberID(member_id)
65
58
  end
66
59
 
67
60
 
@@ -77,6 +70,19 @@ module Postal
77
70
  end
78
71
  end
79
72
 
73
+ def parse_members(raw)
74
+ members = raw.collect do |member|
75
+ demographics = {}
76
+ member.demographics.each { |demo| demographics.merge!({ demo.name.to_sym => demo.value }) }
77
+ Member.new(:email => member.emailAddress, :name => member.fullName, :id => member.memberID, :list_name => member.listName, :demographics => demographics)
78
+ end
79
+ if members.size == 1
80
+ return members.first
81
+ else
82
+ return members
83
+ end
84
+ end
85
+
80
86
  end
81
87
 
82
88
  DEFAULT_ATTRIBUTES = { :id => nil, :email => nil, :name => nil, :list_name => nil, :demographics => {} }
@@ -1,12 +1,15 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
1
4
  # -*- encoding: utf-8 -*-
2
5
 
3
6
  Gem::Specification.new do |s|
4
7
  s.name = %q{postal}
5
- s.version = "0.1.5"
8
+ s.version = "0.2.2"
6
9
 
7
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
8
11
  s.authors = ["Rob Cameron"]
9
- s.date = %q{2009-10-29}
12
+ s.date = %q{2009-11-19}
10
13
  s.description = %q{Lyris is an enterprise email service. Postal makes it easy for Ruby to talk to Lyris's API.}
11
14
  s.email = %q{cannikinn@gmail.com}
12
15
  s.extra_rdoc_files = [
@@ -22,6 +25,7 @@ Gem::Specification.new do |s|
22
25
  "VERSION",
23
26
  "lib/postal.rb",
24
27
  "lib/postal/base.rb",
28
+ "lib/postal/content.rb",
25
29
  "lib/postal/list.rb",
26
30
  "lib/postal/lmapi/lmapi.rb",
27
31
  "lib/postal/lmapi/lmapi_driver.rb",
@@ -29,6 +33,7 @@ Gem::Specification.new do |s|
29
33
  "lib/postal/mailing.rb",
30
34
  "lib/postal/member.rb",
31
35
  "postal.gemspec",
36
+ "test/content_test.rb",
32
37
  "test/list_test.rb",
33
38
  "test/lmapiClient.rb",
34
39
  "test/lyris_sample.yml",
@@ -43,7 +48,8 @@ Gem::Specification.new do |s|
43
48
  s.rubygems_version = %q{1.3.5}
44
49
  s.summary = %q{Gem for talking to the Lyris API}
45
50
  s.test_files = [
46
- "test/list_test.rb",
51
+ "test/content_test.rb",
52
+ "test/list_test.rb",
47
53
  "test/lmapiClient.rb",
48
54
  "test/mailing_test.rb",
49
55
  "test/member_test.rb",
@@ -64,3 +70,4 @@ Gem::Specification.new do |s|
64
70
  s.add_dependency(%q<soap4r>, [">= 1.5.8"])
65
71
  end
66
72
  end
73
+
@@ -0,0 +1,22 @@
1
+ require 'test_helper'
2
+
3
+ class ContentTest < Test::Unit::TestCase
4
+
5
+ @config = nil
6
+
7
+ def setup
8
+ load_config
9
+ Postal.options[:list_name] = 'active-casting'
10
+ Postal.options[:proxy] = "http://localhost:8888/"
11
+ end
12
+
13
+ def test_selecting_all_content
14
+ content = Postal::Content.find_all
15
+ assert_not_nil content
16
+ end
17
+
18
+ def test_finding_content_by_filter
19
+ assert_not_nil content = Postal::Content.find_by_filter()
20
+ end
21
+
22
+ end
@@ -6,6 +6,7 @@ class MailingTest < Test::Unit::TestCase
6
6
 
7
7
  def setup
8
8
  load_config
9
+ Postal.options[:proxy] = "http://localhost:8888/"
9
10
  end
10
11
 
11
12
  def test_can_send_valid_mailing
@@ -49,7 +50,7 @@ class MailingTest < Test::Unit::TestCase
49
50
  end
50
51
 
51
52
  def test_cannot_send_invalid_mailing
52
- mail = Postal::Mailing.new( :to => @config['valid_email'],
53
+ mail = Postal::Mailing.new( :to => @config['email_in_list'],
53
54
  :html_message => "<p>Test from Postal at #{Time.now.to_s}</p>",
54
55
  :from => @config['from'] )
55
56
  assert !mail.valid?
@@ -57,4 +58,17 @@ class MailingTest < Test::Unit::TestCase
57
58
  assert_raises(Postal::CouldNotSendMailing) { mail.send! }
58
59
  end
59
60
 
61
+ def test_can_import_content
62
+ assert mail = Postal::Mailing.import(@config['content_id'])
63
+ assert_equal @config['content_subject'], mail.subject
64
+ end
65
+
66
+ def test_can_send_mailing_from_import
67
+ content = Postal::Mailing.import(@config['content_id'])
68
+ mailing = Postal::Mailing.new(:to => @config['email_in_list'],
69
+ :mailing => content)
70
+ assert mailing.valid?
71
+ assert mailing.send!
72
+ end
73
+
60
74
  end
@@ -40,6 +40,7 @@ class MemberTest < Test::Unit::TestCase
40
40
  def test_can_update_user_demographics_after_creation
41
41
  new_member = Postal::Member.create(:email => "john.doe#{rand(1000000)}@anonymous.com", :name => "John Doe")
42
42
  assert new_member.update_attributes(:field_0 => 'Baseball')
43
+ assert updated_user = Postal::Member.find(new_member.email)
43
44
  end
44
45
 
45
46
  def test_can_create_user_and_demographics_at_creation
@@ -79,11 +80,18 @@ class MemberTest < Test::Unit::TestCase
79
80
  assert !Postal::Member.find(new_member.email)
80
81
  end
81
82
 
82
- def test_can_create_find_and_update_member
83
+ def test_can_create_find_and_update_member_by_filter
83
84
  Postal::Member.create(:email => "john.doe#{rand(1000000)}@anonymous.com", :name => "John Doe")
84
85
  assert member = Postal::Member.find_by_filter('EmailAddress like john.doe%')
85
86
  assert member.update_attributes(:field_0 => 'Baseball')
86
87
  assert_equal Postal::Member.find_by_filter('EmailAddress like john.doe%').demographics[:field_0], 'Baseball'
87
88
  end
88
89
 
90
+ def test_can_create_find_and_update_member_by_id
91
+ new_member = Postal::Member.create(:email => "john.doe#{rand(1000000)}@anonymous.com", :name => "John Doe")
92
+ assert member = Postal::Member.find(new_member.id)
93
+ assert member.update_attributes(:field_0 => 'Baseball')
94
+ assert_equal Postal::Member.find(new_member.email).demographics[:field_0], 'Baseball'
95
+ end
96
+
89
97
  end
@@ -2,3 +2,4 @@ require 'test/unit'
2
2
  require 'list_test'
3
3
  require 'member_test'
4
4
  require 'mailing_test'
5
+ require 'content_test'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: postal
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.5
4
+ version: 0.2.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Rob Cameron
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-10-29 00:00:00 -07:00
12
+ date: 2009-11-19 00:00:00 -08:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -40,6 +40,7 @@ files:
40
40
  - VERSION
41
41
  - lib/postal.rb
42
42
  - lib/postal/base.rb
43
+ - lib/postal/content.rb
43
44
  - lib/postal/list.rb
44
45
  - lib/postal/lmapi/lmapi.rb
45
46
  - lib/postal/lmapi/lmapi_driver.rb
@@ -47,6 +48,7 @@ files:
47
48
  - lib/postal/mailing.rb
48
49
  - lib/postal/member.rb
49
50
  - postal.gemspec
51
+ - test/content_test.rb
50
52
  - test/list_test.rb
51
53
  - test/lmapiClient.rb
52
54
  - test/lyris_sample.yml
@@ -83,6 +85,7 @@ signing_key:
83
85
  specification_version: 3
84
86
  summary: Gem for talking to the Lyris API
85
87
  test_files:
88
+ - test/content_test.rb
86
89
  - test/list_test.rb
87
90
  - test/lmapiClient.rb
88
91
  - test/mailing_test.rb