diff options
Diffstat (limited to 'lib/yaml.rb')
| -rw-r--r-- | lib/yaml.rb | 105 |
1 files changed, 36 insertions, 69 deletions
diff --git a/lib/yaml.rb b/lib/yaml.rb index 3461f68606..c6f0f89fd2 100644 --- a/lib/yaml.rb +++ b/lib/yaml.rb @@ -1,15 +1,35 @@ +# 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 # # 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. +# The YAML module is an alias of Psych, the YAML engine for Ruby. # # == Usage # # Working with YAML can be very simple, for example: # -# require 'yaml' # STEP ONE, REQUIRE YAML! +# require 'yaml' # # Parse a YAML string # YAML.load("--- foo") #=> "foo" # @@ -17,22 +37,22 @@ # 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. # -# == Syck +# == History # -# Syck was the original for YAML implementation in Ruby's standard library +# Syck was the original 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' +# 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. @@ -41,64 +61,11 @@ # # 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 # :nodoc: + # 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 # :nodoc: - ENGINE = YAML::ENGINE -end - -module Psych # :nodoc: - ENGINE = YAML::ENGINE -end - -YAML::ENGINE.yamler = engine |
