"""For calling errors if a user tries run certain operations in the wrong python environment"""
from importlib import import_module
from typing import Union
package_name = "blendersynth"
[docs]
def conditional_import(
condition: bool, src: str, name: str = None
) -> Union["IllegalImport", object]:
"""
[No longer used in __init__.py, but kept here for reference]
Imports a module if condition,
otherwise returns IllegalImport.
:param condition: If True, import the module
:param src: The module to import
:param name: The name of the module to import. If None, the last part of src is used.
:return: The imported module, or IllegalImport if condition is False
"""
if condition:
if src.startswith("."):
module = import_module(src, package=package_name)
else:
module = import_module(src)
if name is None:
return module
return getattr(module, name if name else src.split(".")[-1])
else:
return IllegalImport()
[docs]
class IllegalImport:
"""Object which raises error on any interaction, to tell users they have used BlenderSynth incorrectly."""
def __init__(self, REQUIRES_BLENDER=True):
self.REQUIRES_BLENDER = REQUIRES_BLENDER
def __call__(self, *args, **kwargs):
raise ImportError(self._message)
def __getattr__(self, name):
raise ImportError(self._message)
@property
def _message(self):
if self.REQUIRES_BLENDER:
return (
"This object can only be used inside a Blender python environment. "
"Make sure that either:"
"\n- bsyn.run_this_script() is run on a previous line"
"\n- This script is being run from another python script, using bsyn.execute_jobs."
)
else:
return "This object can only be used outside a Blender python environment. "