diff options
Diffstat (limited to 'lib/yaml.rb')
| -rw-r--r-- | lib/yaml.rb | 133 |
1 files changed, 64 insertions, 69 deletions
diff --git a/lib/yaml.rb b/lib/yaml.rb index ff9e1a6344..c6f0f89fd2 100644 --- a/lib/yaml.rb +++ b/lib/yaml.rb @@ -1,76 +1,71 @@ -## -# The YAML module allows you to use one of the two YAML engines that ship with -# ruby. By default Psych is used but the old and unmaintained Syck may be -# chosen. +# frozen_string_literal: false + +begin + require 'psych' +rescue LoadError + case RUBY_ENGINE + when 'jruby' + warn "The Psych YAML extension failed to load.\n" \ + "Check your env for conflicting versions of SnakeYAML\n" \ + "See https://github.com/jruby/jruby/wiki/FAQs#why-does-the-psych-yaml-extension-fail-to-load-in-my-environment", + uplevel: 1 + else + warn "It seems your ruby installation is missing psych (for YAML output).\n" \ + "To eliminate this warning, please install libyaml and reinstall your ruby.\n", + uplevel: 1 + end + raise +end + +YAML = Psych # :nodoc: + +# YAML Ain't Markup Language # -# See Psych or Syck for usage and documentation. +# This module provides a Ruby interface for data serialization in YAML format. # -# To set the YAML engine to syck: +# The YAML module is an alias of Psych, the YAML engine for Ruby. # -# YAML::ENGINE.yamler = 'syck' +# == Usage # -# To set the YAML engine back to psych: +# Working with YAML can be very simple, for example: # -# YAML::ENGINE.yamler = 'psych' - +# 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" +# +# As the implementation is provided by the Psych library, detailed documentation +# can be found in that library's docs (also part of standard library). +# +# == 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. +# +# == History +# +# Syck was the original YAML implementation in Ruby's standard library +# developed by why the lucky stiff. +# +# You can still use Syck, if you prefer, for parsing and emitting YAML, but you +# must install the 'syck' gem now in order to use it. +# +# 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. +# +# Psych is maintained by Aaron Patterson on github: https://github.com/ruby/psych +# +# Syck can also be found on github: https://github.com/ruby/syck 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 + # The version of YAML wrapper + LOADER_VERSION = "0.4.0" 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 - ENGINE = YAML::ENGINE -end - -module Psych - ENGINE = YAML::ENGINE -end - -YAML::ENGINE.yamler = engine |
