flat2tree 1.0.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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 40fe4e65857c12b476f96109574f6ea44df7307b
4
+ data.tar.gz: f100449c0118537c06170cf72b2882b44c3697cc
5
+ SHA512:
6
+ metadata.gz: e8609d72a7fcc7583b28336edf353f6abf54bd07baf012752b6e9e833a27473327f12c473d16ac524c1867a324785c129622bbd1582f3f96a146bfd4977f8ce1
7
+ data.tar.gz: ed093429c879bc925bc14245703b91a382f65ccd89f1f59d50ed727a7abfe4621a10de2d1e4eed8806abf05d6cd7af33811b4b751cc41f827599d6bd0d218f7e
@@ -0,0 +1 @@
1
+ /*.gem
data/LICENCE ADDED
@@ -0,0 +1,14 @@
1
+ Copyright (c) 2013 Michal Papis
2
+
3
+ Licensed under the Apache License, Version 2.0 (the "License");
4
+ you may not use this file except in compliance with the License.
5
+ You may obtain a copy of the License at
6
+
7
+ http://www.apache.org/licenses/LICENSE-2.0
8
+
9
+ Unless required by applicable law or agreed to in writing, software
10
+ distributed under the License is distributed on an "AS IS" BASIS,
11
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ See the License for the specific language governing permissions and
13
+ limitations under the License.
14
+
@@ -0,0 +1,60 @@
1
+ # Flat2Tree
2
+
3
+ Transform flat list into (reverse) dependency tree.
4
+
5
+ ## Installation
6
+
7
+ gem install Flat2Tree
8
+
9
+ ## Example data
10
+
11
+ Initialize + enter data for examples:
12
+
13
+ require 'flat2tree'
14
+ list = {
15
+ "Tom"=>["Kate", "John"],
16
+ "Kate"=>["John"],
17
+ "John"=>[]
18
+ }.map{|name, list| Flat2Tree::Entry.new(name, list)}
19
+
20
+ ## Example print dependency tree from starting point
21
+
22
+ `.to_s` produces tree like output compatible with YAML.
23
+
24
+ puts Flat2Tree.dependencies_from(list, 'Kate')
25
+
26
+ Kate:
27
+ - John
28
+
29
+ ## Example print dependency tree
30
+
31
+ When no starting node name is given an nameless root container is created, use `.nodes` to get array.
32
+
33
+ puts Flat2Tree.dependencies_from(list).nodes
34
+
35
+ Tom:
36
+ - Kate:
37
+ - John
38
+ - John
39
+ Kate:
40
+ - John
41
+ John
42
+
43
+ ## Example print simplified reverse dependency tree
44
+
45
+ It is also to reverse the dependency tree so last leafs end up as roots
46
+
47
+ puts Flat2Tree.reverse_dependencies_from(list).simplify.nodes
48
+
49
+ John:
50
+ - Tom
51
+ - Kate:
52
+ - Tom
53
+
54
+ ## TODO:
55
+
56
+ - handle missing node
57
+
58
+ ## Authors
59
+
60
+ - Michal Papis <mpapis@gmail.com>
@@ -0,0 +1,18 @@
1
+ #!/usr/bin/env ruby
2
+ # -*- encoding: utf-8 -*-
3
+
4
+ Kernel.load File.expand_path("../lib/flat2tree/version.rb", __FILE__)
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = "flat2tree"
8
+ s.version = Flat2Tree::VERSION
9
+ s.authors = ["Michal Papis"]
10
+ s.email = ["mpapis@gmail.com"]
11
+ s.homepage = "https://github.com/mpapis/flat2tree"
12
+ s.summary = %q{Transform flat list into (reverse) dependency tree}
13
+
14
+ s.files = `git ls-files`.split("\n")
15
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
16
+
17
+ #s.add_development_dependency "smf-gem"
18
+ end
@@ -0,0 +1,13 @@
1
+ module Flat2Tree
2
+ # build dependency tree from the list
3
+ def self.dependencies_from(flat_list, name = nil)
4
+ Flat2Tree::Entry.new(name).dependencies(flat_list)
5
+ end
6
+
7
+ # build reverse dependency tree from the list
8
+ def self.reverse_dependencies_from(flat_list, name = nil)
9
+ Flat2Tree::Entry.new(name).reverse_dependencies(flat_list)
10
+ end
11
+ end
12
+
13
+ require_relative "flat2tree/entry"
@@ -0,0 +1,60 @@
1
+ class Flat2Tree::Entry
2
+ attr_accessor :name, :nodes, :meta
3
+
4
+ def initialize(name = nil, nodes = nil, meta = nil)
5
+ @name, @nodes, @meta = name, nodes, meta
6
+ end
7
+
8
+ # expand flat list into tree
9
+ def dependencies(flat_list)
10
+ @nodes = flat_list.map(&:clone)
11
+ @nodes.each do |entry|
12
+ entry.nodes = entry.nodes.map do |node|
13
+ @nodes.detect{|entry| entry.name == node }
14
+ end
15
+ end
16
+ # extract the start node if name was given
17
+ @nodes = @nodes.detect{|node| node.name == name }.nodes unless name.nil?
18
+ self
19
+ end
20
+
21
+ # reverse the dependency tree
22
+ def reverse_dependencies(flat_list)
23
+ if name.nil?
24
+ @nodes = flat_list.map(&:clone) # .select{|entry| entry.nodes.empty? }
25
+ else
26
+ @nodes = flat_list.select{|entry| entry.nodes.include?(name) }.map(&:clone)
27
+ end
28
+ nodes.each{|node| node.reverse_dependencies(flat_list) }
29
+ self
30
+ end
31
+
32
+ def simplify
33
+ @nodes.reject! do |search_node|
34
+ @nodes.detect{|iteration_node|
35
+ iteration_node.nodes.detect{|node| node.name == search_node.name }
36
+ }
37
+ end
38
+ self
39
+ end
40
+
41
+ # printout the tree
42
+ def to_s(level = 0)
43
+ out = "#{prefix(level)}#{name}"
44
+ out << ":\n" if nodes.size > 0 and name
45
+ out << nodes.map do |n|
46
+ if n.is_a?(Flat2Tree::Entry)
47
+ n.to_s(level + 1)
48
+ else
49
+ n.to_s.split(/\n/).map{|line| "#{prefix(level + 1)}#{line}"}.join("\n")
50
+ end
51
+ end.join("\n") if nodes.size > 0
52
+ out
53
+ end
54
+
55
+ private
56
+ # calculate spaces prefix for given level
57
+ def prefix(level)
58
+ level == 0 ? "" : "%#{level * 4}s- " % " "
59
+ end
60
+ end
@@ -0,0 +1,3 @@
1
+ module Flat2Tree
2
+ VERSION = '1.0.0'
3
+ end
metadata ADDED
@@ -0,0 +1,50 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: flat2tree
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Michal Papis
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2013-06-15 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description:
14
+ email:
15
+ - mpapis@gmail.com
16
+ executables: []
17
+ extensions: []
18
+ extra_rdoc_files: []
19
+ files:
20
+ - .gitignore
21
+ - LICENCE
22
+ - README.md
23
+ - flat2tree.gemspec
24
+ - lib/flat2tree.rb
25
+ - lib/flat2tree/entry.rb
26
+ - lib/flat2tree/version.rb
27
+ homepage: https://github.com/mpapis/flat2tree
28
+ licenses: []
29
+ metadata: {}
30
+ post_install_message:
31
+ rdoc_options: []
32
+ require_paths:
33
+ - lib
34
+ required_ruby_version: !ruby/object:Gem::Requirement
35
+ requirements:
36
+ - - '>='
37
+ - !ruby/object:Gem::Version
38
+ version: '0'
39
+ required_rubygems_version: !ruby/object:Gem::Requirement
40
+ requirements:
41
+ - - '>='
42
+ - !ruby/object:Gem::Version
43
+ version: '0'
44
+ requirements: []
45
+ rubyforge_project:
46
+ rubygems_version: 2.0.3
47
+ signing_key:
48
+ specification_version: 4
49
+ summary: Transform flat list into (reverse) dependency tree
50
+ test_files: []