44from enum import IntEnum
55from typing import Optional , Tuple , Union
66
7- VersionPattern = re .compile (r"^(?P<major>\d+)\.(?P<minor>\d+)\.(?P<build>\d+)(?P<type_str>.+?)?(?P<type_number>\d+)?$" )
7+ VersionPattern = re .compile (
8+ r"^(?P<major>\d+)\.(?P<minor>\d+)\.(?P<build>\d+)(?P<type_str>.+?)?(?P<type_number>\d+)?(?P<postfix>.*)$" ,
9+ flags = re .DOTALL ,
10+ )
811
912
1013class UnityVersionType (IntEnum ):
@@ -20,6 +23,7 @@ class UnityVersionType(IntEnum):
2023class UnityVersion (int ):
2124 # https://github.com/AssetRipper/VersionUtilities/blob/master/VersionUtilities/UnityVersion.cs
2225 _type_str : Optional [str ]
26+ _postfix : Optional [str ]
2327
2428 @property
2529 def major (self ):
@@ -41,6 +45,10 @@ def type(self):
4145 def type_str (self ):
4246 return getattr (self , "_type_str" , self .type .name )
4347
48+ @property
49+ def postfix (self ):
50+ return getattr (self , "_postfix" , "" )
51+
4452 @property
4553 def type_number (self ):
4654 return self & 0xFF
@@ -56,6 +64,7 @@ def from_str(cls, version: str):
5664 # formats:
5765 # old: 5.0.0, <major>.<minor>.<build>
5866 # new: 2018.1.1f2 <major>.<minor>.<build><type_str><type_number>
67+ # the new format string can be followed by a custom postfix
5968 match = VersionPattern .match (version )
6069 if not match :
6170 raise ValueError (f"Invalid version string: { version } " )
@@ -64,6 +73,7 @@ def from_str(cls, version: str):
6473 build = int (match .group ("build" ))
6574 type_str = match .group ("type_str" )
6675 type_number = int (match .group ("type_number" ) or 0 )
76+ postfix = match .group ("postfix" )
6777
6878 if type_str is None :
6979 return cls .from_list (major , minor , build )
@@ -72,10 +82,19 @@ def from_str(cls, version: str):
7282 obj = cls .from_list (major , minor , build , type , type_number )
7383 if type is UnityVersionType .u :
7484 obj ._type_str = type_str
85+ if postfix :
86+ obj ._postfix = postfix
87+
7588 return obj
7689
90+ def __str__ (self ) -> str :
91+ if self .major <= 5 :
92+ return f"{ self .major } .{ self .minor } .{ self .build } "
93+ else :
94+ return f"{ self .major } .{ self .minor } { self .type_str } { self .type_number } { self .postfix } "
95+
7796 def __repr__ (self ) -> str :
78- return f"UnityVersion { self .major } . { self . minor } { self . type_str } { self . type_number } "
97+ return f"UnityVersion { self .__str__ () } "
7998
8099 def __getitem__ (self , idx : Union [int , slice ]) -> Union [int , Tuple [int , ...]]:
81100 values = (
0 commit comments