Skip to content

Commit abe80a1

Browse files
committed
chore(ContainerHelper)!: move ContainerHelper into its own file
1 parent fb34525 commit abe80a1

File tree

3 files changed

+67
-56
lines changed

3 files changed

+67
-56
lines changed

UnityPy/files/SerializedFile.py

Lines changed: 4 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,19 @@
22

33
import re
44
from ntpath import basename
5-
from typing import TYPE_CHECKING, Dict, Generator, Iterator, List, Optional, Tuple
5+
from typing import TYPE_CHECKING, Dict, List, Optional, Tuple
66

77
from attrs import define
88

99
from .. import config
1010
from ..enums import BuildTarget, ClassIDType, CommonString
11+
from ..helpers.ContainerHelper import ContainerHelper
1112
from ..helpers.TypeTreeHelper import TypeTreeNode
1213
from ..streams import EndianBinaryWriter
1314
from . import BundleFile, File, ObjectReader
1415

1516
if TYPE_CHECKING:
16-
from ..classes import AssetBundle, AssetInfo, Object, PPtr
17+
from ..classes import AssetBundle, Object
1718
from ..files import ObjectReader
1819
from ..streams.EndianBinaryReader import EndianBinaryReader
1920

@@ -338,7 +339,7 @@ def __init__(self, reader: EndianBinaryReader, parent=None, name=None, **kwargs)
338339
break
339340
else:
340341
self.assetbundle = None
341-
self._container = ContainerHelper()
342+
self._container = ContainerHelper([])
342343

343344
@property
344345
def container(self):
@@ -521,55 +522,3 @@ def read_string(string_buffer_reader: EndianBinaryReader, value: int) -> str:
521522

522523
offset = value & 0x7FFFFFFF
523524
return CommonString.get(offset, str(offset))
524-
525-
526-
@define(slots=True)
527-
class ContainerHelper:
528-
"""Helper class to allow multidict containers
529-
without breaking compatibility with old versions"""
530-
531-
container: List[Tuple[str, AssetInfo]]
532-
container_dict: Dict[str, PPtr[Object]]
533-
path_dict: Dict[int, str]
534-
535-
def __init__(self, assetbundle: Optional[AssetBundle] = None) -> None:
536-
if assetbundle is None:
537-
self.container = []
538-
else:
539-
self.container = assetbundle.m_Container
540-
# support for getitem
541-
self.container_dict = {key: value.asset for key, value in self.container}
542-
self.path_dict = {value.asset.m_PathID: key for key, value in self.container}
543-
544-
def items(self) -> Generator[Tuple[str, PPtr[Object]], None, None]:
545-
return ((key, value.asset) for key, value in self.container)
546-
547-
def keys(self) -> list[str]:
548-
return list({key for key, value in self.container})
549-
550-
def values(self) -> list[PPtr[Object]]:
551-
return list({value.asset for key, value in self.container})
552-
553-
def __getitem__(self, key) -> PPtr[Object]:
554-
return self.container_dict[key]
555-
556-
def __setitem__(self, key, value) -> None:
557-
raise NotImplementedError("Assigning to container is not allowed!")
558-
559-
def __delitem__(self, key) -> None:
560-
raise NotImplementedError("Deleting from the container is not allowed!")
561-
562-
def __iter__(self) -> Iterator[str]:
563-
return iter(self.keys())
564-
565-
def __len__(self) -> int:
566-
return len(self.container)
567-
568-
def __getattr__(self, name: str) -> PPtr[Object]:
569-
return self.container_dict[name]
570-
571-
def __str__(self) -> str:
572-
return f"{{{', '.join(f'{key}: {value}' for key, value in self.items())}}}"
573-
574-
def __dict__(self) -> Dict[str, PPtr[Object]]:
575-
return self.container_dict

UnityPy/helpers/ContainerHelper.py

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
from __future__ import annotations
2+
3+
from typing import TYPE_CHECKING, Dict, Generator, Iterator, List, Tuple, Union
4+
5+
from attrs import define
6+
7+
if TYPE_CHECKING:
8+
from ..classes import AssetBundle, AssetInfo, Object, PPtr
9+
10+
11+
@define(slots=True)
12+
class ContainerHelper:
13+
"""Helper class to allow multidict containers
14+
without breaking compatibility with old versions"""
15+
16+
container: List[Tuple[str, AssetInfo]]
17+
container_dict: Dict[str, PPtr[Object]]
18+
path_dict: Dict[int, str]
19+
20+
def __init__(self, container: Union[List[Tuple[str, AssetInfo]], AssetBundle]) -> None:
21+
if not isinstance(container, (list)):
22+
container = container.m_Container
23+
self.container = container
24+
self.container_dict = {key: value.asset for key, value in container}
25+
self.path_dict = {value.asset.path_id: key for key, value in container}
26+
27+
def items(self) -> Generator[Tuple[str, PPtr[Object]], None, None]:
28+
return ((key, value.asset) for key, value in self.container)
29+
30+
def keys(self) -> list[str]:
31+
return list({key for key, value in self.container})
32+
33+
def values(self) -> list[PPtr[Object]]:
34+
return list({value.asset for key, value in self.container})
35+
36+
def __getitem__(self, key) -> PPtr[Object]:
37+
return self.container_dict[key]
38+
39+
def __setitem__(self, key, value) -> None:
40+
raise NotImplementedError("Assigning to container is not allowed!")
41+
42+
def __delitem__(self, key) -> None:
43+
raise NotImplementedError("Deleting from the container is not allowed!")
44+
45+
def __iter__(self) -> Iterator[str]:
46+
return iter(self.keys())
47+
48+
def __len__(self) -> int:
49+
return len(self.container)
50+
51+
def __getattr__(self, name: str) -> PPtr[Object]:
52+
return self.container_dict[name]
53+
54+
def __str__(self) -> str:
55+
return f"{{{', '.join(f'{key}: {value}' for key, value in self.items())}}}"
56+
57+
def __dict__(self) -> Dict[str, PPtr[Object]]:
58+
return self.container_dict
59+
60+
def __contains__(self, key: str) -> bool:
61+
return key in self.container_dict

UnityPy/helpers/__init__.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
1-
from . import ArchiveStorageManager, CompressionHelper, ImportHelper, TypeTreeHelper
1+
from . import ArchiveStorageManager, CompressionHelper, ContainerHelper, ImportHelper, TypeTreeHelper
22

33
__all__ = [
44
"ArchiveStorageManager",
55
"CompressionHelper",
66
"ImportHelper",
77
"TypeTreeHelper",
8+
"ContainerHelper",
89
]

0 commit comments

Comments
 (0)