Skip to content

Releases: shruggietech/shruggie-feedtools

v0.1.6

13 Feb 16:46

Choose a tag to compare

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 from source.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

13 Feb 11:01

Choose a tag to compare

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/v2 or https://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 as wp_rest_index and the parser auto-discovers the correct /posts?_embed endpoint, transparently re-fetching and parsing the actual posts.
  • Supports two WP REST index patterns:
    • Namespace index (/wp-json/wp/v2) — identified by namespace + routes keys
    • Site root (/wp-json/) — identified by namespaces array containing wp/* entries
  • 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 + SendMessageW with WM_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 iconbitmap to a no-op so CustomTkinter can never override the icon again
    • Falls back to standard tkinter iconbitmap + wm_iconphoto on non-Windows platforms

Hardcoded User-Agent Fixed

  • Fixed: HTTP User-Agent reporting shruggie-feedtools/0.1.1 regardless of actual versionParserConfig.user_agent now uses a field(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_snapshot fixture in conftest.py now normalizes shruggie-feedtools/X.Y.Z to a stable placeholder before comparing, so construct snapshots no longer fail when _version.py is 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.0
  • httpx >= 0.27
  • pydantic >= 2.0
  • python-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

13 Feb 10:18

Choose a tag to compare

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_type parameter used as a fallback when byte-level sniffing is inconclusive. parse_url() passes the HTTP Content-Type header through to the detector, and parse_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
  • Fixed: PyInstaller build missing favicon — Added ('brand', 'brand') to the GUI .spec file's datas list so favicon.ico and favicon.png are bundled in the executable. Added icon='brand/favicon.ico' to the EXE() call so the .exe itself 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 RawDescriptionHelpFormatter for 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)

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

13 Feb 09:38

Choose a tag to compare

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 *.json files 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 (#144870 dark / #1a5c9e light), matching the hover color. Inactive buttons use the default color.

GUI: Favicon Display

  • Fixed: Favicon still not appearing — Comprehensive favicon overhaul:
    • Deferred _apply_icon() to self.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) for wm_iconphoto() via tk.PhotoImage — works without Pillow
    • Added Pillow>=10.0 to the [gui] optional dependency group
    • Added PIL to PyInstaller hiddenimports and favicon.png to bundled data

Test Maintenance

  • Snapshot version strings updated — Updated 4 construct snapshot files from shruggie-feedtools/0.1.1 to shruggie-feedtools/0.1.2 (carried forward to 0.1.3 dynamically)
  • Dynamic version assertiontest_construct_feed_generator_forced now 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

13 Feb 08:48

Choose a tag to compare

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 .log file 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.Scrollbar with ctk.CTkScrollbar so 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

  • --debug flag — Added to both parse and construct subcommands. When active, writes DEBUG-level logs to <executable_basename>.log in 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 routing
    • core/fetcher.py — HTTP request details, response status, retries
    • core/detector.py — feed type detection paths and results
    • core/normalizer.py — feed and item normalization entry points
    • core/dates.py — epoch value handling
    • adapters/feedparser_adapter.py — version detection, entry count
    • adapters/json_feed_adapter.py — feed title, item count
    • adapters/wp_rest_adapter.py — post count, base URL
    • construct/builder.py — batch size, template title
    • construct/template.py — template loading source
    • construct/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 locate brand/favicon.ico from the nested gui/ package.
  • Fixed: Windows taskbar showing Python icon — Added SetCurrentProcessExplicitAppUserModelID via ctypes before window creation, plus wm_iconphoto via 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_PIL check.

PyInstaller Spec Updates

  • Both GUI and CLI .spec files now include brand/favicon.ico in datas for frozen builds.
  • Both .spec files set icon='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

13 Feb 06:51

Choose a tag to compare

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_buttons guard against dead widgets via winfo_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 diagnostic logger.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.17 to [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

11 Feb 09:59

Choose a tag to compare