@@ -172,35 +172,51 @@ def __init__( # pylint: disable = keyword-arg-before-vararg, too-many-arguments
172172
173173 def _get_pre_release_from_args (self , args ) -> t .Tuple [
174174 t .Sequence [t .Tuple [t .Optional [str ], t .Optional [str ], t .Optional [int ]]], int ]:
175+ """Get pre-release version component from args."""
176+ if args and isinstance (args [0 ], tuple ):
177+ return self ._get_prerelease_from_tuples (args )
178+
175179 pre_release : t .List [t .Tuple [t .Optional [str ], t .Optional [str ], t .Optional [int ]]] = []
176180 consumed_args = 0
177- if args and isinstance ( args [ 0 ], tuple ):
178- for i , arg in enumerate (args ):
179- if not isinstance ( arg , tuple ) :
180- break
181- if len (arg ) == 3 and arg [ 0 ] in ( None , '.' , '-' ) :
182- pre_release . append ( arg )
183- consumed_args += 1
184- continue
185- if i == len ( args ) - 1 :
181+ accumulated : t . List [ t . Union [ int , str , None ]] = []
182+ for i , arg in enumerate (args ):
183+ if not accumulated :
184+ if arg in ( None , '.' , '-' ):
185+ if len (args ) < i + 3 :
186+ raise ValueError (
187+ 'expected 3 consecutive values'
188+ f' from index { i } in args= { args } in { repr ( self ) } ' )
189+ else :
186190 break
187- raise ValueError (f'pre-release segment arg={ arg } (index { i } in args={ args } '
188- f' in { repr (self )} ) must be a 3-tuple' )
189- else :
190- accumulated : t .List [t .Union [int , str , None ]] = []
191- for i , arg in enumerate (args ):
192- if not accumulated :
193- if arg in (None , '.' , '-' ):
194- if len (args ) < i + 3 :
195- raise ValueError (f'expected 3 consecutive values from index { i } '
196- f' in args={ args } in { repr (self )} ' )
197- else :
198- break
199- accumulated .append (arg )
191+ accumulated .append (arg )
192+ consumed_args += 1
193+ if len (accumulated ) == 3 :
194+ _separator , _type , _patch = \
195+ accumulated # pylint: disable = unbalanced-tuple-unpacking
196+ assert _separator is None or isinstance (_separator , str ), _separator
197+ assert _type is None or isinstance (_type , str ), _type
198+ assert _patch is None or isinstance (_patch , int ), _patch
199+ pre_release .append ((_separator , _type , _patch ))
200+ accumulated = []
201+ return pre_release , consumed_args
202+
203+ def _get_prerelease_from_tuples (self , args ) -> t .Tuple [
204+ t .Sequence [t .Tuple [t .Optional [str ], t .Optional [str ], t .Optional [int ]]], int ]:
205+ """Get pre-release version component from args, assuming they are sequence of tuples."""
206+ pre_release : t .List [t .Tuple [t .Optional [str ], t .Optional [str ], t .Optional [int ]]] = []
207+ consumed_args = 0
208+ for i , arg in enumerate (args ):
209+ if not isinstance (arg , tuple ):
210+ break
211+ if len (arg ) == 3 and arg [0 ] in (None , '.' , '-' ):
212+ pre_release .append (arg )
200213 consumed_args += 1
201- if len (accumulated ) == 3 :
202- pre_release .append (tuple (accumulated ))
203- accumulated = []
214+ continue
215+ if i == len (args ) - 1 :
216+ break
217+ raise ValueError (
218+ f'pre-release segment arg={ arg } (index { i } in args={ args } in { repr (self )} )'
219+ ' must be a 3-tuple' )
204220 return pre_release , consumed_args
205221
206222 @property
0 commit comments