maily 0.5.0 → 0.6.0
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 +4 -4
- data/.travis.yml +6 -9
- data/Appraisals +4 -8
- data/README.md +26 -11
- data/app/assets/javascripts/maily/application.js +0 -2
- data/app/assets/stylesheets/maily/application.scss +13 -7
- data/app/assets/stylesheets/maily/icons.css +5 -5
- data/app/assets/stylesheets/maily/normalize.css +251 -210
- data/app/controllers/maily/application_controller.rb +2 -2
- data/app/controllers/maily/emails_controller.rb +9 -5
- data/app/helpers/maily/emails_helper.rb +4 -0
- data/app/views/layouts/maily/application.html.erb +5 -4
- data/app/views/maily/emails/index.html.erb +2 -1
- data/app/views/maily/emails/show.html.erb +8 -2
- data/app/views/maily/shared/_footer.html.erb +1 -1
- data/app/views/maily/shared/_sidebar.html.erb +1 -1
- data/gemfiles/{rails_3.2.gemfile → rails_5.1.gemfile} +1 -1
- data/lib/generators/templates/initializer.rb +6 -0
- data/lib/maily.rb +8 -5
- data/lib/maily/email.rb +16 -4
- data/lib/maily/version.rb +1 -1
- data/maily.gemspec +1 -1
- data/spec/controllers_spec.rb +2 -1
- data/spec/dummy/lib/maily_hooks.rb +5 -3
- data/spec/email_spec.rb +12 -1
- metadata +6 -9
- data/app/assets/images/maily/.gitkeep +0 -0
- data/app/assets/javascripts/maily/html5shiv.js +0 -8
- data/gemfiles/rails_4.1.gemfile +0 -7
@@ -1,13 +1,13 @@
|
|
1
1
|
module Maily
|
2
2
|
class ApplicationController < Maily.base_controller.constantize
|
3
|
-
|
3
|
+
before_action :maily_enabled?, :http_authorization
|
4
4
|
|
5
5
|
layout 'maily/application'
|
6
6
|
|
7
7
|
private
|
8
8
|
|
9
9
|
def maily_enabled?
|
10
|
-
Maily.enabled ||
|
10
|
+
Maily.enabled || head(404, message: "Maily disabled")
|
11
11
|
end
|
12
12
|
|
13
13
|
def http_authorization
|
@@ -1,14 +1,18 @@
|
|
1
1
|
module Maily
|
2
2
|
class EmailsController < ApplicationController
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
3
|
+
before_action :allowed_action?, only: [:edit, :update, :deliver]
|
4
|
+
before_action :load_mailers, only: [:index, :show, :edit]
|
5
|
+
before_action :load_mailer_and_email, except: [:index]
|
6
|
+
around_action :perform_with_locale, only: [:show, :raw, :deliver]
|
7
7
|
|
8
8
|
def index
|
9
9
|
end
|
10
10
|
|
11
11
|
def show
|
12
|
+
if !@maily_email.correct_number_of_arguments?
|
13
|
+
alert = "#{@maily_email.required_arguments.size} arguments needed for #{@maily_email.name} email"
|
14
|
+
redirect_to(root_path, alert: alert)
|
15
|
+
end
|
12
16
|
end
|
13
17
|
|
14
18
|
def raw
|
@@ -47,7 +51,7 @@ module Maily
|
|
47
51
|
private
|
48
52
|
|
49
53
|
def allowed_action?
|
50
|
-
Maily.allowed_action?(action_name) ||
|
54
|
+
Maily.allowed_action?(action_name) || redirect_to(root_path, alert: "Maily: action #{action_name} not allowed!")
|
51
55
|
end
|
52
56
|
|
53
57
|
def load_mailers
|
@@ -5,16 +5,17 @@
|
|
5
5
|
<%= stylesheet_link_tag "maily/application", :media => "all" %>
|
6
6
|
<%= javascript_include_tag "maily/application" %>
|
7
7
|
<%= csrf_meta_tags %>
|
8
|
-
<!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries -->
|
9
|
-
<!--[if lt IE 9]>
|
10
|
-
<script src="/assets/javascripts/html5shiv.js"></script>
|
11
|
-
<![endif]-->
|
12
8
|
</head>
|
13
9
|
<body>
|
14
10
|
<%= render 'maily/shared/header' %>
|
15
11
|
|
16
12
|
<div class="wrap_content clearfix">
|
17
13
|
<%= render 'maily/shared/sidebar' %>
|
14
|
+
|
15
|
+
<% if flash[:alert].present? %>
|
16
|
+
<p class="alert"><%= flash[:alert] %></p>
|
17
|
+
<% end %>
|
18
|
+
|
18
19
|
<%= yield %>
|
19
20
|
</div>
|
20
21
|
|
@@ -1,4 +1,10 @@
|
|
1
1
|
<div class="content">
|
2
|
+
<% if @maily_email.description %>
|
3
|
+
<div>
|
4
|
+
<b>Description </b><%= @maily_email.description %>
|
5
|
+
</div><br>
|
6
|
+
<% end %>
|
7
|
+
|
2
8
|
<ul class="maily_action_bar">
|
3
9
|
<li>
|
4
10
|
<em class="icon-maily-pencil"></em>
|
@@ -10,7 +16,7 @@
|
|
10
16
|
<ul>
|
11
17
|
<li>
|
12
18
|
<em class="icon-maily-earth"></em>
|
13
|
-
Languages
|
19
|
+
Languages</li>
|
14
20
|
<% Maily.available_locales.each do |locale| %>
|
15
21
|
<li><%= link_to locale.upcase, url_for(params.merge(locale: locale)) %></li>
|
16
22
|
<% end %>
|
@@ -22,7 +28,7 @@
|
|
22
28
|
<li>
|
23
29
|
<%= form_tag(deliver_maily_email_path(mailer: params[:mailer], email: params[:email], locale: params[:locale]), method: :post, class: 'maily_send') do %>
|
24
30
|
<ul>
|
25
|
-
<li>Send to
|
31
|
+
<li>Send to</li>
|
26
32
|
<li><%= email_field_tag :to, nil, class: 'maily_textfield', placeholder: "Enter email", required: true %></li>
|
27
33
|
<li><%= submit_tag 'Send', class: 'maily_button' %></li>
|
28
34
|
</ul>
|
@@ -1,3 +1,3 @@
|
|
1
1
|
<footer class="footer">
|
2
|
-
<%= link_to
|
2
|
+
<p>Powered by <%= link_to("Maily v#{Maily::VERSION}", 'https://github.com/markets/maily', target: '_blank') %></p>
|
3
3
|
</footer>
|
@@ -1,7 +1,7 @@
|
|
1
1
|
<aside class="sidebar">
|
2
2
|
<% @mailers.each do |mailer| %>
|
3
3
|
<section class="nav_list">
|
4
|
-
<h3 class="title nav_title"><%= mailer.name.humanize %></h3>
|
4
|
+
<h3 class="title nav_title"><%= "#{mailer.name.humanize} (#{mailer.emails.length})" %></h3>
|
5
5
|
<ul>
|
6
6
|
<% mailer.emails.each do |email| %>
|
7
7
|
<li><%= link_to email.name.humanize, maily_email_path(mailer: mailer.name, email: email.name), class: sidebar_class(mailer, email) %></li>
|
@@ -14,6 +14,12 @@ Maily.setup do |config|
|
|
14
14
|
# Run maily under different controller ('ActionController::Base' by default)
|
15
15
|
# config.base_controller = '::AdminController'
|
16
16
|
|
17
|
+
# Configure hooks path
|
18
|
+
# config.hooks_path = 'lib/maily_hooks.rb'
|
19
|
+
|
17
20
|
# Http basic authentication (nil by default)
|
18
21
|
# config.http_authorization = { username: 'admin', password: 'secret' }
|
22
|
+
|
23
|
+
# Customize welcome message
|
24
|
+
# config.welcome_message = "Welcome to our email testing platform. If you have any problem, please contact support team at support@example.com."
|
19
25
|
end
|
data/lib/maily.rb
CHANGED
@@ -6,7 +6,7 @@ require 'maily/email'
|
|
6
6
|
module Maily
|
7
7
|
class << self
|
8
8
|
attr_accessor :enabled, :allow_edition, :allow_delivery, :available_locales,
|
9
|
-
:base_controller, :http_authorization
|
9
|
+
:base_controller, :http_authorization, :hooks_path, :welcome_message
|
10
10
|
|
11
11
|
def init!
|
12
12
|
self.enabled = Rails.env.production? ? false : true
|
@@ -15,18 +15,21 @@ module Maily
|
|
15
15
|
self.available_locales = I18n.available_locales
|
16
16
|
self.base_controller = 'ActionController::Base'
|
17
17
|
self.http_authorization = nil
|
18
|
+
self.hooks_path = "lib/maily_hooks.rb"
|
19
|
+
self.welcome_message = "Use the menu on the left hand side of the screen to navigate through the different email templates."
|
18
20
|
end
|
19
21
|
|
20
22
|
def load_emails_and_hooks
|
21
23
|
# Load emails from file system
|
22
24
|
Dir[Rails.root + 'app/mailers/*.rb'].each do |mailer|
|
23
|
-
|
24
|
-
|
25
|
-
|
25
|
+
klass_name = File.basename(mailer, '.rb')
|
26
|
+
klass = klass_name.camelize.constantize
|
27
|
+
methods = klass.send(:public_instance_methods, false)
|
28
|
+
Maily::Mailer.new(klass_name, methods)
|
26
29
|
end
|
27
30
|
|
28
31
|
# Load hooks
|
29
|
-
hooks_file_path =
|
32
|
+
hooks_file_path = File.join(Rails.root, hooks_path)
|
30
33
|
require hooks_file_path if File.exist?(hooks_file_path)
|
31
34
|
end
|
32
35
|
|
data/lib/maily/email.rb
CHANGED
@@ -1,12 +1,13 @@
|
|
1
1
|
module Maily
|
2
2
|
class Email
|
3
|
-
attr_accessor :name, :mailer, :arguments, :template_path
|
3
|
+
attr_accessor :name, :mailer, :arguments, :template_path, :description
|
4
4
|
|
5
5
|
def initialize(name, mailer)
|
6
6
|
self.name = name.to_s
|
7
7
|
self.mailer = mailer
|
8
8
|
self.arguments = nil
|
9
9
|
self.template_path = mailer
|
10
|
+
self.description = nil
|
10
11
|
end
|
11
12
|
|
12
13
|
def parameters
|
@@ -21,11 +22,16 @@ module Maily
|
|
21
22
|
parameters.map(&:last)
|
22
23
|
end
|
23
24
|
|
25
|
+
def correct_number_of_arguments?
|
26
|
+
required_arguments.size == arguments.size
|
27
|
+
end
|
28
|
+
|
24
29
|
def register_hook(*args)
|
25
30
|
args = args.flatten
|
26
31
|
|
27
|
-
if args.last.is_a?(Hash)
|
28
|
-
self.
|
32
|
+
if args.last.is_a?(Hash)
|
33
|
+
self.description = args.last.delete(:description)
|
34
|
+
self.template_path = args.last.delete(:template_path)
|
29
35
|
args.pop
|
30
36
|
end
|
31
37
|
|
@@ -41,7 +47,13 @@ module Maily
|
|
41
47
|
end
|
42
48
|
|
43
49
|
def call
|
44
|
-
|
50
|
+
*args = arguments && arguments.map { |arg| arg.respond_to?(:call) ? arg.call : arg }
|
51
|
+
|
52
|
+
if args == [nil]
|
53
|
+
mailer_klass.public_send(name)
|
54
|
+
else
|
55
|
+
mailer_klass.public_send(name, *args)
|
56
|
+
end
|
45
57
|
end
|
46
58
|
|
47
59
|
def base_path(part)
|
data/lib/maily/version.rb
CHANGED
data/maily.gemspec
CHANGED
@@ -7,7 +7,7 @@ Gem::Specification.new do |s|
|
|
7
7
|
s.email = ["srmarc.ai@gmail.com"]
|
8
8
|
s.homepage = "https://github.com/markets/maily"
|
9
9
|
s.summary = "Rails Engine to preview emails in the browser."
|
10
|
-
s.description = "Rails Engine to
|
10
|
+
s.description = "Maily is a Rails Engine to manage, test and navigate through all your email templates of your app, being able to preview them directly in your browser."
|
11
11
|
s.license = "MIT"
|
12
12
|
|
13
13
|
s.files = `git ls-files`.split($/)
|
data/spec/controllers_spec.rb
CHANGED
@@ -13,7 +13,8 @@ describe Maily::EmailsController, type: :controller do
|
|
13
13
|
|
14
14
|
it 'raise error if disabled' do
|
15
15
|
Maily.enabled = false
|
16
|
-
|
16
|
+
get :index
|
17
|
+
expect(response.status).to eq(404)
|
17
18
|
end
|
18
19
|
|
19
20
|
it 'responds with 401 if http authorization fails' do
|
@@ -1,4 +1,6 @@
|
|
1
|
+
email = -> { 'foo@foo.com' }
|
2
|
+
|
1
3
|
Maily.hooks_for('Notifier') do |mailer|
|
2
|
-
mailer.register_hook(:invitation,
|
3
|
-
mailer.register_hook(:recommendation, template_path: 'notifications')
|
4
|
-
end
|
4
|
+
mailer.register_hook(:invitation, email)
|
5
|
+
mailer.register_hook(:recommendation, template_path: 'notifications', description: 'description')
|
6
|
+
end
|
data/spec/email_spec.rb
CHANGED
@@ -24,7 +24,13 @@ describe Maily::Email do
|
|
24
24
|
expect(email.require_hook?).to be true
|
25
25
|
end
|
26
26
|
|
27
|
-
it
|
27
|
+
it 'should handle lazy arguments successfully' do
|
28
|
+
expect(email.arguments).to be_present
|
29
|
+
expect(email.arguments.size).to eq(email.required_arguments.size)
|
30
|
+
end
|
31
|
+
|
32
|
+
it 'should handle not lazy arguments successfully' do
|
33
|
+
allow(email).to receive(:email).and_return('foo@foo.com')
|
28
34
|
expect(email.arguments).to be_present
|
29
35
|
expect(email.arguments.size).to eq(email.required_arguments.size)
|
30
36
|
end
|
@@ -38,4 +44,9 @@ describe Maily::Email do
|
|
38
44
|
email = mailer.find_email('recommendation')
|
39
45
|
expect(email.template_path).to eq('notifications')
|
40
46
|
end
|
47
|
+
|
48
|
+
it "should handle description via hook" do
|
49
|
+
email = mailer.find_email('recommendation')
|
50
|
+
expect(email.description).to eq('description')
|
51
|
+
end
|
41
52
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: maily
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- markets
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-07-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -80,8 +80,8 @@ dependencies:
|
|
80
80
|
- - ">="
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '0'
|
83
|
-
description: Rails Engine to
|
84
|
-
|
83
|
+
description: Maily is a Rails Engine to manage, test and navigate through all your
|
84
|
+
email templates of your app, being able to preview them directly in your browser.
|
85
85
|
email:
|
86
86
|
- srmarc.ai@gmail.com
|
87
87
|
executables: []
|
@@ -95,14 +95,12 @@ files:
|
|
95
95
|
- MIT-LICENSE
|
96
96
|
- README.md
|
97
97
|
- Rakefile
|
98
|
-
- app/assets/images/maily/.gitkeep
|
99
98
|
- app/assets/images/maily/fonts/JosefinSans-Light.ttf
|
100
99
|
- app/assets/images/maily/icons/maily.eot
|
101
100
|
- app/assets/images/maily/icons/maily.svg
|
102
101
|
- app/assets/images/maily/icons/maily.ttf
|
103
102
|
- app/assets/images/maily/icons/maily.woff
|
104
103
|
- app/assets/javascripts/maily/application.js
|
105
|
-
- app/assets/javascripts/maily/html5shiv.js
|
106
104
|
- app/assets/stylesheets/maily/application.scss
|
107
105
|
- app/assets/stylesheets/maily/icons.css
|
108
106
|
- app/assets/stylesheets/maily/normalize.css
|
@@ -118,10 +116,9 @@ files:
|
|
118
116
|
- app/views/maily/shared/_header.html.erb
|
119
117
|
- app/views/maily/shared/_sidebar.html.erb
|
120
118
|
- config/routes.rb
|
121
|
-
- gemfiles/rails_3.2.gemfile
|
122
|
-
- gemfiles/rails_4.1.gemfile
|
123
119
|
- gemfiles/rails_4.2.gemfile
|
124
120
|
- gemfiles/rails_5.0.gemfile
|
121
|
+
- gemfiles/rails_5.1.gemfile
|
125
122
|
- lib/generators/maily/install_generator.rb
|
126
123
|
- lib/generators/templates/initializer.rb
|
127
124
|
- lib/maily.rb
|
@@ -199,7 +196,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
199
196
|
version: '0'
|
200
197
|
requirements: []
|
201
198
|
rubyforge_project:
|
202
|
-
rubygems_version: 2.5.
|
199
|
+
rubygems_version: 2.5.2
|
203
200
|
signing_key:
|
204
201
|
specification_version: 4
|
205
202
|
summary: Rails Engine to preview emails in the browser.
|
File without changes
|
@@ -1,8 +0,0 @@
|
|
1
|
-
/*
|
2
|
-
HTML5 Shiv v3.7.0 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed
|
3
|
-
*/
|
4
|
-
(function(l,f){function m(){var a=e.elements;return"string"==typeof a?a.split(" "):a}function i(a){var b=n[a[o]];b||(b={},h++,a[o]=h,n[h]=b);return b}function p(a,b,c){b||(b=f);if(g)return b.createElement(a);c||(c=i(b));b=c.cache[a]?c.cache[a].cloneNode():r.test(a)?(c.cache[a]=c.createElem(a)).cloneNode():c.createElem(a);return b.canHaveChildren&&!s.test(a)?c.frag.appendChild(b):b}function t(a,b){if(!b.cache)b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag();
|
5
|
-
a.createElement=function(c){return!e.shivMethods?b.createElem(c):p(c,a,b)};a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+m().join().replace(/[\w\-]+/g,function(a){b.createElem(a);b.frag.createElement(a);return'c("'+a+'")'})+");return n}")(e,b.frag)}function q(a){a||(a=f);var b=i(a);if(e.shivCSS&&!j&&!b.hasCSS){var c,d=a;c=d.createElement("p");d=d.getElementsByTagName("head")[0]||d.documentElement;c.innerHTML="x<style>article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}</style>";
|
6
|
-
c=d.insertBefore(c.lastChild,d.firstChild);b.hasCSS=!!c}g||t(a,b);return a}var k=l.html5||{},s=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,r=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,j,o="_html5shiv",h=0,n={},g;(function(){try{var a=f.createElement("a");a.innerHTML="<xyz></xyz>";j="hidden"in a;var b;if(!(b=1==a.childNodes.length)){f.createElement("a");var c=f.createDocumentFragment();b="undefined"==typeof c.cloneNode||
|
7
|
-
"undefined"==typeof c.createDocumentFragment||"undefined"==typeof c.createElement}g=b}catch(d){g=j=!0}})();var e={elements:k.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output progress section summary template time video",version:"3.7.0",shivCSS:!1!==k.shivCSS,supportsUnknownElements:g,shivMethods:!1!==k.shivMethods,type:"default",shivDocument:q,createElement:p,createDocumentFragment:function(a,b){a||(a=f);
|
8
|
-
if(g)return a.createDocumentFragment();for(var b=b||i(a),c=b.frag.cloneNode(),d=0,e=m(),h=e.length;d<h;d++)c.createElement(e[d]);return c}};l.html5=e;q(f)})(this,document);
|