diff options
Diffstat (limited to 'lib/yaml/store.rb')
| -rw-r--r-- | lib/yaml/store.rb | 89 |
1 files changed, 79 insertions, 10 deletions
diff --git a/lib/yaml/store.rb b/lib/yaml/store.rb index 2ffa9554b9..27c823b9f9 100644 --- a/lib/yaml/store.rb +++ b/lib/yaml/store.rb @@ -1,29 +1,98 @@ +# frozen_string_literal: false # # YAML::Store # require 'yaml' -require 'pstore' + +begin + require 'pstore' +rescue LoadError +end + +# YAML::Store provides the same functionality as PStore, except it uses YAML +# to dump objects instead of Marshal. +# +# == Example +# +# require 'yaml/store' +# +# Person = Struct.new :first_name, :last_name +# +# people = [Person.new("Bob", "Smith"), Person.new("Mary", "Johnson")] +# +# store = YAML::Store.new "test.store" +# +# store.transaction do +# store["people"] = people +# store["greeting"] = { "hello" => "world" } +# end +# +# After running the above code, the contents of "test.store" will be: +# +# --- +# people: +# - !ruby/struct:Person +# first_name: Bob +# last_name: Smith +# - !ruby/struct:Person +# first_name: Mary +# last_name: Johnson +# greeting: +# hello: world class YAML::Store < PStore + + # :call-seq: + # initialize( file_name, yaml_opts = {} ) + # initialize( file_name, thread_safe = false, yaml_opts = {} ) + # + # Creates a new YAML::Store object, which will store data in +file_name+. + # If the file does not already exist, it will be created. + # + # YAML::Store objects are always reentrant. But if _thread_safe_ is set to true, + # then it will become thread-safe at the cost of a minor performance hit. + # + # Options passed in through +yaml_opts+ will be used when converting the + # store to YAML via Hash#to_yaml(). def initialize( *o ) - @opt = YAML::DEFAULTS.dup - if String === o.first - super(o.shift) - end + @opt = {} if o.last.is_a? Hash @opt.update(o.pop) end + super(*o) end + # :stopdoc: + def dump(table) - @table.to_yaml(@opt) + table.to_yaml(@opt) end def load(content) - YAML::load(content) + table = if YAML.respond_to?(:safe_load) + if Psych::VERSION >= "3.1" + YAML.safe_load(content, permitted_classes: [Symbol]) + else + YAML.safe_load(content, [Symbol]) + end + else + YAML.load(content) + end + if table == false || table == nil + {} + else + table + end end - def load_file(file) - YAML::load(file) + def marshal_dump_supports_canonical_option? + false end -end + + def empty_marshal_data + {}.to_yaml(@opt) + end + def empty_marshal_checksum + CHECKSUM_ALGO.digest(empty_marshal_data) + end +end if defined?(::PStore) |
