psych 2.0.6 → 2.0.7
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.
- checksums.yaml +4 -4
- data/CHANGELOG.rdoc +7 -0
- data/ext/psych/psych.c +1 -1
- data/ext/psych/psych_emitter.c +35 -19
- data/ext/psych/psych_emitter.h +1 -1
- data/ext/psych/psych_parser.c +20 -4
- data/ext/psych/psych_parser.h +1 -1
- data/lib/psych.rb +1 -1
- data/lib/psych/visitors/to_ruby.rb +15 -0
- data/lib/psych/visitors/yaml_tree.rb +14 -0
- data/test/psych/json/test_stream.rb +1 -1
- data/test/psych/test_emitter.rb +1 -2
- data/test/psych/test_json_tree.rb +1 -1
- data/test/psych/test_marshalable.rb +54 -0
- metadata +7 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 163fb9a33cd5288edcf15b1fab6557d2a850e317
|
4
|
+
data.tar.gz: 1b5b162695a85cd2eb4e1908628fb8de47a1c4a2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 978a354b0030d9454d1f24e7c4fa2a5224960777a5fa488cf8197d01d5362ce45aa48ef7c734a50c1d0bb4beb3b9740aeaa85dd3a248d9c6b2078f9674f90013
|
7
|
+
data.tar.gz: 4d246b34357ab91db5fad9333b08d842cf2f18a9e893efdf446b3db1eaa24d4dd78a7d4f0762b82bada7fcbc971667b357e1d449bb7b140cb1aaceaddf94145e
|
data/CHANGELOG.rdoc
CHANGED
@@ -1,3 +1,10 @@
|
|
1
|
+
Sun Nov 23 13:11:24 2014 Sean Griffin <sean@thoughtbot.com>
|
2
|
+
|
3
|
+
* lib/psych/visitors/to_ruby.rb: Allow loading any BasicObject that
|
4
|
+
defines #marshal_load, fixes #100
|
5
|
+
* lib/psych/visitors/yaml_tree.rb: Allow dumping any BasicObject that
|
6
|
+
defines #marshal_dump
|
7
|
+
|
1
8
|
Sat Aug 30 06:39:48 2014 Aaron Patterson <aaron@tenderlovemaking.com>
|
2
9
|
|
3
10
|
* ext/psych/lib/psych/visitors/yaml_tree.rb: fix NameError dumping and
|
data/ext/psych/psych.c
CHANGED
data/ext/psych/psych_emitter.c
CHANGED
@@ -29,6 +29,22 @@ static void dealloc(void * ptr)
|
|
29
29
|
xfree(emitter);
|
30
30
|
}
|
31
31
|
|
32
|
+
#if 0
|
33
|
+
static size_t memsize(const void *ptr)
|
34
|
+
{
|
35
|
+
const yaml_emitter_t *emitter = ptr;
|
36
|
+
/* TODO: calculate emitter's size */
|
37
|
+
return 0;
|
38
|
+
}
|
39
|
+
#endif
|
40
|
+
|
41
|
+
static const rb_data_type_t psych_emitter_type = {
|
42
|
+
"Psych/emitter",
|
43
|
+
{0, dealloc, 0,},
|
44
|
+
0, 0,
|
45
|
+
RUBY_TYPED_FREE_IMMEDIATELY,
|
46
|
+
};
|
47
|
+
|
32
48
|
static VALUE allocate(VALUE klass)
|
33
49
|
{
|
34
50
|
yaml_emitter_t * emitter;
|
@@ -39,7 +55,7 @@ static VALUE allocate(VALUE klass)
|
|
39
55
|
yaml_emitter_set_unicode(emitter, 1);
|
40
56
|
yaml_emitter_set_indent(emitter, 2);
|
41
57
|
|
42
|
-
return
|
58
|
+
return TypedData_Wrap_Struct(klass, &psych_emitter_type, emitter);
|
43
59
|
}
|
44
60
|
|
45
61
|
/* call-seq: Psych::Emitter.new(io, options = Psych::Emitter::OPTIONS)
|
@@ -54,7 +70,7 @@ static VALUE initialize(int argc, VALUE *argv, VALUE self)
|
|
54
70
|
VALUE indent;
|
55
71
|
VALUE canonical;
|
56
72
|
|
57
|
-
|
73
|
+
TypedData_Get_Struct(self, yaml_emitter_t, &psych_emitter_type, emitter);
|
58
74
|
|
59
75
|
if (rb_scan_args(argc, argv, "11", &io, &options) == 2) {
|
60
76
|
line_width = rb_funcall(options, id_line_width, 0);
|
@@ -81,7 +97,7 @@ static VALUE start_stream(VALUE self, VALUE encoding)
|
|
81
97
|
{
|
82
98
|
yaml_emitter_t * emitter;
|
83
99
|
yaml_event_t event;
|
84
|
-
|
100
|
+
TypedData_Get_Struct(self, yaml_emitter_t, &psych_emitter_type, emitter);
|
85
101
|
Check_Type(encoding, T_FIXNUM);
|
86
102
|
|
87
103
|
yaml_stream_start_event_initialize(&event, (yaml_encoding_t)NUM2INT(encoding));
|
@@ -101,7 +117,7 @@ static VALUE end_stream(VALUE self)
|
|
101
117
|
{
|
102
118
|
yaml_emitter_t * emitter;
|
103
119
|
yaml_event_t event;
|
104
|
-
|
120
|
+
TypedData_Get_Struct(self, yaml_emitter_t, &psych_emitter_type, emitter);
|
105
121
|
|
106
122
|
yaml_stream_end_event_initialize(&event);
|
107
123
|
|
@@ -124,7 +140,7 @@ static VALUE start_document(VALUE self, VALUE version, VALUE tags, VALUE imp)
|
|
124
140
|
yaml_tag_directive_t * tail = NULL;
|
125
141
|
yaml_event_t event;
|
126
142
|
yaml_version_directive_t version_directive;
|
127
|
-
|
143
|
+
TypedData_Get_Struct(self, yaml_emitter_t, &psych_emitter_type, emitter);
|
128
144
|
|
129
145
|
|
130
146
|
Check_Type(version, T_ARRAY);
|
@@ -198,7 +214,7 @@ static VALUE end_document(VALUE self, VALUE imp)
|
|
198
214
|
{
|
199
215
|
yaml_emitter_t * emitter;
|
200
216
|
yaml_event_t event;
|
201
|
-
|
217
|
+
TypedData_Get_Struct(self, yaml_emitter_t, &psych_emitter_type, emitter);
|
202
218
|
|
203
219
|
yaml_document_end_event_initialize(&event, imp ? 1 : 0);
|
204
220
|
|
@@ -228,7 +244,7 @@ static VALUE scalar(
|
|
228
244
|
#ifdef HAVE_RUBY_ENCODING_H
|
229
245
|
rb_encoding *encoding;
|
230
246
|
#endif
|
231
|
-
|
247
|
+
TypedData_Get_Struct(self, yaml_emitter_t, &psych_emitter_type, emitter);
|
232
248
|
|
233
249
|
Check_Type(value, T_STRING);
|
234
250
|
|
@@ -295,7 +311,7 @@ static VALUE start_sequence(
|
|
295
311
|
}
|
296
312
|
#endif
|
297
313
|
|
298
|
-
|
314
|
+
TypedData_Get_Struct(self, yaml_emitter_t, &psych_emitter_type, emitter);
|
299
315
|
|
300
316
|
yaml_sequence_start_event_initialize(
|
301
317
|
&event,
|
@@ -320,7 +336,7 @@ static VALUE end_sequence(VALUE self)
|
|
320
336
|
{
|
321
337
|
yaml_emitter_t * emitter;
|
322
338
|
yaml_event_t event;
|
323
|
-
|
339
|
+
TypedData_Get_Struct(self, yaml_emitter_t, &psych_emitter_type, emitter);
|
324
340
|
|
325
341
|
yaml_sequence_end_event_initialize(&event);
|
326
342
|
|
@@ -348,7 +364,7 @@ static VALUE start_mapping(
|
|
348
364
|
#ifdef HAVE_RUBY_ENCODING_H
|
349
365
|
rb_encoding *encoding;
|
350
366
|
#endif
|
351
|
-
|
367
|
+
TypedData_Get_Struct(self, yaml_emitter_t, &psych_emitter_type, emitter);
|
352
368
|
|
353
369
|
#ifdef HAVE_RUBY_ENCODING_H
|
354
370
|
encoding = rb_utf8_encoding();
|
@@ -387,7 +403,7 @@ static VALUE end_mapping(VALUE self)
|
|
387
403
|
{
|
388
404
|
yaml_emitter_t * emitter;
|
389
405
|
yaml_event_t event;
|
390
|
-
|
406
|
+
TypedData_Get_Struct(self, yaml_emitter_t, &psych_emitter_type, emitter);
|
391
407
|
|
392
408
|
yaml_mapping_end_event_initialize(&event);
|
393
409
|
|
@@ -406,7 +422,7 @@ static VALUE alias(VALUE self, VALUE anchor)
|
|
406
422
|
{
|
407
423
|
yaml_emitter_t * emitter;
|
408
424
|
yaml_event_t event;
|
409
|
-
|
425
|
+
TypedData_Get_Struct(self, yaml_emitter_t, &psych_emitter_type, emitter);
|
410
426
|
|
411
427
|
#ifdef HAVE_RUBY_ENCODING_H
|
412
428
|
if(!NIL_P(anchor)) {
|
@@ -432,7 +448,7 @@ static VALUE alias(VALUE self, VALUE anchor)
|
|
432
448
|
static VALUE set_canonical(VALUE self, VALUE style)
|
433
449
|
{
|
434
450
|
yaml_emitter_t * emitter;
|
435
|
-
|
451
|
+
TypedData_Get_Struct(self, yaml_emitter_t, &psych_emitter_type, emitter);
|
436
452
|
|
437
453
|
yaml_emitter_set_canonical(emitter, Qtrue == style ? 1 : 0);
|
438
454
|
|
@@ -446,7 +462,7 @@ static VALUE set_canonical(VALUE self, VALUE style)
|
|
446
462
|
static VALUE canonical(VALUE self)
|
447
463
|
{
|
448
464
|
yaml_emitter_t * emitter;
|
449
|
-
|
465
|
+
TypedData_Get_Struct(self, yaml_emitter_t, &psych_emitter_type, emitter);
|
450
466
|
|
451
467
|
return (emitter->canonical == 0) ? Qfalse : Qtrue;
|
452
468
|
}
|
@@ -459,7 +475,7 @@ static VALUE canonical(VALUE self)
|
|
459
475
|
static VALUE set_indentation(VALUE self, VALUE level)
|
460
476
|
{
|
461
477
|
yaml_emitter_t * emitter;
|
462
|
-
|
478
|
+
TypedData_Get_Struct(self, yaml_emitter_t, &psych_emitter_type, emitter);
|
463
479
|
|
464
480
|
yaml_emitter_set_indent(emitter, NUM2INT(level));
|
465
481
|
|
@@ -473,7 +489,7 @@ static VALUE set_indentation(VALUE self, VALUE level)
|
|
473
489
|
static VALUE indentation(VALUE self)
|
474
490
|
{
|
475
491
|
yaml_emitter_t * emitter;
|
476
|
-
|
492
|
+
TypedData_Get_Struct(self, yaml_emitter_t, &psych_emitter_type, emitter);
|
477
493
|
|
478
494
|
return INT2NUM(emitter->best_indent);
|
479
495
|
}
|
@@ -485,7 +501,7 @@ static VALUE indentation(VALUE self)
|
|
485
501
|
static VALUE line_width(VALUE self)
|
486
502
|
{
|
487
503
|
yaml_emitter_t * emitter;
|
488
|
-
|
504
|
+
TypedData_Get_Struct(self, yaml_emitter_t, &psych_emitter_type, emitter);
|
489
505
|
|
490
506
|
return INT2NUM(emitter->best_width);
|
491
507
|
}
|
@@ -497,14 +513,14 @@ static VALUE line_width(VALUE self)
|
|
497
513
|
static VALUE set_line_width(VALUE self, VALUE width)
|
498
514
|
{
|
499
515
|
yaml_emitter_t * emitter;
|
500
|
-
|
516
|
+
TypedData_Get_Struct(self, yaml_emitter_t, &psych_emitter_type, emitter);
|
501
517
|
|
502
518
|
yaml_emitter_set_width(emitter, NUM2INT(width));
|
503
519
|
|
504
520
|
return width;
|
505
521
|
}
|
506
522
|
|
507
|
-
void Init_psych_emitter()
|
523
|
+
void Init_psych_emitter(void)
|
508
524
|
{
|
509
525
|
VALUE psych = rb_define_module("Psych");
|
510
526
|
VALUE handler = rb_define_class_under(psych, "Handler", rb_cObject);
|
data/ext/psych/psych_emitter.h
CHANGED
data/ext/psych/psych_parser.c
CHANGED
@@ -49,6 +49,22 @@ static void dealloc(void * ptr)
|
|
49
49
|
xfree(parser);
|
50
50
|
}
|
51
51
|
|
52
|
+
#if 0
|
53
|
+
static size_t memsize(const void *ptr)
|
54
|
+
{
|
55
|
+
const yaml_parser_t *parser = ptr;
|
56
|
+
/* TODO: calculate parser's size */
|
57
|
+
return 0;
|
58
|
+
}
|
59
|
+
#endif
|
60
|
+
|
61
|
+
static const rb_data_type_t psych_parser_type = {
|
62
|
+
"Psych/parser",
|
63
|
+
{0, dealloc, 0,},
|
64
|
+
0, 0,
|
65
|
+
RUBY_TYPED_FREE_IMMEDIATELY,
|
66
|
+
};
|
67
|
+
|
52
68
|
static VALUE allocate(VALUE klass)
|
53
69
|
{
|
54
70
|
yaml_parser_t * parser;
|
@@ -56,7 +72,7 @@ static VALUE allocate(VALUE klass)
|
|
56
72
|
parser = xmalloc(sizeof(yaml_parser_t));
|
57
73
|
yaml_parser_initialize(parser);
|
58
74
|
|
59
|
-
return
|
75
|
+
return TypedData_Wrap_Struct(klass, &psych_parser_type, parser);
|
60
76
|
}
|
61
77
|
|
62
78
|
static VALUE make_exception(yaml_parser_t * parser, VALUE path)
|
@@ -248,7 +264,7 @@ static VALUE parse(int argc, VALUE *argv, VALUE self)
|
|
248
264
|
path = rb_str_new2("<unknown>");
|
249
265
|
}
|
250
266
|
|
251
|
-
|
267
|
+
TypedData_Get_Struct(self, yaml_parser_t, &psych_parser_type, parser);
|
252
268
|
|
253
269
|
yaml_parser_delete(parser);
|
254
270
|
yaml_parser_initialize(parser);
|
@@ -526,7 +542,7 @@ static VALUE mark(VALUE self)
|
|
526
542
|
VALUE args[3];
|
527
543
|
yaml_parser_t * parser;
|
528
544
|
|
529
|
-
|
545
|
+
TypedData_Get_Struct(self, yaml_parser_t, &psych_parser_type, parser);
|
530
546
|
mark_klass = rb_const_get_at(cPsychParser, rb_intern("Mark"));
|
531
547
|
args[0] = INT2NUM(parser->mark.index);
|
532
548
|
args[1] = INT2NUM(parser->mark.line);
|
@@ -535,7 +551,7 @@ static VALUE mark(VALUE self)
|
|
535
551
|
return rb_class_new_instance(3, args, mark_klass);
|
536
552
|
}
|
537
553
|
|
538
|
-
void Init_psych_parser()
|
554
|
+
void Init_psych_parser(void)
|
539
555
|
{
|
540
556
|
#if 0
|
541
557
|
mPsych = rb_define_module("Psych");
|
data/ext/psych/psych_parser.h
CHANGED
data/lib/psych.rb
CHANGED
@@ -271,6 +271,21 @@ module Psych
|
|
271
271
|
end
|
272
272
|
map
|
273
273
|
|
274
|
+
when /^!ruby\/marshalable:(.*)$/
|
275
|
+
name = $1
|
276
|
+
klass = resolve_class(name)
|
277
|
+
obj = register(o, klass.allocate)
|
278
|
+
|
279
|
+
if obj.respond_to?(:init_with)
|
280
|
+
init_with(obj, revive_hash({}, o), o)
|
281
|
+
elsif obj.respond_to?(:marshal_load)
|
282
|
+
marshal_data = o.children.map(&method(:accept))
|
283
|
+
obj.marshal_load(marshal_data)
|
284
|
+
obj
|
285
|
+
else
|
286
|
+
raise ArgumentError, "Cannot deserialize #{name}"
|
287
|
+
end
|
288
|
+
|
274
289
|
else
|
275
290
|
revive_hash(register(o, {}), o)
|
276
291
|
end
|
@@ -27,6 +27,8 @@ module Psych
|
|
27
27
|
|
28
28
|
def key? target
|
29
29
|
@obj_to_node.key? target.object_id
|
30
|
+
rescue NoMethodError
|
31
|
+
false
|
30
32
|
end
|
31
33
|
|
32
34
|
def id_for target
|
@@ -411,6 +413,18 @@ module Psych
|
|
411
413
|
end
|
412
414
|
end
|
413
415
|
|
416
|
+
def visit_BasicObject o
|
417
|
+
tag = Psych.dump_tags[o.class]
|
418
|
+
tag ||= "!ruby/marshalable:#{o.class.name}"
|
419
|
+
|
420
|
+
map = @emitter.start_mapping(nil, tag, false, Nodes::Mapping::BLOCK)
|
421
|
+
register(o, map)
|
422
|
+
|
423
|
+
o.marshal_dump.each(&method(:accept))
|
424
|
+
|
425
|
+
@emitter.end_mapping
|
426
|
+
end
|
427
|
+
|
414
428
|
private
|
415
429
|
# FIXME: Remove the index and count checks in Psych 3.0
|
416
430
|
NULL = "\x00"
|
data/test/psych/test_emitter.rb
CHANGED
@@ -0,0 +1,54 @@
|
|
1
|
+
require_relative 'helper'
|
2
|
+
require 'delegate'
|
3
|
+
|
4
|
+
module Psych
|
5
|
+
class TestMarshalable < TestCase
|
6
|
+
def test_objects_defining_marshal_dump_and_marshal_load_can_be_dumped
|
7
|
+
sd = SimpleDelegator.new(1)
|
8
|
+
loaded = Psych.load(Psych.dump(sd))
|
9
|
+
|
10
|
+
assert_instance_of(SimpleDelegator, loaded)
|
11
|
+
assert_equal(sd, loaded)
|
12
|
+
end
|
13
|
+
|
14
|
+
class PsychCustomMarshalable < BasicObject
|
15
|
+
attr_reader :foo
|
16
|
+
|
17
|
+
def initialize(foo)
|
18
|
+
@foo = foo
|
19
|
+
end
|
20
|
+
|
21
|
+
def marshal_dump
|
22
|
+
[foo]
|
23
|
+
end
|
24
|
+
|
25
|
+
def mashal_load(data)
|
26
|
+
@foo = data[0]
|
27
|
+
end
|
28
|
+
|
29
|
+
def init_with(coder)
|
30
|
+
@foo = coder['foo']
|
31
|
+
end
|
32
|
+
|
33
|
+
def encode_with(coder)
|
34
|
+
coder['foo'] = 2
|
35
|
+
end
|
36
|
+
|
37
|
+
def respond_to?(method)
|
38
|
+
[:marshal_dump, :marshal_load, :init_with, :encode_with].include?(method)
|
39
|
+
end
|
40
|
+
|
41
|
+
def class
|
42
|
+
PsychCustomMarshalable
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def test_init_with_takes_priority_over_marshal_methods
|
47
|
+
obj = PsychCustomMarshalable.new(1)
|
48
|
+
loaded = Psych.load(Psych.dump(obj))
|
49
|
+
|
50
|
+
assert(PsychCustomMarshalable === loaded)
|
51
|
+
assert_equal(2, loaded.foo)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: psych
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0.
|
4
|
+
version: 2.0.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Aaron Patterson
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-12-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rdoc
|
@@ -44,14 +44,14 @@ dependencies:
|
|
44
44
|
requirements:
|
45
45
|
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: '3.
|
47
|
+
version: '3.13'
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: '3.
|
54
|
+
version: '3.13'
|
55
55
|
description: |-
|
56
56
|
Psych is a YAML parser and emitter. Psych leverages libyaml[http://pyyaml.org/wiki/LibYAML]
|
57
57
|
for its YAML parsing and emitting capabilities. In addition to wrapping
|
@@ -152,6 +152,7 @@ files:
|
|
152
152
|
- test/psych/test_exception.rb
|
153
153
|
- test/psych/test_hash.rb
|
154
154
|
- test/psych/test_json_tree.rb
|
155
|
+
- test/psych/test_marshalable.rb
|
155
156
|
- test/psych/test_merge_keys.rb
|
156
157
|
- test/psych/test_nil.rb
|
157
158
|
- test/psych/test_null.rb
|
@@ -202,7 +203,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
202
203
|
version: '0'
|
203
204
|
requirements: []
|
204
205
|
rubyforge_project:
|
205
|
-
rubygems_version: 2.
|
206
|
+
rubygems_version: 2.4.4
|
206
207
|
signing_key:
|
207
208
|
specification_version: 4
|
208
209
|
summary: Psych is a YAML parser and emitter
|
@@ -223,6 +224,7 @@ test_files:
|
|
223
224
|
- test/psych/test_exception.rb
|
224
225
|
- test/psych/test_hash.rb
|
225
226
|
- test/psych/test_json_tree.rb
|
227
|
+
- test/psych/test_marshalable.rb
|
226
228
|
- test/psych/test_merge_keys.rb
|
227
229
|
- test/psych/test_nil.rb
|
228
230
|
- test/psych/test_null.rb
|