RbYAML 0.0.2 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (44) hide show
  1. data/README +1 -1
  2. data/lib/rbyaml/composer.rb +28 -25
  3. data/lib/rbyaml/composer.rb.~1.2.~ +109 -0
  4. data/lib/rbyaml/constructor.rb +94 -84
  5. data/lib/rbyaml/constructor.rb.~1.2.~ +381 -0
  6. data/lib/rbyaml/dumper.rb +10 -17
  7. data/lib/rbyaml/dumper.rb.~1.2.~ +43 -0
  8. data/lib/rbyaml/emitter.rb +13 -26
  9. data/lib/rbyaml/emitter.rb.~1.2.~ +1116 -0
  10. data/lib/rbyaml/error.rb +15 -21
  11. data/lib/rbyaml/events.rb +29 -5
  12. data/lib/rbyaml/events.rb.~1.2.~ +93 -0
  13. data/lib/rbyaml/loader.rb +11 -23
  14. data/lib/rbyaml/loader.rb.~1.2.~ +52 -0
  15. data/lib/rbyaml/nodes.rb +13 -9
  16. data/lib/rbyaml/nodes.rb.~1.2.~ +52 -0
  17. data/lib/rbyaml/parser.rb +481 -343
  18. data/lib/rbyaml/parser.rb.old +531 -0
  19. data/lib/rbyaml/parser.rb.~1.2.~ +494 -0
  20. data/lib/rbyaml/reader.rb.~1.1.1.1.~ +127 -0
  21. data/lib/rbyaml/representer.rb +26 -17
  22. data/lib/rbyaml/representer.rb.~1.2.~ +239 -0
  23. data/lib/rbyaml/resolver.rb +15 -15
  24. data/lib/rbyaml/resolver.rb.~1.1.~ +163 -0
  25. data/lib/rbyaml/scanner.rb +457 -366
  26. data/lib/rbyaml/scanner.rb.~1.2.~ +1259 -0
  27. data/lib/rbyaml/serializer.rb +19 -17
  28. data/lib/rbyaml/serializer.rb.~1.2.~ +115 -0
  29. data/lib/rbyaml/tokens.rb +44 -4
  30. data/lib/rbyaml/tokens.rb.~1.2.~ +164 -0
  31. data/lib/rbyaml/util.rb +28 -0
  32. data/lib/rbyaml/yaml.rb +12 -12
  33. data/lib/rbyaml/yaml.rb.~1.2.~ +136 -0
  34. data/test/test_bm.rb +28 -0
  35. data/test/test_bm_syck.rb +28 -0
  36. data/test/test_invoke.rb +31 -0
  37. data/test/test_one.rb +5 -0
  38. data/test/test_profile.rb +32 -0
  39. data/test/test_rbyaml.rb +2 -1
  40. data/test/test_rbyaml.rb.~1.2.~ +31 -0
  41. data/test/test_time.rb +13 -8
  42. data/test/test_time.rb.~1.1.~ +29 -0
  43. data/test/yamlx.rb +3563 -0
  44. 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
+
@@ -8,11 +8,12 @@ module RbYAML
8
8
  class RepresenterError < YAMLError
9
9
  end
10
10
 
11
- module BaseRepresenter
11
+ class BaseRepresenter
12
12
  @@yaml_representers = {}
13
13
  @@yaml_multi_representers = {}
14
14
 
15
- def initialize_representer(default_style=nil, default_flow_style=nil)
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 !ScalarNode === node_item && !node_item.style
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 !ScalarNode === node_key && !node_key.style
118
- best_style = false if !ScalarNode === node_value && !node_value.style
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 !ScalarNode === node_key && !node_key.style
127
- best_style = false if !ScalarNode === node_value && !node_value.style
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
- module SafeRepresenter
141
- include BaseRepresenter
141
+ class SafeRepresenter < BaseRepresenter
142
142
 
143
143
  def ignore_aliases(data)
144
- data.nil? || String === data || TrueClass === data || FalseClass === data || Integer === data || Float === data
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(data.taguri,value)
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 represent_yaml_object(tag, data, flow_style=nil)
209
+ def represent_ruby(data)
210
210
  state = data.to_yaml_properties
211
- mapping = {}
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(tag, mapping, flow_style)
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
- module Representer
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