Repository navigation
Releases
CalendarStream 0.2.8-beta.39
Fixed
- Build mistake: 0.2.8-beta.38 was published from a commit whose GitHub Tests run was red (
app/google/traffic_log.py's header was missingHolds:, so suite 75 failed;build_rules/dependencies.mdwas stale). The code was otherwise unaffected; this beta only fixes the header, regeneratesdependencies.md, and updates the three suites (31, 34, 61) that counted the page's sections, icons and Expand lines before F59 added one.
CalendarStream 0.2.8-beta.38
Added
- Beta: Google Traffic (F59): a section below History, Undo & Logs to start a Google module's sync by hand and watch every call this app makes to Google and Google's answer, nothing redacted (not tokens or the client secret) — for developing a real fix to I5. Each module's health chip and Sync Now button are duplicated there; a Clear button empties the log, which is never saved (memory only, cleared on restart).
CalendarStream 0.2.8-beta.37
REVIEW 2 fixes for review issue #11 (google, beta.36).
Fixed
- Google sync: a sync that fails with an unexpected error (not a Google one, say a malformed event) is now classified and remembered in the account's health too, as an unknown failure (#11 #1).
- Google sign-in: the account's e-mail is taken from Google's ID token only when its audience is this OAuth client; a missing audience is no longer trusted (#11 #4).
- Code:
GoogleHealth.check_and_recover's comment says what its decision does (state and back-off, honored by the next scheduled syncs; the 401 refresh-and-retry is inGoogleApi.api()) (#11 #2, Partly). #3 was kept as designed.
CalendarStream 0.2.8-beta.36
F58: the Google code split into small modules in app/google/ (ten checkpoints), with review #9 findings 2 and 3 and review #8's test-runner follow-ups; rules R18–R20. Still open for the next build: GoogleSync becomes an injected client instead of a mixin, and main.py and the routes (an import cycle) are split.
Fixed
- F58 checkpoint 1 (I5): a Google module whose account has no sign-in was skipped by every sync without a word; History now says so once ("not signed in … so it isn't synced: open it and Connect me"). New suite 68.
- F58 checkpoint 9 (R19):
build_rules/dependencies.md, made bytests/tools/deps.py, maps which app file imports which, leaves first, with import cycles marked (main.pyand the routes are the cycle: that is the next thing to split). New suite 75 checks it is current and that everyapp/google/file has its header.GoogleSyncstays a mixin ofGooglefor now; handing it an injectedGoogleApiinstead is the next step. - F58 checkpoint 8: the calendar and event code moves to
app/google/sync.py(GoogleSync,SyncResult,event_body…);gsync.pyis now a small facade (Google(GoogleApi, GoogleSync)plus re-exports and the endpoints/limit the suites set). No behavior change. New suite 74. - F58 checkpoint 7:
app/google/health.py(GoogleHealth) remembers each Google account's health in the database (state, kind of failure, attempts, next retry); a failing sync is classified and recorded, an account waiting out a back-off is skipped quietly, a success or a new sign-in clears it. No setting, mapping or token is touched. New suite 73; suite 68 covers the wiring. - F58 checkpoint 6:
app/google/failure_classifier.py(what kind of failure a Google error is) andrecovery_policy.py(retry or not, the account's new state, bounded backoff with jitter, Retry-After respected);GoogleErrorcarries optionalstatus,transientandretry_after. New suite 72 (no app or database). The Tests workflow no longer cancels a run when the next push arrives. - F58 checkpoint 5 (review #9 finding 2):
app/google/readiness.pytells apart the OAuth client, the sign-in, Google's answer and a sync; the Google Calendar API Sync's last step now says the client is "set up" (never "ready") and names each Google module that isn't signed in, has a Google error or hasn't synced. New suite 71; suite 68 covers the step. - F58 checkpoint 4 (review #9 finding 3): a Google sign-in's PKCE verifier (encrypted) and an invite's sign-in state are saved in the database (
google_signins,google_invite_states), expire after 15 minutes and are used once, so restarting between Continue with Google and Google's answer no longer loses them. - F58 checkpoint 3: the Google sign-in, tokens and requests move to
app/google/api.py(GoogleApi);gsync.Googlebuilds on it with the same public behavior and the same module-level endpoints the suites set. New suite 70 (no app, database or network). - F58 checkpoint 2:
app/google/begins:errors.py(the Google errors, moved out ofgsync.py, which still offers them),health_state.py,failure_kind.py,recovery_decision.py, each with a Dart-ready header. New suite 69 (no app, database or network).
Added
- Checkpoints (2-build.md, R20): a build is a series of small checkpoint commits, pushed as made;
VERSIONis bumped only by the last; BUILD runs through as many as it can; the full suite runs on GitHub. - Code structure rules (AGENTS.md, R18, R19): new code is a module; one class per file, laid out like a Flutter feature (data, domain, ui); every file's header says what it depends on, who uses it and its Dart note; a dependency map for the Dart port.
- Tests workflow (
.github/workflows/tests.yml): runstests/run.sh,pip-auditandbanditon GitHub for every push to main, so the Reviewer can read an independent result (4-review.md, step 0). - Test-runner self-test (
tests/tools/harness_selftest.sh, review #8): injects a database that can't be made or seeded, a silent nonzero exit, a time-out and a leftover process, and checksrun.shcatches each (TEST_SUITE_TIMEOUTsets the suite time-out, default 600 s). Runs first in the Tests workflow.
CalendarStream 0.2.8-beta.35
REVIEW 2 fixes for review issues #8 (tests) and #9 (Google API).
Fixed
- Invite someone no longer moves the owner's working module to a new account when the invite is made; the module changes account only when the invitee signs in (#9).
- Sync Now / ready log warns for each Google module not signed in yet, "open it and Connect me" (#9).
- Tests: each Google-mock suite has its own port and waits for its server;
run.shfails fast on a missing database, kills a suite's leftovers and fails on a non-zero exit status or a time-out (#8).
CalendarStream 0.2.8-beta.34
Ships what beta.33 announced but never contained: its image was built from the first of three commits
(the release workflow builds only when VERSION changes), so F46–F52, F56, F57, I22, I32 and R7 were missing from
it. No new code; the same items as beta.33's entry below.
Changed
- Release rule (2-build.md): the commit that bumps
VERSIONcarries all the code, and the workflow's run is
checked to be for HEAD.
CalendarStream 0.2.8-beta.33
Build 9.
Fixed
- I35 A rule's All Rules badge no longer says "No calendar yet" for a rule whose calendar was later
removed — it keeps naming that calendar (by its own last-known name, or a generic fallback) instead of
looking indistinguishable from a rule that was genuinely never given one. - I37 Escape in the rule dialog now cancels exactly like the Cancel button. Writing a new rule from the
event pop-up and pressing Escape (instead of clicking Cancel) used to close the rule dialog the plain way,
which left the event pop-up closed too; now it comes back, the same as Cancel already did (I18).
Changed
- I21 / F45 A collapsed status word now vanishes entirely (giving its line the space back) unless it's an
ongoing health check the Developer should keep seeing (something that can become unhealthy, e.g. CCS+ or a
feed's "Validated"); a plain one-off confirmation such as History's "Saved" after changing how many changes
are remembered goes all the way, instead of keeping its ✓ forever.
CalendarStream 0.2.8-beta.32
Build 8: Fixes + Settings + Calendar + History + Setup. Left for later, with reasons: I13 (needs steps to reproduce),
I25 (needs steps), F24 (needs a change to the updater's protocol), I7 (on hold); F36.2 deleted by the Developer.
Added
- F44 History's headers reorder by dragging them (or ← → when one is focused); Undo moves to the end, no longer
between Type and Event. - F40 The calendar grid turns the page on a horizontal swipe on a touch screen (left: next, right: previous);
vertical scrolling is unchanged. - F37 The installer asks for a subdomain (also the stack name and the container prefix), defaulting to
calendarstream; the app's default path is the current path plus the subdomain, withetcanddataas its
default subfolders. A path that's already taken is called out ("are you aware of it?") with a choice: use it
anyway, a numbered name, another path, or cancel.
Changed
- I2 Default greys out and disables, with a tooltip saying why, on any read-only calendar.
- I18 Cancel in the rule dialog, opened from the event pop-up, reopens it exactly as it was, unsaved edits included.
- I21 A status word always keeps its icon and words together inside a Status/Action button; elsewhere it shows
both, then collapses to just its icon, after a hold that follows the Animation duration setting. - I22 Administrator's public addresses are one list of rows (the page's own address first), each with its own
trash can; + sits at the end of the first row; trashing the only row left clears it. - I26 A calendar's On | Off switch sits inline with its note, instead of on its own line.
- I27 The 2/3-line box is invisible (no border or fill), right-aligned next to the Status/Action button, instead
of centered across the header. - I28 The Calendars module is renamed Sources.
- I29 History's Accepted sign-in is a ✓ with no words (the word stays as its tooltip and accessible name).
- I31 Different end time zone's tooltip is "End Time zone"; the event pop-up never resizes as All-day Event or
Different end time zone are ticked. - F38 The first theme after a fresh install is System; every section's card padding is 12 px, not 18 (the margin
is unchanged); the reorder grips move in to match. - F39 Look is renamed Appearance (translated at Deploy).
- F41 Time Zone is a globe icon; its tooltip names the zone, and it opens the same picker.
- F42 A rule's key name is cut to 25 characters, with the full name as its tooltip.
- F43 12h | 24h is one clock icon that toggles on a click, the current mode in its tooltip.
CalendarStream 0.2.8-beta.31
Build 7: Calendar + carryover + F22 pictures + R1. Left for later, with reasons: I13 (no way to
reproduce it), I21 (which status box is meant?), F24 (needs a change to the updater's protocol), F36.2
(unclear), I7 (on hold), I25 (record only).
Added
- F34/F35 Reorder grips can sit on the right: Settings › Look › "Reorder grips" Left | Right.
- F36.1 Print Preview chooses the paper's orientation (Landscape | Portrait), remembered; page margins 5 mm.
- I11 / hour handle A handle under the Week and Day grid stretches the height of an hour (keyboard too); remembered.
- F22 The Theme Rules pictures are recomposed with Part 2 on top (see theme.md).
Changed
- I14 / I20 Full page: the button sits in the title bar beside ☰ (its icon changes to Back's), the page fills the window and its footer is hidden.
- I19 The event pop-up's rows: All-day Event beside the end date's label, Different end time zone beside the end Time's label.
- I22 The event pop-up's icons shrink to fit instead of wrapping.
- Administrator status box on the right of its header, with ✕ / ✓ icons on the idle buttons.
Fixed
- I15 Switching the last hidden calendar back on was never saved (an empty value was read as not sent).
- I3 An event added in CalendarStream and then deleted no longer comes back as a struck-through item.
- I17 Deleted and hidden events no longer count in the cell's overflow.
- I18 The pop-up's Rule button works from an unsaved Add-event (it reads the live title and date).
CalendarStream 0.2.8-beta.30
Part of the 6 Fixes + Settings build (the rest — I13, I15, I18, I22, F36, F24 — needs more reproduction
or is bigger new UI work, and is left for the next build so it isn't guessed at).
Fixed
- I24 The server crashed on every page load once a rule had a "Change field to text" or "Add text to
field" action (e.g. a title/notes/location change): the translator's owntextparameter collided with
the{text}placeholder's keyword, two layers deep (the per-call wrapper, andi18n.tritself). Fixed
at the root:i18n.tr'stextparameter is now positional-only, and the wrapper that was shadowing it
(and two others that could have hit the same thing) renamed. - I23 A new rule saved with no title now gets one from its If/Then (as a calendar's color already
defaults when none is chosen), instead of failing on save (a consequence of I24: generating a name from
an untitled rule's actions is exactly what crashed). - I2 The default calendar's "Default" label stays beside its title on narrow screens instead of
dropping to its own line under Close. - I12 The margin added for the rule-line reorder handle trimmed from 16px to 14px (the handle's actual
width), in response to "the padding in Rules increased."
Waiting
- I7 still on hold. I13, I15, I18, I22, F36, F24, F22 still waiting.