Releases: shruggietech/shruggie-feedtools
v0.1.6
Release Notes — shruggie-feedtools v0.1.6
Release Date: 2026-02-13
Status: Patch release (Alpha)
Overview
Cleanup release that removes non-functional JSON Feed and WordPress REST API input adapters after multiple failed implementation attempts. The codebase is now streamlined to XML-based feed parsing only (RSS 2.0, RSS 1.0/RDF, Atom 1.0, RSS 0.9x, Atom 0.3). JSON output remains the sole output format — unchanged.
Breaking Changes
Removed: JSON Feed and WordPress REST API Input Support
- Removed all JSON Feed (input) and WordPress REST API (input) adapters, detection logic, fixtures, and tests — These features were persistently non-functional after multiple implementation attempts and have been fully excised from the codebase.
- Output format is unchanged — All output is still JSON. Only the input JSON Feed and WP REST adapters have been removed.
- Files removed:
json_feed_adapter.py,wp_rest_adapter.py, and associated fixture/snapshot directories - Enum values
"json_feed"and"wp_rest"removed fromsource.type - Detection logic removed:
_detect_json_type(),derive_wp_rest_posts_url(), JSON-path routing in detector - Parser routing for JSON Feed and WP REST removed from
_route_to_adapter() - Dead code removed: JSON Feed attachments mapping in
_normalize_enclosures() - CLI help text and examples updated to reflect XML-only input support
- Documentation updated throughout: README, spec, plan, and release notes
Supported Input Formats (as of v0.1.6)
| Format | Example Sources |
|---|---|
| RSS 2.0 | Most blogs, podcasts, news sites |
| RSS 1.0 / RDF | Older syndication feeds |
| RSS 0.91 / 0.92 | Legacy feeds |
| Atom 1.0 | GitHub releases, YouTube, status pages |
| Atom 0.3 | Older Atom feeds |
Test Results
- 276 tests passing (down from 278 in v0.1.5 — net removal of 46 tests from deleted adapters, offset by prior additions)
- All remaining XML-based adapter, detector, parser, normalizer, schema, CLI, construct, and template tests pass
Full Changelog: v0.1.5...v0.1.6
v0.1.5
Release Notes — shruggie-feedtools v0.1.5
Release Date: 2026-02-13
Status: Patch release (Alpha)
Overview
Targeted reliability release resolving two persistent issues from v0.1.4: WordPress REST API index URLs failing to parse, and GUI favicons not surviving CustomTkinter's startup icon overrides. Also fixes a stale hardcoded user-agent string and eliminates recurring snapshot maintenance caused by version bumps.
Bug Fixes
WordPress REST API Index URL Auto-Discovery
- Fixed: "Parse" failing for WP REST root URLs — Entering URLs like
https://example.com/wp-json/wp/v2orhttps://example.com/wp-json/previously returned "Response does not match any known feed format" because those endpoints return API index/discovery JSON, not post data. The detector now recognizes these responses aswp_rest_indexand the parser auto-discovers the correct/posts?_embedendpoint, transparently re-fetching and parsing the actual posts. - Supports two WP REST index patterns:
- Namespace index (
/wp-json/wp/v2) — identified bynamespace+routeskeys - Site root (
/wp-json/) — identified bynamespacesarray containingwp/*entries
- Namespace index (
- New helper:
derive_wp_rest_posts_url()maps index URLs to their posts endpoint
GUI Favicon — Win32 API Override
- Fixed: Favicons still not appearing after 3+ prior attempts — Replaced the unreliable multi-timer race (4 staggered
after()calls) with a definitive approach:- On Windows, uses Win32 API (
LoadImageW+SendMessageWwithWM_SETICON) via ctypes to set both ICON_SMALL (16×16) and ICON_BIG (32×32) at the OS/window-manager level, completely bypassing tkinter - After applying, monkey-patches
iconbitmapto a no-op so CustomTkinter can never override the icon again - Falls back to standard tkinter
iconbitmap+wm_iconphotoon non-Windows platforms
- On Windows, uses Win32 API (
Hardcoded User-Agent Fixed
- Fixed: HTTP User-Agent reporting
shruggie-feedtools/0.1.1regardless of actual version —ParserConfig.user_agentnow uses afield(default_factory=...)that reads__version__at runtime instead of a hardcoded string. The user-agent will always match the installed version going forward.
Test Infrastructure
Version-Resilient Snapshots
- Fixed: Snapshot tests breaking on every version bump — The
assert_snapshotfixture inconftest.pynow normalizesshruggie-feedtools/X.Y.Zto a stable placeholder before comparing, so construct snapshots no longer fail when_version.pyis bumped. Supports semver and pre-release suffixes.
New Tests
| Area | Tests Added | Description |
|---|---|---|
test_detector.py |
3 | WP REST namespace index, site root, and negative case |
test_detector.py |
6 | derive_wp_rest_posts_url() URL derivation (namespace, root, subdir, negative) |
| Total | 9 new | 326 total tests passing |
Release Artifacts
| Artifact | Description |
|---|---|
shruggie-feedtools-cli-0.1.5-win-x64.exe |
Standalone Windows CLI executable |
shruggie-feedtools-gui-0.1.5-win-x64.exe |
Standalone Windows GUI executable |
shruggie_feedtools-0.1.5.tar.gz |
Source distribution |
shruggie_feedtools-0.1.5-py3-none-any.whl |
Python wheel |
Upgrade Notes
- Drop-in replacement for v0.1.4 — no schema changes, no API changes
- WP REST API root/index URLs that previously failed will now auto-discover and parse posts
- GUI favicon should now persist reliably on Windows
- HTTP requests now correctly identify as
shruggie-feedtools/0.1.5 - pip users:
pip install --upgrade shruggie-feedtools[gui]
Requirements
- Python 3.12 or later (for library/CLI usage via pip)
- Windows 10/11 x64 (for standalone executables)
Runtime Dependencies
feedparser >= 6.0httpx >= 0.27pydantic >= 2.0python-dateutil >= 2.9
Optional
customtkinter >= 5.2(for GUI:pip install shruggie-feedtools[gui])pygments >= 2.17(for GUI syntax highlighting; included in[gui]extras)Pillow >= 10.0(for robust favicon display; included in[gui]extras)
Known Limitations
- PyPI publishing is not yet configured; install from source or use the standalone executables
- GUI executable is Windows-only in this release
- No CI test gate prior to release — tests are run locally (317/317 passing)
License
Apache License 2.0
Full Changelog: v0.1.4...v0.1.5
v0.1.4
Release Notes — shruggie-feedtools v0.1.4
Release Date: 2026-02-13
Status: Patch release (Alpha)
Overview
Critical parsing and usability release fixing three persistent issues: JSON Feed and WordPress REST API detection failures across both CLI and GUI, unreliable GUI favicon display, and inadequate CLI help text. Adds content-type and BOM-aware feed detection, a comprehensive CLI help overhaul, and 15 new tests (317 total passing).
Bug Fixes
JSON Feed / WP REST Detection Failures
- Fixed: JSON Parse operations failing with "Response does not match any known feed format" — The feed type detector now accepts an optional
content_typeparameter used as a fallback when byte-level sniffing is inconclusive.parse_url()passes the HTTPContent-Typeheader through to the detector, andparse_file()uses file extension (.json) as a detection hint. - Fixed: BOM-encoded feeds rejected — Added BOM detection and re-encoding for UTF-8, UTF-16 LE/BE, and UTF-32 LE/BE byte order marks. Content is normalized to UTF-8 before detection and parsing.
- Improved: Diagnostic error messages — All error responses now include diagnostic context (
first_byte,content_type,filename) to aid troubleshooting.
GUI Favicon Not Applying
- Fixed: Favicon still not appearing after previous attempts — Comprehensive timing overhaul:
- Icon now applied at four staggered delays (100ms, 500ms, 1200ms, and
after_idle) to reliably override CustomTkinter's aggressive default-icon behavior - Added
parents[2]as a candidate base directory for editable-install layouts - Reduced per-call re-apply delay from 300ms to 200ms
- Logs all searched paths when no favicon is found for easier debugging
- Icon now applied at four staggered delays (100ms, 500ms, 1200ms, and
- Fixed: PyInstaller build missing favicon — Added
('brand', 'brand')to the GUI.specfile'sdataslist sofavicon.icoandfavicon.pngare bundled in the executable. Addedicon='brand/favicon.ico'to theEXE()call so the.exeitself displays the correct icon in Windows Explorer and the taskbar.
CLI Help Text Overhaul
- Fixed: Terse, incomplete CLI help — Complete rebuild of the argument parser:
- All parsers now use
RawDescriptionHelpFormatterfor proper multi-line rendering - Arguments organized into logical groups: input modes, output options, behavior options (parse); template, input modes, timestamp, output options (construct)
- Descriptive metavars added:
URL,FILE,DIRECTORY,SECONDS,STRING,N,DIR - Rich multi-line descriptions listing all supported feed formats
- Practical usage examples in epilogs for all subcommands
- Exit code documentation (0 = success, 1 = partial failure, 2 = argument/template error)
- All parsers now use
New Tests
| Area | Tests Added | Description |
|---|---|---|
test_detector.py |
7 | Content-type fallback hints, UTF-8/16 BOM handling, backward compatibility |
test_parser.py |
3 | JSON Feed via parse_url() (mocked), parse_file() pipeline |
test_cli.py |
5 | JSON Feed CLI file/URL parsing, enriched help text assertions |
| Total | 15 new | 317 total tests passing |
Full Changelog: v0.1.3...v0.1.4
v0.1.3
Release Notes — shruggie-feedtools v0.1.3
Release Date: 2026-02-13
Status: Patch release (Alpha)
Overview
UI polish release addressing eight GUI issues: file picker usability, copy feedback, per-tab output persistence, Settings layout, font sizing, text contrast, active tab indicator, and favicon reliability. Also includes test maintenance fixes.
Bug Fixes
GUI: File Picker Filter
- Fixed: Template browser too restrictive — The Construct template file picker now defaults to showing all
*.jsonfiles instead of only*.feedtemplate.json. Feed template and all-files filters remain as secondary options.
GUI: Copy Button Feedback
- Fixed: No indication on copy — Pressing the "Copy" button now flashes green with "Copied!" text for 1.5 seconds, then reverts to its default appearance.
GUI: Separate Output States
- Fixed: Shared output between Parse and Construct — Parse and Construct tabs now maintain independent output contents. Switching tabs saves the current output and restores the previous output for the target tab.
GUI: Settings Full Page
- Fixed: Settings overlaid on output panel — The Settings tab now hides the output panel entirely via
grid_remove(), presenting a clean full-page layout. Output content is preserved and restored when returning to Parse or Construct.
GUI: Construct Text Input Font
- Fixed: Construct text area font too small — The Construct text input now uses a dedicated fixed-size 12pt font, independent of the output font size control in Settings.
GUI: Settings Text Contrast
- Fixed: Settings description text hard to read — All description labels on the Settings page now use adaptive
text_color=("gray30", "gray70")instead of hardcoded"gray", providing proper contrast in both light and dark modes.
GUI: Active Tab Indicator
- Fixed: No visual indicator for active tab — The active sidebar button is now highlighted with a darker blue fill (
#144870dark /#1a5c9elight), matching the hover color. Inactive buttons use the default color.
GUI: Favicon Display
- Fixed: Favicon still not appearing — Comprehensive favicon overhaul:
- Deferred
_apply_icon()toself.after(200, ...)so it runs after CustomTkinter completes its own window initialization - Re-applies
iconbitmap()after a 300ms delay to override CTk's default icon - Added PNG fallback icon (
brand/favicon.png) forwm_iconphoto()viatk.PhotoImage— works without Pillow - Added
Pillow>=10.0to the[gui]optional dependency group - Added
PILto PyInstallerhiddenimportsandfavicon.pngto bundled data
- Deferred
Test Maintenance
- Snapshot version strings updated — Updated 4 construct snapshot files from
shruggie-feedtools/0.1.1toshruggie-feedtools/0.1.2(carried forward to 0.1.3 dynamically) - Dynamic version assertion —
test_construct_feed_generator_forcednow imports__version__dynamically instead of hardcoding a version string, preventing future breakage on version bumps - 307 tests passing
Full Changelog: v0.1.2...v0.1.3
v0.1.2
Release Notes — shruggie-feedtools v0.1.2
Release Date: 2026-02-13
Status: Patch release (Alpha)
Overview
Enhancement release adding a Settings panel, debug logging across the entire codebase, theme management, output font-size control, and icon/taskbar fixes.
New Features
GUI: Settings Tab
- Application Theme — New "Settings" tab in the left sidebar with a segmented button to switch between Auto (Default), Light, and Dark themes. Theme changes are applied immediately to the output editor (background, foreground, syntax highlighting, gutter, scrollbars).
- Debug Logging Toggle — Enable/disable file-based debug logging from within the GUI. When active, detailed DEBUG-level messages are written to a
.logfile next to the executable. The log file path is displayed in the Settings panel. - Output Font Size — Numeric spinbox (up/down arrows + typed entry) to adjust the output viewer font size between 8–32 pt. Out-of-range values are gracefully clamped to the nearest limit; a debug log message is emitted when clamping occurs.
GUI: Theming & Scrollbars
- Dynamic scrollbar recoloring — Replaced
tk.Scrollbarwithctk.CTkScrollbarso scrollbars automatically adapt to the current light/dark color scheme. - Full editor theme palette — Dark and light color dictionaries for editor background/foreground, gutter, cursor, selection, and all JSON syntax-highlight token colors.
CLI: Debug Logging
--debugflag — Added to bothparseandconstructsubcommands. When active, writes DEBUG-level logs to<executable_basename>.login the same directory as the executable/script.
Debug Logging Infrastructure
- Comprehensive debug logging added to all core modules, adapters, and construct modules:
core/parser.py— parse_string, parse_file, parse_url, adapter routingcore/fetcher.py— HTTP request details, response status, retriescore/detector.py— feed type detection paths and resultscore/normalizer.py— feed and item normalization entry pointscore/dates.py— epoch value handlingadapters/feedparser_adapter.py— version detection, entry countadapters/json_feed_adapter.py— feed title, item countadapters/wp_rest_adapter.py— post count, base URLconstruct/builder.py— batch size, template titleconstruct/template.py— template loading sourceconstruct/entry.py— JSONL line count
Bug Fixes
- Fixed: Favicon not appearing in title bar/taskbar — Corrected path resolution (
parents[2]→parents[3]) in_apply_icon()to properly locatebrand/favicon.icofrom the nestedgui/package. - Fixed: Windows taskbar showing Python icon — Added
SetCurrentProcessExplicitAppUserModelIDvia ctypes before window creation, pluswm_iconphotovia PIL/Pillow for robust taskbar icon display. - Fixed: Pylance lint errors — Suppressed false-positive "possibly unbound" warnings for optional PIL imports that are already guarded by a runtime
_HAS_PILcheck.
PyInstaller Spec Updates
- Both GUI and CLI
.specfiles now includebrand/favicon.icoindatasfor frozen builds. - Both
.specfiles seticon='brand/favicon.ico'on the EXE for proper Windows executable icon.
Test Results
- 307 tests passing (unchanged from v0.1.1 — all existing tests continue to pass)
Full Changelog: v0.1.1...v0.1.2
v0.1.1
Release Notes — shruggie-feedtools v0.1.1
Release Date: 2026-02-13
Status: Patch release (Alpha)
Overview
Bug-fix and enhancement release addressing critical issues found in v0.1.0.
Bug Fixes
- Fixed: Construct mode completely non-functional in GUI — Switching from Parse to Construct left stale widget references that silently crashed the action handler and permanently locked the busy state. Mode switching now properly cleans up all widget attributes, and
_set_busy/_find_action_buttonsguard against dead widgets viawinfo_exists(). - Fixed: Thread-safety violation in Parse GUI flow — Parse input values are now captured on the main thread before dispatching to the background worker, preventing potential tkinter cross-thread access errors.
- Fixed: JSON feed detection too strict — WordPress REST responses without
_links(stripped by CDN/caching layers) and JSON Feed documents with bare version strings ("1.0"/"1.1"instead of full jsonfeed.org URL) are now correctly identified. Unrecognized JSON payloads now emit diagnosticlogger.debug()output.
Enhancements
GUI Output Panel
- Syntax highlighting — JSON output is color-coded (keys, strings, numbers, booleans, punctuation) using a VS Code dark+ inspired palette via Pygments
- Line numbers — Synchronized gutter with line numbers along the left side
- Editable output — Output text can be manually edited; highlighting re-applies automatically with debounce
- Clear button — Dedicated button to clear the output area; output also auto-clears before each Parse or Construct action
- Minify/Pretty toggle — Independent toggle button to reformat current output between indented and single-line minified JSON
GUI Branding
- Window icon — Application title bar and Windows taskbar now display the shruggie-feedtools favicon (works in both dev and PyInstaller-bundled contexts)
Dependency Changes
- Added
pygments >= 2.17to[gui]optional dependencies
Test Results
- 307 tests passing (up from 301 in v0.1.0 — 7 new detector tests added)
Full Changelog: v0.1.0...v0.1.1
v0.1.0
Full Changelog: https://github.com/shruggietech/shruggie-feedtools/commits/v0.1.0
Full Changelog: https://github.com/shruggietech/shruggie-feedtools/commits/v0.1.0