koriander 0.1.0__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 (100) hide show
  1. koriander-0.1.0/PKG-INFO +151 -0
  2. koriander-0.1.0/README.md +132 -0
  3. koriander-0.1.0/pyproject.toml +53 -0
  4. koriander-0.1.0/src/go2django/__init__.py +5 -0
  5. koriander-0.1.0/src/go2django/convert.py +1490 -0
  6. koriander-0.1.0/src/go2django/convert_tests.csv +98 -0
  7. koriander-0.1.0/src/go2django/hugo_functions.py +280 -0
  8. koriander-0.1.0/src/go2django/hugo_templates.lark +233 -0
  9. koriander-0.1.0/src/go2django/parse_tests.csv +176 -0
  10. koriander-0.1.0/src/go2django/tests.py +163 -0
  11. koriander-0.1.0/src/koriander/__init__.py +3 -0
  12. koriander-0.1.0/src/koriander/admin.py +304 -0
  13. koriander-0.1.0/src/koriander/apps.py +14 -0
  14. koriander-0.1.0/src/koriander/asgi.py +18 -0
  15. koriander-0.1.0/src/koriander/assets/default.scss +78 -0
  16. koriander-0.1.0/src/koriander/assets/syntax.css +79 -0
  17. koriander-0.1.0/src/koriander/cli.py +41 -0
  18. koriander-0.1.0/src/koriander/context_processors.py +17 -0
  19. koriander-0.1.0/src/koriander/fallback_templates/404.html +13 -0
  20. koriander-0.1.0/src/koriander/fallback_templates/_default/_markup/render-image.html +19 -0
  21. koriander-0.1.0/src/koriander/fallback_templates/_default/baseof.html +33 -0
  22. koriander-0.1.0/src/koriander/fallback_templates/_default/list.html +15 -0
  23. koriander-0.1.0/src/koriander/fallback_templates/_default/single.html +18 -0
  24. koriander-0.1.0/src/koriander/fallback_templates/_internal/pagination.html +82 -0
  25. koriander-0.1.0/src/koriander/fallback_templates/alias.html +16 -0
  26. koriander-0.1.0/src/koriander/fallback_templates/index.html +17 -0
  27. koriander-0.1.0/src/koriander/fallback_templates/tags/taxonomy.html +16 -0
  28. koriander-0.1.0/src/koriander/fallback_templates/tags/term.html +19 -0
  29. koriander-0.1.0/src/koriander/feeds.py +69 -0
  30. koriander-0.1.0/src/koriander/image_data.py +124 -0
  31. koriander-0.1.0/src/koriander/loader.py +33 -0
  32. koriander-0.1.0/src/koriander/manage.py +25 -0
  33. koriander-0.1.0/src/koriander/management/__init__.py +3 -0
  34. koriander-0.1.0/src/koriander/management/commands/__init__.py +3 -0
  35. koriander-0.1.0/src/koriander/management/commands/create.py +30 -0
  36. koriander-0.1.0/src/koriander/management/commands/hugo_import.py +620 -0
  37. koriander-0.1.0/src/koriander/management/commands/render.py +269 -0
  38. koriander-0.1.0/src/koriander/management/commands/serve.py +58 -0
  39. koriander-0.1.0/src/koriander/management/commands/validate_page_resource_cache.py +39 -0
  40. koriander-0.1.0/src/koriander/management/commands/validate_references.py +70 -0
  41. koriander-0.1.0/src/koriander/markdown.py +140 -0
  42. koriander-0.1.0/src/koriander/markdown_extensions.py +294 -0
  43. koriander-0.1.0/src/koriander/migrations/0001_initial.py +292 -0
  44. koriander-0.1.0/src/koriander/migrations/0002_template.py +48 -0
  45. koriander-0.1.0/src/koriander/migrations/0003_staticfile.py +78 -0
  46. koriander-0.1.0/src/koriander/migrations/__init__.py +3 -0
  47. koriander-0.1.0/src/koriander/models.py +692 -0
  48. koriander-0.1.0/src/koriander/settings.py +311 -0
  49. koriander-0.1.0/src/koriander/sitemaps.py +51 -0
  50. koriander-0.1.0/src/koriander/staff_views.py +299 -0
  51. koriander-0.1.0/src/koriander/static/codemirror/codemirror_widget.css +5 -0
  52. koriander-0.1.0/src/koriander/static/codemirror/codemirror_widget.js +25 -0
  53. koriander-0.1.0/src/koriander/static/codemirror/editor.bundle.js +3 -0
  54. koriander-0.1.0/src/koriander/static/default.css +199 -0
  55. koriander-0.1.0/src/koriander/static/easymde/easymde.min.css +10 -0
  56. koriander-0.1.0/src/koriander/static/easymde/easymde.min.js +10 -0
  57. koriander-0.1.0/src/koriander/static/font-awesome/css/all.min.css +13 -0
  58. koriander-0.1.0/src/koriander/static/font-awesome/webfonts/fa-brands-400.ttf +0 -0
  59. koriander-0.1.0/src/koriander/static/font-awesome/webfonts/fa-brands-400.ttf.license +4 -0
  60. koriander-0.1.0/src/koriander/static/font-awesome/webfonts/fa-brands-400.woff2 +0 -0
  61. koriander-0.1.0/src/koriander/static/font-awesome/webfonts/fa-brands-400.woff2.license +4 -0
  62. koriander-0.1.0/src/koriander/static/font-awesome/webfonts/fa-regular-400.ttf +0 -0
  63. koriander-0.1.0/src/koriander/static/font-awesome/webfonts/fa-regular-400.ttf.license +4 -0
  64. koriander-0.1.0/src/koriander/static/font-awesome/webfonts/fa-regular-400.woff2 +0 -0
  65. koriander-0.1.0/src/koriander/static/font-awesome/webfonts/fa-regular-400.woff2.license +4 -0
  66. koriander-0.1.0/src/koriander/static/font-awesome/webfonts/fa-solid-900.ttf +0 -0
  67. koriander-0.1.0/src/koriander/static/font-awesome/webfonts/fa-solid-900.ttf.license +4 -0
  68. koriander-0.1.0/src/koriander/static/font-awesome/webfonts/fa-solid-900.woff2 +0 -0
  69. koriander-0.1.0/src/koriander/static/font-awesome/webfonts/fa-solid-900.woff2.license +4 -0
  70. koriander-0.1.0/src/koriander/static/font-awesome/webfonts/fa-v4compatibility.ttf +0 -0
  71. koriander-0.1.0/src/koriander/static/font-awesome/webfonts/fa-v4compatibility.ttf.license +4 -0
  72. koriander-0.1.0/src/koriander/static/font-awesome/webfonts/fa-v4compatibility.woff2 +0 -0
  73. koriander-0.1.0/src/koriander/static/font-awesome/webfonts/fa-v4compatibility.woff2.license +4 -0
  74. koriander-0.1.0/src/koriander/static/htmx/htmx.js +5346 -0
  75. koriander-0.1.0/src/koriander/static/post_editor.js +224 -0
  76. koriander-0.1.0/src/koriander/templates/admin/koriander/template/change_form.html +7 -0
  77. koriander-0.1.0/src/koriander/templates/admin/resource_image_links.html +14 -0
  78. koriander-0.1.0/src/koriander/templates/editor/editor.html +53 -0
  79. koriander-0.1.0/src/koriander/templates/editor/page_search_results.html +18 -0
  80. koriander-0.1.0/src/koriander/templates/editor/preview.html +5 -0
  81. koriander-0.1.0/src/koriander/templates/robots.txt +4 -0
  82. koriander-0.1.0/src/koriander/tests/__init__.py +3 -0
  83. koriander-0.1.0/src/koriander/tests/test_commands.py +102 -0
  84. koriander-0.1.0/src/koriander/tests/test_e2e.py +635 -0
  85. koriander-0.1.0/src/koriander/tests/test_markdown.py +330 -0
  86. koriander-0.1.0/src/koriander/tests/test_models.py +115 -0
  87. koriander-0.1.0/src/koriander/tests/test_staff_views.py +135 -0
  88. koriander-0.1.0/src/koriander/tests/test_views.py +212 -0
  89. koriander-0.1.0/src/koriander/tests/utils.py +113 -0
  90. koriander-0.1.0/src/koriander/urls.py +129 -0
  91. koriander-0.1.0/src/koriander/user/__init__.py +3 -0
  92. koriander-0.1.0/src/koriander/user/admin.py +13 -0
  93. koriander-0.1.0/src/koriander/user/apps.py +12 -0
  94. koriander-0.1.0/src/koriander/user/migrations/0001_initial.py +133 -0
  95. koriander-0.1.0/src/koriander/user/migrations/__init__.py +3 -0
  96. koriander-0.1.0/src/koriander/user/models.py +16 -0
  97. koriander-0.1.0/src/koriander/utils.py +57 -0
  98. koriander-0.1.0/src/koriander/views.py +312 -0
  99. koriander-0.1.0/src/koriander/widgets.py +23 -0
  100. koriander-0.1.0/src/koriander/wsgi.py +18 -0
@@ -0,0 +1,151 @@
1
+ Metadata-Version: 2.3
2
+ Name: koriander
3
+ Version: 0.1.0
4
+ Summary: Add your description here
5
+ Requires-Dist: bleach>=6.3.0
6
+ Requires-Dist: django>=6.0.4
7
+ Requires-Dist: gunicorn>=25.3.0
8
+ Requires-Dist: honcho>=2.0.0
9
+ Requires-Dist: markdown>=3.10.2
10
+ Requires-Dist: pillow>=12.2.0
11
+ Requires-Dist: pygments>=2.20.0
12
+ Requires-Dist: whitenoise>=6.12.0
13
+ Requires-Dist: lark[interegular]>=1.3.1
14
+ Requires-Dist: pyparsing>=3.3.0
15
+ Requires-Dist: pyyaml>=6.0.3
16
+ Requires-Dist: xdg-base-dirs>=6.0.2
17
+ Requires-Python: >=3.12
18
+ Description-Content-Type: text/markdown
19
+
20
+ <!-- SPDX-License-Identifier: AGPL-3.0-or-later
21
+ SPDX-FileCopyrightText: 2026 JWP Consulting GK -->
22
+ # Koriander CMS
23
+
24
+ Koriander CMS combines static site generation like Hugo and a dynamic CMS experience like Ghost into one application.
25
+
26
+ Koriander is early stage and powers the author's personal blog at <https://www.justus.pw>. [Read more about Koriander](https://www.justus.pw/posts/2026-06-19-creating-koriander.html).
27
+
28
+ ## Try Koriander CMS
29
+
30
+ Here's how you can try Koriander CMS on your computer.
31
+
32
+ First, ensure that your computer can run the `pipx`. [Learn how to install pipx](https://pipx.pypa.io/stable/how-to/install-pipx/).
33
+
34
+ Once `pipx` runs on your computer, install Koriander by typing the following command in your terminal.
35
+
36
+ ```bash
37
+ pipx install git+ssh://git@codeberg.org/jwpconsulting/koriander.git
38
+ ```
39
+
40
+ When the installation finishes, your terminal should print the following:
41
+
42
+ ```
43
+ ⣷ installing koriander from spec 'git+ssh://git@codeberg.org/jwpconsulting/koriander.git' installed package koriander 0.1.0, installed using Python 3.13.12
44
+ These apps are now globally available
45
+ - koriander
46
+ done! ✨ 🌟 ✨
47
+ ```
48
+
49
+ Run the following `koriander serve` command in a new directory:
50
+
51
+ ```bash
52
+ koriander serve
53
+ ```
54
+
55
+ This should print a start up log and give you a log in link:
56
+
57
+ ```
58
+ Log in with the following link:
59
+
60
+ http://localhost:8000/dev-login/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/
61
+
62
+ Operations to perform:
63
+ Apply all migrations: admin, auth, contenttypes, koriander, koriander_user, sessions
64
+ Running migrations:
65
+ Applying contenttypes.0001_initial... OK
66
+
67
+ Log in with the following link:
68
+
69
+ http://localhost:8000/dev-login/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/
70
+
71
+
72
+ WARNING: This is a development server. Do not use it in a production setting. Use a production WSGI or ASGI server instead.
73
+ For more information on production servers see: https://docs.djangoproject.com/en/6.0/howto/deployment/
74
+ ```
75
+
76
+ Open the `http://localhost:8000/dev-login/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/` in your browser. You should now see the Koriander CMS.
77
+
78
+ ![koriander-magic-login](docs/koriander-magic-login.png)
79
+
80
+ When you first run the Koriander CMS, you should see a welcome message saying **Koriander installed successfully**.
81
+
82
+ ![Try editing the welcome page by following the **Edit page** link.](docs/koriander-edit-root-page.png)
83
+
84
+ Edit the current page by following the **Edit page** link in the top menu.
85
+
86
+ When you finish editing your page, render your entire Koriander CMS website with the `render` command:
87
+
88
+ ```bash
89
+ koriander render
90
+ ```
91
+
92
+ When you run `koriander render` in a terminal, it should print the following:
93
+
94
+ ```
95
+ Writing static files to scraped_site/static...
96
+
97
+ 157 static files copied to '/private/var/folders/k8/jnlz0xdn5jd48zttf3ktv7200000gn/T/tmp.BWupFFLrzH/scraped_site/static', 461 post-processed, 25 skipped due to conflict.
98
+ Static files collected to scraped_site/static
99
+ Seeding 0 redirect address(es)...
100
+ Seeding 6 URL(s) from sitemap.xml...
101
+ Rendered 404.html
102
+ Page has markdown body, but no summary, index.html
103
+ 200 /index.html (from seed)
104
+ 200 /robots.txt (from seed)
105
+ /Users/debian/.local/pipx/venvs/koriander/lib/python3.13/site-packages/koriander/views.py:221: UnorderedObjectListWarning: Pagination may yield inconsistent results with an unordered object_list: <class 'koriander.models.Tag'> QuerySet.
106
+ paginator = Paginator(
107
+ 200 /tags/index.html (from /sitemap.xml)
108
+ 200 /index.xml (from /sitemap.xml)
109
+ 200 /index.atom (from /sitemap.xml)
110
+ 200 /index.atom.xml (from /sitemap.xml)
111
+ 200 /redirects.json (from /sitemap.xml)
112
+ Crawled 7 page(s).
113
+ Render complete. Output in: scraped_site
114
+ ```
115
+
116
+ `koriander render` outputs your site in a `scraped_site` directory.
117
+
118
+ You can upload this site directory
119
+ to a static site host like GitHub Pages, Cloudflare, or Netlify.
120
+
121
+ ## Develop
122
+
123
+ Install everything:
124
+
125
+ ```bash
126
+ uv sync
127
+ ```
128
+
129
+ Test everything:
130
+
131
+ ```bash
132
+ bin/test.sh
133
+ ```
134
+
135
+ Format code:
136
+
137
+ ```bash
138
+ bin/format.sh
139
+ ```
140
+
141
+ Render:
142
+
143
+ ```bash
144
+ uv run koriander render; python -m http.server -d scraped_site
145
+ ```
146
+
147
+ Live preview:
148
+
149
+ ```bash
150
+ uv run koriander serve
151
+ ```
@@ -0,0 +1,132 @@
1
+ <!-- SPDX-License-Identifier: AGPL-3.0-or-later
2
+ SPDX-FileCopyrightText: 2026 JWP Consulting GK -->
3
+ # Koriander CMS
4
+
5
+ Koriander CMS combines static site generation like Hugo and a dynamic CMS experience like Ghost into one application.
6
+
7
+ Koriander is early stage and powers the author's personal blog at <https://www.justus.pw>. [Read more about Koriander](https://www.justus.pw/posts/2026-06-19-creating-koriander.html).
8
+
9
+ ## Try Koriander CMS
10
+
11
+ Here's how you can try Koriander CMS on your computer.
12
+
13
+ First, ensure that your computer can run the `pipx`. [Learn how to install pipx](https://pipx.pypa.io/stable/how-to/install-pipx/).
14
+
15
+ Once `pipx` runs on your computer, install Koriander by typing the following command in your terminal.
16
+
17
+ ```bash
18
+ pipx install git+ssh://git@codeberg.org/jwpconsulting/koriander.git
19
+ ```
20
+
21
+ When the installation finishes, your terminal should print the following:
22
+
23
+ ```
24
+ ⣷ installing koriander from spec 'git+ssh://git@codeberg.org/jwpconsulting/koriander.git' installed package koriander 0.1.0, installed using Python 3.13.12
25
+ These apps are now globally available
26
+ - koriander
27
+ done! ✨ 🌟 ✨
28
+ ```
29
+
30
+ Run the following `koriander serve` command in a new directory:
31
+
32
+ ```bash
33
+ koriander serve
34
+ ```
35
+
36
+ This should print a start up log and give you a log in link:
37
+
38
+ ```
39
+ Log in with the following link:
40
+
41
+ http://localhost:8000/dev-login/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/
42
+
43
+ Operations to perform:
44
+ Apply all migrations: admin, auth, contenttypes, koriander, koriander_user, sessions
45
+ Running migrations:
46
+ Applying contenttypes.0001_initial... OK
47
+
48
+ Log in with the following link:
49
+
50
+ http://localhost:8000/dev-login/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/
51
+
52
+
53
+ WARNING: This is a development server. Do not use it in a production setting. Use a production WSGI or ASGI server instead.
54
+ For more information on production servers see: https://docs.djangoproject.com/en/6.0/howto/deployment/
55
+ ```
56
+
57
+ Open the `http://localhost:8000/dev-login/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/` in your browser. You should now see the Koriander CMS.
58
+
59
+ ![koriander-magic-login](docs/koriander-magic-login.png)
60
+
61
+ When you first run the Koriander CMS, you should see a welcome message saying **Koriander installed successfully**.
62
+
63
+ ![Try editing the welcome page by following the **Edit page** link.](docs/koriander-edit-root-page.png)
64
+
65
+ Edit the current page by following the **Edit page** link in the top menu.
66
+
67
+ When you finish editing your page, render your entire Koriander CMS website with the `render` command:
68
+
69
+ ```bash
70
+ koriander render
71
+ ```
72
+
73
+ When you run `koriander render` in a terminal, it should print the following:
74
+
75
+ ```
76
+ Writing static files to scraped_site/static...
77
+
78
+ 157 static files copied to '/private/var/folders/k8/jnlz0xdn5jd48zttf3ktv7200000gn/T/tmp.BWupFFLrzH/scraped_site/static', 461 post-processed, 25 skipped due to conflict.
79
+ Static files collected to scraped_site/static
80
+ Seeding 0 redirect address(es)...
81
+ Seeding 6 URL(s) from sitemap.xml...
82
+ Rendered 404.html
83
+ Page has markdown body, but no summary, index.html
84
+ 200 /index.html (from seed)
85
+ 200 /robots.txt (from seed)
86
+ /Users/debian/.local/pipx/venvs/koriander/lib/python3.13/site-packages/koriander/views.py:221: UnorderedObjectListWarning: Pagination may yield inconsistent results with an unordered object_list: <class 'koriander.models.Tag'> QuerySet.
87
+ paginator = Paginator(
88
+ 200 /tags/index.html (from /sitemap.xml)
89
+ 200 /index.xml (from /sitemap.xml)
90
+ 200 /index.atom (from /sitemap.xml)
91
+ 200 /index.atom.xml (from /sitemap.xml)
92
+ 200 /redirects.json (from /sitemap.xml)
93
+ Crawled 7 page(s).
94
+ Render complete. Output in: scraped_site
95
+ ```
96
+
97
+ `koriander render` outputs your site in a `scraped_site` directory.
98
+
99
+ You can upload this site directory
100
+ to a static site host like GitHub Pages, Cloudflare, or Netlify.
101
+
102
+ ## Develop
103
+
104
+ Install everything:
105
+
106
+ ```bash
107
+ uv sync
108
+ ```
109
+
110
+ Test everything:
111
+
112
+ ```bash
113
+ bin/test.sh
114
+ ```
115
+
116
+ Format code:
117
+
118
+ ```bash
119
+ bin/format.sh
120
+ ```
121
+
122
+ Render:
123
+
124
+ ```bash
125
+ uv run koriander render; python -m http.server -d scraped_site
126
+ ```
127
+
128
+ Live preview:
129
+
130
+ ```bash
131
+ uv run koriander serve
132
+ ```
@@ -0,0 +1,53 @@
1
+ # SPDX-License-Identifier: AGPL-3.0-or-later
2
+ # SPDX-FileCopyrightText: 2026 JWP Consulting GK
3
+ #
4
+ # Koriander CMS pyproject.toml file
5
+ [project]
6
+ name = "koriander"
7
+ version = "0.1.0"
8
+ description = "Add your description here"
9
+ readme = "README.md"
10
+ requires-python = ">=3.12"
11
+ dependencies = [
12
+ "bleach>=6.3.0",
13
+ "django>=6.0.4",
14
+ "gunicorn>=25.3.0",
15
+ "honcho>=2.0.0",
16
+ "markdown>=3.10.2",
17
+ "pillow>=12.2.0",
18
+ "pygments>=2.20.0",
19
+ "whitenoise>=6.12.0",
20
+ # For importing from hugo
21
+ # TODO consider making this an optional dependency
22
+ "lark[interegular]>=1.3.1",
23
+ "pyparsing>=3.3.0",
24
+ "pyyaml>=6.0.3",
25
+ "xdg-base-dirs>=6.0.2",
26
+ ]
27
+
28
+ [project.scripts]
29
+ koriander_manage = "koriander.manage:main"
30
+ koriander = "koriander.cli:main"
31
+
32
+ [build-system]
33
+ requires = ["uv_build >= 0.11.21, <0.12.0"]
34
+ build-backend = "uv_build"
35
+
36
+ [tool.uv.build-backend]
37
+ module-name = ["koriander", "go2django"]
38
+
39
+ [dependency-groups]
40
+ dev = [
41
+ "django-debug-toolbar>=6.3.0",
42
+ "djlint>=1.36.4",
43
+ "mypy>=2.1.0",
44
+ "reuse>=6.2.0",
45
+ "ruff>=0.15.11",
46
+ ]
47
+
48
+ [tool.djlint]
49
+ indent = 4
50
+
51
+ [[tool.mypy.overrides]]
52
+ module = ["django.*", "markdown.*", "bleach.*", "yaml.*", "gunicorn.*"]
53
+ ignore_missing_imports = true
@@ -0,0 +1,5 @@
1
+ # SPDX-License-Identifier: AGPL-3.0-or-later
2
+ # SPDX-FileCopyrightText: 2026 JWP Consulting GK
3
+ """
4
+ Koriander Go to Django template conversion package.
5
+ """