What's Changed
Bug Bash Fixes (from V2.3.1 audit)
- main.py: Moved conditional
tkinter import to top-level (PEP-8 compliance)
- core/logic.py: Fixed
any → Any type hint; resolve_rate() now enforces both USD and EUR presence
- core/api_client.py: Bearer token normalization — prevents
Bearer Bearer <token> from .env copy-paste errors
- core/database.py: Full thread lock coverage on all read operations (was writes-only)
- core/backup_manager.py:
__bak__ separator in backup filenames — prevents cross-file restoration collision
- core/engine.py: Replaced 3 bare
except: pass with except (ValueError, TypeError):; cache-reconstructed buying_transfer set to None instead of duplicating selling rate
- gui/app.py: Date validation for impossible dates;
isinstance() exception checking; vertical window resize enabled
V2.3.2 Polish
- engine.py: Last broad
except Exception: narrowed to (ValueError, TypeError)
- gui/app.py:
_assemble_start_date() return type → Optional[str]; last_processed_path → Optional[str]
- engine.py:
atexit handler for clean CacheDB shutdown
- database.py: Docstring updated for full lock coverage
New: Test Suite (47 tests, all passing)
tests/test_logic.py — 21 tests: safe_to_decimal, is_trading_day, resolve_rate backtrack
tests/test_database.py — 14 tests: CRUD, bulk, holidays, stats, thread safety
tests/test_backup_manager.py — 12 tests: create, restore, collision prevention, cleanup
Run Tests
python -m pytest tests/ -v