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.