From 729bde2f55e54f284dfb6fe75cfcb1738579c47e Mon Sep 17 00:00:00 2001 From: Daniel Fichtinger Date: Sun, 15 Jun 2025 22:07:08 -0400 Subject: [PATCH] added metadata parsing --- pyproject.toml | 2 +- src/zona/builder.py | 17 +++++++++++++++-- src/zona/models.py | 4 ++-- src/zona/parser.py | 1 + tests/test_metadata.py | 24 ++++++++++++++++++++++++ uv.lock | 23 ----------------------- 6 files changed, 43 insertions(+), 28 deletions(-) create mode 100644 tests/test_metadata.py diff --git a/pyproject.toml b/pyproject.toml index be95f13..9ff261f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -9,7 +9,6 @@ authors = [ requires-python = ">=3.12" dependencies = [ "dacite>=1.9.2", - "python-dateutil>=2.9.0.post0", "python-frontmatter>=1.1.0", "typer>=0.16.0", ] @@ -39,6 +38,7 @@ executionEnvironments = [ # off | basic | standard | strict | recommended | all typeCheckingMode = "recommended" reportExplicitAny = false +reportUnusedCallResult = false allowedUntypedLibraries = ["frontmatter"] [tool.ruff] diff --git a/src/zona/builder.py b/src/zona/builder.py index f7ec2f9..a340aec 100644 --- a/src/zona/builder.py +++ b/src/zona/builder.py @@ -1,7 +1,17 @@ -from zona.models import Item +from zona.models import Item, Metadata from pathlib import Path import frontmatter -import os +from dacite import from_dict + + +def split_metadata(path: Path) -> tuple[Metadata, str]: + post = frontmatter.load(str(path)) + meta = post.metadata + metadata = from_dict( + data_class=Metadata, + data=meta, + ) + return metadata, post.content def discover(root: str, out_dir: str) -> list[Item]: @@ -18,6 +28,9 @@ def discover(root: str, out_dir: str) -> list[Item]: for path in base.rglob("*"): if path.is_file(): print(f"{subdir}: {path.relative_to(root_path)}") + if path.name.endswith(".md"): + pass + # page = Frontmatter.read_file(path.name) # TODO: build Item here # items.append(...) return items diff --git a/src/zona/models.py b/src/zona/models.py index 1dffbdb..90b4183 100644 --- a/src/zona/models.py +++ b/src/zona/models.py @@ -1,12 +1,12 @@ from pathlib import Path -from datetime import datetime +from datetime import date from dataclasses import dataclass @dataclass class Metadata: title: str - date: datetime + date: date description: str # add more options later... diff --git a/src/zona/parser.py b/src/zona/parser.py index e69de29..8b13789 100644 --- a/src/zona/parser.py +++ b/src/zona/parser.py @@ -0,0 +1 @@ + diff --git a/tests/test_metadata.py b/tests/test_metadata.py new file mode 100644 index 0000000..a591aa2 --- /dev/null +++ b/tests/test_metadata.py @@ -0,0 +1,24 @@ +from datetime import date +from zona.models import Metadata +from zona.builder import split_metadata +from pathlib import Path + + +def test_split_metadata(tmp_path: Path): + content = """--- +title: Test Post +date: 2025-06-03 +description: This is a test. +--- + +# Hello World + """ + test_file = tmp_path / "test.md" + test_file.write_text(content) + meta, content = split_metadata(test_file) + + assert isinstance(meta, Metadata) + assert meta.title == "Test Post" + assert meta.description == "This is a test." + assert meta.date == date(2025, 6, 3) + assert content == "# Hello World" diff --git a/uv.lock b/uv.lock index 76abafb..85cfefd 100644 --- a/uv.lock +++ b/uv.lock @@ -133,18 +133,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/2f/de/afa024cbe022b1b318a3d224125aa24939e99b4ff6f22e0ba639a2eaee47/pytest-8.4.0-py3-none-any.whl", hash = "sha256:f40f825768ad76c0977cbacdf1fd37c6f7a468e460ea6a0636078f8972d4517e", size = 363797, upload-time = "2025-06-02T17:36:27.859Z" }, ] -[[package]] -name = "python-dateutil" -version = "2.9.0.post0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "six" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", size = 342432, upload-time = "2024-03-01T18:36:20.211Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892, upload-time = "2024-03-01T18:36:18.57Z" }, -] - [[package]] name = "python-frontmatter" version = "1.1.0" @@ -230,15 +218,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686", size = 9755, upload-time = "2023-10-24T04:13:38.866Z" }, ] -[[package]] -name = "six" -version = "1.17.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031, upload-time = "2024-12-04T17:35:28.174Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050, upload-time = "2024-12-04T17:35:26.475Z" }, -] - [[package]] name = "typer" version = "0.16.0" @@ -269,7 +248,6 @@ version = "0.1.0" source = { editable = "." } dependencies = [ { name = "dacite" }, - { name = "python-dateutil" }, { name = "python-frontmatter" }, { name = "typer" }, ] @@ -284,7 +262,6 @@ dev = [ [package.metadata] requires-dist = [ { name = "dacite", specifier = ">=1.9.2" }, - { name = "python-dateutil", specifier = ">=2.9.0.post0" }, { name = "python-frontmatter", specifier = ">=1.1.0" }, { name = "typer", specifier = ">=0.16.0" }, ]