From edfe2f1bfe090d5b6ff2912c15832468cf0f857e Mon Sep 17 00:00:00 2001 From: kikimor Date: Fri, 18 Sep 2026 19:49:14 +0300 Subject: [PATCH] Remove the serial bridge's unused Django client The bridge reads the COM port and streams SSE to the frontend; it never talks to Django. backend_client.py (a Django API client) and config.py (which held BACKEND_URL / API_ENDPOINT) were imported by nothing - app.py calls load_dotenv() and reads os.getenv directly, and the PyInstaller spec builds from app.py alone. Their presence implied a coupling that does not exist, and the stale BACKEND_URL=8000 in .env read as a misconfiguration rather than an inert value. Also drops the matching backend settings from .env.example, the now unnecessary 'requests' hidden import from the spec, and the two files from the SETUP.md tree. requests and urllib3 remain in requirements.txt - no bridge module uses them now, but pruning dependencies is a build concern left for a separate change. Co-Authored-By: Claude Opus 5 (1M context) --- SETUP.md | 2 - serial_bridge/.env.example | 5 -- serial_bridge/backend_client.py | 117 ------------------------------- serial_bridge/config.py | 31 -------- serial_bridge/serial_bridge.spec | 2 +- 5 files changed, 1 insertion(+), 156 deletions(-) delete mode 100644 serial_bridge/backend_client.py delete mode 100644 serial_bridge/config.py diff --git a/SETUP.md b/SETUP.md index 694abbd..5906e23 100644 --- a/SETUP.md +++ b/SETUP.md @@ -20,9 +20,7 @@ ScalesApp/ ├── serial_bridge/ # Python serial reader (system tray) │ ├── app.py │ ├── serial_reader.py -│ ├── backend_client.py │ ├── tray_icon.py -│ ├── config.py │ ├── requirements.txt │ ├── serial_bridge.spec │ └── .env.example diff --git a/serial_bridge/.env.example b/serial_bridge/.env.example index 09afbcf..f23e45e 100644 --- a/serial_bridge/.env.example +++ b/serial_bridge/.env.example @@ -4,11 +4,6 @@ BAUD_RATE=9600 TIMEOUT=1 READ_INTERVAL=0.5 -# Backend Server Settings -BACKEND_URL=http://localhost:8000 -API_ENDPOINT=/api/readings/ -REQUEST_TIMEOUT=5 - # Application Settings DEBUG=False LOG_LEVEL=INFO diff --git a/serial_bridge/backend_client.py b/serial_bridge/backend_client.py deleted file mode 100644 index 8924c3a..0000000 --- a/serial_bridge/backend_client.py +++ /dev/null @@ -1,117 +0,0 @@ -""" -Backend API Client -Handles communication with Django backend -""" -import requests -import logging -from typing import Optional, Dict, Any -from requests.adapters import HTTPAdapter -from urllib3.util.retry import Retry - -logger = logging.getLogger(__name__) - -class BackendClient: - def __init__(self, base_url: str, timeout: int = 5, max_retries: int = 3): - self.base_url = base_url - self.timeout = timeout - self.max_retries = max_retries - self.session = self._create_session() - - def _create_session(self) -> requests.Session: - """Create a requests session with retry logic""" - session = requests.Session() - - retry_strategy = Retry( - total=self.max_retries, - backoff_factor=1, - status_forcelist=[429, 500, 502, 503, 504], - allowed_methods=["HEAD", "GET", "OPTIONS", "POST"] - ) - - adapter = HTTPAdapter(max_retries=retry_strategy) - session.mount("http://", adapter) - session.mount("https://", adapter) - - return session - - def post_reading(self, port: str, data: str) -> bool: - """Post a serial port reading to the backend""" - try: - url = f"{self.base_url}/api/readings/" - payload = { - 'port': port, - 'data': data - } - - response = self.session.post( - url, - json=payload, - timeout=self.timeout - ) - - if response.status_code in [200, 201]: - logger.info(f"Successfully posted reading to backend") - return True - else: - logger.warning(f"Backend returned status {response.status_code}") - return False - - except requests.exceptions.RequestException as e: - logger.error(f"Error posting reading to backend: {e}") - return False - - def get_latest_reading(self, port: Optional[str] = None) -> Optional[Dict[str, Any]]: - """Get the latest reading from backend""" - try: - url = f"{self.base_url}/api/readings/latest/" - params = {'port': port} if port else {} - - response = self.session.get( - url, - params=params, - timeout=self.timeout - ) - - if response.status_code == 200: - return response.json() - else: - logger.warning(f"Backend returned status {response.status_code}") - return None - - except requests.exceptions.RequestException as e: - logger.error(f"Error getting latest reading: {e}") - return None - - def get_readings(self, port: Optional[str] = None, limit: int = 10) -> Optional[list]: - """Get readings from backend""" - try: - url = f"{self.base_url}/api/readings/" - params = {'limit': limit} - if port: - params['port'] = port - - response = self.session.get( - url, - params=params, - timeout=self.timeout - ) - - if response.status_code == 200: - return response.json() - else: - logger.warning(f"Backend returned status {response.status_code}") - return None - - except requests.exceptions.RequestException as e: - logger.error(f"Error getting readings: {e}") - return None - - def health_check(self) -> bool: - """Check if backend is available""" - try: - url = f"{self.base_url}/api/health/" - response = self.session.get(url, timeout=self.timeout) - return response.status_code == 200 - except Exception as e: - logger.error(f"Backend health check failed: {e}") - return False \ No newline at end of file diff --git a/serial_bridge/config.py b/serial_bridge/config.py deleted file mode 100644 index 84c38b7..0000000 --- a/serial_bridge/config.py +++ /dev/null @@ -1,31 +0,0 @@ -""" -Configuration for Serial Bridge -""" -import os -from dotenv import load_dotenv - -load_dotenv() - -# COM Port Settings -COM_PORT = os.getenv('COM_PORT', 'COM1') -BAUD_RATE = int(os.getenv('BAUD_RATE', 9600)) -TIMEOUT = int(os.getenv('TIMEOUT', 1)) -READ_INTERVAL = float(os.getenv('READ_INTERVAL', 0.5)) # seconds - -# Backend Server Settings -BACKEND_URL = os.getenv('BACKEND_URL', 'http://localhost:8000') -API_ENDPOINT = os.getenv('API_ENDPOINT', '/api/readings/') -REQUEST_TIMEOUT = int(os.getenv('REQUEST_TIMEOUT', 5)) - -# Application Settings -APP_NAME = 'ScalesApp Serial Bridge' -DEBUG = os.getenv('DEBUG', 'False') == 'True' -LOG_LEVEL = os.getenv('LOG_LEVEL', 'INFO') - -# System Tray Settings -SHOW_WINDOW_ON_START = os.getenv('SHOW_WINDOW_ON_START', 'False') == 'True' -AUTO_CONNECT = os.getenv('AUTO_CONNECT', 'True') == 'True' - -# Retry Settings -MAX_RETRIES = int(os.getenv('MAX_RETRIES', 3)) -RETRY_DELAY = int(os.getenv('RETRY_DELAY', 5)) # seconds diff --git a/serial_bridge/serial_bridge.spec b/serial_bridge/serial_bridge.spec index f67ee6c..8486130 100644 --- a/serial_bridge/serial_bridge.spec +++ b/serial_bridge/serial_bridge.spec @@ -11,7 +11,7 @@ a = Analysis( pathex=[], binaries=[], datas=[], - hiddenimports=['serial', 'requests', 'pystray', 'PIL'], + hiddenimports=['serial', 'pystray', 'PIL'], hookspath=[], hooksconfig={}, runtime_hooks=[],