seerapi-models 1.0.0__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.
@@ -0,0 +1,244 @@
1
+ from .battle_effect import (
2
+ BattleEffect,
3
+ BattleEffectCategory,
4
+ BattleEffectCategoryORM,
5
+ BattleEffectORM,
6
+ )
7
+ from .effect import (
8
+ PetEffect,
9
+ PetEffectGroup,
10
+ PetEffectGroupORM,
11
+ PetEffectORM,
12
+ VariationEffect,
13
+ VariationEffectORM,
14
+ )
15
+ from .element_type import (
16
+ ElementType,
17
+ ElementTypeORM,
18
+ TypeCombination,
19
+ TypeCombinationORM,
20
+ )
21
+ from .items import (
22
+ EnergyBead,
23
+ EnergyBeadBuffAttrORM,
24
+ EnergyBeadORM,
25
+ Equip,
26
+ EquipBonus,
27
+ EquipBonusAttrORM,
28
+ EquipBonusORM,
29
+ EquipEffectiveOccasion,
30
+ EquipEffectiveOccasionORM,
31
+ EquipORM,
32
+ EquipType,
33
+ EquipTypeORM,
34
+ Gem,
35
+ GemCategory,
36
+ GemCategoryORM,
37
+ GemGen1,
38
+ GemGen1PartORM,
39
+ GemGen2,
40
+ GemGen2PartORM,
41
+ GemGenCategory,
42
+ GemGenCategoryORM,
43
+ GemORM,
44
+ Item,
45
+ ItemORM,
46
+ SkillActivationItem,
47
+ SkillActivationItemORM,
48
+ SkillStone,
49
+ SkillStoneCategory,
50
+ SkillStoneCategoryORM,
51
+ SkillStoneEffect,
52
+ SkillStoneEffectORM,
53
+ SkillStoneORM,
54
+ Suit,
55
+ SuitBonus,
56
+ SuitBonusAttrORM,
57
+ SuitBonusORM,
58
+ SuitORM,
59
+ )
60
+ from .metadata import ApiMetadata, ApiMetadataORM
61
+ from .mintmark import (
62
+ AbilityMintmark,
63
+ AbilityPartORM,
64
+ Mintmark,
65
+ MintmarkBaseAttrORM,
66
+ MintmarkClassCategory,
67
+ MintmarkClassCategoryORM,
68
+ MintmarkExtraAttrORM,
69
+ MintmarkMaxAttrORM,
70
+ MintmarkORM,
71
+ MintmarkRarityCategory,
72
+ MintmarkRarityCategoryORM,
73
+ MintmarkTypeCategory,
74
+ MintmarkTypeCategoryORM,
75
+ SkillMintmark,
76
+ SkillMintmarkEffect,
77
+ SkillPartORM,
78
+ UniversalMintmark,
79
+ UniversalPartORM,
80
+ )
81
+ from .pet import (
82
+ BaseStatORM,
83
+ DiyStatsRangeORM,
84
+ Pet,
85
+ PetArchiveStoryBook,
86
+ PetArchiveStoryBookORM,
87
+ PetArchiveStoryEntry,
88
+ PetArchiveStoryEntryORM,
89
+ PetClass,
90
+ PetClassORM,
91
+ PetEncyclopediaEntry,
92
+ PetEncyclopediaEntryORM,
93
+ PetGenderCategory,
94
+ PetGenderORM,
95
+ PetMountTypeCategory,
96
+ PetMountTypeORM,
97
+ PetORM,
98
+ PetSkin,
99
+ PetSkinCategory,
100
+ PetSkinCategoryORM,
101
+ PetSkinORM,
102
+ PetVipBuffCategory,
103
+ PetVipBuffORM,
104
+ SkillInPet,
105
+ SkillInPetORM,
106
+ Soulmark,
107
+ SoulmarkORM,
108
+ SoulmarkTagCategory,
109
+ SoulmarkTagORM,
110
+ YieldingEvORM,
111
+ )
112
+ from .skill import (
113
+ Skill,
114
+ SkillCategory,
115
+ SkillCategoryORM,
116
+ SkillEffectParam,
117
+ SkillEffectParamInType,
118
+ SkillEffectParamInTypeORM,
119
+ SkillEffectParamORM,
120
+ SkillEffectType,
121
+ SkillEffectTypeORM,
122
+ SkillEffectTypeTag,
123
+ SkillEffectTypeTagORM,
124
+ SkillHideEffect,
125
+ SkillHideEffectORM,
126
+ SkillORM,
127
+ )
128
+
129
+ __all__ = [
130
+ 'AbilityMintmark',
131
+ 'AbilityPartORM',
132
+ 'ApiMetadata',
133
+ 'ApiMetadataORM',
134
+ 'BaseStatORM',
135
+ 'BattleEffect',
136
+ 'BattleEffectCategory',
137
+ 'BattleEffectCategoryORM',
138
+ 'BattleEffectORM',
139
+ 'DiyStatsRangeORM',
140
+ 'ElementType',
141
+ 'ElementTypeORM',
142
+ 'EnergyBead',
143
+ 'EnergyBeadBuffAttrORM',
144
+ 'EnergyBeadORM',
145
+ 'Equip',
146
+ 'EquipBonus',
147
+ 'EquipBonusAttrORM',
148
+ 'EquipBonusORM',
149
+ 'EquipEffectiveOccasion',
150
+ 'EquipEffectiveOccasionORM',
151
+ 'EquipORM',
152
+ 'EquipType',
153
+ 'EquipTypeORM',
154
+ 'Gem',
155
+ 'GemCategory',
156
+ 'GemCategoryORM',
157
+ 'GemGen1',
158
+ 'GemGen1PartORM',
159
+ 'GemGen2',
160
+ 'GemGen2PartORM',
161
+ 'GemGenCategory',
162
+ 'GemGenCategoryORM',
163
+ 'GemORM',
164
+ 'Item',
165
+ 'ItemORM',
166
+ 'Mintmark',
167
+ 'MintmarkBaseAttrORM',
168
+ 'MintmarkClassCategory',
169
+ 'MintmarkClassCategoryORM',
170
+ 'MintmarkExtraAttrORM',
171
+ 'MintmarkMaxAttrORM',
172
+ 'MintmarkORM',
173
+ 'MintmarkRarityCategory',
174
+ 'MintmarkRarityCategoryORM',
175
+ 'MintmarkTypeCategory',
176
+ 'MintmarkTypeCategoryORM',
177
+ 'Pet',
178
+ 'PetArchiveStoryBook',
179
+ 'PetArchiveStoryBookORM',
180
+ 'PetArchiveStoryEntry',
181
+ 'PetArchiveStoryEntryORM',
182
+ 'PetClass',
183
+ 'PetClassORM',
184
+ 'PetEffect',
185
+ 'PetEffectGroup',
186
+ 'PetEffectGroupORM',
187
+ 'PetEffectORM',
188
+ 'PetEncyclopediaEntry',
189
+ 'PetEncyclopediaEntryORM',
190
+ 'PetGenderCategory',
191
+ 'PetGenderORM',
192
+ 'PetMountTypeCategory',
193
+ 'PetMountTypeORM',
194
+ 'PetORM',
195
+ 'PetSkin',
196
+ 'PetSkinCategory',
197
+ 'PetSkinCategoryORM',
198
+ 'PetSkinORM',
199
+ 'PetVipBuffCategory',
200
+ 'PetVipBuffORM',
201
+ 'Skill',
202
+ 'SkillActivationItem',
203
+ 'SkillActivationItemORM',
204
+ 'SkillCategory',
205
+ 'SkillCategoryORM',
206
+ 'SkillEffectParam',
207
+ 'SkillEffectParamInType',
208
+ 'SkillEffectParamInTypeORM',
209
+ 'SkillEffectParamORM',
210
+ 'SkillEffectType',
211
+ 'SkillEffectTypeORM',
212
+ 'SkillEffectTypeTag',
213
+ 'SkillEffectTypeTagORM',
214
+ 'SkillHideEffect',
215
+ 'SkillHideEffectORM',
216
+ 'SkillInPet',
217
+ 'SkillInPetORM',
218
+ 'SkillMintmark',
219
+ 'SkillMintmarkEffect',
220
+ 'SkillORM',
221
+ 'SkillPartORM',
222
+ 'SkillStone',
223
+ 'SkillStoneCategory',
224
+ 'SkillStoneCategoryORM',
225
+ 'SkillStoneEffect',
226
+ 'SkillStoneEffectORM',
227
+ 'SkillStoneORM',
228
+ 'Soulmark',
229
+ 'SoulmarkORM',
230
+ 'SoulmarkTagCategory',
231
+ 'SoulmarkTagORM',
232
+ 'Suit',
233
+ 'SuitBonus',
234
+ 'SuitBonusAttrORM',
235
+ 'SuitBonusORM',
236
+ 'SuitORM',
237
+ 'TypeCombination',
238
+ 'TypeCombinationORM',
239
+ 'UniversalMintmark',
240
+ 'UniversalPartORM',
241
+ 'VariationEffect',
242
+ 'VariationEffectORM',
243
+ 'YieldingEvORM',
244
+ ]
@@ -0,0 +1,27 @@
1
+ def move_to_last(lst: list, index: int) -> None:
2
+ """
3
+ 将列表中指定索引位置的元素移动到列表的最后一位。
4
+
5
+ Args:
6
+ lst: 要操作的列表
7
+ index: 要移动的元素的索引位置
8
+
9
+ """
10
+ if 0 <= index < len(lst):
11
+ # 弹出指定位置的元素并添加到列表末尾
12
+ element = lst.pop(index)
13
+ lst.append(element)
14
+
15
+
16
+ def move_to_first(lst: list, index: int) -> None:
17
+ """
18
+ 将列表中指定索引位置的元素移动到列表的第一位。
19
+
20
+ Args:
21
+ lst: 要操作的列表
22
+ index: 要移动的元素的索引位置
23
+
24
+ """
25
+ if 0 <= index < len(lst):
26
+ element = lst.pop(index)
27
+ lst.insert(0, element)
@@ -0,0 +1,257 @@
1
+ # from sqlmodel import Field, Relationship
2
+
3
+ # from ..model import BaseGeneralModel, BaseResModel, ConvertToORM, ResourceRef
4
+ # from ..base import Analyzer, DataImportConfig
5
+ # from ..typing_ import AnalyzeResult
6
+
7
+
8
+ # TREE_RESOURCE_NAME = "achievement_tree"
9
+
10
+
11
+ # class RootNodeBase(BaseResModel):
12
+ # name: str = Field(description="根节点名称")
13
+
14
+ # @classmethod
15
+ # def resource_name(cls) -> str:
16
+ # return "achievement_tree_root"
17
+
18
+
19
+ # class RootNode(RootNodeBase, ConvertToORM["RootNodeORM"]):
20
+ # branches: list["BranchNode"] = Field(
21
+ # default_factory=list, description="分支节点列表"
22
+ # )
23
+
24
+ # @classmethod
25
+ # def get_orm_model(cls) -> type["RootNodeORM"]:
26
+ # return RootNodeORM
27
+
28
+ # def to_orm(self) -> "RootNodeORM":
29
+ # return RootNodeORM(
30
+ # id=self.id, name=self.name, branches=[
31
+ # b.to_orm() for b in self.branches
32
+ # ]
33
+ # )
34
+
35
+
36
+ # class RootNodeORM(RootNodeBase, table=True):
37
+ # branches: list["BranchNodeORM"] = Relationship(back_populates="parent")
38
+
39
+
40
+ # class BranchNodeBase(BaseResModel):
41
+ # name: str = Field(description="分支节点名称")
42
+
43
+ # @classmethod
44
+ # def resource_name(cls) -> str:
45
+ # return "achievement_tree_branch"
46
+
47
+
48
+ # class BranchNode(BranchNodeBase, ConvertToORM["BranchNodeORM"]):
49
+ # parent: ResourceRef[RootNode] = Field(description="父节点(RootNode)资源引用")
50
+ # rules: list["RuleNode"] = Field(default_factory=list, description="规则节点列表")
51
+
52
+ # @classmethod
53
+ # def get_orm_model(cls) -> type["BranchNodeORM"]:
54
+ # return BranchNodeORM
55
+
56
+ # def to_orm(self) -> "BranchNodeORM":
57
+ # return BranchNodeORM(
58
+ # id=self.id,
59
+ # name=self.name,
60
+ # parent_id=self.parent.id,
61
+ # rules=[r.to_orm() for r in self.rules],
62
+ # )
63
+
64
+
65
+ # class BranchNodeORM(BranchNodeBase, table=True):
66
+ # parent_id: int | None = Field(
67
+ # default=None,
68
+ # foreign_key="achievement_tree_root.id"
69
+ # )
70
+ # parent: "RootNodeORM" = Relationship(back_populates="branches")
71
+ # rules: list["RuleNodeORM"] = Relationship(back_populates="parent")
72
+
73
+
74
+ # class RuleNodeBase(BaseResModel):
75
+ # name: str = Field(description="规则节点名称")
76
+ # intro: str | None = Field(description="规则节点简介")
77
+
78
+ # @classmethod
79
+ # def resource_name(cls) -> str:
80
+ # return "achievement_tree_rule"
81
+
82
+
83
+ # class RuleNode(RuleNodeBase, ConvertToORM["RuleNodeORM"]):
84
+ # parent: ResourceRef[BranchNode] = Field(
85
+ # description="父节点(BranchNode)资源引用"
86
+ # )
87
+ # achievements: list["AchievementNode"] = Field(
88
+ # default_factory=list, description="成就节点列表"
89
+ # )
90
+
91
+ # @classmethod
92
+ # def get_orm_model(cls) -> type["RuleNodeORM"]:
93
+ # return RuleNodeORM
94
+
95
+ # def to_orm(self) -> "RuleNodeORM":
96
+ # return RuleNodeORM(
97
+ # id=self.id,
98
+ # name=self.name,
99
+ # intro=self.intro,
100
+ # parent_id=self.parent.id,
101
+ # achievements=[a.to_orm() for a in self.achievements],
102
+ # )
103
+
104
+
105
+ # class RuleNodeORM(RuleNodeBase, table=True):
106
+ # parent_id: int | None = Field(
107
+ # default=None, foreign_key="achievement_tree_branch.id")
108
+ # parent: "BranchNodeORM" = Relationship(back_populates="rules")
109
+
110
+ # achievements: list["AchievementNodeORM"] = Relationship(
111
+ # back_populates="parent")
112
+
113
+ # @classmethod
114
+ # def resource_name(cls) -> str:
115
+ # return "achievement_tree_rule"
116
+
117
+
118
+ # class AchievementNodeBase(BaseResModel, BaseGeneralModel):
119
+ # name: str = Field(description="成就名称")
120
+ # point: int = Field(description="成就点数")
121
+ # title: str | None = Field(description="成就称号")
122
+ # desc: str = Field(description="成就描述")
123
+ # is_ability: bool = Field(description="是否是能力加成成就")
124
+ # ability_desc: str | None = Field(
125
+ # description="能力加成成就描述,仅在该成就为能力加成成就时有效"
126
+ # )
127
+
128
+ # @classmethod
129
+ # def resource_name(cls) -> str:
130
+ # return "achievement"
131
+
132
+ # @classmethod
133
+ # def schema_path(cls) -> str:
134
+ # return "achievement_node.json"
135
+
136
+
137
+ # class AchievementNode(AchievementNodeBase, ConvertToORM["AchievementNodeORM"]):
138
+ # parent: ResourceRef[RuleNode] = Field(description="父节点引用")
139
+
140
+ # @classmethod
141
+ # def get_orm_model(cls) -> type["AchievementNodeORM"]:
142
+ # return AchievementNodeORM
143
+
144
+ # def to_orm(self) -> "AchievementNodeORM":
145
+ # return AchievementNodeORM(
146
+ # id=self.id,
147
+ # name=self.name,
148
+ # point=self.point,
149
+ # title=self.title,
150
+ # desc=self.desc,
151
+ # is_ability=self.is_ability,
152
+ # ability_desc=self.ability_desc,
153
+ # parent_id=self.parent.id,
154
+ # )
155
+
156
+
157
+ # class AchievementNodeORM(AchievementNodeBase, table=True):
158
+ # parent_id: int | None = Field(
159
+ # default=None, foreign_key="achievement_tree_rule.id")
160
+ # parent: "RuleNodeORM" = Relationship(back_populates="achievements")
161
+
162
+
163
+ # class AchievementsAnalyzer(Analyzer):
164
+ # """成就数据分析器"""
165
+
166
+ # @classmethod
167
+ # def get_data_import_config(cls) -> DataImportConfig:
168
+ # return DataImportConfig(
169
+ # html5_paths=("xml/achievements.json",),
170
+ # )
171
+
172
+ # def analyze(self) -> tuple[AnalyzeResult, ...]:
173
+ # achievements_data = self._get_data('html5', 'xml/achievements.json')["AchievementRules"]["type"]
174
+ # achievement_tree: dict[int, RootNode] = {}
175
+ # all_achievements: dict[int, AchievementNode] = {}
176
+ # ability_achievements: dict[int, AchievementNode] = {}
177
+ # branch_id = 1
178
+ # rule_id = 1
179
+ # achievement_id = 1
180
+ # for ach_type in achievements_data:
181
+ # root_id = ach_type.get("ID")
182
+ # root_name = ach_type.get("Desc")
183
+ # root_node = RootNode(
184
+ # id=root_id,
185
+ # name=root_name,
186
+ # branches=[],
187
+ # )
188
+ # achievement_tree[root_id] = root_node
189
+ # for branches in ach_type.get("Branches", []):
190
+ # # branch_id = branches.get("ID")
191
+ # branch_name = branches.get("Desc")
192
+ # branch_node = BranchNode(
193
+ # id=branch_id,
194
+ # name=branch_name,
195
+ # rules=[],
196
+ # parent=ResourceRef(
197
+ # id=root_id,
198
+ # path=f'{root_id}',
199
+ # resource_name=TREE_RESOURCE_NAME,
200
+ # ),
201
+ # )
202
+ # branch_id += 1
203
+ # root_node.branches.append(branch_node)
204
+ # for branch in branches.get("Branch", []):
205
+ # # rule_id = branch.get("ID")
206
+ # rule_name = branch.get("Desc")
207
+ # rule_intro = branch.get("introl")
208
+ # rule_node = RuleNode(
209
+ # id=rule_id,
210
+ # name=rule_name,
211
+ # intro=rule_intro,
212
+ # achievements=[],
213
+ # parent=ResourceRef(
214
+ # id=branch_id,
215
+ # resource_name=TREE_RESOURCE_NAME,
216
+ # ),
217
+ # )
218
+ # rule_id += 1
219
+ # branch_node.rules.append(rule_node)
220
+ # for rule in branch.get("Rule", []):
221
+ # achievement = AchievementNode(
222
+ # id=achievement_id,
223
+ # name=rule.get("achName", rule_name),
224
+ # point=rule.get("AchievementPoint"),
225
+ # title=rule.get("title"),
226
+ # desc=rule.get("Desc"),
227
+ # is_ability=bool(rule.get("AbilityTitle")),
228
+ # ability_desc=rule.get("abtext"),
229
+ # parent=ResourceRef(
230
+ # id=rule_id,
231
+ # resource_name=TREE_RESOURCE_NAME,
232
+ # path=f'{root_id}/{branch_id}/{rule_id}',
233
+ # ),
234
+ # )
235
+ # rule_node.achievements.append(achievement)
236
+ # if achievement.is_ability:
237
+ # ability_achievements[achievement_id] = achievement
238
+ # else:
239
+ # all_achievements[achievement_id] = achievement
240
+ # achievement_id += 1
241
+
242
+ # return (
243
+ # AnalyzeResult(
244
+ # model=RootNode,
245
+ # data=achievement_tree,
246
+ # ),
247
+ # AnalyzeResult(
248
+ # model=AchievementNode,
249
+ # data=all_achievements,
250
+ # output_mode='json',
251
+ # ),
252
+ # AnalyzeResult(
253
+ # model=AchievementNode,
254
+ # data=ability_achievements,
255
+ # output_mode='json',
256
+ # ),
257
+ # )
@@ -0,0 +1,78 @@
1
+ from sqlmodel import Field, Relationship, SQLModel
2
+
3
+ from seerapi_models.build_model import BaseCategoryModel, BaseResModel, ConvertToORM
4
+ from seerapi_models.common import ResourceRef
5
+
6
+
7
+ class BattleEffectCategoryLink(SQLModel, table=True):
8
+ battle_effect_id: int | None = Field(
9
+ default=None, foreign_key='battle_effect.id', primary_key=True
10
+ )
11
+ type_id: int | None = Field(
12
+ default=None, foreign_key='battle_effect_type.id', primary_key=True
13
+ )
14
+
15
+
16
+ class BattleEffectBase(BaseResModel):
17
+ name: str = Field(description='状态名称')
18
+ desc: str = Field(description='状态描述')
19
+
20
+ @classmethod
21
+ def resource_name(cls) -> str:
22
+ return 'battle_effect'
23
+
24
+
25
+ class BattleEffect(BattleEffectBase, ConvertToORM['BattleEffectORM']):
26
+ type: list[ResourceRef['BattleEffectCategory']] = Field(
27
+ default_factory=list,
28
+ description='状态类型,可能同时属于多个类型,例如瘫痪同时属于控制类和限制类异常',
29
+ )
30
+
31
+ @classmethod
32
+ def get_orm_model(cls) -> 'type[BattleEffectORM]':
33
+ return BattleEffectORM
34
+
35
+ def to_orm(self) -> 'BattleEffectORM':
36
+ return BattleEffectORM(
37
+ id=self.id,
38
+ name=self.name,
39
+ desc=self.desc,
40
+ )
41
+
42
+
43
+ class BattleEffectORM(BattleEffectBase, table=True):
44
+ type: list['BattleEffectCategoryORM'] = Relationship(
45
+ back_populates='effect', link_model=BattleEffectCategoryLink
46
+ )
47
+
48
+
49
+ class BattleEffectCategoryBase(BaseCategoryModel):
50
+ name: str = Field(description='状态类型名称')
51
+
52
+ @classmethod
53
+ def resource_name(cls) -> str:
54
+ return 'battle_effect_type'
55
+
56
+
57
+ class BattleEffectCategory(
58
+ BattleEffectCategoryBase, ConvertToORM['BattleEffectCategoryORM']
59
+ ):
60
+ effect: list[ResourceRef['BattleEffect']] = Field(
61
+ default_factory=list, description='异常状态列表'
62
+ )
63
+
64
+ @classmethod
65
+ def get_orm_model(cls) -> type['BattleEffectCategoryORM']:
66
+ return BattleEffectCategoryORM
67
+
68
+ def to_orm(self) -> 'BattleEffectCategoryORM':
69
+ return BattleEffectCategoryORM(
70
+ id=self.id,
71
+ name=self.name,
72
+ )
73
+
74
+
75
+ class BattleEffectCategoryORM(BattleEffectCategoryBase, table=True):
76
+ effect: list['BattleEffectORM'] = Relationship(
77
+ back_populates='type', link_model=BattleEffectCategoryLink
78
+ )
@@ -0,0 +1,66 @@
1
+ from abc import ABC, abstractmethod
2
+ from typing import Generic, TypeVar
3
+
4
+ from sqlalchemy.orm import declared_attr
5
+ from sqlmodel import Field, SQLModel
6
+
7
+ _TModel = TypeVar('_TModel', bound=SQLModel)
8
+
9
+
10
+ class ResModelMixin(SQLModel, ABC):
11
+ @classmethod
12
+ @abstractmethod
13
+ def resource_name(cls) -> str:
14
+ pass
15
+
16
+ @declared_attr # type: ignore
17
+ def __tablename__(cls) -> str: # type: ignore
18
+ return cls.resource_name()
19
+
20
+
21
+ class BaseResModel(ResModelMixin, ABC):
22
+ """资源模型抽象基类"""
23
+
24
+ id: int = Field(description='资源ID', primary_key=True)
25
+
26
+
27
+ class BaseResModelWithOptionalId(ResModelMixin, ABC):
28
+ """资源模型抽象基类"""
29
+
30
+ id: int | None = Field(
31
+ default=None,
32
+ primary_key=True,
33
+ exclude=True,
34
+ )
35
+
36
+
37
+ class ConvertToORM(ABC, Generic[_TModel]):
38
+ @classmethod
39
+ @abstractmethod
40
+ def get_orm_model(cls) -> type[_TModel]:
41
+ """获取SQLModel ORM模型类型"""
42
+ pass
43
+
44
+ @abstractmethod
45
+ def to_orm(self) -> _TModel:
46
+ """将Pydantic模型转为SQLModel ORM模型"""
47
+ pass
48
+
49
+
50
+ class BaseGeneralModel(SQLModel, ABC):
51
+ @classmethod
52
+ @abstractmethod
53
+ def schema_path(cls) -> str:
54
+ pass
55
+
56
+
57
+ class BaseCategoryModel(BaseResModel, ABC, Generic[_TModel]): ...
58
+
59
+
60
+ __all__ = [
61
+ 'BaseCategoryModel',
62
+ 'BaseGeneralModel',
63
+ 'BaseResModel',
64
+ 'BaseResModelWithOptionalId',
65
+ 'ConvertToORM',
66
+ ]