postmortem 0.2.0 → 0.2.6
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/.gitignore +2 -0
- data/.rubocop.yml +4 -46
- data/.ruby-version +1 -1
- data/Gemfile +0 -2
- data/Makefile +4 -0
- data/README.md +20 -16
- data/layout/default.html.erb +46 -26
- data/layout/dependencies.css +11 -0
- data/layout/dependencies.js +14 -0
- data/layout/favicon.b64 +1 -0
- data/layout/layout.css +124 -17
- data/layout/layout.js +212 -52
- data/layout/postmortem_identity.html.erb +20 -0
- data/layout/{index.html.erb → postmortem_index.html.erb} +3 -6
- data/lib/postmortem.rb +5 -2
- data/lib/postmortem/adapters.rb +1 -1
- data/lib/postmortem/adapters/action_mailer.rb +6 -41
- data/lib/postmortem/adapters/base.rb +43 -2
- data/lib/postmortem/adapters/mail.rb +3 -3
- data/lib/postmortem/adapters/pony.rb +3 -6
- data/lib/postmortem/configuration.rb +1 -9
- data/lib/postmortem/delivery.rb +9 -15
- data/lib/postmortem/identity.rb +20 -0
- data/lib/postmortem/index.rb +18 -6
- data/lib/postmortem/layout.rb +20 -1
- data/lib/postmortem/plugins/action_mailer.rb +7 -0
- data/lib/postmortem/version.rb +1 -1
- data/postmortem.gemspec +6 -3
- metadata +54 -8
- data/doc/screenshot.png +0 -0
data/lib/postmortem/adapters.rb
CHANGED
@@ -7,53 +7,18 @@ module Postmortem
|
|
7
7
|
private
|
8
8
|
|
9
9
|
def adapted
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
cc: mail.cc,
|
15
|
-
bcc: normalized_bcc,
|
16
|
-
subject: mail.subject,
|
17
|
-
text_body: text_part,
|
18
|
-
html_body: html_part
|
19
|
-
}
|
20
|
-
end
|
21
|
-
|
22
|
-
def text_part
|
23
|
-
return nil unless text?
|
24
|
-
return mail.body.decoded unless mail.text_part
|
25
|
-
|
26
|
-
mail.text_part.decoded
|
27
|
-
end
|
28
|
-
|
29
|
-
def html_part
|
30
|
-
return nil unless html?
|
31
|
-
return mail.body.decoded unless mail.html_part
|
32
|
-
|
33
|
-
mail.html_part.decoded
|
34
|
-
end
|
35
|
-
|
36
|
-
def mail
|
37
|
-
@mail ||= ::Mail.new(@data[:mail])
|
10
|
+
%i[from reply_to to cc subject message_id]
|
11
|
+
.map { |field| [field, mail.public_send(field)] }
|
12
|
+
.to_h
|
13
|
+
.merge({ text_body: text_part, html_body: html_part, bcc: normalized_bcc })
|
38
14
|
end
|
39
15
|
|
40
16
|
def normalized_bcc
|
41
17
|
::Mail.new(to: @data[:bcc]).to
|
42
18
|
end
|
43
19
|
|
44
|
-
def
|
45
|
-
|
46
|
-
return true if mail.content_type.include?('text/plain')
|
47
|
-
return true if mail.multipart? && mail.text_part
|
48
|
-
|
49
|
-
false
|
50
|
-
end
|
51
|
-
|
52
|
-
def html?
|
53
|
-
return true if mail.has_content_type? && mail.content_type.include?('text/html')
|
54
|
-
return true if mail.multipart? && mail.html_part
|
55
|
-
|
56
|
-
false
|
20
|
+
def mail
|
21
|
+
@mail ||= ::Mail.new(@data[:mail])
|
57
22
|
end
|
58
23
|
end
|
59
24
|
end
|
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
module Postmortem
|
4
4
|
module Adapters
|
5
|
-
FIELDS = %i[from reply_to to cc bcc subject text_body html_body].freeze
|
5
|
+
FIELDS = %i[from reply_to to cc bcc subject text_body html_body message_id].freeze
|
6
6
|
|
7
7
|
# Base interface implementation for all Postmortem adapters.
|
8
8
|
class Base
|
@@ -16,7 +16,11 @@ module Postmortem
|
|
16
16
|
end
|
17
17
|
|
18
18
|
def serializable
|
19
|
-
FIELDS.map { |field| [camelize(field.to_s), public_send(field)] }.to_h
|
19
|
+
(%i[id] + FIELDS).map { |field| [camelize(field.to_s), public_send(field)] }.to_h
|
20
|
+
end
|
21
|
+
|
22
|
+
def id
|
23
|
+
@id ||= SecureRandom.uuid
|
20
24
|
end
|
21
25
|
|
22
26
|
FIELDS.each do |method_name|
|
@@ -25,6 +29,14 @@ module Postmortem
|
|
25
29
|
end
|
26
30
|
end
|
27
31
|
|
32
|
+
def html_body
|
33
|
+
@adapted[:html_body].to_s
|
34
|
+
end
|
35
|
+
|
36
|
+
def text_body
|
37
|
+
@adapted[:text_body].to_s
|
38
|
+
end
|
39
|
+
|
28
40
|
private
|
29
41
|
|
30
42
|
def adapted
|
@@ -38,6 +50,35 @@ module Postmortem
|
|
38
50
|
.map { |substring, index| index.zero? ? substring : substring.capitalize }
|
39
51
|
.join
|
40
52
|
end
|
53
|
+
|
54
|
+
def text_part
|
55
|
+
return nil unless text?
|
56
|
+
return mail.body.decoded unless mail.text_part
|
57
|
+
|
58
|
+
mail.text_part.decoded
|
59
|
+
end
|
60
|
+
|
61
|
+
def html_part
|
62
|
+
return nil unless html?
|
63
|
+
return mail.body.decoded unless mail.html_part
|
64
|
+
|
65
|
+
mail.html_part.decoded
|
66
|
+
end
|
67
|
+
|
68
|
+
def text?
|
69
|
+
return true unless mail.has_content_type?
|
70
|
+
return true if mail.content_type.include?('text/plain')
|
71
|
+
return true if mail.multipart? && mail.text_part
|
72
|
+
|
73
|
+
false
|
74
|
+
end
|
75
|
+
|
76
|
+
def html?
|
77
|
+
return true if mail.has_content_type? && mail.content_type.include?('text/html')
|
78
|
+
return true if mail.multipart? && mail.html_part
|
79
|
+
|
80
|
+
false
|
81
|
+
end
|
41
82
|
end
|
42
83
|
end
|
43
84
|
end
|
@@ -7,10 +7,10 @@ module Postmortem
|
|
7
7
|
private
|
8
8
|
|
9
9
|
def adapted
|
10
|
-
%i[from reply_to to cc bcc subject]
|
11
|
-
.map { |field| [field,
|
10
|
+
%i[from reply_to to cc bcc subject message_id]
|
11
|
+
.map { |field| [field, mail.public_send(field)] }
|
12
12
|
.to_h
|
13
|
-
.merge({ text_body:
|
13
|
+
.merge({ text_body: text_part, html_body: html_part })
|
14
14
|
end
|
15
15
|
|
16
16
|
def mail
|
@@ -8,14 +8,11 @@ module Postmortem
|
|
8
8
|
|
9
9
|
def adapted
|
10
10
|
{
|
11
|
-
from: mail.from,
|
12
|
-
reply_to: mail.reply_to,
|
13
|
-
to: mail.to,
|
14
|
-
cc: mail.cc,
|
15
|
-
bcc: mail.bcc,
|
11
|
+
from: mail.from, reply_to: mail.reply_to, to: mail.to, cc: mail.cc, bcc: mail.bcc,
|
16
12
|
subject: mail.subject,
|
17
13
|
text_body: @data[:body],
|
18
|
-
html_body: @data[:html_body]
|
14
|
+
html_body: @data[:html_body],
|
15
|
+
message_id: mail.message_id # We use a synthetic Mail instance so this is a bit useless.
|
19
16
|
}
|
20
17
|
end
|
21
18
|
|
@@ -3,17 +3,9 @@
|
|
3
3
|
module Postmortem
|
4
4
|
# Provides interface for configuring Postmortem and implements sensible defaults.
|
5
5
|
class Configuration
|
6
|
-
attr_writer :colorize, :
|
6
|
+
attr_writer :colorize, :mail_skip_delivery
|
7
7
|
attr_accessor :log_path
|
8
8
|
|
9
|
-
def timestamp
|
10
|
-
defined?(@timestamp) ? @timestamp : true
|
11
|
-
end
|
12
|
-
|
13
|
-
def token
|
14
|
-
defined?(@token) ? @token : true
|
15
|
-
end
|
16
|
-
|
17
9
|
def colorize
|
18
10
|
defined?(@colorize) ? @colorize : true
|
19
11
|
end
|
data/lib/postmortem/delivery.rb
CHANGED
@@ -7,33 +7,27 @@ module Postmortem
|
|
7
7
|
|
8
8
|
def initialize(mail)
|
9
9
|
@mail = mail
|
10
|
-
@path = Postmortem.config.preview_directory.join(
|
11
|
-
@index_path = Postmortem.config.preview_directory.join('
|
10
|
+
@path = Postmortem.config.preview_directory.join('index.html')
|
11
|
+
@index_path = Postmortem.config.preview_directory.join('postmortem_index.html')
|
12
|
+
@identity_path = Postmortem.config.preview_directory.join('postmortem_identity.html')
|
12
13
|
end
|
13
14
|
|
14
15
|
def record
|
15
16
|
path.parent.mkpath
|
16
17
|
content = Layout.new(@mail).content
|
17
18
|
path.write(content)
|
18
|
-
index_path.write(
|
19
|
+
index_path.write(index.content)
|
20
|
+
@identity_path.write(identity.content)
|
19
21
|
end
|
20
22
|
|
21
23
|
private
|
22
24
|
|
23
|
-
def
|
24
|
-
|
25
|
-
timestamp_chunk = Postmortem.config.timestamp ? "#{timestamp.strftime(format)}__" : nil
|
26
|
-
token_chunk = Postmortem.config.token ? "#{token}__" : nil
|
27
|
-
|
28
|
-
"#{timestamp_chunk}#{token_chunk}#{safe_subject}.html"
|
29
|
-
end
|
30
|
-
|
31
|
-
def timestamp
|
32
|
-
@timestamp ||= Time.now
|
25
|
+
def index
|
26
|
+
@index ||= Index.new(index_path, path, @mail)
|
33
27
|
end
|
34
28
|
|
35
|
-
def
|
36
|
-
|
29
|
+
def identity
|
30
|
+
@identity ||= Identity.new
|
37
31
|
end
|
38
32
|
|
39
33
|
def subject
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Postmortem
|
4
|
+
# Provides an HTML document that announces a unique ID to a parent page via JS message events.
|
5
|
+
class Identity
|
6
|
+
def content
|
7
|
+
ERB.new(File.read(path), nil, '-').result(binding)
|
8
|
+
end
|
9
|
+
|
10
|
+
private
|
11
|
+
|
12
|
+
def uuid
|
13
|
+
@uuid ||= SecureRandom.uuid
|
14
|
+
end
|
15
|
+
|
16
|
+
def path
|
17
|
+
File.expand_path(File.join(__dir__, '..', '..', 'layout', 'postmortem_identity.html.erb'))
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
data/lib/postmortem/index.rb
CHANGED
@@ -3,10 +3,9 @@
|
|
3
3
|
module Postmortem
|
4
4
|
# Generates and parses an index of previously-sent emails.
|
5
5
|
class Index
|
6
|
-
def initialize(index_path, mail_path,
|
6
|
+
def initialize(index_path, mail_path, mail)
|
7
7
|
@index_path = index_path
|
8
8
|
@mail_path = mail_path
|
9
|
-
@timestamp = timestamp.iso8601
|
10
9
|
@mail = mail
|
11
10
|
end
|
12
11
|
|
@@ -15,23 +14,36 @@ module Postmortem
|
|
15
14
|
ERB.new(File.read(template_path), nil, '-').result(binding)
|
16
15
|
end
|
17
16
|
|
17
|
+
def size
|
18
|
+
encoded_index.size
|
19
|
+
end
|
20
|
+
|
18
21
|
private
|
19
22
|
|
23
|
+
def uuid
|
24
|
+
@uuid ||= SecureRandom.uuid
|
25
|
+
end
|
26
|
+
|
27
|
+
def timestamp
|
28
|
+
Time.now.iso8601
|
29
|
+
end
|
30
|
+
|
20
31
|
def encoded_index
|
21
32
|
return [encoded_mail] unless @index_path.file?
|
22
33
|
|
23
|
-
[encoded_mail] + lines[index(:start)..index(:end)]
|
34
|
+
@encoded_index ||= [encoded_mail] + lines[index(:start)..index(:end)]
|
24
35
|
end
|
25
36
|
|
26
37
|
def encoded_mail
|
27
|
-
Base64.
|
38
|
+
Base64.encode64(mail_data.to_json).split("\n").join
|
28
39
|
end
|
29
40
|
|
30
41
|
def mail_data
|
31
42
|
{
|
32
43
|
subject: @mail.subject || '(no subject)',
|
33
|
-
timestamp:
|
44
|
+
timestamp: timestamp,
|
34
45
|
path: @mail_path,
|
46
|
+
id: @mail.id,
|
35
47
|
content: @mail.serializable
|
36
48
|
}
|
37
49
|
end
|
@@ -50,7 +62,7 @@ module Postmortem
|
|
50
62
|
end
|
51
63
|
|
52
64
|
def template_path
|
53
|
-
File.expand_path(File.join(__dir__, '..', '..', 'layout', '
|
65
|
+
File.expand_path(File.join(__dir__, '..', '..', 'layout', 'postmortem_index.html.erb'))
|
54
66
|
end
|
55
67
|
end
|
56
68
|
end
|
data/lib/postmortem/layout.rb
CHANGED
@@ -25,10 +25,22 @@ module Postmortem
|
|
25
25
|
default_layout_directory.join('layout.js').read
|
26
26
|
end
|
27
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
|
+
|
28
36
|
def headers_template
|
29
37
|
default_layout_directory.join('headers_template.html').read
|
30
38
|
end
|
31
39
|
|
40
|
+
def favicon_b64
|
41
|
+
default_layout_directory.join('favicon.b64').read
|
42
|
+
end
|
43
|
+
|
32
44
|
private
|
33
45
|
|
34
46
|
def default_layout_directory
|
@@ -38,7 +50,7 @@ module Postmortem
|
|
38
50
|
def with_inlined_images(body)
|
39
51
|
parsed = Nokogiri::HTML.parse(body)
|
40
52
|
parsed.css('img').each do |img|
|
41
|
-
uri =
|
53
|
+
uri = try_uri(img['src'])
|
42
54
|
next unless local_file?(uri)
|
43
55
|
|
44
56
|
path = located_image(uri)
|
@@ -48,6 +60,7 @@ module Postmortem
|
|
48
60
|
end
|
49
61
|
|
50
62
|
def local_file?(uri)
|
63
|
+
return false if uri.nil?
|
51
64
|
return true if uri.host.nil?
|
52
65
|
return true if /^www\.example\.[a-z]+$/.match(uri.host)
|
53
66
|
return true if %w[127.0.0.1 localhost].include?(uri.host)
|
@@ -55,6 +68,12 @@ module Postmortem
|
|
55
68
|
false
|
56
69
|
end
|
57
70
|
|
71
|
+
def try_uri(uri)
|
72
|
+
URI(uri)
|
73
|
+
rescue URI::InvalidURIError
|
74
|
+
nil
|
75
|
+
end
|
76
|
+
|
58
77
|
def located_image(uri)
|
59
78
|
path = uri.path.partition('/').last
|
60
79
|
common_locations.each do |location|
|
@@ -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
|
data/lib/postmortem/version.rb
CHANGED
data/postmortem.gemspec
CHANGED
@@ -12,14 +12,14 @@ 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.
|
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
|
19
19
|
spec.metadata['changelog_uri'] = 'https://github.com/bobf/postmortem/blob/master/README.md'
|
20
20
|
|
21
21
|
spec.files = Dir.chdir(File.expand_path(__dir__)) do
|
22
|
-
`git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
22
|
+
`git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features|doc)/}) }
|
23
23
|
end
|
24
24
|
spec.bindir = 'bin'
|
25
25
|
spec.executables = []
|
@@ -28,10 +28,13 @@ 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'
|
32
|
+
spec.add_development_dependency 'faker', '~> 2.17'
|
31
33
|
spec.add_development_dependency 'pony', '~> 1.13'
|
32
34
|
spec.add_development_dependency 'rspec', '~> 3.9'
|
33
35
|
spec.add_development_dependency 'rspec-its', '~> 1.3'
|
34
|
-
spec.add_development_dependency 'rubocop', '~>
|
36
|
+
spec.add_development_dependency 'rubocop', '~> 1.10'
|
37
|
+
spec.add_development_dependency 'rubocop-rspec', '~> 2.2'
|
35
38
|
spec.add_development_dependency 'strong_versions', '~> 0.4.5'
|
36
39
|
spec.add_development_dependency 'timecop', '~> 0.9.1'
|
37
40
|
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.2.
|
4
|
+
version: 0.2.6
|
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-
|
11
|
+
date: 2021-03-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: mail
|
@@ -38,6 +38,34 @@ 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
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: faker
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '2.17'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '2.17'
|
41
69
|
- !ruby/object:Gem::Dependency
|
42
70
|
name: pony
|
43
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -86,14 +114,28 @@ dependencies:
|
|
86
114
|
requirements:
|
87
115
|
- - "~>"
|
88
116
|
- !ruby/object:Gem::Version
|
89
|
-
version:
|
117
|
+
version: '1.10'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - "~>"
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '1.10'
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: rubocop-rspec
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - "~>"
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '2.2'
|
90
132
|
type: :development
|
91
133
|
prerelease: false
|
92
134
|
version_requirements: !ruby/object:Gem::Requirement
|
93
135
|
requirements:
|
94
136
|
- - "~>"
|
95
137
|
- !ruby/object:Gem::Version
|
96
|
-
version:
|
138
|
+
version: '2.2'
|
97
139
|
- !ruby/object:Gem::Dependency
|
98
140
|
name: strong_versions
|
99
141
|
requirement: !ruby/object:Gem::Requirement
|
@@ -140,12 +182,15 @@ files:
|
|
140
182
|
- Rakefile
|
141
183
|
- bin/console
|
142
184
|
- bin/setup
|
143
|
-
- doc/screenshot.png
|
144
185
|
- layout/default.html.erb
|
186
|
+
- layout/dependencies.css
|
187
|
+
- layout/dependencies.js
|
188
|
+
- layout/favicon.b64
|
145
189
|
- layout/headers_template.html
|
146
|
-
- layout/index.html.erb
|
147
190
|
- layout/layout.css
|
148
191
|
- layout/layout.js
|
192
|
+
- layout/postmortem_identity.html.erb
|
193
|
+
- layout/postmortem_index.html.erb
|
149
194
|
- lib/postmortem.rb
|
150
195
|
- lib/postmortem/adapters.rb
|
151
196
|
- lib/postmortem/adapters/action_mailer.rb
|
@@ -154,6 +199,7 @@ files:
|
|
154
199
|
- lib/postmortem/adapters/pony.rb
|
155
200
|
- lib/postmortem/configuration.rb
|
156
201
|
- lib/postmortem/delivery.rb
|
202
|
+
- lib/postmortem/identity.rb
|
157
203
|
- lib/postmortem/index.rb
|
158
204
|
- lib/postmortem/layout.rb
|
159
205
|
- lib/postmortem/plugins/action_mailer.rb
|
@@ -176,7 +222,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
176
222
|
requirements:
|
177
223
|
- - ">="
|
178
224
|
- !ruby/object:Gem::Version
|
179
|
-
version: 2.
|
225
|
+
version: 2.5.0
|
180
226
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
181
227
|
requirements:
|
182
228
|
- - ">="
|
@@ -184,7 +230,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
184
230
|
version: '0'
|
185
231
|
requirements: []
|
186
232
|
rubyforge_project:
|
187
|
-
rubygems_version: 2.7.6
|
233
|
+
rubygems_version: 2.7.6.2
|
188
234
|
signing_key:
|
189
235
|
specification_version: 4
|
190
236
|
summary: Development HTML Email Inspection Tool
|