mjml-rails 4.9.0 → 4.10.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 63fb17f29c1ab7539b3b53470787d35246e9536ee960a1493c02806c8119de75
4
- data.tar.gz: 50fd2491ce1bdef74e0eaf080687ef7e5ce5c23a423f8748eba62e27dcc3dfae
3
+ metadata.gz: 321f6e1eaed15dffa0b3c65283a095a92ac80cae3b3d3df4f395d446fbc4e490
4
+ data.tar.gz: 96cce85167d65a6c20cc62ad3d5690ed7e4c166af37311190a0729f33b6a315d
5
5
  SHA512:
6
- metadata.gz: 9cb24065a5430452f98fffbcc54c81da74dfb97c91ba85f64d4f16ceb8fbd302bb0483bc2705ce03027a22ce026f8f852d0a3274b0905c53f1ce94d485c6fab7
7
- data.tar.gz: 91ffeea703562d051c68dbabaad228efd2f6b07daa4cb750625727332363f95a184b42b500501c23e90a6714ca48eb6e3d63fbd7c90f58cf93ec8eaf4c2fb479
6
+ metadata.gz: fc6708c231290dea0a14a04c03d977f58dd34c5d64116c7aba01601191ebbda08642cf0039bc2ab060b7174a5e8f5fa728dae2da14bceeaa3351f8bb4073b721
7
+ data.tar.gz: 6f32e5c076fac3d45c69c2e8dfcc6880ef8d73dbf32e1c87dfb51442f466b90917d9591c08fa5bbfd7f748845d2672b35befa3ea8210c6edec104f56398dd5b5
checksums.yaml.gz.sig CHANGED
Binary file
data/README.md CHANGED
@@ -54,6 +54,8 @@ end
54
54
 
55
55
  ## Installation
56
56
 
57
+ ### Using MJML NPM package
58
+
57
59
  Add it to your Gemfile.
58
60
 
59
61
  ```ruby
@@ -83,6 +85,34 @@ MJML-Rails falls back to a global installation of MJML but it is strongly recomm
83
85
 
84
86
  You'll need at least Node.js version 6 for MJML to function properly.
85
87
 
88
+ ### Using MRML with included binaries
89
+
90
+ If for some reason you can't or don't want to run JS code in your production environment, you can use [MRML](https://github.com/hardpixel/mrml-ruby). It ships with already compiled binaries for Rust implementation of MJML so it has no external dependencies.
91
+
92
+ Add `mjml-rails` and `mrml` to your Gemfile.
93
+
94
+ ```ruby
95
+ gem 'mjml-rails'
96
+ gem 'mrml'
97
+ ```
98
+
99
+ Run the following command to install it:
100
+
101
+ ```console
102
+ bundle install
103
+ ```
104
+
105
+ Set `use_mrml` option to `true` in your initializer:
106
+
107
+ ```ruby
108
+ # config/initializers/mjml.rb
109
+ Mjml.setup do |config|
110
+ config.use_mrml = true
111
+ end
112
+ ```
113
+
114
+ **Note**: MRML does not fully support all MJML functionalities, see [Missing implementations](https://github.com/jdrouet/mrml#missing-implementations)
115
+
86
116
  ## Configuration
87
117
 
88
118
  MJML-Rails has the following settings with defaults:
@@ -115,10 +145,12 @@ MJML-Rails has the following settings with defaults:
115
145
 
116
146
  This can be used to specify the path to a custom MJML binary if it is not detected automatically (shouldn't be needed).
117
147
 
118
- - `mjml_binary_version_support: "4."`
148
+ - `mjml_binary_version_supported: "4."`
119
149
 
120
150
  MJML-Rails checks the version of the MJML binary and fails if it does not start with this version, e.g. if an old version is installed by accident.
121
151
 
152
+ - `use_mrml: false`
153
+ Enabling this will allow you to use Rust implementation of MJML via the `mrml` gem. It comes with prebuilt binaries instead of having to install MJML along with Node. When enabled the options `mjml_binary_version_supported`, `mjml_binary`, `minify`, `beautify` and `validation_level` are ignored.
122
154
 
123
155
  ```ruby
124
156
  # config/initializers/mjml.rb
@@ -136,6 +168,9 @@ Mjml.setup do |config|
136
168
  # Render MJML templates with errors
137
169
  config.validation_level = "soft"
138
170
 
171
+ # Use MRML instead of MJML, false by default
172
+ config.use_mrml = false
173
+
139
174
  # Use custom MJML binary with custom version
140
175
  config.mjml_binary = "/path/to/custom/mjml"
141
176
  config.mjml_binary_version_supported = "3.3.5"
data/lib/mjml/handler.rb CHANGED
@@ -16,6 +16,7 @@ module Mjml
16
16
  def call(template, source = nil)
17
17
  compiled_source = compile_source(source, template)
18
18
 
19
+ parser_class = Mjml.use_mrml ? 'MrmlParser' : 'Parser'
19
20
  # Per MJML v4 syntax documentation[0] valid/render'able document MUST start with <mjml> root tag
20
21
  # If we get here and template source doesn't start with one it means
21
22
  # that we are rendering partial named according to legacy naming convention (partials ending with '.mjml')
@@ -24,7 +25,7 @@ module Mjml
24
25
  #
25
26
  # [0] - https://github.com/mjmlio/mjml/blob/master/doc/components_1.md#mjml
26
27
  if /<mjml.*?>/i.match?(compiled_source)
27
- "Mjml::Parser.new(begin;#{compiled_source};end).render.html_safe"
28
+ "Mjml::#{parser_class}.new(begin;#{compiled_source};end).render.html_safe"
28
29
  else
29
30
  compiled_source
30
31
  end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Mjml
4
+ class MrmlParser
5
+ attr_reader :input
6
+
7
+ # Create new parser
8
+ #
9
+ # @param input [String] The string to transform in html
10
+ def initialize(input)
11
+ @input = input
12
+ end
13
+
14
+ # Render mjml template
15
+ #
16
+ # @return [String]
17
+ def render
18
+ MRML.to_html(input)
19
+ rescue NameError
20
+ Mjml.logger.fatal('MRML is not installed. Please add `gem "mrml"` to your Gemfile.')
21
+ raise
22
+ rescue StandardError
23
+ raise if Mjml.raise_render_exception
24
+
25
+ ''
26
+ end
27
+ end
28
+ end
data/lib/mjml/version.rb CHANGED
@@ -2,5 +2,5 @@
2
2
 
3
3
  module Mjml
4
4
  # Version number no longer matches MJML.io version
5
- VERSION = '4.9.0'
5
+ VERSION = '4.10.1'
6
6
  end
data/lib/mjml.rb CHANGED
@@ -5,7 +5,7 @@ require 'open3'
5
5
 
6
6
  require 'mjml/handler'
7
7
  require 'mjml/parser'
8
-
8
+ require 'mjml/mrml_parser'
9
9
  require 'mjml/railtie' if defined?(Rails)
10
10
 
11
11
  module Mjml
@@ -17,7 +17,8 @@ module Mjml
17
17
  :mjml_binary_version_supported,
18
18
  :raise_render_exception,
19
19
  :template_language,
20
- :validation_level
20
+ :validation_level,
21
+ :use_mrml
21
22
 
22
23
  mattr_writer :valid_mjml_binary
23
24
 
@@ -29,6 +30,7 @@ module Mjml
29
30
  self.beautify = true
30
31
  self.minify = false
31
32
  self.validation_level = 'strict'
33
+ self.use_mrml = false
32
34
 
33
35
  def self.check_version(bin)
34
36
  stdout, _, status = run_mjml('--version', mjml_bin: bin)
@@ -46,7 +48,8 @@ module Mjml
46
48
  check_for_custom_mjml_binary ||
47
49
  check_for_yarn_mjml_binary ||
48
50
  check_for_npm_mjml_binary ||
49
- check_for_global_mjml_binary
51
+ check_for_global_mjml_binary ||
52
+ check_for_mrml_binary
50
53
 
51
54
  return @@valid_mjml_binary if @@valid_mjml_binary
52
55
 
@@ -100,6 +103,13 @@ module Mjml
100
103
  return mjml_bin if mjml_bin.present? && check_version(mjml_bin)
101
104
  end
102
105
 
106
+ def self.check_for_mrml_binary
107
+ MRML.present?
108
+ rescue NameError
109
+ Mjml.mjml_binary_error_string = 'Couldn\'t find MRML - did you add \'mrml\' to your Gemfile?'
110
+ false
111
+ end
112
+
103
113
  def self.discover_mjml_bin
104
114
  logger.warn('`Mjml.discover_mjml_bin` is deprecated and has no effect anymore! ' \
105
115
  'Please use `Mjml.mjml_binary=` to set a custom MJML binary.')
data/test/mjml_test.rb CHANGED
@@ -119,11 +119,13 @@ describe Mjml do
119
119
  before do
120
120
  Mjml.mjml_binary = nil
121
121
  Mjml.valid_mjml_binary = nil
122
+ Mjml.use_mrml = nil
122
123
  end
123
124
 
124
125
  after do
125
126
  Mjml.mjml_binary = nil
126
127
  Mjml.valid_mjml_binary = nil
128
+ Mjml.use_mrml = nil
127
129
  end
128
130
 
129
131
  it 'can be set to a custom value with mjml_binary if version is correct' do
@@ -156,5 +158,19 @@ describe Mjml do
156
158
  assert(err.message.start_with?("MJML.mjml_binary is set to 'set by mjml_binary' " \
157
159
  'but MJML-Rails could not validate that it is a valid MJML binary'))
158
160
  end
161
+
162
+ it 'can use MRML and check for a valid binary' do
163
+ Mjml.use_mrml = true
164
+ Mjml.stubs(:check_for_custom_mjml_binary).returns(false)
165
+ Mjml.stubs(:check_for_yarn_mjml_binary).returns(false)
166
+ Mjml.stubs(:check_for_npm_mjml_binary).returns(false)
167
+ Mjml.stubs(:check_for_global_mjml_binary).returns(false)
168
+ expect(Mjml.valid_mjml_binary).must_equal(true)
169
+
170
+ Mjml.valid_mjml_binary = nil
171
+ MRML.stubs(:present?).raises(NameError)
172
+ assert_nil(Mjml.valid_mjml_binary)
173
+ expect(Mjml.mjml_binary_error_string).must_equal 'Couldn\'t find MRML - did you add \'mrml\' to your Gemfile?'
174
+ end
159
175
  end
160
176
  end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'test_helper'
4
+
5
+ describe Mjml::MrmlParser do
6
+ let(:parser) { Mjml::MrmlParser.new(input) }
7
+
8
+ describe '#render' do
9
+ describe 'when input is valid' do
10
+ let(:input) { '<mjml><mj-body><mj-text>Hello World</mj-text></mj-body></mjml>' }
11
+
12
+ it 'returns html' do
13
+ expect(parser.render).must_include 'Hello World</div>'
14
+ end
15
+ end
16
+
17
+ describe 'when exception is raised' do
18
+ let(:input) { '<mjml><body><mj-text>Hello World</mj-text></body></mjml>' }
19
+
20
+ it 'raises exception with render exception enabled' do
21
+ with_settings(raise_render_exception: true) do
22
+ expect { parser.render }.must_raise(MRML::Error)
23
+ end
24
+ end
25
+
26
+ it 'returns empty string with exception raising disabled' do
27
+ with_settings(raise_render_exception: false) do
28
+ expect(parser.render).must_equal ''
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
data/test/test_helper.rb CHANGED
@@ -5,6 +5,7 @@ require 'bundler'
5
5
  Bundler.setup
6
6
 
7
7
  require 'minitest/autorun'
8
+ require 'active_support'
8
9
  require 'active_support/test_case'
9
10
 
10
11
  require 'action_mailer'
@@ -13,6 +14,7 @@ require 'rails/generators'
13
14
  require 'rails/generators/test_case'
14
15
  require 'mocha/minitest'
15
16
  require 'byebug'
17
+ require 'mrml'
16
18
 
17
19
  # require "minitest/reporters"
18
20
  # Minitest::Reporters.use!
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.9.0
4
+ version: 4.10.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Simon Loffler
@@ -36,7 +36,7 @@ cert_chain:
36
36
  RhdbGYd5Hku1QRVeQ+tN2OYG1/vZeRTqZ4MGLdl6r4iO5XGtWWoR2alg8kKc6yLx
37
37
  P5J+9tLKId50fAv4voQg//wRwePPNiWIXsLUa1LPYWTAznKTvi3dAQ==
38
38
  -----END CERTIFICATE-----
39
- date: 2023-05-12 00:00:00.000000000 Z
39
+ date: 2024-02-01 00:00:00.000000000 Z
40
40
  dependencies:
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: byebug
@@ -58,14 +58,28 @@ dependencies:
58
58
  requirements:
59
59
  - - '='
60
60
  - !ruby/object:Gem::Version
61
- version: 1.4.0
61
+ version: 2.1.0
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - '='
67
67
  - !ruby/object:Gem::Version
68
- version: 1.4.0
68
+ version: 2.1.0
69
+ - !ruby/object:Gem::Dependency
70
+ name: mrml
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: 1.4.2
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: 1.4.2
69
83
  - !ruby/object:Gem::Dependency
70
84
  name: rails
71
85
  requirement: !ruby/object:Gem::Requirement
@@ -150,11 +164,13 @@ files:
150
164
  - lib/mjml-rails.rb
151
165
  - lib/mjml.rb
152
166
  - lib/mjml/handler.rb
167
+ - lib/mjml/mrml_parser.rb
153
168
  - lib/mjml/parser.rb
154
169
  - lib/mjml/railtie.rb
155
170
  - lib/mjml/version.rb
156
171
  - test/generator_test.rb
157
172
  - test/mjml_test.rb
173
+ - test/mrml_parser_test.rb
158
174
  - test/parser_test.rb
159
175
  - test/test_helper.rb
160
176
  homepage: https://github.com/sighmon/mjml-rails
@@ -176,12 +192,13 @@ required_rubygems_version: !ruby/object:Gem::Requirement
176
192
  - !ruby/object:Gem::Version
177
193
  version: '0'
178
194
  requirements: []
179
- rubygems_version: 3.4.10
195
+ rubygems_version: 3.5.3
180
196
  signing_key:
181
197
  specification_version: 4
182
198
  summary: MJML + ERb templates
183
199
  test_files:
184
200
  - test/generator_test.rb
185
201
  - test/mjml_test.rb
202
+ - test/mrml_parser_test.rb
186
203
  - test/parser_test.rb
187
204
  - test/test_helper.rb
metadata.gz.sig CHANGED
Binary file