@@ -510,7 +510,7 @@ def normalize_pep440(version):
510510 """
511511 return _parse (version , strict = True )["norm" ]
512512
513- def _parse (version_str , strict = True ):
513+ def _parse (version_str , strict = True , _fail = fail ):
514514 """Escape the version component of a filename.
515515
516516 See https://packaging.python.org/en/latest/specifications/binary-distribution-format/#escaping-and-unicode
@@ -519,6 +519,7 @@ def _parse(version_str, strict = True):
519519 Args:
520520 version_str: version string to be normalized according to PEP 440.
521521 strict: fail if the version is invalid, defaults to True.
522+ _fail: Used for tests
522523
523524 Returns:
524525 string containing the normalized version.
@@ -544,7 +545,7 @@ def _parse(version_str, strict = True):
544545 parser_ctx = parser .context ()
545546 if parser .input [parser_ctx ["start" ]:]:
546547 if strict :
547- fail (
548+ _fail (
548549 "Failed to parse PEP 440 version identifier '%s'." % parser .input ,
549550 "Parse error at '%s'" % parser .input [parser_ctx ["start" ]:],
550551 )
@@ -554,7 +555,7 @@ def _parse(version_str, strict = True):
554555 parser_ctx ["is_prefix" ] = is_prefix
555556 return parser_ctx
556557
557- def parse (version_str , strict = False ):
558+ def parse (version_str , strict = False , _fail = fail ):
558559 """Parse a PEP4408 compliant version.
559560
560561 This is similar to `normalize_pep440`, but it parses individual components to
@@ -563,6 +564,7 @@ def parse(version_str, strict = False):
563564 Args:
564565 version_str: version string to be normalized according to PEP 440.
565566 strict: fail if the version is invalid.
567+ _fail: used for tests
566568
567569 Returns:
568570 a struct with individual components of a version:
@@ -580,29 +582,29 @@ def parse(version_str, strict = False):
580582 * `string` {type}`str` normalized value of the input.
581583 """
582584
583- parts = _parse (version_str , strict = strict )
585+ parts = _parse (version_str , strict = strict , _fail = _fail )
584586 if not parts :
585587 return None
586588
587589 if parts ["is_prefix" ] and (parts ["local" ] or parts ["post" ] or parts ["dev" ] or parts ["pre" ]):
588590 if strict :
589- fail ("local version part has been obtained, but only public segments can have prefix matches" )
591+ _fail ("local version part has been obtained, but only public segments can have prefix matches" )
590592
591593 # https://peps.python.org/pep-0440/#public-version-identifiers
592594 return None
593595
594596 return struct (
595- epoch = _parse_epoch (parts ["epoch" ]),
597+ epoch = _parse_epoch (parts ["epoch" ], _fail ),
596598 release = _parse_release (parts ["release" ]),
597599 pre = _parse_pre (parts ["pre" ]),
598- post = _parse_post (parts ["post" ]),
599- dev = _parse_dev (parts ["dev" ]),
600- local = _parse_local (parts ["local" ]),
600+ post = _parse_post (parts ["post" ], _fail ),
601+ dev = _parse_dev (parts ["dev" ], _fail ),
602+ local = _parse_local (parts ["local" ], _fail ),
601603 string = parts ["norm" ],
602604 is_prefix = parts ["is_prefix" ],
603605 )
604606
605- def _parse_epoch (value ):
607+ def _parse_epoch (value , fail ):
606608 if not value :
607609 return 0
608610
@@ -614,7 +616,7 @@ def _parse_epoch(value):
614616def _parse_release (value ):
615617 return tuple ([int (d ) for d in value .split ("." )])
616618
617- def _parse_local (value ):
619+ def _parse_local (value , fail ):
618620 if not value :
619621 return None
620622
@@ -624,7 +626,7 @@ def _parse_local(value):
624626 # If the part is numerical, handle it as a number
625627 return tuple ([int (part ) if part .isdigit () else part for part in value [1 :].split ("." )])
626628
627- def _parse_dev (value ):
629+ def _parse_dev (value , fail ):
628630 if not value :
629631 return None
630632
@@ -646,7 +648,7 @@ def _parse_pre(value):
646648
647649 return (prefix , int (value [len (prefix ):]))
648650
649- def _parse_post (value ):
651+ def _parse_post (value , fail ):
650652 if not value :
651653 return None
652654
0 commit comments