Bump dirs from 6.0.0 to 7.0.0 in the cargo-deps group across 1 directory - #12
Closed
dependabot[bot] wants to merge 147 commits into
Closed
dependabot[bot] wants to merge 147 commits into
dependabot[bot] wants to merge 147 commits into
Conversation
Initialize the Rust crate with edition 2024, the dependencies specified in the spec, and clippy lints denying unwrap/expect on fallible paths to satisfy acceptance criterion 7.8. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
clap derive struct with Mode/Source enums, a parse_page validator that rejects anything outside 100..=999, and a hand-curated SVT section index for --list. Page is optional only when --list is set. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Strip the data:image/gif;base64 prefix, base64-decode, then load via the image crate. Body text comes from the screenreader-only <div> SVT includes for accessibility — cleaner than scraping the visible DOM, and the prefix-class selector survives CSS module hash rotations. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
ureq agent with 5s connect / 10s read+write timeouts, a versioned User- Agent, and surface status_text on non-2xx. Both the default SVT path and the optional texttv.nu fallback go through the same agent. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Auto-detect goes through viuer's kitty/iTerm probes and reports the result via --debug-protocol so we can verify per-terminal in the acceptance pass. Inside tmux, a hint nudges users toward allow-passthrough when the protocol degraded to halfblocks. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Map clap parse errors to exit 1 (user error) while preserving 0 for --help/--version. Auto-degrade to text mode when stdout is piped, and honour NO_COLOR. Runtime errors (HTTP, parse, "page not available") surface on stderr and exit 2. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Plus allow unwrap/expect inside the integration test (mirrors the allow already present in src/cli.rs unit tests). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Pivot from image-first to text-first. The accessibility screenreader text SVT embeds is more readable, grep-friendly, and avoids the bitmap- of-text-as-image footprint. Image rendering is still available behind --mode auto/kitty/iterm/blocks and is now capped at 60 terminal cells. Also tighten text formatting: trim trailing whitespace per line and collapse runs of blank lines to one. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Switch the default text path to api.texttv.nu, whose JSON exposes per-cell color classes and a DH flag for double-height lines. That's the only source faithful enough to reconstruct teletext attributes; svt.se's HTML strips them. Render with owo-colors using ANSI truecolor (the 8 teletext primaries as pure RGB), and wrap DH lines in DEC private escapes ESC#3/ESC#4 so conforming terminals (Kitty, Ghostty, WezTerm, iTerm2, xterm) draw them at native double-height. Mosaic graphics (bgImg cells) become colored spaces — layout preserved, block patterns deferred. --no-color now strips both color and DH escapes; piped/redirected stdout auto-degrades the same way per the NO_COLOR convention. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Lead with the colored 40-col reproduction, demote image rendering to a secondary section, and credit texttv.nu as the data source the colored path depends on. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Pad each subpage with 16 px of black pixels on the right before handing it to viuer. After viuer scales the padded image down to 60 terminal cells, that's ~1.85 cells of black margin — enough to visually separate the rendered page from the surrounding terminal background without shrinking the content noticeably. Applies uniformly to kitty, iterm, blocks, and auto. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Append a single black-background cell to every line in render_colored (only when color is enabled — the no-color/plain path doesn't need a trailing space). The frame inherits DEC double-height on DH lines, so the 41-cell width is preserved at both half rows. Mirrors the 16-px right-edge padding applied in image modes. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The default mode reproduces the 40-col teletext layout with colors and double-height — calling it 'text' undersold what it actually does. --mode teletext now matches the docs and the README. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Native graphics protocols (Kitty/iTerm) now render at the GIF's natural pixel size — about 74 cells on a typical font — so the teletext glyphs in the bitmap are actually readable. The half-block fallback fills the terminal horizontally, capped at 160 cells. The 16-px black right-frame stays in place; it scales proportionally with the larger render, working out to ~2 cells of margin either way. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Use whatever terminal width is reported; the cap is now just a safety bound against a misreported size pushing viuer into a slow render. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Default is medium (60 cells), which matches the sizing that worked well for most cases earlier. Larger sizes are useful for showing detail of the rendered teletext glyphs; tiny/small are nice for thumbnails or side-by-side comparisons. --size full uses terminal width, capped at 4000 cells as a safety bound. The flag is ignored in teletext mode, where the page is always 41 cells wide. Also collapses the three force_*_config helpers into a single parameterised force_config since they only differ in two booleans now. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
DEC double-height (ESC#3/ESC#4) only renders correctly on a subset of terminals; on everything else it shows up as visible duplicate rows. The visual tall-text effect isn't worth the regression. render_colored now emits each Line exactly once. The Line.double_height flag stays on the parsed struct in case we add a different presentation later (bold, underline, etc.). Also defaults to image rendering on Kitty/Ghostty/WezTerm, teletext elsewhere; --mode is now Option<Mode> with a runtime resolver. iTerm.app specifically falls into the teletext default per project preference, even though it supports its own inline-image protocol. Added a parse-level dedupe-overflow guard: if texttv.nu ever returns more rows than the expected 25, consecutive identical text-bearing lines are collapsed. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
All current CLI flags (mode, size, source, no_color) are also readable from a YAML config file under XDG_CONFIG_HOME/texttv/ (defaulting to ~/.config/texttv/). Precedence is CLI > config file > built-in default; NO_COLOR and a piped stdout still force color off regardless. deny_unknown_fields rejects typos so misspelled keys don't silently get ignored. Parse/read errors print a warning on stderr but don't abort — the user can still run with explicit CLI args. README documents the full file with every option commented at its default value. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Each mosaic cell on a texttv.nu page references a tiny GIF identifying its 2×3 sub-cell pattern. The new mosaic module fetches each unique URL once per run, decodes the GIF, samples the six sub-cell centres, classifies each against the cell's fg/bg colors by Euclidean distance, and maps the resulting 6-bit pattern to a Unicode glyph: a sextant from the U+1FB00 "Symbols for Legacy Computing" block for the 60 non-trivial patterns, or one of U+0020 / U+258C / U+2590 / U+2588 for the four special cases. Per-process in-memory cache; falls back to colored spaces on any fetch/decode failure so a network blip never breaks the render. Cell.mosaic became Option<String> (the GIF URL); is_mosaic() helper for callers. write_line in the renderer now resolves and emits the glyph when the URL is present. 10 unit tests on the pattern→glyph mapping, including the four special-case codepoints and the offset-skipping arithmetic. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Two compounding wins: - Replace the per-call AgentBuilder with a process-wide ureq::Agent in a OnceLock so the TLS handshake amortises across every mosaic fetch. - New mosaic::prefetch_page walks the parsed page, collects each unique mosaic URL, and resolves them in parallel via std::thread::scope so the render loop hits cache for every cell. End-to-end render of page 300 (~15 unique mosaics) drops from a seconds-per-line crawl to ~3.4s total, with the visible render starting only after prefetch completes. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
New texttv::timing module wraps each major operation (fetch, parse, mosaic prefetch, render) with a stderr "[texttv] <label> (<n>ms)" trace. Auto-enabled in debug builds (cargo run --) and stripped in release builds (cargo install) unless TEXTTV_TIMINGS=1 is set in the environment. Output stays on stderr so the rendered page on stdout is unaffected. Example debug-mode output (page 300, teletext): [texttv] fetch texttv.nu/300 (1112ms) [texttv] parse colored html (7ms) [texttv] prefetch 37 mosaic GIFs (2353ms) [texttv] render (0ms) Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Patterns are stable across runs (content-addressed hash → identical GIF bytes → identical pattern), so the natural ROI is to remember them on disk. Each pattern is a single byte; one file per hash under $XDG_CACHE_HOME/texttv/mosaics/<hash>.pat. Atomic tmp+rename writes so concurrent renderers don't tear. Cold-cache page 300: 2233ms for prefetch (37 unique mosaics, CDN throttles to ~30 concurrent connections per source). Warm-cache page 300: 2ms for prefetch. Per-fetch timing instrumentation (gated by TEXTTV_TIMINGS or debug build) now reports each individual GIF's latency so we can see the CDN-side bottleneck. Investigated whether per-thread Agents bypassed ureq's pool — they didn't, server-side limit dominates. TODOs updated to reflect 1a's open follow-ups. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
write_dh_underline used to emit ▀ for every cell in the DH line, so
headings with a leading whitespace cell (e.g. the " " indent on most
DH headlines) got an underline starting at column 1 instead of at the
text's actual start column. Skip whitespace-only cells from the bar
treatment — render them as plain background spaces — so the underline
anchors to the heading itself.
Before:
Inrikes 101 Utrikes 104 Innehåll 700
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
After:
Inrikes 101 Utrikes 104 Innehåll 700
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Two follow-up tweaks on the DH visual treatment: - Replace ▀ (U+2580 upper half block) with 🬋 (U+1FB0B SEXTANT-34, the middle horizontal stroke). ▀ rendered as a heavy bar that visually clashed with the heading; 🬋 matches the teletext-native rule lines SVT already uses (e.g. "🬋🬋🬋 130 🬋🬋🬋" navigation footers). - Span the bar across all 40 columns of the page rather than just under the heading text. The right-edge cell (the black frame outside the page proper) stays unchanged. Leading-whitespace cells inherit the heading's text color so the bar is one consistent color edge to edge. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Column 1 of the teletext page is the always-black left margin SVT uses to frame the content. The DH underline now emits a plain background space there and starts 🬋 from column 2, matching the native rule lines in SVT's HTML (e.g. " 🬋🬋🬋 130 🬋🬋🬋" footers, which also leave column 1 blank). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The 🬋 underline added visual noise without adding much information. Roll it back: render DH lines as bold single-height instead, and swallow the always-blank row texttv.nu emits below each DH heading so the page stays at the original teletext row count. derive_plain (for --no-color) applies the same swallow so both output paths agree. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Replaces the debug-build auto-enable with an explicit flag so traces never leak in dev builds nor go missing in release. Also surfaces a `verbose: true` knob in config.yaml. TEXTTV_TIMINGS=1 is kept for scripts that prefer env-var control. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Override clap's default Styles so help-output section headers (Usage:, Options:, Arguments:, …) render as bold blue without the underline. Error prefix stays red but is now also bold; literals are bold cyan and placeholders plain cyan. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Default bump is patch. Two opt-in markers (looked up only in the subject line, so mentioning them in the body is safe) escalate the bump: '^' + 'MAJOR' → (major+1).1.0 (minor resets to 1, not 0) '^' + 'MINOR' → major.(minor+1).0 otherwise → major.minor.(patch+1) The hook rewrites the just-made commit via amend --no-edit so the bump lands in the same commit. Cargo.lock's texttv entry is updated in lockstep. Recursion guard via a marker file under .git/ stops the amend from re-triggering the hook. Installer at tools/git-hooks/install.sh copies the hook into .git/hooks/. Pass --uninstall to remove. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- release.yml: move Intel-mac build to macos-15-intel (macos-13 retired), add aarch64-linux target, add tap-update job that regenerates Formula/texttv.rb in dfallman/homebrew-tap on every tagged release - README: document brew install - gitignore .DS_Store Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01AwA2N1pJuv7acWtSoXwzex
Pulls in the fix for TLS 1.3 handshake messages being accepted across encryption level boundaries. Also bumps rustls-webpki 0.103.13 -> 0.103.15. Closes #9 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Everything texttv renders comes from HTTP responses it doesn't control (SECURITY.md already names this as the attack surface). Close the gaps where that content was trusted more than it should be: - Strip control characters from all page text at parse time. HTML entities like  decoded to a raw ESC and went straight to the terminal, so a hostile response could emit OSC/DCS sequences (title set, clipboard write, ...). Newlines are kept; everything else in C0/C1 plus U+2028/U+2029 becomes a space. - Allow-list mosaic URLs to https://l.texttv.nu/storage/chars/*.gif. The URL was taken verbatim from a style attribute and fetched, so a response could point the client at arbitrary hosts (including plain http and loopback) and, because the disk cache is keyed by the digit stem, poison a legitimate hash's cached pattern permanently. Enforced in the parser and again in resolve_pattern, the only place that turns a URL into I/O. - Bound GIF decode dimensions: 64 px for mosaics (real ones are 13x16), 2048 px for SVT page images (real ones are 520x400). image's default limits allow a 13-byte header to trigger a ~500 MB allocation, times eight prefetch threads. - Add a whole-request timeout (20 s pages, 8 s mosaics). The existing timeouts are per read() call, so a server trickling bytes could hold a fetch open indefinitely. - Buffer interactive-mode drawing. Stdout is line-buffered, so each frame was ~25+ write syscalls (one per row) on every keypress and spinner tick; a 64 KB BufWriter makes it one. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The release workflow has contents:write and a PAT to the Homebrew tap, so a compromised or force-moved action tag could ship a bad binary. Pin every action to a full SHA with the resolved version as a trailing comment, and add a Dependabot config to keep the pins current. dtolnay/rust-toolchain derives the toolchain from its ref name, so the SHA pin needs an explicit `toolchain: stable` input to keep behaviour. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
- `--mode teletext --source svt` went through extract_page, which base64- and GIF-decodes every subpage image and then used only the text. Add extract_page_text, which still checks that subpage images exist (so unknown pages error the same way) but never decodes them. - Upgrade viuer 0.9 -> 0.11. It now shares our crossterm 0.29 instead of pulling its own 0.28, which also drops lazy_static, rustix 0.38 and windows-sys 0.59 from the build. - Name the mosaic cache tmp file `<key>.pat.<pid>.tmp`. Two texttv processes decoding the same mosaic shared one tmp path and could rename each other's empty file into place; the miss was self-healing but cost a refetch. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Bumps [actions/checkout](https://github.com/actions/checkout) from 4.4.0 to 7.0.1. - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](actions/checkout@11d5960...3d3c42e) --- updated-dependencies: - dependency-name: actions/checkout dependency-version: 7.0.1 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>
Bumps [softprops/action-gh-release](https://github.com/softprops/action-gh-release) from 2.6.2 to 3.0.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@3bb1273...efb3536) --- updated-dependencies: - dependency-name: softprops/action-gh-release dependency-version: 3.0.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>
Bump scraper 0.20 -> 0.27 and base64 0.22 -> 0.23 (no code changes needed) and refresh the lockfile. This clears both open audit warnings: - anyhow 1.0.102 -> 1.0.104 patches RUSTSEC-2026-0190 (unsound downcast_mut; texttv never calls it, so this is hygiene). - selectors 0.25 -> 0.38 drops the unmaintained fxhash (RUSTSEC-2025-0057) for rustc-hash. Also restores the cargo ecosystem entry in .github/dependabot.yml, which ac5d152 overwrote by mistake; that's why Dependabot could not rebase #8. This commit supersedes it. Closes #3 Closes #6 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Bumps the cargo-deps group with 1 update in the / directory: dirs. Updates `dirs` from 6.0.0 to 7.0.0 --- updated-dependencies: - dependency-name: dirs dependency-version: 7.0.0 dependency-type: direct:production update-type: version-update:semver-major dependency-group: cargo-deps ... Signed-off-by: dependabot[bot] <support@github.com>
dependabot
Bot
force-pushed
the
dependabot/cargo/cargo-deps-399fe5e6b1
branch
from
September 26, 2026 05:33
30f8fb8 to
1176c60
Compare
Contributor
Author
|
This pull request was built based on a group rule. Closing it will not ignore any of these versions in future pull requests. To ignore these dependencies, configure ignore rules in dependabot.yml |
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.
Bumps the cargo-deps group with 1 update in the / directory: dirs.
Updates
dirsfrom 6.0.0 to 7.0.0