Skip to content

Commit d8a759e

Browse files
authored
Merge pull request #10 from 74th/codex/2026-02-20-02-13-20
Add uv-managed Ruff lint and ty type checks
2 parents d345e6b + 6424982 commit d8a759e

6 files changed

Lines changed: 740 additions & 636 deletions

File tree

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
name: PR Lint and Type Check
2+
3+
on:
4+
pull_request:
5+
paths:
6+
- ".github/workflows/pr-lint-typecheck.yml"
7+
- "pyproject.toml"
8+
- "uv.lock"
9+
- "stackchan_server/**"
10+
- "example_apps/**"
11+
12+
jobs:
13+
lint-and-typecheck:
14+
runs-on: ubuntu-latest
15+
16+
steps:
17+
- name: Checkout
18+
uses: actions/checkout@v4
19+
20+
- name: Setup uv
21+
uses: astral-sh/setup-uv@v6
22+
23+
- name: Setup Python
24+
uses: actions/setup-python@v5
25+
with:
26+
python-version: "3.13"
27+
28+
- name: Install dependencies
29+
run: uv sync --group dev --group example-gemini --frozen
30+
31+
- name: Ruff
32+
run: uv run ruff check stackchan_server example_apps
33+
34+
- name: ty
35+
run: uv run ty check stackchan_server example_apps

README.md

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,17 @@ async def talk_session(proxy: WsProxy):
6767
```
6868

6969

70+
71+
## Lint / Type Check
72+
73+
`stackchan_server/``example_apps/` を対象に、`uv` で Ruff と ty を実行できます。
74+
75+
```bash
76+
uv sync --group dev --group example-gemini
77+
uv run ruff check stackchan_server example_apps
78+
uv run ty check stackchan_server example_apps
79+
```
80+
7081
## 現在開発中の環境
7182

7283
- 本体: M5Stack CoreS3 SE

example_apps/gemini.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
from __future__ import annotations
22

3-
import asyncio
43
from logging import StreamHandler, getLogger
54

6-
from stackchan_server.app import StackChanApp
7-
from stackchan_server.ws_proxy import WsProxy
85
from google import genai
96
from google.genai import types
107

8+
from stackchan_server.app import StackChanApp
9+
from stackchan_server.ws_proxy import WsProxy
10+
1111
logger = getLogger(__name__)
1212
logger.addHandler(StreamHandler())
1313
logger.setLevel("DEBUG")

pyproject.toml

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,17 +9,25 @@ description = "A WebSocket control interface for StackChan AI agent"
99
readme = "README.md"
1010
requires-python = ">=3.13"
1111
dependencies = [
12-
"fastapi[websockets]>=0.128.0",
12+
"fastapi>=0.128.0",
1313
"google-cloud-speech>=2.35.0",
1414
"uvicorn[standard]>=0.40.0",
1515
"voicevox-client>=1.1.0",
1616
]
1717

1818
[dependency-groups]
19+
dev = [
20+
"ruff>=0.15.2",
21+
"ty>=0.0.17",
22+
]
1923
example-gemini = [
2024
"google-genai>=1.59.0",
2125
]
2226

27+
[tool.ruff]
28+
target-version = "py313"
29+
30+
2331
[tool.hatch.build.targets.wheel]
2432
packages = ["stackchan_server"]
2533

stackchan_server/ws_proxy.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
import struct
77
import wave
88
from contextlib import suppress
9-
from datetime import datetime
9+
from datetime import UTC, datetime
1010
from enum import IntEnum
1111
from logging import getLogger
1212
from pathlib import Path
@@ -380,7 +380,7 @@ async def _send_state_command(self, state_id: int | FirmwareState) -> None:
380380
self._down_seq += 1
381381

382382
def _save_wav(self, pcm_bytes: bytes) -> tuple[Path, str]:
383-
timestamp = datetime.utcnow().strftime("%Y%m%d_%H%M%S_%f")
383+
timestamp = datetime.now(UTC).strftime("%Y%m%d_%H%M%S_%f")
384384
filename = f"rec_ws_{timestamp}.wav"
385385
filepath = self.recordings_dir / filename
386386

0 commit comments

Comments
 (0)