psych 3.3.2 → 5.2.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CONTRIBUTING.md +24 -0
- data/README.md +6 -5
- data/ext/psych/depend +13 -1
- data/ext/psych/extconf.rb +40 -30
- data/ext/psych/psych.c +1 -1
- data/ext/psych/psych_emitter.c +155 -120
- data/ext/psych/psych_parser.c +267 -281
- data/lib/psych/class_loader.rb +5 -5
- data/lib/psych/core_ext.rb +1 -1
- data/lib/psych/exception.rb +16 -2
- data/lib/psych/handlers/document_stream.rb +1 -1
- data/lib/psych/handlers/recorder.rb +1 -1
- data/lib/psych/json/stream.rb +2 -2
- data/lib/psych/json/tree_builder.rb +1 -1
- data/lib/psych/nodes/node.rb +5 -5
- data/lib/psych/nodes.rb +7 -7
- data/lib/psych/parser.rb +13 -0
- data/lib/psych/scalar_scanner.rb +24 -19
- data/lib/psych/syntax_error.rb +1 -1
- data/lib/psych/tree_builder.rb +3 -3
- data/lib/psych/versions.rb +2 -2
- data/lib/psych/visitors/json_tree.rb +1 -1
- data/lib/psych/visitors/to_ruby.rb +12 -11
- data/lib/psych/visitors/yaml_tree.rb +71 -27
- data/lib/psych/visitors.rb +6 -6
- data/lib/psych.rb +204 -106
- metadata +37 -25
- data/.gitignore +0 -16
- data/Gemfile +0 -9
- data/Mavenfile +0 -7
- data/Rakefile +0 -41
- data/bin/console +0 -7
- data/bin/setup +0 -6
- data/ext/psych/yaml/LICENSE +0 -19
- data/ext/psych/yaml/api.c +0 -1393
- data/ext/psych/yaml/config.h +0 -80
- data/ext/psych/yaml/dumper.c +0 -394
- data/ext/psych/yaml/emitter.c +0 -2358
- data/ext/psych/yaml/loader.c +0 -544
- data/ext/psych/yaml/parser.c +0 -1375
- data/ext/psych/yaml/reader.c +0 -469
- data/ext/psych/yaml/scanner.c +0 -3598
- data/ext/psych/yaml/writer.c +0 -141
- data/ext/psych/yaml/yaml.h +0 -1985
- data/ext/psych/yaml/yaml_private.h +0 -688
- data/psych.gemspec +0 -67
data/lib/psych/core_ext.rb
CHANGED
data/lib/psych/exception.rb
CHANGED
@@ -6,9 +6,23 @@ module Psych
|
|
6
6
|
class BadAlias < Exception
|
7
7
|
end
|
8
8
|
|
9
|
+
# Subclasses `BadAlias` for backwards compatibility
|
10
|
+
class AliasesNotEnabled < BadAlias
|
11
|
+
def initialize
|
12
|
+
super "Alias parsing was not enabled. To enable it, pass `aliases: true` to `Psych::load` or `Psych::safe_load`."
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
# Subclasses `BadAlias` for backwards compatibility
|
17
|
+
class AnchorNotDefined < BadAlias
|
18
|
+
def initialize anchor_name
|
19
|
+
super "An alias referenced an unknown anchor: #{anchor_name}"
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
9
23
|
class DisallowedClass < Exception
|
10
|
-
def initialize klass_name
|
11
|
-
super "Tried to
|
24
|
+
def initialize action, klass_name
|
25
|
+
super "Tried to #{action} unspecified class: #{klass_name}"
|
12
26
|
end
|
13
27
|
end
|
14
28
|
end
|
data/lib/psych/json/stream.rb
CHANGED
data/lib/psych/nodes/node.rb
CHANGED
@@ -1,7 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
-
|
3
|
-
|
4
|
-
require 'psych/scalar_scanner'
|
2
|
+
require_relative '../class_loader'
|
3
|
+
require_relative '../scalar_scanner'
|
5
4
|
|
6
5
|
module Psych
|
7
6
|
module Nodes
|
@@ -46,8 +45,8 @@ module Psych
|
|
46
45
|
# Convert this node to Ruby.
|
47
46
|
#
|
48
47
|
# See also Psych::Visitors::ToRuby
|
49
|
-
def to_ruby(symbolize_names: false, freeze: false)
|
50
|
-
Visitors::ToRuby.create(symbolize_names: symbolize_names, freeze: freeze).accept(self)
|
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)
|
51
50
|
end
|
52
51
|
alias :transform :to_ruby
|
53
52
|
|
@@ -56,6 +55,7 @@ module Psych
|
|
56
55
|
#
|
57
56
|
# See also Psych::Visitors::Emitter
|
58
57
|
def yaml io = nil, options = {}
|
58
|
+
require "stringio"
|
59
59
|
real_io = io || StringIO.new(''.encode('utf-8'))
|
60
60
|
|
61
61
|
Visitors::Emitter.new(real_io, options).accept self
|
data/lib/psych/nodes.rb
CHANGED
@@ -1,11 +1,11 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
2
|
+
require_relative 'nodes/node'
|
3
|
+
require_relative 'nodes/stream'
|
4
|
+
require_relative 'nodes/document'
|
5
|
+
require_relative 'nodes/sequence'
|
6
|
+
require_relative 'nodes/scalar'
|
7
|
+
require_relative 'nodes/mapping'
|
8
|
+
require_relative 'nodes/alias'
|
9
9
|
|
10
10
|
module Psych
|
11
11
|
###
|
data/lib/psych/parser.rb
CHANGED
@@ -48,5 +48,18 @@ module Psych
|
|
48
48
|
@handler = handler
|
49
49
|
@external_encoding = ANY
|
50
50
|
end
|
51
|
+
|
52
|
+
###
|
53
|
+
# call-seq:
|
54
|
+
# parser.parse(yaml)
|
55
|
+
#
|
56
|
+
# Parse the YAML document contained in +yaml+. Events will be called on
|
57
|
+
# the handler set on the parser instance.
|
58
|
+
#
|
59
|
+
# See Psych::Parser and Psych::Parser#handler
|
60
|
+
|
61
|
+
def parse yaml, path = yaml.respond_to?(:path) ? yaml.path : "<unknown>"
|
62
|
+
_native_parse @handler, yaml, path
|
63
|
+
end
|
51
64
|
end
|
52
65
|
end
|
data/lib/psych/scalar_scanner.rb
CHANGED
@@ -1,5 +1,4 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
-
require 'strscan'
|
3
2
|
|
4
3
|
module Psych
|
5
4
|
###
|
@@ -9,32 +8,39 @@ module Psych
|
|
9
8
|
TIME = /^-?\d{4}-\d{1,2}-\d{1,2}(?:[Tt]|\s+)\d{1,2}:\d\d:\d\d(?:\.\d*)?(?:\s*(?:Z|[-+]\d{1,2}:?(?:\d\d)?))?$/
|
10
9
|
|
11
10
|
# Taken from http://yaml.org/type/float.html
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
11
|
+
# Base 60, [-+]inf and NaN are handled separately
|
12
|
+
FLOAT = /^(?:[-+]?([0-9][0-9_,]*)?\.[0-9]*([eE][-+][0-9]+)?(?# base 10))$/x
|
13
|
+
|
14
|
+
# Taken from http://yaml.org/type/int.html and modified to ensure at least one numerical symbol exists
|
15
|
+
INTEGER_STRICT = /^(?:[-+]?0b[_]*[0-1][0-1_]* (?# base 2)
|
16
|
+
|[-+]?0[_]*[0-7][0-7_]* (?# base 8)
|
17
|
+
|[-+]?(0|[1-9][0-9_]*) (?# base 10)
|
18
|
+
|[-+]?0x[_]*[0-9a-fA-F][0-9a-fA-F_]* (?# base 16))$/x
|
19
|
+
|
20
|
+
# Same as above, but allows commas.
|
21
|
+
# Not to YML spec, but kept for backwards compatibility
|
22
|
+
INTEGER_LEGACY = /^(?:[-+]?0b[_,]*[0-1][0-1_,]* (?# base 2)
|
23
|
+
|[-+]?0[_,]*[0-7][0-7_,]* (?# base 8)
|
24
|
+
|[-+]?(?:0|[1-9](?:[0-9]|,[0-9]|_[0-9])*) (?# base 10)
|
25
|
+
|[-+]?0x[_,]*[0-9a-fA-F][0-9a-fA-F_,]* (?# base 16))$/x
|
21
26
|
|
22
27
|
attr_reader :class_loader
|
23
28
|
|
24
29
|
# Create a new scanner
|
25
|
-
def initialize class_loader
|
30
|
+
def initialize class_loader, strict_integer: false
|
26
31
|
@symbol_cache = {}
|
27
32
|
@class_loader = class_loader
|
33
|
+
@strict_integer = strict_integer
|
28
34
|
end
|
29
35
|
|
30
36
|
# Tokenize +string+ returning the Ruby object
|
31
37
|
def tokenize string
|
32
38
|
return nil if string.empty?
|
33
39
|
return @symbol_cache[string] if @symbol_cache.key?(string)
|
34
|
-
|
40
|
+
integer_regex = @strict_integer ? INTEGER_STRICT : INTEGER_LEGACY
|
35
41
|
# Check for a String type, being careful not to get caught by hash keys, hex values, and
|
36
42
|
# special floats (e.g., -.inf).
|
37
|
-
if string.match?(
|
43
|
+
if string.match?(%r{^[^\d.:-]?[[:alpha:]_\s!@#$%\^&*(){}<>|/\\~;=]+}) || string.match?(/\n/)
|
38
44
|
return string if string.length > 5
|
39
45
|
|
40
46
|
if string.match?(/^[^ytonf~]/i)
|
@@ -55,13 +61,12 @@ module Psych
|
|
55
61
|
string
|
56
62
|
end
|
57
63
|
elsif string.match?(/^\d{4}-(?:1[012]|0\d|\d)-(?:[12]\d|3[01]|0\d|\d)$/)
|
58
|
-
require 'date'
|
59
64
|
begin
|
60
|
-
class_loader.date.strptime(string, '%
|
65
|
+
class_loader.date.strptime(string, '%F', Date::GREGORIAN)
|
61
66
|
rescue ArgumentError
|
62
67
|
string
|
63
68
|
end
|
64
|
-
elsif string.match?(
|
69
|
+
elsif string.match?(/^\+?\.inf$/i)
|
65
70
|
Float::INFINITY
|
66
71
|
elsif string.match?(/^-\.inf$/i)
|
67
72
|
-Float::INFINITY
|
@@ -89,9 +94,9 @@ module Psych
|
|
89
94
|
if string.match?(/\A[-+]?\.\Z/)
|
90
95
|
string
|
91
96
|
else
|
92
|
-
Float(string.
|
97
|
+
Float(string.delete(',_').gsub(/\.([Ee]|$)/, '\1'))
|
93
98
|
end
|
94
|
-
elsif string.match?(
|
99
|
+
elsif string.match?(integer_regex)
|
95
100
|
parse_int string
|
96
101
|
else
|
97
102
|
string
|
@@ -101,7 +106,7 @@ module Psych
|
|
101
106
|
###
|
102
107
|
# Parse and return an int from +string+
|
103
108
|
def parse_int string
|
104
|
-
Integer(string.
|
109
|
+
Integer(string.delete(',_'))
|
105
110
|
end
|
106
111
|
|
107
112
|
###
|
data/lib/psych/syntax_error.rb
CHANGED
data/lib/psych/tree_builder.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
-
|
2
|
+
require_relative 'handler'
|
3
3
|
|
4
4
|
module Psych
|
5
5
|
###
|
@@ -41,7 +41,7 @@ module Psych
|
|
41
41
|
Sequence
|
42
42
|
Mapping
|
43
43
|
}.each do |node|
|
44
|
-
class_eval
|
44
|
+
class_eval <<~RUBY, __FILE__, __LINE__ + 1
|
45
45
|
def start_#{node.downcase}(anchor, tag, implicit, style)
|
46
46
|
n = Nodes::#{node}.new(anchor, tag, implicit, style)
|
47
47
|
set_start_location(n)
|
@@ -54,7 +54,7 @@ module Psych
|
|
54
54
|
set_end_location(n)
|
55
55
|
n
|
56
56
|
end
|
57
|
-
|
57
|
+
RUBY
|
58
58
|
end
|
59
59
|
|
60
60
|
###
|
data/lib/psych/versions.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
-
|
3
|
-
|
4
|
-
|
2
|
+
require_relative '../scalar_scanner'
|
3
|
+
require_relative '../class_loader'
|
4
|
+
require_relative '../exception'
|
5
5
|
|
6
6
|
unless defined?(Regexp::NOENCODING)
|
7
7
|
Regexp::NOENCODING = 32
|
@@ -12,9 +12,9 @@ module Psych
|
|
12
12
|
###
|
13
13
|
# This class walks a YAML AST, converting each node to Ruby
|
14
14
|
class ToRuby < Psych::Visitors::Visitor
|
15
|
-
def self.create(symbolize_names: false, freeze: false)
|
15
|
+
def self.create(symbolize_names: false, freeze: false, strict_integer: false)
|
16
16
|
class_loader = ClassLoader.new
|
17
|
-
scanner = ScalarScanner.new class_loader
|
17
|
+
scanner = ScalarScanner.new class_loader, strict_integer: strict_integer
|
18
18
|
new(scanner, class_loader, symbolize_names: symbolize_names, freeze: freeze)
|
19
19
|
end
|
20
20
|
|
@@ -36,7 +36,7 @@ module Psych
|
|
36
36
|
|
37
37
|
unless @domain_types.empty? || !target.tag
|
38
38
|
key = target.tag.sub(/^[!\/]*/, '').sub(/(,\d+)\//, '\1:')
|
39
|
-
key = "tag:#{key}" unless key
|
39
|
+
key = "tag:#{key}" unless key.match?(/^(?:tag:|x-private)/)
|
40
40
|
|
41
41
|
if @domain_types.key? key
|
42
42
|
value, block = @domain_types[key]
|
@@ -79,8 +79,9 @@ module Psych
|
|
79
79
|
class_loader.big_decimal._load o.value
|
80
80
|
when "!ruby/object:DateTime"
|
81
81
|
class_loader.date_time
|
82
|
-
|
83
|
-
|
82
|
+
t = @ss.parse_time(o.value)
|
83
|
+
DateTime.civil(*t.to_a[0, 6].reverse, Rational(t.utc_offset, 86400)) +
|
84
|
+
(t.subsec/86400)
|
84
85
|
when '!ruby/encoding'
|
85
86
|
::Encoding.find o.value
|
86
87
|
when "!ruby/object:Complex"
|
@@ -99,7 +100,7 @@ module Psych
|
|
99
100
|
source = $1
|
100
101
|
options = 0
|
101
102
|
lang = nil
|
102
|
-
|
103
|
+
$2&.each_char do |option|
|
103
104
|
case option
|
104
105
|
when 'x' then options |= Regexp::EXTENDED
|
105
106
|
when 'i' then options |= Regexp::IGNORECASE
|
@@ -323,7 +324,7 @@ module Psych
|
|
323
324
|
end
|
324
325
|
|
325
326
|
def visit_Psych_Nodes_Alias o
|
326
|
-
@st.fetch(o.anchor) { raise
|
327
|
+
@st.fetch(o.anchor) { raise AnchorNotDefined, o.anchor }
|
327
328
|
end
|
328
329
|
|
329
330
|
private
|
@@ -427,7 +428,7 @@ module Psych
|
|
427
428
|
|
428
429
|
class NoAliasRuby < ToRuby
|
429
430
|
def visit_Psych_Nodes_Alias o
|
430
|
-
raise
|
431
|
+
raise AliasesNotEnabled
|
431
432
|
end
|
432
433
|
end
|
433
434
|
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
-
|
3
|
-
|
4
|
-
|
2
|
+
require_relative '../tree_builder'
|
3
|
+
require_relative '../scalar_scanner'
|
4
|
+
require_relative '../class_loader'
|
5
5
|
|
6
6
|
module Psych
|
7
7
|
module Visitors
|
@@ -15,30 +15,25 @@ module Psych
|
|
15
15
|
class YAMLTree < Psych::Visitors::Visitor
|
16
16
|
class Registrar # :nodoc:
|
17
17
|
def initialize
|
18
|
-
@obj_to_id = {}
|
19
|
-
@obj_to_node = {}
|
20
|
-
@targets = []
|
18
|
+
@obj_to_id = {}.compare_by_identity
|
19
|
+
@obj_to_node = {}.compare_by_identity
|
21
20
|
@counter = 0
|
22
21
|
end
|
23
22
|
|
24
23
|
def register target, node
|
25
|
-
|
26
|
-
@targets << target
|
27
|
-
@obj_to_node[target.object_id] = node
|
24
|
+
@obj_to_node[target] = node
|
28
25
|
end
|
29
26
|
|
30
27
|
def key? target
|
31
|
-
@obj_to_node.key? target
|
32
|
-
rescue NoMethodError
|
33
|
-
false
|
28
|
+
@obj_to_node.key? target
|
34
29
|
end
|
35
30
|
|
36
31
|
def id_for target
|
37
|
-
@obj_to_id[target
|
32
|
+
@obj_to_id[target] ||= (@counter += 1)
|
38
33
|
end
|
39
34
|
|
40
35
|
def node_for target
|
41
|
-
@obj_to_node[target
|
36
|
+
@obj_to_node[target]
|
42
37
|
end
|
43
38
|
end
|
44
39
|
|
@@ -70,6 +65,7 @@ module Psych
|
|
70
65
|
fail(ArgumentError, "Invalid line_width #{@line_width}, must be non-negative or -1 for unlimited.")
|
71
66
|
end
|
72
67
|
end
|
68
|
+
@stringify_names = options[:stringify_names]
|
73
69
|
@coders = []
|
74
70
|
|
75
71
|
@dispatch_cache = Hash.new do |h,klass|
|
@@ -192,12 +188,13 @@ module Psych
|
|
192
188
|
register o, @emitter.scalar(o.inspect, nil, '!ruby/regexp', false, false, Nodes::Scalar::ANY)
|
193
189
|
end
|
194
190
|
|
191
|
+
def visit_Date o
|
192
|
+
register o, visit_Integer(o.gregorian)
|
193
|
+
end
|
194
|
+
|
195
195
|
def visit_DateTime o
|
196
|
-
|
197
|
-
|
198
|
-
else
|
199
|
-
o.strftime("%Y-%m-%d %H:%M:%S.%9N %:z".freeze)
|
200
|
-
end
|
196
|
+
t = o.italy
|
197
|
+
formatted = format_time t, t.offset.zero?
|
201
198
|
tag = '!ruby/object:DateTime'
|
202
199
|
register o, @emitter.scalar(formatted, nil, tag, false, false, Nodes::Scalar::ANY)
|
203
200
|
end
|
@@ -235,7 +232,6 @@ module Psych
|
|
235
232
|
end
|
236
233
|
alias :visit_TrueClass :visit_Integer
|
237
234
|
alias :visit_FalseClass :visit_Integer
|
238
|
-
alias :visit_Date :visit_Integer
|
239
235
|
|
240
236
|
def visit_Float o
|
241
237
|
if o.nan?
|
@@ -265,18 +261,20 @@ module Psych
|
|
265
261
|
style = Nodes::Scalar::LITERAL
|
266
262
|
plain = false
|
267
263
|
quote = false
|
268
|
-
elsif o
|
264
|
+
elsif o.match?(/\n(?!\Z)/) # match \n except blank line at the end of string
|
269
265
|
style = Nodes::Scalar::LITERAL
|
270
266
|
elsif o == '<<'
|
271
267
|
style = Nodes::Scalar::SINGLE_QUOTED
|
272
268
|
tag = 'tag:yaml.org,2002:str'
|
273
269
|
plain = false
|
274
270
|
quote = false
|
271
|
+
elsif o == 'y' || o == 'Y' || o == 'n' || o == 'N'
|
272
|
+
style = Nodes::Scalar::DOUBLE_QUOTED
|
275
273
|
elsif @line_width && o.length > @line_width
|
276
274
|
style = Nodes::Scalar::FOLDED
|
277
|
-
elsif o
|
275
|
+
elsif o.match?(/^[^[:word:]][^"]*$/)
|
278
276
|
style = Nodes::Scalar::DOUBLE_QUOTED
|
279
|
-
elsif not String === @ss.tokenize(o) or /\A0[0-7]*[89]
|
277
|
+
elsif not String === @ss.tokenize(o) or /\A0[0-7]*[89]/.match?(o)
|
280
278
|
style = Nodes::Scalar::SINGLE_QUOTED
|
281
279
|
end
|
282
280
|
|
@@ -326,7 +324,7 @@ module Psych
|
|
326
324
|
if o.class == ::Hash
|
327
325
|
register(o, @emitter.start_mapping(nil, nil, true, Psych::Nodes::Mapping::BLOCK))
|
328
326
|
o.each do |k,v|
|
329
|
-
accept k
|
327
|
+
accept(@stringify_names && Symbol === k ? k.to_s : k)
|
330
328
|
accept v
|
331
329
|
end
|
332
330
|
@emitter.end_mapping
|
@@ -339,7 +337,7 @@ module Psych
|
|
339
337
|
register(o, @emitter.start_mapping(nil, '!set', false, Psych::Nodes::Mapping::BLOCK))
|
340
338
|
|
341
339
|
o.each do |k,v|
|
342
|
-
accept k
|
340
|
+
accept(@stringify_names && Symbol === k ? k.to_s : k)
|
343
341
|
accept v
|
344
342
|
end
|
345
343
|
|
@@ -480,8 +478,8 @@ module Psych
|
|
480
478
|
@emitter.end_mapping
|
481
479
|
end
|
482
480
|
|
483
|
-
def format_time time
|
484
|
-
if
|
481
|
+
def format_time time, utc = time.utc?
|
482
|
+
if utc
|
485
483
|
time.strftime("%Y-%m-%d %H:%M:%S.%9N Z")
|
486
484
|
else
|
487
485
|
time.strftime("%Y-%m-%d %H:%M:%S.%9N %:z")
|
@@ -535,5 +533,51 @@ module Psych
|
|
535
533
|
end
|
536
534
|
end
|
537
535
|
end
|
536
|
+
|
537
|
+
class RestrictedYAMLTree < YAMLTree
|
538
|
+
DEFAULT_PERMITTED_CLASSES = {
|
539
|
+
TrueClass => true,
|
540
|
+
FalseClass => true,
|
541
|
+
NilClass => true,
|
542
|
+
Integer => true,
|
543
|
+
Float => true,
|
544
|
+
String => true,
|
545
|
+
Array => true,
|
546
|
+
Hash => true,
|
547
|
+
}.compare_by_identity.freeze
|
548
|
+
|
549
|
+
def initialize emitter, ss, options
|
550
|
+
super
|
551
|
+
@permitted_classes = DEFAULT_PERMITTED_CLASSES.dup
|
552
|
+
Array(options[:permitted_classes]).each do |klass|
|
553
|
+
@permitted_classes[klass] = true
|
554
|
+
end
|
555
|
+
@permitted_symbols = {}.compare_by_identity
|
556
|
+
Array(options[:permitted_symbols]).each do |symbol|
|
557
|
+
@permitted_symbols[symbol] = true
|
558
|
+
end
|
559
|
+
@aliases = options.fetch(:aliases, false)
|
560
|
+
end
|
561
|
+
|
562
|
+
def accept target
|
563
|
+
if !@aliases && @st.key?(target)
|
564
|
+
raise BadAlias, "Tried to dump an aliased object"
|
565
|
+
end
|
566
|
+
|
567
|
+
unless Symbol === target || @permitted_classes[target.class]
|
568
|
+
raise DisallowedClass.new('dump', target.class.name || target.class.inspect)
|
569
|
+
end
|
570
|
+
|
571
|
+
super
|
572
|
+
end
|
573
|
+
|
574
|
+
def visit_Symbol sym
|
575
|
+
unless @permitted_classes[Symbol] || @permitted_symbols[sym]
|
576
|
+
raise DisallowedClass.new('dump', "Symbol(#{sym.inspect})")
|
577
|
+
end
|
578
|
+
|
579
|
+
super
|
580
|
+
end
|
581
|
+
end
|
538
582
|
end
|
539
583
|
end
|
data/lib/psych/visitors.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
2
|
+
require_relative 'visitors/visitor'
|
3
|
+
require_relative 'visitors/to_ruby'
|
4
|
+
require_relative 'visitors/emitter'
|
5
|
+
require_relative 'visitors/yaml_tree'
|
6
|
+
require_relative 'visitors/json_tree'
|
7
|
+
require_relative 'visitors/depth_first'
|