Refactor drag handling and update tests
- Renamed `initiate_drag` to `handle_drag` in MainWindow and updated related tests. - Improved drag handling logic to utilize a bridge for starting file drags. - Updated `_on_drag_started` and `_on_drag_failed` methods to match new signatures. - Modified test cases to reflect changes in drag handling and assertions. Enhance path validation and logging - Updated `PathValidator` to log warnings for nonexistent roots instead of raising errors. - Adjusted tests to verify the new behavior of skipping nonexistent roots. Update web application UI and functionality - Changed displayed text for drag items to reflect local paths and Azure Blob Storage URLs. - Added debug logging for drag operations in the web application. - Improved instructions for testing drag and drop functionality. Add configuration documentation and example files - Created `CONFIG_README.md` to provide detailed configuration instructions for WebDrop Bridge. - Added `config.example.json` and `config_test.json` for reference and testing purposes. Implement URL conversion logic - Introduced `URLConverter` class to handle conversion of Azure Blob Storage URLs to local paths. - Added unit tests for URL conversion to ensure correct functionality. Develop download interceptor script - Created `download_interceptor.js` to intercept download-related actions in the web application. - Implemented logging for fetch calls, XMLHttpRequests, and Blob URL creations. Add download test page and related tests - Created `test_download.html` for testing various download scenarios. - Implemented `test_download.py` to verify download path resolution and file construction. - Added `test_url_mappings.py` to ensure URL mappings are loaded correctly. Add unit tests for URL converter - Created `test_url_converter.py` to validate URL conversion logic and mapping behavior.
This commit is contained in:
parent
c9704efc8d
commit
88dc358894
21 changed files with 1870 additions and 432 deletions
86
src/webdrop_bridge/core/url_converter.py
Normal file
86
src/webdrop_bridge/core/url_converter.py
Normal file
|
|
@ -0,0 +1,86 @@
|
|||
"""URL to local path conversion for Azure Blob Storage URLs."""
|
||||
|
||||
import logging
|
||||
from pathlib import Path
|
||||
from typing import Optional
|
||||
from urllib.parse import unquote
|
||||
|
||||
from ..config import Config, URLMapping
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class URLConverter:
|
||||
"""Converts Azure Blob Storage URLs to local file paths."""
|
||||
|
||||
def __init__(self, config: Config):
|
||||
"""Initialize converter with configuration.
|
||||
|
||||
Args:
|
||||
config: Application configuration with URL mappings
|
||||
"""
|
||||
self.config = config
|
||||
|
||||
def convert_url_to_path(self, url: str) -> Optional[Path]:
|
||||
"""Convert Azure Blob Storage URL to local file path.
|
||||
|
||||
Args:
|
||||
url: Azure Blob Storage URL
|
||||
|
||||
Returns:
|
||||
Local file path if mapping found, None otherwise
|
||||
|
||||
Example:
|
||||
>>> converter.convert_url_to_path(
|
||||
... "https://wpsagravitystg.file.core.windows.net/wpsagravitysync/aN5PysnXIuRECzcRbvHkjL7g0/file.png"
|
||||
... )
|
||||
Path("Z:/aN5PysnXIuRECzcRbvHkjL7g0/file.png")
|
||||
"""
|
||||
if not url:
|
||||
return None
|
||||
|
||||
# URL decode (handles special characters like spaces)
|
||||
url = unquote(url)
|
||||
|
||||
# Find matching URL mapping
|
||||
for mapping in self.config.url_mappings:
|
||||
if url.startswith(mapping.url_prefix):
|
||||
# Extract relative path after prefix
|
||||
relative_path = url[len(mapping.url_prefix):]
|
||||
|
||||
# Combine with local path
|
||||
local_path = Path(mapping.local_path) / relative_path
|
||||
|
||||
# Normalize path (resolve .. and .) but don't follow symlinks yet
|
||||
try:
|
||||
# On Windows, normalize separators
|
||||
local_path = Path(str(local_path).replace("/", "\\"))
|
||||
except (OSError, RuntimeError) as e:
|
||||
logger.warning(f"Failed to normalize path {local_path}: {e}")
|
||||
return None
|
||||
|
||||
logger.debug(f"Converted URL to path: {url} -> {local_path}")
|
||||
return local_path
|
||||
|
||||
logger.debug(f"No mapping found for URL: {url}")
|
||||
return None
|
||||
|
||||
def is_azure_url(self, text: str) -> bool:
|
||||
"""Check if text is an Azure Blob Storage URL.
|
||||
|
||||
Args:
|
||||
text: Text to check
|
||||
|
||||
Returns:
|
||||
True if text matches configured URL prefixes
|
||||
"""
|
||||
if not text:
|
||||
return False
|
||||
|
||||
text = text.strip()
|
||||
|
||||
for mapping in self.config.url_mappings:
|
||||
if text.startswith(mapping.url_prefix):
|
||||
return True
|
||||
|
||||
return False
|
||||
Loading…
Add table
Add a link
Reference in a new issue