key_tree 0.2.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
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