mailjet 0.0.5 → 1.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.
Files changed (90) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +81 -259
  3. data/Rakefile +5 -4
  4. data/lib/mailjet.rb +7 -11
  5. data/lib/mailjet/api_error.rb +9 -5
  6. data/lib/mailjet/collection_proxy.rb +15 -0
  7. data/lib/mailjet/configuration.rb +4 -8
  8. data/lib/mailjet/connection.rb +72 -0
  9. data/lib/mailjet/gem_extensions/rest_client.rb +19 -0
  10. data/lib/mailjet/mailer.rb +37 -2
  11. data/lib/mailjet/message_delivery.rb +9 -0
  12. data/lib/mailjet/reporting.rb +10 -7
  13. data/lib/mailjet/resource.rb +199 -0
  14. data/lib/mailjet/resources/apikey.rb +12 -0
  15. data/lib/mailjet/resources/apikeyaccess.rb +12 -0
  16. data/lib/mailjet/resources/apikeytotals.rb +14 -0
  17. data/lib/mailjet/resources/apitoken.rb +12 -0
  18. data/lib/mailjet/resources/batchjob.rb +12 -0
  19. data/lib/mailjet/resources/bouncestatistics.rb +14 -0
  20. data/lib/mailjet/resources/campaign.rb +12 -0
  21. data/lib/mailjet/resources/campaignstatistics.rb +14 -0
  22. data/lib/mailjet/resources/clickstatistics.rb +14 -0
  23. data/lib/mailjet/resources/contact.rb +12 -0
  24. data/lib/mailjet/resources/contactdata.rb +12 -0
  25. data/lib/mailjet/resources/contactfilter.rb +12 -0
  26. data/lib/mailjet/resources/contacthistorydata.rb +12 -0
  27. data/lib/mailjet/resources/contactmetadata.rb +12 -0
  28. data/lib/mailjet/resources/contactslist.rb +12 -0
  29. data/lib/mailjet/resources/contactslistsignup.rb +12 -0
  30. data/lib/mailjet/resources/contactstatistics.rb +14 -0
  31. data/lib/mailjet/resources/csvimport.rb +12 -0
  32. data/lib/mailjet/resources/domainstatistics.rb +14 -0
  33. data/lib/mailjet/resources/eventcallbackurl.rb +12 -0
  34. data/lib/mailjet/resources/geostatistics.rb +14 -0
  35. data/lib/mailjet/resources/graphstatistics.rb +14 -0
  36. data/lib/mailjet/resources/listrecipient.rb +12 -0
  37. data/lib/mailjet/resources/listrecipientstatistics.rb +14 -0
  38. data/lib/mailjet/resources/liststatistics.rb +14 -0
  39. data/lib/mailjet/resources/manycontacts.rb +12 -0
  40. data/lib/mailjet/resources/message.rb +12 -0
  41. data/lib/mailjet/resources/messagehistory.rb +14 -0
  42. data/lib/mailjet/resources/messageinformation.rb +14 -0
  43. data/lib/mailjet/resources/messagesentstatistics.rb +14 -0
  44. data/lib/mailjet/resources/messagestate.rb +12 -0
  45. data/lib/mailjet/resources/messagestatistics.rb +14 -0
  46. data/lib/mailjet/resources/metadata.rb +14 -0
  47. data/lib/mailjet/resources/metasender.rb +12 -0
  48. data/lib/mailjet/resources/myprofile.rb +12 -0
  49. data/lib/mailjet/resources/newsletter.rb +12 -0
  50. data/lib/mailjet/resources/newsletterblock.rb +12 -0
  51. data/lib/mailjet/resources/newsletterproperties.rb +12 -0
  52. data/lib/mailjet/resources/newslettertemplate.rb +12 -0
  53. data/lib/mailjet/resources/newslettertemplateblock.rb +12 -0
  54. data/lib/mailjet/resources/newslettertemplatecategory.rb +12 -0
  55. data/lib/mailjet/resources/newslettertemplateproperties.rb +12 -0
  56. data/lib/mailjet/resources/openinformation.rb +14 -0
  57. data/lib/mailjet/resources/openstatistics.rb +14 -0
  58. data/lib/mailjet/resources/parseroute.rb +12 -0
  59. data/lib/mailjet/resources/preferences.rb +12 -0
  60. data/lib/mailjet/resources/sender.rb +12 -0
  61. data/lib/mailjet/resources/senderstatistics.rb +14 -0
  62. data/lib/mailjet/resources/toplinkclicked.rb +14 -0
  63. data/lib/mailjet/resources/trigger.rb +12 -0
  64. data/lib/mailjet/resources/user.rb +12 -0
  65. data/lib/mailjet/resources/useragentstatistics.rb +14 -0
  66. data/lib/mailjet/resources/widget.rb +12 -0
  67. data/lib/mailjet/resources/widgetcustomvalue.rb +12 -0
  68. data/lib/mailjet/version.rb +1 -1
  69. metadata +155 -44
  70. data/lib/mailjet/api.rb +0 -20
  71. data/lib/mailjet/api_request.rb +0 -70
  72. data/lib/mailjet/campaign.rb +0 -67
  73. data/lib/mailjet/click.rb +0 -15
  74. data/lib/mailjet/contact.rb +0 -18
  75. data/lib/mailjet/email.rb +0 -4
  76. data/lib/mailjet/list.rb +0 -58
  77. data/lib/mailjet/template_category.rb +0 -13
  78. data/lib/mailjet/template_model.rb +0 -13
  79. data/test/mailjet/api_request_test.rb +0 -72
  80. data/test/mailjet/api_test.rb +0 -13
  81. data/test/mailjet/campaign_test.rb +0 -66
  82. data/test/mailjet/configuration_test.rb +0 -16
  83. data/test/mailjet/contact_test.rb +0 -24
  84. data/test/mailjet/list_test.rb +0 -67
  85. data/test/mailjet/rack/endpoint_test.rb +0 -30
  86. data/test/mailjet/reporting_test.rb +0 -26
  87. data/test/mailjet/template_category_test.rb +0 -13
  88. data/test/mailjet/template_model_test.rb +0 -13
  89. data/test/mailjet_test.rb +0 -17
  90. data/test/minitest_helper.rb +0 -22
data/lib/mailjet/api.rb DELETED
@@ -1,20 +0,0 @@
1
- module Mailjet
2
- class Api
3
- def initialize(api_key = Mailjet.config.api_key, secret_key = Mailjet.config.secret_key)
4
- @api_key = api_key
5
- @secret_key = secret_key
6
- end
7
-
8
- def method_missing(method_name, *args, &block)
9
- params, request_type = args
10
- request = ApiRequest.new(method_name, params, request_type, @api_key, @secret_key)
11
- request.response
12
- end
13
-
14
- class << self
15
- def singleton
16
- @@singleton ||= self.new
17
- end
18
- end
19
- end
20
- end
@@ -1,70 +0,0 @@
1
- # encoding: utf-8
2
- require 'active_support/core_ext/string'
3
- require 'net/http'
4
- require "net/https"
5
- require 'json'
6
- require 'cgi'
7
-
8
- module Mailjet
9
- class ApiRequest
10
- MAILJET_HOST = 'api.mailjet.com'
11
-
12
- def initialize(method_name, params = {}, request_type = nil, auth_user = Mailjet.config.api_key, auth_password = Mailjet.config.secret_key)
13
- @method_name = method_name.to_s.camelize(:lower)
14
- @params = (params || {}).merge(:output => 'json')
15
- @request_type = (request_type || guess_request_type).camelize
16
- @auth_user = auth_user
17
- @auth_password = auth_password
18
- end
19
-
20
- def response
21
- @response ||= begin
22
- http = Net::HTTP.new(MAILJET_HOST, request_port)
23
- http.use_ssl = Mailjet.config.use_https
24
- res = http.request(request)
25
-
26
- case res
27
- when Net::HTTPSuccess
28
- JSON.parse(res.body || '{}')
29
- when Net::HTTPNotModified
30
- {"status" => "NotModified"}
31
- else
32
- raise ApiError.new(res.code, JSON.parse(res.body.presence || '{}'), request, request_path, @params)
33
- end
34
- end
35
- end
36
-
37
- private
38
- def request
39
- @request ||= begin
40
- req = "Net::HTTP::#{@request_type}".constantize.new(request_path)
41
- Net::HTTP::Get
42
- req.basic_auth @auth_user, @auth_password
43
- req.set_form_data(@params)
44
- req
45
- end
46
- end
47
-
48
- def request_path
49
- @request_path ||= begin
50
- path = "/#{Mailjet.config.api_version}/#{@method_name}"
51
- if @request_type == 'Get'
52
- path << '?' + @params.collect { |k,v| "#{k}=#{CGI::escape(v.to_s)}" }.join('&')
53
- end
54
- path
55
- end
56
- end
57
-
58
- def request_port
59
- Mailjet.config.use_https ? 443 : 80
60
- end
61
-
62
- def guess_request_type
63
- if @method_name =~ /(?:Create|Add|Remove|Delete|Update)(?:[A-Z]|$)/
64
- 'Post'
65
- else
66
- 'Get'
67
- end
68
- end
69
- end
70
- end
@@ -1,67 +0,0 @@
1
- require 'mailjet/api'
2
- require 'mailjet/list'
3
- require 'mailjet/contact'
4
-
5
- module Mailjet
6
- class Campaign < OpenStruct
7
-
8
- def update(options = {})
9
- (options.delete(:api) || Mailjet::Api.singleton).messageUpdatecampaign(options.reverse_merge(:id => self.id), 'Post')["status"]
10
- end
11
-
12
- def contacts(options = {})
13
- ((options.delete(:api) || Mailjet::Api.singleton).messageContacts(options.reverse_merge(:id => self.stats_campaign_id))["result"] || []).map do |contact|
14
- Mailjet::Contact.new(contact)
15
- end
16
- end
17
-
18
- def send!(options = {})
19
- (options.delete(:api) || Mailjet::Api.singleton).messageSendcampaign(options.reverse_merge(:id => self.id), 'Post')["status"]
20
- end
21
-
22
- def test(*params)
23
- options = params.last.is_a?(Hash) ? params.pop : {}
24
- email = params.first
25
- (options.delete(:api) || Mailjet::Api.singleton).messageTestcampaign(options.reverse_merge(:id => self.id, :email => email), 'Post')["status"]
26
- end
27
-
28
- def statistics(options = {})
29
- (options.delete(:api) || Mailjet::Api.singleton).messageStatistics(options.reverse_merge(:id => self.stats_campaign_id))["result"]
30
- end
31
-
32
- def html(options = {})
33
- (options.delete(:api) || Mailjet::Api.singleton).messageHtmlcampaign(options.reverse_merge(:id => self.id))["html"]
34
- end
35
-
36
- def set_html(*params)
37
- options = params.extract_options!
38
- html = params.first
39
- (options.delete(:api) || Mailjet::Api.singleton).messageSethtmlcampaign(options.reverse_merge(:id => self.id, :html => html), 'Post')["status"]
40
- end
41
-
42
- def duplicate(options = {})
43
- new_id = (options.delete(:api) || Mailjet::Api.singleton).messageDuplicatecampaign(options.reverse_merge(:id => self.id), 'Post')['new_id']
44
- self.class.new(:id => new_id)
45
- end
46
-
47
- class << self
48
- def create(options = {})
49
- campaign_attr = (options.delete(:api) || Mailjet::Api.singleton).messageCreatecampaign(options, 'Post')["campaign"]
50
- campaign = find(campaign_attr["id"]).tap{ |c| campaign_attr.each{ |k, v| c.send("#{k}=", v) } }
51
- campaign
52
- end
53
-
54
- def all(options = {})
55
- (options.delete(:api) || Mailjet::Api.singleton).messageCampaigns(options)["result"].map do |result_hash|
56
- self.new(result_hash)
57
- end
58
- end
59
-
60
- def find(*params)
61
- options = params.last.is_a?(Hash) ? params.pop : {}
62
- ids = params.flatten.map(&:to_s).reject(&:blank?)
63
- self.all(options).find{|c| c.id.to_s.in?(ids)}
64
- end
65
- end
66
- end
67
- end
data/lib/mailjet/click.rb DELETED
@@ -1,15 +0,0 @@
1
- require 'mailjet/api'
2
- require 'mailjet/contact'
3
- require 'mailjet/email'
4
-
5
- module Mailjet
6
- class Click < OpenStruct
7
- def contact
8
- Mailjet::Contact.new(:email => self.by_email, :id => self.by_id)
9
- end
10
-
11
- def email
12
- Mailjet::Email.new(:id => self.email_id)
13
- end
14
- end
15
- end
@@ -1,18 +0,0 @@
1
- require 'mailjet/api'
2
-
3
- module Mailjet
4
- class Contact < OpenStruct
5
- def infos(options = {})
6
- (options.delete(:api) || Mailjet::Api.singleton).contactInfos(options.reverse_merge(:contact => (self.id || self.email)))["contact"]
7
- end
8
-
9
- class << self
10
- def all(options = {})
11
- verb = options.delete(:openers) ? 'contactOpeners' : 'contactList'
12
- (options.delete(:api) || Mailjet::Api.singleton).send(verb, options)["result"].map do |result_hash|
13
- self.new(result_hash)
14
- end
15
- end
16
- end
17
- end
18
- end
data/lib/mailjet/email.rb DELETED
@@ -1,4 +0,0 @@
1
- module Mailjet
2
- class Email < OpenStruct
3
- end
4
- end
data/lib/mailjet/list.rb DELETED
@@ -1,58 +0,0 @@
1
- require 'mailjet/api'
2
- require 'mailjet/contact'
3
-
4
- module Mailjet
5
- class List < OpenStruct
6
- def update(options = {})
7
- (options.delete(:api) || Mailjet::Api.singleton).listsUpdate(options.reverse_merge(:id => self.id), 'Post')["status"]
8
- end
9
-
10
- def add_contacts(*params)
11
- options = params.last.is_a?(Hash) ? params.pop : {}
12
- contacts = params.map{|p| p.is_a?(Mailjet::Contact) ? p.email.to_s : p.to_s }.reject(&:blank?)
13
- (options.delete(:api) || Mailjet::Api.singleton).listsAddmanycontacts(options.reverse_merge(:contacts => contacts.to_json, :id => self.id), 'Post')["status"]
14
- end
15
-
16
- def unsubscribe_contact(*params)
17
- options = params.last.is_a?(Hash) ? params.pop : {}
18
- contact = params.map{|p| p.is_a?(Mailjet::Contact) ? p.email.to_s : p.to_s }.reject(&:blank?).first
19
- (options.delete(:api) || Mailjet::Api.singleton).listsUnsubcontact(options.reverse_merge(:contact => contact, :id => self.id), 'Post')["status"]
20
- end
21
-
22
- def remove_contacts(*params)
23
- options = params.last.is_a?(Hash) ? params.pop : {}
24
- contacts = params.map{|p| p.is_a?(Mailjet::Contact) ? p.email.to_s : p.to_s }.reject(&:blank?)
25
- (options.delete(:api) || Mailjet::Api.singleton).listsRemovemanycontacts(options.reverse_merge(:contacts => contacts.to_json, :id => self.id), 'Post')["status"]
26
- end
27
-
28
- def contacts(options = {})
29
- (options.delete(:api) || Mailjet::Api.singleton).listsContacts(options.reverse_merge(:id => self.id))["result"].map do |contact|
30
- Mailjet::Contact.new(contact)
31
- end
32
- end
33
-
34
- def email(options = {})
35
- (options.delete(:api) || Mailjet::Api.singleton).listsEmail(options.reverse_merge(:id => self.id))["email"]
36
- end
37
-
38
- def statistics(options = {})
39
- (options.delete(:api) || Mailjet::Api.singleton).listsStatistics(options.reverse_merge(:id => self.id))["statistics"]
40
- end
41
-
42
- def delete(options = {})
43
- (options.delete(:api) || Mailjet::Api.singleton).listsDelete(options.reverse_merge(:id => self.id))["status"]
44
- end
45
-
46
- class << self
47
- def create(options = {})
48
- self.new(options.merge(:id => (options.delete(:api) || Mailjet::Api.singleton).listsCreate(options)["list_id"].to_s))
49
- end
50
-
51
- def all(options = {})
52
- ((options.delete(:api) || Mailjet::Api.singleton).listsAll(options)["lists"] || []).map do |result_hash|
53
- self.new(result_hash)
54
- end
55
- end
56
- end
57
- end
58
- end
@@ -1,13 +0,0 @@
1
- require 'mailjet/api'
2
-
3
- module Mailjet
4
- class TemplateCategory < OpenStruct
5
- class << self
6
- def all(options = {})
7
- (options.delete(:api) || Mailjet::Api.singleton).messageTplcategories(options)["categories"].map do |result_hash|
8
- self.new(result_hash)
9
- end
10
- end
11
- end
12
- end
13
- end
@@ -1,13 +0,0 @@
1
- require 'mailjet/api'
2
-
3
- module Mailjet
4
- class TemplateModel < OpenStruct
5
- class << self
6
- def all(options = {})
7
- (options.delete(:api) || Mailjet::Api.singleton).messageTplmodels(options)["templates"].map do |result_hash|
8
- self.new(result_hash)
9
- end
10
- end
11
- end
12
- end
13
- end
@@ -1,72 +0,0 @@
1
- # encoding: utf-8
2
-
3
- require 'minitest_helper'
4
-
5
- describe Mailjet::ApiRequest do
6
-
7
- describe "#request_path" do
8
- it "should return the path of the method" do
9
- Mailjet::ApiRequest.new('method_name').send(:request_path).must_equal '/0.1/methodName?output=json'
10
- end
11
-
12
- it "should respect api_version" do
13
- Mailjet.config.expects(:api_version).returns(0.2)
14
- Mailjet::ApiRequest.new('method_name').send(:request_path).must_equal '/0.2/methodName?output=json'
15
- end
16
- end
17
-
18
- describe "#request_port" do
19
- it "should return 80 if use_https is false" do
20
- Mailjet.config.use_https = false
21
- Mailjet::ApiRequest.new('method_name').send(:request_port).must_equal 80
22
- end
23
-
24
- it "should return 443 if use_https is true" do
25
- Mailjet.config.use_https = true
26
- Mailjet::ApiRequest.new('method_name').send(:request_port).must_equal 443
27
- end
28
- end
29
-
30
- describe "#request" do
31
- it "should return an Http request" do
32
- request = Mailjet::ApiRequest.new('method_name', {}, 'Post')
33
- request.send(:request).must_be_kind_of(Net::HTTP::Post)
34
-
35
- request = Mailjet::ApiRequest.new('method_name', {}, 'Get')
36
- request.send(:request).must_be_kind_of(Net::HTTP::Get)
37
- end
38
- end
39
-
40
- describe "#response" do
41
- it "should raise an ApiError if authentication fails" do
42
- request = Mailjet::ApiRequest.new('method_name', {}, 'Get')
43
- lambda {
44
- request.response
45
- }.must_raise(Mailjet::ApiError)
46
- end
47
-
48
- it "should return a Hash with response values if request is ok" do
49
- request = Mailjet::ApiRequest.new('user_infos', {}, 'Get')
50
- response = request.response
51
- response.must_be_kind_of(Hash)
52
- response['infos']['username'].must_equal 'benoit.benezech@gmail.com'
53
- end
54
- end
55
-
56
- describe "#guess_request_type" do
57
- it "should return 'Post' if method_name contains a special verb" do
58
- Mailjet::ApiRequest.new('lists_add_contact').send(:guess_request_type).must_equal 'Post'
59
- Mailjet::ApiRequest.new('lists_create').send(:guess_request_type).must_equal 'Post'
60
- Mailjet::ApiRequest.new('lists_delete').send(:guess_request_type).must_equal 'Post'
61
- Mailjet::ApiRequest.new('lists_remove_contact').send(:guess_request_type).must_equal 'Post'
62
- Mailjet::ApiRequest.new('lists_update').send(:guess_request_type).must_equal 'Post'
63
- end
64
-
65
- it "should return 'Get' if method_name does not contain a verb" do
66
- Mailjet::ApiRequest.new('key_list').send(:guess_request_type).must_equal 'Get'
67
- Mailjet::ApiRequest.new('contact_list').send(:guess_request_type).must_equal 'Get'
68
- Mailjet::ApiRequest.new('lists_all').send(:guess_request_type).must_equal 'Get'
69
- Mailjet::ApiRequest.new('lists_email').send(:guess_request_type).must_equal 'Get'
70
- end
71
- end
72
- end
@@ -1,13 +0,0 @@
1
- # encoding: utf-8
2
- require 'minitest_helper'
3
-
4
- describe Mailjet::Api do
5
- describe "#method_missing" do
6
- it "should create an ApiRequest" do
7
-
8
- request = mock(:response => true)
9
- Mailjet::ApiRequest.expects(:new).with(:user_infos ,{:param1 => 1}, 'Post', Mailjet.config.api_key, Mailjet.config.secret_key).returns(request)
10
- Mailjet::Api.new.user_infos({:param1 => 1}, 'Post')
11
- end
12
- end
13
- end
@@ -1,66 +0,0 @@
1
- require 'minitest_helper'
2
-
3
- describe Mailjet::Campaign do
4
- it 'has an integration suite, tested directly against Mailjet service' do
5
-
6
- # init
7
- Mailjet::List.all.each do |list|
8
- list.delete
9
- end
10
- list = Mailjet::List.create(:label => 'My Mailjet list', :name => "mymailjetlist")
11
- list.add_contacts("c1@contacts.com", "c2@contacts.com")
12
-
13
- # Mailjet::Campaign.create
14
- campaign = Mailjet::Campaign.create(
15
- :title => "My Mailjet Campaign",
16
- :list_id => list.id,
17
- :from => Mailjet.config.default_from, # must be valid
18
- :from_name => "Sender Name",
19
- :subject => "Our new product",
20
- :template_id => Mailjet::TemplateModel.all.first.id,
21
- :lang => "en",
22
- :footer => "default"
23
- )
24
- campaign.url.must_match /^https\:\/\/www\.mailjet\.com\/campaigns\/template\/[0-9]+$/
25
-
26
- # Mailjet::Campaign.all
27
- campaigns = Mailjet::Campaign.all
28
- campaigns.wont_be_empty # we can't empty the whole campaign list...
29
- campaigns.first.must_be_instance_of Mailjet::Campaign
30
-
31
- # Mailjet::Campaign.find
32
- Mailjet::Campaign.find(campaign.id).must_be_instance_of Mailjet::Campaign
33
- Mailjet::Campaign.find(0).must_be_nil
34
-
35
- # Mailjet::Campaign#update
36
- campaign.update(:title => "My *new* Mailjet Campaign")
37
-
38
- # Mailjet::Campaign#duplicate
39
- dup = campaign.duplicate(:title => "My *new* Mailjet Campaign")
40
- dup.must_be_instance_of Mailjet::Campaign
41
- dup.id.wont_be_same_as campaign.id
42
-
43
- # Mailjet::Campaign#send!
44
- campaign.send!.must_equal 'OK'
45
-
46
- # Mailjet::Campaign#test
47
- campaign.test('benoit.benezech@gmail.com').must_equal 'OK'
48
-
49
- # Mailjet::Campaign#html
50
- campaign.html.must_be_nil
51
-
52
- # Mailjet::Campaign#set_html
53
- html_test = "<html><head><title>Test</title></head><body>Test <a href=\"[[UNSUB_LINK_EN]]\">[[UNSUB_LINK_EN]]</a></body></html>"
54
- dup.set_html(html_test).must_equal 'OK'
55
- dup.html.must_equal html_test
56
-
57
- sleep 20 # wait for the campaign to be send
58
- campaign = Mailjet::Campaign.find(campaign.id)
59
-
60
- # Mailjet::Campaign#contacts
61
- campaign.contacts.wont_be_empty
62
-
63
- # Mailjet::Campaign#statistics
64
- campaign.statistics.keys.must_include "blocked"
65
- end
66
- end