Habiticalib 0.3.6__py3-none-any.whl → 0.3.7rc1__py3-none-any.whl

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.
@@ -11,7 +11,7 @@ from typing import Any, NotRequired, TypedDict
11
11
  from uuid import UUID
12
12
 
13
13
  from mashumaro import field_options
14
- from mashumaro.config import BaseConfig
14
+ from mashumaro.config import TO_DICT_ADD_OMIT_NONE_FLAG
15
15
  from mashumaro.mixins.orjson import DataClassORJSONMixin
16
16
 
17
17
 
@@ -33,18 +33,141 @@ def serialize_datetime(date: str | int | None) -> datetime | None:
33
33
  return None
34
34
 
35
35
 
36
+ @dataclass
37
+ class BaseModel(DataClassORJSONMixin):
38
+ """Base config for dataclasses."""
39
+
40
+ class Config:
41
+ """Configuration for TaskData."""
42
+
43
+ aliases = { # noqa: RUF012
44
+ "Type": "type",
45
+ "Str": "str",
46
+ "Int": "int",
47
+ "Class": "class",
48
+ "tmp": "_tmp",
49
+ "Def": "def",
50
+ "Set": "set",
51
+ }
52
+ serialize_by_alias = True
53
+ omit_none = True
54
+ code_generation_options = [TO_DICT_ADD_OMIT_NONE_FLAG] # noqa: RUF012
55
+
56
+ def __eq__(self, value: object) -> bool:
57
+ """Check if two instances are equal."""
58
+ if issubclass(type(value), type(self)):
59
+ return all(
60
+ getattr(self, field) == getattr(value, field)
61
+ for field in self.__dataclass_fields__
62
+ )
63
+ return super().__eq__(value)
64
+
65
+
66
+ @dataclass(kw_only=True)
67
+ class EquippedGear(BaseModel):
68
+ """Gear equipped data."""
69
+
70
+ weapon: str | None = None
71
+ armor: str | None = None
72
+ head: str | None = None
73
+ shield: str | None = None
74
+ back: str | None = None
75
+ headAccessory: str | None = None
76
+ eyewear: str | None = None
77
+ body: str | None = None
78
+
79
+
80
+ @dataclass(kw_only=True, eq=False)
81
+ class GearItemsAvatar(BaseModel):
82
+ """Items gear avatar data."""
83
+
84
+ equipped: EquippedGear = field(default_factory=EquippedGear)
85
+ costume: EquippedGear = field(default_factory=EquippedGear)
86
+
87
+
88
+ @dataclass(kw_only=True, eq=False)
89
+ class ItemsAvatar(BaseModel):
90
+ """Items avatar data."""
91
+
92
+ gear: GearItemsAvatar = field(default_factory=GearItemsAvatar)
93
+ currentMount: str | None = None
94
+ currentPet: str | None = None
95
+
96
+
97
+ class HabiticaClass(StrEnum):
98
+ """Habitica's player classes."""
99
+
100
+ WARRIOR = "warrior"
101
+ ROGUE = "rogue"
102
+ MAGE = "wizard"
103
+ HEALER = "healer"
104
+
105
+
106
+ @dataclass(kw_only=True)
107
+ class HairPreferences(BaseModel):
108
+ """Hair preferences data."""
109
+
110
+ color: str | None = None
111
+ base: int | None = None
112
+ bangs: int | None = None
113
+ beard: int | None = None
114
+ mustache: int | None = None
115
+ flower: int | None = None
116
+
117
+
118
+ @dataclass(kw_only=True, eq=False)
119
+ class PreferencesAvatar(BaseModel):
120
+ """Preferences avatar data."""
121
+
122
+ hair: HairPreferences = field(default_factory=HairPreferences)
123
+ size: str | None = None
124
+ skin: str | None = None
125
+ shirt: str | None = None
126
+ chair: str | None = None
127
+ costume: bool | None = None
128
+ sleep: bool | None = None
129
+ background: str | None = None
130
+
131
+
132
+ @dataclass(kw_only=True, eq=False)
133
+ class BuffsStatsavatar(BaseModel):
134
+ """Buffs stats avatar data."""
135
+
136
+ seafoam: bool | None = None
137
+ shinySeed: bool | None = None
138
+ snowball: bool | None = None
139
+ spookySparkles: bool | None = None
140
+
141
+
142
+ @dataclass(kw_only=True, eq=False)
143
+ class StatsAvatar(BaseModel):
144
+ """Stats avatar data."""
145
+
146
+ buffs: BuffsStatsavatar = field(default_factory=BuffsStatsavatar)
147
+ Class: HabiticaClass = HabiticaClass.WARRIOR
148
+
149
+
150
+ @dataclass(kw_only=True, eq=False)
151
+ class Avatar(BaseModel):
152
+ """Represents data for avatar visuals."""
153
+
154
+ items: ItemsAvatar = field(default_factory=ItemsAvatar)
155
+ preferences: PreferencesAvatar = field(default_factory=PreferencesAvatar)
156
+ stats: StatsAvatar = field(default_factory=StatsAvatar)
157
+
158
+
36
159
  @dataclass(kw_only=True)
37
- class NotificationsUser:
160
+ class NotificationsUser(BaseModel):
38
161
  """Notifications User data."""
39
162
 
40
- Type: str = field(metadata=field_options(alias="type"))
163
+ Type: str
41
164
  data: dict[str, Any]
42
165
  seen: bool
43
166
  id: UUID
44
167
 
45
168
 
46
169
  @dataclass(kw_only=True)
47
- class HabiticaResponse(DataClassORJSONMixin):
170
+ class HabiticaResponse(BaseModel):
48
171
  """Representation of a base Habitica API response."""
49
172
 
50
173
  data: Any
@@ -55,7 +178,7 @@ class HabiticaResponse(DataClassORJSONMixin):
55
178
 
56
179
 
57
180
  @dataclass(kw_only=True)
58
- class LoginData:
181
+ class LoginData(BaseModel):
59
182
  """Login data."""
60
183
 
61
184
  id: UUID
@@ -73,7 +196,7 @@ class HabiticaLoginResponse(HabiticaResponse):
73
196
 
74
197
 
75
198
  @dataclass(kw_only=True)
76
- class LocalAuth:
199
+ class LocalAuth(BaseModel):
77
200
  """Auth local data."""
78
201
 
79
202
  email: str | None = None
@@ -83,7 +206,7 @@ class LocalAuth:
83
206
 
84
207
 
85
208
  @dataclass(kw_only=True)
86
- class LocalTimestamps:
209
+ class LocalTimestamps(BaseModel):
87
210
  """Timestamps local data."""
88
211
 
89
212
  created: datetime | None = None
@@ -92,7 +215,7 @@ class LocalTimestamps:
92
215
 
93
216
 
94
217
  @dataclass(kw_only=True)
95
- class AuthUser:
218
+ class AuthUser(BaseModel):
96
219
  """User auth data."""
97
220
 
98
221
  local: LocalAuth = field(default_factory=LocalAuth)
@@ -103,7 +226,7 @@ class AuthUser:
103
226
 
104
227
 
105
228
  @dataclass(kw_only=True)
106
- class UltimateGearSetsAchievments:
229
+ class UltimateGearSetsAchievments(BaseModel):
107
230
  """Achievments ultimateGearSets data."""
108
231
 
109
232
  healer: bool | None = None
@@ -113,7 +236,7 @@ class UltimateGearSetsAchievments:
113
236
 
114
237
 
115
238
  @dataclass(kw_only=True)
116
- class QuestsAchievments:
239
+ class QuestsAchievments(BaseModel):
117
240
  """Achievments quests."""
118
241
 
119
242
  bewilder: int | None = None
@@ -134,7 +257,7 @@ class QuestsAchievments:
134
257
 
135
258
 
136
259
  @dataclass(kw_only=True)
137
- class AchievementsUser:
260
+ class AchievementsUser(BaseModel):
138
261
  """User achievments data."""
139
262
 
140
263
  ultimateGearSets: UltimateGearSetsAchievments = field(
@@ -164,7 +287,7 @@ class AchievementsUser:
164
287
 
165
288
 
166
289
  @dataclass(kw_only=True)
167
- class BackerUser:
290
+ class BackerUser(BaseModel):
168
291
  """User backer data."""
169
292
 
170
293
  tier: int | None = None
@@ -173,7 +296,7 @@ class BackerUser:
173
296
 
174
297
 
175
298
  @dataclass(kw_only=True)
176
- class PermissionsUser:
299
+ class PermissionsUser(BaseModel):
177
300
  """User permissions data."""
178
301
 
179
302
  fullAccess: bool | None = None
@@ -185,7 +308,7 @@ class PermissionsUser:
185
308
 
186
309
 
187
310
  @dataclass(kw_only=True)
188
- class ContributorUser:
311
+ class ContributorUser(BaseModel):
189
312
  """User contributer data."""
190
313
 
191
314
  contributions: str | None = None
@@ -194,7 +317,7 @@ class ContributorUser:
194
317
 
195
318
 
196
319
  @dataclass(kw_only=True)
197
- class ConsecutivePlan:
320
+ class ConsecutivePlan(BaseModel):
198
321
  """Plan consecutive data."""
199
322
 
200
323
  trinkets: int | None = None
@@ -204,7 +327,7 @@ class ConsecutivePlan:
204
327
 
205
328
 
206
329
  @dataclass(kw_only=True)
207
- class PlanPurchased:
330
+ class PlanPurchased(BaseModel):
208
331
  """Purchased background data."""
209
332
 
210
333
  consecutive: ConsecutivePlan = field(default_factory=ConsecutivePlan)
@@ -217,7 +340,7 @@ class PlanPurchased:
217
340
 
218
341
 
219
342
  @dataclass(kw_only=True)
220
- class PurchasedUser:
343
+ class PurchasedUser(BaseModel):
221
344
  """User purchased data."""
222
345
 
223
346
  plan: PlanPurchased = field(default_factory=PlanPurchased)
@@ -231,7 +354,7 @@ class PurchasedUser:
231
354
 
232
355
 
233
356
  @dataclass(kw_only=True)
234
- class TourFlags:
357
+ class TourFlags(BaseModel):
235
358
  """Flags tour data."""
236
359
 
237
360
  intro: int | None = None
@@ -250,7 +373,7 @@ class TourFlags:
250
373
 
251
374
 
252
375
  @dataclass(kw_only=True)
253
- class CommonTutorial:
376
+ class CommonTutorial(BaseModel):
254
377
  """Tutorial common data."""
255
378
 
256
379
  habits: bool
@@ -271,7 +394,7 @@ class CommonTutorial:
271
394
 
272
395
 
273
396
  @dataclass(kw_only=True)
274
- class IosTutorial:
397
+ class IosTutorial(BaseModel):
275
398
  """Tutorial ios data."""
276
399
 
277
400
  addTask: bool
@@ -284,7 +407,7 @@ class IosTutorial:
284
407
 
285
408
 
286
409
  @dataclass(kw_only=True)
287
- class TutorialFlags:
410
+ class TutorialFlags(BaseModel):
288
411
  """Flags tutorial data."""
289
412
 
290
413
  common: CommonTutorial | None = None
@@ -292,7 +415,7 @@ class TutorialFlags:
292
415
 
293
416
 
294
417
  @dataclass(kw_only=True)
295
- class FlagsUser:
418
+ class FlagsUser(BaseModel):
296
419
  """User flags data."""
297
420
 
298
421
  customizationsNotification: bool | None = None
@@ -329,7 +452,7 @@ class FlagsUser:
329
452
 
330
453
 
331
454
  @dataclass(kw_only=True)
332
- class EntryHistory:
455
+ class EntryHistory(BaseModel):
333
456
  """History entry data."""
334
457
 
335
458
  date: datetime = field(
@@ -345,7 +468,7 @@ class EntryHistory:
345
468
 
346
469
 
347
470
  @dataclass(kw_only=True)
348
- class HistoryUser:
471
+ class HistoryUser(BaseModel):
349
472
  """User history data."""
350
473
 
351
474
  todos: list[EntryHistory] = field(default_factory=list)
@@ -353,30 +476,14 @@ class HistoryUser:
353
476
 
354
477
 
355
478
  @dataclass(kw_only=True)
356
- class EquippedGear:
357
- """Gear equipped data."""
358
-
359
- weapon: str | None = None
360
- armor: str | None = None
361
- head: str | None = None
362
- shield: str | None = None
363
- back: str | None = None
364
- headAccessory: str | None = None
365
- eyewear: str | None = None
366
- body: str | None = None
367
-
368
-
369
- @dataclass(kw_only=True)
370
- class GearItems:
479
+ class GearItems(GearItemsAvatar, BaseModel):
371
480
  """Items gear data."""
372
481
 
373
- equipped: EquippedGear = field(default_factory=EquippedGear)
374
- costume: EquippedGear = field(default_factory=EquippedGear)
375
482
  owned: dict[str, bool] = field(default_factory=dict)
376
483
 
377
484
 
378
485
  @dataclass(kw_only=True)
379
- class SpecialItems:
486
+ class SpecialItems(BaseModel):
380
487
  """Items special data."""
381
488
 
382
489
  birthdayReceived: list = field(default_factory=list)
@@ -402,7 +509,7 @@ class SpecialItems:
402
509
 
403
510
 
404
511
  @dataclass(kw_only=True)
405
- class LastDropItems:
512
+ class LastDropItems(BaseModel):
406
513
  """LastDrop items data."""
407
514
 
408
515
  count: int | None = None
@@ -410,14 +517,12 @@ class LastDropItems:
410
517
 
411
518
 
412
519
  @dataclass(kw_only=True)
413
- class ItemsUser:
520
+ class ItemsUser(ItemsAvatar, BaseModel):
414
521
  """User items data."""
415
522
 
416
523
  gear: GearItems = field(default_factory=GearItems)
417
524
  special: SpecialItems = field(default_factory=SpecialItems)
418
525
  lastDrop: LastDropItems = field(default_factory=LastDropItems)
419
- currentMount: str | None = None
420
- currentPet: str | None = None
421
526
  quests: dict[str, int] = field(default_factory=dict)
422
527
  mounts: dict[str, bool] = field(default_factory=dict)
423
528
  food: dict[str, int] = field(default_factory=dict)
@@ -427,7 +532,7 @@ class ItemsUser:
427
532
 
428
533
 
429
534
  @dataclass(kw_only=True)
430
- class InvitationsUser:
535
+ class InvitationsUser(BaseModel):
431
536
  """Invitations user data."""
432
537
 
433
538
  party: dict = field(default_factory=dict)
@@ -436,7 +541,7 @@ class InvitationsUser:
436
541
 
437
542
 
438
543
  @dataclass(kw_only=True)
439
- class ProgressQuest:
544
+ class ProgressQuest(BaseModel):
440
545
  """Quest progress data."""
441
546
 
442
547
  up: float | None = None
@@ -446,7 +551,7 @@ class ProgressQuest:
446
551
 
447
552
 
448
553
  @dataclass(kw_only=True)
449
- class QuestParty:
554
+ class QuestParty(BaseModel):
450
555
  """Party quest data."""
451
556
 
452
557
  progress: ProgressQuest = field(default_factory=ProgressQuest)
@@ -456,7 +561,7 @@ class QuestParty:
456
561
 
457
562
 
458
563
  @dataclass(kw_only=True)
459
- class PartyUser:
564
+ class PartyUser(BaseModel):
460
565
  """Party user data."""
461
566
 
462
567
  quest: QuestParty = field(default_factory=QuestParty)
@@ -466,19 +571,7 @@ class PartyUser:
466
571
 
467
572
 
468
573
  @dataclass(kw_only=True)
469
- class HairPreferences:
470
- """Hair preferences data."""
471
-
472
- color: str | None = None
473
- base: int | None = None
474
- bangs: int | None = None
475
- beard: int | None = None
476
- mustache: int | None = None
477
- flower: int | None = None
478
-
479
-
480
- @dataclass(kw_only=True)
481
- class EmailNotificationsPreferences:
574
+ class EmailNotificationsPreferences(BaseModel):
482
575
  """EmailNotifications preferences data."""
483
576
 
484
577
  unsubscribeFromAll: bool | None = None
@@ -500,7 +593,7 @@ class EmailNotificationsPreferences:
500
593
 
501
594
 
502
595
  @dataclass(kw_only=True)
503
- class PushNotificationsPreferences:
596
+ class PushNotificationsPreferences(BaseModel):
504
597
  """PushNotifications preferences data."""
505
598
 
506
599
  unsubscribeFromAll: bool | None = None
@@ -521,7 +614,7 @@ class PushNotificationsPreferences:
521
614
 
522
615
 
523
616
  @dataclass(kw_only=True)
524
- class SuppressModalsPreferences:
617
+ class SuppressModalsPreferences(BaseModel):
525
618
  """SupressModals preferences data."""
526
619
 
527
620
  levelUp: bool | None = None
@@ -531,7 +624,7 @@ class SuppressModalsPreferences:
531
624
 
532
625
 
533
626
  @dataclass(kw_only=True)
534
- class ActiveFilterTask:
627
+ class ActiveFilterTask(BaseModel):
535
628
  """ActiveFilter task data."""
536
629
 
537
630
  habit: str | None = None
@@ -541,7 +634,7 @@ class ActiveFilterTask:
541
634
 
542
635
 
543
636
  @dataclass(kw_only=True)
544
- class TasksPreferences:
637
+ class TasksPreferences(BaseModel):
545
638
  """Tasks preferences data."""
546
639
 
547
640
  activeFilter: ActiveFilterTask = field(default_factory=ActiveFilterTask)
@@ -551,10 +644,9 @@ class TasksPreferences:
551
644
 
552
645
 
553
646
  @dataclass(kw_only=True)
554
- class PreferencesUser:
647
+ class PreferencesUser(PreferencesAvatar, BaseModel):
555
648
  """Preferences user data."""
556
649
 
557
- hair: HairPreferences = field(default_factory=HairPreferences)
558
650
  emailNotifications: EmailNotificationsPreferences = field(
559
651
  default_factory=EmailNotificationsPreferences
560
652
  )
@@ -566,18 +658,12 @@ class PreferencesUser:
566
658
  )
567
659
  tasks: TasksPreferences = field(default_factory=TasksPreferences)
568
660
  dayStart: int | None = None
569
- size: str | None = None
570
661
  hideHeader: bool | None = None
571
- skin: str | None = None
572
- shirt: str | None = None
573
662
  timezoneOffset: int | None = None
574
663
  sound: str | None = None
575
- chair: str | None = None
576
664
  allocationMode: str | None = None
577
665
  autoEquip: bool | None = None
578
- costume: bool | None = None
579
666
  dateFormat: str | None = None
580
- sleep: bool | None = None
581
667
  stickyHeader: bool | None = None
582
668
  disableClasses: bool | None = None
583
669
  newTaskEdit: bool | None = None
@@ -587,7 +673,6 @@ class PreferencesUser:
587
673
  reverseChatOrder: bool | None = None
588
674
  developerMode: bool | None = None
589
675
  displayInviteToPartyWhenPartyIs1: bool | None = None
590
- background: str | None = None
591
676
  automaticAllocation: bool | None = None
592
677
  webhooks: dict = field(default_factory=dict)
593
678
  improvementCategories: list[str] = field(default_factory=list)
@@ -596,7 +681,7 @@ class PreferencesUser:
596
681
 
597
682
 
598
683
  @dataclass(kw_only=True)
599
- class ProfileUser:
684
+ class ProfileUser(BaseModel):
600
685
  """Profile user data."""
601
686
 
602
687
  blurb: str | None = None
@@ -605,10 +690,10 @@ class ProfileUser:
605
690
 
606
691
 
607
692
  @dataclass(kw_only=True)
608
- class BuffsStats:
693
+ class BuffsStats(BuffsStatsavatar, BaseModel):
609
694
  """Buffs stats data."""
610
695
 
611
- Str: int | None = field(default=None, metadata=field_options(alias="str"))
696
+ Str: int | None = None
612
697
  per: int | None = None
613
698
  con: int | None = None
614
699
  stealth: int | None = None
@@ -617,30 +702,21 @@ class BuffsStats:
617
702
  shinySeed: bool | None = None
618
703
  snowball: bool | None = None
619
704
  spookySparkles: bool | None = None
620
- Int: int | None = field(default=None, metadata=field_options(alias="int"))
705
+ Int: int | None = None
621
706
 
622
707
 
623
708
  @dataclass(kw_only=True)
624
- class TrainingStats:
709
+ class TrainingStats(BaseModel):
625
710
  """Training stats data."""
626
711
 
627
- Str: float | None = field(default=None, metadata=field_options(alias="str"))
712
+ Str: float | None = None
628
713
  per: int | None = None
629
714
  con: int | None = None
630
- Int: int | None = field(default=None, metadata=field_options(alias="int"))
631
-
632
-
633
- class HabiticaClass(StrEnum):
634
- """Habitica's player classes."""
635
-
636
- WARRIOR = "warrior"
637
- ROGUE = "rogue"
638
- MAGE = "wizard"
639
- HEALER = "healer"
715
+ Int: int | None = None
640
716
 
641
717
 
642
718
  @dataclass(kw_only=True)
643
- class StatsUser:
719
+ class StatsUser(StatsAvatar, BaseModel):
644
720
  """Stats user data."""
645
721
 
646
722
  buffs: BuffsStats = field(default_factory=BuffsStats)
@@ -650,21 +726,18 @@ class StatsUser:
650
726
  exp: int | None = None
651
727
  gp: float | None = None
652
728
  lvl: int | None = None
653
- Class: HabiticaClass | None = field(
654
- default=None, metadata=field_options(alias="class")
655
- )
656
729
  points: int | None = None
657
- Str: int | None = field(default=None, metadata=field_options(alias="str"))
730
+ Str: int | None = None
658
731
  con: int | None = None
659
732
  per: int | None = None
660
733
  toNextLevel: int | None = None
661
734
  maxHealth: int | None = None
662
735
  maxMP: int | None = None
663
- Int: int | None = field(default=None, metadata=field_options(alias="int"))
736
+ Int: int | None = None
664
737
 
665
738
 
666
739
  @dataclass(kw_only=True)
667
- class TagsUser:
740
+ class TagsUser(BaseModel):
668
741
  """Tags user data."""
669
742
 
670
743
  id: UUID | None = None
@@ -674,7 +747,7 @@ class TagsUser:
674
747
 
675
748
 
676
749
  @dataclass(kw_only=True)
677
- class InboxUser:
750
+ class InboxUser(BaseModel):
678
751
  """Inbox user data."""
679
752
 
680
753
  newMessages: int | None = None
@@ -684,7 +757,7 @@ class InboxUser:
684
757
 
685
758
 
686
759
  @dataclass(kw_only=True)
687
- class TasksOrderUser:
760
+ class TasksOrderUser(BaseModel):
688
761
  """TasksOrder user data."""
689
762
 
690
763
  habits: list[UUID] = field(default_factory=list)
@@ -694,11 +767,11 @@ class TasksOrderUser:
694
767
 
695
768
 
696
769
  @dataclass(kw_only=True)
697
- class PushDevicesUser:
770
+ class PushDevicesUser(BaseModel):
698
771
  """PushDevices user data."""
699
772
 
700
773
  regId: str
701
- Type: str = field(metadata=field_options(alias="type"))
774
+ Type: str
702
775
  createdAt: datetime
703
776
  updatedAt: datetime
704
777
 
@@ -713,7 +786,7 @@ class WebhooksType(StrEnum):
713
786
 
714
787
 
715
788
  @dataclass(kw_only=True)
716
- class WebhooksOptions:
789
+ class WebhooksOptions(BaseModel):
717
790
  """Webhooks options data."""
718
791
 
719
792
  created: bool | None = None
@@ -730,13 +803,11 @@ class WebhooksOptions:
730
803
 
731
804
 
732
805
  @dataclass(kw_only=True)
733
- class WebhooksUser:
806
+ class WebhooksUser(BaseModel):
734
807
  """Webhooks user data."""
735
808
 
736
809
  id: UUID | None = None
737
- Type: WebhooksType = field(
738
- metadata=field_options(alias="type"), default=WebhooksType.TASK_ACTIVITY
739
- )
810
+ Type: WebhooksType = WebhooksType.TASK_ACTIVITY
740
811
  url: str | None = None
741
812
  enabled: bool = True
742
813
  failures: int = 0
@@ -748,15 +819,15 @@ class WebhooksUser:
748
819
 
749
820
 
750
821
  @dataclass(kw_only=True)
751
- class PinnedItemsUser:
822
+ class PinnedItemsUser(BaseModel):
752
823
  """PinnedItems user data."""
753
824
 
754
825
  path: str
755
- Type: str = field(metadata=field_options(alias="type"))
826
+ Type: str
756
827
 
757
828
 
758
829
  @dataclass(kw_only=True)
759
- class UserData:
830
+ class UserData(Avatar, BaseModel):
760
831
  """User data."""
761
832
 
762
833
  id: UUID | None = None
@@ -795,7 +866,6 @@ class UserData:
795
866
  newMessages: dict[str, bool] = field(default_factory=dict)
796
867
 
797
868
 
798
- @dataclass(kw_only=True)
799
869
  class HabiticaUserResponse(HabiticaResponse):
800
870
  """Representation of a user data response."""
801
871
 
@@ -810,7 +880,7 @@ class HabiticaGroupMembersResponse(HabiticaResponse):
810
880
 
811
881
 
812
882
  @dataclass(kw_only=True)
813
- class CompletedBy:
883
+ class CompletedBy(BaseModel):
814
884
  """Task group completedby data."""
815
885
 
816
886
  userId: UUID | None = None
@@ -818,7 +888,7 @@ class CompletedBy:
818
888
 
819
889
 
820
890
  @dataclass(kw_only=True)
821
- class GroupTask:
891
+ class GroupTask(BaseModel):
822
892
  """Task group data."""
823
893
 
824
894
  assignedUsers: list[UUID] | None = None
@@ -832,7 +902,7 @@ class GroupTask:
832
902
 
833
903
 
834
904
  @dataclass(kw_only=True)
835
- class Repeat:
905
+ class Repeat(BaseModel):
836
906
  """Task repeat data."""
837
907
 
838
908
  m: bool = True
@@ -855,7 +925,7 @@ class ChallengeAbortedReason(StrEnum):
855
925
 
856
926
 
857
927
  @dataclass(kw_only=True)
858
- class Challenge:
928
+ class Challenge(BaseModel):
859
929
  """Challenge task data."""
860
930
 
861
931
  id: UUID | None = None
@@ -866,7 +936,7 @@ class Challenge:
866
936
 
867
937
 
868
938
  @dataclass(kw_only=True)
869
- class Reminders:
939
+ class Reminders(BaseModel):
870
940
  """Task reminders data."""
871
941
 
872
942
  id: UUID
@@ -875,7 +945,7 @@ class Reminders:
875
945
 
876
946
 
877
947
  @dataclass(kw_only=True)
878
- class Checklist:
948
+ class Checklist(BaseModel):
879
949
  """Task checklist data."""
880
950
 
881
951
  id: UUID
@@ -939,17 +1009,12 @@ class Task(TypedDict("Task", {"type": NotRequired[TaskType]}), total=True):
939
1009
 
940
1010
 
941
1011
  @dataclass(kw_only=True)
942
- class TaskData(DataClassORJSONMixin):
1012
+ class TaskData(BaseModel):
943
1013
  """Task data."""
944
1014
 
945
- class Config(BaseConfig):
946
- """Configuration for TaskData."""
947
-
948
- serialize_by_alias = True
949
-
950
1015
  challenge: Challenge = field(default_factory=Challenge)
951
1016
  group: GroupTask = field(default_factory=GroupTask)
952
- Type: TaskType | None = field(default=None, metadata=field_options(alias="type"))
1017
+ Type: TaskType | None = None
953
1018
  text: str | None = None
954
1019
  notes: str | None = None
955
1020
  tags: list[UUID] = field(default_factory=list)
@@ -1002,7 +1067,7 @@ class HabiticaTaskResponse(HabiticaResponse):
1002
1067
 
1003
1068
 
1004
1069
  @dataclass(kw_only=True)
1005
- class HabiticaErrorResponse(DataClassORJSONMixin):
1070
+ class HabiticaErrorResponse(BaseModel):
1006
1071
  """Base class for Habitica errors."""
1007
1072
 
1008
1073
  success: bool
@@ -1011,7 +1076,7 @@ class HabiticaErrorResponse(DataClassORJSONMixin):
1011
1076
 
1012
1077
 
1013
1078
  @dataclass(kw_only=True)
1014
- class TasksUserExport:
1079
+ class TasksUserExport(BaseModel):
1015
1080
  """Tasks user export data."""
1016
1081
 
1017
1082
  todos: list[TaskData] = field(default_factory=list)
@@ -1021,68 +1086,7 @@ class TasksUserExport:
1021
1086
 
1022
1087
 
1023
1088
  @dataclass(kw_only=True)
1024
- class BuffsUserStyles:
1025
- """Buffs UserStyles data."""
1026
-
1027
- per: int | None = None
1028
- con: int | None = None
1029
- stealth: int | None = None
1030
- seafoam: bool | None = None
1031
- shinySeed: bool | None = None
1032
- snowball: bool | None = None
1033
- spookySparkles: bool | None = None
1034
-
1035
-
1036
- @dataclass(kw_only=True)
1037
- class StatsUserStyles:
1038
- """Stats user styles data."""
1039
-
1040
- buffs: BuffsUserStyles = field(default_factory=BuffsUserStyles)
1041
- Class: HabiticaClass = field(default=HabiticaClass.WARRIOR)
1042
-
1043
-
1044
- @dataclass(kw_only=True)
1045
- class GearItemsUserStyles:
1046
- """Items gear data."""
1047
-
1048
- equipped: EquippedGear = field(default_factory=EquippedGear)
1049
- costume: EquippedGear = field(default_factory=EquippedGear)
1050
-
1051
-
1052
- @dataclass(kw_only=True)
1053
- class ItemsUserStyles:
1054
- """Items user styles data."""
1055
-
1056
- gear: GearItemsUserStyles = field(default_factory=GearItemsUserStyles)
1057
- currentMount: str | None = None
1058
- currentPet: str | None = None
1059
-
1060
-
1061
- @dataclass(kw_only=True)
1062
- class PreferencesUserStyles:
1063
- """Preferences user styles data."""
1064
-
1065
- hair: HairPreferences = field(default_factory=HairPreferences)
1066
- size: str | None = None
1067
- skin: str | None = None
1068
- shirt: str | None = None
1069
- chair: str | None = None
1070
- costume: bool | None = None
1071
- sleep: bool | None = None
1072
- background: str | None = None
1073
-
1074
-
1075
- @dataclass(kw_only=True)
1076
- class UserStyles(DataClassORJSONMixin):
1077
- """Represents minimalistic data only containing user styles."""
1078
-
1079
- items: ItemsUserStyles = field(default_factory=ItemsUserStyles)
1080
- preferences: PreferencesUserStyles = field(default_factory=PreferencesUserStyles)
1081
- stats: StatsUserStyles = field(default_factory=StatsUserStyles)
1082
-
1083
-
1084
- @dataclass(kw_only=True)
1085
- class HabiticaUserExport(UserData, DataClassORJSONMixin):
1089
+ class HabiticaUserExport(UserData, BaseModel):
1086
1090
  """Representation of a user data export."""
1087
1091
 
1088
1092
  tasks: TasksUserExport = field(default_factory=TasksUserExport)
@@ -1097,7 +1101,7 @@ class UserAnonymizedData:
1097
1101
 
1098
1102
 
1099
1103
  @dataclass(kw_only=True)
1100
- class HabiticaUserAnonymizedResponse(DataClassORJSONMixin):
1104
+ class HabiticaUserAnonymizedResponse(BaseModel):
1101
1105
  """Representation of a anonymized user data export."""
1102
1106
 
1103
1107
  data: UserAnonymizedData
@@ -1111,7 +1115,7 @@ class HabiticaStatsResponse(HabiticaResponse):
1111
1115
 
1112
1116
 
1113
1117
  @dataclass(kw_only=True)
1114
- class QuestTmpScore:
1118
+ class QuestTmpScore(BaseModel):
1115
1119
  """Represents the quest progress details."""
1116
1120
 
1117
1121
  progressDelta: float | None = None
@@ -1119,19 +1123,19 @@ class QuestTmpScore:
1119
1123
 
1120
1124
 
1121
1125
  @dataclass(kw_only=True)
1122
- class DropTmpScore:
1126
+ class DropTmpScore(BaseModel):
1123
1127
  """Represents the details of an item drop."""
1124
1128
 
1125
1129
  target: str | None = None
1126
1130
  canDrop: bool | None = None
1127
1131
  value: int | None = None
1128
1132
  key: str | None = None
1129
- Type: str | None = field(default=None, metadata=field_options(alias="type"))
1133
+ Type: str | None = None
1130
1134
  dialog: str | None = None
1131
1135
 
1132
1136
 
1133
1137
  @dataclass(kw_only=True)
1134
- class TmpScore:
1138
+ class TmpScore(BaseModel):
1135
1139
  """Temporary quest and drop data."""
1136
1140
 
1137
1141
  quest: QuestTmpScore = field(default_factory=QuestTmpScore)
@@ -1143,34 +1147,32 @@ class ScoreData(StatsUser):
1143
1147
  """Scora data."""
1144
1148
 
1145
1149
  delta: float | None = None
1146
- tmp: TmpScore = field(
1147
- default_factory=TmpScore, metadata=field_options(alias="_tmp")
1148
- )
1150
+ tmp: TmpScore = field(default_factory=TmpScore)
1149
1151
 
1150
1152
 
1151
1153
  @dataclass(kw_only=True)
1152
- class HabiticaScoreResponse(HabiticaResponse, DataClassORJSONMixin):
1154
+ class HabiticaScoreResponse(HabiticaResponse):
1153
1155
  """Representation of a score response."""
1154
1156
 
1155
1157
  data: ScoreData
1156
1158
 
1157
1159
 
1158
1160
  @dataclass(kw_only=True)
1159
- class HabiticaTagsResponse(HabiticaResponse, DataClassORJSONMixin):
1161
+ class HabiticaTagsResponse(HabiticaResponse):
1160
1162
  """Representation of a score response."""
1161
1163
 
1162
1164
  data: list[TagsUser]
1163
1165
 
1164
1166
 
1165
1167
  @dataclass(kw_only=True)
1166
- class HabiticaTagResponse(HabiticaResponse, DataClassORJSONMixin):
1168
+ class HabiticaTagResponse(HabiticaResponse):
1167
1169
  """Representation of a score response."""
1168
1170
 
1169
1171
  data: TagsUser
1170
1172
 
1171
1173
 
1172
1174
  @dataclass(kw_only=True)
1173
- class QuestData:
1175
+ class QuestData(BaseModel):
1174
1176
  """Quest data."""
1175
1177
 
1176
1178
  progress: ProgressQuest = field(default_factory=ProgressQuest)
@@ -1182,14 +1184,14 @@ class QuestData:
1182
1184
 
1183
1185
 
1184
1186
  @dataclass(kw_only=True)
1185
- class HabiticaQuestResponse(HabiticaResponse, DataClassORJSONMixin):
1187
+ class HabiticaQuestResponse(HabiticaResponse):
1186
1188
  """Representation of a quest response."""
1187
1189
 
1188
1190
  data: QuestData
1189
1191
 
1190
1192
 
1191
1193
  @dataclass
1192
- class ChangeClassData:
1194
+ class ChangeClassData(BaseModel):
1193
1195
  """Change class data."""
1194
1196
 
1195
1197
  preferences: PreferencesUser = field(default_factory=PreferencesUser)
@@ -1199,7 +1201,7 @@ class ChangeClassData:
1199
1201
 
1200
1202
 
1201
1203
  @dataclass(kw_only=True)
1202
- class HabiticaClassSystemResponse(HabiticaResponse, DataClassORJSONMixin):
1204
+ class HabiticaClassSystemResponse(HabiticaResponse):
1203
1205
  """Representation of a change-class response."""
1204
1206
 
1205
1207
  data: ChangeClassData
@@ -1313,7 +1315,7 @@ class TaskPriority(Enum):
1313
1315
 
1314
1316
 
1315
1317
  @dataclass
1316
- class AchievmentContent:
1318
+ class AchievmentContent(BaseModel):
1317
1319
  """Achievment content data."""
1318
1320
 
1319
1321
  icon: str
@@ -1327,7 +1329,7 @@ class AchievmentContent:
1327
1329
 
1328
1330
 
1329
1331
  @dataclass
1330
- class AnimalColorAchievementContent:
1332
+ class AnimalColorAchievementContent(BaseModel):
1331
1333
  """animalColorAchievement content data."""
1332
1334
 
1333
1335
  color: str
@@ -1338,17 +1340,17 @@ class AnimalColorAchievementContent:
1338
1340
 
1339
1341
 
1340
1342
  @dataclass
1341
- class AnimalSetAchievementContent:
1343
+ class AnimalSetAchievementContent(BaseModel):
1342
1344
  """animalSetAchievements content data."""
1343
1345
 
1344
- Type: str = field(metadata=field_options(alias="type"))
1346
+ Type: str
1345
1347
  species: list[str]
1346
1348
  achievementKey: str
1347
1349
  notificationType: str
1348
1350
 
1349
1351
 
1350
1352
  @dataclass
1351
- class StableAchievementContent:
1353
+ class StableAchievementContent(BaseModel):
1352
1354
  """stableAchievements content data."""
1353
1355
 
1354
1356
  masterAchievement: str
@@ -1356,7 +1358,7 @@ class StableAchievementContent:
1356
1358
 
1357
1359
 
1358
1360
  @dataclass
1359
- class PetSetCompleteAchievsContent:
1361
+ class PetSetCompleteAchievsContent(BaseModel):
1360
1362
  """petSetCompleteAchievs content data."""
1361
1363
 
1362
1364
  color: str
@@ -1365,7 +1367,7 @@ class PetSetCompleteAchievsContent:
1365
1367
 
1366
1368
 
1367
1369
  @dataclass
1368
- class QuestBossRage:
1370
+ class QuestBossRage(BaseModel):
1369
1371
  """QuestBossRage content data."""
1370
1372
 
1371
1373
  title: str
@@ -1376,36 +1378,36 @@ class QuestBossRage:
1376
1378
 
1377
1379
 
1378
1380
  @dataclass
1379
- class QuestBoss:
1381
+ class QuestBoss(BaseModel):
1380
1382
  """QuestBoss content data."""
1381
1383
 
1382
1384
  name: str
1383
1385
  hp: float
1384
- Str: float = field(metadata=field_options(alias="str"))
1385
- Def: float = field(metadata=field_options(alias="def"))
1386
+ Str: float
1387
+ Def: float
1386
1388
  rage: QuestBossRage | None = None
1387
1389
 
1388
1390
 
1389
1391
  @dataclass
1390
- class QuestItem:
1392
+ class QuestItem(BaseModel):
1391
1393
  """QuestItem content data."""
1392
1394
 
1393
- Type: str = field(metadata=field_options(alias="type"))
1395
+ Type: str
1394
1396
  key: str
1395
1397
  text: str
1396
1398
 
1397
1399
 
1398
1400
  @dataclass
1399
- class QuestDrop:
1401
+ class QuestDrop(BaseModel):
1400
1402
  """QuestDrop content data."""
1401
1403
 
1402
1404
  gp: float
1403
1405
  exp: float
1404
- items: list[QuestItem] | None = None
1406
+ items: list[QuestItem] = field(default_factory=list)
1405
1407
 
1406
1408
 
1407
1409
  @dataclass
1408
- class QuestCollect:
1410
+ class QuestCollect(BaseModel):
1409
1411
  """QuestCollect content data."""
1410
1412
 
1411
1413
  text: str
@@ -1413,7 +1415,7 @@ class QuestCollect:
1413
1415
 
1414
1416
 
1415
1417
  @dataclass
1416
- class QuestUnlockCondition:
1418
+ class QuestUnlockCondition(BaseModel):
1417
1419
  """QuestUnlockCondition content data."""
1418
1420
 
1419
1421
  condition: str
@@ -1421,7 +1423,7 @@ class QuestUnlockCondition:
1421
1423
 
1422
1424
 
1423
1425
  @dataclass
1424
- class QuestsContent:
1426
+ class QuestsContent(BaseModel):
1425
1427
  """petSetCompleteAchievs content data."""
1426
1428
 
1427
1429
  text: str
@@ -1443,7 +1445,7 @@ class QuestsContent:
1443
1445
 
1444
1446
 
1445
1447
  @dataclass
1446
- class ItemListEntry:
1448
+ class ItemListEntry(BaseModel):
1447
1449
  """ItemListEntry content data."""
1448
1450
 
1449
1451
  localeKey: str
@@ -1451,7 +1453,7 @@ class ItemListEntry:
1451
1453
 
1452
1454
 
1453
1455
  @dataclass
1454
- class ItemListContent:
1456
+ class ItemListContent(BaseModel):
1455
1457
  """ItemListContent content data."""
1456
1458
 
1457
1459
  weapon: ItemListEntry
@@ -1472,25 +1474,25 @@ class ItemListContent:
1472
1474
 
1473
1475
 
1474
1476
  @dataclass
1475
- class GearEntry:
1477
+ class GearEntry(BaseModel):
1476
1478
  """GearEntry content data."""
1477
1479
 
1478
1480
  text: str
1479
1481
  notes: str
1480
- Int: int = field(metadata=field_options(alias="int"))
1482
+ Int: int
1481
1483
  value: int
1482
- Type: str = field(metadata=field_options(alias="type"))
1484
+ Type: str
1483
1485
  key: str
1484
- Set: str = field(metadata=field_options(alias="set"))
1486
+ Set: str
1485
1487
  klass: str
1486
1488
  index: str
1487
- Str: int = field(metadata=field_options(alias="str"))
1489
+ Str: int
1488
1490
  per: int
1489
1491
  con: int
1490
1492
 
1491
1493
 
1492
1494
  @dataclass
1493
- class GearClass:
1495
+ class GearClass(BaseModel):
1494
1496
  """GearClass content data."""
1495
1497
 
1496
1498
  base: dict[str, GearEntry] | None = None
@@ -1504,7 +1506,7 @@ class GearClass:
1504
1506
 
1505
1507
 
1506
1508
  @dataclass
1507
- class GearType:
1509
+ class GearType(BaseModel):
1508
1510
  """GearType content data."""
1509
1511
 
1510
1512
  weapon: GearClass
@@ -1518,7 +1520,7 @@ class GearType:
1518
1520
 
1519
1521
 
1520
1522
  @dataclass
1521
- class GearContent:
1523
+ class GearContent(BaseModel):
1522
1524
  """GearContent content data."""
1523
1525
 
1524
1526
  tree: GearType
@@ -1526,7 +1528,7 @@ class GearContent:
1526
1528
 
1527
1529
 
1528
1530
  @dataclass
1529
- class SpellEntry:
1531
+ class SpellEntry(BaseModel):
1530
1532
  """SpellEntry content data."""
1531
1533
 
1532
1534
  text: str
@@ -1544,7 +1546,7 @@ class SpellEntry:
1544
1546
 
1545
1547
 
1546
1548
  @dataclass
1547
- class SpellsClass:
1549
+ class SpellsClass(BaseModel):
1548
1550
  """SpellsClass content data."""
1549
1551
 
1550
1552
  wizard: dict[str, SpellEntry]
@@ -1555,8 +1557,8 @@ class SpellsClass:
1555
1557
 
1556
1558
 
1557
1559
  @dataclass
1558
- class CarTypes:
1559
- """CarTypes content data."""
1560
+ class CardTypes(BaseModel):
1561
+ """CardTypes content data."""
1560
1562
 
1561
1563
  key: str
1562
1564
  messageOptions: int
@@ -1564,7 +1566,7 @@ class CarTypes:
1564
1566
 
1565
1567
 
1566
1568
  @dataclass
1567
- class SpecialItemEntry:
1569
+ class SpecialItemEntry(BaseModel):
1568
1570
  """Item content data."""
1569
1571
 
1570
1572
  key: str | None = None
@@ -1581,7 +1583,7 @@ class SpecialItemEntry:
1581
1583
 
1582
1584
 
1583
1585
  @dataclass
1584
- class EggEntry:
1586
+ class EggEntry(BaseModel):
1585
1587
  """Egg content data."""
1586
1588
 
1587
1589
  text: str | None = None
@@ -1593,7 +1595,7 @@ class EggEntry:
1593
1595
 
1594
1596
 
1595
1597
  @dataclass
1596
- class HatchingPotionEntry:
1598
+ class HatchingPotionEntry(BaseModel):
1597
1599
  """Hatching potion content data."""
1598
1600
 
1599
1601
  value: int | None = None
@@ -1607,18 +1609,18 @@ class HatchingPotionEntry:
1607
1609
 
1608
1610
 
1609
1611
  @dataclass
1610
- class PetEntry:
1612
+ class PetEntry(BaseModel):
1611
1613
  """Pet content data."""
1612
1614
 
1613
1615
  key: str | None = None
1614
- Type: str | None = field(default=None, metadata=field_options(alias="type"))
1616
+ Type: str | None = None
1615
1617
  potion: str | None = None
1616
1618
  egg: str | None = None
1617
1619
  text: str | None = None
1618
1620
 
1619
1621
 
1620
1622
  @dataclass
1621
- class InventoryItemEntry:
1623
+ class InventoryItemEntry(BaseModel):
1622
1624
  """Inventory item content data."""
1623
1625
 
1624
1626
  text: str | None = None
@@ -1632,7 +1634,7 @@ class InventoryItemEntry:
1632
1634
 
1633
1635
 
1634
1636
  @dataclass
1635
- class ContentData:
1637
+ class ContentData(BaseModel):
1636
1638
  """Content data."""
1637
1639
 
1638
1640
  achievements: dict[str, AchievmentContent]
@@ -1657,7 +1659,7 @@ class ContentData:
1657
1659
  # repeatingEvents
1658
1660
  classes: list[str]
1659
1661
  gearTypes: list[str]
1660
- cardTypes: dict[str, CarTypes]
1662
+ cardTypes: dict[str, CardTypes]
1661
1663
  special: dict[str, SpecialItemEntry]
1662
1664
  dropEggs: dict[str, EggEntry]
1663
1665
  questEggs: dict[str, EggEntry]
@@ -1697,7 +1699,7 @@ class HabiticaContentResponse(HabiticaResponse):
1697
1699
 
1698
1700
 
1699
1701
  @dataclass
1700
- class PartyMember:
1702
+ class PartyMember(BaseModel):
1701
1703
  """Party member data."""
1702
1704
 
1703
1705
  stats: StatsUser
@@ -1707,7 +1709,7 @@ class PartyMember:
1707
1709
 
1708
1710
 
1709
1711
  @dataclass
1710
- class UserTasks:
1712
+ class UserTasks(BaseModel):
1711
1713
  """User and tasks data."""
1712
1714
 
1713
1715
  user: UserData