garth 0.5.20.dev0__tar.gz → 0.5.20.dev2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (121) hide show
  1. {garth-0.5.20.dev0 → garth-0.5.20.dev2}/PKG-INFO +1 -1
  2. {garth-0.5.20.dev0 → garth-0.5.20.dev2}/src/garth/data/body_battery/readings.py +9 -6
  3. garth-0.5.20.dev2/src/garth/version.py +1 -0
  4. garth-0.5.20.dev0/src/garth/version.py +0 -1
  5. {garth-0.5.20.dev0 → garth-0.5.20.dev2}/.coderabbit.yaml +0 -0
  6. {garth-0.5.20.dev0 → garth-0.5.20.dev2}/.devcontainer/Dockerfile +0 -0
  7. {garth-0.5.20.dev0 → garth-0.5.20.dev2}/.devcontainer/devcontainer.json +0 -0
  8. {garth-0.5.20.dev0 → garth-0.5.20.dev2}/.devcontainer/noop.txt +0 -0
  9. {garth-0.5.20.dev0 → garth-0.5.20.dev2}/.gitattributes +0 -0
  10. {garth-0.5.20.dev0 → garth-0.5.20.dev2}/.github/dependabot.yml +0 -0
  11. {garth-0.5.20.dev0 → garth-0.5.20.dev2}/.github/workflows/ci.yml +0 -0
  12. {garth-0.5.20.dev0 → garth-0.5.20.dev2}/.github/workflows/publish.yml +0 -0
  13. {garth-0.5.20.dev0 → garth-0.5.20.dev2}/.gitignore +0 -0
  14. {garth-0.5.20.dev0 → garth-0.5.20.dev2}/.markdownlint.json +0 -0
  15. {garth-0.5.20.dev0 → garth-0.5.20.dev2}/.pre-commit-config.yaml +0 -0
  16. {garth-0.5.20.dev0 → garth-0.5.20.dev2}/.vscode/settings.json +0 -0
  17. {garth-0.5.20.dev0 → garth-0.5.20.dev2}/LICENSE +0 -0
  18. {garth-0.5.20.dev0 → garth-0.5.20.dev2}/Makefile +0 -0
  19. {garth-0.5.20.dev0 → garth-0.5.20.dev2}/README.md +0 -0
  20. {garth-0.5.20.dev0 → garth-0.5.20.dev2}/colabs/chatgpt_analysis_of_stats.ipynb +0 -0
  21. {garth-0.5.20.dev0 → garth-0.5.20.dev2}/colabs/sleep.ipynb +0 -0
  22. {garth-0.5.20.dev0 → garth-0.5.20.dev2}/colabs/stress.ipynb +0 -0
  23. {garth-0.5.20.dev0 → garth-0.5.20.dev2}/pyproject.toml +0 -0
  24. {garth-0.5.20.dev0 → garth-0.5.20.dev2}/src/garth/__init__.py +0 -0
  25. {garth-0.5.20.dev0 → garth-0.5.20.dev2}/src/garth/auth_tokens.py +0 -0
  26. {garth-0.5.20.dev0 → garth-0.5.20.dev2}/src/garth/cli.py +0 -0
  27. {garth-0.5.20.dev0 → garth-0.5.20.dev2}/src/garth/data/__init__.py +0 -0
  28. {garth-0.5.20.dev0 → garth-0.5.20.dev2}/src/garth/data/_base.py +0 -0
  29. {garth-0.5.20.dev0 → garth-0.5.20.dev2}/src/garth/data/body_battery/__init__.py +0 -0
  30. {garth-0.5.20.dev0 → garth-0.5.20.dev2}/src/garth/data/body_battery/daily_stress.py +0 -0
  31. {garth-0.5.20.dev0 → garth-0.5.20.dev2}/src/garth/data/body_battery/events.py +0 -0
  32. {garth-0.5.20.dev0 → garth-0.5.20.dev2}/src/garth/data/hrv.py +0 -0
  33. {garth-0.5.20.dev0 → garth-0.5.20.dev2}/src/garth/data/sleep.py +0 -0
  34. {garth-0.5.20.dev0 → garth-0.5.20.dev2}/src/garth/data/weight.py +0 -0
  35. {garth-0.5.20.dev0 → garth-0.5.20.dev2}/src/garth/exc.py +0 -0
  36. {garth-0.5.20.dev0 → garth-0.5.20.dev2}/src/garth/http.py +0 -0
  37. {garth-0.5.20.dev0 → garth-0.5.20.dev2}/src/garth/py.typed +0 -0
  38. {garth-0.5.20.dev0 → garth-0.5.20.dev2}/src/garth/sso.py +0 -0
  39. {garth-0.5.20.dev0 → garth-0.5.20.dev2}/src/garth/stats/__init__.py +0 -0
  40. {garth-0.5.20.dev0 → garth-0.5.20.dev2}/src/garth/stats/_base.py +0 -0
  41. {garth-0.5.20.dev0 → garth-0.5.20.dev2}/src/garth/stats/hrv.py +0 -0
  42. {garth-0.5.20.dev0 → garth-0.5.20.dev2}/src/garth/stats/hydration.py +0 -0
  43. {garth-0.5.20.dev0 → garth-0.5.20.dev2}/src/garth/stats/intensity_minutes.py +0 -0
  44. {garth-0.5.20.dev0 → garth-0.5.20.dev2}/src/garth/stats/sleep.py +0 -0
  45. {garth-0.5.20.dev0 → garth-0.5.20.dev2}/src/garth/stats/steps.py +0 -0
  46. {garth-0.5.20.dev0 → garth-0.5.20.dev2}/src/garth/stats/stress.py +0 -0
  47. {garth-0.5.20.dev0 → garth-0.5.20.dev2}/src/garth/users/__init__.py +0 -0
  48. {garth-0.5.20.dev0 → garth-0.5.20.dev2}/src/garth/users/profile.py +0 -0
  49. {garth-0.5.20.dev0 → garth-0.5.20.dev2}/src/garth/users/settings.py +0 -0
  50. {garth-0.5.20.dev0 → garth-0.5.20.dev2}/src/garth/utils.py +0 -0
  51. {garth-0.5.20.dev0 → garth-0.5.20.dev2}/tests/12129115726_ACTIVITY.fit +0 -0
  52. {garth-0.5.20.dev0 → garth-0.5.20.dev2}/tests/cassettes/test_client_request.yaml +0 -0
  53. {garth-0.5.20.dev0 → garth-0.5.20.dev2}/tests/cassettes/test_connectapi.yaml +0 -0
  54. {garth-0.5.20.dev0 → garth-0.5.20.dev2}/tests/cassettes/test_delete.yaml +0 -0
  55. {garth-0.5.20.dev0 → garth-0.5.20.dev2}/tests/cassettes/test_download.yaml +0 -0
  56. {garth-0.5.20.dev0 → garth-0.5.20.dev2}/tests/cassettes/test_exchange.yaml +0 -0
  57. {garth-0.5.20.dev0 → garth-0.5.20.dev2}/tests/cassettes/test_login_command.yaml +0 -0
  58. {garth-0.5.20.dev0 → garth-0.5.20.dev2}/tests/cassettes/test_login_email_password_fail.yaml +0 -0
  59. {garth-0.5.20.dev0 → garth-0.5.20.dev2}/tests/cassettes/test_login_mfa_fail.yaml +0 -0
  60. {garth-0.5.20.dev0 → garth-0.5.20.dev2}/tests/cassettes/test_login_return_on_mfa.yaml +0 -0
  61. {garth-0.5.20.dev0 → garth-0.5.20.dev2}/tests/cassettes/test_login_success.yaml +0 -0
  62. {garth-0.5.20.dev0 → garth-0.5.20.dev2}/tests/cassettes/test_login_success_mfa.yaml +0 -0
  63. {garth-0.5.20.dev0 → garth-0.5.20.dev2}/tests/cassettes/test_login_success_mfa_async.yaml +0 -0
  64. {garth-0.5.20.dev0 → garth-0.5.20.dev2}/tests/cassettes/test_profile_alias.yaml +0 -0
  65. {garth-0.5.20.dev0 → garth-0.5.20.dev2}/tests/cassettes/test_put.yaml +0 -0
  66. {garth-0.5.20.dev0 → garth-0.5.20.dev2}/tests/cassettes/test_refresh_oauth2_token.yaml +0 -0
  67. {garth-0.5.20.dev0 → garth-0.5.20.dev2}/tests/cassettes/test_resume_login.yaml +0 -0
  68. {garth-0.5.20.dev0 → garth-0.5.20.dev2}/tests/cassettes/test_upload.yaml +0 -0
  69. {garth-0.5.20.dev0 → garth-0.5.20.dev2}/tests/cassettes/test_user_profile.yaml +0 -0
  70. {garth-0.5.20.dev0 → garth-0.5.20.dev2}/tests/cassettes/test_user_settings.yaml +0 -0
  71. {garth-0.5.20.dev0 → garth-0.5.20.dev2}/tests/cassettes/test_user_settings_sleep_windows.yaml +0 -0
  72. {garth-0.5.20.dev0 → garth-0.5.20.dev2}/tests/cassettes/test_username.yaml +0 -0
  73. {garth-0.5.20.dev0 → garth-0.5.20.dev2}/tests/conftest.py +0 -0
  74. {garth-0.5.20.dev0 → garth-0.5.20.dev2}/tests/data/cassettes/test_body_battery_data_get.yaml +0 -0
  75. {garth-0.5.20.dev0 → garth-0.5.20.dev2}/tests/data/cassettes/test_body_battery_data_list.yaml +0 -0
  76. {garth-0.5.20.dev0 → garth-0.5.20.dev2}/tests/data/cassettes/test_body_battery_properties_edge_cases.yaml +0 -0
  77. {garth-0.5.20.dev0 → garth-0.5.20.dev2}/tests/data/cassettes/test_daily_body_battery_stress_get.yaml +0 -0
  78. {garth-0.5.20.dev0 → garth-0.5.20.dev2}/tests/data/cassettes/test_daily_body_battery_stress_get_no_data.yaml +0 -0
  79. {garth-0.5.20.dev0 → garth-0.5.20.dev2}/tests/data/cassettes/test_daily_body_battery_stress_list.yaml +0 -0
  80. {garth-0.5.20.dev0 → garth-0.5.20.dev2}/tests/data/cassettes/test_get_daily_weight_data.yaml +0 -0
  81. {garth-0.5.20.dev0 → garth-0.5.20.dev2}/tests/data/cassettes/test_get_manual_weight_data.yaml +0 -0
  82. {garth-0.5.20.dev0 → garth-0.5.20.dev2}/tests/data/cassettes/test_get_nonexistent_weight_data.yaml +0 -0
  83. {garth-0.5.20.dev0 → garth-0.5.20.dev2}/tests/data/cassettes/test_hrv_data_get.yaml +0 -0
  84. {garth-0.5.20.dev0 → garth-0.5.20.dev2}/tests/data/cassettes/test_hrv_data_list.yaml +0 -0
  85. {garth-0.5.20.dev0 → garth-0.5.20.dev2}/tests/data/cassettes/test_sleep_data_get.yaml +0 -0
  86. {garth-0.5.20.dev0 → garth-0.5.20.dev2}/tests/data/cassettes/test_sleep_data_list.yaml +0 -0
  87. {garth-0.5.20.dev0 → garth-0.5.20.dev2}/tests/data/cassettes/test_weight_data_list.yaml +0 -0
  88. {garth-0.5.20.dev0 → garth-0.5.20.dev2}/tests/data/cassettes/test_weight_data_list_empty.yaml +0 -0
  89. {garth-0.5.20.dev0 → garth-0.5.20.dev2}/tests/data/cassettes/test_weight_data_list_single_day.yaml +0 -0
  90. {garth-0.5.20.dev0 → garth-0.5.20.dev2}/tests/data/test_body_battery_data.py +0 -0
  91. {garth-0.5.20.dev0 → garth-0.5.20.dev2}/tests/data/test_hrv_data.py +0 -0
  92. {garth-0.5.20.dev0 → garth-0.5.20.dev2}/tests/data/test_sleep_data.py +0 -0
  93. {garth-0.5.20.dev0 → garth-0.5.20.dev2}/tests/data/test_weight_data.py +0 -0
  94. {garth-0.5.20.dev0 → garth-0.5.20.dev2}/tests/stats/cassettes/test_daily_hrv.yaml +0 -0
  95. {garth-0.5.20.dev0 → garth-0.5.20.dev2}/tests/stats/cassettes/test_daily_hrv_no_results.yaml +0 -0
  96. {garth-0.5.20.dev0 → garth-0.5.20.dev2}/tests/stats/cassettes/test_daily_hrv_paginate.yaml +0 -0
  97. {garth-0.5.20.dev0 → garth-0.5.20.dev2}/tests/stats/cassettes/test_daily_hrv_paginate_no_results.yaml +0 -0
  98. {garth-0.5.20.dev0 → garth-0.5.20.dev2}/tests/stats/cassettes/test_daily_hydration.yaml +0 -0
  99. {garth-0.5.20.dev0 → garth-0.5.20.dev2}/tests/stats/cassettes/test_daily_intensity_minutes.yaml +0 -0
  100. {garth-0.5.20.dev0 → garth-0.5.20.dev2}/tests/stats/cassettes/test_daily_sleep.yaml +0 -0
  101. {garth-0.5.20.dev0 → garth-0.5.20.dev2}/tests/stats/cassettes/test_daily_steps.yaml +0 -0
  102. {garth-0.5.20.dev0 → garth-0.5.20.dev2}/tests/stats/cassettes/test_daily_stress.yaml +0 -0
  103. {garth-0.5.20.dev0 → garth-0.5.20.dev2}/tests/stats/cassettes/test_daily_stress_pagination.yaml +0 -0
  104. {garth-0.5.20.dev0 → garth-0.5.20.dev2}/tests/stats/cassettes/test_weekly_intensity_minutes.yaml +0 -0
  105. {garth-0.5.20.dev0 → garth-0.5.20.dev2}/tests/stats/cassettes/test_weekly_steps.yaml +0 -0
  106. {garth-0.5.20.dev0 → garth-0.5.20.dev2}/tests/stats/cassettes/test_weekly_stress.yaml +0 -0
  107. {garth-0.5.20.dev0 → garth-0.5.20.dev2}/tests/stats/cassettes/test_weekly_stress_beyond_data.yaml +0 -0
  108. {garth-0.5.20.dev0 → garth-0.5.20.dev2}/tests/stats/cassettes/test_weekly_stress_pagination.yaml +0 -0
  109. {garth-0.5.20.dev0 → garth-0.5.20.dev2}/tests/stats/test_hrv.py +0 -0
  110. {garth-0.5.20.dev0 → garth-0.5.20.dev2}/tests/stats/test_hydration.py +0 -0
  111. {garth-0.5.20.dev0 → garth-0.5.20.dev2}/tests/stats/test_intensity_minutes.py +0 -0
  112. {garth-0.5.20.dev0 → garth-0.5.20.dev2}/tests/stats/test_sleep_stats.py +0 -0
  113. {garth-0.5.20.dev0 → garth-0.5.20.dev2}/tests/stats/test_steps.py +0 -0
  114. {garth-0.5.20.dev0 → garth-0.5.20.dev2}/tests/stats/test_stress.py +0 -0
  115. {garth-0.5.20.dev0 → garth-0.5.20.dev2}/tests/test_auth_tokens.py +0 -0
  116. {garth-0.5.20.dev0 → garth-0.5.20.dev2}/tests/test_cli.py +0 -0
  117. {garth-0.5.20.dev0 → garth-0.5.20.dev2}/tests/test_http.py +0 -0
  118. {garth-0.5.20.dev0 → garth-0.5.20.dev2}/tests/test_sso.py +0 -0
  119. {garth-0.5.20.dev0 → garth-0.5.20.dev2}/tests/test_users.py +0 -0
  120. {garth-0.5.20.dev0 → garth-0.5.20.dev2}/tests/test_utils.py +0 -0
  121. {garth-0.5.20.dev0 → garth-0.5.20.dev2}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: garth
3
- Version: 0.5.20.dev0
3
+ Version: 0.5.20.dev2
4
4
  Summary: Garmin SSO auth + Connect client
5
5
  Project-URL: Homepage, https://github.com/matin/garth
6
6
  Project-URL: Repository, https://github.com/matin/garth
@@ -8,8 +8,8 @@ class BodyBatteryReading:
8
8
  """Individual Body Battery reading."""
9
9
 
10
10
  timestamp: int
11
- status: str | None = None
12
- level: int | None = None
11
+ status: str
12
+ level: int
13
13
  version: float
14
14
 
15
15
 
@@ -29,12 +29,15 @@ def parse_body_battery_readings(
29
29
  for values in body_battery_values_array or []:
30
30
  # Each reading requires 4 values: timestamp, status, level, version
31
31
  if len(values) >= 4:
32
+ timestamp, status, level, version = values
33
+ if not level or not status:
34
+ continue
32
35
  readings.append(
33
36
  BodyBatteryReading(
34
- timestamp=values[0],
35
- status=values[1],
36
- level=values[2],
37
- version=values[3],
37
+ timestamp=timestamp,
38
+ status=status,
39
+ level=level,
40
+ version=version,
38
41
  )
39
42
  )
40
43
  # Sort readings by timestamp to ensure chronological order
@@ -0,0 +1 @@
1
+ __version__ = "0.5.20.dev2"
@@ -1 +0,0 @@
1
- __version__ = "0.5.20.dev0"
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes