postal 0.2.3 → 0.3.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.
@@ -7,9 +7,13 @@ module Postal
7
7
  unless args.find { |arg| arg.match(/ListName/) }
8
8
  args << "ListName=#{Postal.options[:list_name]}"
9
9
  end
10
- if soap_members = Postal.driver.selectMembers(args)
11
- return parse_members(soap_members)
12
- else
10
+ begin
11
+ if soap_members = Postal.driver.selectMembers(args)
12
+ return parse_members(soap_members)
13
+ else
14
+ return nil
15
+ end
16
+ rescue
13
17
  return nil
14
18
  end
15
19
  end
@@ -45,7 +49,7 @@ module Postal
45
49
  begin
46
50
  return find_by_filter("EmailAddress=#{email}")
47
51
  # return Postal.driver.getMemberID(Postal::Lmapi::SimpleMemberStruct.new(list_name,member_id,email))
48
- rescue SOAP::FaultError
52
+ rescue Savon::SOAP::Fault => soap_fault
49
53
  return nil
50
54
  end
51
55
  end
@@ -70,19 +74,28 @@ module Postal
70
74
  end
71
75
  end
72
76
 
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)
77
+ def parse_members(return_hash)
78
+ case return_hash[:item]
79
+ when Hash
80
+ member = build_member_from_hash(return_hash[:item])
81
+ when Array
82
+ members = return_hash[:item].each do |member|
83
+ build_member_from_hash(member)
84
+ end
78
85
  end
79
- if members.size == 1
80
- return members.first
86
+ if member
87
+ return member
81
88
  else
82
89
  return members
83
90
  end
84
91
  end
85
92
 
93
+ def build_member_from_hash(member_hash)
94
+ demographics = {}
95
+ member_hash[:demographics][:item].each { |demo| demographics.merge!({ demo[:name].to_sym => demo[:value] }) }
96
+ Member.new(:email => member_hash[:email_address], :name => member_hash[:full_name], :id => member_hash[:member_id], :list_name => member_hash[:list_name], :demographics => demographics)
97
+ end
98
+
86
99
  end
87
100
 
88
101
  DEFAULT_ATTRIBUTES = { :id => nil, :email => nil, :name => nil, :list_name => nil, :demographics => {} }
@@ -109,7 +122,7 @@ module Postal
109
122
  @id = Postal.driver.createSingleMember(@email, @name, list_name)
110
123
  update_attributes(@demographics) unless @demographics.empty?
111
124
  return @id
112
- rescue SOAP::FaultError
125
+ rescue Savon::SOAP::Fault
113
126
  return false
114
127
  end
115
128
  end
@@ -123,14 +136,19 @@ module Postal
123
136
  raise Postal::CouldNotCreateMember, 'Could not create a new member. The most likely cause is that the specified list already contains this email address.'
124
137
  end
125
138
  end
139
+
140
+
141
+ def unsubscribe
142
+ list_name = @list_name
143
+ return Postal.driver.unsubscribe(list_name, @id, @email)
144
+ end
126
145
 
127
146
 
128
147
  # Update the demographics for a user
129
148
  def update_attributes(attributes={})
130
149
  list_name = @list_name
131
- demos = attributes.collect { |key,value| Postal::Lmapi::KeyValueType.new(value,key.to_s) }
132
- member = Postal::Lmapi::SimpleMemberStruct.new(list_name, @id, @email)
133
- return Postal.driver.updateMemberDemographics(member,demos)
150
+ demos = attributes.collect { |key,value| {'Name' => key, 'Value' => value} }
151
+ return Postal.driver.updateMemberDemographics(list_name, @id, @email, demos)
134
152
  end
135
153
 
136
154
 
@@ -0,0 +1,3 @@
1
+ module Postal
2
+ VERSION = "0.3.0"
3
+ end
@@ -1,11 +1,32 @@
1
- # Generated by jeweler
2
- # DO NOT EDIT THIS FILE
3
- # Instead, edit Jeweler::Tasks in Rakefile, and run `rake gemspec`
4
1
  # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "postal/version"
5
4
 
5
+ Gem::Specification.new do |s|
6
+ s.name = "postal"
7
+ s.version = Postal::VERSION
8
+ s.platform = Gem::Platform::RUBY
9
+ s.authors = ['The Active Network']
10
+ s.email = ['']
11
+ s.homepage = ""
12
+ s.summary = %q{Lyris is an enterprise email service. Postal makes it easy for Ruby to talk to Lyris's API.}
13
+ s.description = %q{Lyris is an enterprise email service. Postal makes it easy for Ruby to talk to Lyris's API.}
14
+
15
+ s.rubyforge_project = "postal"
16
+
17
+ s.files = `git ls-files`.split("\n")
18
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
19
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
20
+ s.require_paths = ["lib"]
21
+
22
+ s.add_dependency('savon', '=0.9.7')
23
+ end
24
+
25
+
26
+ =begin
6
27
  Gem::Specification.new do |s|
7
28
  s.name = %q{postal}
8
- s.version = "0.2.3"
29
+ s.version = "0.3.0"
9
30
 
10
31
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
32
  s.authors = ["The Active Network"]
@@ -57,16 +78,6 @@ Gem::Specification.new do |s|
57
78
  "test/test_helper.rb"
58
79
  ]
59
80
 
60
- if s.respond_to? :specification_version then
61
- current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
62
- s.specification_version = 3
63
-
64
- if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
65
- s.add_runtime_dependency(%q<soap4r>, [">= 1.5.8"])
66
- else
67
- s.add_dependency(%q<soap4r>, [">= 1.5.8"])
68
- end
69
- else
70
- s.add_dependency(%q<soap4r>, [">= 1.5.8"])
71
- end
72
81
  end
82
+ =end
83
+
@@ -6,8 +6,8 @@ class ContentTest < Test::Unit::TestCase
6
6
 
7
7
  def setup
8
8
  load_config
9
- Postal.options[:list_name] = 'active-casting'
10
- Postal.options[:proxy] = "http://localhost:8888/"
9
+ #Postal.options[:list_name] = 'active-casting'
10
+ #Postal.options[:proxy] = "http://localhost:8888/"
11
11
  end
12
12
 
13
13
  def test_selecting_all_content
@@ -1,4 +1,4 @@
1
- require 'test_helper'
1
+ require_relative 'test_helper'
2
2
 
3
3
  class ListTest < Test::Unit::TestCase
4
4
 
@@ -6,7 +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
+ #Postal.options[:proxy] = "http://localhost:8888/"
10
10
  end
11
11
 
12
12
  def test_can_send_valid_mailing
@@ -1,4 +1,4 @@
1
- require 'test_helper'
1
+ require './test_helper'
2
2
 
3
3
  class MemberTest < Test::Unit::TestCase
4
4
 
@@ -12,14 +12,15 @@ class MemberTest < Test::Unit::TestCase
12
12
  delete_test_members
13
13
  end
14
14
 
15
+ =begin
15
16
  # members
16
17
  def test_can_create_member
17
18
  assert Postal::Member.new(:email => "john.doe#{rand(1000000)}@anonymous.com", :name => "John Doe").save
18
19
  assert Postal::Member.new(:email => "john.doe#{rand(1000000)}@anonymous.com", :name => "John Doe").save!
19
- assert Postal::Member.new(:email => "john.doe#{rand(1000000)}@anonymous.com").save # create member with no name
20
- assert Postal::Member.new(:email => "john.doe#{rand(1000000)}@anonymous.com").save! # create member with no name
20
+ assert Postal::Member.new(:email => "john.doe#{rand(1000000)}@anonymous.com").save # create member with no name
21
+ assert Postal::Member.new(:email => "john.doe#{rand(1000000)}@anonymous.com").save! # create member with
21
22
  end
22
-
23
+
23
24
  def test_can_create_member_with_explicit_list
24
25
  assert Postal::Member.new(:email => "john.doe#{rand(1000000)}@anonymous.com", :name => "John Doe", :list_name => @config['list_name']).save
25
26
  end
@@ -58,7 +59,14 @@ class MemberTest < Test::Unit::TestCase
58
59
  assert Postal::Member.find(new_member.email)
59
60
  assert Postal::Member.find(new_member.email, @config['list_name']) # with explicit list_name
60
61
  end
62
+ =end
63
+
64
+ def test_can_unsubscribe_member
65
+ new_member = Postal::Member.create(:email => "john.doe#{rand(1000000)}@anonymous.com", :name => "John Doe")
66
+ assert new_member.unsubscribe
67
+ end
61
68
 
69
+ =begin
62
70
  def test_can_find_member_by_filters
63
71
  Postal::Member.create(:email => "john.doe#{rand(1000000)}@anonymous.com", :name => "John Doe")
64
72
  Postal::Member.create(:email => "john.doe#{rand(1000000)}@anonymous.com", :name => "John Doe 2")
@@ -93,5 +101,5 @@ class MemberTest < Test::Unit::TestCase
93
101
  assert member.update_attributes(:field_0 => 'Baseball')
94
102
  assert_equal Postal::Member.find(new_member.email).demographics[:field_0], 'Baseball'
95
103
  end
96
-
104
+ =end
97
105
  end
@@ -1,9 +1,8 @@
1
1
  require 'rubygems'
2
2
  require 'test/unit'
3
- # require 'shoulda'
4
3
 
5
4
  $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
6
- $LOAD_PATH.unshift(File.dirname(__FILE__))
5
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'test'))
7
6
  require 'postal'
8
7
 
9
8
  class Test::Unit::TestCase
metadata CHANGED
@@ -1,52 +1,51 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: postal
3
- version: !ruby/object:Gem::Version
4
- version: 0.2.3
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.3.0
5
+ prerelease:
5
6
  platform: ruby
6
- authors:
7
+ authors:
7
8
  - The Active Network
8
9
  autorequire:
9
10
  bindir: bin
10
11
  cert_chain: []
11
-
12
- date: 2010-01-29 00:00:00 -08:00
13
- default_executable:
14
- dependencies:
15
- - !ruby/object:Gem::Dependency
16
- name: soap4r
12
+ date: 2012-02-09 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: savon
16
+ requirement: &70139391646780 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - =
20
+ - !ruby/object:Gem::Version
21
+ version: 0.9.7
17
22
  type: :runtime
18
- version_requirement:
19
- version_requirements: !ruby/object:Gem::Requirement
20
- requirements:
21
- - - ">="
22
- - !ruby/object:Gem::Version
23
- version: 1.5.8
24
- version:
25
- description: Lyris is an enterprise email service. Postal makes it easy for Ruby to talk to Lyris's API.
26
- email: rob.cameron@active.com
23
+ prerelease: false
24
+ version_requirements: *70139391646780
25
+ description: Lyris is an enterprise email service. Postal makes it easy for Ruby to
26
+ talk to Lyris's API.
27
+ email:
28
+ - ''
27
29
  executables: []
28
-
29
30
  extensions: []
30
-
31
- extra_rdoc_files:
32
- - LICENSE
33
- - README.rdoc
34
- files:
31
+ extra_rdoc_files: []
32
+ files:
35
33
  - .document
36
34
  - .gitignore
35
+ - Gemfile
36
+ - Gemfile.lock
37
37
  - LICENSE
38
- - README.rdoc
38
+ - README.md
39
39
  - Rakefile
40
40
  - VERSION
41
41
  - lib/postal.rb
42
42
  - lib/postal/base.rb
43
43
  - lib/postal/content.rb
44
+ - lib/postal/driver.rb
44
45
  - lib/postal/list.rb
45
- - lib/postal/lmapi/lmapi.rb
46
- - lib/postal/lmapi/lmapi_driver.rb
47
- - lib/postal/lmapi/lmapi_mapping_registry.rb
48
46
  - lib/postal/mailing.rb
49
47
  - lib/postal/member.rb
48
+ - lib/postal/version.rb
50
49
  - postal.gemspec
51
50
  - test/content_test.rb
52
51
  - test/list_test.rb
@@ -56,38 +55,36 @@ files:
56
55
  - test/member_test.rb
57
56
  - test/postal_suite.rb
58
57
  - test/test_helper.rb
59
- has_rdoc: true
60
- homepage: http://github.com/activenetwork/postal
58
+ homepage: ''
61
59
  licenses: []
62
-
63
60
  post_install_message:
64
- rdoc_options:
65
- - --charset=UTF-8
66
- require_paths:
61
+ rdoc_options: []
62
+ require_paths:
67
63
  - lib
68
- required_ruby_version: !ruby/object:Gem::Requirement
69
- requirements:
70
- - - ">="
71
- - !ruby/object:Gem::Version
72
- version: "0"
73
- version:
74
- required_rubygems_version: !ruby/object:Gem::Requirement
75
- requirements:
76
- - - ">="
77
- - !ruby/object:Gem::Version
78
- version: "0"
79
- version:
64
+ required_ruby_version: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ! '>='
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ required_rubygems_version: !ruby/object:Gem::Requirement
71
+ none: false
72
+ requirements:
73
+ - - ! '>='
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
80
76
  requirements: []
81
-
82
- rubyforge_project:
83
- rubygems_version: 1.3.5
77
+ rubyforge_project: postal
78
+ rubygems_version: 1.8.10
84
79
  signing_key:
85
80
  specification_version: 3
86
- summary: Gem for talking to the Lyris API
87
- test_files:
81
+ summary: Lyris is an enterprise email service. Postal makes it easy for Ruby to talk
82
+ to Lyris's API.
83
+ test_files:
88
84
  - test/content_test.rb
89
85
  - test/list_test.rb
90
86
  - test/lmapiClient.rb
87
+ - test/lyris_sample.yml
91
88
  - test/mailing_test.rb
92
89
  - test/member_test.rb
93
90
  - test/postal_suite.rb
@@ -1,108 +0,0 @@
1
- == Introduction
2
-
3
- Postal is a gem for working with the Lyris API. "But the Lyris API is just a SOAP service, why
4
- don't I use something like Soap4r?" Well you could, but it wouldn't be very pretty. When the
5
- interface is created all properties passed to a method are required and always in a certain order.
6
-
7
- Postal does use the Soap4r interface behind the scenes but gives you a simple ActiveRecord-like
8
- interface for search and adding records.
9
-
10
- == Installation
11
-
12
- Get the gem:
13
-
14
- gem sources -a http://gems.github.com
15
- sudo gem install cannikin-postal
16
-
17
- Then to use just add the require to your script:
18
-
19
- require 'rubygems'
20
- require 'postal'
21
-
22
- == Usage
23
-
24
- Postal feels a lot like using ActiveRecord. You create/save new Members, find existing ones, etc.
25
- All of the examples below assume you've already set up Postal with your username, password and WSDL
26
- endpoint, and optionally the name of the list that all operations should use:
27
-
28
- Postal.options[:wsdl] = 'http://mymailserver.com:82/?wsdl'
29
- Postal.options[:username] = 'username'
30
- Postal.options[:password] = 'password'
31
- Postal.options[:list_name] = 'my-test-list'
32
-
33
- If you don't set your list name in the options you can pass it in with each method call.
34
-
35
- See the /test directory for examples of just about everything you can do with Postal.
36
-
37
- === Lists
38
-
39
- # find a list based on its name
40
- Postal::List.find('my-list-name')
41
-
42
- === Members
43
-
44
- # add a member to a list (the list saved to Postal.options)
45
- new_member = Postal::Member.new(:email => "john.doe@anonymous.com", :name => "John Doe")
46
- id = new_member.save
47
- # id => 1234567 (the new member_id in Lyris)
48
-
49
- # add a member to a specific list and save in one call (both lines are equivalent)
50
- Postal::Member.new(:email => "john.doe@anonymous.com", :name => "John Doe", :list_name => "new-list").save
51
- Postal::Member.create(:email => "john.doe@anonymous.com", :name => "John Doe", :list_name => "new-list")
52
-
53
- Postal also has a `save!` method that throws an error if the person can't be saved, rather than just
54
- returning false.
55
-
56
- # update a member's demographics
57
- new_member = Postal::Member.new(:email => "john.doe@anonymous.com", :name => "John Doe")
58
- new_member.save
59
- new_member.update_attributes(:field_0 => 'Male')
60
-
61
- # find a member's id based on an email address
62
- Postal::Member.find('john.doe@anonymous.com')
63
-
64
- # find a member based on member_id
65
- Postal::Member.find(1234567)
66
-
67
- # find a member based on Lyris "filters" (see Lyris API docs for syntax)
68
- Postal::Member.find_by_filter('EmailAddress like john.doe%')
69
-
70
- # delete member(s) based on filters
71
- Postal::Member.destroy("EmailAddress like john.doe-delete%")
72
-
73
- === Mailings
74
-
75
- # directly send an email to an array of email addresses
76
- mail = Postal::Mailing.new( :to => ['john.doe@anonymous.com','jane.doe@anonymous.com'],
77
- :html_message => "<p>Test from Postal at #{Time.now.to_s}</p>",
78
- :text_message => 'Test test from Postal at #{Time.now.to_s}',
79
- :from => 'Postmaster <postmaster@company.com>',
80
- :subject => 'Test from Postal')
81
- mail.valid?
82
- mail.send
83
-
84
- Mailings require a couple things to be valid, mainly someone to send to, a subject, and
85
- the name of a list to send to. `mail.valid?` will return false if any of these do not exist.
86
-
87
- == To Do
88
-
89
- * Implement wrappers for remaining Lyris methods
90
-
91
- == Thanks
92
-
93
- Special thanks to this article: http://markthomas.org/2007/09/12/getting-started-with-soap4r/
94
- Mark details how to use Soap4r (for which there is very little documentation in the world) and
95
- his example includes talking to Lyris! Postal probably couldn't have happened without his article.
96
-
97
- == Note on Patches/Pull Requests
98
-
99
- * Fork the project.
100
- * Make your feature addition or bug fix.
101
- * Add tests for it. This is important so I don't break it in a
102
- future version unintentionally.
103
- * Commit, do not mess with rakefile, version, or history. (if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull)
104
- * Send me a pull request. Bonus points for topic branches.
105
-
106
- == Copyright
107
-
108
- Copyright (c) 2009 Rob Cameron. See LICENSE for details.