Skip to content
This repository was archived by the owner on Sep 12, 2023. It is now read-only.
Draft
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
60 changes: 21 additions & 39 deletions poetry.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

10 changes: 7 additions & 3 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -62,13 +62,15 @@ httpx = "*"
msgspec = "*"
pydantic = "*"
python-dotenv = "*"
starlite = "^1.40.1"
starlite = ">=1.40.1,<1.50.2"
tenacity = "*"
uvicorn = "*"
uvloop = "*"
structlog = ">=22.2.0"

# Optionals
alembic = { version = "*", optional = true }
click = { version = "*", optional = true }
hiredis = { version = "*", optional = true }
redis = { version = "*", optional = true }
saq = { version = "^0.9.1", optional = true }
Expand All @@ -77,16 +79,18 @@ sqlalchemy = { version = "==2.0.0rc3", optional = true }

[tool.poetry.extras]
cache = ["redis", "hiredis"]
cli = ["click"]
worker = ["saq", "hiredis"]
sentry = ["sentry-sdk"]
sqlalchemy = ["sqlalchemy"]
all = ["redis", "hiredis", "saq", "sentry-sdk", "sqlalchemy"]
sqlalchemy = ["alembic", "sqlalchemy"]
all = ["click", "hiredis", "redis", "saq", "sentry-sdk", "sqlalchemy"]

[tool.poetry.plugins."pytest11"]
pytest_starlite_saqlalchemy = "pytest_starlite_saqlalchemy"

[tool.poetry.plugins."console_scripts"]
run-app = "starlite_saqlalchemy.scripts:run_app"
ssql = "starlite_saqlalchemy.cli:entry_point"

[tool.poetry.urls]
GitHub = "https://github.com/topsport-com-au"
Expand Down
29 changes: 29 additions & 0 deletions src/starlite_saqlalchemy/cli/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
"""CLI for starlite-saqlalchemy.

Examples `$ ssql --help`
"""
from __future__ import annotations

import click

from starlite_saqlalchemy.constants import IS_SAQ_INSTALLED, IS_SQLALCHEMY_INSTALLED

from . import api


@click.group()
def entry_point() -> None:
"""Starlite-saqlalchemy."""


entry_point.add_command(api.entry_point)

if IS_SAQ_INSTALLED:
from . import worker

entry_point.add_command(worker.entry_point)

if IS_SQLALCHEMY_INSTALLED:
from . import migrate

entry_point.add_command(migrate.entry_point)
9 changes: 9 additions & 0 deletions src/starlite_saqlalchemy/cli/api/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
"""API CLI entry point."""
from __future__ import annotations

import click


@click.group(name="api")
def entry_point() -> None:
"""Commands for API service."""
1 change: 1 addition & 0 deletions src/starlite_saqlalchemy/cli/api/commands.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
"""CLI commands for API."""
9 changes: 9 additions & 0 deletions src/starlite_saqlalchemy/cli/docs/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
"""Docs CLI entry point."""
from __future__ import annotations

import click


@click.group(name="docs")
def entry_point() -> None:
"""Commands for building and releasing docs."""
9 changes: 9 additions & 0 deletions src/starlite_saqlalchemy/cli/migrate/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
"""Migrate CLI entrypoint."""
from __future__ import annotations

import click


@click.group(name="migrate")
def entry_point() -> None:
"""Database migration commands."""
1 change: 1 addition & 0 deletions src/starlite_saqlalchemy/cli/migrate/commands.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
"""Commands for migrate group."""
9 changes: 9 additions & 0 deletions src/starlite_saqlalchemy/cli/worker/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
"""Worker CLI entry point."""
from __future__ import annotations

import click


@click.group(name="worker")
def entry_point() -> None:
"""Worker service commands."""
1 change: 1 addition & 0 deletions src/starlite_saqlalchemy/cli/worker/commands.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
"""CLI commands for worker."""
38 changes: 29 additions & 9 deletions src/starlite_saqlalchemy/scripts.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,8 @@
"""Application startup script."""
from __future__ import annotations

from typing import Literal, TypeVar

import uvicorn

from starlite_saqlalchemy import settings
Expand All @@ -22,17 +26,33 @@ def determine_reload_dirs(should_reload: bool) -> list[str] | None:
return settings.server.RELOAD_DIRS if should_reload else None


def run_app() -> None:
T = TypeVar("T")


def run_app(
app: str | None = None,
factory: bool | None = None,
host: str | None = None,
loop: Literal["none", "auto", "asyncio", "uvloop"] | None = None,
port: int | None = None,
reload: bool | None = None,
reload_dirs: list[str] | None = None,
timeout_keep_alive: int | None = None,
) -> None:
"""Run the application with config via environment."""
should_reload = determine_should_reload()
reload_dirs = determine_reload_dirs(should_reload)
should_reload = _not_none(reload, determine_should_reload())
reload_dirs = _not_none(reload_dirs, determine_reload_dirs(should_reload))
uvicorn.run(
app=settings.server.APP_LOC,
factory=settings.server.APP_LOC_IS_FACTORY,
host=settings.server.HOST,
loop="auto",
port=settings.server.PORT,
app=_not_none(app, settings.server.APP_LOC),
factory=_not_none(factory, settings.server.APP_LOC_IS_FACTORY),
host=_not_none(host, settings.server.HOST),
loop=_not_none(loop, "auto"),
port=_not_none(port, settings.server.PORT),
reload=should_reload,
reload_dirs=reload_dirs,
timeout_keep_alive=settings.server.KEEPALIVE,
timeout_keep_alive=_not_none(timeout_keep_alive, settings.server.KEEPALIVE),
)


def _not_none(maybe_none: T | None, fallback: T) -> T:
return maybe_none if maybe_none is not None else fallback