mailtime 0.7.0 → 0.8.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
  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: