arquanator 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (58) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +17 -0
  3. data/.rspec +2 -0
  4. data/Gemfile +2 -0
  5. data/LICENSE.txt +22 -0
  6. data/README.md +36 -0
  7. data/Rakefile +7 -0
  8. data/arquanator.gemspec +22 -0
  9. data/bin/arquanator +5 -0
  10. data/lib/arquanator.rb +25 -0
  11. data/lib/arquanator/version.rb +3 -0
  12. data/lib/arquanator_options.rb +47 -0
  13. data/lib/generators/dependency_list/dependency_list_generator.rb +31 -0
  14. data/lib/generators/generator_factory.rb +18 -0
  15. data/lib/generators/graphviz/collection_drawer.rb +93 -0
  16. data/lib/generators/graphviz/empty_collection_drawer.rb +26 -0
  17. data/lib/generators/graphviz/empty_drawer.rb +11 -0
  18. data/lib/generators/graphviz/file_leaf_drawer.rb +24 -0
  19. data/lib/generators/graphviz/folder_leaf_drawer.rb +19 -0
  20. data/lib/generators/graphviz/function_leaf_drawer.rb +15 -0
  21. data/lib/generators/graphviz/graph_drawer.rb +67 -0
  22. data/lib/generators/graphviz/graph_drawer_factory.rb +36 -0
  23. data/lib/generators/graphviz/graphviz_generator.rb +19 -0
  24. data/lib/generators/nil_generator.rb +8 -0
  25. data/lib/generators/smell_list/smell_list_generator.rb +51 -0
  26. data/lib/model/base_node.rb +62 -0
  27. data/lib/model/collection_node.rb +120 -0
  28. data/lib/model/file_node.rb +56 -0
  29. data/lib/model/folder_node.rb +36 -0
  30. data/lib/model/function_node.rb +49 -0
  31. data/lib/providers/c_gcc_file_provider.rb +36 -0
  32. data/lib/providers/c_gcc_provider.rb +13 -0
  33. data/lib/providers/folder_provider.rb +29 -0
  34. data/lib/providers/java_provider.rb +23 -0
  35. data/lib/providers/jruby_file_provider.rb +38 -0
  36. data/lib/providers/jruby_provider.rb +13 -0
  37. data/lib/providers/llvm_c_obj_c_file_provider.rb +59 -0
  38. data/lib/providers/llvm_c_obj_c_provider.rb +13 -0
  39. data/lib/providers/nil_provider.rb +7 -0
  40. data/lib/providers/provider_factory.rb +20 -0
  41. data/spec/arquanator_options_spec.rb +83 -0
  42. data/spec/c_gcc_file_provider_spec.rb +59 -0
  43. data/spec/c_gcc_provider_spec.rb +13 -0
  44. data/spec/dependency_list_generator_spec.rb +27 -0
  45. data/spec/file_spec.rb +207 -0
  46. data/spec/folder_provider_spec.rb +20 -0
  47. data/spec/folder_spec.rb +215 -0
  48. data/spec/function_spec.rb +73 -0
  49. data/spec/generator_factory_spec.rb +32 -0
  50. data/spec/graphviz_generator_spec.rb +462 -0
  51. data/spec/java_provider_spec.rb +31 -0
  52. data/spec/llvm_c_obj_c_file_provider_spec.rb +76 -0
  53. data/spec/llvm_c_obj_c_provider_spec.rb +14 -0
  54. data/spec/nil_generator_spec.rb +44 -0
  55. data/spec/provider_factory_spec.rb +34 -0
  56. data/spec/smell_list_generator_spec.rb +33 -0
  57. data/spec/spec_helper.rb +21 -0
  58. metadata +145 -0
@@ -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
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --format progress
data/Gemfile ADDED
@@ -0,0 +1,2 @@
1
+ source 'https://rubygems.org'
2
+ gemspec
@@ -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.
@@ -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
@@ -0,0 +1,7 @@
1
+ require "bundler/gem_tasks"
2
+ require 'rake'
3
+ require 'rspec/core/rake_task'
4
+
5
+ RSpec::Core::RakeTask.new('spec')
6
+
7
+ task :default => :spec
@@ -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
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env ruby
2
+ require 'arquanator'
3
+
4
+ Arquanator.run ARGV
5
+
@@ -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,3 @@
1
+ module Arquanator
2
+ VERSION = "0.0.2"
3
+ 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,11 @@
1
+ require "generators/graphviz/graph_drawer"
2
+
3
+ class EmptyDrawer < GraphDrawer
4
+ def initialize(node, config, factory)
5
+ super node, config, factory
6
+ end
7
+
8
+ def draw
9
+ ""
10
+ end
11
+ 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