Skip to content

Commit

Permalink
Add Mail::YAML#load compatible with Psych 3.x and Psych 4.x.
Browse files Browse the repository at this point in the history
Co-authored-by: Vít Ondruch <[email protected]>
  • Loading branch information
2 people authored and deivid-rodriguez committed Apr 19, 2022
1 parent c08d569 commit a20fdd5
Show file tree
Hide file tree
Showing 5 changed files with 50 additions and 7 deletions.
4 changes: 2 additions & 2 deletions lib/mail/message.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
# frozen_string_literal: true
require 'mail/constants'
require 'mail/utilities'
require 'yaml'
require 'mail/yaml'

module Mail
# The Message class provides a single point of access to all things to do with an
Expand Down Expand Up @@ -1841,7 +1841,7 @@ def to_yaml(opts = {})
end

def self.from_yaml(str)
hash = YAML.load(str)
hash = Mail::YAML.load(str)
m = self.new(:headers => hash['headers'])
hash.delete('headers')
hash.each do |k,v|
Expand Down
30 changes: 30 additions & 0 deletions lib/mail/yaml.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
require 'yaml'

module Mail
module YAML
def self.load(yaml)
permitted_classes = [
Symbol,

Mail::Body,

# Delivery methods as listed in mail/configuration.rb
Mail::SMTP,
Mail::Sendmail,
Mail::Exim,
Mail::FileDelivery,
Mail::SMTPConnection,
Mail::TestMailer,
Mail::LoggerDelivery,

Mail.delivery_method.class,
]

if Gem::Version.new(Psych::VERSION) >= Gem::Version.new('3.1.0.pre1')
::YAML.safe_load(yaml, :permitted_classes => permitted_classes)
else
::YAML.safe_load(yaml, permitted_classes)
end
end
end
end
8 changes: 4 additions & 4 deletions spec/mail/message_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -194,7 +194,7 @@ def create_mail_with_splat_args

it "should serialize the basic information to YAML" do
yaml = @yaml_mail.to_yaml
yaml_output = YAML.load(yaml)
yaml_output = Mail::YAML.load(yaml)
expect(yaml_output['headers']['To']).to eq "[email protected]"
expect(yaml_output['headers']['Cc']).to eq "[email protected]"
expect(yaml_output['headers']['Subject']).to eq "subject"
Expand All @@ -212,7 +212,7 @@ def create_mail_with_splat_args
it "should serialize a Message with a custom delivery_handler" do
@yaml_mail.delivery_handler = DeliveryAgent
yaml = @yaml_mail.to_yaml
yaml_output = YAML.load(yaml)
yaml_output = Mail::YAML.load(yaml)
expect(yaml_output['delivery_handler']).to eq "DeliveryAgent"
end

Expand All @@ -224,15 +224,15 @@ def create_mail_with_splat_args

it "should not deserialize a delivery_handler that does not exist" do
yaml = @yaml_mail.to_yaml
yaml_hash = YAML.load(yaml)
yaml_hash = Mail::YAML.load(yaml)
yaml_hash['delivery_handler'] = "NotARealClass"
deserialized = Mail::Message.from_yaml(yaml_hash.to_yaml)
expect(deserialized.delivery_handler).to be_nil
end

it "should deserialize parts as an instance of Mail::PartsList" do
yaml = @yaml_mail.to_yaml
yaml_hash = YAML.load(yaml)
yaml_hash = Mail::YAML.load(yaml)
deserialized = Mail::Message.from_yaml(yaml_hash.to_yaml)
expect(deserialized.parts).to be_kind_of(Mail::PartsList)
end
Expand Down
2 changes: 1 addition & 1 deletion spec/mail/parts_list_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,6 @@

it "should have a round-tripping YAML serialization" do
p = Mail::PartsList.new([1, 2])
expect(YAML.load(YAML.dump(p))).to eq(p)
expect(Mail::YAML.load(YAML.dump(p))).to eq(p)
end
end
13 changes: 13 additions & 0 deletions spec/mail/yaml_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
# encoding: utf-8
# frozen_string_literal: true
require 'spec_helper'

describe Mail::YAML do

describe "#load" do

it 'loads YAML' do
expect(Mail::YAML.load('{}')).to eq({})
end
end
end

0 comments on commit a20fdd5

Please sign in to comment.