postmortem 0.1.3 → 0.2.5

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.
@@ -3,8 +3,8 @@
3
3
  module Postmortem
4
4
  # Wraps provided body in an enclosing layout for presentation purposes.
5
5
  class Layout
6
- def initialize(adapter)
7
- @adapter = adapter
6
+ def initialize(mail)
7
+ @mail = mail
8
8
  end
9
9
 
10
10
  def format_email_array(array)
@@ -12,8 +12,91 @@ module Postmortem
12
12
  end
13
13
 
14
14
  def content
15
- mail = @adapter
15
+ mail = @mail
16
+ mail.html_body = with_inlined_images(mail.html_body) if defined?(Nokogiri)
16
17
  ERB.new(Postmortem.config.layout.read).result(binding)
17
18
  end
19
+
20
+ def styles
21
+ default_layout_directory.join('layout.css').read
22
+ end
23
+
24
+ def javascript
25
+ default_layout_directory.join('layout.js').read
26
+ end
27
+
28
+ def css_dependencies
29
+ default_layout_directory.join('dependencies.css').read
30
+ end
31
+
32
+ def javascript_dependencies
33
+ default_layout_directory.join('dependencies.js').read
34
+ end
35
+
36
+ def headers_template
37
+ default_layout_directory.join('headers_template.html').read
38
+ end
39
+
40
+ def favicon_b64
41
+ default_layout_directory.join('favicon.b64').read
42
+ end
43
+
44
+ private
45
+
46
+ def default_layout_directory
47
+ Postmortem.root.join('layout')
48
+ end
49
+
50
+ def with_inlined_images(body)
51
+ parsed = Nokogiri::HTML.parse(body)
52
+ parsed.css('img').each do |img|
53
+ uri = try_uri(img['src'])
54
+ next unless local_file?(uri)
55
+
56
+ path = located_image(uri)
57
+ img['src'] = encoded_image(path) unless path.nil?
58
+ end
59
+ parsed.to_s
60
+ end
61
+
62
+ def local_file?(uri)
63
+ return false if uri.nil?
64
+ return true if uri.host.nil?
65
+ return true if /^www\.example\.[a-z]+$/.match(uri.host)
66
+ return true if %w[127.0.0.1 localhost].include?(uri.host)
67
+
68
+ false
69
+ end
70
+
71
+ def try_uri(uri)
72
+ URI(uri)
73
+ rescue URI::InvalidURIError
74
+ nil
75
+ end
76
+
77
+ def located_image(uri)
78
+ path = uri.path.partition('/').last
79
+ common_locations.each do |location|
80
+ full_path = location.join(path)
81
+ next unless full_path.file?
82
+
83
+ return full_path
84
+ end
85
+
86
+ nil
87
+ end
88
+
89
+ def encoded_image(path)
90
+ "data:#{mime_type(path)};base64,#{Base64.encode64(path.read)}"
91
+ end
92
+
93
+ def common_locations
94
+ ['public/assets', 'app/assets/images'].map { |path| Pathname.new(path) }
95
+ end
96
+
97
+ def mime_type(path)
98
+ extension = path.extname.partition('.').last
99
+ extension == 'jpg' ? 'jpeg' : extension
100
+ end
18
101
  end
19
102
  end
@@ -1,5 +1,12 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  ActiveSupport::Notifications.subscribe 'deliver.action_mailer' do |*args|
4
+ delivery_method = Rails.try(:application)
5
+ &.try(:config)
6
+ &.try(:action_mailer)
7
+ &.try(:delivery_method)
8
+ next if delivery_method.nil?
9
+ next if %i[sendmail smtp].include?(delivery_method&.to_sym) # Delegate to Mail plugin.
10
+
4
11
  Postmortem.record_delivery(Postmortem::Adapters::ActionMailer.new(args.extract_options!))
5
12
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Postmortem
4
- VERSION = '0.1.3'
4
+ VERSION = '0.2.5'
5
5
  end
data/postmortem.gemspec CHANGED
@@ -12,7 +12,7 @@ Gem::Specification.new do |spec|
12
12
  spec.description = 'Preview HTML emails in your browser during development'
13
13
  spec.homepage = 'https://github.com/bobf/postmortem'
14
14
  spec.license = 'MIT'
15
- spec.required_ruby_version = Gem::Requirement.new('>= 2.3.0')
15
+ spec.required_ruby_version = Gem::Requirement.new('>= 2.5.0')
16
16
 
17
17
  spec.metadata['homepage_uri'] = spec.homepage
18
18
  spec.metadata['source_code_uri'] = spec.homepage
@@ -28,10 +28,12 @@ Gem::Specification.new do |spec|
28
28
  spec.add_runtime_dependency 'mail', '~> 2.7'
29
29
 
30
30
  spec.add_development_dependency 'actionmailer', '~> 6.0'
31
+ spec.add_development_dependency 'devpack', '~> 0.3.2'
31
32
  spec.add_development_dependency 'pony', '~> 1.13'
32
33
  spec.add_development_dependency 'rspec', '~> 3.9'
33
34
  spec.add_development_dependency 'rspec-its', '~> 1.3'
34
- spec.add_development_dependency 'rubocop', '~> 0.88.0'
35
+ spec.add_development_dependency 'rubocop', '~> 1.10'
36
+ spec.add_development_dependency 'rubocop-rspec', '~> 2.2'
35
37
  spec.add_development_dependency 'strong_versions', '~> 0.4.5'
36
38
  spec.add_development_dependency 'timecop', '~> 0.9.1'
37
39
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: postmortem
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
4
+ version: 0.2.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bob Farrell
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-01-12 00:00:00.000000000 Z
11
+ date: 2021-02-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: mail
@@ -38,6 +38,20 @@ dependencies:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
40
  version: '6.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: devpack
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: 0.3.2
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: 0.3.2
41
55
  - !ruby/object:Gem::Dependency
42
56
  name: pony
43
57
  requirement: !ruby/object:Gem::Requirement
@@ -86,14 +100,28 @@ dependencies:
86
100
  requirements:
87
101
  - - "~>"
88
102
  - !ruby/object:Gem::Version
89
- version: 0.88.0
103
+ version: '1.10'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '1.10'
111
+ - !ruby/object:Gem::Dependency
112
+ name: rubocop-rspec
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: '2.2'
90
118
  type: :development
91
119
  prerelease: false
92
120
  version_requirements: !ruby/object:Gem::Requirement
93
121
  requirements:
94
122
  - - "~>"
95
123
  - !ruby/object:Gem::Version
96
- version: 0.88.0
124
+ version: '2.2'
97
125
  - !ruby/object:Gem::Dependency
98
126
  name: strong_versions
99
127
  requirement: !ruby/object:Gem::Requirement
@@ -132,6 +160,7 @@ files:
132
160
  - ".gitignore"
133
161
  - ".rspec"
134
162
  - ".rubocop.yml"
163
+ - ".ruby-version"
135
164
  - Gemfile
136
165
  - LICENSE.txt
137
166
  - Makefile
@@ -141,6 +170,14 @@ files:
141
170
  - bin/setup
142
171
  - doc/screenshot.png
143
172
  - layout/default.html.erb
173
+ - layout/dependencies.css
174
+ - layout/dependencies.js
175
+ - layout/favicon.b64
176
+ - layout/headers_template.html
177
+ - layout/layout.css
178
+ - layout/layout.js
179
+ - layout/postmortem_identity.html.erb
180
+ - layout/postmortem_index.html.erb
144
181
  - lib/postmortem.rb
145
182
  - lib/postmortem/adapters.rb
146
183
  - lib/postmortem/adapters/action_mailer.rb
@@ -149,6 +186,8 @@ files:
149
186
  - lib/postmortem/adapters/pony.rb
150
187
  - lib/postmortem/configuration.rb
151
188
  - lib/postmortem/delivery.rb
189
+ - lib/postmortem/identity.rb
190
+ - lib/postmortem/index.rb
152
191
  - lib/postmortem/layout.rb
153
192
  - lib/postmortem/plugins/action_mailer.rb
154
193
  - lib/postmortem/plugins/mail.rb
@@ -170,14 +209,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
170
209
  requirements:
171
210
  - - ">="
172
211
  - !ruby/object:Gem::Version
173
- version: 2.3.0
212
+ version: 2.5.0
174
213
  required_rubygems_version: !ruby/object:Gem::Requirement
175
214
  requirements:
176
215
  - - ">="
177
216
  - !ruby/object:Gem::Version
178
217
  version: '0'
179
218
  requirements: []
180
- rubygems_version: 3.1.2
219
+ rubyforge_project:
220
+ rubygems_version: 2.7.6.2
181
221
  signing_key:
182
222
  specification_version: 4
183
223
  summary: Development HTML Email Inspection Tool