mirror of
https://github.com/ruby/ruby.git
synced 2025-08-15 13:39:04 +02:00

[ruby-core:54735] [Backport #8356] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_9_3@40982 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
104 lines
2.6 KiB
Ruby
104 lines
2.6 KiB
Ruby
# YAML Ain't Markup Language
|
|
#
|
|
# This module provides a Ruby interface for data serialization in YAML format.
|
|
#
|
|
# You can choose from one of two YAML engines that ship with Ruby 1.9. By
|
|
# default Psych is used but the old unmaintained Syck may chosen.
|
|
#
|
|
# == Usage
|
|
#
|
|
# Working with YAML can be very simple, for example:
|
|
#
|
|
# require 'yaml' # STEP ONE, REQUIRE YAML!
|
|
# # Parse a YAML string
|
|
# YAML.load("--- foo") #=> "foo"
|
|
#
|
|
# # Emit some YAML
|
|
# YAML.dump("foo") # => "--- foo\n...\n"
|
|
# { :a => 'b'}.to_yaml # => "---\n:a: b\n"
|
|
#
|
|
# == Security
|
|
#
|
|
# Do not use YAML to load untrusted data. Doing so is unsafe and could allow
|
|
# malicious input to execute arbitrary code inside your application. Please see
|
|
# doc/security.rdoc for more information.
|
|
#
|
|
# == Syck
|
|
#
|
|
# Syck was the original for YAML implementation in Ruby's standard library
|
|
# developed by why the lucky stiff.
|
|
#
|
|
# If you prefer, you can still use Syck by changing the YAML::ENGINE like so:
|
|
#
|
|
# YAML::ENGINE.yamler = 'syck'
|
|
# # switch back to the default Psych
|
|
# YAML::ENGINE.yamler = 'psych'
|
|
#
|
|
# In older Ruby versions, ie. <= 1.9, Syck is still provided, however it was
|
|
# completely removed with the release of Ruby 2.0.0.
|
|
#
|
|
# == More info
|
|
#
|
|
# For more advanced details on the implementation see Psych, and also check out
|
|
# http://yaml.org for spec details and other helpful information.
|
|
module YAML
|
|
class EngineManager # :nodoc:
|
|
attr_reader :yamler
|
|
|
|
def initialize
|
|
@yamler = nil
|
|
end
|
|
|
|
def syck?
|
|
'syck' == @yamler
|
|
end
|
|
|
|
def yamler= engine
|
|
raise(ArgumentError, "bad engine") unless %w{syck psych}.include?(engine)
|
|
|
|
require engine unless (engine == 'syck' ? Syck : Psych).const_defined?(:VERSION)
|
|
|
|
Object.class_eval <<-eorb, __FILE__, __LINE__ + 1
|
|
remove_const 'YAML'
|
|
YAML = #{engine.capitalize}
|
|
remove_method :to_yaml
|
|
alias :to_yaml :#{engine}_to_yaml
|
|
eorb
|
|
|
|
@yamler = engine
|
|
engine
|
|
end
|
|
end
|
|
|
|
##
|
|
# Allows changing the current YAML engine. See YAML for details.
|
|
|
|
ENGINE = YAML::EngineManager.new # :nodoc:
|
|
end
|
|
|
|
if defined?(Psych)
|
|
engine = 'psych'
|
|
elsif defined?(Syck)
|
|
engine = 'syck'
|
|
else
|
|
begin
|
|
require 'psych'
|
|
engine = 'psych'
|
|
rescue LoadError
|
|
warn "#{caller[0]}:"
|
|
warn "It seems your ruby installation is missing psych (for YAML output)."
|
|
warn "To eliminate this warning, please install libyaml and reinstall your ruby."
|
|
require 'syck'
|
|
engine = 'syck'
|
|
end
|
|
end
|
|
|
|
module Syck # :nodoc:
|
|
ENGINE = YAML::ENGINE
|
|
end
|
|
|
|
module Psych # :nodoc:
|
|
ENGINE = YAML::ENGINE
|
|
end
|
|
|
|
YAML::ENGINE.yamler = engine
|