mjml-rails 4.6.1 → 4.7.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 0a845d39f307dd7d452b0766805154e622aecaed3bbb3b4d392ead880939dc04
4
- data.tar.gz: 13a7793222a8253ce62dd97f2a225379615515225e7f987deb23f5a93d6dbbfd
3
+ metadata.gz: 7b9582e0d35041cd78aa95808af7d2808ce467eb1b70eb511b57f39679b661af
4
+ data.tar.gz: 402a1cf82168f58d8abde20ad280473e897eb0d0489d88281c72d52e830c71c8
5
5
  SHA512:
6
- metadata.gz: f05c5580304ececa283ea79e17b61c7a281ce9b327d8aa3c73bacbdeaa8873049f3491243f03964e8fe0bf33f4c4e9ff2c0c70c2424100ae23f7d1a26d3322da
7
- data.tar.gz: 111b70710d670a442564aa877652f3711c0ad9c934e1be8edd24a6fc0011f7019c3c9aaa58abec7cfcc338b7ca5ecac2aa6c3e3bd9af30cbb68402dcfa5a3165
6
+ metadata.gz: 31edb6ed2fbfaa8e1888a97e6a07334e0551b67ab1ed66153445be516ca2f916b76e4cf0d378915d7ee3cb5082cdd307570bfc1191760bb19243472e4758b757
7
+ data.tar.gz: 85be7ae9d1be8adeac4020cfed26e9a30fa917bb7c051b88b3c9c14a1a204b9ad64d37c3a5920d72a9593fc6389fd71cad59ae0baf3b0bdc5f9cb7892c8501c6
checksums.yaml.gz.sig CHANGED
Binary file
data/README.md CHANGED
@@ -9,7 +9,7 @@
9
9
  An example template might look like:
10
10
 
11
11
  ```erb
12
- <!-- ./app/views/user_mailer/email.html.mjml -->
12
+ <!-- ./app/views/user_mailer/user_signup_confirmation.mjml -->
13
13
  <mjml>
14
14
  <mj-head>
15
15
  <mj-preview>Hello World</mj-preview>
@@ -18,7 +18,7 @@ An example template might look like:
18
18
  <mj-section>
19
19
  <mj-column>
20
20
  <mj-text>Hello World</mj-text>
21
- <%= render partial: "info" %>
21
+ <%= render partial: "info", formats: [:html] %>
22
22
  </mj-column>
23
23
  </mj-section>
24
24
  </mj-body>
@@ -1,9 +1,11 @@
1
- require "rails/generators/erb/mailer/mailer_generator"
1
+ # frozen_string_literal: true
2
+
3
+ require 'rails/generators/erb/mailer/mailer_generator'
2
4
 
3
5
  module Mjml
4
6
  module Generators
5
7
  class MailerGenerator < Erb::Generators::MailerGenerator
6
- source_root File.expand_path("../templates", __FILE__)
8
+ source_root File.expand_path('templates', __dir__)
7
9
 
8
10
  private
9
11
 
@@ -26,8 +28,8 @@ module Mjml
26
28
  def filename_with_extensions(name, file_format = format)
27
29
  # Due to MJML single-pass processing nature
28
30
  # layout files MUST have .mjml extension, but views/templates cannot
29
- is_layout_file = name.in?([:layout, "mailer"])
30
- [name, file_format, is_layout_file ? handler : view_handler].compact.join(".")
31
+ is_layout_file = name.in?([:layout, 'mailer'])
32
+ [name, file_format, is_layout_file ? handler : view_handler].compact.join('.')
31
33
  end
32
34
  end
33
35
  end
data/lib/mjml/handler.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'action_view'
2
4
  require 'action_view/template'
3
5
  require 'rails/version'
@@ -12,12 +14,7 @@ module Mjml
12
14
  # Beginning with Rails 6 template handlers get the source of the template as the second
13
15
  # parameter.
14
16
  def call(template, source = nil)
15
- compiled_source =
16
- if Rails::VERSION::MAJOR >= 6
17
- template_handler.call(template, source)
18
- else
19
- template_handler.call(template)
20
- end
17
+ compiled_source = compile_source(source, template)
21
18
 
22
19
  # Per MJML v4 syntax documentation[0] valid/render'able document MUST start with <mjml> root tag
23
20
  # If we get here and template source doesn't start with one it means
@@ -25,12 +22,22 @@ module Mjml
25
22
  # Therefore we skip MJML processing and return raw compiled source. It will be processed
26
23
  # by MJML library when top-level layout/template is rendered
27
24
  #
28
- # [0] - https://github.com/mjmlio/mjml/blob/master/doc/guide.md#mjml
29
- if compiled_source =~ /<mjml.*?>/i
25
+ # [0] - https://github.com/mjmlio/mjml/blob/master/doc/components_1.md#mjml
26
+ if /<mjml.*?>/i.match?(compiled_source)
30
27
  "Mjml::Parser.new(begin;#{compiled_source};end).render.html_safe"
31
28
  else
32
29
  compiled_source
33
30
  end
34
31
  end
32
+
33
+ private
34
+
35
+ def compile_source(source, template)
36
+ if Rails::VERSION::MAJOR >= 6
37
+ template_handler.call(template, source)
38
+ else
39
+ template_handler.call(template)
40
+ end
41
+ end
35
42
  end
36
43
  end
data/lib/mjml/parser.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Mjml
2
4
  class Parser
3
5
  class ParseError < StandardError; end
@@ -7,8 +9,9 @@ module Mjml
7
9
  # Create new parser
8
10
  #
9
11
  # @param input [String] The string to transform in html
10
- def initialize input
12
+ def initialize(input)
11
13
  raise Mjml.mjml_binary_error_string unless Mjml.valid_mjml_binary
14
+
12
15
  @input = input
13
16
  end
14
17
 
@@ -16,14 +19,15 @@ module Mjml
16
19
  #
17
20
  # @return [String]
18
21
  def render
19
- in_tmp_file = Tempfile.open(["in", ".mjml"]) do |file|
22
+ in_tmp_file = Tempfile.open(['in', '.mjml']) do |file|
20
23
  file.write(input)
21
24
  file # return tempfile from block so #unlink works later
22
25
  end
23
26
  run(in_tmp_file.path, Mjml.beautify, Mjml.minify, Mjml.validation_level)
24
- rescue
27
+ rescue StandardError
25
28
  raise if Mjml.raise_render_exception
26
- ""
29
+
30
+ ''
27
31
  ensure
28
32
  in_tmp_file.unlink
29
33
  end
@@ -31,14 +35,18 @@ module Mjml
31
35
  # Exec mjml command
32
36
  #
33
37
  # @return [String] The result as string
34
- def run(in_tmp_file, beautify=true, minify=false, validation_level="strict")
35
- Tempfile.create(["out", ".html"]) do |out_tmp_file|
36
- command = "-r #{in_tmp_file} -o #{out_tmp_file.path} --config.beautify #{beautify} --config.minify #{minify} --config.validationLevel #{validation_level}"
38
+ # rubocop:disable Style/OptionalBooleanParameter: Fixing this offense would imply a change in the public API.
39
+ def run(in_tmp_file, beautify = true, minify = false, validation_level = 'strict')
40
+ Tempfile.create(['out', '.html']) do |out_tmp_file|
41
+ command = "-r #{in_tmp_file} -o #{out_tmp_file.path} " \
42
+ "--config.beautify #{beautify} --config.minify #{minify} --config.validationLevel #{validation_level}"
37
43
  _, stderr, status = Mjml.run_mjml(command)
38
- raise ParseError.new(stderr.chomp) unless status.success?
39
- Mjml.logger.warn(stderr.chomp) unless stderr.blank?
44
+ raise ParseError, stderr.chomp unless status.success?
45
+
46
+ Mjml.logger.warn(stderr.chomp) if stderr.present?
40
47
  out_tmp_file.read
41
48
  end
42
49
  end
50
+ # rubocop:enable Style/OptionalBooleanParameter
43
51
  end
44
52
  end
data/lib/mjml/railtie.rb CHANGED
@@ -1,11 +1,13 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Mjml
2
4
  class Railtie < Rails::Railtie
3
5
  config.mjml = Mjml
4
- config.app_generators.mailer :template_engine => :mjml
6
+ config.app_generators.mailer template_engine: :mjml
5
7
 
6
- initializer "mjml-rails.register_template_handler" do
8
+ initializer 'mjml-rails.register_template_handler' do
7
9
  ActionView::Template.register_template_handler :mjml, Mjml::Handler.new
8
- Mime::Type.register_alias "text/html", :mjml
10
+ Mime::Type.register_alias 'text/html', :mjml
9
11
  end
10
12
 
11
13
  config.to_prepare do
data/lib/mjml/version.rb CHANGED
@@ -1,4 +1,6 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Mjml
2
- # Version number no longer matches MJML.io version
3
- VERSION = "4.6.1"
4
+ # Version number no longer matches MJML.io version
5
+ VERSION = '4.7.0'
4
6
  end
data/lib/mjml-rails.rb CHANGED
@@ -1 +1,5 @@
1
- require "mjml"
1
+ # rubocop:disable Naming/FileName
2
+ # frozen_string_literal: true
3
+
4
+ require 'mjml'
5
+ # rubocop:enable Naming/FileName
data/lib/mjml.rb CHANGED
@@ -1,10 +1,12 @@
1
- require "rubygems"
2
- require "open3"
1
+ # frozen_string_literal: true
3
2
 
4
- require "mjml/handler"
5
- require "mjml/parser"
3
+ require 'rubygems'
4
+ require 'open3'
6
5
 
7
- require "mjml/railtie" if defined?(Rails)
6
+ require 'mjml/handler'
7
+ require 'mjml/parser'
8
+
9
+ require 'mjml/railtie' if defined?(Rails)
8
10
 
9
11
  module Mjml
10
12
  mattr_accessor \
@@ -19,13 +21,14 @@ module Mjml
19
21
 
20
22
  mattr_writer :valid_mjml_binary
21
23
 
22
- @@template_language = :erb
23
- @@raise_render_exception = true
24
- @@mjml_binary_version_supported = "4."
25
- @@mjml_binary_error_string = "Couldn't find the MJML #{Mjml.mjml_binary_version_supported} binary.. have you run $ npm install mjml?"
26
- @@beautify = true
27
- @@minify = false
28
- @@validation_level = "strict"
24
+ self.template_language = :erb
25
+ self.raise_render_exception = true
26
+ self.mjml_binary_version_supported = '4.'
27
+ self.mjml_binary_error_string = "Couldn't find the MJML #{Mjml.mjml_binary_version_supported} binary.." \
28
+ ' have you run $ npm install mjml?'
29
+ self.beautify = true
30
+ self.minify = false
31
+ self.validation_level = 'strict'
29
32
 
30
33
  def self.check_version(bin)
31
34
  stdout, _, status = run_mjml('--version', mjml_bin: bin)
@@ -39,11 +42,11 @@ module Mjml
39
42
  end
40
43
 
41
44
  def self.valid_mjml_binary
42
- @@valid_mjml_binary ||=
43
- check_for_custom_mjml_binary ||
44
- check_for_yarn_mjml_binary ||
45
- check_for_npm_mjml_binary ||
46
- check_for_global_mjml_binary
45
+ self.valid_mjml_binary = @@valid_mjml_binary ||
46
+ check_for_custom_mjml_binary ||
47
+ check_for_yarn_mjml_binary ||
48
+ check_for_npm_mjml_binary ||
49
+ check_for_global_mjml_binary
47
50
 
48
51
  return @@valid_mjml_binary if @@valid_mjml_binary
49
52
 
@@ -52,21 +55,23 @@ module Mjml
52
55
 
53
56
  def self.check_for_custom_mjml_binary
54
57
  if const_defined?('BIN') && Mjml::BIN.present?
55
- logger.warn('Setting `Mjml::BIN` is deprecated and will be removed in a future version! Please use `Mjml.mjml_binary=` instead.')
58
+ logger.warn('Setting `Mjml::BIN` is deprecated and will be removed in a future version! ' \
59
+ 'Please use `Mjml.mjml_binary=` instead.')
56
60
  self.mjml_binary = Mjml::BIN
57
61
  remove_const 'BIN'
58
62
  end
59
63
 
60
- return unless mjml_binary.present?
64
+ return if mjml_binary.blank?
61
65
 
62
66
  return mjml_binary if check_version(mjml_binary)
63
67
 
64
- raise "MJML.mjml_binary is set to '#{mjml_binary}' but MJML-Rails could not validate that it is a valid MJML binary. Please check your configuration."
68
+ raise "MJML.mjml_binary is set to '#{mjml_binary}' but MJML-Rails could not validate that " \
69
+ 'it is a valid MJML binary. Please check your configuration.'
65
70
  end
66
71
 
67
72
  def self.check_for_yarn_mjml_binary
68
73
  yarn_bin = `which yarn`.chomp
69
- return unless yarn_bin.present?
74
+ return if yarn_bin.blank?
70
75
 
71
76
  mjml_bin = "#{yarn_bin} run mjml"
72
77
  return mjml_bin if check_version(mjml_bin)
@@ -96,7 +101,8 @@ module Mjml
96
101
  end
97
102
 
98
103
  def self.discover_mjml_bin
99
- logger.warn('`Mjml.discover_mjml_bin` is deprecated and has no effect anymore! Please use `Mjml.mjml_binary=` to set a custom MJML binary.')
104
+ logger.warn('`Mjml.discover_mjml_bin` is deprecated and has no effect anymore! ' \
105
+ 'Please use `Mjml.mjml_binary=` to set a custom MJML binary.')
100
106
  end
101
107
 
102
108
  def self.setup
@@ -108,7 +114,7 @@ module Mjml
108
114
 
109
115
  def logger
110
116
  @logger ||= Logger.new($stdout).tap do |log|
111
- log.progname = self.name
117
+ log.progname = name
112
118
  end
113
119
  end
114
120
  end
@@ -1,26 +1,28 @@
1
- require "test_helper"
2
- require "generators/mjml/mailer/mailer_generator"
1
+ # frozen_string_literal: true
2
+
3
+ require 'test_helper'
4
+ require 'generators/mjml/mailer/mailer_generator'
3
5
 
4
6
  class GeneratorTest < Rails::Generators::TestCase
5
7
  tests Mjml::Generators::MailerGenerator
6
- destination File.expand_path("../tmp", __FILE__)
8
+ destination File.expand_path('tmp', __dir__)
7
9
  setup :prepare_destination
8
10
 
9
- test "assert all views are properly created with given name" do
10
- run_generator %w(notifier foo bar baz)
11
+ test 'assert all views are properly created with given name' do
12
+ run_generator %w[notifier foo bar baz]
11
13
 
12
- assert_file "app/views/layouts/mailer.html.mjml" do |mailer|
13
- assert_match "<mjml>", mailer
14
- assert_match "<mj-body>", mailer
15
- assert_match "<%= yield %>", mailer
14
+ assert_file 'app/views/layouts/mailer.html.mjml' do |mailer|
15
+ assert_match '<mjml>', mailer
16
+ assert_match '<mj-body>', mailer
17
+ assert_match '<%= yield %>', mailer
16
18
  end
17
19
 
18
- assert_file "app/views/notifier_mailer/foo.html.erb" do |template|
19
- assert_match "<%= @greeting %>", template
20
- assert_match "app/views/notifier_mailer/foo.html.erb", template
20
+ assert_file 'app/views/notifier_mailer/foo.html.erb' do |template|
21
+ assert_match '<%= @greeting %>', template
22
+ assert_match 'app/views/notifier_mailer/foo.html.erb', template
21
23
  end
22
24
 
23
- assert_file "app/views/notifier_mailer/bar.html.erb"
24
- assert_file "app/views/notifier_mailer/baz.html.erb"
25
+ assert_file 'app/views/notifier_mailer/bar.html.erb'
26
+ assert_file 'app/views/notifier_mailer/baz.html.erb'
25
27
  end
26
28
  end
data/test/mjml_test.rb CHANGED
@@ -1,14 +1,16 @@
1
- require "test_helper"
1
+ # frozen_string_literal: true
2
+
3
+ require 'test_helper'
2
4
 
3
5
  class NotifierMailer < ActionMailer::Base
4
- self.view_paths = File.expand_path("../views", __FILE__)
6
+ self.view_paths = File.expand_path('views', __dir__)
5
7
 
6
- layout "default"
8
+ layout 'default'
7
9
 
8
10
  def inform_contact(recipient)
9
11
  @recipient = recipient
10
12
 
11
- mail(to: @recipient, from: "app@example.com") do |format|
13
+ mail(to: @recipient, from: 'app@example.com') do |format|
12
14
  format.text
13
15
  format.html
14
16
  end
@@ -17,7 +19,7 @@ class NotifierMailer < ActionMailer::Base
17
19
  def invalid_template(recipient)
18
20
  @recipient = recipient
19
21
 
20
- mail(to: @recipient, from: "app@example.com") do |format|
22
+ mail(to: @recipient, from: 'app@example.com') do |format|
21
23
  format.html
22
24
  format.text
23
25
  end
@@ -25,91 +27,90 @@ class NotifierMailer < ActionMailer::Base
25
27
  end
26
28
 
27
29
  class NoLayoutMailer < ActionMailer::Base
28
- self.view_paths = File.expand_path("../views", __FILE__)
30
+ self.view_paths = File.expand_path('views', __dir__)
29
31
 
30
32
  layout nil
31
33
 
32
34
  def inform_contact(recipient)
33
35
  @recipient = recipient
34
36
 
35
- mail(to: @recipient, from: "app@example.com") do |format|
36
- format.mjml
37
- end
37
+ mail(to: @recipient, from: 'app@example.com', &:mjml)
38
38
  end
39
39
 
40
40
  def with_owa(recipient)
41
41
  @recipient = recipient
42
42
 
43
- mail(to: @recipient, from: "app@example.com") do |format|
44
- format.mjml
45
- end
43
+ mail(to: @recipient, from: 'app@example.com', &:mjml)
46
44
  end
47
45
  end
48
46
 
49
47
  class NotifierMailerTest < ActiveSupport::TestCase
50
- test "MJML layout based multipart email is generated correctly" do
51
- email = NotifierMailer.inform_contact("user@example.com")
48
+ test 'MJML layout based multipart email is generated correctly' do
49
+ email = NotifierMailer.inform_contact('user@example.com')
52
50
 
53
- assert_equal "multipart/alternative", email.mime_type
51
+ assert_equal 'multipart/alternative', email.mime_type
54
52
 
55
53
  # To debug tests:
56
54
  # Mjml.logger.info email.mime_type
57
55
  # Mjml.logger.info email.to_s
58
56
  # Mjml.logger.info email.html_part.body
59
57
 
60
- refute email.html_part.body.match(%r{</?mj.+?>})
61
- assert email.html_part.body.match(/<body>/)
58
+ assert_not email.html_part.body.match(%r{</?mj.+?>})
59
+ assert email.html_part.body.include?('<body')
62
60
  assert email.html_part.body.match(/Hello, user@example.com!/)
63
- assert email.html_part.body.match(%r{<h2>We inform you about something</h2>})
61
+ assert email.html_part.body.include?('<h2>We inform you about something</h2>')
64
62
  assert email.html_part.body.match(%r{<a href="https://www.example.com">this link</a>})
65
- assert email.html_part.body.match(/tracking-code-123/)
63
+ assert email.html_part.body.include?('tracking-code-123')
66
64
 
67
- assert email.text_part.body.match(/We inform you about something/)
65
+ assert email.text_part.body.include?('We inform you about something')
68
66
  assert email.text_part.body.match(%r{Please visit https://www.example.com})
69
67
  end
70
68
 
71
- test "Invalid template raises error with validation level strict" do
69
+ test 'Invalid template raises error with validation level strict' do
72
70
  with_settings(validation_level: 'strict') do
73
- email = NotifierMailer.invalid_template("user@example.com")
71
+ email = NotifierMailer.invalid_template('user@example.com')
74
72
  assert_raise(ActionView::Template::Error) { email.html_part.body.to_s }
75
73
  end
76
74
  end
77
75
 
78
- test "Invalid template gets compiled with validation level soft" do
76
+ test 'Invalid template gets compiled with validation level soft' do
77
+ # suppress warning of MJML binary
78
+ Mjml.logger.stubs(:warn)
79
+
79
80
  with_settings(validation_level: 'soft') do
80
- email = NotifierMailer.invalid_template("user@example.com")
81
- assert email.text_part.body.match(/This is valid/)
82
- assert email.html_part.body.match(/This is valid/)
83
- refute email.html_part.body.match(/This is invalid/)
81
+ email = NotifierMailer.invalid_template('user@example.com')
82
+ assert email.text_part.body.include?('This is valid')
83
+ assert email.html_part.body.include?('This is valid')
84
+ assert_not email.html_part.body.include?('This is invalid')
84
85
  end
85
86
  end
86
87
  end
87
88
 
88
89
  class NotifierMailerTest < ActiveSupport::TestCase
89
- test "old mjml-rails configuration style MJML template is rendered correctly" do
90
- email = NoLayoutMailer.inform_contact("user@example.com")
90
+ test 'old mjml-rails configuration style MJML template is rendered correctly' do
91
+ email = NoLayoutMailer.inform_contact('user@example.com')
91
92
 
92
- assert_equal "text/html", email.mime_type
93
+ assert_equal 'text/html', email.mime_type
93
94
 
94
- refute email.body.match(%r{</?mj.+?>})
95
- assert email.body.match(/<body>/)
95
+ assert_not email.body.match(%r{</?mj.+?>})
96
+ assert email.body.include?('<body')
96
97
  assert email.body.match(/Welcome, user@example.com!/)
97
- assert email.body.match(%r{<h2>We inform you about something</h2>})
98
+ assert email.body.include?('<h2>We inform you about something</h2>')
98
99
  assert email.body.match(%r{<a href="https://www.example.com">this link</a>})
99
- refute email.body.match(/tracking-code-123/)
100
+ assert_not email.body.include?('tracking-code-123')
100
101
  end
101
102
 
102
- test "old mjml-rails MJML template with owa is rendered correctly" do
103
- email = NoLayoutMailer.with_owa("user@example.com")
103
+ test 'old mjml-rails MJML template with owa is rendered correctly' do
104
+ email = NoLayoutMailer.with_owa('user@example.com')
104
105
 
105
- assert_equal "text/html", email.mime_type
106
+ assert_equal 'text/html', email.mime_type
106
107
 
107
- refute email.body.match(%r{</?mj.+?>})
108
- assert email.body.match(/<body>/)
108
+ assert_not email.body.match(%r{</?mj.+?>})
109
+ assert email.body.include?('<body')
109
110
  assert email.body.match(/Welcome, user@example.com!/)
110
- assert email.body.match(%r{<h2>We inform you about something</h2>})
111
+ assert email.body.include?('<h2>We inform you about something</h2>')
111
112
  assert email.body.match(%r{<a href="https://www.example.com">this link</a>})
112
- refute email.body.match(/tracking-code-123/)
113
+ assert_not email.body.include?('tracking-code-123')
113
114
  end
114
115
  end
115
116
 
@@ -135,13 +136,16 @@ describe Mjml do
135
136
  it 'raises an error if mjml_binary is invalid' do
136
137
  Mjml.mjml_binary = 'some custom value'
137
138
  err = expect { Mjml.valid_mjml_binary }.must_raise(StandardError)
138
- expect(err.message).must_match(/MJML\.mjml_binary is set to 'some custom value' but MJML-Rails could not validate that it is a valid MJML binary/)
139
+ assert(err.message.start_with?("MJML.mjml_binary is set to 'some custom value' " \
140
+ 'but MJML-Rails could not validate that it is a valid MJML binary'))
139
141
  end
140
142
 
141
143
  it 'honors old Mjml::BIN way of setting custom binary' do
142
- Mjml::BIN = 'set by old way'
144
+ silence_warnings { Mjml::BIN = 'set by old way' }
145
+ Mjml.logger.expects(:warn).with(regexp_matches(/Setting `Mjml::BIN` is deprecated/))
143
146
  err = expect { Mjml.valid_mjml_binary }.must_raise(StandardError)
144
- expect(err.message).must_match(/MJML\.mjml_binary is set to 'set by old way' but MJML-Rails could not validate that it is a valid MJML binary/)
147
+ assert(err.message.start_with?("MJML.mjml_binary is set to 'set by old way' " \
148
+ 'but MJML-Rails could not validate that it is a valid MJML binary'))
145
149
  end
146
150
 
147
151
  it 'ignores empty Mjml::BIN' do
@@ -149,7 +153,8 @@ describe Mjml do
149
153
  Mjml.mjml_binary = 'set by mjml_binary'
150
154
 
151
155
  err = expect { Mjml.valid_mjml_binary }.must_raise(StandardError)
152
- expect(err.message).must_match(/MJML\.mjml_binary is set to 'set by mjml_binary' but MJML-Rails could not validate that it is a valid MJML binary/)
156
+ assert(err.message.start_with?("MJML.mjml_binary is set to 'set by mjml_binary' " \
157
+ 'but MJML-Rails could not validate that it is a valid MJML binary'))
153
158
  end
154
159
  end
155
160
  end
data/test/parser_test.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'test_helper'
2
4
 
3
5
  describe Mjml::Parser do
@@ -57,7 +59,7 @@ describe Mjml::Parser do
57
59
  describe '#run' do
58
60
  describe 'when shell command failed' do
59
61
  it 'raises exception' do
60
- err = expect { parser.run "/tmp/non_existent_file.mjml" }.must_raise(Mjml::Parser::ParseError)
62
+ err = expect { parser.run '/tmp/non_existent_file.mjml' }.must_raise(Mjml::Parser::ParseError)
61
63
  expect(err.message).must_include 'Command line error'
62
64
  end
63
65
  end
data/test/test_helper.rb CHANGED
@@ -1,21 +1,24 @@
1
- require "rubygems"
2
- require "bundler"
1
+ # frozen_string_literal: true
2
+
3
+ require 'rubygems'
4
+ require 'bundler'
3
5
  Bundler.setup
4
6
 
5
- require "minitest/autorun"
6
- require "active_support/test_case"
7
+ require 'minitest/autorun'
8
+ require 'active_support/test_case'
7
9
 
8
- require "action_mailer"
9
- require "rails/railtie"
10
- require "rails/generators"
11
- require "rails/generators/test_case"
10
+ require 'action_mailer'
11
+ require 'rails/railtie'
12
+ require 'rails/generators'
13
+ require 'rails/generators/test_case'
12
14
  require 'mocha/minitest'
15
+ require 'byebug'
13
16
 
14
17
  # require "minitest/reporters"
15
18
  # Minitest::Reporters.use!
16
19
 
17
- $:.unshift File.expand_path("../../lib", __FILE__)
18
- require "mjml"
20
+ $LOAD_PATH.unshift File.expand_path('../lib', __dir__)
21
+ require 'mjml'
19
22
  Mjml::Railtie.run_initializers
20
23
 
21
24
  ActiveSupport::TestCase.test_order = :sorted if ActiveSupport::TestCase.respond_to? :test_order=
@@ -27,18 +30,16 @@ ActionMailer::Base.delivery_method = :test
27
30
  ActionMailer::Base.perform_deliveries = true
28
31
 
29
32
  def with_settings(settings)
30
- original_settings =
31
- settings.each_with_object({}) do |(key, _), agg|
32
- agg[key] = Mjml.public_send(key)
33
- end
34
-
35
- settings.each do |key, value|
36
- Mjml.public_send("#{key}=", value)
37
- end
38
-
33
+ original_settings = settings.each_with_object({}) { |(key, _), agg| agg[key] = Mjml.public_send(key) }
34
+ settings.each { |key, value| Mjml.public_send("#{key}=", value) }
39
35
  yield
40
36
  ensure
41
- original_settings.each do |key, value|
42
- Mjml.public_send("#{key}=", value)
43
- end
37
+ original_settings.each { |key, value| Mjml.public_send("#{key}=", value) }
44
38
  end
39
+
40
+ # Suppress all ruby warnings of the mail gem, see:
41
+ # * https://github.com/mikel/mail/issues/1424
42
+ # * https://github.com/mikel/mail/issues/1384
43
+ # * https://github.com/mikel/mail/pull/1162
44
+ require 'warning'
45
+ Warning.ignore(//, %r{.*gems/mail.*/lib/mail/})
data.tar.gz.sig CHANGED
Binary file
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mjml-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.6.1
4
+ version: 4.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Simon Loffler
@@ -11,32 +11,130 @@ bindir: bin
11
11
  cert_chain:
12
12
  - |
13
13
  -----BEGIN CERTIFICATE-----
14
- MIIEKDCCApCgAwIBAgIBATANBgkqhkiG9w0BAQsFADAfMR0wGwYDVQQDDBR5b3Vy
15
- L0RDPWVtYWlsL0RDPWNvbTAeFw0yMDExMjIwNTA5MjJaFw0yMTExMjIwNTA5MjJa
16
- MB8xHTAbBgNVBAMMFHlvdXIvREM9ZW1haWwvREM9Y29tMIIBojANBgkqhkiG9w0B
17
- AQEFAAOCAY8AMIIBigKCAYEAmYphpc2KJNqmKAAKTE53F59mnVv2aW8r5NFDZqG0
18
- DF6V8N5rdWanaMLlo1HyU9r7D1f/h7O/LnjZemvgH6MROd19Qe64GIdIPRXC/ZxM
19
- cTBNC7GMoZf9LomBmg8sXnoL0Z2enUP6BV716I00EecxrEb8drtvZlRwjUgRcZrv
20
- iEaanYYp1Sw3+koyOsof/xYb3Pn2TAh9UE58lbVDpf88zc74ij3Vs3+LW/k+jZzh
21
- pzo7qq47XeVNGWtVDGm3dk8QLrIyQdk28B2ZRJ+HeuLEgx7ASDYFVZc05QlAjehS
22
- 4k37CIgF0ODDnscoSNNb6toFzaiD/kU9+ManRj871qOAMDlcX6cM4Wl08xfXZsxh
23
- VgmIv7vFoSkBDw6t3xrHGD1HiYYQl2tFQsS9D/X9I+1ArChtUTSxEyN6VGP1YVd6
24
- jsf4A/eMNRO6+udEQjYHontemi1xFeeyb6PDbP14oLMOls73fKvGZ3eW5uO3qCOb
25
- tKhPFou/w1GgU3vR3O26Q3EZAgMBAAGjbzBtMAkGA1UdEwQCMAAwCwYDVR0PBAQD
26
- AgSwMB0GA1UdDgQWBBTx6I3ZLm1G7VCtTJWWSKR2qv6x7TAZBgNVHREEEjAQgQ55
27
- b3VyQGVtYWlsLmNvbTAZBgNVHRIEEjAQgQ55b3VyQGVtYWlsLmNvbTANBgkqhkiG
28
- 9w0BAQsFAAOCAYEAKCpNu5+MmYNrb+oOws9m8mghO4KDO53EQsfHtRcpsBxzwzV3
29
- MLO4el5fMiAiv2PrULEWVyEoe3k65bEiSEQP7m7w02B02OGugXNzwbetG56gogFy
30
- aJ4VJ95aiPEwDmGORLg7RmZcL/07ikDfb96ebPn3v2REYN2lWrqu4fT1MdTmA+hZ
31
- vhfqJeSuWM5wNsWxA66SgbQe8BMHcsqV1CTG+Ir8FIAHzfa+c7CNke/28htRKYJV
32
- 6+lk55Ueov5TjjgLTUvjdqbAEtyCZpgxe2e0o3xqKh5d5YjWVQ4mSNvBsqK7UXOx
33
- MGsePVBV9lnSFEJkGB3iOvavQSVUvqybF+yk6DrJR9iZtKCvAqd96PjkcFoM19dG
34
- 5ofv88TRZwXM9lWn4UKuekSSF1ElH3UBVDbH4zEHaOzrOvgfnZw3VteDigwfmmwF
35
- lsAqKbu4nrHhtGhkwdYbflf2URJTUxXGptrnPYV7okmEg4rsykK3RAsZ6kMNdKmx
36
- DcQ7RSt1TU5eck6c
14
+ MIIEPDCCAqSgAwIBAgIBATANBgkqhkiG9w0BAQsFADAkMSIwIAYDVQQDDBlzaWdo
15
+ bW9uL0RDPXNpZ2htb24vREM9Y29tMB4XDTIxMTIxODA1MDcyM1oXDTIyMTIxODA1
16
+ MDcyM1owJDEiMCAGA1UEAwwZc2lnaG1vbi9EQz1zaWdobW9uL0RDPWNvbTCCAaIw
17
+ DQYJKoZIhvcNAQEBBQADggGPADCCAYoCggGBALvTbM9xGlGQ9pByLEAJjAqc6U76
18
+ 64uCOSIkgIFbC4iQdU5vzB/w4Y+mjgkH4oMsuW2NQfFBV+xI3jxQA0dN4qMgHooB
19
+ AWT/CSk0AAqTY1qCfCSASHLUWb5ZxURvsHmlXX/HCLX9bPcaYB0nQ+VT/u0lCicZ
20
+ beXMczHsNAj8f3ZJWDR9mw5OYc6cdGHM7Se3sqrmEsMYL9s8d08tChDcllxKV7cE
21
+ r2zb0oPrRFoYpakOIz1ViCl4KqBpQsDqXbwEw1kDCkKMXGHCsmDKML55kXsVVu4Q
22
+ 9vqGvtEuvseWsDpKb6Psy4nJoktswhotUf21dNVM9k8ufXNaWvZed+cYnBFPLdQV
23
+ daaEqh6hIC/yUP98D5u+xmTYLRQQEsjhkbdfoLmB8UOwrsEZu79TXN6Iq4MZqmBe
24
+ qkCTlXOMaO/EbWVRRvs64iibC/boVVlXu6RZCVNyzXEvYxg/zyl0zjS8KPR8Vf4f
25
+ RKOUVKJCcL/nW4VZ1mvmJtiXI3eARaJdrBEjjQIDAQABo3kwdzAJBgNVHRMEAjAA
26
+ MAsGA1UdDwQEAwIEsDAdBgNVHQ4EFgQUC9Ln2Rotb61VZFq2rxBPP7sJIiUwHgYD
27
+ VR0RBBcwFYETc2lnaG1vbkBzaWdobW9uLmNvbTAeBgNVHRIEFzAVgRNzaWdobW9u
28
+ QHNpZ2htb24uY29tMA0GCSqGSIb3DQEBCwUAA4IBgQBN7i1ChHKDNa5ceCXUXdJ/
29
+ ZQnVQTx2KMvWwZ6qpkIWFbzwwL5w/xQdhQbLMjuaie5X1ZYOB9753ipw3tvl7iJz
30
+ vHEdTcOWAzMzHytySVcSa2DhanDopC+hrO5N+GoQ+5X9CN+xKG1Png4ho4FsuUtI
31
+ fESG8Kb48iNlpLGbfcM8Nqm/mYk/Xwqh3aSVb2E1NVUNr3QW84xB/xmzy2d9qNBm
32
+ 0GecfnBmH+ARmR9Qk9H7YjtnhQv1W2wOBiz1k6GeO8wMLKRRHVI2TGcPR8AqhQGd
33
+ ejWL8tjMzIw5ggxro3WDklV1hn0iFSeWXNWd9tN40PjLYZqZ3krQ2wWgcgw/9eC9
34
+ yVr+12iQ7XbbPqlveO/FhP4gLa8e2q1TgWjYAXIaM61em83Dlm/3p75ch0YCB3X5
35
+ R9NsaxhBfawJEJcYoPZflGkLjJU8pjSuvIW5+rNgAiqY8D37hTtZMu/n2Fz8Qp24
36
+ 7EZetZmcvBzARf8vQSJjga3y0Bftk8u7LmblOEWddzE=
37
37
  -----END CERTIFICATE-----
38
- date: 2020-12-19 00:00:00.000000000 Z
39
- dependencies: []
38
+ date: 2021-12-18 00:00:00.000000000 Z
39
+ dependencies:
40
+ - !ruby/object:Gem::Dependency
41
+ name: byebug
42
+ requirement: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: '0'
47
+ type: :development
48
+ prerelease: false
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ - !ruby/object:Gem::Dependency
55
+ name: mocha
56
+ requirement: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - '='
59
+ - !ruby/object:Gem::Version
60
+ version: 1.4.0
61
+ type: :development
62
+ prerelease: false
63
+ version_requirements: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - '='
66
+ - !ruby/object:Gem::Version
67
+ version: 1.4.0
68
+ - !ruby/object:Gem::Dependency
69
+ name: rails
70
+ requirement: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ version: '0'
75
+ type: :development
76
+ prerelease: false
77
+ version_requirements: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - ">="
80
+ - !ruby/object:Gem::Version
81
+ version: '0'
82
+ - !ruby/object:Gem::Dependency
83
+ name: rubocop
84
+ requirement: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - "~>"
87
+ - !ruby/object:Gem::Version
88
+ version: 1.23.0
89
+ type: :development
90
+ prerelease: false
91
+ version_requirements: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - "~>"
94
+ - !ruby/object:Gem::Version
95
+ version: 1.23.0
96
+ - !ruby/object:Gem::Dependency
97
+ name: rubocop-performance
98
+ requirement: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - "~>"
101
+ - !ruby/object:Gem::Version
102
+ version: 1.12.0
103
+ type: :development
104
+ prerelease: false
105
+ version_requirements: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - "~>"
108
+ - !ruby/object:Gem::Version
109
+ version: 1.12.0
110
+ - !ruby/object:Gem::Dependency
111
+ name: rubocop-rails
112
+ requirement: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - "~>"
115
+ - !ruby/object:Gem::Version
116
+ version: 2.12.4
117
+ type: :development
118
+ prerelease: false
119
+ version_requirements: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - "~>"
122
+ - !ruby/object:Gem::Version
123
+ version: 2.12.4
124
+ - !ruby/object:Gem::Dependency
125
+ name: warning
126
+ requirement: !ruby/object:Gem::Requirement
127
+ requirements:
128
+ - - '='
129
+ - !ruby/object:Gem::Version
130
+ version: 1.2.1
131
+ type: :development
132
+ prerelease: false
133
+ version_requirements: !ruby/object:Gem::Requirement
134
+ requirements:
135
+ - - '='
136
+ - !ruby/object:Gem::Version
137
+ version: 1.2.1
40
138
  description: Render MJML + ERb template views in Rails
41
139
  email: sighmon@sighmon.com
42
140
  executables: []
@@ -70,14 +168,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
70
168
  requirements:
71
169
  - - ">="
72
170
  - !ruby/object:Gem::Version
73
- version: '0'
171
+ version: '2.5'
74
172
  required_rubygems_version: !ruby/object:Gem::Requirement
75
173
  requirements:
76
174
  - - ">="
77
175
  - !ruby/object:Gem::Version
78
176
  version: '0'
79
177
  requirements: []
80
- rubygems_version: 3.1.4
178
+ rubygems_version: 3.1.6
81
179
  signing_key:
82
180
  specification_version: 4
83
181
  summary: MJML + ERb templates
metadata.gz.sig CHANGED
Binary file