Source code for beamds.beam.auto.utils
import ast
import importlib
import sys
from ..path import beam_path
[docs]
class ImportCollector(ast.NodeVisitor):
def __init__(self):
self.import_nodes = []
[docs]
def visit_Import(self, node):
self.import_nodes.append(node)
self.generic_visit(node)
[docs]
def visit_ImportFrom(self, node):
self.import_nodes.append(node)
self.generic_visit(node)
[docs]
def get_origin(module_name_or_spec):
if type(module_name_or_spec) is str:
module_name = module_name_or_spec
try:
spec = importlib.util.find_spec(module_name)
except:
return None
if spec is None:
return None
else:
spec = module_name_or_spec
if hasattr(spec, 'origin') and spec.origin is not None:
if spec.origin == 'built-in':
return spec.origin
origin = str(beam_path(spec.origin).resolve())
else:
try:
origin = str(beam_path(spec.submodule_search_locations[0]).resolve())
except:
origin = None
return origin
[docs]
def get_module_paths(spec):
if spec is None:
return []
paths = []
if hasattr(spec, 'origin') and spec.origin is not None:
origin = beam_path(spec.origin).resolve()
if origin.is_file() and origin.parent.joinpath('__init__.py').is_file():
origin = origin.parent
paths.append(str(origin))
if hasattr(spec, 'submodule_search_locations') and spec.submodule_search_locations is not None:
for path in spec.submodule_search_locations:
path = beam_path(path).resolve()
if path.is_file():
path = path.parent
paths.append(str(path))
return list(set(paths))
[docs]
def classify_module(module_name):
origin = get_origin(module_name)
if origin == 'built-in':
return "stdlib"
if origin is None:
return None
# Get the standard library path using base_exec_prefix
std_lib_path = beam_path(sys.base_exec_prefix).joinpath('lib')
# Check for standard library
if beam_path(origin).parts[:len(std_lib_path.parts)] == std_lib_path.parts:
return "stdlib"
# Check for installed packages in site-packages or dist-packages
elif "site-packages" in origin or "dist-packages" in origin:
return "installed"
# Otherwise, it's a custom module
else:
return "custom"
[docs]
def is_std_lib(module_name):
return classify_module(module_name) == 'stdlib'
[docs]
def is_installed_package(module_name):
return classify_module(module_name) == 'installed'
[docs]
def is_module_installed(module_name):
try:
importlib.metadata.version(module_name)
return True
except importlib.metadata.PackageNotFoundError:
return False