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 +4 -4
- data/README.md +2 -0
- data/lib/key_tree/forest.rb +3 -0
- data/lib/key_tree/meta_data.rb +22 -0
- data/lib/key_tree/tree.rb +10 -2
- data/lib/key_tree/version.rb +1 -1
- data/lib/key_tree.rb +58 -0
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 03da4a8ba0ff290b08339278a05b0c1eed7233f283c708701f180d7572029319
|
4
|
+
data.tar.gz: df4922248186d247f8da08cd0aefb4d90ef1c07f159be6554caf674c8960a186
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d24cb6c9b64f15af352d6dcad4042ff89dd02487a76dc80a0695b00bcba4c76a7347dd82a81c57dfbcdabe545fc0d0e75aca1d15e6ba277fdf4f1ee626f4f63b
|
7
|
+
data.tar.gz: a570369076d6594d2996d1e1e27a56a8d8c683b7fd3577afc1c4b9d48d162cd43dac9043ed86e61f133cd9441a9d2709f7ec5d14287a016d263b3b5d720a29a1
|
data/README.md
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
[](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.
|
data/lib/key_tree/forest.rb
CHANGED
@@ -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
|
data/lib/key_tree/version.rb
CHANGED
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.
|
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-
|
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
|