simple_postmark 0.6.0 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 9de1ac47100b912b377ad14820d3b529b21c25a1
4
+ data.tar.gz: f7a59261a018c6089be91095f517067061fbcc9b
5
+ SHA512:
6
+ metadata.gz: 35da1d86866675baaea4557c108804aac3fdc67cdf4cb299a920d8f47b58e6d1610cba82d8741bf296d413374a8daa194fecd1e0157506384ded67ffe173bc77
7
+ data.tar.gz: c06df2471facc7192a9156c49277a7a1193d4bc0288072182efd88cd28f0d344b886c6bbb9dd3df901be24db2a5b85d08def38b30b803c52308ce543dea2c83d
@@ -1,10 +1,10 @@
1
1
  language: ruby
2
2
 
3
3
  rvm:
4
- - 1.9.2
5
4
  - 1.9.3
6
5
  - 2.0.0
7
- - ruby-head
6
+ - 2.1.0
7
+ - 2.2.0
8
8
 
9
9
  gemfile:
10
10
  - Gemfile
@@ -12,18 +12,8 @@ gemfile:
12
12
  - gemfiles/Rails_3_1.gemfile
13
13
  - gemfiles/Rails_3_2.gemfile
14
14
  - gemfiles/Rails_4_0.gemfile
15
- - gemfiles/Rails_master.gemfile
15
+ - gemfiles/Rails_4_1.gemfile
16
16
 
17
17
  branches:
18
18
  only:
19
19
  - master
20
-
21
- matrix:
22
- exclude:
23
- - rvm: 1.9.2
24
- gemfile: gemfiles/Rails_master.gemfile
25
- - rvm: 1.9.2
26
- gemfile: gemfiles/Rails_4_0.gemfile
27
- allow_failures:
28
- - rvm: ruby-head
29
- - gemfile: gemfiles/Rails_master.gemfile
@@ -1,3 +1,10 @@
1
+ ## 0.7.0 (February 12, 2015)
2
+ * Rails 4.1.
3
+ * Replaces specs with tests.
4
+
5
+ ## 0.6.0 (July 8, 2013)
6
+ * Rails 4.0!
7
+
1
8
  ## 0.5.2 (May 11, 2013)
2
9
  * Some refactoring.
3
10
  * Ruby 2.0 support!
data/README.md CHANGED
@@ -2,18 +2,21 @@
2
2
 
3
3
  simple_postmark makes it easy to send mails via [Postmark](http://postmarkapp.com)™ using Rails's ActionMailer.
4
4
 
5
- ~~simple_postmark is inspired by [postmark-gem](https://github.com/wildbit/postmark-gem), but unfortunately postmark-gem forced to me to use non-standard Rails calls like `postmark_attachments`. simple_postmark uses the standard Rails's ActionMailer syntax to send your emails via Postmark.~~
5
+ ## Table of Contents
6
6
 
7
- ---
7
+ * [About](#about)
8
+ * [Installation](#installation)
9
+ * [Usage](#usage)
10
+ * [Configuration](#configuration)
11
+ * [Testing](#testing)
12
+ * [Contributing](#contributing)
13
+ * [Copyright](#copyright)
8
14
 
9
- **Update:** It seems that the [issue](https://github.com/wildbit/postmark-rails/issues/17#issuecomment-13761405) was fixed in the `0.9.19` version of the [postmark gem](https://github.com/wildbit/postmark-gem), which marks this gem as obligatory. However I have not decided what to do, so simple_postmark will still be there for a while. At least until Rails `4.0` is released.
15
+ ## About
10
16
 
11
- ---
17
+ simple_postmark was created because of the lack of the proper Rails API support in the official [postmark-gem](https://github.com/wildbit/postmark-gem). This was back in 2011, the postmark-gem was [updated](https://github.com/wildbit/postmark-rails/issues/17#issuecomment-13761405) to support the Rails API since then. I recently decided to deprecate this gem in favor of the official gem. However, this gem will continue to support all Rails versions until `5.0`.
12
18
 
13
- Tested against Ruby versions `1.9.2`, `1.9.3` and Rails versions `3.0.x`, `3.1.x`, `3.2.x`.
14
- `ruby-head`, `2.0` and Rails `master` should work too btw.
15
-
16
- If you are still using Ruby `1.8.7` or `Ruby Enterprise Edition` with Rails, you can use the backported version of this gem called [simple_postmark18](https://github.com/haihappen/simple_postmark/tree/ruby18).
19
+ Tested against Ruby version `>= 1.9.3` up to `=< 2.2.0` and Rails versions `~> 3.0.0` up to `~> 4.1.0`.
17
20
 
18
21
  ## Installation
19
22
 
@@ -60,7 +63,7 @@ class NotificationMailer < ActionMailer::Base
60
63
  end
61
64
  ```
62
65
 
63
- ## Advanced Configuration
66
+ ## Configuration
64
67
 
65
68
  * `api_key`: Your Postmark API key. Go to [your Rack](https://postmarkapp.com/servers),
66
69
  selected the one you want to use and then go to the **Credentials** tab to find your API key.
@@ -108,7 +111,7 @@ With this setup, it will actually trigger a connection to the Postmark API, but
108
111
 
109
112
  (The MIT license)
110
113
 
111
- Copyright (c) 2011-2013 Mario Uher
114
+ Copyright (c) 2011-2015 Mario Uher
112
115
 
113
116
  Permission is hereby granted, free of charge, to any person obtaining
114
117
  a copy of this software and associated documentation files (the
data/Rakefile CHANGED
@@ -1,7 +1,7 @@
1
1
  require 'rake/testtask'
2
2
 
3
3
  Rake::TestTask.new do |t|
4
- t.test_files = FileList['spec/**/*_spec.rb']
4
+ t.test_files = FileList['test/**/*_test.rb']
5
5
  end
6
6
 
7
7
  task default: :test
@@ -0,0 +1,5 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec path: '../'
4
+
5
+ gem 'rails', '~> 4.0.0'
@@ -0,0 +1,5 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec path: '../'
4
+
5
+ gem 'rails', '~> 4.0.0'
@@ -1,3 +1,3 @@
1
1
  module SimplePostmark
2
- VERSION = '0.6.0'
2
+ VERSION = '0.7.0'
3
3
  end
@@ -6,19 +6,20 @@ Gem::Specification.new do |gem|
6
6
  gem.version = SimplePostmark::VERSION
7
7
  gem.authors = 'Mario Uher'
8
8
  gem.email = 'uher.mario@gmail.com'
9
- gem.description = 'SimplePostmark makes it easy to send mails via Postmark using Rails\'s ActionMailer.'
10
- gem.summary = 'A simple way to use Postmark with your Rails app.'
9
+ gem.description = 'SimplePostmark makes it easy to send mails via Postmark using Rails\'s ActionMailer.'
10
+ gem.summary = 'A simple way to use Postmark with your Rails app.'
11
11
  gem.homepage = 'http://haihappen.github.com/simple_postmark'
12
12
 
13
13
  gem.files = `git ls-files`.split("\n")
14
14
  gem.require_path = 'lib'
15
15
 
16
- gem.add_dependency 'activesupport', '>= 3.0'
16
+ gem.add_dependency 'activesupport', '>= 3.0', '< 4.2.0'
17
+ gem.add_dependency 'actionmailer', '>= 3.0', '< 4.2.0'
17
18
  gem.add_dependency 'httparty'
18
19
  gem.add_dependency 'json'
19
20
  gem.add_dependency 'mail'
20
21
 
21
- gem.add_development_dependency 'minitest'
22
- gem.add_development_dependency 'rails', '>= 3.0'
22
+ gem.add_development_dependency 'minitest', '>= 4.0', '< 5.0'
23
+ gem.add_development_dependency 'rake'
23
24
  gem.add_development_dependency 'webmock'
24
25
  end
@@ -0,0 +1,7 @@
1
+ require_relative '../test_helper'
2
+
3
+ class Mail::MessageTest < MiniTest::Unit::TestCase
4
+ def test_responds_to_to_postmark
5
+ assert_respond_to Mail::Message.new, :to_postmark
6
+ end
7
+ end
@@ -0,0 +1,38 @@
1
+ require_relative '../test_helper'
2
+
3
+ class Mail::PartTest < MiniTest::Unit::TestCase
4
+ def test_responds_to_to_postmark
5
+ assert_respond_to Mail::Part.new, :to_postmark
6
+ end
7
+
8
+
9
+ def test_to_postmark_text_part
10
+ content = %{Think of me like Yoda, but instead of being little and green I wear suits and I'm awesome. I'm your bro-I'm Broda!}
11
+
12
+ part = Mail::Part.new
13
+ part.body = content
14
+ part.content_type = 'text/plain'
15
+
16
+ assert_equal Hash['Name' => nil, 'Content' => content, 'ContentType' => 'text/plain'], part.to_postmark
17
+ end
18
+
19
+
20
+ def test_to_postmark_mail_part
21
+ content = %{<p>Think of me like Yoda, but instead of being little and green I wear suits and I'm awesome.<br /><br />I'm your bro-I'm Broda!</p>}
22
+
23
+ part = Mail::Part.new
24
+ part.body = content
25
+ part.content_type = 'text/html'
26
+
27
+ assert_equal Hash['Name' => nil, 'Content' => content, 'ContentType' => 'text/html'], part.to_postmark
28
+ end
29
+
30
+
31
+ def test_to_postmark_file_part
32
+ part = Mail::Part.new
33
+ part.add_file BROCODE
34
+ attachment = part.attachments.first
35
+
36
+ assert_equal Hash['Name' => 'thebrocode.jpg', 'Content' => [File.read(BROCODE)].pack('m'), 'ContentType' => 'image/jpeg'], attachment.to_postmark
37
+ end
38
+ end
@@ -0,0 +1,92 @@
1
+ require_relative 'test_helper'
2
+
3
+ class MailTest < MiniTest::Unit::TestCase
4
+ def test_responds_to_to_postmark
5
+ assert_respond_to Mail.new, :to_postmark
6
+ end
7
+
8
+
9
+ def build_mail
10
+ Mail.new do
11
+ from 'barney@himym.tld'
12
+ to 'ted@himym.tld'
13
+ subject %{I'm your bro!}
14
+ body %{Think of me like Yoda, but instead of being little and green I wear suits and I'm awesome. I'm your bro-I'm Broda!}
15
+ tag 'simple-postmark'
16
+ end
17
+ end
18
+
19
+
20
+ def test_to_postmark_returns_a_hash
21
+ hash = {
22
+ 'From' => 'barney@himym.tld',
23
+ 'To' => 'ted@himym.tld',
24
+ 'Subject' => %{I'm your bro!},
25
+ 'TextBody' => %{Think of me like Yoda, but instead of being little and green I wear suits and I'm awesome. I'm your bro-I'm Broda!},
26
+ 'Tag' => 'simple-postmark',
27
+ 'Attachments' => [{
28
+ 'Name' => 'thebrocode.jpg',
29
+ 'Content' => [File.read(BROCODE)].pack('m'),
30
+ 'ContentType' => 'image/jpeg'
31
+ }]
32
+ }
33
+
34
+ mail = build_mail
35
+ mail.add_file BROCODE
36
+
37
+ assert_equal hash, mail.to_postmark
38
+ end
39
+
40
+
41
+ def test_multiple_recipients
42
+ mail = build_mail
43
+ mail.to = ['barney@himym.tld', 'marshall@himym.tld']
44
+
45
+ assert_equal 'barney@himym.tld, marshall@himym.tld', mail.to_postmark.fetch('To')
46
+ end
47
+
48
+
49
+ def test_email_headers
50
+ hash = {
51
+ 'Bcc' => 'lily@himym.tld',
52
+ 'Cc' => 'marshall@himym.tld',
53
+ 'From' => 'barney@himym.tld',
54
+ 'ReplyTo' => 'barney@barneystinsonblog.com',
55
+ 'Subject' => %{I'm your bro!},
56
+ 'Tag' => 'simple-postmark',
57
+ 'TextBody' => %{Think of me like Yoda, but instead of being little and green I wear suits and I'm awesome. I'm your bro-I'm Broda!},
58
+ 'To' => 'ted@himym.tld'
59
+ }
60
+
61
+ mail = build_mail
62
+ mail.bcc = 'lily@himym.tld'
63
+ mail.cc = 'marshall@himym.tld'
64
+ mail.reply_to = 'barney@barneystinsonblog.com'
65
+
66
+ assert_equal hash, mail.to_postmark
67
+ end
68
+
69
+
70
+ def test_from_and_reply_to
71
+ hash = {
72
+ 'To' => 'Lily <lily@himym.tld>',
73
+ 'From' => 'Marshall <marshall@himym.tld>',
74
+ 'ReplyTo' => 'Barney <barney@barneystinsonblog.com>',
75
+ 'Bcc' => 'lily@himym.tld',
76
+ 'Cc' => 'marshall@himym.tld',
77
+ 'Subject' => %{I'm your bro!},
78
+ 'Tag' => 'simple-postmark',
79
+ 'TextBody' => %{Think of me like Yoda, but instead of being little and green I wear suits and I'm awesome. I'm your bro-I'm Broda!},
80
+ }
81
+
82
+ mail = build_mail
83
+ mail.to = 'Lily <lily@himym.tld>'
84
+ mail.from = 'Marshall <marshall@himym.tld>'
85
+ mail.reply_to = 'Barney <barney@barneystinsonblog.com>'
86
+ mail.bcc = 'lily@himym.tld'
87
+ mail.cc = 'marshall@himym.tld'
88
+
89
+ assert_equal hash, mail.to_postmark
90
+ end
91
+ end
92
+
@@ -0,0 +1,69 @@
1
+ require_relative '../test_helper'
2
+
3
+
4
+ class SimplePostmark::APITest < MiniTest::Unit::TestCase
5
+ def setup
6
+ ActionMailer::Base.add_delivery_method :simple_postmark, Mail::SimplePostmark, api_key: nil
7
+ ActionMailer::Base.delivery_method = :simple_postmark
8
+ ActionMailer::Base.simple_postmark_settings = { api_key: 'POSTMARK_API_TEST', return_response: true }
9
+ ActionMailer::Base.raise_delivery_errors = true
10
+
11
+ load File.join(File.dirname(__FILE__), '../test_mailer.rb')
12
+
13
+ WebMock.disable!
14
+ end
15
+
16
+
17
+ def test_send_email
18
+ TestMailer.email.deliver
19
+ end
20
+
21
+
22
+ def test_send_email_with_tags
23
+ TestMailer.email_with_tags.deliver
24
+ end
25
+
26
+
27
+ def test_send_email_with_attachments
28
+ TestMailer.email_with_attachments.deliver
29
+ end
30
+
31
+
32
+ def test_send_email_with_reply_to
33
+ TestMailer.email_with_reply_to.deliver
34
+ end
35
+
36
+
37
+ def test_fails_using_wrong_settings
38
+ ActionMailer::Base.simple_postmark_settings = { api_key: '********-****-****-****-************', return_response: true }
39
+
40
+ assert_raises SimplePostmark::APIError do
41
+ TestMailer.email.deliver
42
+ end
43
+ end
44
+
45
+
46
+ def test_can_be_silent
47
+ ActionMailer::Base.simple_postmark_settings = { api_key: '********-****-****-****-************', return_response: true }
48
+ ActionMailer::Base.raise_delivery_errors = false
49
+
50
+ TestMailer.email.deliver
51
+ end
52
+
53
+
54
+ def test_parsed_response
55
+ response = TestMailer.email.deliver!.parsed_response
56
+
57
+ assert_equal 'ted@himym.tld', response.fetch('To')
58
+ assert_equal 'Test job accepted', response.fetch('Message')
59
+ assert response.fetch('MessageID')
60
+ end
61
+
62
+
63
+ def teardown
64
+ WebMock.enable!
65
+
66
+ ActionMailer::Base.delivery_method = :test
67
+ end
68
+ end
69
+
@@ -0,0 +1,91 @@
1
+ require_relative '../test_helper'
2
+
3
+
4
+ class IntegrationTest < MiniTest::Unit::TestCase
5
+ URL = 'http://api.postmarkapp.com/email'
6
+ API_KEY = '********-****-****-****-************'
7
+
8
+ HEADERS = {
9
+ 'Accept' => 'application/json',
10
+ 'ContentType' => 'application/json',
11
+ 'X-Postmark-Server-Token' => API_KEY
12
+ }
13
+
14
+ BODY = {
15
+ 'From' => 'barney@himym.tld',
16
+ 'Subject' => %{I'm your bro!},
17
+ 'TextBody' => %{Think of me like Yoda, but instead of being little and green I wear suits and I'm awesome. I'm your bro-I'm Broda!},
18
+ 'To' => 'ted@himym.tld'
19
+ }
20
+
21
+
22
+ def setup
23
+ ActionMailer::Base.add_delivery_method :simple_postmark, Mail::SimplePostmark, api_key: nil
24
+ ActionMailer::Base.delivery_method = :simple_postmark
25
+ ActionMailer::Base.simple_postmark_settings = { api_key: API_KEY, return_response: true }
26
+ ActionMailer::Base.raise_delivery_errors = true
27
+
28
+ WebMock.enable!
29
+ end
30
+
31
+
32
+ def test_responds_to_simple_postmark_settings
33
+ assert_respond_to ActionMailer::Base, :simple_postmark_settings
34
+ end
35
+
36
+
37
+ def test_set_api_key
38
+ assert_equal API_KEY, ActionMailer::Base.simple_postmark_settings.fetch(:api_key)
39
+ end
40
+
41
+
42
+ def test_send_email
43
+ stub_request :post, URL
44
+ TestMailer.email.deliver
45
+
46
+ assert_requested :post, URL, headers: HEADERS, body: BODY.to_json
47
+ end
48
+
49
+
50
+ def test_send_email_with_tags
51
+ stub_request :post, URL
52
+ TestMailer.email_with_tags.deliver
53
+
54
+ assert_requested :post, URL, headers: HEADERS, body: Hash[BODY.merge('Tag' => 'simple-postmark').sort].to_json
55
+ end
56
+
57
+
58
+ def test_send_email_with_attachments
59
+ attachment = {
60
+ 'Content' => [BROCODE].pack('m'),
61
+ 'ContentType' => 'image/jpeg',
62
+ 'Name' => 'thebrocode.jpg'
63
+ }
64
+
65
+ stub_request :post, URL
66
+ TestMailer.email_with_attachments.deliver
67
+
68
+ assert_requested :post, URL, headers: HEADERS, body: Hash[BODY.merge('Subject' => %{The Brocode!}, 'Attachments' => [attachment]).sort].to_json
69
+ end
70
+
71
+
72
+ def test_send_email_with_multipart
73
+ multipart = {
74
+ 'HtmlBody' => %{<p>Think of me like Yoda, but instead of being little and green I wear suits and I'm awesome.<br /><br />I'm your bro-I'm Broda!</p>},
75
+ 'TextBody' => %{Think of me like Yoda, but instead of being little and green I wear suits and I'm awesome. I'm your bro-I'm Broda!}
76
+ }
77
+
78
+ stub_request :post, URL
79
+ TestMailer.email_with_multipart.deliver
80
+
81
+ assert_requested :post, URL, headers: HEADERS, body: Hash[BODY.merge(multipart).sort].to_json
82
+ end
83
+
84
+
85
+ def teardown
86
+ ActionMailer::Base.delivery_method = :test
87
+
88
+ WebMock.disable!
89
+ end
90
+ end
91
+
@@ -0,0 +1,31 @@
1
+ require_relative 'test_helper'
2
+
3
+ class SimplePostmarkTest < MiniTest::Unit::TestCase
4
+ def test_responds_to_deliver!
5
+ assert_respond_to Mail::SimplePostmark.new, :deliver!
6
+ end
7
+
8
+
9
+ def test_makes_request
10
+ WebMock.enable!
11
+
12
+ url = 'http://api.postmarkapp.com/email'
13
+
14
+ mail = Mail.new do
15
+ from 'barney@himym.tld'
16
+ to 'ted@himym.tld'
17
+ subject %{I'm your bro!}
18
+ body %{Think of me like Yoda, but instead of being little and green I wear suits and I'm awesome. I'm your bro-I'm Broda!}
19
+ tag 'simple-postmark'
20
+ add_file BROCODE
21
+ end
22
+
23
+ mail.delivery_method Mail::SimplePostmark
24
+ stub_request :post, url
25
+ mail.deliver
26
+
27
+ assert_requested :post, url, headers: { 'Accept' => 'application/json', 'ContentType' => 'application/json', 'X-Postmark-Server-Token' => '' }
28
+
29
+ WebMock.disable!
30
+ end
31
+ end
@@ -1,9 +1,11 @@
1
1
  $: << File.expand_path('../../lib', __FILE__)
2
-
3
2
  require 'minitest/autorun'
4
3
  require 'minitest/pride'
5
- require 'minitest/spec'
4
+ require 'webmock/minitest'
6
5
 
6
+ require 'action_mailer'
7
7
  require 'simple_postmark'
8
8
 
9
- require 'webmock/minitest'
9
+ require_relative 'test_mailer'
10
+
11
+ BROCODE = File.join(File.dirname(__FILE__), 'thebrocode.jpg')
@@ -0,0 +1,41 @@
1
+ class TestMailer < ActionMailer::Base
2
+ default from: 'barney@himym.tld', to: 'ted@himym.tld'
3
+
4
+ def text
5
+ %{Think of me like Yoda, but instead of being little and green I wear suits and I'm awesome. I'm your bro-I'm Broda!}
6
+ end
7
+
8
+ def email
9
+ mail subject: %{I'm your bro!} do |as|
10
+ as.text { render text: text }
11
+ end
12
+ end
13
+
14
+ def email_with_tags
15
+ mail subject: %{I'm your bro!}, tag: 'simple-postmark' do |as|
16
+ as.text { render text: text }
17
+ end
18
+ end
19
+
20
+ def email_with_attachments
21
+ attachments['thebrocode.jpg'] = BROCODE
22
+
23
+ mail subject: %{The Brocode!} do |as|
24
+ as.text { render text: text }
25
+ end
26
+ end
27
+
28
+ def email_with_reply_to
29
+ mail subject: %{I'm your bro!}, reply_to: 'barney@barneystinsonblog.com' do |as|
30
+ as.text { render text: text }
31
+ end
32
+ end
33
+
34
+
35
+ def email_with_multipart
36
+ mail subject: %{I'm your bro!} do |as|
37
+ as.text { render text: %{Think of me like Yoda, but instead of being little and green I wear suits and I'm awesome. I'm your bro-I'm Broda!} }
38
+ as.html { render text: %{<p>Think of me like Yoda, but instead of being little and green I wear suits and I'm awesome.<br /><br />I'm your bro-I'm Broda!</p>} }
39
+ end
40
+ end
41
+ end
File without changes
metadata CHANGED
@@ -1,137 +1,154 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: simple_postmark
3
3
  version: !ruby/object:Gem::Version
4
- prerelease:
5
- version: 0.6.0
4
+ version: 0.7.0
6
5
  platform: ruby
7
6
  authors:
8
7
  - Mario Uher
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2013-07-08 00:00:00.000000000 Z
11
+ date: 2015-02-12 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
14
+ name: activesupport
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '3.0'
20
+ - - "<"
21
+ - !ruby/object:Gem::Version
22
+ version: 4.2.0
23
+ type: :runtime
15
24
  prerelease: false
16
25
  version_requirements: !ruby/object:Gem::Requirement
17
26
  requirements:
18
- - - ! '>='
27
+ - - ">="
19
28
  - !ruby/object:Gem::Version
20
29
  version: '3.0'
21
- none: false
22
- type: :runtime
23
- name: activesupport
30
+ - - "<"
31
+ - !ruby/object:Gem::Version
32
+ version: 4.2.0
33
+ - !ruby/object:Gem::Dependency
34
+ name: actionmailer
24
35
  requirement: !ruby/object:Gem::Requirement
25
36
  requirements:
26
- - - ! '>='
37
+ - - ">="
27
38
  - !ruby/object:Gem::Version
28
39
  version: '3.0'
29
- none: false
30
- - !ruby/object:Gem::Dependency
40
+ - - "<"
41
+ - !ruby/object:Gem::Version
42
+ version: 4.2.0
43
+ type: :runtime
31
44
  prerelease: false
32
45
  version_requirements: !ruby/object:Gem::Requirement
33
46
  requirements:
34
- - - ! '>='
47
+ - - ">="
35
48
  - !ruby/object:Gem::Version
36
- version: '0'
37
- none: false
38
- type: :runtime
49
+ version: '3.0'
50
+ - - "<"
51
+ - !ruby/object:Gem::Version
52
+ version: 4.2.0
53
+ - !ruby/object:Gem::Dependency
39
54
  name: httparty
40
55
  requirement: !ruby/object:Gem::Requirement
41
56
  requirements:
42
- - - ! '>='
57
+ - - ">="
43
58
  - !ruby/object:Gem::Version
44
59
  version: '0'
45
- none: false
46
- - !ruby/object:Gem::Dependency
60
+ type: :runtime
47
61
  prerelease: false
48
62
  version_requirements: !ruby/object:Gem::Requirement
49
63
  requirements:
50
- - - ! '>='
64
+ - - ">="
51
65
  - !ruby/object:Gem::Version
52
66
  version: '0'
53
- none: false
54
- type: :runtime
67
+ - !ruby/object:Gem::Dependency
55
68
  name: json
56
69
  requirement: !ruby/object:Gem::Requirement
57
70
  requirements:
58
- - - ! '>='
71
+ - - ">="
59
72
  - !ruby/object:Gem::Version
60
73
  version: '0'
61
- none: false
62
- - !ruby/object:Gem::Dependency
74
+ type: :runtime
63
75
  prerelease: false
64
76
  version_requirements: !ruby/object:Gem::Requirement
65
77
  requirements:
66
- - - ! '>='
78
+ - - ">="
67
79
  - !ruby/object:Gem::Version
68
80
  version: '0'
69
- none: false
70
- type: :runtime
81
+ - !ruby/object:Gem::Dependency
71
82
  name: mail
72
83
  requirement: !ruby/object:Gem::Requirement
73
84
  requirements:
74
- - - ! '>='
85
+ - - ">="
75
86
  - !ruby/object:Gem::Version
76
87
  version: '0'
77
- none: false
78
- - !ruby/object:Gem::Dependency
88
+ type: :runtime
79
89
  prerelease: false
80
90
  version_requirements: !ruby/object:Gem::Requirement
81
91
  requirements:
82
- - - ! '>='
92
+ - - ">="
83
93
  - !ruby/object:Gem::Version
84
94
  version: '0'
85
- none: false
86
- type: :development
95
+ - !ruby/object:Gem::Dependency
87
96
  name: minitest
88
97
  requirement: !ruby/object:Gem::Requirement
89
98
  requirements:
90
- - - ! '>='
99
+ - - ">="
91
100
  - !ruby/object:Gem::Version
92
- version: '0'
93
- none: false
94
- - !ruby/object:Gem::Dependency
101
+ version: '4.0'
102
+ - - "<"
103
+ - !ruby/object:Gem::Version
104
+ version: '5.0'
105
+ type: :development
95
106
  prerelease: false
96
107
  version_requirements: !ruby/object:Gem::Requirement
97
108
  requirements:
98
- - - ! '>='
109
+ - - ">="
99
110
  - !ruby/object:Gem::Version
100
- version: '3.0'
101
- none: false
102
- type: :development
103
- name: rails
111
+ version: '4.0'
112
+ - - "<"
113
+ - !ruby/object:Gem::Version
114
+ version: '5.0'
115
+ - !ruby/object:Gem::Dependency
116
+ name: rake
104
117
  requirement: !ruby/object:Gem::Requirement
105
118
  requirements:
106
- - - ! '>='
119
+ - - ">="
107
120
  - !ruby/object:Gem::Version
108
- version: '3.0'
109
- none: false
110
- - !ruby/object:Gem::Dependency
121
+ version: '0'
122
+ type: :development
111
123
  prerelease: false
112
124
  version_requirements: !ruby/object:Gem::Requirement
113
125
  requirements:
114
- - - ! '>='
126
+ - - ">="
115
127
  - !ruby/object:Gem::Version
116
128
  version: '0'
117
- none: false
118
- type: :development
129
+ - !ruby/object:Gem::Dependency
119
130
  name: webmock
120
131
  requirement: !ruby/object:Gem::Requirement
121
132
  requirements:
122
- - - ! '>='
133
+ - - ">="
134
+ - !ruby/object:Gem::Version
135
+ version: '0'
136
+ type: :development
137
+ prerelease: false
138
+ version_requirements: !ruby/object:Gem::Requirement
139
+ requirements:
140
+ - - ">="
123
141
  - !ruby/object:Gem::Version
124
142
  version: '0'
125
- none: false
126
- description: SimplePostmark makes it easy to send mails via Postmark™ using Rails's
143
+ description: SimplePostmark makes it easy to send mails via Postmark using Rails's
127
144
  ActionMailer.
128
145
  email: uher.mario@gmail.com
129
146
  executables: []
130
147
  extensions: []
131
148
  extra_rdoc_files: []
132
149
  files:
133
- - .gitignore
134
- - .travis.yml
150
+ - ".gitignore"
151
+ - ".travis.yml"
135
152
  - CHANGELOG.md
136
153
  - Gemfile
137
154
  - README.md
@@ -139,7 +156,8 @@ files:
139
156
  - gemfiles/Rails_3_0.gemfile
140
157
  - gemfiles/Rails_3_1.gemfile
141
158
  - gemfiles/Rails_3_2.gemfile
142
- - gemfiles/Rails_master.gemfile
159
+ - gemfiles/Rails_4_0.gemfile
160
+ - gemfiles/Rails_4_1.gemfile
143
161
  - lib/simple_postmark.rb
144
162
  - lib/simple_postmark/api_error.rb
145
163
  - lib/simple_postmark/delivery_method.rb
@@ -148,35 +166,37 @@ files:
148
166
  - lib/simple_postmark/railtie.rb
149
167
  - lib/simple_postmark/version.rb
150
168
  - simple_postmark.gemspec
151
- - spec/delivery_method_spec.rb
152
- - spec/integration_spec.rb
153
- - spec/mail_ext/message_spec.rb
154
- - spec/mail_ext/part_spec.rb
155
- - spec/railtie_spec.rb
156
- - spec/spec_helper.rb
157
- - spec/thebrocode.jpg
169
+ - test/mail/message_test.rb
170
+ - test/mail/part_test.rb
171
+ - test/mail_test.rb
172
+ - test/simple_postmark/api_test.rb
173
+ - test/simple_postmark/integration_test.rb
174
+ - test/simple_postmark_test.rb
175
+ - test/test_helper.rb
176
+ - test/test_mailer.rb
177
+ - test/thebrocode.jpg
158
178
  homepage: http://haihappen.github.com/simple_postmark
159
179
  licenses: []
180
+ metadata: {}
160
181
  post_install_message:
161
182
  rdoc_options: []
162
183
  require_paths:
163
184
  - lib
164
185
  required_ruby_version: !ruby/object:Gem::Requirement
165
186
  requirements:
166
- - - ! '>='
187
+ - - ">="
167
188
  - !ruby/object:Gem::Version
168
189
  version: '0'
169
- none: false
170
190
  required_rubygems_version: !ruby/object:Gem::Requirement
171
191
  requirements:
172
- - - ! '>='
192
+ - - ">="
173
193
  - !ruby/object:Gem::Version
174
194
  version: '0'
175
- none: false
176
195
  requirements: []
177
196
  rubyforge_project:
178
- rubygems_version: 1.8.25
197
+ rubygems_version: 2.2.2
179
198
  signing_key:
180
- specification_version: 3
181
- summary: A simple way to use Postmark with your Rails app.
199
+ specification_version: 4
200
+ summary: A simple way to use Postmark with your Rails app.
182
201
  test_files: []
202
+ has_rdoc:
@@ -1,12 +0,0 @@
1
- source 'https://rubygems.org'
2
-
3
- gem 'activesupport', github: 'rails/rails'
4
- gem 'httparty'
5
- gem 'json'
6
- gem 'mail'
7
-
8
- group :development do
9
- gem 'minitest'
10
- gem 'rails', github: 'rails/rails'
11
- gem 'webmock'
12
- end
@@ -1,44 +0,0 @@
1
- require_relative 'spec_helper'
2
-
3
- describe Mail do
4
- describe SimplePostmark do
5
- let(:instance) { Mail::SimplePostmark.new }
6
-
7
-
8
- it 'responds to deliver!' do
9
- instance.must_respond_to(:deliver!)
10
- end
11
-
12
-
13
- describe :deliver! do
14
- let(:mail) do
15
- Mail.new do
16
- from 'barney@himym.tld'
17
- to 'ted@himym.tld'
18
- subject "I'm your bro!"
19
- body "Think of me like Yoda, but instead of being little and green I wear suits and I'm awesome. I'm your bro-I'm Broda!"
20
- tag 'simple-postmark'
21
- add_file(File.join(File.dirname(__FILE__), 'thebrocode.jpg'))
22
- end
23
- end
24
- let(:url) { 'http://api.postmarkapp.com/email' }
25
-
26
-
27
- before do
28
- mail.delivery_method(Mail::SimplePostmark)
29
- stub_request(:post, url)
30
- mail.deliver
31
- end
32
-
33
-
34
- it 'sends emails' do
35
- assert_requested(:post, url)
36
- end
37
-
38
-
39
- it 'sends appropriate headers' do
40
- assert_requested(:post, url, headers: { 'Accept' => 'application/json', 'ContentType' => 'application/json', 'X-Postmark-Server-Token' => '' })
41
- end
42
- end
43
- end
44
- end
@@ -1,101 +0,0 @@
1
- require_relative 'spec_helper'
2
- require 'action_mailer'
3
- require 'rails'
4
- require 'simple_postmark/railtie'
5
-
6
- WebMock.allow_net_connect!
7
-
8
- class IntegrationMailer < ActionMailer::Base
9
- default from: 'barney@himym.tld', to: 'ted@himym.tld'
10
-
11
- def text
12
- 'Mail send via Postmark using SimplePostmark'
13
- end
14
-
15
- def email
16
- mail(subject: 'SimplePostmark') do |as|
17
- as.text { render(text: text) }
18
- end
19
- end
20
-
21
- def email_with_tags
22
- mail(subject: 'SimplePostmark with Tags', tag: 'simple-postmark') do |as|
23
- as.text { render(text: text) }
24
- end
25
- end
26
-
27
- def email_with_attachments
28
- attachments['thebrocode.jpg'] = File.read(File.join(File.dirname(__FILE__), 'thebrocode.jpg'))
29
-
30
- mail(subject: 'SimplePostmark with Attachments') do |as|
31
- as.text { render(text: text) }
32
- end
33
- end
34
-
35
- def email_with_reply_to
36
- mail(subject: 'SimplePostmark with Reply To', reply_to: 'barney@barneystinsonblog.com') do |as|
37
- as.text { render(text: text) }
38
- end
39
- end
40
- end
41
-
42
- describe 'SimplePostmark integration' do
43
- before do
44
- ActionMailer::Base.simple_postmark_settings = { api_key: 'POSTMARK_API_TEST', return_response: true }
45
- ActionMailer::Base.raise_delivery_errors = true
46
- end
47
-
48
-
49
- it 'sends emails' do
50
- IntegrationMailer.email.deliver
51
- end
52
-
53
-
54
- it 'sends emails with tags' do
55
- IntegrationMailer.email_with_tags.deliver
56
- end
57
-
58
-
59
- it 'sends emails with attachments' do
60
- IntegrationMailer.email_with_attachments.deliver
61
- end
62
-
63
-
64
- it 'sends emails with reply-to' do
65
- IntegrationMailer.email_with_reply_to.deliver
66
- end
67
-
68
-
69
- describe 'wrong mail settings' do
70
- before do
71
- ActionMailer::Base.simple_postmark_settings = { api_key: '********-****-****-****-************' }
72
- end
73
-
74
-
75
- it 'is silent if raise_delivery_errors is not set' do
76
- ActionMailer::Base.raise_delivery_errors = false
77
-
78
- IntegrationMailer.email.deliver
79
- end
80
-
81
-
82
- it 'raises a SimplePostmark::APIError containing the error from postmarkapp.com if raise_delivery_errors is set' do
83
- ->{ IntegrationMailer.email.deliver }.must_raise(SimplePostmark::APIError)
84
- end
85
- end
86
-
87
-
88
- describe 'setting return_response option' do
89
- before do
90
- ActionMailer::Base.simple_postmark_settings = { api_key: 'POSTMARK_API_TEST', return_response: true }
91
- end
92
-
93
- it 'returns the response from postmarkapp.com' do
94
- response = IntegrationMailer.email.deliver!.parsed_response
95
-
96
- response['To'].must_equal('ted@himym.tld')
97
- response['Message'].must_equal('Test job accepted')
98
- response['MessageID'].wont_be_empty
99
- end
100
- end
101
- end
@@ -1,103 +0,0 @@
1
- require_relative '../spec_helper'
2
-
3
- describe Mail::Message do
4
- describe 'integration into Mail::Message' do
5
- subject { Mail::Message.new }
6
-
7
-
8
- it 'responds to +to_postmark+' do
9
- subject.must_respond_to(:to_postmark)
10
- end
11
- end
12
-
13
-
14
- describe 'integration into Mail' do
15
- subject { Mail.new }
16
-
17
-
18
- it 'responds to +to_postmark+' do
19
- subject.must_respond_to(:to_postmark)
20
- end
21
- end
22
-
23
-
24
- describe :to_postmark do
25
- subject do
26
- Mail.new do
27
- from 'barney@himym.tld'
28
- to 'ted@himym.tld'
29
- subject "I'm your bro!"
30
- body "Think of me like Yoda, but instead of being little and green I wear suits and I'm awesome. I'm your bro-I'm Broda!"
31
- tag 'simple-postmark'
32
- end
33
- end
34
-
35
-
36
- it 'returns a hash' do
37
- hash = {
38
- 'From' => 'barney@himym.tld',
39
- 'To' => 'ted@himym.tld',
40
- 'Subject' => "I'm your bro!",
41
- 'TextBody' => "Think of me like Yoda, but instead of being little and green I wear suits and I'm awesome. I'm your bro-I'm Broda!",
42
- 'Tag' => 'simple-postmark',
43
- 'Attachments' => [{
44
- 'Name' => 'thebrocode.jpg',
45
- 'Content' => [File.read(File.join(File.dirname(__FILE__), '..', 'thebrocode.jpg'))].pack('m'),
46
- 'ContentType' => 'image/jpeg'
47
- }]
48
- }
49
- subject.add_file(File.join(File.dirname(__FILE__), '..', 'thebrocode.jpg'))
50
-
51
- subject.to_postmark.must_equal(hash)
52
- end
53
-
54
-
55
- it 'returns multiple recipients as comma-separated list' do
56
- subject.to = ['barney@himym.tld', 'marshall@himym.tld']
57
-
58
- subject.to_postmark['To'].must_equal('barney@himym.tld, marshall@himym.tld')
59
- end
60
-
61
-
62
- it 'returns all email headers as hash' do
63
- subject.bcc = 'lily@himym.tld'
64
- subject.cc = 'marshall@himym.tld'
65
- subject.reply_to = 'barney@barneystinsonblog.com'
66
-
67
- hash = {
68
- 'Bcc' => 'lily@himym.tld',
69
- 'Cc' => 'marshall@himym.tld',
70
- 'From' => 'barney@himym.tld',
71
- 'ReplyTo' => 'barney@barneystinsonblog.com',
72
- 'Subject' => "I'm your bro!",
73
- 'Tag' => 'simple-postmark',
74
- 'TextBody' => "Think of me like Yoda, but instead of being little and green I wear suits and I'm awesome. I'm your bro-I'm Broda!",
75
- 'To' => 'ted@himym.tld'
76
- }
77
-
78
- subject.to_postmark.must_equal(hash)
79
- end
80
-
81
-
82
- it 'should use the from and reply-to names as well as the email addresses' do
83
- subject.to = 'Lily <lily@himym.tld>'
84
- subject.from = 'Marshall <marshall@himym.tld>'
85
- subject.reply_to = 'Barney <barney@barneystinsonblog.com>'
86
- subject.bcc = 'lily@himym.tld'
87
- subject.cc = 'marshall@himym.tld'
88
-
89
- hash = {
90
- 'To' => 'Lily <lily@himym.tld>',
91
- 'From' => 'Marshall <marshall@himym.tld>',
92
- 'ReplyTo' => 'Barney <barney@barneystinsonblog.com>',
93
- 'Bcc' => 'lily@himym.tld',
94
- 'Cc' => 'marshall@himym.tld',
95
- 'Subject' => "I'm your bro!",
96
- 'Tag' => 'simple-postmark',
97
- 'TextBody' => "Think of me like Yoda, but instead of being little and green I wear suits and I'm awesome. I'm your bro-I'm Broda!",
98
- }
99
-
100
- subject.to_postmark.must_equal(hash)
101
- end
102
- end
103
- end
@@ -1,62 +0,0 @@
1
- require_relative '../spec_helper'
2
-
3
- describe 'Mail::Part' do
4
- describe 'integration into Mail::Part' do
5
- subject { Mail::Part.new }
6
-
7
-
8
- it 'responds to +to_postmark+' do
9
- subject.must_respond_to(:to_postmark)
10
- end
11
- end
12
-
13
-
14
- describe :to_postmark do
15
- describe 'a text/plain part' do
16
- let(:content) { "Think of me like Yoda, but instead of being little and green I wear suits and I'm awesome. I'm your bro-I'm Broda!" }
17
- subject do
18
- Mail::Part.new.tap do |mail|
19
- mail.body = content
20
- mail.content_type = 'text/plain'
21
- end
22
- end
23
-
24
-
25
- it 'returns body hash' do
26
- subject.to_postmark.must_equal('Name' => nil, 'Content' => content, 'ContentType' => 'text/plain')
27
- end
28
- end
29
-
30
-
31
- describe 'a text/html part' do
32
- let(:content) { "<p>Think of me like Yoda, but instead of being little and green I wear suits and I'm awesome.<br /><br />I'm your bro-I'm Broda!</p>" }
33
- subject do
34
- Mail::Part.new.tap do |mail|
35
- mail.body = content
36
- mail.content_type = 'text/html'
37
- end
38
- end
39
-
40
-
41
- it 'returns body hash' do
42
- subject.to_postmark.must_equal('Name' => nil, 'Content' => content, 'ContentType' => 'text/html')
43
- end
44
- end
45
-
46
-
47
- describe 'a file part' do
48
- let(:file) { File.join(File.dirname(__FILE__), '..', 'thebrocode.jpg') }
49
- let(:content) { [File.read(file)].pack('m') }
50
- subject do
51
- Mail::Part.new.tap do |mail|
52
- mail.add_file(file)
53
- end.attachments.first
54
- end
55
-
56
-
57
- it 'returns base64-encoded file-content hash if part is an attachment' do
58
- subject.to_postmark.must_equal('Name' => 'thebrocode.jpg', 'Content' => content, 'ContentType' => 'image/jpeg')
59
- end
60
- end
61
- end
62
- end
@@ -1,118 +0,0 @@
1
- require_relative 'spec_helper'
2
- require 'action_mailer'
3
- require 'rails'
4
- require 'simple_postmark/railtie'
5
-
6
- ActionMailer::Base.delivery_method = :simple_postmark
7
-
8
- class NotificationMailer < ActionMailer::Base
9
- default from: 'barney@himym.tld', to: 'ted@himym.tld'
10
-
11
- def im_your_bro
12
- mail(subject: "I'm your bro!", body: '')
13
- end
14
-
15
- def im_your_bro_tagged
16
- mail(subject: "I'm your bro!", tag: 'simple-postmark', body: '')
17
- end
18
-
19
- def im_your_bro_multipart
20
- mail(subject: "I'm your bro!") do |as|
21
- as.html { render(text: "<p>Think of me like Yoda, but instead of being little and green I wear suits and I'm awesome.<br /><br />I'm your bro-I'm Broda!</p>" )}
22
- as.text { render(text: "Think of me like Yoda, but instead of being little and green I wear suits and I'm awesome. I'm your bro-I'm Broda!" )}
23
- end
24
- end
25
-
26
- def the_bro_code
27
- attachments['thebrocode.jpg'] = File.read(File.join(File.dirname(__FILE__), 'thebrocode.jpg'))
28
- mail(subject: 'The Brocode!', body: '')
29
- end
30
- end
31
-
32
- def merge_body(hash = {})
33
- Hash[*body.merge(hash).sort.flatten(1)].to_json
34
- end
35
-
36
- describe ActionMailer::Base do
37
- let(:url) { 'http://api.postmarkapp.com/email' }
38
- let(:api_key) { '********-****-****-****-************' }
39
-
40
- let(:headers) do
41
- {
42
- 'Accept' => 'application/json',
43
- 'ContentType' => 'application/json',
44
- 'X-Postmark-Server-Token' => api_key
45
- }
46
- end
47
-
48
- let(:body) do
49
- {
50
- 'From' => 'barney@himym.tld',
51
- 'Subject' => "I'm your bro!",
52
- 'To' => 'ted@himym.tld'
53
- }
54
- end
55
-
56
-
57
- before do
58
- stub_request(:post, url)
59
- end
60
-
61
-
62
- it 'responds to +simple_postmark_settings+' do
63
- ActionMailer::Base.must_respond_to(:simple_postmark_settings)
64
- end
65
-
66
-
67
- it 'allows setting an api key' do
68
- ActionMailer::Base.simple_postmark_settings = { api_key: api_key }
69
-
70
- ActionMailer::Base.simple_postmark_settings[:api_key].must_equal(api_key)
71
- end
72
-
73
-
74
- describe 'sending mails' do
75
- before do
76
- ActionMailer::Base.simple_postmark_settings = { api_key: api_key }
77
- end
78
-
79
-
80
- it 'works' do
81
- NotificationMailer.im_your_bro.deliver
82
-
83
- assert_requested(:post, url, headers: headers, body: merge_body)
84
- end
85
-
86
-
87
- it 'allows tags' do
88
- NotificationMailer.im_your_bro_tagged.deliver
89
-
90
- assert_requested(:post, url, headers: headers, body: merge_body('Tag' => 'simple-postmark'))
91
- end
92
-
93
-
94
- it 'works with attachments' do
95
- attachment = {
96
- 'Content' => [File.read(File.join(File.dirname(__FILE__), 'thebrocode.jpg'))].pack('m'),
97
- 'ContentType' => 'image/jpeg',
98
- 'Name' => 'thebrocode.jpg'
99
- }
100
-
101
- NotificationMailer.the_bro_code.deliver
102
-
103
- assert_requested(:post, url, headers: headers, body: merge_body('Subject' => 'The Brocode!', 'Attachments' => [attachment]))
104
- end
105
-
106
-
107
- it 'works with multipart messages' do
108
- bodies = {
109
- 'HtmlBody' => "<p>Think of me like Yoda, but instead of being little and green I wear suits and I'm awesome.<br /><br />I'm your bro-I'm Broda!</p>",
110
- 'TextBody' => "Think of me like Yoda, but instead of being little and green I wear suits and I'm awesome. I'm your bro-I'm Broda!"
111
- }
112
-
113
- NotificationMailer.im_your_bro_multipart.deliver
114
-
115
- assert_requested(:post, url, headers: headers, body: merge_body(bodies))
116
- end
117
- end
118
- end