data_models: handle SyntaxError and ImportError for custom themes

This commit is contained in:
Sina Atalay 2024-03-17 20:46:37 +01:00
parent e554b0b687
commit b61eb5f897
2 changed files with 33 additions and 2 deletions

View File

@ -1014,7 +1014,7 @@ class RenderCVDataModel(RenderCVBaseModel):
if path_to_init_file.exists(): if path_to_init_file.exists():
spec = importlib.util.spec_from_file_location( spec = importlib.util.spec_from_file_location(
"", # this is somehow not required "theme",
path_to_init_file, path_to_init_file,
) )
if spec is None: if spec is None:
@ -1024,7 +1024,13 @@ class RenderCVDataModel(RenderCVBaseModel):
) )
theme_module = importlib.util.module_from_spec(spec) theme_module = importlib.util.module_from_spec(spec)
spec.loader.exec_module(theme_module) # type: ignore try:
spec.loader.exec_module(theme_module) # type: ignore
except SyntaxError or ImportError:
raise ValueError(
f"The custom theme {theme_name}'s __init__.py file is not"
" valid. Please check the file and try again.",
)
ThemeDataModel = getattr( ThemeDataModel = getattr(
theme_module, f"{theme_name.title()}ThemeOptions" # type: ignore theme_module, f"{theme_name.title()}ThemeOptions" # type: ignore

View File

@ -514,3 +514,28 @@ def test_custom_theme_without_init_file(tmp_path, testdata_directory_path):
) )
assert data_model.design.theme == "dummytheme" assert data_model.design.theme == "dummytheme"
def test_custom_theme_with_broken_init_file(tmp_path, testdata_directory_path):
reference_custom_theme_path = (
testdata_directory_path
/ "test_copy_theme_files_to_output_directory_custom_theme"
/ "dummytheme"
)
# copy the directory to tmp_path:
custom_theme_path = tmp_path / "dummytheme"
shutil.copytree(reference_custom_theme_path, custom_theme_path, dirs_exist_ok=True)
# remove the __init__.py file:
init_file = custom_theme_path / "__init__.py"
init_file.write_text("invalid python code", encoding="utf-8")
os.chdir(tmp_path)
with pytest.raises(pydantic.ValidationError):
dm.RenderCVDataModel(
**{ # type: ignore
"cv": {"name": "John Doe"},
"design": {"theme": "dummytheme"},
}
)