rails_email_preview 0.2.14 → 0.2.15

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
  SHA1:
3
- metadata.gz: 470b4acb87f3f09970b99c473dc2513e4e7b4cd7
4
- data.tar.gz: 1a408bcd46fb2917eb812098a1d5da1d0c2e0498
3
+ metadata.gz: c104f566ecd1afcf4b0cd18f5c3b381bf5e6b5bf
4
+ data.tar.gz: 0920be3ca35eece7accba7a99bb8c3fba89dbe70
5
5
  SHA512:
6
- metadata.gz: 535c2d3ea7abdab5ce70e4031354958ebf1eab6788676215cce6642b875e5871cb6bef12343674a010db05e48b43a0038a93ae8bbb27321de97377626a5bd419
7
- data.tar.gz: 2b8825c44c05aaa3dbf24fc82e2d7d42cbcf5cd7ba3c52f654a4afbf0165e9d7877652342483d77d9574528fc04dc25234499e9566935a5d276a2089f4e457fd
6
+ metadata.gz: 6371877837cc223fb9d7caf8974e2b4f2e640faea4625f4edf081936c4cafab8a323bf7cec516def9b3b93399808288a1a5d828f01f0251d8af0d8eb58bd0a23
7
+ data.tar.gz: 61d62058d0313dcd163800b3f4209b97118a8fdaaa7fa15722d4cc6c7b2c38b0887e03f53d212c8502ceca09153efff92bc13d00ba93411aa803cb57049b489c
data/Gemfile CHANGED
@@ -2,7 +2,14 @@ source "http://rubygems.org"
2
2
 
3
3
  gemspec
4
4
 
5
+ platform :rbx do
6
+ gem 'rubysl', '~> 2.0'
7
+ gem 'rubysl-test-unit', '~> 2.0'
8
+ gem 'racc'
9
+ end
10
+
5
11
  group :development, :test do
12
+ gem 'i18n-tasks'
6
13
  gem 'capybara', '>= 0.4.0'
7
14
  gem 'rspec', '2.12.0' #, git: 'https://github.com/rspec/rspec'
8
15
  gem 'rspec-rails' #, git: 'https://github.com/rspec/rspec-rails'
data/Rakefile CHANGED
@@ -6,12 +6,16 @@ rescue LoadError
6
6
  end
7
7
 
8
8
  # Load dummy app tasks
9
- APP_RAKEFILE = File.expand_path('../spec/dummy/Rakefile', __FILE__)
10
- load 'rails/tasks/engine.rake'
9
+ if ENV['DUMMY']
10
+ APP_RAKEFILE = File.expand_path('../spec/dummy/Rakefile', __FILE__)
11
+ load 'rails/tasks/engine.rake'
12
+ end
11
13
 
12
14
  Bundler::GemHelper.install_tasks
13
15
 
14
16
  require 'rspec/core/rake_task'
15
17
  RSpec::Core::RakeTask.new(:spec)
16
18
 
17
- task default: :spec
19
+ load 'tasks/i18n-tasks.rake'
20
+
21
+ task default: :spec
@@ -1,49 +1,36 @@
1
1
  class RailsEmailPreview::EmailsController < ::RailsEmailPreview::ApplicationController
2
2
  include ERB::Util
3
- before_filter :load_preview_class, except: :index
3
+ before_filter :load_preview, except: :index
4
4
  before_filter :set_email_preview_locale
5
5
 
6
6
  # list screen
7
7
  def index
8
- @preview_class_names = (RailsEmailPreview.preview_classes || []).map { |klass| klass.is_a?(String) ? klass : klass.name }.sort
8
+ @previews = ::RailsEmailPreview::Preview.all
9
+ @previews_by_class = ::RailsEmailPreview::Preview.all_by_preview_class
9
10
  end
10
11
 
11
12
  # preview screen
12
13
  def show
13
14
  I18n.with_locale @email_locale do
14
15
  @part_type = params[:part_type] || 'text/html'
15
- if @preview_class.respond_to?(:new)
16
- @mail = preview_mail
16
+ if @preview.respond_to?(:preview_mail)
17
+ @mail = @preview.preview_mail
17
18
  else
18
- raise ArgumentError.new("#{@preview_class} is not a preview class, does not respond_to?(:new)")
19
+ raise ArgumentError.new("#{@preview} is not a preview class, does not respond_to?(:preview_mail)")
19
20
  end
20
21
  end
21
22
  end
22
23
 
23
24
  # render actual email content
24
- def show_raw
25
+ def show_body
25
26
  I18n.with_locale @email_locale do
26
- @mail = preview_mail(edit_links: (@part_type == 'text/html'))
27
- RailsEmailPreview.run_before_render(@mail, @preview_class.name, @mail_action)
28
- if @part_type == 'raw'
29
- body = "<pre id='raw_message'>#{html_escape(@mail.to_s)}</pre>"
30
- else
31
- if @mail.multipart?
32
- body_part = (@part_type =~ /html/ ? @mail.html_part : @mail.text_part)
33
- else
34
- body_part = @mail
35
- end
36
- body = body_part.body
37
- if body_part.content_type =~ /plain/
38
- body = "<pre id='message_body'>#{body}</body>"
39
- end
40
- end
41
- render text: body, layout: false
27
+ @mail_body = mail_body(@preview, @part_type)
28
+ render :show_body, layout: 'rails_email_preview/email'
42
29
  end
43
30
  end
44
31
 
45
32
  def test_deliver
46
- redirect_url = rep_email_url(params.slice(:mail_class, :mail_action, :email_locale))
33
+ redirect_url = rails_email_preview.rep_email_url(params.slice(:mail_class, :mail_action, :email_locale))
47
34
  if (address = params[:recipient_email]).blank? || address !~ /@/
48
35
  redirect_to redirect_url, alert: t('rep.test_deliver.provide_email')
49
36
  return
@@ -70,24 +57,32 @@ class RailsEmailPreview::EmailsController < ::RailsEmailPreview::ApplicationCont
70
57
  end
71
58
  end
72
59
 
73
- def preview_mail(opt = {})
74
- RequestStore.store[:rep_edit_links] = true if opt[:edit_links]
75
- mail = @preview_class.new.send(@mail_action)
76
- mail
60
+ def mail_body(preview, part_type, edit_links = (part_type == 'text/html'))
61
+ RequestStore.store[:rep_edit_links] = true if edit_links
62
+ mail = preview.preview_mail
63
+ RailsEmailPreview.run_before_render(mail, preview)
64
+ return "<pre id='raw_message'>#{html_escape(mail.to_s)}</pre>".html_safe if part_type == 'raw'
65
+
66
+ body_part = if mail.multipart?
67
+ (part_type =~ /html/ ? mail.html_part : mail.text_part)
68
+ else
69
+ mail
70
+ end
71
+ if body_part.content_type =~ /plain/
72
+ "<pre id='message_body'>#{html_escape(body_part.body.to_s)}</pre>".html_safe
73
+ else
74
+ body_part.body.to_s.html_safe
75
+ end
77
76
  end
78
77
 
79
78
  def set_email_preview_locale
80
- @email_locale = (params[:email_locale] || I18n.default_locale).to_s
79
+ @email_locale = (params[:email_locale] || RailsEmailPreview.default_email_locale || I18n.default_locale).to_s
81
80
  end
82
81
 
83
82
  private
84
83
 
85
- def load_preview_class
86
- @preview_class = (RailsEmailPreview.preview_classes || []).find { |pc|
87
- (pc.is_a?(String) ? pc : pc.name).underscore == params[:mail_class]
88
- }
89
- @preview_class = @preview_class.constantize if @preview_class.is_a?(String)
90
- @mail_action = params[:mail_action]
84
+ def load_preview
85
+ @preview = ::RailsEmailPreview::Preview[params[:preview_id]] or raise ActionController::RoutingError.new('Not Found')
91
86
  @part_type = params[:part_type] || 'text/html'
92
87
  end
93
88
  end
@@ -1,10 +1,9 @@
1
1
  module RailsEmailPreview::EmailsHelper
2
- def current_email_name
3
- "#{preview_class_human_name}: #{@mail_action.to_s.humanize}"
4
- end
5
2
 
6
- def preview_class_human_name(preview_class = @preview_class)
7
- preview_class.to_s.underscore.sub(/(_mailer)?_preview$/, '').humanize
3
+ MIME_LABELS = { 'text/html' => 'HTML', 'text/plain' => 'Text', 'raw' => 'Raw'}
4
+
5
+ def format_label(mime_type)
6
+ MIME_LABELS[mime_type]
8
7
  end
9
8
 
10
9
  def change_locale_attr(locale)
@@ -46,14 +45,6 @@ module RailsEmailPreview::EmailsHelper
46
45
  end
47
46
  end
48
47
 
49
- def email_methods(m)
50
- m.constantize.instance_methods(false).map(&:to_s).sort
51
- end
52
-
53
- def total_emails
54
- @total_emails ||= @preview_class_names.sum { |p| email_methods(p).length }
55
- end
56
-
57
48
  def split_in_halves(elements, &weight)
58
49
  tot_w = elements.map(&weight).sum
59
50
  cols = [elements.dup, []]
@@ -0,0 +1,71 @@
1
+ module RailsEmailPreview
2
+ # This class represents an email preview
3
+ class Preview
4
+ attr_accessor :id, :preview_class_name, :preview_method
5
+
6
+ def initialize(attr = {})
7
+ attr.each { |k, v| self.send "#{k}=", v }
8
+ end
9
+
10
+ def locales
11
+ I18n.available_locales
12
+ end
13
+
14
+ def formats
15
+ %w(text/html text/plain raw)
16
+ end
17
+
18
+ def preview_mail
19
+ preview_class_name.constantize.new.send(preview_method)
20
+ end
21
+
22
+ def name
23
+ @name ||= "#{group_name}: #{method_name}"
24
+ end
25
+
26
+ def method_name
27
+ @action_name ||= preview_method.to_s.humanize
28
+ end
29
+
30
+ def group_name
31
+ @group_name ||= preview_class_name.to_s.underscore.sub(/(_mailer)?_preview$/, '').humanize
32
+ end
33
+
34
+ class << self
35
+ def find(email_id)
36
+ @by_id[email_id]
37
+ end
38
+
39
+ alias_method :[], :find
40
+
41
+ attr_reader :all, :all_by_preview_class
42
+
43
+ def mail_methods(mailer)
44
+ mailer.public_instance_methods(false).map(&:to_s)
45
+ end
46
+
47
+ def load_all(class_names)
48
+ @all = []
49
+ @by_id = {}
50
+ class_names.each do |preview_class_name|
51
+ preview_class = preview_class_name.constantize
52
+
53
+ mail_methods(preview_class).sort.each do |preview_method|
54
+ mailer_method = preview_method
55
+ id = "#{preview_class_name.underscore}-#{mailer_method}"
56
+
57
+ email = new(
58
+ id: id,
59
+ preview_class_name: preview_class_name,
60
+ preview_method: preview_method
61
+ )
62
+ @all << email
63
+ @by_id[id] = email
64
+ end
65
+ end
66
+ @all.sort_by!(&:name)
67
+ @all_by_preview_class = @all.group_by(&:preview_class_name)
68
+ end
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,15 @@
1
+ doctype html
2
+ = "\n"
3
+ html
4
+ head
5
+ css:
6
+ #message_body, #raw_message {
7
+ font-family: Monaco, Menlo, Consolas, "Courier New", monospace;
8
+ word-break: break-word;
9
+ }
10
+
11
+ = yield(:head)
12
+ body
13
+ #content.container
14
+ = render 'layouts/rails_email_preview/flash_notices'
15
+ = yield
@@ -1,5 +1,5 @@
1
1
  div class=rep_btn_group_class
2
- - { 'text/html' => 'HTML', 'text/plain' => 'Text', 'raw' => 'Raw'}.each do |mime, label|
3
- a.btn-xs *change_format_attr(mime)
4
- = label
2
+ - @preview.formats.each do |format|
3
+ a.btn-xs *change_format_attr(format)
4
+ = format_label format
5
5
 
@@ -1,5 +1,5 @@
1
1
  div class=rep_btn_group_class
2
- - I18n.available_locales.each do |locale|
2
+ - @preview.locales.each do |locale|
3
3
  -# href, active class from change_locale_attr(locale)
4
4
  a.btn *change_locale_attr(locale)
5
5
  = locale_name(locale)
@@ -1,24 +1,17 @@
1
- h1
2
- | #{t '.list_title'}
3
-
4
- - previews_group = proc do |m|
5
- - capture do
6
- h2 = preview_class_human_name(m)
7
- ul class=rep_style[:list_group_class]
8
- - email_methods(m).each do |method|
9
- li class=rep_style[:list_group_item_class]
10
- a href=rails_email_preview.rep_email_url(mail_class: m.to_s.underscore, mail_action: method.to_s, email_locale: @email_locale)
11
- = method.to_s.humanize
1
+ h1 = t '.list_title'
12
2
 
13
3
  div class=rep_row_class
14
- - split_in_halves(@preview_class_names) { |c| email_methods(c).length }.each do |classes|
4
+ - split_in_halves(@previews_by_class.keys) { |c| @previews_by_class[c].length }.each do |classes|
15
5
  div class=rep_col_class(6)
16
- - classes.each do |class_name|
17
- = previews_group.call(class_name)
6
+ - classes.map { |c| @previews_by_class[c] }.each do |previews|
7
+ h2 = previews[0].group_name
8
+ div class=rep_style[:list_group_class]
9
+ - previews.each do |p|
10
+ a class=rep_style[:list_group_item_class] href=rails_email_preview.rep_email_url(preview_id: p.id, email_locale: @email_locale)
11
+ = p.method_name
18
12
 
19
13
  hr
20
-
21
14
  p.text-center.text-small.text-info
22
- | #{t 'rep.base.email', count: total_emails} #{t 'rep.base.in'} #{t 'rep.base.mailer', count: @preview_class_names.length }
15
+ | #{t 'rep.base.email', count: @previews.length} #{t 'rep.base.in'} #{t 'rep.base.mailer', count: @previews_by_class.values.length }
23
16
  br
24
17
  a href="https://github.com/glebm/rails_email_preview" target='_blank' REP #{RailsEmailPreview::VERSION}
@@ -3,7 +3,7 @@
3
3
  .pull-left
4
4
  ul.breadcrumb
5
5
  li: a href=rails_email_preview.rep_emails_url(email_locale: @email_locale) #{t '.breadcrumb_list'}
6
- li.active: a href=(request.url) = current_email_name
6
+ li.active: a href=(request.url) = @preview.name
7
7
 
8
8
  div class=rep_style[:panel_class]
9
9
  div class=rep_style[:panel_body_class]
@@ -0,0 +1 @@
1
+ = @mail_body
@@ -0,0 +1,6 @@
1
+ base_locale: en
2
+ locales: [en, de]
3
+
4
+ ignore_eq_base:
5
+ en,de:
6
+ - rep.base.in
data/config/routes.rb CHANGED
@@ -1,9 +1,9 @@
1
1
  RailsEmailPreview::Engine.routes.draw do
2
2
  get '/' => 'emails#index', as: :rep_emails
3
3
 
4
- get 'raw/:mail_class/:mail_action' => 'emails#show_raw', as: :rep_raw_email
5
- get ':mail_class/:mail_action' => 'emails#show', as: :rep_email
6
- post 'test_deliver/:mail_class/:mail_action' => 'emails#test_deliver', as: :rep_test_deliver
4
+ get 'raw/:preview_id' => 'emails#show_body', as: :rep_raw_email
5
+ get ':preview_id' => 'emails#show', as: :rep_email
6
+ post 'test_deliver/:preview_id' => 'emails#test_deliver', as: :rep_test_deliver
7
7
 
8
8
  # define alias for the root url as part of stable api
9
9
  get '/' => 'emails#index', as: :rep_root
@@ -19,6 +19,9 @@ module RailsEmailPreview
19
19
  # auto-loading configured in initializer
20
20
  mattr_accessor :preview_classes
21
21
 
22
+ # default email locale
23
+ mattr_accessor :default_email_locale
24
+
22
25
  # send email button
23
26
  mattr_accessor :enable_send_email
24
27
  self.enable_send_email = true
@@ -38,6 +41,11 @@ module RailsEmailPreview
38
41
  }
39
42
 
40
43
  class << self
44
+ def preview_classes=(classes)
45
+ @preview_classes = classes
46
+ RailsEmailPreview::Preview.load_all(classes)
47
+ end
48
+
41
49
  def layout=(layout)
42
50
  [::RailsEmailPreview::ApplicationController, ::RailsEmailPreview::EmailsController].each { |ctrl| ctrl.layout layout }
43
51
  if layout && layout !~ %r(^rails_email_preview/)
@@ -46,9 +54,9 @@ module RailsEmailPreview
46
54
  end
47
55
  end
48
56
 
49
- def run_before_render(mail, preview_class_name, mailer_action)
57
+ def run_before_render(mail, preview)
50
58
  (defined?(@hooks) && @hooks[:before_render] || []).each do |block|
51
- block.call(mail, preview_class_name, mailer_action)
59
+ block.call(mail, preview)
52
60
  end
53
61
  end
54
62
 
@@ -93,10 +93,8 @@ module RailsEmailPreview
93
93
  id_prefix = 'email-'
94
94
  return unless snippet && snippet.identifier && snippet.identifier.starts_with?(id_prefix)
95
95
  mailer_cl, act = snippet.identifier[id_prefix.length..-1].split('-')
96
- mailer_cl += '_preview'
97
- { mail_class: mailer_cl,
98
- mail_action: act,
99
- email_locale: snippet.site.locale}
96
+ { preview_id: "#{mailer_cl}_preview-#{act}",
97
+ email_locale: snippet.site.locale }
100
98
  end
101
99
  end
102
100
  end
@@ -108,4 +106,4 @@ ActionMailer::Base.module_eval do
108
106
  end
109
107
 
110
108
  require 'comfortable_mexican_sofa'
111
- ComfortableMexicanSofa::ViewHooks.add :navigation, 'integrations/cms/customize_cms_for_rails_email_preview'
109
+ ComfortableMexicanSofa::ViewHooks.add :navigation, 'integrations/cms/customize_cms_for_rails_email_preview'
@@ -1,3 +1,3 @@
1
1
  module RailsEmailPreview
2
- VERSION = '0.2.14'
2
+ VERSION = '0.2.15'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rails_email_preview
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.14
4
+ version: 0.2.15
5
5
  platform: ruby
6
6
  authors:
7
7
  - Gleb Mazovetskiy
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-11-22 00:00:00.000000000 Z
11
+ date: 2014-02-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -95,9 +95,11 @@ files:
95
95
  - app/controllers/rails_email_preview/application_controller.rb
96
96
  - app/controllers/rails_email_preview/emails_controller.rb
97
97
  - app/helpers/rails_email_preview/emails_helper.rb
98
+ - app/models/rails_email_preview/preview.rb
98
99
  - app/views/integrations/cms/_customize_cms_for_rails_email_preview.html.slim
99
100
  - app/views/layouts/rails_email_preview/_flash_notices.html.slim
100
101
  - app/views/layouts/rails_email_preview/application.html.slim
102
+ - app/views/layouts/rails_email_preview/email.html.slim
101
103
  - app/views/rails_email_preview/emails/_email_iframe.html.slim
102
104
  - app/views/rails_email_preview/emails/_format_nav.html.slim
103
105
  - app/views/rails_email_preview/emails/_headers.html.slim
@@ -105,6 +107,7 @@ files:
105
107
  - app/views/rails_email_preview/emails/_send_form.html.slim
106
108
  - app/views/rails_email_preview/emails/index.html.slim
107
109
  - app/views/rails_email_preview/emails/show.html.slim
110
+ - app/views/rails_email_preview/emails/show_body.html.slim
108
111
  - lib/generators/rails_email_preview/install_generator.rb
109
112
  - lib/generators/rails_email_preview/update_previews_generator.rb
110
113
  - lib/rails_email_preview/delivery_handler.rb
@@ -113,6 +116,7 @@ files:
113
116
  - lib/rails_email_preview/main_app_route_delegator.rb
114
117
  - lib/rails_email_preview/version.rb
115
118
  - lib/rails_email_preview.rb
119
+ - config/i18n-tasks.yml
116
120
  - config/initializers/rails_email_preview.rb
117
121
  - config/locales/de.yml
118
122
  - config/locales/en.yml
@@ -141,7 +145,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
141
145
  version: '0'
142
146
  requirements: []
143
147
  rubyforge_project:
144
- rubygems_version: 2.1.10
148
+ rubygems_version: 2.0.14
145
149
  signing_key:
146
150
  specification_version: 4
147
151
  summary: Preview emails in browser (rails engine)