Skip to content

Commit

Permalink
layout events_table
Browse files Browse the repository at this point in the history
  • Loading branch information
jrycw committed Feb 27, 2024
1 parent 3aa33e1 commit 04a5039
Show file tree
Hide file tree
Showing 29 changed files with 320 additions and 239 deletions.
41 changes: 41 additions & 0 deletions app/_fixtures.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
from edgedb.asyncio_client import AsyncIOClient
from faker import Faker

fker = Faker()


async def add_users(db_client: AsyncIOClient, target_n_users=5):
"""
faker.name() might produce the same name. Using `set` to make sure `target_n_users` can be achieved.
"""
names = set()
while len(names) < target_n_users:
names.add(fker.name())

await db_client.query(
"""\
delete Event;
delete User;
for name in array_unpack(<array<str>>$names)
union (insert User {name:= name});\
""",
names=list(names),
)


async def add_events(db_client: AsyncIOClient, target_n_events=5):
"""
faker.text() might produce the same name. Using `set` to make sure `target_n_events` can be achieved.
"""
names = set()
while len(names) < target_n_events:
names.add(fker.text(max_nb_chars=20).rstrip("."))

await db_client.query(
"""\
with dummy_user:= (insert User {name:= "dummy user"}),
for name in array_unpack(<array<str>>$names)
union (insert Event {name:= name, host:= dummy_user });\
""",
names=list(names),
)
41 changes: 0 additions & 41 deletions app/_internal.py

This file was deleted.

9 changes: 8 additions & 1 deletion app/_lifespan.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,10 @@
from edgedb.asyncio_client import AsyncIOClient
from fastapi import FastAPI

from ._fixtures import add_events, add_users

async def _lifespan(app: FastAPI, registry: svcs.Registry):

async def _lifespan(app: FastAPI, registry: svcs.Registry, prefill: bool = False):
# EdgeDB client
db_client = edgedb.create_async_client()

Expand All @@ -20,6 +22,11 @@ async def ping_db_callable(_db_client):
ping=ping_db_callable,
)

# Add users and events for testing
if prefill:
await add_users(db_client)
await add_events(db_client)

yield

await registry.aclose()
Expand Down
8 changes: 8 additions & 0 deletions app/common.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
from fastapi import APIRouter

router = APIRouter(include_in_schema=False)


@router.get("/")
async def home():
return {"message": "Hello World from FastAPI"}
4 changes: 3 additions & 1 deletion app/lifespan.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
from functools import partial

import svcs

from ._lifespan import _lifespan

lifespan = svcs.fastapi.lifespan(_lifespan)
lifespan = svcs.fastapi.lifespan(partial(_lifespan, prefill=True))
4 changes: 2 additions & 2 deletions app/main.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
from fastapi import FastAPI
from starlette.middleware.cors import CORSMiddleware

from app import _internal, events, health, users
from app import common, events, health, users

from .lifespan import lifespan

Expand All @@ -21,7 +21,7 @@ def make_app(lifespan):
app.include_router(users.router)
app.include_router(events.router)
app.include_router(health.router)
app.include_router(_internal.router)
app.include_router(common.router)

return app

Expand Down
4 changes: 2 additions & 2 deletions app/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -48,8 +48,8 @@ class EventBase(BaseModel):


class EventCreate(EventBase):
address: str
schedule: datetime.datetime
address: str | None
schedule: datetime.datetime | None
host_name: str = Field(max_length=50)


Expand Down
1 change: 1 addition & 0 deletions app/queries/get_event_by_name.edgeql
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
select Event {
name,
created_at,
address,
schedule,
host : {name}
Expand Down
2 changes: 2 additions & 0 deletions app/queries/get_event_by_name_async_edgeql.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ def __get_validators__(cls):
class GetEventByNameResult(NoPydanticValidation):
id: uuid.UUID
name: str
created_at: datetime.datetime
address: str | None
schedule: datetime.datetime | None
host: GetEventByNameResultHost | None
Expand All @@ -49,6 +50,7 @@ async def get_event_by_name(
"""\
select Event {
name,
created_at,
address,
schedule,
host : {name}
Expand Down
2 changes: 1 addition & 1 deletion app/queries/get_events.edgeql
Original file line number Diff line number Diff line change
@@ -1 +1 @@
select Event {name, address, schedule, host : {name}};
select Event {name, created_at, address, schedule, host : {name}};
3 changes: 2 additions & 1 deletion app/queries/get_events_async_edgeql.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ def __get_validators__(cls):
class GetEventsResult(NoPydanticValidation):
id: uuid.UUID
name: str
created_at: datetime.datetime
address: str | None
schedule: datetime.datetime | None
host: GetEventsResultHost | None
Expand All @@ -45,6 +46,6 @@ async def get_events(
) -> list[GetEventsResult]:
return await executor.query(
"""\
select Event {name, address, schedule, host : {name}};\
select Event {name, created_at, address, schedule, host : {name}};\
""",
)
7 changes: 6 additions & 1 deletion app/queries/get_user_by_name.edgeql
Original file line number Diff line number Diff line change
@@ -1 +1,6 @@
select User {name, created_at} filter User.name=<str>$name;
select User {name,
created_at,
n_events:= count(.<host[is Event])
}
filter User.name=<str>$name;

7 changes: 6 additions & 1 deletion app/queries/get_user_by_name_async_edgeql.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ class GetUserByNameResult(NoPydanticValidation):
id: uuid.UUID
name: str
created_at: datetime.datetime
n_events: int


async def get_user_by_name(
Expand All @@ -39,7 +40,11 @@ async def get_user_by_name(
) -> GetUserByNameResult | None:
return await executor.query_single(
"""\
select User {name, created_at} filter User.name=<str>$name;\
select User {name,
created_at,
n_events:= count(.<host[is Event])
}
filter User.name=<str>$name;\
""",
name=name,
)
5 changes: 0 additions & 5 deletions app/queries/get_user_by_name_with_n_events.edgeql

This file was deleted.

50 changes: 0 additions & 50 deletions app/queries/get_user_by_name_with_n_events_async_edgeql.py

This file was deleted.

4 changes: 0 additions & 4 deletions app/queries/get_user_with_n_events.edgeql

This file was deleted.

46 changes: 0 additions & 46 deletions app/queries/get_user_with_n_events_async_edgeql.py

This file was deleted.

5 changes: 4 additions & 1 deletion app/queries/get_users.edgeql
Original file line number Diff line number Diff line change
@@ -1 +1,4 @@
select User {name, created_at};
select User {name,
created_at,
n_events:= count(.<host[is Event])
}
6 changes: 5 additions & 1 deletion app/queries/get_users_async_edgeql.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,13 +30,17 @@ class GetUsersResult(NoPydanticValidation):
id: uuid.UUID
name: str
created_at: datetime.datetime
n_events: int


async def get_users(
executor: edgedb.AsyncIOExecutor,
) -> list[GetUsersResult]:
return await executor.query(
"""\
select User {name, created_at};\
select User {name,
created_at,
n_events:= count(.<host[is Event])
}\
""",
)
27 changes: 27 additions & 0 deletions fastui_app/common.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
from fastapi import (
APIRouter,
HTTPException, # noqa: F401
)
from fastapi.responses import HTMLResponse
from fastui import AnyComponent, FastUI, prebuilt_html
from fastui import components as c
from fastui.events import BackEvent, GoToEvent, PageEvent # noqa:F401

from .models import EventFull, UserFull # noqa: F401
from .shared import demo_page
from .utils import _raise_for_status # noqa: F401

router = APIRouter(include_in_schema=False)


@router.get("/api/", response_model=FastUI, response_model_exclude_none=True)
async def home() -> list[AnyComponent]:
return demo_page(
c.Heading(text="Home", level=1), c.Paragraph(text="Hello World from FastUI")
)


@router.get("/{path:path}")
async def html_landing() -> HTMLResponse:
"""Simple HTML page which serves the React router, comes last as it matches all paths."""
return HTMLResponse(prebuilt_html(title="FastUI Demo"))
Loading

0 comments on commit 04a5039

Please sign in to comment.