render-engine 2026.3.3__tar.gz → 2026.3.4a2__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 (133) hide show
  1. {render_engine-2026.3.3 → render_engine-2026.3.4a2}/.github/PULL_REQUEST_TEMPLATE.md +2 -0
  2. {render_engine-2026.3.3 → render_engine-2026.3.4a2}/.github/workflows/lint.yml +9 -13
  3. {render_engine-2026.3.3 → render_engine-2026.3.4a2}/.github/workflows/publish.yml +4 -7
  4. render_engine-2026.3.4a2/.github/workflows/todos.yml +31 -0
  5. {render_engine-2026.3.3 → render_engine-2026.3.4a2}/.github/workflows/ty.yml +1 -1
  6. render_engine-2026.3.4a2/.markdownlint.json +13 -0
  7. render_engine-2026.3.4a2/.pre-commit-config.yaml +36 -0
  8. {render_engine-2026.3.3 → render_engine-2026.3.4a2}/PKG-INFO +23 -14
  9. {render_engine-2026.3.3 → render_engine-2026.3.4a2}/README.md +22 -11
  10. {render_engine-2026.3.3 → render_engine-2026.3.4a2}/docs/docs/collection.md +9 -4
  11. {render_engine-2026.3.3 → render_engine-2026.3.4a2}/docs/docs/content_manager.md +3 -1
  12. {render_engine-2026.3.3 → render_engine-2026.3.4a2}/docs/docs/contributing/CONTRIBUTING.md +30 -2
  13. {render_engine-2026.3.3 → render_engine-2026.3.4a2}/docs/docs/contributing/SECURITY.md +4 -4
  14. {render_engine-2026.3.3 → render_engine-2026.3.4a2}/docs/docs/contributing/environment_setup.md +9 -4
  15. {render_engine-2026.3.3 → render_engine-2026.3.4a2}/docs/docs/contributing/gen_badge.md +3 -1
  16. {render_engine-2026.3.3 → render_engine-2026.3.4a2}/docs/docs/contributing/github-actions-file-patterns.md +7 -3
  17. {render_engine-2026.3.3 → render_engine-2026.3.4a2}/docs/docs/contributing/style-guide.md +3 -1
  18. {render_engine-2026.3.3 → render_engine-2026.3.4a2}/docs/docs/contributing/testing.md +3 -1
  19. render_engine-2026.3.4a2/docs/docs/data_object.md +65 -0
  20. {render_engine-2026.3.3 → render_engine-2026.3.4a2}/docs/docs/feeds.md +5 -2
  21. {render_engine-2026.3.3 → render_engine-2026.3.4a2}/docs/docs/getting-started/building-your-site.md +3 -1
  22. {render_engine-2026.3.3 → render_engine-2026.3.4a2}/docs/docs/getting-started/creating-a-collection.md +3 -1
  23. {render_engine-2026.3.3 → render_engine-2026.3.4a2}/docs/docs/getting-started/creating-a-page.md +3 -1
  24. {render_engine-2026.3.3 → render_engine-2026.3.4a2}/docs/docs/getting-started/creating-your-app.md +7 -3
  25. {render_engine-2026.3.3 → render_engine-2026.3.4a2}/docs/docs/getting-started/getting-started.md +14 -7
  26. {render_engine-2026.3.3 → render_engine-2026.3.4a2}/docs/docs/getting-started/installation.md +8 -4
  27. {render_engine-2026.3.3 → render_engine-2026.3.4a2}/docs/docs/getting-started/layout.md +3 -1
  28. render_engine-2026.3.4a2/docs/docs/index.md +45 -0
  29. {render_engine-2026.3.3 → render_engine-2026.3.4a2}/docs/docs/parsers.md +4 -1
  30. {render_engine-2026.3.3 → render_engine-2026.3.4a2}/docs/docs/plugins.md +3 -1
  31. {render_engine-2026.3.3 → render_engine-2026.3.4a2}/docs/docs/site.md +7 -3
  32. {render_engine-2026.3.3 → render_engine-2026.3.4a2}/docs/docs/templates.md +5 -2
  33. {render_engine-2026.3.3 → render_engine-2026.3.4a2}/docs/mkdocs.yml +1 -0
  34. {render_engine-2026.3.3 → render_engine-2026.3.4a2}/pyproject.toml +4 -2
  35. {render_engine-2026.3.3 → render_engine-2026.3.4a2}/src/render_engine/__init__.py +2 -1
  36. {render_engine-2026.3.3 → render_engine-2026.3.4a2}/src/render_engine/__version__.py +3 -3
  37. render_engine-2026.3.4a2/src/render_engine/data_object.py +58 -0
  38. {render_engine-2026.3.3 → render_engine-2026.3.4a2}/src/render_engine/render_engine_templates/base_collection_path.md +5 -2
  39. {render_engine-2026.3.3 → render_engine-2026.3.4a2}/src/render_engine/site.py +65 -4
  40. {render_engine-2026.3.3 → render_engine-2026.3.4a2}/src/render_engine/site_map.py +26 -6
  41. {render_engine-2026.3.3 → render_engine-2026.3.4a2}/src/render_engine.egg-info/PKG-INFO +23 -14
  42. {render_engine-2026.3.3 → render_engine-2026.3.4a2}/src/render_engine.egg-info/SOURCES.txt +3 -0
  43. {render_engine-2026.3.3 → render_engine-2026.3.4a2}/src/render_engine.egg-info/requires.txt +0 -2
  44. {render_engine-2026.3.3 → render_engine-2026.3.4a2}/tests/test_site.py +33 -0
  45. {render_engine-2026.3.3 → render_engine-2026.3.4a2}/tests/test_site_map.py +2 -2
  46. {render_engine-2026.3.3 → render_engine-2026.3.4a2}/uv.lock +44 -4
  47. render_engine-2026.3.3/.markdownlint.json +0 -8
  48. render_engine-2026.3.3/.pre-commit-config.yaml +0 -19
  49. render_engine-2026.3.3/docs/docs/index.md +0 -38
  50. {render_engine-2026.3.3 → render_engine-2026.3.4a2}/.all-contributorsrc +0 -0
  51. {render_engine-2026.3.3 → render_engine-2026.3.4a2}/.devcontainer/Dockerfile +0 -0
  52. {render_engine-2026.3.3 → render_engine-2026.3.4a2}/.devcontainer/devcontainer.json +0 -0
  53. {render_engine-2026.3.3 → render_engine-2026.3.4a2}/.devcontainer/setup.sh +0 -0
  54. {render_engine-2026.3.3 → render_engine-2026.3.4a2}/.github/FUNDING.yml +0 -0
  55. {render_engine-2026.3.3 → render_engine-2026.3.4a2}/.github/ISSUE_TEMPLATE/config.yaml +0 -0
  56. {render_engine-2026.3.3 → render_engine-2026.3.4a2}/.github/ISSUE_TEMPLATE/form_issue_template.yml +0 -0
  57. {render_engine-2026.3.3 → render_engine-2026.3.4a2}/.github/dependabot-bot.yml +0 -0
  58. {render_engine-2026.3.3 → render_engine-2026.3.4a2}/.github/dependabot.yml +0 -0
  59. {render_engine-2026.3.3 → render_engine-2026.3.4a2}/.github/labeler.yml +0 -0
  60. {render_engine-2026.3.3 → render_engine-2026.3.4a2}/.github/release.yml +0 -0
  61. {render_engine-2026.3.3 → render_engine-2026.3.4a2}/.github/workflows/devcontainer-ci.yml +0 -0
  62. {render_engine-2026.3.3 → render_engine-2026.3.4a2}/.github/workflows/labeler.yml +0 -0
  63. {render_engine-2026.3.3 → render_engine-2026.3.4a2}/.github/workflows/scorecard.yml +0 -0
  64. {render_engine-2026.3.3 → render_engine-2026.3.4a2}/.github/workflows/test.yml +0 -0
  65. {render_engine-2026.3.3 → render_engine-2026.3.4a2}/.gitignore +0 -0
  66. {render_engine-2026.3.3 → render_engine-2026.3.4a2}/.readthedocs.yml +0 -0
  67. {render_engine-2026.3.3 → render_engine-2026.3.4a2}/.vscode/tasks.json +0 -0
  68. {render_engine-2026.3.3 → render_engine-2026.3.4a2}/SECURITY.md +0 -0
  69. {render_engine-2026.3.3 → render_engine-2026.3.4a2}/coverage-badge.svg +0 -0
  70. {render_engine-2026.3.3 → render_engine-2026.3.4a2}/docs/docs/archive.md +0 -0
  71. {render_engine-2026.3.3 → render_engine-2026.3.4a2}/docs/docs/assets/create environment vs code.gif +0 -0
  72. {render_engine-2026.3.3 → render_engine-2026.3.4a2}/docs/docs/assets/create-app-help.png +0 -0
  73. {render_engine-2026.3.3 → render_engine-2026.3.4a2}/docs/docs/assets/create-codespace.gif +0 -0
  74. {render_engine-2026.3.3 → render_engine-2026.3.4a2}/docs/docs/assets/launching a dev container.gif +0 -0
  75. {render_engine-2026.3.3 → render_engine-2026.3.4a2}/docs/docs/assets/render-engine-init-help.png +0 -0
  76. {render_engine-2026.3.3 → render_engine-2026.3.4a2}/docs/docs/assets/render-engine-init.png +0 -0
  77. {render_engine-2026.3.3 → render_engine-2026.3.4a2}/docs/docs/cli.md +0 -0
  78. {render_engine-2026.3.3 → render_engine-2026.3.4a2}/docs/docs/contributing/CODE_OF_CONDUCT.md +0 -0
  79. {render_engine-2026.3.3 → render_engine-2026.3.4a2}/docs/docs/contributing/typechecking.md +0 -0
  80. {render_engine-2026.3.3 → render_engine-2026.3.4a2}/docs/docs/custom_collections.md +0 -0
  81. {render_engine-2026.3.3 → render_engine-2026.3.4a2}/docs/docs/page.md +0 -0
  82. {render_engine-2026.3.3 → render_engine-2026.3.4a2}/docs/docs/site_map.md +0 -0
  83. {render_engine-2026.3.3 → render_engine-2026.3.4a2}/docs/docs/theme_management.md +0 -0
  84. {render_engine-2026.3.3 → render_engine-2026.3.4a2}/justfile +0 -0
  85. {render_engine-2026.3.3 → render_engine-2026.3.4a2}/noxfile.py +0 -0
  86. {render_engine-2026.3.3 → render_engine-2026.3.4a2}/setup.cfg +0 -0
  87. {render_engine-2026.3.3 → render_engine-2026.3.4a2}/src/render_engine/.gitignore +0 -0
  88. {render_engine-2026.3.3 → render_engine-2026.3.4a2}/src/render_engine/_base_object.py +0 -0
  89. {render_engine-2026.3.3 → render_engine-2026.3.4a2}/src/render_engine/archive.py +0 -0
  90. {render_engine-2026.3.3 → render_engine-2026.3.4a2}/src/render_engine/blog.py +0 -0
  91. {render_engine-2026.3.3 → render_engine-2026.3.4a2}/src/render_engine/collection.py +0 -0
  92. {render_engine-2026.3.3 → render_engine-2026.3.4a2}/src/render_engine/content_managers/__init__.py +0 -0
  93. {render_engine-2026.3.3 → render_engine-2026.3.4a2}/src/render_engine/content_managers/base_content_manager.py +0 -0
  94. {render_engine-2026.3.3 → render_engine-2026.3.4a2}/src/render_engine/content_managers/file_content_manager.py +0 -0
  95. {render_engine-2026.3.3 → render_engine-2026.3.4a2}/src/render_engine/engine.py +0 -0
  96. {render_engine-2026.3.3 → render_engine-2026.3.4a2}/src/render_engine/feeds.py +0 -0
  97. {render_engine-2026.3.3 → render_engine-2026.3.4a2}/src/render_engine/hookspecs.py +0 -0
  98. {render_engine-2026.3.3 → render_engine-2026.3.4a2}/src/render_engine/links.py +0 -0
  99. {render_engine-2026.3.3 → render_engine-2026.3.4a2}/src/render_engine/page.py +0 -0
  100. {render_engine-2026.3.3 → render_engine-2026.3.4a2}/src/render_engine/parsers/markdown.py +0 -0
  101. {render_engine-2026.3.3 → render_engine-2026.3.4a2}/src/render_engine/plugins.py +0 -0
  102. {render_engine-2026.3.3 → render_engine-2026.3.4a2}/src/render_engine/py.typed +0 -0
  103. {render_engine-2026.3.3 → render_engine-2026.3.4a2}/src/render_engine/render_engine_templates/__init__.py +0 -0
  104. {render_engine-2026.3.3 → render_engine-2026.3.4a2}/src/render_engine/render_engine_templates/archive.html +0 -0
  105. {render_engine-2026.3.3 → render_engine-2026.3.4a2}/src/render_engine/render_engine_templates/base.html +0 -0
  106. {render_engine-2026.3.3 → render_engine-2026.3.4a2}/src/render_engine/render_engine_templates/base_templates/_archive.html +0 -0
  107. {render_engine-2026.3.3 → render_engine-2026.3.4a2}/src/render_engine/render_engine_templates/base_templates/_base.html +0 -0
  108. {render_engine-2026.3.3 → render_engine-2026.3.4a2}/src/render_engine/render_engine_templates/base_templates/_page.html +0 -0
  109. {render_engine-2026.3.3 → render_engine-2026.3.4a2}/src/render_engine/render_engine_templates/components/footer.html +0 -0
  110. {render_engine-2026.3.3 → render_engine-2026.3.4a2}/src/render_engine/render_engine_templates/components/page_title.html +0 -0
  111. {render_engine-2026.3.3 → render_engine-2026.3.4a2}/src/render_engine/render_engine_templates/page.html +0 -0
  112. {render_engine-2026.3.3 → render_engine-2026.3.4a2}/src/render_engine/render_engine_templates/rss2.0.xml +0 -0
  113. {render_engine-2026.3.3 → render_engine-2026.3.4a2}/src/render_engine/render_engine_templates/rss2.0_items.xml +0 -0
  114. {render_engine-2026.3.3 → render_engine-2026.3.4a2}/src/render_engine/render_engine_templates/sitemap.xml +0 -0
  115. {render_engine-2026.3.3 → render_engine-2026.3.4a2}/src/render_engine/render_engine_templates/sitemap_item.xml +0 -0
  116. {render_engine-2026.3.3 → render_engine-2026.3.4a2}/src/render_engine/themes.py +0 -0
  117. {render_engine-2026.3.3 → render_engine-2026.3.4a2}/src/render_engine/utils/__init__.py +0 -0
  118. {render_engine-2026.3.3 → render_engine-2026.3.4a2}/src/render_engine.egg-info/dependency_links.txt +0 -0
  119. {render_engine-2026.3.3 → render_engine-2026.3.4a2}/src/render_engine.egg-info/top_level.txt +0 -0
  120. {render_engine-2026.3.3 → render_engine-2026.3.4a2}/tests/conftest.py +0 -0
  121. {render_engine-2026.3.3 → render_engine-2026.3.4a2}/tests/test_archive.py +0 -0
  122. {render_engine-2026.3.3 → render_engine-2026.3.4a2}/tests/test_base_object.py +0 -0
  123. {render_engine-2026.3.3 → render_engine-2026.3.4a2}/tests/test_blog.py +0 -0
  124. {render_engine-2026.3.3 → render_engine-2026.3.4a2}/tests/test_collections.py +0 -0
  125. {render_engine-2026.3.3 → render_engine-2026.3.4a2}/tests/test_engine.py +0 -0
  126. {render_engine-2026.3.3 → render_engine-2026.3.4a2}/tests/test_feeds/conftest_feed.py +0 -0
  127. {render_engine-2026.3.3 → render_engine-2026.3.4a2}/tests/test_feeds/test_feeds.py +0 -0
  128. {render_engine-2026.3.3 → render_engine-2026.3.4a2}/tests/test_file_content_manager.py +0 -0
  129. {render_engine-2026.3.3 → render_engine-2026.3.4a2}/tests/test_page.py +0 -0
  130. {render_engine-2026.3.3 → render_engine-2026.3.4a2}/tests/test_parsers_remove_2024_3_1.py +0 -0
  131. {render_engine-2026.3.3 → render_engine-2026.3.4a2}/tests/test_plugins.py +0 -0
  132. {render_engine-2026.3.3 → render_engine-2026.3.4a2}/tests/test_templates/test_base_html.py +0 -0
  133. {render_engine-2026.3.3 → render_engine-2026.3.4a2}/tests/test_theme_manager.py +0 -0
@@ -1,6 +1,8 @@
1
1
  <!--
2
2
  SUMMARY OF THE CHANGES BEING MADE
3
3
  Be sure to include any referenced issues and discussions.
4
+
5
+ Not following this guideline will result in the immediate rejection of your PR.
4
6
  -->
5
7
 
6
8
  #### Type of Issue
@@ -16,25 +16,21 @@ jobs:
16
16
  - uses: actions/checkout@v6.0.1
17
17
  with:
18
18
  fetch-depth: 0
19
- - name: Install Python
20
- uses: actions/setup-python@v5
19
+ - name: Install uv
20
+ uses: astral-sh/setup-uv@v7
21
21
  with:
22
- python-version: "3.12"
23
- cache: 'pip' # caching pip dependencies
22
+ python-version: 3.14
24
23
  - name: Install dependencies
25
- run: |
26
- python -m pip install --upgrade pip
27
- pip install "ruff==0.11.12"
28
- - name: Check Linting
29
- run: ruff check . --output-format=github
24
+ run: uvx ruff check . --output-format=github
30
25
  - name: Check formatting
31
- run: ruff format . --check
26
+ run: uvx ruff format . --check
32
27
 
33
28
  lint-docs:
34
29
  name: Lint Markdown
35
30
  runs-on: ubuntu-latest
36
31
  steps:
37
32
  - uses: actions/checkout@v6.0.1
38
- - uses: oven-sh/setup-bun@v2
39
- - name: Lint files
40
- run: bunx markdownlint-cli2 **/*.md
33
+ - name: lint-test
34
+ uses: DavidAnson/markdownlint-cli2-action@v22
35
+ with:
36
+ globs: '**/*.md'
@@ -17,16 +17,13 @@ jobs:
17
17
  - name: Checkout source
18
18
  uses: actions/checkout@v6.0.1
19
19
 
20
- - name: Set up Python 3.11
21
- uses: actions/setup-python@v5
20
+ - name: Set up Python
21
+ uses: astral-sh/setup-uv@v7
22
22
  with:
23
- python-version: 3.11
24
- cache: 'pip' # caching pip dependencies
25
- - name: Install build dependencies
26
- run: python -m pip install build twine
23
+ python-version: 3.14
27
24
 
28
25
  - name: Build distributions
29
- run: python -m build
26
+ run: uv build
30
27
 
31
28
  - name: Publish package to PyPI
32
29
  uses: pypa/gh-action-pypi-publish@release/v1
@@ -0,0 +1,31 @@
1
+ name: "Run TODO to Issue"
2
+ on:
3
+ pull_request:
4
+ branches: [main]
5
+ jobs:
6
+ build:
7
+ runs-on: "ubuntu-latest"
8
+ permissions:
9
+ contents: write
10
+ issues: write
11
+ pull-requests: write
12
+ steps:
13
+ - uses: "actions/checkout@v6"
14
+ - name: "TODO to Issue"
15
+ uses: "alstr/todo-to-issue-action@v5"
16
+ with:
17
+ INSERT_ISSUE_URLS: "true"
18
+ CLOSES_ISSUE: "true"
19
+ - name: Set Git user
20
+ run: |
21
+ git config --global user.name "github-actions[bot]"
22
+ git config --global user.email "github-actions[bot]@users.noreply.github.com"
23
+ - name: Commit and Push Changes
24
+ run: |
25
+ git add -A
26
+ if [[ `git status --porcelain` ]]; then
27
+ git commit -m "Automatically added GitHub issue links to TODOs"
28
+ git push origin main
29
+ else
30
+ echo "No changes to commit"
31
+ fi
@@ -19,4 +19,4 @@ jobs:
19
19
  - uses: actions/checkout@v6.0.1
20
20
  - uses: astral-sh/setup-uv@v7
21
21
  - name: Run type (ty) check
22
- run: uv run ty check src
22
+ run: uv run ty check src
@@ -0,0 +1,13 @@
1
+ {
2
+ "MD013": {
3
+ "line_length": 120,
4
+ "tables": false,
5
+ "code_blocks": false
6
+ },
7
+ "MD041": false,
8
+ "MD054": {
9
+ "inline": false,
10
+ "url_inline": false,
11
+ "collapsed": false
12
+ }
13
+ }
@@ -0,0 +1,36 @@
1
+ repos:
2
+ - repo: https://github.com/pre-commit/pre-commit-hooks
3
+ rev: v2.3.0
4
+ hooks:
5
+ - id: check-yaml
6
+ - id: end-of-file-fixer
7
+ - id: trailing-whitespace
8
+ - repo: https://github.com/astral-sh/ruff-pre-commit
9
+ # Ruff version.
10
+ rev: v0.15.1
11
+ hooks:
12
+ # Run the linter.
13
+ - id: ruff-check
14
+ args: [ --fix ]
15
+ # Run the formatter.
16
+ - id: ruff-format
17
+ - repo: local
18
+ hooks:
19
+ - id: ty-check
20
+ name: ty
21
+ entry: uv run ty check src/render_engine
22
+ language: system
23
+ types: [python]
24
+ pass_filenames: false
25
+ - repo: https://github.com/DavidAnson/markdownlint-cli2
26
+ rev: v0.6.0
27
+ hooks:
28
+ - id: markdownlint-cli2
29
+ - repo: local
30
+ hooks:
31
+ - id: deptry
32
+ name: deptry
33
+ entry: uv run deptry src
34
+ language: system
35
+ always_run: true
36
+ pass_filenames: false
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: render_engine
3
- Version: 2026.3.3
3
+ Version: 2026.3.4a2
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/
@@ -8,11 +8,9 @@ Project-URL: documentation, https://render-engine.readthedocs.io/en/latest/
8
8
  Requires-Python: >=3.10
9
9
  Description-Content-Type: text/markdown
10
10
  Requires-Dist: jinja2
11
- Requires-Dist: markdown2
12
11
  Requires-Dist: more-itertools
13
12
  Requires-Dist: pluggy
14
13
  Requires-Dist: python-dateutil
15
- Requires-Dist: python-frontmatter
16
14
  Requires-Dist: python-slugify
17
15
  Requires-Dist: render-engine-parser
18
16
  Requires-Dist: render-engine-markdown
@@ -30,15 +28,15 @@ Requires-Dist: render-engine-sitemap; extra == "extras"
30
28
 
31
29
  # Render Engine
32
30
 
33
- [![PyTest](https://github.com/kjaymiller/render_engine/actions/workflows/test.yml/badge.svg)](https://github.com/kjaymiller/render_engine/actions/workflows/test.yml)
34
- ![genbadge-coverage](./coverage-badge.svg)
35
- [![Discord](https://img.shields.io/discord/1174377880118104156?label=Discord&color=purple)](https://discord.gg/2xMQ4j4d8m)
31
+ [![PyTest][pytest-badge]][pytest-action]
32
+ ![genbadge-coverage][coverage-badge]
33
+ [![Discord][discord-badge]][discord-link]
36
34
 
37
35
  ## Learn More
38
36
 
39
- - [Check out the Documentation](https://render-engine.readthedocs.io/en/latest/)
40
- - [Contributors and Builders, Check out the Wiki](https://github.com/render-engine/render-engine/wiki)
41
- - [Join the community!](https://discord.gg/2xMQ4j4d8m)
37
+ - [Check out the Documentation][docs]
38
+ - [Contributors and Builders, Check out the Wiki][wiki]
39
+ - [Join the community!][discord-link]
42
40
 
43
41
  ## What is RenderEngine
44
42
 
@@ -53,10 +51,10 @@ Requires-Dist: render-engine-sitemap; extra == "extras"
53
51
 
54
52
  ## Installing Render Engine
55
53
 
56
- To use the render engine, you must have Python 3.10 or greater installed. You can download Python from [python.org](https://python.org).
54
+ To use the render engine, you must have Python 3.10 or greater installed. You can download Python from [python.org][python].
57
55
 
58
- - Linux/MacOS: [python.org](https://python.org)
59
- - Windows: [Microsoft Store](https://apps.microsoft.com/store/detail/python-311/9NRWMJP3717K)
56
+ - Linux/MacOS: [python.org][python]
57
+ - Windows: [Microsoft Store][ms-store]
60
58
 
61
59
  Render Engine is available in PyPI and can be installed using pip:
62
60
 
@@ -72,7 +70,7 @@ pip install render-engine[cli]
72
70
 
73
71
  ## Getting Started
74
72
 
75
- Check out the [Getting Started](https://render-engine.readthedocs.io/en/latest/page/) Section in the [Documentation](https://render-engine.readthedocs.io)
73
+ Check out the [Getting Started][getting-started] Section in the [Documentation][docs]
76
74
 
77
75
  ## Finding Awesome Add-Ons
78
76
 
@@ -127,10 +125,21 @@ Please review the [contributing][contributing] section of our docs for more info
127
125
 
128
126
  ### Sponsors at the $20/month and Higher Level
129
127
 
130
- - [Brian Douglas](https://github.com/bdougie)
128
+ - [Brian Douglas][bdougie]
131
129
 
132
130
  Thank you to them and all of those who continue to support this project!
133
131
 
132
+ [pytest-badge]: https://github.com/kjaymiller/render_engine/actions/workflows/test.yml/badge.svg
133
+ [pytest-action]: https://github.com/kjaymiller/render_engine/actions/workflows/test.yml
134
+ [coverage-badge]: ./coverage-badge.svg
135
+ [discord-badge]: https://img.shields.io/discord/1174377880118104156?label=Discord&color=purple
136
+ [discord-link]: https://discord.gg/2xMQ4j4d8m
137
+ [docs]: https://render-engine.readthedocs.io/en/latest/
138
+ [wiki]: https://github.com/render-engine/render-engine/wiki
139
+ [python]: https://python.org
140
+ [ms-store]: https://apps.microsoft.com/store/detail/python-311/9NRWMJP3717K
141
+ [getting-started]: https://render-engine.readthedocs.io/en/latest/page/
142
+ [bdougie]: https://github.com/bdougie
134
143
  [contributing]: https://render-engine.readthedocs.io/en/latest/contributing/CONTRIBUTING/
135
144
  [page-docs]: https://render-engine.readthedocs.io/en/latest/page/
136
145
  [collection-docs]: https://render-engine.readthedocs.io/en/latest/collection/
@@ -6,15 +6,15 @@
6
6
 
7
7
  # Render Engine
8
8
 
9
- [![PyTest](https://github.com/kjaymiller/render_engine/actions/workflows/test.yml/badge.svg)](https://github.com/kjaymiller/render_engine/actions/workflows/test.yml)
10
- ![genbadge-coverage](./coverage-badge.svg)
11
- [![Discord](https://img.shields.io/discord/1174377880118104156?label=Discord&color=purple)](https://discord.gg/2xMQ4j4d8m)
9
+ [![PyTest][pytest-badge]][pytest-action]
10
+ ![genbadge-coverage][coverage-badge]
11
+ [![Discord][discord-badge]][discord-link]
12
12
 
13
13
  ## Learn More
14
14
 
15
- - [Check out the Documentation](https://render-engine.readthedocs.io/en/latest/)
16
- - [Contributors and Builders, Check out the Wiki](https://github.com/render-engine/render-engine/wiki)
17
- - [Join the community!](https://discord.gg/2xMQ4j4d8m)
15
+ - [Check out the Documentation][docs]
16
+ - [Contributors and Builders, Check out the Wiki][wiki]
17
+ - [Join the community!][discord-link]
18
18
 
19
19
  ## What is RenderEngine
20
20
 
@@ -29,10 +29,10 @@
29
29
 
30
30
  ## Installing Render Engine
31
31
 
32
- To use the render engine, you must have Python 3.10 or greater installed. You can download Python from [python.org](https://python.org).
32
+ To use the render engine, you must have Python 3.10 or greater installed. You can download Python from [python.org][python].
33
33
 
34
- - Linux/MacOS: [python.org](https://python.org)
35
- - Windows: [Microsoft Store](https://apps.microsoft.com/store/detail/python-311/9NRWMJP3717K)
34
+ - Linux/MacOS: [python.org][python]
35
+ - Windows: [Microsoft Store][ms-store]
36
36
 
37
37
  Render Engine is available in PyPI and can be installed using pip:
38
38
 
@@ -48,7 +48,7 @@ pip install render-engine[cli]
48
48
 
49
49
  ## Getting Started
50
50
 
51
- Check out the [Getting Started](https://render-engine.readthedocs.io/en/latest/page/) Section in the [Documentation](https://render-engine.readthedocs.io)
51
+ Check out the [Getting Started][getting-started] Section in the [Documentation][docs]
52
52
 
53
53
  ## Finding Awesome Add-Ons
54
54
 
@@ -103,10 +103,21 @@ Please review the [contributing][contributing] section of our docs for more info
103
103
 
104
104
  ### Sponsors at the $20/month and Higher Level
105
105
 
106
- - [Brian Douglas](https://github.com/bdougie)
106
+ - [Brian Douglas][bdougie]
107
107
 
108
108
  Thank you to them and all of those who continue to support this project!
109
109
 
110
+ [pytest-badge]: https://github.com/kjaymiller/render_engine/actions/workflows/test.yml/badge.svg
111
+ [pytest-action]: https://github.com/kjaymiller/render_engine/actions/workflows/test.yml
112
+ [coverage-badge]: ./coverage-badge.svg
113
+ [discord-badge]: https://img.shields.io/discord/1174377880118104156?label=Discord&color=purple
114
+ [discord-link]: https://discord.gg/2xMQ4j4d8m
115
+ [docs]: https://render-engine.readthedocs.io/en/latest/
116
+ [wiki]: https://github.com/render-engine/render-engine/wiki
117
+ [python]: https://python.org
118
+ [ms-store]: https://apps.microsoft.com/store/detail/python-311/9NRWMJP3717K
119
+ [getting-started]: https://render-engine.readthedocs.io/en/latest/page/
120
+ [bdougie]: https://github.com/bdougie
110
121
  [contributing]: https://render-engine.readthedocs.io/en/latest/contributing/CONTRIBUTING/
111
122
  [page-docs]: https://render-engine.readthedocs.io/en/latest/page/
112
123
  [collection-docs]: https://render-engine.readthedocs.io/en/latest/collection/
@@ -23,7 +23,7 @@ class BasicCollection(Collection):
23
23
 
24
24
  Collection pages **MUST** come from a `content_path` and all be the same content type.
25
25
 
26
- `content_path` can be a string representing a path or URL, depending on the [parser](parsers.md?id=basepageparser) used.
26
+ `content_path` can be a string representing a path or URL, depending on the [parser] used.
27
27
 
28
28
  `sort_by` can be either a single `attribute` as a `str` or a `list` of attributes to be used as a sort key.
29
29
 
@@ -54,7 +54,7 @@ content_manager_extras: dict[str, Any]: Configuration options to send to the `Co
54
54
 
55
55
  `archives: typing.Generator[Archive, None, None]` `property`
56
56
 
57
- Returns a [Archive](archive.md) objects containing the pages from the `content_path`.
57
+ Returns a [Archive] objects containing the pages from the `content_path`.
58
58
 
59
59
  Archives are an iterable and the individual pages are built shortly after the collection pages are
60
60
  built. This happens when [Site.render][site-render] is called.
@@ -63,7 +63,7 @@ built. This happens when [Site.render][site-render] is called.
63
63
 
64
64
  `get_page(content_path=None)`
65
65
 
66
- Returns the [page](page.md) Object for the specified Content Path
66
+ Returns the [page] Object for the specified Content Path
67
67
 
68
68
  `iter_content_path()`
69
69
 
@@ -109,6 +109,11 @@ You can have archives generated by setting the `has_archive` to True.
109
109
  If you call `archives` from your collection and neither `has_archive` nor `items_per_page` is set,
110
110
  an error will be raised and an archive containing all pages will be generated.
111
111
 
112
- For more information, see [Collection Archives](archive.md).
112
+ For more information, see [Collection Archives].
113
113
 
114
114
  [site-render]: site.md?id=render
115
+
116
+ [archive]: archive.md
117
+ [collection archives]: archive.md
118
+ [page]: page.md
119
+ [parser]: parsers.md?id=basepageparser
@@ -15,7 +15,7 @@ content is stored in the file system with each piece of content existing in a di
15
15
 
16
16
  ## Selecting a `ContentManager`
17
17
 
18
- The `ContentManager` for a given [`Collection`](collection.md) is controlled by the `ContentManager` attribute. When
18
+ The `ContentManager` for a given [`Collection`] is controlled by the `ContentManager` attribute. When
19
19
  the class is instantiated the `ContentManager` is also instantiated with any `content_manager_extras` being passed
20
20
  as arguments. To access the `ContentManager` of a given `Collection` use the `content_manager` attribute.
21
21
 
@@ -85,3 +85,5 @@ content: str = None # Updated content
85
85
  ```
86
86
 
87
87
  [file-content-manager]: https://github.com/render-engine/render-engine/blob/main/src/render_engine/content_managers/file_content_manager.py
88
+
89
+ [`collection`]: collection.md
@@ -13,7 +13,7 @@ Docs can be found at <https://render-engine.readthedocs.org>
13
13
 
14
14
  ## Code of Conduct
15
15
 
16
- Render Engine and all of the packages in this org follow the same [Code of Conduct](https://github.com/render-engine/render-engine/blob/main/.github/CODE_OF_CONDUCT.md).
16
+ Render Engine and all of the packages in this org follow the same [Code of Conduct].
17
17
 
18
18
  ## Before you Contribute
19
19
 
@@ -23,7 +23,7 @@ When suggesting a feature, consider the following:
23
23
  - Would your feature be a good theme?
24
24
  - Could this be implemented as a Custom Parsers or Collections
25
25
 
26
- More on when to choose these solutions in our [docs](https://render-engine.readthedocs.io/en/latest/contributing/CONTRIBUTING/#instead-of-making-a-change-in-render-engines-code-consider).
26
+ More on when to choose these solutions in our [docs][docs-contributing].
27
27
 
28
28
  ## Filing an Issue
29
29
 
@@ -37,6 +37,7 @@ If you see or experience a problem, please file an issue. Include any important
37
37
  - Plugins/Themes/Custom Parsers & Collections Installed
38
38
  - Commands/Code Used
39
39
  - Output
40
+ - [AI Attestation][ai-attestation]
40
41
 
41
42
  ## Wait to be Assigned Issues
42
43
 
@@ -74,6 +75,12 @@ all supported versions.
74
75
  - 🚫 changes aren't breaking existing code (failing tests)
75
76
  - 🚫 Ensure new dependencies are listed, justified, and approved to be added.
76
77
 
78
+ ## TODOs
79
+
80
+ Todos are not encouraged all the time but if necessary please indicate any todos with the `# TODO Prefix`.
81
+ We use [todo-to-issue] as a github action that will create issues for any TODOs that are created.
82
+ This will modify your code with the issue number and link to the TODO in the comments.
83
+
77
84
  ## Contributing to Documentation
78
85
 
79
86
  Render Engine uses [readthedocs][readthedocs] in combination with [MkDocs][mkdocs],
@@ -98,7 +105,25 @@ If you're starting from a blank PR be sure to include the following:
98
105
  - issue(s)/discussions being addressed
99
106
  - Documentation or tests added/updated
100
107
  - Any follow up tasks pending
108
+ - [AI Attestation][ai-attestation]
109
+
110
+ When submitting your PR, please be sure to use the template provided.
111
+ **Not following this guideline will result in the immediate rejection of your PR.**
112
+
113
+ ## AI Attestation
114
+
115
+ Projects in the [Render Engine organization][gh-render-engine] will accept code contributions created with the
116
+ assistance of AI Coding software. We ask that that you include an AI Attestation to your issue, comment, or PR.
117
+
118
+ This attestation should mean that the AI model is included as a co-Author of the changes.
119
+
120
+ The AI assistant is your copilot. You are still responsible for code changes submitted.
121
+ Low quality contributions or code that cannot be defended by the USER (not their AI model)
122
+ will result in issues/prs being immediately closed.
123
+ Multiple low quality contributions will result in your user account being banned from contribution.
101
124
 
125
+ [ai-attestation]: #ai-attestation
126
+ [gh-render-engine]: https://github.com/render-engine
102
127
  [wiki]: https://github.com/render-engine/.github/wiki
103
128
  [docs]: https://render-engine.readthedocs.org
104
129
  [being-assigned]: https://render-engine.readthedocs.io/en/latest/contributing/CONTRIBUTING/#being-assigned-an-issue
@@ -109,3 +134,6 @@ If you're starting from a blank PR be sure to include the following:
109
134
  [mkdocs]: https://www.mkdocs.org
110
135
  [material]: https://squidfunk.github.io/mkdocs-material/
111
136
  [mkdocsstrings]: https://mkdocsstrings.readthedocs.io/en/latest/
137
+ [code of conduct]: https://github.com/render-engine/render-engine/blob/main/.github/CODE_OF_CONDUCT.md
138
+ [docs-contributing]: https://render-engine.readthedocs.io/en/latest/contributing/CONTRIBUTING/#instead-of-making-a-change-in-render-engines-code-consider
139
+ [todo-to-issue]: https://github.com/marketplace/actions/todo-to-issue
@@ -5,10 +5,10 @@
5
5
  We only support the latest version of render-engine with security updates.
6
6
  Please ensure you are using the most recent release available on [PyPI].
7
7
 
8
- | Version | Supported |
9
- |------------|--------------------|
10
- | Latest | :white_check_mark: |
11
- | < Latest | :x: |
8
+ | Version | Supported |
9
+ |----------|-----------|
10
+ | Latest | |
11
+ | < Latest | |
12
12
 
13
13
  ## Reporting a Vulnerability
14
14
 
@@ -49,7 +49,7 @@ Available recipes:
49
49
  If you're using [Visual Studio Code][vscode] you can also create a virtual environment from the command
50
50
  pallet. This will also enable the installation of the dependencies.
51
51
 
52
- ![Creating an Environment using VS Code](<../assets/create environment vs code.gif>)
52
+ ![Creating an Environment using VS Code]
53
53
 
54
54
  ## Using Codespaces
55
55
 
@@ -57,7 +57,7 @@ You can create a new codespace to quickly get started with your project.
57
57
 
58
58
  You can create a codespace on main.
59
59
 
60
- ![Create a Codespace](../assets/create-codespace.gif)
60
+ ![Create a Codespace]
61
61
 
62
62
  This will create a codespace in which you can make your changes. Don't worry they won't let you push your
63
63
  changes directly to the codebase but when you go to make that change it will let you create a fork and
@@ -77,12 +77,17 @@ Start with ensuring that the docker daemon is running.
77
77
  Open your fork of the project in VS Code and open the command pallet. Next, Enter "Dev Containers: ReOpen
78
78
  in Container" and select the option.
79
79
 
80
- This will create a new local environment with the same configuration as the [codespace](#using-codespaces).
80
+ This will create a new local environment with the same configuration as the [codespace].
81
81
 
82
- ![Launching a Dev Container](<../assets/launching a dev container.gif>)
82
+ ![Launching a Dev Container]
83
83
 
84
84
  [uv]: https://github.com/astral-sh/uv
85
85
  [uv-installation]: https://github.com/astral-sh/uv?tab=readme-ov-file#installation
86
86
  [just]: https://github.com/casey/just
87
87
  [just-installation]: https://github.com/casey/just?tab=readme-ov-file#installation
88
88
  [vscode]: https://code.visualstudio.com/
89
+
90
+ [codespace]: #using-codespaces
91
+ [create a codespace]: ../assets/create-codespace.gif
92
+ [creating an environment using vs code]: ../assets/create%20environment%20vs%20code.gif
93
+ [launching a dev container]: ../assets/launching%20a%20dev%20container.gif
@@ -6,7 +6,7 @@ date: Jan 24, 2026
6
6
 
7
7
  Render Engine shows a badge of it's coverage report and other information.
8
8
 
9
- This badge is generated using [genbadge](https://smarie.github.io/python-genbadge/).
9
+ This badge is generated using [genbadge].
10
10
 
11
11
  The badge is autogenerated via github actions. To manually generate a new badge, you can run the following commands.
12
12
 
@@ -20,3 +20,5 @@ You can generate this badge with just:
20
20
  ```bash
21
21
  just badge
22
22
  ```
23
+
24
+ [genbadge]: https://smarie.github.io/python-genbadge/
@@ -243,6 +243,10 @@ If your workflow runs more often than expected:
243
243
 
244
244
  ## Additional Resources
245
245
 
246
- - [GitHub Actions: Workflow syntax for paths](https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#onpushpull_requestpull_request_targetpathspaths-ignore)
247
- - [GitHub Actions: Filter pattern cheat sheet](https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#filter-pattern-cheat-sheet)
248
- - [GitHub Actions Labeler](https://github.com/actions/labeler) - For automatic PR labeling based on file patterns
246
+ - [GitHub Actions: Workflow syntax for paths]
247
+ - [GitHub Actions: Filter pattern cheat sheet]
248
+ - [GitHub Actions Labeler] - For automatic PR labeling based on file patterns
249
+
250
+ [github actions labeler]: https://github.com/actions/labeler
251
+ [github actions: filter pattern cheat sheet]: https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#filter-pattern-cheat-sheet
252
+ [github actions: workflow syntax for paths]: https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#onpushpull_requestpull_request_targetpathspaths-ignore
@@ -10,7 +10,7 @@ Render Engine project.
10
10
 
11
11
  ### Ruff (Python)
12
12
 
13
- Render Engine uses [Ruff](https://docs.astral.sh/ruff/) for Python linting and formatting with the following
13
+ Render Engine uses [Ruff] for Python linting and formatting with the following
14
14
  configuration:
15
15
 
16
16
  - **Line length**: 120 characters
@@ -177,3 +177,5 @@ format DIRECTORY='.':
177
177
  format-fix DIRECTORY='.':
178
178
  uvx ruff format {{ DIRECTORY }}
179
179
  ```
180
+
181
+ [ruff]: https://docs.astral.sh/ruff/
@@ -36,7 +36,7 @@ These tools can be called via `just`. If you wanted to run them without `just` y
36
36
 
37
37
  ### Type Checking
38
38
 
39
- See our section on [typechecking](/contributing/typechecking/)
39
+ See our section on [typechecking]
40
40
 
41
41
  ### Linting and Formatting
42
42
 
@@ -67,3 +67,5 @@ uvx ruff check . --fix
67
67
  uvx ruff format .
68
68
  uvx ruff check .
69
69
  ```
70
+
71
+ [typechecking]: /contributing/typechecking/
@@ -0,0 +1,65 @@
1
+ ---
2
+ title: "Data Objects"
3
+ description: "Overview of Data Objects in Render Engine"
4
+ date: March 15, 2026
5
+ tags: ["data_objects"]
6
+ ---
7
+ <!-- markdownlint-disable MD056 -->
8
+ While Render Engine is a static site generator, there are times when it might be useful to have machine-readable data
9
+ available on your site. For example, if you wish to include a [humans.json] file it might be simpler to maintain as a
10
+ Python dictionary and have Render Engine output the JSON.
11
+
12
+ ## DataObject
13
+
14
+ The `DataObject` base class allows for the rendering of a serializable Python object to the site's file system during
15
+ site rendering.
16
+
17
+ ### Attributes
18
+
19
+ | Name | Type | Description |
20
+ |-------------------|---------------|---------------------------------------------------------------------------|
21
+ | `data_object` | `Any` | The object to serialize. |
22
+ | `serializer` | 'Callable` | The function to serialize with. |
23
+ | `serializer_args` | dict | Optional `kwargs` to be passed to the `serializer` along with the object. |
24
+ | `routes` | list | List of directories to output the serialized object to. |
25
+ | `path_name` | `str \| Path` | The filename to output the serialized data to. |
26
+
27
+ The `serializer` is a function that takes a single positional argument and optional `**kwargs`. Should you wish to use
28
+ a function with a different signature, you will need to write a wrapper around it.
29
+
30
+ The default `serialize` function is `json.dumps`.
31
+
32
+ ### Configuring a `DataObject`
33
+
34
+ There are 2 ways to configure a `DataObject` and add it to your `Site`:
35
+
36
+ 1. Using the `Site.data_object` decorator:
37
+
38
+ ```python
39
+ import toml
40
+ from render_engine import Site, DataObject
41
+
42
+ app = Site()
43
+
44
+ @app.data_object
45
+ class MyDataObject(DataObject):
46
+ data_object = {'foo': 'bar'}
47
+ serializer = toml.dumps
48
+ ```
49
+
50
+ 2. Using the `Site.data_object` method:
51
+
52
+ ```python
53
+ import toml
54
+ from render_engine import Site, DataObject
55
+
56
+ app = Site()
57
+
58
+ class MyDataObject(DataObject):
59
+ data_object = {'foo': 'bar'}
60
+ serializer = toml.dumps
61
+
62
+ app.data_object(MyDataObject)
63
+ ```
64
+
65
+ [humans.json]: https://codeberg.org/robida/human.json
@@ -11,9 +11,9 @@ Feed Objects for Generating RSS Feeds
11
11
 
12
12
  `RSSFeed`
13
13
 
14
- Bases: [`BasePage`](page.md?id=basepage)
14
+ Bases: [`BasePage`]
15
15
 
16
- Creates an RSS feed [Page](page.md) Object.
16
+ Creates an RSS feed [Page] Object.
17
17
 
18
18
  > !!! Note
19
19
  This is the base object type and should only contain the params identified by the
@@ -37,3 +37,6 @@ This is built using the built-in `rss2.0.xml` jinja template.
37
37
  ```
38
38
 
39
39
  [rss-spec]: http://www.rssboard.org/rss-specification
40
+
41
+ [`basepage`]: page.md?id=basepage
42
+ [page]: page.md
@@ -7,7 +7,7 @@ date: August 22, 2024
7
7
  tags: ["building", "site-generation", "render-engine"]
8
8
  ---
9
9
 
10
- Once you've created the [layout](layout.md) of your site, you can start building it.
10
+ Once you've created the [layout] of your site, you can start building it.
11
11
 
12
12
  ## Calling `render()`
13
13
 
@@ -39,3 +39,5 @@ render-engine build app:app
39
39
  Your site will be generated in the `output` folder.
40
40
 
41
41
  [cli-build]: ../cli.md#building-your-site-with-render-engine-build
42
+
43
+ [layout]: layout.md