tree_structure_digest 0.0.1 → 0.1.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 +54 -1
- data/bin/tree_structure_digest +26 -7
- data/lib/tree_structure_digest.rb +1 -5
- data/lib/tree_structure_digest/digest.rb +36 -1
- data/lib/tree_structure_digest/version.rb +1 -1
- data/sandbox/Gemfile +2 -0
- data/spec/fixtures/sample.json +21 -0
- data/spec/fixtures/sample.yml +44 -0
- data/spec/integration_spec.rb +68 -0
- data/specs.sh +3 -0
- metadata +12 -4
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 6feccfd4e179cbabb4602bbc2717af3af5845353
|
|
4
|
+
data.tar.gz: 8e4f1ae6ee53ad6c4a4f4548436e34a18dce7bb8
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: bfe33d146ecbc7062c6b75125e60e122d6bf4d718a253a4bc801b761be8c87e2909923df9da1e3278be7e1ea396575a980bba5f741b6304218bcacab809b0197
|
|
7
|
+
data.tar.gz: 77533393a26a524be382a3aa619026e1c6bd2c968ed75a98d8fc5792600675d857bd83759c934b6c6bd8fdb6c0b83a9b144a1fdd0decd43bf309a4645276579b
|
data/README.md
CHANGED
|
@@ -19,7 +19,60 @@ Or install it yourself as:
|
|
|
19
19
|
|
|
20
20
|
## Usage
|
|
21
21
|
|
|
22
|
-
|
|
22
|
+
Given a sample YAML document from Wikipedia:
|
|
23
|
+
|
|
24
|
+
---
|
|
25
|
+
receipt: Oz-Ware Purchase Invoice
|
|
26
|
+
date: 2012-08-06
|
|
27
|
+
customer:
|
|
28
|
+
given: Dorothy
|
|
29
|
+
family: Gale
|
|
30
|
+
|
|
31
|
+
items:
|
|
32
|
+
- part_no: A4786
|
|
33
|
+
descrip: Water Bucket (Filled)
|
|
34
|
+
price: 1.47
|
|
35
|
+
quantity: 4
|
|
36
|
+
|
|
37
|
+
- part_no: E1628
|
|
38
|
+
descrip: High Heeled "Ruby" Slippers
|
|
39
|
+
size: 8
|
|
40
|
+
price: 100.27
|
|
41
|
+
quantity: 1
|
|
42
|
+
|
|
43
|
+
bill-to: &id001
|
|
44
|
+
street: |
|
|
45
|
+
123 Tornado Alley
|
|
46
|
+
Suite 16
|
|
47
|
+
city: East Centerville
|
|
48
|
+
state: KS
|
|
49
|
+
|
|
50
|
+
ship-to: *id001
|
|
51
|
+
|
|
52
|
+
specialDelivery: >
|
|
53
|
+
Follow the Yellow Brick
|
|
54
|
+
Road to the Emerald City.
|
|
55
|
+
Pay no attention to the
|
|
56
|
+
man behind the curtain.
|
|
57
|
+
|
|
58
|
+
`tree_structure_digest example.yml` will produce:
|
|
59
|
+
|
|
60
|
+
.receipt
|
|
61
|
+
.date
|
|
62
|
+
.customer.given
|
|
63
|
+
.customer.family
|
|
64
|
+
.items[].part_no
|
|
65
|
+
.items[].descrip
|
|
66
|
+
.items[].price
|
|
67
|
+
.items[].quantity
|
|
68
|
+
.items[].size
|
|
69
|
+
.bill-to.street
|
|
70
|
+
.bill-to.city
|
|
71
|
+
.bill-to.state
|
|
72
|
+
.ship-to.street
|
|
73
|
+
.ship-to.city
|
|
74
|
+
.ship-to.state
|
|
75
|
+
.specialDelivery
|
|
23
76
|
|
|
24
77
|
## Contributing
|
|
25
78
|
|
data/bin/tree_structure_digest
CHANGED
|
@@ -1,10 +1,29 @@
|
|
|
1
1
|
#!/usr/bin/env ruby
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
2
|
+
$LOAD_PATH << File.join(File.dirname(__FILE__), '../lib/')
|
|
3
|
+
require 'tree_structure_digest'
|
|
4
|
+
require 'tempfile'
|
|
5
|
+
|
|
6
|
+
require 'optparse'
|
|
7
|
+
ARGV << "--help" if ARGV.empty? && STDIN.tty?
|
|
8
|
+
tree = false
|
|
9
|
+
|
|
10
|
+
opt = OptionParser.new do |opt|
|
|
11
|
+
opt.banner = "Usage: tree_structure_digest [options] File1[, File2, ...]"
|
|
12
|
+
opt.on('-t', '--tree', 'replace repeated suffixes with indents') { tree = true }
|
|
7
13
|
end
|
|
8
14
|
|
|
9
|
-
|
|
10
|
-
|
|
15
|
+
opt.parse!
|
|
16
|
+
|
|
17
|
+
files = ARGV
|
|
18
|
+
file = Tempfile.new('tree_structure_digest_in')
|
|
19
|
+
if !STDIN.tty?
|
|
20
|
+
file.write STDIN.read
|
|
21
|
+
files += [file.path]
|
|
22
|
+
file.rewind
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
$h = TreeStructureDigest::Digest.new(tree: tree).injest_yml_files(files)
|
|
26
|
+
print $h.shorthand
|
|
27
|
+
|
|
28
|
+
file.close!
|
|
29
|
+
|
|
@@ -2,6 +2,10 @@ require 'yaml'
|
|
|
2
2
|
|
|
3
3
|
module TreeStructureDigest
|
|
4
4
|
class Digest
|
|
5
|
+
def initialize(opts={})
|
|
6
|
+
@tree = opts[:tree] || false
|
|
7
|
+
end
|
|
8
|
+
|
|
5
9
|
def injest_yml_files(file_paths)
|
|
6
10
|
file_paths.each do |p|
|
|
7
11
|
y = YAML.load_file(p)
|
|
@@ -33,7 +37,38 @@ module TreeStructureDigest
|
|
|
33
37
|
end
|
|
34
38
|
|
|
35
39
|
def shorthand
|
|
36
|
-
@
|
|
40
|
+
if @tree
|
|
41
|
+
root = {}
|
|
42
|
+
@abstract_paths.each do |apath|
|
|
43
|
+
append_to_tree(root, apath.parts)
|
|
44
|
+
end
|
|
45
|
+
sio = StringIO.new
|
|
46
|
+
pretty_print(sio, root)
|
|
47
|
+
sio.rewind
|
|
48
|
+
sio.read.chomp
|
|
49
|
+
else
|
|
50
|
+
@abstract_paths.map(&:serialize).uniq.sort.join("\n")
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def pretty_print(io, tree, level=0)
|
|
55
|
+
tree.keys.sort.each do |k|
|
|
56
|
+
v = tree[k]
|
|
57
|
+
io << ' '*level + k
|
|
58
|
+
if v.keys.empty?
|
|
59
|
+
io << "\n"
|
|
60
|
+
elsif v.keys.size == 1
|
|
61
|
+
pretty_print(io, v, level)
|
|
62
|
+
else
|
|
63
|
+
io << "\n"
|
|
64
|
+
pretty_print(io, v, level+1)
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
def append_to_tree(tree, parts)
|
|
70
|
+
return if parts.empty?
|
|
71
|
+
append_to_tree(tree[parts.first.serialize] || (tree[parts.first.serialize] = {}), parts.drop(1))
|
|
37
72
|
end
|
|
38
73
|
|
|
39
74
|
private
|
data/sandbox/Gemfile
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
{
|
|
2
|
+
"firstName": "John",
|
|
3
|
+
"lastName": "Smith",
|
|
4
|
+
"age": 25,
|
|
5
|
+
"address": {
|
|
6
|
+
"streetAddress": "21 2nd Street",
|
|
7
|
+
"city": "New York",
|
|
8
|
+
"state": "NY",
|
|
9
|
+
"postalCode": 10021
|
|
10
|
+
},
|
|
11
|
+
"phoneNumbers": [
|
|
12
|
+
{
|
|
13
|
+
"type": "home",
|
|
14
|
+
"number": "212 555-1234"
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
"type": "fax",
|
|
18
|
+
"number": "646 555-4567"
|
|
19
|
+
}
|
|
20
|
+
]
|
|
21
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
---
|
|
2
|
+
receipt: Oz-Ware Purchase Invoice
|
|
3
|
+
date: 2012-08-06
|
|
4
|
+
customer:
|
|
5
|
+
given: Dorothy
|
|
6
|
+
family: Gale
|
|
7
|
+
|
|
8
|
+
problem:
|
|
9
|
+
return: true
|
|
10
|
+
|
|
11
|
+
recursive:
|
|
12
|
+
problem:
|
|
13
|
+
que: 'what'
|
|
14
|
+
ans: 'who'
|
|
15
|
+
problem2:
|
|
16
|
+
que: 'a'
|
|
17
|
+
ans: 'b'
|
|
18
|
+
|
|
19
|
+
items:
|
|
20
|
+
- part_no: A4786
|
|
21
|
+
descrip: Water Bucket (Filled)
|
|
22
|
+
price: 1.47
|
|
23
|
+
quantity: 4
|
|
24
|
+
|
|
25
|
+
- part_no: E1628
|
|
26
|
+
descrip: High Heeled "Ruby" Slippers
|
|
27
|
+
size: 8
|
|
28
|
+
price: 100.27
|
|
29
|
+
quantity: 1
|
|
30
|
+
|
|
31
|
+
bill-to: &id001
|
|
32
|
+
street: |
|
|
33
|
+
123 Tornado Alley
|
|
34
|
+
Suite 16
|
|
35
|
+
city: East Centerville
|
|
36
|
+
state: KS
|
|
37
|
+
|
|
38
|
+
ship-to: *id001
|
|
39
|
+
|
|
40
|
+
specialDelivery: >
|
|
41
|
+
Follow the Yellow Brick
|
|
42
|
+
Road to the Emerald City.
|
|
43
|
+
Pay no attention to the
|
|
44
|
+
man behind the curtain.
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
lib_path = File.join(File.dirname(__FILE__), '../lib/')
|
|
2
|
+
$LOAD_PATH << lib_path
|
|
3
|
+
require 'tree_structure_digest'
|
|
4
|
+
|
|
5
|
+
describe "tree_structure_digest" do
|
|
6
|
+
|
|
7
|
+
def digest_fixture(file, opts={})
|
|
8
|
+
TreeStructureDigest::Digest.new(opts).injest_yml_files(
|
|
9
|
+
[File.expand_path("./fixtures/#{file}", File.dirname(__FILE__))]
|
|
10
|
+
).shorthand
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
it "works with yml" do
|
|
14
|
+
digest_fixture("sample.yml").should == <<HEREDOC.chomp
|
|
15
|
+
.bill-to.city
|
|
16
|
+
.bill-to.state
|
|
17
|
+
.bill-to.street
|
|
18
|
+
.customer.family
|
|
19
|
+
.customer.given
|
|
20
|
+
.date
|
|
21
|
+
.items[].descrip
|
|
22
|
+
.items[].part_no
|
|
23
|
+
.items[].price
|
|
24
|
+
.items[].quantity
|
|
25
|
+
.items[].size
|
|
26
|
+
.problem.return
|
|
27
|
+
.receipt
|
|
28
|
+
.recursive.problem.ans
|
|
29
|
+
.recursive.problem.que
|
|
30
|
+
.recursive.problem2.ans
|
|
31
|
+
.recursive.problem2.que
|
|
32
|
+
.ship-to.city
|
|
33
|
+
.ship-to.state
|
|
34
|
+
.ship-to.street
|
|
35
|
+
.specialDelivery
|
|
36
|
+
HEREDOC
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
it "works with JSON" do
|
|
40
|
+
digest_fixture("sample.json").should == <<HEREDOC.chomp
|
|
41
|
+
.address.city
|
|
42
|
+
.address.postalCode
|
|
43
|
+
.address.state
|
|
44
|
+
.address.streetAddress
|
|
45
|
+
.age
|
|
46
|
+
.firstName
|
|
47
|
+
.lastName
|
|
48
|
+
.phoneNumbers[].number
|
|
49
|
+
.phoneNumbers[].type
|
|
50
|
+
HEREDOC
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
it "works with JSON in tree format" do
|
|
54
|
+
digest_fixture("sample.json", tree: true).should == <<HEREDOC.chomp
|
|
55
|
+
.address
|
|
56
|
+
.city
|
|
57
|
+
.postalCode
|
|
58
|
+
.state
|
|
59
|
+
.streetAddress
|
|
60
|
+
.age
|
|
61
|
+
.firstName
|
|
62
|
+
.lastName
|
|
63
|
+
.phoneNumbers[]
|
|
64
|
+
.number
|
|
65
|
+
.type
|
|
66
|
+
HEREDOC
|
|
67
|
+
end
|
|
68
|
+
end
|
data/specs.sh
ADDED
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: tree_structure_digest
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.0
|
|
4
|
+
version: 0.1.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Serguei Filimonov
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2014-
|
|
11
|
+
date: 2014-02-12 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: bundler
|
|
@@ -61,6 +61,11 @@ files:
|
|
|
61
61
|
- lib/tree_structure_digest/path.rb
|
|
62
62
|
- lib/tree_structure_digest/value.rb
|
|
63
63
|
- lib/tree_structure_digest/version.rb
|
|
64
|
+
- sandbox/Gemfile
|
|
65
|
+
- spec/fixtures/sample.json
|
|
66
|
+
- spec/fixtures/sample.yml
|
|
67
|
+
- spec/integration_spec.rb
|
|
68
|
+
- specs.sh
|
|
64
69
|
- tree_structure_digest.gemspec
|
|
65
70
|
homepage: ''
|
|
66
71
|
licenses:
|
|
@@ -82,9 +87,12 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
82
87
|
version: '0'
|
|
83
88
|
requirements: []
|
|
84
89
|
rubyforge_project:
|
|
85
|
-
rubygems_version: 2.1
|
|
90
|
+
rubygems_version: 2.2.1
|
|
86
91
|
signing_key:
|
|
87
92
|
specification_version: 4
|
|
88
93
|
summary: run the binary on YAML files to check it out
|
|
89
|
-
test_files:
|
|
94
|
+
test_files:
|
|
95
|
+
- spec/fixtures/sample.json
|
|
96
|
+
- spec/fixtures/sample.yml
|
|
97
|
+
- spec/integration_spec.rb
|
|
90
98
|
has_rdoc:
|