Skip to content

Commit be2eb69

Browse files
authored
Merge pull request #741 from calebstewart/master
Add option to disable symbol parsing for ScalarScanner
2 parents 2e4c832 + 4e9d08c commit be2eb69

File tree

5 files changed

+19
-12
lines changed

5 files changed

+19
-12
lines changed

lib/psych.rb

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -269,10 +269,10 @@ module Psych
269269
# YAML documents that are supplied via user input. Instead, please use the
270270
# load method or the safe_load method.
271271
#
272-
def self.unsafe_load yaml, filename: nil, fallback: false, symbolize_names: false, freeze: false, strict_integer: false
272+
def self.unsafe_load yaml, filename: nil, fallback: false, symbolize_names: false, freeze: false, strict_integer: false, parse_symbols: true
273273
result = parse(yaml, filename: filename)
274274
return fallback unless result
275-
result.to_ruby(symbolize_names: symbolize_names, freeze: freeze, strict_integer: strict_integer)
275+
result.to_ruby(symbolize_names: symbolize_names, freeze: freeze, strict_integer: strict_integer, parse_symbols: parse_symbols)
276276
end
277277

278278
###
@@ -320,13 +320,13 @@ def self.unsafe_load yaml, filename: nil, fallback: false, symbolize_names: fals
320320
# Psych.safe_load("---\n foo: bar") # => {"foo"=>"bar"}
321321
# Psych.safe_load("---\n foo: bar", symbolize_names: true) # => {:foo=>"bar"}
322322
#
323-
def self.safe_load yaml, permitted_classes: [], permitted_symbols: [], aliases: false, filename: nil, fallback: nil, symbolize_names: false, freeze: false, strict_integer: false
323+
def self.safe_load yaml, permitted_classes: [], permitted_symbols: [], aliases: false, filename: nil, fallback: nil, symbolize_names: false, freeze: false, strict_integer: false, parse_symbols: true
324324
result = parse(yaml, filename: filename)
325325
return fallback unless result
326326

327327
class_loader = ClassLoader::Restricted.new(permitted_classes.map(&:to_s),
328328
permitted_symbols.map(&:to_s))
329-
scanner = ScalarScanner.new class_loader, strict_integer: strict_integer
329+
scanner = ScalarScanner.new class_loader, strict_integer: strict_integer, parse_symbols: parse_symbols
330330
visitor = if aliases
331331
Visitors::ToRuby.new scanner, class_loader, symbolize_names: symbolize_names, freeze: freeze
332332
else
@@ -366,15 +366,16 @@ def self.safe_load yaml, permitted_classes: [], permitted_symbols: [], aliases:
366366
# Raises a TypeError when `yaml` parameter is NilClass. This method is
367367
# similar to `safe_load` except that `Symbol` objects are allowed by default.
368368
#
369-
def self.load yaml, permitted_classes: [Symbol], permitted_symbols: [], aliases: false, filename: nil, fallback: nil, symbolize_names: false, freeze: false, strict_integer: false
369+
def self.load yaml, permitted_classes: [Symbol], permitted_symbols: [], aliases: false, filename: nil, fallback: nil, symbolize_names: false, freeze: false, strict_integer: false, parse_symbols: true
370370
safe_load yaml, permitted_classes: permitted_classes,
371371
permitted_symbols: permitted_symbols,
372372
aliases: aliases,
373373
filename: filename,
374374
fallback: fallback,
375375
symbolize_names: symbolize_names,
376376
freeze: freeze,
377-
strict_integer: strict_integer
377+
strict_integer: strict_integer,
378+
parse_symbols: parse_symbols
378379
end
379380

380381
###

lib/psych/nodes/node.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,8 @@ def each &block
4545
# Convert this node to Ruby.
4646
#
4747
# See also Psych::Visitors::ToRuby
48-
def to_ruby(symbolize_names: false, freeze: false, strict_integer: false)
49-
Visitors::ToRuby.create(symbolize_names: symbolize_names, freeze: freeze, strict_integer: strict_integer).accept(self)
48+
def to_ruby(symbolize_names: false, freeze: false, strict_integer: false, parse_symbols: true)
49+
Visitors::ToRuby.create(symbolize_names: symbolize_names, freeze: freeze, strict_integer: strict_integer, parse_symbols: true).accept(self)
5050
end
5151
alias :transform :to_ruby
5252

lib/psych/scalar_scanner.rb

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,11 @@ class ScalarScanner
2727
attr_reader :class_loader
2828

2929
# Create a new scanner
30-
def initialize class_loader, strict_integer: false
30+
def initialize class_loader, strict_integer: false, parse_symbols: true
3131
@symbol_cache = {}
3232
@class_loader = class_loader
3333
@strict_integer = strict_integer
34+
@parse_symbols = parse_symbols
3435
end
3536

3637
# Tokenize +string+ returning the Ruby object
@@ -72,7 +73,7 @@ def tokenize string
7273
-Float::INFINITY
7374
elsif string.match?(/^\.nan$/i)
7475
Float::NAN
75-
elsif string.match?(/^:./)
76+
elsif @parse_symbols && string.match?(/^:./)
7677
if string =~ /^:(["'])(.*)\1/
7778
@symbol_cache[string] = class_loader.symbolize($2.sub(/^:/, ''))
7879
else

lib/psych/visitors/to_ruby.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,9 @@ module Visitors
1212
###
1313
# This class walks a YAML AST, converting each node to Ruby
1414
class ToRuby < Psych::Visitors::Visitor
15-
def self.create(symbolize_names: false, freeze: false, strict_integer: false)
15+
def self.create(symbolize_names: false, freeze: false, strict_integer: false, parse_symbols: true)
1616
class_loader = ClassLoader.new
17-
scanner = ScalarScanner.new class_loader, strict_integer: strict_integer
17+
scanner = ScalarScanner.new class_loader, strict_integer: strict_integer, parse_symbols: parse_symbols
1818
new(scanner, class_loader, symbolize_names: symbolize_names, freeze: freeze)
1919
end
2020

test/psych/test_scalar_scanner.rb

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,11 @@ def test_scan_strings_with_strict_int_delimiters
138138
assert_equal '-0b___', scanner.tokenize('-0b___')
139139
end
140140

141+
def test_scan_without_parse_symbols
142+
scanner = Psych::ScalarScanner.new ClassLoader.new, parse_symbols: false
143+
assert_equal ':foo', scanner.tokenize(':foo')
144+
end
145+
141146
def test_scan_int_commas_and_underscores
142147
# NB: This test is to ensure backward compatibility with prior Psych versions,
143148
# not to test against any actual YAML specification.

0 commit comments

Comments
 (0)