1
+ import dataclasses
1
2
import itertools
2
3
import os
3
4
import re
4
5
import shlex
5
6
import textwrap
6
7
from collections import defaultdict
7
8
from collections .abc import Sequence
8
- from functools import total_ordering
9
9
10
10
from ..typing import PathOrStr
11
11
@@ -140,19 +140,17 @@ def parse_key_value_string(
140
140
return dict (result )
141
141
142
142
143
- @total_ordering
143
+ @dataclasses . dataclass ( order = True )
144
144
class FlexibleVersion :
145
- version_str : str
146
- version_parts : tuple [int , ...]
147
- suffix : str
148
-
149
- def __init__ (self , version_str : str ) -> None :
150
- self .version_str = version_str
145
+ version_parts : tuple [int , ...] = dataclasses .field (init = False , repr = False )
146
+ suffix : str = dataclasses .field (init = False , repr = False )
147
+ version_str : str = dataclasses .field (compare = False )
151
148
149
+ def __post_init__ (self ) -> None :
152
150
# Split into numeric parts and the optional suffix
153
- match = re .match (r"^[v]?(\d+(\.\d+)*)(.*)$" , version_str )
151
+ match = re .match (r"^[v]?(\d+(\.\d+)*)(.*)$" , self . version_str )
154
152
if not match :
155
- msg = f"Invalid version string: { version_str } "
153
+ msg = f"Invalid version string: { self . version_str } "
156
154
raise ValueError (msg )
157
155
158
156
version_part , _ , suffix = match .groups ()
@@ -172,18 +170,5 @@ def _remove_trailing_zeros(parts: tuple[int, ...]) -> tuple[int, ...]:
172
170
parts = parts [:- 1 ]
173
171
return parts
174
172
175
- def __eq__ (self , other : object ) -> bool :
176
- if not isinstance (other , FlexibleVersion ):
177
- raise NotImplementedError ()
178
- return (self .version_parts , self .suffix ) == (other .version_parts , other .suffix )
179
-
180
- def __lt__ (self , other : object ) -> bool :
181
- if not isinstance (other , FlexibleVersion ):
182
- raise NotImplementedError ()
183
- return (self .version_parts , self .suffix ) < (other .version_parts , other .suffix )
184
-
185
- def __repr__ (self ) -> str :
186
- return f"FlexibleVersion('{ self .version_str } ')"
187
-
188
173
def __str__ (self ) -> str :
189
174
return self .version_str
0 commit comments