Skip to content

Release v2.3.0

Choose a tag to compare

@github-actions github-actions released this 16 May 15:34
· 174 commits to main since this release

✨ Features

  • feat(fetcher): add *_trending batch — reddit / wikipedia / crypto / huggingface (5b3515b)
  • feat(fetcher): add deal_* family for gaming deal aggregators (e174ceb)

📝 Other Changes

  • chore: bump version to v2.3.0 (c74d9e4)
  • test(fetcher/feed): cover render_image_body Some(url) => … Ok(Some(path)) arm and render_image_linked path.map(|p| …) Some/None row shapes by pre-seeding $SPLASHBOARD_HOME/cache/thumbnails/<sha256(url)>.png so thumbnails::download_to_cache short-circuits to existing_cached without touching the network per [[project_thumbnail_cache_preseed_trick]], plus restore_splashboard_home Some(value) => set_var arm via pre-seeding SPLASHBOARD_HOME before capture so the save→mutate→restore flow observes Some(...) instead of the default-unset None arm per [[feedback_coverage_test_panic_arms]] (65b3b04)
  • test(fetcher/random_dog): cover fetch_image_url send().await.map_err arm via raw-space-in-authority URL that fails synchronously at reqwest::Url::parse without touching random.dog, mirroring the sibling fetch_bytes_rejects_malformed_url trick for the image-download leg so the "dog API request failed:" branch stops registering as an uncovered region per [[feedback_coverage_test_panic_arms]] (1cba773)
  • test(fetcher/random_cat,random_dog): cover restore_home Some(value) => set_var arm by pre-seeding SPLASHBOARD_HOME before capturing the prior value so the save→mutate→restore flow observes Some(...) instead of the default-unset None arm, asserting the captured path is reapplied after a mutation (5cce5f8)
  • test(fetcher/linear/client): cover graphql_query send_with_retry map_err arm and ?-propagation in-process via newline-in-bearer-token trick that fails synchronously at .send().await, attaching coverage to the parent report unlike the existing child-process proxy test (a87dfd6)
  • test(fetcher/github/client): cover rest_get/graphql send().await.map_err arms via newline-in-bearer-token trick that fails synchronously at builder time without touching api.github.com, and resolve_authenticated_user ?-propagation arm on cache miss when rest_get errors before the if let Some(cached) Some-arm can short-circuit (5dd4360)
  • test(fetcher/deariary/client): cover send_with_retry http().get(...).send().await.map_err arm via newline-in-token invalid bearer header that fails synchronously at send time, plus cached_get_entry/cached_get_entries Instant::now() < cached.expires false arms reached only by seeding expired CacheSlots manually (production callers hit it via wall-clock drift across refresh cycles), and get_optional/get_required ?-propagation arms before the FetchOutcome match or JSON parser run (50df488)
  • test(fetcher/code/comments): cover scan_repo sort_by closure primary partial_cmp arm via Rust 50%/Python 0% ratio ordering and secondary then_with name-ascending tiebreaker via two 0%-ratio languages, plus ratio_of if denom == 0 zero-denominator arm that production callers can't reach because scan_repo's code + comments > 0 filter drops empty entries before they hit by_language (0482b2f)
  • docs(perf): fix realtime fetcher claims (9bda7ad)
  • docs(perf): tighten inaccurate claims after code audit (da806f2)
  • docs: add Performance guide for cache and refresh model (fac85cc)
  • test(fetcher/reddit/client): cover get_with_profile reqwest::send map_err arm via a malformed authority that fails URL parse before hitting the wire, and fetch_listing's get_with_retry? propagation when both Minimal/Browserish profiles fail on a space-containing path that trips SITE_BASE concatenation parse (e247747)
  • test(fetcher/net/ip): cover text_value IpKind::V6 fall-back when the default interface has no IPv6 and IpKind::Primary terminal unwrap_or_else "no address" arm when the default carries neither v4 nor v6, plus ip_badge IPv6-only arm distinct from the IPv4-only and dual-stack cases, and assert NetIp description mentions both Text and Badge shape roles (66533a3)
  • test(fetcher/stock_watchlist): cover format_price EUR/KRW glyph arms, number_series_body all-non-finite baseline else fallback that pins to 0.0 instead of INFINITY, and StockPoint::from_api currency unwrap_or_else default to "usd" when the API omits the field (27fcf10)
  • test(fetcher): cover random_cat/random_dog build_url digit-segment encode arms, random_dog enforce_allowed_host http-scheme accept and missing/non-http(s) scheme reject paths, plus image_extension GIF87a legacy magic alongside GIF89a (3a26009)
  • test(fetcher/linear/notifications): cover Fetcher metadata trait methods, sample_body declared-shape round-trip plus Image/Ratio None fallback, markdown_line_for identifier/actor/title arms with snippet fallback, and entry_value actor/type/title separator joining with snippet fallback (a8c028c)
  • test(fetcher/github/action_history): cover sample_body Shape::Bars passed/failed arm, render_body bars success-vs-non-success conclusion bucketing and empty-runs zero-counts, and cache_key no-options fallback through resolve_repo(None) to the workspace git remote (9fa6301)
  • test(fetcher/stock_watchlist): cover fetch_snapshot empty-input no-data fallback via direct call with an empty slice that bypasses resolve_symbols' public-entrypoint guard (6d87d52)
  • test(fetcher/news): cover fetch malformed-bundled-url early-return arm via a synthetic NewsSource whose hardcoded url fails Url::parse before network I/O (de9186e)
  • test(fetcher/news): cover fetch early-return arms for invalid options deny_unknown_fields and unknown feed key before network I/O (cd5b09f)
  • test(fetcher/system): cover env_basename file_name-less path trimmed fallback and detect_terminal hyper TERM_PROGRAM arm (996a3c3)
  • test(fetcher/net/gateway): cover description/refresh_interval metadata, cache_key name-prefix and options partitioning, fetch unsupported-shape text fallback, plus mod-level default_gateway snapshot stability and gateway_ip ipv4-first/ipv6-fallback/empty preference order (586781e)
  • test(fetcher/net/mac): cover description/refresh_interval metadata, cache_key options partitioning, named-interface no-mac n/a fallback, unparseable-mac badge warn surfacing, and fetch unsupported-shape text_value fallback (e065a36)
  • test(fetcher/weather/forecast): cover weekday_short labels for all seven weekday variants and ratio empty-forecast zero-value no-label fallback (8c252eb)
  • test(fetcher/git): cover commits_activity text-shape empty-grid body and number-series flatten wrapping, plus mod-level fail display wrapping, payload/text_body/text_block_body shapes, and open_repo/discover_root/repo_cache_key shape-variance against the splashboard workspace (62ab7c4)
  • test(fetcher/git/age): cover sample_for shape gating, fetcher metadata, cache_key shape/format variance, structural-shape build dispatch, empty-repo markdown/calendar placeholders, january previous-december day borrow, zero-age today label, and fetch text payload inside a real repo (2bb1846)
  • test(fetcher/youtube): cover fetch_and_merge no-channels-yielded-entries fallback on empty input (0561698)
  • test(fetcher/crypto_watchlist): cover empty-snapshot text fallback, top-mover arrow/change formatting, per-coin text block lines, eur/gbp currency glyphs, integer-only thousands grouping, payload chrome stripping, http singleton reuse, and non-finite sparkline baseline collapse (ac2c5eb)
  • test(fetcher/reddit): cover subreddit/user_posts description sibling references and render_for_shape image-list vs sync dispatch on empty input (5269c71)
  • test(fetcher/net/speedtest): cover http singleton reuse and measure_download/latency/upload plus download_chunk request-failure paths (5491e69)
  • test(fetcher/system): cover detect_timezone fallback, desktop/window-manager env precedence, and init-system platform paths (eed88ee)
  • test(fetcher/stock_watchlist): cover empty-snapshot text fallback, integer-only thousands grouping, zero-price change_pct, payload chrome stripping, and http singleton (f68a831)
  • test(fetcher/thumbnails): cover download_to_cache cache hits, fresh writes, HTTP/oversize errors, and download_many failure collapsing (d9d2171)
  • test(fetcher/system): cover info_host kind variants and monitor_disk text-shape dispatch (0e0e707)
  • test(fetcher/basic): cover metadata, sample_body shape gating, and invalid-options placeholders across the basic family (f45e612)
  • test(fetcher/weather/common): cover unit labels, WMO description/badge/severity tables, http singleton, parse_options errors, and payload wrapper (520870a)
  • test(fetcher/system): cover info_* kind dispatch defaults, known variants, and unknown-kind placeholder (8095e97)
  • test(fetcher/feed): cover render_body shapes, link/thumbnail fallbacks, and parse_feed errors (a25b836)
  • test(fetcher/news): cover category labels, default_feed, and find_feed lookup (c4a3e51)
  • test(system/dmi): cover full chassis label table + reader smoke test (5205a03)
  • chore: update flake.nix hashes for v2.2.0 (8ad5aa3)
  • test(fetcher/crypto_watchlist): replace let-else/unwrap_or_else panic arms with matches! assertions across entries_body volatility status rows, number_series baseline-deviation centi-units and NaN-zeroed sparkline, point_series MAX_SERIES_COINS cap and hour-indexed x-axis, bars_body basis-points value and ▲/▼/· direction arrow, linked_text_block coingecko coin-page URL, markdown_block bold-symbol bullet, and text_block per-coin lines, plus split sample_body unwrap_or_else into is_some presence assertion + unwrap so the panic branch stops registering as an uncovered region per [[feedback_coverage_test_panic_arms]] (e0ee972)
  • test(fetcher/basic/links): add metadata_methods_have_content asserting description mentions every LinkedTextBlock/ImageLinkedList/Text/TextBlock/MarkdownTextBlock/Entries dispatch shape and option_schemas exposes the single non-required links entry, and sample_body_covers_every_declared_shape pinning Some for every shape in SHAPES plus the wildcard _ => return None arm via Ratio/Image, and replace let-else panic arms with matches! assertions across linked_text_block default rows with optional URLs, markdown_text_block bullet+url joined output, text_block per-row title lines, entries name-url pairs with optional value, missing-options empty LinkedTextBlock fallback, unknown-key placeholder TextBlock, and image_linked_list title/thumbnail/subtitle shape coverage (857ed47)
  • test(fetcher/weather/forecast): replace let-else/match panic arms with matches! assertions across text_block per-day-line, text arrow-joined summary, entries weekday-keyed rows, ratio max-precip-probability label, number_series tenths-mm precipitation, point_series high/low unit labels and negative-temperature preservation, bars per-day probability, badge thunderstorm-error and clear-ahead-ok, timeline midnight-UTC timestamps, imperial-units point_series/text_block °F suffix, single-day-window text_block/text/bars collapse, and empty-forecast ratio zero-value no-label shape coverage (499f630)
  • test(fetcher/nasa_apod): cover sample_body _ => return None arm via Bars/Ratio shapes outside the Image+text-shape SHAPES set, and restore_env Some(value) => arm by pre-setting SPLASHBOARD_NASA_APOD_RESTORE_TEST before capturing the prior value (the standard save→mutate→restore flow always observes None and only fires the None arm), plus replace let-else panic arms with matches! assertions across entries_body copyright present/absent/blank, text_body Text/TextBlock/MarkdownTextBlock/LinkedTextBlock shape coverage, and linked_block malformed-date URL-drop arm (0d0e237)
  • test(fetcher/github/contributors_monthly): replace let-else/if-let panic arms with matches! assertions across sample_body Bars/Entries/LinkedTextBlock/TextBlock/MarkdownTextBlock/Text shape coverage and render_body Text headline, MarkdownTextBlock numbered list, TextBlock per-contributor lines, Entries name-count pairs, LinkedTextBlock profile-URL, and Bars label/value shape coverage (f01d6bb)
  • test(fetcher/reddit/user_posts): cover render_for_shape ImageLinkedList iterator+collect closure with non-empty posts whose "self"/empty thumbnails filter to None so download_many short-circuits without network, and replace let-else panic arms with matches! assertions across render_for_shape ImageLinkedList empty and TextBlock sync-dispatch shape coverage (742a5f3)
  • test(fetcher/code/comments): cover render_body Shape::Ratio dispatch arm via direct call that delegates to render_ratio (the dedicated render_ratio tests bypass the arm), and replace let-else/match panic arms with matches! assertions across render_text whole-repo ratio/empty, render_ratio total-comments-over-code-plus-comments/empty, render_body TextBlock/MarkdownTextBlock/Entries percent+loc/Bars percent+loc/Badge empty/Text headline shape coverage, and to_payload Text/Badge/Entries body shape coverage (e421836)
  • test(fetcher/deariary/on_this_day): replace let-else panic arms with matches! assertions across render_body TextBlock/LinkedTextBlock/Text/Timeline/Badge/Entries/MarkdownTextBlock shape coverage plus empty-hits TextBlock/Text/Badge/Timeline fallbacks and Heatmap unsupported-shape TextBlock fallback (c324e05)
  • test(fetcher/stock_watchlist): replace let-else panic arms with matches! assertions across entries_body status/value, number_series_body baseline-deviation and large-value scaling, point_series_body MAX_SERIES_STOCKS cap, bars_body basis-points/direction arrows, linked_text_block_body Yahoo quote URL percent-encoding, markdown_block_body bold-symbol prefix, and to_payload Text body shape coverage (8a3f0be)
  • test(fetcher/todoist): cover cmp_views third .then_with content-tiebreaker arm and dual unwrap_or(i64::MAX) fallback when both views miss due_sort_key, plus to_task_view created_at None unwrap_or_else(|| now.timestamp()) arm, and replace let-else panic arms with matches! assertions across render_body Badge/Text/Entries/Timeline/TextBlock/LinkedTextBlock shape coverage (8bdef9e)
  • test(fetcher/calendar/holidays): cover upcoming_lines and month_calendar parse_date ?/filter_map short-circuit arms via malformed-date entries that drop out while valid rows remain, and replace let-else panic arms with matches! assertions across render_body Text today-match/empty, TextBlock upcoming, and Calendar default-branch shape coverage (b4e6b2e)
  • test(fetcher/rss): replace let-else/match panic arms with matches! assertions across validated_url scheme/missing-url, render_body LinkedTextBlock/TextBlock shape coverage, atom alternate-vs-self link preference, count-cap, empty-entries, missing/whitespace title fallback, and fetch end-to-end body assertions (45dbb6c)
  • test(fetcher): replace let-else/if-let panic arms with matches! assertions in net/speedtest and system/monitor_battery, and cover net_speedtest shapes/refresh_interval/description metadata (7a94e43)
  • test(fetcher): replace let-else/match panic arms with matches! assertions across system info_* tests and add badge_data text-shape None guard in weather/now (0a31607)