hominid 2.2.0 → 3.0.1

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.
@@ -1,43 +1,19 @@
1
1
  module Hominid
2
2
  module Security
3
-
4
- # Add an API Key to your account. We will generate a new key for you and return it.
5
- #
6
- # Parameters:
7
- # * username (String) = Your Mailchimp account username.
8
- # * password (String) = Your Mailchimp account password.
9
- #
10
- # Returns:
11
- # A new API Key that can be immediately used.
12
- #
13
- def add_api_key(username, password)
14
- @chimpApi.call("apikeyAdd", username, password, @config[:api_key])
3
+
4
+ # Get a list of all API keys
5
+ def apikeys(username, password, expired = false)
6
+ @chimpApi.call("apikeys", username, password, @api_key, expired)
15
7
  end
16
8
 
17
- # Retrieve a list of all MailChimp API Keys for this User.
18
- #
19
- # Parameters:
20
- # * username (String) = Your Mailchimp account username.
21
- # * password (String) = Your Mailchimp account password.
22
- # * expired (Boolean) = Whether or not to include expired keys, defaults to false.
23
- #
24
- # Returns:
25
- # An array of API keys including:
26
- # * apikey (String) = The api key that can be used.
27
- # * created_at (String) = The date the key was created.
28
- # * expired_at (String) = The date the key was expired.
29
- #
30
- def api_keys(username, password, expired = false)
31
- @chimpApi.call("apikeys", username, password, @config[:api_key], expired)
9
+ # Add an API key to your account
10
+ def apikey_add(username, password)
11
+ @chimpApi.call("apikeyAdd", username, password, @api_key)
32
12
  end
33
13
 
34
- # Expire a Specific API Key.
35
- #
36
- # Returns:
37
- # True if successful, error code if not.
38
- #
39
- def expire_api_key(username, password)
40
- @chimpApi.call("apikeyExpire", username, password, @config[:api_key])
14
+ # Expire a specific API key
15
+ def apikey_expire(username, password, api_key)
16
+ @chimpApi.call("apikeyExpire", username, password, api_key)
41
17
  end
42
18
 
43
19
  end
@@ -1,4 +1,12 @@
1
1
  require 'rubygems'
2
+ require 'bundler'
3
+ begin
4
+ Bundler.setup(:default, :development)
5
+ rescue Bundler::BundlerError => e
6
+ $stderr.puts e.message
7
+ $stderr.puts "Run `bundle install` to install missing gems"
8
+ exit e.status_code
9
+ end
2
10
  require 'test/unit'
3
11
  require 'shoulda'
4
12
 
@@ -0,0 +1,29 @@
1
+ require 'helper'
2
+
3
+ class TestHominid < Test::Unit::TestCase
4
+
5
+ VALID_API_KEY = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX-us1'
6
+ INVALID_API_KEY = 'not_a_valid_api_key'
7
+
8
+ should "not raise an error if the API key is valid" do
9
+ assert_nothing_raised do
10
+ Hominid::API.new(VALID_API_KEY)
11
+ end
12
+ end
13
+
14
+ should "raise an error if the API key is not provided" do
15
+ assert_raise(ArgumentError) do
16
+ Hominid::API.new()
17
+ end
18
+ end
19
+
20
+ should "raise an error if the API key is malformed" do
21
+ assert_raise(ArgumentError) do
22
+ Hominid::API.new(INVALID_API_KEY)
23
+ end
24
+ end
25
+
26
+ # TODO: Tests that mock API calls so that it is not hitting the actual
27
+ # Mailchimp API during testing.
28
+
29
+ end
metadata CHANGED
@@ -1,68 +1,97 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hominid
3
3
  version: !ruby/object:Gem::Version
4
- hash: 7
5
4
  prerelease: false
6
5
  segments:
7
- - 2
8
- - 2
6
+ - 3
9
7
  - 0
10
- version: 2.2.0
8
+ - 1
9
+ version: 3.0.1
11
10
  platform: ruby
12
11
  authors:
13
12
  - Brian Getting
14
- - "Michael Str\xC3\xBCder"
15
13
  autorequire:
16
14
  bindir: bin
17
15
  cert_chain: []
18
16
 
19
- date: 2010-09-28 00:00:00 -07:00
17
+ date: 2010-12-20 00:00:00 -08:00
20
18
  default_executable:
21
19
  dependencies:
22
20
  - !ruby/object:Gem::Dependency
23
- name: json
24
- prerelease: false
21
+ name: bundler
25
22
  requirement: &id001 !ruby/object:Gem::Requirement
26
23
  none: false
27
24
  requirements:
28
- - - ">="
25
+ - - ~>
29
26
  - !ruby/object:Gem::Version
30
- hash: 31
31
27
  segments:
32
28
  - 1
33
- - 2
34
29
  - 0
35
- version: 1.2.0
36
- type: :runtime
30
+ - 0
31
+ version: 1.0.0
32
+ type: :development
33
+ prerelease: false
37
34
  version_requirements: *id001
38
35
  - !ruby/object:Gem::Dependency
39
36
  name: jeweler
40
- prerelease: false
41
37
  requirement: &id002 !ruby/object:Gem::Requirement
42
38
  none: false
43
39
  requirements:
44
- - - ">="
40
+ - - ~>
45
41
  - !ruby/object:Gem::Version
46
- hash: 3
47
42
  segments:
48
- - 0
49
- version: "0"
43
+ - 1
44
+ - 5
45
+ - 2
46
+ version: 1.5.2
50
47
  type: :development
48
+ prerelease: false
51
49
  version_requirements: *id002
52
50
  - !ruby/object:Gem::Dependency
53
- name: shoulda
54
- prerelease: false
51
+ name: mocha
55
52
  requirement: &id003 !ruby/object:Gem::Requirement
56
53
  none: false
57
54
  requirements:
58
55
  - - ">="
59
56
  - !ruby/object:Gem::Version
60
- hash: 3
61
57
  segments:
62
58
  - 0
63
- version: "0"
59
+ - 9
60
+ - 10
61
+ version: 0.9.10
64
62
  type: :development
63
+ prerelease: false
65
64
  version_requirements: *id003
65
+ - !ruby/object:Gem::Dependency
66
+ name: rcov
67
+ requirement: &id004 !ruby/object:Gem::Requirement
68
+ none: false
69
+ requirements:
70
+ - - ">="
71
+ - !ruby/object:Gem::Version
72
+ segments:
73
+ - 0
74
+ - 9
75
+ - 9
76
+ version: 0.9.9
77
+ type: :development
78
+ prerelease: false
79
+ version_requirements: *id004
80
+ - !ruby/object:Gem::Dependency
81
+ name: shoulda
82
+ requirement: &id005 !ruby/object:Gem::Requirement
83
+ none: false
84
+ requirements:
85
+ - - ">="
86
+ - !ruby/object:Gem::Version
87
+ segments:
88
+ - 2
89
+ - 11
90
+ - 3
91
+ version: 2.11.3
92
+ type: :development
93
+ prerelease: false
94
+ version_requirements: *id005
66
95
  description: Hominid is a Ruby gem that provides a wrapper for interacting with the Mailchimp email marketing service API.
67
96
  email: brian@terra-firma-design.com
68
97
  executables: []
@@ -70,30 +99,29 @@ executables: []
70
99
  extensions: []
71
100
 
72
101
  extra_rdoc_files:
73
- - LICENSE
102
+ - LICENSE.txt
74
103
  - README.rdoc
75
104
  files:
76
- - .gitignore
77
- - LICENSE
105
+ - Gemfile
106
+ - Gemfile.lock
107
+ - LICENSE.txt
78
108
  - README.rdoc
79
109
  - Rakefile
80
110
  - VERSION
81
111
  - hominid.gemspec
82
112
  - lib/hominid.rb
83
- - lib/hominid/base.rb
84
113
  - lib/hominid/campaign.rb
85
- - lib/hominid/helper.rb
86
114
  - lib/hominid/list.rb
87
115
  - lib/hominid/security.rb
88
- - test/hominid_test.rb
89
- - test/test_helper.rb
116
+ - test/helper.rb
117
+ - test/test_hominid.rb
90
118
  has_rdoc: true
91
119
  homepage: http://github.com/bgetting/hominid
92
- licenses: []
93
-
120
+ licenses:
121
+ - MIT
94
122
  post_install_message:
95
- rdoc_options:
96
- - --charset=UTF-8
123
+ rdoc_options: []
124
+
97
125
  require_paths:
98
126
  - lib
99
127
  required_ruby_version: !ruby/object:Gem::Requirement
@@ -101,7 +129,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
101
129
  requirements:
102
130
  - - ">="
103
131
  - !ruby/object:Gem::Version
104
- hash: 3
132
+ hash: -1643748069951244742
105
133
  segments:
106
134
  - 0
107
135
  version: "0"
@@ -110,7 +138,6 @@ required_rubygems_version: !ruby/object:Gem::Requirement
110
138
  requirements:
111
139
  - - ">="
112
140
  - !ruby/object:Gem::Version
113
- hash: 3
114
141
  segments:
115
142
  - 0
116
143
  version: "0"
@@ -120,7 +147,7 @@ rubyforge_project:
120
147
  rubygems_version: 1.3.7
121
148
  signing_key:
122
149
  specification_version: 3
123
- summary: Hominid is a Ruby gem for interacting with the Mailchimp API.
150
+ summary: Hominid is a Ruby wrapper for the Mailchimp API
124
151
  test_files:
125
- - test/hominid_test.rb
126
- - test/test_helper.rb
152
+ - test/helper.rb
153
+ - test/test_hominid.rb
data/.gitignore DELETED
@@ -1,5 +0,0 @@
1
- .DS_Store
2
- pkg/*
3
- pkg/*.*
4
- .svn
5
- rdoc
@@ -1,122 +0,0 @@
1
- module Hominid
2
- class Base
3
- include Hominid::Campaign
4
- include Hominid::Helper
5
- include Hominid::List
6
- include Hominid::Security
7
-
8
- # MailChimp API Documentation: http://www.mailchimp.com/api/1.2/
9
- MAILCHIMP_API_VERSION = "1.2"
10
- MAILCHIMP_EXPORT_API_VERSION = "1.0"
11
- MAILCHIMP_EXPORT_PATH = "/export/#{MAILCHIMP_EXPORT_API_VERSION}/list/"
12
-
13
- def initialize(config = {})
14
- raise StandardError.new('Please provide your Mailchimp API key.') unless config[:api_key]
15
- raise ArgumentError.new('Your Mailchimp API key is malformatted.') unless config[:api_key].include?('-')
16
- dc = config[:api_key].split('-').last
17
- defaults = {
18
- :double_opt_in => false,
19
- :merge_tags => {},
20
- :replace_interests => true,
21
- :secure => false,
22
- :send_goodbye => false,
23
- :send_notify => false,
24
- :send_welcome => false,
25
- :timeout => nil,
26
- :update_existing => true
27
- }
28
- @config = defaults.merge(config).freeze
29
- if config[:secure]
30
- @chimpApi = XMLRPC::Client.new2("https://#{dc}.api.mailchimp.com/#{MAILCHIMP_API_VERSION}/", nil, config[:timeout])
31
- @exportApi = Net::HTTP.new("#{dc}.api.mailchimp.com", 443)
32
- else
33
- @chimpApi = XMLRPC::Client.new2("http://#{dc}.api.mailchimp.com/#{MAILCHIMP_API_VERSION}/", nil, config[:timeout])
34
- @exportApi = Net::HTTP.new("#{dc}.api.mailchimp.com", 80)
35
- end
36
- end
37
-
38
- def apply_defaults_to(options) # :nodoc:
39
- @config.merge(options)
40
- end
41
-
42
- def call(method, *args) # :nodoc:
43
- @chimpApi.call(method, @config[:api_key], *args)
44
- rescue XMLRPC::FaultException => error
45
- # Handle common cases for which the Mailchimp API would raise Exceptions
46
- case error.faultCode
47
- when 100..199
48
- raise UserError.new(error)
49
- when 200..299
50
- raise ListError.new(error)
51
- when 300..399
52
- raise CampaignError.new(error)
53
- when 500..599
54
- raise ValidationError.new(error)
55
- else
56
- raise APIError.new(error)
57
- end
58
- rescue RuntimeError => error
59
- if error.message =~ /Wrong type!/
60
- hashes = args.select{|a| a.is_a? Hash}
61
- errors = hashes.select{|k, v| v.nil? }.collect{ |k, v| "#{k} is Nil." }.join(' ')
62
- raise CommunicationError.new(errors)
63
- else
64
- raise error
65
- end
66
- rescue Exception => error
67
- raise CommunicationError.new(error.message)
68
- end
69
-
70
- def call_export(list_id, status)
71
- uri = "#{MAILCHIMP_EXPORT_PATH}?apikey=#{@config[:api_key]}&id=#{list_id}"
72
-
73
- !status.nil? && uri += "&status=#{status}"
74
-
75
- # Don't parse the whole thing since there could be thousands of records
76
- out, keys = [], []
77
- body = @exportApi.request_get(uri).body
78
- lines = body.send(body.respond_to?(:lines) ? :lines : :to_s).to_a
79
-
80
- lines.each_with_index do |l, i|
81
- if i == 0
82
- keys = JSON.parse(l).map { |k| k.gsub(" ", "_") }
83
- else
84
- # Magic! http://snippets.dzone.com/posts/show/302
85
- out << Hash[*keys.zip(JSON.parse(l)).flatten]
86
- end
87
- end
88
- out
89
- rescue Exception => error
90
- raise CommunicationError.new(error.message)
91
- end
92
-
93
- def clean_merge_tags(merge_tags) # :nodoc:
94
- return {} unless merge_tags.is_a? Hash
95
- merge_tags.each do |key, value|
96
- if merge_tags[key].is_a? String
97
- merge_tags[key] = value.gsub("\v", '')
98
- elsif merge_tags[key].nil?
99
- merge_tags[key] = ''
100
- end
101
- end
102
- end
103
-
104
- def hash_to_object(object) # :nodoc:
105
- return case object
106
- when Hash
107
- object = object.clone
108
- object.each do |key, value|
109
- object[key.downcase] = hash_to_object(value)
110
- end
111
- OpenStruct.new(object)
112
- when Array
113
- object = object.clone
114
- object.map! { |i| hash_to_object(i) }
115
- else
116
- object
117
- end
118
- end
119
-
120
- end
121
- end
122
-
@@ -1,129 +0,0 @@
1
- module Hominid
2
- module Helper
3
-
4
- # Retrieve lots of account information including payments made, plan info,
5
- # some account stats, installed modules, contact info, and more. No private
6
- # information like Credit Card numbers is available.
7
- #
8
- # Parameters:
9
- # * none
10
- #
11
- # Returns:
12
- # An array of account details for this API key including:
13
- # * username (String) = The Account username.
14
- # * user_id (String) = The Account user unique id (for building some links).
15
- # * is_trial (Boolean) = Whether the Account is in Trial mode.
16
- # * timezone (String) = The timezone for the Account.
17
- # * plan_type (String) = Plan Type - "monthly", "payasyougo", or "free".
18
- # * plan_low (Integer) = Only for Monthly plans - the lower tier for list size.
19
- # * plan_high (Integer) = Only for Monthly plans - the upper tier for list size.
20
- # * plan_start_date (DateTime) = Only for Monthly plans - the start date for a monthly plan.
21
- # * emails_left (Integer) = Only for Free and Pay-as-you-go plans emails credits left for the account.
22
- # * pending_monthly (Boolean) = Whether the account is finishing Pay As You Go credits before switching to a Monthly plan.
23
- # * first_payment (DateTime) = Date of first payment.
24
- # * last_payment (DateTime) = Date of most recent payment.
25
- # * times_logged_in (Integer) = Total number of times the account has been logged into via the web.
26
- # * last_login (DateTime) = Date/time of last login via the web.
27
- # * affiliate_link (String) = Monkey Rewards link for our Affiliate program.
28
- # * contact (Array) = Contact details for the account, including: First & Last name, email, company name, address, phone, and url.
29
- # * addons (Array) = Addons installed in the account and the date they were installed.
30
- # * orders (Array) = Order details for the account, include order_id, type, cost, date/time, and any credits applied to the order.
31
- #
32
- def account_details
33
- hash_to_object(call("getAccountDetails"))
34
- end
35
-
36
- # Get the current Chimp Chatter messages for an account.
37
- #
38
- # Returns:
39
- # The current Chimp Chatter for an account.
40
- #
41
- def chatter
42
- call("chimpChatter")
43
- end
44
-
45
- # Create a new folder to file campaigns in.
46
- #
47
- # Parameters:
48
- # * name (String) = A unique name for a folder.
49
- #
50
- # Returns:
51
- # The folder_id of the newly created folder. (Integer)
52
- #
53
- def create_folder(name)
54
- call("createFolder", name)
55
- end
56
-
57
- # Import Ecommerce Order Information to be used for Segmentation.
58
- #
59
- # Parameters:
60
- # * order (Hash) = A hash of order information including:
61
- # * id (String) = The order id.
62
- # * email_id (String) = Email id of the subscriber. (mc_eid query string) (Required if no email)
63
- # * email (String) = Email id of the subscriber. (Required if no email_id)
64
- # * total (Double) = Show only campaigns with this from_name.
65
- # * order_date (String) = The date of the order. (optional)
66
- # * shipping (String) = The total paid for shipping fees. (optional)
67
- # * tax (String) = The total tax paid. (optional)
68
- # * store_id (String) = A unique id for the store sending the order in
69
- # * store_name (String) = A readable name for the store, typicaly the hostname. (optional)
70
- # * plugin_id (String) = The MailChimp-assigned Plugin Id. Using 1214 for the moment.
71
- # * campaign_id (String) = The campaign ID for this order. (mc_cid query string) (optional)
72
- # * items (Array) = The individual line items for an order, using the following keys:
73
- # * line_num (Integer) = The line number of the item on the order. (optional)
74
- # * product_id (Integer) = Internal product id.
75
- # * product_name (String) = The name for the product_id associated with the item.
76
- # * category_id (Integer) = Internal id for the (main) category associated with product.
77
- # * category_name (String) = The category name for the category id.
78
- # * qty (Double) = The quantity of items ordered.
79
- # * cost (Double) = The cost of a single item (Ex. Not the extended cost of the line).
80
- #
81
- # Returns:
82
- # True if successful, error code if not.
83
- #
84
- def ecomm_add_order(order)
85
- call("ecommAddOrder", order)
86
- end
87
-
88
- # Have HTML content auto-converted to a text-only format. You can send: plain HTML, an array of Template content,
89
- # an existing Campaign Id, or an existing Template Id. Note that this will not save anything to or update any of
90
- # your lists, campaigns, or templates.
91
- #
92
- # Parameters:
93
- # * type (String) = Must be one of: "html", "template", "url", "cid", or "tid".
94
- # * content (String) = The content to use. For "html" expects a single string value, "template" expects an array like you send to campaignCreate, "url" expects a valid & public URL to pull from, "cid" expects a valid Campaign Id, and "tid" expects a valid Template Id on your account.
95
- #
96
- # Returns:
97
- # The content passed in converted to text. (String)
98
- #
99
- def generate_text(type, content)
100
- call("generateText", type, content)
101
- end
102
-
103
- # Send your HTML content to have the CSS inlined and optionally remove the original styles.
104
- #
105
- # Parameters:
106
- # * html (String) = Your HTML content.
107
- # * strip_css (Boolean) = Whether you want the CSS <style> tags stripped from the returned document. Defaults to false.
108
- #
109
- # Returns:
110
- # Your HTML content with all CSS inlined, just like if we sent it. (String)
111
- #
112
- def inline_css(html, strip_css = false)
113
- call("inlineCss", html, strip_css)
114
- end
115
- alias :convert_css_to_inline :inline_css
116
-
117
- # "Ping" the MailChimp API - a simple method you can call that will return a constant value as long as everything
118
- # is good. Note than unlike most all of our methods, we don't throw an Exception if we are having issues. You will
119
- # simply receive a different string back that will explain our view on what is going on.
120
- #
121
- # Returns:
122
- # "Everything's Chimpy!"
123
- #
124
- def ping()
125
- call("ping")
126
- end
127
-
128
- end
129
- end