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
@@ -0,0 +1,127 @@
|
|
1
|
+
# This is a more or less straight translation of PyYAML3000 to Ruby
|
2
|
+
|
3
|
+
# the big difference in this implementation is that unicode support is not here...
|
4
|
+
|
5
|
+
require 'rbyaml/error'
|
6
|
+
|
7
|
+
module RbYAML
|
8
|
+
|
9
|
+
# Reader:
|
10
|
+
# - checks if characters are in allowed range,
|
11
|
+
# - adds '\0' to the end.
|
12
|
+
# Reader accepts
|
13
|
+
# - a String object
|
14
|
+
# - a duck-typed IO object
|
15
|
+
module Reader
|
16
|
+
def initialize_reader(stream)
|
17
|
+
@stream = nil
|
18
|
+
@stream_pointer = 0
|
19
|
+
@eof = true
|
20
|
+
@buffer = ""
|
21
|
+
@pointer = 0
|
22
|
+
@index = 0
|
23
|
+
@line = 0
|
24
|
+
@column = 0
|
25
|
+
if String === stream
|
26
|
+
@name = "<string>"
|
27
|
+
@raw_buffer = stream
|
28
|
+
else
|
29
|
+
@stream = stream
|
30
|
+
@name = stream.respond_to?(:path) ? stream.path : stream.inspect
|
31
|
+
@eof = false
|
32
|
+
@raw_buffer = ""
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def peek(index=0)
|
37
|
+
update(index+1) if @pointer+index+1 >= @buffer.length
|
38
|
+
@buffer[@pointer+index]
|
39
|
+
end
|
40
|
+
|
41
|
+
def prefix(length=1)
|
42
|
+
update(length) if @pointer+length >= @buffer.length
|
43
|
+
@buffer[@pointer...@pointer+length]
|
44
|
+
end
|
45
|
+
|
46
|
+
def forward(length=1)
|
47
|
+
update(length+1) if @pointer+length+1 >= @buffer.length
|
48
|
+
length.times { |k|
|
49
|
+
ch = @buffer[@pointer]
|
50
|
+
@pointer += 1
|
51
|
+
@index += 1
|
52
|
+
if "\n\x85".include?(ch) || (ch == ?\r && @buffer[@pointer+1] != ?\n)
|
53
|
+
@line += 1
|
54
|
+
@column = 0
|
55
|
+
else
|
56
|
+
@column += 1
|
57
|
+
end
|
58
|
+
}
|
59
|
+
end
|
60
|
+
|
61
|
+
def get_mark
|
62
|
+
if @stream.nil?
|
63
|
+
Mark.new(@name,@index,@line,@column,@buffer,@pointer)
|
64
|
+
else
|
65
|
+
Mark.new(@name,@index,@line,@column,nil,nil)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
NON_PRINTABLE = /[^\x09\x0A\x0D\x20-\x7E\x85\xA0-\xFF]/
|
70
|
+
def check_printable(data)
|
71
|
+
if NON_PRINTABLE =~ data
|
72
|
+
position = @index+@buffer.length-@pointer+($~.offset(0)[0])
|
73
|
+
raise ReaderError.new(@name, position, $&,"unicode","special characters are not allowed"),"special characters are not allowed"
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
def update(length)
|
78
|
+
return if @raw_buffer.nil?
|
79
|
+
@buffer = @buffer[@pointer..-1]
|
80
|
+
@pointer = 0
|
81
|
+
while @buffer.length < length
|
82
|
+
unless @eof
|
83
|
+
update_raw
|
84
|
+
end
|
85
|
+
data = @raw_buffer
|
86
|
+
converted = data.length
|
87
|
+
check_printable(data)
|
88
|
+
@buffer << data
|
89
|
+
@raw_buffer = @raw_buffer[converted..-1]
|
90
|
+
if @eof
|
91
|
+
@buffer << ?\0
|
92
|
+
@raw_buffer = nil
|
93
|
+
break
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
def update_raw(size=1024)
|
99
|
+
data = @stream.read(size)
|
100
|
+
if data && !data.empty?
|
101
|
+
@raw_buffer << data
|
102
|
+
@stream_pointer += data.length
|
103
|
+
else
|
104
|
+
@eof = true
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
class ReaderError < YAMLError
|
110
|
+
def initialize(name, position, character, encoding, reason)
|
111
|
+
@name = name
|
112
|
+
@position = position
|
113
|
+
@character = character
|
114
|
+
@encoding = encoding
|
115
|
+
@reason = reason
|
116
|
+
end
|
117
|
+
|
118
|
+
def to_s
|
119
|
+
if String === @character
|
120
|
+
"'#{@encoding}' codec can't decode byte #x%02x: #{@reason}\n in \"#{@name}\", position #{@position}" % @character.to_i
|
121
|
+
else
|
122
|
+
"unacceptable character #x%04x: #{@reason}\n in \"#{@name}\", position #{@position}" % @character.to_i
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
data/lib/rbyaml/representer.rb
CHANGED
@@ -8,11 +8,12 @@ module RbYAML
|
|
8
8
|
class RepresenterError < YAMLError
|
9
9
|
end
|
10
10
|
|
11
|
-
|
11
|
+
class BaseRepresenter
|
12
12
|
@@yaml_representers = {}
|
13
13
|
@@yaml_multi_representers = {}
|
14
14
|
|
15
|
-
def
|
15
|
+
def initialize(serializer, default_style=nil, default_flow_style=nil)
|
16
|
+
@serializer = serializer
|
16
17
|
@default_style = default_style
|
17
18
|
@default_flow_style = default_flow_style
|
18
19
|
@represented_objects = {}
|
@@ -20,7 +21,7 @@ module RbYAML
|
|
20
21
|
|
21
22
|
def represent(data)
|
22
23
|
node = represent_data(data)
|
23
|
-
serialize(node)
|
24
|
+
@serializer.serialize(node)
|
24
25
|
represented_objects = {}
|
25
26
|
end
|
26
27
|
|
@@ -100,7 +101,7 @@ module RbYAML
|
|
100
101
|
best_style = true
|
101
102
|
value = sequence.map {|item|
|
102
103
|
node_item = represent_data(item)
|
103
|
-
best_style = false if !
|
104
|
+
best_style = false if !node_item.__is_scalar && !node_item.flow_style
|
104
105
|
node_item
|
105
106
|
}
|
106
107
|
flow_style ||= (@flow_default_style || best_style)
|
@@ -114,8 +115,8 @@ module RbYAML
|
|
114
115
|
for item_key,item_value in mapping
|
115
116
|
node_key = represent_data(item_key)
|
116
117
|
node_value = represent_data(item_value)
|
117
|
-
best_style = false if !
|
118
|
-
best_style = false if !
|
118
|
+
best_style = false if !node_key.__is_scalar && !node_key.flow_style
|
119
|
+
best_style = false if !node_value.__is_scalar && !node_value.flow_style
|
119
120
|
value[node_key] = node_value
|
120
121
|
end
|
121
122
|
else
|
@@ -123,8 +124,8 @@ module RbYAML
|
|
123
124
|
for item_key, item_value in mapping
|
124
125
|
node_key = represent_data(item_key)
|
125
126
|
node_value = represent_data(item_value)
|
126
|
-
best_style = false if !
|
127
|
-
best_style = false if !
|
127
|
+
best_style = false if !node_key.__is_scalar && !node_key.flow_style
|
128
|
+
best_style = false if !node_value.__is_scalar && !node_value.flow_style
|
128
129
|
value << [node_key, node_value]
|
129
130
|
end
|
130
131
|
end
|
@@ -137,11 +138,10 @@ module RbYAML
|
|
137
138
|
end
|
138
139
|
end
|
139
140
|
|
140
|
-
|
141
|
-
include BaseRepresenter
|
141
|
+
class SafeRepresenter < BaseRepresenter
|
142
142
|
|
143
143
|
def ignore_aliases(data)
|
144
|
-
data.nil? ||
|
144
|
+
data.nil? || data.__is_str || TrueClass === data || FalseClass === data || data.__is_int || Float === data
|
145
145
|
end
|
146
146
|
|
147
147
|
def represent_none(data)
|
@@ -158,7 +158,7 @@ module RbYAML
|
|
158
158
|
|
159
159
|
def represent_bool(data)
|
160
160
|
value = data ? "true" : "false"
|
161
|
-
represent_scalar(
|
161
|
+
represent_scalar('tag:yaml.org,2002:bool',value)
|
162
162
|
end
|
163
163
|
|
164
164
|
def represent_int(data)
|
@@ -206,15 +206,24 @@ module RbYAML
|
|
206
206
|
represent_scalar(data.taguri, value)
|
207
207
|
end
|
208
208
|
|
209
|
-
def
|
209
|
+
def represent_ruby(data)
|
210
210
|
state = data.to_yaml_properties
|
211
|
-
|
211
|
+
map = {}
|
212
212
|
state.each do |m|
|
213
213
|
map[m[1..-1]] = data.instance_variable_get(m)
|
214
214
|
end
|
215
|
-
represent_mapping(
|
215
|
+
represent_mapping("!ruby/object:#{data.class.yaml_tag_class_name}", map,nil)
|
216
216
|
end
|
217
217
|
|
218
|
+
def represent_yaml_object(tag, data, flow_style=nil)
|
219
|
+
state = data.to_yaml_properties
|
220
|
+
map = {}
|
221
|
+
state.each do |m|
|
222
|
+
map[m[1..-1]] = data.instance_variable_get(m)
|
223
|
+
end
|
224
|
+
represent_mapping(tag, map, flow_style)
|
225
|
+
end
|
226
|
+
|
218
227
|
def represent_undefined(data)
|
219
228
|
raise RepresenterError.new("cannot represent an object: #{data}")
|
220
229
|
end
|
@@ -231,9 +240,9 @@ module RbYAML
|
|
231
240
|
BaseRepresenter.add_representer(Hash,:represent_dict)
|
232
241
|
BaseRepresenter.add_representer(Set,:represent_set)
|
233
242
|
BaseRepresenter.add_representer(Time,:represent_datetime)
|
243
|
+
BaseRepresenter.add_representer(Object,:represent_ruby)
|
234
244
|
BaseRepresenter.add_representer(nil,:represent_undefined)
|
235
245
|
|
236
|
-
|
237
|
-
include SafeRepresenter
|
246
|
+
class Representer < SafeRepresenter
|
238
247
|
end
|
239
248
|
end
|
@@ -0,0 +1,239 @@
|
|
1
|
+
|
2
|
+
require 'set'
|
3
|
+
|
4
|
+
require 'rbyaml/error'
|
5
|
+
require 'rbyaml/nodes'
|
6
|
+
|
7
|
+
module RbYAML
|
8
|
+
class RepresenterError < YAMLError
|
9
|
+
end
|
10
|
+
|
11
|
+
module BaseRepresenter
|
12
|
+
@@yaml_representers = {}
|
13
|
+
@@yaml_multi_representers = {}
|
14
|
+
|
15
|
+
def initialize_representer(default_style=nil, default_flow_style=nil)
|
16
|
+
@default_style = default_style
|
17
|
+
@default_flow_style = default_flow_style
|
18
|
+
@represented_objects = {}
|
19
|
+
end
|
20
|
+
|
21
|
+
def represent(data)
|
22
|
+
node = represent_data(data)
|
23
|
+
serialize(node)
|
24
|
+
represented_objects = {}
|
25
|
+
end
|
26
|
+
|
27
|
+
CLASSOBJ_TYPE = Class
|
28
|
+
INSTANCE_TYPE = Object
|
29
|
+
FUNCTION_TYPE = Method
|
30
|
+
BUILTIN_FUNCTION_TYPE = Method
|
31
|
+
MODULE_TYPE = Module
|
32
|
+
|
33
|
+
def get_classobj_bases(cls)
|
34
|
+
[cls] + cls.ancestors
|
35
|
+
end
|
36
|
+
|
37
|
+
def represent_data(data)
|
38
|
+
if ignore_aliases(data)
|
39
|
+
alias_key = nil
|
40
|
+
else
|
41
|
+
alias_key = data.object_id
|
42
|
+
end
|
43
|
+
|
44
|
+
if !alias_key.nil?
|
45
|
+
if @represented_objects.include?(alias_key)
|
46
|
+
node = @represented_objects[alias_key]
|
47
|
+
raise RepresenterError.new("recursive objects are not allowed: #{data}") if node.nil?
|
48
|
+
return node
|
49
|
+
end
|
50
|
+
@represented_objects[alias_key] = nil
|
51
|
+
end
|
52
|
+
|
53
|
+
data_types = data.class.ancestors
|
54
|
+
data_types = get_classobj_bases(data.class) + data_types if INSTANCE_TYPE === data
|
55
|
+
|
56
|
+
if @@yaml_representers.include?(data_types[0])
|
57
|
+
node = send(@@yaml_representers[data_types[0]],data)
|
58
|
+
else
|
59
|
+
rerun = true
|
60
|
+
for data_type in data_types
|
61
|
+
if @@yaml_multi_representers.include?(data_type)
|
62
|
+
node = send(@@yaml_multi_representers[data_type],data)
|
63
|
+
rerun = false
|
64
|
+
break
|
65
|
+
elsif @@yaml_representers.include?(data_type)
|
66
|
+
node = send(@@yaml_representers[data_type],data)
|
67
|
+
rerun = false
|
68
|
+
break
|
69
|
+
end
|
70
|
+
end
|
71
|
+
if rerun
|
72
|
+
if @@yaml_multi_representers.include?(nil)
|
73
|
+
node = send(@@yaml_multi_representers[nil],data)
|
74
|
+
elsif @@yaml_representers.include?(nil)
|
75
|
+
node = send(@@yaml_representers[nil],data)
|
76
|
+
else
|
77
|
+
node = ScalarNode.new(nil, data)
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
@represented_objects[alias_key] = node if !alias_key.nil?
|
83
|
+
node
|
84
|
+
end
|
85
|
+
|
86
|
+
def self.add_representer(data_type, representer)
|
87
|
+
@@yaml_representers[data_type] = representer
|
88
|
+
end
|
89
|
+
|
90
|
+
def self.add_multi_representer(data_type, representer)
|
91
|
+
@@yaml_multi_representers[data_type] = representer
|
92
|
+
end
|
93
|
+
|
94
|
+
def represent_scalar(tag, value, style=nil)
|
95
|
+
style ||= @default_style
|
96
|
+
ScalarNode.new(tag, value, style)
|
97
|
+
end
|
98
|
+
|
99
|
+
def represent_sequence(tag, sequence, flow_style=nil)
|
100
|
+
best_style = true
|
101
|
+
value = sequence.map {|item|
|
102
|
+
node_item = represent_data(item)
|
103
|
+
best_style = false if !ScalarNode === node_item && !node_item.style
|
104
|
+
node_item
|
105
|
+
}
|
106
|
+
flow_style ||= (@flow_default_style || best_style)
|
107
|
+
SequenceNode.new(tag, value, flow_style)
|
108
|
+
end
|
109
|
+
|
110
|
+
def represent_mapping(tag, mapping, flow_style=nil)
|
111
|
+
best_style = true
|
112
|
+
if mapping.respond_to?(:keys)
|
113
|
+
value = {}
|
114
|
+
for item_key,item_value in mapping
|
115
|
+
node_key = represent_data(item_key)
|
116
|
+
node_value = represent_data(item_value)
|
117
|
+
best_style = false if !ScalarNode === node_key && !node_key.style
|
118
|
+
best_style = false if !ScalarNode === node_value && !node_value.style
|
119
|
+
value[node_key] = node_value
|
120
|
+
end
|
121
|
+
else
|
122
|
+
value = []
|
123
|
+
for item_key, item_value in mapping
|
124
|
+
node_key = represent_data(item_key)
|
125
|
+
node_value = represent_data(item_value)
|
126
|
+
best_style = false if !ScalarNode === node_key && !node_key.style
|
127
|
+
best_style = false if !ScalarNode === node_value && !node_value.style
|
128
|
+
value << [node_key, node_value]
|
129
|
+
end
|
130
|
+
end
|
131
|
+
flow_style ||= (@flow_default_style || best_style)
|
132
|
+
MappingNode.new(tag, value, flow_style)
|
133
|
+
end
|
134
|
+
|
135
|
+
def ignore_aliases(data)
|
136
|
+
false
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
140
|
+
module SafeRepresenter
|
141
|
+
include BaseRepresenter
|
142
|
+
|
143
|
+
def ignore_aliases(data)
|
144
|
+
data.nil? || String === data || TrueClass === data || FalseClass === data || Integer === data || Float === data
|
145
|
+
end
|
146
|
+
|
147
|
+
def represent_none(data)
|
148
|
+
represent_scalar(data.taguri,"null")
|
149
|
+
end
|
150
|
+
|
151
|
+
def represent_str(data)
|
152
|
+
represent_scalar(data.taguri,data,nil)
|
153
|
+
end
|
154
|
+
|
155
|
+
def represent_symbol(data)
|
156
|
+
represent_scalar(data.taguri,data.to_s)
|
157
|
+
end
|
158
|
+
|
159
|
+
def represent_bool(data)
|
160
|
+
value = data ? "true" : "false"
|
161
|
+
represent_scalar(data.taguri,value)
|
162
|
+
end
|
163
|
+
|
164
|
+
def represent_int(data)
|
165
|
+
represent_scalar(data.taguri,data.to_s)
|
166
|
+
end
|
167
|
+
|
168
|
+
def represent_float(data)
|
169
|
+
if data.infinite? == 1
|
170
|
+
value = ".inf"
|
171
|
+
elsif data.infinite? == -1
|
172
|
+
value = "-.inf"
|
173
|
+
elsif data.nan? || data != data
|
174
|
+
value = ".nan"
|
175
|
+
else
|
176
|
+
value = data.to_s
|
177
|
+
end
|
178
|
+
represent_scalar(data.taguri, value)
|
179
|
+
end
|
180
|
+
|
181
|
+
def represent_list(data)
|
182
|
+
#no support for pairs right now. should probably be there, though...
|
183
|
+
represent_sequence(data.taguri, data)
|
184
|
+
end
|
185
|
+
|
186
|
+
def represent_dict(data)
|
187
|
+
represent_mapping(data.taguri, data)
|
188
|
+
end
|
189
|
+
|
190
|
+
def represent_set(data)
|
191
|
+
value = {}
|
192
|
+
for key in data
|
193
|
+
value[key] = nil
|
194
|
+
end
|
195
|
+
represent_mapping(data.taguri, value)
|
196
|
+
end
|
197
|
+
|
198
|
+
def represent_datetime(data)
|
199
|
+
value = "%04d-%02d-%02d %02d:%02d:%02d" % [data.year, data.month, data.day, data.hour, data.min, data.sec]
|
200
|
+
if data.usec != 0
|
201
|
+
value += "." + (data.usec/1000000.0).to_s.split(/\./)[1]
|
202
|
+
end
|
203
|
+
if data.utc_offset != 0
|
204
|
+
value += data.utc_offset.to_s
|
205
|
+
end
|
206
|
+
represent_scalar(data.taguri, value)
|
207
|
+
end
|
208
|
+
|
209
|
+
def represent_yaml_object(tag, data, flow_style=nil)
|
210
|
+
state = data.to_yaml_properties
|
211
|
+
mapping = {}
|
212
|
+
state.each do |m|
|
213
|
+
map[m[1..-1]] = data.instance_variable_get(m)
|
214
|
+
end
|
215
|
+
represent_mapping(tag, mapping, flow_style)
|
216
|
+
end
|
217
|
+
|
218
|
+
def represent_undefined(data)
|
219
|
+
raise RepresenterError.new("cannot represent an object: #{data}")
|
220
|
+
end
|
221
|
+
end
|
222
|
+
|
223
|
+
BaseRepresenter.add_representer(NilClass,:represent_none)
|
224
|
+
BaseRepresenter.add_representer(String,:represent_str)
|
225
|
+
BaseRepresenter.add_representer(Symbol,:represent_symbol)
|
226
|
+
BaseRepresenter.add_representer(TrueClass,:represent_bool)
|
227
|
+
BaseRepresenter.add_representer(FalseClass,:represent_bool)
|
228
|
+
BaseRepresenter.add_representer(Integer,:represent_int)
|
229
|
+
BaseRepresenter.add_representer(Float,:represent_float)
|
230
|
+
BaseRepresenter.add_representer(Array,:represent_list)
|
231
|
+
BaseRepresenter.add_representer(Hash,:represent_dict)
|
232
|
+
BaseRepresenter.add_representer(Set,:represent_set)
|
233
|
+
BaseRepresenter.add_representer(Time,:represent_datetime)
|
234
|
+
BaseRepresenter.add_representer(nil,:represent_undefined)
|
235
|
+
|
236
|
+
module Representer
|
237
|
+
include SafeRepresenter
|
238
|
+
end
|
239
|
+
end
|