Skip to content

Commit 6ecfc3d

Browse files
fix: add user feedback message for unsupported file type
1 parent d42897f commit 6ecfc3d

5 files changed

Lines changed: 75 additions & 10 deletions

File tree

src/dve/core_engine/models.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,9 @@ def _ensure_just_file_stem(
8282
@property
8383
def file_name_with_ext(self):
8484
"""Return file name with extension."""
85-
return f"{self.file_name}.{self.file_extension}"
85+
if self.file_extension:
86+
return f"{self.file_name}.{self.file_extension}"
87+
return self.file_name
8688

8789
@classmethod
8890
def from_metadata_file(cls, submission_id: str, metadata_uri: Location):

src/dve/pipeline/pipeline.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -215,10 +215,10 @@ def write_file_to_parquet(
215215

216216
for model_name, model in models.items():
217217
self._logger.info(f"Transforming {model_name} to stringified parquet")
218-
reader: BaseFileReader = load_reader(
219-
dataset, model_name, ext, self.backend_reader_kwargs
220-
)
221218
try:
219+
reader: BaseFileReader = load_reader(
220+
dataset, model_name, ext, self.backend_reader_kwargs
221+
)
222222
if not entity_type:
223223
reader.write_parquet(
224224
reader.read_to_py_iterator(

src/dve/pipeline/utils.py

Lines changed: 30 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,11 @@
1111
import dve.core_engine.backends.implementations.duckdb # pylint: disable=unused-import
1212
import dve.core_engine.backends.implementations.spark # pylint: disable=unused-import
1313
import dve.parser.file_handling as fh
14+
from dve.core_engine.backends.exceptions import MessageBearingError
1415
from dve.core_engine.backends.readers import _READER_REGISTRY
1516
from dve.core_engine.configuration.v1 import SchemaName, V1EngineConfig, _ModelConfig
1617
from dve.core_engine.loggers import get_logger
18+
from dve.core_engine.message import FeedbackMessage
1719
from dve.core_engine.type_hints import URI, SubmissionResult
1820
from dve.metadata_parser.model_generator import JSONtoPyd
1921

@@ -52,11 +54,34 @@ def load_reader(
5254
backend_reader_kwargs: Optional[dict[str, Any]] = None,
5355
):
5456
"""Loads the readers for the diven feed, model name and file extension"""
55-
reader_config = dataset[model_name].reader_config[f".{file_extension.lower()}"]
56-
reader = _READER_REGISTRY[reader_config.reader](
57-
**reader_config.kwargs_, **backend_reader_kwargs if backend_reader_kwargs else {}
58-
)
59-
return reader
57+
try:
58+
reader_config = dataset[model_name].reader_config[f".{file_extension.lower()}"]
59+
reader = _READER_REGISTRY[reader_config.reader](
60+
**reader_config.kwargs_, **backend_reader_kwargs if backend_reader_kwargs else {}
61+
)
62+
return reader
63+
except KeyError as exc:
64+
if file_extension:
65+
err_msg = (
66+
f"The supplied file extension `{file_extension if file_extension else None}`"
67+
+f" is not a supported file format for {model_name}."
68+
)
69+
else:
70+
err_msg = "No supplied file extension. Unable to parse file without a file extension."
71+
72+
raise MessageBearingError(
73+
"The file extension provided is not supported.",
74+
messages=[
75+
FeedbackMessage(
76+
entity=model_name,
77+
record=None,
78+
failure_type="submission",
79+
error_location="Whole File",
80+
error_code="InvalidFileExtension",
81+
error_message=err_msg,
82+
)
83+
],
84+
) from exc
6085

6186

6287
def unpersist_all_rdds(spark: SparkSession):

tests/features/planets.feature

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,9 @@ Feature: Pipeline tests using the planets dataset
4343
And I add initial audit entries for the submission
4444
Then the latest audit record for the submission is marked with processing status file_transformation
4545
When I run the file transformation phase
46-
Then the latest audit record for the submission is marked with processing status failed
46+
Then the latest audit record for the submission is marked with processing status error_report
47+
When I run the error report phase
48+
Then An error report is produced
4749

4850
Scenario: Handle a file with duplicated extension provided (spark)
4951
Given I submit the planets file planets.csv.csv for processing
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
from dve.core_engine.backends.exceptions import MessageBearingError
2+
from dve.core_engine.configuration.v1 import _ModelConfig, _ReaderConfig
3+
from dve.pipeline.utils import load_reader
4+
5+
import pytest
6+
7+
8+
class TestLoadReader:
9+
test_model_config = _ModelConfig(
10+
fields={"test": "str"},
11+
reporting_fields=["test"],
12+
key_field="test",
13+
reader_config={
14+
".csv": _ReaderConfig(reader="TestCsvReader"),
15+
}
16+
)
17+
18+
def test_invalid_load_reader_with_file_ext(self):
19+
with pytest.raises(MessageBearingError) as exc_info:
20+
load_reader(
21+
{"test": self.test_model_config},
22+
"test_model",
23+
"jpeg"
24+
)
25+
26+
assert exc_info.value.messages[0].error_message == "The supplied file extension `jpeg` is not a supported file format for test_model."
27+
28+
def test_invalid_load_reader_missing_file_ext(self):
29+
with pytest.raises(MessageBearingError) as exc_info:
30+
load_reader(
31+
{"test": self.test_model_config},
32+
"test_model",
33+
""
34+
)
35+
36+
assert exc_info.value.messages[0].error_message == "No supplied file extension. Unable to parse file without a file extension."

0 commit comments

Comments
 (0)