Skip to content

Commit a1e7aa8

Browse files
committed
Adapt to latest changes in CPython master.
1 parent 827c8be commit a1e7aa8

File tree

3 files changed

+183
-158
lines changed

3 files changed

+183
-158
lines changed

CHANGES.rst

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,20 @@
11
ChangeLog
22
=========
33

4+
1.20 (2025-??-??)
5+
-----------------
6+
7+
* Accept leading zeros in precision/width for Fraction's formatting, following
8+
https://github.com/python/cpython/pull/130663
9+
10+
* In line with Python's ``Fraction``, quicktions now raises a ``ValueError``
11+
(instead of an ``OverflowError``) when exceeding parser limits, following
12+
https://github.com/python/cpython/pull/134010
13+
14+
* Call ``__rpow__`` in ternary ``pow()`` if necessary, following
15+
https://github.com/python/cpython/pull/130251
16+
17+
418
1.19 (2024-11-29)
519
-----------------
620

src/quicktions.pyx

Lines changed: 43 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -382,9 +382,9 @@ cdef object _FLOAT_FORMAT_SPECIFICATION_MATCHER = re.compile(r"""
382382
# A '0' that's *not* followed by another digit is parsed as a minimum width
383383
# rather than a zeropad flag.
384384
(?P<zeropad>0(?=[0-9]))?
385-
(?P<minimumwidth>0|[1-9][0-9]*)?
385+
(?P<minimumwidth>[0-9]+)?
386386
(?P<thousands_sep>[,_])?
387-
(?:\.(?P<precision>0|[1-9][0-9]*))?
387+
(?:\.(?P<precision>[0-9]+))?
388388
(?P<presentation_type>[eEfFgG%])
389389
$
390390
""", re.DOTALL | re.VERBOSE).match
@@ -451,8 +451,8 @@ cdef class Fraction:
451451
return
452452

453453
elif isinstance(numerator, unicode):
454-
numerator, denominator, is_normalised = _parse_fraction(
455-
<unicode>numerator, len(<unicode>numerator))
454+
numerator, denominator, is_normalised = _parse_fraction[unicode](
455+
<unicode>numerator, len(<unicode>numerator), numerator)
456456
if is_normalised:
457457
_normalize = False
458458
# fall through to normalisation below
@@ -947,7 +947,7 @@ cdef class Fraction:
947947
if x is not None:
948948
return NotImplemented
949949

950-
if isinstance(b, (int, long)):
950+
if isinstance(b, int):
951951
return _pow(a.numerator, a.denominator, b, 1)
952952
elif isinstance(b, (Fraction, Rational)):
953953
return _pow(a.numerator, a.denominator, b.numerator, b.denominator)
@@ -971,7 +971,7 @@ cdef class Fraction:
971971
# If a is an int, keep it that way if possible.
972972
return a ** bn
973973

974-
if isinstance(a, (int, long)):
974+
if isinstance(a, int):
975975
return _pow(a, 1, bn, bd)
976976
if isinstance(a, (Fraction, Rational)):
977977
return _pow(a.numerator, a.denominator, bn, bd)
@@ -1152,7 +1152,7 @@ cdef class Fraction:
11521152

11531153
@cython.final
11541154
cdef _eq(a, b):
1155-
if type(b) is int or type(b) is long:
1155+
if type(b) is int:
11561156
return a._numerator == b and a._denominator == 1
11571157
if type(b) is Fraction:
11581158
return (a._numerator == (<Fraction>b)._numerator and
@@ -1183,7 +1183,7 @@ cdef class Fraction:
11831183
11841184
"""
11851185
# convert other to a Rational instance where reasonable.
1186-
if isinstance(other, (int, long)):
1186+
if isinstance(other, int):
11871187
a = self._numerator
11881188
b = self._denominator * other
11891189
elif type(other) is Fraction:
@@ -1591,7 +1591,7 @@ cdef _raise_parse_overflow(s):
15911591
s = repr(s)
15921592
if s[0] == 'b':
15931593
s = s[1:]
1594-
raise OverflowError(f"Exponent too large for Fraction: {s!s}") from None
1594+
raise ValueError(f"Exponent too large for Fraction: {s}") from None
15951595

15961596

15971597
cdef extern from *:
@@ -1639,7 +1639,7 @@ cdef inline object _parse_pylong(char* c_digits_start, char** c_digits_end):
16391639

16401640

16411641
@cython.cdivision(True)
1642-
cdef tuple _parse_fraction(AnyString s, Py_ssize_t s_len):
1642+
cdef tuple _parse_fraction(AnyString s, Py_ssize_t s_len, orig_str):
16431643
"""
16441644
Parse a string into a number tuple: (numerator, denominator, is_normalised)
16451645
"""
@@ -1665,7 +1665,7 @@ cdef tuple _parse_fraction(AnyString s, Py_ssize_t s_len):
16651665
if AnyString is unicode:
16661666
_unpack_ustring(s, &s_len, &s_data, &s_kind)
16671667
if s_kind == 1:
1668-
return _parse_fraction(<char*> s_data, s_len)
1668+
return _parse_fraction(<char*> s_data, s_len, orig_str)
16691669
cdata = <char*> s_data
16701670
cdata += 0 # mark used
16711671
else:
@@ -1689,7 +1689,7 @@ cdef tuple _parse_fraction(AnyString s, Py_ssize_t s_len):
16891689
elif state in (NUM, NUM_SPACE):
16901690
num = _parse_pylong(c_digits_start, &c_digits)
16911691
else:
1692-
_raise_invalid_input(s)
1692+
_raise_invalid_input(orig_str)
16931693
state = DENOM_START
16941694
break
16951695
elif c == u'.':
@@ -1700,31 +1700,31 @@ cdef tuple _parse_fraction(AnyString s, Py_ssize_t s_len):
17001700
elif state == NUM:
17011701
state = DECIMAL_DOT
17021702
else:
1703-
_raise_invalid_input(s)
1703+
_raise_invalid_input(orig_str)
17041704
break
17051705
elif c in u'eE':
17061706
if state == SMALL_NUM:
17071707
num = inum
17081708
elif state == NUM:
17091709
num = _parse_pylong(c_digits_start, &c_digits)
17101710
else:
1711-
_raise_invalid_input(s)
1711+
_raise_invalid_input(orig_str)
17121712
state = EXP_E
17131713
break
17141714
elif c in u'-+':
17151715
if state == BEGIN_SPACE:
17161716
is_neg = c == u'-'
17171717
state = BEGIN_SIGN
17181718
else:
1719-
_raise_invalid_input(s)
1719+
_raise_invalid_input(orig_str)
17201720
continue
17211721
elif c == u'_':
17221722
if state == SMALL_NUM:
17231723
state = SMALL_NUM_US
17241724
elif state == NUM:
17251725
state = NUM_US
17261726
else:
1727-
_raise_invalid_input(s)
1727+
_raise_invalid_input(orig_str)
17281728
continue
17291729
else:
17301730
if c.isspace():
@@ -1743,10 +1743,10 @@ cdef tuple _parse_fraction(AnyString s, Py_ssize_t s_len):
17431743
num = _parse_pylong(c_digits_start, &c_digits)
17441744
state = NUM_SPACE
17451745
else:
1746-
_raise_invalid_input(s)
1746+
_raise_invalid_input(orig_str)
17471747
continue
17481748

1749-
_raise_invalid_input(s)
1749+
_raise_invalid_input(orig_str)
17501750
continue
17511751

17521752
# normal digit found
@@ -1780,7 +1780,7 @@ cdef tuple _parse_fraction(AnyString s, Py_ssize_t s_len):
17801780
break
17811781
pos += 1
17821782
else:
1783-
_raise_invalid_input(s)
1783+
_raise_invalid_input(orig_str)
17841784

17851785
if state == DENOM_START:
17861786
# NUM '/' | SMALL_NUM '/'
@@ -1800,15 +1800,15 @@ cdef tuple _parse_fraction(AnyString s, Py_ssize_t s_len):
18001800
is_neg ^= (c == u'-')
18011801
state = DENOM_SIGN
18021802
else:
1803-
_raise_invalid_input(s)
1803+
_raise_invalid_input(orig_str)
18041804
continue
18051805
elif c == u'_':
18061806
if state == SMALL_DENOM:
18071807
state = SMALL_DENOM_US
18081808
elif state == DENOM:
18091809
state = DENOM_US
18101810
else:
1811-
_raise_invalid_input(s)
1811+
_raise_invalid_input(orig_str)
18121812
continue
18131813
else:
18141814
if c.isspace():
@@ -1825,11 +1825,11 @@ cdef tuple _parse_fraction(AnyString s, Py_ssize_t s_len):
18251825
elif state == DENOM:
18261826
denom = _parse_pylong(c_digits_start, &c_digits)
18271827
else:
1828-
_raise_invalid_input(s)
1828+
_raise_invalid_input(orig_str)
18291829
state = DENOM_SPACE
18301830
continue
18311831

1832-
_raise_invalid_input(s)
1832+
_raise_invalid_input(orig_str)
18331833
continue
18341834

18351835
# normal digit found
@@ -1863,7 +1863,7 @@ cdef tuple _parse_fraction(AnyString s, Py_ssize_t s_len):
18631863
break
18641864
pos += 1
18651865
else:
1866-
_raise_invalid_input(s)
1866+
_raise_invalid_input(orig_str)
18671867

18681868
elif state in (SMALL_DECIMAL_DOT, START_DECIMAL_DOT):
18691869
# SMALL_NUM '.' | '.'
@@ -1876,13 +1876,13 @@ cdef tuple _parse_fraction(AnyString s, Py_ssize_t s_len):
18761876
if state == SMALL_DECIMAL:
18771877
state = SMALL_DECIMAL_US
18781878
else:
1879-
_raise_invalid_input(s)
1879+
_raise_invalid_input(orig_str)
18801880
continue
18811881
elif c in u'eE':
18821882
if state in (SMALL_DECIMAL_DOT, SMALL_DECIMAL):
18831883
num = inum
18841884
else:
1885-
_raise_invalid_input(s)
1885+
_raise_invalid_input(orig_str)
18861886
state = EXP_E
18871887
break
18881888
else:
@@ -1897,10 +1897,10 @@ cdef tuple _parse_fraction(AnyString s, Py_ssize_t s_len):
18971897
num = inum
18981898
state = SMALL_END_SPACE
18991899
else:
1900-
_raise_invalid_input(s)
1900+
_raise_invalid_input(orig_str)
19011901
continue
19021902

1903-
_raise_invalid_input(s)
1903+
_raise_invalid_input(orig_str)
19041904
continue
19051905

19061906
# normal digit found
@@ -1923,7 +1923,7 @@ cdef tuple _parse_fraction(AnyString s, Py_ssize_t s_len):
19231923
state = DECIMAL
19241924
break
19251925
else:
1926-
_raise_invalid_input(s)
1926+
_raise_invalid_input(orig_str)
19271927

19281928
if state in (DECIMAL_DOT, DECIMAL):
19291929
# NUM '.' | SMALL_DECIMAL->DECIMAL
@@ -1936,24 +1936,24 @@ cdef tuple _parse_fraction(AnyString s, Py_ssize_t s_len):
19361936
if state == DECIMAL:
19371937
state = DECIMAL_US
19381938
else:
1939-
_raise_invalid_input(s)
1939+
_raise_invalid_input(orig_str)
19401940
continue
19411941
elif c in u'eE':
19421942
if state in (DECIMAL_DOT, DECIMAL):
19431943
num = _parse_pylong(c_digits_start, &c_digits)
19441944
else:
1945-
_raise_invalid_input(s)
1945+
_raise_invalid_input(orig_str)
19461946
state = EXP_E
19471947
break
19481948
else:
19491949
if c.isspace():
19501950
if state in (DECIMAL, DECIMAL_DOT):
19511951
state = END_SPACE
19521952
else:
1953-
_raise_invalid_input(s)
1953+
_raise_invalid_input(orig_str)
19541954
break
19551955

1956-
_raise_invalid_input(s)
1956+
_raise_invalid_input(orig_str)
19571957
continue
19581958

19591959
# normal digit found
@@ -1970,7 +1970,7 @@ cdef tuple _parse_fraction(AnyString s, Py_ssize_t s_len):
19701970
decimal_len += 1
19711971
pos += 1
19721972
else:
1973-
_raise_invalid_input(s)
1973+
_raise_invalid_input(orig_str)
19741974

19751975
if state == EXP_E:
19761976
# (SMALL_) NUM ['.' DECIMAL] 'E'
@@ -1984,23 +1984,23 @@ cdef tuple _parse_fraction(AnyString s, Py_ssize_t s_len):
19841984
exp_is_neg = c == u'-'
19851985
state = EXP_SIGN
19861986
else:
1987-
_raise_invalid_input(s)
1987+
_raise_invalid_input(orig_str)
19881988
continue
19891989
elif c == u'_':
19901990
if state == EXP:
19911991
state = EXP_US
19921992
else:
1993-
_raise_invalid_input(s)
1993+
_raise_invalid_input(orig_str)
19941994
continue
19951995
else:
19961996
if c.isspace():
19971997
if state == EXP:
19981998
state = END_SPACE
19991999
else:
2000-
_raise_invalid_input(s)
2000+
_raise_invalid_input(orig_str)
20012001
break
20022002

2003-
_raise_invalid_input(s)
2003+
_raise_invalid_input(orig_str)
20042004
continue
20052005

20062006
# normal digit found
@@ -2018,9 +2018,9 @@ cdef tuple _parse_fraction(AnyString s, Py_ssize_t s_len):
20182018
pos += 1
20192019

20202020
if iexp > MAX_SMALL_NUMBER:
2021-
_raise_parse_overflow(s)
2021+
_raise_parse_overflow(orig_str)
20222022
else:
2023-
_raise_invalid_input(s)
2023+
_raise_invalid_input(orig_str)
20242024

20252025
if state in (END_SPACE, SMALL_END_SPACE, DENOM_SPACE):
20262026
while pos < s_len:
@@ -2030,7 +2030,7 @@ cdef tuple _parse_fraction(AnyString s, Py_ssize_t s_len):
20302030
pos += 1
20312031

20322032
if pos < s_len :
2033-
_raise_invalid_input(s)
2033+
_raise_invalid_input(orig_str)
20342034

20352035
is_normalised = False
20362036
if state in (SMALL_NUM, SMALL_DECIMAL, SMALL_DECIMAL_DOT, SMALL_END_SPACE):
@@ -2067,10 +2067,10 @@ cdef tuple _parse_fraction(AnyString s, Py_ssize_t s_len):
20672067
elif state == DENOM_SPACE:
20682068
pass
20692069
else:
2070-
_raise_invalid_input(s)
2070+
_raise_invalid_input(orig_str)
20712071

20722072
if decimal_len > MAX_SMALL_NUMBER:
2073-
_raise_parse_overflow(s)
2073+
_raise_parse_overflow(orig_str)
20742074
if exp_is_neg:
20752075
iexp = -iexp
20762076
iexp -= decimal_len

0 commit comments

Comments
 (0)