Habiticalib 0.3.3__tar.gz → 0.3.4__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 (79) hide show
  1. {habiticalib-0.3.3 → habiticalib-0.3.4}/.github/workflows/build.yml +4 -6
  2. {habiticalib-0.3.3 → habiticalib-0.3.4}/PKG-INFO +1 -1
  3. {habiticalib-0.3.3 → habiticalib-0.3.4}/pyproject.toml +30 -11
  4. {habiticalib-0.3.3 → habiticalib-0.3.4}/src/habiticalib/__init__.py +2 -2
  5. habiticalib-0.3.4/src/habiticalib/const.py +48 -0
  6. {habiticalib-0.3.3 → habiticalib-0.3.4}/src/habiticalib/lib.py +23 -17
  7. {habiticalib-0.3.3 → habiticalib-0.3.4}/src/habiticalib/types.py +4 -3
  8. habiticalib-0.3.4/tests/__snapshots__/test_avatar/test_generate_avatar.png +0 -0
  9. habiticalib-0.3.4/tests/__snapshots__/test_avatar/test_generate_avatar_from_styles[animated_background].png +0 -0
  10. habiticalib-0.3.4/tests/__snapshots__/test_avatar/test_generate_avatar_from_styles[default].png +0 -0
  11. habiticalib-0.3.4/tests/__snapshots__/test_avatar/test_generate_avatar_from_styles[kickstarter_backer_gear].png +0 -0
  12. habiticalib-0.3.4/tests/__snapshots__/test_avatar/test_generate_avatar_from_styles[kickstarter_pet_mount].png +0 -0
  13. habiticalib-0.3.4/tests/__snapshots__/test_avatar/test_generate_avatar_from_styles[seafoam].png +0 -0
  14. habiticalib-0.3.4/tests/__snapshots__/test_avatar/test_generate_avatar_from_styles[shinySeed].png +0 -0
  15. habiticalib-0.3.4/tests/__snapshots__/test_avatar/test_generate_avatar_from_styles[sleeping].png +0 -0
  16. habiticalib-0.3.4/tests/__snapshots__/test_avatar/test_generate_avatar_from_styles[snowball].png +0 -0
  17. habiticalib-0.3.4/tests/__snapshots__/test_avatar/test_generate_avatar_from_styles[special_0].png +0 -0
  18. habiticalib-0.3.4/tests/__snapshots__/test_avatar/test_generate_avatar_from_styles[special_1].png +0 -0
  19. habiticalib-0.3.4/tests/__snapshots__/test_avatar/test_generate_avatar_from_styles[spookySparkles].png +0 -0
  20. habiticalib-0.3.4/tests/__snapshots__/test_avatar/test_generate_avatar_from_styles[weapon_critical].png +0 -0
  21. habiticalib-0.3.4/tests/__snapshots__/test_avatar/test_generate_avatar_from_styles[with_chair].png +0 -0
  22. habiticalib-0.3.4/tests/__snapshots__/test_avatar/test_generate_avatar_to_file.png +0 -0
  23. habiticalib-0.3.4/tests/__snapshots__/test_avatar.ambr +4 -0
  24. habiticalib-0.3.4/tests/__snapshots__/test_login.ambr +4 -0
  25. habiticalib-0.3.4/tests/__snapshots__/test_tasks.ambr +19 -0
  26. habiticalib-0.3.3/tests/__snapshots__/test_lib.ambr → habiticalib-0.3.4/tests/__snapshots__/test_user.ambr +4 -4
  27. habiticalib-0.3.4/tests/conftest.py +126 -0
  28. habiticalib-0.3.4/tests/fixtures/empty_data.json +27 -0
  29. habiticalib-0.3.4/tests/fixtures/task.json +67 -0
  30. habiticalib-0.3.4/tests/fixtures/task_order.json +35 -0
  31. habiticalib-0.3.4/tests/fixtures/tasks.json +913 -0
  32. habiticalib-0.3.4/tests/fixtures/user_anonymized.json +1791 -0
  33. habiticalib-0.3.4/tests/fixtures/user_styles_animated_background.json +57 -0
  34. habiticalib-0.3.4/tests/fixtures/user_styles_kickstarter.json +57 -0
  35. habiticalib-0.3.3/tests/fixtures/user_styles_kickstarter.json → habiticalib-0.3.4/tests/fixtures/user_styles_kickstarter_pets.json +1 -1
  36. {habiticalib-0.3.3 → habiticalib-0.3.4}/tests/fixtures/user_styles_seafoam.json +3 -3
  37. {habiticalib-0.3.3 → habiticalib-0.3.4}/tests/fixtures/user_styles_shinySeed.json +4 -4
  38. {habiticalib-0.3.3 → habiticalib-0.3.4}/tests/fixtures/user_styles_sleeping.json +2 -2
  39. {habiticalib-0.3.3 → habiticalib-0.3.4}/tests/fixtures/user_styles_snowball.json +3 -3
  40. habiticalib-0.3.4/tests/fixtures/user_styles_special_0.json +57 -0
  41. habiticalib-0.3.4/tests/fixtures/user_styles_special_1.json +57 -0
  42. {habiticalib-0.3.3 → habiticalib-0.3.4}/tests/fixtures/user_styles_spookySparkles.json +3 -3
  43. habiticalib-0.3.4/tests/fixtures/user_styles_weapon_critical.json +57 -0
  44. {habiticalib-0.3.3 → habiticalib-0.3.4}/tests/fixtures/user_styles_with_chair.json +14 -14
  45. habiticalib-0.3.4/tests/test_avatar.py +110 -0
  46. habiticalib-0.3.4/tests/test_login.py +18 -0
  47. habiticalib-0.3.4/tests/test_tasks.py +329 -0
  48. habiticalib-0.3.4/tests/test_user.py +53 -0
  49. habiticalib-0.3.3/src/habiticalib/const.py +0 -18
  50. habiticalib-0.3.3/tests/__snapshots__/test_avatar.ambr +0 -28
  51. habiticalib-0.3.3/tests/conftest.py +0 -49
  52. habiticalib-0.3.3/tests/test_avatar.py +0 -100
  53. habiticalib-0.3.3/tests/test_init.py +0 -16
  54. habiticalib-0.3.3/tests/test_lib.py +0 -30
  55. {habiticalib-0.3.3 → habiticalib-0.3.4}/.cruft.json +0 -0
  56. {habiticalib-0.3.3 → habiticalib-0.3.4}/.editorconfig +0 -0
  57. {habiticalib-0.3.3 → habiticalib-0.3.4}/.github/FUNDING.yml +0 -0
  58. {habiticalib-0.3.3 → habiticalib-0.3.4}/.github/dependabot.yml +0 -0
  59. {habiticalib-0.3.3 → habiticalib-0.3.4}/.github/labels.yml +0 -0
  60. {habiticalib-0.3.3 → habiticalib-0.3.4}/.github/release-drafter.yml +0 -0
  61. {habiticalib-0.3.3 → habiticalib-0.3.4}/.github/workflows/documentation.yml +0 -0
  62. {habiticalib-0.3.3 → habiticalib-0.3.4}/.github/workflows/draft.yml +0 -0
  63. {habiticalib-0.3.3 → habiticalib-0.3.4}/.github/workflows/labeler.yml +0 -0
  64. {habiticalib-0.3.3 → habiticalib-0.3.4}/.gitignore +0 -0
  65. {habiticalib-0.3.3 → habiticalib-0.3.4}/.pre-commit-config.yaml +0 -0
  66. {habiticalib-0.3.3 → habiticalib-0.3.4}/.vscode/settings.json +0 -0
  67. {habiticalib-0.3.3 → habiticalib-0.3.4}/LICENSE +0 -0
  68. {habiticalib-0.3.3 → habiticalib-0.3.4}/README.md +0 -0
  69. {habiticalib-0.3.3 → habiticalib-0.3.4}/docs/index.md +0 -0
  70. {habiticalib-0.3.3 → habiticalib-0.3.4}/docs/reference/habiticalib.md +0 -0
  71. {habiticalib-0.3.3 → habiticalib-0.3.4}/mkdocs.yml +0 -0
  72. {habiticalib-0.3.3 → habiticalib-0.3.4}/src/habiticalib/exceptions.py +0 -0
  73. {habiticalib-0.3.3 → habiticalib-0.3.4}/src/habiticalib/ha.py +0 -0
  74. {habiticalib-0.3.3 → habiticalib-0.3.4}/src/habiticalib/helpers.py +0 -0
  75. {habiticalib-0.3.3 → habiticalib-0.3.4}/src/habiticalib/py.typed +0 -0
  76. {habiticalib-0.3.3 → habiticalib-0.3.4}/tests/__init__.py +0 -0
  77. {habiticalib-0.3.3 → habiticalib-0.3.4}/tests/fixtures/login.json +0 -0
  78. {habiticalib-0.3.3 → habiticalib-0.3.4}/tests/fixtures/user.json +0 -0
  79. {habiticalib-0.3.3 → habiticalib-0.3.4}/tests/fixtures/user_styles.json +0 -0
@@ -8,7 +8,7 @@ jobs:
8
8
  runs-on: ubuntu-latest
9
9
  strategy:
10
10
  matrix:
11
- python_version: ['3.12']
11
+ python_version: ["3.12"]
12
12
 
13
13
  steps:
14
14
  - uses: actions/checkout@v4
@@ -17,16 +17,14 @@ jobs:
17
17
  with:
18
18
  python-version: ${{ matrix.python_version }}
19
19
  - name: Install dependencies
20
- run: |
21
- python -m pip install --upgrade pip
22
- pip install hatch
23
- hatch env create
20
+ run: pipx install hatch
24
21
  - name: Lint and typecheck
25
22
  run: |
26
23
  hatch run lint-check
27
24
  - name: Test
28
25
  run: |
29
- hatch run test-cov-xml
26
+ hatch test --all
27
+
30
28
  - uses: codecov/codecov-action@v5
31
29
  with:
32
30
  token: ${{ secrets.CODECOV_TOKEN }}
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: Habiticalib
3
- Version: 0.3.3
3
+ Version: 0.3.4
4
4
  Summary: Asynchronous Python client library for the Habitica API
5
5
  Project-URL: Documentation, https://tr4nt0r.github.io/habiticalib/
6
6
  Project-URL: Source, https://github.com/tr4nt0r/habiticalib
@@ -4,7 +4,7 @@ line-length = 88
4
4
 
5
5
  [tool.ruff.lint]
6
6
  select = ["ALL"]
7
- ignore = ["TRY003", "D202", "D213", "D417", "ANN003", "ANN401", "E501", "COM812", "ISC001"]
7
+ ignore = ["TRY003", "D202", "D213", "D417", "ANN003", "ANN401", "E501", "COM812", "ISC001", "A005"]
8
8
 
9
9
  [tool.ruff.lint.isort]
10
10
  force-sort-within-sections = true
@@ -32,6 +32,7 @@ testpaths = ["tests"]
32
32
  pythonpath = ["src"]
33
33
  addopts = "--cov=src/habiticalib --cov-report=term-missing"
34
34
  asyncio_mode = "auto"
35
+ asyncio_default_fixture_loop_scope = "function"
35
36
 
36
37
  [tool.pylint.DESIGN]
37
38
  max-attributes = 8
@@ -53,6 +54,11 @@ ignore-imports = true
53
54
  [tool.pylint.FORMAT]
54
55
  max-line-length = 88
55
56
 
57
+ [tool.coverage.report]
58
+ exclude_lines = [
59
+ "if TYPE_CHECKING:",
60
+ ]
61
+
56
62
  [tool.hatch]
57
63
 
58
64
  [tool.hatch.metadata]
@@ -68,20 +74,33 @@ python = "3.12"
68
74
  dependencies = [
69
75
  "aiohttp==3.11.11",
70
76
  "mashumaro==3.15",
71
- "orjson==3.10.12",
72
- "Pillow==11.0.0",
73
- "mypy==1.14.0",
74
- "ruff==0.8.4",
77
+ "orjson==3.10.15",
78
+ "Pillow==11.1.0",
79
+ "mypy==1.14.1",
80
+ "ruff==0.9.4",
75
81
  "pytest==8.3.4",
76
82
  "pytest-cov==6.0.0",
77
- "mkdocs-material==9.5.49",
83
+ "mkdocs-material==9.6.1",
78
84
  "mkdocstrings[python]==0.27.0",
79
- "pytest-asyncio==0.25.0",
80
- "aioresponses==0.7.7",
81
- "pre-commit==4.0.1",
82
- "syrupy==4.8.0"
85
+ "pytest-asyncio==0.25.3",
86
+ "aioresponses==0.7.8",
87
+ "pre-commit==4.1.0",
88
+ "syrupy==4.8.1"
83
89
  ]
84
- installer = "uv"
90
+
91
+ [tool.hatch.envs.hatch-test]
92
+ parallel = true
93
+ extra-dependencies = [
94
+ "aioresponses==0.7.8",
95
+ "pytest-asyncio==0.25.3",
96
+ "syrupy==4.8.1",
97
+ "pytest-cov==6.0.0",
98
+ ]
99
+ extra-args = ["--cov-report=xml", "-vv"]
100
+ type = "virtual"
101
+
102
+ [[tool.hatch.envs.hatch-test.matrix]]
103
+ python = ["3.13", "3.12"]
85
104
 
86
105
  [tool.hatch.envs.default.scripts]
87
106
  test = "pytest"
@@ -33,7 +33,7 @@ from .types import (
33
33
  HabiticaTaskOrderResponse,
34
34
  HabiticaTaskResponse,
35
35
  HabiticaTasksResponse,
36
- HabiticaUserAnonymizedrResponse,
36
+ HabiticaUserAnonymizedResponse,
37
37
  HabiticaUserExport,
38
38
  HabiticaUserResponse,
39
39
  Language,
@@ -82,7 +82,7 @@ __all__ = [
82
82
  "HabiticaTaskOrderResponse",
83
83
  "HabiticaTaskResponse",
84
84
  "HabiticaTasksResponse",
85
- "HabiticaUserAnonymizedrResponse",
85
+ "HabiticaUserAnonymizedResponse",
86
86
  "HabiticaUserExport",
87
87
  "HabiticaUserResponse",
88
88
  "Language",
@@ -0,0 +1,48 @@
1
+ """Constants for Habiticalib."""
2
+
3
+ __version__ = "0.3.4"
4
+
5
+ DEFAULT_URL = "https://habitica.com/"
6
+ ASSETS_URL = "https://habitica-assets.s3.amazonaws.com/mobileApp/images/"
7
+
8
+ DEVELOPER_ID = "4c4ca53f-c059-4ffa-966e-9d29dd405daf"
9
+
10
+ # Assets that doesn't follow name conventions like 2019 Kickstarter gear
11
+ # https://github.com/HabitRPG/habitica/blob/develop/website/client/src/assets/css/sprites.css
12
+ SPECIAL_ASSETS = {
13
+ "armor_special_ks2019": "BackerOnly-Equip-MythicGryphonArmor.gif",
14
+ "back_special_heroicAureole": "back_special_heroicAureole.gif",
15
+ "background_airship": "background_airship.gif",
16
+ "background_clocktower": "background_clocktower.gif",
17
+ "background_steamworks": "background_steamworks.gif",
18
+ "broad_armor_special_0": "BackerOnly-Equip-ShadeArmor.gif",
19
+ "broad_armor_special_1": "ContributorOnly-Equip-CrystalArmor.gif",
20
+ "broad_armor_special_ks2019": "BackerOnly-Equip-MythicGryphonArmor.gif",
21
+ "eyewear_special_ks2019": "BackerOnly-Equip-MythicGryphonVisor.gif",
22
+ "head_special_0": "BackerOnly-Equip-ShadeHelmet.gif",
23
+ "head_special_1": "ContributorOnly-Equip-CrystalHelmet.gif",
24
+ "head_special_ks2019": "BackerOnly-Equip-MythicGryphonHelm.gif",
25
+ "Mount_Body_Gryphon-Gryphatrice": "BackerOnly-Mount-Body-Gryphatrice.gif",
26
+ "Mount_Head_Gryphon-Gryphatrice": "BackerOnly-Mount-Head-Gryphatrice.gif",
27
+ "Pet-Gryphatrice-Jubilant": "Pet-Gryphatrice-Jubilant.gif",
28
+ "Pet-Gryphon-Gryphatrice": "BackerOnly-Pet-Gryphatrice.gif",
29
+ "Pet-Wolf-Cerberus": "BackerOnly-Pet-CerberusPup.gif",
30
+ "shield_special_0": "BackerOnly-Shield-TormentedSkull.gif",
31
+ "shield_special_ks2019": "BackerOnly-Equip-MythicGryphonShield.gif",
32
+ "slim_armor_special_0": "BackerOnly-Equip-ShadeArmor.gif",
33
+ "slim_armor_special_1": "ContributorOnly-Equip-CrystalArmor.gif",
34
+ "slim_armor_special_ks2019": "BackerOnly-Equip-MythicGryphonArmor.gif",
35
+ "weapon_special_0": "BackerOnly-Weapon-DarkSoulsBlade.gif",
36
+ "weapon_special_critical": "weapon_special_critical.gif",
37
+ "weapon_special_ks2019": "BackerOnly-Equip-MythicGryphonGlaive.gif",
38
+ }
39
+
40
+ SPECIAL_ASSETS_OFFSET = {
41
+ "head_special_0": (-3, -18),
42
+ "weapon_special_0": (-3, -18),
43
+ "weapon_special_critical": (-12, 12),
44
+ "weapon_special_1": (-12, 0),
45
+ "head_special_1": (0, 3),
46
+ }
47
+
48
+ PAGE_LIMIT = 60
@@ -6,6 +6,7 @@ import asyncio
6
6
  from http import HTTPStatus
7
7
  from io import BytesIO
8
8
  import logging
9
+ from operator import add
9
10
  from typing import IO, TYPE_CHECKING, Any, Self
10
11
 
11
12
  from aiohttp import ClientError, ClientResponseError, ClientSession
@@ -13,7 +14,13 @@ from habitipy.aio import HabitipyAsync # type: ignore[import-untyped]
13
14
  from PIL import Image
14
15
  from yarl import URL
15
16
 
16
- from .const import ASSETS_URL, BACKER_ONLY_GEAR, DEFAULT_URL, PAGE_LIMIT
17
+ from .const import (
18
+ ASSETS_URL,
19
+ DEFAULT_URL,
20
+ PAGE_LIMIT,
21
+ SPECIAL_ASSETS,
22
+ SPECIAL_ASSETS_OFFSET,
23
+ )
17
24
  from .exceptions import (
18
25
  BadRequestError,
19
26
  NotAuthorizedError,
@@ -47,7 +54,7 @@ from .types import (
47
54
  HabiticaTaskOrderResponse,
48
55
  HabiticaTaskResponse,
49
56
  HabiticaTasksResponse,
50
- HabiticaUserAnonymizedrResponse,
57
+ HabiticaUserAnonymizedResponse,
51
58
  HabiticaUserExport,
52
59
  HabiticaUserResponse,
53
60
  Language,
@@ -113,7 +120,7 @@ class Habitica:
113
120
  async def _request(self, method: str, url: URL, **kwargs) -> str:
114
121
  """Handle API request."""
115
122
  async with self._session.request(
116
- method,
123
+ method.upper(),
117
124
  url,
118
125
  headers=self._headers,
119
126
  **kwargs,
@@ -255,7 +262,7 @@ class Habitica:
255
262
 
256
263
  async def get_user_anonymized(
257
264
  self,
258
- ) -> HabiticaUserAnonymizedrResponse:
265
+ ) -> HabiticaUserAnonymizedResponse:
259
266
  """Get the authenticated user's anonymized profile.
260
267
 
261
268
  This method retrieves the user's profile data while excluding sensitive
@@ -292,7 +299,7 @@ class Habitica:
292
299
 
293
300
  url = url / "anonymized"
294
301
 
295
- return HabiticaUserAnonymizedrResponse.from_json(
302
+ return HabiticaUserAnonymizedResponse.from_json(
296
303
  await self._request("get", url=url),
297
304
  )
298
305
 
@@ -1808,9 +1815,9 @@ class Habitica:
1808
1815
  -------
1809
1816
  None
1810
1817
  """
1811
- url = URL(ASSETS_URL) / f"{asset}"
1812
- if not url.suffix:
1813
- url = url.with_suffix(".png")
1818
+
1819
+ url = URL(ASSETS_URL) / SPECIAL_ASSETS.get(asset, f"{asset}.png")
1820
+
1814
1821
  try:
1815
1822
  if not (asset_data := self._assets_cache.get(asset)):
1816
1823
  async with self._session.get(url) as r:
@@ -1819,18 +1826,20 @@ class Habitica:
1819
1826
  self._cache_asset(asset, asset_data)
1820
1827
  except ClientResponseError as e:
1821
1828
  _LOGGER.exception(
1822
- "Failed to load %s.png due to error [%s]: %s",
1829
+ "Failed to load %s due to error [%s]: %s",
1823
1830
  asset,
1824
1831
  e.status,
1825
1832
  e.message,
1826
1833
  )
1827
1834
  except ClientError:
1828
1835
  _LOGGER.exception(
1829
- "Failed to load %s.png due to a request error",
1836
+ "Failed to load %s due to a request error",
1830
1837
  asset,
1831
1838
  )
1832
1839
  else:
1833
1840
  fetched_image = Image.open(asset_data).convert("RGBA")
1841
+ if offset := SPECIAL_ASSETS_OFFSET.get(asset):
1842
+ position = tuple(map(add, position, offset))
1834
1843
  image.paste(fetched_image, position, fetched_image)
1835
1844
 
1836
1845
  async def generate_avatar( # noqa: PLR0912, PLR0915
@@ -1895,11 +1904,8 @@ class Habitica:
1895
1904
  )
1896
1905
  gear = getattr(gear_set, gear_type)
1897
1906
  if gear and gear != f"{gear_type}_base_0":
1898
- # 2019 Kickstarter gear doesn't follow name conventions
1899
- if special_ks2019 := BACKER_ONLY_GEAR.get(gear):
1900
- gear = special_ks2019
1901
1907
  # armor has slim and broad size options
1902
- elif gear_type == "armor":
1908
+ if gear_type == "armor":
1903
1909
  gear = f"{preferences.size}_{gear}"
1904
1910
  await self.paste_image(image, gear, (24, mount_offset_y))
1905
1911
 
@@ -1928,7 +1934,7 @@ class Habitica:
1928
1934
  ):
1929
1935
  if stats.buffs.spookySparkles:
1930
1936
  await self.paste_image(image, "ghost", (24, mount_offset_y))
1931
- if stats.buffs.shinySeed:
1937
+ if stats.buffs.snowball:
1932
1938
  await self.paste_image(
1933
1939
  image,
1934
1940
  f"avatar_snowball_{stats.Class}",
@@ -1961,7 +1967,7 @@ class Habitica:
1961
1967
  await self.paste_image(
1962
1968
  image,
1963
1969
  f"chair_{preferences.chair}",
1964
- (24, 0),
1970
+ (24, mount_offset_y),
1965
1971
  )
1966
1972
 
1967
1973
  # Fetch and paste the back accessory
@@ -1970,7 +1976,7 @@ class Habitica:
1970
1976
  # Fetch and paste the skin
1971
1977
  await self.paste_image(
1972
1978
  image,
1973
- f"skin_{preferences.skin}{"_sleep" if preferences.sleep else ""}",
1979
+ f"skin_{preferences.skin}{'_sleep' if preferences.sleep else ''}",
1974
1980
  (24, mount_offset_y),
1975
1981
  )
1976
1982
 
@@ -903,6 +903,7 @@ class Task(TypedDict("Task", {"type": NotRequired[TaskType]}), total=True):
903
903
  weeksOfMonth: NotRequired[list[int]]
904
904
  completed: NotRequired[bool]
905
905
  streak: NotRequired[int]
906
+ value: NotRequired[float]
906
907
 
907
908
 
908
909
  @dataclass(kw_only=True)
@@ -914,7 +915,7 @@ class TaskData:
914
915
  Type: TaskType | None = field(default=None, metadata=field_options(alias="type"))
915
916
  text: str | None = None
916
917
  notes: str | None = None
917
- tags: list[UUID] | None = None
918
+ tags: list[UUID] = field(default_factory=list)
918
919
  value: float | None = None
919
920
  priority: TaskPriority | None = None
920
921
  attribute: Attributes | None = None
@@ -929,7 +930,7 @@ class TaskData:
929
930
  counterUp: int | None = None
930
931
  counterDown: int | None = None
931
932
  frequency: Frequency | None = None
932
- history: list[EntryHistory] | None = None
933
+ history: list[EntryHistory] = field(default_factory=list)
933
934
  alias: str | None = None
934
935
  everyX: int | None = None
935
936
  startDate: datetime | None = None
@@ -1059,7 +1060,7 @@ class UserAnonymizedData:
1059
1060
 
1060
1061
 
1061
1062
  @dataclass(kw_only=True)
1062
- class HabiticaUserAnonymizedrResponse(DataClassORJSONMixin):
1063
+ class HabiticaUserAnonymizedResponse(DataClassORJSONMixin):
1063
1064
  """Representation of a anonymized user data export."""
1064
1065
 
1065
1066
  data: UserAnonymizedData
@@ -0,0 +1,4 @@
1
+ # serializer version: 1
2
+ # name: test_generate_avatar
3
+ UserStyles(items=ItemsUserStyles(gear=GearItemsUserStyles(equipped=EquippedGear(weapon='weapon_special_fall2024Warrior', armor='armor_special_fall2024Warrior', head='head_special_fall2024Warrior', shield='shield_special_fall2024Warrior', back='back_mystery_201402', headAccessory='headAccessory_special_pinkHeadband', eyewear='eyewear_special_pinkHalfMoon', body='body_mystery_202003'), costume=EquippedGear(weapon=None, armor='armor_base_0', head='head_base_0', shield='shield_base_0', back=None, headAccessory=None, eyewear=None, body=None)), currentMount='Velociraptor-Base', currentPet='Rat-Shade'), preferences=PreferencesUserStyles(hair=HairPreferences(color='red', base=3, bangs=1, beard=0, mustache=0, flower=1), size='slim', skin='915533', shirt='blue', chair='none', costume=False, sleep=False, background='violet'), stats=StatsUserStyles(buffs=BuffsUserStyles(per=0, con=0, stealth=0, seafoam=False, shinySeed=False, snowball=False, spookySparkles=False), Class=<HabiticaClass.WARRIOR: 'warrior'>))
4
+ # ---
@@ -0,0 +1,4 @@
1
+ # serializer version: 1
2
+ # name: test_login
3
+ HabiticaLoginResponse(data=LoginData(id=UUID('a380546a-94be-4b8e-8a0b-23e0d5c03303'), apiToken='cd0e5985-17de-4b4f-849e-5d506c5e4382', newUser=False, username='test-username', passwordResetCode=None), success=True, notifications=[], userV=None, appVersion='5.30.0')
4
+ # ---
@@ -0,0 +1,19 @@
1
+ # serializer version: 1
2
+ # name: test_create_task_response
3
+ HabiticaTaskResponse(data=TaskData(challenge=Challenge(id=None, taskId=None, shortName=None, broken=None, winner=None), group=GroupTask(assignedUsers=[], id=None, assignedDate=None, assigningUsername=None, assignedUsersDetail={}, taskId=None, managerNotes=None, completedBy=CompletedBy(userId=None, date=None)), Type=<TaskType.HABIT: 'habit'>, text='task text', notes='task notes', tags=[], value=0.0, priority=<TaskPriority.EASY: 1>, attribute=<Attributes.STR: 'str'>, byHabitica=False, createdAt=datetime.datetime(2024, 9, 22, 16, 41, 39, 555000, tzinfo=datetime.timezone.utc), updatedAt=datetime.datetime(2024, 10, 26, 16, 48, 8, 742000, tzinfo=datetime.timezone.utc), date=None, id=UUID('7bc0d924-f5e5-48a6-af7f-8075f8c94e0f'), userId=UUID('2a61fddc-654f-4ded-b906-bb8a6da680d5'), up=True, down=False, counterUp=0, counterDown=0, frequency=<Frequency.DAILY: 'daily'>, history=[EntryHistory(date=datetime.datetime(2024, 10, 7, 19, 19, 47, 306000, tzinfo=datetime.timezone.utc), value=1.0, scoredUp=1, scoredDown=0, isDue=None, completed=None), EntryHistory(date=datetime.datetime(2024, 10, 16, 20, 19, 11, 168000, tzinfo=datetime.timezone.utc), value=8.184193475367, scoredUp=9, scoredDown=0, isDue=None, completed=None)], alias='counter_test', everyX=None, startDate=None, streak=None, reminders=[], daysOfMonth=[], weeksOfMonth=[], nextDue=[], yesterDaily=None, completed=None, collapseChecklist=False, checklist=[], isDue=None, repeat=Repeat(m=True, t=True, w=True, th=False, f=False, s=False, su=False)), success=True, notifications=[NotificationsUser(Type='ITEM_RECEIVED', data={'icon': 'notif_orca_mount', 'title': 'Orcas for Summer Splash!', 'text': "To celebrate Summer Splash, we've given you an Orca Mount!", 'destination': 'stable'}, seen=True, id=UUID('b7a85df1-06ed-4ab1-b56d-43418fc6a5e5')), NotificationsUser(Type='UNALLOCATED_STATS_POINTS', data={'points': 2}, seen=True, id=UUID('bc3f8a69-231f-4eb1-ba48-a00b6c0e0f37'))], userV=589, appVersion='5.28.6')
4
+ # ---
5
+ # name: test_delete_task
6
+ HabiticaResponse(data=None, success=True, notifications=[NotificationsUser(Type='ITEM_RECEIVED', data={'icon': 'notif_orca_mount', 'title': 'Orcas for Summer Splash!', 'text': "To celebrate Summer Splash, we've given you an Orca Mount!", 'destination': 'stable'}, seen=True, id=UUID('b7a85df1-06ed-4ab1-b56d-43418fc6a5e5')), NotificationsUser(Type='UNALLOCATED_STATS_POINTS', data={'points': 2}, seen=True, id=UUID('bc3f8a69-231f-4eb1-ba48-a00b6c0e0f37'))], userV=589, appVersion='5.28.6')
7
+ # ---
8
+ # name: test_get_task
9
+ HabiticaTaskResponse(data=TaskData(challenge=Challenge(id=None, taskId=None, shortName=None, broken=None, winner=None), group=GroupTask(assignedUsers=[], id=None, assignedDate=None, assigningUsername=None, assignedUsersDetail={}, taskId=None, managerNotes=None, completedBy=CompletedBy(userId=None, date=None)), Type=<TaskType.HABIT: 'habit'>, text='task text', notes='task notes', tags=[], value=0.0, priority=<TaskPriority.EASY: 1>, attribute=<Attributes.STR: 'str'>, byHabitica=False, createdAt=datetime.datetime(2024, 9, 22, 16, 41, 39, 555000, tzinfo=datetime.timezone.utc), updatedAt=datetime.datetime(2024, 10, 26, 16, 48, 8, 742000, tzinfo=datetime.timezone.utc), date=None, id=UUID('7bc0d924-f5e5-48a6-af7f-8075f8c94e0f'), userId=UUID('2a61fddc-654f-4ded-b906-bb8a6da680d5'), up=True, down=False, counterUp=0, counterDown=0, frequency=<Frequency.DAILY: 'daily'>, history=[EntryHistory(date=datetime.datetime(2024, 10, 7, 19, 19, 47, 306000, tzinfo=datetime.timezone.utc), value=1.0, scoredUp=1, scoredDown=0, isDue=None, completed=None), EntryHistory(date=datetime.datetime(2024, 10, 16, 20, 19, 11, 168000, tzinfo=datetime.timezone.utc), value=8.184193475367, scoredUp=9, scoredDown=0, isDue=None, completed=None)], alias='counter_test', everyX=None, startDate=None, streak=None, reminders=[], daysOfMonth=[], weeksOfMonth=[], nextDue=[], yesterDaily=None, completed=None, collapseChecklist=False, checklist=[], isDue=None, repeat=Repeat(m=True, t=True, w=True, th=False, f=False, s=False, su=False)), success=True, notifications=[NotificationsUser(Type='ITEM_RECEIVED', data={'icon': 'notif_orca_mount', 'title': 'Orcas for Summer Splash!', 'text': "To celebrate Summer Splash, we've given you an Orca Mount!", 'destination': 'stable'}, seen=True, id=UUID('b7a85df1-06ed-4ab1-b56d-43418fc6a5e5')), NotificationsUser(Type='UNALLOCATED_STATS_POINTS', data={'points': 2}, seen=True, id=UUID('bc3f8a69-231f-4eb1-ba48-a00b6c0e0f37'))], userV=589, appVersion='5.28.6')
10
+ # ---
11
+ # name: test_get_tasks
12
+ HabiticaTasksResponse(data=[TaskData(challenge=Challenge(id=None, taskId=None, shortName=None, broken=None, winner=None), group=GroupTask(assignedUsers=[], id=None, assignedDate=None, assigningUsername=None, assignedUsersDetail={}, taskId=None, managerNotes=None, completedBy=CompletedBy(userId=None, date=None)), Type=<TaskType.HABIT: 'habit'>, text='task text', notes='task notes', tags=[], value=0.0, priority=<TaskPriority.EASY: 1>, attribute=<Attributes.STR: 'str'>, byHabitica=False, createdAt=datetime.datetime(2024, 9, 22, 16, 41, 39, 555000, tzinfo=datetime.timezone.utc), updatedAt=datetime.datetime(2024, 10, 26, 16, 48, 8, 742000, tzinfo=datetime.timezone.utc), date=None, id=UUID('7bc0d924-f5e5-48a6-af7f-8075f8c94e0f'), userId=UUID('2a61fddc-654f-4ded-b906-bb8a6da680d5'), up=True, down=False, counterUp=0, counterDown=0, frequency=<Frequency.DAILY: 'daily'>, history=[EntryHistory(date=datetime.datetime(2024, 10, 7, 19, 19, 47, 306000, tzinfo=datetime.timezone.utc), value=1.0, scoredUp=1, scoredDown=0, isDue=None, completed=None), EntryHistory(date=datetime.datetime(2024, 10, 16, 20, 19, 11, 168000, tzinfo=datetime.timezone.utc), value=8.184193475367, scoredUp=9, scoredDown=0, isDue=None, completed=None)], alias='counter_test', everyX=None, startDate=None, streak=None, reminders=[], daysOfMonth=[], weeksOfMonth=[], nextDue=[], yesterDaily=None, completed=None, collapseChecklist=False, checklist=[], isDue=None, repeat=Repeat(m=True, t=True, w=True, th=False, f=False, s=False, su=False)), TaskData(challenge=Challenge(id=None, taskId=None, shortName=None, broken=None, winner=None), group=GroupTask(assignedUsers=[], id=None, assignedDate=None, assigningUsername=None, assignedUsersDetail={}, taskId=None, managerNotes=None, completedBy=CompletedBy(userId=None, date=None)), Type=<TaskType.HABIT: 'habit'>, text='task text', notes='task notes', tags=[], value=3.853133245658556, priority=<TaskPriority.EASY: 1>, attribute=<Attributes.STR: 'str'>, byHabitica=False, createdAt=datetime.datetime(2024, 9, 22, 16, 41, 39, 555000, tzinfo=datetime.timezone.utc), updatedAt=datetime.datetime(2024, 12, 14, 1, 34, 39, 602000, tzinfo=datetime.timezone.utc), date=None, id=UUID('5e1bf953-af75-492c-ba02-c18789758d26'), userId=UUID('2a61fddc-654f-4ded-b906-bb8a6da680d5'), up=True, down=True, counterUp=0, counterDown=0, frequency=<Frequency.DAILY: 'daily'>, history=[EntryHistory(date=datetime.datetime(2024, 10, 16, 20, 19, 5, 151000, tzinfo=datetime.timezone.utc), value=3.853133245658556, scoredUp=4, scoredDown=0, isDue=None, completed=None)], alias=None, everyX=None, startDate=None, streak=None, reminders=[], daysOfMonth=[], weeksOfMonth=[], nextDue=[], yesterDaily=None, completed=None, collapseChecklist=False, checklist=[], isDue=None, repeat=Repeat(m=True, t=True, w=True, th=False, f=False, s=False, su=False)), TaskData(challenge=Challenge(id=None, taskId=None, shortName=None, broken=None, winner=None), group=GroupTask(assignedUsers=[], id=None, assignedDate=None, assigningUsername=None, assignedUsersDetail={}, taskId=None, managerNotes=None, completedBy=CompletedBy(userId=None, date=None)), Type=<TaskType.TODO: 'todo'>, text='task text', notes='task notes', tags=[], value=-68.61448963773076, priority=<TaskPriority.TRIVIAL: 0.1>, attribute=<Attributes.STR: 'str'>, byHabitica=True, createdAt=datetime.datetime(2024, 9, 22, 16, 41, 39, 555000, tzinfo=datetime.timezone.utc), updatedAt=datetime.datetime(2025, 2, 1, 15, 6, 43, 570000, tzinfo=datetime.timezone.utc), date=None, id=UUID('e8be3a26-6d3b-43bc-9aac-8246a8bedaed'), userId=UUID('2a61fddc-654f-4ded-b906-bb8a6da680d5'), up=None, down=None, counterUp=None, counterDown=None, frequency=None, history=[], alias='task-alias', everyX=None, startDate=None, streak=None, reminders=[Reminders(id=UUID('3e636b09-4a8c-4b2b-a525-29361b510d5b'), time=datetime.datetime(2024, 10, 13, 20, 51, 49, 391000, tzinfo=datetime.timezone.utc), startDate=None)], daysOfMonth=[], weeksOfMonth=[], nextDue=[], yesterDaily=None, completed=False, collapseChecklist=True, checklist=[Checklist(id=UUID('fde91e22-fc27-40e6-a861-d2da47b5e7fd'), text='item 0', completed=True), Checklist(id=UUID('532ba006-1115-4db4-b19d-bb255e3dc3de'), text='item 1', completed=False), Checklist(id=UUID('08da262f-c4f6-4a59-9c33-340e87a7ef27'), text='item 2', completed=False)], isDue=None, repeat=Repeat(m=True, t=True, w=True, th=False, f=False, s=False, su=False)), TaskData(challenge=Challenge(id=None, taskId=None, shortName=None, broken=None, winner=None), group=GroupTask(assignedUsers=[], id=None, assignedDate=None, assigningUsername=None, assignedUsersDetail={}, taskId=None, managerNotes=None, completedBy=CompletedBy(userId=None, date=None)), Type=<TaskType.REWARD: 'reward'>, text='task text', notes='task notes', tags=[UUID('50021cf7-b9f2-4f94-b80d-0263ce7cf3ec')], value=1.0, priority=<TaskPriority.EASY: 1>, attribute=<Attributes.STR: 'str'>, byHabitica=False, createdAt=datetime.datetime(2024, 9, 22, 16, 41, 39, 555000, tzinfo=datetime.timezone.utc), updatedAt=datetime.datetime(2024, 10, 17, 22, 25, 27, 43000, tzinfo=datetime.timezone.utc), date=None, id=UUID('93eb1e9c-4d14-4a94-b699-279963ecf410'), userId=UUID('2a61fddc-654f-4ded-b906-bb8a6da680d5'), up=None, down=None, counterUp=None, counterDown=None, frequency=None, history=[], alias=None, everyX=None, startDate=None, streak=None, reminders=[], daysOfMonth=[], weeksOfMonth=[], nextDue=[], yesterDaily=None, completed=None, collapseChecklist=False, checklist=[], isDue=None, repeat=Repeat(m=True, t=True, w=True, th=False, f=False, s=False, su=False)), TaskData(challenge=Challenge(id=None, taskId=None, shortName=None, broken=None, winner=None), group=GroupTask(assignedUsers=[], id=None, assignedDate=None, assigningUsername=None, assignedUsersDetail={}, taskId=None, managerNotes=None, completedBy=CompletedBy(userId=None, date=None)), Type=<TaskType.HABIT: 'habit'>, text='task text', notes='task notes', tags=[], value=0.0, priority=<TaskPriority.HARD: 2>, attribute=<Attributes.STR: 'str'>, byHabitica=False, createdAt=datetime.datetime(2024, 10, 7, 19, 8, 12, 325000, tzinfo=datetime.timezone.utc), updatedAt=datetime.datetime(2025, 2, 1, 15, 6, 43, 571000, tzinfo=datetime.timezone.utc), date=None, id=UUID('67894647-f6e6-4f1a-824c-62a7fffff752'), userId=UUID('2a61fddc-654f-4ded-b906-bb8a6da680d5'), up=True, down=False, counterUp=0, counterDown=0, frequency=<Frequency.MONTHLY: 'monthly'>, history=[EntryHistory(date=datetime.datetime(2024, 10, 16, 20, 19, 3, 714000, tzinfo=datetime.timezone.utc), value=7.355994112832055, scoredUp=8, scoredDown=0, isDue=None, completed=None)], alias='test_habit', everyX=None, startDate=None, streak=None, reminders=[], daysOfMonth=[], weeksOfMonth=[], nextDue=[], yesterDaily=None, completed=None, collapseChecklist=False, checklist=[], isDue=None, repeat=Repeat(m=True, t=True, w=True, th=False, f=False, s=False, su=False)), TaskData(challenge=Challenge(id=None, taskId=None, shortName=None, broken=None, winner=None), group=GroupTask(assignedUsers=[], id=None, assignedDate=None, assigningUsername=None, assignedUsersDetail={}, taskId=None, managerNotes=None, completedBy=CompletedBy(userId=None, date=None)), Type=<TaskType.TODO: 'todo'>, text='task text', notes='task notes', tags=[], value=-10.065628947026687, priority=<TaskPriority.EASY: 1>, attribute=<Attributes.STR: 'str'>, byHabitica=False, createdAt=datetime.datetime(2025, 1, 6, 18, 23, 10, 551000, tzinfo=datetime.timezone.utc), updatedAt=datetime.datetime(2025, 2, 1, 15, 6, 43, 560000, tzinfo=datetime.timezone.utc), date=None, id=UUID('75a4ac64-e8ac-44b8-b300-2086af8d2845'), userId=UUID('2a61fddc-654f-4ded-b906-bb8a6da680d5'), up=None, down=None, counterUp=None, counterDown=None, frequency=None, history=[], alias=None, everyX=None, startDate=None, streak=None, reminders=[], daysOfMonth=[], weeksOfMonth=[], nextDue=[], yesterDaily=None, completed=False, collapseChecklist=False, checklist=[], isDue=None, repeat=Repeat(m=True, t=True, w=True, th=False, f=False, s=False, su=False)), TaskData(challenge=Challenge(id=None, taskId=None, shortName=None, broken=None, winner=None), group=GroupTask(assignedUsers=[], id=None, assignedDate=None, assigningUsername=None, assignedUsersDetail={}, taskId=None, managerNotes=None, completedBy=CompletedBy(userId=None, date=None)), Type=<TaskType.TODO: 'todo'>, text='task text', notes='task notes', tags=[], value=-10.065632848406528, priority=<TaskPriority.EASY: 1>, attribute=<Attributes.STR: 'str'>, byHabitica=False, createdAt=datetime.datetime(2025, 1, 6, 20, 22, 27, 696000, tzinfo=datetime.timezone.utc), updatedAt=datetime.datetime(2025, 2, 1, 15, 6, 43, 561000, tzinfo=datetime.timezone.utc), date=None, id=UUID('2cae3698-0ca3-441d-ac4e-980323956f42'), userId=UUID('2a61fddc-654f-4ded-b906-bb8a6da680d5'), up=None, down=None, counterUp=None, counterDown=None, frequency=None, history=[], alias=None, everyX=None, startDate=None, streak=None, reminders=[], daysOfMonth=[], weeksOfMonth=[], nextDue=[], yesterDaily=None, completed=False, collapseChecklist=False, checklist=[], isDue=None, repeat=Repeat(m=True, t=True, w=True, th=False, f=False, s=False, su=False)), TaskData(challenge=Challenge(id=None, taskId=None, shortName=None, broken=None, winner=None), group=GroupTask(assignedUsers=[], id=None, assignedDate=None, assigningUsername=None, assignedUsersDetail={}, taskId=None, managerNotes=None, completedBy=CompletedBy(userId=None, date=None)), Type=<TaskType.TODO: 'todo'>, text='task text', notes='task notes', tags=[], value=-4.16134259811365, priority=<TaskPriority.EASY: 1>, attribute=<Attributes.STR: 'str'>, byHabitica=False, createdAt=datetime.datetime(2025, 1, 6, 20, 24, 32, 936000, tzinfo=datetime.timezone.utc), updatedAt=datetime.datetime(2025, 2, 1, 15, 6, 43, 561000, tzinfo=datetime.timezone.utc), date=None, id=UUID('a029cb52-1012-4d36-91af-b45c0bdbda69'), userId=UUID('2a61fddc-654f-4ded-b906-bb8a6da680d5'), up=None, down=None, counterUp=None, counterDown=None, frequency=None, history=[], alias=None, everyX=None, startDate=None, streak=None, reminders=[], daysOfMonth=[], weeksOfMonth=[], nextDue=[], yesterDaily=None, completed=False, collapseChecklist=False, checklist=[], isDue=None, repeat=Repeat(m=True, t=True, w=True, th=False, f=False, s=False, su=False)), TaskData(challenge=Challenge(id=None, taskId=None, shortName=None, broken=None, winner=None), group=GroupTask(assignedUsers=[], id=None, assignedDate=None, assigningUsername=None, assignedUsersDetail={}, taskId=None, managerNotes=None, completedBy=CompletedBy(userId=None, date=None)), Type=<TaskType.TODO: 'todo'>, text='task text', notes='task notes', tags=[], value=-4.16134259811365, priority=<TaskPriority.EASY: 1>, attribute=<Attributes.STR: 'str'>, byHabitica=False, createdAt=datetime.datetime(2025, 1, 6, 20, 29, 0, 542000, tzinfo=datetime.timezone.utc), updatedAt=datetime.datetime(2025, 2, 1, 15, 6, 43, 561000, tzinfo=datetime.timezone.utc), date=None, id=UUID('203048ee-4020-48ef-99ef-3a20c7c9a8b3'), userId=UUID('2a61fddc-654f-4ded-b906-bb8a6da680d5'), up=None, down=None, counterUp=None, counterDown=None, frequency=None, history=[], alias=None, everyX=None, startDate=None, streak=None, reminders=[], daysOfMonth=[], weeksOfMonth=[], nextDue=[], yesterDaily=None, completed=False, collapseChecklist=False, checklist=[], isDue=None, repeat=Repeat(m=True, t=True, w=True, th=False, f=False, s=False, su=False)), TaskData(challenge=Challenge(id=None, taskId=None, shortName=None, broken=None, winner=None), group=GroupTask(assignedUsers=[], id=None, assignedDate=None, assigningUsername=None, assignedUsersDetail={}, taskId=None, managerNotes=None, completedBy=CompletedBy(userId=None, date=None)), Type=<TaskType.TODO: 'todo'>, text='task text', notes='task notes', tags=[], value=-10.065631750759767, priority=<TaskPriority.EASY: 1>, attribute=<Attributes.STR: 'str'>, byHabitica=False, createdAt=datetime.datetime(2025, 1, 6, 20, 30, 16, 745000, tzinfo=datetime.timezone.utc), updatedAt=datetime.datetime(2025, 2, 1, 15, 6, 43, 561000, tzinfo=datetime.timezone.utc), date=None, id=UUID('9983f4c9-04be-446c-99d2-fca07e9e2dcd'), userId=UUID('2a61fddc-654f-4ded-b906-bb8a6da680d5'), up=None, down=None, counterUp=None, counterDown=None, frequency=None, history=[], alias=None, everyX=None, startDate=None, streak=None, reminders=[], daysOfMonth=[], weeksOfMonth=[], nextDue=[], yesterDaily=None, completed=False, collapseChecklist=False, checklist=[], isDue=None, repeat=Repeat(m=True, t=True, w=True, th=False, f=False, s=False, su=False)), TaskData(challenge=Challenge(id=None, taskId=None, shortName=None, broken=None, winner=None), group=GroupTask(assignedUsers=[], id=None, assignedDate=None, assigningUsername=None, assignedUsersDetail={}, taskId=None, managerNotes=None, completedBy=CompletedBy(userId=None, date=None)), Type=<TaskType.DAILY: 'daily'>, text='task text', notes='task notes', tags=[], value=2.992271863689143, priority=<TaskPriority.EASY: 1>, attribute=<Attributes.STR: 'str'>, byHabitica=False, createdAt=datetime.datetime(2025, 1, 6, 22, 42, 49, 719000, tzinfo=datetime.timezone.utc), updatedAt=datetime.datetime(2025, 2, 1, 15, 6, 43, 561000, tzinfo=datetime.timezone.utc), date=None, id=UUID('8b54b538-7fe5-4132-91e1-4eebac0073f5'), userId=UUID('2a61fddc-654f-4ded-b906-bb8a6da680d5'), up=None, down=None, counterUp=None, counterDown=None, frequency=<Frequency.WEEKLY: 'weekly'>, history=[EntryHistory(date=datetime.datetime(2025, 1, 6, 23, 0, 9, 684000, tzinfo=datetime.timezone.utc), value=1.0, scoredUp=None, scoredDown=None, isDue=True, completed=True), EntryHistory(date=datetime.datetime(2025, 1, 10, 1, 12, 46, 313000, tzinfo=datetime.timezone.utc), value=1.9747, scoredUp=None, scoredDown=None, isDue=True, completed=True), EntryHistory(date=datetime.datetime(2025, 1, 10, 23, 2, 8, 864000, tzinfo=datetime.timezone.utc), value=1.024043774264157, scoredUp=None, scoredDown=None, isDue=True, completed=False), EntryHistory(date=datetime.datetime(2025, 1, 13, 17, 48, 43, 163000, tzinfo=datetime.timezone.utc), value=1.998143412564751, scoredUp=None, scoredDown=None, isDue=True, completed=True), EntryHistory(date=datetime.datetime(2025, 1, 13, 23, 0, 47, 611000, tzinfo=datetime.timezone.utc), value=2.9482287028135716, scoredUp=None, scoredDown=None, isDue=True, completed=True), EntryHistory(date=datetime.datetime(2025, 1, 15, 17, 31, 41, 493000, tzinfo=datetime.timezone.utc), value=2.020995311995297, scoredUp=None, scoredDown=None, isDue=True, completed=False), EntryHistory(date=datetime.datetime(2025, 1, 18, 18, 22, 21, 871000, tzinfo=datetime.timezone.utc), value=2.9705244023522885, scoredUp=None, scoredDown=None, isDue=True, completed=True), EntryHistory(date=datetime.datetime(2025, 1, 20, 11, 47, 2, 983000, tzinfo=datetime.timezone.utc), value=3.8972281794078136, scoredUp=None, scoredDown=None, isDue=True, completed=True), EntryHistory(date=datetime.datetime(2025, 2, 1, 15, 6, 43, 541000, tzinfo=datetime.timezone.utc), value=2.992271863689143, scoredUp=None, scoredDown=None, isDue=True, completed=False)], alias=None, everyX=1, startDate=datetime.datetime(2025, 1, 5, 23, 0, tzinfo=datetime.timezone.utc), streak=0, reminders=[], daysOfMonth=[], weeksOfMonth=[], nextDue=[datetime.datetime(2025, 2, 2, 23, 0, tzinfo=datetime.timezone.utc), datetime.datetime(2025, 2, 3, 23, 0, tzinfo=datetime.timezone.utc), datetime.datetime(2025, 2, 4, 23, 0, tzinfo=datetime.timezone.utc), datetime.datetime(2025, 2, 5, 23, 0, tzinfo=datetime.timezone.utc), datetime.datetime(2025, 2, 6, 23, 0, tzinfo=datetime.timezone.utc), datetime.datetime(2025, 2, 7, 23, 0, tzinfo=datetime.timezone.utc)], yesterDaily=True, completed=False, collapseChecklist=False, checklist=[], isDue=True, repeat=Repeat(m=True, t=True, w=True, th=True, f=True, s=True, su=True)), TaskData(challenge=Challenge(id=None, taskId=None, shortName=None, broken=None, winner=None), group=GroupTask(assignedUsers=[], id=None, assignedDate=None, assigningUsername=None, assignedUsersDetail={}, taskId=None, managerNotes=None, completedBy=CompletedBy(userId=None, date=None)), Type=<TaskType.DAILY: 'daily'>, text='task text', notes='task notes', tags=[], value=4.800754343722116, priority=<TaskPriority.EASY: 1>, attribute=<Attributes.STR: 'str'>, byHabitica=False, createdAt=datetime.datetime(2025, 1, 6, 22, 42, 52, 877000, tzinfo=datetime.timezone.utc), updatedAt=datetime.datetime(2025, 2, 1, 15, 6, 43, 561000, tzinfo=datetime.timezone.utc), date=None, id=UUID('c65a4932-f81d-4e83-a1f5-b94bc1b5a505'), userId=UUID('2a61fddc-654f-4ded-b906-bb8a6da680d5'), up=None, down=None, counterUp=None, counterDown=None, frequency=<Frequency.WEEKLY: 'weekly'>, history=[EntryHistory(date=datetime.datetime(2025, 1, 6, 23, 0, 9, 696000, tzinfo=datetime.timezone.utc), value=1.0, scoredUp=None, scoredDown=None, isDue=True, completed=True), EntryHistory(date=datetime.datetime(2025, 1, 10, 1, 12, 46, 316000, tzinfo=datetime.timezone.utc), value=1.9747, scoredUp=None, scoredDown=None, isDue=True, completed=True), EntryHistory(date=datetime.datetime(2025, 1, 10, 23, 2, 8, 865000, tzinfo=datetime.timezone.utc), value=1.024043774264157, scoredUp=None, scoredDown=None, isDue=True, completed=False), EntryHistory(date=datetime.datetime(2025, 1, 13, 17, 48, 43, 166000, tzinfo=datetime.timezone.utc), value=1.998143412564751, scoredUp=None, scoredDown=None, isDue=True, completed=True), EntryHistory(date=datetime.datetime(2025, 1, 13, 23, 0, 47, 613000, tzinfo=datetime.timezone.utc), value=2.9482287028135716, scoredUp=None, scoredDown=None, isDue=True, completed=True), EntryHistory(date=datetime.datetime(2025, 1, 15, 17, 31, 41, 305000, tzinfo=datetime.timezone.utc), value=3.8754620936318465, scoredUp=None, scoredDown=None, isDue=True, completed=True), EntryHistory(date=datetime.datetime(2025, 1, 18, 18, 22, 21, 876000, tzinfo=datetime.timezone.utc), value=4.780923305699728, scoredUp=None, scoredDown=None, isDue=True, completed=True), EntryHistory(date=datetime.datetime(2025, 1, 20, 11, 47, 2, 987000, tzinfo=datetime.timezone.utc), value=5.665617021312497, scoredUp=None, scoredDown=None, isDue=True, completed=True), EntryHistory(date=datetime.datetime(2025, 2, 1, 15, 6, 43, 542000, tzinfo=datetime.timezone.utc), value=4.800754343722116, scoredUp=None, scoredDown=None, isDue=True, completed=False)], alias=None, everyX=1, startDate=datetime.datetime(2025, 1, 5, 23, 0, tzinfo=datetime.timezone.utc), streak=0, reminders=[], daysOfMonth=[], weeksOfMonth=[], nextDue=[datetime.datetime(2025, 2, 2, 23, 0, tzinfo=datetime.timezone.utc), datetime.datetime(2025, 2, 3, 23, 0, tzinfo=datetime.timezone.utc), datetime.datetime(2025, 2, 4, 23, 0, tzinfo=datetime.timezone.utc), datetime.datetime(2025, 2, 5, 23, 0, tzinfo=datetime.timezone.utc), datetime.datetime(2025, 2, 6, 23, 0, tzinfo=datetime.timezone.utc), datetime.datetime(2025, 2, 7, 23, 0, tzinfo=datetime.timezone.utc)], yesterDaily=True, completed=False, collapseChecklist=False, checklist=[], isDue=True, repeat=Repeat(m=True, t=True, w=True, th=True, f=True, s=True, su=True)), TaskData(challenge=Challenge(id=None, taskId=None, shortName=None, broken=None, winner=None), group=GroupTask(assignedUsers=[], id=None, assignedDate=None, assigningUsername=None, assignedUsersDetail={}, taskId=None, managerNotes=None, completedBy=CompletedBy(userId=None, date=None)), Type=<TaskType.DAILY: 'daily'>, text='task text', notes='task notes', tags=[], value=2.992271863689143, priority=<TaskPriority.EASY: 1>, attribute=<Attributes.STR: 'str'>, byHabitica=False, createdAt=datetime.datetime(2025, 1, 6, 22, 42, 56, 440000, tzinfo=datetime.timezone.utc), updatedAt=datetime.datetime(2025, 2, 1, 15, 6, 43, 561000, tzinfo=datetime.timezone.utc), date=None, id=UUID('1b21023c-b1e6-4b11-bcfa-9d48473033a1'), userId=UUID('2a61fddc-654f-4ded-b906-bb8a6da680d5'), up=None, down=None, counterUp=None, counterDown=None, frequency=<Frequency.WEEKLY: 'weekly'>, history=[EntryHistory(date=datetime.datetime(2025, 1, 6, 23, 0, 9, 693000, tzinfo=datetime.timezone.utc), value=1.0, scoredUp=None, scoredDown=None, isDue=True, completed=True), EntryHistory(date=datetime.datetime(2025, 1, 10, 1, 12, 46, 314000, tzinfo=datetime.timezone.utc), value=1.9747, scoredUp=None, scoredDown=None, isDue=True, completed=True), EntryHistory(date=datetime.datetime(2025, 1, 10, 23, 2, 8, 866000, tzinfo=datetime.timezone.utc), value=1.024043774264157, scoredUp=None, scoredDown=None, isDue=True, completed=False), EntryHistory(date=datetime.datetime(2025, 1, 13, 17, 48, 43, 165000, tzinfo=datetime.timezone.utc), value=1.998143412564751, scoredUp=None, scoredDown=None, isDue=True, completed=True), EntryHistory(date=datetime.datetime(2025, 1, 13, 23, 0, 47, 612000, tzinfo=datetime.timezone.utc), value=2.9482287028135716, scoredUp=None, scoredDown=None, isDue=True, completed=True), EntryHistory(date=datetime.datetime(2025, 1, 15, 17, 31, 41, 494000, tzinfo=datetime.timezone.utc), value=2.020995311995297, scoredUp=None, scoredDown=None, isDue=True, completed=False), EntryHistory(date=datetime.datetime(2025, 1, 18, 18, 22, 21, 873000, tzinfo=datetime.timezone.utc), value=2.9705244023522885, scoredUp=None, scoredDown=None, isDue=True, completed=True), EntryHistory(date=datetime.datetime(2025, 1, 20, 11, 47, 2, 985000, tzinfo=datetime.timezone.utc), value=3.8972281794078136, scoredUp=None, scoredDown=None, isDue=True, completed=True), EntryHistory(date=datetime.datetime(2025, 2, 1, 15, 6, 43, 543000, tzinfo=datetime.timezone.utc), value=2.992271863689143, scoredUp=None, scoredDown=None, isDue=True, completed=False)], alias=None, everyX=1, startDate=datetime.datetime(2025, 1, 5, 23, 0, tzinfo=datetime.timezone.utc), streak=0, reminders=[], daysOfMonth=[], weeksOfMonth=[], nextDue=[datetime.datetime(2025, 2, 2, 23, 0, tzinfo=datetime.timezone.utc), datetime.datetime(2025, 2, 3, 23, 0, tzinfo=datetime.timezone.utc), datetime.datetime(2025, 2, 4, 23, 0, tzinfo=datetime.timezone.utc), datetime.datetime(2025, 2, 5, 23, 0, tzinfo=datetime.timezone.utc), datetime.datetime(2025, 2, 6, 23, 0, tzinfo=datetime.timezone.utc), datetime.datetime(2025, 2, 7, 23, 0, tzinfo=datetime.timezone.utc)], yesterDaily=True, completed=False, collapseChecklist=False, checklist=[], isDue=True, repeat=Repeat(m=True, t=True, w=True, th=True, f=True, s=True, su=True)), TaskData(challenge=Challenge(id=None, taskId=None, shortName=None, broken=None, winner=None), group=GroupTask(assignedUsers=[], id=None, assignedDate=None, assigningUsername=None, assignedUsersDetail={}, taskId=None, managerNotes=None, completedBy=CompletedBy(userId=None, date=None)), Type=<TaskType.DAILY: 'daily'>, text='task text', notes='task notes', tags=[], value=1.048665488039431, priority=<TaskPriority.EASY: 1>, attribute=<Attributes.STR: 'str'>, byHabitica=False, createdAt=datetime.datetime(2025, 1, 13, 18, 36, 13, 598000, tzinfo=datetime.timezone.utc), updatedAt=datetime.datetime(2025, 2, 1, 15, 6, 43, 561000, tzinfo=datetime.timezone.utc), date=None, id=UUID('dad786c2-d333-4a24-b81e-4714537b0fec'), userId=UUID('2a61fddc-654f-4ded-b906-bb8a6da680d5'), up=None, down=None, counterUp=None, counterDown=None, frequency=<Frequency.WEEKLY: 'weekly'>, history=[EntryHistory(date=datetime.datetime(2025, 1, 13, 23, 0, 47, 609000, tzinfo=datetime.timezone.utc), value=1.0, scoredUp=None, scoredDown=None, isDue=True, completed=True), EntryHistory(date=datetime.datetime(2025, 1, 15, 17, 31, 41, 495000, tzinfo=datetime.timezone.utc), value=0.02529999999999999, scoredUp=None, scoredDown=None, isDue=True, completed=False), EntryHistory(date=datetime.datetime(2025, 1, 18, 18, 22, 21, 868000, tzinfo=datetime.timezone.utc), value=1.0246518837628547, scoredUp=None, scoredDown=None, isDue=True, completed=True), EntryHistory(date=datetime.datetime(2025, 1, 20, 11, 47, 2, 982000, tzinfo=datetime.timezone.utc), value=1.9987363426517264, scoredUp=None, scoredDown=None, isDue=True, completed=True), EntryHistory(date=datetime.datetime(2025, 2, 1, 15, 6, 43, 543000, tzinfo=datetime.timezone.utc), value=1.048665488039431, scoredUp=None, scoredDown=None, isDue=True, completed=False)], alias=None, everyX=1, startDate=datetime.datetime(2025, 1, 12, 23, 0, tzinfo=datetime.timezone.utc), streak=0, reminders=[], daysOfMonth=[], weeksOfMonth=[], nextDue=[datetime.datetime(2025, 2, 2, 23, 0, tzinfo=datetime.timezone.utc), datetime.datetime(2025, 2, 3, 23, 0, tzinfo=datetime.timezone.utc), datetime.datetime(2025, 2, 4, 23, 0, tzinfo=datetime.timezone.utc), datetime.datetime(2025, 2, 5, 23, 0, tzinfo=datetime.timezone.utc), datetime.datetime(2025, 2, 6, 23, 0, tzinfo=datetime.timezone.utc), datetime.datetime(2025, 2, 7, 23, 0, tzinfo=datetime.timezone.utc)], yesterDaily=True, completed=False, collapseChecklist=False, checklist=[], isDue=True, repeat=Repeat(m=True, t=True, w=True, th=True, f=True, s=True, su=True)), TaskData(challenge=Challenge(id=None, taskId=None, shortName=None, broken=None, winner=None), group=GroupTask(assignedUsers=[], id=None, assignedDate=None, assigningUsername=None, assignedUsersDetail={}, taskId=None, managerNotes=None, completedBy=CompletedBy(userId=None, date=None)), Type=<TaskType.DAILY: 'daily'>, text='task text', notes='task notes', tags=[], value=1.048665488039431, priority=<TaskPriority.EASY: 1>, attribute=<Attributes.STR: 'str'>, byHabitica=False, createdAt=datetime.datetime(2025, 1, 13, 18, 36, 15, 291000, tzinfo=datetime.timezone.utc), updatedAt=datetime.datetime(2025, 2, 1, 15, 6, 43, 561000, tzinfo=datetime.timezone.utc), date=None, id=UUID('a41c65d3-f97b-4fac-8bd8-1e9c43be99d1'), userId=UUID('2a61fddc-654f-4ded-b906-bb8a6da680d5'), up=None, down=None, counterUp=None, counterDown=None, frequency=<Frequency.WEEKLY: 'weekly'>, history=[EntryHistory(date=datetime.datetime(2025, 1, 13, 23, 0, 47, 608000, tzinfo=datetime.timezone.utc), value=1.0, scoredUp=None, scoredDown=None, isDue=True, completed=True), EntryHistory(date=datetime.datetime(2025, 1, 15, 17, 31, 41, 496000, tzinfo=datetime.timezone.utc), value=0.02529999999999999, scoredUp=None, scoredDown=None, isDue=True, completed=False), EntryHistory(date=datetime.datetime(2025, 1, 18, 18, 22, 21, 864000, tzinfo=datetime.timezone.utc), value=1.0246518837628547, scoredUp=None, scoredDown=None, isDue=True, completed=True), EntryHistory(date=datetime.datetime(2025, 1, 20, 11, 47, 2, 980000, tzinfo=datetime.timezone.utc), value=1.9987363426517264, scoredUp=None, scoredDown=None, isDue=True, completed=True), EntryHistory(date=datetime.datetime(2025, 2, 1, 15, 6, 43, 546000, tzinfo=datetime.timezone.utc), value=1.048665488039431, scoredUp=None, scoredDown=None, isDue=True, completed=False)], alias=None, everyX=1, startDate=datetime.datetime(2025, 1, 12, 23, 0, tzinfo=datetime.timezone.utc), streak=0, reminders=[], daysOfMonth=[], weeksOfMonth=[], nextDue=[datetime.datetime(2025, 2, 2, 23, 0, tzinfo=datetime.timezone.utc), datetime.datetime(2025, 2, 3, 23, 0, tzinfo=datetime.timezone.utc), datetime.datetime(2025, 2, 4, 23, 0, tzinfo=datetime.timezone.utc), datetime.datetime(2025, 2, 5, 23, 0, tzinfo=datetime.timezone.utc), datetime.datetime(2025, 2, 6, 23, 0, tzinfo=datetime.timezone.utc), datetime.datetime(2025, 2, 7, 23, 0, tzinfo=datetime.timezone.utc)], yesterDaily=True, completed=False, collapseChecklist=False, checklist=[], isDue=True, repeat=Repeat(m=True, t=True, w=True, th=True, f=True, s=True, su=True)), TaskData(challenge=Challenge(id=None, taskId=None, shortName=None, broken=None, winner=None), group=GroupTask(assignedUsers=[], id=None, assignedDate=None, assigningUsername=None, assignedUsersDetail={}, taskId=None, managerNotes=None, completedBy=CompletedBy(userId=None, date=None)), Type=<TaskType.DAILY: 'daily'>, text='task text', notes='task notes', tags=[], value=1.9987363426517264, priority=<TaskPriority.EASY: 1>, attribute=<Attributes.STR: 'str'>, byHabitica=False, createdAt=datetime.datetime(2025, 1, 13, 18, 36, 17, 152000, tzinfo=datetime.timezone.utc), updatedAt=datetime.datetime(2025, 2, 1, 15, 6, 43, 561000, tzinfo=datetime.timezone.utc), date=None, id=UUID('d9247fff-37ec-4c7e-9b15-de79b99a830f'), userId=UUID('2a61fddc-654f-4ded-b906-bb8a6da680d5'), up=None, down=None, counterUp=None, counterDown=None, frequency=<Frequency.WEEKLY: 'weekly'>, history=[EntryHistory(date=datetime.datetime(2025, 1, 13, 23, 0, 47, 605000, tzinfo=datetime.timezone.utc), value=1.0, scoredUp=None, scoredDown=None, isDue=True, completed=True), EntryHistory(date=datetime.datetime(2025, 1, 15, 17, 31, 41, 496000, tzinfo=datetime.timezone.utc), value=0.02529999999999999, scoredUp=None, scoredDown=None, isDue=True, completed=False), EntryHistory(date=datetime.datetime(2025, 1, 18, 18, 22, 21, 862000, tzinfo=datetime.timezone.utc), value=1.0246518837628547, scoredUp=None, scoredDown=None, isDue=True, completed=True), EntryHistory(date=datetime.datetime(2025, 1, 20, 11, 47, 2, 978000, tzinfo=datetime.timezone.utc), value=1.9987363426517264, scoredUp=None, scoredDown=None, isDue=True, completed=True), EntryHistory(date=datetime.datetime(2025, 2, 1, 15, 6, 43, 547000, tzinfo=datetime.timezone.utc), value=1.9987363426517264, scoredUp=None, scoredDown=None, isDue=False, completed=False)], alias=None, everyX=0, startDate=datetime.datetime(2025, 1, 12, 23, 0, tzinfo=datetime.timezone.utc), streak=2, reminders=[], daysOfMonth=[], weeksOfMonth=[], nextDue=[datetime.datetime(2025, 1, 20, 23, 0, tzinfo=datetime.timezone.utc), datetime.datetime(2025, 1, 21, 23, 0, tzinfo=datetime.timezone.utc), datetime.datetime(2025, 1, 22, 23, 0, tzinfo=datetime.timezone.utc), datetime.datetime(2025, 1, 23, 23, 0, tzinfo=datetime.timezone.utc), datetime.datetime(2025, 1, 24, 23, 0, tzinfo=datetime.timezone.utc), datetime.datetime(2025, 1, 26, 23, 0, tzinfo=datetime.timezone.utc)], yesterDaily=True, completed=False, collapseChecklist=False, checklist=[], isDue=False, repeat=Repeat(m=True, t=True, w=True, th=True, f=True, s=True, su=True)), TaskData(challenge=Challenge(id=None, taskId=None, shortName=None, broken=None, winner=None), group=GroupTask(assignedUsers=[], id=None, assignedDate=None, assigningUsername=None, assignedUsersDetail={}, taskId=None, managerNotes=None, completedBy=CompletedBy(userId=None, date=None)), Type=<TaskType.TODO: 'todo'>, text='task text', notes='task notes', tags=[], value=-2.025956256651074, priority=<TaskPriority.EASY: 1>, attribute=<Attributes.STR: 'str'>, byHabitica=False, createdAt=datetime.datetime(2025, 1, 18, 18, 45, 4, 942000, tzinfo=datetime.timezone.utc), updatedAt=datetime.datetime(2025, 2, 1, 15, 6, 43, 561000, tzinfo=datetime.timezone.utc), date=None, id=UUID('cfd7c79b-ac4d-4133-923f-36f169308b0d'), userId=UUID('2a61fddc-654f-4ded-b906-bb8a6da680d5'), up=None, down=None, counterUp=None, counterDown=None, frequency=None, history=[], alias=None, everyX=None, startDate=None, streak=None, reminders=[], daysOfMonth=[], weeksOfMonth=[], nextDue=[], yesterDaily=None, completed=False, collapseChecklist=False, checklist=[], isDue=None, repeat=Repeat(m=True, t=True, w=True, th=False, f=False, s=False, su=False))], success=True, notifications=[NotificationsUser(Type='ITEM_RECEIVED', data={'icon': 'notif_orca_mount', 'title': 'Orcas for Summer Splash!', 'text': "To celebrate Summer Splash, we've given you an Orca Mount!", 'destination': 'stable'}, seen=True, id=UUID('b7a85df1-06ed-4ab1-b56d-43418fc6a5e5')), NotificationsUser(Type='UNALLOCATED_STATS_POINTS', data={'points': 2}, seen=True, id=UUID('bc3f8a69-231f-4eb1-ba48-a00b6c0e0f37'))], userV=589, appVersion='5.28.6')
13
+ # ---
14
+ # name: test_reorder_task
15
+ HabiticaTaskOrderResponse(data=[UUID('ac13c62c-9375-4809-a357-0e42b01a1b43'), UUID('2388ccad-0387-4ea6-9968-2d10d994e903'), UUID('5c6efb91-6ae3-4cad-8b19-2dd2fc52a965'), UUID('80afe0b9-e367-4473-8117-b8bc7115f54a'), UUID('4cc21c36-886c-4a43-b580-877e958a37fd'), UUID('10a45996-7133-4ca1-84d8-abf1093d9dcc'), UUID('fb867459-ae50-4cee-9017-c13206c6dfa2')], success=True, notifications=[NotificationsUser(Type='ITEM_RECEIVED', data={'icon': 'notif_orca_mount', 'title': 'Orcas for Summer Splash!', 'text': "To celebrate Summer Splash, we've given you an Orca Mount!", 'destination': 'stable'}, seen=True, id=UUID('b7a85df1-06ed-4ab1-b56d-43418fc6a5e5')), NotificationsUser(Type='UNALLOCATED_STATS_POINTS', data={'points': 2}, seen=True, id=UUID('bc3f8a69-231f-4eb1-ba48-a00b6c0e0f37'))], userV=589, appVersion='5.28.6')
16
+ # ---
17
+ # name: test_update_task
18
+ HabiticaTaskResponse(data=TaskData(challenge=Challenge(id=None, taskId=None, shortName=None, broken=None, winner=None), group=GroupTask(assignedUsers=[], id=None, assignedDate=None, assigningUsername=None, assignedUsersDetail={}, taskId=None, managerNotes=None, completedBy=CompletedBy(userId=None, date=None)), Type=<TaskType.HABIT: 'habit'>, text='task text', notes='task notes', tags=[], value=0.0, priority=<TaskPriority.EASY: 1>, attribute=<Attributes.STR: 'str'>, byHabitica=False, createdAt=datetime.datetime(2024, 9, 22, 16, 41, 39, 555000, tzinfo=datetime.timezone.utc), updatedAt=datetime.datetime(2024, 10, 26, 16, 48, 8, 742000, tzinfo=datetime.timezone.utc), date=None, id=UUID('7bc0d924-f5e5-48a6-af7f-8075f8c94e0f'), userId=UUID('2a61fddc-654f-4ded-b906-bb8a6da680d5'), up=True, down=False, counterUp=0, counterDown=0, frequency=<Frequency.DAILY: 'daily'>, history=[EntryHistory(date=datetime.datetime(2024, 10, 7, 19, 19, 47, 306000, tzinfo=datetime.timezone.utc), value=1.0, scoredUp=1, scoredDown=0, isDue=None, completed=None), EntryHistory(date=datetime.datetime(2024, 10, 16, 20, 19, 11, 168000, tzinfo=datetime.timezone.utc), value=8.184193475367, scoredUp=9, scoredDown=0, isDue=None, completed=None)], alias='counter_test', everyX=None, startDate=None, streak=None, reminders=[], daysOfMonth=[], weeksOfMonth=[], nextDue=[], yesterDaily=None, completed=None, collapseChecklist=False, checklist=[], isDue=None, repeat=Repeat(m=True, t=True, w=True, th=False, f=False, s=False, su=False)), success=True, notifications=[NotificationsUser(Type='ITEM_RECEIVED', data={'icon': 'notif_orca_mount', 'title': 'Orcas for Summer Splash!', 'text': "To celebrate Summer Splash, we've given you an Orca Mount!", 'destination': 'stable'}, seen=True, id=UUID('b7a85df1-06ed-4ab1-b56d-43418fc6a5e5')), NotificationsUser(Type='UNALLOCATED_STATS_POINTS', data={'points': 2}, seen=True, id=UUID('bc3f8a69-231f-4eb1-ba48-a00b6c0e0f37'))], userV=589, appVersion='5.28.6')
19
+ # ---
@@ -1,7 +1,7 @@
1
1
  # serializer version: 1
2
- # name: test_login
3
- HabiticaLoginResponse(data=LoginData(id=UUID('a380546a-94be-4b8e-8a0b-23e0d5c03303'), apiToken='cd0e5985-17de-4b4f-849e-5d506c5e4382', newUser=False, username='test-username', passwordResetCode=None), success=True, notifications=[], userV=None, appVersion='5.30.0')
4
- # ---
5
- # name: test_user
2
+ # name: test_get_user
6
3
  HabiticaUserResponse(data=UserData(id=UUID('c18e1853-bded-47a9-82e2-adfdad08894d'), preferences=PreferencesUser(hair=HairPreferences(color='red', base=3, bangs=1, beard=0, mustache=0, flower=1), emailNotifications=EmailNotificationsPreferences(unsubscribeFromAll=False, newPM=True, kickedGroup=True, wonChallenge=True, giftedGems=True, giftedSubscription=True, invitedParty=True, invitedGuild=True, questStarted=True, invitedQuest=True, importantAnnouncements=True, weeklyRecaps=True, onboarding=True, majorUpdates=True, subscriptionReminders=True, contentRelease=True), pushNotifications=PushNotificationsPreferences(unsubscribeFromAll=False, newPM=True, wonChallenge=True, giftedGems=True, giftedSubscription=True, invitedParty=True, invitedGuild=True, questStarted=True, invitedQuest=True, majorUpdates=True, mentionParty=True, mentionJoinedGuild=True, mentionUnjoinedGuild=True, partyActivity=True, contentRelease=True), suppressModals=SuppressModalsPreferences(levelUp=False, hatchPet=False, raisePet=False, streak=False), tasks=TasksPreferences(activeFilter=ActiveFilterTask(habit='all', daily='all', todo='remaining', reward='all'), groupByChallenge=False, confirmScoreNotes=False, mirrorGroupTasks=[]), dayStart=0, size='slim', hideHeader=False, skin='915533', shirt='blue', timezoneOffset=-120, sound='rosstavoTheme', chair='none', allocationMode='flat', autoEquip=True, costume=False, dateFormat='MM/dd/yyyy', sleep=False, stickyHeader=True, disableClasses=False, newTaskEdit=False, dailyDueDefaultView=False, advancedCollapsed=False, toolbarCollapsed=False, reverseChatOrder=False, developerMode=False, displayInviteToPartyWhenPartyIs1=True, background='violet', automaticAllocation=None, webhooks={}, improvementCategories=[], timezoneOffsetAtLastCron=None, language=<Language.DE: 'de'>), flags=FlagsUser(customizationsNotification=False, tour=TourFlags(intro=-1, classes=-1, stats=-1, tavern=-1, party=-1, guilds=-1, challenges=-1, market=-1, pets=-1, mounts=-1, hall=-1, equipment=-1, groupPlans=-1), showTour=True, tutorial=TutorialFlags(common=CommonTutorial(habits=True, dailies=True, todos=True, rewards=True, party=True, pets=True, gems=True, skills=True, classes=True, tavern=True, equipment=True, items=True, mounts=True, inbox=True, stats=True), ios=IosTutorial(addTask=False, editTask=False, deleteTask=False, filterTask=False, groupPets=False, inviteParty=False, reorderTask=False)), dropsEnabled=False, itemsEnabled=False, lastNewStuffRead='', rewrite=True, classSelected=False, rebirthEnabled=False, levelDrops={}, recaptureEmailsPhase=0, weeklyRecapEmailsPhase=0, lastWeeklyRecap=datetime.datetime(2024, 10, 19, 18, 43, 39, 782000, tzinfo=datetime.timezone.utc), communityGuidelinesAccepted=False, cronCount=0, welcomed=True, armoireEnabled=True, armoireOpened=False, armoireEmpty=False, cardReceived=False, warnedLowHealth=False, verifiedUsername=True, newStuff=False, thirdPartyTools=None, mathUpdates=None, lastFreeRebirth=None, chatRevoked=None, chatShadowMuted=None, lastWeeklyRecapDiscriminator=None, onboardingEmailsPhase=None), auth=AuthUser(local=LocalAuth(email='test@example.com', username='test', lowerCaseUsername='test', has_password=True), timestamps=LocalTimestamps(created=datetime.datetime(2024, 10, 19, 18, 43, 39, 782000, tzinfo=datetime.timezone.utc), loggedin=datetime.datetime(2024, 10, 19, 18, 43, 39, 782000, tzinfo=datetime.timezone.utc), updated=datetime.datetime(2024, 10, 19, 18, 44, 51, 37000, tzinfo=datetime.timezone.utc)), facebook={}, google={}, apple={}), achievements=AchievementsUser(ultimateGearSets=UltimateGearSetsAchievments(healer=False, wizard=False, rogue=False, warrior=False), streak=0, challenges=[], perfect=0, quests=QuestsAchievments(bewilder=None, burnout=None, stressbeast=None, harpy=None, atom3=None, vice3=None, vice1=None, gryphon=None, evilsanta2=None, evilsanta=None, dilatory_derby=None, dilatory=None, atom2=None, atom1=None, dysheartener=None), backToBasics=None, dustDevil=None, primedForPainting=None, completedTask=None, createdTask=None, fedPet=None, hatchedPet=None, purchasedEquipment=None, tickledPink=None, goodAsGold=None, boneCollector=None, seeingRed=None, violetsAreBlue=None, shadyCustomer=None, joinedGuild=None, joinedChallenge=None, partyUp=None), backer=BackerUser(tier=None, npc=None, tokensApplied=None), contributor=ContributorUser(contributions=None, level=None, text=None), permissions=PermissionsUser(fullAccess=None, news=None, userSupport=None, challengeAdmin=None, moderator=None, coupons=None), purchased=PurchasedUser(plan=PlanPurchased(consecutive=ConsecutivePlan(trinkets=0, gemCapExtra=0, offset=0, count=0), mysteryItems=[], gemsBought=0, extraMonths=0, dateUpdated=None, perkMonthCount=-1, quantity=1), txnCount=0, background={'violet': True}, shirt={}, hair={}, skin={}, ads=False, mobileChat=None), history=HistoryUser(todos=[], exp=[]), items=ItemsUser(gear=GearItems(equipped=EquippedGear(weapon='weapon_special_fall2024Warrior', armor='armor_special_fall2024Warrior', head='head_special_fall2024Warrior', shield='shield_special_fall2024Warrior', back='back_mystery_201402', headAccessory='headAccessory_special_pinkHeadband', eyewear='eyewear_special_pinkHalfMoon', body='body_mystery_202003'), costume=EquippedGear(weapon=None, armor='armor_base_0', head='head_base_0', shield='shield_base_0', back=None, headAccessory=None, eyewear=None, body=None), owned={'headAccessory_special_blackHeadband': True, 'headAccessory_special_blueHeadband': True, 'headAccessory_special_greenHeadband': True, 'headAccessory_special_pinkHeadband': True, 'headAccessory_special_redHeadband': True, 'headAccessory_special_whiteHeadband': True, 'headAccessory_special_yellowHeadband': True, 'eyewear_special_blackTopFrame': True, 'eyewear_special_blueTopFrame': True, 'eyewear_special_greenTopFrame': True, 'eyewear_special_pinkTopFrame': True, 'eyewear_special_redTopFrame': True, 'eyewear_special_whiteTopFrame': True, 'eyewear_special_yellowTopFrame': True, 'eyewear_special_blackHalfMoon': True, 'eyewear_special_blueHalfMoon': True, 'eyewear_special_greenHalfMoon': True, 'eyewear_special_pinkHalfMoon': True, 'eyewear_special_redHalfMoon': True, 'eyewear_special_whiteHalfMoon': True, 'eyewear_special_yellowHalfMoon': True}), special=SpecialItems(birthdayReceived=[], birthday=0, thankyouReceived=[], thankyou=0, greetingReceived=[], greeting=0, nyeReceived=[], nye=0, valentineReceived=[], valentine=0, seafoam=0, shinySeed=0, spookySparkles=0, snowball=0, congrats=0, congratsReceived=[], getwell=0, getwellReceived=[], goodluck=0, goodluckReceived=[]), lastDrop=LastDropItems(count=0, date=datetime.datetime(2024, 10, 19, 18, 43, 39, 784000, tzinfo=datetime.timezone.utc)), currentMount='Velociraptor-Base', currentPet='Rat-Shade', quests={'dustbunnies': 1}, mounts={}, food={}, hatchingPotions={}, eggs={}, pets={}), invitations=InvitationsUser(party={}, guilds=[], parties=[]), party=PartyUser(quest=QuestParty(progress=ProgressQuest(up=0.0, down=0.0, collect={}, collectedItems=0), RSVPNeeded=False, key=None, completed=None), order='level', orderAscending='ascending', _id=None), profile=ProfileUser(blurb=None, imageUrl=None, name='test'), stats=StatsUser(buffs=BuffsStats(Str=0, per=0, con=0, stealth=0, streaks=False, seafoam=False, shinySeed=False, snowball=False, spookySparkles=False, Int=0), training=TrainingStats(Str=0.0, per=0, con=0, Int=0), hp=50.0, mp=10.0, exp=0, gp=0.0, lvl=1, Class=<HabiticaClass.WARRIOR: 'warrior'>, points=0, Str=0, con=0, per=0, toNextLevel=25, maxHealth=50, maxMP=30, Int=0), notifications=[], tags=[TagsUser(id=UUID('5358c71f-fe0f-4583-84a3-109b70c699fd'), name='Arbeit', challenge=None, group=None), TagsUser(id=UUID('45870b8b-3e1e-4e13-a722-6afcacdf689f'), name='Training', challenge=None, group=None), TagsUser(id=UUID('3e49b9db-0cc5-4070-b860-e16f1e4806a4'), name='Gesundheit + Wohlbefinden', challenge=None, group=None), TagsUser(id=UUID('0d85319e-7b9c-43e2-81ed-2a706521d5e3'), name='Schule', challenge=None, group=None), TagsUser(id=UUID('b7cf86bf-97ac-42d3-b5d0-5ffe998b62b4'), name='Teams', challenge=None, group=None), TagsUser(id=UUID('c584d792-0a9b-4646-a6ca-a67bb6ef3c36'), name='Hausarbeiten', challenge=None, group=None), TagsUser(id=UUID('0602fd13-edf2-46a7-99c0-c5084046efbb'), name='Kreativität', challenge=None, group=None)], inbox=InboxUser(newMessages=0, optOut=False, blocks=[], messages={}), tasksOrder=TasksOrderUser(habits=[UUID('21b10675-e238-4462-be11-1a4f8012fc9c'), UUID('69909140-a920-4b83-b018-b9156760aca3'), UUID('7e0679cf-e9cd-4604-b429-d061ea16ce72'), UUID('270df162-d47d-488b-9c1d-4fc4f0e2b2d2'), UUID('80ad00b5-622e-4d1a-af4d-6a6c199f3571'), UUID('0712669d-8374-4211-84ea-715cbcbae9c1'), UUID('56dee98d-038a-43f3-a514-59b1ed9a52ee'), UUID('25df4765-754c-47b1-a011-83b31f70c4fb')], dailys=[UUID('e22e9ef0-15be-478a-81c7-f9fdbb4fac10'), UUID('2a74baa2-3acd-426c-bce4-6b4bb145a8d5'), UUID('e18d0899-7c59-41c0-affd-318b8850c3e5'), UUID('3d0cecac-73c1-462b-ab39-a39cea107e6b'), UUID('1ed21cd0-e6f5-4707-b1b4-fb376d462387'), UUID('9117ad5e-2cda-43e0-a07c-0b175d32c0eb')], todos=[UUID('ac13c62c-9375-4809-a357-0e42b01a1b43'), UUID('2388ccad-0387-4ea6-9968-2d10d994e903'), UUID('5c6efb91-6ae3-4cad-8b19-2dd2fc52a965'), UUID('80afe0b9-e367-4473-8117-b8bc7115f54a'), UUID('4cc21c36-886c-4a43-b580-877e958a37fd'), UUID('10a45996-7133-4ca1-84d8-abf1093d9dcc'), UUID('fb867459-ae50-4cee-9017-c13206c6dfa2')], rewards=[UUID('4b18ccf6-3934-43a5-a153-31af8b2a36d9')]), extra={}, pushDevices=[], webhooks=[], loginIncentives=0, invitesSent=0, pinnedItems=[PinnedItemsUser(path='gear.flat.weapon_warrior_0', Type='marketGear'), PinnedItemsUser(path='gear.flat.armor_warrior_1', Type='marketGear'), PinnedItemsUser(path='gear.flat.shield_warrior_1', Type='marketGear'), PinnedItemsUser(path='gear.flat.head_warrior_1', Type='marketGear'), PinnedItemsUser(path='potion', Type='potion'), PinnedItemsUser(path='armoire', Type='armoire')], pinnedItemsOrder=[], unpinnedItems=[], secret=None, balance=0.0, lastCron=datetime.datetime(2024, 10, 19, 18, 43, 39, 784000, tzinfo=datetime.timezone.utc), needsCron=False, challenges=[], guilds=[], newMessages={}), success=True, notifications=[], userV=5, appVersion='5.28.8')
7
4
  # ---
5
+ # name: test_get_user_anonymized
6
+ HabiticaUserAnonymizedResponse(data=UserAnonymizedData(user=UserData(id=None, preferences=PreferencesUser(hair=HairPreferences(color=None, base=None, bangs=None, beard=None, mustache=None, flower=None), emailNotifications=EmailNotificationsPreferences(unsubscribeFromAll=None, newPM=None, kickedGroup=None, wonChallenge=None, giftedGems=None, giftedSubscription=None, invitedParty=None, invitedGuild=None, questStarted=None, invitedQuest=None, importantAnnouncements=None, weeklyRecaps=None, onboarding=None, majorUpdates=None, subscriptionReminders=None, contentRelease=None), pushNotifications=PushNotificationsPreferences(unsubscribeFromAll=None, newPM=None, wonChallenge=None, giftedGems=None, giftedSubscription=None, invitedParty=None, invitedGuild=None, questStarted=None, invitedQuest=None, majorUpdates=None, mentionParty=None, mentionJoinedGuild=None, mentionUnjoinedGuild=None, partyActivity=None, contentRelease=None), suppressModals=SuppressModalsPreferences(levelUp=None, hatchPet=None, raisePet=None, streak=None), tasks=TasksPreferences(activeFilter=ActiveFilterTask(habit=None, daily=None, todo=None, reward=None), groupByChallenge=None, confirmScoreNotes=None, mirrorGroupTasks=[]), dayStart=None, size=None, hideHeader=None, skin=None, shirt=None, timezoneOffset=None, sound=None, chair=None, allocationMode=None, autoEquip=None, costume=None, dateFormat=None, sleep=None, stickyHeader=None, disableClasses=None, newTaskEdit=None, dailyDueDefaultView=None, advancedCollapsed=None, toolbarCollapsed=None, reverseChatOrder=None, developerMode=None, displayInviteToPartyWhenPartyIs1=None, background=None, automaticAllocation=None, webhooks={}, improvementCategories=[], timezoneOffsetAtLastCron=None, language=None), flags=FlagsUser(customizationsNotification=None, tour=TourFlags(intro=None, classes=None, stats=None, tavern=None, party=None, guilds=None, challenges=None, market=None, pets=None, mounts=None, hall=None, equipment=None, groupPlans=None), showTour=None, tutorial=TutorialFlags(common=None, ios=None), dropsEnabled=None, itemsEnabled=None, lastNewStuffRead=None, rewrite=None, classSelected=None, rebirthEnabled=None, levelDrops={}, recaptureEmailsPhase=None, weeklyRecapEmailsPhase=None, lastWeeklyRecap=None, communityGuidelinesAccepted=None, cronCount=None, welcomed=None, armoireEnabled=None, armoireOpened=None, armoireEmpty=None, cardReceived=None, warnedLowHealth=None, verifiedUsername=None, newStuff=None, thirdPartyTools=None, mathUpdates=None, lastFreeRebirth=None, chatRevoked=None, chatShadowMuted=None, lastWeeklyRecapDiscriminator=None, onboardingEmailsPhase=None), auth=AuthUser(local=LocalAuth(email=None, username=None, lowerCaseUsername=None, has_password=None), timestamps=LocalTimestamps(created=None, loggedin=None, updated=None), facebook=None, google=None, apple=None), achievements=AchievementsUser(ultimateGearSets=UltimateGearSetsAchievments(healer=None, wizard=None, rogue=None, warrior=None), streak=None, challenges=[], perfect=None, quests=QuestsAchievments(bewilder=None, burnout=None, stressbeast=None, harpy=None, atom3=None, vice3=None, vice1=None, gryphon=None, evilsanta2=None, evilsanta=None, dilatory_derby=None, dilatory=None, atom2=None, atom1=None, dysheartener=None), backToBasics=None, dustDevil=None, primedForPainting=None, completedTask=None, createdTask=None, fedPet=None, hatchedPet=None, purchasedEquipment=None, tickledPink=None, goodAsGold=None, boneCollector=None, seeingRed=None, violetsAreBlue=None, shadyCustomer=None, joinedGuild=None, joinedChallenge=None, partyUp=None), backer=BackerUser(tier=None, npc=None, tokensApplied=None), contributor=ContributorUser(contributions=None, level=None, text=None), permissions=PermissionsUser(fullAccess=None, news=None, userSupport=None, challengeAdmin=None, moderator=None, coupons=None), purchased=PurchasedUser(plan=PlanPurchased(consecutive=ConsecutivePlan(trinkets=None, gemCapExtra=None, offset=None, count=None), mysteryItems=[], gemsBought=None, extraMonths=None, dateUpdated=None, perkMonthCount=None, quantity=None), txnCount=None, background={}, shirt={}, hair={}, skin={}, ads=None, mobileChat=None), history=HistoryUser(todos=[], exp=[]), items=ItemsUser(gear=GearItems(equipped=EquippedGear(weapon=None, armor=None, head=None, shield=None, back=None, headAccessory=None, eyewear=None, body=None), costume=EquippedGear(weapon=None, armor=None, head=None, shield=None, back=None, headAccessory=None, eyewear=None, body=None), owned={}), special=SpecialItems(birthdayReceived=[], birthday=None, thankyouReceived=[], thankyou=None, greetingReceived=[], greeting=None, nyeReceived=[], nye=None, valentineReceived=[], valentine=None, seafoam=None, shinySeed=None, spookySparkles=None, snowball=None, congrats=None, congratsReceived=[], getwell=None, getwellReceived=[], goodluck=None, goodluckReceived=[]), lastDrop=LastDropItems(count=None, date=None), currentMount=None, currentPet=None, quests={}, mounts={}, food={}, hatchingPotions={}, eggs={}, pets={}), invitations=InvitationsUser(party={}, guilds=[], parties=[]), party=PartyUser(quest=QuestParty(progress=ProgressQuest(up=None, down=None, collect={}, collectedItems=None), RSVPNeeded=None, key=None, completed=None), order=None, orderAscending=None, _id=None), profile=ProfileUser(blurb=None, imageUrl=None, name=None), stats=StatsUser(buffs=BuffsStats(Str=None, per=None, con=None, stealth=None, streaks=None, seafoam=None, shinySeed=None, snowball=None, spookySparkles=None, Int=None), training=TrainingStats(Str=None, per=None, con=None, Int=None), hp=None, mp=None, exp=None, gp=None, lvl=None, Class=None, points=None, Str=None, con=None, per=None, toNextLevel=None, maxHealth=None, maxMP=None, Int=None), notifications=[], tags=[], inbox=InboxUser(newMessages=None, optOut=None, blocks=[], messages={}), tasksOrder=TasksOrderUser(habits=[], dailys=[], todos=[], rewards=[]), extra={}, pushDevices=[], webhooks=[], loginIncentives=None, invitesSent=None, pinnedItems=[], pinnedItemsOrder=[], unpinnedItems=[], secret=None, balance=None, lastCron=None, needsCron=None, challenges=[], guilds=[], newMessages={}), tasks=[]))
7
+ # ---