Skip to content

Commit 63487fd

Browse files
committed
Rename fields to _qualified_name
1 parent 42b02d1 commit 63487fd

File tree

3 files changed

+41
-36
lines changed

3 files changed

+41
-36
lines changed

src/data_designer/plugins/plugin.py

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -62,8 +62,13 @@ def _check_class_exists_in_file(filepath: str, class_name: str) -> None:
6262

6363

6464
class Plugin(BaseModel):
65-
task_class_name: str = Field(..., description="The fully-qualified import path to the task class object")
66-
config_class_name: str = Field(..., description="The fully-qualified import path to the config class object")
65+
task_qualified_name: str = Field(
66+
...,
67+
description="The fully-qualified name of the task class object, e.g. 'my_plugin.generator.MyColumnGenerator'",
68+
)
69+
config_qualified_name: str = Field(
70+
..., description="The fully-qualified name o the config class object, e.g. 'my_plugin.config.MyConfig'"
71+
)
6772
plugin_type: PluginType = Field(..., description="The type of plugin")
6873
emoji: str = Field(default="🔌", description="The emoji to use in logs related to the plugin")
6974

@@ -83,7 +88,7 @@ def name(self) -> str:
8388
def discriminator_field(self) -> str:
8489
return self.plugin_type.discriminator_field
8590

86-
@field_validator("task_class_name", "config_class_name", mode="after")
91+
@field_validator("task_qualified_name", "config_qualified_name", mode="after")
8792
@classmethod
8893
def validate_class_name(cls, value: str) -> str:
8994
module_name, object_name = _get_module_and_object_names(value)
@@ -101,7 +106,7 @@ def validate_class_name(cls, value: str) -> str:
101106

102107
@model_validator(mode="after")
103108
def validate_discriminator_field(self) -> Self:
104-
_, cfg = _get_module_and_object_names(self.config_class_name)
109+
_, cfg = _get_module_and_object_names(self.config_qualified_name)
105110
field = self.plugin_type.discriminator_field
106111
if field not in self.config_cls.model_fields:
107112
raise ValueError(f"Discriminator field {field!r} not found in config class {cfg!r}")
@@ -121,11 +126,11 @@ def validate_discriminator_field(self) -> Self:
121126

122127
@cached_property
123128
def config_cls(self) -> type[ConfigBase]:
124-
return self._load(self.config_class_name)
129+
return self._load(self.config_qualified_name)
125130

126131
@cached_property
127132
def task_cls(self) -> type[ConfigurableTask]:
128-
return self._load(self.task_class_name)
133+
return self._load(self.task_qualified_name)
129134

130135
@staticmethod
131136
def _load(fully_qualified_object: str) -> type:

tests/plugins/test_plugin.py

Lines changed: 26 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@
1717
def valid_plugin() -> Plugin:
1818
"""Fixture providing a valid plugin instance for testing."""
1919
return Plugin(
20-
task_class_name=f"{MODULE_NAME}.ValidTestTask",
21-
config_class_name=f"{MODULE_NAME}.ValidTestConfig",
20+
task_qualified_name=f"{MODULE_NAME}.ValidTestTask",
21+
config_qualified_name=f"{MODULE_NAME}.ValidTestConfig",
2222
plugin_type=PluginType.COLUMN_GENERATOR,
2323
)
2424

@@ -72,8 +72,8 @@ def test_validation_fails_when_config_missing_discriminator_field() -> None:
7272

7373
with pytest.raises(ValueError, match="Discriminator field 'column_type' not found in config class"):
7474
Plugin(
75-
task_class_name=f"{MODULE_NAME}.ValidTestTask",
76-
config_class_name=f"{MODULE_NAME}.ConfigWithoutDiscriminator",
75+
task_qualified_name=f"{MODULE_NAME}.ValidTestTask",
76+
config_qualified_name=f"{MODULE_NAME}.ConfigWithoutDiscriminator",
7777
plugin_type=PluginType.COLUMN_GENERATOR,
7878
)
7979

@@ -82,8 +82,8 @@ def test_validation_fails_when_discriminator_field_not_literal_type() -> None:
8282
"""Test validation fails when discriminator field is not a Literal type."""
8383
with pytest.raises(ValueError, match="Field 'column_type' of .* must be a Literal type"):
8484
Plugin(
85-
task_class_name=f"{MODULE_NAME}.ValidTestTask",
86-
config_class_name=f"{MODULE_NAME}.ConfigWithStringField",
85+
task_qualified_name=f"{MODULE_NAME}.ValidTestTask",
86+
config_qualified_name=f"{MODULE_NAME}.ConfigWithStringField",
8787
plugin_type=PluginType.COLUMN_GENERATOR,
8888
)
8989

@@ -92,8 +92,8 @@ def test_validation_fails_when_discriminator_default_not_string() -> None:
9292
"""Test validation fails when discriminator field default is not a string."""
9393
with pytest.raises(ValueError, match="The default of 'column_type' must be a string"):
9494
Plugin(
95-
task_class_name=f"{MODULE_NAME}.ValidTestTask",
96-
config_class_name=f"{MODULE_NAME}.ConfigWithNonStringDefault",
95+
task_qualified_name=f"{MODULE_NAME}.ValidTestTask",
96+
config_qualified_name=f"{MODULE_NAME}.ConfigWithNonStringDefault",
9797
plugin_type=PluginType.COLUMN_GENERATOR,
9898
)
9999

@@ -102,8 +102,8 @@ def test_validation_fails_with_invalid_enum_key_conversion() -> None:
102102
"""Test validation fails when default value cannot be converted to valid Python identifier."""
103103
with pytest.raises(ValueError, match="cannot be converted to a valid enum key"):
104104
Plugin(
105-
task_class_name=f"{MODULE_NAME}.ValidTestTask",
106-
config_class_name=f"{MODULE_NAME}.ConfigWithInvalidKey",
105+
task_qualified_name=f"{MODULE_NAME}.ValidTestTask",
106+
config_qualified_name=f"{MODULE_NAME}.ConfigWithInvalidKey",
107107
plugin_type=PluginType.COLUMN_GENERATOR,
108108
)
109109

@@ -112,52 +112,52 @@ def test_validation_fails_with_invalid_modules() -> None:
112112
"""Test validation fails when task or config class modules are invalid."""
113113
with pytest.raises(PluginLoadError, match="Could not find module"):
114114
Plugin(
115-
task_class_name=f"{MODULE_NAME}.ValidTestTask",
116-
config_class_name="invalid.module.ValidTestConfig",
115+
task_qualified_name=f"{MODULE_NAME}.ValidTestTask",
116+
config_qualified_name="invalid.module.ValidTestConfig",
117117
plugin_type=PluginType.COLUMN_GENERATOR,
118118
)
119119

120120
with pytest.raises(PluginLoadError, match="Could not find module"):
121121
Plugin(
122-
task_class_name="invalid.module.ValidTestTask",
123-
config_class_name=f"{MODULE_NAME}.ValidTestConfig",
122+
task_qualified_name="invalid.module.ValidTestTask",
123+
config_qualified_name=f"{MODULE_NAME}.ValidTestConfig",
124124
plugin_type=PluginType.COLUMN_GENERATOR,
125125
)
126126

127127
with pytest.raises(PluginLoadError, match="Expected a fully-qualified object name"):
128128
Plugin(
129-
task_class_name="ValidTestTask",
130-
config_class_name="ValidTestConfig",
129+
task_qualified_name="ValidTestTask",
130+
config_qualified_name="ValidTestConfig",
131131
plugin_type=PluginType.COLUMN_GENERATOR,
132132
)
133133

134134
with pytest.raises(PluginLoadError, match="Could not find class"):
135135
Plugin(
136-
task_class_name=f"{MODULE_NAME}.ValidTestTask",
137-
config_class_name=f"{MODULE_NAME}.NotADefinedClass",
136+
task_qualified_name=f"{MODULE_NAME}.ValidTestTask",
137+
config_qualified_name=f"{MODULE_NAME}.NotADefinedClass",
138138
plugin_type=PluginType.COLUMN_GENERATOR,
139139
)
140140

141141
with pytest.raises(PluginLoadError, match="Could not find class"):
142142
Plugin(
143-
task_class_name=f"{MODULE_NAME}.NotADefinedClass",
144-
config_class_name=f"{MODULE_NAME}.ValidTestConfig",
143+
task_qualified_name=f"{MODULE_NAME}.NotADefinedClass",
144+
config_qualified_name=f"{MODULE_NAME}.ValidTestConfig",
145145
plugin_type=PluginType.COLUMN_GENERATOR,
146146
)
147147

148148

149149
def test_helper_utility_identifies_invalid_classes() -> None:
150150
"""Test the helper utility provides deeper validation of config classes."""
151151
valid_plugin = Plugin(
152-
task_class_name=f"{MODULE_NAME}.ValidTestTask",
153-
config_class_name=f"{MODULE_NAME}.ValidTestConfig",
152+
task_qualified_name=f"{MODULE_NAME}.ValidTestTask",
153+
config_qualified_name=f"{MODULE_NAME}.ValidTestConfig",
154154
plugin_type=PluginType.COLUMN_GENERATOR,
155155
)
156156
assert_valid_plugin(valid_plugin)
157157

158158
plugin_with_improper_task_class_type = Plugin(
159-
task_class_name=f"{MODULE_NAME}.ValidTestConfig",
160-
config_class_name=f"{MODULE_NAME}.ValidTestConfig",
159+
task_qualified_name=f"{MODULE_NAME}.ValidTestConfig",
160+
config_qualified_name=f"{MODULE_NAME}.ValidTestConfig",
161161
plugin_type=PluginType.COLUMN_GENERATOR,
162162
)
163163
with pytest.raises(AssertionError):
@@ -172,8 +172,8 @@ def test_helper_utility_identifies_invalid_classes() -> None:
172172
def test_plugin_works_with_real_sampler_column_generator() -> None:
173173
"""Test that Plugin works with actual SamplerColumnGenerator from the codebase."""
174174
plugin = Plugin(
175-
task_class_name="data_designer.engine.column_generators.generators.samplers.SamplerColumnGenerator",
176-
config_class_name="data_designer.config.column_configs.SamplerColumnConfig",
175+
task_qualified_name="data_designer.engine.column_generators.generators.samplers.SamplerColumnGenerator",
176+
config_qualified_name="data_designer.config.column_configs.SamplerColumnConfig",
177177
plugin_type=PluginType.COLUMN_GENERATOR,
178178
)
179179

tests/plugins/test_plugin_registry.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,17 +22,17 @@
2222
@pytest.fixture
2323
def plugin_a() -> Plugin:
2424
return Plugin(
25-
task_class_name=f"{MODULE_NAME}.StubPluginTaskA",
26-
config_class_name=f"{MODULE_NAME}.StubPluginConfigA",
25+
task_qualified_name=f"{MODULE_NAME}.StubPluginTaskA",
26+
config_qualified_name=f"{MODULE_NAME}.StubPluginConfigA",
2727
plugin_type=PluginType.COLUMN_GENERATOR,
2828
)
2929

3030

3131
@pytest.fixture
3232
def plugin_b() -> Plugin:
3333
return Plugin(
34-
task_class_name=f"{MODULE_NAME}.StubPluginTaskB",
35-
config_class_name=f"{MODULE_NAME}.StubPluginConfigB",
34+
task_qualified_name=f"{MODULE_NAME}.StubPluginTaskB",
35+
config_qualified_name=f"{MODULE_NAME}.StubPluginConfigB",
3636
plugin_type=PluginType.COLUMN_GENERATOR,
3737
)
3838

0 commit comments

Comments
 (0)