|
2 | 2 | datetime,
|
3 | 3 | timedelta,
|
4 | 4 | )
|
5 |
| -from typing import ( |
6 |
| - TYPE_CHECKING, |
7 |
| - NoReturn, |
8 |
| -) |
| 5 | +from typing import NoReturn |
9 | 6 |
|
10 | 7 | import numpy as np
|
11 | 8 | from numpy import typing as npt # noqa: F401
|
12 | 9 | import pandas as pd
|
13 |
| -from typing_extensions import assert_type |
| 10 | +from typing_extensions import ( |
| 11 | + Never, |
| 12 | + assert_type, |
| 13 | +) |
14 | 14 |
|
15 | 15 | from tests import (
|
16 | 16 | TYPE_CHECKING_INVALID_USAGE,
|
17 | 17 | check,
|
18 | 18 | )
|
19 | 19 |
|
20 |
| -if TYPE_CHECKING: |
21 |
| - from pandas.core.series import TimedeltaSeries # noqa: F401 |
22 |
| - |
23 | 20 | anchor = datetime(2025, 8, 18)
|
24 | 21 |
|
25 | 22 | # left operands
|
@@ -152,76 +149,96 @@ def test_sub_i_pd_series() -> None:
|
152 | 149 | def test_sub_ts_py_datetime() -> None:
|
153 | 150 | """Test pd.Series[Any] (Timestamp | Timedelta) - Python native datetime"""
|
154 | 151 | s = anchor
|
| 152 | + a = [s + timedelta(minutes=m) for m in range(3)] |
155 | 153 |
|
156 |
| - check(assert_type(left_ts - s, "TimedeltaSeries"), pd.Series, pd.Timedelta) |
| 154 | + if TYPE_CHECKING_INVALID_USAGE: |
| 155 | + _0 = left_ts - s # type: ignore[operator] # pyright: ignore[reportOperatorIssue] |
| 156 | + _1 = left_ts - a # type: ignore[operator] # pyright: ignore[reportOperatorIssue] |
| 157 | + _2 = left_td - s # type: ignore[operator] # pyright: ignore[reportOperatorIssue] |
| 158 | + _3 = left_td - a # type: ignore[operator] # pyright: ignore[reportOperatorIssue] |
157 | 159 |
|
158 |
| - check(assert_type(s - left_ts, pd.Series), pd.Series, pd.Timedelta) |
159 |
| - check(assert_type(s - left_td, pd.Series), pd.Series, pd.Timestamp) |
| 160 | + _4 = s - left_ts # type: ignore[operator] # pyright: ignore[reportOperatorIssue] |
| 161 | + _5 = a - left_ts # type: ignore[operator] # pyright: ignore[reportOperatorIssue] |
| 162 | + _6 = s - left_td # type: ignore[operator] # pyright: ignore[reportOperatorIssue] |
| 163 | + _7 = a - left_td # type: ignore[operator] # pyright: ignore[reportOperatorIssue] |
160 | 164 |
|
161 |
| - check(assert_type(left_ts.sub(s), "TimedeltaSeries"), pd.Series, pd.Timedelta) |
| 165 | + left_ts.sub(s) # type: ignore[arg-type] # pyright: ignore[reportArgumentType,reportCallIssue] |
| 166 | + left_ts.sub(a) # type: ignore[arg-type] # pyright: ignore[reportArgumentType,reportCallIssue] |
| 167 | + left_td.sub(s) # type: ignore[arg-type] # pyright: ignore[reportArgumentType,reportCallIssue] |
| 168 | + left_td.sub(a) # type: ignore[arg-type] # pyright: ignore[reportArgumentType,reportCallIssue] |
162 | 169 |
|
163 |
| - check(assert_type(left_ts.rsub(s), pd.Series), pd.Series, pd.Timedelta) |
164 |
| - check(assert_type(left_td.rsub(s), pd.Series), pd.Series, pd.Timestamp) |
| 170 | + left_ts.rsub(s) # type: ignore[arg-type] # pyright: ignore[reportArgumentType,reportCallIssue] |
| 171 | + left_ts.rsub(a) # type: ignore[arg-type] # pyright: ignore[reportArgumentType,reportCallIssue] |
| 172 | + left_td.rsub(s) # type: ignore[arg-type] # pyright: ignore[reportArgumentType,reportCallIssue] |
| 173 | + left_td.rsub(a) # type: ignore[arg-type] # pyright: ignore[reportArgumentType,reportCallIssue] |
165 | 174 |
|
166 | 175 |
|
167 | 176 | def test_sub_ts_numpy_datetime() -> None:
|
168 | 177 | """Test pd.Series[Any] (Timestamp | Timedelta) - numpy datetime(s)"""
|
169 | 178 | s = np.datetime64(anchor)
|
170 | 179 | a = np.array([s + np.timedelta64(m, "m") for m in range(3)], np.datetime64)
|
171 | 180 |
|
172 |
| - check(assert_type(left_ts - s, "TimedeltaSeries"), pd.Series, pd.Timedelta) |
173 |
| - if TYPE_CHECKING_INVALID_USAGE: |
174 |
| - _0 = left_td - s |
175 |
| - check(assert_type(left_ts - a, "TimedeltaSeries"), pd.Series, pd.Timedelta) |
176 | 181 | if TYPE_CHECKING_INVALID_USAGE:
|
177 |
| - _1 = left_td - a |
| 182 | + # `numpy` typing gives the corresponding `ndarray`s in the static type |
| 183 | + # checking, where our `__rsub__` cannot override. |
| 184 | + _0 = left_ts - s # type: ignore[operator] # pyright: ignore[reportOperatorIssue] |
| 185 | + # _1 = left_ts - a |
| 186 | + _2 = left_td - s # type: ignore[operator] # pyright: ignore[reportOperatorIssue] |
| 187 | + # _3 = left_td - a |
178 | 188 |
|
179 |
| - check(assert_type(s - left_ts, pd.Series), pd.Series, pd.Timedelta) |
180 |
| - check(assert_type(s - left_td, pd.Series), pd.Series, pd.Timestamp) |
181 |
| - # `numpy` typing gives the corresponding `ndarray`s in the static type |
182 |
| - # checking, where our `__rsub__` cannot override. At runtime, they return |
183 |
| - # `Series`s. |
184 |
| - check(assert_type(a - left_ts, "npt.NDArray[np.datetime64]"), pd.Series, pd.Timedelta) # type: ignore[assert-type] |
185 |
| - check(assert_type(a - left_td, "npt.NDArray[np.datetime64]"), pd.Series, pd.Timestamp) # type: ignore[assert-type] |
| 189 | + _4 = s - left_ts # type: ignore[operator] # pyright: ignore[reportOperatorIssue] |
| 190 | + # _5 = a - left_ts |
| 191 | + _6 = s - left_td # type: ignore[operator] # pyright: ignore[reportOperatorIssue] |
| 192 | + # _7 = a - left_td |
186 | 193 |
|
187 |
| - check(assert_type(left_ts.sub(s), "TimedeltaSeries"), pd.Series, pd.Timedelta) |
188 |
| - if TYPE_CHECKING_INVALID_USAGE: |
189 |
| - left_td.sub(s) |
190 |
| - check(assert_type(left_ts.sub(a), "TimedeltaSeries"), pd.Series, pd.Timedelta) |
191 |
| - if TYPE_CHECKING_INVALID_USAGE: |
192 |
| - left_td.sub(a) |
| 194 | + left_ts.sub(s) # type: ignore[arg-type] # pyright: ignore[reportArgumentType,reportCallIssue] |
| 195 | + left_ts.sub(a) # type: ignore[arg-type] # pyright: ignore[reportArgumentType,reportCallIssue] |
| 196 | + left_td.sub(s) # type: ignore[arg-type] # pyright: ignore[reportArgumentType,reportCallIssue] |
| 197 | + left_td.sub(a) # type: ignore[arg-type] # pyright: ignore[reportArgumentType,reportCallIssue] |
193 | 198 |
|
194 |
| - check(assert_type(left_ts.rsub(s), pd.Series), pd.Series, pd.Timedelta) |
195 |
| - check(assert_type(left_td.rsub(s), pd.Series), pd.Series, pd.Timestamp) |
196 |
| - check(assert_type(left_ts.rsub(a), pd.Series), pd.Series, pd.Timedelta) |
197 |
| - check(assert_type(left_td.rsub(a), pd.Series), pd.Series, pd.Timestamp) |
| 199 | + left_ts.rsub(s) # type: ignore[arg-type] # pyright: ignore[reportArgumentType,reportCallIssue] |
| 200 | + left_ts.rsub(a) # type: ignore[arg-type] # pyright: ignore[reportArgumentType,reportCallIssue] |
| 201 | + left_td.rsub(s) # type: ignore[arg-type] # pyright: ignore[reportArgumentType,reportCallIssue] |
| 202 | + left_td.rsub(a) # type: ignore[arg-type] # pyright: ignore[reportArgumentType,reportCallIssue] |
198 | 203 |
|
199 | 204 |
|
200 | 205 | def test_sub_ts_pd_datetime() -> None:
|
201 | 206 | """Test pd.Series[Any] (Timestamp | Timedelta) - Pandas datetime(s)"""
|
202 | 207 | s = pd.Timestamp(anchor)
|
203 | 208 | a = pd.Series([s + pd.Timedelta(minutes=m) for m in range(3)])
|
204 | 209 |
|
205 |
| - check(assert_type(left_ts - s, "TimedeltaSeries"), pd.Series, pd.Timedelta) |
206 |
| - if TYPE_CHECKING_INVALID_USAGE: |
207 |
| - _0 = left_td - s |
208 |
| - check(assert_type(left_ts - a, "TimedeltaSeries"), pd.Series, pd.Timedelta) |
209 | 210 | if TYPE_CHECKING_INVALID_USAGE:
|
210 |
| - _1 = left_td - a |
| 211 | + _0 = left_ts - s # type: ignore[operator] # pyright: ignore[reportOperatorIssue] |
| 212 | + assert_type(left_ts - a, Never) |
| 213 | + _2 = left_td - s # type: ignore[operator] # pyright: ignore[reportOperatorIssue] |
| 214 | + assert_type(left_td - a, Never) |
211 | 215 |
|
212 |
| - check(assert_type(s - left_ts, pd.Series), pd.Series, pd.Timedelta) |
213 |
| - check(assert_type(s - left_td, pd.Series), pd.Series, pd.Timestamp) |
214 |
| - check(assert_type(a - left_ts, pd.Series), pd.Series, pd.Timedelta) |
215 |
| - check(assert_type(a - left_td, pd.Series), pd.Series, pd.Timestamp) |
| 216 | + _4 = s - left_ts # type: ignore[operator] # pyright: ignore[reportOperatorIssue] |
| 217 | + assert_type(a - left_ts, Never) |
| 218 | + _6 = s - left_td # type: ignore[operator] # pyright: ignore[reportOperatorIssue] |
| 219 | + assert_type(a - left_td, Never) |
| 220 | + |
| 221 | + left_ts.sub(s) # type: ignore[arg-type] # pyright: ignore[reportArgumentType,reportCallIssue] |
| 222 | + assert_type(left_ts.sub(a), Never) |
| 223 | + |
| 224 | + |
| 225 | +def test_sub_ts_pd_datetime_1() -> None: |
| 226 | + """Test pd.Series[Any] (Timestamp | Timedelta) - Pandas datetime(s)""" |
| 227 | + s = pd.Timestamp(anchor) |
| 228 | + a = pd.Series([s + pd.Timedelta(minutes=m) for m in range(3)]) |
216 | 229 |
|
217 |
| - check(assert_type(left_ts.sub(s), "TimedeltaSeries"), pd.Series, pd.Timedelta) |
218 |
| - if TYPE_CHECKING_INVALID_USAGE: |
219 |
| - left_td.sub(s) |
220 |
| - check(assert_type(left_ts.sub(a), "TimedeltaSeries"), pd.Series, pd.Timedelta) |
221 | 230 | if TYPE_CHECKING_INVALID_USAGE:
|
222 |
| - left_td.sub(a) |
| 231 | + # When I merge this one to the previous one, mypy does not allow me to pass |
| 232 | + left_ts.rsub(s) # type: ignore[arg-type] # pyright: ignore[reportArgumentType,reportCallIssue] |
| 233 | + assert_type(left_ts.rsub(a), Never) |
223 | 234 |
|
224 |
| - check(assert_type(left_ts.rsub(s), pd.Series), pd.Series, pd.Timedelta) |
225 |
| - check(assert_type(left_td.rsub(s), pd.Series), pd.Series, pd.Timestamp) |
226 |
| - check(assert_type(left_ts.rsub(a), pd.Series), pd.Series, pd.Timedelta) |
227 |
| - check(assert_type(left_td.rsub(a), pd.Series), pd.Series, pd.Timestamp) |
| 235 | + |
| 236 | +def test_sub_ts_pd_datetime_2() -> None: |
| 237 | + """Test pd.Series[Any] (Timestamp | Timedelta) - Pandas datetime(s)""" |
| 238 | + s = pd.Timestamp(anchor) |
| 239 | + a = pd.Series([s + pd.Timedelta(minutes=m) for m in range(3)]) |
| 240 | + |
| 241 | + if TYPE_CHECKING_INVALID_USAGE: |
| 242 | + # When I merge this one to the previous one, mypy does not allow me to pass |
| 243 | + left_td.rsub(s) # type: ignore[arg-type] # pyright: ignore[reportArgumentType,reportCallIssue] |
| 244 | + assert_type(left_td.rsub(a), Never) |
0 commit comments