mirror of
https://github.com/kuhyx/screen-locker.git
synced 2026-11-10 20:27:13 +01:00
Real fixes: split over-long functions (lock-decision chain, manual sync, validation, phone verification, status), hoist a dead lazy import, context-manage Xvfb and temp dirs, add encodings, share the silent-failure argv loop. lock_grab_handoff read lock._recovery, which gatelock's LockWindow does not have (its public property is recovery); a contract test now checks every attribute the handoff reads against the real class. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WzxdWYdwRAtMg7ki6TKxuU
45 lines
1.5 KiB
Python
45 lines
1.5 KiB
Python
"""Field-level checks shared by ``validate_manual_workout``.
|
|
|
|
Split out of :mod:`screen_locker._manual_workout` to keep every file under the
|
|
250-line cap.
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
from screen_locker._constants import MANUAL_WORKOUT_REFLECTION_MIN_CHARS
|
|
from screen_locker._manual_workout_types import SPORT_CHOICES, ManualWorkoutDraft
|
|
|
|
|
|
def validate_required(draft: ManualWorkoutDraft) -> str | None:
|
|
"""Return an error if the sport is unchosen or a required field is blank."""
|
|
if draft.sport not in SPORT_CHOICES:
|
|
return "Please choose a sport"
|
|
|
|
required = {
|
|
"Start time": draft.start_time,
|
|
"End time": draft.end_time,
|
|
"Location name": draft.location_name,
|
|
"Transport method": draft.transport_method,
|
|
"Cost": draft.cost,
|
|
}
|
|
for label, value in required.items():
|
|
if not value.strip():
|
|
return f"{label} is required"
|
|
return None
|
|
|
|
|
|
def validate_reflections(draft: ManualWorkoutDraft) -> str | None:
|
|
"""Return an error if a reflection field is shorter than the minimum."""
|
|
for label, value in (
|
|
("What went well", draft.went_well),
|
|
("What to improve", draft.to_improve),
|
|
("Overall feeling", draft.overall_feeling),
|
|
):
|
|
if len(value.strip()) < MANUAL_WORKOUT_REFLECTION_MIN_CHARS:
|
|
return (
|
|
f"{label} must be at least {MANUAL_WORKOUT_REFLECTION_MIN_CHARS} "
|
|
f"characters (currently {len(value.strip())})"
|
|
)
|
|
|
|
return None
|