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