Hack to JRuby 1.8's YAML Parser Yecht
This file is always loaded AFTER either syck or psych are already loaded. It then looks at what constants are available and creates a consistent view on all rubys.
Taken from rubygems and modified. See github.com/rubygems/rubygems/blob/master/lib/rubygems/syck_hack.rb
# File lib/safe_yaml.rb, line 19 def self.load_file_with_options(file, options={}) safe_mode = safe_mode_from_options("load_file", options) if safe_mode == :safe safe_load_file(file, options_for_safe_load(options)) else unsafe_load_file(file) end end
# File lib/safe_yaml.rb, line 4 def self.load_with_options(yaml, *original_arguments) filename, options = filename_and_options_from_arguments(original_arguments) safe_mode = safe_mode_from_options("load", options) arguments = [yaml] if safe_mode == :safe arguments << filename if SafeYAML::YAML_ENGINE == "psych" arguments << options_for_safe_load(options) safe_load(*arguments) else arguments << filename if SafeYAML::MULTI_ARGUMENT_YAML_LOAD unsafe_load(*arguments) end end
# File lib/safe_yaml.rb, line 28 def self.safe_load(*args) SafeYAML.load(*args) end
# File lib/safe_yaml.rb, line 32 def self.safe_load_file(*args) SafeYAML.load_file(*args) end
# File lib/safe_yaml.rb, line 37 def self.unsafe_load_file(filename) # https://github.com/tenderlove/psych/blob/v1.3.2/lib/psych.rb#L296-298 File.open(filename, 'r:bom|utf-8') { |f| self.unsafe_load(f, filename) } end
# File lib/safe_yaml.rb, line 55 def filename_and_options_from_arguments(arguments) if arguments.count == 1 if arguments.first.is_a?(String) return arguments.first, {} else return nil, arguments.first || {} end else return arguments.first, arguments.last || {} end end
# File lib/safe_yaml.rb, line 88 def options_for_safe_load(base_options) options = base_options.dup options.delete(:safe) options end
# File lib/safe_yaml.rb, line 68 def safe_mode_from_options(method, options={}) if options[:safe].nil? safe_mode = SafeYAML::OPTIONS[:default_mode] || :safe if SafeYAML::OPTIONS[:default_mode].nil? && !SafeYAML::OPTIONS[:suppress_warnings] Kernel.warn " Called '#{method}' without the :safe option -- defaulting to #{safe_mode} mode. You can avoid this warning in the future by setting the SafeYAML::OPTIONS[:default_mode] option (to :safe or :unsafe). ".gsub(/^\s+/, '') SafeYAML::OPTIONS[:suppress_warnings] = true end return safe_mode end options[:safe] ? :safe : :unsafe end