archruby 0.2.0 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +3 -0
- data/README.md +1 -1
- data/Rakefile +46 -0
- data/TODO.rtf +20 -0
- data/architecture.yml +51 -0
- data/archruby.gemspec +3 -0
- data/bin/archruby +1 -0
- data/lib/archruby.rb +14 -2
- data/lib/archruby/architecture/architecture.rb +6 -6
- data/lib/archruby/architecture/config_definition.rb +13 -13
- data/lib/archruby/architecture/constraint_break.rb +1 -1
- data/lib/archruby/architecture/dependency.rb +3 -1
- data/lib/archruby/architecture/file_content.rb +2 -2
- data/lib/archruby/architecture/module_definition.rb +33 -20
- data/lib/archruby/architecture/parser.rb +25 -11
- data/lib/archruby/architecture/type_inference_checker.rb +29 -13
- data/lib/archruby/presenters/dsm.rb +163 -0
- data/lib/archruby/presenters/dsm/cell_dsm.rb +17 -0
- data/lib/archruby/presenters/dsm/dsm_css.css +77 -0
- data/lib/archruby/presenters/graph.rb +12 -9
- data/lib/archruby/ruby/parser.rb +131 -125
- data/lib/archruby/ruby/type_inference/dependency_organizer.rb +53 -0
- data/lib/archruby/ruby/type_inference/ruby/class_dependency.rb +22 -0
- data/lib/archruby/ruby/type_inference/ruby/internal_method_invocation.rb +20 -0
- data/lib/archruby/ruby/type_inference/ruby/method_definition.rb +20 -0
- data/lib/archruby/ruby/type_inference/ruby/parser_for_typeinference.rb +537 -0
- data/lib/archruby/ruby/type_inference/ruby/process_method_arguments.rb +155 -0
- data/lib/archruby/ruby/type_inference/ruby/process_method_body.rb +427 -0
- data/lib/archruby/ruby/type_inference/ruby/process_method_params.rb +276 -0
- data/lib/archruby/ruby/type_inference/type_inference_checker.rb +126 -0
- data/lib/archruby/version.rb +1 -1
- data/spec/architecture/file_content_spec.rb +2 -1
- data/spec/architecture/module_definition_spec.rb +9 -9
- data/spec/dummy_app/lib/teste_class.rb +6 -0
- data/spec/ruby/type_inference/dependency_organizer_spec.rb +20 -0
- data/spec/ruby/type_inference/fixtures/homebrew_bottles_class.rb +139 -0
- data/spec/ruby/type_inference/fixtures/homebrew_brew_teste.rb +1323 -0
- data/spec/ruby/type_inference/fixtures/rails_action_view_class_teste.rb +89 -0
- data/spec/ruby/type_inference/fixtures/rails_active_record_class.rb +99 -0
- data/spec/ruby/type_inference/fixtures/rails_teste_active_record.rb +55 -0
- data/spec/ruby/type_inference/fixtures/teste2.rb +16 -0
- data/spec/ruby/type_inference/fixtures/teste_class_and_args.rb +49 -0
- data/spec/ruby/type_inference/fixtures/teste_class_and_args2.rb +11 -0
- data/spec/ruby/type_inference/parser_for_typeinference_spec.rb +69 -0
- data/spec/ruby/type_inference/type_inference_checker_spec.rb +47 -0
- metadata +84 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fe948eb8572448ad33c453de7e0263ebd0ec608e
|
4
|
+
data.tar.gz: 66941f5d195f8dfb24cbfc08f509751908725538
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 822d38a5200a2b6896b1bf1f6cba896b72e34f6f23cec1f7d414628eded75baa62a52a2330d7fdac529aa2c58c4704b8e6283867276303e1a0bc80f3659e747d
|
7
|
+
data.tar.gz: 31110e03b3e2f36091945b3a9ad6d913b6725569fadfa1ea84084eae7bf7ee121309b198e5206c52329dfee4cd7c3f2653a17e7fc1b4927b6b233920c75b6718
|
data/.travis.yml
ADDED
data/README.md
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# Archruby
|
2
2
|
|
3
|
-
This gem aims to verify whether the system architecture is being respected by the developers. The application architecture is defined by the Software Architect through a YML file. After defining the architecture, you can use the tool to analyze if any part of the architecture is being broken in the system. To do this analysis it is necessary to pass the architecture definition file and the root path of the application to the
|
3
|
+
This gem aims to verify whether the system architecture is being respected by the developers. The application architecture is defined by the Software Architect through a YML file. After defining the architecture, you can use the tool to analyze if any part of the architecture is being broken in the system. To do this analysis it is necessary to pass the architecture definition file and the root path of the application to the archruby executable. The archruby executable will do an static scan in the application and generate an yaml file containing the violations. One picture of the entire application with all the communications will be generated either.
|
4
4
|
|
5
5
|
## Installation
|
6
6
|
|
data/Rakefile
CHANGED
@@ -1 +1,47 @@
|
|
1
1
|
require "bundler/gem_tasks"
|
2
|
+
|
3
|
+
begin
|
4
|
+
require 'rspec/core/rake_task'
|
5
|
+
|
6
|
+
RSpec::Core::RakeTask.new(:spec)
|
7
|
+
|
8
|
+
task :default => :spec
|
9
|
+
rescue LoadError
|
10
|
+
# no rspec available
|
11
|
+
end
|
12
|
+
|
13
|
+
def name
|
14
|
+
@name ||= File.basename(Dir['*.gemspec'].first, ".*")
|
15
|
+
end
|
16
|
+
|
17
|
+
def gemspec_file
|
18
|
+
"#{name}.gemspec"
|
19
|
+
end
|
20
|
+
|
21
|
+
def version
|
22
|
+
Archruby::VERSION
|
23
|
+
end
|
24
|
+
|
25
|
+
def gem_file
|
26
|
+
"#{name}-#{Gem::Version.new(version).to_s}.gem"
|
27
|
+
end
|
28
|
+
|
29
|
+
desc "Release #{name} v#{version}"
|
30
|
+
task :release => :build do
|
31
|
+
unless `git branch` =~ /^\* master$/
|
32
|
+
puts "You must be on the master branch to release!"
|
33
|
+
exit!
|
34
|
+
end
|
35
|
+
sh "git commit --allow-empty -m 'Release :gem: #{version}'"
|
36
|
+
sh "git tag v#{version}"
|
37
|
+
sh "git push origin master"
|
38
|
+
sh "git push origin v#{version}"
|
39
|
+
sh "gem push pkg/#{name}-#{version}.gem"
|
40
|
+
end
|
41
|
+
|
42
|
+
desc "Build #{name} v#{version} into pkg/"
|
43
|
+
task :build do
|
44
|
+
mkdir_p "pkg"
|
45
|
+
sh "gem build #{gemspec_file}"
|
46
|
+
sh "mv #{gem_file} pkg"
|
47
|
+
end
|
data/TODO.rtf
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
{\rtf1\ansi\ansicpg1252\cocoartf1265\cocoasubrtf210
|
2
|
+
{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
|
3
|
+
{\colortbl;\red255\green255\blue255;}
|
4
|
+
\paperw11900\paperh16840\margl1440\margr1440\vieww10800\viewh8400\viewkind0
|
5
|
+
\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\pardirnatural
|
6
|
+
|
7
|
+
\f0\fs24 \cf0 TODO Archruby\
|
8
|
+
\
|
9
|
+
* Melhorar os exemplos de heurisca de infer\'eancia de tipo.\
|
10
|
+
* Conferir se o algoritmo est\'e1 se comportando como o esperado \
|
11
|
+
* Criar novos specs para garantir isso\
|
12
|
+
* Garantir que o caso self.class adicione dependencia da classe correte\
|
13
|
+
* \'e9 o exemplo que est\'e1 sendo utilizado no artigo.\
|
14
|
+
* Melhorar valida\'e7\'f5es (executar archruby em branco tem q aparecer um help)\
|
15
|
+
* Melhorar c\'f3digo que foi criado para heur\'edstica\
|
16
|
+
\
|
17
|
+
PARSER\
|
18
|
+
* Estudar melhor a gem: {\field{\*\fldinst{HYPERLINK "https://github.com/whitequark/parser"}}{\fldrslt https://github.com/whitequark/parser}}\
|
19
|
+
* Talvez seja melhor trocar por ela\
|
20
|
+
}
|
data/architecture.yml
ADDED
@@ -0,0 +1,51 @@
|
|
1
|
+
config_definition:
|
2
|
+
files: 'lib/archruby/architecture/config_definition.rb'
|
3
|
+
|
4
|
+
module_definition:
|
5
|
+
files: 'lib/archruby/architecture/module_definition.rb'
|
6
|
+
allowed: 'config_definition, ruby_parser, dependency, constraint_break, file_extractor'
|
7
|
+
|
8
|
+
architecture:
|
9
|
+
files: 'lib/archruby/architecture/architecture.rb'
|
10
|
+
forbidden: 'type_inference'
|
11
|
+
|
12
|
+
architecture_parser:
|
13
|
+
files: 'lib/archruby/architecture/parser.rb'
|
14
|
+
allowed: 'config_definition, module_definition, type_inference, yaml_parser'
|
15
|
+
|
16
|
+
constraint_break:
|
17
|
+
files: 'lib/archruby/architecture/constraint_break.rb'
|
18
|
+
|
19
|
+
dependency:
|
20
|
+
files: 'lib/archruby/architecture/dependency.rb'
|
21
|
+
|
22
|
+
type_inference:
|
23
|
+
files: 'lib/archruby/architecture/type_inference_checker.rb'
|
24
|
+
|
25
|
+
presenters:
|
26
|
+
files: 'lib/archruby/presenters/**/*.rb'
|
27
|
+
allowed: 'architecture, graphviz'
|
28
|
+
|
29
|
+
ruby_parser:
|
30
|
+
files: 'lib/archruby/ruby/parser.rb'
|
31
|
+
allowed: 'dependency, parser_ruby'
|
32
|
+
required: 'sexp_processor'
|
33
|
+
|
34
|
+
sexp_processor:
|
35
|
+
gems: 'SexpInterpreter'
|
36
|
+
|
37
|
+
yaml_parser:
|
38
|
+
gems: 'YAML'
|
39
|
+
|
40
|
+
graphviz:
|
41
|
+
gems: 'GraphViz'
|
42
|
+
|
43
|
+
parser_ruby:
|
44
|
+
gems: 'RubyParser'
|
45
|
+
|
46
|
+
file_extractor:
|
47
|
+
files: 'lib/archruby/architecture/file_content.rb'
|
48
|
+
|
49
|
+
multiple_constraints_validator:
|
50
|
+
files: 'lib/archruby.rb'
|
51
|
+
forbidden: 'architecture'
|
data/archruby.gemspec
CHANGED
@@ -21,8 +21,11 @@ Gem::Specification.new do |spec|
|
|
21
21
|
spec.add_development_dependency "bundler", "~> 1.3"
|
22
22
|
spec.add_development_dependency "rake"
|
23
23
|
spec.add_development_dependency "rspec"
|
24
|
+
spec.add_development_dependency "pry"
|
24
25
|
spec.add_runtime_dependency "ruby_parser"
|
25
26
|
spec.add_runtime_dependency "sexp_processor"
|
26
27
|
spec.add_runtime_dependency "ruby-graphviz"
|
28
|
+
spec.add_runtime_dependency "imgkit"
|
29
|
+
spec.add_runtime_dependency "wkhtmltoimage-binary"
|
27
30
|
|
28
31
|
end
|
data/bin/archruby
CHANGED
data/lib/archruby.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require "archruby/version"
|
2
|
+
require 'pry'
|
2
3
|
|
3
4
|
require 'archruby/architecture/parser'
|
4
5
|
require 'archruby/architecture/config_definition'
|
@@ -7,6 +8,15 @@ require 'archruby/ruby/std_library'
|
|
7
8
|
require 'archruby/ruby/core_library'
|
8
9
|
require 'archruby/ruby/var_propagation'
|
9
10
|
require 'archruby/ruby/type_inference_dep'
|
11
|
+
require 'archruby/ruby/type_inference/dependency_organizer'
|
12
|
+
require 'archruby/ruby/type_inference/type_inference_checker'
|
13
|
+
require 'archruby/ruby/type_inference/ruby/class_dependency'
|
14
|
+
require 'archruby/ruby/type_inference/ruby/internal_method_invocation'
|
15
|
+
require 'archruby/ruby/type_inference/ruby/method_definition'
|
16
|
+
require 'archruby/ruby/type_inference/ruby/parser_for_typeinference'
|
17
|
+
require 'archruby/ruby/type_inference/ruby/process_method_arguments'
|
18
|
+
require 'archruby/ruby/type_inference/ruby/process_method_body'
|
19
|
+
require 'archruby/ruby/type_inference/ruby/process_method_params'
|
10
20
|
require 'archruby/architecture/file_content'
|
11
21
|
require 'archruby/architecture/module_definition'
|
12
22
|
require 'archruby/architecture/type_inference_checker'
|
@@ -15,16 +25,18 @@ require 'archruby/architecture/constraint_break'
|
|
15
25
|
require 'archruby/architecture/architecture'
|
16
26
|
require 'archruby/presenters/text'
|
17
27
|
require 'archruby/presenters/graph'
|
28
|
+
require 'archruby/presenters/dsm'
|
18
29
|
require 'archruby/presenters/yaml'
|
19
30
|
|
20
31
|
module Archruby
|
21
32
|
class ExtractArchitecture
|
22
33
|
attr_reader :architecture
|
23
34
|
|
24
|
-
def initialize
|
35
|
+
def initialize(config_file_path = "", base_directory = "")
|
25
36
|
@config_file_path = config_file_path
|
26
37
|
@base_directory = base_directory
|
27
|
-
|
38
|
+
config_path = File.expand_path(@config_file_path, __FILE__)
|
39
|
+
@architecture_definition = Archruby::Architecture::Parser.new(config_path, @base_directory)
|
28
40
|
@architecture = Archruby::Architecture::Architecture.new(@architecture_definition.modules)
|
29
41
|
@constraints_breaks = []
|
30
42
|
end
|
@@ -4,7 +4,7 @@ module Archruby
|
|
4
4
|
class Architecture
|
5
5
|
attr_reader :constraints_breaks, :modules, :unknown_module
|
6
6
|
|
7
|
-
def initialize
|
7
|
+
def initialize(modules)
|
8
8
|
@modules = modules
|
9
9
|
@constraints_breaks = []
|
10
10
|
@unknown_module = @modules.select{ |module_definition| module_definition.name == "unknown" }.first
|
@@ -21,7 +21,7 @@ module Archruby
|
|
21
21
|
@constraints_breaks
|
22
22
|
end
|
23
23
|
|
24
|
-
def how_many_break
|
24
|
+
def how_many_break(module_name, module_target, constraint_type)
|
25
25
|
raise ArchitectureNotVerified if @constraints_breaks.empty?
|
26
26
|
count = 0
|
27
27
|
@constraints_breaks.each do |constraint_break|
|
@@ -32,7 +32,7 @@ module Archruby
|
|
32
32
|
count
|
33
33
|
end
|
34
34
|
|
35
|
-
def module_name
|
35
|
+
def module_name(class_name)
|
36
36
|
module_name_to_return = ''
|
37
37
|
@modules.each do |module_name|
|
38
38
|
if module_name.is_mine? class_name
|
@@ -47,7 +47,7 @@ module Archruby
|
|
47
47
|
end
|
48
48
|
end
|
49
49
|
|
50
|
-
def how_many_access_to
|
50
|
+
def how_many_access_to(module_origin, module_dest)
|
51
51
|
module_origin = search_module module_origin
|
52
52
|
count = 0
|
53
53
|
module_origin.classes_and_dependencies.each do |class_dependencies|
|
@@ -63,13 +63,13 @@ module Archruby
|
|
63
63
|
count
|
64
64
|
end
|
65
65
|
|
66
|
-
def is_ruby_internals?
|
66
|
+
def is_ruby_internals?(module_name)
|
67
67
|
module_name == Archruby::Ruby::STD_LIB_NAME || module_name == Archruby::Ruby::CORE_LIB_NAME
|
68
68
|
end
|
69
69
|
|
70
70
|
private
|
71
71
|
|
72
|
-
def search_module
|
72
|
+
def search_module(module_name)
|
73
73
|
@modules.each do |module_definition|
|
74
74
|
if module_definition.name == module_name
|
75
75
|
return module_definition
|
@@ -7,37 +7,37 @@ module Archruby
|
|
7
7
|
|
8
8
|
attr_reader :module_name, :files, :gems, :allowed_modules, :required_modules, :forbidden_modules
|
9
9
|
|
10
|
-
def initialize
|
10
|
+
def initialize(module_name, definitions)
|
11
11
|
@module_name = module_name
|
12
|
-
@files = parse_files
|
13
|
-
@gems = parse_gems
|
14
|
-
parse_constraints
|
12
|
+
@files = parse_files(definitions['files'])
|
13
|
+
@gems = parse_gems(definitions['gems'])
|
14
|
+
parse_constraints(definitions)
|
15
15
|
end
|
16
16
|
|
17
|
-
def parse_files
|
17
|
+
def parse_files(files)
|
18
18
|
files = '' if files.nil?
|
19
19
|
files = files.split(',')
|
20
|
-
normalize_string_spaces
|
20
|
+
normalize_string_spaces(files)
|
21
21
|
files
|
22
22
|
end
|
23
23
|
|
24
|
-
def parse_gems
|
24
|
+
def parse_gems(gems)
|
25
25
|
gems = '' if gems.nil?
|
26
26
|
gems = gems.split(',')
|
27
|
-
normalize_string_spaces
|
27
|
+
normalize_string_spaces(gems)
|
28
28
|
gems
|
29
29
|
end
|
30
30
|
|
31
|
-
def parse_constraints
|
32
|
-
check_constraints
|
31
|
+
def parse_constraints(definitions)
|
32
|
+
check_constraints(definitions)
|
33
33
|
ALLOWED_CONSTRAINTS.each do |constraint|
|
34
34
|
constraint_definition = definitions[constraint]
|
35
35
|
constraint_definition = '' if constraint_definition.nil?
|
36
|
-
send
|
36
|
+
send("#{constraint}_modules=", normalize_string_spaces(constraint_definition.split(',')))
|
37
37
|
end
|
38
38
|
end
|
39
39
|
|
40
|
-
def normalize_string_spaces
|
40
|
+
def normalize_string_spaces(array_of_strings)
|
41
41
|
array_of_strings.map! {|element| element.strip }
|
42
42
|
end
|
43
43
|
|
@@ -55,7 +55,7 @@ module Archruby
|
|
55
55
|
|
56
56
|
private
|
57
57
|
|
58
|
-
def check_constraints
|
58
|
+
def check_constraints(definitions)
|
59
59
|
raise MultipleConstraints if definitions['allowed'] && !definitions['allowed'].empty? && definitions['forbidden'] && !definitions['forbidden'].empty?
|
60
60
|
end
|
61
61
|
|
@@ -2,10 +2,12 @@ module Archruby
|
|
2
2
|
module Architecture
|
3
3
|
class Dependency
|
4
4
|
attr_reader :class_name, :line_number
|
5
|
-
|
5
|
+
|
6
|
+
def initialize(class_name, line_number)
|
6
7
|
@class_name = class_name.to_s
|
7
8
|
@line_number = line_number
|
8
9
|
end
|
10
|
+
|
9
11
|
end
|
10
12
|
end
|
11
13
|
end
|
@@ -2,12 +2,12 @@ module Archruby
|
|
2
2
|
module Architecture
|
3
3
|
class FileContent
|
4
4
|
|
5
|
-
def initialize
|
5
|
+
def initialize(base_directory)
|
6
6
|
# base_directory "/Users/sergiomiranda/Labs/ruby_arch_checker/arch_checker/spec/dummy_app/app"
|
7
7
|
@base_directory = base_directory
|
8
8
|
end
|
9
9
|
|
10
|
-
def all_content_from_directory
|
10
|
+
def all_content_from_directory(directory)
|
11
11
|
return if directory.nil? || directory.eql?("")
|
12
12
|
content = {}
|
13
13
|
file_paths = Dir.glob("#{@base_directory}/#{directory}")
|
@@ -3,15 +3,16 @@ module Archruby
|
|
3
3
|
|
4
4
|
class ModuleDefinition
|
5
5
|
|
6
|
-
ALLOWED_CONSTRAINTS =
|
6
|
+
ALLOWED_CONSTRAINTS = %w(required allowed forbidden)
|
7
7
|
|
8
8
|
attr_reader :name, :allowed_modules, :required_modules, :forbidden_modules,
|
9
|
-
|
10
|
-
|
9
|
+
:dependencies, :classes_and_dependencies, :class_methods_and_deps,
|
10
|
+
:class_methods_calls, :type_inference_dependencies,
|
11
|
+
:type_inference_methods_calls
|
11
12
|
|
12
13
|
attr_accessor :classes
|
13
14
|
|
14
|
-
def initialize
|
15
|
+
def initialize(config_definition, base_directory)
|
15
16
|
@config_definition = config_definition
|
16
17
|
@name = @config_definition.module_name
|
17
18
|
@allowed_modules = @config_definition.allowed_modules
|
@@ -24,20 +25,23 @@ module Archruby
|
|
24
25
|
@classes_and_dependencies = []
|
25
26
|
@class_methods_and_deps = []
|
26
27
|
@class_methods_calls = []
|
28
|
+
@type_inference_dependencies = []
|
29
|
+
@type_inference_methods_calls =[]
|
27
30
|
extract_content_of_files
|
28
31
|
extract_dependencies
|
32
|
+
#break type = TypeInferenceChecker.new
|
29
33
|
end
|
30
34
|
|
31
|
-
def extract_content_of_files
|
35
|
+
def extract_content_of_files(file_extractor = Archruby::Architecture::FileContent)
|
32
36
|
return if !@classes.empty?
|
33
37
|
file_extractor = file_extractor.new(@base_directory)
|
34
38
|
@config_definition.files.each do |file|
|
35
|
-
file_content = file_extractor.all_content_from_directory
|
39
|
+
file_content = file_extractor.all_content_from_directory(file)
|
36
40
|
@files_and_contents << file_content
|
37
41
|
end
|
38
42
|
end
|
39
43
|
|
40
|
-
def extract_dependencies
|
44
|
+
def extract_dependencies(ruby_parser = Archruby::Ruby::Parser)
|
41
45
|
return if !@classes.empty?
|
42
46
|
@files_and_contents.each do |file_and_content|
|
43
47
|
file_and_content.each do |file_name, content|
|
@@ -47,6 +51,8 @@ module Archruby
|
|
47
51
|
@classes_and_dependencies << parser.classes_and_dependencies
|
48
52
|
@class_methods_and_deps << parser.type_inference
|
49
53
|
@class_methods_calls << parser.method_calls
|
54
|
+
@type_inference_dependencies << parser.type_propagation_parser.dependencies
|
55
|
+
@type_inference_methods_calls << parser.type_propagation_parser.method_definitions
|
50
56
|
end
|
51
57
|
end
|
52
58
|
@classes << @config_definition.gems
|
@@ -54,21 +60,27 @@ module Archruby
|
|
54
60
|
@dependencies.flatten!
|
55
61
|
@class_methods_and_deps.flatten!
|
56
62
|
@class_methods_calls.flatten!
|
63
|
+
@type_inference_dependencies.flatten!
|
64
|
+
@type_inference_methods_calls.flatten!
|
57
65
|
end
|
58
66
|
|
59
|
-
def add_new_dep
|
60
|
-
if !type_inference_dep.
|
61
|
-
new_dep = Archruby::Architecture::Dependency.new(type_inference_dep
|
62
|
-
@dependencies << type_inference_dep
|
67
|
+
def add_new_dep(class_name, type_inference_dep)
|
68
|
+
if !type_inference_dep.nil? && !already_has_dependency?(class_name, type_inference_dep)
|
69
|
+
new_dep = Archruby::Architecture::Dependency.new(type_inference_dep, nil)
|
70
|
+
@dependencies << type_inference_dep
|
63
71
|
@classes_and_dependencies.each do |class_and_dep|
|
64
72
|
if class_and_dep.keys.first.eql?(class_name)
|
65
73
|
class_and_dep[class_and_dep.keys.first].push(new_dep)
|
66
74
|
end
|
67
75
|
end
|
68
76
|
end
|
77
|
+
# aqui precisamos tomar cuidado quando a classe ainda não está na estrutura
|
78
|
+
# classes and dependencies (tem exemplo disso no findmeontwitter)
|
79
|
+
# precisamos verificar se a dependencia foi adicionada, e caso não tenha sido
|
80
|
+
# devemos adicionar ao final do loop
|
69
81
|
end
|
70
82
|
|
71
|
-
def already_has_dependency?
|
83
|
+
def already_has_dependency?(class_name, class_dep)
|
72
84
|
has_dep = false
|
73
85
|
@classes_and_dependencies.each do |class_and_dep|
|
74
86
|
if class_and_dep.keys.first.eql?(class_name)
|
@@ -83,7 +95,8 @@ module Archruby
|
|
83
95
|
has_dep
|
84
96
|
end
|
85
97
|
|
86
|
-
def is_mine?
|
98
|
+
def is_mine?(class_name)
|
99
|
+
#binding.pry
|
87
100
|
splited_class_name = class_name.split('::')
|
88
101
|
first_class_name = splited_class_name.first
|
89
102
|
is_mine = false
|
@@ -150,10 +163,10 @@ module Archruby
|
|
150
163
|
@classes.empty?
|
151
164
|
end
|
152
165
|
|
153
|
-
def verify_constraints
|
154
|
-
required_breaks = verify_required
|
155
|
-
forbidden_breaks = verify_forbidden
|
156
|
-
allowed_breaks = verify_allowed
|
166
|
+
def verify_constraints(architecture)
|
167
|
+
required_breaks = verify_required(architecture)
|
168
|
+
forbidden_breaks = verify_forbidden(architecture)
|
169
|
+
allowed_breaks = verify_allowed(architecture)
|
157
170
|
all_constraints_breaks = [required_breaks, forbidden_breaks, allowed_breaks].flatten
|
158
171
|
all_constraints_breaks.delete(nil)
|
159
172
|
all_constraints_breaks
|
@@ -161,7 +174,7 @@ module Archruby
|
|
161
174
|
|
162
175
|
# Verifica todas as classes do modulo
|
163
176
|
# Cada uma deve, de alguma forma, depender dos modulos que estao listados como required
|
164
|
-
def verify_required
|
177
|
+
def verify_required(architecture)
|
165
178
|
return if @config_definition.required_modules.empty?
|
166
179
|
breaks = []
|
167
180
|
@classes_and_dependencies.each_with_index do |class_and_depencies, index|
|
@@ -197,7 +210,7 @@ module Archruby
|
|
197
210
|
breaks
|
198
211
|
end
|
199
212
|
|
200
|
-
def verify_forbidden
|
213
|
+
def verify_forbidden(architecture)
|
201
214
|
return if @config_definition.forbidden_modules.empty?
|
202
215
|
breaks = []
|
203
216
|
@classes_and_dependencies.each do |class_and_depencies|
|
@@ -222,7 +235,7 @@ module Archruby
|
|
222
235
|
breaks
|
223
236
|
end
|
224
237
|
|
225
|
-
def verify_allowed
|
238
|
+
def verify_allowed(architecture)
|
226
239
|
return if @config_definition.allowed_modules.empty?
|
227
240
|
breaks = []
|
228
241
|
@classes_and_dependencies.each do |class_and_depencies|
|