Skip to content

Commit 1eeee91

Browse files
MarkoVcodeclaude
andcommitted
Fix Python 3.11+ deprecation warnings
Issue: CI tests showed deprecation warnings for datetime.utcnow() and SQLAlchemy declarative_base imports that will be removed in future versions. Changes: 1. Replace datetime.utcnow() with datetime.now(timezone.utc).replace(tzinfo=None) - Using timezone.utc instead of UTC constant for Python 3.10 compatibility - Strip timezone info to maintain naive datetimes for SQLite compatibility - Updated in recording_service.py, api_recording.py, and recording.py models 2. Update SQLAlchemy declarative_base import - Changed from: from sqlalchemy.ext.declarative import declarative_base - Changed to: from sqlalchemy.orm import declarative_base - Fixed MovedIn20Warning in database/__init__.py Impact: Eliminates 136 deprecation warnings in test output while maintaining backward compatibility with existing database records. Testing: All 85 tests pass successfully with no deprecation warnings for these specific issues. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
1 parent bc710c4 commit 1eeee91

4 files changed

Lines changed: 14 additions & 15 deletions

File tree

benchmesh-serial-service/src/benchmesh_service/api_recording.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
import csv
99
import io
1010
from typing import List, Optional
11-
from datetime import datetime
11+
from datetime import datetime, timezone
1212

1313
from fastapi import APIRouter, Depends, HTTPException, WebSocket, WebSocketDisconnect
1414
from fastapi.responses import StreamingResponse
@@ -184,7 +184,7 @@ async def list_recordings(db: Session = Depends(get_db)):
184184
total_duration = (s.end_time - s.start_time).total_seconds() - s.pause_duration_seconds
185185
else:
186186
# Recording active: use current time
187-
total_duration = (datetime.utcnow() - s.start_time).total_seconds() - s.pause_duration_seconds
187+
total_duration = (datetime.now(timezone.utc).replace(tzinfo=None) - s.start_time).total_seconds() - s.pause_duration_seconds
188188

189189
recordings.append({
190190
"id": s.id,
@@ -216,7 +216,7 @@ async def get_recording(series_id: int, db: Session = Depends(get_db)):
216216
if series.end_time:
217217
total_duration = (series.end_time - series.start_time).total_seconds() - series.pause_duration_seconds
218218
else:
219-
total_duration = (datetime.utcnow() - series.start_time).total_seconds() - series.pause_duration_seconds
219+
total_duration = (datetime.now(timezone.utc).replace(tzinfo=None) - series.start_time).total_seconds() - series.pause_duration_seconds
220220

221221
return {
222222
"series": {

benchmesh-serial-service/src/benchmesh_service/database/__init__.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,7 @@
1010

1111
from sqlalchemy import create_engine, event
1212
from sqlalchemy.engine import Engine
13-
from sqlalchemy.ext.declarative import declarative_base
14-
from sqlalchemy.orm import sessionmaker, Session
13+
from sqlalchemy.orm import declarative_base, sessionmaker, Session
1514

1615
from .config import get_database_url, DATABASE_CONFIG
1716

benchmesh-serial-service/src/benchmesh_service/models/recording.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
These models support multi-device recording with pause/resume functionality.
55
"""
66

7-
from datetime import datetime
7+
from datetime import datetime, timezone
88
from sqlalchemy import Column, Integer, String, Text, Float, DateTime, ForeignKey
99
from sqlalchemy.orm import relationship
1010

@@ -30,8 +30,8 @@ class RecordingSeries(Base):
3030
paused_at = Column(DateTime) # NULL if not paused
3131
pause_duration_seconds = Column(Float, default=0) # Total time spent paused
3232
data_points_count = Column(Integer, default=0)
33-
created_at = Column(DateTime, default=datetime.utcnow)
34-
updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
33+
created_at = Column(DateTime, default=lambda: datetime.now(timezone.utc).replace(tzinfo=None))
34+
updated_at = Column(DateTime, default=lambda: datetime.now(timezone.utc).replace(tzinfo=None), onupdate=lambda: datetime.now(timezone.utc).replace(tzinfo=None))
3535

3636
# Relationship to data points
3737
data_points = relationship(

benchmesh-serial-service/src/benchmesh_service/services/recording_service.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
import asyncio
99
import json
10-
from datetime import datetime
10+
from datetime import datetime, timezone
1111
from typing import Dict, List, Optional, Any, Set
1212
from sqlalchemy.orm import Session
1313
from fastapi import WebSocket
@@ -66,7 +66,7 @@ async def start_recording(
6666
description=description,
6767
interval_seconds=interval_seconds,
6868
channels=json.dumps(channels),
69-
start_time=datetime.utcnow()
69+
start_time=datetime.now(timezone.utc).replace(tzinfo=None)
7070
)
7171
db.add(series)
7272
db.commit()
@@ -111,7 +111,7 @@ async def pause_recording(self, db: Session, series_id: int) -> RecordingSeries:
111111
).first()
112112

113113
if series:
114-
series.paused_at = datetime.utcnow()
114+
series.paused_at = datetime.now(timezone.utc).replace(tzinfo=None)
115115
db.commit()
116116
db.refresh(series)
117117
logger.info(f"Paused recording: {series.name} (ID: {series_id})")
@@ -138,7 +138,7 @@ async def resume_recording(self, db: Session, series_id: int) -> RecordingSeries
138138
).first()
139139

140140
if series and series.paused_at:
141-
pause_duration = (datetime.utcnow() - series.paused_at).total_seconds()
141+
pause_duration = (datetime.now(timezone.utc).replace(tzinfo=None) - series.paused_at).total_seconds()
142142
series.pause_duration_seconds += pause_duration
143143
series.paused_at = None
144144
db.commit()
@@ -182,10 +182,10 @@ async def stop_recording(self, db: Session, series_id: int) -> RecordingSeries:
182182
).first()
183183

184184
if series:
185-
series.end_time = datetime.utcnow()
185+
series.end_time = datetime.now(timezone.utc).replace(tzinfo=None)
186186
# If still paused, add final pause duration
187187
if series.paused_at:
188-
pause_duration = (datetime.utcnow() - series.paused_at).total_seconds()
188+
pause_duration = (datetime.now(timezone.utc).replace(tzinfo=None) - series.paused_at).total_seconds()
189189
series.pause_duration_seconds += pause_duration
190190
series.paused_at = None
191191
db.commit()
@@ -337,7 +337,7 @@ async def _recording_loop(
337337
# Store data point if we got any measurements
338338
if measurements:
339339
logger.info(f"[Series {series_id}] Collected {len(measurements)} measurements: {measurements}")
340-
timestamp = datetime.utcnow()
340+
timestamp = datetime.now(timezone.utc).replace(tzinfo=None)
341341

342342
with get_db_context() as db:
343343
try:

0 commit comments

Comments
 (0)