skrift 0.1.0a12__py3-none-any.whl → 0.1.0a14__py3-none-any.whl
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.
- skrift/asgi.py +20 -10
- skrift/config.py +11 -14
- skrift/lib/__init__.py +2 -1
- skrift/lib/markdown.py +37 -0
- skrift/templates/page.html +1 -1
- {skrift-0.1.0a12.dist-info → skrift-0.1.0a14.dist-info}/METADATA +3 -1
- {skrift-0.1.0a12.dist-info → skrift-0.1.0a14.dist-info}/RECORD +9 -8
- {skrift-0.1.0a12.dist-info → skrift-0.1.0a14.dist-info}/WHEEL +0 -0
- {skrift-0.1.0a12.dist-info → skrift-0.1.0a14.dist-info}/entry_points.txt +0 -0
skrift/asgi.py
CHANGED
|
@@ -44,6 +44,7 @@ from skrift.db.services.setting_service import (
|
|
|
44
44
|
SETUP_COMPLETED_AT_KEY,
|
|
45
45
|
)
|
|
46
46
|
from skrift.lib.exceptions import http_exception_handler, internal_server_error_handler
|
|
47
|
+
from skrift.lib.markdown import render_markdown
|
|
47
48
|
|
|
48
49
|
|
|
49
50
|
def load_controllers() -> list:
|
|
@@ -423,16 +424,20 @@ def create_app() -> Litestar:
|
|
|
423
424
|
# Search working directory first for user overrides, then package directory
|
|
424
425
|
working_dir_templates = Path(os.getcwd()) / "templates"
|
|
425
426
|
template_dir = Path(__file__).parent / "templates"
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
engine=JinjaTemplateEngine,
|
|
429
|
-
engine_callback=lambda engine: engine.engine.globals.update({
|
|
427
|
+
def configure_template_engine(engine):
|
|
428
|
+
engine.engine.globals.update({
|
|
430
429
|
"now": datetime.now,
|
|
431
430
|
"site_name": get_cached_site_name,
|
|
432
431
|
"site_tagline": get_cached_site_tagline,
|
|
433
432
|
"site_copyright_holder": get_cached_site_copyright_holder,
|
|
434
433
|
"site_copyright_start_year": get_cached_site_copyright_start_year,
|
|
435
|
-
})
|
|
434
|
+
})
|
|
435
|
+
engine.engine.filters.update({"markdown": render_markdown})
|
|
436
|
+
|
|
437
|
+
template_config = TemplateConfig(
|
|
438
|
+
directory=[working_dir_templates, template_dir],
|
|
439
|
+
engine=JinjaTemplateEngine,
|
|
440
|
+
engine_callback=configure_template_engine,
|
|
436
441
|
)
|
|
437
442
|
|
|
438
443
|
# Static files - working directory first for user overrides, then package directory
|
|
@@ -498,16 +503,21 @@ def create_setup_app() -> Litestar:
|
|
|
498
503
|
# Search working directory first for user overrides, then package directory
|
|
499
504
|
working_dir_templates = Path(os.getcwd()) / "templates"
|
|
500
505
|
template_dir = Path(__file__).parent / "templates"
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
engine
|
|
504
|
-
engine_callback=lambda engine: engine.engine.globals.update({
|
|
506
|
+
|
|
507
|
+
def configure_setup_template_engine(engine):
|
|
508
|
+
engine.engine.globals.update({
|
|
505
509
|
"now": datetime.now,
|
|
506
510
|
"site_name": lambda: "Skrift",
|
|
507
511
|
"site_tagline": lambda: "Setup",
|
|
508
512
|
"site_copyright_holder": lambda: "",
|
|
509
513
|
"site_copyright_start_year": lambda: None,
|
|
510
|
-
})
|
|
514
|
+
})
|
|
515
|
+
engine.engine.filters.update({"markdown": render_markdown})
|
|
516
|
+
|
|
517
|
+
template_config = TemplateConfig(
|
|
518
|
+
directory=[working_dir_templates, template_dir],
|
|
519
|
+
engine=JinjaTemplateEngine,
|
|
520
|
+
engine_callback=configure_setup_template_engine,
|
|
511
521
|
)
|
|
512
522
|
|
|
513
523
|
# Static files - working directory first for user overrides, then package directory
|
skrift/config.py
CHANGED
|
@@ -229,31 +229,28 @@ def is_config_valid() -> tuple[bool, str | None]:
|
|
|
229
229
|
@lru_cache
|
|
230
230
|
def get_settings() -> Settings:
|
|
231
231
|
"""Load settings from .env and app.yaml."""
|
|
232
|
-
# First create base settings from .env
|
|
233
|
-
base_settings = Settings()
|
|
234
|
-
|
|
235
232
|
# Load app.yaml config
|
|
236
233
|
try:
|
|
237
234
|
app_config = load_app_config()
|
|
238
235
|
except FileNotFoundError:
|
|
239
|
-
return
|
|
236
|
+
return Settings()
|
|
240
237
|
except ValueError:
|
|
241
238
|
# Missing environment variables - return base settings
|
|
242
|
-
return
|
|
239
|
+
return Settings()
|
|
243
240
|
|
|
244
|
-
#
|
|
245
|
-
|
|
241
|
+
# Build nested configs from YAML - pass directly to Settings to avoid
|
|
242
|
+
# model_copy issues with nested BaseModel instances in Pydantic v2
|
|
243
|
+
kwargs = {}
|
|
246
244
|
|
|
247
245
|
if "db" in app_config:
|
|
248
|
-
|
|
246
|
+
kwargs["db"] = DatabaseConfig(**app_config["db"])
|
|
249
247
|
|
|
250
248
|
if "auth" in app_config:
|
|
251
|
-
|
|
249
|
+
kwargs["auth"] = AuthConfig(**app_config["auth"])
|
|
252
250
|
|
|
253
251
|
if "session" in app_config:
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
if updates:
|
|
257
|
-
return base_settings.model_copy(update=updates)
|
|
252
|
+
kwargs["session"] = SessionConfig(**app_config["session"])
|
|
258
253
|
|
|
259
|
-
|
|
254
|
+
# Create Settings with YAML nested configs
|
|
255
|
+
# BaseSettings will still load debug/secret_key from env, but kwargs take precedence
|
|
256
|
+
return Settings(**kwargs)
|
skrift/lib/__init__.py
CHANGED
skrift/lib/markdown.py
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"""Markdown rendering utilities for page content."""
|
|
2
|
+
|
|
3
|
+
from markdown_it import MarkdownIt
|
|
4
|
+
from mdit_py_plugins.footnote import footnote_plugin
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
def create_markdown_renderer() -> MarkdownIt:
|
|
8
|
+
"""Create a configured markdown renderer with standard plugins."""
|
|
9
|
+
md = MarkdownIt("commonmark", {"typographer": True})
|
|
10
|
+
md.enable("table")
|
|
11
|
+
footnote_plugin(md)
|
|
12
|
+
return md
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
_renderer: MarkdownIt | None = None
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def get_renderer() -> MarkdownIt:
|
|
19
|
+
"""Get the singleton markdown renderer, creating it if needed."""
|
|
20
|
+
global _renderer
|
|
21
|
+
if _renderer is None:
|
|
22
|
+
_renderer = create_markdown_renderer()
|
|
23
|
+
return _renderer
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def render_markdown(content: str) -> str:
|
|
27
|
+
"""Render markdown content to HTML.
|
|
28
|
+
|
|
29
|
+
Args:
|
|
30
|
+
content: Markdown text to render.
|
|
31
|
+
|
|
32
|
+
Returns:
|
|
33
|
+
Rendered HTML string. Returns empty string for empty/None input.
|
|
34
|
+
"""
|
|
35
|
+
if not content:
|
|
36
|
+
return ""
|
|
37
|
+
return get_renderer().render(content)
|
skrift/templates/page.html
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: skrift
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.0a14
|
|
4
4
|
Summary: A lightweight async Python CMS for crafting modern websites
|
|
5
5
|
Requires-Python: >=3.13
|
|
6
6
|
Requires-Dist: advanced-alchemy>=0.26.0
|
|
@@ -9,6 +9,8 @@ Requires-Dist: alembic>=1.14.0
|
|
|
9
9
|
Requires-Dist: asyncpg>=0.30.0
|
|
10
10
|
Requires-Dist: httpx>=0.28.0
|
|
11
11
|
Requires-Dist: litestar[cryptography,jinja,standard]>=2.14.0
|
|
12
|
+
Requires-Dist: markdown-it-py>=3.0.0
|
|
13
|
+
Requires-Dist: mdit-py-plugins>=0.4.0
|
|
12
14
|
Requires-Dist: pydantic-settings>=2.7.0
|
|
13
15
|
Requires-Dist: python-dotenv>=1.0.0
|
|
14
16
|
Requires-Dist: pyyaml>=6.0.0
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
skrift/__init__.py,sha256=eXE5PFVkJpH5XsV_ZlrTIeFPUPrmcHYAj4GpRS3R5PY,29
|
|
2
2
|
skrift/__main__.py,sha256=wt6JZL9nBhKU36vdyurhOEtWy7w3C9zohyy24PLcKho,164
|
|
3
3
|
skrift/alembic.ini,sha256=mYguI6CbMCTyfHctsGiTyf9Z5gv21FdeI3qtfgOHO3A,1815
|
|
4
|
-
skrift/asgi.py,sha256=
|
|
4
|
+
skrift/asgi.py,sha256=7uPvgsGMpZJyPOjIGxL9QlXTRLWh9uRAhcg-RdBS1c8,23355
|
|
5
5
|
skrift/cli.py,sha256=aT-7pXvOuuZC-Eypx1h-xCiqaBKhIFjSqd5Ky_dHna0,4214
|
|
6
|
-
skrift/config.py,sha256=
|
|
6
|
+
skrift/config.py,sha256=ZDOrYgp6gC6fE1nEZgrAOouoykhRo2NZo5U1-WLdDSc,7862
|
|
7
7
|
skrift/admin/__init__.py,sha256=x81Cj_ilVmv6slaMl16HHyT_AgrnLxKEWkS0RPa4V9s,289
|
|
8
8
|
skrift/admin/controller.py,sha256=5ZDypvKHXLNDESsKNsdsH2E3Si5OqlpzttFl7Ot8aF0,15651
|
|
9
9
|
skrift/admin/navigation.py,sha256=VwttFoIUIJy5rONKIkJd5w4CNkUpeK22_OfLGHecN34,3382
|
|
@@ -35,8 +35,9 @@ skrift/db/services/__init__.py,sha256=qAC24IPOYg6AampUWonmLeajljQRMwUw0lgXksQG6N
|
|
|
35
35
|
skrift/db/services/oauth_service.py,sha256=1065tYGvrSer0X28GblibrSz2BjwVjl3tndXk1plthE,5208
|
|
36
36
|
skrift/db/services/page_service.py,sha256=cXJ-urV7LjUDoVsT1P52f6wcOsur3T-pvqKkGG4xlvI,5246
|
|
37
37
|
skrift/db/services/setting_service.py,sha256=eqFxukn8QFrDHQbaBILOLjP1nr34JPIPFT_NnhmeaTY,5613
|
|
38
|
-
skrift/lib/__init__.py,sha256=
|
|
38
|
+
skrift/lib/__init__.py,sha256=Ew53SFcJcoohNF_FEDoDXsrks9cKZQonoaJAWyjXWMs,132
|
|
39
39
|
skrift/lib/exceptions.py,sha256=p8ceLIQCc7agCwW6-mhBDAuMAMxZDcf9TDLC6PfztU4,5803
|
|
40
|
+
skrift/lib/markdown.py,sha256=fPLUIAsmFXC64Os2RngQG7P2xRKBd1RO8fh7b5_gV1U,950
|
|
40
41
|
skrift/lib/template.py,sha256=4_urkRfvth75yNeQ5TyGTHvkvs3vVef7TcwZx0k285k,4226
|
|
41
42
|
skrift/setup/__init__.py,sha256=3VjFPMES5y0M5cQ9R4C1xazqiEPEDqTPjX9-3rBMXnA,478
|
|
42
43
|
skrift/setup/config_writer.py,sha256=YFH3FVjXN7Rum2fzGVPAQRkjdc9b0bHECDqMKYiEkhg,6347
|
|
@@ -50,7 +51,7 @@ skrift/templates/error-404.html,sha256=sJrDaF3Or3Nyki8mxo3wBxLLzgy4wkB9p9wdS8pRA
|
|
|
50
51
|
skrift/templates/error-500.html,sha256=MR0wJ1JKLqdmdvsoJbQnZxLkxDPE59LrlbtVPKLM8-A,401
|
|
51
52
|
skrift/templates/error.html,sha256=tg45Hj0wNc9QiZKBVVQ2WsqDiAkByXZnuehTdJPclXc,415
|
|
52
53
|
skrift/templates/index.html,sha256=lzZlnoZ2luY__OtRVa61mpQIgcopAbkKa2rS9XRfRlI,172
|
|
53
|
-
skrift/templates/page.html,sha256=
|
|
54
|
+
skrift/templates/page.html,sha256=aSTypibx86SzIhO7GTff8XXVrW8D-XbHNaTo_UT31oc,770
|
|
54
55
|
skrift/templates/admin/admin.html,sha256=8sErpGKedl7Hf_CMeu53bUEHptH1FqdBX9LT3z-1HcU,454
|
|
55
56
|
skrift/templates/admin/base.html,sha256=JX1MPw9XTY8jCT2M6iHUwEj8NPNOdZPca2cDUEs9kfQ,659
|
|
56
57
|
skrift/templates/admin/pages/edit.html,sha256=s-uZ4BYG7BdnWYTBSS1mr5aFL8XfT8h-KNiSIraWmHw,1322
|
|
@@ -68,7 +69,7 @@ skrift/templates/setup/configuring.html,sha256=2KHW9h2BrJgL_kO5IizbAYs4pnFLyRf76
|
|
|
68
69
|
skrift/templates/setup/database.html,sha256=gU4-315-QraHa2Eq4Fh3b55QpOM2CkJzh27_Yz13frA,5495
|
|
69
70
|
skrift/templates/setup/restart.html,sha256=GHg31F_e2uLFhWUzJoalk0Y0oYLqsFWyZXWKX3mblbY,1355
|
|
70
71
|
skrift/templates/setup/site.html,sha256=PSOH-q1-ZBl47iSW9-Ad6lEfJn_fzdGD3Pk4vb3xgK4,1680
|
|
71
|
-
skrift-0.1.
|
|
72
|
-
skrift-0.1.
|
|
73
|
-
skrift-0.1.
|
|
74
|
-
skrift-0.1.
|
|
72
|
+
skrift-0.1.0a14.dist-info/METADATA,sha256=unD0pS4u31RZprH6rOeGVZJ_zA565aw7wTFxXzG91Go,6511
|
|
73
|
+
skrift-0.1.0a14.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
|
|
74
|
+
skrift-0.1.0a14.dist-info/entry_points.txt,sha256=uquZ5Mumqr0xwYTpTcNiJtFSITGfF6_QCCy2DZJSZig,42
|
|
75
|
+
skrift-0.1.0a14.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|