mailjet 0.0.5 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
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