[BUGFIX] Do not load YAML unless dict is returned (#541)
This commit is contained in:
parent
e69933d525
commit
f4807aa9a4
2 changed files with 50 additions and 3 deletions
|
|
@ -36,13 +36,18 @@ def load_yaml(file_path: str | Path) -> Dict:
|
||||||
|
|
||||||
try:
|
try:
|
||||||
with open(file_path, "r", encoding="utf-8") as file:
|
with open(file_path, "r", encoding="utf-8") as file:
|
||||||
return yaml.safe_load(file)
|
output = yaml.safe_load(file)
|
||||||
except YAMLError as yaml_exception:
|
except YAMLError as yaml_exception:
|
||||||
logger.debug(yaml_exception)
|
logger.debug(yaml_exception)
|
||||||
raise InvalidYamlException(
|
raise InvalidYamlException(
|
||||||
f"'{file_path}' has invalid YAML, copy-paste it into a YAML checker to find the issue."
|
f"'{file_path}' has invalid YAML, copy-paste it into a YAML checker to find the issue."
|
||||||
) from yaml_exception
|
) from yaml_exception
|
||||||
|
|
||||||
|
if not isinstance(output, dict):
|
||||||
|
raise InvalidYamlException(f"'{file_path}' was specified but does not contain any YAML.")
|
||||||
|
|
||||||
|
return output
|
||||||
|
|
||||||
|
|
||||||
def dump_yaml(to_dump: Dict) -> str:
|
def dump_yaml(to_dump: Dict) -> str:
|
||||||
"""
|
"""
|
||||||
|
|
|
||||||
|
|
@ -35,17 +35,59 @@ def bad_yaml_file_path(bad_yaml) -> str:
|
||||||
FileHandler.delete(tmp_file.name)
|
FileHandler.delete(tmp_file.name)
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.fixture
|
||||||
|
def single_int_file_path(bad_yaml) -> str:
|
||||||
|
# Do not delete the file in the context manager - for Windows compatibility
|
||||||
|
with tempfile.NamedTemporaryFile(suffix=".yaml", delete=False) as tmp_file:
|
||||||
|
tmp_file.write("0".encode("utf-8"))
|
||||||
|
tmp_file.flush()
|
||||||
|
|
||||||
|
try:
|
||||||
|
yield tmp_file.name
|
||||||
|
finally:
|
||||||
|
FileHandler.delete(tmp_file.name)
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.fixture
|
||||||
|
def empty_yaml_file_path(bad_yaml) -> str:
|
||||||
|
# Do not delete the file in the context manager - for Windows compatibility
|
||||||
|
with tempfile.NamedTemporaryFile(suffix=".yaml", delete=False) as tmp_file:
|
||||||
|
pass
|
||||||
|
|
||||||
|
try:
|
||||||
|
yield tmp_file.name
|
||||||
|
finally:
|
||||||
|
FileHandler.delete(tmp_file.name)
|
||||||
|
|
||||||
|
|
||||||
def test_load_yaml_file_not_found():
|
def test_load_yaml_file_not_found():
|
||||||
file_path = "does_not_exist.yaml"
|
file_path = "does_not_exist.yaml"
|
||||||
with pytest.raises(FileNotFoundException, match=f"The file '{file_path}' does not exist."):
|
with pytest.raises(FileNotFoundException, match=f"The file '{file_path}' does not exist."):
|
||||||
load_yaml(file_path=file_path)
|
load_yaml(file_path=file_path)
|
||||||
|
|
||||||
|
|
||||||
def test_load_yaml_invalid_syntax(bad_yaml_file_path):
|
def test_load_yaml_invalid_syntax(bad_yaml_file_path: str):
|
||||||
with pytest.raises(
|
with pytest.raises(
|
||||||
InvalidYamlException,
|
InvalidYamlException,
|
||||||
match=re.escape(
|
match=re.escape(
|
||||||
f"'{bad_yaml_file_path}' has invalid YAML, copy-paste it into a YAML checker to find the issue."
|
f"'{bad_yaml_file_path}' has invalid YAML, "
|
||||||
|
f"copy-paste it into a YAML checker to find the issue."
|
||||||
),
|
),
|
||||||
):
|
):
|
||||||
load_yaml(file_path=bad_yaml_file_path)
|
load_yaml(file_path=bad_yaml_file_path)
|
||||||
|
|
||||||
|
|
||||||
|
def test_empty_yaml(empty_yaml_file_path: str):
|
||||||
|
with pytest.raises(
|
||||||
|
InvalidYamlException,
|
||||||
|
match=re.escape(f"'{empty_yaml_file_path}' was specified but does not contain any YAML."),
|
||||||
|
):
|
||||||
|
load_yaml(file_path=empty_yaml_file_path)
|
||||||
|
|
||||||
|
|
||||||
|
def test_empty_yaml_only_int(single_int_file_path: str):
|
||||||
|
with pytest.raises(
|
||||||
|
InvalidYamlException,
|
||||||
|
match=re.escape(f"'{single_int_file_path}' was specified but does not contain any YAML."),
|
||||||
|
):
|
||||||
|
load_yaml(file_path=single_int_file_path)
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue