bgetting-hominid 1.1.12 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
data/README.textile CHANGED
@@ -1,26 +1,27 @@
1
1
  h1. Hominid
2
2
 
3
- Hominid is a GemPlugin wrapper to the "Mailchimp API":http://www.mailchimp.com/api/1.2/.
3
+ Hominid is a Ruby gem for interacting with the "Mailchimp API":http://www.mailchimp.com/api/1.2/.
4
4
 
5
5
  h2. Installation
6
6
 
7
- Install as a Rails plugin:
7
+ Install the gem:
8
8
 
9
- <pre><code>script/plugin install git://github.com/bgetting/hominid.git</code></pre>
9
+ <pre><code>gem sources -a http://gems.github.com
10
+ sudo gem install bgetting-hominid</code></pre>
10
11
 
11
- Clone from the Github repository:
12
+ In your @environment.rb@ file:
12
13
 
13
- <pre><code>git clone git://github.com/bgetting/hominid.git</code></pre>
14
+ <pre><code>config.gem "bgetting-hominid", :lib => 'hominid', :source => "http://gems.github.com"</code></pre>
14
15
 
15
- Use the GemPlugin:
16
+ You can also install Hominid as a Rails plugin:
16
17
 
17
- <pre><code>config.gem "bgetting-hominid", :lib => 'hominid', :source => "http://gems.github.com"</code></pre>
18
+ <pre><code>script/plugin install git://github.com/bgetting/hominid.git</code></pre>
18
19
 
19
- h2. Configuration
20
+ h2. Setup
20
21
 
21
- You can either use a master config file, which Hominid expects to find at @/config/hominid.yml@ or (thanks to "ron":http://github.com/ron) you can pass a hash of config options when calling Hominid. _If you are using Hominid as a Rails plugin, the config file will be created for you. If you are using Hominid as a gem, you will need to create the config file._
22
+ Hominid expects to find a config file at @/config/hominid.yml@ in a Rails application, but you can also pass a hash of config options when creating a new Hominid object (thanks to "ron":http://github.com/ron).
22
23
 
23
- You will also need to create a Mailchimp account to get your API key (available at "http://admin.mailchimp.com/account/api/":http://admin.mailchimp.com/account/api/) for configuration.
24
+ You will also need to create a Mailchimp account to get your API key (available at "http://admin.mailchimp.com/account/api/":http://admin.mailchimp.com/account/api/) to configure a Hominid object.
24
25
 
25
26
  h2. Example
26
27
 
@@ -43,17 +44,17 @@ def find_list_id(list_name)
43
44
  end
44
45
  </code></pre>
45
46
 
46
- To subscribe someone:
47
+ To subscribe:
47
48
 
48
- <pre><code>@hominid.subscribe(@list_id, "email@example.com", {:FNAME => 'Bob', :LNAME => 'Smith'}, 'html')</code></pre>
49
+ <pre><code>@hominid.subscribe(@list_id, "email@example.com", :user_info => {:FNAME => 'Bob', :LNAME => 'Smith'}, :email_type => 'html')</code></pre>
49
50
 
50
- To unsubscribe someone:
51
+ To unsubscribe:
51
52
 
52
53
  <pre><code>@hominid.unsubscribe(@list_id, "email@example.com")</code></pre>
53
54
 
54
- To update a list member:
55
+ To update a member:
55
56
 
56
- <pre><code>@hominid.subscribe(@list_id, "email@example.com", {:FNAME => 'Robert', :EMAIL => 'another@example.com'}, 'html', true)</code></pre>
57
+ <pre><code>@hominid.subscribe(@list_id, "email@example.com", :user_info => {:FNAME => 'Robert', :EMAIL => 'another@example.com'}, :email_type => 'html', :update_existing => true)</code></pre>
57
58
 
58
59
  _or_
59
60
 
data/Rakefile CHANGED
@@ -1,5 +1,4 @@
1
1
  require 'rake'
2
- require 'rake/testtask'
3
2
  require 'rake/rdoctask'
4
3
 
5
4
  begin
@@ -16,17 +15,6 @@ rescue LoadError
16
15
  puts "Jeweler not available. Install it with: sudo gem install technicalpickles-jeweler -s http://gems.github.com"
17
16
  end
18
17
 
19
- desc 'Default: run unit tests.'
20
- task :default => :test
21
-
22
- desc 'Test the hominid plugin.'
23
- Rake::TestTask.new(:test) do |t|
24
- t.libs << 'lib'
25
- t.libs << 'test'
26
- t.pattern = 'test/**/*_test.rb'
27
- t.verbose = true
28
- end
29
-
30
18
  desc 'Generate documentation for the hominid plugin.'
31
19
  Rake::RDocTask.new(:rdoc) do |rdoc|
32
20
  rdoc.rdoc_dir = 'rdoc'
data/VERSION.yml CHANGED
@@ -1,4 +1,4 @@
1
1
  ---
2
2
  :major: 1
3
- :minor: 1
4
- :patch: 12
3
+ :minor: 2
4
+ :patch: 0
data/hominid.gemspec CHANGED
@@ -2,11 +2,11 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = %q{hominid}
5
- s.version = "1.1.12"
5
+ s.version = "1.2.0"
6
6
 
7
7
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
8
8
  s.authors = ["Brian Getting"]
9
- s.date = %q{2009-08-11}
9
+ s.date = %q{2009-09-24}
10
10
  s.description = %q{Hominid is a Rails GemPlugin for interacting with the Mailchimp API}
11
11
  s.email = %q{brian@terra-firma-design.com}
12
12
  s.extra_rdoc_files = [
@@ -23,8 +23,8 @@ Gem::Specification.new do |s|
23
23
  "install.rb",
24
24
  "lib/hominid.rb",
25
25
  "rails/init.rb",
26
- "test/hominid_test.rb",
27
- "test/test_helper.rb",
26
+ "spec/hominid_spec.rb",
27
+ "spec/spec_helper.rb",
28
28
  "uninstall.rb"
29
29
  ]
30
30
  s.homepage = %q{http://github.com/bgetting/hominid}
@@ -33,8 +33,8 @@ Gem::Specification.new do |s|
33
33
  s.rubygems_version = %q{1.3.4}
34
34
  s.summary = %q{Hominid is a Rails GemPlugin for interacting with the Mailchimp API}
35
35
  s.test_files = [
36
- "test/hominid_test.rb",
37
- "test/test_helper.rb"
36
+ "spec/hominid_spec.rb",
37
+ "spec/spec_helper.rb"
38
38
  ]
39
39
 
40
40
  if s.respond_to? :specification_version then
data/lib/hominid.rb CHANGED
@@ -17,55 +17,36 @@ class Hominid
17
17
  # MailChimp API Documentation: http://www.mailchimp.com/api/1.2/
18
18
  MAILCHIMP_API = "http://api.mailchimp.com/1.2/"
19
19
 
20
- def initialize(config = nil)
21
- load_monkey_brains(config)
22
- @chimpApi ||= XMLRPC::Client.new2(MAILCHIMP_API)
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
23
+ 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)
23
28
  end
24
29
 
25
- def load_monkey_brains(config)
26
- config = YAML.load(File.open("#{RAILS_ROOT}/config/hominid.yml"))[RAILS_ENV].symbolize_keys unless config
27
- @chimpUsername = config[:username].to_s
28
- @chimpPassword = config[:password].to_s
29
- @api_key = config[:api_key]
30
- @send_goodbye = config[:send_goodbye]
31
- @send_notify = config[:send_notify]
32
- @double_opt = config[:double_opt]
33
- end
34
-
35
30
  ## Security related methods
36
31
 
37
32
  def add_api_key
38
- begin
39
- @chimpApi ||= XMLRPC::Client.new2(MAILCHIMP_API)
40
- @chimpApi.call("apikeyAdd", @chimpUsername, @chimpPassword, @api_key)
41
- rescue
42
- false
43
- end
33
+ @chimpApi.call("apikeyAdd", *@config.values_at(:username, :password, :api_key))
44
34
  end
45
35
 
46
36
  def expire_api_key
47
- begin
48
- @chimpApi ||= XMLRPC::Client.new2(MAILCHIMP_API)
49
- @chimpApi.call("apikeyExpire", @chimpUsername, @chimpPassword, @api_key)
50
- rescue
51
- false
52
- end
37
+ @chimpApi.call("apikeyExpire", *@config.values_at(:username, :password, :api_key))
53
38
  end
54
39
 
55
40
  def api_keys(include_expired = false)
56
- begin
57
- @chimpApi ||= XMLRPC::Client.new2(MAILCHIMP_API)
58
- @api_keys = @chimpApi.call("apikeys", @chimpUsername, @chimpPassword, include_expired)
59
- rescue
60
- return nil
61
- end
41
+ username, password = *@config.values_at(:username, :password)
42
+ @chimpApi.call("apikeys", username, password, include_expired)
62
43
  end
63
44
 
64
45
  ## Campaign related methods
65
46
 
66
47
  def campaign_content(campaign_id)
67
48
  # Get the content of a campaign
68
- @content = call("campaignContent", campaign_id)
49
+ call("campaignContent", campaign_id)
69
50
  end
70
51
 
71
52
  def campaigns(filters = {}, start = 0, limit = 50)
@@ -83,7 +64,7 @@ class Hominid
83
64
  # :sedtime_start = (string) Show campaigns sent after YYYY-MM-DD HH:mm:ss.
84
65
  # :sendtime_end = (string) Show campaigns sent before YYYY-MM-DD HH:mm:ss.
85
66
  # :subject = (boolean) Filter by exact values, or search within content for filter values.
86
- @campaigns = call("campaigns", filters, start, limit)
67
+ call("campaigns", filters, start, limit)
87
68
  end
88
69
 
89
70
  # Attach Ecommerce Order Information to a Campaign.
@@ -108,22 +89,22 @@ class Hominid
108
89
  # :qty = (double) the quantity of items ordered
109
90
  # :cost = (double) the cost of a single item (i.e., not the extended cost of the line)
110
91
  def campaign_ecomm_add_order(order)
111
- @campaign = call("campaignEcommAddOrder", order)
92
+ call("campaignEcommAddOrder", order)
112
93
  end
113
94
 
114
95
  def create_campaign(type = 'regular', options = {}, content = {}, segment_options = {}, type_opts = {})
115
96
  # Create a new campaign
116
- @campaign = call("campaignCreate", type, options, content, segment_options, type_opts)
97
+ call("campaignCreate", type, options, content, segment_options, type_opts)
117
98
  end
118
99
 
119
100
  def delete_campaign(campaign_id)
120
101
  # Delete a campaign
121
- @campaign = call("campaignDelete", campaign_id)
102
+ call("campaignDelete", campaign_id)
122
103
  end
123
104
 
124
105
  def replicate_campaign(campaign_id)
125
106
  # Replicate a campaign (returns ID of new campaign)
126
- @campaign = call("campaignReplicate", campaign_id)
107
+ call("campaignReplicate", campaign_id)
127
108
  end
128
109
 
129
110
  def schedule_campaign(campaign_id, time = "#{1.day.from_now}")
@@ -144,7 +125,7 @@ class Hominid
144
125
 
145
126
  def templates
146
127
  # Get the templates
147
- @templates = call("campaignTemplates", @api_key)
128
+ call("campaignTemplates")
148
129
  end
149
130
 
150
131
  def update_campaign(campaign_id, name, value)
@@ -161,19 +142,19 @@ class Hominid
161
142
 
162
143
  def html_to_text(content)
163
144
  # Convert HTML content to text
164
- @html_to_text = call("generateText", 'html', content)
145
+ call("generateText", 'html', content)
165
146
  end
166
147
 
167
148
  def convert_css_to_inline(html, strip_css = false)
168
149
  # Convert CSS styles to inline styles and (optionally) remove original styles
169
- @html_to_text = call("inlineCss", html, strip_css)
150
+ call("inlineCss", html, strip_css)
170
151
  end
171
152
 
172
153
  ## List related methods
173
154
 
174
155
  def lists
175
156
  # Get all of the lists for this mailchimp account
176
- @lists = call("lists", @api_key)
157
+ call("lists")
177
158
  end
178
159
 
179
160
  def create_group(list_id, group)
@@ -198,12 +179,12 @@ class Hominid
198
179
 
199
180
  def groups(list_id)
200
181
  # Get the interest groups for a list
201
- @groups = call("listInterestGroups", list_id)
182
+ call("listInterestGroups", list_id)
202
183
  end
203
184
 
204
185
  def member(list_id, email)
205
186
  # Get a member of a list
206
- @member = call("listMemberInfo", list_id, email)
187
+ call("listMemberInfo", list_id, email)
207
188
  end
208
189
 
209
190
  def members(list_id, status = "subscribed", since = "2000-01-01 00:00:00", start = 0, limit = 100)
@@ -217,34 +198,38 @@ class Hominid
217
198
  # Select members that have updated their status or profile by providing
218
199
  # a "since" date in the format of YYYY-MM-DD HH:MM:SS
219
200
  #
220
- @members = call("listMembers", list_id, status, since, start, limit)
201
+ call("listMembers", list_id, status, since, start, limit)
221
202
  end
222
203
 
223
204
  def merge_tags(list_id)
224
205
  # Get the merge tags for a list
225
- @merge_tags = call("listMergeVars", list_id)
206
+ call("listMergeVars", list_id)
226
207
  end
227
208
 
228
- def subscribe(list_id, email, user_info = {}, email_type = "html", update_existing = true, replace_interests = true, double_opt_in = nil)
209
+ def subscribe(list_id, email, options = {})
210
+ options = apply_defaults_to({:email_type => "html"}.merge(options))
229
211
  # Subscribe a member
230
- call("listSubscribe", list_id, email, user_info, email_type, double_opt_in || @double_opt, update_existing, replace_interests)
212
+ call("listSubscribe", list_id, email, *options.values_at(:user_info, :email_type, :double_opt_in, :update_existing, :replace_interests, :send_welcome))
231
213
  end
232
214
 
233
- def subscribe_many(list_id, subscribers)
215
+ def subscribe_many(list_id, subscribers, options = {})
216
+ options = apply_defaults_to({:update_existing => true}.merge(options))
234
217
  # Subscribe a batch of members
235
218
  # subscribers = {:EMAIL => 'example@email.com', :EMAIL_TYPE => 'html'}
236
- call("listBatchSubscribe", list_id, subscribers, @double_opt, true)
219
+ call("listBatchSubscribe", list_id, subscribers, *options.values_at(:double_opt_in, :update_existing, :replace_interests))
237
220
  end
238
221
 
239
- def unsubscribe(list_id, current_email)
222
+ def unsubscribe(list_id, current_email, options = {})
223
+ options = apply_defaults_to({:delete_member => true}.merge(options))
240
224
  # Unsubscribe a list member
241
- call("listUnsubscribe", list_id, current_email, true, @send_goodbye, @send_notify)
225
+ call("listUnsubscribe", list_id, current_email, *options.values_at(:delete_member, :send_goodbye, :send_notify))
242
226
  end
243
227
 
244
- def unsubscribe_many(list_id, emails)
228
+ def unsubscribe_many(list_id, emails, options = {})
229
+ options = apply_defaults_to({:delete_member => true}.merge(options))
245
230
  # Unsubscribe an array of email addresses
246
231
  # emails = ['first@email.com', 'second@email.com']
247
- call("listBatchUnsubscribe", list_id, emails, true, @send_goodbye, @send_notify)
232
+ call("listBatchUnsubscribe", list_id, emails, *options.values_at(:delete_member, :send_goodbye, :send_notify))
248
233
  end
249
234
 
250
235
  def update_member(list_id, current_email, user_info = {}, email_type = "")
@@ -253,8 +238,12 @@ class Hominid
253
238
  end
254
239
 
255
240
  protected
241
+ def apply_defaults_to(options)
242
+ @config.merge(options)
243
+ end
244
+
256
245
  def call(method, *args)
257
- @chimpApi.call(method, @api_key, *args)
246
+ @chimpApi.call(method, @config[:api_key], *args)
258
247
  rescue XMLRPC::FaultException => error
259
248
  raise HominidError.new(error.message)
260
249
  rescue Exception => error
@@ -0,0 +1,29 @@
1
+ require 'spec/spec_helper'
2
+
3
+ describe Hominid do
4
+ before do
5
+ api_key = ENV['MAIL_CHIMP_API_KEY']
6
+ raise "You must set the MAIL_CHIMP_API_KEY environment variable to test" if api_key.empty?
7
+ @hominid = Hominid.new(:api_key => api_key)
8
+ @list_id = ENV['MAIL_CHIMP_TEST_LIST_ID']
9
+ raise "You must set the MAIL_CHIMP_TEST_LIST_ID environment variable to test" if @list_id.empty?
10
+ end
11
+
12
+ describe "#subscribe" do
13
+ context "when not supplying a double-opt-in argument" do
14
+ it "should not blow up" do
15
+ proc {
16
+ @hominid.subscribe(@list_id, Faker::Internet.email)
17
+ }.should_not raise_error
18
+ end
19
+ end
20
+ end
21
+
22
+ describe "#call" do
23
+ it "should raise HominidError on failure" do
24
+ proc {
25
+ Hominid.new.send(:call, 'bogusApi')
26
+ }.should raise_error(HominidError)
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,3 @@
1
+ require 'rubygems'
2
+ require 'faker'
3
+ require 'lib/hominid'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bgetting-hominid
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.12
4
+ version: 1.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brian Getting
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-08-11 00:00:00 -07:00
12
+ date: 2009-09-24 00:00:00 -07:00
13
13
  default_executable:
14
14
  dependencies: []
15
15
 
@@ -32,8 +32,8 @@ files:
32
32
  - install.rb
33
33
  - lib/hominid.rb
34
34
  - rails/init.rb
35
- - test/hominid_test.rb
36
- - test/test_helper.rb
35
+ - spec/hominid_spec.rb
36
+ - spec/spec_helper.rb
37
37
  - uninstall.rb
38
38
  has_rdoc: false
39
39
  homepage: http://github.com/bgetting/hominid
@@ -63,5 +63,5 @@ signing_key:
63
63
  specification_version: 3
64
64
  summary: Hominid is a Rails GemPlugin for interacting with the Mailchimp API
65
65
  test_files:
66
- - test/hominid_test.rb
67
- - test/test_helper.rb
66
+ - spec/hominid_spec.rb
67
+ - spec/spec_helper.rb
data/test/hominid_test.rb DELETED
@@ -1,11 +0,0 @@
1
- require 'test_helper'
2
-
3
- class HominidTest < ActiveSupport::TestCase
4
- # Replace this with your real tests.
5
- test "the truth" do
6
- assert true
7
- end
8
-
9
- ## TODO: Write tests to verify each method
10
-
11
- end
data/test/test_helper.rb DELETED
@@ -1,3 +0,0 @@
1
- require 'rubygems'
2
- require 'active_support'
3
- require 'active_support/test_case'