RbYAML 0.1.0 → 0.2.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 (81) hide show
  1. data/lib/rbyaml.rb +14 -256
  2. data/lib/rbyaml.rb.~1.2.~ +383 -0
  3. data/lib/rbyaml/composer.rb +9 -11
  4. data/lib/rbyaml/{composer.rb.~1.2.~ → composer.rb.~1.3.~} +28 -25
  5. data/lib/rbyaml/constants.rb +95 -0
  6. data/lib/rbyaml/constructor.rb +180 -89
  7. data/lib/rbyaml/{constructor.rb.~1.2.~ → constructor.rb.~1.9.~} +137 -95
  8. data/lib/rbyaml/dumper.rb +12 -9
  9. data/lib/rbyaml/dumper.rb.~1.3.~ +36 -0
  10. data/lib/rbyaml/emitter.rb +14 -28
  11. data/lib/rbyaml/{emitter.rb.~1.2.~ → emitter.rb.~1.6.~} +22 -33
  12. data/lib/rbyaml/error.rb +4 -57
  13. data/lib/rbyaml/error.rb.~1.2.~ +75 -0
  14. data/lib/rbyaml/events.rb +8 -14
  15. data/lib/rbyaml/{events.rb.~1.2.~ → events.rb.~1.4.~} +29 -6
  16. data/lib/rbyaml/nodes.rb +5 -5
  17. data/lib/rbyaml/{nodes.rb.~1.2.~ → nodes.rb.~1.3.~} +13 -9
  18. data/lib/rbyaml/parser.rb +70 -108
  19. data/lib/rbyaml/parser.rb.~1.4.~ +632 -0
  20. data/lib/rbyaml/representer.rb +19 -157
  21. data/lib/rbyaml/representer.rb.old +317 -0
  22. data/lib/rbyaml/{representer.rb.~1.2.~ → representer.rb.~1.5.~} +60 -26
  23. data/lib/rbyaml/resolver.rb +6 -6
  24. data/lib/rbyaml/{resolver.rb.~1.1.~ → resolver.rb.~1.6.~} +20 -20
  25. data/lib/rbyaml/rubytypes.rb +391 -0
  26. data/lib/rbyaml/scanner.rb +123 -225
  27. data/lib/rbyaml/{scanner.rb.~1.2.~ → scanner.rb.~1.5.~} +466 -378
  28. data/lib/rbyaml/serializer.rb +9 -9
  29. data/lib/rbyaml/{serializer.rb.~1.2.~ → serializer.rb.~1.4.~} +19 -17
  30. data/lib/rbyaml/stream.rb +48 -0
  31. data/lib/rbyaml/tag.rb +72 -0
  32. data/lib/rbyaml/tokens.rb +22 -16
  33. data/lib/rbyaml/{tokens.rb.~1.2.~ → tokens.rb.~1.3.~} +44 -4
  34. data/lib/rbyaml/types.rb +146 -0
  35. data/lib/rbyaml/util.rb.~1.3.~ +38 -0
  36. data/lib/rbyaml/yaml.rb +22 -32
  37. data/lib/rbyaml/{yaml.rb.~1.2.~ → yaml.rb.~1.5.~} +17 -17
  38. data/test/load_one.rb +6 -0
  39. data/test/load_one_yaml.rb +6 -0
  40. data/test/output_events.rb +9 -0
  41. data/test/test_add_ctor.rb +51 -0
  42. data/test/test_add_ctor.rb.~1.1.~ +30 -0
  43. data/test/test_bm.rb +2 -2
  44. data/test/test_bm.rb.~1.1.~ +28 -0
  45. data/test/test_gems.rb +10 -0
  46. data/test/test_one.rb.~1.1.~ +5 -0
  47. data/test/test_one_syck.rb +5 -0
  48. data/test/test_rbyaml.rb +63 -32
  49. data/test/test_rbyaml.rb.~1.6.~ +59 -0
  50. data/test/{test_rbyaml.rb.~1.2.~ → test_rbyaml_old.rb} +13 -4
  51. data/test/test_time_events.rb +24 -0
  52. data/test/test_time_nodes.rb +24 -0
  53. data/test/test_time_tokens.rb +24 -0
  54. data/test/yaml/gems_new.yml +147456 -0
  55. data/test/yaml/test1.rb +8 -0
  56. data/test/yaml/test10.rb +14 -0
  57. data/test/yaml/test11.rb +13 -0
  58. data/test/yaml/test12.rb +9 -0
  59. data/test/yaml/test13.rb +9 -0
  60. data/test/yaml/test14.rb +13 -0
  61. data/test/yaml/test15.rb +12 -0
  62. data/test/yaml/test16.rb +11 -0
  63. data/test/yaml/test16.rb.~1.1.~ +11 -0
  64. data/test/yaml/test17.rb +10 -0
  65. data/test/yaml/test18.rb +13 -0
  66. data/test/yaml/test19.rb +9 -0
  67. data/test/yaml/test19.yml +1 -1
  68. data/test/yaml/test2.rb +8 -0
  69. data/test/yaml/test20.rb +11 -0
  70. data/test/yaml/test20.rb.~1.1.~ +9 -0
  71. data/test/yaml/test20.yml +1 -1
  72. data/test/yaml/test3.rb +13 -0
  73. data/test/yaml/test4.rb +13 -0
  74. data/test/yaml/test5.rb +8 -0
  75. data/test/yaml/test6.rb +10 -0
  76. data/test/yaml/test7.rb +15 -0
  77. data/test/yaml/test8.rb +15 -0
  78. data/test/yaml/test9.rb +13 -0
  79. metadata +61 -16
  80. data/lib/rbyaml/dumper.rb.~1.2.~ +0 -43
  81. data/lib/rbyaml/parser.rb.~1.2.~ +0 -494
@@ -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
 
@@ -93,14 +94,14 @@ module RbYAML
93
94
 
94
95
  def represent_scalar(tag, value, style=nil)
95
96
  style ||= @default_style
96
- ScalarNode.new(tag, value, style)
97
+ ScalarNode.new(tag,value,nil,nil,style)
97
98
  end
98
99
 
99
100
  def represent_sequence(tag, sequence, flow_style=nil)
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,28 +138,39 @@ 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)
148
- represent_scalar(data.taguri,"null")
148
+ # represent_scalar(data.taguri,"null")
149
+ represent_scalar('tag:yaml.org,2002:str',"")
149
150
  end
150
151
 
152
+ NON_PRINTABLE = /[^\x09\x0A\x0D\x20-\x7E\x85\xA0-\xFF]/
151
153
  def represent_str(data)
152
- represent_scalar(data.taguri,data,nil)
154
+ style = nil
155
+ if NON_PRINTABLE =~ data
156
+ data = Base64.encode64(data)
157
+ data.taguri ="tag:yaml.org,2002:binary"
158
+ style = "|"
159
+ end
160
+ represent_scalar(data.taguri,data,style)
153
161
  end
154
162
 
155
163
  def represent_symbol(data)
156
164
  represent_scalar(data.taguri,data.to_s)
157
165
  end
158
166
 
167
+ def represent_private_type(data)
168
+ represent_scalar(data.type_id,data.value)
169
+ end
170
+
159
171
  def represent_bool(data)
160
172
  value = data ? "true" : "false"
161
- represent_scalar(data.taguri,value)
173
+ represent_scalar('tag:yaml.org,2002:bool',value)
162
174
  end
163
175
 
164
176
  def represent_int(data)
@@ -196,25 +208,46 @@ module RbYAML
196
208
  end
197
209
 
198
210
  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]
211
+ tz = "Z"
212
+ # from the tidy Tobias Peters <t-peters@gmx.de> Thanks!
213
+ unless data.utc?
214
+ utc_same_instant = data.dup.utc
215
+ utc_same_writing = Time.utc(data.year,data.month,data.day,data.hour,data.min,data.sec,data.usec)
216
+ difference_to_utc = utc_same_writing - utc_same_instant
217
+ if (difference_to_utc < 0)
218
+ difference_sign = '-'
219
+ absolute_difference = -difference_to_utc
220
+ else
221
+ difference_sign = '+'
222
+ absolute_difference = difference_to_utc
223
+ end
224
+ difference_minutes = (absolute_difference/60).round
225
+ tz = "%s%02d:%02d" % [ difference_sign, difference_minutes / 60, difference_minutes % 60]
202
226
  end
203
- if data.utc_offset != 0
204
- value += data.utc_offset.to_s
227
+ standard = data.strftime( "%Y-%m-%d %H:%M:%S" )
228
+ standard += ".%06d" % [data.usec] if data.usec.nonzero?
229
+ standard += " %s" % [tz]
230
+ represent_scalar(data.taguri, standard)
231
+ end
232
+
233
+ def represent_ruby(data)
234
+ state = data.to_yaml_properties
235
+ map = {}
236
+ state.each do |m|
237
+ map[m[1..-1]] = data.instance_variable_get(m)
205
238
  end
206
- represent_scalar(data.taguri, value)
239
+ represent_mapping("!ruby/object:#{data.class.yaml_tag_class_name}", map,nil)
207
240
  end
208
241
 
209
242
  def represent_yaml_object(tag, data, flow_style=nil)
210
243
  state = data.to_yaml_properties
211
- mapping = {}
244
+ map = {}
212
245
  state.each do |m|
213
246
  map[m[1..-1]] = data.instance_variable_get(m)
214
247
  end
215
- represent_mapping(tag, mapping, flow_style)
248
+ represent_mapping(tag, map, flow_style)
216
249
  end
217
-
250
+
218
251
  def represent_undefined(data)
219
252
  raise RepresenterError.new("cannot represent an object: #{data}")
220
253
  end
@@ -231,9 +264,10 @@ module RbYAML
231
264
  BaseRepresenter.add_representer(Hash,:represent_dict)
232
265
  BaseRepresenter.add_representer(Set,:represent_set)
233
266
  BaseRepresenter.add_representer(Time,:represent_datetime)
267
+ BaseRepresenter.add_representer(PrivateType,:represent_private_type)
268
+ BaseRepresenter.add_representer(Object,:represent_ruby)
234
269
  BaseRepresenter.add_representer(nil,:represent_undefined)
235
270
 
236
- module Representer
237
- include SafeRepresenter
271
+ class Representer < SafeRepresenter
238
272
  end
239
273
  end
@@ -3,7 +3,7 @@ require 'rbyaml/nodes'
3
3
  require 'rbyaml/error'
4
4
 
5
5
  module RbYAML
6
- class ResolverError < MarkedYAMLError
6
+ class ResolverError < YAMLError
7
7
  end
8
8
 
9
9
  DEFAULT_SCALAR_TAG = 'tag:yaml.org,2002:str'
@@ -11,7 +11,7 @@ module RbYAML
11
11
  DEFAULT_MAPPING_TAG = 'tag:yaml.org,2002:map'
12
12
 
13
13
  class BaseResolver
14
- @@yaml_implicit_resolvers = {}
14
+ @@yaml_implicit_resolvers = {""=>[['tag:yaml.org,2002:null',/^$/]]}
15
15
  @@yaml_path_resolvers = {}
16
16
 
17
17
  def initialize
@@ -86,7 +86,7 @@ module RbYAML
86
86
  end
87
87
  end
88
88
  else
89
- for path, kind in @@yaml_path_resolvers
89
+ for path, kind in @@yaml_path_resolvers.keys
90
90
  if !path
91
91
  exact_paths[kind] = @@yaml_path_resolvers[[path, kind]]
92
92
  else
@@ -149,11 +149,11 @@ module RbYAML
149
149
  class Resolver < BaseResolver
150
150
  end
151
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.')
152
+ BaseResolver.add_implicit_resolver('tag:yaml.org,2002:bool',/^(?:yes|Yes|YES|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-9_]+(?:[eE][-+][0-9]+)?|[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\.[0-9_]*|[-+]?\.(?:inf|Inf|INF)|\.(?:nan|NaN|NAN))$/,'-+0123456789.')
154
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
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)
156
+ BaseResolver.add_implicit_resolver('tag:yaml.org,2002:null',/^(?:~|null|Null|NULL| )$/,'~nN' + ?\0.chr)
157
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
158
  BaseResolver.add_implicit_resolver('tag:yaml.org,2002:value',/^(?:=)$/,'=')
159
159
  # The following implicit resolver is only for documentation purposes. It cannot work
@@ -1,19 +1,20 @@
1
+ require 'rbyaml/util'
1
2
  require 'rbyaml/nodes'
2
3
  require 'rbyaml/error'
3
4
 
4
5
  module RbYAML
5
- class ResolverError < MarkedYAMLError
6
+ class ResolverError < YAMLError
6
7
  end
7
8
 
8
9
  DEFAULT_SCALAR_TAG = 'tag:yaml.org,2002:str'
9
10
  DEFAULT_SEQUENCE_TAG = 'tag:yaml.org,2002:seq'
10
11
  DEFAULT_MAPPING_TAG = 'tag:yaml.org,2002:map'
11
12
 
12
- module BaseResolver
13
+ class BaseResolver
13
14
  @@yaml_implicit_resolvers = {}
14
15
  @@yaml_path_resolvers = {}
15
16
 
16
- def initialize_resolver
17
+ def initialize
17
18
  @resolver_exact_paths = []
18
19
  @resolver_prefix_paths = []
19
20
  end
@@ -31,7 +32,7 @@ module RbYAML
31
32
  def self.add_path_resolver(tag, path, kind=nil)
32
33
  new_path = []
33
34
  for element in path
34
- if Array === element
35
+ if element.__is_a
35
36
  if element.length == 2
36
37
  node_check, index_check = element
37
38
  elsif element.length == 1
@@ -50,10 +51,10 @@ module RbYAML
50
51
  node_check = SequenceNode
51
52
  elsif Hash == node_check
52
53
  node_check = MappingNode
53
- elsif ![ScalarNode, SequenceNode, MappingNode].include?(node_check) && !Symbol === node_check && !node_check.nil?
54
+ elsif ![ScalarNode, SequenceNode, MappingNode].include?(node_check) && !node_check.__is_sym && !node_check.nil?
54
55
  raise ResolverError.new("Invalid node checker: #{node_check}")
55
56
  end
56
- if !(String === index_check || Integer === index_check) && !index_check.nil?
57
+ if !(index_check.__is_str || index_check.__is_int) && !index_check.nil?
57
58
  raise ResolverError.new("Invalid index checker: #{index_check}")
58
59
  end
59
60
  new_path << [node_check, index_check]
@@ -85,7 +86,7 @@ module RbYAML
85
86
  end
86
87
  end
87
88
  else
88
- for path, kind in @@yaml_path_resolvers
89
+ for path, kind in @@yaml_path_resolvers.keys
89
90
  if !path
90
91
  exact_paths[kind] = @@yaml_path_resolvers[[path, kind]]
91
92
  else
@@ -104,16 +105,16 @@ module RbYAML
104
105
 
105
106
  def check_resolver_prefix(depth, path, kind, current_node, current_index)
106
107
  node_check, index_check = path[depth-1]
107
- if String === node_check
108
+ if node_check.__is_str
108
109
  return false if current_node.tag != node_check
109
110
  elsif !node_check.nil?
110
111
  return false if !node_check === current_node
111
112
  end
112
113
  return false if index_check==true && !current_index.nil?
113
114
  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
115
+ if index_check.__is_str
116
+ return false if !(current_index.__is_scalar && index_check == current_index.value)
117
+ elsif index_check.__is_int
117
118
  return false if index_check != current_index
118
119
  end
119
120
  true
@@ -122,11 +123,11 @@ module RbYAML
122
123
  def resolve(kind, value, implicit)
123
124
  if ScalarNode == kind && implicit[0]
124
125
  if value == ""
125
- resolvers = @@yaml_implicit_resolvers.fetch("", [])
126
+ resolvers = @@yaml_implicit_resolvers.fetch("",[])
126
127
  else
127
- resolvers = @@yaml_implicit_resolvers.fetch(value[0], [])
128
+ resolvers = @@yaml_implicit_resolvers.fetch(value[0],[])
128
129
  end
129
- resolvers += @@yaml_implicit_resolvers.fetch(nil, [])
130
+ resolvers += @@yaml_implicit_resolvers.fetch(nil,[])
130
131
  for tag, regexp in resolvers
131
132
  return tag if regexp =~ value
132
133
  end
@@ -140,20 +141,19 @@ module RbYAML
140
141
  elsif SequenceNode == kind
141
142
  return RbYAML::DEFAULT_SEQUENCE_TAG
142
143
  elsif MappingNode == kind
143
- return RbYAML::DEFAULT_MAPPING_TAG
144
+ return RbYAML::DEFAULT_MAPPING_TAG
144
145
  end
145
146
  end
146
147
  end
147
148
 
148
- module Resolver
149
- include BaseResolver
149
+ class Resolver < BaseResolver
150
150
  end
151
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.')
152
+ BaseResolver.add_implicit_resolver('tag:yaml.org,2002:bool',/^(?:yes|Yes|YES|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-9_]+(?:[eE][-+][0-9]+)?|[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\.[0-9_]*|[-+]?\.(?:inf|Inf|INF)|\.(?:nan|NaN|NAN))$/,'-+0123456789.')
154
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
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)
156
+ BaseResolver.add_implicit_resolver('tag:yaml.org,2002:null',/^(?:~|null|Null|NULL| )$/,'~nN' + ?\0.chr)
157
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
158
  BaseResolver.add_implicit_resolver('tag:yaml.org,2002:value',/^(?:=)$/,'=')
159
159
  # The following implicit resolver is only for documentation purposes. It cannot work
@@ -0,0 +1,391 @@
1
+ require 'date'
2
+
3
+ class Class
4
+ def to_yaml( opts = {} )
5
+ raise RbYAML::TypeError, "can't dump anonymous class %s" % self.class
6
+ end
7
+ end
8
+
9
+ class Object
10
+ # yaml_as "tag:ruby.yaml.org,2002:object"
11
+ def is_complex_yaml?; true; end
12
+ def to_yaml_style; end
13
+ def to_yaml_properties; instance_variables.sort; end
14
+ def to_yaml( opts = {} )
15
+ RbYAML::dump(self,nil,opts)
16
+ end
17
+ def taguri
18
+ "!ruby/object:#{self.class.name}"
19
+ end
20
+ def to_yaml_node( repre )
21
+ RbYAML::quick_emit_node( object_id, repre ) do |out|
22
+ mep = {}
23
+ to_yaml_properties.each do |m|
24
+ mep[m[1..-1]] = instance_variable_get(m)
25
+ end
26
+ out.map(taguri,mep,to_yaml_style)
27
+ end
28
+ end
29
+ end
30
+
31
+ class Hash
32
+ yaml_as "tag:ruby.yaml.org,2002:hash"
33
+ yaml_as "tag:yaml.org,2002:map"
34
+ def is_complex_yaml?; true; end
35
+ def yaml_initialize( tag, val )
36
+ if Array === val
37
+ update Hash.[]( *val ) # Convert the map to a sequence
38
+ elsif Hash === val
39
+ update val
40
+ else
41
+ raise RbYAML::TypeError, "Invalid map explicitly tagged #{ tag }: " + val.inspect
42
+ end
43
+ end
44
+ def to_yaml_node(repre)
45
+ RbYAML::quick_emit_node(object_id, repre) {|rep|
46
+ rep.map(taguri,self,to_yaml_style)
47
+ }
48
+ end
49
+ end
50
+
51
+ class Struct
52
+ yaml_as "tag:ruby.yaml.org,2002:struct"
53
+ def self.yaml_tag_class_name; self.name.gsub( "Struct::", "" ); end
54
+ def self.yaml_tag_read_class( name ); "Struct::#{ name }"; end
55
+ def self.yaml_new( klass, tag, val )
56
+ if Hash === val
57
+ struct_type = nil
58
+
59
+ #
60
+ # Use existing Struct if it exists
61
+ #
62
+ props = {}
63
+ val.delete_if { |k,v| props[k] = v if k =~ /^@/ }
64
+ begin
65
+ struct_name, struct_type = RbYAML.read_type_class( tag, Struct )
66
+ rescue NameError
67
+ end
68
+ if !struct_type
69
+ struct_def = [ tag.split( /:/, 4 ).last ]
70
+ struct_type = Struct.new( *struct_def.concat( val.keys.collect { |k| k.intern } ) )
71
+ end
72
+
73
+ #
74
+ # Set the Struct properties
75
+ #
76
+ st = RbYAML::object_maker( struct_type, {} )
77
+ st.members.each do |m|
78
+ st.send( "#{m}=", val[m] )
79
+ end
80
+ props.each do |k,v|
81
+ st.instance_variable_set(k, v)
82
+ end
83
+ st
84
+ else
85
+ raise RbYAML::TypeError, "Invalid Ruby Struct: " + val.inspect
86
+ end
87
+ end
88
+ def to_yaml_node( repr)
89
+ RbYAML::quick_emit_node( object_id, repr ) do |out|
90
+ mep = {}
91
+ self.members.each do |m|
92
+ mep[m] = self[m]
93
+ end
94
+ self.to_yaml_properties.each do |m|
95
+ mep[m]=instance_variable_get( m )
96
+ end
97
+
98
+ #
99
+ # Basic struct is passed as a YAML map
100
+ #
101
+ out.map( taguri, mep, to_yaml_style )
102
+ end
103
+ end
104
+ end
105
+
106
+ class Array
107
+ yaml_as "tag:ruby.yaml.org,2002:array"
108
+ yaml_as "tag:yaml.org,2002:seq"
109
+ def is_complex_yaml?; true; end
110
+ def yaml_initialize( tag, val ); concat( val.to_a ); end
111
+ def to_yaml_node(repre)
112
+ RbYAML::quick_emit_node(object_id, repre) {|rep|
113
+ rep.seq(taguri,self,to_yaml_style)
114
+ }
115
+ end
116
+ end
117
+
118
+ class Exception
119
+ yaml_as "tag:ruby.yaml.org,2002:exception"
120
+ def Exception.yaml_new( klass, tag, val )
121
+ o = RbYAML.object_maker( klass, { 'mesg' => val.delete( 'message' ) } )
122
+ val.each_pair do |k,v|
123
+ o.instance_variable_set("@#{k}", v)
124
+ end
125
+ o
126
+ end
127
+ def to_yaml_node( repr )
128
+ RbYAML::quick_emit_node( object_id, repr ) do |out|
129
+ mep = {}
130
+ mep['message'] = message
131
+ to_yaml_properties.each do |m|
132
+ mep[m[1..-1]] = instance_variable_get( m )
133
+ end
134
+ out.map( taguri, mep, to_yaml_style )
135
+ end
136
+ end
137
+ end
138
+
139
+ class String
140
+ yaml_as "tag:ruby.yaml.org,2002:string"
141
+ yaml_as "tag:yaml.org,2002:binary"
142
+ yaml_as "tag:yaml.org,2002:str"
143
+ def is_complex_yaml?
144
+ to_yaml_style or not to_yaml_properties.empty? or self =~ /\n.+/
145
+ end
146
+ def is_binary_data?
147
+ ( self.count( "^ -~", "^\r\n" ) / self.size > 0.3 || self.count( "\x00" ) > 0 ) unless empty?
148
+ end
149
+ def String.yaml_new( klass, tag, val )
150
+ val = val.unpack("m")[0] if tag == "tag:yaml.org,2002:binary"
151
+ val = { 'str' => val } if String === val
152
+ if Hash === val
153
+ s = klass.allocate
154
+ # Thank you, NaHi
155
+ String.instance_method(:initialize).
156
+ bind(s).
157
+ call( val.delete( 'str' ) )
158
+ val.each { |k,v| s.instance_variable_set( k, v ) }
159
+ s
160
+ else
161
+ raise RbYAML::TypeError, "Invalid String: " + val.inspect
162
+ end
163
+ end
164
+ def to_yaml_node(repre)
165
+ RbYAML::quick_emit_node( is_complex_yaml? ? object_id : nil, repre ) do |rep|
166
+ if is_binary_data?
167
+ rep.scalar( "tag:yaml.org,2002:binary", [self].pack("m"), "|")
168
+ elsif to_yaml_properties.empty?
169
+ rep.scalar(taguri, self, self =~ /^:/ ? '"' : to_yaml_style )
170
+ else
171
+ mep = {}
172
+ mep['str'] = "#{self}"
173
+ to_yaml_properties.each do |m|
174
+ mep.put[m] = instance_variable_get( m )
175
+ end
176
+ rep.map( taguri, mep, to_yaml_style )
177
+ end
178
+ end
179
+ end
180
+ end
181
+
182
+ class Symbol
183
+ yaml_as "tag:ruby.yaml.org,2002:symbol"
184
+ yaml_as "tag:ruby.yaml.org,2002:sym"
185
+ def is_complex_yaml?; false; end
186
+ def Symbol.yaml_new( klass, tag, val )
187
+ if String === val
188
+ val.intern
189
+ else
190
+ raise RbYAML::TypeError, "Invalid Symbol: " + val.inspect
191
+ end
192
+ end
193
+ def to_yaml_node( repr )
194
+ RbYAML::quick_emit_node( nil, repr ) do |out|
195
+ out.scalar( "tag:yaml.org,2002:str", self.inspect, nil )
196
+ end
197
+ end
198
+ end
199
+
200
+ class Range
201
+ yaml_as "tag:ruby.yaml.org,2002:range"
202
+ def Range.yaml_new( klass, tag, val )
203
+ inr = %r'(\w+|[+-]?\d+(?:\.\d+)?(?:e[+-]\d+)?|"(?:[^\\"]|\\.)*")'
204
+ opts = {}
205
+ if String === val and val =~ /^#{inr}(\.{2,3})#{inr}$/o
206
+ r1, rdots, r2 = $1, $2, $3
207
+ opts = {
208
+ 'begin' => RbYAML.load( "--- #{r1}" ),
209
+ 'end' => RbYAML.load( "--- #{r2}" ),
210
+ 'excl' => rdots.length == 3
211
+ }
212
+ val = {}
213
+ elsif Hash === val
214
+ opts['begin'] = val.delete('begin')
215
+ opts['end'] = val.delete('end')
216
+ opts['excl'] = val.delete('excl')
217
+ end
218
+ if Hash === opts
219
+ r = RbYAML::object_maker( klass, {} )
220
+ # Thank you, NaHi
221
+ Range.instance_method(:initialize).
222
+ bind(r).
223
+ call( opts['begin'], opts['end'], opts['excl'] )
224
+ val.each { |k,v| r.instance_variable_set( k, v ) }
225
+ r
226
+ else
227
+ raise RbYAML::TypeError, "Invalid Range: " + val.inspect
228
+ end
229
+ end
230
+ def to_yaml_node( repr )
231
+ RbYAML::quick_emit_node( object_id, repr ) do |out|
232
+ mep = {'begin' => self.begin, 'end' => self.end, 'excl' => self.exclude_end?}
233
+ to_yaml_properties.each do |m|
234
+ mep[m] = instance_variable_get( m )
235
+ end
236
+ out.map( taguri, mep, to_yaml_style )
237
+ end
238
+ end
239
+ end
240
+
241
+ class Regexp
242
+ yaml_as "tag:ruby.yaml.org,2002:regexp"
243
+ def Regexp.yaml_new( klass, tag, val )
244
+ if String === val and val =~ /^\/(.*)\/([mix]*)$/
245
+ val = { 'regexp' => $1, 'mods' => $2 }
246
+ end
247
+ if Hash === val
248
+ mods = nil
249
+ unless val['mods'].to_s.empty?
250
+ mods = 0x00
251
+ mods |= Regexp::EXTENDED if val['mods'].include?( 'x' )
252
+ mods |= Regexp::IGNORECASE if val['mods'].include?( 'i' )
253
+ mods |= Regexp::MULTILINE if val['mods'].include?( 'm' )
254
+ end
255
+ val.delete( 'mods' )
256
+ r = RbYAML::object_maker( klass, {} )
257
+ Regexp.instance_method(:initialize).
258
+ bind(r).
259
+ call( val.delete( 'regexp' ), mods )
260
+ val.each { |k,v| r.instance_variable_set( k, v ) }
261
+ r
262
+ else
263
+ raise RbYAML::TypeError, "Invalid Regular expression: " + val.inspect
264
+ end
265
+ end
266
+ def to_yaml_node( repr )
267
+ RbYAML::quick_emit_node( nil, repr ) do |out|
268
+ if to_yaml_properties.empty?
269
+ out.scalar( taguri, self.inspect, nil )
270
+ else
271
+ mep = { }
272
+ src = self.inspect
273
+ if src =~ /\A\/(.*)\/([a-z]*)\Z/
274
+ mep['regexp']=$1
275
+ mep['mods']=$2
276
+ else
277
+ raise RbYAML::TypeError, "Invalid Regular expression: " + src
278
+ end
279
+ to_yaml_properties.each do |m|
280
+ mep[m] = instance_variable_get( m )
281
+ end
282
+ out.map( taguri, mep, to_yaml_style )
283
+ end
284
+ end
285
+ end
286
+ end
287
+
288
+ class Time
289
+ yaml_as "tag:ruby.yaml.org,2002:time"
290
+ yaml_as "tag:yaml.org,2002:timestamp"
291
+ def is_complex_yaml?; false; end
292
+ def Time.yaml_new( klass, tag, val )
293
+ if Hash === val
294
+ t = val.delete( 'at' )
295
+ val.each { |k,v| t.instance_variable_set( k, v ) }
296
+ t
297
+ else
298
+ raise RbYAML::TypeError, "Invalid Time: " + val.inspect
299
+ end
300
+ end
301
+ def to_yaml_node(repre)
302
+ RbYAML::quick_emit_node( object_id, repre ) do |out|
303
+ tz = "Z"
304
+ # from the tidy Tobias Peters <t-peters@gmx.de> Thanks!
305
+ unless utc?
306
+ utc_same_instant = dup.utc
307
+ utc_same_writing = Time.utc(year,month,day,hour,min,sec,usec)
308
+ difference_to_utc = utc_same_writing - utc_same_instant
309
+ if (difference_to_utc < 0)
310
+ difference_sign = '-'
311
+ absolute_difference = -difference_to_utc
312
+ else
313
+ difference_sign = '+'
314
+ absolute_difference = difference_to_utc
315
+ end
316
+ difference_minutes = (absolute_difference/60).round
317
+ tz = "%s%02d:%02d" % [ difference_sign, difference_minutes / 60, difference_minutes % 60]
318
+ end
319
+ standard = strftime( "%Y-%m-%d %H:%M:%S" )
320
+ standard += ".%06d" % [usec] if usec.nonzero?
321
+ standard += " %s" % [tz]
322
+ out.scalar(taguri, standard, nil)
323
+ end
324
+ end
325
+ end
326
+
327
+ class Date
328
+ yaml_as "tag:yaml.org,2002:timestamp#ymd"
329
+ def is_complex_yaml?; false; end
330
+ def to_yaml_node(repre)
331
+ RbYAML::quick_emit_node( object_id, repre ) do |out|
332
+ out.scalar( "tag:yaml.org,2002:timestamp", self.to_s, nil )
333
+ end
334
+ end
335
+ end
336
+
337
+ class Numeric
338
+ def is_complex_yaml?; false; end
339
+ def to_yaml_node( repre )
340
+ RbYAML::quick_emit_node( nil, repre ) do |rep|
341
+ str = self.to_s
342
+ if str == "Infinity"
343
+ str = ".inf"
344
+ elsif str == "-Infinity"
345
+ str = "-.inf"
346
+ elsif str == "NaN"
347
+ str = ".nan"
348
+ end
349
+ rep.scalar( taguri, str, nil )
350
+ end
351
+ end
352
+ end
353
+
354
+ class Fixnum
355
+ yaml_as "tag:yaml.org,2002:int"
356
+ end
357
+
358
+ class Float
359
+ yaml_as "tag:yaml.org,2002:float"
360
+ end
361
+
362
+ class TrueClass
363
+ yaml_as "tag:yaml.org,2002:bool#yes"
364
+ def is_complex_yaml?; false; end
365
+ def to_yaml_node( repre )
366
+ RbYAML::quick_emit_node( nil, repre ) do |out|
367
+ out.scalar('tag:yaml.org,2002:bool', "true", nil)
368
+ end
369
+ end
370
+ end
371
+
372
+ class FalseClass
373
+ yaml_as "tag:yaml.org,2002:bool#no"
374
+ def is_complex_yaml?; false; end
375
+ def to_yaml_node( repre )
376
+ RbYAML::quick_emit_node( nil, repre ) do |out|
377
+ out.scalar('tag:yaml.org,2002:bool', "false",nil )
378
+ end
379
+ end
380
+ end
381
+
382
+ class NilClass
383
+ yaml_as "tag:yaml.org,2002:null"
384
+ def is_complex_yaml?; false; end
385
+ def to_yaml_node( repre )
386
+ RbYAML::quick_emit_node( nil, repre ) do |out|
387
+ out.scalar(taguri, "", nil )
388
+ end
389
+ end
390
+ end
391
+