From 345ef643e13944f27721a8f86ab4e70f32861681 Mon Sep 17 00:00:00 2001 From: S4NKALP Date: Thu, 9 Apr 2026 19:20:55 +0545 Subject: [PATCH] refactor(utils): replace requests with urllib and improve error handling MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replace external `requests` calls with `urllib` to eliminate third‑party dependency, add robust timeout handling, and improve error reporting. This also standardises URL fetching across the module and updates the process name configuration. Enhancements: - Added default request timeout fallback and ensured proper cleanup of response objects - Enriched exception messages for better debugging Bug Fixes: - Fixed potential timeout‑related crashes in `CurrencyCache` and `Conversion` - Corrected process name setting via `set_process_name` in the entry point --- utils/conversion.py | 29 ++++++++++++++++++----------- utils/inhibit.py | 9 +++++++-- 2 files changed, 25 insertions(+), 13 deletions(-) diff --git a/utils/conversion.py b/utils/conversion.py index c39b4da..05223c6 100644 --- a/utils/conversion.py +++ b/utils/conversion.py @@ -3,7 +3,9 @@ import time from concurrent.futures import ThreadPoolExecutor from typing import Dict, Optional, Tuple -import requests +import json +import urllib.request +import urllib.error class CurrencyCache: @@ -79,11 +81,12 @@ class CurrencyCache: """Fetch exchange rates in background thread.""" try: url = f"https://www.floatrates.com/daily/{from_code}.json" - response = requests.get(url, timeout=self._request_timeout) - - if response.status_code == 200: - rates_data = response.json() - current_time = time.time() + if self._request_timeout is None: + self._request_timeout = 5 + with urllib.request.urlopen(url, timeout=self._request_timeout) as response: + if response.getcode() == 200: + rates_data = json.loads(response.read().decode()) + current_time = time.time() with self._cache_lock: self._cache[from_code] = { @@ -523,11 +526,15 @@ class Conversion: return value url = f"https://www.floatrates.com/daily/{from_lower}.json" - resp = requests.get(url, timeout=5) - if resp.status_code != 200: - raise ValueError(f"Error getting data from floatrates for {from_code}") - - data = resp.json() + try: + with urllib.request.urlopen(url, timeout=5) as resp: + if resp.getcode() != 200: + raise ValueError( + f"Error getting data from floatrates for {from_code}" + ) + data = json.loads(resp.read().decode()) + except Exception as e: + raise ValueError(f"Error getting data from floatrates for {from_code}: {e}") if to_lower not in data: raise ValueError( f"Target currency '{to_code}' not found in floatrates response for '{ diff --git a/utils/inhibit.py b/utils/inhibit.py index 6b5a106..0c88bfe 100644 --- a/utils/inhibit.py +++ b/utils/inhibit.py @@ -6,10 +6,15 @@ import os import subprocess import sys from dataclasses import dataclass +from pathlib import Path + +# Add the project root to sys.path to allow absolute imports from 'utils' +sys.path.insert(0, str(Path(__file__).resolve().parent.parent)) + from signal import SIGINT, SIGTERM, signal from threading import Event, Timer -import setproctitle +from utils.functions import set_process_name from pywayland.client.display import Display from pywayland.protocol.idle_inhibit_unstable_v1.zwp_idle_inhibit_manager_v1 import ( ZwpIdleInhibitManagerV1, @@ -182,5 +187,5 @@ def main() -> None: if __name__ == "__main__": - setproctitle.setproctitle("modus-inhibit") + set_process_name("modus-inhibit") main()