RbYAML 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -6,14 +6,9 @@ module RbYAML
6
6
  class ComposerError < MarkedYAMLError
7
7
  end
8
8
 
9
- module BaseComposer
10
- @@yaml_resolvers = {}
11
-
9
+ module Composer
12
10
  def initialize_composer
13
- @all_anchors = {}
14
- @complete_anchors = {}
15
- @resolver_tags = []
16
- @resolver_paths = []
11
+ @anchors = {}
17
12
  end
18
13
 
19
14
  def check_node
@@ -33,157 +28,82 @@ module RbYAML
33
28
  get_event if check_event(StreamStartEvent)
34
29
  get_event
35
30
  # Compose the root node.
36
- node = compose_node([])
31
+ node = compose_node(nil,nil)
37
32
  # Drop the DOCUMENT-END event.
38
33
  get_event
39
- @all_anchors = {}
40
- @complete_anchors = {}
41
- @resolver_tags = []
42
- @resolver_paths = []
34
+ @anchors = {}
43
35
  node
44
36
  end
45
37
 
46
- def increase_resolver_depth(path)
47
- depth = path.length
48
- tag = []
49
- paths = []
50
- if depth == 0
51
- for resolver_path in @@yaml_resolvers.keys
52
- if resolver_path
53
- paths += resolver_path
54
- else
55
- tag = @@yaml_resolvers[resolver_path]
56
- end
57
- end
58
- else
59
- base, index = path[-1]
60
- if ScalarNode === index && index.tag == DEFAULT_SCALAR_TAG
61
- index = index.value
62
- elsif Node === index
63
- index = nil
64
- end
65
- if @resolver_paths[-1]
66
- for resolver_path in @resolver_paths[-1]
67
- resolver_index = resolver_path[depth-1]
68
- if resolver_index.nil? || resolver_index == index
69
- if resolver_index.length > depth
70
- paths += resolver_path
71
- else
72
- tag = @@yaml_resolvers[resolver_path]
73
- end
74
- end
75
- end
76
- end
77
- end
78
-
79
- @resolver_tags += tag
80
- @resolver_paths += paths
81
- end
82
-
83
- def decrease_resolver_depth
84
- @resolver_tags.pop
85
- @resolver_paths.pop
86
- end
87
-
88
- def compose_node(path)
38
+ def compose_node(parent,index)
89
39
  if check_event(AliasEvent)
90
40
  event = get_event
91
41
  anchor = event.anchor
92
- raise ComposerError.new(nil, nil, "found undefined alias #{anchor}", event.start_mark) if !@all_anchors.include?(anchor)
93
- if !@complete_anchors.include?(anchor)
94
- collection_event = @all_anchors[anchor]
95
- raise ComposerError.new("while composing a collection",collection_event.start_mark,"found recursive anchor #{anchor}",event.start_mark)
96
- end
97
- return @complete_anchors[anchor]
42
+ raise ComposerError.new(nil, nil, "found undefined alias #{anchor}", event.start_mark) if !@anchors.include?(anchor)
43
+ return @anchors[anchor]
98
44
  end
99
- increase_resolver_depth(path)
100
45
  event = peek_event
101
46
  anchor = event.anchor
102
47
  if !anchor.nil?
103
- if @all_anchors.include?(anchor)
104
- raise ComposerError.new("found duplicate anchor #{anchor}; first occurence", @all_anchors[anchor].start_mark,"second occurence", event.start_mark)
48
+ if @anchors.include?(anchor)
49
+ raise ComposerError.new("found duplicate anchor #{anchor}; first occurence", @anchors[anchor].start_mark,"second occurence", event.start_mark)
105
50
  end
106
- @all_anchors[anchor] = event
107
51
  end
52
+ descend_resolver(parent,index)
108
53
  if check_event(ScalarEvent)
109
- node = compose_scalar_node(path)
54
+ node = compose_scalar_node(anchor)
110
55
  elsif check_event(SequenceStartEvent)
111
- node = compose_sequence_node(path)
56
+ node = compose_sequence_node(anchor)
112
57
  elsif check_event(MappingStartEvent)
113
- node = compose_mapping_node(path)
58
+ node = compose_mapping_node(anchor)
114
59
  end
115
-
116
- if !anchor.nil?
117
- @complete_anchors[anchor] = node
118
- end
119
- decrease_resolver_depth
60
+ ascend_resolver
120
61
  node
121
62
  end
122
63
 
123
- def compose_scalar_node(path)
64
+ def compose_scalar_node(anchor)
124
65
  event = get_event
125
- tag = resolve_scalar(path, event.tag, event.implicit, event.value)
126
- ScalarNode.new(tag, event.value,event.start_mark, event.end_mark, style=event.style)
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
127
71
  end
128
72
 
129
- def compose_sequence_node(path)
73
+ def compose_sequence_node(anchor)
130
74
  start_event = get_event
131
- tag = resolve_sequence(path, start_event.tag)
132
- node = SequenceNode.new(tag, [],start_event.start_mark, nil,flow_style=start_event.flow_style)
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?
133
79
  index = 0
134
80
  while !check_event(SequenceEndEvent)
135
- node.value << compose_node(path+[[node, index]])
81
+ node.value << compose_node(node,index)
136
82
  index += 1
137
83
  end
138
-
139
84
  end_event = get_event
140
85
  node.end_mark = end_event.end_mark
141
86
  node
142
87
  end
143
88
 
144
- def compose_mapping_node(path)
89
+ def compose_mapping_node(anchor)
145
90
  start_event = get_event
146
- tag = resolve_mapping(path, start_event.tag)
147
- node = MappingNode.new(tag, {},start_event.start_mark, nil,flow_style=start_event.flow_style)
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?
148
95
  while !check_event(MappingEndEvent)
149
96
  key_event = peek_event
150
- item_key = compose_node(path+[[node, nil]])
151
- item_value = compose_node(path+[[node, item_key]])
97
+ item_key = compose_node(node,nil)
152
98
  if node.value.include?(item_key)
153
99
  raise ComposerError.new("while composing a mapping", start_event.start_mark,"found duplicate key", key_event.start_mark)
154
100
  end
101
+ item_value = compose_node(node,item_key)
155
102
  node.value[item_key] = item_value
156
103
  end
157
104
  end_event = get_event
158
105
  node.end_mark = end_event.end_mark
159
106
  node
160
107
  end
161
-
162
- def resolve_scalar(path, tag, implicit, value)
163
- tag = detect(value) if implicit
164
- tag = resolver_tags[-1] if (tag.nil? || tag == []) && @resolver_tags[-1]
165
- tag = DEFAULT_SCALAR_TAG if tag.nil? || tag == [] || tag == "!"
166
- tag
167
- end
168
-
169
- def resolve_sequence(path, tag)
170
- tag = resolver_tags[-1] if tag.nil? && @resolver_tags[-1]
171
- tag = DEFAULT_SEQUENCE_TAG if tag.nil? || tag == "!"
172
- tag
173
- end
174
-
175
- def resolve_mapping(path, tag)
176
- tag = resolver_tags[-1] if tag.nil? && @resolver_tags[-1]
177
- tag = DEFAULT_MAPPING_TAG if tag.nil? || tag == "!"
178
- tag
179
- end
180
-
181
- def self.add_resolver(tag, path)
182
- @@yaml_resolvers[path] = tag
183
- end
184
- end
185
-
186
- module Composer
187
- include BaseComposer
188
108
  end
189
109
  end
@@ -17,6 +17,7 @@ module RbYAML
17
17
 
18
18
  def initialize_constructor
19
19
  @constructed_objects = {}
20
+ @recursive_objects = {}
20
21
  end
21
22
 
22
23
  def check_data
@@ -39,11 +40,14 @@ module RbYAML
39
40
  def construct_document(node)
40
41
  data = construct_object(node)
41
42
  @constructed_objects = {}
43
+ @recursive_objects = {}
42
44
  data
43
45
  end
44
46
 
45
47
  def construct_object(node)
46
48
  return @constructed_objects[node] if @constructed_objects.include?(node)
49
+ raise ConstructorError.new(nil,nil,"found recursive nod",node.start_mark) if @recursive_objects.include?(node)
50
+ @recursive_objects[node] = nil
47
51
  constructor = nil
48
52
  ruby_cls = RbYAML::tagged_classes[node.tag]
49
53
  if @@yaml_constructors.include?(node.tag)
@@ -61,8 +65,8 @@ module RbYAML
61
65
  else
62
66
  constructor = lambda { |node| @@yaml_multi_constructors[tag_prefix].call(tag_suffix, node) }
63
67
  end
68
+ break
64
69
  end
65
- break
66
70
  end
67
71
  if !through
68
72
  if @@yaml_multi_constructors.include?(nil)
@@ -80,6 +84,7 @@ module RbYAML
80
84
  end
81
85
  data = (Symbol === constructor) ? send(constructor,node) : constructor.call(node)
82
86
  @constructed_objects[node] = data
87
+ @recursive_objects.delete(node)
83
88
  data
84
89
  end
85
90
 
@@ -90,6 +95,8 @@ module RbYAML
90
95
  construct_sequence(node)
91
96
  elsif MappingNode === node
92
97
  construct_mapping(node)
98
+ else
99
+ puts node.tag
93
100
  end
94
101
  end
95
102
 
@@ -1,13 +1,13 @@
1
1
  require 'rbyaml/emitter'
2
2
  require 'rbyaml/serializer'
3
3
  require 'rbyaml/representer'
4
- require 'rbyaml/detector'
4
+ require 'rbyaml/resolver'
5
5
 
6
6
  module RbYAML
7
7
  class CommonDumper
8
8
  include Emitter, Serializer
9
9
 
10
- def initialize(stream,canonical=nil,indent=nil,width=nil,line_break=nil,explicit_start=nil,explicit_end=nil,version=nil,tags=nil)
10
+ def initialize(stream,default_style=nil,default_flow_style=nil,canonical=nil,indent=nil,width=nil,line_break=nil,explicit_start=nil,explicit_end=nil,version=nil,tags=nil)
11
11
  super()
12
12
  initialize_emitter(stream,canonical,indent,width,line_break)
13
13
  initialize_serializer(explicit_start,explicit_end,version,tags)
@@ -15,26 +15,29 @@ module RbYAML
15
15
  end
16
16
 
17
17
  class BaseDumper < CommonDumper
18
- include BaseRepresenter, BaseDetector
19
- def initialize(stream,canonical=nil,indent=nil,width=nil,line_break=nil,explicit_start=nil,explicit_end=nil,version=nil,tags=nil)
18
+ include BaseRepresenter, BaseResolver
19
+ def initialize(stream,default_style=nil,default_flow_style=nil,canonical=nil,indent=nil,width=nil,line_break=nil,explicit_start=nil,explicit_end=nil,version=nil,tags=nil)
20
20
  super
21
- initialize_representer
21
+ initialize_representer(default_style,default_flow_style)
22
+ initialize_resolver
22
23
  end
23
24
  end
24
25
 
25
26
  class SafeDumper < CommonDumper
26
- include SafeRepresenter, Detector
27
- def initialize(stream,canonical=nil,indent=nil,width=nil,line_break=nil,explicit_start=nil,explicit_end=nil,version=nil,tags=nil)
27
+ include SafeRepresenter, Resolver
28
+ def initialize(stream,default_style=nil,default_flow_style=nil,canonical=nil,indent=nil,width=nil,line_break=nil,explicit_start=nil,explicit_end=nil,version=nil,tags=nil)
28
29
  super
29
- initialize_representer
30
+ initialize_representer(default_style,default_flow_style)
31
+ initialize_resolver
30
32
  end
31
33
  end
32
34
 
33
35
  class Dumper < CommonDumper
34
- include Representer, Detector
35
- def initialize(stream,canonical=nil,indent=nil,width=nil,line_break=nil,explicit_start=nil,explicit_end=nil,version=nil,tags=nil)
36
+ include Representer, Resolver
37
+ def initialize(stream,default_style=nil,default_flow_style=nil,canonical=nil,indent=nil,width=nil,line_break=nil,explicit_start=nil,explicit_end=nil,version=nil,tags=nil)
36
38
  super
37
- initialize_representer
38
- end
39
+ initialize_representer(default_style,default_flow_style)
40
+ initialize_resolver
39
41
  end
42
+ end
40
43
  end
@@ -491,19 +491,21 @@ module RbYAML
491
491
  tag = @event.tag
492
492
  if ScalarEvent === @event
493
493
  @style = choose_scalar_style if @style.nil?
494
- if @style == ""
494
+ if ((!@canonical || tag.nil?) && ((@style == "" && @event.implicit[0]) || (@style != "" && @event.implicit[1])))
495
495
  @prepared_tag = nil
496
- return nil
496
+ return
497
497
  end
498
- if @event.implicit && !tag
498
+ if @event.implicit[0] && tag.nil?
499
499
  tag = "!"
500
500
  @prepared_tag = nil
501
501
  end
502
+ else
503
+ if (!@canonical || tag.nil?) && @event.implicit
504
+ @prepared_tag = nil
505
+ return
506
+ end
502
507
  end
503
- if !tag
504
- @prepared_tag = nil
505
- return nil
506
- end
508
+ raise EmitterError.new("tag is not specified") if tag.nil?
507
509
  @prepared_tag = prepare_tag(tag) if @prepared_tag.nil?
508
510
  write_indicator(@prepared_tag, true) if @prepared_tag && !@prepared_tag.empty?
509
511
  @prepared_tag = nil
@@ -512,14 +514,12 @@ module RbYAML
512
514
  def choose_scalar_style
513
515
  @analysis = analyze_scalar(@event.value) if @analysis.nil?
514
516
  return '"' if @event.style == '"' || @canonical
515
- if !@event.style && @event.implicit
517
+ if !@event.style && @event.implicit[0]
516
518
  if !(@simple_key_context && (@analysis.empty || @analysis.multiline)) && ((@flow_level!=0 && @analysis.allow_flow_plain) || (@flow_level == 0 && @analysis.allow_block_plain))
517
519
  return ""
518
520
  end
519
521
  end
520
522
 
521
-
522
-
523
523
  if !@event.style && @event.implicit && (!(@simple_key_context && (@analysis.empty || @analysis.multiline)) &&
524
524
  (@flow_level!=0 && @analysis.allow_flow_plain || (@flow_level==0 && @analysis.allow_block_plain)))
525
525
  return ""
@@ -925,7 +925,7 @@ module RbYAML
925
925
  while ending <= text.length
926
926
  ch = nil
927
927
  ch = text[ending] if ending < text.length
928
- if ch.nil? || '"\\'.include?(ch) || !(?\x20 <= ch && ch <= ?\x7E)
928
+ if ch.nil? || "\"\\\x85".include?(ch) || !(?\x20 <= ch && ch <= ?\x7E)
929
929
  if start < ending
930
930
  data = text[start...ending]
931
931
  @column += data.length
@@ -951,7 +951,7 @@ module RbYAML
951
951
  write_indent
952
952
  @whitespace = false
953
953
  @indention = false
954
- if ch == 32
954
+ if text[start] == 32
955
955
  data = "\\"
956
956
  @column += data.length
957
957
  @stream.write(data)
@@ -8,7 +8,7 @@ module RbYAML
8
8
  end
9
9
 
10
10
  def to_s
11
- attributes = ["@anchor","@tag","@value"] & self.instance_variables
11
+ attributes = ["@anchor","@tag","@implicit","@value"] & self.instance_variables
12
12
  args = attributes.collect {|val| "#{val[1..-1]}=" + eval("#{val}").to_s}.join(", ")
13
13
  "#{self.class.name}(#{args})"
14
14
  end
@@ -23,10 +23,11 @@ module RbYAML
23
23
  end
24
24
 
25
25
  class CollectionStartEvent < NodeEvent
26
- attr_reader :tag, :flow_style
27
- def initialize(anchor,tag,start_mark=nil, end_mark=nil,flow_style=nil)
26
+ attr_reader :tag, :implicit, :flow_style
27
+ def initialize(anchor,tag,implicit,start_mark=nil, end_mark=nil,flow_style=nil)
28
28
  super(anchor,start_mark,end_mark)
29
29
  @tag = tag
30
+ @implicit = implicit
30
31
  @flow_style = flow_style
31
32
  end
32
33
  end
@@ -5,7 +5,7 @@ require 'rbyaml/scanner'
5
5
  require 'rbyaml/parser'
6
6
  require 'rbyaml/composer'
7
7
  require 'rbyaml/constructor'
8
- require 'rbyaml/detector'
8
+ require 'rbyaml/resolver'
9
9
 
10
10
  module RbYAML
11
11
  class CommonLoader
@@ -20,29 +20,32 @@ module RbYAML
20
20
  end
21
21
 
22
22
  class BaseLoader < CommonLoader
23
- include BaseComposer, BaseConstructor, BaseDetector
23
+ include Composer, BaseConstructor, BaseResolver
24
24
  def initialize(stream)
25
25
  super
26
26
  initialize_composer
27
27
  initialize_constructor
28
+ initialize_resolver
28
29
  end
29
30
  end
30
31
 
31
32
  class SafeLoader < CommonLoader
32
- include Composer, SafeConstructor, Detector
33
+ include Composer, SafeConstructor, Resolver
33
34
  def initialize(stream)
34
35
  super
35
36
  initialize_composer
36
37
  initialize_constructor
37
- end
38
+ initialize_resolver
39
+ end
38
40
  end
39
41
 
40
42
  class Loader < CommonLoader
41
- include Composer, Constructor, Detector
43
+ include Composer, Constructor, Resolver
42
44
  def initialize(stream)
43
45
  super
44
46
  initialize_composer
45
47
  initialize_constructor
48
+ initialize_resolver
46
49
  end
47
50
  end
48
51
  end
@@ -11,24 +11,7 @@ module RbYAML
11
11
  end
12
12
 
13
13
  def to_s
14
- value = @value
15
- if Array === value
16
- if value.empty?
17
- value = "<empty>"
18
- elsif value.length == 1
19
- value = "<1 item>"
20
- else
21
- value = "#{value.length} items>"
22
- end
23
- else
24
- if value.length > 75
25
- value = value[0..70].to_s+"..."
26
- else
27
- value = value.to_s
28
- end
29
- end
30
-
31
- "#{self.class.name}(tag=#{@tag}, value=#{value})"
14
+ "#{self.class.name}(tag=#{@tag}, value=#{@value})"
32
15
  end
33
16
  end
34
17
 
@@ -257,37 +257,43 @@ module RbYAML
257
257
  end
258
258
  event = nil
259
259
  collection_events = nil
260
+ implicit = tag.nil? || tag == ?!
260
261
  if indentless_sequence && check_token(BlockEntryToken)
261
262
  end_mark = peek_token.end_mark
262
- event = SequenceStartEvent.new(anchor, tag, start_mark, end_mark)
263
+ event = SequenceStartEvent.new(anchor, tag, implicit, start_mark, end_mark)
263
264
  collection_events = parse_indentless_sequence
264
265
  else
265
266
  if check_token(ScalarToken)
266
267
  token = get_token
267
268
  end_mark = token.end_mark
268
- implicit = ((tag.nil? || tag == "!") && token.implicit)
269
+ if (token.plain && tag.nil?) || tag == ?!
270
+ implicit = [true, false]
271
+ elsif tag.nil?
272
+ implicit = [false, true]
273
+ else
274
+ implicit = [false, false]
275
+ end
269
276
  event = ScalarEvent.new(anchor, tag, implicit, token.value,start_mark, end_mark,token.style)
270
277
  elsif check_token(FlowSequenceStartToken)
271
278
  end_mark = peek_token.end_mark
272
- event = SequenceStartEvent.new(anchor, tag, start_mark, end_mark,true)
279
+ event = SequenceStartEvent.new(anchor, tag, implicit, start_mark, end_mark,true)
273
280
  collection_events = parse_flow_sequence
274
281
  elsif check_token(FlowMappingStartToken)
275
282
  end_mark = peek_token.end_mark
276
- event = MappingStartEvent.new(anchor, tag, start_mark, end_mark,true)
283
+ event = MappingStartEvent.new(anchor, tag, implicit, start_mark, end_mark,true)
277
284
  collection_events = parse_flow_mapping
278
285
  elsif block && check_token(BlockSequenceStartToken)
279
286
  end_mark = peek_token.start_mark
280
- event = SequenceStartEvent.new(anchor, tag, start_mark, end_mark,false)
287
+ event = SequenceStartEvent.new(anchor, tag, implicit, start_mark, end_mark,false)
281
288
  collection_events = parse_block_sequence
282
289
  elsif block && check_token(BlockMappingStartToken)
283
290
  end_mark = peek_token.start_mark
284
- event = MappingStartEvent.new(anchor, tag, start_mark, end_mark,false)
291
+ event = MappingStartEvent.new(anchor, tag, implicit, start_mark, end_mark,false)
285
292
  collection_events = parse_block_mapping
286
293
  elsif !anchor.nil? || !tag.nil?
287
294
  # Empty scalars are allowed even if a tag or an anchor is
288
295
  # specified.
289
- implicit = (tag.nil? || tag == "!")
290
- event = ScalarEvent.new(anchor, tag, implicit,"",start_mark, end_mark)
296
+ event = ScalarEvent.new(anchor, tag, [implicit,false],"",start_mark, end_mark)
291
297
  else
292
298
  if block
293
299
  node = "block"
@@ -398,7 +404,7 @@ module RbYAML
398
404
  while !check_token(FlowSequenceEndToken)
399
405
  if check_token(KeyToken)
400
406
  token = get_token
401
- events << MappingStartEvent.new(nil,nil,token.start_mark, token.end_mark,true)
407
+ events << MappingStartEvent.new(nil,nil,true,token.start_mark, token.end_mark,true)
402
408
  if !check_token(ValueToken,FlowEntryToken, FlowSequenceEndToken)
403
409
  events += parse_flow_node
404
410
  else
@@ -481,7 +487,7 @@ module RbYAML
481
487
  end
482
488
 
483
489
  def process_empty_scalar(mark)
484
- ScalarEvent.new(nil, nil, nil, "", mark, mark)
490
+ ScalarEvent.new(nil, nil, [true, false], "", mark, mark)
485
491
  end
486
492
  end
487
493
  end
@@ -3,7 +3,6 @@ require 'set'
3
3
 
4
4
  require 'rbyaml/error'
5
5
  require 'rbyaml/nodes'
6
- require 'rbyaml/detector'
7
6
 
8
7
  module RbYAML
9
8
  class RepresenterError < YAMLError
@@ -11,18 +10,31 @@ module RbYAML
11
10
 
12
11
  module BaseRepresenter
13
12
  @@yaml_representers = {}
13
+ @@yaml_multi_representers = {}
14
14
 
15
- def initialize_representer
15
+ def initialize_representer(default_style=nil, default_flow_style=nil)
16
+ @default_style = default_style
17
+ @default_flow_style = default_flow_style
16
18
  @represented_objects = {}
17
19
  end
18
20
 
19
21
  def represent(data)
20
- node = represent_object(data)
22
+ node = represent_data(data)
21
23
  serialize(node)
22
24
  represented_objects = {}
23
25
  end
24
26
 
25
- def represent_object(data)
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)
26
38
  if ignore_aliases(data)
27
39
  alias_key = nil
28
40
  else
@@ -38,22 +50,35 @@ module RbYAML
38
50
  @represented_objects[alias_key] = nil
39
51
  end
40
52
 
41
- rerun = false
53
+ data_types = data.class.ancestors
54
+ data_types = get_classobj_bases(data.class) + data_types if INSTANCE_TYPE === data
42
55
 
43
- for data_type in data.class.ancestors
56
+ if @@yaml_representers.include?(data_types[0])
57
+ node = send(@@yaml_representers[data_types[0]],data)
58
+ else
44
59
  rerun = true
45
- if @@yaml_representers.include?(data_type)
46
- node = send(@@yaml_representers[data_type],data)
47
- break
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
48
70
  end
49
- end
50
- if !rerun
51
- if @@yaml_representers.include?(nil)
52
- node = send(@@yaml_representers[nil], data)
53
- else
54
- node = ScalarNode.new(data.taguri, data)
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
55
79
  end
56
80
  end
81
+
57
82
  @represented_objects[alias_key] = node if !alias_key.nil?
58
83
  node
59
84
  end
@@ -61,19 +86,49 @@ module RbYAML
61
86
  def self.add_representer(data_type, representer)
62
87
  @@yaml_representers[data_type] = representer
63
88
  end
89
+
90
+ def self.add_multi_representer(data_type, representer)
91
+ @@yaml_multi_representers[data_type] = representer
92
+ end
64
93
 
65
94
  def represent_scalar(tag, value, style=nil)
95
+ style ||= @default_style
66
96
  ScalarNode.new(tag, value, style)
67
97
  end
68
98
 
69
99
  def represent_sequence(tag, sequence, flow_style=nil)
70
- value = sequence.map {|item| represent_object(item)}
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)
71
107
  SequenceNode.new(tag, value, flow_style)
72
108
  end
73
109
 
74
110
  def represent_mapping(tag, mapping, flow_style=nil)
75
- value = {}
76
- mapping.each { |item_key,item_value| value[represent_object(item_key)] = represent_object(item_value) }
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)
77
132
  MappingNode.new(tag, value, flow_style)
78
133
  end
79
134
 
@@ -94,7 +149,7 @@ module RbYAML
94
149
  end
95
150
 
96
151
  def represent_str(data)
97
- represent_scalar(data.taguri,data)
152
+ represent_scalar(data.taguri,data,nil)
98
153
  end
99
154
 
100
155
  def represent_symbol(data)
@@ -124,6 +179,7 @@ module RbYAML
124
179
  end
125
180
 
126
181
  def represent_list(data)
182
+ #no support for pairs right now. should probably be there, though...
127
183
  represent_sequence(data.taguri, data)
128
184
  end
129
185
 
@@ -0,0 +1,163 @@
1
+ require 'rbyaml/nodes'
2
+ require 'rbyaml/error'
3
+
4
+ module RbYAML
5
+ class ResolverError < MarkedYAMLError
6
+ end
7
+
8
+ DEFAULT_SCALAR_TAG = 'tag:yaml.org,2002:str'
9
+ DEFAULT_SEQUENCE_TAG = 'tag:yaml.org,2002:seq'
10
+ DEFAULT_MAPPING_TAG = 'tag:yaml.org,2002:map'
11
+
12
+ module BaseResolver
13
+ @@yaml_implicit_resolvers = {}
14
+ @@yaml_path_resolvers = {}
15
+
16
+ def initialize_resolver
17
+ @resolver_exact_paths = []
18
+ @resolver_prefix_paths = []
19
+ end
20
+
21
+ def self.add_implicit_resolver(tag, regexp, first)
22
+ if first.nil?
23
+ first = ""
24
+ end
25
+ first.each_byte { |ch|
26
+ @@yaml_implicit_resolvers[ch] ||= []
27
+ @@yaml_implicit_resolvers[ch] << [tag,regexp]
28
+ }
29
+ end
30
+
31
+ def self.add_path_resolver(tag, path, kind=nil)
32
+ new_path = []
33
+ for element in path
34
+ if Array === element
35
+ if element.length == 2
36
+ node_check, index_check = element
37
+ elsif element.length == 1
38
+ node_check = element[0]
39
+ index_check = true
40
+ else
41
+ raise ResolverError.new("Invalid path element: #{element}")
42
+ end
43
+ else
44
+ node_check = nil
45
+ index_check = element
46
+ end
47
+ if String == node_check
48
+ node_check = ScalarNode
49
+ elsif Array == node_check
50
+ node_check = SequenceNode
51
+ elsif Hash == node_check
52
+ node_check = MappingNode
53
+ elsif ![ScalarNode, SequenceNode, MappingNode].include?(node_check) && !Symbol === node_check && !node_check.nil?
54
+ raise ResolverError.new("Invalid node checker: #{node_check}")
55
+ end
56
+ if !(String === index_check || Integer === index_check) && !index_check.nil?
57
+ raise ResolverError.new("Invalid index checker: #{index_check}")
58
+ end
59
+ new_path << [node_check, index_check]
60
+ end
61
+ if String == kind
62
+ kind = ScalarNode
63
+ elsif Array == kind
64
+ kind = SequenceNode
65
+ elsif Hash == kind
66
+ kind = MappingNode
67
+ elsif ![ScalarNode, SequenceNode, MappingNode].include?(kind) && !kind.nil?
68
+ raise ResolverError.new("Invalid node kind: #{kind}")
69
+ end
70
+ @@yaml_path_resolvers[[[new_path], kind]] = tag
71
+ end
72
+
73
+ def descend_resolver(current_node, current_index)
74
+ exact_paths = {}
75
+ prefix_paths = []
76
+ if current_node
77
+ depth = @resolver_prefix_paths.length
78
+ for path, kind in @resolver_prefix_paths[-1]
79
+ if check_resolver_prefix(depth, path, kind,current_node, current_index)
80
+ if path.length > depth
81
+ prefix_paths << [path, kind]
82
+ else
83
+ exact_paths[kind] = @@yaml_path_resolvers[[path, kind]]
84
+ end
85
+ end
86
+ end
87
+ else
88
+ for path, kind in @@yaml_path_resolvers
89
+ if !path
90
+ exact_paths[kind] = @@yaml_path_resolvers[[path, kind]]
91
+ else
92
+ prefix_paths << [path, kind]
93
+ end
94
+ end
95
+ end
96
+ @resolver_exact_paths << exact_paths
97
+ @resolver_prefix_paths << prefix_paths
98
+ end
99
+
100
+ def ascend_resolver
101
+ @resolver_exact_paths.pop
102
+ @resolver_prefix_paths.pop
103
+ end
104
+
105
+ def check_resolver_prefix(depth, path, kind, current_node, current_index)
106
+ node_check, index_check = path[depth-1]
107
+ if String === node_check
108
+ return false if current_node.tag != node_check
109
+ elsif !node_check.nil?
110
+ return false if !node_check === current_node
111
+ end
112
+ return false if index_check==true && !current_index.nil?
113
+ return false if !index_check && current_index.nil?
114
+ if String === index_check
115
+ return false if !(ScalarNode === current_index && index_check == current_index.value)
116
+ elsif Integer === index_check
117
+ return false if index_check != current_index
118
+ end
119
+ true
120
+ end
121
+
122
+ def resolve(kind, value, implicit)
123
+ if ScalarNode == kind && implicit[0]
124
+ if value == ""
125
+ resolvers = @@yaml_implicit_resolvers.fetch("", [])
126
+ else
127
+ resolvers = @@yaml_implicit_resolvers.fetch(value[0], [])
128
+ end
129
+ resolvers += @@yaml_implicit_resolvers.fetch(nil, [])
130
+ for tag, regexp in resolvers
131
+ return tag if regexp =~ value
132
+ end
133
+ implicit = implicit[1]
134
+ end
135
+ exact_paths = @resolver_exact_paths[-1]
136
+ return exact_paths[kind] if exact_paths.include?(kind)
137
+ return exact_paths[nil] if exact_paths.include?(nil)
138
+ if ScalarNode == kind
139
+ return RbYAML::DEFAULT_SCALAR_TAG
140
+ elsif SequenceNode == kind
141
+ return RbYAML::DEFAULT_SEQUENCE_TAG
142
+ elsif MappingNode == kind
143
+ return RbYAML::DEFAULT_MAPPING_TAG
144
+ end
145
+ end
146
+ end
147
+
148
+ module Resolver
149
+ include BaseResolver
150
+ end
151
+
152
+ BaseResolver.add_implicit_resolver('tag:yaml.org,2002:bool',/^(?:y|Y|yes|Yes|YES|n|N|no|No|NO|true|True|TRUE|false|False|FALSE|on|On|ON|off|Off|OFF)$/,'yYnNtTfFoO')
153
+ BaseResolver.add_implicit_resolver('tag:yaml.org,2002:float',/^(?:[-+]?(?:[0-9][0-9_]*)?\.[0-9_]*(?:[eE][-+][0-9]+)?|[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\.[0-9_]*|[-+]?\.(?:inf|Inf|INF)|\.(?:nan|NaN|NAN))$/,'-+0123456789.')
154
+ BaseResolver.add_implicit_resolver('tag:yaml.org,2002:int',/^(?:[-+]?0b[0-1_]+|[-+]?0[0-7_]+|[-+]?(?:0|[1-9][0-9_]*)|[-+]?0x[0-9a-fA-F_]+|[-+]?[1-9][0-9_]*(?::[0-5]?[0-9])+)$/,'-+0123456789')
155
+ BaseResolver.add_implicit_resolver('tag:yaml.org,2002:merge',/^(?:<<)$/,'<')
156
+ BaseResolver.add_implicit_resolver('tag:yaml.org,2002:null',/^(?: ~|null|Null|NULL| )$/,'~nN' + ?\0.chr)
157
+ BaseResolver.add_implicit_resolver('tag:yaml.org,2002:timestamp',/^(?:[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]|[0-9][0-9][0-9][0-9]-[0-9][0-9]?-[0-9][0-9]?(?:[Tt]|[ \t]+)[0-9][0-9]?:[0-9][0-9]:[0-9][0-9](?:\.[0-9]*)?(?:[ \t]*(?:Z|[-+][0-9][0-9]?(?::[0-9][0-9])?))?)$/,'0123456789')
158
+ BaseResolver.add_implicit_resolver('tag:yaml.org,2002:value',/^(?:=)$/,'=')
159
+ # The following implicit resolver is only for documentation purposes. It cannot work
160
+ # because plain scalars cannot start with '!', '&', or '*'.
161
+ BaseResolver.add_implicit_resolver('tag:yaml.org,2002:yaml',/^(?:!|&|\*)$/,'!&*')
162
+ end
163
+
@@ -579,10 +579,7 @@ module RbYAML
579
579
 
580
580
  def check_document_end
581
581
  # DOCUMENT-END: ^ '...' (' '|'\n')
582
- if @column == 0
583
- prefix = peek(4)
584
- return true if prefix(3) == "..." && "\0 \t\r\n\x85".include?(peek(3))
585
- end
582
+ @column == 0 && prefix(3) == "..." && "\0 \t\r\n\x85".include?(peek(3))
586
583
  end
587
584
 
588
585
  def check_block_entry
@@ -1112,13 +1109,17 @@ module RbYAML
1112
1109
  while true
1113
1110
  length = 0
1114
1111
  break if peek == ?#
1115
- while true
1116
- ch = peek(length)
1117
- if "\0 \t\r\n\x85".include?(ch) || (@flow_level==0 && ch == ?: && "\0 \t\r\n\x28".include?(peek(length+1))) || (@flow_level!=0 && ",:?[]{}".include?(ch))
1118
- break
1119
- end
1120
- length += 1
1112
+ while true
1113
+ ch = peek(length)
1114
+ if "\0 \t\r\n\x85".include?(ch) || (@flow_level==0 && ch == ?: && "\0 \t\r\n\x28".include?(peek(length+1))) || (@flow_level!=0 && ",:?[]{}".include?(ch))
1115
+ break
1121
1116
  end
1117
+ length += 1
1118
+ end
1119
+ if @flow_level != 0 && ch == ?: && !"\0 \t\r\n\x28[]{}".include?(peek(length+1))
1120
+ forward(length)
1121
+ raise ScannerError.new("while scanning a plain scalar",start_mark,"found unexpected ':'",get_mark,"Please check http://pyyaml.org/wiki/YAMLColonInFlowContext for details.")
1122
+ end
1122
1123
  break if length == 0
1123
1124
  @allow_simple_key = false
1124
1125
  chunks += spaces
@@ -48,7 +48,7 @@ module RbYAML
48
48
  end
49
49
  emit(DocumentStartEvent.new(@use_explicit_start,@use_version,@use_tags))
50
50
  anchor_node(node)
51
- serialize_node(node)
51
+ serialize_node(node,nil,nil)
52
52
  emit(DocumentEndEvent.new(@use_explicit_end))
53
53
  @serialized_nodes = {}
54
54
  @anchors = {}
@@ -65,9 +65,9 @@ module RbYAML
65
65
  anchor_node(item)
66
66
  end
67
67
  elsif MappingNode === node
68
- for key in node.value.keys
68
+ for key,val in node.value
69
69
  anchor_node(key)
70
- anchor_node(node.value[key])
70
+ anchor_node(val)
71
71
  end
72
72
  end
73
73
  end
@@ -78,38 +78,33 @@ module RbYAML
78
78
  ANCHOR_TEMPLATE % @last_anchor_id
79
79
  end
80
80
 
81
- def serialize_node(node)
81
+ def serialize_node(node,parent,index)
82
82
  talias = @anchors[node]
83
83
  if @serialized_nodes.include?(node)
84
84
  emit(AliasEvent.new(talias))
85
85
  else
86
86
  @serialized_nodes[node] = true
87
+ descend_resolver(parent, index)
87
88
  if ScalarNode === node
88
- detected_tag = detect(node.value)
89
- implicit = node.tag == detect(node.value) || (node.tag == DEFAULT_SCALAR_TAG && detected_tag.nil?)
89
+ detected_tag = resolve(ScalarNode, node.value, [true,false])
90
+ default_tag = resolve(ScalarNode, node.value, [false,true])
91
+ implicit = (node.tag == detected_tag), (node.tag == default_tag)
90
92
  emit(ScalarEvent.new(talias, node.tag, implicit, node.value,nil,nil,node.style))
91
93
  elsif SequenceNode === node
92
- tag = node.tag
93
- tag = nil if tag == DEFAULT_SEQUENCE_TAG && !@canonical
94
- emit(SequenceStartEvent.new(talias, tag,nil,nil,node.flow_style))
94
+ implicit = (node.tag == resolve(SequenceNode, node.value, true))
95
+ emit(SequenceStartEvent.new(talias, node.tag, implicit,node.flow_style))
96
+ index = 0
95
97
  for item in node.value
96
- serialize_node(item)
98
+ serialize_node(item,node,index)
99
+ index += 1
97
100
  end
98
101
  emit(SequenceEndEvent.new)
99
102
  elsif MappingNode === node
100
- tag = node.tag
101
- tag = nil if tag == DEFAULT_MAPPING_TAG && !@canonical
102
- emit(MappingStartEvent.new(talias, tag,nil,nil,node.flow_style))
103
- if node.value.respond_to?(:keys)
104
- for key in node.value.keys
105
- serialize_node(key)
106
- serialize_node(node.value[key])
107
- end
108
- else
109
- for key, value in node.value
110
- serialize_node(key)
111
- serialize_node(value)
112
- end
103
+ implicit = (node.tag == resolve(MappingNode, node.value, true))
104
+ emit(MappingStartEvent.new(talias, node.tag, implicit,node.flow_style))
105
+ for key, value in node.value
106
+ serialize_node(key,node,nil)
107
+ serialize_node(value,node,key)
113
108
  end
114
109
  emit(MappingEndEvent.new)
115
110
  end
@@ -152,11 +152,12 @@ module RbYAML
152
152
  def tid
153
153
  "<scalar>"
154
154
  end
155
- attr_reader :value, :implicit, :style
156
- def initialize(value, implicit, start_mark, end_mark, style=nil)
155
+ attr_reader :value, :plain, :style
156
+ alias :implicit :plain #Until all references to ScalarToken.implicit has been removed
157
+ def initialize(value, plain, start_mark, end_mark, style=nil)
157
158
  super(start_mark, end_mark)
158
159
  @value = value
159
- @implicit = implicit
160
+ @plain = plain
160
161
  @style = style
161
162
  end
162
163
  end
@@ -2,18 +2,6 @@ require 'stringio'
2
2
 
3
3
  require 'rbyaml/error'
4
4
 
5
- require 'rbyaml/reader'
6
- require 'rbyaml/scanner'
7
- require 'rbyaml/parser'
8
- require 'rbyaml/composer'
9
- require 'rbyaml/constructor'
10
-
11
- require 'rbyaml/emitter'
12
- require 'rbyaml/serializer'
13
- require 'rbyaml/representer'
14
-
15
- require 'rbyaml/detector'
16
-
17
5
  require 'rbyaml/tokens'
18
6
  require 'rbyaml/events'
19
7
  require 'rbyaml/nodes'
@@ -60,24 +48,24 @@ module RbYAML
60
48
  _load(stream, SafeLoader)
61
49
  end
62
50
 
63
- def self._emit(events, stream=nil, dumper=Dumper,canonical=nil, indent=nil, width=nil,line_break=nil)
51
+ def self._emit(events, stream=nil, dumper=Dumper,default_style=nil,default_flow_style=nil,canonical=nil, indent=nil, width=nil,line_break=nil)
64
52
  if stream.nil?
65
53
  require 'stringio'
66
54
  stream = StringIO.new
67
55
  end
68
- dumper = dumper.new(stream,canonical,indent,width,line_break)
56
+ dumper = dumper.new(stream,default_style,default_flow_style,canonical,indent,width,line_break)
69
57
  for event in events
70
58
  dumper.emit(event)
71
59
  end
72
60
  stream.string if StringIO === stream
73
61
  end
74
62
 
75
- def self._serialize_all(nodes,stream=nil,dumper=Dumper,canonical=nil,indent=nil,width=nil,line_break=nil,explicit_start=nil,explicit_end=nil,version=nil,tags=nil)
63
+ def self._serialize_all(nodes,stream=nil,dumper=Dumper,default_style=nil,default_flow_style=nil,canonical=nil,indent=nil,width=nil,line_break=nil,explicit_start=nil,explicit_end=nil,version=nil,tags=nil)
76
64
  if stream.nil?
77
65
  require 'stringio'
78
66
  stream = StringIO.new
79
67
  end
80
- dumper = dumper.new(stream,canonical,indent,width,line_break,version,tags,explicit_start,explicit_end)
68
+ dumper = dumper.new(stream,default_style,default_flow_style,canonical,indent,width,line_break,version,tags,explicit_start,explicit_end)
81
69
  dumper.open
82
70
  for node in nodes
83
71
  dumper.serialize(node)
@@ -90,12 +78,12 @@ module RbYAML
90
78
  _serialize_all([node], stream, dumper, *kwds)
91
79
  end
92
80
 
93
- def self._dump_all(documents,stream=nil,dumper=Dumper,canonical=nil,indent=nil,width=nil,line_break=nil,explicit_start=nil,explicit_end=nil,version=nil,tags=nil)
81
+ def self._dump_all(documents,stream=nil,dumper=Dumper,default_style=nil,default_flow_style=nil,canonical=nil,indent=nil,width=nil,line_break=nil,explicit_start=nil,explicit_end=nil,version=nil,tags=nil)
94
82
  if stream.nil?
95
83
  require 'stringio'
96
84
  stream = StringIO.new
97
85
  end
98
- dumper = dumper.new(stream,canonical,indent,width,line_break,version,tags,explicit_start,explicit_end)
86
+ dumper = dumper.new(stream,default_style,default_flow_style,canonical,indent,width,line_break,version,tags,explicit_start,explicit_end)
99
87
  dumper.open
100
88
  for data in documents
101
89
  dumper.represent(data)
@@ -116,13 +104,14 @@ module RbYAML
116
104
  _dump_all([data], stream, SafeDumper, *kwds)
117
105
  end
118
106
 
119
- def self._add_detector(tag, regexp, first=nil, loader=Loader, dumper=Dumper)
120
- loader.add_detector(tag, regexp, first)
121
- dumper.add_detector(tag, regexp, first)
107
+ def self._add_implicit_resolver(tag, regexp, first=nil, loader=Loader, dumper=Dumper)
108
+ loader.add_implicit_resolver(tag, regexp, first)
109
+ dumper.add_implicit_resolver(tag, regexp, first)
122
110
  end
123
111
 
124
- def self._add_resolver(tag, path, loader=Loader)
125
- loader.add_resolver(tag, path)
112
+ def self._add_path_resolver(tag, path, kind=nil, loader=Loader, dumper=Dumper)
113
+ loader.add_path_resolver(tag, path, kind)
114
+ lumper.add_path_resolver(tag, path, kind)
126
115
  end
127
116
 
128
117
  def self._add_constructor(tag, constructor, loader=Loader)
@@ -133,11 +122,15 @@ module RbYAML
133
122
  loader.add_multi_constructor(tag_prefix, multi_constructor)
134
123
  end
135
124
 
136
- def self._dump_ruby_object(data, dumper=Dumper)
137
- _dump(data,nil,dumper)
125
+ def self._add_representer(data_type, representer, dumper=Dumper)
126
+ dumper.add_representer(data_type, representer)
138
127
  end
139
128
 
140
- class SimpleDetector
141
- include Detector
129
+ def self._add_multi_representer(data_type, multi_representer, dumper=Dumper)
130
+ dumper.add_multi_representer(data_type, multi_representer)
131
+ end
132
+
133
+ def self._dump_ruby_object(data, dumper=Dumper)
134
+ _dump(data,nil,dumper)
142
135
  end
143
136
  end
@@ -11,8 +11,21 @@ class TestRbYAML < Test::Unit::TestCase
11
11
  end
12
12
 
13
13
  def test_basic_dump
14
- assert_equal("A: b\nc: 3.14\n",RbYAML.dump({"A"=>"b","c"=>3.14}))
14
+ answ,ver1,ver2 = RbYAML.dump({"A"=>"b","c"=>3.14}),"A: b\nc: 3.14\n", "c: 3.14\nA: b\n"
15
+ assert_equal(true, ver1 == answ || ver2 == answ,"was #{answ.inspect} but should be #{ver1.inspect} or #{ver2.inspect}")
15
16
  assert_equal("- A\n- b\n- c\n",RbYAML.dump(["A","b","c"]))
16
17
  assert_equal("foo\n",RbYAML.dump("foo"))
17
18
  end
18
19
  end
20
+
21
+ class TestRbYAMLFromFiles < Test::Unit::TestCase
22
+ FILES = %w{test1 test2 test3 test4 test5 test6 test7 test8 test9 test10 test12 test13 test14 test15 test16 test18 test19 test20}
23
+
24
+ FILES.each { |test|
25
+ self.class_eval <<-ENDCLS
26
+ def test_#{test}
27
+ RbYAML.dump(open(File.expand_path(File.join(File.dirname(__FILE__),"yaml","#{test}.yml")),"r") {|f| RbYAML.load(f)})
28
+ end
29
+ ENDCLS
30
+ }
31
+ end
@@ -0,0 +1,29 @@
1
+ $:.unshift File.join(File.dirname(__FILE__), "..", "lib")
2
+
3
+ require 'rbyaml'
4
+
5
+ class Time
6
+ def self.time(times = 1)
7
+ if block_given?
8
+ before = Time.now
9
+ times.times {
10
+ yield
11
+ }
12
+ after = Time.now
13
+ return after-before
14
+ end
15
+ end
16
+ end
17
+
18
+ DO_TIMES = 10000
19
+ ttimes = Time.time(DO_TIMES) {
20
+ open("yaml/test1.yml") { |f| RbYAML::load(f) }
21
+ }
22
+
23
+ ttimes2 = Time.time(DO_TIMES) {
24
+ RbYAML::dump(open("yaml/test1.yml") { |f| RbYAML::load(f) })
25
+ } - ttimes
26
+
27
+ puts "loading a file #{DO_TIMES} times took #{ttimes.to_f * 1000} milli seconds"
28
+
29
+ puts "dumping a file #{DO_TIMES} times took #{ttimes2.to_f * 1000} milliseconds"
metadata CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.8.11
3
3
  specification_version: 1
4
4
  name: RbYAML
5
5
  version: !ruby/object:Gem::Version
6
- version: 0.0.1
7
- date: 2006-05-09 00:00:00 +02:00
6
+ version: 0.0.2
7
+ date: 2006-05-19 00:00:00 -07:00
8
8
  summary: A pure Ruby YAML parser and emitter, mostly supporting YAML 1.1.
9
9
  require_paths:
10
10
  - lib
@@ -32,7 +32,6 @@ files:
32
32
  - lib/rbyaml.rb
33
33
  - lib/rbyaml/composer.rb
34
34
  - lib/rbyaml/constructor.rb
35
- - lib/rbyaml/detector.rb
36
35
  - lib/rbyaml/dumper.rb
37
36
  - lib/rbyaml/emitter.rb
38
37
  - lib/rbyaml/error.rb
@@ -42,12 +41,14 @@ files:
42
41
  - lib/rbyaml/parser.rb
43
42
  - lib/rbyaml/reader.rb
44
43
  - lib/rbyaml/representer.rb
44
+ - lib/rbyaml/resolver.rb
45
45
  - lib/rbyaml/scanner.rb
46
46
  - lib/rbyaml/serializer.rb
47
47
  - lib/rbyaml/test.rb
48
48
  - lib/rbyaml/tokens.rb
49
49
  - lib/rbyaml/yaml.rb
50
50
  - test/test_rbyaml.rb
51
+ - test/test_time.rb
51
52
  - test/yaml
52
53
  - test/yaml/gems.yml
53
54
  - test/yaml/gems2.yml
@@ -1,44 +0,0 @@
1
-
2
- module RbYAML
3
- DEFAULT_SCALAR_TAG = 'tag:yaml.org,2002:str'
4
- DEFAULT_SEQUENCE_TAG = 'tag:yaml.org,2002:seq'
5
- DEFAULT_MAPPING_TAG = 'tag:yaml.org,2002:map'
6
-
7
- module BaseDetector
8
- @@yaml_detectors = {}
9
-
10
- def self.add_detector(tag, regexp, first)
11
- first.each_byte { |ch|
12
- @@yaml_detectors[ch] ||= []
13
- @@yaml_detectors[ch] << [tag,regexp]
14
- }
15
- end
16
-
17
- def detect(value)
18
- if value == ""
19
- detectors = @@yaml_detectors.fetch(?\0, [])
20
- else
21
- detectors = @@yaml_detectors.fetch(value[0], [])
22
- end
23
- detectors += @@yaml_detectors.fetch(nil, [])
24
- for tag, regexp in detectors
25
- return tag if regexp =~ value
26
- end
27
- nil
28
- end
29
- end
30
- module Detector
31
- include BaseDetector
32
- end
33
-
34
- BaseDetector.add_detector('tag:yaml.org,2002:bool',/^(?:y|Y|yes|Yes|YES|n|N|no|No|NO|true|True|TRUE|false|False|FALSE|on|On|ON|off|Off|OFF)$/,'yYnNtTfFoO')
35
- BaseDetector.add_detector('tag:yaml.org,2002:float',/^(?:[-+]?(?:[0-9][0-9_]*)?\.[0-9_]*(?:[eE][-+][0-9]+)?|[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\.[0-9_]*|[-+]?\.(?:inf|Inf|INF)|\.(?:nan|NaN|NAN))$/,'-+0123456789.')
36
- BaseDetector.add_detector('tag:yaml.org,2002:int',/^(?:[-+]?0b[0-1_]+|[-+]?0[0-7_]+|[-+]?(?:0|[1-9][0-9_]*)|[-+]?0x[0-9a-fA-F_]+|[-+]?[1-9][0-9_]*(?::[0-5]?[0-9])+)$/,'-+0123456789')
37
- BaseDetector.add_detector('tag:yaml.org,2002:merge',/^(?:<<)$/,'<')
38
- BaseDetector.add_detector('tag:yaml.org,2002:null',/^(?: ~|null|Null|NULL| )$/,'~nN' + ?\0.chr)
39
- BaseDetector.add_detector('tag:yaml.org,2002:timestamp',/^(?:[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]|[0-9][0-9][0-9][0-9]-[0-9][0-9]?-[0-9][0-9]?(?:[Tt]|[ \t]+)[0-9][0-9]?:[0-9][0-9]:[0-9][0-9](?:\.[0-9]*)?(?:[ \t]*(?:Z|[-+][0-9][0-9]?(?::[0-9][0-9])?))?)$/,'0123456789')
40
- BaseDetector.add_detector('tag:yaml.org,2002:value',/^(?:=)$/,'=')
41
- # The following detector is only for documentation purposes. It cannot work
42
- # because plain scalars cannot start with '!', '&', or '*'.
43
- BaseDetector.add_detector('tag:yaml.org,2002:yaml',/^(?:!|&|\*)$/,'!&*')
44
- end