How does unidep work?
Our notion of dependency
The notion of dependency might seem trivial, but it truly is not that obvious. Dependencies between functions and between files are discussed in this chapter.
unidep overview
Here is a diagram of the internal flow between components of unidep used to extract dependencies:
flowchart TB
subgraph Loader
in_loader(["Unresolved file paths"]) --> ts_loader["Tree sitter"]
ts_loader --> ts_ast(["Tree sitter AST"])
end
subgraph Resolvers
direction LR
resolver_ast(["Tree sitter AST"]) --> resolver["Language-specific resolver"]
resolver_unmod_in(["Unresolved functions"]) --> resolver
resolver --> resolver_deps(["Resolved dependencies"])
resolver --> resolver_undeps(["Unresolved functions"])
resolver --> resolver_unmod(["Unresolved module names"])
end
subgraph Explorers
direction LR
in_explorer(["Unresolved module names"]) --> explorer["Language-specific explorer"]
explorer --> out_explorer(["Unresolved file paths"])
end
start(["Path of codebase"]) --> Loader
Loader --> Resolvers
Resolvers --> Explorers
Explorers --> Loader
Resolvers --> deps(["Dependencies"])
Two components only are language-specific: the resolvers and the explorers. This modularity facilitates support of new languages by unidep.