psych 2.0.14-java

Sign up to get free protection for your applications and to get access to all the features.
Files changed (118) hide show
  1. checksums.yaml +7 -0
  2. data/.autotest +18 -0
  3. data/.gemtest +0 -0
  4. data/.travis.yml +16 -0
  5. data/CHANGELOG.rdoc +576 -0
  6. data/Manifest.txt +114 -0
  7. data/README.rdoc +71 -0
  8. data/Rakefile +123 -0
  9. data/ext/psych/depend +3 -0
  10. data/ext/psych/extconf.rb +38 -0
  11. data/ext/psych/psych.c +34 -0
  12. data/ext/psych/psych.h +20 -0
  13. data/ext/psych/psych_emitter.c +555 -0
  14. data/ext/psych/psych_emitter.h +8 -0
  15. data/ext/psych/psych_parser.c +597 -0
  16. data/ext/psych/psych_parser.h +6 -0
  17. data/ext/psych/psych_to_ruby.c +43 -0
  18. data/ext/psych/psych_to_ruby.h +8 -0
  19. data/ext/psych/psych_yaml_tree.c +24 -0
  20. data/ext/psych/psych_yaml_tree.h +8 -0
  21. data/ext/psych/yaml/LICENSE +19 -0
  22. data/ext/psych/yaml/api.c +1415 -0
  23. data/ext/psych/yaml/config.h +10 -0
  24. data/ext/psych/yaml/dumper.c +394 -0
  25. data/ext/psych/yaml/emitter.c +2329 -0
  26. data/ext/psych/yaml/loader.c +459 -0
  27. data/ext/psych/yaml/parser.c +1370 -0
  28. data/ext/psych/yaml/reader.c +469 -0
  29. data/ext/psych/yaml/scanner.c +3576 -0
  30. data/ext/psych/yaml/writer.c +141 -0
  31. data/ext/psych/yaml/yaml.h +1971 -0
  32. data/ext/psych/yaml/yaml_private.h +664 -0
  33. data/lib/psych.jar +0 -0
  34. data/lib/psych.rb +504 -0
  35. data/lib/psych/class_loader.rb +101 -0
  36. data/lib/psych/coder.rb +94 -0
  37. data/lib/psych/core_ext.rb +35 -0
  38. data/lib/psych/deprecated.rb +85 -0
  39. data/lib/psych/exception.rb +13 -0
  40. data/lib/psych/handler.rb +249 -0
  41. data/lib/psych/handlers/document_stream.rb +22 -0
  42. data/lib/psych/handlers/recorder.rb +39 -0
  43. data/lib/psych/json/ruby_events.rb +19 -0
  44. data/lib/psych/json/stream.rb +16 -0
  45. data/lib/psych/json/tree_builder.rb +12 -0
  46. data/lib/psych/json/yaml_events.rb +29 -0
  47. data/lib/psych/nodes.rb +77 -0
  48. data/lib/psych/nodes/alias.rb +18 -0
  49. data/lib/psych/nodes/document.rb +60 -0
  50. data/lib/psych/nodes/mapping.rb +56 -0
  51. data/lib/psych/nodes/node.rb +55 -0
  52. data/lib/psych/nodes/scalar.rb +67 -0
  53. data/lib/psych/nodes/sequence.rb +81 -0
  54. data/lib/psych/nodes/stream.rb +37 -0
  55. data/lib/psych/omap.rb +4 -0
  56. data/lib/psych/parser.rb +51 -0
  57. data/lib/psych/scalar_scanner.rb +149 -0
  58. data/lib/psych/set.rb +4 -0
  59. data/lib/psych/stream.rb +37 -0
  60. data/lib/psych/streaming.rb +27 -0
  61. data/lib/psych/syntax_error.rb +21 -0
  62. data/lib/psych/tree_builder.rb +96 -0
  63. data/lib/psych/versions.rb +3 -0
  64. data/lib/psych/visitors.rb +6 -0
  65. data/lib/psych/visitors/depth_first.rb +26 -0
  66. data/lib/psych/visitors/emitter.rb +51 -0
  67. data/lib/psych/visitors/json_tree.rb +24 -0
  68. data/lib/psych/visitors/to_ruby.rb +404 -0
  69. data/lib/psych/visitors/visitor.rb +19 -0
  70. data/lib/psych/visitors/yaml_tree.rb +605 -0
  71. data/lib/psych/y.rb +9 -0
  72. data/lib/psych_jars.rb +5 -0
  73. data/test/psych/handlers/test_recorder.rb +25 -0
  74. data/test/psych/helper.rb +121 -0
  75. data/test/psych/json/test_stream.rb +109 -0
  76. data/test/psych/nodes/test_enumerable.rb +43 -0
  77. data/test/psych/test_alias_and_anchor.rb +96 -0
  78. data/test/psych/test_array.rb +57 -0
  79. data/test/psych/test_boolean.rb +36 -0
  80. data/test/psych/test_class.rb +36 -0
  81. data/test/psych/test_coder.rb +206 -0
  82. data/test/psych/test_date_time.rb +38 -0
  83. data/test/psych/test_deprecated.rb +214 -0
  84. data/test/psych/test_document.rb +46 -0
  85. data/test/psych/test_emitter.rb +93 -0
  86. data/test/psych/test_encoding.rb +259 -0
  87. data/test/psych/test_exception.rb +157 -0
  88. data/test/psych/test_hash.rb +94 -0
  89. data/test/psych/test_json_tree.rb +65 -0
  90. data/test/psych/test_merge_keys.rb +180 -0
  91. data/test/psych/test_nil.rb +18 -0
  92. data/test/psych/test_null.rb +19 -0
  93. data/test/psych/test_numeric.rb +45 -0
  94. data/test/psych/test_object.rb +44 -0
  95. data/test/psych/test_object_references.rb +71 -0
  96. data/test/psych/test_omap.rb +75 -0
  97. data/test/psych/test_parser.rb +339 -0
  98. data/test/psych/test_psych.rb +168 -0
  99. data/test/psych/test_safe_load.rb +97 -0
  100. data/test/psych/test_scalar.rb +11 -0
  101. data/test/psych/test_scalar_scanner.rb +106 -0
  102. data/test/psych/test_serialize_subclasses.rb +38 -0
  103. data/test/psych/test_set.rb +49 -0
  104. data/test/psych/test_stream.rb +93 -0
  105. data/test/psych/test_string.rb +226 -0
  106. data/test/psych/test_struct.rb +49 -0
  107. data/test/psych/test_symbol.rb +25 -0
  108. data/test/psych/test_tainted.rb +130 -0
  109. data/test/psych/test_to_yaml_properties.rb +63 -0
  110. data/test/psych/test_tree_builder.rb +79 -0
  111. data/test/psych/test_yaml.rb +1292 -0
  112. data/test/psych/test_yamldbm.rb +193 -0
  113. data/test/psych/test_yamlstore.rb +85 -0
  114. data/test/psych/visitors/test_depth_first.rb +49 -0
  115. data/test/psych/visitors/test_emitter.rb +144 -0
  116. data/test/psych/visitors/test_to_ruby.rb +333 -0
  117. data/test/psych/visitors/test_yaml_tree.rb +173 -0
  118. metadata +240 -0
@@ -0,0 +1,3 @@
1
+ module Psych
2
+ DEFAULT_SNAKEYAML_VERSION = '1.14'.freeze
3
+ end
@@ -0,0 +1,6 @@
1
+ require 'psych/visitors/visitor'
2
+ require 'psych/visitors/to_ruby'
3
+ require 'psych/visitors/emitter'
4
+ require 'psych/visitors/yaml_tree'
5
+ require 'psych/visitors/json_tree'
6
+ require 'psych/visitors/depth_first'
@@ -0,0 +1,26 @@
1
+ module Psych
2
+ module Visitors
3
+ class DepthFirst < Psych::Visitors::Visitor
4
+ def initialize block
5
+ @block = block
6
+ end
7
+
8
+ private
9
+
10
+ def nary o
11
+ o.children.each { |x| visit x }
12
+ @block.call o
13
+ end
14
+ alias :visit_Psych_Nodes_Stream :nary
15
+ alias :visit_Psych_Nodes_Document :nary
16
+ alias :visit_Psych_Nodes_Sequence :nary
17
+ alias :visit_Psych_Nodes_Mapping :nary
18
+
19
+ def terminal o
20
+ @block.call o
21
+ end
22
+ alias :visit_Psych_Nodes_Scalar :terminal
23
+ alias :visit_Psych_Nodes_Alias :terminal
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,51 @@
1
+ module Psych
2
+ module Visitors
3
+ class Emitter < Psych::Visitors::Visitor
4
+ def initialize io, options = {}
5
+ opts = [:indentation, :canonical, :line_width].find_all { |opt|
6
+ options.key?(opt)
7
+ }
8
+
9
+ if opts.empty?
10
+ @handler = Psych::Emitter.new io
11
+ else
12
+ du = Handler::DumperOptions.new
13
+ opts.each { |option| du.send :"#{option}=", options[option] }
14
+ @handler = Psych::Emitter.new io, du
15
+ end
16
+ end
17
+
18
+ def visit_Psych_Nodes_Stream o
19
+ @handler.start_stream o.encoding
20
+ o.children.each { |c| accept c }
21
+ @handler.end_stream
22
+ end
23
+
24
+ def visit_Psych_Nodes_Document o
25
+ @handler.start_document o.version, o.tag_directives, o.implicit
26
+ o.children.each { |c| accept c }
27
+ @handler.end_document o.implicit_end
28
+ end
29
+
30
+ def visit_Psych_Nodes_Scalar o
31
+ @handler.scalar o.value, o.anchor, o.tag, o.plain, o.quoted, o.style
32
+ end
33
+
34
+ def visit_Psych_Nodes_Sequence o
35
+ @handler.start_sequence o.anchor, o.tag, o.implicit, o.style
36
+ o.children.each { |c| accept c }
37
+ @handler.end_sequence
38
+ end
39
+
40
+ def visit_Psych_Nodes_Mapping o
41
+ @handler.start_mapping o.anchor, o.tag, o.implicit, o.style
42
+ o.children.each { |c| accept c }
43
+ @handler.end_mapping
44
+ end
45
+
46
+ def visit_Psych_Nodes_Alias o
47
+ @handler.alias o.anchor
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,24 @@
1
+ require 'psych/json/ruby_events'
2
+
3
+ module Psych
4
+ module Visitors
5
+ class JSONTree < YAMLTree
6
+ include Psych::JSON::RubyEvents
7
+
8
+ def self.create options = {}
9
+ emitter = Psych::JSON::TreeBuilder.new
10
+ class_loader = ClassLoader.new
11
+ ss = ScalarScanner.new class_loader
12
+ new(emitter, ss, options)
13
+ end
14
+
15
+ def accept target
16
+ if target.respond_to?(:encode_with)
17
+ dump_coder target
18
+ else
19
+ send(@dispatch_cache[target.class], target)
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,404 @@
1
+ require 'psych/scalar_scanner'
2
+ require 'psych/class_loader'
3
+ require 'psych/exception'
4
+
5
+ unless defined?(Regexp::NOENCODING)
6
+ Regexp::NOENCODING = 32
7
+ end
8
+
9
+ module Psych
10
+ module Visitors
11
+ ###
12
+ # This class walks a YAML AST, converting each node to Ruby
13
+ class ToRuby < Psych::Visitors::Visitor
14
+ def self.create
15
+ class_loader = ClassLoader.new
16
+ scanner = ScalarScanner.new class_loader
17
+ new(scanner, class_loader)
18
+ end
19
+
20
+ attr_reader :class_loader
21
+
22
+ def initialize ss, class_loader
23
+ super()
24
+ @st = {}
25
+ @ss = ss
26
+ @domain_types = Psych.domain_types
27
+ @class_loader = class_loader
28
+ end
29
+
30
+ def accept target
31
+ result = super
32
+ return result if @domain_types.empty? || !target.tag
33
+
34
+ key = target.tag.sub(/^[!\/]*/, '').sub(/(,\d+)\//, '\1:')
35
+ key = "tag:#{key}" unless key =~ /^(?:tag:|x-private)/
36
+
37
+ if @domain_types.key? key
38
+ value, block = @domain_types[key]
39
+ return block.call value, result
40
+ end
41
+
42
+ result
43
+ end
44
+
45
+ def deserialize o
46
+ if klass = resolve_class(Psych.load_tags[o.tag])
47
+ instance = klass.allocate
48
+
49
+ if instance.respond_to?(:init_with)
50
+ coder = Psych::Coder.new(o.tag)
51
+ coder.scalar = o.value
52
+ instance.init_with coder
53
+ end
54
+
55
+ return instance
56
+ end
57
+
58
+ return o.value if o.quoted
59
+ return @ss.tokenize(o.value) unless o.tag
60
+
61
+ case o.tag
62
+ when '!binary', 'tag:yaml.org,2002:binary'
63
+ o.value.unpack('m').first
64
+ when /^!(?:str|ruby\/string)(?::(.*))?$/, 'tag:yaml.org,2002:str'
65
+ klass = resolve_class($1)
66
+ if klass
67
+ klass.allocate.replace o.value
68
+ else
69
+ o.value
70
+ end
71
+ when '!ruby/object:BigDecimal'
72
+ require 'bigdecimal'
73
+ class_loader.big_decimal._load o.value
74
+ when "!ruby/object:DateTime"
75
+ class_loader.date_time
76
+ require 'date'
77
+ @ss.parse_time(o.value).to_datetime
78
+ when '!ruby/encoding'
79
+ ::Encoding.find o.value
80
+ when "!ruby/object:Complex"
81
+ class_loader.complex
82
+ Complex(o.value)
83
+ when "!ruby/object:Rational"
84
+ class_loader.rational
85
+ Rational(o.value)
86
+ when "!ruby/class", "!ruby/module"
87
+ resolve_class o.value
88
+ when "tag:yaml.org,2002:float", "!float"
89
+ Float(@ss.tokenize(o.value))
90
+ when "!ruby/regexp"
91
+ klass = class_loader.regexp
92
+ o.value =~ /^\/(.*)\/([mixn]*)$/m
93
+ source = $1
94
+ options = 0
95
+ lang = nil
96
+ ($2 || '').split('').each do |option|
97
+ case option
98
+ when 'x' then options |= Regexp::EXTENDED
99
+ when 'i' then options |= Regexp::IGNORECASE
100
+ when 'm' then options |= Regexp::MULTILINE
101
+ when 'n' then options |= Regexp::NOENCODING
102
+ else lang = option
103
+ end
104
+ end
105
+ klass.new(*[source, options, lang].compact)
106
+ when "!ruby/range"
107
+ klass = class_loader.range
108
+ args = o.value.split(/([.]{2,3})/, 2).map { |s|
109
+ accept Nodes::Scalar.new(s)
110
+ }
111
+ args.push(args.delete_at(1) == '...')
112
+ klass.new(*args)
113
+ when /^!ruby\/sym(bol)?:?(.*)?$/
114
+ class_loader.symbolize o.value
115
+ else
116
+ @ss.tokenize o.value
117
+ end
118
+ end
119
+ private :deserialize
120
+
121
+ def visit_Psych_Nodes_Scalar o
122
+ register o, deserialize(o)
123
+ end
124
+
125
+ def visit_Psych_Nodes_Sequence o
126
+ if klass = resolve_class(Psych.load_tags[o.tag])
127
+ instance = klass.allocate
128
+
129
+ if instance.respond_to?(:init_with)
130
+ coder = Psych::Coder.new(o.tag)
131
+ coder.seq = o.children.map { |c| accept c }
132
+ instance.init_with coder
133
+ end
134
+
135
+ return instance
136
+ end
137
+
138
+ case o.tag
139
+ when nil
140
+ register_empty(o)
141
+ when '!omap', 'tag:yaml.org,2002:omap'
142
+ map = register(o, Psych::Omap.new)
143
+ o.children.each { |a|
144
+ map[accept(a.children.first)] = accept a.children.last
145
+ }
146
+ map
147
+ when /^!(?:seq|ruby\/array):(.*)$/
148
+ klass = resolve_class($1)
149
+ list = register(o, klass.allocate)
150
+ o.children.each { |c| list.push accept c }
151
+ list
152
+ else
153
+ register_empty(o)
154
+ end
155
+ end
156
+
157
+ def visit_Psych_Nodes_Mapping o
158
+ if Psych.load_tags[o.tag]
159
+ return revive(resolve_class(Psych.load_tags[o.tag]), o)
160
+ end
161
+ return revive_hash(register(o, {}), o) unless o.tag
162
+
163
+ case o.tag
164
+ when /^!ruby\/struct:?(.*)?$/
165
+ klass = resolve_class($1) if $1
166
+
167
+ if klass
168
+ s = register(o, klass.allocate)
169
+
170
+ members = {}
171
+ struct_members = s.members.map { |x| class_loader.symbolize x }
172
+ o.children.each_slice(2) do |k,v|
173
+ member = accept(k)
174
+ value = accept(v)
175
+ if struct_members.include?(class_loader.symbolize(member))
176
+ s.send("#{member}=", value)
177
+ else
178
+ members[member.to_s.sub(/^@/, '')] = value
179
+ end
180
+ end
181
+ init_with(s, members, o)
182
+ else
183
+ klass = class_loader.struct
184
+ members = o.children.map { |c| accept c }
185
+ h = Hash[*members]
186
+ s = klass.new(*h.map { |k,v|
187
+ class_loader.symbolize k
188
+ }).new(*h.map { |k,v| v })
189
+ register(o, s)
190
+ s
191
+ end
192
+
193
+ when /^!ruby\/object:?(.*)?$/
194
+ name = $1 || 'Object'
195
+
196
+ if name == 'Complex'
197
+ class_loader.complex
198
+ h = Hash[*o.children.map { |c| accept c }]
199
+ register o, Complex(h['real'], h['image'])
200
+ elsif name == 'Rational'
201
+ class_loader.rational
202
+ h = Hash[*o.children.map { |c| accept c }]
203
+ register o, Rational(h['numerator'], h['denominator'])
204
+ elsif name == 'Hash'
205
+ revive_hash(register(o, {}), o)
206
+ else
207
+ obj = revive((resolve_class(name) || class_loader.object), o)
208
+ obj
209
+ end
210
+
211
+ when /^!(?:str|ruby\/string)(?::(.*))?$/, 'tag:yaml.org,2002:str'
212
+ klass = resolve_class($1)
213
+ members = {}
214
+ string = nil
215
+
216
+ o.children.each_slice(2) do |k,v|
217
+ key = accept k
218
+ value = accept v
219
+
220
+ if key == 'str'
221
+ if klass
222
+ string = klass.allocate.replace value
223
+ else
224
+ string = value
225
+ end
226
+ register(o, string)
227
+ else
228
+ members[key] = value
229
+ end
230
+ end
231
+ init_with(string, members.map { |k,v| [k.to_s.sub(/^@/, ''),v] }, o)
232
+ when /^!ruby\/array:(.*)$/
233
+ klass = resolve_class($1)
234
+ list = register(o, klass.allocate)
235
+
236
+ members = Hash[o.children.map { |c| accept c }.each_slice(2).to_a]
237
+ list.replace members['internal']
238
+
239
+ members['ivars'].each do |ivar, v|
240
+ list.instance_variable_set ivar, v
241
+ end
242
+ list
243
+
244
+ when '!ruby/range'
245
+ klass = class_loader.range
246
+ h = Hash[*o.children.map { |c| accept c }]
247
+ register o, klass.new(h['begin'], h['end'], h['excl'])
248
+
249
+ when /^!ruby\/exception:?(.*)?$/
250
+ h = Hash[*o.children.map { |c| accept c }]
251
+
252
+ e = build_exception((resolve_class($1) || class_loader.exception),
253
+ h.delete('message'))
254
+ init_with(e, h, o)
255
+
256
+ when '!set', 'tag:yaml.org,2002:set'
257
+ set = class_loader.psych_set.new
258
+ @st[o.anchor] = set if o.anchor
259
+ o.children.each_slice(2) do |k,v|
260
+ set[accept(k)] = accept(v)
261
+ end
262
+ set
263
+
264
+ when /^!ruby\/hash-with-ivars(?::(.*))?$/
265
+ hash = $1 ? resolve_class($1).allocate : {}
266
+ register o, hash
267
+ o.children.each_slice(2) do |key, value|
268
+ case key.value
269
+ when 'elements'
270
+ revive_hash hash, value
271
+ when 'ivars'
272
+ value.children.each_slice(2) do |k,v|
273
+ hash.instance_variable_set accept(k), accept(v)
274
+ end
275
+ end
276
+ end
277
+ hash
278
+
279
+ when /^!map:(.*)$/, /^!ruby\/hash:(.*)$/
280
+ revive_hash register(o, resolve_class($1).allocate), o
281
+
282
+ when '!omap', 'tag:yaml.org,2002:omap'
283
+ map = register(o, class_loader.psych_omap.new)
284
+ o.children.each_slice(2) do |l,r|
285
+ map[accept(l)] = accept r
286
+ end
287
+ map
288
+
289
+ when /^!ruby\/marshalable:(.*)$/
290
+ name = $1
291
+ klass = resolve_class(name)
292
+ obj = register(o, klass.allocate)
293
+
294
+ if obj.respond_to?(:init_with)
295
+ init_with(obj, revive_hash({}, o), o)
296
+ elsif obj.respond_to?(:marshal_load)
297
+ marshal_data = o.children.map(&method(:accept))
298
+ obj.marshal_load(marshal_data)
299
+ obj
300
+ else
301
+ raise ArgumentError, "Cannot deserialize #{name}"
302
+ end
303
+
304
+ else
305
+ revive_hash(register(o, {}), o)
306
+ end
307
+ end
308
+
309
+ def visit_Psych_Nodes_Document o
310
+ accept o.root
311
+ end
312
+
313
+ def visit_Psych_Nodes_Stream o
314
+ o.children.map { |c| accept c }
315
+ end
316
+
317
+ def visit_Psych_Nodes_Alias o
318
+ @st.fetch(o.anchor) { raise BadAlias, "Unknown alias: #{o.anchor}" }
319
+ end
320
+
321
+ private
322
+ def register node, object
323
+ @st[node.anchor] = object if node.anchor
324
+ object
325
+ end
326
+
327
+ def register_empty object
328
+ list = register(object, [])
329
+ object.children.each { |c| list.push accept c }
330
+ list
331
+ end
332
+
333
+ def revive_hash hash, o
334
+ o.children.each_slice(2) { |k,v|
335
+ key = accept(k)
336
+ val = accept(v)
337
+
338
+ if key == '<<' && k.tag != "tag:yaml.org,2002:str"
339
+ case v
340
+ when Nodes::Alias, Nodes::Mapping
341
+ begin
342
+ hash.merge! val
343
+ rescue TypeError
344
+ hash[key] = val
345
+ end
346
+ when Nodes::Sequence
347
+ begin
348
+ h = {}
349
+ val.reverse_each do |value|
350
+ h.merge! value
351
+ end
352
+ hash.merge! h
353
+ rescue TypeError
354
+ hash[key] = val
355
+ end
356
+ else
357
+ hash[key] = val
358
+ end
359
+ else
360
+ hash[key] = val
361
+ end
362
+
363
+ }
364
+ hash
365
+ end
366
+
367
+ def merge_key hash, key, val
368
+ end
369
+
370
+ def revive klass, node
371
+ s = register(node, klass.allocate)
372
+ init_with(s, revive_hash({}, node), node)
373
+ end
374
+
375
+ def init_with o, h, node
376
+ c = Psych::Coder.new(node.tag)
377
+ c.map = h
378
+
379
+ if o.respond_to?(:init_with)
380
+ o.init_with c
381
+ elsif o.respond_to?(:yaml_initialize)
382
+ if $VERBOSE
383
+ warn "Implementing #{o.class}#yaml_initialize is deprecated, please implement \"init_with(coder)\""
384
+ end
385
+ o.yaml_initialize c.tag, c.map
386
+ else
387
+ h.each { |k,v| o.instance_variable_set(:"@#{k}", v) }
388
+ end
389
+ o
390
+ end
391
+
392
+ # Convert +klassname+ to a Class
393
+ def resolve_class klassname
394
+ class_loader.load klassname
395
+ end
396
+ end
397
+
398
+ class NoAliasRuby < ToRuby
399
+ def visit_Psych_Nodes_Alias o
400
+ raise BadAlias, "Unknown alias: #{o.anchor}"
401
+ end
402
+ end
403
+ end
404
+ end