fhlow 1.91.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.
Files changed (53) hide show
  1. data/bin/fhlow +186 -0
  2. data/lib/module_cmdparse/cmdparse.rb +480 -0
  3. data/lib/module_cmdparse/cmdparse/wrappers/optparse.rb +65 -0
  4. data/lib/module_config/config.rb +67 -0
  5. data/lib/module_config/configexception.rb +18 -0
  6. data/lib/module_config/configitems/complex.rb +71 -0
  7. data/lib/module_config/configitems/complexpackage.rb +67 -0
  8. data/lib/module_config/configitems/complexunit.rb +76 -0
  9. data/lib/module_config/configitems/simple.rb +56 -0
  10. data/lib/module_config/configitems/simplearchitecture.rb +52 -0
  11. data/lib/module_config/configitems/simplepackage.rb +47 -0
  12. data/lib/module_config/configitems/simpleunit.rb +53 -0
  13. data/lib/module_config/configs.test +24 -0
  14. data/lib/module_config/item.rb +34 -0
  15. data/lib/module_config/itemfactory.rb +55 -0
  16. data/lib/module_config/section.rb +69 -0
  17. data/lib/module_config/test.flw +20 -0
  18. data/lib/module_config/test.rb +85 -0
  19. data/lib/module_config/tmp +3 -0
  20. data/lib/module_config/unittests/config_1.flw +14 -0
  21. data/lib/module_config/unittests/config_1_fixed.flw +14 -0
  22. data/lib/module_config/unittests/config_2.flw +15 -0
  23. data/lib/module_config/unittests/config_3a.flw +16 -0
  24. data/lib/module_config/unittests/config_3b.flw +15 -0
  25. data/lib/module_config/unittests/config_test.rb +579 -0
  26. data/lib/module_config/unittests/coverage/-home-simon-tmp-fhlow_v2-flw-core-lib-module_config-configexception_rb.html +647 -0
  27. data/lib/module_config/unittests/coverage/-home-simon-tmp-fhlow_v2-flw-core-lib-module_config-configitems-complex_rb.html +700 -0
  28. data/lib/module_config/unittests/coverage/-home-simon-tmp-fhlow_v2-flw-core-lib-module_config-configitems-complexpackage_rb.html +694 -0
  29. data/lib/module_config/unittests/coverage/-home-simon-tmp-fhlow_v2-flw-core-lib-module_config-configitems-complexunit_rb.html +704 -0
  30. data/lib/module_config/unittests/coverage/-home-simon-tmp-fhlow_v2-flw-core-lib-module_config-configitems-simple_rb.html +685 -0
  31. data/lib/module_config/unittests/coverage/-home-simon-tmp-fhlow_v2-flw-core-lib-module_config-configitems-simplepackage_rb.html +676 -0
  32. data/lib/module_config/unittests/coverage/-home-simon-tmp-fhlow_v2-flw-core-lib-module_config-configitems-simpleunit_rb.html +682 -0
  33. data/lib/module_config/unittests/coverage/-home-simon-tmp-fhlow_v2-flw-core-lib-module_config-item_rb.html +663 -0
  34. data/lib/module_config/unittests/coverage/-home-simon-tmp-fhlow_v2-flw-core-lib-module_config-itemfactory_rb.html +687 -0
  35. data/lib/module_config/unittests/coverage/-home-simon-tmp-fhlow_v2-flw-core-lib-module_config-myconfig_rb.html +687 -0
  36. data/lib/module_config/unittests/coverage/-home-simon-tmp-fhlow_v2-flw-core-lib-module_config-section_rb.html +692 -0
  37. data/lib/module_config/unittests/coverage/index.html +689 -0
  38. data/lib/module_fhlow/fhlowexception.rb +55 -0
  39. data/lib/module_fhlow/leaf.rb +197 -0
  40. data/lib/module_fhlow/leaf.rb~ +202 -0
  41. data/lib/module_fhlow/leaffactory.rb +97 -0
  42. data/lib/module_fhlow/leafs/Package.rb +55 -0
  43. data/lib/module_fhlow/leafs/Unit.rb +152 -0
  44. data/lib/module_fhlow/log.rb +100 -0
  45. data/lib/module_fhlow/node.rb +206 -0
  46. data/lib/module_fhlow/pen.rb +101 -0
  47. data/lib/module_fhlow/plugin.rb +54 -0
  48. data/lib/module_fhlow/pluginpool.rb +81 -0
  49. data/lib/module_fhlow/rootnode.rb +98 -0
  50. data/lib/module_fhlow/test.rb +15 -0
  51. data/lib/module_term/ansicolor.rb +102 -0
  52. data/tests/testsuite.rb +20 -0
  53. metadata +106 -0
@@ -0,0 +1,55 @@
1
+ #----------------------------------------------------------------------------
2
+ #
3
+ # Copyright (C) 2007 Simon Lasselsberger
4
+ # simon.lasselsberger@fh-hagenberg.at
5
+ #
6
+ # This file is part of the _fhlow_ scripting environment.
7
+ #
8
+ # The _fhlow_ scripting environment is free software; you can redistribute
9
+ # it and/or modify it under the terms of the GNU General Public License
10
+ # as published by the Free Software Foundation; either version 2 of the
11
+ # License, or (at your option) any later version.
12
+ #
13
+ # _fhlow_ is distributed in the hope that it will be useful,
14
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
15
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16
+ # GNU General Public License for more details.
17
+ #
18
+ # You should have received a copy of the GNU General Public License
19
+ # along with _fhlow_; if not, write to the Free Software
20
+ # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21
+ #
22
+ #----------------------------------------------------------------------------
23
+
24
+
25
+
26
+ module Fhlow
27
+
28
+ # FhlowException is derived from StandardError in order to extend it with an additional
29
+ # attribute _caller_.
30
+ class FhlowException < StandardError
31
+
32
+ # Holds information about the object or the program state that throws this exception.
33
+ attr_reader :caller
34
+
35
+ # Sets the attribute _caller_ and calls the constructor of StandardError.
36
+ # +_caller+:: Informations about the object or the program state that throws this exception.
37
+ # <tt>*_args</tt>:: An Array of arguments for the constructor of StandardError
38
+ def initialize (_caller, *_args)
39
+ super(_args)
40
+ @caller = _caller
41
+ end
42
+ end
43
+
44
+ # FhlowObjectNotFoundException is used as more specific exception by Node.
45
+ class FhlowObjectNotFoundException < FhlowException
46
+ end
47
+
48
+ # FhlowToolException is used as more specific exception for Plugins.
49
+ class FhlowPluginException < FhlowException
50
+ end
51
+
52
+ # FhlowFileNotFoundException is used as more specific exception if a file was not found.
53
+ class FhlowFileNotFoundException < FhlowException
54
+ end
55
+ end
@@ -0,0 +1,197 @@
1
+
2
+ #----------------------------------------------------------------------------
3
+ #
4
+ # Copyright (C) 2006 Simon Lasselsberger
5
+ # simon.lasselsberger@fh-hagenberg.at
6
+ #
7
+ # This file is part of the _fhlow_ scripting environment.
8
+ #
9
+ # The _fhlow_ scripting environment is free software; you can redistribute
10
+ # it and/or modify it under the terms of the GNU General Public License
11
+ # as published by the Free Software Foundation; either version 2 of the
12
+ # License, or (at your option) any later version.
13
+ #
14
+ # _fhlow_ is distributed in the hope that it will be useful,
15
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
16
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17
+ # GNU General Public License for more details.
18
+ #
19
+ # You should have received a copy of the GNU General Public License
20
+ # along with _fhlow_; if not, write to the Free Software
21
+ # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22
+ #
23
+ #----------------------------------------------------------------------------
24
+
25
+ require 'fhlowexception'
26
+ require 'config'
27
+
28
+ module Fhlow
29
+
30
+ # Leaf's are fhlows major objects. They are created while parsing the directory
31
+ # structure as children of Node's. A Leaf holds informations about its dependencies
32
+ # which are also Leaf's.
33
+ # Leaf is an _acstract_ class, so there have to be subclasses in order to create
34
+ # Leaf objects.
35
+ class Leaf
36
+ # The name of the Leaf
37
+ attr_reader :name
38
+
39
+ # The prefix of the Leaf.
40
+ attr_reader :prefix
41
+
42
+ # The configuration container.
43
+ attr_reader :conf
44
+
45
+ protected
46
+ # Initializes the class valiables and loads the config file.
47
+ # +_prefix+:: The prefix of the Leaf.
48
+ # +_name+:: The Name of the Leaf.
49
+ # +_parent+:: The reference to the parent.
50
+ # +_conf+:: The configuration information from higher levels.
51
+ # +_log+:: The reference to the Log object.
52
+ # +_pen+:: The reference to a Pen object.
53
+ def initialize(_prefix, _name, _parent, _log, _pen)
54
+ @name = _name
55
+ @dependencies = Hash.new # a list of objects that leaf depends on
56
+ @parent = _parent
57
+ @conf = nil
58
+ @prefix = _prefix
59
+ @log = _log
60
+ @pen = _pen
61
+
62
+ if File.exist?(@parent.getPath+@prefix+@name+"/config.flw")
63
+ @conf = Config::Config.new(@parent.getPath+@prefix+@name+"/config.flw")
64
+ # inherit the configurations from previous levels
65
+ @conf.merge(@parent.conf)
66
+ @log.debug(@prefix+@name, "Sucessfully merged inherited configs from #{@parent.prefix+@parent.name}.")
67
+ else
68
+ raise FhlowException.new(@parent.getPath+@prefix+@name, "/config.flw not found.")
69
+ end
70
+
71
+ @log.info(@prefix+@name, "leaf initialized -> #{self}")
72
+ end
73
+
74
+ public
75
+ # Collects the dependencies by building a list of object references using the
76
+ # information from the configuration object.
77
+ # This function is invoked by the _parent_. See RootNode.initialize and Node.fetchDependencies for more
78
+ # information.
79
+ def fetchDependencies()
80
+
81
+ # there needs to be a [Dependencies] section the config file
82
+ if @conf["Dependencies"].nil?
83
+ raise FhlowException.new(getPath, "Couldn't find section [Dependencies] in any config.flw file responsible for this leaf.")
84
+ end
85
+
86
+ # iterate through all items of the [Dependencies] section
87
+ @conf["Dependencies"].each do |item| # item -> one item of the [Dependencies] section
88
+ fetchOneDependency(item)
89
+ end
90
+
91
+ dummy = ""
92
+ @dependencies.each{ |deptype, leafs| dummy += "#{deptype} -> "; leafs.each { |leaf| dummy += "#{leaf.prefix}#{leaf.name} "}; dummy += "; " }
93
+ @log.debug(@prefix+@name, "direct dependencies: #{dummy}")
94
+
95
+ end
96
+
97
+
98
+ # Each configuration item in the [Dependencies] section of the config file is passed to this function in order to
99
+ # request the coresponding Leaf from the _parent_. If __item_ is is of type Config::ComplexUnit architectures are
100
+ # also handled.
101
+ # +_item+:: One item from the section [Dependencies].
102
+ # == TODO
103
+ # in die konkreten leafs auslagern
104
+ def fetchOneDependency(_item)
105
+ if _item.instance_of?(Config::ComplexUnit)
106
+ _item.value.each do |value|
107
+ begin
108
+ leaf = @parent.getLeaf(value["deppath"], value["deppath"].length-1)
109
+ raise FhlowException.new(@prefix+@name), "requested a Fhlow::Unit but got a #{leaf.class.to_s}!" unless leaf.instance_of?(Unit)
110
+ leaf.addArchitectures(self, _item.name, value["archs"])
111
+ raise FhlowException.new(@prefix+@name), "has itself as dependency!" if leaf == self
112
+ rescue FhlowObjectNotFoundException => e
113
+ # fetch the exception and add the name of this leaf so the errormessage is more accurate
114
+ raise FhlowObjectNotFoundException.new(@prefix+@name), "#{e.caller}: #{e.message}"
115
+ end
116
+
117
+ # init the container if it is nil
118
+ @dependencies[_item.name] = Array.new if @dependencies[_item.name].nil?
119
+
120
+ # save the object in the container if it does'nt exist
121
+ @dependencies[_item.name].push(leaf) unless @dependencies[_item.name].include?(leaf)
122
+ end
123
+
124
+ elsif _item.instance_of?(Config::ComplexPackage)
125
+ _item.value.each do |value|
126
+ begin
127
+ leaf = @parent.getLeaf(value, value.length-1)
128
+ raise FhlowException.new(@prefix+@name), "has itself as dependency!" if leaf == self
129
+ rescue FhlowObjectNotFoundException => e
130
+ # fetch the exception and add the name of this leaf so the errormessage is more accurate
131
+ raise FhlowObjectNotFoundException.new(@prefix+@name), "#{e.caller}: #{e.message}"
132
+ end
133
+
134
+ # init the container if it is nil
135
+ @dependencies[_item.name] = Array.new if @dependencies[_item.name].nil?
136
+
137
+ # save the object in the container if it does'nt exist
138
+ @dependencies[_item.name].push(leaf) unless @dependencies[_item.name].include?(leaf)
139
+ end
140
+ end
141
+ end
142
+
143
+
144
+
145
+ =begin def fetchOneDependency(_name, _value)
146
+ # this funktion needs to be implemented in an derived class!
147
+ raise FhlowException.new(self.class), "fetchOneDependency() is not implemented for "+self.class.to_s
148
+ end
149
+ =end
150
+
151
+
152
+ # This function returns an Array of filenames in respect of the dependency tree and needs to be implemented
153
+ # by subclasses.
154
+ # +_deptype+:: Type of the requested dependencies (could be Units, BhvUnits, Packages and so on)
155
+ # +_istoplevel+:: Is used to indicate the first entrance to this function.
156
+ # +_caller+:: Reference to the caller of the function. This is needed to request architectures.
157
+ # +_files+:: The Array of the files which will be filled with the requested filenames and returned in the end.
158
+ def getFiles(_deptype, _istoplevel=true, _caller=nil, _files=Array.new)
159
+ # this funktion needs to be implemented in an derived class!
160
+ raise FhlowException.new(self.class), "getFiles() is not implemented for "+self.class.to_s
161
+ end
162
+
163
+ # Returns the absolute path in the filesystem by requesting the path from the _parent_ and adding
164
+ # _prefix_ and _name_.
165
+ def getPath()
166
+ @parent.getPath+@prefix+@name+"/"
167
+ end
168
+
169
+ # Prints information about this child.
170
+ # +_prefix+:: This prefix will be added to the output of ths function.
171
+ # +_depth+:: The depth of the recursion.
172
+ # +_caller+:: The reference to the caller.
173
+ # == TODO
174
+ # in die konkreten leafs auslagern
175
+ def printMe(_prefix=" ", _depth=0, _caller=nil)
176
+
177
+ if self.instance_of?(Unit)
178
+ str = ""
179
+ @pen.puts _prefix, @pen.magenta, @prefix, @name, @pen.clear,
180
+ @architectures[_depth==0 ? self : _caller].nil? ?
181
+ "\n" :
182
+ "( "+(@architectures[_depth==0 ? self : _caller].each { |key, value| str += "#{@pen.blue}#{key}#{@pen.clear} -> #{value.join(", ")}; " }; str+=")")
183
+ else
184
+ @pen.print _prefix, @pen.yellow, @prefix, @name, @pen.clear, "\n"
185
+ end
186
+
187
+ @dependencies.each do |deptype, leafs|
188
+ leafs.each { |leaf| leaf.printMe(_prefix+" ", _depth+1, self) }
189
+ end if !@dependencies.empty?
190
+
191
+ @pen.print "\n" if _depth == 0
192
+
193
+ end
194
+
195
+ end
196
+
197
+ end
@@ -0,0 +1,202 @@
1
+
2
+ #----------------------------------------------------------------------------
3
+ #
4
+ # Copyright (C) 2006 Simon Lasselsberger
5
+ # simon.lasselsberger@fh-hagenberg.at
6
+ #
7
+ # This file is part of the _fhlow_ scripting environment.
8
+ #
9
+ # The _fhlow_ scripting environment is free software; you can redistribute
10
+ # it and/or modify it under the terms of the GNU General Public License
11
+ # as published by the Free Software Foundation; either version 2 of the
12
+ # License, or (at your option) any later version.
13
+ #
14
+ # _fhlow_ is distributed in the hope that it will be useful,
15
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
16
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17
+ # GNU General Public License for more details.
18
+ #
19
+ # You should have received a copy of the GNU General Public License
20
+ # along with _fhlow_; if not, write to the Free Software
21
+ # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22
+ #
23
+ #----------------------------------------------------------------------------
24
+
25
+ require 'fhlowexception'
26
+ require 'config'
27
+
28
+ module Fhlow
29
+
30
+ # Leaf's are fhlows major objects. They are created while parsing the directory
31
+ # structure as children of Node's. A Leaf holds informations about its dependencies
32
+ # which are also Leaf's.
33
+ # Leaf is an _acstract_ class, so there have to be subclasses in order to create
34
+ # Leaf objects.
35
+ class Leaf
36
+ # The name of the Leaf
37
+ attr_reader :name
38
+
39
+ # The prefix of the Leaf.
40
+ attr_reader :prefix
41
+
42
+ # The configuration container.
43
+ attr_reader :conf
44
+
45
+ protected
46
+ # Initializes the class valiables and loads the config file.
47
+ # +_prefix+:: The prefix of the Leaf.
48
+ # +_name+:: The Name of the Leaf.
49
+ # +_parent+:: The reference to the parent.
50
+ # +_conf+:: The configuration information from higher levels.
51
+ # +_log+:: The reference to the Log object.
52
+ # +_pen+:: The reference to a Pen object.
53
+ def initialize(_prefix, _name, _parent, _log, _pen)
54
+ @name = _name
55
+ @dependencies = Hash.new # a list of objects that leaf depends on
56
+ @parent = _parent
57
+ @conf = nil
58
+ @prefix = _prefix
59
+ @log = _log
60
+ @pen = _pen
61
+
62
+ if File.exist?(@parent.getPath+@prefix+@name+"/config.flw")
63
+ @conf = Config::Config.new(@parent.getPath+@prefix+@name+"/config.flw")
64
+ # inherit the configurations from previous levels
65
+ @conf.merge(@parent.conf)
66
+ @log.debug(@prefix+@name, "Sucessfully merged inherited configs from #{@parent.prefix+@parent.name}.")
67
+ else
68
+ raise FhlowException.new(@parent.getPath+@prefix+@name, "/config.flw not found.")
69
+ end
70
+
71
+ @log.info(@prefix+@name, "leaf initialized -> #{self}")
72
+ end
73
+
74
+ public
75
+ # Collects the dependencies by building a list of object references using the
76
+ # information from the configuration object.
77
+ # This function is invoked by the _parent_. See RootNode.initialize and Node.fetchDependencies for more
78
+ # information.
79
+ def fetchDependencies()
80
+
81
+ # there needs to be a [Dependencies] section the config file
82
+ if @conf["Dependencies"].nil?
83
+ raise FhlowException.new(getPath, "Couldn't find section [Dependencies] in any config.flw file responsible for this leaf.")
84
+ end
85
+
86
+ # iterate through all items of the [Dependencies] section
87
+ @conf["Dependencies"].each do |item| # item -> one item of the [Dependencies] section
88
+ fetchOneDependency(item)
89
+ end
90
+
91
+ dummy = ""
92
+ @dependencies.each{ |deptype, leafs| dummy += "#{deptype} -> "; leafs.each { |leaf| dummy += "#{leaf.prefix}#{leaf.name} "}; dummy += "; " }
93
+ @log.debug(@prefix+@name, "direct dependencies: #{dummy}")
94
+
95
+ end
96
+
97
+
98
+ # Each configuration item in the [Dependencies] section of the config file is passed to this function in order to
99
+ # request the coresponding Leaf from the _parent_. If __item_ is is of type Config::ComplexUnit architectures are
100
+ # also handled.
101
+ # +_item+:: One item from the section [Dependencies].
102
+ # == TODO
103
+ # in die konkreten leafs auslagern
104
+ def fetchOneDependency(_item)
105
+ if _item.instance_of?(Config::ComplexUnit)
106
+ _item.value.each do |value|
107
+ begin
108
+
109
+ if @name == "Cpu"
110
+ puts "here"
111
+ end
112
+
113
+ leaf = @parent.getLeaf(value["deppath"], value["deppath"].length+1)
114
+ raise FhlowException.new(@prefix+@name), "requested a Fhlow::Unit but got a #{leaf.class.to_s}!" unless leaf.instance_of?(Unit)
115
+ leaf.addArchitectures(self, _item.name, value["archs"])
116
+ raise FhlowException.new(@prefix+@name), "has itself as dependency!" if leaf == self
117
+ rescue FhlowObjectNotFoundException => e
118
+ # fetch the exception and add the name of this leaf so the errormessage is more accurate
119
+ raise FhlowObjectNotFoundException.new(@prefix+@name), "#{e.caller}: #{e.message}"
120
+ end
121
+
122
+ # init the container if it is nil
123
+ @dependencies[_item.name] = Array.new if @dependencies[_item.name].nil?
124
+
125
+ # save the object in the container if it does'nt exist
126
+ @dependencies[_item.name].push(leaf) unless @dependencies[_item.name].include?(leaf)
127
+ end
128
+
129
+ elsif _item.instance_of?(Config::ComplexPackage)
130
+ _item.value.each do |value|
131
+ begin
132
+ leaf = @parent.getLeaf(value, value.length+1)
133
+ raise FhlowException.new(@prefix+@name), "has itself as dependency!" if leaf == self
134
+ rescue FhlowObjectNotFoundException => e
135
+ # fetch the exception and add the name of this leaf so the errormessage is more accurate
136
+ raise FhlowObjectNotFoundException.new(@prefix+@name), "#{e.caller}: #{e.message}"
137
+ end
138
+
139
+ # init the container if it is nil
140
+ @dependencies[_item.name] = Array.new if @dependencies[_item.name].nil?
141
+
142
+ # save the object in the container if it does'nt exist
143
+ @dependencies[_item.name].push(leaf) unless @dependencies[_item.name].include?(leaf)
144
+ end
145
+ end
146
+ end
147
+
148
+
149
+
150
+ =begin def fetchOneDependency(_name, _value)
151
+ # this funktion needs to be implemented in an derived class!
152
+ raise FhlowException.new(self.class), "fetchOneDependency() is not implemented for "+self.class.to_s
153
+ end
154
+ =end
155
+
156
+
157
+ # This function returns an Array of filenames in respect of the dependency tree and needs to be implemented
158
+ # by subclasses.
159
+ # +_deptype+:: Type of the requested dependencies (could be Units, BhvUnits, Packages and so on)
160
+ # +_istoplevel+:: Is used to indicate the first entrance to this function.
161
+ # +_caller+:: Reference to the caller of the function. This is needed to request architectures.
162
+ # +_files+:: The Array of the files which will be filled with the requested filenames and returned in the end.
163
+ def getFiles(_deptype, _istoplevel=true, _caller=nil, _files=Array.new)
164
+ # this funktion needs to be implemented in an derived class!
165
+ raise FhlowException.new(self.class), "getFiles() is not implemented for "+self.class.to_s
166
+ end
167
+
168
+ # Returns the absolute path in the filesystem by requesting the path from the _parent_ and adding
169
+ # _prefix_ and _name_.
170
+ def getPath()
171
+ @parent.getPath+@prefix+@name+"/"
172
+ end
173
+
174
+ # Prints information about this child.
175
+ # +_prefix+:: This prefix will be added to the output of ths function.
176
+ # +_depth+:: The depth of the recursion.
177
+ # +_caller+:: The reference to the caller.
178
+ # == TODO
179
+ # in die konkreten leafs auslagern
180
+ def printMe(_prefix=" ", _depth=0, _caller=nil)
181
+
182
+ if self.instance_of?(Unit)
183
+ str = ""
184
+ @pen.puts _prefix, @pen.magenta, @prefix, @name, @pen.clear,
185
+ @architectures[_depth==0 ? self : _caller].nil? ?
186
+ "\n" :
187
+ "( "+(@architectures[_depth==0 ? self : _caller].each { |key, value| str += "#{@pen.blue}#{key}#{@pen.clear} -> #{value.join(", ")}; " }; str+=")")
188
+ else
189
+ @pen.print _prefix, @pen.yellow, @prefix, @name, @pen.clear, "\n"
190
+ end
191
+
192
+ @dependencies.each do |deptype, leafs|
193
+ leafs.each { |leaf| leaf.printMe(_prefix+" ", _depth+1, self) }
194
+ end if !@dependencies.empty?
195
+
196
+ @pen.print "\n" if _depth == 0
197
+
198
+ end
199
+
200
+ end
201
+
202
+ end