mailtime 0.7.0 → 0.8.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 002fb9cd610aa3981cf339df70530af08af43225
4
- data.tar.gz: 63b2c8ba97369f4332dcf7304a44ec17176ab157
3
+ metadata.gz: a026e26ef8e6cf4a4bfea11a0fd01c016783e258
4
+ data.tar.gz: 4d12f9c970dad51e543342106807fd97f4ef9cbc
5
5
  SHA512:
6
- metadata.gz: ec3cc6edb99157a6f6b0a91f510e65277b40b58b8a9c1d68136d1363f7f9fbd575ea6b41dcf524f41c214bc3bccd4e2daa2ed3185b2aa8e44daf79dfc754fa9e
7
- data.tar.gz: d06eef854c7a18f7cf11195deab491d569f523f997b8fc5a69ce4fb602eb0db2280d04b9504e662d91f218ed908258b675772714f32d5c8013465223f2492d2f
6
+ metadata.gz: fbe09d0c3771f07f0a2dece8954c65aaf669fb74ddf711353f00de79e30f7d53db1d1100db521484e13ddab6cc9e078008d4905ebf519484ae79870b5e0c8d6a
7
+ data.tar.gz: c842cad376e1e0972b918d64511b36c38f5bca17f4e9726a236e1f26ad141f13a2203873b64469a566771f34ba3103b2764a55fa566936ebced827229a4ccc26
data/.gitignore CHANGED
@@ -8,3 +8,5 @@
8
8
  /spec/reports/
9
9
  /tmp/
10
10
  .DS_Store
11
+ /test/tmp/
12
+ /tmp/
data/README.md CHANGED
@@ -43,7 +43,7 @@ Need to customize? Sure.
43
43
 
44
44
  ```Ruby
45
45
  class User < ActiveRecord::Base
46
- acts_as_mailtime_loggable :email_address, :fields => [:to, :cc, :bcc]
46
+ acts_as_mailtime_loggable :email_address, :fields => [:to, :cc, :bcc]
47
47
  ```
48
48
 
49
49
  will tell `Mailtime::MailLog` to find an instance variable of class `User` where attribute `email_address` matches an `ActionMailer#mail`'s `#to`, `#cc`, or `#bcc` attribute.
@@ -109,12 +109,15 @@ Has a `name`, `content`, `format`, and `extension`. `format` should be one of `M
109
109
 
110
110
  ## Todo
111
111
 
112
- * Tests
112
+ * Tests. Like, way better tests.
113
+ * Attachments
114
+ * Support MySQL (uses jsonb as datatypes for storing things right now)
113
115
 
114
116
  ## Maybe todo
115
117
 
116
118
  * Dump for production?
117
119
  * Versioning for templates?
120
+ * A hell of a lot better rake import task.
118
121
 
119
122
  ## Contributing
120
123
 
data/Rakefile CHANGED
@@ -5,7 +5,9 @@ require 'rake/testtask'
5
5
  Rake::TestTask.new(:test) do |t|
6
6
  t.libs << "test"
7
7
  t.libs << "lib"
8
- t.test_files = FileList["test/**/test_*.rb"]
8
+ t.test_files = FileList["test/**/*_test.rb"]
9
9
  end
10
10
 
11
+ load 'lib/tasks/mailtime.rake'
12
+
11
13
  task :default => :test
@@ -39,19 +39,12 @@ module Mailtime
39
39
  self.message.instance_variable_set(:@template_name, self.headers[:template_name] || mailer_action)
40
40
  self.message.class.send(:attr_reader, :template_name)
41
41
 
42
- self.message.instance_variable_set(:@mailtime_template, find_mailtime_template)
43
- self.message.class.send(:attr_accessor, :mailtime_template)
44
-
45
- self.message.instance_variable_set(:@mailtime_layout, find_mailtime_template.mailtime_mail_layout)
46
- self.message.class.send(:attr_accessor, :mailtime_layout)
42
+ self.message.instance_variable_set(:@mailtime_templates, find_mailtime_templates)
43
+ self.message.class.send(:attr_accessor, :mailtime_templates)
47
44
  end
48
45
 
49
- def find_mailtime_template
50
- _template = Mailtime::MailTemplate.find_by(:klass => self.class.to_s, :action => self.action_name)
51
- if _template.nil?
52
- _template = Mailtime::NullTemplate.new(self)
53
- end
54
- _template
46
+ def find_mailtime_templates
47
+ Mailtime::MailTemplateCollection.new(self)
55
48
  end
56
49
 
57
50
  end
@@ -8,4 +8,28 @@ module Mailtime
8
8
  include Mailtime::RendererConcern
9
9
 
10
10
  end
11
+
12
+ class MailTemplateCollection
13
+
14
+ attr_reader :templates
15
+ def initialize(mail)
16
+ @mail = mail
17
+ @templates = Mailtime::MailTemplate.includes(:mail_layout).
18
+ where(:klass => mail.class.to_s, :action => mail.action_name)
19
+ end
20
+
21
+ def html
22
+ _template = @templates.where(:format => 'html').first
23
+ return _template if _template
24
+ Mailtime.configuration.fallback ? nil : NullHTMLTemplate.new(@mail)
25
+ end
26
+
27
+ def text
28
+ _template = @templates.where(:format => 'text').first
29
+ return _template if _template
30
+ Mailtime.configuration.fallback ? nil : NullTextTemplate.new(@mail)
31
+ end
32
+ alias_method :txt, :text
33
+
34
+ end
11
35
  end
@@ -44,6 +44,7 @@ module Mailtime
44
44
  @loggable_lookups ||= []
45
45
  end
46
46
 
47
+ # does nothing on purpose.
47
48
  def self.loggable_lookups=(val)
48
49
  @loggable_lookups
49
50
  end
@@ -27,6 +27,7 @@ module Mailtime
27
27
  if var.class.to_s == @loggable_class
28
28
  @loggable = var
29
29
  end
30
+ return false
30
31
  end
31
32
 
32
33
  def attribute_is_loggable?(var)
@@ -3,11 +3,15 @@ require 'mailtime/renderers/mail_renderer'
3
3
  require 'mailtime/renderers/base_renderer'
4
4
  require 'mailtime/renderers/erb_renderer'
5
5
  require 'mailtime/processor/mail_log_service'
6
- require 'mailtime/processor/processor'
7
6
 
8
7
  module Mailtime
9
8
  class Processor
10
9
 
10
+ CONTENT_TYPES = {
11
+ :html => 'text/html',
12
+ :text => 'text/plain'
13
+ }
14
+
11
15
  def initialize(mail)
12
16
  @mail = mail
13
17
  end
@@ -19,6 +23,7 @@ module Mailtime
19
23
  protected
20
24
 
21
25
  def process_mail
26
+ remove_parts
22
27
  render_mail
23
28
  log_mail
24
29
  @mail
@@ -26,18 +31,27 @@ module Mailtime
26
31
 
27
32
  private
28
33
 
29
- def log_mail
30
- return unless Mailtime.configuration.log
31
- log_for_recipients
34
+ def remove_part(format)
35
+ index = @mail.parts.index { |mail_part| mail_part.content_type.index(Mailtime::Processor::CONTENT_TYPES[format])}
36
+ @mail.parts.delete_at(index)
37
+ end
38
+
39
+ def remove_parts
40
+
32
41
  end
33
42
 
34
43
  def render_mail
35
44
  return @mail unless Mailtime.configuration.render
36
45
  renderer = Mailtime::Renderers::MailRenderer.new(@mail)
37
- @mail.body = renderer.render
46
+ apply_parts(renderer)
38
47
  @mail
39
48
  end
40
49
 
50
+ def log_mail
51
+ return unless Mailtime.configuration.log
52
+ log_for_recipients
53
+ end
54
+
41
55
  def log_for_recipients
42
56
  Mailtime.configuration.loggables.each do |loggable, options|
43
57
  svc = MailLogService.new(@mail, loggable, options)
@@ -45,5 +59,26 @@ module Mailtime
45
59
  end
46
60
  end
47
61
 
62
+ def apply_parts(renderer)
63
+ [:text, :html].each do |format|
64
+ apply_part(renderer, format)
65
+ end
66
+ end
67
+
68
+ def apply_part(renderer, format)
69
+ binding.pry
70
+ remove_part(format) if mail_has_template?(format)
71
+ part = Mail::Part.new do
72
+ content_type "#{CONTENT_TYPES[format]}; charset=UTF-8"
73
+ body renderer.execute(format)
74
+ end
75
+ mthd = "#{format}_part=".to_sym
76
+ @mail.send(mthd, part)
77
+ end
78
+
79
+ def mail_has_template?(format)
80
+ !!!@mail.mailtime_templates.send(format).nil?
81
+ end
82
+
48
83
  end
49
84
  end
@@ -9,26 +9,6 @@ class Railtie < Rails::Railtie
9
9
  end
10
10
 
11
11
  rake_tasks do
12
- namespace :mailtime do
13
- desc 'Create a bunch of MailTemplate(s) based on existing mailers'
14
- task :sync_mailers => :environment do
15
- Dir.glob(::Rails.root.join("app/mailers/**/*_mailer.rb")).each { |m| require m }
16
- mailers = ObjectSpace.each_object(Class).select { |klass| klass < ::ActionMailer::Base }
17
- mailers.each do |mailer|
18
- methods = mailer.public_instance_methods(false)
19
- methods.each do |m|
20
- formats = Dir.glob(Rails.root.join("app/views/#{mailer.to_s.underscore}/#{m}.*"))
21
- formats.each do |f|
22
- Mailtime::MailTemplate.create(:klass => mailer.to_s,
23
- :action => m,
24
- :content => File.read(f),
25
- :format => f.scan(%r{\.(\w{3,4})\.}).to_a.first.first,
26
- :extension => File.extname(f)[1 .. -1]
27
- )
28
- end
29
- end
30
- end
31
- end
32
- end
12
+
33
13
  end
34
14
  end
@@ -2,6 +2,7 @@ module Mailtime
2
2
  module Renderers
3
3
  class BaseRenderer
4
4
 
5
+ attr_reader :mail, :content
5
6
  def initialize(mail, content)
6
7
  @mail = mail
7
8
  @content = content
@@ -4,36 +4,27 @@ module Mailtime
4
4
 
5
5
  def initialize(mail)
6
6
  @mail = mail
7
- @template = @mail.mailtime_template
8
- @layout = @mail.mailtime_layout
9
7
  end
10
8
 
11
- def render
12
- render_and_merge
13
- end
14
-
15
- def self.renders
16
- []
9
+ def execute(format)
10
+ render(format)
17
11
  end
18
12
 
19
13
  protected
20
14
 
21
- # find the template. If one doesn't exist, and we want to fallback,
22
- # pretend like we have a template with a NullTemplate to make Sandi proud
23
- def find_template
24
- _template = Mailtime::MailTemplate.find_by(:klass => @mail.mailer_klass, :action => @mail.mailer_action)
25
- if _template.nil?
26
- _template = Mailtime::NullTemplate.new(@mail)
15
+ def render(format)
16
+ template = @mail.mailtime_templates.send(format)
17
+ layout = template.try(:mail_layout)
18
+ if template.nil?
19
+ part = @mail.parts.detect { |part| part.content_type.index(Mailtime::Processor::CONTENT_TYPES[format]) }
20
+ if part.nil?
21
+ raise TemplateNotFound, "Existing template not found for format #{format}"
22
+ end
23
+ return part.body.raw_source
24
+ else
25
+ return layout.render(@mail).gsub(Mailtime.configuration.yield_keyword, template.render(@mail))
27
26
  end
28
- _template
29
- end
30
-
31
- def find_layout
32
- @template.mailtime_mail_layout
33
- end
34
27
 
35
- def render_and_merge
36
- @layout.render(@mail).gsub(Mailtime.configuration.yield_keyword, @template.render(@mail))
37
28
  end
38
29
 
39
30
  end
@@ -1,48 +1,2 @@
1
- # Just null objects
2
-
3
- module Mailtime
4
- class NullLayout
5
-
6
- attr_reader :content, :id
7
- def initialize
8
- @id = nil
9
- @content = "#{Mailtime.configuration.yield_keyword}"
10
- end
11
-
12
- def self.renders
13
- ['erb']
14
- end
15
-
16
- def renderer
17
- Mailtime::Renderers::ErbRenderer
18
- end
19
-
20
- def render(mail)
21
- renderer.new(mail, @content).render
22
- end
23
-
24
- end
25
-
26
- class NullTemplate
27
-
28
- attr_reader :content, :id
29
- def initialize(mail)
30
- @id = nil
31
- @content = mail.body.raw_source
32
- end
33
-
34
- def mail_layout
35
- NullLayout.new
36
- end
37
-
38
- def renderer
39
- Mailtime::Renderers::ErbRenderer
40
- end
41
-
42
- # doesn't do anything since we already know the mail.
43
- def render(mail)
44
- @content
45
- end
46
-
47
- end
48
- end
1
+ require 'mailtime/renderers/null_layout'
2
+ require 'mailtime/renderers/null_template'
@@ -0,0 +1,51 @@
1
+ module Mailtime
2
+ class NullLayout
3
+
4
+ attr_reader :content, :id, :format
5
+ def initialize
6
+ @id = nil
7
+ @content = "#{Mailtime.configuration.yield_keyword}"
8
+ end
9
+
10
+ def self.renders
11
+ ['erb']
12
+ end
13
+
14
+ def renderer
15
+ Mailtime::Renderers::ErbRenderer
16
+ end
17
+
18
+ def render(mail)
19
+ renderer.new(mail, @content).render
20
+ end
21
+
22
+ end
23
+
24
+ class NullHTMLLayout < NullLayout
25
+
26
+ def format
27
+ :html
28
+ end
29
+
30
+ end
31
+
32
+ class NullTextLayout < NullLayout
33
+
34
+ def format
35
+ :text
36
+ end
37
+
38
+ end
39
+
40
+ class NullLayoutCollection
41
+
42
+ def html
43
+ NullHTMLLayout.new
44
+ end
45
+
46
+ def text
47
+ NullTextLayout.new
48
+ end
49
+
50
+ end
51
+ end
@@ -0,0 +1,64 @@
1
+ module Mailtime
2
+ class NullTemplate
3
+
4
+ attr_reader :content, :id
5
+ def initialize(mail)
6
+ @id = nil
7
+ @content = mail.body.raw_source
8
+ end
9
+
10
+ def mail_layout
11
+ NullLayout.new
12
+ end
13
+
14
+ def renderer
15
+ Mailtime::Renderers::ErbRenderer
16
+ end
17
+
18
+ # doesn't do anything since we already know the mail.
19
+ def render(mail)
20
+ @content
21
+ end
22
+
23
+ end
24
+
25
+ class NullHTMLTemplate < NullTemplate
26
+
27
+ def format
28
+ :html
29
+ end
30
+
31
+ def mail_layout
32
+ NullHTMLLayout.new
33
+ end
34
+
35
+ end
36
+
37
+ class NullTextTemplate < NullTemplate
38
+
39
+ def format
40
+ :text
41
+ end
42
+
43
+ def mail_layout
44
+ NullTextLayout.new
45
+ end
46
+
47
+ end
48
+
49
+ class NullTemplateCollection
50
+
51
+ def initialize(mail)
52
+ @mail = mail
53
+ end
54
+
55
+ def html
56
+ NullHTMLTemplate.new(@mail)
57
+ end
58
+
59
+ def text
60
+ NullTextTemplate.new(@mail)
61
+ end
62
+
63
+ end
64
+ end
@@ -1,3 +1,3 @@
1
1
  module Mailtime
2
- VERSION = "0.7.0"
2
+ VERSION = "0.8.0"
3
3
  end
@@ -0,0 +1,22 @@
1
+ # for the love of god, don't use this.
2
+ namespace :mailtime do
3
+ desc 'Create a bunch of MailTemplate(s) based on existing mailers'
4
+ task :sync_mailers => :environment do
5
+ Dir.glob(::Rails.root.join("app/mailers/**/*_mailer.rb")).each { |m| require m }
6
+ mailers = ObjectSpace.each_object(Class).select { |klass| klass < ::ActionMailer::Base }
7
+ mailers.each do |mailer|
8
+ methods = mailer.public_instance_methods(false)
9
+ methods.each do |m|
10
+ formats = Dir.glob(Rails.root.join("app/views/#{mailer.to_s.underscore}/#{m}.*"))
11
+ formats.each do |f|
12
+ Mailtime::MailTemplate.create(:klass => mailer.to_s,
13
+ :action => m,
14
+ :content => File.read(f),
15
+ :format => f.scan(%r{\.(\w{3,4})\.}).to_a.first.first,
16
+ :extension => File.extname(f)[1 .. -1]
17
+ )
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
data/mailtime.gemspec CHANGED
@@ -29,8 +29,10 @@ Gem::Specification.new do |spec|
29
29
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
30
30
  spec.require_paths = ["lib"]
31
31
 
32
- spec.add_development_dependency "rails", "4.2"
32
+ spec.add_development_dependency "rails", ">= 4.1"
33
33
  spec.add_development_dependency "rake", ">= 10.0"
34
+ spec.add_development_dependency "pg"
35
+ spec.add_development_dependency "pry"
34
36
  spec.add_development_dependency "minitest"
35
37
  spec.add_development_dependency "minitest-reporters"
36
38
  spec.add_development_dependency "mocha"
metadata CHANGED
@@ -1,29 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mailtime
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.0
4
+ version: 0.8.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Josh Brody
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-04-07 00:00:00.000000000 Z
11
+ date: 2017-04-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - '='
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: '4.2'
19
+ version: '4.1'
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - '='
24
+ - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: '4.2'
26
+ version: '4.1'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rake
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -38,6 +38,34 @@ dependencies:
38
38
  - - ">="
39
39
  - !ruby/object:Gem::Version
40
40
  version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: pg
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: pry
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
41
69
  - !ruby/object:Gem::Dependency
42
70
  name: minitest
43
71
  requirement: !ruby/object:Gem::Requirement
@@ -133,7 +161,10 @@ files:
133
161
  - lib/mailtime/renderers/erb_renderer.rb
134
162
  - lib/mailtime/renderers/mail_renderer.rb
135
163
  - lib/mailtime/renderers/null.rb
164
+ - lib/mailtime/renderers/null_layout.rb
165
+ - lib/mailtime/renderers/null_template.rb
136
166
  - lib/mailtime/version.rb
167
+ - lib/tasks/mailtime.rake
137
168
  - mailtime.gemspec
138
169
  homepage: https://github.com/joshmn/mailtime
139
170
  licenses: