diff --git a/jwebsite/content.py b/jwebsite/content.py index bbad7fb..5d15942 100644 --- a/jwebsite/content.py +++ b/jwebsite/content.py @@ -45,6 +45,18 @@ class ContentDirectory(Content): raise NotImplementedError() +class DataField: + def __init__(self, file: "DataFile", value: Any) -> None: + self.__file = file + self.__value = value + + def as_path(self) -> Path: + return self.__file.path.parent / str(self.__value) + + def __str__(self) -> str: + return str(self.__value) + + class DataFile(Content): def __init__(self, path: Path) -> None: super().__init__(path) @@ -52,10 +64,11 @@ class DataFile(Content): self.__data = load(data_file, Loader) def __getitem__(self, key: Any) -> Any: - return self.__data.get(key) + return DataField(self, self.__data.get(key)) def __iter__(self) -> Iterator[Any]: - yield from self.__data + for it in self.__data: + yield DataField(self, it) class MarkdownFile(Content): diff --git a/tests/test_content.py b/tests/test_content.py index 07f719a..f9d43d2 100644 --- a/tests/test_content.py +++ b/tests/test_content.py @@ -25,11 +25,18 @@ def test_load_data(datadir: Path) -> None: content = ContentDirectory(datadir) steven = content.load(Path("otters/steven.yml")) - assert steven["name"] == "Steven" - assert steven["mood"] == "Angry" + assert str(steven["name"]) == "Steven" + assert str(steven["mood"]) == "Angry" otter_list = content.load(Path("otters/otter_list.json")) - assert list(otter_list) == ["steven", "peter"] + assert [str(it) for it in otter_list] == ["steven", "peter"] + + +def test_data_as_path(datadir: Path) -> None: + content = ContentDirectory(datadir) + paths = content.load(Path("otters/paths.yml")) + + assert paths["steven"].as_path() == datadir / "otters" / "relative-steven" def test_load_markdown(datadir: Path) -> None: diff --git a/tests/test_content/otters/paths.yml b/tests/test_content/otters/paths.yml new file mode 100644 index 0000000..405fdb8 --- /dev/null +++ b/tests/test_content/otters/paths.yml @@ -0,0 +1,2 @@ +steven: ./relative-steven +