Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
e433041
push progress
BeckettFrey Nov 3, 2025
6e29c16
feat: implement model managment logic
Nov 4, 2025
335c7e4
refactor: move moules to src layout
Nov 4, 2025
08710cf
devops: add scaffold
Nov 4, 2025
a0e10e0
refactor: improve configurability and api
Nov 6, 2025
e8e2548
ui: wire HELP_URL and reload models on view switch
Nov 10, 2025
d8b648d
fix: modal parent handling and style whitespace
Nov 10, 2025
b47cc9d
feat: import dialog + hf download helper
Nov 10, 2025
3942ef3
feat: storage paths updates
Nov 10, 2025
7fcb83f
refactor: engines api and w2tg updates
Nov 10, 2025
6e6e691
feat: gui reload hooks and ui improvements
Nov 10, 2025
cffaa34
devops: added documentation building workflow awaiting upload ability
Nov 12, 2025
bea0236
refactor: consolidate important features to engine class and automate…
Nov 13, 2025
1d9c496
docs: engines/__init__.py to google-style docstrings
Nov 17, 2025
9cf3e05
feat: add analyzer package infrastructure with auto-discovery
Nov 17, 2025
d374f1f
refactor: remove deprecated storage modules and simplify package exports
Nov 18, 2025
bb0ec57
refactor: restructure and document settings modal framework
Nov 18, 2025
d1bf0c5
refactor: move categorical_list to top-level frameworks package
Nov 18, 2025
5742e55
refactor: reorder menubar so pipeline is leftmost
Nov 18, 2025
46fffb9
feat: add Dataset Management page with CRUD
Nov 18, 2025
59f1586
refactor: rename 'manage' to 'models' and introduce stacker-based pip…
Nov 18, 2025
b824249
refactor: make components top level for simplicity
Nov 18, 2025
04e80ce
refactor: move and deduplicate ImportModelDialog next to Models page
Nov 18, 2025
c8ee18b
squash: squash this later
Nov 28, 2025
c57cc9a
storage ready
BeckettFrey Nov 29, 2025
ba90068
v0.1.0 (macOS)
BeckettFrey Dec 18, 2025
c4e47e0
Fix workflow authentication for private repos
BeckettFrey Dec 18, 2025
1aef0d9
Use PAT for private repo access
BeckettFrey Dec 18, 2025
7f088f0
Fix environment issues with build time
BeckettFrey Dec 18, 2025
939959d
Fix dataset import logic to correctly update metadata post copytree
BeckettFrey Dec 19, 2025
d7dc6b9
Add badges for eager aesthetic
BeckettFrey Dec 19, 2025
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
4 changes: 0 additions & 4 deletions .github/__tmp__.py

This file was deleted.

120 changes: 120 additions & 0 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,120 @@
name: Release Build

on:
push:
branches:
- releases
tags:
- 'v*'

permissions:
contents: write

jobs:
build-and-release:
runs-on: macos-latest

steps:
- name: Checkout code
uses: actions/checkout@v4

- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.11'

- name: Install uv
run: |
curl -LsSf https://astral.sh/uv/install.sh | sh
echo "$HOME/.cargo/bin" >> $GITHUB_PATH

- name: Configure Git for private repos
run: |
git config --global url."https://x-access-token:${{ secrets.PRIVATE_REPO_TOKEN }}@github.com/".insteadOf "https://github.com/"

- name: Install dependencies
env:
GIT_CREDENTIALS: ${{ secrets.PRIVATE_REPO_TOKEN }}
run: |
uv sync

- name: Build .app bundle
run: make build

- name: Get version from tag or commit
id: get_version
run: |
if [[ $GITHUB_REF == refs/tags/* ]]; then
VERSION=${GITHUB_REF#refs/tags/}
else
VERSION="v$(date +'%Y.%m.%d')-$(git rev-parse --short HEAD)"
fi
echo "version=$VERSION" >> $GITHUB_OUTPUT
echo "Building version: $VERSION"

- name: Create DMG
run: |
# Create a simple DMG for easier distribution
mkdir -p dmg_contents
cp -R dist/VoxKit.app dmg_contents/
hdiutil create -volname "VoxKit" -srcfolder dmg_contents -ov -format UDZO VoxKit.dmg
continue-on-error: true

- name: Zip .app for release
run: |
cd dist
zip -r VoxKit.app.zip VoxKit.app
cd ..

- name: Create Release
id: create_release
uses: actions/create-release@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
tag_name: ${{ steps.get_version.outputs.version }}
release_name: VoxKit ${{ steps.get_version.outputs.version }} (macOS)
body: |
**VoxKit Release ${{ steps.get_version.outputs.version }}**

🍎 **Platform:** macOS (Apple Silicon & Intel)

Automated build from releases branch.

## Installation
1. Download VoxKit-macOS.app.zip
2. Unzip the file
3. Move VoxKit.app to your Applications folder
4. Right-click and select "Open" the first time (macOS security)

## System Requirements
- macOS 10.13 or later
- Works on both Intel and Apple Silicon Macs

## Changes
- Built from commit: ${{ github.sha }}

draft: false
prerelease: false

- name: Upload .app.zip to Release
uses: actions/upload-release-asset@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
upload_url: ${{ steps.create_release.outputs.upload_url }}
asset_path: ./dist/VoxKit.app.zip
asset_name: VoxKit-macOS.app.zip
asset_content_type: application/zip

- name: Upload DMG to Release (if created)
if: success()
uses: actions/upload-release-asset@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
upload_url: ${{ steps.create_release.outputs.upload_url }}
asset_path: ./VoxKit.dmg
asset_name: VoxKit-macOS.dmg
asset_content_type: application/x-apple-diskimage
continue-on-error: true
39 changes: 39 additions & 0 deletions .github/workflows/sync-docs.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
# name: Sync Docs Artifact

# on:
# push:
# branches:
# - main

# jobs:
# sync-docs:
# runs-on: ubuntu-latest

# steps:
# - name: Checkout code
# uses: actions/checkout@v4

# - name: Install uv
# uses: astral-sh/setup-uv@v1

# - name: Set up Python
# run: uv python install 3.11

# - name: Install dependencies
# run: |
# uv pip install pdoc
# uv pip install ".[docs]"

# - name: Generate HTML docs
# run: |
# mkdir -p docs
# pdoc voxkit --output-dir docs --search --math --mermaid

# - name: Upload docs artifact
# uses: actions/upload-artifact@v4
# with:
# name: pdoc-html
# path: docs/
# retention-days: 30

# # - name: Send docs to Vercel
2 changes: 1 addition & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -59,4 +59,4 @@ computed_likelihoods/

# OS files
.DS_Store
Thumbs.db
Thumbs.db
19 changes: 18 additions & 1 deletion .pre-commit-config.yaml
Original file line number Diff line number Diff line change
@@ -1,2 +1,19 @@
# TODO add hooks for pre-commit -> ruff, run tests, pii-check? security-check?
repos:
- repo: https://github.com/astral-sh/ruff-pre-commit
rev: v0.9.1
hooks:
- id: ruff
args: [--fix]
- id: ruff-format

- repo: https://github.com/pre-commit/mirrors-mypy
rev: v1.11.0
hooks:
- id: mypy

- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v4.5.0
hooks:
- id: trailing-whitespace
- id: end-of-file-fixer
- id: check-yaml
91 changes: 90 additions & 1 deletion Makefile
Original file line number Diff line number Diff line change
@@ -1 +1,90 @@
# TODO : Make commands for build - dev - watch - test - lint - format - typecheck
.PHONY: help watch build clean
.DEFAULT_GOAL := help

# Colors for output
BLUE := \033[36m
GREEN := \033[32m
YELLOW := \033[33m
RED := \033[31m
RESET := \033[0m

help:
@echo "$(BLUE)VoxKit - Dev Commands$(RESET)"
@echo "======================================"
@grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "$(GREEN)%-15s$(RESET) %s\n", $$1, $$2}'

watch: ## Watch for file changes and restart dev server (requires entr)
@if command -v entr >/dev/null 2>&1; then \
echo "$(BLUE)Watching for changes... Press Ctrl+C to stop$(RESET)"; \
find src/ -name "*.py" | entr -r uv run main.py; \
else \
echo "$(RED)entr not installed. Install with: brew install entr$(RESET)"; \
echo "$(YELLOW)Falling back to single run...$(RESET)"; \
uv run main.py; \
fi

build: clean ## Build standalone executable for current platform
@echo "$(BLUE)Building VoxKit for macOS...$(RESET)"
uv run --group installation python build.py build --entry main.py --name VoxKit --windowed

build-info: ## Show information about the built app
@echo "$(BLUE)Checking build output...$(RESET)"
@if [ -d "dist/VoxKit" ]; then \
echo "$(GREEN)Found: dist/VoxKit/$(RESET)"; \
ls -lh dist/VoxKit/; \
echo ""; \
echo "$(BLUE)Checking executable...$(RESET)"; \
file dist/VoxKit/VoxKit; \
echo ""; \
echo "$(BLUE)Checking library dependencies...$(RESET)"; \
otool -L dist/VoxKit/VoxKit | head -10; \
else \
echo "$(RED)dist/VoxKit not found. Run 'make build' first.$(RESET)"; \
fi

run-app: ## Run the built app from terminal (shows errors)
@echo "$(BLUE)Running VoxKit from terminal...$(RESET)"
@if [ -f "/Users/beckettfrey/Repos/waisman/PyPLLR_GUI/dist/VoxKit/VoxKit" ]; then \
/Users/beckettfrey/Repos/waisman/PyPLLR_GUI/dist/VoxKit/VoxKit; \
else \
echo "$(RED)dist/VoxKit/VoxKit not found. Run 'make build' first.$(RESET)"; \
fi

open-app: ## Open the app bundle with macOS (background)
@echo "$(BLUE)Opening VoxKit.app...$(RESET)"
@if [ -d "dist/VoxKit" ]; then \
open dist/VoxKit; \
else \
echo "$(RED)dist/VoxKit not found. Run 'make build' first.$(RESET)"; \
fi

clean: ## Clean build artifacts
@echo "$(BLUE)Cleaning build artifacts...$(RESET)"
@rm -rf build/ dist/ *.spec
@find . -type d -name "__pycache__" -exec rm -rf {} + 2>/dev/null || true
@find . -type f -name "*.pyc" -delete 2>/dev/null || true
@echo "$(GREEN)Cleanup completed$(RESET)"

format: ## Format code with Ruff
@echo "$(BLUE)Formatting code with Ruff...$(RESET)"
uv run --only-group dev ruff format .

format-check: ## Check code formatting with Ruff
@echo "$(BLUE)Checking code formatting with Ruff...$(RESET)"
uv run --only-group dev ruff format --check .

lint: ## Lint code with Ruff
@echo "$(BLUE)Linting with Ruff...$(RESET)"
uv run --only-group dev ruff check --fix .

lint-check: ## Check linting with Ruff
@echo "$(BLUE)Checking linting with Ruff...$(RESET)"
uv run --only-group dev ruff check .

mypy-check: ## Run mypy for type checking
@echo "$(BLUE)Running mypy for type checking...$(RESET)"
uv run --only-group dev mypy .

fresh-slate: ## Remove virtual environment and lock file
@echo "$(BLUE)Removing virtual environment and lock file...$(RESET)"
@read -p "Are you sure you want to proceed? [y/N] " confirm && [ $${confirm} = "y" ] || [ $${confirm} = "Y" ] && rm -rf uv.lock .venv || echo "Aborted."
5 changes: 5 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,10 @@
# TODO : Update README

[![Release](https://img.shields.io/github/v/release/BrainBehaviorAnalyticsLab/PyPLLR_GUI?label=Latest%20Release)](https://github.com/BrainBehaviorAnalyticsLab/PyPLLR_GUI/releases/latest)
[![Downloads](https://img.shields.io/github/downloads/BrainBehaviorAnalyticsLab/PyPLLR_GUI/total)](https://github.com/BrainBehaviorAnalyticsLab/PyPLLR_GUI/releases)
[![Project Management](https://img.shields.io/badge/Project-Jira%20Board-0052CC?logo=jira)](https://voxkit.atlassian.net/jira/software/projects/VOX/boards/2/)


A modern PyQt6-based graphical user interface for phonetic alignment and PLLR (Phoneme-Level Likelihood Ratios) score extraction. This application provides an intuitive workflow for researchers working with speech data.

## Features
Expand Down
33 changes: 33 additions & 0 deletions _frozen_patch.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
"""
Runtime patch to disable problematic inspect operations in frozen apps
"""
import sys

if getattr(sys, 'frozen', False):
# We're running in a PyInstaller bundle
import inspect

# Patch inspect.getsource to return empty string instead of raising
_original_getsource = inspect.getsource

def _patched_getsource(object):
try:
return _original_getsource(object)
except (OSError, TypeError):
# Return a dummy source code
return "# Source code not available in frozen application\npass\n"

inspect.getsource = _patched_getsource

# Patch getsourcelines similarly
_original_getsourcelines = inspect.getsourcelines

def _patched_getsourcelines(object):
try:
return _original_getsourcelines(object)
except (OSError, TypeError):
return (["# Source code not available\n", "pass\n"], 0)

inspect.getsourcelines = _patched_getsourcelines

print("[PATCH] Disabled source code inspection for frozen app")
Loading
Loading