rubysl-yaml 1.1.0 → 2.0.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 2a1f248f72d4a8aaeea712a9f10d86e1208624c2
4
- data.tar.gz: 8fd627baa34a6b581aaef049d7dd86ed61ad8ba0
3
+ metadata.gz: ba60119d8667b73f93857701d9078106256b0033
4
+ data.tar.gz: 1b1ec8197451f05a97b29f898cf8b598e367a983
5
5
  SHA512:
6
- metadata.gz: d5752ddc6e772a06eae48f6754b1e6f666b0714d600f05841578a48af755bf2f738e5f31ed95d88f8bbe637231d9411d5893242fa93e83f14e074974b4e43b3c
7
- data.tar.gz: 7b97d2659ffdc6575978250a291b49f029a0f9108e4299d1a16549b4a20744ce6ce37e6f6c3f9a68b8a3d3a0a129f4d268068e977952a2ddb13d3806806e1cad
6
+ metadata.gz: 94fd6236fdac8df8186574576f9e1a13e696f958832b5e1b78a8cb5e3b145f2b4755d308bc7e31b5d52086317b4b79ef6884a11a3a80714d72841e57c604b142
7
+ data.tar.gz: a5d4029488b7574e235a49c3d38d1ff86fa7962fd151fbb46adab583031386304ebe07abaa10323998984fcab903da9834b181003845b250aa4fa29bc193b905
data/.travis.yml CHANGED
@@ -1,8 +1,7 @@
1
1
  language: ruby
2
- before_install:
3
- - gem update --system
4
- - gem --version
5
- - gem install rubysl-bundler
6
- script: bundle exec mspec spec
2
+ env:
3
+ - RUBYLIB=lib
4
+ script: bundle exec mspec
7
5
  rvm:
8
- - rbx-nightly-18mode
6
+ - 1.9.3
7
+ - rbx-nightly-19mode
@@ -1,5 +1,5 @@
1
1
  module RubySL
2
2
  module YAML
3
- VERSION = "1.1.0"
3
+ VERSION = "2.0.0"
4
4
  end
5
5
  end
@@ -1,440 +1,76 @@
1
- # -*- mode: ruby; ruby-indent-level: 4; tab-width: 4 -*- vim: sw=4 ts=4
2
- # $Id: yaml.rb 17246 2008-06-15 13:12:40Z shyouhei $
1
+ ##
2
+ # The YAML module allows you to use one of the two YAML engines that ship with
3
+ # ruby. By default Psych is used but the old and unmaintained Syck may be
4
+ # chosen.
3
5
  #
4
- # = yaml.rb: top-level module with methods for loading and parsing YAML documents
6
+ # See Psych or Syck for usage and documentation.
5
7
  #
6
- # Author:: why the lucky stiff
7
- #
8
-
9
- require 'stringio'
10
- require 'yaml/error'
11
- require 'yaml/syck'
12
- require 'yaml/tag'
13
- require 'yaml/stream'
14
- require 'yaml/constants'
15
-
16
- # == YAML
17
- #
18
- # YAML(tm) (rhymes with 'camel') is a
19
- # straightforward machine parsable data serialization format designed for
20
- # human readability and interaction with scripting languages such as Perl
21
- # and Python. YAML is optimized for data serialization, formatted
22
- # dumping, configuration files, log files, Internet messaging and
23
- # filtering. This specification describes the YAML information model and
24
- # serialization format. Together with the Unicode standard for characters, it
25
- # provides all the information necessary to understand YAML Version 1.0
26
- # and construct computer programs to process it.
27
- #
28
- # See http://yaml.org/ for more information. For a quick tutorial, please
29
- # visit YAML In Five Minutes (http://yaml.kwiki.org/?YamlInFiveMinutes).
30
- #
31
- # == About This Library
32
- #
33
- # The YAML 1.0 specification outlines four stages of YAML loading and dumping.
34
- # This library honors all four of those stages, although data is really only
35
- # available to you in three stages.
36
- #
37
- # The four stages are: native, representation, serialization, and presentation.
38
- #
39
- # The native stage refers to data which has been loaded completely into Ruby's
40
- # own types. (See +YAML::load+.)
41
- #
42
- # The representation stage means data which has been composed into
43
- # +YAML::BaseNode+ objects. In this stage, the document is available as a
44
- # tree of node objects. You can perform YPath queries and transformations
45
- # at this level. (See +YAML::parse+.)
46
- #
47
- # The serialization stage happens inside the parser. The YAML parser used in
48
- # Ruby is called Syck. Serialized nodes are available in the extension as
49
- # SyckNode structs.
50
- #
51
- # The presentation stage is the YAML document itself. This is accessible
52
- # to you as a string. (See +YAML::dump+.)
53
- #
54
- # For more information about the various information models, see Chapter
55
- # 3 of the YAML 1.0 Specification (http://yaml.org/spec/#id2491269).
56
- #
57
- # The YAML module provides quick access to the most common loading (YAML::load)
58
- # and dumping (YAML::dump) tasks. This module also provides an API for registering
59
- # global types (YAML::add_domain_type).
60
- #
61
- # == Example
62
- #
63
- # A simple round-trip (load and dump) of an object.
64
- #
65
- # require "yaml"
66
- #
67
- # test_obj = ["dogs", "cats", "badgers"]
68
- #
69
- # yaml_obj = YAML::dump( test_obj )
70
- # # -> ---
71
- # - dogs
72
- # - cats
73
- # - badgers
74
- # ruby_obj = YAML::load( yaml_obj )
75
- # # => ["dogs", "cats", "badgers"]
76
- # ruby_obj == test_obj
77
- # # => true
8
+ # To set the YAML engine to syck:
78
9
  #
79
- # To register your custom types with the global resolver, use +add_domain_type+.
10
+ # YAML::ENGINE.yamler = 'syck'
80
11
  #
81
- # YAML::add_domain_type( "your-site.com,2004", "widget" ) do |type, val|
82
- # Widget.new( val )
83
- # end
12
+ # To set the YAML engine back to psych:
84
13
  #
85
- module YAML
86
-
87
- Resolver = YAML::Syck::Resolver
88
- DefaultResolver = YAML::Syck::DefaultResolver
89
- DefaultResolver.use_types_at( @@tagged_classes )
90
- GenericResolver = YAML::Syck::GenericResolver
91
- Parser = YAML::Syck::Parser
92
- Emitter = YAML::Syck::Emitter
93
-
94
- # Returns a new default parser
95
- def YAML.parser; Parser.new.set_resolver( YAML.resolver ); end
96
- # Returns a new generic parser
97
- def YAML.generic_parser; Parser.new.set_resolver( GenericResolver ); end
98
- # Returns the default resolver
99
- def YAML.resolver; DefaultResolver; end
100
- # Returns a new default emitter
101
- def YAML.emitter; Emitter.new.set_resolver( YAML.resolver ); end
102
-
103
- #
104
- # Converts _obj_ to YAML and writes the YAML result to _io_.
105
- #
106
- # File.open( 'animals.yaml', 'w' ) do |out|
107
- # YAML.dump( ['badger', 'elephant', 'tiger'], out )
108
- # end
109
- #
110
- # If no _io_ is provided, a string containing the dumped YAML
111
- # is returned.
112
- #
113
- # YAML.dump( :locked )
114
- # #=> "--- :locked"
115
- #
116
- def YAML.dump( obj, io = nil )
117
- obj.to_yaml( io || io2 = StringIO.new )
118
- io || ( io2.rewind; io2.read )
119
- end
120
-
121
- #
122
- # Load a document from the current _io_ stream.
123
- #
124
- # File.open( 'animals.yaml' ) { |yf| YAML::load( yf ) }
125
- # #=> ['badger', 'elephant', 'tiger']
126
- #
127
- # Can also load from a string.
128
- #
129
- # YAML.load( "--- :locked" )
130
- # #=> :locked
131
- #
132
- def YAML.load( io )
133
- yp = parser.load( io )
134
- end
135
-
136
- #
137
- # Load a document from the file located at _filepath_.
138
- #
139
- # YAML.load_file( 'animals.yaml' )
140
- # #=> ['badger', 'elephant', 'tiger']
141
- #
142
- def YAML.load_file( filepath )
143
- File.open( filepath ) do |f|
144
- load( f )
145
- end
146
- end
147
-
148
- #
149
- # Parse the first document from the current _io_ stream
150
- #
151
- # File.open( 'animals.yaml' ) { |yf| YAML::load( yf ) }
152
- # #=> #<YAML::Syck::Node:0x82ccce0
153
- # @kind=:seq,
154
- # @value=
155
- # [#<YAML::Syck::Node:0x82ccd94
156
- # @kind=:scalar,
157
- # @type_id="str",
158
- # @value="badger">,
159
- # #<YAML::Syck::Node:0x82ccd58
160
- # @kind=:scalar,
161
- # @type_id="str",
162
- # @value="elephant">,
163
- # #<YAML::Syck::Node:0x82ccd1c
164
- # @kind=:scalar,
165
- # @type_id="str",
166
- # @value="tiger">]>
167
- #
168
- # Can also load from a string.
169
- #
170
- # YAML.parse( "--- :locked" )
171
- # #=> #<YAML::Syck::Node:0x82edddc
172
- # @type_id="tag:ruby.yaml.org,2002:sym",
173
- # @value=":locked", @kind=:scalar>
174
- #
175
- def YAML.parse( io )
176
- yp = generic_parser.load( io )
177
- end
178
-
179
- #
180
- # Parse a document from the file located at _filepath_.
181
- #
182
- # YAML.parse_file( 'animals.yaml' )
183
- # #=> #<YAML::Syck::Node:0x82ccce0
184
- # @kind=:seq,
185
- # @value=
186
- # [#<YAML::Syck::Node:0x82ccd94
187
- # @kind=:scalar,
188
- # @type_id="str",
189
- # @value="badger">,
190
- # #<YAML::Syck::Node:0x82ccd58
191
- # @kind=:scalar,
192
- # @type_id="str",
193
- # @value="elephant">,
194
- # #<YAML::Syck::Node:0x82ccd1c
195
- # @kind=:scalar,
196
- # @type_id="str",
197
- # @value="tiger">]>
198
- #
199
- def YAML.parse_file( filepath )
200
- File.open( filepath ) do |f|
201
- parse( f )
202
- end
203
- end
14
+ # YAML::ENGINE.yamler = 'psych'
204
15
 
205
- #
206
- # Calls _block_ with each consecutive document in the YAML
207
- # stream contained in _io_.
208
- #
209
- # File.open( 'many-docs.yaml' ) do |yf|
210
- # YAML.each_document( yf ) do |ydoc|
211
- # ## ydoc contains the single object
212
- # ## from the YAML document
213
- # end
214
- # end
215
- #
216
- def YAML.each_document( io, &block )
217
- yp = parser.load_documents( io, &block )
218
- end
219
-
220
- #
221
- # Calls _block_ with each consecutive document in the YAML
222
- # stream contained in _io_.
223
- #
224
- # File.open( 'many-docs.yaml' ) do |yf|
225
- # YAML.load_documents( yf ) do |ydoc|
226
- # ## ydoc contains the single object
227
- # ## from the YAML document
228
- # end
229
- # end
230
- #
231
- def YAML.load_documents( io, &doc_proc )
232
- YAML.each_document( io, &doc_proc )
233
- end
16
+ module YAML
17
+ class EngineManager # :nodoc:
18
+ attr_reader :yamler
234
19
 
235
- #
236
- # Calls _block_ with a tree of +YAML::BaseNodes+, one tree for
237
- # each consecutive document in the YAML stream contained in _io_.
238
- #
239
- # File.open( 'many-docs.yaml' ) do |yf|
240
- # YAML.each_node( yf ) do |ydoc|
241
- # ## ydoc contains a tree of nodes
242
- # ## from the YAML document
243
- # end
244
- # end
245
- #
246
- def YAML.each_node( io, &doc_proc )
247
- yp = generic_parser.load_documents( io, &doc_proc )
20
+ def initialize
21
+ @yamler = nil
248
22
  end
249
23
 
250
- #
251
- # Calls _block_ with a tree of +YAML::BaseNodes+, one tree for
252
- # each consecutive document in the YAML stream contained in _io_.
253
- #
254
- # File.open( 'many-docs.yaml' ) do |yf|
255
- # YAML.parse_documents( yf ) do |ydoc|
256
- # ## ydoc contains a tree of nodes
257
- # ## from the YAML document
258
- # end
259
- # end
260
- #
261
- def YAML.parse_documents( io, &doc_proc )
262
- YAML.each_node( io, &doc_proc )
24
+ def syck?
25
+ 'syck' == @yamler
263
26
  end
264
27
 
265
- #
266
- # Loads all documents from the current _io_ stream,
267
- # returning a +YAML::Stream+ object containing all
268
- # loaded documents.
269
- #
270
- def YAML.load_stream( io )
271
- d = nil
272
- parser.load_documents( io ) do |doc|
273
- d = YAML::Stream.new if not d
274
- d.add( doc )
275
- end
276
- return d
277
- end
278
-
279
- #
280
- # Returns a YAML stream containing each of the items in +objs+,
281
- # each having their own document.
282
- #
283
- # YAML.dump_stream( 0, [], {} )
284
- # #=> --- 0
285
- # --- []
286
- # --- {}
287
- #
288
- def YAML.dump_stream( *objs )
289
- d = YAML::Stream.new
290
- objs.each do |doc|
291
- d.add( doc )
292
- end
293
- d.emit
294
- end
28
+ def yamler= engine
29
+ raise(ArgumentError, "bad engine") unless %w{syck psych}.include?(engine)
295
30
 
296
- #
297
- # Add a global handler for a YAML domain type.
298
- #
299
- def YAML.add_domain_type( domain, type_tag, &transfer_proc )
300
- resolver.add_type( "tag:#{ domain }:#{ type_tag }", transfer_proc )
301
- end
31
+ require engine unless (engine == 'syck' ? Syck : Psych).const_defined?(:VERSION)
302
32
 
303
- #
304
- # Add a transfer method for a builtin type
305
- #
306
- def YAML.add_builtin_type( type_tag, &transfer_proc )
307
- resolver.add_type( "tag:yaml.org,2002:#{ type_tag }", transfer_proc )
308
- end
33
+ Object.class_eval <<-eorb, __FILE__, __LINE__ + 1
34
+ remove_const 'YAML'
35
+ YAML = #{engine.capitalize}
36
+ remove_method :to_yaml
37
+ alias :to_yaml :#{engine}_to_yaml
38
+ eorb
309
39
 
310
- #
311
- # Add a transfer method for a builtin type
312
- #
313
- def YAML.add_ruby_type( type_tag, &transfer_proc )
314
- resolver.add_type( "tag:ruby.yaml.org,2002:#{ type_tag }", transfer_proc )
315
- end
316
-
317
- #
318
- # Add a private document type
319
- #
320
- def YAML.add_private_type( type_re, &transfer_proc )
321
- resolver.add_type( "x-private:" + type_re, transfer_proc )
322
- end
323
-
324
- #
325
- # Detect typing of a string
326
- #
327
- def YAML.detect_implicit( val )
328
- resolver.detect_implicit( val )
40
+ @yamler = engine
41
+ engine
329
42
  end
43
+ end
330
44
 
331
- #
332
- # Convert a type_id to a taguri
333
- #
334
- def YAML.tagurize( val )
335
- resolver.tagurize( val )
336
- end
337
-
338
- #
339
- # Apply a transfer method to a Ruby object
340
- #
341
- def YAML.transfer( type_id, obj )
342
- resolver.transfer( YAML.tagurize( type_id ), obj )
343
- end
45
+ ##
46
+ # Allows changing the current YAML engine. See YAML for details.
344
47
 
345
- #
346
- # Apply any implicit a node may qualify for
347
- #
348
- def YAML.try_implicit( obj )
349
- YAML.transfer( YAML.detect_implicit( obj ), obj )
350
- end
351
-
352
- #
353
- # Method to extract colon-separated type and class, returning
354
- # the type and the constant of the class
355
- #
356
- def YAML.read_type_class( type, obj_class )
357
- scheme, domain, type, tclass = type.split( ':', 4 )
358
- tclass.split( "::" ).each { |c| obj_class = obj_class.const_get( c ) } if tclass
359
- return [ type, obj_class ]
360
- end
361
-
362
- #
363
- # Allocate blank object
364
- #
365
- def YAML.object_maker( obj_class, val )
366
- if Hash === val
367
- o = obj_class.allocate
368
- val.each_pair { |k,v|
369
- o.instance_variable_set("@#{k}", v)
370
- }
371
- o
372
- else
373
- raise YAML::Error, "Invalid object explicitly tagged !ruby/Object: " + val.inspect
374
- end
375
- end
376
-
377
- #
378
- # Allocate an Emitter if needed
379
- #
380
- def YAML.quick_emit( oid, opts = {}, &e )
381
- out =
382
- if opts.is_a? YAML::Emitter
383
- opts
384
- else
385
- emitter.reset( opts )
386
- end
387
- oid =
388
- case oid when Fixnum, NilClass; oid
389
- else oid = "#{oid.object_id}-#{oid.hash}"
390
- end
391
- out.emit( oid, &e )
392
- end
393
-
48
+ ENGINE = YAML::EngineManager.new
394
49
  end
395
50
 
396
- require 'yaml/rubytypes'
397
- require 'yaml/types'
398
-
399
- module Kernel
400
- #
401
- # ryan:: You know how Kernel.p is a really convenient way to dump ruby
402
- # structures? The only downside is that it's not as legible as
403
- # YAML.
404
- #
405
- # _why:: (listening)
406
- #
407
- # ryan:: I know you don't want to urinate all over your users' namespaces.
408
- # But, on the other hand, convenience of dumping for debugging is,
409
- # IMO, a big YAML use case.
410
- #
411
- # _why:: Go nuts! Have a pony parade!
412
- #
413
- # ryan:: Either way, I certainly will have a pony parade.
414
- #
51
+ if defined?(Psych)
52
+ engine = 'psych'
53
+ elsif defined?(Syck)
54
+ engine = 'syck'
55
+ else
56
+ begin
57
+ require 'psych'
58
+ engine = 'psych'
59
+ rescue LoadError
60
+ warn "#{caller[0]}:"
61
+ warn "It seems your ruby installation is missing psych (for YAML output)."
62
+ warn "To eliminate this warning, please install libyaml and reinstall your ruby."
63
+ require 'syck'
64
+ engine = 'syck'
65
+ end
66
+ end
415
67
 
416
- # Prints any supplied _objects_ out in YAML. Intended as
417
- # a variation on +Kernel::p+.
418
- #
419
- # S = Struct.new(:name, :state)
420
- # s = S['dave', 'TX']
421
- # y s
422
- #
423
- # _produces:_
424
- #
425
- # --- !ruby/struct:S
426
- # name: dave
427
- # state: TX
428
- #
429
- def y( object, *objects )
430
- objects.unshift object
431
- puts( if objects.length == 1
432
- YAML::dump( *objects )
433
- else
434
- YAML::dump_stream( *objects )
435
- end )
436
- end
437
- private :y
68
+ module Syck
69
+ ENGINE = YAML::ENGINE
438
70
  end
439
71
 
72
+ module Psych
73
+ ENGINE = YAML::ENGINE
74
+ end
440
75
 
76
+ YAML::ENGINE.yamler = engine