mailgun-ruby 1.4.0 → 1.4.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.
data/lib/mailgun.rb CHANGED
@@ -1,25 +1,41 @@
1
+ # require ruby dependencies
2
+ require 'json'
3
+ require 'openssl'
1
4
  require 'tempfile'
2
- require 'faraday'
5
+ require 'time'
6
+ require 'uri'
3
7
  require 'yaml'
4
- require 'json'
5
8
 
6
- require 'mailgun/version'
7
- require 'mailgun/client'
8
- require 'mailgun/response'
9
- require 'mailgun/chains'
10
- require 'mailgun/address'
11
- require 'mailgun/lists/opt_in_handler'
12
- require 'mailgun/messages/batch_message'
13
- require 'mailgun/messages/message_builder'
14
- require 'mailgun/events/events'
9
+ # require external dependencies
10
+ require 'faraday'
11
+ require 'faraday/multipart'
12
+ require 'mini_mime'
13
+ require 'zeitwerk'
14
+
15
15
  require 'mailgun/exceptions/exceptions'
16
- require 'mailgun/domains/domains'
17
- require 'mailgun/webhooks/webhooks'
18
- require 'mailgun/templates/templates'
19
- require 'mailgun/subaccounts/subaccounts'
20
- require 'mailgun/tags/tags'
21
- require 'mailgun/metrics/metrics'
22
- require 'mailgun/logs/logs'
16
+ require 'mailgun/helpers/api_version_checker'
17
+
18
+ # load zeitwerk
19
+ Zeitwerk::Loader.for_gem.tap do |loader| # rubocop:disable Style/SymbolProc
20
+ loader.ignore("#{__dir__}/mailgun-ruby.rb")
21
+ loader.ignore("#{__dir__}/railgun.rb")
22
+ loader.ignore("#{__dir__}/railgun")
23
+
24
+ loader.collapse("#{__dir__}/mailgun/analytics_tags")
25
+ loader.collapse("#{__dir__}/mailgun/domains")
26
+ loader.collapse("#{__dir__}/mailgun/events")
27
+ loader.collapse("#{__dir__}/mailgun/exceptions")
28
+ loader.collapse("#{__dir__}/mailgun/helpers")
29
+ loader.collapse("#{__dir__}/mailgun/lists")
30
+ loader.collapse("#{__dir__}/mailgun/logs")
31
+ loader.collapse("#{__dir__}/mailgun/messages")
32
+ loader.collapse("#{__dir__}/mailgun/metrics")
33
+ loader.collapse("#{__dir__}/mailgun/subaccounts")
34
+ loader.collapse("#{__dir__}/mailgun/tags")
35
+ loader.collapse("#{__dir__}/mailgun/templates")
36
+ loader.collapse("#{__dir__}/mailgun/webhooks")
37
+ loader.setup
38
+ end
23
39
 
24
40
  # Module for interacting with the sweet Mailgun API.
25
41
  #
@@ -1,9 +1,3 @@
1
- require 'action_mailer'
2
- require 'json'
3
- require 'mailgun'
4
- require 'rails'
5
- require 'railgun/errors'
6
-
7
1
  module Railgun
8
2
 
9
3
  # Railgun::Mailer is an ActionMailer provider for sending mail through
@@ -1,8 +1,15 @@
1
- require 'railgun/mailer'
2
-
3
1
  module Railgun
4
2
  class Railtie < ::Rails::Railtie
5
3
  ActiveSupport.on_load(:action_mailer) do
4
+ Mail::Message.class_eval do
5
+ # Attributes to hold Mailgun-specific information
6
+ attr_accessor :mailgun_variables,
7
+ :mailgun_options,
8
+ :mailgun_recipient_variables,
9
+ :mailgun_headers,
10
+ :mailgun_template_variables
11
+ end
12
+
6
13
  add_delivery_method :mailgun, Railgun::Mailer
7
14
  ActiveSupport.run_load_hooks(:mailgun_mailer, Railgun::Mailer)
8
15
  end
data/lib/railgun.rb CHANGED
@@ -1,8 +1,15 @@
1
- require 'railgun/railtie'
2
- require 'railgun/attachment'
3
- require 'railgun/errors'
4
- require 'railgun/mailer'
5
- require 'railgun/message'
1
+ # require ruby dependencies
2
+ require 'json'
3
+
4
+ # require external dependencies
5
+ require 'action_mailer'
6
+ require 'mail'
7
+ require 'mailgun'
8
+ require 'rails'
6
9
 
7
10
  module Railgun
11
+ require_relative 'railgun/attachment'
12
+ require_relative 'railgun/errors'
13
+ require_relative 'railgun/mailer'
14
+ require_relative 'railgun/railtie'
8
15
  end
data/mailgun.gemspec CHANGED
@@ -25,19 +25,19 @@ Gem::Specification.new do |spec|
25
25
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
26
26
  spec.require_paths = ["lib"]
27
27
 
28
- spec.required_ruby_version = '>= 2.6.10'
28
+ spec.required_ruby_version = '>= 3.0.0'
29
29
 
30
30
  spec.add_development_dependency 'bundler', '>= 1.16.2'
31
31
  spec.add_development_dependency 'rspec', '~> 3.13.0'
32
- spec.add_development_dependency 'rspec-its', '~> 1.3.1'
33
- spec.add_development_dependency 'rake', '~> 12.3.2'
32
+ spec.add_development_dependency 'rspec-its', '~> 2.0.0'
33
+ spec.add_development_dependency 'rake', '~> 13.3.1'
34
34
  spec.add_development_dependency 'webmock', '~> 3.7'
35
- spec.add_development_dependency 'pry', '~> 0.15.2'
36
- spec.add_development_dependency 'vcr', '~> 3.0.3'
35
+ spec.add_development_dependency 'pry', '~> 0.16.0'
36
+ spec.add_development_dependency 'vcr', '~> 6.4.0'
37
37
  spec.add_development_dependency 'simplecov', '~> 0.16.1'
38
38
  spec.add_development_dependency 'rails'
39
39
  spec.add_dependency 'mini_mime'
40
40
  spec.add_dependency 'faraday', "~> 2.1"
41
- spec.add_dependency 'faraday-multipart', '~> 1.1.0'
42
-
41
+ spec.add_dependency 'faraday-multipart', '< 2'
42
+ spec.add_dependency 'zeitwerk'
43
43
  end
@@ -9,276 +9,302 @@ describe 'For the domains endpoint', vcr: vcr_opts do
9
9
  let(:mg_obj) { Mailgun::Domains.new(mg_client) }
10
10
  let(:domain) { 'integration-test.domain.invalid' }
11
11
 
12
- describe '#add_domain' do
13
- let(:api_version) { 'v4' }
12
+ context 'Core Domains methods' do
13
+ describe '#list' do
14
+ let(:api_version) { 'v4' }
14
15
 
15
- it 'creates a domain' do
16
- response = mg_obj.add_domain(domain, { spam_action: 'tag' })
16
+ it 'returns a list of domains' do
17
+ response = mg_obj.list
17
18
 
18
- expect(response['domain']['name']).to eq(domain)
19
- expect(response['domain']['spam_action']).to eq('tag')
19
+ expect(response.size).to be > 0
20
+ end
20
21
  end
21
- end
22
22
 
23
- describe '#get' do
24
- let(:api_version) { 'v4' }
23
+ describe '#create' do
24
+ let(:api_version) { 'v4' }
25
25
 
26
- it 'returns the domain' do
27
- response = mg_obj.get(domain)
26
+ it 'creates a domain' do
27
+ response = mg_obj.create(domain, { spam_action: 'tag' })
28
28
 
29
- expect(response).to include('domain')
30
- expect(response['domain']['name']).to eq(domain)
29
+ expect(response['domain']['name']).to eq(domain)
30
+ expect(response['domain']['spam_action']).to eq('tag')
31
+ end
31
32
  end
32
- end
33
33
 
34
- describe '#get_domains' do
35
- let(:api_version) { 'v4' }
34
+ describe '#get' do
35
+ let(:api_version) { 'v4' }
36
36
 
37
- it 'returns a list of domains' do
38
- response = mg_obj.get_domains
37
+ it 'returns the domain' do
38
+ response = mg_obj.get(domain)
39
39
 
40
- expect(response.size).to be > 0
40
+ expect(response).to include('domain')
41
+ expect(response['domain']['name']).to eq(domain)
42
+ end
41
43
  end
42
- end
43
44
 
44
- context '#update' do
45
- let(:api_version) { 'v4' }
45
+ context '#update' do
46
+ let(:api_version) { 'v4' }
46
47
 
47
- it 'updates the domain' do
48
- response = mg_obj.update(domain, { spam_action: 'block', web_scheme: 'https', wildcard: true })
48
+ it 'updates the domain' do
49
+ response = mg_obj.update(domain, { spam_action: 'block', web_scheme: 'https', wildcard: true })
49
50
 
50
- expect(response['domain']['spam_action']).to eq('block')
51
- expect(response['domain']['web_scheme']).to eq('https')
52
- expect(response['domain']['wildcard']).to eq(true)
51
+ expect(response['domain']['spam_action']).to eq('block')
52
+ expect(response['domain']['web_scheme']).to eq('https')
53
+ expect(response['domain']['wildcard']).to eq(true)
54
+ end
53
55
  end
54
- end
55
-
56
- context 'delete a domain' do
57
- subject(:response) { mg_obj.delete(domain) }
58
56
 
59
- it { is_expected.to be_falsey }
60
- end
57
+ context '#verify' do
58
+ let(:api_version) { 'v4' }
61
59
 
62
- describe '#create_smtp_credentials' do
63
- it 'creates smtp credentials for domain' do
64
- result = mg_obj.create_smtp_credentials(
65
- domain,
66
- {
67
- login: 'test_login'
68
- }
69
- )
60
+ it 'verifies the domain' do
61
+ response = mg_obj.verify(domain)
70
62
 
71
- expect(result['message']).to eq("Created 1 credentials pair(s)")
63
+ expect(response['message']).to eq('Domain DNS records have been updated')
64
+ end
72
65
  end
73
- end
74
66
 
75
- describe '#update_smtp_credentials' do
76
- it 'updates smtp credentials for domain' do
77
- result = mg_obj.update_smtp_credentials(
78
- domain,
79
- 'test_login',
80
- {
81
- spec: 'abc'
82
- }
83
- )
84
-
85
- expect(result['message']).to eq('Password changed')
67
+ context 'delete a domain' do
68
+ subject(:response) { mg_obj.remove(domain) }
69
+
70
+ it { is_expected.to be_falsey }
86
71
  end
87
72
  end
88
73
 
89
- describe '#delete_smtp_credentials' do
90
- it 'deletes smtp credentials for domain' do
91
- result = mg_obj.delete_smtp_credentials(
92
- domain,
93
- 'test_login'
94
- )
95
74
 
96
- expect(result['message']).to eq('Credentials have been deleted')
97
- end
98
- end
75
+ context 'Domain::Keys methods' do
76
+ describe '#list_domain_keys' do
77
+ let(:api_version) { 'v1' }
99
78
 
100
- describe '#get_domain_connection_settings' do
101
- it 'returns delivery connection settings for the defined domain' do
102
- result = mg_obj.get_domain_connection_settings(
103
- domain
104
- )
79
+ it 'lists all domain keys' do
80
+ result = mg_obj.list_domain_keys(
81
+ {
82
+ signing_domain: domain
83
+ }
84
+ )
105
85
 
106
- expect(result).to include(
107
- 'require_tls' => false,
108
- 'skip_verification' => false
109
- )
86
+ expect(result).to include('items')
87
+ expect(result['items'].first['selector']).to eq('k1')
88
+ end
110
89
  end
111
- end
112
90
 
113
- describe '#update_domain_connection_settings' do
114
- it 'updates the specified delivery connection settings' do
115
- result = mg_obj.update_domain_connection_settings(
116
- domain,
117
- {
118
- require_tls: true,
119
- skip_verification: true
120
- }
121
- )
122
-
123
- expect(result).to include(
124
- 'require_tls' => true,
125
- 'skip_verification' => true
126
- )
127
- end
128
- end
91
+ describe '#create_domain_key' do
92
+ let(:api_version) { 'v1' }
129
93
 
130
- describe '#get_domain_tracking_settings' do
131
- it 'returns tracking settings for the defined domain' do
132
- result = mg_obj.get_domain_tracking_settings(
133
- domain
134
- )
94
+ it 'creates a domain key' do
95
+ result = mg_obj.create_domain_key(
96
+ {
97
+ signing_domain: domain,
98
+ selector: 'test'
99
+ }
100
+ )
135
101
 
136
- expect(result).to include('tracking')
137
- expect(result['tracking']['click']['active']).to eq(false)
102
+ expect(result['signing_domain']).to eq(domain)
103
+ expect(result['selector']).to eq('test')
104
+ end
138
105
  end
139
- end
140
106
 
141
- describe '#update_domain_tracking_open_settings' do
142
- it 'updates the specified tracking open settings' do
143
- result = mg_obj.update_domain_tracking_open_settings(
144
- domain,
145
- {
146
- active: false
147
- }
148
- )
107
+ describe '#delete_domain_key' do
108
+ let(:api_version) { 'v1' }
109
+
110
+ it 'deletes a domain key' do
111
+ result = mg_obj.delete_domain_key(
112
+ {
113
+ signing_domain: domain,
114
+ selector: 'test'
115
+ }
116
+ )
149
117
 
150
- expect(result['open']['active']).to eq(false)
118
+ expect(result['message']).to eq('success')
119
+ end
151
120
  end
152
- end
153
121
 
154
- describe '#update_domain_tracking_click_settings' do
155
- it 'updates the specified tracking click settings' do
156
- result = mg_obj.update_domain_tracking_click_settings(
157
- domain,
158
- {
159
- active: false
160
- }
161
- )
122
+ describe '#activate_domain_key' do
123
+ let(:api_version) { 'v4' }
162
124
 
163
- expect(result['click']['active']).to eq(false)
125
+ it 'activates a domain key' do
126
+
127
+ result = mg_obj.activate_domain_key(
128
+ domain,
129
+ 'mailo1'
130
+ )
131
+
132
+ expect(result['message']).to eq('domain key activated')
133
+ end
164
134
  end
165
- end
166
135
 
167
- describe '#update_domain_tracking_unsubscribe_settings' do
168
- it 'updates the specified tracking unsubscribe settings' do
169
- result = mg_obj.update_domain_tracking_unsubscribe_settings(
170
- domain,
171
- {
172
- active: false
173
- }
174
- )
136
+ describe '#get_domain_keys' do
137
+ let(:api_version) { 'v4' }
138
+
139
+ it 'lists the domain keys for a specified signing domain' do
140
+ result = mg_obj.get_domain_keys(
141
+ domain
142
+ )
175
143
 
176
- expect(result['unsubscribe']['active']).to eq(false)
144
+ expect(result).to include('items')
145
+ expect(result['items'].first['selector']).to eq('mailo1')
146
+ end
177
147
  end
178
- end
179
148
 
180
- describe '#update_domain_dkim_authority' do
181
- it 'updates the DKIM authority for a domain' do
182
- result = mg_obj.update_domain_dkim_authority(
183
- domain,
184
- {
185
- self: true
186
- }
187
- )
149
+ describe '#deactivate_domain_key' do
150
+ let(:api_version) { 'v4' }
188
151
 
189
- expect(result['message']).to eq('Domain DKIM authority has not been changed')
152
+ it 'deactivates a domain key' do
153
+ result = mg_obj.deactivate_domain_key(
154
+ domain,
155
+ 'tetetet'
156
+ )
157
+
158
+ expect(result['message']).to eq('domain key deactivated')
159
+ end
190
160
  end
191
- end
192
161
 
193
- describe '#update_domain_dkim_selector' do
194
- it 'updates the DKIM selector for a domain' do
195
- result = mg_obj.update_domain_dkim_selector(
196
- domain,
197
- {
198
- dkim_selector: 'mailo1'
199
- }
200
- )
162
+ describe '#update_domain_dkim_authority' do
163
+ it 'updates the DKIM authority for a domain' do
164
+ result = mg_obj.update_domain_dkim_authority(
165
+ domain,
166
+ {
167
+ self: true
168
+ }
169
+ )
201
170
 
202
- expect(result['message']).to eq('DKIM selector changed')
171
+ expect(result['message']).to eq('Domain DKIM authority has not been changed')
172
+ end
203
173
  end
204
- end
205
174
 
206
- describe '#update_domain_web_prefix' do
207
- it 'updates the the CNAME used for tracking opens and clicks' do
208
- result = mg_obj.update_domain_web_prefix(
209
- domain,
210
- {
211
- web_prefix: 'email'
212
- }
213
- )
175
+ describe '#update_domain_dkim_selector' do
176
+ it 'updates the DKIM selector for a domain' do
177
+ result = mg_obj.update_domain_dkim_selector(
178
+ domain,
179
+ {
180
+ dkim_selector: 'mailo1'
181
+ }
182
+ )
214
183
 
215
- expect(result['message']).to eq('Domain web prefix updated')
184
+ expect(result['message']).to eq('DKIM selector changed')
185
+ end
216
186
  end
217
187
  end
218
188
 
219
- describe 'V4' do
220
- let(:api_version) { 'v4' }
189
+ context 'Domain::Tracking methods' do
190
+ # TODO add missing:
191
+ # get_domain_tracking_certificate
192
+ # regenerate_domain_tracking_certificate
193
+ # generate_domain_tracking_certificate
221
194
 
222
- describe '#get_domain_keys' do
223
- it 'lists the domain keys for a specified signing domain' do
224
- result = mg_obj.get_domain_keys(
195
+ describe '#get_domain_tracking_settings' do
196
+ it 'returns tracking settings for the defined domain' do
197
+ result = mg_obj.get_domain_tracking_settings(
225
198
  domain
226
199
  )
227
200
 
228
- expect(result).to include('items')
229
- expect(result['items'].first['selector']).to eq('mailo1')
201
+ expect(result).to include('tracking')
202
+ expect(result['tracking']['click']['active']).to eq(false)
230
203
  end
231
204
  end
232
205
 
233
- describe '#activate_domain_key' do
234
- it 'activates a domain key' do
206
+ describe '#update_domain_tracking_click_settings' do
207
+ it 'updates the specified tracking click settings' do
208
+ result = mg_obj.update_domain_tracking_click_settings(
209
+ domain,
210
+ {
211
+ active: false
212
+ }
213
+ )
235
214
 
236
- result = mg_obj.activate_domain_key(
215
+ expect(result['click']['active']).to eq(false)
216
+ end
217
+ end
218
+
219
+ describe '#update_domain_tracking_open_settings' do
220
+ it 'updates the specified tracking open settings' do
221
+ result = mg_obj.update_domain_tracking_open_settings(
237
222
  domain,
238
- 'mailo1'
223
+ {
224
+ active: false
225
+ }
239
226
  )
240
227
 
241
- expect(result['message']).to eq('domain key activated')
228
+ expect(result['open']['active']).to eq(false)
242
229
  end
243
230
  end
244
231
 
245
- describe '#deactivate_domain_key' do
246
- it 'deactivates a domain key' do
247
- result = mg_obj.deactivate_domain_key(
232
+ describe '#update_domain_tracking_unsubscribe_settings' do
233
+ it 'updates the specified tracking unsubscribe settings' do
234
+ result = mg_obj.update_domain_tracking_unsubscribe_settings(
248
235
  domain,
249
- 'tetetet'
236
+ {
237
+ active: false
238
+ }
250
239
  )
251
240
 
252
- expect(result['message']).to eq('domain key deactivated')
241
+ expect(result['unsubscribe']['active']).to eq(false)
253
242
  end
254
243
  end
255
244
  end
256
245
 
257
- describe '#delete_domain_key' do
258
- let(:api_version) { 'v1' }
246
+ context 'Domain::DKIM_Security methods' do
247
+ # TODO add missing:
248
+ # dkim_rotation
249
+ # dkim_rotate
250
+ end
259
251
 
260
- it 'deletes a domain key' do
261
- result = mg_obj.delete_domain_key(
262
- {
263
- signing_domain: domain,
264
- selector: 'test'
265
- }
266
- )
252
+ context 'Credentials methods' do
253
+ # TODO: to be moved to the dedicated module
267
254
 
268
- expect(result['message']).to eq('success')
255
+ describe '#create_smtp_credentials' do
256
+ it 'creates smtp credentials for domain' do
257
+ result = mg_obj.create_smtp_credentials(
258
+ domain,
259
+ {
260
+ login: 'test_login'
261
+ }
262
+ )
263
+
264
+ expect(result['message']).to eq("Created 1 credentials pair(s)")
265
+ end
266
+ end
267
+
268
+ describe '#update_smtp_credentials' do
269
+ it 'updates smtp credentials for domain' do
270
+ result = mg_obj.update_smtp_credentials(
271
+ domain,
272
+ 'test_login',
273
+ {
274
+ spec: 'abc'
275
+ }
276
+ )
277
+
278
+ expect(result['message']).to eq('Password changed')
279
+ end
280
+ end
281
+
282
+ describe '#delete_smtp_credentials' do
283
+ it 'deletes smtp credentials for domain' do
284
+ result = mg_obj.delete_smtp_credentials(
285
+ domain,
286
+ 'test_login'
287
+ )
288
+
289
+ expect(result['message']).to eq('Credentials have been deleted')
290
+ end
269
291
  end
270
292
  end
271
293
 
272
- describe '#get_domain_stats' do
273
- it 'returns total stats for a given domain' do
274
- result = mg_obj.get_domain_stats(
275
- domain,
276
- {
277
- event: 'clicked'
278
- }
279
- )
294
+ context 'Reporting::Stat methods' do
295
+ # TODO: to be moved to the dedicated module
296
+
297
+ describe '#get_domain_stats' do
298
+ it 'returns total stats for a given domain' do
299
+ result = mg_obj.get_domain_stats(
300
+ domain,
301
+ {
302
+ event: 'clicked'
303
+ }
304
+ )
280
305
 
281
- expect(result).to include('stats')
306
+ expect(result).to include('stats')
307
+ end
282
308
  end
283
309
  end
284
310
 
data/spec/spec_helper.rb CHANGED
@@ -1,9 +1,5 @@
1
- require 'rubygems'
2
- require 'bundler'
3
- require 'bundler/setup'
4
- Bundler.setup(:development)
5
-
6
1
  require 'simplecov'
2
+
7
3
  SimpleCov.start do
8
4
  add_filter "/spec/"
9
5
  end