diff options
author | Daniel Doubrovkine (dB.) @dblockdotorg <dblock@dblock.org> | 2019-03-22 15:04:22 -0400 |
---|---|---|
committer | Michael Herold <github@michaeljherold.com> | 2019-03-22 14:04:22 -0500 |
commit | 30ab2a3cb01fe9d0fc2def77868d7996ce4e873e (patch) | |
tree | fe8207b64cc7016844b94e9f01ae27740f540fbe /lib | |
parent | dc64b1024cca1916e49b12902c82c3e1560fef39 (diff) | |
download | hashie-30ab2a3cb01fe9d0fc2def77868d7996ce4e873e.tar.gz |
Allow options on Mash.load (#474)
`Mash.load` uses the Ruby standard library to load Yaml-serialized files
into a Mash. The original implementation used `YAML.load` for this
purpose. However, that method is inherently unsafe so we switched to
using `YAML.safe_load`.
Safely loading Yaml files has many different domain-specific
configuration flags that we did not, by default, expose. This change
introduces the ability to configure the safe loading of Yaml files so
that all types of Yaml can be loaded when necessary using the flags from
the standard library.
This implementation preserves the backwards-compatibility with the prior
implementation so that it should not require updates from users of the
current `Mash.load` behavior. For those who this change affects, we
included upgrading documentation to ease the transition.
Diffstat (limited to 'lib')
-rw-r--r-- | lib/hashie/extensions/parsers/yaml_erb_parser.rb | 12 | ||||
-rw-r--r-- | lib/hashie/mash.rb | 2 | ||||
-rw-r--r-- | lib/hashie/version.rb | 2 |
3 files changed, 10 insertions, 6 deletions
diff --git a/lib/hashie/extensions/parsers/yaml_erb_parser.rb b/lib/hashie/extensions/parsers/yaml_erb_parser.rb index d3b5c80..05edc40 100644 --- a/lib/hashie/extensions/parsers/yaml_erb_parser.rb +++ b/lib/hashie/extensions/parsers/yaml_erb_parser.rb @@ -6,19 +6,23 @@ module Hashie module Extensions module Parsers class YamlErbParser - def initialize(file_path) + def initialize(file_path, options = {}) @content = File.read(file_path) @file_path = file_path.is_a?(Pathname) ? file_path.to_s : file_path + @options = options end def perform template = ERB.new(@content) template.filename = @file_path - YAML.safe_load template.result, [], [], true + whitelist_classes = @options.fetch(:whitelist_classes) { [] } + whitelist_symbols = @options.fetch(:whitelist_symbols) { [] } + aliases = @options.fetch(:aliases) { true } + YAML.safe_load template.result, whitelist_classes, whitelist_symbols, aliases end - def self.perform(file_path) - new(file_path).perform + def self.perform(file_path, options = {}) + new(file_path, options).perform end end end diff --git a/lib/hashie/mash.rb b/lib/hashie/mash.rb index f41d745..650a269 100644 --- a/lib/hashie/mash.rb +++ b/lib/hashie/mash.rb @@ -107,7 +107,7 @@ module Hashie raise ArgumentError, "The following file doesn't exist: #{path}" unless File.file?(path) parser = options.fetch(:parser) { Hashie::Extensions::Parsers::YamlErbParser } - @_mashes[path] = new(parser.perform(path)).freeze + @_mashes[path] = new(parser.perform(path, options.except(:parser))).freeze end def to_module(mash_method_name = :settings) diff --git a/lib/hashie/version.rb b/lib/hashie/version.rb index 1206e92..22480fb 100644 --- a/lib/hashie/version.rb +++ b/lib/hashie/version.rb @@ -1,3 +1,3 @@ module Hashie - VERSION = '3.6.1'.freeze + VERSION = '3.7.0'.freeze end |