Fix up Rubinius specific library specs.
[rbx.git] / lib / rbyaml / representer.rb
blobcfceac2a99488c07cf1cba45269c44961f607621
1 require 'set'
2 require 'date'
4 require 'rbyaml/error'
5 require 'rbyaml/nodes'
7 module RbYAML
8   class RepresenterError < YAMLError
9   end
11   class BaseRepresenter
12     def initialize(serializer, opts={})
13       @serializer = serializer
14       @default_style = opts[:UseDouble] ? '"' : (opts[:UseSingle] ? "'" : nil)
15       @represented_objects = {}
16     end
18     def represent(data)
19       node = represent_data(data)
20       @serializer.serialize(node)
21       represented_objects = {}
22     end
24     def represent_data(data)
25       if ignore_aliases(data)
26         alias_key = nil
27       else
28         alias_key = data.object_id
29       end
30       
31       if !alias_key.nil?
32         if @represented_objects.include?(alias_key)
33           node = @represented_objects[alias_key]
34           raise RepresenterError.new("recursive objects are not allowed: #{data}") if node.nil?
35           return node
36         end
37         @represented_objects[alias_key] = nil
38       end
39       node = data.to_yaml_node(self)
40       @represented_objects[alias_key] = node if !alias_key.nil?
41       node
42     end
43     
44     def scalar(tag, value, style=nil)
45       represent_scalar(tag,value,style)
46     end
48     def represent_scalar(tag, value, style=nil)
49       style ||= @default_style
50       ScalarNode.new(tag,value,style)
51     end
53     def seq(tag, sequence, flow_style=nil)
54       represent_sequence(tag,sequence,flow_style)
55     end
57     def represent_sequence(tag, sequence, flow_style=nil)
58       best_style = false
59       value = sequence.map {|item|
60         node_item = represent_data(item)
61         best_style = false if !node_item.__is_scalar && !node_item.flow_style
62         node_item
63       }
64       flow_style ||= (@flow_default_style || best_style)
65       SequenceNode.new(tag, value, flow_style)
66     end
68     def map(tag, *args)
69       mapping, flow_style = case args.length
70                             when 1 then
71                               mapping = {}
72                               def mapping.add(key, value) self[key] = value end
73                               yield mapping
74                               [mapping, args.first]
75                             when 2 then
76                               args
77                             else
78                               raise ArgumentError,
79                                     "wrong number of arguments (#{args.length})"
80                             end
82       represent_mapping(tag,mapping,flow_style)
83     end
85     def represent_mapping(tag, mapping, flow_style=nil)
86       best_style = false
87       if mapping.respond_to?(:keys)
88         value = {}
89         for item_key,item_value in mapping
90           node_key = represent_data(item_key)
91           node_value = represent_data(item_value)
92           best_style = false if !node_key.__is_scalar && !node_key.flow_style
93           best_style = false if !node_value.__is_scalar && !node_value.flow_style
94           value[node_key] = node_value
95         end
96       else
97         value = []
98         for item_key, item_value in mapping
99           node_key = represent_data(item_key)
100           node_value = represent_data(item_value)
101           best_style = false if !node_key.__is_scalar && !node_key.flow_style
102           best_style = false if !node_value.__is_scalar && !node_value.flow_style
103           value << [node_key, node_value]
104         end
105       end
106       flow_style ||= (@flow_default_style || best_style)
107       MappingNode.new(tag, value, flow_style)
108     end
110     def ignore_aliases(data)
111       false
112     end
113   end
115   class SafeRepresenter < BaseRepresenter
116     def ignore_aliases(data)
117       data.nil? || data.__is_str || TrueClass === data || FalseClass === data || data.__is_int || Float === data
118     end
119   end
121   class Representer < SafeRepresenter
122   end