Files
renamer/REFACTORING_PROGRESS.md
sHa b50b9bc165 feat(cache): Implement unified caching subsystem with decorators, strategies, and management
- Added core caching functionality with `Cache` class supporting in-memory and file-based caching.
- Introduced `CacheManager` for high-level cache operations and statistics.
- Created various cache key generation strategies: `FilepathMethodStrategy`, `APIRequestStrategy`, `SimpleKeyStrategy`, and `CustomStrategy`.
- Developed decorators for easy method caching: `cached`, `cached_method`, `cached_api`, and `cached_property`.
- Implemented type definitions for cache entries and statistics.
- Added comprehensive tests for cache operations, strategies, and decorators to ensure functionality and backward compatibility.
2025-12-31 02:29:10 +00:00

257 lines
6.8 KiB
Markdown

# Renamer v0.7.0 Refactoring Progress
**Started**: 2025-12-31
**Target Version**: 0.7.0 (from 0.6.0)
**Goal**: Stable version with critical bugs fixed and deep architectural refactoring
---
## Phase 1: Critical Bug Fixes ✅ COMPLETED (3/5)
### ✅ 1.1 Fix Cache Key Generation Bug
**Status**: COMPLETED
**File**: `renamer/cache.py`
**Changes**:
- Complete rewrite of `_get_cache_file()` method (lines 20-75 → 47-86)
- Fixed critical variable scoping bug at line 51 (subkey used before assignment)
- Simplified cache key logic to single consistent pathway
- Removed complex pkl/json branching that caused errors
- Added `_sanitize_key_component()` for filesystem safety
**Testing**: Needs verification
---
### ✅ 1.2 Add Thread Safety to Cache
**Status**: COMPLETED
**File**: `renamer/cache.py`
**Changes**:
- Added `threading.RLock` for thread-safe operations (line 29)
- Wrapped all cache operations with `with self._lock:` context manager
- Added thread-safe `clear_expired()` method (lines 342-380)
- Memory cache now properly synchronized
**Testing**: Needs verification with concurrent access
---
### ✅ 1.3 Fix Resource Leaks in Tests
**Status**: COMPLETED
**Files**:
- `renamer/test/test_mediainfo_frame_class.py` (lines 14-17)
- `renamer/test/test_mediainfo_extractor.py` (lines 60-72)
**Changes**:
- Replaced bare `open()` with context managers
- Fixed test_mediainfo_frame_class.py: Now uses `Path(__file__).parent` and `with open()`
- Fixed test_mediainfo_extractor.py: Converted to fixture-based approach instead of parametrize with open file
- Both files now properly close file handles
**Testing**: Run `uv run pytest` to verify no resource leaks
---
### 🔄 1.4 Replace Bare Except Clauses
**Status**: PENDING
**Files to fix**:
- `renamer/extractors/filename_extractor.py` (lines 327, 384, 458, 515)
- `renamer/extractors/mediainfo_extractor.py` (line 168)
**Plan**:
- Replace `except:` with specific exception types
- Add logging for caught exceptions
- Test error scenarios
**Testing**: Need to verify with invalid inputs
---
### 🔄 1.5 Add Logging to Error Handlers
**Status**: PENDING (Partially done in cache.py)
**Completed**:
- ✅ Cache module now has comprehensive logging
- ✅ All cache errors logged with context
**Still needed**:
- Add logging to extractor error handlers
- Add logging to formatter error handlers
- Configure logging levels
**Testing**: Check log output during errors
---
## Phase 2: Architecture Foundation (PENDING)
### 2.1 Create Base Classes and Protocols
**Status**: NOT STARTED
**Files to create**:
- `renamer/extractors/base.py` - DataExtractor Protocol
- `renamer/formatters/base.py` - Formatter ABC
---
### 2.2 Create Service Layer
**Status**: NOT STARTED
**Files to create**:
- `renamer/services/__init__.py`
- `renamer/services/file_tree_service.py`
- `renamer/services/metadata_service.py`
- `renamer/services/rename_service.py`
---
### 2.3 Add Thread Pool to MetadataService
**Status**: NOT STARTED
**Dependencies**: Requires 2.2 to be completed
---
### 2.4 Extract Utility Modules
**Status**: NOT STARTED
**Files to create**:
- `renamer/utils/__init__.py`
- `renamer/utils/language_utils.py`
- `renamer/utils/pattern_utils.py`
- `renamer/utils/frame_utils.py`
---
## Phase 3: Code Quality (PENDING)
### 3.1 Refactor Long Methods
**Status**: NOT STARTED
**Target methods**:
- `extract_title()` (85 lines) → split into 4 helpers
- `extract_audio_langs()` (130 lines) → split into 3 helpers
- `extract_frame_class()` (55 lines) → split into 2 helpers
- `update_renamed_file()` (39 lines) → split into 2 helpers
---
### 3.2 Eliminate Code Duplication
**Status**: NOT STARTED
**Target duplications**:
- Movie DB pattern extraction (44 lines duplicated)
- Language code detection (150+ lines duplicated)
- Frame class matching (duplicated logic)
- Year extraction (duplicated logic)
---
### 3.3 Extract Magic Numbers to Constants
**Status**: NOT STARTED
**New constants needed in `renamer/constants.py`**:
- `CURRENT_YEAR`, `YEAR_FUTURE_BUFFER`, `MIN_VALID_YEAR`
- `MAX_VIDEO_TRACKS`, `MAX_AUDIO_TRACKS`, `MAX_SUBTITLE_TRACKS`
- `FRAME_HEIGHT_TOLERANCE_LARGE`, `FRAME_HEIGHT_TOLERANCE_SMALL`
- `DEFAULT_CACHE_TTL`
---
### 3.4 Add Missing Type Hints
**Status**: NOT STARTED
**Files needing type hints**:
- `renamer/extractors/default_extractor.py` (13 methods)
- Various cache methods (replace `Any` with specific types)
---
### 3.5 Add Comprehensive Docstrings
**Status**: NOT STARTED
**All modules need docstring review**
---
## Phase 4: Refactor to New Architecture (PENDING)
- Refactor all extractors to use protocol
- Refactor all formatters to use base class
- Refactor RenamerApp to use services
- Update all imports and dependencies
---
## Phase 5: Test Coverage (PENDING)
### New Test Files Needed:
- `renamer/test/test_cache.py`
- `renamer/test/test_formatters.py`
- `renamer/test/test_screens.py`
- `renamer/test/test_services.py`
- `renamer/test/test_app.py`
- `renamer/test/test_utils.py`
---
## Phase 6: Documentation and Release (PENDING)
- Update CLAUDE.md
- Update DEVELOP.md
- Update AI_AGENT.md
- Update README.md
- Bump version to 0.7.0
- Create CHANGELOG.md
- Build and test distribution
---
## Testing Status
### Manual Tests Needed
- [ ] Test cache with concurrent file selections
- [ ] Test cache expiration
- [ ] Test cache invalidation on rename
- [ ] Test resource cleanup (no file handle leaks)
- [ ] Test with real media files
- [ ] Performance test (ensure no regression)
### Automated Tests
- [ ] Run `uv run pytest` - verify all tests pass
- [ ] Run with coverage: `uv run pytest --cov=renamer`
- [ ] Check for resource warnings
---
## Current Status Summary
**Completed**: 3 critical bug fixes
**In Progress**: None (waiting for testing)
**Blocked**: None
**Next Steps**: Test current changes, then continue with Phase 1.4 and 1.5
---
## Breaking Changes Introduced
### Cache System
- **Cache key format changed**: Old cache files will be invalid
- **Migration**: Users should clear cache: `rm -rf ~/.cache/renamer/`
- **Impact**: No data loss, just cache miss on first run
### Thread Safety
- **Cache now thread-safe**: Multiple concurrent accesses properly handled
- **Impact**: Positive - prevents race conditions
---
## Notes
### Cache Rewrite Details
The cache system was completely rewritten for:
1. **Bug Fix**: Fixed critical variable scoping issue
2. **Thread Safety**: Added RLock for concurrent access
3. **Simplification**: Single code path instead of branching logic
4. **Logging**: Comprehensive logging for debugging
5. **Security**: Added key sanitization to prevent filesystem escaping
6. **Maintenance**: Added `clear_expired()` utility method
### Test Fixes Details
- Used proper `Path(__file__).parent` for relative paths
- Converted parametrize with open file to fixture-based approach
- All file operations now use context managers
---
**Last Updated**: 2025-12-31 (after Phase 1.1-1.3)