RbYAML 0.0.2 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README +1 -1
- data/lib/rbyaml/composer.rb +28 -25
- data/lib/rbyaml/composer.rb.~1.2.~ +109 -0
- data/lib/rbyaml/constructor.rb +94 -84
- data/lib/rbyaml/constructor.rb.~1.2.~ +381 -0
- data/lib/rbyaml/dumper.rb +10 -17
- data/lib/rbyaml/dumper.rb.~1.2.~ +43 -0
- data/lib/rbyaml/emitter.rb +13 -26
- data/lib/rbyaml/emitter.rb.~1.2.~ +1116 -0
- data/lib/rbyaml/error.rb +15 -21
- data/lib/rbyaml/events.rb +29 -5
- data/lib/rbyaml/events.rb.~1.2.~ +93 -0
- data/lib/rbyaml/loader.rb +11 -23
- data/lib/rbyaml/loader.rb.~1.2.~ +52 -0
- data/lib/rbyaml/nodes.rb +13 -9
- data/lib/rbyaml/nodes.rb.~1.2.~ +52 -0
- data/lib/rbyaml/parser.rb +481 -343
- data/lib/rbyaml/parser.rb.old +531 -0
- data/lib/rbyaml/parser.rb.~1.2.~ +494 -0
- data/lib/rbyaml/reader.rb.~1.1.1.1.~ +127 -0
- data/lib/rbyaml/representer.rb +26 -17
- data/lib/rbyaml/representer.rb.~1.2.~ +239 -0
- data/lib/rbyaml/resolver.rb +15 -15
- data/lib/rbyaml/resolver.rb.~1.1.~ +163 -0
- data/lib/rbyaml/scanner.rb +457 -366
- data/lib/rbyaml/scanner.rb.~1.2.~ +1259 -0
- data/lib/rbyaml/serializer.rb +19 -17
- data/lib/rbyaml/serializer.rb.~1.2.~ +115 -0
- data/lib/rbyaml/tokens.rb +44 -4
- data/lib/rbyaml/tokens.rb.~1.2.~ +164 -0
- data/lib/rbyaml/util.rb +28 -0
- data/lib/rbyaml/yaml.rb +12 -12
- data/lib/rbyaml/yaml.rb.~1.2.~ +136 -0
- data/test/test_bm.rb +28 -0
- data/test/test_bm_syck.rb +28 -0
- data/test/test_invoke.rb +31 -0
- data/test/test_one.rb +5 -0
- data/test/test_profile.rb +32 -0
- data/test/test_rbyaml.rb +2 -1
- data/test/test_rbyaml.rb.~1.2.~ +31 -0
- data/test/test_time.rb +13 -8
- data/test/test_time.rb.~1.1.~ +29 -0
- data/test/yamlx.rb +3563 -0
- metadata +27 -2
data/README
CHANGED
@@ -24,7 +24,7 @@ Just require 'rbyaml' and use it as you would use YAML, but in module RbYAML ins
|
|
24
24
|
|
25
25
|
== More information
|
26
26
|
|
27
|
-
Visit http://rbyaml.
|
27
|
+
Visit http://rbyaml.rubyforge.org for more information and updated versions
|
28
28
|
|
29
29
|
== License
|
30
30
|
|
data/lib/rbyaml/composer.rb
CHANGED
@@ -6,13 +6,15 @@ module RbYAML
|
|
6
6
|
class ComposerError < MarkedYAMLError
|
7
7
|
end
|
8
8
|
|
9
|
-
|
10
|
-
def
|
9
|
+
class Composer
|
10
|
+
def initialize(parser,resolver)
|
11
|
+
@parser = parser
|
12
|
+
@resolver = resolver
|
11
13
|
@anchors = {}
|
12
14
|
end
|
13
15
|
|
14
16
|
def check_node
|
15
|
-
|
17
|
+
!@parser.peek_event.__is_stream_end
|
16
18
|
end
|
17
19
|
|
18
20
|
def get_node
|
@@ -25,75 +27,76 @@ module RbYAML
|
|
25
27
|
|
26
28
|
def compose_document
|
27
29
|
# Drop the STREAM-START event.
|
28
|
-
get_event if
|
29
|
-
|
30
|
+
@parser.get_event if @parser.peek_event.__is_stream_start
|
31
|
+
# Drop the DOCUMENT-START event.
|
32
|
+
@parser.get_event
|
30
33
|
# Compose the root node.
|
31
34
|
node = compose_node(nil,nil)
|
32
35
|
# Drop the DOCUMENT-END event.
|
33
|
-
get_event
|
36
|
+
@parser.get_event
|
34
37
|
@anchors = {}
|
35
38
|
node
|
36
39
|
end
|
37
40
|
|
38
41
|
def compose_node(parent,index)
|
39
|
-
if
|
40
|
-
event = get_event
|
42
|
+
if @parser.peek_event.__is_alias
|
43
|
+
event = @parser.get_event
|
41
44
|
anchor = event.anchor
|
42
45
|
raise ComposerError.new(nil, nil, "found undefined alias #{anchor}", event.start_mark) if !@anchors.include?(anchor)
|
43
46
|
return @anchors[anchor]
|
44
47
|
end
|
45
|
-
event = peek_event
|
48
|
+
event = @parser.peek_event
|
46
49
|
anchor = event.anchor
|
47
50
|
if !anchor.nil?
|
48
51
|
if @anchors.include?(anchor)
|
49
52
|
raise ComposerError.new("found duplicate anchor #{anchor}; first occurence", @anchors[anchor].start_mark,"second occurence", event.start_mark)
|
50
53
|
end
|
51
54
|
end
|
52
|
-
descend_resolver(parent,index)
|
53
|
-
if
|
55
|
+
@resolver.descend_resolver(parent,index)
|
56
|
+
if @parser.peek_event.__is_scalar
|
54
57
|
node = compose_scalar_node(anchor)
|
55
|
-
elsif
|
58
|
+
elsif @parser.peek_event.__is_sequence_start
|
56
59
|
node = compose_sequence_node(anchor)
|
57
|
-
elsif
|
60
|
+
elsif @parser.peek_event.__is_mapping_start
|
58
61
|
node = compose_mapping_node(anchor)
|
59
62
|
end
|
60
|
-
ascend_resolver
|
63
|
+
@resolver.ascend_resolver
|
61
64
|
node
|
62
65
|
end
|
63
66
|
|
64
67
|
def compose_scalar_node(anchor)
|
65
|
-
event = get_event
|
68
|
+
event = @parser.get_event
|
66
69
|
tag = event.tag
|
67
|
-
tag = resolve(ScalarNode,event.value,event.implicit) if tag.nil? || tag == "!"
|
70
|
+
tag = @resolver.resolve(ScalarNode,event.value,event.implicit) if tag.nil? || tag == "!"
|
68
71
|
node = ScalarNode.new(tag, event.value,event.start_mark, event.end_mark, event.style)
|
69
72
|
@anchors[anchor] = node if !anchor.nil?
|
70
73
|
node
|
71
74
|
end
|
72
75
|
|
73
76
|
def compose_sequence_node(anchor)
|
74
|
-
start_event = get_event
|
77
|
+
start_event = @parser.get_event
|
75
78
|
tag = start_event.tag
|
76
|
-
tag = resolve(SequenceNode,nil,start_event.implicit) if tag.nil? || tag == "!"
|
79
|
+
tag = @resolver.resolve(SequenceNode,nil,start_event.implicit) if tag.nil? || tag == "!"
|
77
80
|
node = SequenceNode.new(tag,[],start_event.start_mark,nil,start_event.flow_style)
|
78
81
|
@anchors[anchor] = node if !anchor.nil?
|
79
82
|
index = 0
|
80
|
-
while
|
83
|
+
while !@parser.peek_event.__is_sequence_end
|
81
84
|
node.value << compose_node(node,index)
|
82
85
|
index += 1
|
83
86
|
end
|
84
|
-
end_event = get_event
|
87
|
+
end_event = @parser.get_event
|
85
88
|
node.end_mark = end_event.end_mark
|
86
89
|
node
|
87
90
|
end
|
88
91
|
|
89
92
|
def compose_mapping_node(anchor)
|
90
|
-
start_event = get_event
|
93
|
+
start_event = @parser.get_event
|
91
94
|
tag = start_event.tag
|
92
|
-
tag = resolve(MappingNode,nil,start_event.implicit) if tag.nil? || tag == "!"
|
95
|
+
tag = @resolver.resolve(MappingNode,nil,start_event.implicit) if tag.nil? || tag == "!"
|
93
96
|
node = MappingNode.new(tag, {},start_event.start_mark,nil,start_event.flow_style)
|
94
97
|
@anchors[anchor] = node if !anchor.nil?
|
95
|
-
while
|
96
|
-
key_event = peek_event
|
98
|
+
while !@parser.peek_event.__is_mapping_end
|
99
|
+
key_event = @parser.peek_event
|
97
100
|
item_key = compose_node(node,nil)
|
98
101
|
if node.value.include?(item_key)
|
99
102
|
raise ComposerError.new("while composing a mapping", start_event.start_mark,"found duplicate key", key_event.start_mark)
|
@@ -101,7 +104,7 @@ module RbYAML
|
|
101
104
|
item_value = compose_node(node,item_key)
|
102
105
|
node.value[item_key] = item_value
|
103
106
|
end
|
104
|
-
end_event = get_event
|
107
|
+
end_event = @parser.get_event
|
105
108
|
node.end_mark = end_event.end_mark
|
106
109
|
node
|
107
110
|
end
|
@@ -0,0 +1,109 @@
|
|
1
|
+
require 'rbyaml/error'
|
2
|
+
require 'rbyaml/events'
|
3
|
+
require 'rbyaml/nodes'
|
4
|
+
|
5
|
+
module RbYAML
|
6
|
+
class ComposerError < MarkedYAMLError
|
7
|
+
end
|
8
|
+
|
9
|
+
module Composer
|
10
|
+
def initialize_composer
|
11
|
+
@anchors = {}
|
12
|
+
end
|
13
|
+
|
14
|
+
def check_node
|
15
|
+
!check_event(StreamEndEvent)
|
16
|
+
end
|
17
|
+
|
18
|
+
def get_node
|
19
|
+
compose_document if check_node
|
20
|
+
end
|
21
|
+
|
22
|
+
def each_node
|
23
|
+
yield compose_document while check_node
|
24
|
+
end
|
25
|
+
|
26
|
+
def compose_document
|
27
|
+
# Drop the STREAM-START event.
|
28
|
+
get_event if check_event(StreamStartEvent)
|
29
|
+
get_event
|
30
|
+
# Compose the root node.
|
31
|
+
node = compose_node(nil,nil)
|
32
|
+
# Drop the DOCUMENT-END event.
|
33
|
+
get_event
|
34
|
+
@anchors = {}
|
35
|
+
node
|
36
|
+
end
|
37
|
+
|
38
|
+
def compose_node(parent,index)
|
39
|
+
if check_event(AliasEvent)
|
40
|
+
event = get_event
|
41
|
+
anchor = event.anchor
|
42
|
+
raise ComposerError.new(nil, nil, "found undefined alias #{anchor}", event.start_mark) if !@anchors.include?(anchor)
|
43
|
+
return @anchors[anchor]
|
44
|
+
end
|
45
|
+
event = peek_event
|
46
|
+
anchor = event.anchor
|
47
|
+
if !anchor.nil?
|
48
|
+
if @anchors.include?(anchor)
|
49
|
+
raise ComposerError.new("found duplicate anchor #{anchor}; first occurence", @anchors[anchor].start_mark,"second occurence", event.start_mark)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
descend_resolver(parent,index)
|
53
|
+
if check_event(ScalarEvent)
|
54
|
+
node = compose_scalar_node(anchor)
|
55
|
+
elsif check_event(SequenceStartEvent)
|
56
|
+
node = compose_sequence_node(anchor)
|
57
|
+
elsif check_event(MappingStartEvent)
|
58
|
+
node = compose_mapping_node(anchor)
|
59
|
+
end
|
60
|
+
ascend_resolver
|
61
|
+
node
|
62
|
+
end
|
63
|
+
|
64
|
+
def compose_scalar_node(anchor)
|
65
|
+
event = get_event
|
66
|
+
tag = event.tag
|
67
|
+
tag = resolve(ScalarNode,event.value,event.implicit) if tag.nil? || tag == "!"
|
68
|
+
node = ScalarNode.new(tag, event.value,event.start_mark, event.end_mark, event.style)
|
69
|
+
@anchors[anchor] = node if !anchor.nil?
|
70
|
+
node
|
71
|
+
end
|
72
|
+
|
73
|
+
def compose_sequence_node(anchor)
|
74
|
+
start_event = get_event
|
75
|
+
tag = start_event.tag
|
76
|
+
tag = resolve(SequenceNode,nil,start_event.implicit) if tag.nil? || tag == "!"
|
77
|
+
node = SequenceNode.new(tag,[],start_event.start_mark,nil,start_event.flow_style)
|
78
|
+
@anchors[anchor] = node if !anchor.nil?
|
79
|
+
index = 0
|
80
|
+
while !check_event(SequenceEndEvent)
|
81
|
+
node.value << compose_node(node,index)
|
82
|
+
index += 1
|
83
|
+
end
|
84
|
+
end_event = get_event
|
85
|
+
node.end_mark = end_event.end_mark
|
86
|
+
node
|
87
|
+
end
|
88
|
+
|
89
|
+
def compose_mapping_node(anchor)
|
90
|
+
start_event = get_event
|
91
|
+
tag = start_event.tag
|
92
|
+
tag = resolve(MappingNode,nil,start_event.implicit) if tag.nil? || tag == "!"
|
93
|
+
node = MappingNode.new(tag, {},start_event.start_mark,nil,start_event.flow_style)
|
94
|
+
@anchors[anchor] = node if !anchor.nil?
|
95
|
+
while !check_event(MappingEndEvent)
|
96
|
+
key_event = peek_event
|
97
|
+
item_key = compose_node(node,nil)
|
98
|
+
if node.value.include?(item_key)
|
99
|
+
raise ComposerError.new("while composing a mapping", start_event.start_mark,"found duplicate key", key_event.start_mark)
|
100
|
+
end
|
101
|
+
item_value = compose_node(node,item_key)
|
102
|
+
node.value[item_key] = item_value
|
103
|
+
end
|
104
|
+
end_event = get_event
|
105
|
+
node.end_mark = end_event.end_mark
|
106
|
+
node
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
data/lib/rbyaml/constructor.rb
CHANGED
@@ -5,35 +5,54 @@ require 'rbyaml/error'
|
|
5
5
|
require 'rbyaml/nodes'
|
6
6
|
require 'rbyaml/composer'
|
7
7
|
|
8
|
+
class Symbol
|
9
|
+
def __call(obj,*args)
|
10
|
+
obj.send(self,*args)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
class Proc
|
15
|
+
def __call(obj,*args)
|
16
|
+
call(*args)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
class Method
|
21
|
+
def __call(obj,*args)
|
22
|
+
call(*args)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
|
8
27
|
module RbYAML
|
9
28
|
class ConstructorError < MarkedYAMLError
|
10
29
|
end
|
11
30
|
|
12
|
-
|
13
|
-
include Composer
|
14
|
-
|
31
|
+
class BaseConstructor
|
15
32
|
@@yaml_constructors = {}
|
16
33
|
@@yaml_multi_constructors = {}
|
34
|
+
@@yaml_multi_regexps = {}
|
17
35
|
|
18
|
-
def
|
36
|
+
def initialize(composer)
|
37
|
+
@composer = composer
|
19
38
|
@constructed_objects = {}
|
20
39
|
@recursive_objects = {}
|
21
40
|
end
|
22
41
|
|
23
42
|
def check_data
|
24
43
|
# If there are more documents available?
|
25
|
-
check_node
|
44
|
+
@composer.check_node
|
26
45
|
end
|
27
46
|
|
28
47
|
def get_data
|
29
48
|
# Construct and return the next document.
|
30
|
-
construct_document(get_node) if check_node
|
49
|
+
construct_document(@composer.get_node) if @composer.check_node
|
31
50
|
end
|
32
51
|
|
33
52
|
def each_document
|
34
53
|
# Iterator protocol.
|
35
|
-
while check_node
|
36
|
-
yield construct_document(get_node)
|
54
|
+
while @composer.check_node
|
55
|
+
yield construct_document(@composer.get_node)
|
37
56
|
end
|
38
57
|
end
|
39
58
|
|
@@ -48,52 +67,43 @@ module RbYAML
|
|
48
67
|
return @constructed_objects[node] if @constructed_objects.include?(node)
|
49
68
|
raise ConstructorError.new(nil,nil,"found recursive nod",node.start_mark) if @recursive_objects.include?(node)
|
50
69
|
@recursive_objects[node] = nil
|
51
|
-
constructor =
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
else
|
58
|
-
through = false
|
59
|
-
for tag_prefix in @@yaml_multi_constructors.keys
|
70
|
+
constructor = @@yaml_constructors[node.tag]
|
71
|
+
if !constructor
|
72
|
+
ruby_cls = RbYAML::tagged_classes[node.tag]
|
73
|
+
if ruby_cls && (ruby_cls.method_defined?(:yaml_initialize) || ruby_cls.respond_to?(:yaml_new))
|
74
|
+
constructor = lambda { |node| send(:construct_ruby_object,ruby_cls,node) }
|
75
|
+
else
|
60
76
|
through = true
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
constructor = lambda { |node|
|
65
|
-
|
66
|
-
|
77
|
+
for tag_prefix,reg in @@yaml_multi_regexps
|
78
|
+
if reg =~ node.tag
|
79
|
+
tag_suffix = node.tag[tag_prefix.length..-1]
|
80
|
+
constructor = lambda { |node| @@yaml_multi_constructors[tag_prefix].__call(self,tag_suffix, node) }
|
81
|
+
through = false
|
82
|
+
break
|
67
83
|
end
|
68
|
-
break
|
69
84
|
end
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
constructor = lambda { |node| send(@@yaml_multi_constructors[nil],node.tag, node) }
|
85
|
+
if through
|
86
|
+
ctor = @@yaml_multi_constructors[nil] || @@yaml_constructors[nil]
|
87
|
+
if ctor
|
88
|
+
constructor = lambda { |node| ctor.__call(self,node.tag,node) }
|
75
89
|
else
|
76
|
-
constructor = lambda { |node|
|
90
|
+
constructor = lambda { |node| construct_primitive(node) }
|
77
91
|
end
|
78
|
-
elsif @@yaml_constructors.include?(nil)
|
79
|
-
constructor = @@yaml_constructors[nil]
|
80
|
-
else
|
81
|
-
constructor = lambda { |node| construct_primitive(node) }
|
82
92
|
end
|
83
93
|
end
|
84
94
|
end
|
85
|
-
data =
|
95
|
+
data = constructor.__call(self,node)
|
86
96
|
@constructed_objects[node] = data
|
87
97
|
@recursive_objects.delete(node)
|
88
98
|
data
|
89
99
|
end
|
90
100
|
|
91
101
|
def construct_primitive(node)
|
92
|
-
if
|
102
|
+
if node.__is_scalar
|
93
103
|
construct_scalar(node)
|
94
|
-
elsif
|
104
|
+
elsif node.__is_sequence
|
95
105
|
construct_sequence(node)
|
96
|
-
elsif
|
106
|
+
elsif node.__is_mapping
|
97
107
|
construct_mapping(node)
|
98
108
|
else
|
99
109
|
puts node.tag
|
@@ -101,8 +111,8 @@ module RbYAML
|
|
101
111
|
end
|
102
112
|
|
103
113
|
def construct_scalar(node)
|
104
|
-
if !
|
105
|
-
if
|
114
|
+
if !node.__is_scalar
|
115
|
+
if node.__is_mapping
|
106
116
|
for key_node in node.value.keys
|
107
117
|
if key_node.tag == "tag:yaml.org,2002:value"
|
108
118
|
return construct_scalar(node.value[key_node])
|
@@ -115,46 +125,39 @@ module RbYAML
|
|
115
125
|
end
|
116
126
|
|
117
127
|
def construct_sequence(node)
|
118
|
-
raise ConstructorError.new(nil,nil,"expected a sequence node, but found #{node.tid}",node.start_mark) if !
|
119
|
-
|
120
|
-
for child in node.value
|
121
|
-
sequence << construct_object(child)
|
122
|
-
end
|
123
|
-
sequence
|
128
|
+
raise ConstructorError.new(nil,nil,"expected a sequence node, but found #{node.tid}",node.start_mark) if !node.__is_sequence
|
129
|
+
node.value.map {|child| construct_object(child) }
|
124
130
|
end
|
125
131
|
|
126
132
|
def construct_mapping(node)
|
127
|
-
raise ConstructorError.new(nil,nil,"expected a mapping node, but found #{node.tid}",node.start_mark) if !
|
133
|
+
raise ConstructorError.new(nil,nil,"expected a mapping node, but found #{node.tid}",node.start_mark) if !node.__is_mapping
|
128
134
|
mapping = {}
|
129
135
|
merge = nil
|
130
|
-
for key_node in node.value
|
136
|
+
for key_node,value_node in node.value
|
131
137
|
if key_node.tag == "tag:yaml.org,2002:merge"
|
132
138
|
raise ConstructorError.new("while constructing a mapping", node.start_mark,"found duplicate merge key", key_node.start_mark) if !merge.nil?
|
133
|
-
value_node
|
134
|
-
if MappingNode === value_node
|
139
|
+
if value_node.__is_mapping
|
135
140
|
merge = [construct_mapping(value_node)]
|
136
|
-
elsif
|
141
|
+
elsif value_node.__is_sequence
|
137
142
|
merge = []
|
138
143
|
for subnode in value_node.value
|
139
|
-
if !
|
144
|
+
if !subnode.__is_mapping
|
140
145
|
raise ConstructorError.new("while constructing a mapping",node.start_mark,"expected a mapping for merging, but found #{subnode.tid}", subnode.start_mark)
|
141
146
|
end
|
142
|
-
merge
|
147
|
+
merge.unshift(construct_mapping(subnode))
|
143
148
|
end
|
144
|
-
merge.reverse!
|
145
149
|
else
|
146
150
|
raise ConstructorError.new("while constructing a mapping", node.start_mark,"expected a mapping or list of mappings for merging, but found #{value_node.tid}", value_node.start_mark)
|
147
151
|
end
|
148
152
|
elsif key_node.tag == "tag:yaml.org,2002:value"
|
149
153
|
raise ConstructorError.new("while construction a mapping", node.start_mark,"found duplicate value key", key_node.start_mark) if mapping.include?("=")
|
150
|
-
value = construct_object(
|
154
|
+
value = construct_object(value_node)
|
151
155
|
mapping["="] = value
|
152
|
-
|
153
156
|
else
|
154
157
|
key = construct_object(key_node)
|
155
158
|
# raise ConstructorError.new("while constructing a mapping", node.start_mark,"found duplicate key", key_node.start_mark) if mapping.include?(key)
|
156
159
|
end
|
157
|
-
value = construct_object(
|
160
|
+
value = construct_object(value_node)
|
158
161
|
mapping[key] = value
|
159
162
|
end
|
160
163
|
if !merge.nil?
|
@@ -168,14 +171,8 @@ module RbYAML
|
|
168
171
|
end
|
169
172
|
|
170
173
|
def construct_pairs(node)
|
171
|
-
raise ConstructorError.new(nil,nil,"expected a mapping node, but found #{node.tid}",node.start_mark) if !
|
172
|
-
|
173
|
-
for key_node in node.value.keys
|
174
|
-
key = construct_object(key_node)
|
175
|
-
value = construct_object(node.value[key_node])
|
176
|
-
pairs << [key, value]
|
177
|
-
end
|
178
|
-
pairs
|
174
|
+
raise ConstructorError.new(nil,nil,"expected a mapping node, but found #{node.tid}",node.start_mark) if !node.__is_mapping
|
175
|
+
node.value.collect {|key_node,value_node| [construct_object(key_node), construct_object(value_node)] }
|
179
176
|
end
|
180
177
|
|
181
178
|
def self.add_constructor(tag, constructor)
|
@@ -184,12 +181,11 @@ module RbYAML
|
|
184
181
|
|
185
182
|
def self.add_multi_constructor(tag_prefix, multi_constructor)
|
186
183
|
@@yaml_multi_constructors[tag_prefix] = multi_constructor
|
184
|
+
@@yaml_multi_regexps[tag_prefix] = Regexp.new("^"+Regexp.escape(tag_prefix))
|
187
185
|
end
|
188
186
|
end
|
189
187
|
|
190
|
-
|
191
|
-
include BaseConstructor
|
192
|
-
|
188
|
+
class SafeConstructor < BaseConstructor
|
193
189
|
def construct_yaml_null(node)
|
194
190
|
construct_scalar(node)
|
195
191
|
nil
|
@@ -208,23 +204,32 @@ module RbYAML
|
|
208
204
|
|
209
205
|
def construct_yaml_bool(node)
|
210
206
|
value = construct_scalar(node)
|
211
|
-
|
207
|
+
BOOL_VALUES[value.downcase]
|
212
208
|
end
|
213
209
|
|
214
210
|
def construct_yaml_int(node)
|
215
211
|
value = construct_scalar(node).to_s
|
216
212
|
value = value.gsub(/_/, '')
|
217
213
|
sign = +1
|
218
|
-
|
219
|
-
|
214
|
+
first = value[0]
|
215
|
+
if first == ?-
|
216
|
+
sign = -1
|
217
|
+
value.slice!(0)
|
218
|
+
elsif first == ?+
|
219
|
+
value.slice!(0)
|
220
|
+
end
|
221
|
+
base = 10
|
220
222
|
if value == "0"
|
221
223
|
return 0
|
222
224
|
elsif value[0..1] == "0b"
|
223
|
-
|
225
|
+
value.slice!(0..1)
|
226
|
+
base = 2
|
224
227
|
elsif value[0..1] == "0x"
|
225
|
-
|
228
|
+
value.slice!(0..1)
|
229
|
+
base = 16
|
226
230
|
elsif value[0] == ?0
|
227
|
-
|
231
|
+
value.slice!(0)
|
232
|
+
base = 8
|
228
233
|
elsif value.include?(?:)
|
229
234
|
digits = (value.split(/:/).map {|val| val.to_i}).reverse
|
230
235
|
base = 1
|
@@ -237,6 +242,7 @@ module RbYAML
|
|
237
242
|
else
|
238
243
|
return sign*value.to_i
|
239
244
|
end
|
245
|
+
return sign*value.to_i(base)
|
240
246
|
end
|
241
247
|
|
242
248
|
INF_VALUE = +1.0/0.0
|
@@ -246,12 +252,17 @@ module RbYAML
|
|
246
252
|
value = construct_scalar(node).to_s
|
247
253
|
value = value.gsub(/_/, '')
|
248
254
|
sign = +1
|
249
|
-
|
250
|
-
|
255
|
+
first = value[0]
|
256
|
+
if first == ?-
|
257
|
+
sign = -1
|
258
|
+
value.slice!(0)
|
259
|
+
elsif first == ?+
|
260
|
+
value.slice!(0)
|
261
|
+
end
|
251
262
|
if value.downcase == ".inf"
|
252
|
-
return sign*
|
263
|
+
return sign*INF_VALUE
|
253
264
|
elsif value.downcase == ".nan"
|
254
|
-
return
|
265
|
+
return NAN_VALUE
|
255
266
|
elsif value.include?(?:)
|
256
267
|
digits = (value.split(/:/).map {|val| val.to_f}).reverse
|
257
268
|
base = 1
|
@@ -275,7 +286,7 @@ module RbYAML
|
|
275
286
|
|
276
287
|
def construct_yaml_timestamp(node)
|
277
288
|
value = construct_scalar(node)
|
278
|
-
match =
|
289
|
+
match = TIMESTAMP_REGEXP.match(node.value)
|
279
290
|
values = match.captures.map {|val| val.to_i}
|
280
291
|
fraction = values[6]
|
281
292
|
if fraction != 0
|
@@ -292,11 +303,11 @@ module RbYAML
|
|
292
303
|
# Note: we do not check for duplicate keys, because its too
|
293
304
|
# CPU-expensive.
|
294
305
|
raise ConstructorError.new("while constructing an ordered map", node.start_mark,
|
295
|
-
"expected a sequence, but found #{node.tid}", node.start_mark) if !
|
306
|
+
"expected a sequence, but found #{node.tid}", node.start_mark) if !node.__is_sequence
|
296
307
|
omap = []
|
297
308
|
for subnode in node.value
|
298
309
|
raise ConstructorError.new("while constructing an ordered map", node.start_mark,
|
299
|
-
"expected a mapping of length 1, but found #{subnode.tid}",subnode.start_mark) if !
|
310
|
+
"expected a mapping of length 1, but found #{subnode.tid}",subnode.start_mark) if !subnode.__is_mapping
|
300
311
|
raise ConstructorError.new("while constructing an ordered map", node.start_mark,
|
301
312
|
"expected a single mapping item, but found #{subnode.value.length} items",subnode.start_mark) if subnode.value.length != 1
|
302
313
|
key_node = subnode.value.keys[0]
|
@@ -359,7 +370,7 @@ module RbYAML
|
|
359
370
|
end
|
360
371
|
end
|
361
372
|
|
362
|
-
|
373
|
+
SafeConstructor::add_constructor('tag:yaml.org,2002:null',:construct_yaml_null)
|
363
374
|
BaseConstructor::add_constructor('tag:yaml.org,2002:bool',:construct_yaml_bool)
|
364
375
|
BaseConstructor::add_constructor('tag:yaml.org,2002:int',:construct_yaml_int)
|
365
376
|
BaseConstructor::add_constructor('tag:yaml.org,2002:float',:construct_yaml_float)
|
@@ -375,7 +386,6 @@ module RbYAML
|
|
375
386
|
|
376
387
|
BaseConstructor::add_multi_constructor("!ruby/object:",:construct_ruby)
|
377
388
|
|
378
|
-
|
379
|
-
include SafeConstructor
|
389
|
+
class Constructor < SafeConstructor
|
380
390
|
end
|
381
391
|
end
|