Refactor into modular app structure

Split monolithic files into focused modules:
- app/core: settings, logging, lifecycle
- app/signaling: websocket server, ICE parser, message models
- app/webrtc: peer session, video receiver, frame source
- app/vision: pose landmarker wrapper, model config, pose types
- app/exercises/dead_bug: detector, metrics, rules, state machine, types
- app/rendering: skeleton renderer, status overlay, window display
- app/audio: rep announcer
- app/diagnostics: perf timer, crash handler
- configs: environment-based settings
- tests: unit tests for rules, state machine, ICE parser
- run.py: entry point
This commit is contained in:
2026-06-10 10:14:43 +08:00
parent 8b878cb9e5
commit 4485cbf702
44 changed files with 1230 additions and 648 deletions
+42
View File
@@ -0,0 +1,42 @@
from __future__ import annotations
from app.exercises.dead_bug.state_machine import DeadBugStateMachine
from app.exercises.dead_bug.types import DeadBugMetrics, DeadBugPhase
class TestDeadBugStateMachine:
def _ready_metrics(self) -> DeadBugMetrics:
return DeadBugMetrics(
left_arm_extended=False, right_arm_extended=False,
left_leg_extended=False, right_leg_extended=False,
left_elbow_angle=90, right_elbow_angle=90,
left_knee_angle=100, right_knee_angle=100,
feedback=[],
)
def _extended_left(self) -> DeadBugMetrics:
return DeadBugMetrics(
left_arm_extended=True, right_arm_extended=False,
left_leg_extended=False, right_leg_extended=True,
left_elbow_angle=160, right_elbow_angle=90,
left_knee_angle=90, right_knee_angle=160,
feedback=[],
)
def test_initial_state(self):
sm = DeadBugStateMachine()
assert sm.phase == DeadBugPhase.READY
assert sm.rep_count == 0
def test_no_transition_in_ready(self):
sm = DeadBugStateMachine()
result = sm.update(self._ready_metrics())
assert sm.phase == DeadBugPhase.READY
assert result.rep_count == 0
def test_confirm_extension(self):
sm = DeadBugStateMachine(extension_confirm_frames=2, reset_confirm_frames=2)
sm.update(self._extended_left())
assert sm.phase == DeadBugPhase.READY
sm.update(self._extended_left())
assert sm.phase == DeadBugPhase.EXTENDING