[general]
name=Log Cleaner
qgisMinimumVersion=3.28
qgisMaximumVersion=4.99
description=Development tool that adds clear buttons in the Message Log panel title bar for logs and Python bytecode cache
about=A productivity tool for QGIS plugin developers. Integrates clear buttons directly into the Message Log dock title bar, enabling rapid log cleanup and removal of the compiled Python bytecode cache of the whole current profile (plugins, expressions, processing scripts) during debugging and testing workflows. Native PyQt implementation with clean unload support.
version=2.2.2
author=yadda
email=youcef.geodesien@gmail.com
changelog=
    2.2.2 - Cache cleaning stability, speed and QGIS 4 thread safety:
        - Prune dot-directories (.test-runtime, .pytest_cache, .ruff_cache, .venv) and build/output artifacts (outputs, livrables, build, dist, venv, wheels) during __pycache__ scan (1000x faster on large dev profiles)
        - Invalidate Python runtime caches (importlib.invalidate_caches and linecache.clearcache) after bytecode cleanup
        - Marshal QgisLogHandler records emitted from worker threads to the main Qt thread via pyqtSignal
        - Replace lambda QueuedConnections and QThread.terminate() with bound QObject slots and cooperative threading.Event cancellation
        - Retry transient Windows os.rmdir locks and avoid false failure banners when all bytecode files were removed
        - Decouple per-button busy state and synchronize button animations with actual worker completion
    2.2.1 - Qt6 compatibility and logging robustness:
        - Every Qt and QGIS enum is now fully qualified: Qt.ConnectionType.QueuedConnection, Qt.GlobalColor.transparent, QPainter.RenderHint.Antialiasing, QPainter.RenderHint.SmoothPixmapTransform, Qgis.MessageLevel.Info/Warning/Critical
        - Removed the try/except AttributeError enum fallbacks: the qualified form is valid on both PyQt5 and PyQt6, verified on QGIS 3.40.15 and 4.0.3
        - Log handler failures now go through logging.Handler.handleError instead of being swallowed by a silent except/pass
        - The twelve silent except/pass and except/return None blocks of clean_log.py now state their reason: DEBUG for expected Qt teardown races, WARNING when a feature is lost (titlebar reinjection) or a worker thread fails to stop
        - ui/animated_button.py re-encoded as UTF-8 without BOM, with double-encoded accents repaired
        - tracker url now points to the issue form, the only GitHub issue url that answers to non-browser clients
    2.1.0 - Plugin cache cleaning:
        - Added PluginCacheCleaner to remove __pycache__ directories across python/plugins
        - Refactored core into Strategy pattern: base_cleaner, log_cleaner, cache_cleaner
        - Title bar now hosts two animated buttons (Log + Cache)
        - Self-protects: never deletes its own __pycache__ during execution
        - Structured logging with module-level loggers (zero print statements)
    2.0.0 - Modular architecture rewrite:
        - Separated business logic (core/cleaner.py) from UI (ui/animated_button.py)
        - Animated trash button with SVG lid open/close animation
        - Retry mechanism for title bar attachment (20 attempts, 500ms interval)
        - Custom DockTitleBar forwarding mouse events to Qt dock behavior
        - Cleaner no longer depends on global qgis.utils.iface
        - Deterministic native title bar restoration on unload
        - Recursive tab content clearing
        - Makefile aligned: packages core, ui, assets directories
    1.0.0 - Initial release with Message Log dock title bar integration
repository=https://github.com/yadda07/log_cleaner
tracker=https://github.com/yadda07/log_cleaner/issues/new

category=Utilities
icon=clean.svg
experimental=False
deprecated=False

tags=log,clean,utilities,message,journal,interface,cache,developer

homepage=https://github.com/yadda07/log_cleaner

hasProcessingProvider=no
server=False
