Skip to content

Commit e8acae9

Browse files
committed
re-add support for loading aliases in yaml files
Ruby 3.1 includes Psych 4.0 which no longer loads aliases by default. Since aliases are part of the yaml spec, it seems sensible to re-add support.
1 parent 928ca48 commit e8acae9

File tree

2 files changed

+47
-8
lines changed

2 files changed

+47
-8
lines changed

lib/puppet/parser/functions/loadyaml.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,9 +49,9 @@ module Puppet::Parser::Functions
4949
warning("Can't load '#{url}' HTTP Error Code: '#{res.status[0]}'")
5050
args[1]
5151
end
52-
YAML.safe_load(contents) || args[1]
52+
YAML.safe_load(contents, aliases: true) || args[1]
5353
elsif File.exist?(args[0])
54-
YAML.load_file(args[0]) || args[1]
54+
YAML.load_file(args[0], aliases: true) || args[1]
5555
else
5656
warning("Can't load '#{args[0]}' File does not exist!")
5757
args[1]

spec/functions/loadyaml_spec.rb

Lines changed: 45 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
it "returns 'key' => 'value', 'ķęŷ' => 'νậŀųề', 'キー' => '値'" do
2525
allow(File).to receive(:exist?).and_call_original
2626
expect(File).to receive(:exist?).with(filename).and_return(true).once
27-
expect(YAML).to receive(:load_file).with(filename).and_return(data).once
27+
expect(YAML).to receive(:load_file).with(filename, aliases: true).and_return(data).once
2828
expect(subject).to run.with_params(filename).and_return(data)
2929
end
3030
end
@@ -35,7 +35,7 @@
3535
it 'filename /tmp/doesexist' do
3636
allow(File).to receive(:exist?).and_call_original
3737
expect(File).to receive(:exist?).with(filename).and_return(true).once
38-
allow(YAML).to receive(:load_file).with(filename).once.and_raise(StandardError, 'Something terrible have happened!')
38+
allow(YAML).to receive(:load_file).with(filename, aliases: true).once.and_raise(StandardError, 'Something terrible have happened!')
3939
expect(subject).to run.with_params(filename, 'default' => 'value').and_return('default' => 'value')
4040
end
4141
end
@@ -48,7 +48,7 @@
4848

4949
it {
5050
expect(OpenURI).to receive(:open_uri).with(filename, basic_auth).and_return(yaml)
51-
expect(YAML).to receive(:safe_load).with(yaml).and_return(data).once
51+
expect(YAML).to receive(:safe_load).with(yaml, aliases: true).and_return(data).once
5252
expect(subject).to run.with_params(filename).and_return(data)
5353
}
5454
end
@@ -62,7 +62,7 @@
6262

6363
it {
6464
expect(OpenURI).to receive(:open_uri).with(url_no_auth, basic_auth).and_return(yaml)
65-
expect(YAML).to receive(:safe_load).with(yaml).and_return(data).once
65+
expect(YAML).to receive(:safe_load).with(yaml, aliases: true).and_return(data).once
6666
expect(subject).to run.with_params(filename).and_return(data)
6767
}
6868
end
@@ -76,7 +76,7 @@
7676

7777
it {
7878
expect(OpenURI).to receive(:open_uri).with(url_no_auth, basic_auth).and_return(yaml)
79-
expect(YAML).to receive(:safe_load).with(yaml).and_return(data).once
79+
expect(YAML).to receive(:safe_load).with(yaml, aliases: true).and_return(data).once
8080
expect(subject).to run.with_params(filename).and_return(data)
8181
}
8282
end
@@ -88,7 +88,7 @@
8888

8989
it {
9090
expect(OpenURI).to receive(:open_uri).with(filename, basic_auth).and_return(yaml)
91-
expect(YAML).to receive(:safe_load).with(yaml).and_raise StandardError, 'Cannot parse data'
91+
expect(YAML).to receive(:safe_load).with(yaml, aliases: true).and_raise StandardError, 'Cannot parse data'
9292
expect(subject).to run.with_params(filename, 'default' => 'value').and_return('default' => 'value')
9393
}
9494
end
@@ -103,4 +103,43 @@
103103
expect(subject).to run.with_params(filename, 'default' => 'value').and_return('default' => 'value')
104104
}
105105
end
106+
107+
context 'when the file contains aliases' do
108+
let(:tempfile) { Tempfile.new }
109+
let(:filename) { tempfile.path }
110+
let(:yaml) do
111+
<<~YAML
112+
some_numbers: &nums
113+
- one
114+
- two
115+
more_numbers: *nums
116+
YAML
117+
end
118+
let(:data) { { 'some_numbers' => ['one', 'two'], 'more_numbers' => ['one', 'two'] } }
119+
120+
it 'parses the aliases' do
121+
tempfile.write(yaml)
122+
tempfile.rewind
123+
expect(subject).to run.with_params(filename).and_return(data)
124+
end
125+
end
126+
127+
context 'when an URL returns yaml with aliases' do
128+
let(:filename) { 'https://example.local/myhash.yaml' }
129+
let(:basic_auth) { { http_basic_authentication: ['', ''] } }
130+
let(:yaml) do
131+
<<~YAML
132+
some_numbers: &nums
133+
- one
134+
- two
135+
more_numbers: *nums
136+
YAML
137+
end
138+
let(:data) { { 'some_numbers' => ['one', 'two'], 'more_numbers' => ['one', 'two'] } }
139+
140+
it {
141+
expect(OpenURI).to receive(:open_uri).with(filename, basic_auth).and_return(yaml)
142+
expect(subject).to run.with_params(filename).and_return(data)
143+
}
144+
end
106145
end

0 commit comments

Comments
 (0)