| 4697 | |
| 4698 | @classmethod |
| 4699 | def _handle_int( |
| 4700 | cls, value: Any | None, coerce_int: bool |
| 4701 | ) -> tuple[int | None, FrameClauseType]: |
| 4702 | if value is None: |
| 4703 | return None, FrameClauseType.UNBOUNDED |
| 4704 | |
| 4705 | if coerce_int: |
| 4706 | try: |
| 4707 | integer = int(value) |
| 4708 | except ValueError as err: |
| 4709 | raise exc.ArgumentError( |
| 4710 | "Integer or None expected for values in rows/groups frame" |
| 4711 | ) from err |
| 4712 | elif not isinstance(value, int): |
| 4713 | raise exc.ArgumentError( |
| 4714 | "When using a tuple to specify a range only integer or none " |
| 4715 | "values are allowed in the range frame. To specify a " |
| 4716 | "different type use the FrameClause directly." |
| 4717 | ) |
| 4718 | else: |
| 4719 | integer = value |
| 4720 | if integer == 0: |
| 4721 | return None, FrameClauseType.CURRENT |
| 4722 | elif integer < 0: |
| 4723 | return abs(integer), FrameClauseType.PRECEDING |
| 4724 | else: |
| 4725 | return integer, FrameClauseType.FOLLOWING |
| 4726 | |
| 4727 | @classmethod |
| 4728 | def _parse( |