Class: ImportGraph::Parser::ThirdParty
- Inherits:
-
Object
- Object
- ImportGraph::Parser::ThirdParty
- Defined in:
- lib/import_graph/parser/third_party.rb
Overview
Directories that use a third party autoloader (Zeitwerk) are not straightforward to parse for. In this case, ‘rubrowser` is used to scan for defined constants and if any file is found using that constant, we call it a dependent file.
Instance Method Summary collapse
-
#initialize(dir_path) ⇒ ThirdParty
constructor
A new instance of ThirdParty.
- #parse ⇒ Object
-
#run_rubrowser ⇒ Object
runs rubrowser and returns a Ruby hash with constant definitions and the files they were defined in.
Constructor Details
#initialize(dir_path) ⇒ ThirdParty
Returns a new instance of ThirdParty.
10 11 12 |
# File 'lib/import_graph/parser/third_party.rb', line 10 def initialize(dir_path) @dir_path = dir_path end |
Instance Method Details
#parse ⇒ Object
14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
# File 'lib/import_graph/parser/third_party.rb', line 14 def parse return @dependency_graph unless @dependency_graph.nil? obj = run_rubrowser # Create a hash linking constant definitions with the file they were defined in definitions = {} obj['definitions'].each do |definition| definitions[definition['namespace']] = definition['file'] end # Go through the relations, if a file uses a certain constant # add the file for that constant definition in the adjacency list @dependency_graph = {} obj['relations'].each do |reln| if definitions.key? reln['resolved_namespace'] @dependency_graph[reln['file']] = [] unless @dependency_graph.key? reln['file'] @dependency_graph[reln['file']] << definitions[reln['resolved_namespace']] end end @dependency_graph end |
#run_rubrowser ⇒ Object
runs rubrowser and returns a Ruby hash with constant definitions and the files they were defined in. Also a list of relations, i.e Which constant was used in which file
41 42 43 44 |
# File 'lib/import_graph/parser/third_party.rb', line 41 def run_rubrowser json_output = `rubrowser -j #{@dir_path}` JSON.parse(json_output) end |