2 from lib.utils import Schema
3 from .common import DirectoryTracker
6 Enumerables = Schema(Schema.Union(list, tuple))
7 Primitives = Schema(Schema.Union(str, int, bool))
9 def __init__(self, name):
14 def __add_accessor(self, accessor, type):
16 if isinstance(accessor, str):
18 self.__accessors[acc.name] = acc
20 def subscope(self, accessor):
21 self.__add_accessor(accessor, ScopeAccessor)
23 def file_subscope(self, accessor):
24 self.__add_accessor(accessor, FileScopeAccessor)
27 return self.__accessors.values()
30 for v in self.__accessors.values():
33 def context_name(self):
34 return f"__SC{self.name}"
36 def __getitem__(self, name):
37 if name not in self.__accessors:
39 return self.__accessors[name]
41 def __setitem__(self, name, val):
45 def __init__(self, name):
49 self._active_context = None
58 self.__load_build_context()
60 if ScopeProvider.Enumerables == x:
65 if ScopeProvider.Primitives == x:
69 raise Exception(f"invalid value '{x}' of type ('{type(x).__name__}')")
71 def put_value(self, x):
72 self.__values.append(x)
74 def __load_build_context(self):
75 self._active_context = None
76 for f in inspect.stack():
77 if "__LBUILD__" not in f.frame.f_globals:
79 self._active_context = f.frame.f_globals
81 if not self._active_context:
83 f"unable to modify '{self.name}' outside build context)")
85 def __iadd__(self, other):
88 class FileScopeAccessor(ScopeAccessor):
89 def __init__(self, name):
90 super().__init__(name)
92 def put_value(self, x):
93 tracker = DirectoryTracker.get(self._active_context)
94 x = str(tracker.active_relative() / x)
95 return super().put_value(x)