key_tree 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1785b5cb1b1cd95bcce54e395760a8fba2c3f18a1fe90ec6142a84371dcecebb
4
- data.tar.gz: b2fce6710288a95c80db648556abe8e4b6a35289d743afd451e2b266bf2b3b2f
3
+ metadata.gz: 03da4a8ba0ff290b08339278a05b0c1eed7233f283c708701f180d7572029319
4
+ data.tar.gz: df4922248186d247f8da08cd0aefb4d90ef1c07f159be6554caf674c8960a186
5
5
  SHA512:
6
- metadata.gz: 5e6d082279a58dfb080872a193ffa2eaee310b97f64f34120edbe7814935feaebd9fdd73aa4e8071acedaadef4036a66e204b7194c1e1bd9429915b60ef2094e
7
- data.tar.gz: bc50e45870118d9ad5c21a0bf2f19dc89f53ec54aba5eb1af7917f87cdf5476eaf6509643c4bb1189d7a8dba02d9ce17a153229cb83ad4bc95065f6cde4d8899
6
+ metadata.gz: d24cb6c9b64f15af352d6dcad4042ff89dd02487a76dc80a0695b00bcba4c76a7347dd82a81c57dfbcdabe545fc0d0e75aca1d15e6ba277fdf4f1ee626f4f63b
7
+ data.tar.gz: a570369076d6594d2996d1e1e27a56a8d8c683b7fd3577afc1c4b9d48d162cd43dac9043ed86e61f133cd9441a9d2709f7ec5d14287a016d263b3b5d720a29a1
data/README.md CHANGED
@@ -1,3 +1,5 @@
1
+ [![Gem Version](https://badge.fury.io/rb/key_tree.svg)](https://badge.fury.io/rb/key_tree)
2
+
1
3
  # KeyTree
2
4
 
3
5
  Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/key_tree`. To experiment with that code, run `bin/console` for an interactive prompt.
@@ -1,10 +1,13 @@
1
1
  require 'key_tree/tree'
2
+ require 'key_tree/meta_data'
2
3
 
3
4
  module KeyTree
4
5
  #
5
6
  # A forest is a (possibly nested) collection of trees
6
7
  #
7
8
  class Forest < Array
9
+ include MetaData
10
+
8
11
  def self.[](*contents)
9
12
  contents.reduce(Forest.new) do |result, content|
10
13
  result << KeyTree[content]
@@ -0,0 +1,22 @@
1
+ require 'key_tree/tree'
2
+
3
+ module KeyTree
4
+ #
5
+ # Mixin for adding a meta_data key tree
6
+ #
7
+ module MetaData
8
+ #
9
+ # Get the meta_data for an object
10
+ #
11
+ def meta_data
12
+ @meta_data ||= KeyTree::Tree.new
13
+ end
14
+
15
+ # Execute a block with meta data, returning self
16
+ #
17
+ def with_meta_data
18
+ yield(meta_data)
19
+ self
20
+ end
21
+ end
22
+ end
data/lib/key_tree/tree.rb CHANGED
@@ -1,8 +1,9 @@
1
1
  require 'key_tree/path'
2
-
2
+ require 'key_tree/meta_data'
3
3
  module KeyTree
4
4
  # A tree of key-value lookup tables (hashes)
5
5
  class Tree < Hash
6
+ include MetaData
6
7
  #
7
8
  # KeyTree::Tree.new(+hash+)
8
9
  #
@@ -69,9 +70,16 @@ module KeyTree
69
70
  # The merging of trees needs some extra consideration; due to the
70
71
  # nature of key paths, prefix conflicts must be deleted
71
72
  #
72
- def merge(other)
73
+ def merge!(other)
74
+ other = Tree[other] unless other.is_a?(Tree)
73
75
  delete_if { |key, _| other.conflict?(key) }
74
76
  super
75
77
  end
78
+ alias << merge!
79
+
80
+ def merge(other)
81
+ dup.merge!(other)
82
+ end
83
+ alias + merge
76
84
  end
77
85
  end
@@ -1,3 +1,3 @@
1
1
  module KeyTree
2
- VERSION = '0.2.0'.freeze
2
+ VERSION = '0.3.0'.freeze
3
3
  end
data/lib/key_tree.rb CHANGED
@@ -22,4 +22,62 @@ module KeyTree
22
22
  raise ArgumentError, "can't load #{contents.class} into a KeyTree"
23
23
  end
24
24
  end
25
+
26
+ # Load a KeyTree from some external serialization
27
+ #
28
+ # load +type+: +serialization+
29
+ #
30
+ # +type+ is upcased to form a class name that should provide a
31
+ # +.load+ class method (like YAML or JSON does).
32
+ #
33
+ # Example:
34
+ # load(yaml: "---\na: 1\n")
35
+ # => {"a" => 1}
36
+ #
37
+ def self.load(typed_serialization = {})
38
+ unless typed_serialization.size == 1
39
+ raise ArgumentError, "pick one: #{typed_serialization.keys}"
40
+ end
41
+
42
+ type, serialization = typed_serialization.flatten
43
+
44
+ loader = get_loader(type)
45
+ self[loader.load(serialization)].with_meta_data do |meta_data|
46
+ meta_data << { load: { type: type.to_sym,
47
+ loader: loader } }
48
+ end
49
+ end
50
+
51
+ # Open an external file and load contents into a KeyTree
52
+ #
53
+ def self.open(file_name)
54
+ type = File.extname(file_name)[/[^.]+/]
55
+ keytree = File.open(file_name, mode: 'rb:utf-8') do |file|
56
+ load_from_file(file, type)
57
+ end
58
+
59
+ return keytree unless block_given?
60
+ yield(keytree)
61
+ end
62
+
63
+ private_class_method
64
+
65
+ # Get a class for loading external serialization for +type+
66
+ # +require+s the class provider if necessary.
67
+ #
68
+ def self.get_loader(type)
69
+ Class.const_get(type.upcase)
70
+ rescue NameError
71
+ require type.to_s
72
+ retry
73
+ end
74
+
75
+ def self.load_from_file(file, type)
76
+ load(type => file.read).with_meta_data do |meta_data|
77
+ file_path = file.path
78
+ meta_data << { file: { path: file_path,
79
+ name: File.basename(file_path),
80
+ dir: File.dirname(file_path) } }
81
+ end
82
+ end
25
83
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: key_tree
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Calle Englund
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-01-27 00:00:00.000000000 Z
11
+ date: 2018-02-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -87,6 +87,7 @@ files:
87
87
  - key_tree.gemspec
88
88
  - lib/key_tree.rb
89
89
  - lib/key_tree/forest.rb
90
+ - lib/key_tree/meta_data.rb
90
91
  - lib/key_tree/path.rb
91
92
  - lib/key_tree/tree.rb
92
93
  - lib/key_tree/version.rb