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