1 Commits
Author SHA1 Message Date
woggioni 572aa2d72b tmp 2026-07-05 21:23:11 +08:00
8 changed files with 183 additions and 235 deletions
+7 -38
View File
@@ -1,13 +1,12 @@
from bugis.core import BugisApp, HttpContext, HttpMethod
from typing import List
from bugis.core import BugisApp, HttpContext
class Hello(BugisApp):
pass
# async def handle_request(self, ctx: HttpContext) -> None:
# async for chunk in ctx.request_body:
# print(chunk.decode())
# await ctx.send_str(200, 'Hello World')
async def handle_request(self, ctx: HttpContext) -> None:
async for chunk in ctx.request_body:
print(chunk)
await ctx.send_str(200, 'Hello World')
app = BugisApp()
@@ -17,35 +16,5 @@ app = BugisApp()
@app.GET('/hello2')
async def handle_request(ctx: HttpContext) -> None:
async for chunk in ctx.request_body:
print(chunk.decode())
print(chunk)
await ctx.send_str(200, 'Hello World')
@app.GET('/hello/alice')
async def hello_alice(ctx: HttpContext) -> None:
async for _ in ctx.request_body:
pass
await ctx.send_str(200, 'Hello Alice 2')
@app.GET('/hello/*')
async def hello_alice(ctx: HttpContext, args: List[str]) -> None:
async for _ in ctx.request_body:
pass
await ctx.send_str(200, f'Hello {args[0]}')
@app.GET('/hello/*/kennedy')
async def hello_alice(ctx: HttpContext, args: List[str]) -> None:
async for _ in ctx.request_body:
pass
await ctx.send_str(200, f'Hello {args[0]} kennedy')
@app.GET('/hello/bob/marley')
async def hello_alice(ctx: HttpContext) -> None:
async for _ in ctx.request_body:
pass
await ctx.send_str(200, f'Hello bob Marley')
@app.route('/hello/*', HttpMethod.PUT, recursive=True)
async def handle_request(ctx: HttpContext, _: List[str]) -> None:
async for chunk in ctx.request_body:
print(chunk.decode())
await ctx.send_str(200, 'Message received')
+61 -77
View File
@@ -1,127 +1,102 @@
#
# This file is autogenerated by pip-compile with Python 3.14
# This file is autogenerated by pip-compile with Python 3.12
# by the following command:
#
# pip-compile --allow-unsafe --extra=dev --extra=rsgi --output-file=requirements-dev.txt pyproject.toml
# pip-compile --extra=dev --output-file=requirements-dev.txt
#
--index-url https://gitea.woggioni.net/api/packages/woggioni/pypi/simple
--extra-index-url https://pypi.org/simple
anyio==4.14.1
# via httpx
ast-serialize==0.5.0
# via mypy
asttokens==3.0.1
# via stack-data
build==1.5.0
aiofiles==24.1.0
# via bugis_core (pyproject.toml)
certifi==2026.6.17
# via
# httpcore
# httpx
# requests
cffi==2.0.0
# via cryptography
charset-normalizer==3.4.7
asttokens==2.4.1
# via stack-data
build==1.2.2.post1
# via bugis_core (pyproject.toml)
certifi==2024.8.30
# via requests
click==8.4.2
# via granian
cryptography==49.0.0
cffi==1.17.1
# via cryptography
charset-normalizer==3.4.0
# via requests
cryptography==43.0.3
# via secretstorage
decorator==5.3.1
decorator==5.1.1
# via
# ipdb
# ipython
docutils==0.23
docutils==0.21.2
# via readme-renderer
executing==2.2.1
executing==2.1.0
# via stack-data
granian==2.7.7
# via bugis_core (pyproject.toml)
h11==0.16.0
# via httpcore
httpcore==1.0.9
# via httpx
httpx==0.28.1
# via bugis_core (pyproject.toml)
id==1.6.1
idna==3.10
# via requests
importlib-metadata==8.5.0
# via twine
idna==3.18
# via
# anyio
# httpx
# requests
ipdb==0.13.13
# via bugis_core (pyproject.toml)
ipython==9.15.0
ipython==8.29.0
# via ipdb
ipython-pygments-lexers==1.1.1
# via ipython
jaraco-classes==3.4.0
# via keyring
jaraco-context==6.1.2
jaraco-context==6.0.1
# via keyring
jaraco-functools==4.5.0
jaraco-functools==4.1.0
# via keyring
jedi==0.20.0
jedi==0.19.1
# via ipython
jeepney==0.9.0
jeepney==0.8.0
# via
# keyring
# secretstorage
keyring==25.7.0
keyring==25.5.0
# via twine
librt==0.11.0
# via mypy
markdown-it-py==4.2.0
markdown-it-py==3.0.0
# via rich
matplotlib-inline==0.2.2
matplotlib-inline==0.1.7
# via ipython
mdurl==0.1.2
# via markdown-it-py
more-itertools==11.1.0
more-itertools==10.5.0
# via
# jaraco-classes
# jaraco-functools
mypy==2.1.0
mypy==1.13.0
# via bugis_core (pyproject.toml)
mypy-extensions==1.1.0
mypy-extensions==1.0.0
# via mypy
nh3==0.3.6
nh3==0.2.18
# via readme-renderer
packaging==26.2
# via
# build
# twine
parso==0.8.7
packaging==24.1
# via build
parso==0.8.4
# via jedi
pathspec==1.1.1
# via mypy
pexpect==4.9.0
# via ipython
prompt-toolkit==3.0.52
# via ipython
psutil==7.2.2
pkginfo==1.10.0
# via twine
prompt-toolkit==3.0.48
# via ipython
ptyprocess==0.7.0
# via pexpect
pure-eval==0.2.3
# via stack-data
pwo==0.1.2
pwo==0.0.5
# via bugis_core (pyproject.toml)
pycparser==3.0
pycparser==2.22
# via cffi
pygments==2.20.0
pygments==2.18.0
# via
# ipython
# ipython-pygments-lexers
# readme-renderer
# rich
pyproject-hooks==1.2.0
# via build
readme-renderer==45.0
pyyaml==6.0.2
# via bugis_core (pyproject.toml)
readme-renderer==44.0
# via twine
requests==2.34.2
requests==2.32.3
# via
# requests-toolbelt
# twine
@@ -129,26 +104,35 @@ requests-toolbelt==1.0.0
# via twine
rfc3986==2.0.0
# via twine
rich==15.0.0
rich==13.9.3
# via twine
secretstorage==3.5.0
secretstorage==3.3.3
# via keyring
six==1.16.0
# via asttokens
sortedcontainers==2.4.0
# via bugis_core (pyproject.toml)
stack-data==0.6.3
# via ipython
traitlets==5.15.1
traitlets==5.14.3
# via
# ipython
# matplotlib-inline
twine==6.2.0
twine==5.1.1
# via bugis_core (pyproject.toml)
typing-extensions==4.15.0
types-pyyaml==6.0.12.20240917
# via bugis_core (pyproject.toml)
typing-extensions==4.12.2
# via
# mypy
# pwo
urllib3==2.7.0
urllib3==2.2.3
# via
# id
# requests
# twine
wcwidth==0.8.1
watchdog==5.0.3
# via bugis_core (pyproject.toml)
wcwidth==0.2.13
# via prompt-toolkit
zipp==3.20.2
# via importlib-metadata
+11 -7
View File
@@ -1,17 +1,21 @@
#
# This file is autogenerated by pip-compile with Python 3.14
# This file is autogenerated by pip-compile with Python 3.12
# by the following command:
#
# pip-compile --allow-unsafe --extra=rsgi --output-file=requirements.txt pyproject.toml
# pip-compile --output-file=requirements.txt
#
--index-url https://gitea.woggioni.net/api/packages/woggioni/pypi/simple
--extra-index-url https://pypi.org/simple
click==8.4.2
# via granian
granian==2.7.7
aiofiles==24.1.0
# via bugis_core (pyproject.toml)
pwo==0.1.2
pwo==0.0.5
# via bugis_core (pyproject.toml)
typing-extensions==4.15.0
pyyaml==6.0.2
# via bugis_core (pyproject.toml)
sortedcontainers==2.4.0
# via bugis_core (pyproject.toml)
typing-extensions==4.12.2
# via pwo
watchdog==5.0.3
# via bugis_core (pyproject.toml)
+1 -1
View File
@@ -52,7 +52,7 @@ class RsgiContext(HttpContext):
self.server = (Maybe.of(scope.server.split(':'))
.map(lambda it: (it[0], int(it[1])))
.or_else_throw(RuntimeError))
self.request_body = protocol
self.request_body = aiter(protocol)
self.protocol = protocol
# @staticmethod
+10 -21
View File
@@ -3,7 +3,7 @@ import json
import httpx
from pwo import async_test
from bugis.core import BugisApp, HttpContext, HttpMethod
from typing import Sequence, List
from typing import Sequence
class AsgiTest(unittest.TestCase):
@@ -15,7 +15,6 @@ class AsgiTest(unittest.TestCase):
@self.app.GET('/hello')
@self.app.GET('/hello2')
@self.app.route('/hello3')
@self.app.GET('/hello/*')
async def handle_request(ctx: HttpContext) -> None:
async for chunk in ctx.request_body:
print(chunk)
@@ -54,44 +53,34 @@ class AsgiTest(unittest.TestCase):
'employee_id': employee_id
}))
@self.app.PUT('/hello/*', recursive=True)
async def handle_request(ctx: HttpContext, _: List[str]) -> None:
await ctx.stream_body(200, (chunk async for chunk in ctx.request_body))
@async_test
async def test_hello(self):
transport = httpx.ASGITransport(app=self.app)
async with httpx.AsyncClient(transport=transport, base_url="http://127.0.0.1:80") as client:
r = await client.get("/hello")
self.assertEqual(200, r.status_code)
self.assertEqual(r.status_code, 200)
self.assertEqual(r.text, "Hello World!")
r = await client.get("/hello2")
self.assertEqual(200, r.status_code)
self.assertEqual(r.status_code, 200)
self.assertEqual(r.text, "Hello World!")
r = await client.post("/hello3")
self.assertEqual(200, r.status_code)
self.assertEqual(r.status_code, 200)
self.assertEqual(r.text, "Hello World!")
r = await client.get("/hello4")
self.assertEqual(404, r.status_code)
self.assertEqual(r.status_code, 404)
self.assertTrue(len(r.text) == 0)
body = {'name': 'John', 'surname': 'Smith'}
r = await client.put("/hello/foo/bar", json=body)
self.assertEqual(200, r.status_code)
ans = json.loads(r.text)
self.assertTrue(body, ans)
@async_test
async def test_foo(self):
transport = httpx.ASGITransport(app=self.app)
async with httpx.AsyncClient(transport=transport, base_url="http://127.0.0.1:80") as client:
r = await client.put("/foo/fizz/baz")
self.assertEqual(200, r.status_code)
self.assertEqual(r.status_code, 200)
response = json.loads(r.text)
self.assertEqual(['fizz', 'baz'], response)
@@ -101,7 +90,7 @@ class AsgiTest(unittest.TestCase):
async with httpx.AsyncClient(transport=transport, base_url="http://127.0.0.1:80") as client:
r = await client.put("/foo/bar/baz")
self.assertEqual(200, r.status_code)
self.assertEqual(r.status_code, 200)
self.assertEqual('/foo/bar/baz', r.text)
@async_test
@@ -110,7 +99,7 @@ class AsgiTest(unittest.TestCase):
async with httpx.AsyncClient(transport=transport, base_url="http://127.0.0.1:80") as client:
r = await client.get("/employee/101325")
self.assertEqual(200, r.status_code)
self.assertEqual(r.status_code, 200)
self.assertEqual(r.text, '101325')
@async_test
@@ -120,7 +109,7 @@ class AsgiTest(unittest.TestCase):
async with httpx.AsyncClient(transport=transport, base_url="http://127.0.0.1:80") as client:
x = 30
r = await client.get(f"/square/{x}")
self.assertEqual(200, r.status_code)
self.assertEqual(r.status_code, 200)
self.assertEqual(r.text, str(x * x))
@async_test
@@ -129,7 +118,7 @@ class AsgiTest(unittest.TestCase):
async with httpx.AsyncClient(transport=transport, base_url="http://127.0.0.1:80") as client:
r = await client.get("department/189350/employee/101325")
self.assertEqual(200, r.status_code)
self.assertEqual(r.status_code, 200)
response = json.loads(r.text)
self.assertEqual({
'department_id': 189350,
+1 -1
View File
@@ -35,7 +35,7 @@ services:
cpus: "4"
memory: 1G
nginx:
image: gitea.woggioni.net/woggioni/nginx:v1.31.2
image: gitea.woggioni.net/woggioni/nginx:v1.27.2
# container_name: nginx
restart: unless-stopped
depends_on:
+68 -70
View File
@@ -1,142 +1,131 @@
#
# This file is autogenerated by pip-compile with Python 3.14
# This file is autogenerated by pip-compile with Python 3.12
# by the following command:
#
# pip-compile --allow-unsafe --extra=dev --output-file=requirements-dev.txt pyproject.toml
# pip-compile --extra=dev --output-file=requirements-dev.txt pyproject.toml
#
--index-url https://gitea.woggioni.net/api/packages/woggioni/pypi/simple
--extra-index-url https://pypi.org/simple
aiofiles==25.1.0
aiofiles==24.1.0
# via bugis (pyproject.toml)
anyio==4.14.1
anyio==4.6.2.post1
# via httpx
ast-serialize==0.5.0
# via mypy
asttokens==3.0.1
asttokens==2.4.1
# via stack-data
build==1.5.0
build==1.2.2.post1
# via bugis (pyproject.toml)
certifi==2026.6.17
certifi==2024.8.30
# via
# httpcore
# httpx
# requests
cffi==2.0.0
cffi==1.17.1
# via cryptography
charset-normalizer==3.4.7
charset-normalizer==3.4.0
# via requests
click==8.4.2
click==8.1.7
# via granian
cryptography==49.0.0
cryptography==43.0.3
# via secretstorage
decorator==5.3.1
decorator==5.1.1
# via
# ipdb
# ipython
docutils==0.23
docutils==0.21.2
# via readme-renderer
executing==2.2.1
executing==2.1.0
# via stack-data
granian==2.7.7
granian==1.6.1
# via bugis (pyproject.toml)
h11==0.16.0
h11==0.14.0
# via httpcore
h2==4.3.0
h2==4.1.0
# via httpx
hpack==4.2.0
hpack==4.0.0
# via h2
httpcore==1.0.9
httpcore==1.0.6
# via httpx
httpx[http2]==0.28.1
httpx[http2]==0.27.2
# via bugis (pyproject.toml)
hyperframe==6.1.0
hyperframe==6.0.1
# via h2
id==1.6.1
# via twine
idna==3.18
idna==3.10
# via
# anyio
# httpx
# requests
importlib-metadata==8.5.0
# via twine
ipdb==0.13.13
# via bugis (pyproject.toml)
ipython==9.15.0
ipython==8.28.0
# via ipdb
ipython-pygments-lexers==1.1.1
# via ipython
jaraco-classes==3.4.0
# via keyring
jaraco-context==6.1.2
jaraco-context==6.0.1
# via keyring
jaraco-functools==4.5.0
jaraco-functools==4.1.0
# via keyring
jedi==0.20.0
jedi==0.19.1
# via ipython
jeepney==0.9.0
jeepney==0.8.0
# via
# keyring
# secretstorage
keyring==25.7.0
keyring==25.4.1
# via twine
librt==0.11.0
# via mypy
markdown==3.10.2
markdown==3.7
# via bugis (pyproject.toml)
markdown-it-py==4.2.0
markdown-it-py==3.0.0
# via rich
matplotlib-inline==0.2.2
matplotlib-inline==0.1.7
# via ipython
mdurl==0.1.2
# via markdown-it-py
more-itertools==11.1.0
more-itertools==10.5.0
# via
# jaraco-classes
# jaraco-functools
mypy==2.1.0
mypy==1.13.0
# via bugis (pyproject.toml)
mypy-extensions==1.1.0
mypy-extensions==1.0.0
# via mypy
nh3==0.3.6
nh3==0.2.18
# via readme-renderer
packaging==26.2
# via
# build
# twine
parso==0.8.7
packaging==24.1
# via build
parso==0.8.4
# via jedi
pathspec==1.1.1
# via mypy
pexpect==4.9.0
# via ipython
prompt-toolkit==3.0.52
# via ipython
psutil==7.2.2
pkginfo==1.10.0
# via twine
prompt-toolkit==3.0.48
# via ipython
ptyprocess==0.7.0
# via pexpect
pure-eval==0.2.3
# via stack-data
pwo==0.1.2
pwo==0.0.4
# via bugis (pyproject.toml)
pycparser==3.0
pycparser==2.22
# via cffi
pygments==2.20.0
pygments==2.18.0
# via
# bugis (pyproject.toml)
# ipython
# ipython-pygments-lexers
# readme-renderer
# rich
pygraphviz==2.0
pygraphviz==1.14
# via bugis (pyproject.toml)
pyproject-hooks==1.2.0
# via build
pyyaml==6.0.3
pyyaml==6.0.2
# via bugis (pyproject.toml)
readme-renderer==45.0
readme-renderer==44.0
# via twine
requests==2.34.2
requests==2.32.3
# via
# requests-toolbelt
# twine
@@ -144,28 +133,37 @@ requests-toolbelt==1.0.0
# via twine
rfc3986==2.0.0
# via twine
rich==15.0.0
rich==13.9.3
# via twine
secretstorage==3.5.0
secretstorage==3.3.3
# via keyring
six==1.16.0
# via asttokens
sniffio==1.3.1
# via
# anyio
# httpx
stack-data==0.6.3
# via ipython
traitlets==5.15.1
traitlets==5.14.3
# via
# ipython
# matplotlib-inline
twine==6.2.0
twine==5.1.1
# via bugis (pyproject.toml)
typing-extensions==4.15.0
typing-extensions==4.12.2
# via
# mypy
# pwo
urllib3==2.7.0
urllib3==2.2.3
# via
# id
# requests
# twine
watchdog==6.0.0
uvloop==0.21.0
# via granian
watchdog==5.0.3
# via bugis (pyproject.toml)
wcwidth==0.8.1
wcwidth==0.2.13
# via prompt-toolkit
zipp==3.20.2
# via importlib-metadata
+23 -19
View File
@@ -1,47 +1,51 @@
#
# This file is autogenerated by pip-compile with Python 3.14
# This file is autogenerated by pip-compile with Python 3.12
# by the following command:
#
# pip-compile --allow-unsafe --output-file=requirements.txt pyproject.toml
# pip-compile --output-file=requirements.txt pyproject.toml
#
--index-url https://gitea.woggioni.net/api/packages/woggioni/pypi/simple
--extra-index-url https://pypi.org/simple
aiofiles==25.1.0
aiofiles==24.1.0
# via bugis (pyproject.toml)
anyio==4.14.1
anyio==4.6.2.post1
# via httpx
certifi==2026.6.17
certifi==2024.8.30
# via
# httpcore
# httpx
h11==0.16.0
h11==0.14.0
# via httpcore
h2==4.3.0
h2==4.1.0
# via httpx
hpack==4.2.0
hpack==4.0.0
# via h2
httpcore==1.0.9
httpcore==1.0.6
# via httpx
httpx[http2]==0.28.1
httpx[http2]==0.27.2
# via bugis (pyproject.toml)
hyperframe==6.1.0
hyperframe==6.0.1
# via h2
idna==3.18
idna==3.10
# via
# anyio
# httpx
markdown==3.10.2
markdown==3.7
# via bugis (pyproject.toml)
pwo==0.1.2
pwo==0.0.4
# via bugis (pyproject.toml)
pygments==2.20.0
pygments==2.18.0
# via bugis (pyproject.toml)
pygraphviz==2.0
pygraphviz==1.14
# via bugis (pyproject.toml)
pyyaml==6.0.3
pyyaml==6.0.2
# via bugis (pyproject.toml)
typing-extensions==4.15.0
sniffio==1.3.1
# via
# anyio
# httpx
typing-extensions==4.12.2
# via pwo
watchdog==6.0.0
watchdog==5.0.3
# via bugis (pyproject.toml)