mailgun-ruby 1.1.1 → 1.1.2

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.
checksums.yaml CHANGED
@@ -1,15 +1,7 @@
1
1
  ---
2
- !binary "U0hBMQ==":
3
- metadata.gz: !binary |-
4
- MjI5MjJkMTdmNGY4M2Q0OTRkY2I4MjY5YzRmNjBhYzVhYmUyNzNkMQ==
5
- data.tar.gz: !binary |-
6
- MGViNjllYzBlODY3NzhhZjc3OTczYzAyNTc0YTgxMDg4ODU1ZTZjNw==
2
+ SHA1:
3
+ metadata.gz: 7191c12a6dc2a08445f7cb623f10608e9208c9d2
4
+ data.tar.gz: 5033b5cd5eb92f6ce5c2d678222f8c7d9d118c78
7
5
  SHA512:
8
- metadata.gz: !binary |-
9
- YWNmMmRjZTU1OTZiNzA0NzMwM2QwN2E5ZGFiM2NkNjZmOWVkY2Q3MmQ3MjU5
10
- MDQxMjU4NzI4YjZkOGQ1NzRhMGY4NGE3NjE0ZWFhNTMxNWZiM2Y4Y2U2NDM5
11
- MWJkMTJhNmZiZTczZDZlM2JhNGIzNjg2YzAwNzQ2NTNlZjIzNmM=
12
- data.tar.gz: !binary |-
13
- YTg1M2UwNzdiMWIwNGZhMGVjYzJmY2FjMjhkMjJmMjljZWRkYzY5NGRmYmY3
14
- MDcxY2Q4MzVkY2M2NGQ4OWE1Mzc4ZTQyZGUyYTE4NjE5NzJiMGNiMjRlNTNi
15
- YWM1Y2VmODBlMWFiZTU1NmQ4ZmJkMmJmZjFiYzliOTBmOGJmOGI=
6
+ metadata.gz: 38dd19ded277a5566d738c88368b811607762ee258eaca48f7f1afe069b6fd84672bef1e6fb9637b028c06762c840dbd84b7a722ec2e6b7bd51828f99eedd406
7
+ data.tar.gz: a87aab066601ca346f897d551ff37165b862654d378c156df84b9443714c0795b9bb7299e16e0bce5666511d28900b0d0d7677ffe7ff826b2681d1d9c96ea7cc
data/MessageBuilder.md CHANGED
@@ -23,20 +23,20 @@ mg_client = Mailgun::Client.new("your-api-key")
23
23
  mb_obj = Mailgun::MessageBuilder.new()
24
24
 
25
25
  # Define the from address.
26
- mb_obj.set_from_address("me@example.com", {"first"=>"Ruby", "last" => "SDK"});
26
+ mb_obj.from("me@example.com", {"first"=>"Ruby", "last" => "SDK"});
27
27
  # Define a to recipient.
28
28
  mb_obj.add_recipient(:to, "john.doe@example.com", {"first" => "John", "last" => "Doe"});
29
29
  # Define a cc recipient.
30
30
  mb_obj.add_recipient(:cc, "sally.doe@example.com", {"first" => "Sally", "last" => "Doe"});
31
31
  # Define the subject.
32
- mb_obj.set_subject("A message from the Ruby SDK using Message Builder!");
32
+ mb_obj.subject("A message from the Ruby SDK using Message Builder!");
33
33
  # Define the body of the message.
34
- mb_obj.set_text_body("This is the text body of the message!");
34
+ mb_obj.body_text("This is the text body of the message!");
35
35
  # Set the Message-Id header, provide a valid Message-Id.
36
- mb_obj.set_message_id("<20141014000000.11111.11111@example.com>")
36
+ mb_obj.message_id("<20141014000000.11111.11111@example.com>")
37
37
  # Or clear the Message-Id header, provide nil or empty string.
38
- mb_obj.set_message_id(nil)
39
- mb_obj.set_message_id('')
38
+ mb_obj.message_id(nil)
39
+ mb_obj.message_id('')
40
40
  # Campaign and other headers.
41
41
  mb_obj.add_campaign_id("My-Awesome-Campaign");
42
42
  mb_obj.add_custom_parameter("h:Customer-Id", "12345");
@@ -45,7 +45,7 @@ mb_obj.add_custom_parameter("h:Customer-Id", "12345");
45
45
  mb_obj.add_attachment("/path/to/file/receipt_123491820.pdf", "Receipt.pdf");
46
46
 
47
47
  # Schedule message in the future
48
- mb_obj.set_delivery_time("tomorrow 8:00AM PST");
48
+ mb_obj.delivery_at("tomorrow 8:00AM PST");
49
49
 
50
50
  # Finally, send your message using the client
51
51
  result = mg_client.send_message("sending_domain.com", mb_obj)
@@ -64,11 +64,11 @@ mg_client = Mailgun::Client.new("your-api-key")
64
64
  mb_obj = Mailgun::BatchMessage.new(mg_client, "example.com")
65
65
 
66
66
  # Define the from address.
67
- mb_obj.set_from_address("me@example.com", {"first"=>"Ruby", "last" => "SDK"});
67
+ mb_obj.from("me@example.com", {"first"=>"Ruby", "last" => "SDK"});
68
68
  # Define the subject.
69
- mb_obj.set_subject("A message from the Ruby SDK using Message Builder!");
69
+ mb_obj.subject("A message from the Ruby SDK using Message Builder!");
70
70
  # Define the body of the message.
71
- mb_obj.set_text_body("This is the text body of the message!");
71
+ mb_obj.body_text("This is the text body of the message!");
72
72
 
73
73
 
74
74
  # Loop through all of your recipients
data/README.md CHANGED
@@ -19,7 +19,7 @@ gem install mailgun-ruby
19
19
  Gemfile:
20
20
 
21
21
  ```ruby
22
- gem 'mailgun-ruby', '~>1.1.1'
22
+ gem 'mailgun-ruby', '~>1.1.2'
23
23
  ```
24
24
 
25
25
  Usage
@@ -45,7 +45,7 @@ Or obtain the last couple log items:
45
45
 
46
46
  ```ruby
47
47
  # First, instantiate the Mailgun Client with your API key
48
- mg_client = Mailgun::Client.new 'your-api-key'
48
+ mg_client = Mailgun::Client.new 'your-secret-api-key'
49
49
 
50
50
  # Define the domain you wish to query
51
51
  domain = 'example.com'
@@ -60,7 +60,7 @@ Rails
60
60
  The library can be initialized with a Rails initializer containing similar:
61
61
  ```ruby
62
62
  Mailgun.configure do |config|
63
- config.api_key = 'your-secret-key'
63
+ config.api_key = 'your-secret-api-key'
64
64
  end
65
65
  ```
66
66
  Or have the initializer read your environment setting if you perfer.
@@ -12,13 +12,36 @@ module Mailgun
12
12
  def initialize(api_key = Mailgun.api_key,
13
13
  api_host = 'api.mailgun.net',
14
14
  api_version = 'v3',
15
- ssl = true)
15
+ ssl = true,
16
+ test_mode = false)
16
17
 
17
18
  endpoint = endpoint_generator(api_host, api_version, ssl)
18
19
  @http_client = RestClient::Resource.new(endpoint,
19
20
  user: 'api',
20
21
  password: api_key,
21
22
  user_agent: "mailgun-sdk-ruby/#{Mailgun::VERSION}")
23
+ @test_mode = test_mode
24
+ end
25
+
26
+ # Enable test mode
27
+ #
28
+ # Prevents sending of any messages.
29
+ def enable_test_mode!
30
+ @test_mode = true
31
+ end
32
+
33
+ # Disable test mode
34
+ #
35
+ # Reverts the test_mode flag and allows the client to send messages.
36
+ def disable_test_mode!
37
+ @test_mode = false
38
+ end
39
+
40
+ # Client is in test mode?
41
+ #
42
+ # @return [Boolean] Is the client set in test mode?
43
+ def test_mode?
44
+ @test_mode
22
45
  end
23
46
 
24
47
  # Simple Message Sending
@@ -28,6 +51,15 @@ module Mailgun
28
51
  # containing required parameters for the requested resource.
29
52
  # @return [Mailgun::Response] A Mailgun::Response object.
30
53
  def send_message(working_domain, data)
54
+ if test_mode? then
55
+ return Response.from_hash(
56
+ {
57
+ :body => '{"id": "test-mode-mail@localhost", "message": "Queued. Thank you."}',
58
+ :code => 200,
59
+ }
60
+ )
61
+ end
62
+
31
63
  case data
32
64
  when Hash
33
65
  if data.key?(:message)
@@ -37,16 +37,28 @@ module Mailgun
37
37
 
38
38
  # Public: initialization of new error given a message and/or object
39
39
  #
40
- # message - a String detailing the error
41
- # object - a RestClient::Reponse object
40
+ # message - a String detailing the error
41
+ # response - a RestClient::Response object
42
42
  #
43
- def initialize(message = nil, object = nil)
44
- @object = object
45
- @code = object.http_code || NOCODE
46
- super(JSON.parse(object.body)['message'])
43
+ def initialize(message = nil, response = nil)
44
+ @response = response
45
+ @code = response.code || NOCODE
46
+
47
+ begin
48
+ api_message = JSON.parse(response.body)['message']
49
+ rescue JSON::ParserError
50
+ api_message = response.body
51
+ rescue NoMethodError
52
+ api_message = "Unknown API error"
53
+ end
54
+
55
+ message = message || ''
56
+ message = message + ': ' + api_message
57
+
58
+ super(message, response)
47
59
  rescue NoMethodError, JSON::ParserError
48
60
  @code = NOCODE
49
- super(message)
61
+ super(message, response)
50
62
  end
51
63
 
52
64
  end
@@ -1,3 +1,5 @@
1
+ require 'ostruct'
2
+
1
3
  module Mailgun
2
4
  # A Mailgun::Response object is instantiated for each response generated
3
5
  # by the Client request. The Response object supports deserialization of
@@ -10,6 +12,11 @@ module Mailgun
10
12
  # slightly different
11
13
  attr_accessor :body, :code
12
14
 
15
+ def self.from_hash(h)
16
+ # Create a "fake" response object with the data passed from h
17
+ self.new OpenStruct.new(h)
18
+ end
19
+
13
20
  def initialize(response)
14
21
  @body = response.body
15
22
  @code = response.code
@@ -1,4 +1,4 @@
1
1
  # It's the version. Yeay!
2
2
  module Mailgun
3
- VERSION = '1.1.1'
3
+ VERSION = '1.1.2'
4
4
  end
@@ -1,5 +1,6 @@
1
1
  require 'spec_helper'
2
2
  require 'mailgun'
3
+ require 'mailgun/exceptions/exceptions'
3
4
 
4
5
  vcr_opts = { :cassette_name => "instance" }
5
6
 
@@ -9,6 +10,30 @@ describe 'Mailgun instantiation', vcr: vcr_opts do
9
10
  end
10
11
  end
11
12
 
13
+ vcr_opts = { :cassette_name => "exceptions" }
14
+
15
+ describe 'Client exceptions', vcr: vcr_opts do
16
+ before(:all) do
17
+ @mg_obj = Mailgun::Client.new(APIKEY, APIHOST, APIVERSION, SSL)
18
+ @domain = TESTDOMAIN
19
+ end
20
+
21
+ it 'display useful error information' do
22
+ begin
23
+ @mg_obj.send_message("not-our-doma.in", {
24
+ :from => "sally@not-our-doma.in",
25
+ :to => "bob@#{@domain}",
26
+ :subject => 'Exception Integration Test',
27
+ :text => 'INTEGRATION TESTING'
28
+ })
29
+ rescue Mailgun::CommunicationError => err
30
+ expect(err.message).to eq('404 Not Found: Domain not found: not-our-doma.in')
31
+ else
32
+ fail
33
+ end
34
+ end
35
+ end
36
+
12
37
  vcr_opts = { :cassette_name => "send_message" }
13
38
 
14
39
  describe 'The method send_message()', vcr: vcr_opts do
@@ -16,7 +41,7 @@ describe 'The method send_message()', vcr: vcr_opts do
16
41
  @mg_obj = Mailgun::Client.new(APIKEY, APIHOST, APIVERSION, SSL)
17
42
  @domain = TESTDOMAIN
18
43
  end
19
-
44
+
20
45
  it 'sends a standard message in test mode.' do
21
46
  result = @mg_obj.send_message(@domain, {:from => "bob@#{@domain}",
22
47
  :to => "sally@#{@domain}",
@@ -29,6 +54,28 @@ describe 'The method send_message()', vcr: vcr_opts do
29
54
  expect(result.body).to include("id")
30
55
  end
31
56
 
57
+ it 'fakes message send while in *client* test mode' do
58
+ @mg_obj.enable_test_mode!
59
+
60
+ expect(@mg_obj.test_mode?).to eq(true)
61
+
62
+ data = { :from => "joe@#{@domain}",
63
+ :to => "bob@#{@domain}",
64
+ :subject => "Test",
65
+ :text => "Test Data" }
66
+
67
+ result = @mg_obj.send_message(@domain, data)
68
+
69
+ result.to_h!
70
+
71
+ expect(result.body).to include("message")
72
+ expect(result.body).to include("id")
73
+
74
+ expect(result.code).to eq(200)
75
+ expect(result.body['id']).to eq("test-mode-mail@localhost")
76
+ expect(result.body['message']).to eq("Queued. Thank you.")
77
+ end
78
+
32
79
  it 'sends a message builder message in test mode.' do
33
80
  mb_obj = Mailgun::MessageBuilder.new()
34
81
  mb_obj.from("sender@#{@domain}", {'first' => 'Sending', 'last' => 'User'})
@@ -25,9 +25,9 @@ describe 'The method send_message()' do
25
25
 
26
26
  it 'sends a message' do
27
27
  data = { 'from' => 'joe@test.com',
28
- 'to' => 'bob@example.com',
29
- 'subject' => 'Test',
30
- 'text' => 'Test Data'}
28
+ 'to' => 'bob@example.com',
29
+ 'subject' => 'Test',
30
+ 'text' => 'Test Data' }
31
31
  result = @mg_obj.send_message("testdomain.com", data)
32
32
 
33
33
  result.to_h!
@@ -42,7 +42,7 @@ describe 'The method send_message()' do
42
42
  result = @mg_obj.send_message("testdomain.com", data)
43
43
 
44
44
  result.to_h!
45
-
45
+
46
46
  expect(result.body).to include("message")
47
47
  expect(result.body).to include("id")
48
48
  end
@@ -61,7 +61,7 @@ describe 'The method post()' do
61
61
  result = @mg_obj.post("#{@domain}/messages", data)
62
62
 
63
63
  result.to_h!
64
-
64
+
65
65
  expect(result.body).to include("message")
66
66
  expect(result.body).to include("id")
67
67
  end
@@ -81,7 +81,7 @@ describe 'The method put()' do
81
81
  result = @mg_obj.put("lists/#{@list_address}/members#{@member_address}", data)
82
82
 
83
83
  result.to_h!
84
-
84
+
85
85
  expect(result.body).to include("member")
86
86
  expect(result.body["member"]).to include("vars")
87
87
  expect(result.body["member"]["vars"]).to include("age")
@@ -104,7 +104,7 @@ describe 'The method get()' do
104
104
  result = @mg_obj.get("#{@domain}/bounces", query_string)
105
105
 
106
106
  result.to_h!
107
-
107
+
108
108
  expect(result.body).to include("total_count")
109
109
  expect(result.body).to include("items")
110
110
  end
@@ -120,7 +120,7 @@ describe 'The method delete()' do
120
120
  result = @mg_obj.delete("#{@domain}/campaigns/ABC123")
121
121
 
122
122
  result.to_h!
123
-
123
+
124
124
  expect(result.body).to include("message")
125
125
  expect(result.body).to include("id")
126
126
  end
@@ -0,0 +1,45 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: post
5
+ uri: https://api:<APIKEY>@api.mailgun.net/v3/not-our-doma.in/messages
6
+ body:
7
+ encoding: UTF-8
8
+ string: from=sally%40not-our-doma.in&to=bob%40DOMAIN.TEST&subject=Exception+Integration+Test&text=INTEGRATION+TESTING
9
+ headers:
10
+ Accept:
11
+ - "*/*"
12
+ Accept-Encoding:
13
+ - gzip, deflate
14
+ User-Agent:
15
+ - rest-client/2.0.0 (linux-gnu x86_64) ruby/2.3.1p112
16
+ Content-Length:
17
+ - '149'
18
+ Content-Type:
19
+ - application/x-www-form-urlencoded
20
+ Host:
21
+ - api.mailgun.net
22
+ response:
23
+ status:
24
+ code: 404
25
+ message: NOT FOUND
26
+ headers:
27
+ Server:
28
+ - nginx
29
+ Date:
30
+ - Wed, 02 Nov 2016 19:42:44 GMT
31
+ Content-Type:
32
+ - application/json
33
+ Content-Length:
34
+ - '52'
35
+ Connection:
36
+ - keep-alive
37
+ body:
38
+ encoding: UTF-8
39
+ string: |-
40
+ {
41
+ "message": "Domain not found: not-our-doma.in"
42
+ }
43
+ http_version:
44
+ recorded_at: Wed, 02 Nov 2016 19:43:40 GMT
45
+ recorded_with: VCR 3.0.3
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mailgun-ruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.1
4
+ version: 1.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mailgun
@@ -9,118 +9,118 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2016-10-31 00:00:00.000000000 Z
12
+ date: 2016-11-11 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler
16
16
  requirement: !ruby/object:Gem::Requirement
17
17
  requirements:
18
- - - ~>
18
+ - - "~>"
19
19
  - !ruby/object:Gem::Version
20
20
  version: '1.5'
21
21
  type: :development
22
22
  prerelease: false
23
23
  version_requirements: !ruby/object:Gem::Requirement
24
24
  requirements:
25
- - - ~>
25
+ - - "~>"
26
26
  - !ruby/object:Gem::Version
27
27
  version: '1.5'
28
28
  - !ruby/object:Gem::Dependency
29
29
  name: rspec
30
30
  requirement: !ruby/object:Gem::Requirement
31
31
  requirements:
32
- - - ~>
32
+ - - "~>"
33
33
  - !ruby/object:Gem::Version
34
34
  version: '3.0'
35
35
  type: :development
36
36
  prerelease: false
37
37
  version_requirements: !ruby/object:Gem::Requirement
38
38
  requirements:
39
- - - ~>
39
+ - - "~>"
40
40
  - !ruby/object:Gem::Version
41
41
  version: '3.0'
42
42
  - !ruby/object:Gem::Dependency
43
43
  name: rake
44
44
  requirement: !ruby/object:Gem::Requirement
45
45
  requirements:
46
- - - ~>
46
+ - - "~>"
47
47
  - !ruby/object:Gem::Version
48
48
  version: '10.0'
49
49
  type: :development
50
50
  prerelease: false
51
51
  version_requirements: !ruby/object:Gem::Requirement
52
52
  requirements:
53
- - - ~>
53
+ - - "~>"
54
54
  - !ruby/object:Gem::Version
55
55
  version: '10.0'
56
56
  - !ruby/object:Gem::Dependency
57
57
  name: webmock
58
58
  requirement: !ruby/object:Gem::Requirement
59
59
  requirements:
60
- - - ~>
60
+ - - "~>"
61
61
  - !ruby/object:Gem::Version
62
62
  version: '1.22'
63
63
  type: :development
64
64
  prerelease: false
65
65
  version_requirements: !ruby/object:Gem::Requirement
66
66
  requirements:
67
- - - ~>
67
+ - - "~>"
68
68
  - !ruby/object:Gem::Version
69
69
  version: '1.22'
70
70
  - !ruby/object:Gem::Dependency
71
71
  name: pry
72
72
  requirement: !ruby/object:Gem::Requirement
73
73
  requirements:
74
- - - ~>
74
+ - - "~>"
75
75
  - !ruby/object:Gem::Version
76
76
  version: '0.9'
77
77
  type: :development
78
78
  prerelease: false
79
79
  version_requirements: !ruby/object:Gem::Requirement
80
80
  requirements:
81
- - - ~>
81
+ - - "~>"
82
82
  - !ruby/object:Gem::Version
83
83
  version: '0.9'
84
84
  - !ruby/object:Gem::Dependency
85
85
  name: vcr
86
86
  requirement: !ruby/object:Gem::Requirement
87
87
  requirements:
88
- - - ~>
88
+ - - "~>"
89
89
  - !ruby/object:Gem::Version
90
90
  version: '3.0'
91
91
  type: :development
92
92
  prerelease: false
93
93
  version_requirements: !ruby/object:Gem::Requirement
94
94
  requirements:
95
- - - ~>
95
+ - - "~>"
96
96
  - !ruby/object:Gem::Version
97
97
  version: '3.0'
98
98
  - !ruby/object:Gem::Dependency
99
99
  name: simplecov
100
100
  requirement: !ruby/object:Gem::Requirement
101
101
  requirements:
102
- - - ~>
102
+ - - "~>"
103
103
  - !ruby/object:Gem::Version
104
104
  version: '0.11'
105
105
  type: :development
106
106
  prerelease: false
107
107
  version_requirements: !ruby/object:Gem::Requirement
108
108
  requirements:
109
- - - ~>
109
+ - - "~>"
110
110
  - !ruby/object:Gem::Version
111
111
  version: '0.11'
112
112
  - !ruby/object:Gem::Dependency
113
113
  name: rest-client
114
114
  requirement: !ruby/object:Gem::Requirement
115
115
  requirements:
116
- - - ~>
116
+ - - "~>"
117
117
  - !ruby/object:Gem::Version
118
118
  version: '2.0'
119
119
  type: :runtime
120
120
  prerelease: false
121
121
  version_requirements: !ruby/object:Gem::Requirement
122
122
  requirements:
123
- - - ~>
123
+ - - "~>"
124
124
  - !ruby/object:Gem::Version
125
125
  version: '2.0'
126
126
  description: Mailgun's Official Ruby SDK for interacting with the Mailgun API.
@@ -129,11 +129,11 @@ executables: []
129
129
  extensions: []
130
130
  extra_rdoc_files: []
131
131
  files:
132
- - .gitignore
133
- - .rubocop.yml
134
- - .rubocop_todo.yml
135
- - .ruby-env.yml.example
136
- - .travis.yml
132
+ - ".gitignore"
133
+ - ".rubocop.yml"
134
+ - ".rubocop_todo.yml"
135
+ - ".ruby-env.yml.example"
136
+ - ".travis.yml"
137
137
  - Domains.md
138
138
  - Events.md
139
139
  - Gemfile
@@ -190,6 +190,7 @@ files:
190
190
  - vcr_cassettes/domains.yml
191
191
  - vcr_cassettes/email_validation.yml
192
192
  - vcr_cassettes/events.yml
193
+ - vcr_cassettes/exceptions.yml
193
194
  - vcr_cassettes/list_members.yml
194
195
  - vcr_cassettes/mailing_list.todo.yml
195
196
  - vcr_cassettes/mailing_list.yml
@@ -208,12 +209,12 @@ require_paths:
208
209
  - lib
209
210
  required_ruby_version: !ruby/object:Gem::Requirement
210
211
  requirements:
211
- - - ! '>='
212
+ - - ">="
212
213
  - !ruby/object:Gem::Version
213
214
  version: 2.0.0
214
215
  required_rubygems_version: !ruby/object:Gem::Requirement
215
216
  requirements:
216
- - - ! '>='
217
+ - - ">="
217
218
  - !ruby/object:Gem::Version
218
219
  version: '0'
219
220
  requirements: []