rubysl-yaml 0.0.1 → 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (62) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +0 -1
  3. data/.travis.yml +7 -0
  4. data/README.md +2 -2
  5. data/Rakefile +0 -1
  6. data/lib/rubysl/yaml.rb +2 -0
  7. data/lib/rubysl/yaml/version.rb +5 -0
  8. data/lib/rubysl/yaml/yaml.rb +440 -0
  9. data/lib/yaml.rb +1 -0
  10. data/lib/yaml/baseemitter.rb +247 -0
  11. data/lib/yaml/basenode.rb +216 -0
  12. data/lib/yaml/constants.rb +45 -0
  13. data/lib/yaml/dbm.rb +111 -0
  14. data/lib/yaml/encoding.rb +33 -0
  15. data/lib/yaml/error.rb +34 -0
  16. data/lib/yaml/loader.rb +14 -0
  17. data/lib/yaml/rubytypes.rb +409 -0
  18. data/lib/yaml/store.rb +43 -0
  19. data/lib/yaml/stream.rb +40 -0
  20. data/lib/yaml/stringio.rb +83 -0
  21. data/lib/yaml/syck.rb +44 -0
  22. data/lib/yaml/tag.rb +91 -0
  23. data/lib/yaml/types.rb +192 -0
  24. data/lib/yaml/yamlnode.rb +54 -0
  25. data/lib/yaml/ypath.rb +52 -0
  26. data/rubysl-yaml.gemspec +19 -17
  27. data/spec/add_builtin_type_spec.rb +1 -0
  28. data/spec/add_domain_type_spec.rb +1 -0
  29. data/spec/add_private_type_spec.rb +1 -0
  30. data/spec/add_ruby_type_spec.rb +1 -0
  31. data/spec/detect_implicit_spec.rb +1 -0
  32. data/spec/dump_spec.rb +35 -0
  33. data/spec/dump_stream_spec.rb +13 -0
  34. data/spec/each_document_spec.rb +9 -0
  35. data/spec/each_node_spec.rb +1 -0
  36. data/spec/emitter_spec.rb +1 -0
  37. data/spec/fixtures/common.rb +10 -0
  38. data/spec/fixtures/example_class.rb +5 -0
  39. data/spec/fixtures/strings.rb +36 -0
  40. data/spec/fixtures/test_yaml.yml +2 -0
  41. data/spec/generic_parser_spec.rb +1 -0
  42. data/spec/load_documents_spec.rb +7 -0
  43. data/spec/load_file_spec.rb +12 -0
  44. data/spec/load_spec.rb +111 -0
  45. data/spec/load_stream_spec.rb +1 -0
  46. data/spec/object_maker_spec.rb +1 -0
  47. data/spec/parse_documents_spec.rb +1 -0
  48. data/spec/parse_file_spec.rb +9 -0
  49. data/spec/parse_spec.rb +21 -0
  50. data/spec/parser_spec.rb +1 -0
  51. data/spec/quick_emit_spec.rb +1 -0
  52. data/spec/read_type_class_spec.rb +1 -0
  53. data/spec/shared/each_document.rb +18 -0
  54. data/spec/tag_class_spec.rb +9 -0
  55. data/spec/tagged_classes_spec.rb +9 -0
  56. data/spec/tagurize_spec.rb +8 -0
  57. data/spec/to_yaml_spec.rb +97 -0
  58. data/spec/transfer_spec.rb +1 -0
  59. data/spec/try_implicit_spec.rb +1 -0
  60. metadata +163 -88
  61. data/lib/rubysl-yaml.rb +0 -7
  62. data/lib/rubysl-yaml/version.rb +0 -5
@@ -0,0 +1,45 @@
1
+ #
2
+ # Constants used throughout the library
3
+ #
4
+ module YAML
5
+
6
+ #
7
+ # Constants
8
+ #
9
+ VERSION = '0.60'
10
+ SUPPORTED_YAML_VERSIONS = ['1.0']
11
+
12
+ #
13
+ # Parser tokens
14
+ #
15
+ WORD_CHAR = 'A-Za-z0-9'
16
+ PRINTABLE_CHAR = '-_A-Za-z0-9!?/()$\'". '
17
+ NOT_PLAIN_CHAR = '\x7f\x0-\x1f\x80-\x9f'
18
+ ESCAPE_CHAR = '[\\x00-\\x09\\x0b-\\x1f]'
19
+ INDICATOR_CHAR = '*&!|\\\\^@%{}[]='
20
+ SPACE_INDICATORS = '-#:,?'
21
+ RESTRICTED_INDICATORS = '#:,}]'
22
+ DNS_COMP_RE = "\\w(?:[-\\w]*\\w)?"
23
+ DNS_NAME_RE = "(?:(?:#{DNS_COMP_RE}\\.)+#{DNS_COMP_RE}|#{DNS_COMP_RE})"
24
+ ESCAPES = %w{\x00 \x01 \x02 \x03 \x04 \x05 \x06 \a
25
+ \x08 \t \n \v \f \r \x0e \x0f
26
+ \x10 \x11 \x12 \x13 \x14 \x15 \x16 \x17
27
+ \x18 \x19 \x1a \e \x1c \x1d \x1e \x1f
28
+ }
29
+ UNESCAPES = {
30
+ 'a' => "\x07", 'b' => "\x08", 't' => "\x09",
31
+ 'n' => "\x0a", 'v' => "\x0b", 'f' => "\x0c",
32
+ 'r' => "\x0d", 'e' => "\x1b", '\\' => '\\',
33
+ }
34
+
35
+ #
36
+ # Default settings
37
+ #
38
+ DEFAULTS = {
39
+ :Indent => 2, :UseHeader => false, :UseVersion => false, :Version => '1.0',
40
+ :SortKeys => false, :AnchorFormat => 'id%03d', :ExplicitTypes => false,
41
+ :WidthType => 'absolute', :BestWidth => 80,
42
+ :UseBlock => false, :UseFold => false, :Encoding => :None
43
+ }
44
+
45
+ end
data/lib/yaml/dbm.rb ADDED
@@ -0,0 +1,111 @@
1
+ require 'yaml'
2
+ require 'dbm'
3
+ #
4
+ # YAML + DBM = YDBM
5
+ # - Same interface as DBM class
6
+ #
7
+ module YAML
8
+
9
+ class DBM < ::DBM
10
+ VERSION = "0.1"
11
+ def []( key )
12
+ fetch( key )
13
+ end
14
+ def []=( key, val )
15
+ store( key, val )
16
+ end
17
+ def fetch( keystr, ifnone = nil )
18
+ begin
19
+ val = super( keystr )
20
+ return YAML::load( val ) if String === val
21
+ rescue IndexError
22
+ end
23
+ if block_given?
24
+ yield keystr
25
+ else
26
+ ifnone
27
+ end
28
+ end
29
+ def index( keystr )
30
+ super( keystr.to_yaml )
31
+ end
32
+ def values_at( *keys )
33
+ keys.collect { |k| fetch( k ) }
34
+ end
35
+ def delete( key )
36
+ v = super( key )
37
+ if String === v
38
+ v = YAML::load( v )
39
+ end
40
+ v
41
+ end
42
+ def delete_if
43
+ del_keys = keys.dup
44
+ del_keys.delete_if { |k| yield( k, fetch( k ) ) == false }
45
+ del_keys.each { |k| delete( k ) }
46
+ self
47
+ end
48
+ def reject
49
+ hsh = self.to_hash
50
+ hsh.reject { |k,v| yield k, v }
51
+ end
52
+ def each_pair
53
+ keys.each { |k| yield k, fetch( k ) }
54
+ self
55
+ end
56
+ def each_value
57
+ super { |v| yield YAML::load( v ) }
58
+ self
59
+ end
60
+ def values
61
+ super.collect { |v| YAML::load( v ) }
62
+ end
63
+ def has_value?( val )
64
+ each_value { |v| return true if v == val }
65
+ return false
66
+ end
67
+ def invert
68
+ h = {}
69
+ keys.each { |k| h[ self.fetch( k ) ] = k }
70
+ h
71
+ end
72
+ def replace( hsh )
73
+ clear
74
+ update( hsh )
75
+ end
76
+ def shift
77
+ a = super
78
+ a[1] = YAML::load( a[1] ) if a
79
+ a
80
+ end
81
+ def select( *keys )
82
+ if block_given?
83
+ self.keys.collect { |k| v = self[k]; [k, v] if yield k, v }.compact
84
+ else
85
+ values_at( *keys )
86
+ end
87
+ end
88
+ def store( key, val )
89
+ super( key, val.to_yaml )
90
+ val
91
+ end
92
+ def update( hsh )
93
+ hsh.keys.each do |k|
94
+ self.store( k, hsh.fetch( k ) )
95
+ end
96
+ self
97
+ end
98
+ def to_a
99
+ a = []
100
+ keys.each { |k| a.push [ k, self.fetch( k ) ] }
101
+ a
102
+ end
103
+ def to_hash
104
+ h = {}
105
+ keys.each { |k| h[ k ] = self.fetch( k ) }
106
+ h
107
+ end
108
+ alias :each :each_pair
109
+ end
110
+
111
+ end
@@ -0,0 +1,33 @@
1
+ #
2
+ # Handle Unicode-to-Internal conversion
3
+ #
4
+
5
+ module YAML
6
+
7
+ #
8
+ # Escape the string, condensing common escapes
9
+ #
10
+ def YAML.escape( value, skip = "" )
11
+ value.gsub( /\\/, "\\\\\\" ).
12
+ gsub( /"/, "\\\"" ).
13
+ gsub( /([\x00-\x1f])/ ) do |x|
14
+ skip[x] || ESCAPES[ x.unpack("C")[0] ]
15
+ end
16
+ end
17
+
18
+ #
19
+ # Unescape the condenses escapes
20
+ #
21
+ def YAML.unescape( value )
22
+ value.gsub( /\\(?:([nevfbart\\])|0?x([0-9a-fA-F]{2})|u([0-9a-fA-F]{4}))/ ) { |x|
23
+ if $3
24
+ ["#$3".hex ].pack('U*')
25
+ elsif $2
26
+ [$2].pack( "H2" )
27
+ else
28
+ UNESCAPES[$1]
29
+ end
30
+ }
31
+ end
32
+
33
+ end
data/lib/yaml/error.rb ADDED
@@ -0,0 +1,34 @@
1
+ #
2
+ # Error messages and exception class
3
+ #
4
+
5
+ module YAML
6
+
7
+ #
8
+ # Error messages
9
+ #
10
+
11
+ ERROR_NO_HEADER_NODE = "With UseHeader=false, the node Array or Hash must have elements"
12
+ ERROR_NEED_HEADER = "With UseHeader=false, the node must be an Array or Hash"
13
+ ERROR_BAD_EXPLICIT = "Unsupported explicit transfer: '%s'"
14
+ ERROR_MANY_EXPLICIT = "More than one explicit transfer"
15
+ ERROR_MANY_IMPLICIT = "More than one implicit request"
16
+ ERROR_NO_ANCHOR = "No anchor for alias '%s'"
17
+ ERROR_BAD_ANCHOR = "Invalid anchor: %s"
18
+ ERROR_MANY_ANCHOR = "More than one anchor"
19
+ ERROR_ANCHOR_ALIAS = "Can't define both an anchor and an alias"
20
+ ERROR_BAD_ALIAS = "Invalid alias: %s"
21
+ ERROR_MANY_ALIAS = "More than one alias"
22
+ ERROR_ZERO_INDENT = "Can't use zero as an indentation width"
23
+ ERROR_UNSUPPORTED_VERSION = "This release of YAML.rb does not support YAML version %s"
24
+ ERROR_UNSUPPORTED_ENCODING = "Attempt to use unsupported encoding: %s"
25
+
26
+ #
27
+ # YAML Error classes
28
+ #
29
+
30
+ class Error < StandardError; end
31
+ class ParseError < Error; end
32
+ class TypeError < StandardError; end
33
+
34
+ end
@@ -0,0 +1,14 @@
1
+ #
2
+ # YAML::Loader class
3
+ # .. type handling ..
4
+ #
5
+ module YAML
6
+ class Loader
7
+ TRANSFER_DOMAINS = {
8
+ 'yaml.org,2002' => {},
9
+ 'ruby.yaml.org,2002' => {}
10
+ }
11
+ PRIVATE_TYPES = {}
12
+ IMPLICIT_TYPES = [ 'null', 'bool', 'time', 'int', 'float' ]
13
+ end
14
+ end
@@ -0,0 +1,409 @@
1
+ # -*- mode: ruby; ruby-indent-level: 4; tab-width: 4 -*- vim: sw=4 ts=4
2
+ require 'date'
3
+
4
+ class Class
5
+ def to_yaml( opts = {} )
6
+ raise TypeError, "can't dump anonymous class %s" % self.class
7
+ end
8
+ end
9
+
10
+ class Object
11
+ yaml_as "tag:ruby.yaml.org,2002:object"
12
+ def to_yaml_style; end
13
+ def to_yaml_properties; instance_variables.sort; end
14
+ def to_yaml( opts = {} )
15
+ YAML::quick_emit( self, opts ) do |out|
16
+ out.map( taguri, to_yaml_style ) do |map|
17
+ to_yaml_properties.each do |m|
18
+ map.add( m[1..-1], instance_variable_get( m ) )
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
24
+
25
+ class Hash
26
+ yaml_as "tag:ruby.yaml.org,2002:hash"
27
+ yaml_as "tag:yaml.org,2002:map"
28
+ def yaml_initialize( tag, val )
29
+ if Array === val
30
+ update Hash.[]( *val ) # Convert the map to a sequence
31
+ elsif Hash === val
32
+ update val
33
+ else
34
+ raise YAML::TypeError, "Invalid map explicitly tagged #{ tag }: " + val.inspect
35
+ end
36
+ end
37
+ def to_yaml( opts = {} )
38
+ YAML::quick_emit( self, opts ) do |out|
39
+ out.map( taguri, to_yaml_style ) do |map|
40
+ each do |k, v|
41
+ map.add( k, v )
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
47
+
48
+ class Struct
49
+ yaml_as "tag:ruby.yaml.org,2002:struct"
50
+ def self.yaml_tag_class_name; self.name.gsub( "Struct::", "" ); end
51
+ def self.yaml_tag_read_class( name ); "Struct::#{ name }"; end
52
+ def self.yaml_new( klass, tag, val )
53
+ if Hash === val
54
+ struct_type = nil
55
+
56
+ #
57
+ # Use existing Struct if it exists
58
+ #
59
+ props = {}
60
+ val.delete_if { |k,v| props[k] = v if k =~ /^@/ }
61
+ begin
62
+ struct_name, struct_type = YAML.read_type_class( tag, Struct )
63
+ rescue NameError
64
+ end
65
+ if not struct_type
66
+ struct_def = [ tag.split( ':', 4 ).last ]
67
+ struct_type = Struct.new( *struct_def.concat( val.keys.collect { |k| k.intern } ) )
68
+ end
69
+
70
+ #
71
+ # Set the Struct properties
72
+ #
73
+ st = YAML::object_maker( struct_type, {} )
74
+ st.members.each do |m|
75
+ st.send( "#{m}=", val[m] )
76
+ end
77
+ props.each do |k,v|
78
+ st.instance_variable_set(k, v)
79
+ end
80
+ st
81
+ else
82
+ raise YAML::TypeError, "Invalid Ruby Struct: " + val.inspect
83
+ end
84
+ end
85
+ def to_yaml( opts = {} )
86
+ YAML::quick_emit( self, opts ) do |out|
87
+ #
88
+ # Basic struct is passed as a YAML map
89
+ #
90
+ out.map( taguri, to_yaml_style ) do |map|
91
+ self.members.each do |m|
92
+ map.add( m, self[m] )
93
+ end
94
+ self.to_yaml_properties.each do |m|
95
+ map.add( m, instance_variable_get( m ) )
96
+ end
97
+ end
98
+ end
99
+ end
100
+ end
101
+
102
+ class Array
103
+ yaml_as "tag:ruby.yaml.org,2002:array"
104
+ yaml_as "tag:yaml.org,2002:seq"
105
+ def yaml_initialize( tag, val ); concat( val.to_a ); end
106
+ def to_yaml( opts = {} )
107
+ YAML::quick_emit( self, opts ) do |out|
108
+ out.seq( taguri, to_yaml_style ) do |seq|
109
+ each do |x|
110
+ seq.add( x )
111
+ end
112
+ end
113
+ end
114
+ end
115
+ end
116
+
117
+ class Exception
118
+ yaml_as "tag:ruby.yaml.org,2002:exception"
119
+ def Exception.yaml_new( klass, tag, val )
120
+ o = YAML.object_maker( klass, { 'mesg' => val.delete( 'message' ) } )
121
+ val.each_pair do |k,v|
122
+ o.instance_variable_set("@#{k}", v)
123
+ end
124
+ o
125
+ end
126
+ def to_yaml( opts = {} )
127
+ YAML::quick_emit( self, opts ) do |out|
128
+ out.map( taguri, to_yaml_style ) do |map|
129
+ map.add( 'message', message )
130
+ to_yaml_properties.each do |m|
131
+ map.add( m[1..-1], instance_variable_get( m ) )
132
+ end
133
+ end
134
+ end
135
+ end
136
+ end
137
+
138
+ class String
139
+ yaml_as "tag:ruby.yaml.org,2002:string"
140
+ yaml_as "tag:yaml.org,2002:binary"
141
+ yaml_as "tag:yaml.org,2002:str"
142
+ def is_complex_yaml?
143
+ to_yaml_style or not to_yaml_properties.empty? or self =~ /\n.+/
144
+ end
145
+ def is_binary_data?
146
+ # It's binary if it's got a null.
147
+ index(0)
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 YAML::TypeError, "Invalid String: " + val.inspect
162
+ end
163
+ end
164
+ def to_yaml( opts = {} )
165
+ YAML::quick_emit( is_complex_yaml? ? self : nil, opts ) do |out|
166
+ if is_binary_data?
167
+ out.scalar( "tag:yaml.org,2002:binary", [self].pack("m"), :literal )
168
+ elsif to_yaml_properties.empty?
169
+ out.scalar( taguri, self, self =~ /^:/ ? :quote2 : to_yaml_style )
170
+ else
171
+ out.map( taguri, to_yaml_style ) do |map|
172
+ map.add( 'str', "#{self}" )
173
+ to_yaml_properties.each do |m|
174
+ map.add( m, instance_variable_get( m ) )
175
+ end
176
+ end
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 Symbol.yaml_new( klass, tag, val )
186
+ if String === val
187
+ val = YAML::load( val ) if val =~ /\A(["']).*\1\z/
188
+ val.intern
189
+ else
190
+ raise YAML::TypeError, "Invalid Symbol: " + val.inspect
191
+ end
192
+ end
193
+ def to_yaml( opts = {} )
194
+ YAML::quick_emit( nil, opts ) do |out|
195
+ out.scalar( "tag:yaml.org,2002:str", self.inspect, :plain )
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' => YAML.load( "--- #{r1}" ),
209
+ 'end' => YAML.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 = YAML::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 YAML::TypeError, "Invalid Range: " + val.inspect
228
+ end
229
+ end
230
+ def to_yaml( opts = {} )
231
+ YAML::quick_emit( self, opts ) do |out|
232
+ # if self.begin.is_complex_yaml? or self.begin.respond_to? :to_str or
233
+ # self.end.is_complex_yaml? or self.end.respond_to? :to_str or
234
+ # not to_yaml_properties.empty?
235
+ out.map( taguri, to_yaml_style ) do |map|
236
+ map.add( 'begin', self.begin )
237
+ map.add( 'end', self.end )
238
+ map.add( 'excl', self.exclude_end? )
239
+ to_yaml_properties.each do |m|
240
+ map.add( m, instance_variable_get( m ) )
241
+ end
242
+ end
243
+ # else
244
+ # out.scalar( taguri ) do |sc|
245
+ # sc.embed( self.begin )
246
+ # sc.concat( self.exclude_end? ? "..." : ".." )
247
+ # sc.embed( self.end )
248
+ # end
249
+ # end
250
+ end
251
+ end
252
+ end
253
+
254
+ class Regexp
255
+ yaml_as "tag:ruby.yaml.org,2002:regexp"
256
+ def Regexp.yaml_new( klass, tag, val )
257
+ if String === val and val =~ /^\/(.*)\/([mix]*)$/
258
+ val = { 'regexp' => $1, 'mods' => $2 }
259
+ end
260
+ if Hash === val
261
+ mods = nil
262
+ unless val['mods'].to_s.empty?
263
+ mods = 0x00
264
+ mods |= Regexp::EXTENDED if val['mods'].include?( 'x' )
265
+ mods |= Regexp::IGNORECASE if val['mods'].include?( 'i' )
266
+ mods |= Regexp::MULTILINE if val['mods'].include?( 'm' )
267
+ end
268
+ val.delete( 'mods' )
269
+ r = YAML::object_maker( klass, {} )
270
+ Regexp.instance_method(:initialize).
271
+ bind(r).
272
+ call( val.delete( 'regexp' ), mods )
273
+ val.each { |k,v| r.instance_variable_set( k, v ) }
274
+ r
275
+ else
276
+ raise YAML::TypeError, "Invalid Regular expression: " + val.inspect
277
+ end
278
+ end
279
+ def to_yaml( opts = {} )
280
+ YAML::quick_emit( nil, opts ) do |out|
281
+ if to_yaml_properties.empty?
282
+ out.scalar( taguri, self.inspect, :plain )
283
+ else
284
+ out.map( taguri, to_yaml_style ) do |map|
285
+ src = self.inspect
286
+ if src =~ /\A\/(.*)\/([a-z]*)\Z/
287
+ map.add( 'regexp', $1 )
288
+ map.add( 'mods', $2 )
289
+ else
290
+ raise YAML::TypeError, "Invalid Regular expression: " + src
291
+ end
292
+ to_yaml_properties.each do |m|
293
+ map.add( m, instance_variable_get( m ) )
294
+ end
295
+ end
296
+ end
297
+ end
298
+ end
299
+ end
300
+
301
+ class Time
302
+ yaml_as "tag:ruby.yaml.org,2002:time"
303
+ yaml_as "tag:yaml.org,2002:timestamp"
304
+ def Time.yaml_new( klass, tag, val )
305
+ if Hash === val
306
+ t = val.delete( 'at' )
307
+ val.each { |k,v| t.instance_variable_set( k, v ) }
308
+ t
309
+ else
310
+ raise YAML::TypeError, "Invalid Time: " + val.inspect
311
+ end
312
+ end
313
+ def to_yaml( opts = {} )
314
+ YAML::quick_emit( self, opts ) do |out|
315
+ tz = "Z"
316
+ # from the tidy Tobias Peters <t-peters@gmx.de> Thanks!
317
+ unless self.utc?
318
+ utc_same_instant = self.dup.utc
319
+ utc_same_writing = Time.utc(year,month,day,hour,min,sec,usec)
320
+ difference_to_utc = utc_same_writing - utc_same_instant
321
+ if (difference_to_utc < 0)
322
+ difference_sign = '-'
323
+ absolute_difference = -difference_to_utc
324
+ else
325
+ difference_sign = '+'
326
+ absolute_difference = difference_to_utc
327
+ end
328
+ difference_minutes = (absolute_difference/60).round
329
+ tz = "%s%02d:%02d" % [ difference_sign, difference_minutes / 60, difference_minutes % 60]
330
+ end
331
+ standard = self.strftime( "%Y-%m-%d %H:%M:%S" )
332
+ standard += ".%06d" % [usec] if usec.nonzero?
333
+ standard += " %s" % [tz]
334
+ if to_yaml_properties.empty?
335
+ out.scalar( taguri, standard, :plain )
336
+ else
337
+ out.map( taguri, to_yaml_style ) do |map|
338
+ map.add( 'at', standard )
339
+ to_yaml_properties.each do |m|
340
+ map.add( m, instance_variable_get( m ) )
341
+ end
342
+ end
343
+ end
344
+ end
345
+ end
346
+ end
347
+
348
+ class Date
349
+ yaml_as "tag:yaml.org,2002:timestamp#ymd"
350
+ def to_yaml( opts = {} )
351
+ YAML::quick_emit( self, opts ) do |out|
352
+ out.scalar( "tag:yaml.org,2002:timestamp", self.to_s, :plain )
353
+ end
354
+ end
355
+ end
356
+
357
+ class Integer
358
+ yaml_as "tag:yaml.org,2002:int"
359
+ def to_yaml( opts = {} )
360
+ YAML::quick_emit( nil, opts ) do |out|
361
+ out.scalar( "tag:yaml.org,2002:int", self.to_s, :plain )
362
+ end
363
+ end
364
+ end
365
+
366
+ class Float
367
+ yaml_as "tag:yaml.org,2002:float"
368
+ def to_yaml( opts = {} )
369
+ YAML::quick_emit( nil, opts ) do |out|
370
+ str = self.to_s
371
+ if str == "Infinity"
372
+ str = ".Inf"
373
+ elsif str == "-Infinity"
374
+ str = "-.Inf"
375
+ elsif str == "NaN"
376
+ str = ".NaN"
377
+ end
378
+ out.scalar( "tag:yaml.org,2002:float", str, :plain )
379
+ end
380
+ end
381
+ end
382
+
383
+ class TrueClass
384
+ yaml_as "tag:yaml.org,2002:bool#yes"
385
+ def to_yaml( opts = {} )
386
+ YAML::quick_emit( nil, opts ) do |out|
387
+ out.scalar( taguri, "true", :plain )
388
+ end
389
+ end
390
+ end
391
+
392
+ class FalseClass
393
+ yaml_as "tag:yaml.org,2002:bool#no"
394
+ def to_yaml( opts = {} )
395
+ YAML::quick_emit( nil, opts ) do |out|
396
+ out.scalar( taguri, "false", :plain )
397
+ end
398
+ end
399
+ end
400
+
401
+ class NilClass
402
+ yaml_as "tag:yaml.org,2002:null"
403
+ def to_yaml( opts = {} )
404
+ YAML::quick_emit( nil, opts ) do |out|
405
+ out.scalar( taguri, "", :plain )
406
+ end
407
+ end
408
+ end
409
+