Skip to content
Permalink

Comparing changes

Choose two branches to see what’s changed or to start a new pull request. If you need to, you can also or learn more about diff comparisons.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also . Learn more about diff comparisons here.
base repository: matin/garth
Failed to load repositories. Confirm that selected base ref is valid, then try again.
Loading
base: 0.7.2
Choose a base ref
...
head repository: matin/garth
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: 0.7.3
Choose a head ref
  • 3 commits
  • 27 files changed
  • 2 contributors

Commits on Mar 18, 2026

  1. Migrate from mypy to ty (#207)

    * Migrate from mypy to ty (Astral)
    
    - Replace mypy with ty in Makefile, pyproject.toml, and dependencies
    - Fix list[Self] shadowing: use builtins.list[Self] in data modules
      where the list() classmethod shadows the builtin
    - Fix invalid-assignment in Client.user_profile (narrow type before
      assigning)
    - Fix dynamic function attribute in test_training_status (use dict)
    - Set invalid-method-override to warn (intentional Liskov violations
      in data subclass sorting wrappers)
    - Remove types-requests dependency (ty doesn't need stubs)
    
    Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
    
    * Fix CI: guard Response.request None, exclude tests from ty
    
    - Add None guard for Response.request in telemetry hook (ty catches
      that PreparedRequest can be None, mypy didn't)
    - Only type-check src/ with ty (CI lint job doesn't have test deps)
    
    Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
    
    * Add pragma no cover to Response.request None guard
    
    Never None for completed responses in practice.
    
    Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
    
    ---------
    
    Co-authored-by: Claude Opus 4.6 (1M context) <[email protected]>
    matin and claude authored Mar 18, 2026
    Configuration menu
    Copy the full SHA
    88d7402 View commit details
    Browse the repository at this point in the history
  2. Never hit real Garmin API in tests (#208)

    * Never hit real Garmin API in tests
    
    VCR now defaults to playback-only (record_mode="none"). Tests will
    never fall through to the real API, even if env vars leak. Recording
    requires explicitly setting GARTH_RECORD_CASSETTES=true.
    
    - Replace GARTH_HOME-based VCR mode with GARTH_RECORD_CASSETTES
    - Autouse _clean_env fixture clears GARTH_HOME, GARTH_TOKEN, and
      disables telemetry for all tests
    - Use GARTH_RECORD_CASSETTES_HOME for authed_client token loading
    - Document recording workflow in CLAUDE.md
    
    Closes #202
    
    Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
    
    * Only load real tokens when recording cassettes
    
    Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
    
    * Add pragma no cover to recording-only branch in conftest
    
    Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
    
    ---------
    
    Co-authored-by: Claude Opus 4.6 (1M context) <[email protected]>
    matin and claude authored Mar 18, 2026
    Configuration menu
    Copy the full SHA
    51d821f View commit details
    Browse the repository at this point in the history
  3. Add /portal/sso/embed step to fix intermittent 401s (#209)

    * Add /portal/sso/embed step to SSO login flow
    
    The iOS app visits /portal/sso/embed after login (and MFA if
    applicable) before calling preauthorized. This sets the Cloudflare
    load balancer cookie (__cflb) that pins subsequent requests to the
    same backend. Without it, preauthorized can hit a different backend
    that doesn't have the session, causing intermittent 401 errors.
    
    Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
    
    * Bump version to 0.7.3
    
    Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
    
    * Disable telemetry before importing garth in tests
    
    The module-level Client() in http.py runs at import time and
    configures logfire when telemetry is enabled (the new default).
    Logfire's background token verification requests interfere with VCR
    cassette matching. Setting the env var before import prevents this.
    
    Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
    
    * Copy cookies from parent session to OAuth1 session
    
    The /portal/sso/embed step sets the Cloudflare LB cookie on
    client.sess, but GarminOAuth1Session wasn't copying cookies from the
    parent session. The preauthorized call would hit a different backend
    without the session context.
    
    Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
    
    ---------
    
    Co-authored-by: Claude Opus 4.6 (1M context) <[email protected]>
    matin and claude authored Mar 18, 2026
    Configuration menu
    Copy the full SHA
    868af84 View commit details
    Browse the repository at this point in the history
Loading