flat2tree 1.0.0

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