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.
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