fix: Ensure importability of modules not included in __init__.py files (#5965)

* fix: ensure that modules not included in __init__.py files are importable

* test: add test for module import in custom component
This commit is contained in:
Gabriel Luiz Freitas Almeida 2025-01-28 09:18:40 -03:00 committed by GitHub
commit 0ef54c5ad9
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 27 additions and 1 deletions

View file

@ -244,7 +244,13 @@ def prepare_global_scope(module):
warnings.simplefilter("ignore", LangChainDeprecationWarning)
imported_module = importlib.import_module(node.module)
for alias in node.names:
exec_globals[alias.name] = getattr(imported_module, alias.name)
try:
# First try getting it as an attribute
exec_globals[alias.name] = getattr(imported_module, alias.name)
except AttributeError:
# If that fails, try importing the full module path
full_module_path = f"{node.module}.{alias.name}"
exec_globals[alias.name] = importlib.import_module(full_module_path)
except ModuleNotFoundError as e:
msg = f"Module {node.module} not found. Please install it and try again"
raise ModuleNotFoundError(msg) from e

View file

@ -127,6 +127,26 @@ class MyComponent(CustomComponent):
assert result.value == "test"
def test_create_class_module_import():
code = """
from langflow.custom import CustomComponent
from PIL import ImageDraw
class ExternalClass:
def __init__(self, value):
self.value = value
class MyComponent(CustomComponent):
def build(self):
return ExternalClass("test")
"""
class_name = "MyComponent"
created_class = create_class(code, class_name)
instance = created_class()
result = instance.build()
assert result.value == "test"
def test_create_class_with_multiple_external_classes():
code = """
from langflow.custom import CustomComponent