-
Notifications
You must be signed in to change notification settings - Fork 0
/
local_module.py
109 lines (62 loc) · 2.86 KB
/
local_module.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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
from generalpackager.api.shared import _SharedAPI
from generallibrary import ObjInfo, deco_cache, Recycle, EnvVar, get, import_module
import pkg_resources
class LocalModule(Recycle, _SharedAPI):
""" Tools to interface a Local Python Module. """
_recycle_keys = {"name": lambda name: LocalModule._scrub_name(name=name)}
def __init__(self, name=None):
self.name = self._scrub_name(name=name)
@classmethod
def _scrub_name(cls, name):
return name or "generalpackager"
def __repr__(self):
return self.name
def exists(self):
""" Return whether this API's target exists. """
return bool(import_module(name=self.name, error=False))
@property
@deco_cache()
def module(self):
return import_module(self.name, error=False)
def _filter(self, objInfo):
""" :param ObjInfo objInfo: """
return objInfo.module().__name__.startswith(self.name) and (objInfo.from_class() or objInfo.from_module()) and not objInfo.is_instance()
@property
@deco_cache()
def objInfo(self):
if self.module is None:
return None
objInfo = ObjInfo(self.module)
assert objInfo.is_module()
# objInfo.children_states = ObjInfo.children_states.copy()
# objInfo.children_states[ObjInfo.is_instance] = False
objInfo.get_children(depth=-1, filt=self._filter, traverse_excluded=False)
objInfo.disconnect(lambda node: not self._filter(node))
return objInfo
@deco_cache()
def get_env_vars(self):
""" Get a list of EnvVar instances available directly in module.
:rtype: list[generallibrary.EnvVar] """
new_objInfo = ObjInfo(self.module)
new_objInfo.all_identifiers = [] # Bad fix for bad circularity prevention
return [objInfo.obj for objInfo in new_objInfo.get_children() if isinstance(objInfo.obj, EnvVar)]
@staticmethod
@deco_cache()
def get_all_local_modules():
""" Get a list of all available LocalModules. """
return [LocalModule(name=pkg.project_name) for pkg in pkg_resources.working_set]
@deco_cache()
def get_dependencies(self):
""" Get a list of LocalModules that this module depends on. """
pkg = get(pkg_resources.working_set.by_key, self.name.lower())
if not pkg:
return []
try:
requires = pkg.requires()
except FileNotFoundError:
return []
return [LocalModule(name=str(name)) for name in requires]
@deco_cache()
def get_dependants(self):
""" Get a list of LocalModules that depend on this module. """
return [local_module for local_module in self.get_all_local_modules() if self in local_module.get_dependencies()]