forked from sagemath/sage
-
Notifications
You must be signed in to change notification settings - Fork 0
/
utils.py
45 lines (35 loc) · 1.33 KB
/
utils.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
import ast
from functools import lru_cache
from typing import List
@lru_cache(maxsize=10)
def get_std_modules() -> List:
from stdlib_list import stdlib_list
all_libs = set()
for py_ver in ("2.7", "3.6", "3.7", "3.8"):
all_libs.update(stdlib_list(py_ver))
return list(all_libs)
def get_all_modules_imported_script(script_file: str) -> set:
modules = set()
def visit_Import(node):
for name in node.names:
modules.add(name.name.split(".")[0])
def visit_ImportFrom(node):
# if node.module is missing it's a "from . import ..." statement
# if level > 0 it's a "from .submodule import ..." statement
if node.module is not None and node.level == 0:
modules.add(node.module.split(".")[0])
node_iter = ast.NodeVisitor()
node_iter.visit_Import = visit_Import
node_iter.visit_ImportFrom = visit_ImportFrom
with open(script_file, "r") as f:
node_iter.visit(ast.parse(f.read()))
return modules
def get_vendored_dependencies(script_file: str) -> List:
all_std_modules = get_std_modules()
all_modules_used = get_all_modules_imported_script(script_file)
vendored_modules = []
for dep in all_modules_used:
if dep in all_std_modules:
continue
vendored_modules.append(dep.lower())
return vendored_modules