RbYAML 0.0.2 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|