ci: optimize test_build workflow triggers#66
Merged
Merged
Conversation
Removed redundant version support table. Only the latest version receives security updates, so listing old versions was unnecessary. Replaced with concise statement that clearly communicates the policy.
Remove redundant 'push' trigger that caused duplicate test runs. Tests now run only on pull_request events to avoid waste. - Before: Tests ran on both push AND pull_request (duplicate) - After: Tests run only on pull_request to main - Manual trigger (workflow_dispatch) still available Reduces CI/CD noise and resources while maintaining coverage.
overwrite00
added a commit
that referenced
this pull request
Jun 11, 2026
* docs: simplify security support section in SECURITY.md Removed redundant version support table. Only the latest version receives security updates, so listing old versions was unnecessary. Replaced with concise statement that clearly communicates the policy. * ci: optimize test_build workflow triggers Remove redundant 'push' trigger that caused duplicate test runs. Tests now run only on pull_request events to avoid waste. - Before: Tests ran on both push AND pull_request (duplicate) - After: Tests run only on pull_request to main - Manual trigger (workflow_dispatch) still available Reduces CI/CD noise and resources while maintaining coverage.
overwrite00
added a commit
that referenced
this pull request
Jun 11, 2026
* Create LICENSE
* Delete LICENSE
* Add MIT License to the project
* Aggiunto README.md e immagine cover del progetto
* Aggiornato README.md
* Docs: move changelog to a dedicated file following Keep a Changelog standard
* Ver. 1.2.5 - Fix link mailto: negli indirizzi email censurati
* Aggiornato numero di versione badge
* Aggiunta icona applicazione e script per build automatico per le release
* Fix: stable cross-platform build and versioning
* Fix: UnicodeDecodeError on Windows build (forced utf-8 encoding)
* Fix: generazione dinamica .ico per Windows e aggiornamento asset icona
* Fix: rimozione finta trasparenza dall'icona
* Fix: vera trasparenza assoluta per l'icona
* Fix: applicata icona personalizzata anche alla finestra About
* Feat: integrazione AI locale (Presidio/spaCy), dizionari custom, censura differita e fix icone child windows
* Fix CI: aggiunta pyinstaller mancante nelle dipendenze
* Fix: Corretto numero di versione nel codice
* Fix CI: aggiornato script per estrarre correttamente la versione 1.3.0
* Fix CI: forzato encoding UTF-8 per estrazione versione
* Fix CI: packaging Linux con variabile versione e modelli md
* CI: aggiunto ignore per i file di documentazione per evitare build inutili
* CI: aggiunto ignore per i file di documentazione per evitare build inutili
* Docs: completato restyling grafico con emoji per tutte le sezioni
* Docs: completato restyling grafico con emoji per tutte le sezioni
* Corretto link linkedin
* Corretto badge Linkedin
* Aggiornato CHANGELOG.md
* Fix CI: Corretto script per la generazione dei vai pacchetti
* Corretto testo e formattazione e link repo in README.md
* ci: fix definitivo icone linux e stabilità build rpm
- Aggiunta generazione file .desktop e icone pixmaps per integrazione menu GNOME.
- Risolto conflitto Build-ID negli RPM tramite macro personalizzata.
- Ottimizzata ridenominazione dinamica pacchetti RPM.
- Verificato supporto icone cross-platform.
* ci: disabilitato fail-fast e aggiunti controlli robustezza per build linux
* fix(ci): corretta opzione alien per la creazione dell'RPM
- Sostituito --rpm-set-permissions con --fixperms (come da log di errore).
- Mantenuta la stabilità della build cross-platform.
* fix: risolto bug visualizzazione PDF su Linux e icone About
- Aggiunto hidden-import PIL._tkinter_finder nel workflow per Linux.
- Aggiornata funzione resource_path per compatibilità cross-platform.
- Fix finestra About: aggiunti crediti, licenza MIT e icona scudo reale.
- Sostituita opzione alien con --fixperms per stabilità RPM.
* fix: ripristino funzioni integrali e fix visualizzazione PDF su Linux
- Reinserita logica AI, dizionari e binding del canvas.
- Aggiornata finestra About con icona reale e crediti sviluppatore.
- Aggiunto hidden-import PIL._tkinter_finder per risolvere il crash su Fedora.
- Sostituito comando alien con --fixperms per pacchetti RPM stabili.
* Fix grafica
* chore: aggiornato setup_env.py con dipendenze AI
- Aggiunti presidio-analyzer e spacy.
- Aggiunto download automatico dei modelli linguistici (en_core_web_md, it_core_news_md).
* fix: risolto crash della GUI e aggiornato setup_env.py" -m "- Corretto TclError sostituendo i CTkButton errati con CTkFrame nei contenitori del layout.
- Aggiunte dipendenze AI (Presidio, spaCy e download modelli) allo script di configurazione."
* fix(gui): risolti bug su rendering finestre e interazione canvas su Linux" -m "- Ripristinata l'immagine dell'icona e ripulito il testo nella finestra About.
- Fix scroll del mouse nel Canvas aggiungendo i bind specifici per Linux (<Button-4>, <Button-5>) e gestione sicura del delta.
- Risolto bug di rendering finestra Dictionary vuota spostando il grab_set() post-popolamento UI.
* Aggiornato .gitignore
* Aggiunto PyInstaller come dipendenza
* Aggiunta sezione sviluppo in locale sui sistemi Linux per installare a livello di sistema tkinter
* docs: aggiunti i prerequisiti di sistema (tkinter) per lo sviluppo locale su Linux
* docs: aggiunti i prerequisiti di sistema (tkinter) per lo sviluppo locale su Linux
* - Creato script build_local per lacreazione in locale dei pacchetti in base all'OS
- Aggiornato .gitignore
* Update: Corretto formattazione del testo e titoli
Added: Sezione per gli script di automazione (creazione venv e compilazione in locale)
* Sistemato link repositori per il comando git clone
* Rilascio versione 1.4.0
* fix/perf: centratura popup, crash export e ottimizzazione AI
- Ripristinata la centratura geometrica (X, Y) per le finestre About e Dizionario.
- Corretto crash irreversibile durante l'esportazione di PDF contenenti AcroForms.
- Risolto lo skipping delle annotazioni nel comando 'Clear Page' (iterazione sicura).
- Aggiunta protezione contro eccezioni sul drag del mouse a canvas vuoto.
- [PERFORMANCE] Estrazione e pre-compilazione delle Regex AI: tempo di scansione abbattuto del 70%.
- Riformattato e scompattato il codice della GUI per una migliore manutenibilità futura.
* build(scripts): riscrittura multipiattaforma per Windows e macOS nativo
- [WINDOWS] Risolto il blocco di 'RecursionError' causato da SpaCy iniettando 'sys.setrecursionlimit' in un file .spec dinamico.
- [WINDOWS/MAC] Aggiunta conversione automatica dell'icona da PNG a ICO (Windows) e ICNS (macOS) tramite Pillow.
- [MAC] Implementata l'istruzione BUNDLE per pacchettizzare la build in un'applicazione .app nativa invece di un binario UNIX nudo.
- [CORE] Abbandonato il parsing massivo via riga di comando in favore di un .spec strutturato che gestisce correttamente gli hidden imports (customtkinter, spacy, presidio).
- Aggiornata la logica di rinomina e spostamento dei file per supportare sia eseguibili singoli che directory di bundle.
* docs: aggiornato readme con limiti forensi e redatto changelog v1.5.4
* fix(core): risolto blocco e morte silenziosa del thread AI al primo avvio
- Aggiunti comandi 'self.update()' per forzare l'aggiornamento grafico della GUI prima che il processore venga saturato dal caricamento dei modelli linguistici.
- Implementato un Mutex Lock ('self.is_processing') per prevenire l'accavallamento dei comandi se l'utente clicca più volte per impazienza.
- Avvolta l'intera logica di scansione in un robusto blocco try-except. Qualsiasi eccezione nascosta di SpaCy o Presidio verrà ora mostrata in tempo reale nel box dei log, impedendo la 'morte silenziosa' dell'evento Tkinter.
- Sostituita ultima regex inversa complessa con operatore nativo Python 'in' per ulteriore spinta prestazionale.
* docs: aggiunta guida utente passo-passo localizzata
- Creato file GUIDA_UTENTE.md con tutorial operativo per utenti non esperti. - Inseriti link rapidi nel README per facilitare l'onboarding.
* Update README.md
* fix(linux/core): supporto GNOME nativo, fix scroll e correzione critica regex
- [LINUX] Implementato wrapper per intercettare 'zenity' e 'kdialog' garantendo finestre di selezione file native moderne.
- [LINUX] Ripristinati gli eventi fisici <Button-4> e <Button-5> per garantire il funzionamento dello scroll mouse su server X11/Wayland.
- [GUI] Rimosse le emoji testuali dai bottoni per risolvere i problemi di font fallback su sistemi minimali.
- [CORE] Fixato un grave bug logico nella whitelist che avrebbe protetto sottostringhe parziali usando l'operatore 'in'. Ripristinata e ottimizzata la valutazione tramite Regex boundary (\b).
* fix(core/linux): risolto bug loop annulla e ripristinato controllo crittografico
- [LINUX] Sistemato bug nel wrapper dei file dialog nativi che apriva la vecchia finestra Tkinter se l'utente cliccava su 'Annulla' in Zenity/Kdialog.
- [CORE] Ripristinato il blocco vitale 'if temp_doc.needs_pass:' durante il caricamento del file (inavvertitamente rimosso nelle versioni precedenti) per prevenire crash totali del motore AI su documenti protetti da password.
* fix(linux): corretto crash Zenity su Fedora e decodifica URI per Drag&Drop
- [LINUX] Aggiornata la sintassi dell'argomento --file-filter in Zenity e ottimizzato il gestore dei codici di ritorno per garantire un fallback infallibile verso Tkinter.
- [LINUX] Implementato parser di decodifica URI (urllib.parse) per ripulire il prefisso 'file://' e gli spazi '%20'. Ora il Drag and Drop del file sull'icona dell'eseguibile o tramite Desktop Entry funziona correttamente su GNOME/Wayland.
* fix(linux): rimossi i filtri in Zenity e gestito Drag&Drop nativo
- Eliminato il parametro --file-filter dalle chiamate a Zenity per prevenire il crash (exit code 1) sui sistemi Fedora/GNOME. Ora si appoggia a un controllo formato sicuro interno al tool.
- Aggiunta la decodifica dell'URI (file:// e spazi %20) nella funzione di avvio per permettere il caricamento via Drag & Drop sull'icona o apertura tramite terminale Linux.
* refactor: migrazione Enterprise a PySide6 e architettura Multithread (v2.0.4)
- [ARCHITETTURA] Sostituito integralmente lo stack grafico da CustomTkinter a PySide6 (Qt6). Questo garantisce un supporto nativo assoluto per i File Dialogs e il Drag & Drop su Linux (Wayland/GNOME), Windows e macOS.
- [CORE/THREADING] Isolato il motore AI (Presidio e spaCy) in un 'AIWorker' su QThread dedicato. La GUI ora gode di totale fluidità.
- [SICUREZZA THREAD] Sostituiti i vecchi workaround di aggiornamento con il sistema nativo Qt 'Signals & Slots', prevenendo crash di tipizzazione C++ nel passaggio delle Espressioni Regolari. Chiusura sicura del thread agganciata all'evento di uscita.
- [UX/UI] Rendering PDF accelerato via hardware tramite 'QGraphicsView'. Introdotto foglio di stile (QSS) personalizzato a tema 'Cybersecurity' e log di sistema formattati semanticamente (colori HTML in base a errori, avvisi e successi).
- [DEVOPS] Aggiornati gli script 'setup_env.py' e 'build_local.py' per gestire la transizione del framework rimuovendo customtkinter e ottimizzando il pacchetto Qt6 per PyInstaller.
- [FIX] Reintegrata finestra Info customizzata con logo, risolti artefatti grafici sugli input e allineata la naming convention in ottica white-label.
* docs: aggiornata documentazione per la versione 2.0.4 (Qt6)
- Aggiornati requisiti tecnici (PySide6). - Descritta la nuova architettura multithread nella guida utente. - Inserite istruzioni per il Drag & Drop nativo e i nuovi log colorati.
* chore(build): ottimizzazione PyInstaller per GitHub Actions e fix build-id
- Ottimizzato 'build_local.py' per disabilitare lo strip dei binari (strip=False), prevenendo errori di corruzione legati ai GNU build-id su sistemi Linux CI/CD.
- Perfezionata la gestione delle icone nel PyInstaller .spec: ora garantisce la corretta iniezione dell'icona .ico (Windows) e del BUNDLE .icns (macOS).
- Aggiornato workflow 'build.yml' rimuovendo librerie obsolete e installando binutils e libxcb richiesti da Qt6 su ambiente Ubuntu 22.04 headless.
- Aggiornato 'setup_env.py' per riflettere lo stack pulito delle dipendenze.
* chore(deps): rimossa libreria pillow e generate icone pre-compilate
- Ottimizzata la gestione delle icone: rimosso l'engine di conversione in runtime (PIL) da build_local.py in favore di icone native pre-esistenti.
- Rimossa la dipendenza 'pillow' dagli script setup_env.py e dal workflow GitHub Actions, snellendo la footprint del progetto.
* Aggiornato README.md - Rimosso riga Pillow dalla sezione Tecnologie utilizzate
* refactor(build): allineamento nomi build e automazione release.yml
- Ripristinata la logica di naming 'NullifyPDF_v{version}_{os_name}{ext}' inclusa la dicitura Linux_Portable.
- Implementato workflow release.yml per la pubblicazione automatica degli asset su GitHub.
- Rimossa definitivamente la dipendenza pillow da tutta la catena di build e configurazione.
* fix(macos): trasformato binario in App Bundle installabile (ZIP)
- Ripristinata la logica BUNDLE in PyInstaller per generare un pacchetto .app su macOS.
- Aggiunta compressione automatica ZIP per distribuire il bundle mantenendo icone e permessi.
- Sincronizzati i nomi degli artefatti nel workflow GitHub Actions per caricare .zip, .exe, .deb e .rpm.
* release: v2.0.5 completa e stabile (macOS ZIP, pacchetti DEB/RPM con trigger, no-Pillow)
- [Core] Silenziati i log qt.qpa.wayland e agganciato setDesktopFileName per risolvere bug launcher su Fedora/GNOME.
- [Build] Riscritta completamente la logica dei pacchetti RPM e DEB per eseguire gli update-desktop-database in %post/postinst.
- [macOS] Impacchettamento garantito tramite file ZIP del BUNDLE (.app) mantenendo permessi e firma.
- [Deps] Pillow rimossa da tutti gli script Python e GitHub Actions in favore di asset statici pre-generati (.ico e .icns).
- [CI/CD] Workflow unificato in release.yml configurato per raccogliere solo i 4 formati esatti specificati.
* chore: architettura a Singola Fonte di Verità con requirements.txt
- Introdotto file requirements.txt centralizzato per la gestione dei pacchetti.
- Aggiornato setup_env.py per installare le dipendenze dinamicamente leggendo il txt.
- Ottimizzati i workflow GitHub Actions: reinserita la direttiva 'cache: pip' che ora funziona grazie al requirements.txt, riducendo drasticamente i tempi di build.
- Le azioni GitHub ora richiamano pip install -r requirements.txt evitando duplicazioni di codice.
* chore(build): ottimizzazione cache pip, fix macOS e requirements centralizzati
- Centralizzate le dipendenze in requirements.txt (Single Source of Truth).
- Ripristinata la cache pip nei workflow GitHub Actions per velocizzare le build.
- Creato workflow 'test_build.yml' per la validazione delle PR verso main.
- Fix macOS in 'build_local.py': risolto errore path ZIP e implementata modalità ONEDIR sicura per Apple Gatekeeper.
* fix(build): risolto crash UnicodeEncodeError su Windows
- Sostituiti i caratteri speciali (come la spunta Unicode) con testo ASCII standard ([OK], [ERROR]) per prevenire crash del terminale cp1252 durante l'esecuzione su runner Windows in GitHub Actions.
* Update copyright
* refactor(P0): Critical bug fixes - bare except, input validation, logging
CRITICAL FIXES:
- Remove bare except clauses: jump_page(), cmd_export() [2x]
Replace with specific exception types: ValueError, RuntimeError, AttributeError
- Add input validation to load_path(): check path exists, type, PDF extension
- Add input validation to jump_page(): check doc loaded before use, bounds
- Fix p.annots() crash: use (p.annots() or []) to handle None return
Locations: user_click_pt(), cmd_clear(), apply_ai_to_page()
LOGGING INFRASTRUCTURE:
- Add file-based logging with rotation (~/.nullifypdf/logs/nullifypdf.log)
- Setup logging module with UTF-8 encoding (fixes Windows UnicodeEncodeError)
- Add logger to NullifyPDF class and use in error handlers
- Log tracebacks on exceptions for debugging
CODE QUALITY:
- Add docstrings to PDF_Checker.py and build_local.py
- Add validation for PDF_Checker.inspect_pdf(): file_path, target_word, extension
- Improve error messages with helpful context (page ranges, file types)
- Replace generic except with specific exception types
BACKWARD COMPATIBLE: All changes are non-breaking
* refactor(P1): Add type hints and docstrings to all modules
TYPE HINTS:
- Add typing module imports: Optional, List, Set, Dict, Any, Tuple
- Add function/method type hints (parameters + return types):
* NullifyPDF.py: 26+ methods/functions
* PDF_Checker.py: inspect_pdf()
* build_local.py: All 5 build functions
* setup_env.py: setup_environment()
- Type hints cover: logging.Logger, str, Set, None, QRectF, QPointF, etc.
DOCSTRINGS (Google Style):
- Add module-level docstrings to all files
- Add class docstrings: AIWorker, PDFView, NullifyPDF
- Add method docstrings with Args/Returns/Example sections
- 100+ docstring additions across codebase
CODE QUALITY:
- Improve IDE autocomplete with type hints
- Enable static type checking with mypy (future)
- Self-documenting code through typing
BACKWARD COMPATIBLE: All changes are non-breaking
* refactor(P2): Refactoring and code quality improvements
REMOVED LIST COMPREHENSION SIDE EFFECTS:
- Convert build_ui() radio button setup to for loop (lines 378-386)
- Convert user_click_pt() delete_annot to for loop (lines 527-528)
- Improve code readability and IDE warnings
EXTRACTED PDFListManager CLASS:
- New class manages blocklist/allowlist persistence
- Methods: load_blocklist(), load_allowlist(), save_blocklist(), save_allowlist()
- Encapsulate file I/O logic away from main window class
- Improve testability and separation of concerns
- Reduce NullifyPDF class size (~30 lines removed from methods)
AIWorker INPUT VALIDATION:
- Add validation for pages_text parameter (non-empty list)
- Add validation for choice parameter ('EN', 'IT', 'BOTH')
- Add validation for compiled_allowlist parameter (list type)
- Emit error signals and finish gracefully on validation failure
- Prevent crashes from invalid AI scan parameters
DEPENDENCY VERSION PINNING:
- Specify exact versions for all dependencies:
* PySide6==6.7.0
* PyMuPDF==1.24.1
* presidio-analyzer==2.2.354
* spacy==3.7.2
* pyinstaller==6.3.0
- Enable deterministic builds across machines
- Add category comments for dependency organization
BACKWARD COMPATIBLE: All changes maintain existing API and behavior
* refactor(P3): Polish and testing infrastructure
DEBUG MODE:
- Add NULLIFYPDF_DEBUG environment variable support
- Set logging level to DEBUG when NULLIFYPDF_DEBUG=true
- Enables verbose troubleshooting without code changes
SETUP_ENV.PY LOGGING:
- Replace all print() calls with logging module
- Use structured logging with standard format
- Proper error handling with logger.error/warning
- Cross-platform friendly output
SMOKE TESTS:
- Create tests/test_validation.py with 9 test cases
- Test PDFListManager save/load round-trip
- Test word normalization (lowercase, min length)
- Test config directory creation
- Test resource_path returns string
- Test error handling with invalid inputs
- Pytest compatible with parametrized tests
BACKWARD COMPATIBLE: All changes maintain existing functionality
* fix(dependencies): Update package versions for Python 3.13 compatibility
- PySide6: 6.7.0 → 6.11.1 (6.7.0 does not support Python 3.13)
- PyMuPDF: 1.24.1 → 1.24.9
- pyinstaller: 6.3.0 → 6.10.0 (6.3.0 does not support Python 3.13)
- presidio-analyzer: 2.2.354 (unchanged)
- spacy: 3.7.2 (unchanged)
Fixes pip install error with Python 3.13
* fix(setup): Improve venv removal robustness with retry logic
- Add 3-attempt retry loop for removing old .venv directory
- Add 0.5s delay between retry attempts
- Better error handling and logging
- Proceed with venv creation even if removal incomplete
- Handle Windows file locking issues more gracefully
* docs: update documentation for v2.0.5 release
- Add CHANGELOG v2.0.5 with all bug fixes, performance optimizations, and code quality improvements
- Expand GUIDA_UTENTE.md with troubleshooting, debug mode, logging guide, and best practices
- Update README.md with v2.0.5 features (thread-safety, fast-path, disk-backed export, logging)
- Add pytest and mypy to requirements.txt as development dependencies
- Update GitHub Actions workflows to Python 3.12 and include smoke tests and type checking
* docs: remove obsolete tkinter instructions from README
NullifyPDF uses PySide6 (Qt6), not tkinter/customtkinter. Removed misleading and outdated Linux installation notes that referenced a GUI framework no longer used by the project.
* fix: implement all code review fixes for v2.0.5
Critical fixes:
- C2: Handle None from page.annots() on export
- C4: Remove unsafe spaCy vocab mutation
- H1: Add context manager for file handle leak
- H2: Guard against division by zero in progress bar
- H3: Copy QImage buffer to prevent segfault
- H7: Defer self.close() via QTimer for signal handler safety
- H8: Use repr() for safe path quoting in PyInstaller spec
- H9: Add check=True to pip upgrade subprocess
Performance optimizations:
- C1: Disk-backed memory-efficient PDF export (2x to 1x RAM)
- H6: Pre-compile regex patterns outside loops
- M3: Add O(1) fast-path for allowlist exact-match
- M4: Move get_text() extraction to worker thread with QMutex
Code quality:
- 100% type hints coverage across all modules
- Google-style docstrings for public methods
- File-based logging with rotation and debug mode
- Input validation for path, range, language selection
- Thread-safe document access with QMutex serialization
* fix(ci): replace spacy download with direct pip install from GitHub releases
- Use direct GitHub release URLs for spacy models instead of fragile spacy download command
- URLs pinned to exact versions (en_core_web_md-3.7.1, it_core_news_md-3.7.0)
- Fixes HTTP 404 errors on GitHub Actions
- Matches working implementation from setup_env.py for consistency across all environments
* optimization(ci): add spacy models to requirements.txt for pip caching
- Add spacy language models (en_core_web_md-3.7.1, it_core_news_md-3.7.0) to requirements.txt
- Models now installed via 'pip install -r requirements.txt' instead of separate step
- GitHub Actions pip cache now includes spacy models (~100+ MB)
- Subsequent CI runs will be much faster (cache hit on pip install)
- Simplifies workflow by removing dedicated 'Download AI Models' step
- Maintains exact version pinning for reproducibility
* docs: add core documentation (README, CONTRIBUTING, ARCHITECTURE)
- Redesigned README.md in English with EMLyzer style guide
- Added CONTRIBUTING.md with contributor guidelines, code standards, and PR workflow
- Added ARCHITECTURE.md with system design, components, and threading model
All documentation follows GitHub-optimized format with emoji, alerts, and tables.
* docs: add user and developer guides
- Added USER_GUIDE.md with 6-step tutorial, FAQ, and logging setup
- Added TROUBLESHOOTING.md with 10+ common issues and OS-specific solutions
- Added DEVELOPMENT.md with setup guide, code standards, and testing instructions
All guides include collapsible sections, tables with emoji, and EMLyzer style formatting.
* docs: add security, community, and GitHub templates
- Added SECURITY.md with privacy model, technical security details, and responsible disclosure
- Added CODE_OF_CONDUCT.md based on Contributor Covenant v2.1
- Added GitHub issue templates for bug reports and feature requests
- Added GitHub pull request template with testing and checklist
Includes automated template system for users submitting issues and PRs.
* ci: add dependabot configuration for automated dependency updates
- Configure Dependabot to scan pip dependencies weekly
- Auto-open PRs for security updates (max 5 per week)
- Configure Dependabot for GitHub Actions
- Use standardized commit message format (chore(deps), ci(deps))
- Reviewers and labels configured for dependency PRs
* docs: release v2.0.5 documentation suite and security configuration (#51)
* docs: add core documentation (README, CONTRIBUTING, ARCHITECTURE)
- Redesigned README.md in English with EMLyzer style guide
- Added CONTRIBUTING.md with contributor guidelines, code standards, and PR workflow
- Added ARCHITECTURE.md with system design, components, and threading model
All documentation follows GitHub-optimized format with emoji, alerts, and tables.
* docs: add user and developer guides
- Added USER_GUIDE.md with 6-step tutorial, FAQ, and logging setup
- Added TROUBLESHOOTING.md with 10+ common issues and OS-specific solutions
- Added DEVELOPMENT.md with setup guide, code standards, and testing instructions
All guides include collapsible sections, tables with emoji, and EMLyzer style formatting.
* docs: add security, community, and GitHub templates
- Added SECURITY.md with privacy model, technical security details, and responsible disclosure
- Added CODE_OF_CONDUCT.md based on Contributor Covenant v2.1
- Added GitHub issue templates for bug reports and feature requests
- Added GitHub pull request template with testing and checklist
Includes automated template system for users submitting issues and PRs.
* ci: add dependabot configuration for automated dependency updates
- Configure Dependabot to scan pip dependencies weekly
- Auto-open PRs for security updates (max 5 per week)
- Configure Dependabot for GitHub Actions
- Use standardized commit message format (chore(deps), ci(deps))
- Reviewers and labels configured for dependency PRs
* build(deps): bump pytest from 7.4.4 to 9.0.3 (#50)
Bumps [pytest](https://github.com/pytest-dev/pytest) from 7.4.4 to 9.0.3.
- [Release notes](https://github.com/pytest-dev/pytest/releases)
- [Changelog](https://github.com/pytest-dev/pytest/blob/main/CHANGELOG.rst)
- [Commits](pytest-dev/pytest@7.4.4...9.0.3)
---
updated-dependencies:
- dependency-name: pytest
dependency-version: 9.0.3
dependency-type: direct:production
...
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* chore(deps)(deps): bump presidio-analyzer from 2.2.354 to 2.2.359 (#60)
Bumps [presidio-analyzer](https://github.com/Microsoft/presidio) from 2.2.354 to 2.2.359.
- [Release notes](https://github.com/Microsoft/presidio/releases)
- [Changelog](https://github.com/microsoft/presidio/blob/main/CHANGELOG.md)
- [Commits](microsoft/presidio@2.2.354...2.2.359)
---
updated-dependencies:
- dependency-name: presidio-analyzer
dependency-version: 2.2.359
dependency-type: direct:production
update-type: version-update:semver-patch
...
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* ci(deps)(deps): bump actions/upload-artifact from 4 to 7 (#52)
Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 4 to 7.
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](actions/upload-artifact@v4...v7)
---
updated-dependencies:
- dependency-name: actions/upload-artifact
dependency-version: '7'
dependency-type: direct:production
update-type: version-update:semver-major
...
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* ci(deps)(deps): bump actions/checkout from 4 to 6 (#53)
Bumps [actions/checkout](https://github.com/actions/checkout) from 4 to 6.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](actions/checkout@v4...v6)
---
updated-dependencies:
- dependency-name: actions/checkout
dependency-version: '6'
dependency-type: direct:production
update-type: version-update:semver-major
...
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* ci(deps)(deps): bump actions/setup-python from 5 to 6 (#54)
Bumps [actions/setup-python](https://github.com/actions/setup-python) from 5 to 6.
- [Release notes](https://github.com/actions/setup-python/releases)
- [Commits](actions/setup-python@v5...v6)
---
updated-dependencies:
- dependency-name: actions/setup-python
dependency-version: '6'
dependency-type: direct:production
update-type: version-update:semver-major
...
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* ci(deps)(deps): bump actions/download-artifact from 4 to 8 (#55)
Bumps [actions/download-artifact](https://github.com/actions/download-artifact) from 4 to 8.
- [Release notes](https://github.com/actions/download-artifact/releases)
- [Commits](actions/download-artifact@v4...v8)
---
updated-dependencies:
- dependency-name: actions/download-artifact
dependency-version: '8'
dependency-type: direct:production
update-type: version-update:semver-major
...
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* ci(deps)(deps): bump softprops/action-gh-release from 2 to 3 (#56)
Bumps [softprops/action-gh-release](https://github.com/softprops/action-gh-release) from 2 to 3.
- [Release notes](https://github.com/softprops/action-gh-release/releases)
- [Changelog](https://github.com/softprops/action-gh-release/blob/master/CHANGELOG.md)
- [Commits](softprops/action-gh-release@v2...v3)
---
updated-dependencies:
- dependency-name: softprops/action-gh-release
dependency-version: '3'
dependency-type: direct:production
update-type: version-update:semver-major
...
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* chore(deps)(deps): bump pymupdf from 1.24.8 to 1.27.2.3 (#57)
Bumps [pymupdf](https://github.com/pymupdf/pymupdf) from 1.24.8 to 1.27.2.3.
- [Release notes](https://github.com/pymupdf/pymupdf/releases)
- [Changelog](https://github.com/pymupdf/PyMuPDF/blob/main/changes.txt)
- [Commits](pymupdf/PyMuPDF@1.24.8...1.27.2.3)
---
updated-dependencies:
- dependency-name: pymupdf
dependency-version: 1.27.2.3
dependency-type: direct:production
update-type: version-update:semver-minor
...
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* chore(deps)(deps): bump pyinstaller from 6.10.0 to 6.20.0 (#59)
Bumps [pyinstaller](https://github.com/pyinstaller/pyinstaller) from 6.10.0 to 6.20.0.
- [Release notes](https://github.com/pyinstaller/pyinstaller/releases)
- [Changelog](https://github.com/pyinstaller/pyinstaller/blob/develop/doc/CHANGES.rst)
- [Commits](pyinstaller/pyinstaller@v6.10.0...v6.20.0)
---
updated-dependencies:
- dependency-name: pyinstaller
dependency-version: 6.20.0
dependency-type: direct:production
update-type: version-update:semver-minor
...
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* chore(deps)(deps): bump mypy from 1.8.0 to 1.20.2 (#58)
Bumps [mypy](https://github.com/python/mypy) from 1.8.0 to 1.20.2.
- [Changelog](https://github.com/python/mypy/blob/master/CHANGELOG.md)
- [Commits](python/mypy@v1.8.0...v1.20.2)
---
updated-dependencies:
- dependency-name: mypy
dependency-version: 1.20.2
dependency-type: direct:production
update-type: version-update:semver-minor
...
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* chore(deps)(deps): bump spacy from 3.7.2 to 3.8.14 (#61)
* chore(deps)(deps): bump spacy from 3.7.2 to 3.8.14
Bumps [spacy](https://github.com/explosion/spaCy) from 3.7.2 to 3.8.14.
- [Release notes](https://github.com/explosion/spaCy/releases)
- [Commits](explosion/spaCy@v3.7.2...release-v3.8.14)
---
updated-dependencies:
- dependency-name: spacy
dependency-version: 3.8.14
dependency-type: direct:production
update-type: version-update:semver-minor
...
Signed-off-by: dependabot[bot] <support@github.com>
* chore(deps)(deps): bump spacy from 3.7.2 to 3.8.14
Bumps [spacy](https://github.com/explosion/spaCy) from 3.7.2 to 3.8.14.
- [Release notes](https://github.com/explosion/spaCy/releases)
- [Commits](explosion/spaCy@v3.7.2...release-v3.8.14)
---
updated-dependencies:
- dependency-name: spacy
dependency-version: 3.8.14
dependency-type: direct:production
update-type: version-update:semver-minor
...
Signed-off-by: dependabot[bot] <support@github.com>
---------
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: 0verwrite <31691645+overwrite00@users.noreply.github.com>
* security(workflows): add explicit permissions to GitHub Actions workflows (#62)
- test_build.yml: read contents, read actions (testing only)
- release.yml: write contents, read actions (for creating releases)
Fixes CodeQL alerts about missing workflow permissions.
Follows GitHub security best practices: explicit permissions limit
GITHUB_TOKEN scope to what's necessary for each workflow.
* ci: add auto-approve workflow for maintainer pull requests
- Automatically approves PRs created by the maintainer (overwrite00)
- Removes need for repository admin bypass in ruleset
- Maintains security while enabling smooth workflow
- Approval is traceable and can be disabled if needed
* ci: remove non-functional auto-approve workflow
GitHub Actions cannot approve pull requests due to platform limitations.
The bypass admin in ruleset is the appropriate solution for solo maintainers.
Revert PR #63.
* fix: remove unsupported reviewers property from dependabot.yml
The 'reviewers' property is not supported in Dependabot v2.0.
Removed to fix schema validation warnings in VS Code.
* Revert "fix: remove unsupported reviewers property from dependabot.yml"
This reverts commit 0fdad6b.
* fix: remove unsupported reviewers property from dependabot.yml
The 'reviewers' property is not supported in Dependabot v2.0.
Removed to fix schema validation warnings in VS Code.
This aligns with Dependabot v2 supported properties:
- schedule, labels, commit-message, allow, ignore
- open-pull-requests-limit, etc.
But NOT: reviewers (use assignees instead if needed)
* docs: simplify security support section in SECURITY.md
Removed redundant version support table. Only the latest version
receives security updates, so listing old versions was unnecessary.
Replaced with concise statement that clearly communicates the policy.
* docs: simplify security support section in SECURITY.md (#65)
Removed redundant version support table. Only the latest version
receives security updates, so listing old versions was unnecessary.
Replaced with concise statement that clearly communicates the policy.
* ci: optimize test_build workflow triggers
Remove redundant 'push' trigger that caused duplicate test runs.
Tests now run only on pull_request events to avoid waste.
- Before: Tests ran on both push AND pull_request (duplicate)
- After: Tests run only on pull_request to main
- Manual trigger (workflow_dispatch) still available
Reduces CI/CD noise and resources while maintaining coverage.
* ci: optimize test_build workflow triggers (#66)
* docs: simplify security support section in SECURITY.md
Removed redundant version support table. Only the latest version
receives security updates, so listing old versions was unnecessary.
Replaced with concise statement that clearly communicates the policy.
* ci: optimize test_build workflow triggers
Remove redundant 'push' trigger that caused duplicate test runs.
Tests now run only on pull_request events to avoid waste.
- Before: Tests ran on both push AND pull_request (duplicate)
- After: Tests run only on pull_request to main
- Manual trigger (workflow_dispatch) still available
Reduces CI/CD noise and resources while maintaining coverage.
* ci: configure dependabot to target develop branch
* Add files via upload
* ci: standardize automation with universal schema
- Update dependabot.yml to use universal label schema (lang:python, type:ci, scope:*)
- Update project-automation.yml with centralized PROJECT_ID and GH_PROJECT_TOKEN
- Centralize automation configuration for all repositories
* ci: add reopened trigger to issues workflow
- Include 'reopened' event type for issues (consistent with PR behavior)
- Allows automation to trigger when issues are reopened
* fix: correct bash syntax in project-automation workflow
The workflow had a critical syntax error: attempting to use a GitHub Actions context variable directly as a bash conditional. Fixed by storing the variable value first, then comparing it as a string.
Error was: if ${{ github.event.pull_request.merged }}; then
Fixed to: PR_MERGED="${{ github.event.pull_request.merged }}" && if [ "$PR_MERGED" = "true" ]; then
This syntax error prevented the workflow from running entirely.
* fix: remove emoji from workflow for YAML compatibility
---------
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
overwrite00
added a commit
that referenced
this pull request
Jun 11, 2026
* Create LICENSE
* Delete LICENSE
* Add MIT License to the project
* Aggiunto README.md e immagine cover del progetto
* Aggiornato README.md
* Docs: move changelog to a dedicated file following Keep a Changelog standard
* Ver. 1.2.5 - Fix link mailto: negli indirizzi email censurati
* Aggiornato numero di versione badge
* Aggiunta icona applicazione e script per build automatico per le release
* Fix: stable cross-platform build and versioning
* Fix: UnicodeDecodeError on Windows build (forced utf-8 encoding)
* Fix: generazione dinamica .ico per Windows e aggiornamento asset icona
* Fix: rimozione finta trasparenza dall'icona
* Fix: vera trasparenza assoluta per l'icona
* Fix: applicata icona personalizzata anche alla finestra About
* Feat: integrazione AI locale (Presidio/spaCy), dizionari custom, censura differita e fix icone child windows
* Fix CI: aggiunta pyinstaller mancante nelle dipendenze
* Fix: Corretto numero di versione nel codice
* Fix CI: aggiornato script per estrarre correttamente la versione 1.3.0
* Fix CI: forzato encoding UTF-8 per estrazione versione
* Fix CI: packaging Linux con variabile versione e modelli md
* CI: aggiunto ignore per i file di documentazione per evitare build inutili
* CI: aggiunto ignore per i file di documentazione per evitare build inutili
* Docs: completato restyling grafico con emoji per tutte le sezioni
* Docs: completato restyling grafico con emoji per tutte le sezioni
* Corretto link linkedin
* Corretto badge Linkedin
* Aggiornato CHANGELOG.md
* Fix CI: Corretto script per la generazione dei vai pacchetti
* Corretto testo e formattazione e link repo in README.md
* ci: fix definitivo icone linux e stabilità build rpm
- Aggiunta generazione file .desktop e icone pixmaps per integrazione menu GNOME.
- Risolto conflitto Build-ID negli RPM tramite macro personalizzata.
- Ottimizzata ridenominazione dinamica pacchetti RPM.
- Verificato supporto icone cross-platform.
* ci: disabilitato fail-fast e aggiunti controlli robustezza per build linux
* fix(ci): corretta opzione alien per la creazione dell'RPM
- Sostituito --rpm-set-permissions con --fixperms (come da log di errore).
- Mantenuta la stabilità della build cross-platform.
* fix: risolto bug visualizzazione PDF su Linux e icone About
- Aggiunto hidden-import PIL._tkinter_finder nel workflow per Linux.
- Aggiornata funzione resource_path per compatibilità cross-platform.
- Fix finestra About: aggiunti crediti, licenza MIT e icona scudo reale.
- Sostituita opzione alien con --fixperms per stabilità RPM.
* fix: ripristino funzioni integrali e fix visualizzazione PDF su Linux
- Reinserita logica AI, dizionari e binding del canvas.
- Aggiornata finestra About con icona reale e crediti sviluppatore.
- Aggiunto hidden-import PIL._tkinter_finder per risolvere il crash su Fedora.
- Sostituito comando alien con --fixperms per pacchetti RPM stabili.
* Fix grafica
* chore: aggiornato setup_env.py con dipendenze AI
- Aggiunti presidio-analyzer e spacy.
- Aggiunto download automatico dei modelli linguistici (en_core_web_md, it_core_news_md).
* fix: risolto crash della GUI e aggiornato setup_env.py" -m "- Corretto TclError sostituendo i CTkButton errati con CTkFrame nei contenitori del layout.
- Aggiunte dipendenze AI (Presidio, spaCy e download modelli) allo script di configurazione."
* fix(gui): risolti bug su rendering finestre e interazione canvas su Linux" -m "- Ripristinata l'immagine dell'icona e ripulito il testo nella finestra About.
- Fix scroll del mouse nel Canvas aggiungendo i bind specifici per Linux (<Button-4>, <Button-5>) e gestione sicura del delta.
- Risolto bug di rendering finestra Dictionary vuota spostando il grab_set() post-popolamento UI.
* Aggiornato .gitignore
* Aggiunto PyInstaller come dipendenza
* Aggiunta sezione sviluppo in locale sui sistemi Linux per installare a livello di sistema tkinter
* docs: aggiunti i prerequisiti di sistema (tkinter) per lo sviluppo locale su Linux
* docs: aggiunti i prerequisiti di sistema (tkinter) per lo sviluppo locale su Linux
* - Creato script build_local per lacreazione in locale dei pacchetti in base all'OS
- Aggiornato .gitignore
* Update: Corretto formattazione del testo e titoli
Added: Sezione per gli script di automazione (creazione venv e compilazione in locale)
* Sistemato link repositori per il comando git clone
* Rilascio versione 1.4.0
* fix/perf: centratura popup, crash export e ottimizzazione AI
- Ripristinata la centratura geometrica (X, Y) per le finestre About e Dizionario.
- Corretto crash irreversibile durante l'esportazione di PDF contenenti AcroForms.
- Risolto lo skipping delle annotazioni nel comando 'Clear Page' (iterazione sicura).
- Aggiunta protezione contro eccezioni sul drag del mouse a canvas vuoto.
- [PERFORMANCE] Estrazione e pre-compilazione delle Regex AI: tempo di scansione abbattuto del 70%.
- Riformattato e scompattato il codice della GUI per una migliore manutenibilità futura.
* build(scripts): riscrittura multipiattaforma per Windows e macOS nativo
- [WINDOWS] Risolto il blocco di 'RecursionError' causato da SpaCy iniettando 'sys.setrecursionlimit' in un file .spec dinamico.
- [WINDOWS/MAC] Aggiunta conversione automatica dell'icona da PNG a ICO (Windows) e ICNS (macOS) tramite Pillow.
- [MAC] Implementata l'istruzione BUNDLE per pacchettizzare la build in un'applicazione .app nativa invece di un binario UNIX nudo.
- [CORE] Abbandonato il parsing massivo via riga di comando in favore di un .spec strutturato che gestisce correttamente gli hidden imports (customtkinter, spacy, presidio).
- Aggiornata la logica di rinomina e spostamento dei file per supportare sia eseguibili singoli che directory di bundle.
* docs: aggiornato readme con limiti forensi e redatto changelog v1.5.4
* fix(core): risolto blocco e morte silenziosa del thread AI al primo avvio
- Aggiunti comandi 'self.update()' per forzare l'aggiornamento grafico della GUI prima che il processore venga saturato dal caricamento dei modelli linguistici.
- Implementato un Mutex Lock ('self.is_processing') per prevenire l'accavallamento dei comandi se l'utente clicca più volte per impazienza.
- Avvolta l'intera logica di scansione in un robusto blocco try-except. Qualsiasi eccezione nascosta di SpaCy o Presidio verrà ora mostrata in tempo reale nel box dei log, impedendo la 'morte silenziosa' dell'evento Tkinter.
- Sostituita ultima regex inversa complessa con operatore nativo Python 'in' per ulteriore spinta prestazionale.
* docs: aggiunta guida utente passo-passo localizzata
- Creato file GUIDA_UTENTE.md con tutorial operativo per utenti non esperti. - Inseriti link rapidi nel README per facilitare l'onboarding.
* Update README.md
* fix(linux/core): supporto GNOME nativo, fix scroll e correzione critica regex
- [LINUX] Implementato wrapper per intercettare 'zenity' e 'kdialog' garantendo finestre di selezione file native moderne.
- [LINUX] Ripristinati gli eventi fisici <Button-4> e <Button-5> per garantire il funzionamento dello scroll mouse su server X11/Wayland.
- [GUI] Rimosse le emoji testuali dai bottoni per risolvere i problemi di font fallback su sistemi minimali.
- [CORE] Fixato un grave bug logico nella whitelist che avrebbe protetto sottostringhe parziali usando l'operatore 'in'. Ripristinata e ottimizzata la valutazione tramite Regex boundary (\b).
* fix(core/linux): risolto bug loop annulla e ripristinato controllo crittografico
- [LINUX] Sistemato bug nel wrapper dei file dialog nativi che apriva la vecchia finestra Tkinter se l'utente cliccava su 'Annulla' in Zenity/Kdialog.
- [CORE] Ripristinato il blocco vitale 'if temp_doc.needs_pass:' durante il caricamento del file (inavvertitamente rimosso nelle versioni precedenti) per prevenire crash totali del motore AI su documenti protetti da password.
* fix(linux): corretto crash Zenity su Fedora e decodifica URI per Drag&Drop
- [LINUX] Aggiornata la sintassi dell'argomento --file-filter in Zenity e ottimizzato il gestore dei codici di ritorno per garantire un fallback infallibile verso Tkinter.
- [LINUX] Implementato parser di decodifica URI (urllib.parse) per ripulire il prefisso 'file://' e gli spazi '%20'. Ora il Drag and Drop del file sull'icona dell'eseguibile o tramite Desktop Entry funziona correttamente su GNOME/Wayland.
* fix(linux): rimossi i filtri in Zenity e gestito Drag&Drop nativo
- Eliminato il parametro --file-filter dalle chiamate a Zenity per prevenire il crash (exit code 1) sui sistemi Fedora/GNOME. Ora si appoggia a un controllo formato sicuro interno al tool.
- Aggiunta la decodifica dell'URI (file:// e spazi %20) nella funzione di avvio per permettere il caricamento via Drag & Drop sull'icona o apertura tramite terminale Linux.
* refactor: migrazione Enterprise a PySide6 e architettura Multithread (v2.0.4)
- [ARCHITETTURA] Sostituito integralmente lo stack grafico da CustomTkinter a PySide6 (Qt6). Questo garantisce un supporto nativo assoluto per i File Dialogs e il Drag & Drop su Linux (Wayland/GNOME), Windows e macOS.
- [CORE/THREADING] Isolato il motore AI (Presidio e spaCy) in un 'AIWorker' su QThread dedicato. La GUI ora gode di totale fluidità.
- [SICUREZZA THREAD] Sostituiti i vecchi workaround di aggiornamento con il sistema nativo Qt 'Signals & Slots', prevenendo crash di tipizzazione C++ nel passaggio delle Espressioni Regolari. Chiusura sicura del thread agganciata all'evento di uscita.
- [UX/UI] Rendering PDF accelerato via hardware tramite 'QGraphicsView'. Introdotto foglio di stile (QSS) personalizzato a tema 'Cybersecurity' e log di sistema formattati semanticamente (colori HTML in base a errori, avvisi e successi).
- [DEVOPS] Aggiornati gli script 'setup_env.py' e 'build_local.py' per gestire la transizione del framework rimuovendo customtkinter e ottimizzando il pacchetto Qt6 per PyInstaller.
- [FIX] Reintegrata finestra Info customizzata con logo, risolti artefatti grafici sugli input e allineata la naming convention in ottica white-label.
* docs: aggiornata documentazione per la versione 2.0.4 (Qt6)
- Aggiornati requisiti tecnici (PySide6). - Descritta la nuova architettura multithread nella guida utente. - Inserite istruzioni per il Drag & Drop nativo e i nuovi log colorati.
* chore(build): ottimizzazione PyInstaller per GitHub Actions e fix build-id
- Ottimizzato 'build_local.py' per disabilitare lo strip dei binari (strip=False), prevenendo errori di corruzione legati ai GNU build-id su sistemi Linux CI/CD.
- Perfezionata la gestione delle icone nel PyInstaller .spec: ora garantisce la corretta iniezione dell'icona .ico (Windows) e del BUNDLE .icns (macOS).
- Aggiornato workflow 'build.yml' rimuovendo librerie obsolete e installando binutils e libxcb richiesti da Qt6 su ambiente Ubuntu 22.04 headless.
- Aggiornato 'setup_env.py' per riflettere lo stack pulito delle dipendenze.
* chore(deps): rimossa libreria pillow e generate icone pre-compilate
- Ottimizzata la gestione delle icone: rimosso l'engine di conversione in runtime (PIL) da build_local.py in favore di icone native pre-esistenti.
- Rimossa la dipendenza 'pillow' dagli script setup_env.py e dal workflow GitHub Actions, snellendo la footprint del progetto.
* Aggiornato README.md - Rimosso riga Pillow dalla sezione Tecnologie utilizzate
* refactor(build): allineamento nomi build e automazione release.yml
- Ripristinata la logica di naming 'NullifyPDF_v{version}_{os_name}{ext}' inclusa la dicitura Linux_Portable.
- Implementato workflow release.yml per la pubblicazione automatica degli asset su GitHub.
- Rimossa definitivamente la dipendenza pillow da tutta la catena di build e configurazione.
* fix(macos): trasformato binario in App Bundle installabile (ZIP)
- Ripristinata la logica BUNDLE in PyInstaller per generare un pacchetto .app su macOS.
- Aggiunta compressione automatica ZIP per distribuire il bundle mantenendo icone e permessi.
- Sincronizzati i nomi degli artefatti nel workflow GitHub Actions per caricare .zip, .exe, .deb e .rpm.
* release: v2.0.5 completa e stabile (macOS ZIP, pacchetti DEB/RPM con trigger, no-Pillow)
- [Core] Silenziati i log qt.qpa.wayland e agganciato setDesktopFileName per risolvere bug launcher su Fedora/GNOME.
- [Build] Riscritta completamente la logica dei pacchetti RPM e DEB per eseguire gli update-desktop-database in %post/postinst.
- [macOS] Impacchettamento garantito tramite file ZIP del BUNDLE (.app) mantenendo permessi e firma.
- [Deps] Pillow rimossa da tutti gli script Python e GitHub Actions in favore di asset statici pre-generati (.ico e .icns).
- [CI/CD] Workflow unificato in release.yml configurato per raccogliere solo i 4 formati esatti specificati.
* chore: architettura a Singola Fonte di Verità con requirements.txt
- Introdotto file requirements.txt centralizzato per la gestione dei pacchetti.
- Aggiornato setup_env.py per installare le dipendenze dinamicamente leggendo il txt.
- Ottimizzati i workflow GitHub Actions: reinserita la direttiva 'cache: pip' che ora funziona grazie al requirements.txt, riducendo drasticamente i tempi di build.
- Le azioni GitHub ora richiamano pip install -r requirements.txt evitando duplicazioni di codice.
* chore(build): ottimizzazione cache pip, fix macOS e requirements centralizzati
- Centralizzate le dipendenze in requirements.txt (Single Source of Truth).
- Ripristinata la cache pip nei workflow GitHub Actions per velocizzare le build.
- Creato workflow 'test_build.yml' per la validazione delle PR verso main.
- Fix macOS in 'build_local.py': risolto errore path ZIP e implementata modalità ONEDIR sicura per Apple Gatekeeper.
* fix(build): risolto crash UnicodeEncodeError su Windows
- Sostituiti i caratteri speciali (come la spunta Unicode) con testo ASCII standard ([OK], [ERROR]) per prevenire crash del terminale cp1252 durante l'esecuzione su runner Windows in GitHub Actions.
* Update copyright
* refactor(P0): Critical bug fixes - bare except, input validation, logging
CRITICAL FIXES:
- Remove bare except clauses: jump_page(), cmd_export() [2x]
Replace with specific exception types: ValueError, RuntimeError, AttributeError
- Add input validation to load_path(): check path exists, type, PDF extension
- Add input validation to jump_page(): check doc loaded before use, bounds
- Fix p.annots() crash: use (p.annots() or []) to handle None return
Locations: user_click_pt(), cmd_clear(), apply_ai_to_page()
LOGGING INFRASTRUCTURE:
- Add file-based logging with rotation (~/.nullifypdf/logs/nullifypdf.log)
- Setup logging module with UTF-8 encoding (fixes Windows UnicodeEncodeError)
- Add logger to NullifyPDF class and use in error handlers
- Log tracebacks on exceptions for debugging
CODE QUALITY:
- Add docstrings to PDF_Checker.py and build_local.py
- Add validation for PDF_Checker.inspect_pdf(): file_path, target_word, extension
- Improve error messages with helpful context (page ranges, file types)
- Replace generic except with specific exception types
BACKWARD COMPATIBLE: All changes are non-breaking
* refactor(P1): Add type hints and docstrings to all modules
TYPE HINTS:
- Add typing module imports: Optional, List, Set, Dict, Any, Tuple
- Add function/method type hints (parameters + return types):
* NullifyPDF.py: 26+ methods/functions
* PDF_Checker.py: inspect_pdf()
* build_local.py: All 5 build functions
* setup_env.py: setup_environment()
- Type hints cover: logging.Logger, str, Set, None, QRectF, QPointF, etc.
DOCSTRINGS (Google Style):
- Add module-level docstrings to all files
- Add class docstrings: AIWorker, PDFView, NullifyPDF
- Add method docstrings with Args/Returns/Example sections
- 100+ docstring additions across codebase
CODE QUALITY:
- Improve IDE autocomplete with type hints
- Enable static type checking with mypy (future)
- Self-documenting code through typing
BACKWARD COMPATIBLE: All changes are non-breaking
* refactor(P2): Refactoring and code quality improvements
REMOVED LIST COMPREHENSION SIDE EFFECTS:
- Convert build_ui() radio button setup to for loop (lines 378-386)
- Convert user_click_pt() delete_annot to for loop (lines 527-528)
- Improve code readability and IDE warnings
EXTRACTED PDFListManager CLASS:
- New class manages blocklist/allowlist persistence
- Methods: load_blocklist(), load_allowlist(), save_blocklist(), save_allowlist()
- Encapsulate file I/O logic away from main window class
- Improve testability and separation of concerns
- Reduce NullifyPDF class size (~30 lines removed from methods)
AIWorker INPUT VALIDATION:
- Add validation for pages_text parameter (non-empty list)
- Add validation for choice parameter ('EN', 'IT', 'BOTH')
- Add validation for compiled_allowlist parameter (list type)
- Emit error signals and finish gracefully on validation failure
- Prevent crashes from invalid AI scan parameters
DEPENDENCY VERSION PINNING:
- Specify exact versions for all dependencies:
* PySide6==6.7.0
* PyMuPDF==1.24.1
* presidio-analyzer==2.2.354
* spacy==3.7.2
* pyinstaller==6.3.0
- Enable deterministic builds across machines
- Add category comments for dependency organization
BACKWARD COMPATIBLE: All changes maintain existing API and behavior
* refactor(P3): Polish and testing infrastructure
DEBUG MODE:
- Add NULLIFYPDF_DEBUG environment variable support
- Set logging level to DEBUG when NULLIFYPDF_DEBUG=true
- Enables verbose troubleshooting without code changes
SETUP_ENV.PY LOGGING:
- Replace all print() calls with logging module
- Use structured logging with standard format
- Proper error handling with logger.error/warning
- Cross-platform friendly output
SMOKE TESTS:
- Create tests/test_validation.py with 9 test cases
- Test PDFListManager save/load round-trip
- Test word normalization (lowercase, min length)
- Test config directory creation
- Test resource_path returns string
- Test error handling with invalid inputs
- Pytest compatible with parametrized tests
BACKWARD COMPATIBLE: All changes maintain existing functionality
* fix(dependencies): Update package versions for Python 3.13 compatibility
- PySide6: 6.7.0 → 6.11.1 (6.7.0 does not support Python 3.13)
- PyMuPDF: 1.24.1 → 1.24.9
- pyinstaller: 6.3.0 → 6.10.0 (6.3.0 does not support Python 3.13)
- presidio-analyzer: 2.2.354 (unchanged)
- spacy: 3.7.2 (unchanged)
Fixes pip install error with Python 3.13
* fix(setup): Improve venv removal robustness with retry logic
- Add 3-attempt retry loop for removing old .venv directory
- Add 0.5s delay between retry attempts
- Better error handling and logging
- Proceed with venv creation even if removal incomplete
- Handle Windows file locking issues more gracefully
* docs: update documentation for v2.0.5 release
- Add CHANGELOG v2.0.5 with all bug fixes, performance optimizations, and code quality improvements
- Expand GUIDA_UTENTE.md with troubleshooting, debug mode, logging guide, and best practices
- Update README.md with v2.0.5 features (thread-safety, fast-path, disk-backed export, logging)
- Add pytest and mypy to requirements.txt as development dependencies
- Update GitHub Actions workflows to Python 3.12 and include smoke tests and type checking
* docs: remove obsolete tkinter instructions from README
NullifyPDF uses PySide6 (Qt6), not tkinter/customtkinter. Removed misleading and outdated Linux installation notes that referenced a GUI framework no longer used by the project.
* fix: implement all code review fixes for v2.0.5
Critical fixes:
- C2: Handle None from page.annots() on export
- C4: Remove unsafe spaCy vocab mutation
- H1: Add context manager for file handle leak
- H2: Guard against division by zero in progress bar
- H3: Copy QImage buffer to prevent segfault
- H7: Defer self.close() via QTimer for signal handler safety
- H8: Use repr() for safe path quoting in PyInstaller spec
- H9: Add check=True to pip upgrade subprocess
Performance optimizations:
- C1: Disk-backed memory-efficient PDF export (2x to 1x RAM)
- H6: Pre-compile regex patterns outside loops
- M3: Add O(1) fast-path for allowlist exact-match
- M4: Move get_text() extraction to worker thread with QMutex
Code quality:
- 100% type hints coverage across all modules
- Google-style docstrings for public methods
- File-based logging with rotation and debug mode
- Input validation for path, range, language selection
- Thread-safe document access with QMutex serialization
* fix(ci): replace spacy download with direct pip install from GitHub releases
- Use direct GitHub release URLs for spacy models instead of fragile spacy download command
- URLs pinned to exact versions (en_core_web_md-3.7.1, it_core_news_md-3.7.0)
- Fixes HTTP 404 errors on GitHub Actions
- Matches working implementation from setup_env.py for consistency across all environments
* optimization(ci): add spacy models to requirements.txt for pip caching
- Add spacy language models (en_core_web_md-3.7.1, it_core_news_md-3.7.0) to requirements.txt
- Models now installed via 'pip install -r requirements.txt' instead of separate step
- GitHub Actions pip cache now includes spacy models (~100+ MB)
- Subsequent CI runs will be much faster (cache hit on pip install)
- Simplifies workflow by removing dedicated 'Download AI Models' step
- Maintains exact version pinning for reproducibility
* docs: add core documentation (README, CONTRIBUTING, ARCHITECTURE)
- Redesigned README.md in English with EMLyzer style guide
- Added CONTRIBUTING.md with contributor guidelines, code standards, and PR workflow
- Added ARCHITECTURE.md with system design, components, and threading model
All documentation follows GitHub-optimized format with emoji, alerts, and tables.
* docs: add user and developer guides
- Added USER_GUIDE.md with 6-step tutorial, FAQ, and logging setup
- Added TROUBLESHOOTING.md with 10+ common issues and OS-specific solutions
- Added DEVELOPMENT.md with setup guide, code standards, and testing instructions
All guides include collapsible sections, tables with emoji, and EMLyzer style formatting.
* docs: add security, community, and GitHub templates
- Added SECURITY.md with privacy model, technical security details, and responsible disclosure
- Added CODE_OF_CONDUCT.md based on Contributor Covenant v2.1
- Added GitHub issue templates for bug reports and feature requests
- Added GitHub pull request template with testing and checklist
Includes automated template system for users submitting issues and PRs.
* ci: add dependabot configuration for automated dependency updates
- Configure Dependabot to scan pip dependencies weekly
- Auto-open PRs for security updates (max 5 per week)
- Configure Dependabot for GitHub Actions
- Use standardized commit message format (chore(deps), ci(deps))
- Reviewers and labels configured for dependency PRs
* docs: release v2.0.5 documentation suite and security configuration (#51)
* docs: add core documentation (README, CONTRIBUTING, ARCHITECTURE)
- Redesigned README.md in English with EMLyzer style guide
- Added CONTRIBUTING.md with contributor guidelines, code standards, and PR workflow
- Added ARCHITECTURE.md with system design, components, and threading model
All documentation follows GitHub-optimized format with emoji, alerts, and tables.
* docs: add user and developer guides
- Added USER_GUIDE.md with 6-step tutorial, FAQ, and logging setup
- Added TROUBLESHOOTING.md with 10+ common issues and OS-specific solutions
- Added DEVELOPMENT.md with setup guide, code standards, and testing instructions
All guides include collapsible sections, tables with emoji, and EMLyzer style formatting.
* docs: add security, community, and GitHub templates
- Added SECURITY.md with privacy model, technical security details, and responsible disclosure
- Added CODE_OF_CONDUCT.md based on Contributor Covenant v2.1
- Added GitHub issue templates for bug reports and feature requests
- Added GitHub pull request template with testing and checklist
Includes automated template system for users submitting issues and PRs.
* ci: add dependabot configuration for automated dependency updates
- Configure Dependabot to scan pip dependencies weekly
- Auto-open PRs for security updates (max 5 per week)
- Configure Dependabot for GitHub Actions
- Use standardized commit message format (chore(deps), ci(deps))
- Reviewers and labels configured for dependency PRs
* build(deps): bump pytest from 7.4.4 to 9.0.3 (#50)
Bumps [pytest](https://github.com/pytest-dev/pytest) from 7.4.4 to 9.0.3.
- [Release notes](https://github.com/pytest-dev/pytest/releases)
- [Changelog](https://github.com/pytest-dev/pytest/blob/main/CHANGELOG.rst)
- [Commits](pytest-dev/pytest@7.4.4...9.0.3)
---
updated-dependencies:
- dependency-name: pytest
dependency-version: 9.0.3
dependency-type: direct:production
...
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* chore(deps)(deps): bump presidio-analyzer from 2.2.354 to 2.2.359 (#60)
Bumps [presidio-analyzer](https://github.com/Microsoft/presidio) from 2.2.354 to 2.2.359.
- [Release notes](https://github.com/Microsoft/presidio/releases)
- [Changelog](https://github.com/microsoft/presidio/blob/main/CHANGELOG.md)
- [Commits](microsoft/presidio@2.2.354...2.2.359)
---
updated-dependencies:
- dependency-name: presidio-analyzer
dependency-version: 2.2.359
dependency-type: direct:production
update-type: version-update:semver-patch
...
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* ci(deps)(deps): bump actions/upload-artifact from 4 to 7 (#52)
Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 4 to 7.
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](actions/upload-artifact@v4...v7)
---
updated-dependencies:
- dependency-name: actions/upload-artifact
dependency-version: '7'
dependency-type: direct:production
update-type: version-update:semver-major
...
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* ci(deps)(deps): bump actions/checkout from 4 to 6 (#53)
Bumps [actions/checkout](https://github.com/actions/checkout) from 4 to 6.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](actions/checkout@v4...v6)
---
updated-dependencies:
- dependency-name: actions/checkout
dependency-version: '6'
dependency-type: direct:production
update-type: version-update:semver-major
...
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* ci(deps)(deps): bump actions/setup-python from 5 to 6 (#54)
Bumps [actions/setup-python](https://github.com/actions/setup-python) from 5 to 6.
- [Release notes](https://github.com/actions/setup-python/releases)
- [Commits](actions/setup-python@v5...v6)
---
updated-dependencies:
- dependency-name: actions/setup-python
dependency-version: '6'
dependency-type: direct:production
update-type: version-update:semver-major
...
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* ci(deps)(deps): bump actions/download-artifact from 4 to 8 (#55)
Bumps [actions/download-artifact](https://github.com/actions/download-artifact) from 4 to 8.
- [Release notes](https://github.com/actions/download-artifact/releases)
- [Commits](actions/download-artifact@v4...v8)
---
updated-dependencies:
- dependency-name: actions/download-artifact
dependency-version: '8'
dependency-type: direct:production
update-type: version-update:semver-major
...
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* ci(deps)(deps): bump softprops/action-gh-release from 2 to 3 (#56)
Bumps [softprops/action-gh-release](https://github.com/softprops/action-gh-release) from 2 to 3.
- [Release notes](https://github.com/softprops/action-gh-release/releases)
- [Changelog](https://github.com/softprops/action-gh-release/blob/master/CHANGELOG.md)
- [Commits](softprops/action-gh-release@v2...v3)
---
updated-dependencies:
- dependency-name: softprops/action-gh-release
dependency-version: '3'
dependency-type: direct:production
update-type: version-update:semver-major
...
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* chore(deps)(deps): bump pymupdf from 1.24.8 to 1.27.2.3 (#57)
Bumps [pymupdf](https://github.com/pymupdf/pymupdf) from 1.24.8 to 1.27.2.3.
- [Release notes](https://github.com/pymupdf/pymupdf/releases)
- [Changelog](https://github.com/pymupdf/PyMuPDF/blob/main/changes.txt)
- [Commits](pymupdf/PyMuPDF@1.24.8...1.27.2.3)
---
updated-dependencies:
- dependency-name: pymupdf
dependency-version: 1.27.2.3
dependency-type: direct:production
update-type: version-update:semver-minor
...
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* chore(deps)(deps): bump pyinstaller from 6.10.0 to 6.20.0 (#59)
Bumps [pyinstaller](https://github.com/pyinstaller/pyinstaller) from 6.10.0 to 6.20.0.
- [Release notes](https://github.com/pyinstaller/pyinstaller/releases)
- [Changelog](https://github.com/pyinstaller/pyinstaller/blob/develop/doc/CHANGES.rst)
- [Commits](pyinstaller/pyinstaller@v6.10.0...v6.20.0)
---
updated-dependencies:
- dependency-name: pyinstaller
dependency-version: 6.20.0
dependency-type: direct:production
update-type: version-update:semver-minor
...
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* chore(deps)(deps): bump mypy from 1.8.0 to 1.20.2 (#58)
Bumps [mypy](https://github.com/python/mypy) from 1.8.0 to 1.20.2.
- [Changelog](https://github.com/python/mypy/blob/master/CHANGELOG.md)
- [Commits](python/mypy@v1.8.0...v1.20.2)
---
updated-dependencies:
- dependency-name: mypy
dependency-version: 1.20.2
dependency-type: direct:production
update-type: version-update:semver-minor
...
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* chore(deps)(deps): bump spacy from 3.7.2 to 3.8.14 (#61)
* chore(deps)(deps): bump spacy from 3.7.2 to 3.8.14
Bumps [spacy](https://github.com/explosion/spaCy) from 3.7.2 to 3.8.14.
- [Release notes](https://github.com/explosion/spaCy/releases)
- [Commits](explosion/spaCy@v3.7.2...release-v3.8.14)
---
updated-dependencies:
- dependency-name: spacy
dependency-version: 3.8.14
dependency-type: direct:production
update-type: version-update:semver-minor
...
Signed-off-by: dependabot[bot] <support@github.com>
* chore(deps)(deps): bump spacy from 3.7.2 to 3.8.14
Bumps [spacy](https://github.com/explosion/spaCy) from 3.7.2 to 3.8.14.
- [Release notes](https://github.com/explosion/spaCy/releases)
- [Commits](explosion/spaCy@v3.7.2...release-v3.8.14)
---
updated-dependencies:
- dependency-name: spacy
dependency-version: 3.8.14
dependency-type: direct:production
update-type: version-update:semver-minor
...
Signed-off-by: dependabot[bot] <support@github.com>
---------
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: 0verwrite <31691645+overwrite00@users.noreply.github.com>
* security(workflows): add explicit permissions to GitHub Actions workflows (#62)
- test_build.yml: read contents, read actions (testing only)
- release.yml: write contents, read actions (for creating releases)
Fixes CodeQL alerts about missing workflow permissions.
Follows GitHub security best practices: explicit permissions limit
GITHUB_TOKEN scope to what's necessary for each workflow.
* ci: add auto-approve workflow for maintainer pull requests
- Automatically approves PRs created by the maintainer (overwrite00)
- Removes need for repository admin bypass in ruleset
- Maintains security while enabling smooth workflow
- Approval is traceable and can be disabled if needed
* ci: remove non-functional auto-approve workflow
GitHub Actions cannot approve pull requests due to platform limitations.
The bypass admin in ruleset is the appropriate solution for solo maintainers.
Revert PR #63.
* fix: remove unsupported reviewers property from dependabot.yml
The 'reviewers' property is not supported in Dependabot v2.0.
Removed to fix schema validation warnings in VS Code.
* Revert "fix: remove unsupported reviewers property from dependabot.yml"
This reverts commit 0fdad6b.
* fix: remove unsupported reviewers property from dependabot.yml
The 'reviewers' property is not supported in Dependabot v2.0.
Removed to fix schema validation warnings in VS Code.
This aligns with Dependabot v2 supported properties:
- schedule, labels, commit-message, allow, ignore
- open-pull-requests-limit, etc.
But NOT: reviewers (use assignees instead if needed)
* docs: simplify security support section in SECURITY.md
Removed redundant version support table. Only the latest version
receives security updates, so listing old versions was unnecessary.
Replaced with concise statement that clearly communicates the policy.
* docs: simplify security support section in SECURITY.md (#65)
Removed redundant version support table. Only the latest version
receives security updates, so listing old versions was unnecessary.
Replaced with concise statement that clearly communicates the policy.
* ci: optimize test_build workflow triggers
Remove redundant 'push' trigger that caused duplicate test runs.
Tests now run only on pull_request events to avoid waste.
- Before: Tests ran on both push AND pull_request (duplicate)
- After: Tests run only on pull_request to main
- Manual trigger (workflow_dispatch) still available
Reduces CI/CD noise and resources while maintaining coverage.
* ci: optimize test_build workflow triggers (#66)
* docs: simplify security support section in SECURITY.md
Removed redundant version support table. Only the latest version
receives security updates, so listing old versions was unnecessary.
Replaced with concise statement that clearly communicates the policy.
* ci: optimize test_build workflow triggers
Remove redundant 'push' trigger that caused duplicate test runs.
Tests now run only on pull_request events to avoid waste.
- Before: Tests ran on both push AND pull_request (duplicate)
- After: Tests run only on pull_request to main
- Manual trigger (workflow_dispatch) still available
Reduces CI/CD noise and resources while maintaining coverage.
* ci: configure dependabot to target develop branch
* Add files via upload
* ci: standardize automation with universal schema
- Update dependabot.yml to use universal label schema (lang:python, type:ci, scope:*)
- Update project-automation.yml with centralized PROJECT_ID and GH_PROJECT_TOKEN
- Centralize automation configuration for all repositories
* ci: add reopened trigger to issues workflow
- Include 'reopened' event type for issues (consistent with PR behavior)
- Allows automation to trigger when issues are reopened
* fix: correct bash syntax in project-automation workflow
The workflow had a critical syntax error: attempting to use a GitHub Actions context variable directly as a bash conditional. Fixed by storing the variable value first, then comparing it as a string.
Error was: if ${{ github.event.pull_request.merged }}; then
Fixed to: PR_MERGED="${{ github.event.pull_request.merged }}" && if [ "$PR_MERGED" = "true" ]; then
This syntax error prevented the workflow from running entirely.
* fix: remove emoji from workflow for YAML compatibility
* feat: add automatic reviewer request to workflow
- Request @overwrite00 as reviewer on opened/reopened PRs
- Works alongside automatic assignment to streamline PR review process
---------
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
overwrite00
added a commit
that referenced
this pull request
Jun 13, 2026
* Create LICENSE
* Delete LICENSE
* Add MIT License to the project
* Aggiunto README.md e immagine cover del progetto
* Aggiornato README.md
* Docs: move changelog to a dedicated file following Keep a Changelog standard
* Ver. 1.2.5 - Fix link mailto: negli indirizzi email censurati
* Aggiornato numero di versione badge
* Aggiunta icona applicazione e script per build automatico per le release
* Fix: stable cross-platform build and versioning
* Fix: UnicodeDecodeError on Windows build (forced utf-8 encoding)
* Fix: generazione dinamica .ico per Windows e aggiornamento asset icona
* Fix: rimozione finta trasparenza dall'icona
* Fix: vera trasparenza assoluta per l'icona
* Fix: applicata icona personalizzata anche alla finestra About
* Feat: integrazione AI locale (Presidio/spaCy), dizionari custom, censura differita e fix icone child windows
* Fix CI: aggiunta pyinstaller mancante nelle dipendenze
* Fix: Corretto numero di versione nel codice
* Fix CI: aggiornato script per estrarre correttamente la versione 1.3.0
* Fix CI: forzato encoding UTF-8 per estrazione versione
* Fix CI: packaging Linux con variabile versione e modelli md
* CI: aggiunto ignore per i file di documentazione per evitare build inutili
* CI: aggiunto ignore per i file di documentazione per evitare build inutili
* Docs: completato restyling grafico con emoji per tutte le sezioni
* Docs: completato restyling grafico con emoji per tutte le sezioni
* Corretto link linkedin
* Corretto badge Linkedin
* Aggiornato CHANGELOG.md
* Fix CI: Corretto script per la generazione dei vai pacchetti
* Corretto testo e formattazione e link repo in README.md
* ci: fix definitivo icone linux e stabilità build rpm
- Aggiunta generazione file .desktop e icone pixmaps per integrazione menu GNOME.
- Risolto conflitto Build-ID negli RPM tramite macro personalizzata.
- Ottimizzata ridenominazione dinamica pacchetti RPM.
- Verificato supporto icone cross-platform.
* ci: disabilitato fail-fast e aggiunti controlli robustezza per build linux
* fix(ci): corretta opzione alien per la creazione dell'RPM
- Sostituito --rpm-set-permissions con --fixperms (come da log di errore).
- Mantenuta la stabilità della build cross-platform.
* fix: risolto bug visualizzazione PDF su Linux e icone About
- Aggiunto hidden-import PIL._tkinter_finder nel workflow per Linux.
- Aggiornata funzione resource_path per compatibilità cross-platform.
- Fix finestra About: aggiunti crediti, licenza MIT e icona scudo reale.
- Sostituita opzione alien con --fixperms per stabilità RPM.
* fix: ripristino funzioni integrali e fix visualizzazione PDF su Linux
- Reinserita logica AI, dizionari e binding del canvas.
- Aggiornata finestra About con icona reale e crediti sviluppatore.
- Aggiunto hidden-import PIL._tkinter_finder per risolvere il crash su Fedora.
- Sostituito comando alien con --fixperms per pacchetti RPM stabili.
* Fix grafica
* chore: aggiornato setup_env.py con dipendenze AI
- Aggiunti presidio-analyzer e spacy.
- Aggiunto download automatico dei modelli linguistici (en_core_web_md, it_core_news_md).
* fix: risolto crash della GUI e aggiornato setup_env.py" -m "- Corretto TclError sostituendo i CTkButton errati con CTkFrame nei contenitori del layout.
- Aggiunte dipendenze AI (Presidio, spaCy e download modelli) allo script di configurazione."
* fix(gui): risolti bug su rendering finestre e interazione canvas su Linux" -m "- Ripristinata l'immagine dell'icona e ripulito il testo nella finestra About.
- Fix scroll del mouse nel Canvas aggiungendo i bind specifici per Linux (<Button-4>, <Button-5>) e gestione sicura del delta.
- Risolto bug di rendering finestra Dictionary vuota spostando il grab_set() post-popolamento UI.
* Aggiornato .gitignore
* Aggiunto PyInstaller come dipendenza
* Aggiunta sezione sviluppo in locale sui sistemi Linux per installare a livello di sistema tkinter
* docs: aggiunti i prerequisiti di sistema (tkinter) per lo sviluppo locale su Linux
* docs: aggiunti i prerequisiti di sistema (tkinter) per lo sviluppo locale su Linux
* - Creato script build_local per lacreazione in locale dei pacchetti in base all'OS
- Aggiornato .gitignore
* Update: Corretto formattazione del testo e titoli
Added: Sezione per gli script di automazione (creazione venv e compilazione in locale)
* Sistemato link repositori per il comando git clone
* Rilascio versione 1.4.0
* fix/perf: centratura popup, crash export e ottimizzazione AI
- Ripristinata la centratura geometrica (X, Y) per le finestre About e Dizionario.
- Corretto crash irreversibile durante l'esportazione di PDF contenenti AcroForms.
- Risolto lo skipping delle annotazioni nel comando 'Clear Page' (iterazione sicura).
- Aggiunta protezione contro eccezioni sul drag del mouse a canvas vuoto.
- [PERFORMANCE] Estrazione e pre-compilazione delle Regex AI: tempo di scansione abbattuto del 70%.
- Riformattato e scompattato il codice della GUI per una migliore manutenibilità futura.
* build(scripts): riscrittura multipiattaforma per Windows e macOS nativo
- [WINDOWS] Risolto il blocco di 'RecursionError' causato da SpaCy iniettando 'sys.setrecursionlimit' in un file .spec dinamico.
- [WINDOWS/MAC] Aggiunta conversione automatica dell'icona da PNG a ICO (Windows) e ICNS (macOS) tramite Pillow.
- [MAC] Implementata l'istruzione BUNDLE per pacchettizzare la build in un'applicazione .app nativa invece di un binario UNIX nudo.
- [CORE] Abbandonato il parsing massivo via riga di comando in favore di un .spec strutturato che gestisce correttamente gli hidden imports (customtkinter, spacy, presidio).
- Aggiornata la logica di rinomina e spostamento dei file per supportare sia eseguibili singoli che directory di bundle.
* docs: aggiornato readme con limiti forensi e redatto changelog v1.5.4
* fix(core): risolto blocco e morte silenziosa del thread AI al primo avvio
- Aggiunti comandi 'self.update()' per forzare l'aggiornamento grafico della GUI prima che il processore venga saturato dal caricamento dei modelli linguistici.
- Implementato un Mutex Lock ('self.is_processing') per prevenire l'accavallamento dei comandi se l'utente clicca più volte per impazienza.
- Avvolta l'intera logica di scansione in un robusto blocco try-except. Qualsiasi eccezione nascosta di SpaCy o Presidio verrà ora mostrata in tempo reale nel box dei log, impedendo la 'morte silenziosa' dell'evento Tkinter.
- Sostituita ultima regex inversa complessa con operatore nativo Python 'in' per ulteriore spinta prestazionale.
* docs: aggiunta guida utente passo-passo localizzata
- Creato file GUIDA_UTENTE.md con tutorial operativo per utenti non esperti. - Inseriti link rapidi nel README per facilitare l'onboarding.
* Update README.md
* fix(linux/core): supporto GNOME nativo, fix scroll e correzione critica regex
- [LINUX] Implementato wrapper per intercettare 'zenity' e 'kdialog' garantendo finestre di selezione file native moderne.
- [LINUX] Ripristinati gli eventi fisici <Button-4> e <Button-5> per garantire il funzionamento dello scroll mouse su server X11/Wayland.
- [GUI] Rimosse le emoji testuali dai bottoni per risolvere i problemi di font fallback su sistemi minimali.
- [CORE] Fixato un grave bug logico nella whitelist che avrebbe protetto sottostringhe parziali usando l'operatore 'in'. Ripristinata e ottimizzata la valutazione tramite Regex boundary (\b).
* fix(core/linux): risolto bug loop annulla e ripristinato controllo crittografico
- [LINUX] Sistemato bug nel wrapper dei file dialog nativi che apriva la vecchia finestra Tkinter se l'utente cliccava su 'Annulla' in Zenity/Kdialog.
- [CORE] Ripristinato il blocco vitale 'if temp_doc.needs_pass:' durante il caricamento del file (inavvertitamente rimosso nelle versioni precedenti) per prevenire crash totali del motore AI su documenti protetti da password.
* fix(linux): corretto crash Zenity su Fedora e decodifica URI per Drag&Drop
- [LINUX] Aggiornata la sintassi dell'argomento --file-filter in Zenity e ottimizzato il gestore dei codici di ritorno per garantire un fallback infallibile verso Tkinter.
- [LINUX] Implementato parser di decodifica URI (urllib.parse) per ripulire il prefisso 'file://' e gli spazi '%20'. Ora il Drag and Drop del file sull'icona dell'eseguibile o tramite Desktop Entry funziona correttamente su GNOME/Wayland.
* fix(linux): rimossi i filtri in Zenity e gestito Drag&Drop nativo
- Eliminato il parametro --file-filter dalle chiamate a Zenity per prevenire il crash (exit code 1) sui sistemi Fedora/GNOME. Ora si appoggia a un controllo formato sicuro interno al tool.
- Aggiunta la decodifica dell'URI (file:// e spazi %20) nella funzione di avvio per permettere il caricamento via Drag & Drop sull'icona o apertura tramite terminale Linux.
* refactor: migrazione Enterprise a PySide6 e architettura Multithread (v2.0.4)
- [ARCHITETTURA] Sostituito integralmente lo stack grafico da CustomTkinter a PySide6 (Qt6). Questo garantisce un supporto nativo assoluto per i File Dialogs e il Drag & Drop su Linux (Wayland/GNOME), Windows e macOS.
- [CORE/THREADING] Isolato il motore AI (Presidio e spaCy) in un 'AIWorker' su QThread dedicato. La GUI ora gode di totale fluidità.
- [SICUREZZA THREAD] Sostituiti i vecchi workaround di aggiornamento con il sistema nativo Qt 'Signals & Slots', prevenendo crash di tipizzazione C++ nel passaggio delle Espressioni Regolari. Chiusura sicura del thread agganciata all'evento di uscita.
- [UX/UI] Rendering PDF accelerato via hardware tramite 'QGraphicsView'. Introdotto foglio di stile (QSS) personalizzato a tema 'Cybersecurity' e log di sistema formattati semanticamente (colori HTML in base a errori, avvisi e successi).
- [DEVOPS] Aggiornati gli script 'setup_env.py' e 'build_local.py' per gestire la transizione del framework rimuovendo customtkinter e ottimizzando il pacchetto Qt6 per PyInstaller.
- [FIX] Reintegrata finestra Info customizzata con logo, risolti artefatti grafici sugli input e allineata la naming convention in ottica white-label.
* docs: aggiornata documentazione per la versione 2.0.4 (Qt6)
- Aggiornati requisiti tecnici (PySide6). - Descritta la nuova architettura multithread nella guida utente. - Inserite istruzioni per il Drag & Drop nativo e i nuovi log colorati.
* chore(build): ottimizzazione PyInstaller per GitHub Actions e fix build-id
- Ottimizzato 'build_local.py' per disabilitare lo strip dei binari (strip=False), prevenendo errori di corruzione legati ai GNU build-id su sistemi Linux CI/CD.
- Perfezionata la gestione delle icone nel PyInstaller .spec: ora garantisce la corretta iniezione dell'icona .ico (Windows) e del BUNDLE .icns (macOS).
- Aggiornato workflow 'build.yml' rimuovendo librerie obsolete e installando binutils e libxcb richiesti da Qt6 su ambiente Ubuntu 22.04 headless.
- Aggiornato 'setup_env.py' per riflettere lo stack pulito delle dipendenze.
* chore(deps): rimossa libreria pillow e generate icone pre-compilate
- Ottimizzata la gestione delle icone: rimosso l'engine di conversione in runtime (PIL) da build_local.py in favore di icone native pre-esistenti.
- Rimossa la dipendenza 'pillow' dagli script setup_env.py e dal workflow GitHub Actions, snellendo la footprint del progetto.
* Aggiornato README.md - Rimosso riga Pillow dalla sezione Tecnologie utilizzate
* refactor(build): allineamento nomi build e automazione release.yml
- Ripristinata la logica di naming 'NullifyPDF_v{version}_{os_name}{ext}' inclusa la dicitura Linux_Portable.
- Implementato workflow release.yml per la pubblicazione automatica degli asset su GitHub.
- Rimossa definitivamente la dipendenza pillow da tutta la catena di build e configurazione.
* fix(macos): trasformato binario in App Bundle installabile (ZIP)
- Ripristinata la logica BUNDLE in PyInstaller per generare un pacchetto .app su macOS.
- Aggiunta compressione automatica ZIP per distribuire il bundle mantenendo icone e permessi.
- Sincronizzati i nomi degli artefatti nel workflow GitHub Actions per caricare .zip, .exe, .deb e .rpm.
* release: v2.0.5 completa e stabile (macOS ZIP, pacchetti DEB/RPM con trigger, no-Pillow)
- [Core] Silenziati i log qt.qpa.wayland e agganciato setDesktopFileName per risolvere bug launcher su Fedora/GNOME.
- [Build] Riscritta completamente la logica dei pacchetti RPM e DEB per eseguire gli update-desktop-database in %post/postinst.
- [macOS] Impacchettamento garantito tramite file ZIP del BUNDLE (.app) mantenendo permessi e firma.
- [Deps] Pillow rimossa da tutti gli script Python e GitHub Actions in favore di asset statici pre-generati (.ico e .icns).
- [CI/CD] Workflow unificato in release.yml configurato per raccogliere solo i 4 formati esatti specificati.
* chore: architettura a Singola Fonte di Verità con requirements.txt
- Introdotto file requirements.txt centralizzato per la gestione dei pacchetti.
- Aggiornato setup_env.py per installare le dipendenze dinamicamente leggendo il txt.
- Ottimizzati i workflow GitHub Actions: reinserita la direttiva 'cache: pip' che ora funziona grazie al requirements.txt, riducendo drasticamente i tempi di build.
- Le azioni GitHub ora richiamano pip install -r requirements.txt evitando duplicazioni di codice.
* chore(build): ottimizzazione cache pip, fix macOS e requirements centralizzati
- Centralizzate le dipendenze in requirements.txt (Single Source of Truth).
- Ripristinata la cache pip nei workflow GitHub Actions per velocizzare le build.
- Creato workflow 'test_build.yml' per la validazione delle PR verso main.
- Fix macOS in 'build_local.py': risolto errore path ZIP e implementata modalità ONEDIR sicura per Apple Gatekeeper.
* fix(build): risolto crash UnicodeEncodeError su Windows
- Sostituiti i caratteri speciali (come la spunta Unicode) con testo ASCII standard ([OK], [ERROR]) per prevenire crash del terminale cp1252 durante l'esecuzione su runner Windows in GitHub Actions.
* Update copyright
* refactor(P0): Critical bug fixes - bare except, input validation, logging
CRITICAL FIXES:
- Remove bare except clauses: jump_page(), cmd_export() [2x]
Replace with specific exception types: ValueError, RuntimeError, AttributeError
- Add input validation to load_path(): check path exists, type, PDF extension
- Add input validation to jump_page(): check doc loaded before use, bounds
- Fix p.annots() crash: use (p.annots() or []) to handle None return
Locations: user_click_pt(), cmd_clear(), apply_ai_to_page()
LOGGING INFRASTRUCTURE:
- Add file-based logging with rotation (~/.nullifypdf/logs/nullifypdf.log)
- Setup logging module with UTF-8 encoding (fixes Windows UnicodeEncodeError)
- Add logger to NullifyPDF class and use in error handlers
- Log tracebacks on exceptions for debugging
CODE QUALITY:
- Add docstrings to PDF_Checker.py and build_local.py
- Add validation for PDF_Checker.inspect_pdf(): file_path, target_word, extension
- Improve error messages with helpful context (page ranges, file types)
- Replace generic except with specific exception types
BACKWARD COMPATIBLE: All changes are non-breaking
* refactor(P1): Add type hints and docstrings to all modules
TYPE HINTS:
- Add typing module imports: Optional, List, Set, Dict, Any, Tuple
- Add function/method type hints (parameters + return types):
* NullifyPDF.py: 26+ methods/functions
* PDF_Checker.py: inspect_pdf()
* build_local.py: All 5 build functions
* setup_env.py: setup_environment()
- Type hints cover: logging.Logger, str, Set, None, QRectF, QPointF, etc.
DOCSTRINGS (Google Style):
- Add module-level docstrings to all files
- Add class docstrings: AIWorker, PDFView, NullifyPDF
- Add method docstrings with Args/Returns/Example sections
- 100+ docstring additions across codebase
CODE QUALITY:
- Improve IDE autocomplete with type hints
- Enable static type checking with mypy (future)
- Self-documenting code through typing
BACKWARD COMPATIBLE: All changes are non-breaking
* refactor(P2): Refactoring and code quality improvements
REMOVED LIST COMPREHENSION SIDE EFFECTS:
- Convert build_ui() radio button setup to for loop (lines 378-386)
- Convert user_click_pt() delete_annot to for loop (lines 527-528)
- Improve code readability and IDE warnings
EXTRACTED PDFListManager CLASS:
- New class manages blocklist/allowlist persistence
- Methods: load_blocklist(), load_allowlist(), save_blocklist(), save_allowlist()
- Encapsulate file I/O logic away from main window class
- Improve testability and separation of concerns
- Reduce NullifyPDF class size (~30 lines removed from methods)
AIWorker INPUT VALIDATION:
- Add validation for pages_text parameter (non-empty list)
- Add validation for choice parameter ('EN', 'IT', 'BOTH')
- Add validation for compiled_allowlist parameter (list type)
- Emit error signals and finish gracefully on validation failure
- Prevent crashes from invalid AI scan parameters
DEPENDENCY VERSION PINNING:
- Specify exact versions for all dependencies:
* PySide6==6.7.0
* PyMuPDF==1.24.1
* presidio-analyzer==2.2.354
* spacy==3.7.2
* pyinstaller==6.3.0
- Enable deterministic builds across machines
- Add category comments for dependency organization
BACKWARD COMPATIBLE: All changes maintain existing API and behavior
* refactor(P3): Polish and testing infrastructure
DEBUG MODE:
- Add NULLIFYPDF_DEBUG environment variable support
- Set logging level to DEBUG when NULLIFYPDF_DEBUG=true
- Enables verbose troubleshooting without code changes
SETUP_ENV.PY LOGGING:
- Replace all print() calls with logging module
- Use structured logging with standard format
- Proper error handling with logger.error/warning
- Cross-platform friendly output
SMOKE TESTS:
- Create tests/test_validation.py with 9 test cases
- Test PDFListManager save/load round-trip
- Test word normalization (lowercase, min length)
- Test config directory creation
- Test resource_path returns string
- Test error handling with invalid inputs
- Pytest compatible with parametrized tests
BACKWARD COMPATIBLE: All changes maintain existing functionality
* fix(dependencies): Update package versions for Python 3.13 compatibility
- PySide6: 6.7.0 → 6.11.1 (6.7.0 does not support Python 3.13)
- PyMuPDF: 1.24.1 → 1.24.9
- pyinstaller: 6.3.0 → 6.10.0 (6.3.0 does not support Python 3.13)
- presidio-analyzer: 2.2.354 (unchanged)
- spacy: 3.7.2 (unchanged)
Fixes pip install error with Python 3.13
* fix(setup): Improve venv removal robustness with retry logic
- Add 3-attempt retry loop for removing old .venv directory
- Add 0.5s delay between retry attempts
- Better error handling and logging
- Proceed with venv creation even if removal incomplete
- Handle Windows file locking issues more gracefully
* docs: update documentation for v2.0.5 release
- Add CHANGELOG v2.0.5 with all bug fixes, performance optimizations, and code quality improvements
- Expand GUIDA_UTENTE.md with troubleshooting, debug mode, logging guide, and best practices
- Update README.md with v2.0.5 features (thread-safety, fast-path, disk-backed export, logging)
- Add pytest and mypy to requirements.txt as development dependencies
- Update GitHub Actions workflows to Python 3.12 and include smoke tests and type checking
* docs: remove obsolete tkinter instructions from README
NullifyPDF uses PySide6 (Qt6), not tkinter/customtkinter. Removed misleading and outdated Linux installation notes that referenced a GUI framework no longer used by the project.
* fix: implement all code review fixes for v2.0.5
Critical fixes:
- C2: Handle None from page.annots() on export
- C4: Remove unsafe spaCy vocab mutation
- H1: Add context manager for file handle leak
- H2: Guard against division by zero in progress bar
- H3: Copy QImage buffer to prevent segfault
- H7: Defer self.close() via QTimer for signal handler safety
- H8: Use repr() for safe path quoting in PyInstaller spec
- H9: Add check=True to pip upgrade subprocess
Performance optimizations:
- C1: Disk-backed memory-efficient PDF export (2x to 1x RAM)
- H6: Pre-compile regex patterns outside loops
- M3: Add O(1) fast-path for allowlist exact-match
- M4: Move get_text() extraction to worker thread with QMutex
Code quality:
- 100% type hints coverage across all modules
- Google-style docstrings for public methods
- File-based logging with rotation and debug mode
- Input validation for path, range, language selection
- Thread-safe document access with QMutex serialization
* fix(ci): replace spacy download with direct pip install from GitHub releases
- Use direct GitHub release URLs for spacy models instead of fragile spacy download command
- URLs pinned to exact versions (en_core_web_md-3.7.1, it_core_news_md-3.7.0)
- Fixes HTTP 404 errors on GitHub Actions
- Matches working implementation from setup_env.py for consistency across all environments
* optimization(ci): add spacy models to requirements.txt for pip caching
- Add spacy language models (en_core_web_md-3.7.1, it_core_news_md-3.7.0) to requirements.txt
- Models now installed via 'pip install -r requirements.txt' instead of separate step
- GitHub Actions pip cache now includes spacy models (~100+ MB)
- Subsequent CI runs will be much faster (cache hit on pip install)
- Simplifies workflow by removing dedicated 'Download AI Models' step
- Maintains exact version pinning for reproducibility
* docs: add core documentation (README, CONTRIBUTING, ARCHITECTURE)
- Redesigned README.md in English with EMLyzer style guide
- Added CONTRIBUTING.md with contributor guidelines, code standards, and PR workflow
- Added ARCHITECTURE.md with system design, components, and threading model
All documentation follows GitHub-optimized format with emoji, alerts, and tables.
* docs: add user and developer guides
- Added USER_GUIDE.md with 6-step tutorial, FAQ, and logging setup
- Added TROUBLESHOOTING.md with 10+ common issues and OS-specific solutions
- Added DEVELOPMENT.md with setup guide, code standards, and testing instructions
All guides include collapsible sections, tables with emoji, and EMLyzer style formatting.
* docs: add security, community, and GitHub templates
- Added SECURITY.md with privacy model, technical security details, and responsible disclosure
- Added CODE_OF_CONDUCT.md based on Contributor Covenant v2.1
- Added GitHub issue templates for bug reports and feature requests
- Added GitHub pull request template with testing and checklist
Includes automated template system for users submitting issues and PRs.
* ci: add dependabot configuration for automated dependency updates
- Configure Dependabot to scan pip dependencies weekly
- Auto-open PRs for security updates (max 5 per week)
- Configure Dependabot for GitHub Actions
- Use standardized commit message format (chore(deps), ci(deps))
- Reviewers and labels configured for dependency PRs
* docs: release v2.0.5 documentation suite and security configuration (#51)
* docs: add core documentation (README, CONTRIBUTING, ARCHITECTURE)
- Redesigned README.md in English with EMLyzer style guide
- Added CONTRIBUTING.md with contributor guidelines, code standards, and PR workflow
- Added ARCHITECTURE.md with system design, components, and threading model
All documentation follows GitHub-optimized format with emoji, alerts, and tables.
* docs: add user and developer guides
- Added USER_GUIDE.md with 6-step tutorial, FAQ, and logging setup
- Added TROUBLESHOOTING.md with 10+ common issues and OS-specific solutions
- Added DEVELOPMENT.md with setup guide, code standards, and testing instructions
All guides include collapsible sections, tables with emoji, and EMLyzer style formatting.
* docs: add security, community, and GitHub templates
- Added SECURITY.md with privacy model, technical security details, and responsible disclosure
- Added CODE_OF_CONDUCT.md based on Contributor Covenant v2.1
- Added GitHub issue templates for bug reports and feature requests
- Added GitHub pull request template with testing and checklist
Includes automated template system for users submitting issues and PRs.
* ci: add dependabot configuration for automated dependency updates
- Configure Dependabot to scan pip dependencies weekly
- Auto-open PRs for security updates (max 5 per week)
- Configure Dependabot for GitHub Actions
- Use standardized commit message format (chore(deps), ci(deps))
- Reviewers and labels configured for dependency PRs
* build(deps): bump pytest from 7.4.4 to 9.0.3 (#50)
Bumps [pytest](https://github.com/pytest-dev/pytest) from 7.4.4 to 9.0.3.
- [Release notes](https://github.com/pytest-dev/pytest/releases)
- [Changelog](https://github.com/pytest-dev/pytest/blob/main/CHANGELOG.rst)
- [Commits](pytest-dev/pytest@7.4.4...9.0.3)
---
updated-dependencies:
- dependency-name: pytest
dependency-version: 9.0.3
dependency-type: direct:production
...
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* chore(deps)(deps): bump presidio-analyzer from 2.2.354 to 2.2.359 (#60)
Bumps [presidio-analyzer](https://github.com/Microsoft/presidio) from 2.2.354 to 2.2.359.
- [Release notes](https://github.com/Microsoft/presidio/releases)
- [Changelog](https://github.com/microsoft/presidio/blob/main/CHANGELOG.md)
- [Commits](microsoft/presidio@2.2.354...2.2.359)
---
updated-dependencies:
- dependency-name: presidio-analyzer
dependency-version: 2.2.359
dependency-type: direct:production
update-type: version-update:semver-patch
...
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* ci(deps)(deps): bump actions/upload-artifact from 4 to 7 (#52)
Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 4 to 7.
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](actions/upload-artifact@v4...v7)
---
updated-dependencies:
- dependency-name: actions/upload-artifact
dependency-version: '7'
dependency-type: direct:production
update-type: version-update:semver-major
...
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* ci(deps)(deps): bump actions/checkout from 4 to 6 (#53)
Bumps [actions/checkout](https://github.com/actions/checkout) from 4 to 6.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](actions/checkout@v4...v6)
---
updated-dependencies:
- dependency-name: actions/checkout
dependency-version: '6'
dependency-type: direct:production
update-type: version-update:semver-major
...
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* ci(deps)(deps): bump actions/setup-python from 5 to 6 (#54)
Bumps [actions/setup-python](https://github.com/actions/setup-python) from 5 to 6.
- [Release notes](https://github.com/actions/setup-python/releases)
- [Commits](actions/setup-python@v5...v6)
---
updated-dependencies:
- dependency-name: actions/setup-python
dependency-version: '6'
dependency-type: direct:production
update-type: version-update:semver-major
...
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* ci(deps)(deps): bump actions/download-artifact from 4 to 8 (#55)
Bumps [actions/download-artifact](https://github.com/actions/download-artifact) from 4 to 8.
- [Release notes](https://github.com/actions/download-artifact/releases)
- [Commits](actions/download-artifact@v4...v8)
---
updated-dependencies:
- dependency-name: actions/download-artifact
dependency-version: '8'
dependency-type: direct:production
update-type: version-update:semver-major
...
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* ci(deps)(deps): bump softprops/action-gh-release from 2 to 3 (#56)
Bumps [softprops/action-gh-release](https://github.com/softprops/action-gh-release) from 2 to 3.
- [Release notes](https://github.com/softprops/action-gh-release/releases)
- [Changelog](https://github.com/softprops/action-gh-release/blob/master/CHANGELOG.md)
- [Commits](softprops/action-gh-release@v2...v3)
---
updated-dependencies:
- dependency-name: softprops/action-gh-release
dependency-version: '3'
dependency-type: direct:production
update-type: version-update:semver-major
...
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* chore(deps)(deps): bump pymupdf from 1.24.8 to 1.27.2.3 (#57)
Bumps [pymupdf](https://github.com/pymupdf/pymupdf) from 1.24.8 to 1.27.2.3.
- [Release notes](https://github.com/pymupdf/pymupdf/releases)
- [Changelog](https://github.com/pymupdf/PyMuPDF/blob/main/changes.txt)
- [Commits](pymupdf/PyMuPDF@1.24.8...1.27.2.3)
---
updated-dependencies:
- dependency-name: pymupdf
dependency-version: 1.27.2.3
dependency-type: direct:production
update-type: version-update:semver-minor
...
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* chore(deps)(deps): bump pyinstaller from 6.10.0 to 6.20.0 (#59)
Bumps [pyinstaller](https://github.com/pyinstaller/pyinstaller) from 6.10.0 to 6.20.0.
- [Release notes](https://github.com/pyinstaller/pyinstaller/releases)
- [Changelog](https://github.com/pyinstaller/pyinstaller/blob/develop/doc/CHANGES.rst)
- [Commits](pyinstaller/pyinstaller@v6.10.0...v6.20.0)
---
updated-dependencies:
- dependency-name: pyinstaller
dependency-version: 6.20.0
dependency-type: direct:production
update-type: version-update:semver-minor
...
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* chore(deps)(deps): bump mypy from 1.8.0 to 1.20.2 (#58)
Bumps [mypy](https://github.com/python/mypy) from 1.8.0 to 1.20.2.
- [Changelog](https://github.com/python/mypy/blob/master/CHANGELOG.md)
- [Commits](python/mypy@v1.8.0...v1.20.2)
---
updated-dependencies:
- dependency-name: mypy
dependency-version: 1.20.2
dependency-type: direct:production
update-type: version-update:semver-minor
...
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* chore(deps)(deps): bump spacy from 3.7.2 to 3.8.14 (#61)
* chore(deps)(deps): bump spacy from 3.7.2 to 3.8.14
Bumps [spacy](https://github.com/explosion/spaCy) from 3.7.2 to 3.8.14.
- [Release notes](https://github.com/explosion/spaCy/releases)
- [Commits](explosion/spaCy@v3.7.2...release-v3.8.14)
---
updated-dependencies:
- dependency-name: spacy
dependency-version: 3.8.14
dependency-type: direct:production
update-type: version-update:semver-minor
...
Signed-off-by: dependabot[bot] <support@github.com>
* chore(deps)(deps): bump spacy from 3.7.2 to 3.8.14
Bumps [spacy](https://github.com/explosion/spaCy) from 3.7.2 to 3.8.14.
- [Release notes](https://github.com/explosion/spaCy/releases)
- [Commits](explosion/spaCy@v3.7.2...release-v3.8.14)
---
updated-dependencies:
- dependency-name: spacy
dependency-version: 3.8.14
dependency-type: direct:production
update-type: version-update:semver-minor
...
Signed-off-by: dependabot[bot] <support@github.com>
---------
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: 0verwrite <31691645+overwrite00@users.noreply.github.com>
* security(workflows): add explicit permissions to GitHub Actions workflows (#62)
- test_build.yml: read contents, read actions (testing only)
- release.yml: write contents, read actions (for creating releases)
Fixes CodeQL alerts about missing workflow permissions.
Follows GitHub security best practices: explicit permissions limit
GITHUB_TOKEN scope to what's necessary for each workflow.
* ci: add auto-approve workflow for maintainer pull requests
- Automatically approves PRs created by the maintainer (overwrite00)
- Removes need for repository admin bypass in ruleset
- Maintains security while enabling smooth workflow
- Approval is traceable and can be disabled if needed
* ci: remove non-functional auto-approve workflow
GitHub Actions cannot approve pull requests due to platform limitations.
The bypass admin in ruleset is the appropriate solution for solo maintainers.
Revert PR #63.
* fix: remove unsupported reviewers property from dependabot.yml
The 'reviewers' property is not supported in Dependabot v2.0.
Removed to fix schema validation warnings in VS Code.
* Revert "fix: remove unsupported reviewers property from dependabot.yml"
This reverts commit 0fdad6b.
* fix: remove unsupported reviewers property from dependabot.yml
The 'reviewers' property is not supported in Dependabot v2.0.
Removed to fix schema validation warnings in VS Code.
This aligns with Dependabot v2 supported properties:
- schedule, labels, commit-message, allow, ignore
- open-pull-requests-limit, etc.
But NOT: reviewers (use assignees instead if needed)
* docs: simplify security support section in SECURITY.md
Removed redundant version support table. Only the latest version
receives security updates, so listing old versions was unnecessary.
Replaced with concise statement that clearly communicates the policy.
* docs: simplify security support section in SECURITY.md (#65)
Removed redundant version support table. Only the latest version
receives security updates, so listing old versions was unnecessary.
Replaced with concise statement that clearly communicates the policy.
* ci: optimize test_build workflow triggers
Remove redundant 'push' trigger that caused duplicate test runs.
Tests now run only on pull_request events to avoid waste.
- Before: Tests ran on both push AND pull_request (duplicate)
- After: Tests run only on pull_request to main
- Manual trigger (workflow_dispatch) still available
Reduces CI/CD noise and resources while maintaining coverage.
* ci: optimize test_build workflow triggers (#66)
* docs: simplify security support section in SECURITY.md
Removed redundant version support table. Only the latest version
receives security updates, so listing old versions was unnecessary.
Replaced with concise statement that clearly communicates the policy.
* ci: optimize test_build workflow triggers
Remove redundant 'push' trigger that caused duplicate test runs.
Tests now run only on pull_request events to avoid waste.
- Before: Tests ran on both push AND pull_request (duplicate)
- After: Tests run only on pull_request to main
- Manual trigger (workflow_dispatch) still available
Reduces CI/CD noise and resources while maintaining coverage.
* ci: configure dependabot to target develop branch
* Add files via upload
* ci: standardize automation with universal schema
- Update dependabot.yml to use universal label schema (lang:python, type:ci, scope:*)
- Update project-automation.yml with centralized PROJECT_ID and GH_PROJECT_TOKEN
- Centralize automation configuration for all repositories
* ci: add reopened trigger to issues workflow
- Include 'reopened' event type for issues (consistent with PR behavior)
- Allows automation to trigger when issues are reopened
* fix: correct bash syntax in project-automation workflow
The workflow had a critical syntax error: attempting to use a GitHub Actions context variable directly as a bash conditional. Fixed by storing the variable value first, then comparing it as a string.
Error was: if ${{ github.event.pull_request.merged }}; then
Fixed to: PR_MERGED="${{ github.event.pull_request.merged }}" && if [ "$PR_MERGED" = "true" ]; then
This syntax error prevented the workflow from running entirely.
* fix: remove emoji from workflow for YAML compatibility
* feat: add automatic reviewer request to workflow
- Request @overwrite00 as reviewer on opened/reopened PRs
- Works alongside automatic assignment to streamline PR review process
* chore: optimize dependabot.yml configuration
- Remove redundant 'allow: dependency-type: all' block
- Add groups to consolidate updates (minor-and-patch + development-updates)
- Limit major version ignore to development dependencies only
- Keep GitHub Actions free of major-version ignore (CI/CD security-critical)
* fix: correct dependabot.yml groups schema
* fix: correct dependabot.yml ignore schema
---------
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
overwrite00
added a commit
that referenced
this pull request
Jun 14, 2026
* Fix CI: Corretto script per la generazione dei vai pacchetti
* Corretto testo e formattazione e link repo in README.md
* ci: fix definitivo icone linux e stabilità build rpm
- Aggiunta generazione file .desktop e icone pixmaps per integrazione menu GNOME.
- Risolto conflitto Build-ID negli RPM tramite macro personalizzata.
- Ottimizzata ridenominazione dinamica pacchetti RPM.
- Verificato supporto icone cross-platform.
* ci: disabilitato fail-fast e aggiunti controlli robustezza per build linux
* fix(ci): corretta opzione alien per la creazione dell'RPM
- Sostituito --rpm-set-permissions con --fixperms (come da log di errore).
- Mantenuta la stabilità della build cross-platform.
* fix: risolto bug visualizzazione PDF su Linux e icone About
- Aggiunto hidden-import PIL._tkinter_finder nel workflow per Linux.
- Aggiornata funzione resource_path per compatibilità cross-platform.
- Fix finestra About: aggiunti crediti, licenza MIT e icona scudo reale.
- Sostituita opzione alien con --fixperms per stabilità RPM.
* fix: ripristino funzioni integrali e fix visualizzazione PDF su Linux
- Reinserita logica AI, dizionari e binding del canvas.
- Aggiornata finestra About con icona reale e crediti sviluppatore.
- Aggiunto hidden-import PIL._tkinter_finder per risolvere il crash su Fedora.
- Sostituito comando alien con --fixperms per pacchetti RPM stabili.
* Fix grafica
* chore: aggiornato setup_env.py con dipendenze AI
- Aggiunti presidio-analyzer e spacy.
- Aggiunto download automatico dei modelli linguistici (en_core_web_md, it_core_news_md).
* fix: risolto crash della GUI e aggiornato setup_env.py" -m "- Corretto TclError sostituendo i CTkButton errati con CTkFrame nei contenitori del layout.
- Aggiunte dipendenze AI (Presidio, spaCy e download modelli) allo script di configurazione."
* fix(gui): risolti bug su rendering finestre e interazione canvas su Linux" -m "- Ripristinata l'immagine dell'icona e ripulito il testo nella finestra About.
- Fix scroll del mouse nel Canvas aggiungendo i bind specifici per Linux (<Button-4>, <Button-5>) e gestione sicura del delta.
- Risolto bug di rendering finestra Dictionary vuota spostando il grab_set() post-popolamento UI.
* Aggiornato .gitignore
* Aggiunto PyInstaller come dipendenza
* Aggiunta sezione sviluppo in locale sui sistemi Linux per installare a livello di sistema tkinter
* docs: aggiunti i prerequisiti di sistema (tkinter) per lo sviluppo locale su Linux
* docs: aggiunti i prerequisiti di sistema (tkinter) per lo sviluppo locale su Linux
* - Creato script build_local per lacreazione in locale dei pacchetti in base all'OS
- Aggiornato .gitignore
* Update: Corretto formattazione del testo e titoli
Added: Sezione per gli script di automazione (creazione venv e compilazione in locale)
* Sistemato link repositori per il comando git clone
* Rilascio versione 1.4.0
* fix/perf: centratura popup, crash export e ottimizzazione AI
- Ripristinata la centratura geometrica (X, Y) per le finestre About e Dizionario.
- Corretto crash irreversibile durante l'esportazione di PDF contenenti AcroForms.
- Risolto lo skipping delle annotazioni nel comando 'Clear Page' (iterazione sicura).
- Aggiunta protezione contro eccezioni sul drag del mouse a canvas vuoto.
- [PERFORMANCE] Estrazione e pre-compilazione delle Regex AI: tempo di scansione abbattuto del 70%.
- Riformattato e scompattato il codice della GUI per una migliore manutenibilità futura.
* build(scripts): riscrittura multipiattaforma per Windows e macOS nativo
- [WINDOWS] Risolto il blocco di 'RecursionError' causato da SpaCy iniettando 'sys.setrecursionlimit' in un file .spec dinamico.
- [WINDOWS/MAC] Aggiunta conversione automatica dell'icona da PNG a ICO (Windows) e ICNS (macOS) tramite Pillow.
- [MAC] Implementata l'istruzione BUNDLE per pacchettizzare la build in un'applicazione .app nativa invece di un binario UNIX nudo.
- [CORE] Abbandonato il parsing massivo via riga di comando in favore di un .spec strutturato che gestisce correttamente gli hidden imports (customtkinter, spacy, presidio).
- Aggiornata la logica di rinomina e spostamento dei file per supportare sia eseguibili singoli che directory di bundle.
* docs: aggiornato readme con limiti forensi e redatto changelog v1.5.4
* fix(core): risolto blocco e morte silenziosa del thread AI al primo avvio
- Aggiunti comandi 'self.update()' per forzare l'aggiornamento grafico della GUI prima che il processore venga saturato dal caricamento dei modelli linguistici.
- Implementato un Mutex Lock ('self.is_processing') per prevenire l'accavallamento dei comandi se l'utente clicca più volte per impazienza.
- Avvolta l'intera logica di scansione in un robusto blocco try-except. Qualsiasi eccezione nascosta di SpaCy o Presidio verrà ora mostrata in tempo reale nel box dei log, impedendo la 'morte silenziosa' dell'evento Tkinter.
- Sostituita ultima regex inversa complessa con operatore nativo Python 'in' per ulteriore spinta prestazionale.
* docs: aggiunta guida utente passo-passo localizzata
- Creato file GUIDA_UTENTE.md con tutorial operativo per utenti non esperti. - Inseriti link rapidi nel README per facilitare l'onboarding.
* Update README.md
* fix(linux/core): supporto GNOME nativo, fix scroll e correzione critica regex
- [LINUX] Implementato wrapper per intercettare 'zenity' e 'kdialog' garantendo finestre di selezione file native moderne.
- [LINUX] Ripristinati gli eventi fisici <Button-4> e <Button-5> per garantire il funzionamento dello scroll mouse su server X11/Wayland.
- [GUI] Rimosse le emoji testuali dai bottoni per risolvere i problemi di font fallback su sistemi minimali.
- [CORE] Fixato un grave bug logico nella whitelist che avrebbe protetto sottostringhe parziali usando l'operatore 'in'. Ripristinata e ottimizzata la valutazione tramite Regex boundary (\b).
* fix(core/linux): risolto bug loop annulla e ripristinato controllo crittografico
- [LINUX] Sistemato bug nel wrapper dei file dialog nativi che apriva la vecchia finestra Tkinter se l'utente cliccava su 'Annulla' in Zenity/Kdialog.
- [CORE] Ripristinato il blocco vitale 'if temp_doc.needs_pass:' durante il caricamento del file (inavvertitamente rimosso nelle versioni precedenti) per prevenire crash totali del motore AI su documenti protetti da password.
* fix(linux): corretto crash Zenity su Fedora e decodifica URI per Drag&Drop
- [LINUX] Aggiornata la sintassi dell'argomento --file-filter in Zenity e ottimizzato il gestore dei codici di ritorno per garantire un fallback infallibile verso Tkinter.
- [LINUX] Implementato parser di decodifica URI (urllib.parse) per ripulire il prefisso 'file://' e gli spazi '%20'. Ora il Drag and Drop del file sull'icona dell'eseguibile o tramite Desktop Entry funziona correttamente su GNOME/Wayland.
* fix(linux): rimossi i filtri in Zenity e gestito Drag&Drop nativo
- Eliminato il parametro --file-filter dalle chiamate a Zenity per prevenire il crash (exit code 1) sui sistemi Fedora/GNOME. Ora si appoggia a un controllo formato sicuro interno al tool.
- Aggiunta la decodifica dell'URI (file:// e spazi %20) nella funzione di avvio per permettere il caricamento via Drag & Drop sull'icona o apertura tramite terminale Linux.
* refactor: migrazione Enterprise a PySide6 e architettura Multithread (v2.0.4)
- [ARCHITETTURA] Sostituito integralmente lo stack grafico da CustomTkinter a PySide6 (Qt6). Questo garantisce un supporto nativo assoluto per i File Dialogs e il Drag & Drop su Linux (Wayland/GNOME), Windows e macOS.
- [CORE/THREADING] Isolato il motore AI (Presidio e spaCy) in un 'AIWorker' su QThread dedicato. La GUI ora gode di totale fluidità.
- [SICUREZZA THREAD] Sostituiti i vecchi workaround di aggiornamento con il sistema nativo Qt 'Signals & Slots', prevenendo crash di tipizzazione C++ nel passaggio delle Espressioni Regolari. Chiusura sicura del thread agganciata all'evento di uscita.
- [UX/UI] Rendering PDF accelerato via hardware tramite 'QGraphicsView'. Introdotto foglio di stile (QSS) personalizzato a tema 'Cybersecurity' e log di sistema formattati semanticamente (colori HTML in base a errori, avvisi e successi).
- [DEVOPS] Aggiornati gli script 'setup_env.py' e 'build_local.py' per gestire la transizione del framework rimuovendo customtkinter e ottimizzando il pacchetto Qt6 per PyInstaller.
- [FIX] Reintegrata finestra Info customizzata con logo, risolti artefatti grafici sugli input e allineata la naming convention in ottica white-label.
* docs: aggiornata documentazione per la versione 2.0.4 (Qt6)
- Aggiornati requisiti tecnici (PySide6). - Descritta la nuova architettura multithread nella guida utente. - Inserite istruzioni per il Drag & Drop nativo e i nuovi log colorati.
* chore(build): ottimizzazione PyInstaller per GitHub Actions e fix build-id
- Ottimizzato 'build_local.py' per disabilitare lo strip dei binari (strip=False), prevenendo errori di corruzione legati ai GNU build-id su sistemi Linux CI/CD.
- Perfezionata la gestione delle icone nel PyInstaller .spec: ora garantisce la corretta iniezione dell'icona .ico (Windows) e del BUNDLE .icns (macOS).
- Aggiornato workflow 'build.yml' rimuovendo librerie obsolete e installando binutils e libxcb richiesti da Qt6 su ambiente Ubuntu 22.04 headless.
- Aggiornato 'setup_env.py' per riflettere lo stack pulito delle dipendenze.
* chore(deps): rimossa libreria pillow e generate icone pre-compilate
- Ottimizzata la gestione delle icone: rimosso l'engine di conversione in runtime (PIL) da build_local.py in favore di icone native pre-esistenti.
- Rimossa la dipendenza 'pillow' dagli script setup_env.py e dal workflow GitHub Actions, snellendo la footprint del progetto.
* Aggiornato README.md - Rimosso riga Pillow dalla sezione Tecnologie utilizzate
* refactor(build): allineamento nomi build e automazione release.yml
- Ripristinata la logica di naming 'NullifyPDF_v{version}_{os_name}{ext}' inclusa la dicitura Linux_Portable.
- Implementato workflow release.yml per la pubblicazione automatica degli asset su GitHub.
- Rimossa definitivamente la dipendenza pillow da tutta la catena di build e configurazione.
* fix(macos): trasformato binario in App Bundle installabile (ZIP)
- Ripristinata la logica BUNDLE in PyInstaller per generare un pacchetto .app su macOS.
- Aggiunta compressione automatica ZIP per distribuire il bundle mantenendo icone e permessi.
- Sincronizzati i nomi degli artefatti nel workflow GitHub Actions per caricare .zip, .exe, .deb e .rpm.
* release: v2.0.5 completa e stabile (macOS ZIP, pacchetti DEB/RPM con trigger, no-Pillow)
- [Core] Silenziati i log qt.qpa.wayland e agganciato setDesktopFileName per risolvere bug launcher su Fedora/GNOME.
- [Build] Riscritta completamente la logica dei pacchetti RPM e DEB per eseguire gli update-desktop-database in %post/postinst.
- [macOS] Impacchettamento garantito tramite file ZIP del BUNDLE (.app) mantenendo permessi e firma.
- [Deps] Pillow rimossa da tutti gli script Python e GitHub Actions in favore di asset statici pre-generati (.ico e .icns).
- [CI/CD] Workflow unificato in release.yml configurato per raccogliere solo i 4 formati esatti specificati.
* chore: architettura a Singola Fonte di Verità con requirements.txt
- Introdotto file requirements.txt centralizzato per la gestione dei pacchetti.
- Aggiornato setup_env.py per installare le dipendenze dinamicamente leggendo il txt.
- Ottimizzati i workflow GitHub Actions: reinserita la direttiva 'cache: pip' che ora funziona grazie al requirements.txt, riducendo drasticamente i tempi di build.
- Le azioni GitHub ora richiamano pip install -r requirements.txt evitando duplicazioni di codice.
* chore(build): ottimizzazione cache pip, fix macOS e requirements centralizzati
- Centralizzate le dipendenze in requirements.txt (Single Source of Truth).
- Ripristinata la cache pip nei workflow GitHub Actions per velocizzare le build.
- Creato workflow 'test_build.yml' per la validazione delle PR verso main.
- Fix macOS in 'build_local.py': risolto errore path ZIP e implementata modalità ONEDIR sicura per Apple Gatekeeper.
* fix(build): risolto crash UnicodeEncodeError su Windows
- Sostituiti i caratteri speciali (come la spunta Unicode) con testo ASCII standard ([OK], [ERROR]) per prevenire crash del terminale cp1252 durante l'esecuzione su runner Windows in GitHub Actions.
* Update copyright
* refactor(P0): Critical bug fixes - bare except, input validation, logging
CRITICAL FIXES:
- Remove bare except clauses: jump_page(), cmd_export() [2x]
Replace with specific exception types: ValueError, RuntimeError, AttributeError
- Add input validation to load_path(): check path exists, type, PDF extension
- Add input validation to jump_page(): check doc loaded before use, bounds
- Fix p.annots() crash: use (p.annots() or []) to handle None return
Locations: user_click_pt(), cmd_clear(), apply_ai_to_page()
LOGGING INFRASTRUCTURE:
- Add file-based logging with rotation (~/.nullifypdf/logs/nullifypdf.log)
- Setup logging module with UTF-8 encoding (fixes Windows UnicodeEncodeError)
- Add logger to NullifyPDF class and use in error handlers
- Log tracebacks on exceptions for debugging
CODE QUALITY:
- Add docstrings to PDF_Checker.py and build_local.py
- Add validation for PDF_Checker.inspect_pdf(): file_path, target_word, extension
- Improve error messages with helpful context (page ranges, file types)
- Replace generic except with specific exception types
BACKWARD COMPATIBLE: All changes are non-breaking
* refactor(P1): Add type hints and docstrings to all modules
TYPE HINTS:
- Add typing module imports: Optional, List, Set, Dict, Any, Tuple
- Add function/method type hints (parameters + return types):
* NullifyPDF.py: 26+ methods/functions
* PDF_Checker.py: inspect_pdf()
* build_local.py: All 5 build functions
* setup_env.py: setup_environment()
- Type hints cover: logging.Logger, str, Set, None, QRectF, QPointF, etc.
DOCSTRINGS (Google Style):
- Add module-level docstrings to all files
- Add class docstrings: AIWorker, PDFView, NullifyPDF
- Add method docstrings with Args/Returns/Example sections
- 100+ docstring additions across codebase
CODE QUALITY:
- Improve IDE autocomplete with type hints
- Enable static type checking with mypy (future)
- Self-documenting code through typing
BACKWARD COMPATIBLE: All changes are non-breaking
* refactor(P2): Refactoring and code quality improvements
REMOVED LIST COMPREHENSION SIDE EFFECTS:
- Convert build_ui() radio button setup to for loop (lines 378-386)
- Convert user_click_pt() delete_annot to for loop (lines 527-528)
- Improve code readability and IDE warnings
EXTRACTED PDFListManager CLASS:
- New class manages blocklist/allowlist persistence
- Methods: load_blocklist(), load_allowlist(), save_blocklist(), save_allowlist()
- Encapsulate file I/O logic away from main window class
- Improve testability and separation of concerns
- Reduce NullifyPDF class size (~30 lines removed from methods)
AIWorker INPUT VALIDATION:
- Add validation for pages_text parameter (non-empty list)
- Add validation for choice parameter ('EN', 'IT', 'BOTH')
- Add validation for compiled_allowlist parameter (list type)
- Emit error signals and finish gracefully on validation failure
- Prevent crashes from invalid AI scan parameters
DEPENDENCY VERSION PINNING:
- Specify exact versions for all dependencies:
* PySide6==6.7.0
* PyMuPDF==1.24.1
* presidio-analyzer==2.2.354
* spacy==3.7.2
* pyinstaller==6.3.0
- Enable deterministic builds across machines
- Add category comments for dependency organization
BACKWARD COMPATIBLE: All changes maintain existing API and behavior
* refactor(P3): Polish and testing infrastructure
DEBUG MODE:
- Add NULLIFYPDF_DEBUG environment variable support
- Set logging level to DEBUG when NULLIFYPDF_DEBUG=true
- Enables verbose troubleshooting without code changes
SETUP_ENV.PY LOGGING:
- Replace all print() calls with logging module
- Use structured logging with standard format
- Proper error handling with logger.error/warning
- Cross-platform friendly output
SMOKE TESTS:
- Create tests/test_validation.py with 9 test cases
- Test PDFListManager save/load round-trip
- Test word normalization (lowercase, min length)
- Test config directory creation
- Test resource_path returns string
- Test error handling with invalid inputs
- Pytest compatible with parametrized tests
BACKWARD COMPATIBLE: All changes maintain existing functionality
* fix(dependencies): Update package versions for Python 3.13 compatibility
- PySide6: 6.7.0 → 6.11.1 (6.7.0 does not support Python 3.13)
- PyMuPDF: 1.24.1 → 1.24.9
- pyinstaller: 6.3.0 → 6.10.0 (6.3.0 does not support Python 3.13)
- presidio-analyzer: 2.2.354 (unchanged)
- spacy: 3.7.2 (unchanged)
Fixes pip install error with Python 3.13
* fix(setup): Improve venv removal robustness with retry logic
- Add 3-attempt retry loop for removing old .venv directory
- Add 0.5s delay between retry attempts
- Better error handling and logging
- Proceed with venv creation even if removal incomplete
- Handle Windows file locking issues more gracefully
* docs: update documentation for v2.0.5 release
- Add CHANGELOG v2.0.5 with all bug fixes, performance optimizations, and code quality improvements
- Expand GUIDA_UTENTE.md with troubleshooting, debug mode, logging guide, and best practices
- Update README.md with v2.0.5 features (thread-safety, fast-path, disk-backed export, logging)
- Add pytest and mypy to requirements.txt as development dependencies
- Update GitHub Actions workflows to Python 3.12 and include smoke tests and type checking
* docs: remove obsolete tkinter instructions from README
NullifyPDF uses PySide6 (Qt6), not tkinter/customtkinter. Removed misleading and outdated Linux installation notes that referenced a GUI framework no longer used by the project.
* fix: implement all code review fixes for v2.0.5
Critical fixes:
- C2: Handle None from page.annots() on export
- C4: Remove unsafe spaCy vocab mutation
- H1: Add context manager for file handle leak
- H2: Guard against division by zero in progress bar
- H3: Copy QImage buffer to prevent segfault
- H7: Defer self.close() via QTimer for signal handler safety
- H8: Use repr() for safe path quoting in PyInstaller spec
- H9: Add check=True to pip upgrade subprocess
Performance optimizations:
- C1: Disk-backed memory-efficient PDF export (2x to 1x RAM)
- H6: Pre-compile regex patterns outside loops
- M3: Add O(1) fast-path for allowlist exact-match
- M4: Move get_text() extraction to worker thread with QMutex
Code quality:
- 100% type hints coverage across all modules
- Google-style docstrings for public methods
- File-based logging with rotation and debug mode
- Input validation for path, range, language selection
- Thread-safe document access with QMutex serialization
* fix(ci): replace spacy download with direct pip install from GitHub releases
- Use direct GitHub release URLs for spacy models instead of fragile spacy download command
- URLs pinned to exact versions (en_core_web_md-3.7.1, it_core_news_md-3.7.0)
- Fixes HTTP 404 errors on GitHub Actions
- Matches working implementation from setup_env.py for consistency across all environments
* optimization(ci): add spacy models to requirements.txt for pip caching
- Add spacy language models (en_core_web_md-3.7.1, it_core_news_md-3.7.0) to requirements.txt
- Models now installed via 'pip install -r requirements.txt' instead of separate step
- GitHub Actions pip cache now includes spacy models (~100+ MB)
- Subsequent CI runs will be much faster (cache hit on pip install)
- Simplifies workflow by removing dedicated 'Download AI Models' step
- Maintains exact version pinning for reproducibility
* docs: add core documentation (README, CONTRIBUTING, ARCHITECTURE)
- Redesigned README.md in English with EMLyzer style guide
- Added CONTRIBUTING.md with contributor guidelines, code standards, and PR workflow
- Added ARCHITECTURE.md with system design, components, and threading model
All documentation follows GitHub-optimized format with emoji, alerts, and tables.
* docs: add user and developer guides
- Added USER_GUIDE.md with 6-step tutorial, FAQ, and logging setup
- Added TROUBLESHOOTING.md with 10+ common issues and OS-specific solutions
- Added DEVELOPMENT.md with setup guide, code standards, and testing instructions
All guides include collapsible sections, tables with emoji, and EMLyzer style formatting.
* docs: add security, community, and GitHub templates
- Added SECURITY.md with privacy model, technical security details, and responsible disclosure
- Added CODE_OF_CONDUCT.md based on Contributor Covenant v2.1
- Added GitHub issue templates for bug reports and feature requests
- Added GitHub pull request template with testing and checklist
Includes automated template system for users submitting issues and PRs.
* ci: add dependabot configuration for automated dependency updates
- Configure Dependabot to scan pip dependencies weekly
- Auto-open PRs for security updates (max 5 per week)
- Configure Dependabot for GitHub Actions
- Use standardized commit message format (chore(deps), ci(deps))
- Reviewers and labels configured for dependency PRs
* docs: release v2.0.5 documentation suite and security configuration (#51)
* docs: add core documentation (README, CONTRIBUTING, ARCHITECTURE)
- Redesigned README.md in English with EMLyzer style guide
- Added CONTRIBUTING.md with contributor guidelines, code standards, and PR workflow
- Added ARCHITECTURE.md with system design, components, and threading model
All documentation follows GitHub-optimized format with emoji, alerts, and tables.
* docs: add user and developer guides
- Added USER_GUIDE.md with 6-step tutorial, FAQ, and logging setup
- Added TROUBLESHOOTING.md with 10+ common issues and OS-specific solutions
- Added DEVELOPMENT.md with setup guide, code standards, and testing instructions
All guides include collapsible sections, tables with emoji, and EMLyzer style formatting.
* docs: add security, community, and GitHub templates
- Added SECURITY.md with privacy model, technical security details, and responsible disclosure
- Added CODE_OF_CONDUCT.md based on Contributor Covenant v2.1
- Added GitHub issue templates for bug reports and feature requests
- Added GitHub pull request template with testing and checklist
Includes automated template system for users submitting issues and PRs.
* ci: add dependabot configuration for automated dependency updates
- Configure Dependabot to scan pip dependencies weekly
- Auto-open PRs for security updates (max 5 per week)
- Configure Dependabot for GitHub Actions
- Use standardized commit message format (chore(deps), ci(deps))
- Reviewers and labels configured for dependency PRs
* build(deps): bump pytest from 7.4.4 to 9.0.3 (#50)
Bumps [pytest](https://github.com/pytest-dev/pytest) from 7.4.4 to 9.0.3.
- [Release notes](https://github.com/pytest-dev/pytest/releases)
- [Changelog](https://github.com/pytest-dev/pytest/blob/main/CHANGELOG.rst)
- [Commits](pytest-dev/pytest@7.4.4...9.0.3)
---
updated-dependencies:
- dependency-name: pytest
dependency-version: 9.0.3
dependency-type: direct:production
...
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* chore(deps)(deps): bump presidio-analyzer from 2.2.354 to 2.2.359 (#60)
Bumps [presidio-analyzer](https://github.com/Microsoft/presidio) from 2.2.354 to 2.2.359.
- [Release notes](https://github.com/Microsoft/presidio/releases)
- [Changelog](https://github.com/microsoft/presidio/blob/main/CHANGELOG.md)
- [Commits](microsoft/presidio@2.2.354...2.2.359)
---
updated-dependencies:
- dependency-name: presidio-analyzer
dependency-version: 2.2.359
dependency-type: direct:production
update-type: version-update:semver-patch
...
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* ci(deps)(deps): bump actions/upload-artifact from 4 to 7 (#52)
Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 4 to 7.
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](actions/upload-artifact@v4...v7)
---
updated-dependencies:
- dependency-name: actions/upload-artifact
dependency-version: '7'
dependency-type: direct:production
update-type: version-update:semver-major
...
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* ci(deps)(deps): bump actions/checkout from 4 to 6 (#53)
Bumps [actions/checkout](https://github.com/actions/checkout) from 4 to 6.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](actions/checkout@v4...v6)
---
updated-dependencies:
- dependency-name: actions/checkout
dependency-version: '6'
dependency-type: direct:production
update-type: version-update:semver-major
...
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* ci(deps)(deps): bump actions/setup-python from 5 to 6 (#54)
Bumps [actions/setup-python](https://github.com/actions/setup-python) from 5 to 6.
- [Release notes](https://github.com/actions/setup-python/releases)
- [Commits](actions/setup-python@v5...v6)
---
updated-dependencies:
- dependency-name: actions/setup-python
dependency-version: '6'
dependency-type: direct:production
update-type: version-update:semver-major
...
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* ci(deps)(deps): bump actions/download-artifact from 4 to 8 (#55)
Bumps [actions/download-artifact](https://github.com/actions/download-artifact) from 4 to 8.
- [Release notes](https://github.com/actions/download-artifact/releases)
- [Commits](actions/download-artifact@v4...v8)
---
updated-dependencies:
- dependency-name: actions/download-artifact
dependency-version: '8'
dependency-type: direct:production
update-type: version-update:semver-major
...
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* ci(deps)(deps): bump softprops/action-gh-release from 2 to 3 (#56)
Bumps [softprops/action-gh-release](https://github.com/softprops/action-gh-release) from 2 to 3.
- [Release notes](https://github.com/softprops/action-gh-release/releases)
- [Changelog](https://github.com/softprops/action-gh-release/blob/master/CHANGELOG.md)
- [Commits](softprops/action-gh-release@v2...v3)
---
updated-dependencies:
- dependency-name: softprops/action-gh-release
dependency-version: '3'
dependency-type: direct:production
update-type: version-update:semver-major
...
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* chore(deps)(deps): bump pymupdf from 1.24.8 to 1.27.2.3 (#57)
Bumps [pymupdf](https://github.com/pymupdf/pymupdf) from 1.24.8 to 1.27.2.3.
- [Release notes](https://github.com/pymupdf/pymupdf/releases)
- [Changelog](https://github.com/pymupdf/PyMuPDF/blob/main/changes.txt)
- [Commits](pymupdf/PyMuPDF@1.24.8...1.27.2.3)
---
updated-dependencies:
- dependency-name: pymupdf
dependency-version: 1.27.2.3
dependency-type: direct:production
update-type: version-update:semver-minor
...
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* chore(deps)(deps): bump pyinstaller from 6.10.0 to 6.20.0 (#59)
Bumps [pyinstaller](https://github.com/pyinstaller/pyinstaller) from 6.10.0 to 6.20.0.
- [Release notes](https://github.com/pyinstaller/pyinstaller/releases)
- [Changelog](https://github.com/pyinstaller/pyinstaller/blob/develop/doc/CHANGES.rst)
- [Commits](pyinstaller/pyinstaller@v6.10.0...v6.20.0)
---
updated-dependencies:
- dependency-name: pyinstaller
dependency-version: 6.20.0
dependency-type: direct:production
update-type: version-update:semver-minor
...
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* chore(deps)(deps): bump mypy from 1.8.0 to 1.20.2 (#58)
Bumps [mypy](https://github.com/python/mypy) from 1.8.0 to 1.20.2.
- [Changelog](https://github.com/python/mypy/blob/master/CHANGELOG.md)
- [Commits](python/mypy@v1.8.0...v1.20.2)
---
updated-dependencies:
- dependency-name: mypy
dependency-version: 1.20.2
dependency-type: direct:production
update-type: version-update:semver-minor
...
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* chore(deps)(deps): bump spacy from 3.7.2 to 3.8.14 (#61)
* chore(deps)(deps): bump spacy from 3.7.2 to 3.8.14
Bumps [spacy](https://github.com/explosion/spaCy) from 3.7.2 to 3.8.14.
- [Release notes](https://github.com/explosion/spaCy/releases)
- [Commits](explosion/spaCy@v3.7.2...release-v3.8.14)
---
updated-dependencies:
- dependency-name: spacy
dependency-version: 3.8.14
dependency-type: direct:production
update-type: version-update:semver-minor
...
Signed-off-by: dependabot[bot] <support@github.com>
* chore(deps)(deps): bump spacy from 3.7.2 to 3.8.14
Bumps [spacy](https://github.com/explosion/spaCy) from 3.7.2 to 3.8.14.
- [Release notes](https://github.com/explosion/spaCy/releases)
- [Commits](explosion/spaCy@v3.7.2...release-v3.8.14)
---
updated-dependencies:
- dependency-name: spacy
dependency-version: 3.8.14
dependency-type: direct:production
update-type: version-update:semver-minor
...
Signed-off-by: dependabot[bot] <support@github.com>
---------
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: 0verwrite <31691645+overwrite00@users.noreply.github.com>
* security(workflows): add explicit permissions to GitHub Actions workflows (#62)
- test_build.yml: read contents, read actions (testing only)
- release.yml: write contents, read actions (for creating releases)
Fixes CodeQL alerts about missing workflow permissions.
Follows GitHub security best practices: explicit permissions limit
GITHUB_TOKEN scope to what's necessary for each workflow.
* ci: add auto-approve workflow for maintainer pull requests
- Automatically approves PRs created by the maintainer (overwrite00)
- Removes need for repository admin bypass in ruleset
- Maintains security while enabling smooth workflow
- Approval is traceable and can be disabled if needed
* ci: remove non-functional auto-approve workflow
GitHub Actions cannot approve pull requests due to platform limitations.
The bypass admin in ruleset is the appropriate solution for solo maintainers.
Revert PR #63.
* fix: remove unsupported reviewers property from dependabot.yml
The 'reviewers' property is not supported in Dependabot v2.0.
Removed to fix schema validation warnings in VS Code.
* Revert "fix: remove unsupported reviewers property from dependabot.yml"
This reverts commit 0fdad6b.
* fix: remove unsupported reviewers property from dependabot.yml
The 'reviewers' property is not supported in Dependabot v2.0.
Removed to fix schema validation warnings in VS Code.
This aligns with Dependabot v2 supported properties:
- schedule, labels, commit-message, allow, ignore
- open-pull-requests-limit, etc.
But NOT: reviewers (use assignees instead if needed)
* docs: simplify security support section in SECURITY.md
Removed redundant version support table. Only the latest version
receives security updates, so listing old versions was unnecessary.
Replaced with concise statement that clearly communicates the policy.
* docs: simplify security support section in SECURITY.md (#65)
Removed redundant version support table. Only the latest version
receives security updates, so listing old versions was unnecessary.
Replaced with concise statement that clearly communicates the policy.
* ci: optimize test_build workflow triggers
Remove redundant 'push' trigger that caused duplicate test runs.
Tests now run only on pull_request events to avoid waste.
- Before: Tests ran on both push AND pull_request (duplicate)
- After: Tests run only on pull_request to main
- Manual trigger (workflow_dispatch) still available
Reduces CI/CD noise and resources while maintaining coverage.
* ci: optimize test_build workflow triggers (#66)
* docs: simplify security support section in SECURITY.md
Removed redundant version support table. Only the latest version
receives security updates, so listing old versions was unnecessary.
Replaced with concise statement that clearly communicates the policy.
* ci: optimize test_build workflow triggers
Remove redundant 'push' trigger that caused duplicate test runs.
Tests now run only on pull_request events to avoid waste.
- Before: Tests ran on both push AND pull_request (duplicate)
- After: Tests run only on pull_request to main
- Manual trigger (workflow_dispatch) still available
Reduces CI/CD noise and resources while maintaining coverage.
* ci: configure dependabot to target develop branch
* Add files via upload
* ci: standardize automation with universal schema
- Update dependabot.yml to use universal label schema (lang:python, type:ci, scope:*)
- Update project-automation.yml with centralized PROJECT_ID and GH_PROJECT_TOKEN
- Centralize automation configuration for all repositories
* ci: add reopened trigger to issues workflow
- Include 'reopened' event type for issues (consistent with PR behavior)
- Allows automation to trigger when issues are reopened
* fix: correct bash syntax in project-automation workflow
The workflow had a critical syntax error: attempting to use a GitHub Actions context variable directly as a bash conditional. Fixed by storing the variable value first, then comparing it as a string.
Error was: if ${{ github.event.pull_request.merged }}; then
Fixed to: PR_MERGED="${{ github.event.pull_request.merged }}" && if [ "$PR_MERGED" = "true" ]; then
This syntax error prevented the workflow from running entirely.
* fix: remove emoji from workflow for YAML compatibility
* feat: add automatic reviewer request to workflow
- Request @overwrite00 as reviewer on opened/reopened PRs
- Works alongside automatic assignment to streamline PR review process
* chore: optimize dependabot.yml configuration
- Remove redundant 'allow: dependency-type: all' block
- Add groups to consolidate updates (minor-and-patch + development-updates)
- Limit major version ignore to development dependencies only
- Keep GitHub Actions free of major-version ignore (CI/CD security-critical)
* fix: correct dependabot.yml groups schema
* fix: correct dependabot.yml ignore schema
---------
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
🚀 CI/CD Optimization
Remove redundant workflow triggers that caused duplicate test runs.
Problem
Solution
Impact