CQ fixes
Build and Push Docker Image / build-and-push (pull_request) Successful in 58s
Python Code Quality / python-code-quality (pull_request) Successful in 11s
Python Test / python-test (pull_request) Successful in 18s

This commit is contained in:
Brian Bjarke Jensen
2025-11-12 18:18:17 +01:00
parent cb20abfb85
commit 824358f846
4 changed files with 68 additions and 67 deletions
+2 -2
View File
@@ -3,13 +3,13 @@ name: Refresh Showcase Data
on: on:
schedule: schedule:
# Run daily at 3 AM UTC # Run daily at 3 AM UTC
- cron: '0 3 * * *' - cron: "0 3 * * *"
workflow_dispatch: # Allow manual triggering workflow_dispatch: # Allow manual triggering
jobs: jobs:
refresh-data: refresh-data:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Checkout code - name: Checkout code
uses: actions/checkout@v4 uses: actions/checkout@v4
+4
View File
@@ -71,3 +71,7 @@ markers = [
[[tool.mypy.overrides]] [[tool.mypy.overrides]]
module = "redis.*" module = "redis.*"
ignore_missing_imports = true ignore_missing_imports = true
[[tool.mypy.overrides]]
module = "showcase_data_definitions.*"
ignore_missing_imports = true
+5 -5
View File
@@ -1,7 +1,6 @@
"""Seed test data into the database for demo purposes.""" """Seed test data into the database for demo purposes."""
import sys import sys
import os
from pathlib import Path from pathlib import Path
from datetime import datetime from datetime import datetime
@@ -96,14 +95,18 @@ def seed_database(reference_time: datetime | None = None) -> None:
if child_id is None: if child_id is None:
# Create new child # Create new child
child_id = child_repo.create( created_child = child_repo.create(
name=child_data["name"], name=child_data["name"],
birth_time=child_data["birth_time"], birth_time=child_data["birth_time"],
birth_weight=child_data["birth_weight"], birth_weight=child_data["birth_weight"],
user_id=user_ids[0], user_id=user_ids[0],
) )
child_id = created_child["id"]
print(f"✓ Created child '{child_data['name']}'") print(f"✓ Created child '{child_data['name']}'")
# Ensure child_id is set
assert child_id is not None, "Child ID must be set at this point"
# Share child with second user if not already shared # Share child with second user if not already shared
parent_ids = child_repo.get_parent_ids(child_id) parent_ids = child_repo.get_parent_ids(child_id)
if user_ids[1] not in parent_ids: if user_ids[1] not in parent_ids:
@@ -111,9 +114,6 @@ def seed_database(reference_time: datetime | None = None) -> None:
msg = f"✓ Shared child with '{test_data['users'][1]['username']}'" msg = f"✓ Shared child with '{test_data['users'][1]['username']}'"
print(msg) print(msg)
# Ensure child_id is set
assert child_id is not None, "Child ID must be set at this point"
# Clear existing logs to avoid duplicates # Clear existing logs to avoid duplicates
print("Clearing existing logs...") print("Clearing existing logs...")
+57 -60
View File
@@ -1,6 +1,5 @@
"""Definition of showcase data to be used for presenting the app.""" """Definition of showcase data to be used for presenting the app."""
from datetime import datetime, timedelta from datetime import datetime, timedelta
import random import random
@@ -40,14 +39,14 @@ def get_feeding_schedule(reference_time: datetime) -> list[dict]:
feedings: list[dict] = [] feedings: list[dict] = []
current_time = reference_time - timedelta(days=CHILD_AGE_DAYS) current_time = reference_time - timedelta(days=CHILD_AGE_DAYS)
end_time = reference_time end_time = reference_time
feeding_types = ["left_breast", "right_breast", "bottle"] feeding_types = ["left_breast", "right_breast", "bottle"]
# Day-by-day feeding patterns # Day-by-day feeding patterns
day_number = 0 day_number = 0
while current_time < end_time: while current_time < end_time:
age_in_days = day_number age_in_days = day_number
# Newborns feed more frequently # Newborns feed more frequently
if age_in_days < 3: if age_in_days < 3:
interval_hours = random.uniform(2, 2.5) interval_hours = random.uniform(2, 2.5)
@@ -58,39 +57,39 @@ def get_feeding_schedule(reference_time: datetime) -> list[dict]:
else: else:
interval_hours = random.uniform(3, 3.5) interval_hours = random.uniform(3, 3.5)
duration_minutes = random.randint(20, 35) duration_minutes = random.randint(20, 35)
# Alternate between breasts and occasional bottle # Alternate between breasts and occasional bottle
if random.random() < 0.2: # 20% bottle feeding if random.random() < 0.2: # 20% bottle feeding
feeding_type = "bottle" feeding_type = "bottle"
else: else:
# Alternate breasts # Alternate breasts
feeding_type = feeding_types[len(feedings) % 2] feeding_type = feeding_types[len(feedings) % 2]
start_time = current_time start_time = current_time
end_time_feeding = start_time + timedelta(minutes=duration_minutes) end_time_feeding = start_time + timedelta(minutes=duration_minutes)
feedings.append({ feedings.append(
"start_time": start_time, {
"end_time": end_time_feeding, "start_time": start_time,
"feeding_type": feeding_type, "end_time": end_time_feeding,
}) "feeding_type": feeding_type,
}
)
current_time += timedelta(hours=interval_hours) current_time += timedelta(hours=interval_hours)
# Move to next day # Move to next day
prev_date = ( prev_date = (current_time - timedelta(hours=interval_hours)).date()
current_time - timedelta(hours=interval_hours)
).date()
if current_time.date() != prev_date: if current_time.date() != prev_date:
day_number += 1 day_number += 1
return feedings return feedings
def get_diaper_changes(reference_time: datetime) -> list[dict]: def get_diaper_changes(reference_time: datetime) -> list[dict]:
""" """
Generate realistic diaper changes for the last 14 days. Generate realistic diaper changes for the last 14 days.
- First 2-3 days: Black/dark (meconium), minimal pee - First 2-3 days: Black/dark (meconium), minimal pee
- Days 3-5: Transition to yellow, more frequent - Days 3-5: Transition to yellow, more frequent
- Days 5+: Regular yellow stools, normal pee patterns - Days 5+: Regular yellow stools, normal pee patterns
@@ -99,12 +98,12 @@ def get_diaper_changes(reference_time: datetime) -> list[dict]:
diapers = [] diapers = []
current_time = reference_time - timedelta(days=CHILD_AGE_DAYS) current_time = reference_time - timedelta(days=CHILD_AGE_DAYS)
end_time = reference_time end_time = reference_time
day_number = 0 day_number = 0
while current_time < end_time: while current_time < end_time:
age_in_days = day_number age_in_days = day_number
# Determine number of diaper changes per day based on age # Determine number of diaper changes per day based on age
if age_in_days < 3: if age_in_days < 3:
changes_per_day = random.randint(8, 10) changes_per_day = random.randint(8, 10)
@@ -112,32 +111,30 @@ def get_diaper_changes(reference_time: datetime) -> list[dict]:
changes_per_day = random.randint(7, 9) changes_per_day = random.randint(7, 9)
else: else:
changes_per_day = random.randint(6, 8) changes_per_day = random.randint(6, 8)
# Distribute changes throughout the day # Distribute changes throughout the day
day_start = current_time.replace( day_start = current_time.replace(hour=0, minute=0, second=0, microsecond=0)
hour=0, minute=0, second=0, microsecond=0
)
day_end = day_start + timedelta(days=1) day_end = day_start + timedelta(days=1)
for _ in range(changes_per_day): for _ in range(changes_per_day):
# Random time during the day # Random time during the day
random_seconds = random.randint(0, 86400) random_seconds = random.randint(0, 86400)
change_time = day_start + timedelta(seconds=random_seconds) change_time = day_start + timedelta(seconds=random_seconds)
if change_time >= end_time: if change_time >= end_time:
break break
# Determine diaper contents # Determine diaper contents
has_poop = random.random() < 0.4 # 40% have poop has_poop = random.random() < 0.4 # 40% have poop
# 90% have pee, or always if no poop # 90% have pee, or always if no poop
has_pee = random.random() < 0.9 or not has_poop has_pee = random.random() < 0.9 or not has_poop
diaper = { diaper = {
"time": change_time, "time": change_time,
"has_poop": has_poop, "has_poop": has_poop,
"has_pee": has_pee, "has_pee": has_pee,
} }
# Poop characteristics based on age # Poop characteristics based on age
if has_poop: if has_poop:
if age_in_days < 2: if age_in_days < 2:
@@ -161,7 +158,7 @@ def get_diaper_changes(reference_time: datetime) -> list[dict]:
else: else:
amounts = ["medium", "heavy"] amounts = ["medium", "heavy"]
diaper["poop_amount"] = random.choice(amounts) diaper["poop_amount"] = random.choice(amounts)
# Pee characteristics based on age # Pee characteristics based on age
if has_pee: if has_pee:
if age_in_days < 2: if age_in_days < 2:
@@ -182,33 +179,35 @@ def get_diaper_changes(reference_time: datetime) -> list[dict]:
diaper["pee_amount"] = random.choice(amounts) diaper["pee_amount"] = random.choice(amounts)
colors = ["clear", "yellow", "yellow"] colors = ["clear", "yellow", "yellow"]
diaper["pee_color"] = random.choice(colors) diaper["pee_color"] = random.choice(colors)
diapers.append(diaper) diapers.append(diaper)
day_number += 1 day_number += 1
current_time = day_end current_time = day_end
# Sort by time # Sort by time (type: ignore for mypy - we know time is datetime)
diapers.sort(key=lambda x: x["time"]) diapers.sort(
key=lambda x: x["time"] # type: ignore[arg-type,return-value]
)
return diapers return diapers
def get_sleep_sessions(reference_time: datetime) -> list[dict]: def get_sleep_sessions(reference_time: datetime) -> list[dict]:
""" """
Generate realistic sleep patterns for the last 14 days. Generate realistic sleep patterns for the last 14 days.
Newborns sleep 16-18 hours per day in short bursts (30min - 4 hours). Newborns sleep 16-18 hours per day in short bursts (30min - 4 hours).
Sleep gradually consolidates over time. Sleep gradually consolidates over time.
""" """
sleep_sessions = [] sleep_sessions = []
current_time = reference_time - timedelta(days=CHILD_AGE_DAYS) current_time = reference_time - timedelta(days=CHILD_AGE_DAYS)
end_time = reference_time end_time = reference_time
day_number = 0 day_number = 0
while current_time < end_time: while current_time < end_time:
age_in_days = day_number age_in_days = day_number
# Sleep patterns evolve with age # Sleep patterns evolve with age
if age_in_days < 3: if age_in_days < 3:
# Very short, frequent naps # Very short, frequent naps
@@ -222,37 +221,36 @@ def get_sleep_sessions(reference_time: datetime) -> list[dict]:
# More consolidated sleep # More consolidated sleep
avg_wake_time = 2.5 avg_wake_time = 2.5
sleep_duration_range = (60, 240) sleep_duration_range = (60, 240)
# Random wake time with variation # Random wake time with variation
wake_minutes = random.randint( wake_minutes = random.randint(int(avg_wake_time * 45), int(avg_wake_time * 75))
int(avg_wake_time * 45),
int(avg_wake_time * 75)
)
# Sleep start time # Sleep start time
start_time = current_time + timedelta(minutes=wake_minutes) start_time = current_time + timedelta(minutes=wake_minutes)
if start_time >= end_time: if start_time >= end_time:
break break
# Sleep duration # Sleep duration
duration_minutes = random.randint(*sleep_duration_range) duration_minutes = random.randint(*sleep_duration_range)
# Longer sleep at night # Longer sleep at night
if 20 <= start_time.hour or start_time.hour < 6: if 20 <= start_time.hour or start_time.hour < 6:
duration_minutes = int(duration_minutes * 1.3) duration_minutes = int(duration_minutes * 1.3)
end_time_sleep = start_time + timedelta(minutes=duration_minutes) end_time_sleep = start_time + timedelta(minutes=duration_minutes)
sleep_sessions.append({ sleep_sessions.append(
"start_time": start_time, {
"end_time": end_time_sleep, "start_time": start_time,
}) "end_time": end_time_sleep,
}
)
current_time = end_time_sleep current_time = end_time_sleep
birth_time = reference_time - timedelta(days=CHILD_AGE_DAYS) birth_time = reference_time - timedelta(days=CHILD_AGE_DAYS)
day_number = (current_time - birth_time).days day_number = (current_time - birth_time).days
return sleep_sessions return sleep_sessions
@@ -269,7 +267,7 @@ def generate_showcase_data(reference_time: datetime | None = None) -> dict:
""" """
if reference_time is None: if reference_time is None:
reference_time = datetime.now() reference_time = datetime.now()
return { return {
"users": SHOWCASE_USERS, "users": SHOWCASE_USERS,
"child": get_child_data(reference_time), "child": get_child_data(reference_time),
@@ -278,4 +276,3 @@ def generate_showcase_data(reference_time: datetime | None = None) -> dict:
"sleep": get_sleep_sessions(reference_time), "sleep": get_sleep_sessions(reference_time),
"reference_time": reference_time, "reference_time": reference_time,
} }