module Trunk class YAMLStorage attr_reader :private_key, :absolute_path def initialize(absolute_path, private_key) @absolute_path = absolute_path @private_key = private_key end def fetch(*args) transaction do |storage| storage.fetch(*args) end end def store(*args) transaction do |storage| storage.store(*args) end end private def transaction hash = YAML.load(IO.read(absolute_path)) || {} storage = Storage.new(hash, serializer) yield storage ensure IO.write(absolute_path, YAML.dump(hash)) end def serializer serializer = Trunk::Serializers::Composite.new serializer.add(Trunk::Serializers::Crypto.new(private_key)) serializer.add(Trunk::Serializers::Base64.new) serializer end end end