hominid 1.2.1 → 2.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/.gitignore +4 -0
- data/{MIT-LICENSE → LICENSE} +1 -1
- data/README.textile +125 -40
- data/Rakefile +45 -16
- data/VERSION +1 -0
- data/hominid.gemspec +26 -19
- data/hominid.yml.tpl +1 -0
- data/lib/hominid.rb +33 -244
- data/lib/hominid/base.rb +85 -0
- data/lib/hominid/campaign.rb +172 -0
- data/lib/hominid/helper.rb +45 -0
- data/lib/hominid/list.rb +150 -0
- data/lib/hominid/webhook.rb +131 -0
- data/tasks/rails/hominid.rake +22 -0
- data/test/hominid_test.rb +7 -0
- data/test/test_helper.rb +10 -0
- metadata +30 -17
- data/VERSION.yml +0 -4
- data/init.rb +0 -1
- data/install.rb +0 -4
- data/pkg/hominid-1.2.1.gem +0 -0
- data/rails/init.rb +0 -1
- data/spec/hominid_spec.rb +0 -29
- data/spec/spec_helper.rb +0 -3
- data/uninstall.rb +0 -1
data/.gitignore
ADDED
data/{MIT-LICENSE → LICENSE}
RENAMED
data/README.textile
CHANGED
@@ -1,76 +1,161 @@
|
|
1
1
|
h1. Hominid
|
2
2
|
|
3
|
-
Hominid is a Ruby gem for interacting with the "Mailchimp API":http://www.mailchimp.com/api/1.2
|
3
|
+
Hominid is a Ruby gem that provides a wrapper for interacting with the "Mailchimp":http://www.mailchimp.com email marketing service API ("version 1.2":http://www.mailchimp.com/api/1.2/).
|
4
4
|
|
5
5
|
h2. Installation
|
6
6
|
|
7
|
-
|
7
|
+
<pre><code>sudo gem install hominid, :version => '>= 2.0.0', :source => "http://gemcutter.org"</code></pre>
|
8
8
|
|
9
|
-
|
9
|
+
Hominid is hosted at "Gemcutter":http://gemcutter.org. Be sure that you have the Gemcutter gem installed if you are having trouble installing Hominid:
|
10
10
|
|
11
|
-
|
11
|
+
<pre><code>sudo gem install gemcutter
|
12
|
+
gem tumble</code></pre>
|
12
13
|
|
13
|
-
|
14
|
+
h2. Configuration
|
14
15
|
|
15
|
-
You
|
16
|
+
You will need to create a "Mailchimp":http://www.mailchimp.com/signup account and get your API key (available at http://admin.mailchimp.com/account/api/) in order to get started.
|
16
17
|
|
17
|
-
|
18
|
+
If you are using Hominid inside a Rails application, you can create a config file at @/config/hominid.yml@ with your Mailchimp account information and basic configuration options:
|
18
19
|
|
19
|
-
|
20
|
+
<pre><code>development:
|
21
|
+
username: USERNAME
|
22
|
+
password: PASSWORD
|
23
|
+
api_key: API KEY
|
24
|
+
send_goodbye: false
|
25
|
+
send_notify: false
|
26
|
+
double_opt: false
|
20
27
|
|
21
|
-
|
28
|
+
...</code></pre>
|
22
29
|
|
23
|
-
|
30
|
+
Run @rake hominid:config@ from within a Rails app to create an empty config file.
|
31
|
+
Note: You will need to <pre><code>require 'hominid'</code></pre> in your @Rakefile@ to make this rake task available to your application.
|
24
32
|
|
25
|
-
h2.
|
33
|
+
h2. Usage
|
26
34
|
|
27
|
-
|
35
|
+
Not all API methods are supported (yet). Currently there are classes for working with lists (_Hominid::List_), campaigns (_Hominid::Campaign_) and accessing the helper methods (_Hominid::Helper_).
|
28
36
|
|
29
|
-
|
37
|
+
h3. Working with Lists
|
30
38
|
|
31
|
-
|
39
|
+
The _Hominid::List_ class is available for working finding lists and working with particular lists. See _Hominid::List_ for more information.
|
32
40
|
|
33
|
-
|
41
|
+
h4. List Finder Methods
|
34
42
|
|
35
|
-
|
43
|
+
There are finder methods for working with lists. Refer to _Hominid::List_ to see the other finders availables.
|
36
44
|
|
37
|
-
<pre><code>
|
38
|
-
def find_list_id(list_name)
|
39
|
-
mailing_lists = @hominid.lists
|
40
|
-
unless mailing_lists.nil?
|
41
|
-
@list_id = mailing_lists.find {|list| list["name"] == list_name}["id"]
|
42
|
-
end
|
43
|
-
end
|
44
|
-
</code></pre>
|
45
|
+
<pre><code>lists = Hominid::List.all</code></pre>
|
45
46
|
|
46
|
-
|
47
|
+
<pre><code>list = Hominid::List.find_by_name("List Name")</code></pre>
|
47
48
|
|
48
|
-
<pre><code
|
49
|
+
<pre><code>list = Hominid::List.find(id_or_web_id)</code></pre>
|
49
50
|
|
50
|
-
|
51
|
+
h4. Subscribing
|
51
52
|
|
52
|
-
|
53
|
+
To subscribe a person or persons to a Mailchimp list:
|
53
54
|
|
54
|
-
|
55
|
+
<pre><code>list.subscribe("sample@emailaddress.com")</code></pre>
|
55
56
|
|
56
|
-
<pre><code
|
57
|
+
<pre><code>list.subscribe_many([{:EMAIL => 'sample@emailaddress.com', :EMAIL_TYPE => 'html'}, {:EMAIL => 'another@emailaddress.com', :EMAIL_TYPE => 'html'}])</code></pre>
|
57
58
|
|
58
|
-
|
59
|
+
h4. Unsubscribing
|
59
60
|
|
60
|
-
|
61
|
+
To unsubscribe a person or persons from a Mailchimp list:
|
61
62
|
|
62
|
-
|
63
|
+
<pre><code>list.unsubscribe("sample@emailaddress.com")</code></pre>
|
63
64
|
|
64
|
-
<pre><code
|
65
|
+
<pre><code>list.unsubscribe_many(['sample@emailaddress.com', 'another@emailaddress.com'])</code></pre>
|
65
66
|
|
66
|
-
|
67
|
+
h4. Updating
|
67
68
|
|
68
|
-
|
69
|
+
In the following example, we will be changing a person's email address on the Mailchimp list from @sample@ to @another@:
|
69
70
|
|
70
|
-
|
71
|
+
<pre><code>list.update_member('sample@emailaddress.com', {:EMAIL => 'another@emailaddress.com'}, 'html')</code></pre>
|
71
72
|
|
72
|
-
|
73
|
+
You can also updated other attributes by including the MERGE_VARS that you want to change, such as @EMAIL@, @FNAME@, @LNAME@ and @INTERESTS@. Get a list of merge tags for a particular list by running @list.merge_tags@.
|
73
74
|
|
74
|
-
|
75
|
+
h3. Working with Campaigns
|
76
|
+
|
77
|
+
The _Hominid::Campaign_ class provides methods for working with a campaigns.
|
78
|
+
|
79
|
+
h4. Campaign Finder Methods
|
80
|
+
|
81
|
+
There are finder methods for campaigns as well. Refer to _Hominid::Campaign_ to see the other finders available.
|
82
|
+
|
83
|
+
<pre><code>campaigns = Hominid::Campaign.all</code></pre>
|
84
|
+
|
85
|
+
<pre><code>campaigns = Hominid::Campaign.find_by_list_name("List Name")</code></pre>
|
86
|
+
|
87
|
+
h4. Creating a Campaign
|
88
|
+
|
89
|
+
You can create new campaigns using Hominid as well. Please refer to the documentation in _Hominid::Base_ for more information about the options available when creating a new campaign.
|
90
|
+
|
91
|
+
<pre><code>new_campaign = Hominid::Campaign.create('regular', options, content, segment_opts, type_opts)</code></pre>
|
92
|
+
|
93
|
+
h4. Schedule a Campaign
|
94
|
+
|
95
|
+
As an example of how to work with a particular campaign, use the _Hominid::Campaign_ class. Extending from the previous example, since the _#create_campaign_ method returns the ID of the created campaign, we can use it to instantiate the _Hominid::Campaign_ class and schedule our new campaign to go be delivered 2 days from now:
|
96
|
+
|
97
|
+
<pre><code>campaign = Hominid::Campaign.new(:id => new_campaign)</code></pre>
|
98
|
+
|
99
|
+
<pre><code>campaign.schedule_campaign(2.days.from_now)</code></pre>
|
100
|
+
|
101
|
+
h3. Helper Methods
|
102
|
+
|
103
|
+
The _Hominid::Helper_ class provides a way to access the helper methods for the Mailchimp API. For example, to create a new folder for filing campaigns:
|
104
|
+
|
105
|
+
<pre><code>folder = Hominid::Helper.create_folder("Folder Name")</code></pre>
|
106
|
+
|
107
|
+
h2. Syncing Your Application
|
108
|
+
|
109
|
+
If you are integrating an application with Mailchimp, Hominid will provide a way for your app to connect with your Mailchimp account. However, it does not provide a way for Mailchimp to connect to your application, which is why Mailchimp has implemented "web hooks":http://www.mailchimp.com/api/webhooks/.
|
110
|
+
|
111
|
+
The _Hominid::Webhook class helps with receiving <tt>POST</tt> data from a Mailchimp webhook:
|
112
|
+
|
113
|
+
<pre><code>hook = Hominid::Webhook.new(params)
|
114
|
+
case hook.event
|
115
|
+
when "subscribe"
|
116
|
+
user = User.find_by_email(hook.email)
|
117
|
+
user.opted_in = true
|
118
|
+
user.save
|
119
|
+
when "unsubscribe"
|
120
|
+
user = User.find_by_email(hook.email)
|
121
|
+
user.opted_in = false
|
122
|
+
user.save
|
123
|
+
when "profile"
|
124
|
+
user = User.find_by_email(hook.email)
|
125
|
+
user.first_name = hook.first_name
|
126
|
+
user.last_name = hook.last_name
|
127
|
+
user.email_type = hook.email_type
|
128
|
+
user.save
|
129
|
+
when "upemail"
|
130
|
+
user = User.find_by_email(hook.old_email)
|
131
|
+
user.email = hook.new_email
|
132
|
+
user.save
|
133
|
+
end</code></pre>
|
134
|
+
|
135
|
+
h2. Contributors
|
136
|
+
|
137
|
+
Hominid is maintained by "Brian Getting":http://terra-firma-design.com. A very special thank-you to "Michael Strüder":http://github.com/mikezter for all of his hard work. Also, Hominid wouldn't be anywhere near as awesome as it is today without fantastic contributions and inspiration from:
|
138
|
+
|
139
|
+
* "Alan Harper":http://github.com/aussiegeek
|
140
|
+
* "Will":http://github.com/willinfront
|
141
|
+
* "Ben Woosley":http://github.com/Empact
|
142
|
+
* "banker":http://github.com/banker
|
143
|
+
* "Kristoffer Renholm":http://github.com/renholm
|
144
|
+
* "Wiktor Schmidt":http://github.com/netguru
|
145
|
+
* "ron":http://github.com/ron
|
146
|
+
* "Matthew Carlson":http://mandarinsoda.com/
|
147
|
+
* "Kelly Mahan":http://digimedia.com/
|
148
|
+
* "C.G. Brown":http://www.projectlocker.com/
|
149
|
+
|
150
|
+
h2. Note on Patches/Pull Requests
|
151
|
+
|
152
|
+
# Fork the project.
|
153
|
+
# Make your feature addition or bug fix.
|
154
|
+
# Add tests for it. This is important so I don't break it in a future version unintentionally.
|
155
|
+
# 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)
|
156
|
+
# Send me a pull request. Bonus points for topic branches.
|
157
|
+
|
158
|
+
h2. Copyright
|
159
|
+
|
160
|
+
Copyright (c) 2009 Brian Getting. See LICENSE for details.
|
75
161
|
|
76
|
-
Copyright (c) 2009 Brian Getting, released under the MIT license.
|
data/Rakefile
CHANGED
@@ -1,28 +1,57 @@
|
|
1
|
+
require 'rubygems'
|
1
2
|
require 'rake'
|
2
|
-
require 'rake/rdoctask'
|
3
3
|
|
4
4
|
begin
|
5
5
|
require 'jeweler'
|
6
|
-
Jeweler::Tasks.new do |
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
6
|
+
Jeweler::Tasks.new do |gem|
|
7
|
+
gem.name = "hominid"
|
8
|
+
gem.summary = %Q{Hominid is a Ruby gem for interacting with the Mailchimp API.}
|
9
|
+
gem.description = %Q{Hominid is a Ruby gem that provides a wrapper for interacting with the Mailchimp email marketing service API.}
|
10
|
+
gem.email = "brian@terra-firma-design.com"
|
11
|
+
gem.homepage = "http://github.com/bgetting/hominid"
|
12
|
+
gem.authors = ["Brian Getting", "Michael Strüder"]
|
13
|
+
gem.add_development_dependency "shoulda"
|
13
14
|
end
|
14
|
-
|
15
15
|
Jeweler::GemcutterTasks.new
|
16
|
-
|
17
16
|
rescue LoadError
|
18
|
-
puts "Jeweler not available. Install it with: sudo gem install
|
17
|
+
puts "Jeweler (or a dependency) not available. Install it with: sudo gem install jeweler"
|
18
|
+
end
|
19
|
+
|
20
|
+
require 'rake/testtask'
|
21
|
+
Rake::TestTask.new(:test) do |test|
|
22
|
+
test.libs << 'lib' << 'test'
|
23
|
+
test.pattern = 'test/**/*_test.rb'
|
24
|
+
test.verbose = true
|
19
25
|
end
|
20
26
|
|
21
|
-
|
22
|
-
|
27
|
+
begin
|
28
|
+
require 'rcov/rcovtask'
|
29
|
+
Rcov::RcovTask.new do |test|
|
30
|
+
test.libs << 'test'
|
31
|
+
test.pattern = 'test/**/*_test.rb'
|
32
|
+
test.verbose = true
|
33
|
+
end
|
34
|
+
rescue LoadError
|
35
|
+
task :rcov do
|
36
|
+
abort "RCov is not available. In order to run rcov, you must: sudo gem install spicycode-rcov"
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
task :test => :check_dependencies
|
41
|
+
|
42
|
+
task :default => :test
|
43
|
+
|
44
|
+
require 'rake/rdoctask'
|
45
|
+
Rake::RDocTask.new do |rdoc|
|
46
|
+
if File.exist?('VERSION')
|
47
|
+
version = File.read('VERSION')
|
48
|
+
else
|
49
|
+
version = ""
|
50
|
+
end
|
51
|
+
|
23
52
|
rdoc.rdoc_dir = 'rdoc'
|
24
|
-
rdoc.title
|
25
|
-
rdoc.
|
26
|
-
rdoc.rdoc_files.include('README')
|
53
|
+
rdoc.title = "hominid #{version}"
|
54
|
+
rdoc.rdoc_files.include('README*')
|
27
55
|
rdoc.rdoc_files.include('lib/**/*.rb')
|
28
56
|
end
|
57
|
+
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
2.0.0
|
data/hominid.gemspec
CHANGED
@@ -1,44 +1,47 @@
|
|
1
1
|
# Generated by jeweler
|
2
|
-
# DO NOT EDIT THIS FILE
|
3
|
-
# Instead, edit Jeweler::Tasks in Rakefile, and run
|
2
|
+
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
|
4
4
|
# -*- encoding: utf-8 -*-
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{hominid}
|
8
|
-
s.version = "
|
8
|
+
s.version = "2.0.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
-
s.authors = ["Brian Getting"]
|
12
|
-
s.date = %q{2009-10-
|
13
|
-
s.description = %q{
|
11
|
+
s.authors = ["Brian Getting", "Michael Str\303\274der"]
|
12
|
+
s.date = %q{2009-10-30}
|
13
|
+
s.description = %q{Hominid is a Ruby gem that provides a wrapper for interacting with the Mailchimp email marketing service API.}
|
14
14
|
s.email = %q{brian@terra-firma-design.com}
|
15
15
|
s.extra_rdoc_files = [
|
16
|
-
"
|
16
|
+
"LICENSE",
|
17
|
+
"README.textile"
|
17
18
|
]
|
18
19
|
s.files = [
|
19
|
-
"
|
20
|
+
".gitignore",
|
21
|
+
"LICENSE",
|
20
22
|
"README.textile",
|
21
23
|
"Rakefile",
|
22
|
-
"VERSION
|
24
|
+
"VERSION",
|
23
25
|
"hominid.gemspec",
|
24
26
|
"hominid.yml.tpl",
|
25
|
-
"init.rb",
|
26
|
-
"install.rb",
|
27
27
|
"lib/hominid.rb",
|
28
|
-
"
|
29
|
-
"
|
30
|
-
"
|
31
|
-
"
|
32
|
-
"
|
28
|
+
"lib/hominid/base.rb",
|
29
|
+
"lib/hominid/campaign.rb",
|
30
|
+
"lib/hominid/helper.rb",
|
31
|
+
"lib/hominid/list.rb",
|
32
|
+
"lib/hominid/webhook.rb",
|
33
|
+
"tasks/rails/hominid.rake",
|
34
|
+
"test/hominid_test.rb",
|
35
|
+
"test/test_helper.rb"
|
33
36
|
]
|
34
|
-
s.homepage = %q{http://
|
37
|
+
s.homepage = %q{http://github.com/bgetting/hominid}
|
35
38
|
s.rdoc_options = ["--charset=UTF-8"]
|
36
39
|
s.require_paths = ["lib"]
|
37
40
|
s.rubygems_version = %q{1.3.5}
|
38
41
|
s.summary = %q{Hominid is a Ruby gem for interacting with the Mailchimp API.}
|
39
42
|
s.test_files = [
|
40
|
-
"
|
41
|
-
"
|
43
|
+
"test/hominid_test.rb",
|
44
|
+
"test/test_helper.rb"
|
42
45
|
]
|
43
46
|
|
44
47
|
if s.respond_to? :specification_version then
|
@@ -46,8 +49,12 @@ Gem::Specification.new do |s|
|
|
46
49
|
s.specification_version = 3
|
47
50
|
|
48
51
|
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
52
|
+
s.add_development_dependency(%q<shoulda>, [">= 0"])
|
49
53
|
else
|
54
|
+
s.add_dependency(%q<shoulda>, [">= 0"])
|
50
55
|
end
|
51
56
|
else
|
57
|
+
s.add_dependency(%q<shoulda>, [">= 0"])
|
52
58
|
end
|
53
59
|
end
|
60
|
+
|
data/hominid.yml.tpl
CHANGED
data/lib/hominid.rb
CHANGED
@@ -1,265 +1,54 @@
|
|
1
1
|
require 'xmlrpc/client'
|
2
|
+
require 'ostruct'
|
2
3
|
|
3
|
-
|
4
|
-
def initialize(message)
|
5
|
-
super(message)
|
6
|
-
end
|
7
|
-
end
|
4
|
+
module Hominid
|
8
5
|
|
9
|
-
class
|
10
|
-
def initialize(message)
|
11
|
-
super(message)
|
6
|
+
class StandardError < ::StandardError
|
12
7
|
end
|
13
|
-
end
|
14
8
|
|
15
|
-
class
|
16
|
-
|
17
|
-
|
18
|
-
MAILCHIMP_API = "http://api.mailchimp.com/1.2/"
|
19
|
-
|
20
|
-
def initialize(config = {})
|
21
|
-
if defined?(RAILS_ROOT) && (!config || config.empty?)
|
22
|
-
config = YAML.load(File.open("#{RAILS_ROOT}/config/hominid.yml"))[RAILS_ENV].symbolize_keys
|
9
|
+
class APIError < StandardError
|
10
|
+
def initialize(error)
|
11
|
+
super("<#{error.faultCode}> #{error.message}")
|
23
12
|
end
|
24
|
-
config.merge(:username => config[:username].to_s, :password => config[:password].to_s)
|
25
|
-
defaults = {:send_welcome => false, :double_opt_in => false, :update_existing => true, :replace_interests => true, :user_info => {}}
|
26
|
-
@config = defaults.merge(config).freeze
|
27
|
-
@chimpApi = XMLRPC::Client.new2(MAILCHIMP_API)
|
28
13
|
end
|
29
14
|
|
30
|
-
|
31
|
-
|
32
|
-
def add_api_key
|
33
|
-
@chimpApi.call("apikeyAdd", *@config.values_at(:username, :password, :api_key))
|
34
|
-
end
|
35
|
-
|
36
|
-
def expire_api_key
|
37
|
-
@chimpApi.call("apikeyExpire", *@config.values_at(:username, :password, :api_key))
|
38
|
-
end
|
39
|
-
|
40
|
-
def api_keys(include_expired = false)
|
41
|
-
username, password = *@config.values_at(:username, :password)
|
42
|
-
@chimpApi.call("apikeys", username, password, include_expired)
|
43
|
-
end
|
44
|
-
|
45
|
-
## Campaign related methods
|
46
|
-
|
47
|
-
def campaign_stats(campaign_id)
|
48
|
-
# Get the stats of a campaign
|
49
|
-
call("campaignStats", campaign_id)
|
50
|
-
end
|
51
|
-
|
52
|
-
def campaign_content(campaign_id, for_archive = true)
|
53
|
-
# Get the content of a campaign
|
54
|
-
#
|
55
|
-
# for_archive controls whether we return the Archive version (true) or the Raw version (false), defaults to true
|
56
|
-
call("campaignContent", campaign_id, for_archive)
|
57
|
-
end
|
58
|
-
|
59
|
-
def campaigns(filters = {}, start = 0, limit = 50)
|
60
|
-
# Get the campaigns for this account
|
61
|
-
# API Version 1.2 requires that filters be sent as a hash
|
62
|
-
# Available options for the filters hash are:
|
63
|
-
#
|
64
|
-
# :campaign_id = (string) The ID of the campaign you wish to return.
|
65
|
-
# :list_id = (string) Show only campaigns with this list_id.
|
66
|
-
# :folder_id = (integer) Show only campaigns from this folder.
|
67
|
-
# :from_name = (string) Show only campaigns with this from_name.
|
68
|
-
# :from_email = (string) Show only campaigns with this from_email.
|
69
|
-
# :title = (string) Show only campaigns with this title.
|
70
|
-
# :subject = (string) Show only campaigns with this subject.
|
71
|
-
# :sedtime_start = (string) Show campaigns sent after YYYY-MM-DD HH:mm:ss.
|
72
|
-
# :sendtime_end = (string) Show campaigns sent before YYYY-MM-DD HH:mm:ss.
|
73
|
-
# :subject = (boolean) Filter by exact values, or search within content for filter values.
|
74
|
-
call("campaigns", filters, start, limit)
|
15
|
+
class ListError < APIError
|
75
16
|
end
|
76
17
|
|
77
|
-
|
78
|
-
# The order hash should be structured as follows:
|
79
|
-
#
|
80
|
-
# :id = (string) the order id
|
81
|
-
# :campaign_id = (string) the campaign id to track the order (mc_cid query string).
|
82
|
-
# :email_id = (string) email id of the subscriber (mc_eid query string)
|
83
|
-
# :total = (double) Show only campaigns with this from_name.
|
84
|
-
# :shipping = (string) *optional - the total paid for shipping fees.
|
85
|
-
# :tax = (string) *optional - the total tax paid.
|
86
|
-
# :store_id = (string) a unique id for the store sending the order in
|
87
|
-
# :store_name = (string) *optional - A readable name for the store, typicaly the hostname.
|
88
|
-
# :plugin_id = (string) the MailChimp-assigned Plugin Id. Using 1214 for the moment.
|
89
|
-
# :items = (array) the individual line items for an order, using the following keys:
|
90
|
-
#
|
91
|
-
# :line_num = (integer) *optional - line number of the item on the order
|
92
|
-
# :product_id = (integer) internal product id
|
93
|
-
# :product_name = (string) the name for the product_id associated with the item
|
94
|
-
# :category_id = (integer) internal id for the (main) category associated with product
|
95
|
-
# :category_name = (string) the category name for the category id
|
96
|
-
# :qty = (double) the quantity of items ordered
|
97
|
-
# :cost = (double) the cost of a single item (i.e., not the extended cost of the line)
|
98
|
-
def campaign_ecomm_add_order(order)
|
99
|
-
call("campaignEcommAddOrder", order)
|
18
|
+
class ListEmailError < ListError
|
100
19
|
end
|
101
20
|
|
102
|
-
|
103
|
-
# Create a new campaign
|
104
|
-
call("campaignCreate", type, options, content, segment_options, type_opts)
|
105
|
-
end
|
106
|
-
|
107
|
-
def delete_campaign(campaign_id)
|
108
|
-
# Delete a campaign
|
109
|
-
call("campaignDelete", campaign_id)
|
110
|
-
end
|
111
|
-
|
112
|
-
def replicate_campaign(campaign_id)
|
113
|
-
# Replicate a campaign (returns ID of new campaign)
|
114
|
-
call("campaignReplicate", campaign_id)
|
115
|
-
end
|
116
|
-
|
117
|
-
def schedule_campaign(campaign_id, time = "#{1.day.from_now}")
|
118
|
-
# Schedule a campaign
|
119
|
-
## TODO: Add support for A/B Split scheduling
|
120
|
-
call("campaignSchedule", campaign_id, time)
|
121
|
-
end
|
122
|
-
|
123
|
-
def send_now(campaign_id)
|
124
|
-
# Send a campaign
|
125
|
-
call("campaignSendNow", campaign_id)
|
126
|
-
end
|
127
|
-
|
128
|
-
def send_test(campaign_id, emails = {})
|
129
|
-
# Send a test of a campaign
|
130
|
-
call("campaignSendTest", campaign_id, emails)
|
131
|
-
end
|
132
|
-
|
133
|
-
def templates
|
134
|
-
# Get the templates
|
135
|
-
call("campaignTemplates")
|
136
|
-
end
|
137
|
-
|
138
|
-
def update_campaign(campaign_id, name, value)
|
139
|
-
# Update a campaign
|
140
|
-
call("campaignUpdate", campaign_id, name, value)
|
141
|
-
end
|
142
|
-
|
143
|
-
def unschedule_campaign(campaign_id)
|
144
|
-
# Unschedule a campaign
|
145
|
-
call("campaignUnschedule", campaign_id)
|
146
|
-
end
|
147
|
-
|
148
|
-
## Helper methods
|
149
|
-
|
150
|
-
def html_to_text(content)
|
151
|
-
# Convert HTML content to text
|
152
|
-
call("generateText", 'html', content)
|
153
|
-
end
|
154
|
-
|
155
|
-
def convert_css_to_inline(html, strip_css = false)
|
156
|
-
# Convert CSS styles to inline styles and (optionally) remove original styles
|
157
|
-
call("inlineCss", html, strip_css)
|
21
|
+
class ListMergeError < ListError
|
158
22
|
end
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
def lists
|
163
|
-
# Get all of the lists for this mailchimp account
|
164
|
-
call("lists")
|
165
|
-
end
|
166
|
-
|
167
|
-
def create_group(list_id, group)
|
168
|
-
# Add an interest group to a list
|
169
|
-
call("listInterestGroupAdd", list_id, group)
|
170
|
-
end
|
171
|
-
|
172
|
-
def create_tag(list_id, tag, name, required = false)
|
173
|
-
# Add a merge tag to a list
|
174
|
-
call("listMergeVarAdd", list_id, tag, name, required)
|
175
|
-
end
|
176
|
-
|
177
|
-
def delete_group(list_id, group)
|
178
|
-
# Delete an interest group for a list
|
179
|
-
call("listInterestGroupDel", list_id, group)
|
180
|
-
end
|
181
|
-
|
182
|
-
def delete_tag(list_id, tag)
|
183
|
-
# Delete a merge tag and all its members
|
184
|
-
call("listMergeVarDel", list_id, tag)
|
185
|
-
end
|
186
|
-
|
187
|
-
def groups(list_id)
|
188
|
-
# Get the interest groups for a list
|
189
|
-
call("listInterestGroups", list_id)
|
190
|
-
end
|
191
|
-
|
192
|
-
def member(list_id, email)
|
193
|
-
# Get a member of a list
|
194
|
-
call("listMemberInfo", list_id, email)
|
195
|
-
end
|
196
|
-
|
197
|
-
def members(list_id, status = "subscribed", since = "2000-01-01 00:00:00", start = 0, limit = 100)
|
198
|
-
# Get members of a list based on status
|
199
|
-
# Select members based on one of the following statuses:
|
200
|
-
# 'subscribed'
|
201
|
-
# 'unsubscribed'
|
202
|
-
# 'cleaned'
|
203
|
-
# 'updated'
|
204
|
-
#
|
205
|
-
# Select members that have updated their status or profile by providing
|
206
|
-
# a "since" date in the format of YYYY-MM-DD HH:MM:SS
|
207
|
-
#
|
208
|
-
call("listMembers", list_id, status, since, start, limit)
|
209
|
-
end
|
210
|
-
|
211
|
-
def merge_tags(list_id)
|
212
|
-
# Get the merge tags for a list
|
213
|
-
call("listMergeVars", list_id)
|
214
|
-
end
|
215
|
-
|
216
|
-
def subscribe(list_id, email, options = {})
|
217
|
-
options = apply_defaults_to({:email_type => "html"}.merge(options))
|
218
|
-
# Subscribe a member
|
219
|
-
call("listSubscribe", list_id, email, *options.values_at(:user_info, :email_type, :double_opt_in, :update_existing, :replace_interests, :send_welcome))
|
220
|
-
end
|
221
|
-
|
222
|
-
def subscribe_many(list_id, subscribers, options = {})
|
223
|
-
options = apply_defaults_to({:update_existing => true}.merge(options))
|
224
|
-
# Subscribe a batch of members
|
225
|
-
# subscribers = {:EMAIL => 'example@email.com', :EMAIL_TYPE => 'html'}
|
226
|
-
call("listBatchSubscribe", list_id, subscribers, *options.values_at(:double_opt_in, :update_existing, :replace_interests))
|
23
|
+
|
24
|
+
class AlreadySubscribed < ListEmailError
|
227
25
|
end
|
228
|
-
|
229
|
-
|
230
|
-
#
|
231
|
-
# Options
|
232
|
-
# :delete_member Delete user form list instead of marking them as unsubscribed
|
233
|
-
# :send_goodbye Send goodbye e-mail to user
|
234
|
-
# :send_notify Send unsubscribe email to email in list settings
|
235
|
-
def unsubscribe(list_id, current_email, options = {})
|
236
|
-
options = apply_defaults_to({:delete_member => true}.merge(options))
|
237
|
-
# Unsubscribe a list member
|
238
|
-
call("listUnsubscribe", list_id, current_email, *options.values_at(:delete_member, :send_goodbye, :send_notify))
|
26
|
+
|
27
|
+
class AlreadyUnsubscribed < ListEmailError
|
239
28
|
end
|
240
|
-
|
241
|
-
|
242
|
-
options = apply_defaults_to({:delete_member => true}.merge(options))
|
243
|
-
# Unsubscribe an array of email addresses
|
244
|
-
# emails = ['first@email.com', 'second@email.com']
|
245
|
-
call("listBatchUnsubscribe", list_id, emails, *options.values_at(:delete_member, :send_goodbye, :send_notify))
|
29
|
+
|
30
|
+
class NotExists < ListEmailError
|
246
31
|
end
|
247
|
-
|
248
|
-
|
249
|
-
# Update a member of this list
|
250
|
-
call("listUpdateMember", list_id, current_email, user_info, email_type, true)
|
32
|
+
|
33
|
+
class NotSubscribed < ListEmailError
|
251
34
|
end
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
35
|
+
|
36
|
+
class CommunicationError < StandardError
|
37
|
+
def initialize(message)
|
38
|
+
super(message)
|
39
|
+
end
|
256
40
|
end
|
41
|
+
end
|
257
42
|
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
raise HominidCommunicationError.new(error.message)
|
43
|
+
begin
|
44
|
+
# include the provided rake task
|
45
|
+
require 'rake'
|
46
|
+
unless Rake::Task.task_defined? "hominid:config"
|
47
|
+
load File.join(File.dirname(__FILE__), '..', 'tasks', 'rails', 'hominid.rake')
|
264
48
|
end
|
49
|
+
rescue LoadError
|
50
|
+
# silently skip rake task inclusion unless the rake gem is installed
|
265
51
|
end
|
52
|
+
|
53
|
+
require 'hominid/base'
|
54
|
+
|