ya2yaml 0.26 → 0.29.2
Sign up to get free protection for your applications and to get access to all the features.
- data/README +2 -1
- data/lib/ya2yaml.rb +27 -21
- data/test/test.rb +108 -49
- metadata +53 -34
data/README
CHANGED
data/lib/ya2yaml.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
|
-
|
1
|
+
# encoding: UTF-8
|
2
2
|
|
3
|
-
# $Id: ya2yaml.rb,v 0.
|
3
|
+
# $Id: ya2yaml.rb,v 0.29 2009/02/09 09:01:30 funai Exp funai $
|
4
4
|
#
|
5
5
|
# Author:: Akira FUNAI
|
6
6
|
# Copyright:: Copyright (c) 2006 Akira FUNAI
|
@@ -8,7 +8,8 @@
|
|
8
8
|
|
9
9
|
class Ya2YAML
|
10
10
|
|
11
|
-
def initialize(
|
11
|
+
def initialize(opts = {})
|
12
|
+
options = opts.dup
|
12
13
|
options[:indent_size] = 2 if options[:indent_size].to_i <= 0
|
13
14
|
options[:minimum_block_length] = 0 if options[:minimum_block_length].to_i <= 0
|
14
15
|
options.update(
|
@@ -23,15 +24,15 @@ class Ya2YAML
|
|
23
24
|
end
|
24
25
|
|
25
26
|
def _ya2yaml(obj)
|
26
|
-
throw 'set $KCODE to "UTF8".' if $KCODE != 'UTF8'
|
27
|
+
throw 'set $KCODE to "UTF8".' if (RUBY_VERSION < '1.9.0') && ($KCODE != 'UTF8')
|
27
28
|
'--- ' + emit(obj,1) + "\n"
|
28
29
|
end
|
29
30
|
|
30
31
|
private
|
31
32
|
|
32
33
|
def emit(obj,level)
|
33
|
-
case obj
|
34
|
-
when
|
34
|
+
case obj
|
35
|
+
when Array
|
35
36
|
if (obj.length == 0)
|
36
37
|
'[]'
|
37
38
|
else
|
@@ -40,7 +41,7 @@ class Ya2YAML
|
|
40
41
|
indent + '- ' + emit(o,level + 1)
|
41
42
|
}.join('')
|
42
43
|
end
|
43
|
-
when
|
44
|
+
when Hash
|
44
45
|
if (obj.length == 0)
|
45
46
|
'{}'
|
46
47
|
else
|
@@ -69,17 +70,17 @@ class Ya2YAML
|
|
69
70
|
end
|
70
71
|
}.join('')
|
71
72
|
end
|
72
|
-
when
|
73
|
+
when NilClass
|
73
74
|
'~'
|
74
|
-
when
|
75
|
+
when String
|
75
76
|
emit_string(obj,level)
|
76
|
-
when
|
77
|
+
when TrueClass,FalseClass
|
77
78
|
obj.to_s
|
78
|
-
when
|
79
|
+
when Fixnum,Bignum,Float
|
79
80
|
obj.to_s
|
80
|
-
when
|
81
|
+
when Date
|
81
82
|
obj.to_s
|
82
|
-
when
|
83
|
+
when Time
|
83
84
|
offset = obj.gmtoff
|
84
85
|
off_hm = sprintf(
|
85
86
|
'%+.2d:%.2d',
|
@@ -88,11 +89,11 @@ class Ya2YAML
|
|
88
89
|
)
|
89
90
|
u_sec = (obj.usec != 0) ? sprintf(".%.6d",obj.usec) : ''
|
90
91
|
obj.strftime("%Y-%m-%d %H:%M:%S#{u_sec} #{off_hm}")
|
91
|
-
when
|
92
|
-
'!ruby/symbol ' + obj.to_s
|
93
|
-
when
|
92
|
+
when Symbol
|
93
|
+
'!ruby/symbol ' + emit_string(obj.to_s,level)
|
94
|
+
when Range
|
94
95
|
'!ruby/range ' + obj.to_s
|
95
|
-
when
|
96
|
+
when Regexp
|
96
97
|
'!ruby/regexp ' + obj.inspect
|
97
98
|
else
|
98
99
|
case
|
@@ -105,7 +106,7 @@ class Ya2YAML
|
|
105
106
|
# serialized as a generic object
|
106
107
|
object_members = {}
|
107
108
|
obj.instance_variables.each{|k,v|
|
108
|
-
object_members[k.sub(/^@/,'')] = obj.instance_variable_get(k)
|
109
|
+
object_members[k.to_s.sub(/^@/,'')] = obj.instance_variable_get(k)
|
109
110
|
}
|
110
111
|
'!ruby/object:' + obj.class.to_s + ' ' +
|
111
112
|
emit(object_members,level + 1)
|
@@ -183,6 +184,9 @@ class Ya2YAML
|
|
183
184
|
end
|
184
185
|
|
185
186
|
def string_type(str)
|
187
|
+
if str.respond_to?(:valid_encoding?) && !str.valid_encoding?
|
188
|
+
return false,false,false,false
|
189
|
+
end
|
186
190
|
(ucs_codes = str.unpack('U*')) rescue (
|
187
191
|
# ArgumentError -> binary data
|
188
192
|
return false,false,false,false
|
@@ -192,10 +196,10 @@ class Ya2YAML
|
|
192
196
|
str =~ /\A#{REX_ANY_LB}* | #{REX_ANY_LB}*\z|#{REX_ANY_LB}{2}\z/
|
193
197
|
)
|
194
198
|
# detour Syck bug
|
195
|
-
return true,false,
|
199
|
+
return true,false,nil,false
|
196
200
|
end
|
197
201
|
ucs_codes.each {|ucs_code|
|
198
|
-
return true,false,
|
202
|
+
return true,false,nil,false unless is_printable?(ucs_code)
|
199
203
|
}
|
200
204
|
return true,true,is_one_line?(str),is_one_plain_line?(str)
|
201
205
|
end
|
@@ -249,7 +253,9 @@ class Ya2YAML
|
|
249
253
|
when is_printable?(ucs_code)
|
250
254
|
c
|
251
255
|
when @options[:escape_as_utf8]
|
252
|
-
|
256
|
+
c.respond_to?(:bytes) ?
|
257
|
+
c.bytes.collect {|b| '\\x%.2x' % b }.join :
|
258
|
+
'\\x' + c.unpack('H2' * c.size).join('\\x')
|
253
259
|
when ucs_code == 0x2028 || ucs_code == 0x2029
|
254
260
|
ESCAPE_SEQ_LB[c]
|
255
261
|
when ucs_code <= 0x7f
|
data/test/test.rb
CHANGED
@@ -1,17 +1,30 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
+
# encoding: UTF-8
|
2
3
|
|
3
|
-
# $Id: test.rb,v 1.
|
4
|
+
# $Id: test.rb,v 1.6 2009/02/09 09:00:57 funai Exp funai $
|
4
5
|
|
5
|
-
|
6
|
+
$:.unshift(File.expand_path(File.dirname(__FILE__) + '/../lib'))
|
6
7
|
|
7
8
|
Dir.chdir(File.dirname(__FILE__))
|
8
9
|
|
9
|
-
$KCODE = 'UTF8'
|
10
|
+
$KCODE = 'UTF8' if RUBY_VERSION < '1.9.0'
|
10
11
|
require 'ya2yaml'
|
11
12
|
|
12
13
|
require 'yaml'
|
13
14
|
require 'test/unit'
|
14
15
|
|
16
|
+
# There's an incompatibility in how ruby handles struct dumps
|
17
|
+
# between versions that's beyond our scope.
|
18
|
+
# (One uses strings internally, the other symbols.)
|
19
|
+
# This just enables tests to pass.
|
20
|
+
class << Struct
|
21
|
+
alias yaml_new_without_indifferent_keys yaml_new
|
22
|
+
def yaml_new(klass, tag, val)
|
23
|
+
val.keys.each { |k, v| val[k.to_sym] = val.delete(k) }
|
24
|
+
yaml_new_without_indifferent_keys(klass, tag, val)
|
25
|
+
end
|
26
|
+
end if RUBY_VERSION >= "1.9"
|
27
|
+
|
15
28
|
class TC_Ya2YAML < Test::Unit::TestCase
|
16
29
|
|
17
30
|
@@struct_klass = Struct::new('Foo',:bar,:buz)
|
@@ -30,16 +43,21 @@ class TC_Ya2YAML < Test::Unit::TestCase
|
|
30
43
|
puts "test may take minutes. please wait.\n"
|
31
44
|
|
32
45
|
def setup
|
33
|
-
@text
|
34
|
-
@gif
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
@struct = @@struct_klass.new('barbarbar',@@struct_klass.new('baaaar',12345))
|
39
|
-
@klass = Moo.new('boobooboo',Time.new())
|
46
|
+
@text = File.open('./t.yaml', 'r') { |f| f.read }
|
47
|
+
@gif = File.open('./t.gif', 'rb') { |f| f.read }
|
48
|
+
@struct = @@struct_klass.new('barbarbar', @@struct_klass.new('baaaar', 12345))
|
49
|
+
@klass = Moo.new('boobooboo', Time.local(2009,2,9,16,44,10))
|
40
50
|
end
|
41
51
|
|
42
52
|
def test_options
|
53
|
+
opt = {:syck_compatible => true}
|
54
|
+
'foobar'.ya2yaml(opt)
|
55
|
+
assert_equal(
|
56
|
+
{:syck_compatible => true},
|
57
|
+
opt,
|
58
|
+
'ya2yaml should not change the option hash'
|
59
|
+
)
|
60
|
+
|
43
61
|
[
|
44
62
|
[
|
45
63
|
{},
|
@@ -75,9 +93,11 @@ class TC_Ya2YAML < Test::Unit::TestCase
|
|
75
93
|
],
|
76
94
|
].each {|opt,yaml|
|
77
95
|
y = ["\xc2\x86","a\xe2\x80\xa8b\xe2\x80\xa9c"," abc\nxyz"].ya2yaml(opt)
|
78
|
-
|
79
|
-
|
80
|
-
|
96
|
+
assert_equal(
|
97
|
+
yaml,
|
98
|
+
y,
|
99
|
+
"option #{opt.inspect} should be recognized"
|
100
|
+
)
|
81
101
|
}
|
82
102
|
end
|
83
103
|
|
@@ -107,8 +127,11 @@ class TC_Ya2YAML < Test::Unit::TestCase
|
|
107
127
|
}.ya2yaml(
|
108
128
|
:hash_order => hash_order
|
109
129
|
)
|
110
|
-
|
111
|
-
|
130
|
+
assert_equal(
|
131
|
+
yaml,
|
132
|
+
y,
|
133
|
+
'hash order should be kept when :hash_order provided'
|
134
|
+
)
|
112
135
|
}
|
113
136
|
end
|
114
137
|
|
@@ -129,8 +152,11 @@ class TC_Ya2YAML < Test::Unit::TestCase
|
|
129
152
|
y = src.ya2yaml(
|
130
153
|
:minimum_block_length => 16
|
131
154
|
)
|
132
|
-
|
133
|
-
|
155
|
+
assert_equal(
|
156
|
+
yaml,
|
157
|
+
y,
|
158
|
+
'line breaks should be normalized to fit the format.'
|
159
|
+
)
|
134
160
|
}
|
135
161
|
end
|
136
162
|
|
@@ -140,16 +166,23 @@ class TC_Ya2YAML < Test::Unit::TestCase
|
|
140
166
|
[Struct.new(:foo).new(123), "--- !ruby/struct: \n foo: 123\n",],
|
141
167
|
].each {|src,yaml|
|
142
168
|
y = src.ya2yaml()
|
143
|
-
assert_equal(
|
169
|
+
assert_equal(
|
170
|
+
yaml,
|
171
|
+
y,
|
172
|
+
'ruby struct should be serialized properly'
|
173
|
+
)
|
144
174
|
}
|
145
175
|
end
|
146
176
|
|
147
177
|
def test_roundtrip_single_byte_char
|
148
178
|
("\x00".."\x7f").each {|c|
|
149
179
|
y = c.ya2yaml()
|
150
|
-
# puts y
|
151
180
|
r = YAML.load(y)
|
152
|
-
assert_equal(
|
181
|
+
assert_equal(
|
182
|
+
(c == "\r" ? "\n" : c), # "\r" is normalized as "\n"
|
183
|
+
r,
|
184
|
+
'single byte characters should round-trip properly'
|
185
|
+
)
|
153
186
|
}
|
154
187
|
end
|
155
188
|
|
@@ -177,18 +210,19 @@ class TC_Ya2YAML < Test::Unit::TestCase
|
|
177
210
|
0x10ffff,
|
178
211
|
].each {|ucs_code|
|
179
212
|
[-1,0,1].each {|ofs|
|
180
|
-
(c = [ucs_code + ofs].pack('U'))
|
213
|
+
(c = [ucs_code + ofs].pack('U'))
|
214
|
+
next unless c.valid_encoding? if c.respond_to? :valid_encoding?
|
181
215
|
c_hex = c.unpack('H8')
|
182
216
|
y = c.ya2yaml(
|
183
217
|
:escape_b_specific => true,
|
184
218
|
:escape_as_utf8 => true
|
185
219
|
)
|
186
|
-
# puts y
|
187
220
|
r = YAML.load(y)
|
188
221
|
assert_equal(
|
189
|
-
|
190
|
-
|
191
|
-
|
222
|
+
(c == "\xc2\x85" ? "\n" : c), # "\N" is normalized as "\n"
|
223
|
+
r,
|
224
|
+
"multi byte characters #{c_hex} should round-trip properly"
|
225
|
+
)
|
192
226
|
}
|
193
227
|
}
|
194
228
|
end
|
@@ -254,13 +288,16 @@ class TC_Ya2YAML < Test::Unit::TestCase
|
|
254
288
|
'=',
|
255
289
|
].each {|c|
|
256
290
|
['','hoge'].each {|ext|
|
257
|
-
|
291
|
+
src = (c.class == String) ? (c + ext) : c
|
258
292
|
y = src.ya2yaml(
|
259
293
|
:escape_as_utf8 => true
|
260
294
|
)
|
261
|
-
# puts y
|
262
295
|
r = YAML.load(y)
|
263
|
-
assert_equal(
|
296
|
+
assert_equal(
|
297
|
+
src,
|
298
|
+
r,
|
299
|
+
'ambiguous elements should round-trip properly'
|
300
|
+
)
|
264
301
|
}
|
265
302
|
}
|
266
303
|
end
|
@@ -271,22 +308,39 @@ class TC_Ya2YAML < Test::Unit::TestCase
|
|
271
308
|
chars.each {|i|
|
272
309
|
chars.each {|j|
|
273
310
|
chars.each {|k|
|
274
|
-
|
275
|
-
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
311
|
+
src = i + j + k
|
312
|
+
y = src.ya2yaml(
|
313
|
+
:printable_with_syck => true,
|
314
|
+
:escape_b_specific => true,
|
315
|
+
:escape_as_utf8 => true
|
316
|
+
)
|
317
|
+
r = YAML.load(y)
|
318
|
+
assert_equal(
|
319
|
+
src,
|
320
|
+
r,
|
321
|
+
'string of special characters should round-trip properly'
|
322
|
+
)
|
285
323
|
}
|
286
324
|
}
|
287
325
|
}
|
288
326
|
end
|
289
327
|
|
328
|
+
# patch by pawel.j.radecki at gmail.com. thanks!
|
329
|
+
def test_roundtrip_symbols
|
330
|
+
symbol1 = :"Batman: The Dark Knight - Why So Serious?!"
|
331
|
+
result_symbol1 = YAML.load(symbol1.ya2yaml)
|
332
|
+
assert_equal(symbol1,result_symbol1)
|
333
|
+
|
334
|
+
symbol2 = :"Batman: The Dark Knight - \"Why So Serious?!\""
|
335
|
+
result_symbol2 = YAML.load(symbol2.ya2yaml)
|
336
|
+
assert_equal(symbol2,result_symbol2)
|
337
|
+
|
338
|
+
# # YAML.load problem: the quotes within the symbol are lost here
|
339
|
+
# symbol3 = :"\"Batman: The Dark Knight - Why So Serious?!\""
|
340
|
+
# result_symbol3 = YAML.load(symbol3.ya2yaml)
|
341
|
+
# assert_equal(symbol3,result_symbol3)
|
342
|
+
end
|
343
|
+
|
290
344
|
def test_roundtrip_types
|
291
345
|
objects = [
|
292
346
|
[],
|
@@ -296,21 +350,22 @@ class TC_Ya2YAML < Test::Unit::TestCase
|
|
296
350
|
nil,
|
297
351
|
'hoge',
|
298
352
|
"abc\nxyz\n",
|
299
|
-
"\xff\xff",
|
353
|
+
(s = "\xff\xff"),
|
300
354
|
true,
|
301
355
|
false,
|
302
356
|
1000,
|
303
357
|
1000.1,
|
304
358
|
-1000,
|
305
359
|
-1000.1,
|
306
|
-
Date.
|
307
|
-
Time.
|
360
|
+
Date.new(2009,2,9),
|
361
|
+
Time.local(2009,2,9,16,35,22),
|
308
362
|
:foo,
|
309
363
|
1..10,
|
310
364
|
/abc\nxyz/i,
|
311
365
|
@struct,
|
312
366
|
@klass,
|
313
367
|
]
|
368
|
+
s.force_encoding("BINARY") if s.respond_to? :force_encoding
|
314
369
|
|
315
370
|
objects.each {|obj|
|
316
371
|
src = case obj.class.to_s
|
@@ -337,16 +392,19 @@ class TC_Ya2YAML < Test::Unit::TestCase
|
|
337
392
|
y = src.ya2yaml(
|
338
393
|
:syck_compatible => true
|
339
394
|
)
|
340
|
-
# puts y
|
341
395
|
|
342
396
|
r = YAML.load(y)
|
343
|
-
assert_equal(
|
397
|
+
assert_equal(
|
398
|
+
src,
|
399
|
+
r,
|
400
|
+
'types other than String should round-trip properly'
|
401
|
+
)
|
344
402
|
}
|
345
403
|
end
|
346
404
|
|
347
405
|
def test_roundtrip_various
|
348
406
|
[
|
349
|
-
[1,2,['c','d',[[['e']],[]],'f'],3,Time.
|
407
|
+
[1,2,['c','d',[[['e']],[]],'f'],3,Time.local(2009,2,9,17,9),[[:foo]],nil,true,false,[],{},{[123,223]=>456},{[1]=>2,'a'=>'b','c' => [9,9,9],Time.local(2009,2,9,17,10) => 'hoge'},],
|
350
408
|
[],
|
351
409
|
{[123,223]=>456},
|
352
410
|
{},
|
@@ -370,13 +428,14 @@ class TC_Ya2YAML < Test::Unit::TestCase
|
|
370
428
|
y = src.ya2yaml(
|
371
429
|
:syck_compatible => true
|
372
430
|
)
|
373
|
-
# puts y
|
374
431
|
|
375
432
|
r = YAML.load(y)
|
376
|
-
assert_equal(
|
433
|
+
assert_equal(
|
434
|
+
src,
|
435
|
+
r,
|
436
|
+
'various types should round-trip properly'
|
437
|
+
)
|
377
438
|
}
|
378
439
|
end
|
379
440
|
|
380
441
|
end
|
381
|
-
|
382
|
-
__END__
|
metadata
CHANGED
@@ -1,33 +1,32 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
|
-
rubygems_version: 0.9.0
|
3
|
-
specification_version: 1
|
4
2
|
name: ya2yaml
|
5
3
|
version: !ruby/object:Gem::Version
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
-
|
11
|
-
|
12
|
-
homepage: http://rubyforge.org/projects/ya2yaml/
|
13
|
-
rubyforge_project:
|
14
|
-
description:
|
15
|
-
autorequire: ya2yaml
|
16
|
-
default_executable:
|
17
|
-
bindir: bin
|
18
|
-
has_rdoc: true
|
19
|
-
required_ruby_version: !ruby/object:Gem::Version::Requirement
|
20
|
-
requirements:
|
21
|
-
- - ">"
|
22
|
-
- !ruby/object:Gem::Version
|
23
|
-
version: 0.0.0
|
24
|
-
version:
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 0
|
7
|
+
- 29
|
8
|
+
- 2
|
9
|
+
version: 0.29.2
|
25
10
|
platform: ruby
|
26
|
-
signing_key:
|
27
|
-
cert_chain:
|
28
|
-
post_install_message:
|
29
11
|
authors:
|
30
12
|
- Akira FUNAI
|
13
|
+
autorequire:
|
14
|
+
bindir: bin
|
15
|
+
cert_chain:
|
16
|
+
date: 2010-05-04 00:00:00 +09:00
|
17
|
+
default_executable:
|
18
|
+
dependencies: []
|
19
|
+
|
20
|
+
description: |
|
21
|
+
Ya2YAML is "yet another to_yaml". It emits YAML document with complete UTF8 support (string/binary detection, "\u" escape sequences and Unicode specific line breaks).
|
22
|
+
|
23
|
+
email: akira@funai.com
|
24
|
+
executables: []
|
25
|
+
|
26
|
+
extensions: []
|
27
|
+
|
28
|
+
extra_rdoc_files:
|
29
|
+
- README
|
31
30
|
files:
|
32
31
|
- lib/ya2yaml.rb
|
33
32
|
- README
|
@@ -35,20 +34,40 @@ files:
|
|
35
34
|
- test/t.gif
|
36
35
|
- test/t.yaml
|
37
36
|
- test/test.rb
|
38
|
-
|
39
|
-
|
37
|
+
has_rdoc: true
|
38
|
+
homepage: http://rubyforge.org/projects/ya2yaml/
|
39
|
+
licenses: []
|
40
|
+
|
41
|
+
post_install_message:
|
40
42
|
rdoc_options:
|
41
43
|
- --main
|
42
44
|
- README
|
43
45
|
- --charset
|
44
46
|
- UTF8
|
45
|
-
|
46
|
-
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
47
|
+
require_paths:
|
48
|
+
- lib
|
49
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
50
|
+
requirements:
|
51
|
+
- - ">"
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
segments:
|
54
|
+
- 0
|
55
|
+
- 0
|
56
|
+
- 0
|
57
|
+
version: 0.0.0
|
58
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
59
|
+
requirements:
|
60
|
+
- - ">="
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
segments:
|
63
|
+
- 0
|
64
|
+
version: "0"
|
51
65
|
requirements: []
|
52
66
|
|
53
|
-
|
54
|
-
|
67
|
+
rubyforge_project: ya2yaml
|
68
|
+
rubygems_version: 1.3.6
|
69
|
+
signing_key:
|
70
|
+
specification_version: 1
|
71
|
+
summary: An UTF8 safe YAML dumper.
|
72
|
+
test_files:
|
73
|
+
- test/test.rb
|