Skip to content

Commit 72fc5b4

Browse files
committed
fix: plugins cause circular imports
1 parent 478358c commit 72fc5b4

File tree

2 files changed

+46
-1
lines changed

2 files changed

+46
-1
lines changed

src/data_designer/engine/column_generators/generators/base.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88

99
import pandas as pd
1010

11-
from data_designer.config.column_types import COLUMN_TYPE_EMOJI_MAP
1211
from data_designer.config.models import BaseInferenceParams, ModelConfig
1312
from data_designer.config.utils.type_helpers import StrEnum
1413
from data_designer.engine.configurable_task import ConfigurableTask, ConfigurableTaskMetadata, DataT, TaskConfigT
@@ -82,6 +81,8 @@ def inference_parameters(self) -> BaseInferenceParams:
8281
return self.model_config.inference_parameters
8382

8483
def log_pre_generation(self) -> None:
84+
from data_designer.config.column_types import COLUMN_TYPE_EMOJI_MAP
85+
8586
emoji = COLUMN_TYPE_EMOJI_MAP[self.config.column_type]
8687
logger.info(f"{emoji} Preparing {self.config.column_type} column generation")
8788
logger.info(f" |-- column name: {self.config.name!r}")

tests/plugins/test_plugin_registry.py

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -286,3 +286,47 @@ class DummyConfig(ConfigBase):
286286
assert StubPluginConfigB in updated_union.__args__
287287
assert ConfigBase in updated_union.__args__
288288
assert DummyConfig in updated_union.__args__
289+
290+
291+
# =============================================================================
292+
# Circular Import Prevention Tests
293+
# =============================================================================
294+
295+
296+
def test_plugin_importing_from_base_does_not_cause_circular_import() -> None:
297+
"""Test that a plugin importing from base.py doesn't cause circular imports during discovery."""
298+
import subprocess
299+
import sys
300+
301+
# Run a fresh Python process to test the import chain
302+
# This is necessary because Python caches modules, so we need a clean slate
303+
test_code = """
304+
import sys
305+
306+
# Track which modules trigger plugin discovery
307+
original_modules = set(sys.modules.keys())
308+
309+
# Import base.py - this should NOT cause column_types.py to be imported
310+
from data_designer.engine.column_generators.generators.base import ColumnGenerator
311+
312+
# Check if column_types was imported (which would trigger plugin discovery)
313+
if 'data_designer.config.column_types' in sys.modules:
314+
print("FAIL: column_types was imported when importing base.py")
315+
sys.exit(1)
316+
else:
317+
print("PASS: base.py does not import column_types at module level")
318+
sys.exit(0)
319+
"""
320+
321+
result = subprocess.run(
322+
[sys.executable, "-c", test_code],
323+
capture_output=True,
324+
text=True,
325+
)
326+
327+
assert result.returncode == 0, (
328+
f"Importing base.py triggered column_types.py import, which causes circular imports "
329+
f"for plugins that import from base.py.\n"
330+
f"stdout: {result.stdout}\n"
331+
f"stderr: {result.stderr}"
332+
)

0 commit comments

Comments
 (0)