def parse()

in pbspro/src/pbspro/resource.py [0:0]


    def parse(self, expr: str) -> Any:
        """
        Duration
            A period of time, expressed either as
                An integer whose units are seconds
            or
                [[hours:]minutes:]seconds[.milliseconds]
                in the form:
                    [[HH:]MM:]SS[.milliseconds]
                Milliseconds are rounded to the nearest second.
        """
        try:
            return int(expr)
        except ValueError:
            pass

        def _parse_int(e: str) -> int:
            try:
                return int(e)
            except ValueError:
                raise ResourceParsingError("Could not parse {} as an int".format(e))

        toks = expr.split(":")
        # I'll just always add a milliseconds here
        if "." in toks[-1]:
            toks = toks[:-1] + toks[-1].split(".")
        else:
            toks = toks + ["0"]

        if len(toks) > 4:
            raise ResourceParsingError(
                "Too many fields ({} > 4): Could not parse duration '{}': expected [[hours:]minutes:]seconds[.milliseconds]".format(
                    len(toks), expr
                )
            )

        # weird... I guess I'll handle rounding myself
        # >>> round(.5)
        #    0
        rounded_ms = 1 if _parse_int(toks[-1][0]) >= 5 else 0

        seconds = _parse_int(toks[-2]) + rounded_ms

        if len(toks) >= 3:
            seconds += _parse_int(toks[-3]) * 60

        if len(toks) == 4:
            seconds += _parse_int(toks[-4]) * 60 * 60

        return seconds