Skip to content

Commit 515faa7

Browse files
committed
fix
1 parent cab04f0 commit 515faa7

File tree

6 files changed

+56
-30
lines changed

6 files changed

+56
-30
lines changed

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ uv run app.py
2727
## Running with Modified Error Rates
2828

2929
```bash
30-
ERROR_SUCCESS_COUNT=0 ERROR_FAILURE_COUNT=100 uv run app.py
30+
OK_RATIO=0.9 uv run app.py
3131
```
3232

3333
## Building the Container Image
@@ -39,7 +39,7 @@ docker compose build
3939
or
4040

4141
```bash
42-
docker build -t example-backend .
42+
docker buildx build -t example-backend .
4343
```
4444

4545
## Running in a Container

app.py

Lines changed: 30 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -3,59 +3,68 @@
33
import random
44
import os
55
import logging
6+
import aiohttp_cors
67

7-
DEFAULT_ERROR_SUCCESS_COUNT = 90
8-
DEFAULT_ERROR_FAILURE_COUNT = 10
8+
DEFAULT_OK_RATIO = 0.6
99
DEFAULT_PORT = 8080
1010

11-
logging.basicConfig(level=logging.INFO)
12-
1311
_message_factory = None
1412

13+
logging.basicConfig(level=logging.INFO)
14+
1515

1616
class Message:
17-
def __init__(self, message: str, success: bool = True):
17+
def __init__(self, message: str, ok: bool):
1818
self._message = message
19-
self._success = success
19+
self._ok = ok
2020

2121
@property
22-
def success(self) -> bool:
23-
return self._success
22+
def ok(self) -> bool:
23+
return self._ok
2424

2525
def to_json(self) -> str:
2626
return json.dumps({"message": self._message})
2727

2828

2929
class MessageFactory:
30-
def __init__(self, success_count: int, error_count: int):
31-
self._success_rate: float = success_count / (success_count + error_count)
30+
def __init__(self, ok_ratio: float):
31+
self._ok_ratio: float = ok_ratio
3232

3333
def create_message(self) -> Message:
34-
if random.random() < self._success_rate:
35-
return Message("ok")
34+
if random.random() < self._ok_ratio:
35+
return Message("good", ok=True)
3636
else:
37-
return Message("bad", success=False)
37+
return Message("bad", ok=False)
3838

3939

4040
async def index_handler(request: web.Request) -> web.Response:
4141
message = _message_factory.create_message()
42-
if message.success:
43-
return web.Response(text=message.to_json(), content_type="application/json")
44-
else:
45-
return web.Response(text=message.to_json(), content_type="application/json", status=500)
42+
args = {"text": message.to_json()}
43+
if not message.ok:
44+
args["status"] = 500
45+
return web.json_response(**args)
4646

4747

4848
def main():
4949
global _message_factory
5050

51-
ERROR_SUCCESS_COUNT = int(os.getenv("ERROR_SUCCESS_COUNT", DEFAULT_ERROR_SUCCESS_COUNT))
52-
ERROR_FAILURE_COUNT = int(os.getenv("ERROR_FAILURE_COUNT", DEFAULT_ERROR_FAILURE_COUNT))
53-
_message_factory = MessageFactory(ERROR_SUCCESS_COUNT, ERROR_FAILURE_COUNT)
51+
ok_ratio = float(os.getenv("OK_RATIO", DEFAULT_OK_RATIO))
52+
if not (0 <= ok_ratio <= 1):
53+
raise ValueError("OK_RATIO should be between 0 and 1: {ok_ratio=}")
54+
logging.info(f"{ok_ratio=}")
55+
_message_factory = MessageFactory(ok_ratio)
5456

5557
port = int(os.getenv("PORT", DEFAULT_PORT))
58+
logging.info(f"{port=}")
5659

5760
app = web.Application()
58-
app.router.add_get("/", index_handler)
61+
cors = aiohttp_cors.setup(app)
62+
resource = cors.add(app.router.add_resource("/"))
63+
cors.add(
64+
resource.add_route("GET", index_handler),
65+
{"*": aiohttp_cors.ResourceOptions(allow_credentials=False)},
66+
)
67+
5968
web.run_app(app, host="0.0.0.0", port=port)
6069

6170

pyproject.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ description = "Add your description here"
55
readme = "README.md"
66
requires-python = ">=3.12"
77
dependencies = [
8+
"aiohttp-cors>=0.8.0",
89
"aiohttp[speedups]>=3.11.13",
910
]
1011

test_app.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,4 @@
44
def test_container_response():
55
response = requests.get("http://localhost:8080")
66
assert response.status_code == 200 or response.status_code == 500
7-
assert response.json()["message"] == "ok" or response.json()["message"] == "bad"
7+
assert response.json()["message"] == "good" or response.json()["message"] == "bad"

tests/test_message_factory.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,19 @@
22

33

44
def test_create_message_ok():
5-
factory = MessageFactory(success_count=10, error_count=0)
5+
factory = MessageFactory(ok_ratio=1.0)
66
message = factory.create_message()
7-
assert message._message == "ok"
7+
assert message._message == "good"
88

99

1010
def test_create_message_bad():
11-
factory = MessageFactory(success_count=0, error_count=10)
11+
factory = MessageFactory(ok_ratio=0.0)
1212
message = factory.create_message()
1313
assert message._message == "bad"
1414

1515

1616
def test_create_message_mixed():
17-
factory = MessageFactory(success_count=1, error_count=1)
17+
factory = MessageFactory(ok_ratio=0.5)
1818
messages = [factory.create_message()._message for _ in range(100)]
19-
assert "ok" in messages
19+
assert "good" in messages
2020
assert "bad" in messages

uv.lock

Lines changed: 17 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)