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
data/lib/psych.jar ADDED
Binary file
data/lib/psych.rb ADDED
@@ -0,0 +1,504 @@
1
+ case RUBY_ENGINE
2
+ when 'jruby'
3
+ require 'psych_jars'
4
+ org.jruby.ext.psych.PsychLibrary.new.load(JRuby.runtime, false)
5
+ else
6
+ require 'psych.so'
7
+ end
8
+ require 'psych/nodes'
9
+ require 'psych/streaming'
10
+ require 'psych/visitors'
11
+ require 'psych/handler'
12
+ require 'psych/tree_builder'
13
+ require 'psych/parser'
14
+ require 'psych/omap'
15
+ require 'psych/set'
16
+ require 'psych/coder'
17
+ require 'psych/core_ext'
18
+ require 'psych/deprecated'
19
+ require 'psych/stream'
20
+ require 'psych/json/tree_builder'
21
+ require 'psych/json/stream'
22
+ require 'psych/handlers/document_stream'
23
+ require 'psych/class_loader'
24
+
25
+ ###
26
+ # = Overview
27
+ #
28
+ # Psych is a YAML parser and emitter.
29
+ # Psych leverages libyaml [Home page: http://pyyaml.org/wiki/LibYAML]
30
+ # or [HG repo: https://bitbucket.org/xi/libyaml] for its YAML parsing
31
+ # and emitting capabilities. In addition to wrapping libyaml, Psych also
32
+ # knows how to serialize and de-serialize most Ruby objects to and from
33
+ # the YAML format.
34
+ #
35
+ # = I NEED TO PARSE OR EMIT YAML RIGHT NOW!
36
+ #
37
+ # # Parse some YAML
38
+ # Psych.load("--- foo") # => "foo"
39
+ #
40
+ # # Emit some YAML
41
+ # Psych.dump("foo") # => "--- foo\n...\n"
42
+ # { :a => 'b'}.to_yaml # => "---\n:a: b\n"
43
+ #
44
+ # Got more time on your hands? Keep on reading!
45
+ #
46
+ # == YAML Parsing
47
+ #
48
+ # Psych provides a range of interfaces for parsing a YAML document ranging from
49
+ # low level to high level, depending on your parsing needs. At the lowest
50
+ # level, is an event based parser. Mid level is access to the raw YAML AST,
51
+ # and at the highest level is the ability to unmarshal YAML to Ruby objects.
52
+ #
53
+ # == YAML Emitting
54
+ #
55
+ # Psych provides a range of interfaces ranging from low to high level for
56
+ # producing YAML documents. Very similar to the YAML parsing interfaces, Psych
57
+ # provides at the lowest level, an event based system, mid-level is building
58
+ # a YAML AST, and the highest level is converting a Ruby object straight to
59
+ # a YAML document.
60
+ #
61
+ # == High-level API
62
+ #
63
+ # === Parsing
64
+ #
65
+ # The high level YAML parser provided by Psych simply takes YAML as input and
66
+ # returns a Ruby data structure. For information on using the high level parser
67
+ # see Psych.load
68
+ #
69
+ # ==== Reading from a string
70
+ #
71
+ # Psych.load("--- a") # => 'a'
72
+ # Psych.load("---\n - a\n - b") # => ['a', 'b']
73
+ #
74
+ # ==== Reading from a file
75
+ #
76
+ # Psych.load_file("database.yml")
77
+ #
78
+ # ==== Exception handling
79
+ #
80
+ # begin
81
+ # # The second argument changes only the exception contents
82
+ # Psych.parse("--- `", "file.txt")
83
+ # rescue Psych::SyntaxError => ex
84
+ # ex.file # => 'file.txt'
85
+ # ex.message # => "(file.txt): found character that cannot start any token"
86
+ # end
87
+ #
88
+ # === Emitting
89
+ #
90
+ # The high level emitter has the easiest interface. Psych simply takes a Ruby
91
+ # data structure and converts it to a YAML document. See Psych.dump for more
92
+ # information on dumping a Ruby data structure.
93
+ #
94
+ # ==== Writing to a string
95
+ #
96
+ # # Dump an array, get back a YAML string
97
+ # Psych.dump(['a', 'b']) # => "---\n- a\n- b\n"
98
+ #
99
+ # # Dump an array to an IO object
100
+ # Psych.dump(['a', 'b'], StringIO.new) # => #<StringIO:0x000001009d0890>
101
+ #
102
+ # # Dump an array with indentation set
103
+ # Psych.dump(['a', ['b']], :indentation => 3) # => "---\n- a\n- - b\n"
104
+ #
105
+ # # Dump an array to an IO with indentation set
106
+ # Psych.dump(['a', ['b']], StringIO.new, :indentation => 3)
107
+ #
108
+ # ==== Writing to a file
109
+ #
110
+ # Currently there is no direct API for dumping Ruby structure to file:
111
+ #
112
+ # File.open('database.yml', 'w') do |file|
113
+ # file.write(Psych.dump(['a', 'b']))
114
+ # end
115
+ #
116
+ # == Mid-level API
117
+ #
118
+ # === Parsing
119
+ #
120
+ # Psych provides access to an AST produced from parsing a YAML document. This
121
+ # tree is built using the Psych::Parser and Psych::TreeBuilder. The AST can
122
+ # be examined and manipulated freely. Please see Psych::parse_stream,
123
+ # Psych::Nodes, and Psych::Nodes::Node for more information on dealing with
124
+ # YAML syntax trees.
125
+ #
126
+ # ==== Reading from a string
127
+ #
128
+ # # Returns Psych::Nodes::Stream
129
+ # Psych.parse_stream("---\n - a\n - b")
130
+ #
131
+ # # Returns Psych::Nodes::Document
132
+ # Psych.parse("---\n - a\n - b")
133
+ #
134
+ # ==== Reading from a file
135
+ #
136
+ # # Returns Psych::Nodes::Stream
137
+ # Psych.parse_stream(File.read('database.yml'))
138
+ #
139
+ # # Returns Psych::Nodes::Document
140
+ # Psych.parse_file('database.yml')
141
+ #
142
+ # ==== Exception handling
143
+ #
144
+ # begin
145
+ # # The second argument changes only the exception contents
146
+ # Psych.parse("--- `", "file.txt")
147
+ # rescue Psych::SyntaxError => ex
148
+ # ex.file # => 'file.txt'
149
+ # ex.message # => "(file.txt): found character that cannot start any token"
150
+ # end
151
+ #
152
+ # === Emitting
153
+ #
154
+ # At the mid level is building an AST. This AST is exactly the same as the AST
155
+ # used when parsing a YAML document. Users can build an AST by hand and the
156
+ # AST knows how to emit itself as a YAML document. See Psych::Nodes,
157
+ # Psych::Nodes::Node, and Psych::TreeBuilder for more information on building
158
+ # a YAML AST.
159
+ #
160
+ # ==== Writing to a string
161
+ #
162
+ # # We need Psych::Nodes::Stream (not Psych::Nodes::Document)
163
+ # stream = Psych.parse_stream("---\n - a\n - b")
164
+ #
165
+ # stream.to_yaml # => "---\n- a\n- b\n"
166
+ #
167
+ # ==== Writing to a file
168
+ #
169
+ # # We need Psych::Nodes::Stream (not Psych::Nodes::Document)
170
+ # stream = Psych.parse_stream(File.read('database.yml'))
171
+ #
172
+ # File.open('database.yml', 'w') do |file|
173
+ # file.write(stream.to_yaml)
174
+ # end
175
+ #
176
+ # == Low-level API
177
+ #
178
+ # === Parsing
179
+ #
180
+ # The lowest level parser should be used when the YAML input is already known,
181
+ # and the developer does not want to pay the price of building an AST or
182
+ # automatic detection and conversion to Ruby objects. See Psych::Parser for
183
+ # more information on using the event based parser.
184
+ #
185
+ # ==== Reading to Psych::Nodes::Stream structure
186
+ #
187
+ # parser = Psych::Parser.new(TreeBuilder.new) # => #<Psych::Parser>
188
+ # parser = Psych.parser # it's an alias for the above
189
+ #
190
+ # parser.parse("---\n - a\n - b") # => #<Psych::Parser>
191
+ # parser.handler # => #<Psych::TreeBuilder>
192
+ # parser.handler.root # => #<Psych::Nodes::Stream>
193
+ #
194
+ # ==== Receiving an events stream
195
+ #
196
+ # parser = Psych::Parser.new(Psych::Handlers::Recorder.new)
197
+ #
198
+ # parser.parse("---\n - a\n - b")
199
+ # parser.events # => [list of [event, args] lists]
200
+ # # event is one of: Psych::Handler::EVENTS
201
+ # # args are the arguments passed to the event
202
+ #
203
+ # === Emitting
204
+ #
205
+ # The lowest level emitter is an event based system. Events are sent to a
206
+ # Psych::Emitter object. That object knows how to convert the events to a YAML
207
+ # document. This interface should be used when document format is known in
208
+ # advance or speed is a concern. See Psych::Emitter for more information.
209
+ #
210
+ # ==== Writing to a Ruby structure
211
+ #
212
+ # Psych.parser.parse("--- a") # => #<Psych::Parser>
213
+ #
214
+ # parser.handler.first # => #<Psych::Nodes::Stream>
215
+ # parser.handler.first.to_ruby # => ["a"]
216
+ #
217
+ # parser.handler.root.first # => #<Psych::Nodes::Document>
218
+ # parser.handler.root.first.to_ruby # => "a"
219
+ #
220
+ # # You can instantiate an Emitter manually
221
+ # Psych::Visitors::ToRuby.new.accept(parser.handler.root.first)
222
+ # # => "a"
223
+
224
+ module Psych
225
+ # The version is Psych you're using
226
+ VERSION = '2.0.14'
227
+
228
+ # The version of libyaml Psych is using
229
+ LIBYAML_VERSION = Psych.libyaml_version.join '.'
230
+
231
+ ###
232
+ # Load +yaml+ in to a Ruby data structure. If multiple documents are
233
+ # provided, the object contained in the first document will be returned.
234
+ # +filename+ will be used in the exception message if any exception is raised
235
+ # while parsing.
236
+ #
237
+ # Raises a Psych::SyntaxError when a YAML syntax error is detected.
238
+ #
239
+ # Example:
240
+ #
241
+ # Psych.load("--- a") # => 'a'
242
+ # Psych.load("---\n - a\n - b") # => ['a', 'b']
243
+ #
244
+ # begin
245
+ # Psych.load("--- `", "file.txt")
246
+ # rescue Psych::SyntaxError => ex
247
+ # ex.file # => 'file.txt'
248
+ # ex.message # => "(file.txt): found character that cannot start any token"
249
+ # end
250
+ def self.load yaml, filename = nil
251
+ result = parse(yaml, filename)
252
+ result ? result.to_ruby : result
253
+ end
254
+
255
+ ###
256
+ # Safely load the yaml string in +yaml+. By default, only the following
257
+ # classes are allowed to be deserialized:
258
+ #
259
+ # * TrueClass
260
+ # * FalseClass
261
+ # * NilClass
262
+ # * Numeric
263
+ # * String
264
+ # * Array
265
+ # * Hash
266
+ #
267
+ # Recursive data structures are not allowed by default. Arbitrary classes
268
+ # can be allowed by adding those classes to the +whitelist+. They are
269
+ # additive. For example, to allow Date deserialization:
270
+ #
271
+ # Psych.safe_load(yaml, [Date])
272
+ #
273
+ # Now the Date class can be loaded in addition to the classes listed above.
274
+ #
275
+ # Aliases can be explicitly allowed by changing the +aliases+ parameter.
276
+ # For example:
277
+ #
278
+ # x = []
279
+ # x << x
280
+ # yaml = Psych.dump x
281
+ # Psych.safe_load yaml # => raises an exception
282
+ # Psych.safe_load yaml, [], [], true # => loads the aliases
283
+ #
284
+ # A Psych::DisallowedClass exception will be raised if the yaml contains a
285
+ # class that isn't in the whitelist.
286
+ #
287
+ # A Psych::BadAlias exception will be raised if the yaml contains aliases
288
+ # but the +aliases+ parameter is set to false.
289
+ def self.safe_load yaml, whitelist_classes = [], whitelist_symbols = [], aliases = false, filename = nil
290
+ result = parse(yaml, filename)
291
+ return unless result
292
+
293
+ class_loader = ClassLoader::Restricted.new(whitelist_classes.map(&:to_s),
294
+ whitelist_symbols.map(&:to_s))
295
+ scanner = ScalarScanner.new class_loader
296
+ if aliases
297
+ visitor = Visitors::ToRuby.new scanner, class_loader
298
+ else
299
+ visitor = Visitors::NoAliasRuby.new scanner, class_loader
300
+ end
301
+ visitor.accept result
302
+ end
303
+
304
+ ###
305
+ # Parse a YAML string in +yaml+. Returns the Psych::Nodes::Document.
306
+ # +filename+ is used in the exception message if a Psych::SyntaxError is
307
+ # raised.
308
+ #
309
+ # Raises a Psych::SyntaxError when a YAML syntax error is detected.
310
+ #
311
+ # Example:
312
+ #
313
+ # Psych.parse("---\n - a\n - b") # => #<Psych::Nodes::Document:0x00>
314
+ #
315
+ # begin
316
+ # Psych.parse("--- `", "file.txt")
317
+ # rescue Psych::SyntaxError => ex
318
+ # ex.file # => 'file.txt'
319
+ # ex.message # => "(file.txt): found character that cannot start any token"
320
+ # end
321
+ #
322
+ # See Psych::Nodes for more information about YAML AST.
323
+ def self.parse yaml, filename = nil
324
+ parse_stream(yaml, filename) do |node|
325
+ return node
326
+ end
327
+ false
328
+ end
329
+
330
+ ###
331
+ # Parse a file at +filename+. Returns the Psych::Nodes::Document.
332
+ #
333
+ # Raises a Psych::SyntaxError when a YAML syntax error is detected.
334
+ def self.parse_file filename
335
+ File.open filename, 'r:bom|utf-8' do |f|
336
+ parse f, filename
337
+ end
338
+ end
339
+
340
+ ###
341
+ # Returns a default parser
342
+ def self.parser
343
+ Psych::Parser.new(TreeBuilder.new)
344
+ end
345
+
346
+ ###
347
+ # Parse a YAML string in +yaml+. Returns the Psych::Nodes::Stream.
348
+ # This method can handle multiple YAML documents contained in +yaml+.
349
+ # +filename+ is used in the exception message if a Psych::SyntaxError is
350
+ # raised.
351
+ #
352
+ # If a block is given, a Psych::Nodes::Document node will be yielded to the
353
+ # block as it's being parsed.
354
+ #
355
+ # Raises a Psych::SyntaxError when a YAML syntax error is detected.
356
+ #
357
+ # Example:
358
+ #
359
+ # Psych.parse_stream("---\n - a\n - b") # => #<Psych::Nodes::Stream:0x00>
360
+ #
361
+ # Psych.parse_stream("--- a\n--- b") do |node|
362
+ # node # => #<Psych::Nodes::Document:0x00>
363
+ # end
364
+ #
365
+ # begin
366
+ # Psych.parse_stream("--- `", "file.txt")
367
+ # rescue Psych::SyntaxError => ex
368
+ # ex.file # => 'file.txt'
369
+ # ex.message # => "(file.txt): found character that cannot start any token"
370
+ # end
371
+ #
372
+ # See Psych::Nodes for more information about YAML AST.
373
+ def self.parse_stream yaml, filename = nil, &block
374
+ if block_given?
375
+ parser = Psych::Parser.new(Handlers::DocumentStream.new(&block))
376
+ parser.parse yaml, filename
377
+ else
378
+ parser = self.parser
379
+ parser.parse yaml, filename
380
+ parser.handler.root
381
+ end
382
+ end
383
+
384
+ ###
385
+ # call-seq:
386
+ # Psych.dump(o) -> string of yaml
387
+ # Psych.dump(o, options) -> string of yaml
388
+ # Psych.dump(o, io) -> io object passed in
389
+ # Psych.dump(o, io, options) -> io object passed in
390
+ #
391
+ # Dump Ruby object +o+ to a YAML string. Optional +options+ may be passed in
392
+ # to control the output format. If an IO object is passed in, the YAML will
393
+ # be dumped to that IO object.
394
+ #
395
+ # Example:
396
+ #
397
+ # # Dump an array, get back a YAML string
398
+ # Psych.dump(['a', 'b']) # => "---\n- a\n- b\n"
399
+ #
400
+ # # Dump an array to an IO object
401
+ # Psych.dump(['a', 'b'], StringIO.new) # => #<StringIO:0x000001009d0890>
402
+ #
403
+ # # Dump an array with indentation set
404
+ # Psych.dump(['a', ['b']], :indentation => 3) # => "---\n- a\n- - b\n"
405
+ #
406
+ # # Dump an array to an IO with indentation set
407
+ # Psych.dump(['a', ['b']], StringIO.new, :indentation => 3)
408
+ def self.dump o, io = nil, options = {}
409
+ if Hash === io
410
+ options = io
411
+ io = nil
412
+ end
413
+
414
+ visitor = Psych::Visitors::YAMLTree.create options
415
+ visitor << o
416
+ visitor.tree.yaml io, options
417
+ end
418
+
419
+ ###
420
+ # Dump a list of objects as separate documents to a document stream.
421
+ #
422
+ # Example:
423
+ #
424
+ # Psych.dump_stream("foo\n ", {}) # => "--- ! \"foo\\n \"\n--- {}\n"
425
+ def self.dump_stream *objects
426
+ visitor = Psych::Visitors::YAMLTree.create({})
427
+ objects.each do |o|
428
+ visitor << o
429
+ end
430
+ visitor.tree.yaml
431
+ end
432
+
433
+ ###
434
+ # Dump Ruby +object+ to a JSON string.
435
+ def self.to_json object
436
+ visitor = Psych::Visitors::JSONTree.create
437
+ visitor << object
438
+ visitor.tree.yaml
439
+ end
440
+
441
+ ###
442
+ # Load multiple documents given in +yaml+. Returns the parsed documents
443
+ # as a list. If a block is given, each document will be converted to Ruby
444
+ # and passed to the block during parsing
445
+ #
446
+ # Example:
447
+ #
448
+ # Psych.load_stream("--- foo\n...\n--- bar\n...") # => ['foo', 'bar']
449
+ #
450
+ # list = []
451
+ # Psych.load_stream("--- foo\n...\n--- bar\n...") do |ruby|
452
+ # list << ruby
453
+ # end
454
+ # list # => ['foo', 'bar']
455
+ #
456
+ def self.load_stream yaml, filename = nil
457
+ if block_given?
458
+ parse_stream(yaml, filename) do |node|
459
+ yield node.to_ruby
460
+ end
461
+ else
462
+ parse_stream(yaml, filename).children.map { |child| child.to_ruby }
463
+ end
464
+ end
465
+
466
+ ###
467
+ # Load the document contained in +filename+. Returns the yaml contained in
468
+ # +filename+ as a Ruby object
469
+ def self.load_file filename
470
+ File.open(filename, 'r:bom|utf-8') { |f| self.load f, filename }
471
+ end
472
+
473
+ # :stopdoc:
474
+ @domain_types = {}
475
+ def self.add_domain_type domain, type_tag, &block
476
+ key = ['tag', domain, type_tag].join ':'
477
+ @domain_types[key] = [key, block]
478
+ @domain_types["tag:#{type_tag}"] = [key, block]
479
+ end
480
+
481
+ def self.add_builtin_type type_tag, &block
482
+ domain = 'yaml.org,2002'
483
+ key = ['tag', domain, type_tag].join ':'
484
+ @domain_types[key] = [key, block]
485
+ end
486
+
487
+ def self.remove_type type_tag
488
+ @domain_types.delete type_tag
489
+ end
490
+
491
+ @load_tags = {}
492
+ @dump_tags = {}
493
+ def self.add_tag tag, klass
494
+ @load_tags[tag] = klass.name
495
+ @dump_tags[klass] = tag
496
+ end
497
+
498
+ class << self
499
+ attr_accessor :load_tags
500
+ attr_accessor :dump_tags
501
+ attr_accessor :domain_types
502
+ end
503
+ # :startdoc:
504
+ end