refactor: do not allow relative content loading

It messes up with the localization system, and brings to much trouble for a feature that will probably encourage bad or convoluted designs
This commit is contained in:
Corentin 2024-05-22 00:46:42 +02:00
parent 7a86eb432c
commit b028477371
5 changed files with 9 additions and 47 deletions

View File

@ -1,5 +1,5 @@
from pathlib import Path from pathlib import Path
from typing import Any, Generic, Iterator, TypeVar from typing import Generic, TypeVar
TData = TypeVar("TData") TData = TypeVar("TData")
@ -26,24 +26,3 @@ class Content(Generic[TData]):
if isinstance(self.__data, bytes): if isinstance(self.__data, bytes):
return self.__data.decode("utf-8") return self.__data.decode("utf-8")
return str(self.__data) return str(self.__data)
class ContentField:
def __init__(self, owner_content_path: Path, value: Any) -> None:
self.__owner_content_path = owner_content_path
self.__value = value
def __getitem__(self, key: Any) -> Any:
return ContentField(self.__owner_content_path, self.__value.get(key))
def __iter__(self) -> Iterator[Any]:
for it in self.__value:
yield ContentField(self.__owner_content_path, it)
def __str__(self) -> str:
return str(self.__value)
def as_path(self) -> Path:
if not isinstance(self.__value, (str, Path)):
raise ValueError("You can't use a field of type %s as a path", type(self.__value))
return self.__owner_content_path.parent / str(self)

View File

@ -10,7 +10,7 @@ from jinja2.environment import Environment
from jinja2.loaders import FileSystemLoader from jinja2.loaders import FileSystemLoader
from jinja2.runtime import Context as JinjaContext from jinja2.runtime import Context as JinjaContext
from jweb.content import Content, ContentField from jweb.content import Content
_DEFAULT_LANGUAGE = "en" _DEFAULT_LANGUAGE = "en"
@ -70,10 +70,7 @@ class Context:
self.__render(source, self.__output_directory / output, **context) self.__render(source, self.__output_directory / output, **context)
@pass_context @pass_context
def __load(self, context: JinjaContext, path: str | Path | ContentField) -> Content[bytes]: def __load(self, context: JinjaContext, path: str | Path) -> Content[bytes]:
if isinstance(path, ContentField):
path = path.as_path()
current_language = self.current_language current_language = self.current_language
if current_language: if current_language:
localized_path = self.__content_directory / current_language / path localized_path = self.__content_directory / current_language / path

View File

@ -2,7 +2,7 @@ from typing import Any
from markdown import Markdown from markdown import Markdown
from jweb.content import Content, ContentField from jweb.content import Content
from jweb.context import Context from jweb.context import Context
@ -27,4 +27,4 @@ class _MarkdownDocument(Content[str]):
@property @property
def meta(self) -> Any: def meta(self) -> Any:
return ContentField(self.__content.path, self.__markdown.Meta) # type: ignore return self.__markdown.Meta # type: ignore

View File

@ -2,7 +2,7 @@ from typing import Any
from yaml import Loader, load from yaml import Loader, load
from jweb.content import Content, ContentField from jweb.content import Content
from jweb.context import Context from jweb.context import Context
@ -10,7 +10,7 @@ def load_extension(context: Context) -> None:
context.add_filters(yaml=_load_yaml) context.add_filters(yaml=_load_yaml)
def _load_yaml(content: Any) -> ContentField: def _load_yaml(content: Any) -> Any:
if not isinstance(content, Content) or not isinstance(content.data, (str, bytes)): if not isinstance(content, Content) or not isinstance(content.data, (str, bytes)):
raise ValueError("yaml filter can only accept byte or string content") raise ValueError("yaml filter can only accept byte or string content")
@ -20,4 +20,4 @@ def _load_yaml(content: Any) -> ContentField:
assert isinstance(data, str) assert isinstance(data, str)
return ContentField(content.path, load(data, Loader)) return load(data, Loader)

View File

@ -1,8 +1,7 @@
from pathlib import Path from pathlib import Path
from pytest import mark, raises from pytest import mark
from jweb.content import ContentField
from jweb.context import Context from jweb.context import Context
@ -34,19 +33,6 @@ def test_load(datadir: Path, path: str | Path) -> None:
assert ouput_file.read() == "Otters\n" assert ouput_file.read() == "Otters\n"
def test_load_content_field(datadir: Path) -> None:
context = Context(datadir)
context.render(
"test-load.html", "output.html", path=ContentField(Path("subdir/dummy.yml"), "content.txt")
)
with open(datadir / "build" / "output.html", encoding="utf-8") as ouput_file:
assert ouput_file.read() == "Weasel\n"
with raises(ValueError):
context.render("test-load.html", "output.html", path=ContentField(Path("subdir"), 42))
def test_load_localized(datadir: Path) -> None: def test_load_localized(datadir: Path) -> None:
context = Context(datadir) context = Context(datadir)
context.load_translations("tests", datadir / "locale", "fr") context.load_translations("tests", datadir / "locale", "fr")