lib/key_tree.rb in key_tree-0.4.3 vs lib/key_tree.rb in key_tree-0.5.0

- old
+ new

@@ -25,39 +25,45 @@ end # Load a KeyTree from some external serialization # # load +type+: +serialization+ + # load +key_prefix+, +type+: +serialization+ # # +type+ is upcased to form a class name that should provide a # +.load+ class method (like YAML or JSON does). # - # Example: - # load(yaml: "---\na: 1\n") + # If a +key_prefix+ is given, it will be prepended to the loaded data. + # + # Examples: + # load(:yaml, "---\na: 1\n") # => {"a" => 1} # - def self.load(typed_serialization = {}) - unless typed_serialization.size == 1 - raise ArgumentError, "pick one: #{typed_serialization.keys}" - end - - type, serialization = typed_serialization.flatten + # load(:yaml, "---\nb: 2\n", prefix: 'a') + # => {"a.b" => 2} + # + def self.load(type, serialization, prefix: nil) + type = type.to_sym unless type.nil? loader = Loader[type] - self[loader.load(serialization)].with_meta_data do |meta_data| - meta_data << { load: { type: type, - loader: loader } } + contents = loader.load(serialization) + contents = { prefix => contents } unless prefix.nil? + + self[contents].with_meta_data do |meta_data| + meta_data << { load: { type: type, loader: loader } } + meta_data << { load: { prefix: prefix } } unless prefix.nil? end end # Open an external file and load contents into a KeyTree - # + # When the file basename begins with 'prefix@', the prefix + # is prepended to all keys in the filee. def self.open(file_name) type = File.extname(file_name)[/[^.]+/] - type = type.to_sym unless type.nil? + prefix = File.basename(file_name)[/(.+)@/, 1] keytree = File.open(file_name, mode: 'rb:utf-8') do |file| - load_from_file(file, type) + load_from_file(file, type, prefix) end return keytree unless block_given? yield(keytree) end @@ -77,11 +83,11 @@ end end private_class_method - def self.load_from_file(file, type) - load(type => file.read).with_meta_data do |meta_data| + def self.load_from_file(file, type, prefix) + load(type, file.read, prefix: prefix).with_meta_data do |meta_data| file_path = file.path meta_data << { file: { path: file_path, name: File.basename(file_path), dir: File.dirname(file_path) } } end