blob: b0b1a13cc34d7966919fc69d7d93c6918dc1b9f1 [file] [log] [blame]
'''
Copyright (c) 2018 Christian Pontesegger
All rights reserved. This program and the accompanying materials
are made available under the terms of the Eclipse Public License v2.0
which accompanies this distribution, and is available at
https://www.eclipse.org/legal/epl-2.0/
Contributors:
* Christian Pontesegger - initial API and implementation
'''
import sys as _pyease_sys
# Fixme: Check version compatibility and refactor
import warnings as _pyease_warnings
with _pyease_warnings.catch_warnings():
_pyease_warnings.simplefilter("ignore")
import imp as _pyease_imp
class _pyease_EASEImporter(object):
"""EASE module loader.
Allows to use classic python import statements to load EASE modules.
.. _PEP 302:
https://www.python.org/dev/peps/pep-0302/#specification-part-1-the-importer-protocol
"""
def find_module(self, fullname, path=None):
"""PEP 302 import finder.
PEP 302 import finder to locate EASE modules. Will accept basically anything that starts with 'eclipse.'.
Args:
fullname (str): fully qualified name of the module
path (str): None for a top-level module, or package.__path__ for submodules or subpackages
Returns:
self for EASE modules and paths, None in any other case
"""
if (fullname == "eclipse") and (path == None):
return self
if fullname.startswith("eclipse."):
return self
return None
def load_module(self, fullname):
"""PEP 302 import loader.
PEP 302 import loader dynamically loads EASE modules into the provided python namespace.
Args:
fullname (str): fully qualified name of the module
Returns:
loaded module instance
Raises:
ImportError when the EASE module could not be located or loaded
"""
if (self.is_module_path(fullname)):
mod = _pyease_sys.modules.setdefault(fullname, _pyease_imp.new_module(fullname))
mod.__file__ = "<%s>" % self.__class__.__name__
mod.__loader__ = self
mod.__path__ = []
mod.__package__ = fullname
return mod
elif (self.is_module(fullname)):
code = self.get_code(fullname)
mod = _pyease_sys.modules.setdefault(fullname, _pyease_imp.new_module(fullname))
mod.__file__ = "<%s>" % self.__class__.__name__
mod.__loader__ = self
mod.__package__ = fullname.rpartition('.')[0]
exec(code, mod.__dict__)
return mod
raise ImportError("No EASE module named '" + fullname + "'")
def is_module(self, fullname):
"""Verify that a FQN matches a module name.
Args:
fullname (str): fully qualified name of the module candidate
Returns:
True when fullname matches a module name
"""
return org.eclipse.ease.lang.python.Pep302ModuleImporter.isModule(fullname)
def is_module_path(self, fullname):
"""Verify that a FQN matches a module path.
Args:
fullname (str): fully qualified name of the path candidate
Returns:
True when fullname matches a package name
"""
return org.eclipse.ease.lang.python.Pep302ModuleImporter.isModulePath(fullname)
def get_code(self, fullname):
"""Create dynamic code parts for module..
Generates dynamic code to access eclipse module.
Args:
fullname (str): fully qualified name of the module
Returns:
generated code as string
"""
return org.eclipse.ease.lang.python.Pep302ModuleImporter.getCode(fullname, globals()["__EASE_MOD_org_eclipse_ease_modules_EnvironmentModule"])
# Add our import hook to sys.meta_path
_pyease_sys.meta_path.append(_pyease_EASEImporter())