Skip to content

Commit b2f4fd7

Browse files
committed
1st pass, tests are shit atm
1 parent 720a001 commit b2f4fd7

28 files changed

+832
-564
lines changed
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
# start-example
2+
from litestar import Litestar, get
3+
4+
from sqlspec import SQLSpec
5+
from sqlspec.adapters.asyncpg import AsyncpgConfig
6+
from sqlspec.extensions.litestar import SQLSpecPlugin
7+
8+
# Configure database and create plugin
9+
spec = SQLSpec()
10+
db = spec.add_config(AsyncpgConfig(pool_config={"dsn": "postgresql://localhost/mydb", "min_size": 10, "max_size": 20}))
11+
sqlspec_plugin = SQLSpecPlugin(sqlspec=spec)
12+
13+
14+
@get("/")
15+
async def index() -> str:
16+
return "integrated"
17+
18+
19+
# Create Litestar app
20+
app = Litestar(route_handlers=[index], plugins=[sqlspec_plugin])
21+
# end-example
22+
23+
24+
def test_app_exists() -> None:
25+
assert app is not None
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
# start-example
2+
from fastapi import FastAPI, Depends
3+
from contextlib import asynccontextmanager
4+
from sqlspec import SQLSpec
5+
from sqlspec.adapters.asyncpg import AsyncpgConfig
6+
from sqlspec.driver import AsyncDriverAdapterBase
7+
8+
# Configure database
9+
spec = SQLSpec()
10+
db = spec.add_config(
11+
AsyncpgConfig(
12+
pool_config={
13+
"dsn": "postgresql://localhost/mydb",
14+
"min_size": 10,
15+
"max_size": 20,
16+
}
17+
)
18+
)
19+
20+
# Lifespan context manager
21+
@asynccontextmanager
22+
async def lifespan(app: FastAPI):
23+
# Startup
24+
yield
25+
# Shutdown
26+
await spec.close_all_pools()
27+
28+
app = FastAPI(lifespan=lifespan)
29+
# end-example
30+
31+
def test_stub():
32+
assert app is not None
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
# start-example
2+
from typing import AsyncGenerator
3+
4+
async def get_db_session() -> AsyncGenerator[AsyncDriverAdapterBase, None]:
5+
async with spec.provide_session(config) as session:
6+
yield session
7+
8+
# Use in route handlers
9+
@app.get("/users/{user_id}")
10+
async def get_user(
11+
user_id: int,
12+
db: AsyncDriverAdapterBase = Depends(get_db_session)
13+
) -> dict:
14+
result = await db.execute(
15+
"SELECT id, name, email FROM users WHERE id = $1",
16+
user_id
17+
)
18+
return result.one()
19+
# end-example
20+
21+
def test_stub():
22+
assert True
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
# start-example
2+
@app.post("/users")
3+
async def create_user(
4+
user_data: dict,
5+
db: AsyncDriverAdapterBase = Depends(get_db_session)
6+
) -> dict:
7+
async with db.begin_transaction():
8+
result = await db.execute(
9+
"INSERT INTO users (name, email) VALUES ($1, $2) RETURNING id",
10+
user_data["name"],
11+
user_data["email"]
12+
)
13+
14+
user_id = result.scalar()
15+
16+
# Additional operations in same transaction
17+
await db.execute(
18+
"INSERT INTO audit_log (action, user_id) VALUES ($1, $2)",
19+
"user_created",
20+
user_id
21+
)
22+
23+
return result.one()
24+
# end-example
25+
26+
def test_stub():
27+
assert True
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
# start-example
2+
# Main database
3+
main_db = spec.add_config(AsyncpgConfig(pool_config={"dsn": "postgresql://localhost/main"}))
4+
5+
# Analytics database
6+
analytics_db = spec.add_config(AsyncpgConfig(pool_config={"dsn": "postgresql://localhost/analytics"}))
7+
8+
# Dependency functions
9+
async def get_main_db():
10+
async with spec.provide_session(main_db) as session:
11+
yield session
12+
13+
async def get_analytics_db():
14+
async with spec.provide_session(analytics_db) as session:
15+
yield session
16+
17+
# Use in handlers
18+
@app.get("/report")
19+
async def generate_report(
20+
main_db: AsyncDriverAdapterBase = Depends(get_main_db),
21+
analytics_db: AsyncDriverAdapterBase = Depends(get_analytics_db)
22+
) -> dict:
23+
users = await main_db.execute("SELECT COUNT(*) FROM users")
24+
events = await analytics_db.execute("SELECT COUNT(*) FROM events")
25+
return {
26+
"users": users.scalar(),
27+
"events": events.scalar()
28+
}
29+
# end-example
30+
31+
def test_stub():
32+
assert True
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
# start-example
2+
from sanic import Sanic, Request, json
3+
from sqlspec import SQLSpec
4+
from sqlspec.adapters.asyncpg import AsyncpgConfig
5+
6+
app = Sanic("MyApp")
7+
8+
# Initialize SQLSpec
9+
spec = SQLSpec()
10+
db = spec.add_config(AsyncpgConfig(pool_config={"dsn": "postgresql://localhost/db"}))
11+
12+
# Store in app context
13+
app.ctx.sqlspec = spec
14+
app.ctx.db_config = db
15+
16+
# Cleanup on shutdown
17+
@app.before_server_stop
18+
async def close_db(app, loop):
19+
await app.ctx.sqlspec.close_all_pools()
20+
# end-example
21+
22+
def test_stub():
23+
assert app is not None
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
# start-example
2+
@app.get("/users/<user_id:int>")
3+
async def get_user(request: Request, user_id: int):
4+
async with request.app.ctx.sqlspec.provide_session(request.app.ctx.db_config) as db:
5+
result = await db.execute(
6+
"SELECT id, name, email FROM users WHERE id = $1",
7+
user_id
8+
)
9+
return json(result.one())
10+
# end-example
11+
12+
def test_stub():
13+
assert True
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
# start-example
2+
@app.middleware("request")
3+
async def add_db_session(request):
4+
request.ctx.db = await request.app.ctx.sqlspec.provide_session(
5+
request.app.ctx.db_config
6+
).__aenter__()
7+
8+
@app.middleware("response")
9+
async def cleanup_db_session(request, response):
10+
if hasattr(request.ctx, "db"):
11+
await request.ctx.db.__aexit__(None, None, None)
12+
13+
# Use in handlers
14+
@app.get("/users")
15+
async def list_users(request: Request):
16+
result = await request.ctx.db.execute("SELECT * FROM users")
17+
return json(result.rows)
18+
# end-example
19+
20+
def test_stub():
21+
assert True
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
# start-example
2+
from flask import Flask, g
3+
from sqlspec import SQLSpec
4+
from sqlspec.adapters.sqlite import SqliteConfig
5+
6+
app = Flask(__name__)
7+
8+
# Initialize SQLSpec
9+
spec = SQLSpec()
10+
db = spec.add_config(SqliteConfig(pool_config={"database": "app.db"}))
11+
# end-example
12+
13+
def test_stub():
14+
assert app is not None
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
# start-example
2+
def get_db():
3+
if 'db' not in g:
4+
g.db = spec.provide_session(db).__enter__()
5+
return g.db
6+
7+
@app.teardown_appcontext
8+
def close_db(error):
9+
db = g.pop('db', None)
10+
if db is not None:
11+
db.__exit__(None, None, None)
12+
13+
# Use in routes
14+
@app.route('/users/<int:user_id>')
15+
def get_user(user_id):
16+
db = get_db()
17+
result = db.execute("SELECT * FROM users WHERE id = ?", user_id)
18+
return result.one()
19+
# end-example
20+
21+
def test_stub():
22+
assert True

0 commit comments

Comments
 (0)