actionmailer-markdown 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 874c3169e4c82c8ca92ede8f58400d04266df87c
4
+ data.tar.gz: 5b05edf6162e53a0df8219a37a147918a8b86c20
5
+ SHA512:
6
+ metadata.gz: caa5bf5a3638f51410da282d057a7cc1ee19d94d7c54e083a34c7abe125c75cf3897771047f61e16c3082ce7754fc8fe189b906ab6470191bf6349fea80a16f0
7
+ data.tar.gz: db8a7e8212ad66eb758bf36f36191c67a39507fb172d5bb93d84a453e9e53e9d05274c90d60511f5d507473d0508b9728e3119980cb1e5e5d7b5f89cce913c82
data/.gitignore ADDED
@@ -0,0 +1,9 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
data/.travis.yml ADDED
@@ -0,0 +1,8 @@
1
+ language: ruby
2
+ cache: bundler
3
+ sudo: false
4
+ rvm:
5
+ - 2.2.2
6
+ before_install: gem install bundler
7
+ notifications:
8
+ email: false
@@ -0,0 +1,13 @@
1
+ # Contributor Code of Conduct
2
+
3
+ As contributors and maintainers of this project, we pledge to respect all people who contribute through reporting issues, posting feature requests, updating documentation, submitting pull requests or patches, and other activities.
4
+
5
+ We are committed to making participation in this project a harassment-free experience for everyone, regardless of level of experience, gender, gender identity and expression, sexual orientation, disability, personal appearance, body size, race, ethnicity, age, or religion.
6
+
7
+ Examples of unacceptable behavior by participants include the use of sexual language or imagery, derogatory comments or personal attacks, trolling, public or private harassment, insults, or other unprofessional conduct.
8
+
9
+ Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct. Project maintainers who do not follow the Code of Conduct may be removed from the project team.
10
+
11
+ Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by opening an issue or contacting one or more of the project maintainers.
12
+
13
+ This Code of Conduct is adapted from the [Contributor Covenant](http://contributor-covenant.org), version 1.0.0, available at [http://contributor-covenant.org/version/1/0/0/](http://contributor-covenant.org/version/1/0/0/)
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in actionmailer-markdown.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2015 Nando Vieira
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,202 @@
1
+ # ActionMailer::Markdown
2
+
3
+ ![build status](https://travis-ci.org/fnando/actionmailer-markdown.svg)
4
+
5
+ A different take on using ActionMailer, Markdown and I18n.
6
+
7
+ ## Installation
8
+
9
+ Add this line to your application's Gemfile:
10
+
11
+ ```ruby
12
+ gem 'actionmailer-markdown'
13
+ ```
14
+
15
+ And then execute:
16
+
17
+ $ bundle
18
+
19
+ Or install it yourself as:
20
+
21
+ $ gem install actionmailer-markdown
22
+
23
+ ## Usage
24
+
25
+ Imagine that you have a mail named `UserMailer#welcome`. Instead of manually defining your subjects like the following, you can create the subject by defining the `user_mailer.welcome.subject` translation.
26
+
27
+ ```ruby
28
+ # app/mailers/user_mailer.rb
29
+ class UserMailer < ApplicationMailer
30
+ def welcome(email)
31
+ mail to: email, subject: 'Welcome to Myapp'
32
+ end
33
+ end
34
+ ```
35
+
36
+ ```yaml
37
+ # config/locales/en.yml
38
+ en:
39
+ user_mailer:
40
+ welcome:
41
+ subject: Welcome to my app
42
+ ```
43
+
44
+ Since I really like defining everything I can in I18n files, I always extend this behavior to the message's body, through the `user_mailer.welcome.body` translation.
45
+
46
+ ```yaml
47
+ # config/locales/en.yml
48
+ en:
49
+ user_mailer:
50
+ welcome:
51
+ subject: Welcome to my app
52
+ body: |
53
+ This is an e-mail body.
54
+
55
+ --
56
+ Myapp team
57
+ ```
58
+
59
+ Did you notice that `|`? That allows YAML strings to be multiline. And on your e-mail class you can do something like this:
60
+
61
+ ```ruby
62
+ # app/mailers/user_mailer.rb
63
+ class UserMailer < ApplicationMailer
64
+ def welcome(email)
65
+ mail to: email, body: I18n.t('user_mailer.welcome.body')
66
+ end
67
+ end
68
+ ```
69
+
70
+ And if you want to render HTML and text-plain from this string, you may have to do something like this (Markdown class not shown).
71
+
72
+ ```ruby
73
+ # app/mailers/user_mailer.rb
74
+ class UserMailer < ApplicationMailer
75
+ def welcome(email)
76
+ message = I18n.t('user_mailer.welcome.body')
77
+
78
+ mail to: email do |format|
79
+ format.text { render plain: message }
80
+ format.html { render html: Markdown.html(message).html_safe }
81
+ end
82
+ end
83
+ end
84
+ ```
85
+
86
+ This idea is really nice, but you have too much things to deal with. Not anymore!
87
+
88
+ With ActionMailer::Markdown you can just define your mailer action like this:
89
+
90
+ ```ruby
91
+ # app/mailers/user_mailer.rb
92
+ class UserMailer < ApplicationMailer
93
+ def welcome(email)
94
+ mail to: email
95
+ end
96
+ end
97
+ ```
98
+
99
+ That's right! This gem automatically uses `user_mailer.welcome.{subject,body}` from your translation files. And the best part: it evens supports Markdown.
100
+
101
+ ### Passing variables
102
+
103
+ You're likely to pass in variables to your messages. To do this, just define instance variables. Imagine you want to parse the user's name on your subject and message. Let's suppose you have your translation file defined like this:
104
+
105
+ ```yaml
106
+ en:
107
+ user_mailer:
108
+ welcome:
109
+ subject: 'Welcome to Myapp, %{name}'
110
+ body: |
111
+ Hello, %{name}. And welcome to Myapp.
112
+ ```
113
+
114
+ This is what your mailer will look like:
115
+
116
+ ```ruby
117
+ class UserMailer < ApplicationMailer
118
+ def welcome(user)
119
+ @name = user.name
120
+ mail to: user.email
121
+ end
122
+ end
123
+ ```
124
+
125
+ Same thing for URLs:
126
+
127
+ ```ruby
128
+ class UserMailer < ApplicationMailer
129
+ def activation_email(user)
130
+ @name = user.name
131
+ @activation_url = account_activation_url(user.uuid)
132
+ mail to: user.email
133
+ end
134
+ end
135
+ ```
136
+
137
+ And your e-mail body can be something like this:
138
+
139
+ ```yaml
140
+ en:
141
+ user_mailer:
142
+ activation_email:
143
+ subject: Activate your account
144
+ body: |
145
+ Hello, %{name}!
146
+
147
+ You have to [activate your account](%{activation_url}).
148
+
149
+ Thanks,
150
+
151
+ --
152
+ Myapp team
153
+ ```
154
+
155
+ You may be wondering what happens with the mail's text part. Don't worry! ActionMailer::Markdown will take care of that. That message will be rendered as:
156
+
157
+ ```text
158
+ Hello, John!
159
+
160
+ You have to activate your account[1].
161
+
162
+ Thanks,
163
+ --
164
+ Myapp team
165
+
166
+ [1]: http://example.com/activate/4d4b4396-dc26-47c4-b433-2cd9a1b45ce1
167
+ ```
168
+
169
+ Lists and other elements are also exported to a more friendly text version.
170
+
171
+ **PROTIP:** Use [i18n-dot_lookup](https://github.com/fnando/i18n-dot_lookup) if you want to access properties from an object, like `%{user.name}`
172
+
173
+ ### Replacing the Markdown engine
174
+
175
+ [redcarpet](https://github.com/vmg/redcarpet) is the default Markdown parser. You may want to specify different options or even switch out to a different Markdown library. All you have to do is defining a processor that responds to `.call`. Let's say you want to use [kramdown](http://kramdown.gettalong.org/) as your Markdown engine.
176
+
177
+ ```ruby
178
+ ActionMailer::Markdown.processor = -> text { Kramdown::Document.new(text).to_html }
179
+ ```
180
+
181
+ ### Falling back to ActionMailer's default behavior
182
+
183
+ You can use templates if you want. Just don't define the `.body` part of your translation. Also, if you pass a block to the `mail()` method, it will skip this functionally completely.
184
+
185
+ ### Using markdown files
186
+
187
+ If you want to use Markdown files instead of I18n translations, this gem is not for you. Consider using [maildown](https://github.com/schneems/maildown) or [markerb](https://github.com/plataformatec/markerb).
188
+
189
+ ## Development
190
+
191
+ After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
192
+
193
+ To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
194
+
195
+ ## Contributing
196
+
197
+ Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/actionmailer-markdown. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](contributor-covenant.org) code of conduct.
198
+
199
+
200
+ ## License
201
+
202
+ The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
data/Rakefile ADDED
@@ -0,0 +1,10 @@
1
+ require 'bundler/gem_tasks'
2
+ require 'rake/testtask'
3
+
4
+ Rake::TestTask.new(:test) do |t|
5
+ t.libs << 'test'
6
+ t.libs << 'lib'
7
+ t.test_files = FileList['test/**/*_test.rb']
8
+ end
9
+
10
+ task :default => :test
@@ -0,0 +1,26 @@
1
+ require './lib/action_mailer/markdown/version'
2
+
3
+ Gem::Specification.new do |spec|
4
+ spec.name = 'actionmailer-markdown'
5
+ spec.version = ActionMailer::Markdown::VERSION
6
+ spec.authors = ['Nando Vieira']
7
+ spec.email = ['fnando.vieira@gmail.com']
8
+ spec.summary = 'A different take on using ActionMailer, Markdown and I18n.'
9
+ spec.description = spec.summary
10
+ spec.homepage = 'https://github.com/fnando/actionmailer-markdown'
11
+ spec.license = 'MIT'
12
+
13
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
14
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
15
+ spec.require_paths = ['lib']
16
+
17
+ spec.add_dependency 'actionmailer'
18
+ spec.add_dependency 'redcarpet'
19
+
20
+ spec.add_development_dependency 'bundler', '~> 1.10'
21
+ spec.add_development_dependency 'rake', '~> 10.0'
22
+ spec.add_development_dependency 'minitest'
23
+ spec.add_development_dependency 'minitest-utils'
24
+ spec.add_development_dependency 'pry-meta'
25
+ spec.add_development_dependency 'kramdown'
26
+ end
data/bin/console ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "actionmailer-markdown"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require "irb"
14
+ IRB.start
data/bin/setup ADDED
@@ -0,0 +1,7 @@
1
+ #!/bin/bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+
5
+ bundle install
6
+
7
+ # Do any other automated setup that you need to do here
@@ -0,0 +1,11 @@
1
+ module ActionMailer
2
+ module Markdown
3
+ require 'action_mailer'
4
+ require 'redcarpet'
5
+
6
+ require 'action_mailer/markdown/version'
7
+ require 'action_mailer/markdown/ext'
8
+ require 'action_mailer/markdown/renderer'
9
+ require 'action_mailer/markdown/renderer/text'
10
+ end
11
+ end
@@ -0,0 +1,37 @@
1
+ ActionMailer::Base.class_eval do
2
+ mail_method = instance_method(:mail)
3
+
4
+ define_method(:mail) do |headers = {}, &block|
5
+ options = variables_set_by_user
6
+ message = get_translation_for('body', options)
7
+ subject = get_translation_for('subject', options)
8
+ headers[:subject] ||= subject
9
+
10
+ if message
11
+ block = proc do |format|
12
+ format.text { render plain: ActionMailer::Markdown.text(message) }
13
+ format.html { render html: ActionMailer::Markdown.html(message).html_safe }
14
+ end
15
+ end
16
+
17
+ mail_method.bind(self).call(headers, &block)
18
+ end
19
+
20
+ def mailer_scope
21
+ self.class.mailer_name.tr('/', '.')
22
+ end
23
+
24
+ def get_translation_for(key, options)
25
+ I18n.t(key, options.merge(scope: [mailer_scope, action_name], raise: true))
26
+ rescue I18n::MissingTranslationData
27
+ nil
28
+ end
29
+
30
+ def variables_set_by_user
31
+ instance_variables.each_with_object({}) do |name, buffer|
32
+ next if name.match(/^@_/)
33
+ name = name.to_s[/^@(.*?)$/, 1]
34
+ buffer[name.to_sym] = instance_variable_get("@#{name}")
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,36 @@
1
+ module ActionMailer
2
+ module Markdown
3
+ class Renderer < Redcarpet::Render::HTML
4
+ include Redcarpet::Render::SmartyPants
5
+ end
6
+
7
+ class << self
8
+ # Set markdown renderer
9
+ attr_accessor :processor, :default_processor
10
+ end
11
+
12
+ renderer = Renderer.new(hard_wrap: true, safe_links_only: true)
13
+
14
+ markdown_engine = Redcarpet::Markdown.new(renderer, {
15
+ tables: true,
16
+ footnotes: true,
17
+ space_after_headers: true,
18
+ superscript: true,
19
+ highlight: true,
20
+ strikethrough: true,
21
+ autolink: true,
22
+ no_intra_emphasis: true
23
+ })
24
+
25
+ self.default_processor = -> text { markdown_engine.render(text) }
26
+ self.processor = default_processor
27
+
28
+ def self.html(text)
29
+ processor.call(text)
30
+ end
31
+
32
+ def self.text(source)
33
+ Renderer::Text.extract(source)
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,82 @@
1
+ module ActionMailer
2
+ module Markdown
3
+ class Renderer
4
+ class Text
5
+ attr_reader :source, :root
6
+
7
+ def self.extract(source)
8
+ new(source).extract
9
+ end
10
+
11
+ def initialize(source)
12
+ @source = source
13
+ @root = Nokogiri::HTML(Markdown.html(source)).css('body')
14
+ end
15
+
16
+ def extract
17
+ process_hr
18
+ process_links
19
+ process_h1
20
+ process_h2
21
+ process_lists
22
+ process_code
23
+
24
+ root.text
25
+ end
26
+
27
+ def process_code
28
+ root.css('code').each do |code|
29
+ next if code.parent.name == 'pre'
30
+ code.content = "`#{code.content}`"
31
+ end
32
+ end
33
+
34
+ def process_hr
35
+ root.css('hr').each(&:remove)
36
+ end
37
+
38
+ def process_h1
39
+ root.css('h1').each do |heading|
40
+ heading.content = "#{heading.text}\n#{'=' * heading.text.size}"
41
+ end
42
+ end
43
+
44
+ def process_h2
45
+ root.css('h2').each do |heading|
46
+ heading.content = "\n#{heading.text}\n#{'-' * heading.text.size}"
47
+ end
48
+ end
49
+
50
+ def process_lists
51
+ root.css('ol, ul').each do |list|
52
+ list.css('li').to_enum(:each).with_index(1) do |item, index|
53
+ prefix = (list.name == 'ol' ? "#{index}." : "-")
54
+ item.content = "#{prefix} #{item.text}"
55
+ end
56
+ end
57
+ end
58
+
59
+ def process_links
60
+ links = []
61
+
62
+ root.css('a').each do |link|
63
+ href = link['href']
64
+
65
+ if href.starts_with?('mailto:')
66
+ link.content = href.sub('mailto:', '')
67
+ elsif link.content.match(%r[^(?!\w+://)])
68
+ links << href unless links.include?(href)
69
+ index = links.index(href) + 1
70
+ link.content = "#{link.content}[#{index}]"
71
+ end
72
+ end
73
+
74
+ links_list = links.map.with_index(1) {|link, index| "[#{index}]: #{link}" }.join("\n")
75
+ node = Nokogiri::HTML.fragment "<pre>#{links_list}</pre>"
76
+
77
+ root << node
78
+ end
79
+ end
80
+ end
81
+ end
82
+ end
@@ -0,0 +1,5 @@
1
+ module ActionMailer
2
+ module Markdown
3
+ VERSION = '0.1.0'
4
+ end
5
+ end
@@ -0,0 +1 @@
1
+ require 'action_mailer/markdown'
metadata ADDED
@@ -0,0 +1,172 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: actionmailer-markdown
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Nando Vieira
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-08-11 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: actionmailer
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: redcarpet
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: bundler
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '1.10'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '1.10'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rake
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '10.0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '10.0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: minitest
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: minitest-utils
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: pry-meta
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: kramdown
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ description: A different take on using ActionMailer, Markdown and I18n.
126
+ email:
127
+ - fnando.vieira@gmail.com
128
+ executables: []
129
+ extensions: []
130
+ extra_rdoc_files: []
131
+ files:
132
+ - ".gitignore"
133
+ - ".travis.yml"
134
+ - CODE_OF_CONDUCT.md
135
+ - Gemfile
136
+ - LICENSE.txt
137
+ - README.md
138
+ - Rakefile
139
+ - actionmailer-markdown.gemspec
140
+ - bin/console
141
+ - bin/setup
142
+ - lib/action_mailer/markdown.rb
143
+ - lib/action_mailer/markdown/ext.rb
144
+ - lib/action_mailer/markdown/renderer.rb
145
+ - lib/action_mailer/markdown/renderer/text.rb
146
+ - lib/action_mailer/markdown/version.rb
147
+ - lib/actionmailer-markdown.rb
148
+ homepage: https://github.com/fnando/actionmailer-markdown
149
+ licenses:
150
+ - MIT
151
+ metadata: {}
152
+ post_install_message:
153
+ rdoc_options: []
154
+ require_paths:
155
+ - lib
156
+ required_ruby_version: !ruby/object:Gem::Requirement
157
+ requirements:
158
+ - - ">="
159
+ - !ruby/object:Gem::Version
160
+ version: '0'
161
+ required_rubygems_version: !ruby/object:Gem::Requirement
162
+ requirements:
163
+ - - ">="
164
+ - !ruby/object:Gem::Version
165
+ version: '0'
166
+ requirements: []
167
+ rubyforge_project:
168
+ rubygems_version: 2.4.6
169
+ signing_key:
170
+ specification_version: 4
171
+ summary: A different take on using ActionMailer, Markdown and I18n.
172
+ test_files: []