arquanator 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +17 -0
- data/.rspec +2 -0
- data/Gemfile +2 -0
- data/LICENSE.txt +22 -0
- data/README.md +36 -0
- data/Rakefile +7 -0
- data/arquanator.gemspec +22 -0
- data/bin/arquanator +5 -0
- data/lib/arquanator.rb +25 -0
- data/lib/arquanator/version.rb +3 -0
- data/lib/arquanator_options.rb +47 -0
- data/lib/generators/dependency_list/dependency_list_generator.rb +31 -0
- data/lib/generators/generator_factory.rb +18 -0
- data/lib/generators/graphviz/collection_drawer.rb +93 -0
- data/lib/generators/graphviz/empty_collection_drawer.rb +26 -0
- data/lib/generators/graphviz/empty_drawer.rb +11 -0
- data/lib/generators/graphviz/file_leaf_drawer.rb +24 -0
- data/lib/generators/graphviz/folder_leaf_drawer.rb +19 -0
- data/lib/generators/graphviz/function_leaf_drawer.rb +15 -0
- data/lib/generators/graphviz/graph_drawer.rb +67 -0
- data/lib/generators/graphviz/graph_drawer_factory.rb +36 -0
- data/lib/generators/graphviz/graphviz_generator.rb +19 -0
- data/lib/generators/nil_generator.rb +8 -0
- data/lib/generators/smell_list/smell_list_generator.rb +51 -0
- data/lib/model/base_node.rb +62 -0
- data/lib/model/collection_node.rb +120 -0
- data/lib/model/file_node.rb +56 -0
- data/lib/model/folder_node.rb +36 -0
- data/lib/model/function_node.rb +49 -0
- data/lib/providers/c_gcc_file_provider.rb +36 -0
- data/lib/providers/c_gcc_provider.rb +13 -0
- data/lib/providers/folder_provider.rb +29 -0
- data/lib/providers/java_provider.rb +23 -0
- data/lib/providers/jruby_file_provider.rb +38 -0
- data/lib/providers/jruby_provider.rb +13 -0
- data/lib/providers/llvm_c_obj_c_file_provider.rb +59 -0
- data/lib/providers/llvm_c_obj_c_provider.rb +13 -0
- data/lib/providers/nil_provider.rb +7 -0
- data/lib/providers/provider_factory.rb +20 -0
- data/spec/arquanator_options_spec.rb +83 -0
- data/spec/c_gcc_file_provider_spec.rb +59 -0
- data/spec/c_gcc_provider_spec.rb +13 -0
- data/spec/dependency_list_generator_spec.rb +27 -0
- data/spec/file_spec.rb +207 -0
- data/spec/folder_provider_spec.rb +20 -0
- data/spec/folder_spec.rb +215 -0
- data/spec/function_spec.rb +73 -0
- data/spec/generator_factory_spec.rb +32 -0
- data/spec/graphviz_generator_spec.rb +462 -0
- data/spec/java_provider_spec.rb +31 -0
- data/spec/llvm_c_obj_c_file_provider_spec.rb +76 -0
- data/spec/llvm_c_obj_c_provider_spec.rb +14 -0
- data/spec/nil_generator_spec.rb +44 -0
- data/spec/provider_factory_spec.rb +34 -0
- data/spec/smell_list_generator_spec.rb +33 -0
- data/spec/spec_helper.rb +21 -0
- metadata +145 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 046751197b1a7100e57e5cf651b888252c9a54b4
|
4
|
+
data.tar.gz: e0b83caa6c766c46e9e085841828c736c5b767e8
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: e4503847a0ae10ce78c53cedd92d815022bb630d09844ecbb0b704c7ad585f1694b11da0c992da35563432c11605c09af5a2cd1343601f2182eb4f99586f03ae
|
7
|
+
data.tar.gz: d6f9e6f0d44c003f532c3f5bfdfe006bdf6a76875a34d7e8df305c1e8addbba92d9b318eabd86c9db5c6fa4c7f55d90f7cadce7616b2ab338616587c617b2de9
|
data/.gitignore
ADDED
data/.rspec
ADDED
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2012 Magnus Ernstsson
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
# Arquanator
|
2
|
+
|
3
|
+
TODO: Write a gem description
|
4
|
+
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
$ gem install arquanator
|
8
|
+
|
9
|
+
## Usage
|
10
|
+
|
11
|
+
-i show files
|
12
|
+
-o show folders
|
13
|
+
-u show functions
|
14
|
+
-l [INTEGER] nbr of levels (default: all)
|
15
|
+
-p [PROVIDER] data provider (default: llvm)
|
16
|
+
-g [GENERATOR] report generator (default: graphviz)
|
17
|
+
-r [ROOT] analysis root
|
18
|
+
|
19
|
+
### Available providers
|
20
|
+
|
21
|
+
* llvm
|
22
|
+
* gcc
|
23
|
+
|
24
|
+
### Available generators
|
25
|
+
|
26
|
+
* graphviz
|
27
|
+
* smells
|
28
|
+
* dependencies
|
29
|
+
|
30
|
+
## Contributing
|
31
|
+
|
32
|
+
1. Fork it
|
33
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
34
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
35
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
36
|
+
5. Create new Pull Request
|
data/Rakefile
ADDED
data/arquanator.gemspec
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'arquanator/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |gem|
|
7
|
+
gem.name = "arquanator"
|
8
|
+
gem.version = Arquanator::VERSION
|
9
|
+
gem.authors = ["Magnus Ernstsson"]
|
10
|
+
gem.email = ["magnus@ernstsson.net"]
|
11
|
+
gem.description = %q{Write a gem description}
|
12
|
+
gem.summary = %q{Write a gem summary}
|
13
|
+
gem.homepage = "https://github.com/ernstsson/Arquanator"
|
14
|
+
|
15
|
+
gem.files = `git ls-files`.split($/)
|
16
|
+
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
17
|
+
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
18
|
+
gem.require_paths = ["lib"]
|
19
|
+
|
20
|
+
gem.add_development_dependency 'rspec'
|
21
|
+
gem.add_development_dependency 'simplecov'
|
22
|
+
end
|
data/bin/arquanator
ADDED
data/lib/arquanator.rb
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'arquanator_options'
|
2
|
+
require 'providers/provider_factory'
|
3
|
+
require 'generators/generator_factory'
|
4
|
+
require 'model/folder_node'
|
5
|
+
|
6
|
+
module Arquanator
|
7
|
+
def self.run(args)
|
8
|
+
options = ArquanatorOptions.new
|
9
|
+
config = options.parse args
|
10
|
+
puts args.empty? ? options.message : run_generator(config, args)
|
11
|
+
end
|
12
|
+
|
13
|
+
private
|
14
|
+
|
15
|
+
def self.run_generator(config, args)
|
16
|
+
root = FolderNode.new "", "", :public, 0
|
17
|
+
provider = ProviderFactory.create_provider config, root
|
18
|
+
generator = GeneratorFactory.create_generator config
|
19
|
+
args.each do |file_name|
|
20
|
+
file = File.open file_name, "r"
|
21
|
+
provider.parse file_name, file
|
22
|
+
end
|
23
|
+
generator.generate(root)
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
require 'optparse'
|
2
|
+
|
3
|
+
class ArquanatorOptions
|
4
|
+
def initialize
|
5
|
+
@config = {
|
6
|
+
:levels => 0,
|
7
|
+
:provider => "llvm",
|
8
|
+
:generator => "graphviz",
|
9
|
+
}
|
10
|
+
@parser = OptionParser.new do |opts|
|
11
|
+
opts.on("-i", "show files") do |files|
|
12
|
+
@config[:files] = files
|
13
|
+
end
|
14
|
+
opts.on("-o", "show folders") do |folders|
|
15
|
+
@config[:folders] = folders
|
16
|
+
end
|
17
|
+
opts.on("-u", "show functions") do |functions|
|
18
|
+
@config[:functions] = functions
|
19
|
+
end
|
20
|
+
opts.on("-l [INTEGER]", OptionParser::DecimalInteger,
|
21
|
+
"nbr of levels (default: all)") do |levels|
|
22
|
+
@config[:levels] = levels
|
23
|
+
end
|
24
|
+
opts.on("-p [PROVIDER]",
|
25
|
+
"data provider (default: llvm)") do |provider|
|
26
|
+
@config[:provider] = provider
|
27
|
+
end
|
28
|
+
opts.on("-g [GENERATOR]",
|
29
|
+
"report generator (default: graphviz)") do |generator|
|
30
|
+
@config[:generator] = generator
|
31
|
+
end
|
32
|
+
opts.on("-r [ROOT]", "analysis root") do |root|
|
33
|
+
@config[:root] = root
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def parse(args)
|
39
|
+
@parser.parse! args
|
40
|
+
@config
|
41
|
+
end
|
42
|
+
|
43
|
+
def message
|
44
|
+
msg = []
|
45
|
+
@parser.summarize msg
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
class DependencyListGenerator
|
2
|
+
def initialize(config)
|
3
|
+
@dependencies = []
|
4
|
+
end
|
5
|
+
|
6
|
+
def generate(node)
|
7
|
+
"#{generate_list node}"
|
8
|
+
end
|
9
|
+
|
10
|
+
private
|
11
|
+
|
12
|
+
def generate_list(node)
|
13
|
+
extract_dependencies node
|
14
|
+
@dependencies.sort!
|
15
|
+
@dependencies.join "\n"
|
16
|
+
end
|
17
|
+
|
18
|
+
def extract_dependencies(node)
|
19
|
+
if node.respond_to? :nodes
|
20
|
+
node.dependencies.each do |toname, fromdep|
|
21
|
+
fromdep.each do |fromname, value|
|
22
|
+
path = (node.path != "") ? "#{node.path}/" : ""
|
23
|
+
@dependencies << "#{path}#{fromname} -> #{path}#{toname}"
|
24
|
+
end
|
25
|
+
end
|
26
|
+
node.nodes.each_value do |subnode|
|
27
|
+
extract_dependencies subnode
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require "generators/nil_generator"
|
2
|
+
require "generators/graphviz/graphviz_generator"
|
3
|
+
require "generators/smell_list/smell_list_generator"
|
4
|
+
require "generators/dependency_list/dependency_list_generator"
|
5
|
+
|
6
|
+
class GeneratorFactory
|
7
|
+
@generators = {
|
8
|
+
"graphviz" => GraphvizGenerator,
|
9
|
+
"smells" => SmellListGenerator,
|
10
|
+
"dependencies" => DependencyListGenerator
|
11
|
+
}
|
12
|
+
@generators.default = NilGenerator
|
13
|
+
|
14
|
+
def self.create_generator(config)
|
15
|
+
generator_class = @generators[config[:generator]]
|
16
|
+
generator = generator_class.new config
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,93 @@
|
|
1
|
+
require "generators/graphviz/graph_drawer"
|
2
|
+
|
3
|
+
class CollectionDrawer < GraphDrawer
|
4
|
+
def initialize(node, config, factory)
|
5
|
+
super node, config, factory
|
6
|
+
end
|
7
|
+
|
8
|
+
def draw
|
9
|
+
"#{draw_header}#{draw_dependencies}#{draw_children}}\n"
|
10
|
+
end
|
11
|
+
|
12
|
+
private
|
13
|
+
|
14
|
+
def draw_dependencies
|
15
|
+
graph = ""
|
16
|
+
@node.dependencies.each do |todep, fromdeps|
|
17
|
+
fromdeps.each do |fromdep, params|
|
18
|
+
graph += show_dependency?(fromdep, todep) ?
|
19
|
+
draw_dependency(fromdep, todep, params) : ""
|
20
|
+
end
|
21
|
+
end
|
22
|
+
graph
|
23
|
+
end
|
24
|
+
|
25
|
+
def draw_dependency(fromdep, todep, params)
|
26
|
+
graph = ""
|
27
|
+
color = params[:circ] ?
|
28
|
+
", color=crimson, fontcolor=crimson, style=bold" : ""
|
29
|
+
graph += "\"#{@node.path}/#{fromdep}\"->\""
|
30
|
+
graph += "#{@node.path}/#{todep}\" "
|
31
|
+
graph += "[label=\"#{params[:dep]}\"#{color}"
|
32
|
+
if @node.level + 1 < @config[:levels] or @config[:levels] == 0
|
33
|
+
graph += show_tail?(fromdep, todep) ?
|
34
|
+
", ltail=\"cluster_#{@node.path}/#{fromdep}\"" : ""
|
35
|
+
graph += show_head?(fromdep, todep) ?
|
36
|
+
", lhead=\"cluster_#{@node.path}/#{todep}\"" : ""
|
37
|
+
end
|
38
|
+
graph += "];\n"
|
39
|
+
end
|
40
|
+
|
41
|
+
def show_file_dependency?(fromdep, todep)
|
42
|
+
@config[:files] or
|
43
|
+
!(@node.nodes[fromdep].file? or @node.nodes[todep].file?)
|
44
|
+
end
|
45
|
+
|
46
|
+
def show_function_dependency?(fromdep, todep)
|
47
|
+
@config[:functions] or
|
48
|
+
!(@node.nodes[fromdep].function? or @node.nodes[todep].function?)
|
49
|
+
end
|
50
|
+
|
51
|
+
def show_dependency?(fromdep, todep)
|
52
|
+
show_file_dependency?(fromdep, todep) and
|
53
|
+
show_function_dependency?(fromdep, todep)
|
54
|
+
end
|
55
|
+
|
56
|
+
def show_tail?(fromdep, todep)
|
57
|
+
@node.nodes[fromdep].file? and
|
58
|
+
@config[:functions] or @node.nodes[fromdep].folder?
|
59
|
+
end
|
60
|
+
|
61
|
+
def show_head?(fromdep, todep)
|
62
|
+
@node.nodes[todep].file? and
|
63
|
+
@config[:functions] or @node.nodes[todep].folder?
|
64
|
+
end
|
65
|
+
|
66
|
+
def draw_child(child)
|
67
|
+
drawer = @factory.create_drawer child
|
68
|
+
drawer.draw
|
69
|
+
end
|
70
|
+
|
71
|
+
def draw_children
|
72
|
+
graph = ""
|
73
|
+
@node.nodes.each_value do |child|
|
74
|
+
graph += draw_child child
|
75
|
+
end
|
76
|
+
graph
|
77
|
+
end
|
78
|
+
|
79
|
+
def draw_header
|
80
|
+
url = @config[:url] ? "#{draw_folder_url};" : ""
|
81
|
+
report_label = draw_report_label
|
82
|
+
report_label = report_label.empty? ?
|
83
|
+
report_label : "\\n#{report_label}"
|
84
|
+
"subgraph \"cluster_#{@node.path}\" {\n"\
|
85
|
+
"#{draw_report_color(";")};"\
|
86
|
+
"#{url}"\
|
87
|
+
"style=filled;"\
|
88
|
+
"label=\"#{draw_name_label}"\
|
89
|
+
"#{report_label}\";\n"\
|
90
|
+
"\"#{@node.path}\" "\
|
91
|
+
"[shape=none, label=\"\", width=0, style=invisible];\n"
|
92
|
+
end
|
93
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require "generators/graphviz/graph_drawer"
|
2
|
+
|
3
|
+
class EmptyCollectionDrawer < GraphDrawer
|
4
|
+
def initialize(node, config, factory)
|
5
|
+
super node, config, factory
|
6
|
+
end
|
7
|
+
|
8
|
+
def draw
|
9
|
+
draw_children
|
10
|
+
end
|
11
|
+
|
12
|
+
private
|
13
|
+
|
14
|
+
def draw_child(child)
|
15
|
+
drawer = @factory.create_drawer child
|
16
|
+
drawer.draw
|
17
|
+
end
|
18
|
+
|
19
|
+
def draw_children
|
20
|
+
graph = ""
|
21
|
+
@node.nodes.each_value do |child|
|
22
|
+
graph += draw_child child
|
23
|
+
end
|
24
|
+
graph
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require "generators/graphviz/graph_drawer"
|
2
|
+
|
3
|
+
class FileLeafDrawer < GraphDrawer
|
4
|
+
def initialize(node, config, factory)
|
5
|
+
super node, config, factory
|
6
|
+
end
|
7
|
+
|
8
|
+
def draw
|
9
|
+
url = @config[:url] ? "#{draw_file_url}, " : ""
|
10
|
+
"\"#{@node.path}\" ["\
|
11
|
+
"#{url}"\
|
12
|
+
"#{draw_report_color(", ")}, "\
|
13
|
+
"label=\"{#{draw_name_label}"\
|
14
|
+
"|#{draw_report_label}|}\", shape=record, style=filled];\n"
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
def draw_file_url
|
20
|
+
offset = @config[:root] ? @config[:root].length + 1 : 0
|
21
|
+
url = @node.path.slice offset..-1
|
22
|
+
"URL=\"#{url}.svg\" "
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require "generators/graphviz/graph_drawer"
|
2
|
+
|
3
|
+
class FolderLeafDrawer < GraphDrawer
|
4
|
+
def initialize(node, config, factory)
|
5
|
+
super node, config, factory
|
6
|
+
end
|
7
|
+
|
8
|
+
def draw
|
9
|
+
url = @config[:url] ? "#{draw_folder_url}, " : ""
|
10
|
+
report_label = draw_report_label
|
11
|
+
report_label = report_label.empty? ?
|
12
|
+
report_label : "\\n#{report_label}"
|
13
|
+
"\"#{@node.path}\" ["\
|
14
|
+
"#{url}"\
|
15
|
+
"#{draw_report_color(", ")}, "\
|
16
|
+
"label=\"#{draw_name_label}#{report_label}\", "\
|
17
|
+
"shape=tab, style=filled];\n"
|
18
|
+
end
|
19
|
+
end
|