Compare the latest cached currency list before applying cache TTL and match cache filenames exactly. Preserve offline mode and failure retry backoff.
Closes#170
authlib 1.7 calls simplefilter("always") for AuthlibDeprecationWarning at
import time, then its own _joserfc_helpers.py imports the deprecated
authlib.jose module, emitting a warning on every run and triggering a
cron mail. Fix by importing authlib.deprecate first so our filterwarnings
"ignore" lands at position 0, ahead of authlib's "always" filter.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
For each conference, calculate the number of free days available
before and after, relative to the trip boundary or adjacent
conference. Multi-conference trips show the gap between conferences
as "after" the first and "before" the second.
Closes#189
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Replace three separate <table> elements with one shared table. The
conf_table macro becomes conf_rows which emits only <tr> elements;
Current/Future/Past section boundaries are dark header rows inside
the same <tbody>. With one colgroup the browser uses one shared
column-width calculation so all headings line up.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Move datetime import to module level
- Replace assert on load_cached_launches with or {} fallback so the
updater doesn't crash when the cache file is absent
- Condense upcoming-trips list comprehension to one line
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Each Gantt bar and table row gets a data-conf-key attribute
(ISO start date + conference name). A small JS lookup map connects
them so hovering either element highlights both simultaneously:
- Gantt bar: filter brightness + inset white box-shadow
- Table row: yellow tint via background-color
Hovering a Gantt bar also scrolls the matching table row into view
(scrollIntoView nearest) so future conferences are reachable without
manual scrolling. The key field is pre-computed in
build_conference_timeline() to keep the template simple.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>