mailjet 1.5.3 → 1.7.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,8 @@
1
+ # kindly generated by appropriated Rails generator
2
+ Mailjet.configure do |config|
3
+ config.api_key = '<%= @api_key %>'
4
+ config.secret_key = '<%= @secret_key %>'
5
+ config.default_from = '<%= @default_from %>'
6
+ <% if @api_v3_1 %><%= @api_v3_1_notice.split("\n").reject(&:empty?).map{ |l| ' # ' + l }.join("\n") %>
7
+ config.api_version = 'v3.1'<% end %>
8
+ end
@@ -1,29 +1,28 @@
1
- # encoding: utf-8
2
- require 'active_support'
1
+ require "json"
3
2
 
4
3
  module Mailjet
5
4
  class ApiError < StandardError
5
+ attr_reader :code, :reason
6
6
 
7
- attr_accessor :code, :reason
7
+ # @param code [Integer] HTTP response status code
8
+ # @param body [String] JSON response body
9
+ # @param request [Object] any request object
10
+ # @param url [String] request URL
11
+ # @param params [Hash] request headers and parameters
12
+ def initialize(code, body, request, url, params)
13
+ @code = code
14
+ @reason = begin
15
+ resdec = JSON.parse(body)
16
+ resdec['ErrorMessage']
17
+ rescue JSON::ParserError
18
+ body
19
+ end
8
20
 
21
+ message = "error #{code} while sending #{request.inspect} to #{url} with #{params.inspect}"
22
+ error_details = body.inspect
23
+ hint = "Please see https://dev.mailjet.com/guides/#status-codes for more informations on error numbers."
9
24
 
10
- def initialize(code, res, request, request_path, params)
11
- self.code = code
12
- self.reason = ""
13
- unless res.blank?
14
- resdec = ActiveSupport::JSON.decode(res)
15
- self.reason = resdec['ErrorMessage']
16
- end
17
- # code is ugly, output is pretty
18
- super("error #{code} while sending #{request.inspect} to #{request_path} with #{params.inspect}\n\n" +
19
- if res['errors'].present?
20
- [(res['errors'] || [])].flatten.map do |param, text|
21
- [param, text].map(&:to_s).reject(&:blank?).join(': ')
22
- end.join("\n")
23
- else
24
- res.inspect
25
- end + "\n\nPlease see https://dev.mailjet.com/guides/#status-codes for more informations on error numbers.\n\n"
26
- )
25
+ super("#{message}\n\n#{error_details}\n\n#{hint}\n\n")
27
26
  end
28
27
  end
29
28
  end
@@ -1,17 +1,69 @@
1
- require 'active_support/core_ext/module/attribute_accessors'
2
-
3
1
  module Mailjet
4
2
  module Configuration
5
- mattr_accessor :api_key, :secret_key, :default_from
3
+ def self.api_key
4
+ @api_key
5
+ end
6
+
7
+ def self.api_key=(api_key)
8
+ @api_key = api_key
9
+ end
10
+
11
+ def self.secret_key
12
+ @secret_key
13
+ end
14
+
15
+ def self.secret_key=(secret_key)
16
+ @secret_key = secret_key
17
+ end
18
+
19
+ def self.default_from
20
+ @default_from
21
+ end
22
+
23
+ def self.default_from=(default_from)
24
+ @default_from = default_from
25
+ end
26
+
27
+ def self.api_version
28
+ @api_version
29
+ end
30
+
31
+ def self.api_version=(api_version)
32
+ @api_version = api_version
33
+ end
34
+
35
+ def self.sandbox_mode
36
+ @sandbox_mode
37
+ end
38
+
39
+ def self.sandbox_mode=(sandbox_mode)
40
+ @sandbox_mode = sandbox_mode
41
+ end
42
+
43
+ def self.end_point
44
+ @end_point
45
+ end
46
+
47
+ def self.end_point=(end_point)
48
+ @end_point = end_point
49
+ end
50
+
51
+ def self.perform_api_call
52
+ @perform_api_call
53
+ end
54
+
55
+ def self.perform_api_call=(perform_api_call)
56
+ @perform_api_call = perform_api_call
57
+ end
6
58
 
7
59
  DEFAULT = {
8
60
  api_version: 'v3',
61
+ sandbox_mode: false,
9
62
  end_point: 'https://api.mailjet.com',
10
63
  perform_api_call: true,
11
64
  }
12
65
 
13
66
  DEFAULT.each do |param, default_value|
14
- mattr_accessor param
15
67
  self.send("#{param}=", default_value)
16
68
  end
17
69
  end
@@ -1,16 +1,13 @@
1
1
  require 'rest_client'
2
2
  require 'mailjet/gem_extensions/rest_client'
3
- require 'active_support/core_ext/module/delegation'
4
3
  require 'json'
5
4
 
6
5
  module Mailjet
7
6
  class Connection
8
7
 
9
- attr_accessor :adapter, :public_operations, :read_only, :perform_api_call
8
+ attr_accessor :adapter, :public_operations, :read_only, :perform_api_call, :read_timeout, :open_timeout
10
9
  alias :read_only? :read_only
11
10
 
12
- delegate :options, :concat_urls, :url, to: :adapter
13
-
14
11
  def [](suburl, &new_block)
15
12
  broken_url = url.split("/")
16
13
  if broken_url.include?("contactslist") && broken_url.include?("managemanycontacts") && broken_url.last.to_i > 0
@@ -35,8 +32,10 @@ module Mailjet
35
32
  adapter_class = options[:adapter_class] || RestClient::Resource
36
33
  self.public_operations = options[:public_operations] || []
37
34
  self.read_only = options[:read_only]
35
+ self.read_timeout = options[:read_timeout]
36
+ self.open_timeout = options[:open_timeout]
38
37
  # self.adapter = adapter_class.new(end_point, options.merge(user: api_key, password: secret_key, :verify_ssl => false, content_type: 'application/json'))
39
- self.adapter = adapter_class.new(end_point, options.merge(user: api_key, password: secret_key, content_type: 'application/json'))
38
+ self.adapter = adapter_class.new(end_point, options.merge(user: api_key, password: secret_key, content_type: 'application/json', read_timeout: self.read_timeout, open_timeout: self.open_timeout))
40
39
  self.perform_api_call = options.key?(:perform_api_call) ? options[:perform_api_call] : true
41
40
  end
42
41
 
@@ -56,6 +55,18 @@ module Mailjet
56
55
  handle_api_call(:delete, additional_headers, &block)
57
56
  end
58
57
 
58
+ def options
59
+ self.adapter.options
60
+ end
61
+
62
+ def concat_urls(*options)
63
+ self.adapter.concat_urls(*options)
64
+ end
65
+
66
+ def url
67
+ self.adapter.url
68
+ end
69
+
59
70
  private
60
71
 
61
72
  def handle_api_call(method, additional_headers = {}, payload = {}, &block)
@@ -85,7 +96,13 @@ module Mailjet
85
96
  formatted_payload = (additional_headers[:content_type] == :json) ? JSON.parse(payload) : payload
86
97
  params = params.merge(formatted_payload)
87
98
 
88
- raise Mailjet::ApiError.new(e.http_code, e.http_body, @adapter, @adapter.url, params)
99
+ http_body = if e.http_headers[:content_type] == "application/json"
100
+ e.http_body
101
+ else
102
+ "{}"
103
+ end
104
+
105
+ raise Mailjet::ApiError.new(e.http_code, http_body, @adapter, @adapter.url, params)
89
106
  end
90
107
 
91
108
  end
@@ -26,46 +26,55 @@ ActionMailer::Base.add_delivery_method :mailjet, Mailjet::Mailer
26
26
  # Mailjet sends API expects a JSON payload as the input.
27
27
  # The deliver methods maps the Mail::Message attributes to the MailjetSend API JSON expected structure
28
28
  class Mailjet::APIMailer
29
- def initialize(options = {})
30
- # send = Mailjet.Send.new
31
- # if send.version.exists
32
- # version = send.version
33
- # else
34
- @version = Mailjet.config.api_version
35
- # end
36
- @delivery_method_options_v3_0 = options.slice(
37
- :api_key, :secret_key,
38
- :recipients, :'mj-prio', :'mj-campaign', :'mj-deduplicatecampaign',
39
- :'mj-templatelanguage', :'mj-templateerrorreporting', :'mj-templateerrordeliver', :'mj-templateid',
40
- :'mj-trackopen', :'mj-trackclick',
41
- :'mj-customid', :'mj-eventpayload', :vars, :headers,
42
- )
43
- @delivery_method_options_v3_1 = options.slice(
44
- :api_key, :secret_key,
45
- :'Priority', :'CustomCampaign', :'DeduplicateCampaign',
46
- :'TemplateLanguage', :'TemplateErrorReporting', :'TemplateErrorDeliver', :'TemplateID',
47
- :'TrackOpens', :'TrackClicks',
48
- :'CustomID', :'EventPayload', :'Variables', :'Headers',
49
- )
29
+ V3_0_PERMITTED_OPTIONS = [
30
+ :recipients, :'mj-prio', :'mj-campaign', :'mj-deduplicatecampaign',
31
+ :'mj-templatelanguage', :'mj-templateerrorreporting', :'mj-templateerrordeliver', :'mj-templateid',
32
+ :'mj-trackopen', :'mj-trackclick',
33
+ :'mj-customid', :'mj-eventpayload', :vars, :headers,
34
+ ]
35
+
36
+ V3_1_PERMITTED_OPTIONS = [
37
+ :'Priority', :'CustomCampaign', :'DeduplicateCampaign',
38
+ :'TemplateLanguage', :'TemplateErrorReporting', :'TemplateErrorDeliver', :'TemplateID',
39
+ :'TrackOpens', :'TrackClicks',
40
+ :'CustomID', :'EventPayload', :'Variables', :'Headers',
41
+ ]
42
+
43
+ CONNECTION_PERMITTED_OPTIONS = [:api_key, :secret_key]
44
+
45
+ HEADER_BLACKLIST = [
46
+ 'from', 'sender', 'subject', 'to', 'cc', 'bcc', 'return-path', 'delivered-to', 'dkim-signature',
47
+ 'domainkey-status', 'received-spf', 'authentication-results', 'received', 'user-agent', 'x-mailer',
48
+ 'x-feedback-id', 'list-id', 'date', 'x-csa-complaints', 'message-id', 'reply-to', 'content-type',
49
+ 'mime-version', 'content-transfer-encoding'
50
+ ]
51
+
52
+ def initialize(opts = {})
53
+ options = HashWithIndifferentAccess.new(opts)
54
+
55
+ @version = options[:version]
56
+ @delivery_method_options_v3_0 = options.slice(*V3_0_PERMITTED_OPTIONS)
57
+ @delivery_method_options_v3_1 = options.slice(*V3_1_PERMITTED_OPTIONS)
58
+ @connection_options = options.slice(*CONNECTION_PERMITTED_OPTIONS)
50
59
  end
51
60
 
52
- def deliver!(mail, options = {})
61
+ def deliver!(mail, opts = {})
62
+ options = HashWithIndifferentAccess.new(opts)
53
63
 
54
- if (options && options.kind_of?(Object) && options['version'].present?)
55
- @version = options['version']
56
- end
64
+ # Mailjet Send API does not support full from. Splitting the from field into two: name and email address
65
+ mail[:from] ||= Mailjet.config.default_from if Mailjet.config.default_from
57
66
 
58
- if (!options.kind_of?(Object))
59
- options = []
60
- end
67
+ # add `@connection_options` in `options` only if not exist yet (values in `options` prime)
68
+ options.reverse_merge!(@connection_options)
61
69
 
62
- # Mailjet Send API does not support full from. Splitting the from field into two: name and email address
63
- if mail[:from].nil? && Mailjet.config.default_from.present?
64
- mail[:from] = Mailjet.config.default_from
65
- end
70
+ # add `@version` in options if set
71
+ options[:version] = @version if @version
72
+
73
+ # `options[:version]` primes on global config
74
+ version = options[:version] || Mailjet.config.api_version
66
75
 
67
- if (@version == 'v3.1')
68
- Mailjet::Send.create({:Messages => [setContentV3_1(mail)]}, options)
76
+ if (version == 'v3.1')
77
+ Mailjet::Send.create({ :Messages => [setContentV3_1(mail)], SandboxMode: Mailjet.config.sandbox_mode }, options)
69
78
  else
70
79
  Mailjet::Send.create(setContentV3_0(mail), options)
71
80
  end
@@ -108,7 +117,7 @@ class Mailjet::APIMailer
108
117
  if mail.header && mail.header.fields.any?
109
118
  content[:Headers] = {}
110
119
  mail.header.fields.each do |header|
111
- if header.name.start_with?('X-') && !header.name.start_with?('X-MJ') && !header.name.start_with?('X-Mailjet')
120
+ if !header.name.start_with?('X-MJ') && !header.name.start_with?('X-Mailjet') && !HEADER_BLACKLIST.include?(header.name.downcase)
112
121
  content[:Headers][header.name] = header.value
113
122
  end
114
123
  end
@@ -117,8 +126,8 @@ class Mailjet::APIMailer
117
126
  # ReplyTo property was added in v3.1
118
127
  # Passing it as an header if mail.reply_to
119
128
 
120
- if mail.reply_to
121
- if mail.reply_to.respond_to?(:display_names) && mail.reply_to.display_names.first
129
+ if mail[:reply_to]
130
+ if mail[:reply_to].respond_to?(:display_names) && mail[:reply_to].display_names.first
122
131
  content[:ReplyTo] = {:Email=> mail[:reply_to].addresses.first, :Name=> mail[:reply_to].display_names.first}
123
132
  else
124
133
  content[:ReplyTo] = {:Email=> mail[:reply_to].addresses.first}
@@ -161,8 +170,13 @@ class Mailjet::APIMailer
161
170
  ccs =[{:Email=>mail[:cc].address.first}]
162
171
  end
163
172
  else
173
+ ccs = []
164
174
  mail[:cc].each do |cc|
165
- ccs << {:Email=> cc.address, :Name=>cc.display_name}
175
+ if cc.display_name
176
+ ccs << {:Email=> cc.address, :Name=>cc.display_name}
177
+ else
178
+ ccs << {:Email=> cc.address}
179
+ end
166
180
  end
167
181
  end
168
182
  end
@@ -175,7 +189,8 @@ class Mailjet::APIMailer
175
189
  payload[:Bcc] = [{:Email=>mail[:bcc].address.first}]
176
190
  end
177
191
  else
178
- mail[:bcc].formatted.each do |bcc|
192
+ bccs = []
193
+ mail[:bcc].each do |bcc|
179
194
  if bcc.display_name
180
195
  bccs << {:Email=> bcc.address, :Name=>bcc.display_name}
181
196
  else
@@ -196,7 +211,26 @@ class Mailjet::APIMailer
196
211
  payload[:Cc] = ccs if mail[:cc]
197
212
  payload[:Bcc] = bccs if mail[:bcc]
198
213
 
199
- payload
214
+ decode_emails_V3_1!(payload)
215
+ end
216
+
217
+ def decode_emails_V3_1!(payload)
218
+ # ActionMailer may have handed us encoded email
219
+ # addresses, mailjet will reject. Therefore we
220
+ # walk through the payload to decode them back.
221
+ payload.each do |key, value|
222
+ if key == :Email
223
+ payload[key] = Mail::Encodings.value_decode(value)
224
+ elsif value.is_a?(Hash)
225
+ decode_emails_V3_1! value
226
+ elsif value.is_a?(Array)
227
+ value.each do |item|
228
+ if item.is_a?(Hash)
229
+ decode_emails_V3_1! item
230
+ end
231
+ end
232
+ end
233
+ end
200
234
  end
201
235
 
202
236
  def setContentV3_0(mail)
@@ -263,7 +297,7 @@ class Mailjet::APIMailer
263
297
  payload.merge(content)
264
298
  .merge(base_from)
265
299
  .merge(@delivery_method_options_v3_0)
266
- end
300
+ end
267
301
  end
268
302
 
269
303
  ActionMailer::Base.add_delivery_method :mailjet_api, Mailjet::APIMailer
@@ -1,6 +1,5 @@
1
- require 'active_support'
2
1
  require 'rack/request'
3
-
2
+ require 'json'
4
3
 
5
4
  module Mailjet
6
5
  module Rack
@@ -13,7 +12,7 @@ module Mailjet
13
12
 
14
13
  def call(env)
15
14
  if env['PATH_INFO'] == @path && (content = env['rack.input'].read)
16
- @block.call(ActiveSupport::JSON.decode(content))
15
+ @block.call(JSON.parse(content))
17
16
  [200, { 'Content-Type' => 'text/html', 'Content-Length' => '0' }, []]
18
17
  else
19
18
  @app.call(env)
@@ -1,11 +1,7 @@
1
1
  require 'mailjet/connection'
2
- require 'active_support/hash_with_indifferent_access'
3
- require 'active_support/core_ext/class'
4
- require 'active_support/core_ext/hash'
5
2
  require 'active_support/core_ext/string'
6
3
  require 'active_support/core_ext/module/delegation'
7
- require 'active_support/concern'
8
- require 'active_support/json/decoding'
4
+ require 'active_support/hash_with_indifferent_access'
9
5
  #require 'mail'
10
6
  require 'json'
11
7
 
@@ -18,35 +14,42 @@ require 'json'
18
14
 
19
15
  module Mailjet
20
16
  module Resource
21
- extend ActiveSupport::Concern
17
+
18
+ # define here available options for filtering
19
+ OPTIONS = [:version, :url, :perform_api_call, :api_key, :secret_key, :read_timeout, :open_timeout]
22
20
 
23
21
  NON_JSON_URLS = ['v3/send/message'] # urls that don't accept JSON input
24
22
 
25
- included do
26
- cattr_accessor :resource_path, :public_operations, :read_only, :filters, :resourceprop, :action, :non_json_urls, :version
27
- cattr_writer :connection
23
+ def self.included(base)
24
+ base.extend ClassMethods
25
+ base.class_eval do
26
+ cattr_accessor :resource_path, :public_operations, :read_only, :filters, :resourceprop, :action, :non_json_urls, :version
27
+ cattr_writer :connection
28
28
 
29
- def self.connection(options = {})
30
- class_variable_get(:@@connection) || default_connection(options)
31
- end
29
+ def self.connection(options = {})
30
+ class_variable_get(:@@connection) || default_connection(options)
31
+ end
32
32
 
33
- def self.default_connection(options = {})
34
- Mailjet::Connection.new(
35
- "#{options[:url]}/#{options[:version]}/#{resource_path}",
36
- options[:api_key] || Mailjet.config.api_key,
37
- options[:secret_key] || Mailjet.config.secret_key,
38
- public_operations: public_operations,
39
- read_only: read_only,
40
- perform_api_call: options[:perform_api_call])
41
- end
33
+ def self.default_connection(options = {})
34
+ Mailjet::Connection.new(
35
+ "#{options[:url]}/#{options[:version]}/#{resource_path}",
36
+ options[:api_key] || Mailjet.config.api_key,
37
+ options[:secret_key] || Mailjet.config.secret_key,
38
+ public_operations: public_operations,
39
+ read_only: read_only,
40
+ perform_api_call: options[:perform_api_call],
41
+ open_timeout: options[:open_timeout],
42
+ read_timeout: options[:read_timeout])
43
+ end
42
44
 
43
- def self.default_headers
44
- if NON_JSON_URLS.include?(self.resource_path) # don't use JSON if Send API
45
- default_headers = { accept: :json, accept_encoding: :deflate }
46
- else
47
- default_headers = { accept: :json, accept_encoding: :deflate, content_type: :json } #use JSON if *not* Send API
45
+ def self.default_headers
46
+ if NON_JSON_URLS.include?(self.resource_path) # don't use JSON if Send API
47
+ default_headers = { accept: :json, accept_encoding: :deflate }
48
+ else
49
+ default_headers = { accept: :json, accept_encoding: :deflate, content_type: :json } #use JSON if *not* Send API
50
+ end
51
+ return default_headers.merge(user_agent: "mailjet-api-v3-ruby/#{Gem.loaded_specs["mailjet"].version}")
48
52
  end
49
- return default_headers.merge(user_agent: "mailjet-api-v3-ruby/#{Gem.loaded_specs["mailjet"].version}")
50
53
  end
51
54
  end
52
55
 
@@ -56,7 +59,7 @@ module Mailjet
56
59
  end
57
60
 
58
61
  def all(params = {}, options = {})
59
- opts = change_resource_path(options)
62
+ opts = define_options(options)
60
63
  params = format_params(params)
61
64
  response = connection(opts).get(default_headers.merge(params: params))
62
65
  attribute_array = parse_api_json(response)
@@ -64,18 +67,24 @@ module Mailjet
64
67
  end
65
68
 
66
69
  def count(options = {})
67
- opts = change_resource_path(options)
70
+ opts = define_options(options)
68
71
  response_json = connection(opts).get(default_headers.merge(params: {limit: 1, countrecords: 1}))
69
- response_hash = ActiveSupport::JSON.decode(response_json)
72
+ response_hash = JSON.parse(response_json)
70
73
  response_hash['Total']
71
74
  end
72
75
 
73
76
  def find(id, job_id = nil, options = {})
77
+ normalized_id = if id.is_a? String
78
+ URI.encode_www_form_component(id)
79
+ else
80
+ id
81
+ end
82
+
74
83
  # if action method, ammend url to appropriate id
75
- opts = change_resource_path(options)
76
- self.resource_path = create_action_resource_path(id, job_id) if self.action
84
+ opts = define_options(options)
85
+ self.resource_path = create_action_resource_path(normalized_id, job_id) if self.action
77
86
  #
78
- attributes = parse_api_json(connection(opts)[id].get(default_headers)).first
87
+ attributes = parse_api_json(connection(opts)[normalized_id].get(default_headers)).first
79
88
  instanciate_from_api(attributes)
80
89
 
81
90
  rescue Mailjet::ApiError => e
@@ -88,8 +97,8 @@ module Mailjet
88
97
 
89
98
  def create(attributes = {}, options = {})
90
99
  # if action method, ammend url to appropriate id
91
- opts = change_resource_path(options)
92
- self.resource_path = create_action_resource_path(attributes[:id]) if self.action
100
+ opts = define_options(options)
101
+ self.resource_path = create_action_resource_path(attributes[:id]) if (self.action and attributes[:id])
93
102
  attributes.tap { |hs| hs.delete(:id) }
94
103
 
95
104
  if Mailjet.config.default_from and self.resource_path == 'send/'
@@ -103,14 +112,14 @@ module Mailjet
103
112
 
104
113
  self.new(attributes).tap do |resource|
105
114
  resource.save!(opts)
106
- resource.persisted = true
115
+ resource.attributes[:persisted] = true
107
116
  end
108
117
 
109
118
  end
110
119
 
111
120
  def delete(id, options = {})
112
121
  # if action method, ammend url to appropriate id
113
- opts = change_resource_path(options)
122
+ opts = define_options(options)
114
123
  self.resource_path = create_action_resource_path(id) if self.action
115
124
  connection(opts)[id].delete(default_headers)
116
125
  end
@@ -120,7 +129,7 @@ module Mailjet
120
129
  end
121
130
 
122
131
  def parse_api_json(response_json)
123
- response_hash = ActiveSupport::JSON.decode(response_json)
132
+ response_hash = JSON.parse(response_json)
124
133
 
125
134
  #Take the response from the API and put it through a method -- taken from the ActiveSupport library -- which converts
126
135
  #the date-time from "2014-05-19T15:31:09Z" to "Mon, 19 May 2014 15:31:09 +0000" format.
@@ -135,17 +144,17 @@ module Mailjet
135
144
  end
136
145
 
137
146
  def create_action_resource_path(id, job_id = nil)
138
- url_elements = self.resource_path.split("/")
139
- url_elements.delete_at(url_elements.length-1) if url_elements.last.to_i > 0 #if there is a trailing number for the job id from last call, delete it
147
+ url_elements = self.resource_path.split("/")
148
+ url_elements.delete_at(url_elements.length-1) if url_elements.last.to_i > 0 #if there is a trailing number for the job id from last call, delete it
140
149
 
141
- if !(url_elements[1] == "contacts" && self.action == "managemanycontacts")
142
- url_elements[2] = id.to_s
143
- end
150
+ if !(url_elements[1] == "contacts" && self.action == "managemanycontacts")
151
+ url_elements[2] = id.to_s
152
+ end
144
153
 
145
- url_elements << job_id.to_s if job_id #if job_id exists, amend it to end of the URI
146
- url = url_elements.join("/")
154
+ url_elements << job_id.to_s if job_id #if job_id exists, amend it to end of the URI
155
+ url = url_elements.join("/")
147
156
 
148
- return url
157
+ return url
149
158
  end
150
159
 
151
160
 
@@ -211,26 +220,14 @@ module Mailjet
211
220
  end
212
221
  end
213
222
 
214
- def change_resource_path(options = {})
215
- ver = choose_version(options)
216
- url = Mailjet.config.end_point
217
- perform_api_call = Mailjet.config.perform_api_call
218
- if options.any?
219
- if options.key?(:perform_api_call)
220
- perform_api_call = options[:perform_api_call]
221
- end
222
- if options.key?(:url)
223
- url = options[:url]
224
- end
225
- end
226
- ret = {version: ver, url: url, perform_api_call: perform_api_call}
227
- ret
228
- end
229
-
230
- def choose_version(options = {})
231
- ver = options['version'] || Mailjet.config.api_version || version
232
-
233
- ver
223
+ def define_options(options = {})
224
+ # merge default options with given ones on-the-fly
225
+ {
226
+ version: version || Mailjet.config.api_version,
227
+ url: Mailjet.config.end_point,
228
+ perform_api_call: Mailjet.config.perform_api_call
229
+ }
230
+ .merge(options.symbolize_keys.slice(*OPTIONS))
234
231
  end
235
232
 
236
233
  end
@@ -246,7 +243,7 @@ module Mailjet
246
243
  end
247
244
 
248
245
  def save(options = {})
249
- opts = self.class.change_resource_path(options)
246
+ opts = self.class.define_options(options)
250
247
 
251
248
  if persisted?
252
249
  # case where the entity is updated
@@ -259,7 +256,7 @@ module Mailjet
259
256
  if opts[:perform_api_call] && !persisted?
260
257
  # get attributes only for entity creation
261
258
  self.attributes = if self.resource_path == 'send'
262
- ActiveSupport::JSON.decode(response)
259
+ JSON.parse(response)
263
260
  else
264
261
  parse_api_json(response).first
265
262
  end
@@ -297,11 +294,11 @@ module Mailjet
297
294
  end
298
295
  end
299
296
 
300
- opts = self.class.change_resource_path(options)
297
+ opts = self.class.define_options(options)
301
298
  save(opts)
302
299
  end
303
300
 
304
- def delete(call)
301
+ def delete
305
302
  self.class.delete(id)
306
303
  end
307
304
 
@@ -318,12 +315,14 @@ module Mailjet
318
315
  def formatted_payload
319
316
  payload = attributes.reject { |k,v| v.blank? }
320
317
  if persisted?
321
- payload = payload.slice(*resourceprop)
318
+ payload = payload.slice(*resourceprop.map(&:to_s))
322
319
  end
323
320
  payload = camelcase_keys(payload)
324
321
  payload.tap { |hs| hs.delete("Persisted") }
325
322
  payload.inject({}) do |h, (k, v)|
326
- v = v.utc.as_json if v.respond_to? :utc
323
+ if v.respond_to? :utc
324
+ v = v.utc.to_s
325
+ end
327
326
  h.merge!({k => v})
328
327
  end
329
328
  end
@@ -346,20 +345,16 @@ module Mailjet
346
345
 
347
346
  def method_missing(method_symbol, *arguments) #:nodoc:
348
347
  method_name = method_symbol.to_s
349
- if method_name =~ /(=|\?)$/
350
- case $1
351
- when "="
352
- attributes[$`] = arguments.first
353
- when "?"
354
- attributes[$`]
355
- end
356
- else
357
- return attributes[method_name] if attributes.include?(method_name)
358
- # not set right now but we know about it
359
- # return nil if known_attributes.include?(method_name)
360
- super
348
+ if method_name.end_with?("=")
349
+ attributes[method_name.chop] = arguments.first
350
+ return
361
351
  end
362
- end
363
352
 
353
+ if attributes.include?(method_name)
354
+ return attributes[method_name]
355
+ end
356
+
357
+ super
358
+ end
364
359
  end
365
360
  end