- Add comprehensive compatibility layer supporting both Procrastinate 2.x and 3.x - Implement version-aware database migration system with pre/post migrations for 3.x - Create worker option mapping for seamless transition between versions - Add extensive test coverage for all compatibility features - Update dependency constraints to support both 2.x and 3.x simultaneously - Provide Docker containerization with uv caching and multi-service orchestration - Include demo applications and web interface for testing capabilities - Bump version to 0.2.0 reflecting new compatibility features Key Features: - Automatic version detection and feature flagging - Unified connector creation across PostgreSQL drivers - Worker option translation (timeout → fetch_job_polling_interval) - Database migration utilities with CLI and programmatic interfaces - Complete Docker Compose setup with PostgreSQL, Redis, workers, and demos Files Added: - src/video_processor/tasks/compat.py - Core compatibility layer - src/video_processor/tasks/migration.py - Migration utilities - src/video_processor/tasks/worker_compatibility.py - Worker CLI - tests/test_procrastinate_compat.py - Compatibility tests - tests/test_procrastinate_migration.py - Migration tests - Dockerfile - Multi-stage build with uv caching - docker-compose.yml - Complete development environment - examples/docker_demo.py - Containerized demo application - examples/web_demo.py - Flask web interface demo Migration Support: - Procrastinate 2.x: Single migration command compatibility - Procrastinate 3.x: Separate pre/post migration phases - Database URL validation and connection testing - Version-specific feature detection and graceful degradation
116 lines
2.6 KiB
TOML
116 lines
2.6 KiB
TOML
[build-system]
|
|
requires = ["hatchling"]
|
|
build-backend = "hatchling.build"
|
|
|
|
[project]
|
|
name = "video-processor"
|
|
version = "0.2.0"
|
|
description = "Standalone video processing pipeline with multiple format encoding"
|
|
authors = [{name = "Video Processor", email = "dev@example.com"}]
|
|
readme = "README.md"
|
|
requires-python = ">=3.11"
|
|
dependencies = [
|
|
"ffmpeg-python>=0.2.0",
|
|
"pillow>=11.2.1",
|
|
"msprites2 @ git+https://github.com/rsp2k/msprites2.git",
|
|
"procrastinate>=2.15.1,<4.0.0", # Support both 2.x and 3.x during migration
|
|
"psycopg[pool]>=3.2.9",
|
|
"python-dateutil>=2.9.0",
|
|
"pydantic>=2.0.0",
|
|
"pydantic-settings>=2.0.0",
|
|
"exifread>=3.5.1",
|
|
]
|
|
|
|
[project.optional-dependencies]
|
|
dev = [
|
|
"ruff>=0.1.0",
|
|
"mypy>=1.7.0",
|
|
"pytest>=7.0.0",
|
|
"pytest-cov>=4.0.0",
|
|
]
|
|
|
|
# Core 360° video processing
|
|
video-360 = [
|
|
"py360convert>=0.1.0", # 360° projection conversions
|
|
"opencv-python>=4.5.0", # Advanced image processing
|
|
"numpy>=1.21.0", # Mathematical operations
|
|
"scipy>=1.7.0", # Scientific computing for spherical geometry
|
|
]
|
|
|
|
# Spatial audio processing for 360° videos
|
|
spatial-audio = [
|
|
"librosa>=0.9.0", # Audio analysis and processing
|
|
"soundfile>=0.11.0", # Multi-channel audio I/O
|
|
]
|
|
|
|
# Enhanced metadata extraction for 360° videos
|
|
metadata-360 = [
|
|
"exifread>=3.0.0", # 360° metadata parsing
|
|
]
|
|
|
|
# Complete 360° video package
|
|
video-360-full = [
|
|
"video-processor[video-360,spatial-audio,metadata-360]"
|
|
]
|
|
|
|
[tool.hatch.build.targets.wheel]
|
|
packages = ["src/video_processor"]
|
|
|
|
[tool.hatch.build.targets.sdist]
|
|
include = [
|
|
"/src",
|
|
"/tests",
|
|
"/README.md",
|
|
"/pyproject.toml",
|
|
]
|
|
|
|
[tool.hatch.metadata]
|
|
allow-direct-references = true
|
|
|
|
[tool.ruff]
|
|
target-version = "py311"
|
|
line-length = 88
|
|
|
|
[tool.ruff.lint]
|
|
select = [
|
|
"E", # pycodestyle errors
|
|
"W", # pycodestyle warnings
|
|
"F", # pyflakes
|
|
"I", # isort
|
|
"B", # flake8-bugbear
|
|
"C4", # flake8-comprehensions
|
|
"UP", # pyupgrade
|
|
]
|
|
ignore = [
|
|
"E501", # line too long (handled by formatter)
|
|
]
|
|
|
|
[tool.ruff.lint.per-file-ignores]
|
|
"tests/*" = ["S101"] # Allow assert in tests
|
|
|
|
[tool.ruff.format]
|
|
quote-style = "double"
|
|
indent-style = "space"
|
|
|
|
[tool.mypy]
|
|
python_version = "3.11"
|
|
strict = true
|
|
warn_return_any = true
|
|
warn_unused_configs = true
|
|
|
|
[tool.pytest.ini_options]
|
|
testpaths = ["tests"]
|
|
python_files = ["test_*.py"]
|
|
python_classes = ["Test*"]
|
|
python_functions = ["test_*"]
|
|
asyncio_mode = "auto"
|
|
|
|
[dependency-groups]
|
|
dev = [
|
|
"mypy>=1.17.1",
|
|
"pytest>=8.4.2",
|
|
"pytest-asyncio>=0.21.0",
|
|
"pytest-cov>=6.2.1",
|
|
"ruff>=0.12.12",
|
|
]
|