Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,14 @@ jobs:
pytest -q --cov=src --cov-report=xml:coverage.xml --cov-report=term
# Single coverage dataset only; no secondary copying.

- name: Smoke launch (headless)
env:
QT_QPA_PLATFORM: offscreen
PHOTOSORT_ENABLE_FILE_LOGGING: 'false'
run: |
# Launch the app briefly in headless mode to catch startup regressions
timeout 20s python src/main.py --smoke-test --smoke-delay-ms 1500

- name: Upload coverage XML
uses: actions/upload-artifact@v4
if: success() || failure()
Expand Down
6 changes: 0 additions & 6 deletions .github/workflows/release-build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -148,7 +148,6 @@ jobs:
--paths src `
--paths . `
--hidden-import core.build_info `
--hidden-import mediapipe `
--add-data "src/ui/dark_theme.qss;." `
--add-data "assets/app_icon.ico;." `
--add-data "assets/app_icon.png;." `
Expand All @@ -163,8 +162,6 @@ jobs:
--hidden-import torch `
--hidden-import sklearn `
--hidden-import sentence_transformers `
--collect-data mediapipe `
--collect-data pyiqa `
--add-data "models;models" `
--runtime-hook runtime_hook.py `
src/main.py
Expand Down Expand Up @@ -219,7 +216,6 @@ jobs:
--paths src \
--paths . \
--hidden-import core.build_info \
--hidden-import mediapipe \
--add-data src/ui/dark_theme.qss:. \
--add-data assets/app_icon.ico:. \
--add-data assets/app_icon.png:. \
Expand All @@ -242,8 +238,6 @@ jobs:
--hidden-import torch \
--hidden-import sklearn \
--hidden-import sentence_transformers \
--collect-data mediapipe \
--collect-data pyiqa \
--add-data models:models \
src/main.py

Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ https://github.com/duartebarbosadev/photosort/releases

> **Note**: These dependencies are only required on macOS. Windows and Linux users can skip this step.

> **Python version:** PhotoSort currently targets Python 3.12 because several dependencies (e.g., MediaPipe) do not yet ship wheels for newer interpreters.
> **Python version:** PhotoSort is tested on Python 3.12. Newer interpreters may work, but 3.12 is the supported target for now.

3. **Create a Python 3.12 virtual environment (recommended):**

Expand Down
22 changes: 11 additions & 11 deletions requirements-cuda.txt
Original file line number Diff line number Diff line change
@@ -1,16 +1,16 @@
PyQt6
rawpy
diskcache
numpy
onnxruntime-gpu
openai
opencv-python
piexif
Pillow
Pillow-heif
sentence-transformers
pyexiv2
PyQt6
rawpy
scikit-learn
torch
diskcache
send2trash
opencv-python
pyexiv2
piexif
onnxruntime-gpu
sentence-transformers
torch
torchvision
pyiqa
mediapipe
24 changes: 11 additions & 13 deletions requirements.txt
Original file line number Diff line number Diff line change
@@ -1,18 +1,16 @@
PyQt6
rawpy
diskcache
numpy
onnxruntime
openai
opencv-python
piexif
Pillow
Pillow-heif
sentence-transformers
pyexiv2
PyQt6
rawpy
scikit-learn
torch
transformers
safetensors
diskcache
send2trash
opencv-python
pyexiv2
piexif
onnxruntime
sentence-transformers
torch
torchvision
pyiqa
mediapipe
21 changes: 21 additions & 0 deletions src/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,9 @@
sys.path.insert(0, SRC_DIR)

PROJECT_ROOT = os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))
# Ensure the project root is on sys.path so top-level packages (e.g., workers/) are importable
if PROJECT_ROOT not in sys.path:
sys.path.insert(0, PROJECT_ROOT)

from core.runtime_paths import ( # noqa: E402
is_frozen_runtime,
Expand Down Expand Up @@ -288,6 +291,17 @@ def main():
parser.add_argument(
"--clear-cache", action="store_true", help="Clear all caches before starting"
)
parser.add_argument(
"--smoke-test",
action="store_true",
help="Start the UI and auto-exit after a short delay (for CI sanity checks)",
)
parser.add_argument(
"--smoke-delay-ms",
type=int,
default=2000,
help="Delay before auto-exit when --smoke-test is enabled (milliseconds)",
)
args = parser.parse_args()

# --- Aggressive Logging Setup ---
Expand Down Expand Up @@ -410,6 +424,13 @@ def apply_stylesheet():
apply_stylesheet,
)

if args.smoke_test:
delay_ms = max(200, args.smoke_delay_ms)
logging.info(
f"Smoke test mode enabled; will exit automatically after {delay_ms} ms"
)
QTimer.singleShot(delay_ms, app.quit)

logging.info(
f"Application setup complete in {time.perf_counter() - main_start_time:.4f}s. Entering event loop."
)
Expand Down
Loading