inky-rails 1.0.1

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: c8f0d12f941bb56b5bab40e1e446b47be95f605c
4
+ data.tar.gz: 6ed2012d1cd83af8cc4f8d32780f56fa03ef9832
5
+ SHA512:
6
+ metadata.gz: e1861dea45d4140cd39ec3ec8cc20040e6652e55eaf7051854cc5cbbd4038c813f3791e17c9fc0197938151706a5589bf0b9e95c35d2d17aa73d01d64340be56
7
+ data.tar.gz: 8d7d957ffafb1829f4214ac1a39db4adbb3a2761c16c60c8a5c935b0ac8f1579d9d9caf854ec24f72b6dba6bfb8b54951bca9ead289f4c34803c307f359628ee
@@ -0,0 +1,28 @@
1
+ Copyright 2016 Whitesmith (https://whitesmith.co)
2
+
3
+ Based on Mjml-Rails gem:
4
+
5
+ Copyright 2016 Simon Loffler (https://sighmon.com)
6
+
7
+ Based on Markerb Gem:
8
+
9
+ Copyright 2011-2015 Plataformatec (http://blog.plataformatec.com.br)
10
+
11
+ Permission is hereby granted, free of charge, to any person obtaining
12
+ a copy of this software and associated documentation files (the
13
+ "Software"), to deal in the Software without restriction, including
14
+ without limitation the rights to use, copy, modify, merge, publish,
15
+ distribute, sublicense, and/or sell copies of the Software, and to
16
+ permit persons to whom the Software is furnished to do so, subject to
17
+ the following conditions:
18
+
19
+ The above copyright notice and this permission notice shall be
20
+ included in all copies or substantial portions of the Software.
21
+
22
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
23
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
24
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
25
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
26
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
27
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
28
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,67 @@
1
+ # Inky-Rails
2
+
3
+ **Inky-Rails** allows you to render HTML e-mails from an
4
+ [Inky]https://github.com/zurb/inky) template.
5
+
6
+ An example template might look like:
7
+
8
+ ```erb
9
+ <!-- TODO -->
10
+ ```
11
+
12
+ And the partial `_info.inky`:
13
+
14
+ ```erb
15
+ <!-- TODO -->
16
+ ```
17
+
18
+ * Notice you can use ERb and partials inside the template.
19
+
20
+ Your `user_mailer.rb` might look like this::
21
+
22
+ ```ruby
23
+ # ./app/mailers/user_mailer.rb
24
+ class UserMailer < ActionMailer::Base
25
+ def user_signup_confirmation()
26
+ mail(to: 'test@example.com', subject: 'test') do |format|
27
+ format.text
28
+ format.inky
29
+ end
30
+ end
31
+ end
32
+ ```
33
+
34
+ ## Installation
35
+
36
+ Add it to your Gemfile.
37
+
38
+ ```ruby
39
+ gem 'inky-rails'
40
+ ```
41
+
42
+ Run the following command to install it:
43
+
44
+ ```console
45
+ bundle install
46
+ ```
47
+
48
+ Install the Inky CLI parser (optional -g to install it globally):
49
+
50
+ ```console
51
+ npm install -g inky-cli@^1.0
52
+ ```
53
+
54
+ ## Bug reports
55
+
56
+ If you discover any bugs, feel free to create an issue on GitHub. Please add as
57
+ much information as possible to help us fixing the possible bug. We also
58
+ encourage you to help even more by forking and sending us a pull request.
59
+
60
+ [github.com/whitesmith/inky-rails/issues](https://github.com/whitesmith/inky-rails/issues)
61
+
62
+ ## License
63
+
64
+ MIT License. Copyright 2016 Whitesmith. [whitesmith.co](http://www.whitesmith.co)
65
+
66
+ Lovingly built on [github.com/sighmon/mjml-rails](https://github.com/sighmon/mjml-rails)
67
+ which was previously based on [github.com/plataformatec/markerb](https://github.com/plataformatec/markerb)
@@ -0,0 +1,23 @@
1
+ require 'rails/generators/erb/mailer/mailer_generator'
2
+
3
+ module Inky
4
+ module Generators
5
+ class MailerGenerator < Erb::Generators::MailerGenerator
6
+ source_root File.expand_path('../templates', __FILE__)
7
+
8
+ protected
9
+
10
+ def format
11
+ nil # Our templates have no format
12
+ end
13
+
14
+ def formats
15
+ [format]
16
+ end
17
+
18
+ def handler
19
+ :inky
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,3 @@
1
+ <%= class_name %>#<%= @action %>
2
+
3
+ <%%= @greeting %>, find me in app/views/<%= @path %>
@@ -0,0 +1 @@
1
+ require "inky"
@@ -0,0 +1,47 @@
1
+ require "action_view"
2
+ require "action_view/template"
3
+ require "inky/inky_template"
4
+ require "inky/railtie"
5
+ require "rubygems"
6
+
7
+ module Inky
8
+
9
+ def self.check_version(bin)
10
+ begin
11
+ # TODO: Extract inky-cli version to an explicit constant
12
+ Gem::Dependency.new('','~> 1.0.1').match?('',`#{bin} --version`)
13
+ rescue
14
+ false
15
+ end
16
+ end
17
+
18
+ def self.discover_inky_bin
19
+ default_bin_name = 'inky'
20
+ inky_bin = default_bin_name
21
+ # Check for a global install of MJML binary
22
+ return inky_bin if check_version(default_bin_name)
23
+
24
+ # Check for a local install of MJML binary
25
+ inky_bin = File.join(`npm bin`.chomp, default_bin_name)
26
+ return inky_bin if check_version(inky_bin)
27
+
28
+ raise RuntimeError, "Couldn't find the MJML binary.. have you run $ npm install #{default_bin_name}?"
29
+ end
30
+
31
+ BIN = discover_inky_bin
32
+
33
+ class Handler
34
+ def erb_handler
35
+ @erb_handler ||= ActionView::Template.registered_template_handler(:erb)
36
+ end
37
+
38
+ def call(template)
39
+ compiled_source = erb_handler.call(template)
40
+ if template.formats.include?(:inky)
41
+ "Inky::InkyTemplate.to_html(begin;#{compiled_source};end).html_safe"
42
+ else
43
+ compiled_source
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,13 @@
1
+ require 'inky/parser'
2
+
3
+ module Inky
4
+ mattr_accessor :processing_options, :renderer
5
+ @@processing_options = {}
6
+
7
+ class InkyTemplate
8
+ def self.to_html(compiled_source)
9
+
10
+ Inky::Parser.new(compiled_source).render.html_safe
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,80 @@
1
+ module Inky
2
+ class Parser
3
+
4
+ # Create new parser
5
+ #
6
+ # @param input [String] The string to transform in html
7
+ def initialize input
8
+ file = File.open(in_tmp_file, 'w')
9
+ file.write(input)
10
+ file.close
11
+ end
12
+
13
+ # Render inky template
14
+ #
15
+ # @return [String]
16
+ def render
17
+ result = run
18
+ remove_tmp_files
19
+ result
20
+ rescue => error
21
+ ""
22
+ end
23
+
24
+ # Exec inky command
25
+ #
26
+ # @return [String] The result as string
27
+ def run
28
+ # TODO: Refactor this
29
+ command = "#{inky_bin} #{in_tmp_file} #{out_tmp_file}"
30
+ `#{command}`
31
+ file = File.open("#{out_tmp_file}/#{in_tmp_file.split('/').last}", 'r')
32
+ str = file.read
33
+ file.close
34
+ str
35
+ end
36
+
37
+ private
38
+
39
+ # Remove tmp files
40
+ #
41
+ # @return nil
42
+ def remove_tmp_files
43
+ FileUtils.rm(in_tmp_file)
44
+ FileUtils.rmdir(out_tmp_file)
45
+ nil
46
+ end
47
+
48
+ # Return tmp dir
49
+ #
50
+ # @return [String]
51
+ def tmp_dir
52
+ '/tmp'
53
+ end
54
+
55
+ # Get parser tpm file to store result
56
+ #
57
+ # @return [String]
58
+ def out_tmp_file
59
+
60
+ @_out_tmp_file ||= "#{tmp_dir}/out_#{(0...8).map { (65 + rand(26)).chr }.join}"
61
+ end
62
+
63
+ # Get parser tpm file to get result
64
+ #
65
+ # @return [String]
66
+ def in_tmp_file
67
+
68
+ @_in_tmp_file ||= "#{tmp_dir}/in_#{(0...8).map { (65 + rand(26)).chr }.join}.inky"
69
+ # puts @_in_tmp_file
70
+ return @_in_tmp_file
71
+ end
72
+
73
+ # Get inky-cli bin path
74
+ #
75
+ # @return [String]
76
+ def inky_bin
77
+ Inky::BIN
78
+ end
79
+ end
80
+ end
@@ -0,0 +1,11 @@
1
+ module Inky
2
+ class Railtie < Rails::Railtie
3
+ config.inky = Inky
4
+ config.app_generators.mailer template_engine: :inky
5
+
6
+ initializer 'inky-rails.register_template_handler' do
7
+ ActionView::Template.register_template_handler :inky, Inky::Handler.new
8
+ Mime::Type.register 'text/html', :inky
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,4 @@
1
+ module Inky
2
+ # Version number matches inky-cli version
3
+ VERSION = '1.0.1'
4
+ end
@@ -0,0 +1,16 @@
1
+ require 'test_helper'
2
+ require 'generators/inky/mailer/mailer_generator'
3
+
4
+ class GeneratorTest < Rails::Generators::TestCase
5
+ tests Inky::Generators::MailerGenerator
6
+ destination File.expand_path('../tmp', __FILE__)
7
+ setup :prepare_destination
8
+
9
+ test 'assert all views are properly created with given name' do
10
+ run_generator %w(notifier foo bar baz)
11
+
12
+ assert_file 'app/views/notifier/foo.inky'
13
+ assert_file 'app/views/notifier/bar.inky'
14
+ assert_file 'app/views/notifier/baz.inky'
15
+ end
16
+ end
@@ -0,0 +1,63 @@
1
+ require 'test_helper'
2
+
3
+ class Notifier < ActionMailer::Base
4
+ self.view_paths = File.expand_path('../views', __FILE__)
5
+
6
+ layout false
7
+
8
+ def contact(recipient, format_type)
9
+ @recipient = recipient
10
+ mail(to: @recipient, from: 'john.doe@example.com') do |format|
11
+ format.send(format_type)
12
+ end
13
+ end
14
+
15
+ def link(format_type)
16
+ mail(to: 'foo@bar.com', from: 'john.doe@example.com') do |format|
17
+ format.send(format_type)
18
+ end
19
+ end
20
+
21
+ def user(format_type)
22
+ mail(to: 'foo@bar.com', from: 'john.doe@example.com') do |format|
23
+ format.send(format_type)
24
+ end
25
+ end
26
+
27
+ def no_partial(format_type)
28
+ mail(to: 'foo@bar.com', from: 'john.doe@example.com') do |format|
29
+ format.send(format_type)
30
+ end
31
+ end
32
+
33
+ def multiple_format_contact(recipient)
34
+ @recipient = recipient
35
+ mail(to: @recipient, from: 'john.doe@example.com', template: 'contact') do |format|
36
+ format.text { render 'contact' }
37
+ format.html { render 'contact' }
38
+ end
39
+ end
40
+ end
41
+
42
+ class InkyTest < ActiveSupport::TestCase
43
+ test 'html should be sent as html' do
44
+ email = Notifier.contact('you@example.com', :inky)
45
+ assert_equal 'text/html', email.mime_type
46
+ assert_no_match(/<row>/, email.body.encoded.strip)
47
+ assert_no_match(/<columns>/, email.body.encoded.strip)
48
+ assert_match(/<table/, email.body.encoded.strip)
49
+ assert_match(/This is a number: \d\.\d/, email.body.encoded.strip)
50
+ end
51
+
52
+ test 'with partial' do
53
+ email = Notifier.user(:inky)
54
+ assert_equal 'text/html', email.mime_type
55
+ assert_match(/Hello Partial/, email.body.encoded.strip)
56
+ end
57
+
58
+ test 'without a partial' do
59
+ email = Notifier.no_partial(:inky)
60
+ assert_equal 'text/html', email.mime_type
61
+ assert_match(/Hello World/, email.body.encoded.strip)
62
+ end
63
+ end
@@ -0,0 +1,30 @@
1
+ require 'rubygems'
2
+ require 'bundler'
3
+ Bundler.setup
4
+
5
+ require 'minitest/autorun'
6
+ require 'active_support/test_case'
7
+
8
+ require 'action_mailer'
9
+ require 'rails/railtie'
10
+ require 'rails/generators'
11
+ require 'rails/generators/test_case'
12
+
13
+ # require "minitest/reporters"
14
+ # Minitest::Reporters.use!
15
+
16
+ $:.unshift File.expand_path('../../lib', __FILE__)
17
+
18
+ require 'inky'
19
+
20
+ Inky::Railtie.run_initializers
21
+
22
+ if ActiveSupport::TestCase.respond_to? :test_order=
23
+ ActiveSupport::TestCase.test_order = :sorted
24
+ end
25
+
26
+ # Avoid annoying warning from I18n.
27
+ I18n.enforce_available_locales = false
28
+
29
+ ActionMailer::Base.delivery_method = :test
30
+ ActionMailer::Base.perform_deliveries = true
metadata ADDED
@@ -0,0 +1,61 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: inky-rails
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Rafael Jegundo
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-06-17 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: Render Inky + ERb template views in Rails
14
+ email: rafael@whitesmith.co
15
+ executables: []
16
+ extensions: []
17
+ extra_rdoc_files: []
18
+ files:
19
+ - MIT-LICENSE
20
+ - README.md
21
+ - lib/generators/inky/mailer/mailer_generator.rb
22
+ - lib/generators/inky/mailer/templates/layout.inky
23
+ - lib/generators/inky/mailer/templates/view.inky
24
+ - lib/inky-rails.rb
25
+ - lib/inky.rb
26
+ - lib/inky/inky_template.rb
27
+ - lib/inky/parser.rb
28
+ - lib/inky/railtie.rb
29
+ - lib/inky/version.rb
30
+ - test/generator_test.rb
31
+ - test/inky_test.rb
32
+ - test/test_helper.rb
33
+ homepage: https://github.com/whitesmith/inky-rails
34
+ licenses:
35
+ - MIT
36
+ metadata: {}
37
+ post_install_message: "Don't forget to install Inky e.g. \n $
38
+ npm install -g inky-cli"
39
+ rdoc_options: []
40
+ require_paths:
41
+ - lib
42
+ required_ruby_version: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: '0'
47
+ required_rubygems_version: !ruby/object:Gem::Requirement
48
+ requirements:
49
+ - - ">="
50
+ - !ruby/object:Gem::Version
51
+ version: '0'
52
+ requirements: []
53
+ rubyforge_project:
54
+ rubygems_version: 2.2.2
55
+ signing_key:
56
+ specification_version: 4
57
+ summary: Inky + ERb templates
58
+ test_files:
59
+ - test/generator_test.rb
60
+ - test/inky_test.rb
61
+ - test/test_helper.rb