Show More
Commit Description:
merge latest feature to master branch
Commit Description:
merge latest feature to master branch
References:
File last commit:
Show/Diff file:
Action:
lib/assets/Lib/VFS_import.py
| 87 lines
| 3.1 KiB
| text/x-python
| PythonLexer
|
r584 | import os | |||
from browser import doc | ||||
#_scripts=doc.createElement('script') | ||||
#_scripts.src="/src/py_VFS.js" | ||||
#_scripts.type="text/javascript" | ||||
#doc.get(tag='head')[0].appendChild(_scripts) | ||||
VFS=dict(JSObject(__BRYTHON__.py_VFS)) | ||||
class VFSModuleFinder: | ||||
def __init__(self, path_entry): | ||||
print("in VFSModuleFinder") | ||||
if path_entry.startswith('/libs') or path_entry.startswith('/Lib'): | ||||
self.path_entry=path_entry | ||||
else: | ||||
raise ImportError() | ||||
def __str__(self): | ||||
return '<%s for "%s">' % (self.__class__.__name__, self.path_entry) | ||||
def find_module(self, fullname, path=None): | ||||
path = path or self.path_entry | ||||
#print('looking for "%s" in %s ...' % (fullname, path)) | ||||
for _ext in ['js', 'pyj', 'py']: | ||||
_filepath=os.path.join(self.path_entry, '%s.%s' % (fullname, _ext)) | ||||
if _filepath in VFS: | ||||
print("module found at %s:%s" % (_filepath, fullname)) | ||||
return VFSModuleLoader(_filepath, fullname) | ||||
print('module %s not found' % fullname) | ||||
raise ImportError() | ||||
return None | ||||
class VFSModuleLoader: | ||||
"""Load source for modules""" | ||||
def __init__(self, filepath, name): | ||||
self._filepath=filepath | ||||
self._name=name | ||||
def get_source(self): | ||||
if self._filepath in VFS: | ||||
return JSObject(readFromVFS(self._filepath)) | ||||
raise ImportError('could not find source for %s' % fullname) | ||||
def is_package(self): | ||||
return '.' in self._name | ||||
def load_module(self): | ||||
if self._name in sys.modules: | ||||
#print('reusing existing module from previous import of "%s"' % fullname) | ||||
mod = sys.modules[self._name] | ||||
return mod | ||||
_src=self.get_source() | ||||
if self._filepath.endswith('.js'): | ||||
mod=JSObject(import_js_module(_src, self._filepath, self._name)) | ||||
elif self._filepath.endswith('.py'): | ||||
mod=JSObject(import_py_module(_src, self._filepath, self._name)) | ||||
elif self._filepath.endswith('.pyj'): | ||||
mod=JSObject(import_pyj_module(_src, self._filepath, self._name)) | ||||
else: | ||||
raise ImportError('Invalid Module: %s' % self._filepath) | ||||
# Set a few properties required by PEP 302 | ||||
mod.__file__ = self._filepath | ||||
mod.__name__ = self._name | ||||
mod.__path__ = os.path.abspath(self._filepath) | ||||
mod.__loader__ = self | ||||
mod.__package__ = '.'.join(self._name.split('.')[:-1]) | ||||
if self.is_package(): | ||||
print('adding path for package') | ||||
# Set __path__ for packages | ||||
# so we can find the sub-modules. | ||||
mod.__path__ = [ self.path_entry ] | ||||
else: | ||||
print('imported as regular module') | ||||
print('creating a new module object for "%s"' % self._name) | ||||
sys.modules.setdefault(self._name, mod) | ||||
JSObject(__BRYTHON__.imported)[self._name]=mod | ||||
return mod | ||||
JSObject(__BRYTHON__.path_hooks.insert(0, VFSModuleFinder)) | ||||