render-engine 2025.10.3a1__tar.gz → 2025.11.1a1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (122) hide show
  1. {render_engine-2025.10.3a1 → render_engine-2025.11.1a1}/.gitignore +2 -0
  2. {render_engine-2025.10.3a1 → render_engine-2025.11.1a1}/PKG-INFO +1 -1
  3. {render_engine-2025.10.3a1 → render_engine-2025.11.1a1}/pyproject.toml +1 -1
  4. render_engine-2025.11.1a1/src/render_engine/__version__.py +34 -0
  5. {render_engine-2025.10.3a1 → render_engine-2025.11.1a1}/src/render_engine/collection.py +18 -0
  6. {render_engine-2025.10.3a1 → render_engine-2025.11.1a1}/src/render_engine/content_managers/base_content_manager.py +6 -0
  7. {render_engine-2025.10.3a1 → render_engine-2025.11.1a1}/src/render_engine/content_managers/file_content_manager.py +21 -0
  8. {render_engine-2025.10.3a1 → render_engine-2025.11.1a1}/src/render_engine/site.py +11 -1
  9. {render_engine-2025.10.3a1 → render_engine-2025.11.1a1}/src/render_engine.egg-info/PKG-INFO +1 -1
  10. {render_engine-2025.10.3a1 → render_engine-2025.11.1a1}/src/render_engine.egg-info/SOURCES.txt +1 -0
  11. {render_engine-2025.10.3a1 → render_engine-2025.11.1a1}/tests/test_collections.py +56 -0
  12. {render_engine-2025.10.3a1 → render_engine-2025.11.1a1}/.all-contributorsrc +0 -0
  13. {render_engine-2025.10.3a1 → render_engine-2025.11.1a1}/.devcontainer/Dockerfile +0 -0
  14. {render_engine-2025.10.3a1 → render_engine-2025.11.1a1}/.devcontainer/devcontainer.json +0 -0
  15. {render_engine-2025.10.3a1 → render_engine-2025.11.1a1}/.devcontainer/setup.sh +0 -0
  16. {render_engine-2025.10.3a1 → render_engine-2025.11.1a1}/.github/FUNDING.yml +0 -0
  17. {render_engine-2025.10.3a1 → render_engine-2025.11.1a1}/.github/ISSUE_TEMPLATE/config.yaml +0 -0
  18. {render_engine-2025.10.3a1 → render_engine-2025.11.1a1}/.github/ISSUE_TEMPLATE/form_issue_template.yml +0 -0
  19. {render_engine-2025.10.3a1 → render_engine-2025.11.1a1}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  20. {render_engine-2025.10.3a1 → render_engine-2025.11.1a1}/.github/dependabot-bot.yml +0 -0
  21. {render_engine-2025.10.3a1 → render_engine-2025.11.1a1}/.github/dependabot.yml +0 -0
  22. {render_engine-2025.10.3a1 → render_engine-2025.11.1a1}/.github/labeler.yml +0 -0
  23. {render_engine-2025.10.3a1 → render_engine-2025.11.1a1}/.github/release.yml +0 -0
  24. {render_engine-2025.10.3a1 → render_engine-2025.11.1a1}/.github/workflows/devcontainer-ci.yml +0 -0
  25. {render_engine-2025.10.3a1 → render_engine-2025.11.1a1}/.github/workflows/labeler.yml +0 -0
  26. {render_engine-2025.10.3a1 → render_engine-2025.11.1a1}/.github/workflows/lint.yml +0 -0
  27. {render_engine-2025.10.3a1 → render_engine-2025.11.1a1}/.github/workflows/publish.yml +0 -0
  28. {render_engine-2025.10.3a1 → render_engine-2025.11.1a1}/.github/workflows/scorecard.yml +0 -0
  29. {render_engine-2025.10.3a1 → render_engine-2025.11.1a1}/.github/workflows/test.yml +0 -0
  30. {render_engine-2025.10.3a1 → render_engine-2025.11.1a1}/.markdownlint.json +0 -0
  31. {render_engine-2025.10.3a1 → render_engine-2025.11.1a1}/.pre-commit-config.yaml +0 -0
  32. {render_engine-2025.10.3a1 → render_engine-2025.11.1a1}/.readthedocs.yml +0 -0
  33. {render_engine-2025.10.3a1 → render_engine-2025.11.1a1}/.vscode/tasks.json +0 -0
  34. {render_engine-2025.10.3a1 → render_engine-2025.11.1a1}/CONTRIBUTING.md +0 -0
  35. {render_engine-2025.10.3a1 → render_engine-2025.11.1a1}/README.md +0 -0
  36. {render_engine-2025.10.3a1 → render_engine-2025.11.1a1}/SECURITY.md +0 -0
  37. {render_engine-2025.10.3a1 → render_engine-2025.11.1a1}/docs/.markdownlint.json +0 -0
  38. {render_engine-2025.10.3a1 → render_engine-2025.11.1a1}/docs/docs/archive.md +0 -0
  39. {render_engine-2025.10.3a1 → render_engine-2025.11.1a1}/docs/docs/assets/create environment vs code.gif +0 -0
  40. {render_engine-2025.10.3a1 → render_engine-2025.11.1a1}/docs/docs/assets/create-app-help.png +0 -0
  41. {render_engine-2025.10.3a1 → render_engine-2025.11.1a1}/docs/docs/assets/create-codespace.gif +0 -0
  42. {render_engine-2025.10.3a1 → render_engine-2025.11.1a1}/docs/docs/assets/launching a dev container.gif +0 -0
  43. {render_engine-2025.10.3a1 → render_engine-2025.11.1a1}/docs/docs/assets/render-engine-init-help.png +0 -0
  44. {render_engine-2025.10.3a1 → render_engine-2025.11.1a1}/docs/docs/assets/render-engine-init.png +0 -0
  45. {render_engine-2025.10.3a1 → render_engine-2025.11.1a1}/docs/docs/cli.md +0 -0
  46. {render_engine-2025.10.3a1 → render_engine-2025.11.1a1}/docs/docs/collection.md +0 -0
  47. {render_engine-2025.10.3a1 → render_engine-2025.11.1a1}/docs/docs/contributing/CODE_OF_CONDUCT.md +0 -0
  48. {render_engine-2025.10.3a1 → render_engine-2025.11.1a1}/docs/docs/contributing/CONTRIBUTING.md +0 -0
  49. {render_engine-2025.10.3a1 → render_engine-2025.11.1a1}/docs/docs/contributing/environment_setup.md +0 -0
  50. {render_engine-2025.10.3a1 → render_engine-2025.11.1a1}/docs/docs/custom_collections.md +0 -0
  51. {render_engine-2025.10.3a1 → render_engine-2025.11.1a1}/docs/docs/feeds.md +0 -0
  52. {render_engine-2025.10.3a1 → render_engine-2025.11.1a1}/docs/docs/getting-started/building-your-site.md +0 -0
  53. {render_engine-2025.10.3a1 → render_engine-2025.11.1a1}/docs/docs/getting-started/creating-a-collection.md +0 -0
  54. {render_engine-2025.10.3a1 → render_engine-2025.11.1a1}/docs/docs/getting-started/creating-a-page.md +0 -0
  55. {render_engine-2025.10.3a1 → render_engine-2025.11.1a1}/docs/docs/getting-started/creating-your-app.md +0 -0
  56. {render_engine-2025.10.3a1 → render_engine-2025.11.1a1}/docs/docs/getting-started/getting-started.md +0 -0
  57. {render_engine-2025.10.3a1 → render_engine-2025.11.1a1}/docs/docs/getting-started/installation.md +0 -0
  58. {render_engine-2025.10.3a1 → render_engine-2025.11.1a1}/docs/docs/getting-started/layout.md +0 -0
  59. {render_engine-2025.10.3a1 → render_engine-2025.11.1a1}/docs/docs/index.md +0 -0
  60. {render_engine-2025.10.3a1 → render_engine-2025.11.1a1}/docs/docs/page.md +0 -0
  61. {render_engine-2025.10.3a1 → render_engine-2025.11.1a1}/docs/docs/parsers.md +0 -0
  62. {render_engine-2025.10.3a1 → render_engine-2025.11.1a1}/docs/docs/plugins.md +0 -0
  63. {render_engine-2025.10.3a1 → render_engine-2025.11.1a1}/docs/docs/site.md +0 -0
  64. {render_engine-2025.10.3a1 → render_engine-2025.11.1a1}/docs/docs/site_map.md +0 -0
  65. {render_engine-2025.10.3a1 → render_engine-2025.11.1a1}/docs/docs/templates.md +0 -0
  66. {render_engine-2025.10.3a1 → render_engine-2025.11.1a1}/docs/docs/theme_management.md +0 -0
  67. {render_engine-2025.10.3a1 → render_engine-2025.11.1a1}/docs/mkdocs.yml +0 -0
  68. {render_engine-2025.10.3a1 → render_engine-2025.11.1a1}/docs/requirements.txt +0 -0
  69. {render_engine-2025.10.3a1 → render_engine-2025.11.1a1}/noxfile.py +0 -0
  70. {render_engine-2025.10.3a1 → render_engine-2025.11.1a1}/requirements.txt +0 -0
  71. {render_engine-2025.10.3a1 → render_engine-2025.11.1a1}/setup.cfg +0 -0
  72. {render_engine-2025.10.3a1 → render_engine-2025.11.1a1}/src/render_engine/.gitignore +0 -0
  73. {render_engine-2025.10.3a1 → render_engine-2025.11.1a1}/src/render_engine/__init__.py +0 -0
  74. {render_engine-2025.10.3a1 → render_engine-2025.11.1a1}/src/render_engine/__main__.py +0 -0
  75. {render_engine-2025.10.3a1 → render_engine-2025.11.1a1}/src/render_engine/_base_object.py +0 -0
  76. {render_engine-2025.10.3a1 → render_engine-2025.11.1a1}/src/render_engine/archive.py +0 -0
  77. {render_engine-2025.10.3a1 → render_engine-2025.11.1a1}/src/render_engine/blog.py +0 -0
  78. {render_engine-2025.10.3a1 → render_engine-2025.11.1a1}/src/render_engine/content_managers/__init__.py +0 -0
  79. {render_engine-2025.10.3a1 → render_engine-2025.11.1a1}/src/render_engine/engine.py +0 -0
  80. {render_engine-2025.10.3a1 → render_engine-2025.11.1a1}/src/render_engine/extras/__init__.py +0 -0
  81. {render_engine-2025.10.3a1 → render_engine-2025.11.1a1}/src/render_engine/feeds.py +0 -0
  82. {render_engine-2025.10.3a1 → render_engine-2025.11.1a1}/src/render_engine/hookspecs.py +0 -0
  83. {render_engine-2025.10.3a1 → render_engine-2025.11.1a1}/src/render_engine/links.py +0 -0
  84. {render_engine-2025.10.3a1 → render_engine-2025.11.1a1}/src/render_engine/page.py +0 -0
  85. {render_engine-2025.10.3a1 → render_engine-2025.11.1a1}/src/render_engine/parsers/markdown.py +0 -0
  86. {render_engine-2025.10.3a1 → render_engine-2025.11.1a1}/src/render_engine/plugins.py +0 -0
  87. {render_engine-2025.10.3a1 → render_engine-2025.11.1a1}/src/render_engine/py.typed +0 -0
  88. {render_engine-2025.10.3a1 → render_engine-2025.11.1a1}/src/render_engine/render_engine_templates/__init__.py +0 -0
  89. {render_engine-2025.10.3a1 → render_engine-2025.11.1a1}/src/render_engine/render_engine_templates/archive.html +0 -0
  90. {render_engine-2025.10.3a1 → render_engine-2025.11.1a1}/src/render_engine/render_engine_templates/base.html +0 -0
  91. {render_engine-2025.10.3a1 → render_engine-2025.11.1a1}/src/render_engine/render_engine_templates/base_collection_path.md +0 -0
  92. {render_engine-2025.10.3a1 → render_engine-2025.11.1a1}/src/render_engine/render_engine_templates/base_templates/_archive.html +0 -0
  93. {render_engine-2025.10.3a1 → render_engine-2025.11.1a1}/src/render_engine/render_engine_templates/base_templates/_base.html +0 -0
  94. {render_engine-2025.10.3a1 → render_engine-2025.11.1a1}/src/render_engine/render_engine_templates/base_templates/_page.html +0 -0
  95. {render_engine-2025.10.3a1 → render_engine-2025.11.1a1}/src/render_engine/render_engine_templates/components/footer.html +0 -0
  96. {render_engine-2025.10.3a1 → render_engine-2025.11.1a1}/src/render_engine/render_engine_templates/components/page_title.html +0 -0
  97. {render_engine-2025.10.3a1 → render_engine-2025.11.1a1}/src/render_engine/render_engine_templates/page.html +0 -0
  98. {render_engine-2025.10.3a1 → render_engine-2025.11.1a1}/src/render_engine/render_engine_templates/rss2.0.xml +0 -0
  99. {render_engine-2025.10.3a1 → render_engine-2025.11.1a1}/src/render_engine/render_engine_templates/rss2.0_items.xml +0 -0
  100. {render_engine-2025.10.3a1 → render_engine-2025.11.1a1}/src/render_engine/render_engine_templates/sitemap.xml +0 -0
  101. {render_engine-2025.10.3a1 → render_engine-2025.11.1a1}/src/render_engine/render_engine_templates/sitemap_item.xml +0 -0
  102. {render_engine-2025.10.3a1 → render_engine-2025.11.1a1}/src/render_engine/site_map.py +0 -0
  103. {render_engine-2025.10.3a1 → render_engine-2025.11.1a1}/src/render_engine/themes.py +0 -0
  104. {render_engine-2025.10.3a1 → render_engine-2025.11.1a1}/src/render_engine/utils/__init__.py +0 -0
  105. {render_engine-2025.10.3a1 → render_engine-2025.11.1a1}/src/render_engine.egg-info/dependency_links.txt +0 -0
  106. {render_engine-2025.10.3a1 → render_engine-2025.11.1a1}/src/render_engine.egg-info/requires.txt +0 -0
  107. {render_engine-2025.10.3a1 → render_engine-2025.11.1a1}/src/render_engine.egg-info/top_level.txt +0 -0
  108. {render_engine-2025.10.3a1 → render_engine-2025.11.1a1}/tests/conftest.py +0 -0
  109. {render_engine-2025.10.3a1 → render_engine-2025.11.1a1}/tests/test_archive.py +0 -0
  110. {render_engine-2025.10.3a1 → render_engine-2025.11.1a1}/tests/test_base_object.py +0 -0
  111. {render_engine-2025.10.3a1 → render_engine-2025.11.1a1}/tests/test_blog.py +0 -0
  112. {render_engine-2025.10.3a1 → render_engine-2025.11.1a1}/tests/test_engine.py +0 -0
  113. {render_engine-2025.10.3a1 → render_engine-2025.11.1a1}/tests/test_feeds/conftest_feed.py +0 -0
  114. {render_engine-2025.10.3a1 → render_engine-2025.11.1a1}/tests/test_feeds/test_feeds.py +0 -0
  115. {render_engine-2025.10.3a1 → render_engine-2025.11.1a1}/tests/test_page.py +0 -0
  116. {render_engine-2025.10.3a1 → render_engine-2025.11.1a1}/tests/test_parsers_remove_2024_3_1.py +0 -0
  117. {render_engine-2025.10.3a1 → render_engine-2025.11.1a1}/tests/test_plugins.py +0 -0
  118. {render_engine-2025.10.3a1 → render_engine-2025.11.1a1}/tests/test_site.py +0 -0
  119. {render_engine-2025.10.3a1 → render_engine-2025.11.1a1}/tests/test_site_map.py +0 -0
  120. {render_engine-2025.10.3a1 → render_engine-2025.11.1a1}/tests/test_templates/test_base_html.py +0 -0
  121. {render_engine-2025.10.3a1 → render_engine-2025.11.1a1}/tests/test_theme_manager.py +0 -0
  122. {render_engine-2025.10.3a1 → render_engine-2025.11.1a1}/uv.lock +0 -0
@@ -166,3 +166,5 @@ untitled-site/
166
166
 
167
167
  .DS_Store
168
168
  .python-version
169
+
170
+ __version__.py
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: render_engine
3
- Version: 2025.10.3a1
3
+ Version: 2025.11.1a1
4
4
  Summary: A Flexible Static Site Generator for Python
5
5
  Project-URL: homepage, https://github.com/render-engine/render-engine/
6
6
  Project-URL: repository, https://github.com/render-engine/render-engine/
@@ -42,9 +42,9 @@ dev = [
42
42
  "watchfiles",
43
43
  ]
44
44
 
45
-
46
45
  [tool.setuptools_scm]
47
46
  local_scheme = "no-local-version"
47
+ version_file = "src/render_engine/__version__.py"
48
48
  # version_scheme = "python-simplified-semver"
49
49
 
50
50
  [project.urls]
@@ -0,0 +1,34 @@
1
+ # file generated by setuptools-scm
2
+ # don't change, don't track in version control
3
+
4
+ __all__ = [
5
+ "__version__",
6
+ "__version_tuple__",
7
+ "version",
8
+ "version_tuple",
9
+ "__commit_id__",
10
+ "commit_id",
11
+ ]
12
+
13
+ TYPE_CHECKING = False
14
+ if TYPE_CHECKING:
15
+ from typing import Tuple
16
+ from typing import Union
17
+
18
+ VERSION_TUPLE = Tuple[Union[int, str], ...]
19
+ COMMIT_ID = Union[str, None]
20
+ else:
21
+ VERSION_TUPLE = object
22
+ COMMIT_ID = object
23
+
24
+ version: str
25
+ __version__: str
26
+ __version_tuple__: VERSION_TUPLE
27
+ version_tuple: VERSION_TUPLE
28
+ commit_id: COMMIT_ID
29
+ __commit_id__: COMMIT_ID
30
+
31
+ __version__ = version = '2025.11.1a1'
32
+ __version_tuple__ = version_tuple = (2025, 11, 1, 'a1')
33
+
34
+ __commit_id__ = commit_id = 'g5ed5705d6'
@@ -288,6 +288,24 @@ class Collection(BaseObject):
288
288
  feed.site = self.site
289
289
  feed.render(route="./", theme_manager=self.site.theme_manager)
290
290
 
291
+ def create_entry(
292
+ self, filepath: Path = None, editor: str = None, content: str = None, metadata: dict = None
293
+ ) -> str:
294
+ """
295
+ Create a new entry for the Collection
296
+
297
+ :param filepath: Path object for the new entry
298
+ :param editor: Editor to open to edit the entry.
299
+ :param content: Content for the new entry
300
+ :param metadata: Metadata for the new entry
301
+ """
302
+ context = copy.deepcopy(self._metadata_attrs())
303
+ if metadata:
304
+ context.update(metadata)
305
+ return self.content_manager.create_entry(
306
+ filepath=filepath, editor=editor, metadata=context, content=content or "Hello, world!"
307
+ )
308
+
291
309
 
292
310
  def render_archives(archive, **kwargs) -> list[Archive]:
293
311
  return [archive.render(pages=archive.pages, **kwargs) for archive in archive]
@@ -1,5 +1,6 @@
1
1
  from abc import ABC, abstractmethod
2
2
  from collections.abc import Generator, Iterable
3
+ from pathlib import Path
3
4
 
4
5
 
5
6
  class ContentManager(ABC):
@@ -14,3 +15,8 @@ class ContentManager(ABC):
14
15
  def __iter__(self) -> Generator:
15
16
  """Iterator for the ContentManager"""
16
17
  yield from self.pages
18
+
19
+ @abstractmethod
20
+ def create_entry(self, filepath: Path = None, editor: str = None, metadata: dict = None, content: str = None):
21
+ """Create a new entry"""
22
+ ...
@@ -1,3 +1,4 @@
1
+ import subprocess
1
2
  from collections.abc import Iterable
2
3
  from pathlib import Path
3
4
 
@@ -34,3 +35,23 @@ class FileContentManager(ContentManager):
34
35
  @pages.setter
35
36
  def pages(self, value: Iterable):
36
37
  self._pages = value
38
+
39
+ def create_entry(
40
+ self, filepath: Path = None, editor: str = None, metadata: dict = None, content: str = None
41
+ ) -> str:
42
+ """
43
+ Create a new entry for the Collection
44
+
45
+ :param filepath: Path object for the new entry
46
+ :param editor: Editor to open to edit the entry.
47
+ :param content: The content for the entry
48
+ :param metadata: Metadata for the new entry
49
+ """
50
+ if not filepath:
51
+ raise ValueError("filepath needs to be specified.")
52
+
53
+ parsed_content = self.collection.Parser.create_entry(content=content, **metadata)
54
+ filepath.write_text(parsed_content)
55
+ if editor:
56
+ subprocess.run([editor, filepath])
57
+ return f"New entry created at {filepath} ."
@@ -3,6 +3,7 @@ import logging
3
3
  from collections import defaultdict
4
4
  from pathlib import Path
5
5
 
6
+ import rich
6
7
  from jinja2 import FileSystemLoader, PrefixLoader
7
8
  from rich.progress import Progress
8
9
 
@@ -13,6 +14,12 @@ from .plugins import PluginManager, handle_plugin_registration
13
14
  from .site_map import SiteMap
14
15
  from .themes import Theme, ThemeManager
15
16
 
17
+ try:
18
+ # Get the RE version for display. If it's not set it means we're working locally.
19
+ from render_engine.__version__ import __version__ as re_version
20
+ except ImportError:
21
+ re_version = "development"
22
+
16
23
 
17
24
  class Site:
18
25
  """
@@ -251,7 +258,10 @@ class Site:
251
258
  You can choose to call it manually in your file or
252
259
  use the CLI command [`render-engine build`][src.render_engine.cli.build]
253
260
  """
254
-
261
+ rich.print(
262
+ f"[green]Building {repr(self.site_vars.get('SITE_TITLE', 'your site'))} "
263
+ f"with Render Engine version {re_version}"
264
+ )
255
265
  with Progress() as progress:
256
266
  task_site_map = progress.add_task("Generating site map", total=1)
257
267
  self._site_map = SiteMap(self.route_list, self.site_vars.get("SITE_URL", ""))
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: render_engine
3
- Version: 2025.10.3a1
3
+ Version: 2025.11.1a1
4
4
  Summary: A Flexible Static Site Generator for Python
5
5
  Project-URL: homepage, https://github.com/render-engine/render-engine/
6
6
  Project-URL: repository, https://github.com/render-engine/render-engine/
@@ -63,6 +63,7 @@ docs/docs/getting-started/layout.md
63
63
  src/render_engine/.gitignore
64
64
  src/render_engine/__init__.py
65
65
  src/render_engine/__main__.py
66
+ src/render_engine/__version__.py
66
67
  src/render_engine/_base_object.py
67
68
  src/render_engine/archive.py
68
69
  src/render_engine/blog.py
@@ -1,4 +1,5 @@
1
1
  import pathlib
2
+ import textwrap
2
3
 
3
4
  import pluggy
4
5
  import pytest
@@ -360,3 +361,58 @@ def test_collection_custom_sort_by_list_with_date():
360
361
 
361
362
  # Verify the sorted order by checking custom_sort_content values
362
363
  assert [page.custom_sort_content for page in sorted_pages] == [page.custom_sort_content for page in expected_pages]
364
+
365
+
366
+ @pytest.mark.parametrize(
367
+ "content, context, expected",
368
+ [
369
+ (
370
+ "",
371
+ {"title": "title"},
372
+ textwrap.dedent("""---
373
+ title: title
374
+ ---
375
+
376
+ Hello, world!"""),
377
+ ),
378
+ (
379
+ "test",
380
+ {},
381
+ textwrap.dedent("""---
382
+ title: Untitled Entry
383
+ ---
384
+
385
+ test"""),
386
+ ),
387
+ (
388
+ "",
389
+ {},
390
+ textwrap.dedent("""---
391
+ title: Untitled Entry
392
+ ---
393
+
394
+ Hello, world!"""),
395
+ ),
396
+ ],
397
+ )
398
+ def test_create_entry(tmp_path: pathlib.Path, content, context, expected):
399
+ """Test the create_entry method"""
400
+ tmp_dir = tmp_path / "content"
401
+ tmp_dir.mkdir()
402
+
403
+ class BasicCollection(Collection):
404
+ content_path = tmp_dir.absolute()
405
+
406
+ filename = "test.md"
407
+ filepath = tmp_dir / filename
408
+ assert str(filepath) in BasicCollection().create_entry(
409
+ filepath=filepath, editor=None, content=content, metadata=context
410
+ )
411
+ assert filepath.read_text().strip() == expected
412
+
413
+
414
+ def test_create_entry_no_filename():
415
+ """Test create_entry with no filename raises an exception"""
416
+ # Since the base Collection object uses a FileContentManager
417
+ with pytest.raises(ValueError):
418
+ Collection().create_entry()