Skip to content
This repository has been archived by the owner on Aug 15, 2024. It is now read-only.

🐛 add mimetype recognition for assets #9

Merged
merged 3 commits into from
Feb 21, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 6 additions & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -37,4 +37,9 @@ restart-docs-app:
serve-docs:
@echo "Serving docs..."
docker build -t schorle-docs -f docs/Dockerfile.docs .
docker run -p 4444:4444 -it schorle-docs
docker run -p 4444:4444 -it schorle-docs

build-bundle:
@echo "Building bundle..."
cd src/typescript && yarn build
@echo "Done."
21 changes: 10 additions & 11 deletions src/python/schorle/app.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import asyncio
import pkgutil
import mimetypes
from asyncio import Task, iscoroutinefunction
from collections.abc import Callable
from functools import partial
Expand All @@ -11,7 +11,7 @@
from loguru import logger
from lxml import etree
from starlette.endpoints import WebSocketEndpoint
from starlette.responses import FileResponse, HTMLResponse, PlainTextResponse
from starlette.responses import FileResponse, HTMLResponse
from starlette.types import Receive, Scope, Send
from starlette.websockets import WebSocket

Expand All @@ -22,19 +22,18 @@
from schorle.theme import Theme
from schorle.utils import RunningMode, get_running_mode, render_in_context

ASSETS_PATH = Path(str(files("schorle"))) / Path("assets")


def favicon() -> FileResponse:
package_path = files("schorle")
favicon_path = Path(str(package_path)) / "assets" / "favicon.svg"
favicon_path = ASSETS_PATH / "favicon.svg"
return FileResponse(favicon_path, media_type="image/svg+xml")


def assets(file_name: str) -> PlainTextResponse:
_bundle = pkgutil.get_data("schorle", f"assets/{file_name}")
if _bundle:
return PlainTextResponse(_bundle.decode("utf-8"), status_code=200)
else:
return PlainTextResponse(f"File not found: {file_name}", status_code=404)
def assets(file_name: str) -> FileResponse:
file_path = ASSETS_PATH / file_name
mime_type, _ = mimetypes.guess_type(file_path)
return FileResponse(file_path, media_type=mime_type)


PATH_HEADER = "X-Schorle-Session-Path"
Expand All @@ -45,7 +44,7 @@ class Schorle:
def __init__(self, theme: Theme = Theme.DARK, lang: str = "en", extra_assets: list | None = None) -> None:
self._pages: dict[str, Page] = {}
self.backend = FastAPI()
self.backend.get("/_schorle/assets/{file_name:path}")(assets)
self.backend.get("/_schorle/assets/{file_name:path}", response_class=FileResponse)(assets)
self.backend.add_websocket_route("/_schorle/events", partial(EventsEndpoint, pages=self._pages))
self.backend.get("/favicon.svg", response_class=FileResponse)(favicon)
self.theme: Theme = theme
Expand Down
Loading