Skip to content

Commit a474a01

Browse files
Dr-Irvjreback
authored andcommitted
Tests for Deprecate SparseArray for python 3.6 and 3.7 and fixes to other deprecation tests (#30799)
1 parent 6437f5e commit a474a01

File tree

2 files changed

+90
-37
lines changed

2 files changed

+90
-37
lines changed

pandas/__init__.py

+52-13
Original file line numberDiff line numberDiff line change
@@ -297,32 +297,71 @@ def __getattr__(self, item):
297297

298298
np = __numpy()
299299

300-
class __Datetime:
301-
def __init__(self):
302-
from datetime import datetime as dt
300+
class __Datetime(type):
303301

304-
self.datetime = dt
302+
from datetime import datetime as dt
305303

306-
def __getattr__(self, item):
304+
datetime = dt
305+
306+
def __getattr__(cls, item):
307+
cls.emit_warning()
308+
309+
try:
310+
return getattr(cls.datetime, item)
311+
except AttributeError:
312+
raise AttributeError(f"module datetime has no attribute {item}")
313+
314+
def __instancecheck__(cls, other):
315+
return isinstance(other, cls.datetime)
316+
317+
class __DatetimeSub(metaclass=__Datetime):
318+
def emit_warning(dummy=0):
307319
import warnings
308320

309321
warnings.warn(
310322
"The pandas.datetime class is deprecated "
311323
"and will be removed from pandas in a future version. "
312324
"Import from datetime instead.",
313325
FutureWarning,
314-
stacklevel=2,
326+
stacklevel=3,
315327
)
316328

317-
try:
318-
return getattr(self.datetime, item)
319-
except AttributeError:
320-
raise AttributeError(f"module datetime has no attribute {item}")
329+
def __new__(cls, *args, **kwargs):
330+
cls.emit_warning()
331+
from datetime import datetime as dt
321332

322-
datetime = __Datetime().datetime
333+
return dt(*args, **kwargs)
323334

324-
class SparseArray:
325-
pass
335+
datetime = __DatetimeSub
336+
337+
class __SparseArray(type):
338+
339+
from pandas.core.arrays.sparse import SparseArray as sa
340+
341+
SparseArray = sa
342+
343+
def __instancecheck__(cls, other):
344+
return isinstance(other, cls.SparseArray)
345+
346+
class __SparseArraySub(metaclass=__SparseArray):
347+
def emit_warning(dummy=0):
348+
import warnings
349+
350+
warnings.warn(
351+
"The pandas.SparseArray class is deprecated "
352+
"and will be removed from pandas in a future version. "
353+
"Use pandas.arrays.SparseArray instead.",
354+
FutureWarning,
355+
stacklevel=3,
356+
)
357+
358+
def __new__(cls, *args, **kwargs):
359+
cls.emit_warning()
360+
from pandas.core.arrays.sparse import SparseArray as sa
361+
362+
return sa(*args, **kwargs)
363+
364+
SparseArray = __SparseArraySub
326365

327366

328367
# module level doc-string

pandas/tests/api/test_api.py

+38-24
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ class TestPDApi(Base):
4343
]
4444

4545
# these are already deprecated; awaiting removal
46-
deprecated_modules: List[str] = []
46+
deprecated_modules: List[str] = ["np", "datetime"]
4747

4848
# misc
4949
misc = ["IndexSlice", "NaT", "NA"]
@@ -90,15 +90,17 @@ class TestPDApi(Base):
9090
"UInt64Dtype",
9191
"NamedAgg",
9292
]
93-
if not compat.PY37:
94-
classes.extend(["Panel", "SparseSeries", "SparseDataFrame", "SparseArray"])
95-
deprecated_modules.extend(["np", "datetime"])
9693

9794
# these are already deprecated; awaiting removal
9895
deprecated_classes: List[str] = []
9996

10097
# these should be deprecated in the future
101-
deprecated_classes_in_future: List[str] = []
98+
deprecated_classes_in_future: List[str] = ["SparseArray"]
99+
100+
if not compat.PY37:
101+
classes.extend(["Panel", "SparseSeries", "SparseDataFrame"])
102+
# deprecated_modules.extend(["np", "datetime"])
103+
# deprecated_classes_in_future.extend(["SparseArray"])
102104

103105
# external modules exposed in pandas namespace
104106
modules: List[str] = []
@@ -201,44 +203,46 @@ class TestPDApi(Base):
201203

202204
def test_api(self):
203205

204-
self.check(
205-
pd,
206+
checkthese = (
206207
self.lib
207208
+ self.misc
208209
+ self.modules
209-
+ self.deprecated_modules
210210
+ self.classes
211-
+ self.deprecated_classes
212-
+ self.deprecated_classes_in_future
213211
+ self.funcs
214212
+ self.funcs_option
215213
+ self.funcs_read
216214
+ self.funcs_json
217215
+ self.funcs_to
218-
+ self.deprecated_funcs_in_future
219-
+ self.deprecated_funcs
220-
+ self.private_modules,
221-
self.ignored,
216+
+ self.private_modules
222217
)
218+
if not compat.PY37:
219+
checkthese.extend(
220+
self.deprecated_modules
221+
+ self.deprecated_classes
222+
+ self.deprecated_classes_in_future
223+
+ self.deprecated_funcs_in_future
224+
+ self.deprecated_funcs
225+
)
226+
self.check(pd, checkthese, self.ignored)
223227

224228
def test_depr(self):
225-
deprecated = (
229+
deprecated_list = (
226230
self.deprecated_modules
227231
+ self.deprecated_classes
228232
+ self.deprecated_classes_in_future
229233
+ self.deprecated_funcs
230234
+ self.deprecated_funcs_in_future
231235
)
232-
for depr in deprecated:
236+
for depr in deprecated_list:
233237
with tm.assert_produces_warning(FutureWarning):
234-
if compat.PY37:
235-
getattr(pd, depr)
236-
elif depr == "datetime":
237-
deprecated = getattr(pd, "__Datetime")
238-
deprecated().__getattr__(dir(pd.datetime)[-1])
239-
else:
240-
deprecated = getattr(pd, depr)
241-
deprecated.__getattr__(dir(deprecated)[-1])
238+
deprecated = getattr(pd, depr)
239+
if not compat.PY37:
240+
if depr == "datetime":
241+
deprecated.__getattr__(dir(pd.datetime.datetime)[-1])
242+
elif depr == "SparseArray":
243+
deprecated([])
244+
else:
245+
deprecated.__getattr__(dir(deprecated)[-1])
242246

243247

244248
def test_datetime():
@@ -249,6 +253,16 @@ def test_datetime():
249253
warnings.simplefilter("ignore", FutureWarning)
250254
assert datetime(2015, 1, 2, 0, 0) == pd.datetime(2015, 1, 2, 0, 0)
251255

256+
assert isinstance(pd.datetime(2015, 1, 2, 0, 0), pd.datetime)
257+
258+
259+
def test_sparsearray():
260+
import warnings
261+
262+
with warnings.catch_warnings():
263+
warnings.simplefilter("ignore", FutureWarning)
264+
assert isinstance(pd.array([1, 2, 3], dtype="Sparse"), pd.SparseArray)
265+
252266

253267
def test_np():
254268
import numpy as np

0 commit comments

Comments
 (0)