Skip to content

Tests for Deprecate SparseArray for python 3.6 and 3.7 and fixes to other deprecation tests #30799

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 22 commits into from
Jan 9, 2020
Merged
Show file tree
Hide file tree
Changes from 19 commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
4ace5eb
fix deprecation test for python 3.7
Dr-Irv Jan 7, 2020
76dbae4
sparsearray OK for 3.6
Dr-Irv Jan 7, 2020
2bbc831
handle 3.6/3.7 diffs
Dr-Irv Jan 7, 2020
def8d28
formatted for black
Dr-Irv Jan 7, 2020
a32d4dc
Merge remote-tracking branch 'upstream/master' into sparsedepr
Dr-Irv Jan 7, 2020
ea7b959
split test_api for 3.6 vs 3.7
Dr-Irv Jan 7, 2020
385f6d3
Merge branch 'sparsedepr' of https://github.com/Dr-Irv/pandas into sp…
Dr-Irv Jan 7, 2020
f5d0357
Merge branch 'sparsedepr' of https://github.com/Dr-Irv/pandas into sp…
Dr-Irv Jan 7, 2020
2e0bab0
datetime fixes
Dr-Irv Jan 7, 2020
52a7d03
Merge branch 'sparsedepr' of https://github.com/Dr-Irv/pandas into sp…
Dr-Irv Jan 7, 2020
5c59f84
make datetime work with 3.6
Dr-Irv Jan 8, 2020
461b0fc
Merge remote-tracking branch 'upstream/master' into sparsedepr
Dr-Irv Jan 8, 2020
f1b89f4
use instancecheck. Modify SparseArray for 3.6 to use metaclass pattern
Dr-Irv Jan 8, 2020
f08ffc9
Merge branch 'sparsedepr' of https://github.com/Dr-Irv/pandas into sp…
Dr-Irv Jan 8, 2020
aa73611
Merge remote-tracking branch 'upstream/master' into sparsedepr
Dr-Irv Jan 8, 2020
4b7e4bf
Merge branch 'sparsedepr' of https://github.com/Dr-Irv/pandas into sp…
Dr-Irv Jan 8, 2020
c31afa1
fix mypy issue for methods with no arguments
Dr-Irv Jan 8, 2020
26dc90a
Merge remote-tracking branch 'upstream/master' into sparsedepr
Dr-Irv Jan 9, 2020
7861c98
snake_case and better returns on isinstance
Dr-Irv Jan 9, 2020
7947a81
shorten up imports for datetime and SparseArray
Dr-Irv Jan 9, 2020
d78ecea
revert import simplification to make mypy happy
Dr-Irv Jan 9, 2020
7cce2c7
Merge remote-tracking branch 'upstream/master' into sparsedepr
Dr-Irv Jan 9, 2020
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
65 changes: 52 additions & 13 deletions pandas/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -297,32 +297,71 @@ def __getattr__(self, item):

np = __numpy()

class __Datetime:
def __init__(self):
from datetime import datetime as dt
class __Datetime(type):

self.datetime = dt
from datetime import datetime as dt

def __getattr__(self, item):
datetime = dt

def __getattr__(cls, item):
cls.emit_warning()

try:
return getattr(cls.datetime, item)
except AttributeError:
raise AttributeError(f"module datetime has no attribute {item}")

def __instancecheck__(cls, other):
return isinstance(other, cls.datetime)

class __DatetimeSub(metaclass=__Datetime):
def emit_warning(dummy=0):
import warnings

warnings.warn(
"The pandas.datetime class is deprecated "
"and will be removed from pandas in a future version. "
"Import from datetime instead.",
FutureWarning,
stacklevel=2,
stacklevel=3,
)

try:
return getattr(self.datetime, item)
except AttributeError:
raise AttributeError(f"module datetime has no attribute {item}")
def __new__(cls, *args, **kwargs):
cls.emit_warning()
from datetime import datetime as dt

datetime = __Datetime().datetime
return dt(*args, **kwargs)

class SparseArray:
pass
datetime = __DatetimeSub

class __SparseArray(type):

from pandas.core.arrays.sparse import SparseArray as sa

SparseArray = sa

def __instancecheck__(cls, other):
return isinstance(other, cls.SparseArray)

class __SparseArraySub(metaclass=__SparseArray):
def emit_warning(dummy=0):
import warnings

warnings.warn(
"The pandas.SparseArray class is deprecated "
"and will be removed from pandas in a future version. "
"Use pandas.arrays.SparseArray instead.",
FutureWarning,
stacklevel=3,
)

def __new__(cls, *args, **kwargs):
cls.emit_warning()
from pandas.core.arrays.sparse import SparseArray as sa

return sa(*args, **kwargs)

SparseArray = __SparseArraySub


# module level doc-string
Expand Down
62 changes: 38 additions & 24 deletions pandas/tests/api/test_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ class TestPDApi(Base):
]

# these are already deprecated; awaiting removal
deprecated_modules: List[str] = []
deprecated_modules: List[str] = ["np", "datetime"]

# misc
misc = ["IndexSlice", "NaT", "NA"]
Expand Down Expand Up @@ -90,15 +90,17 @@ class TestPDApi(Base):
"UInt64Dtype",
"NamedAgg",
]
if not compat.PY37:
classes.extend(["Panel", "SparseSeries", "SparseDataFrame", "SparseArray"])
deprecated_modules.extend(["np", "datetime"])

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

# these should be deprecated in the future
deprecated_classes_in_future: List[str] = []
deprecated_classes_in_future: List[str] = ["SparseArray"]

if not compat.PY37:
classes.extend(["Panel", "SparseSeries", "SparseDataFrame"])
# deprecated_modules.extend(["np", "datetime"])
# deprecated_classes_in_future.extend(["SparseArray"])

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

def test_api(self):

self.check(
pd,
checkthese = (
self.lib
+ self.misc
+ self.modules
+ self.deprecated_modules
+ self.classes
+ self.deprecated_classes
+ self.deprecated_classes_in_future
+ self.funcs
+ self.funcs_option
+ self.funcs_read
+ self.funcs_json
+ self.funcs_to
+ self.deprecated_funcs_in_future
+ self.deprecated_funcs
+ self.private_modules,
self.ignored,
+ self.private_modules
)
if not compat.PY37:
checkthese.extend(
self.deprecated_modules
+ self.deprecated_classes
+ self.deprecated_classes_in_future
+ self.deprecated_funcs_in_future
+ self.deprecated_funcs
)
self.check(pd, checkthese, self.ignored)

def test_depr(self):
deprecated = (
deprecated_list = (
self.deprecated_modules
+ self.deprecated_classes
+ self.deprecated_classes_in_future
+ self.deprecated_funcs
+ self.deprecated_funcs_in_future
)
for depr in deprecated:
for depr in deprecated_list:
with tm.assert_produces_warning(FutureWarning):
if compat.PY37:
getattr(pd, depr)
elif depr == "datetime":
deprecated = getattr(pd, "__Datetime")
deprecated().__getattr__(dir(pd.datetime)[-1])
else:
deprecated = getattr(pd, depr)
deprecated.__getattr__(dir(deprecated)[-1])
deprecated = getattr(pd, depr)
if not compat.PY37:
if depr == "datetime":
deprecated.__getattr__(dir(pd.datetime.datetime)[-1])
elif depr == "SparseArray":
deprecated([])
else:
deprecated.__getattr__(dir(deprecated)[-1])


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

assert isinstance(pd.datetime(2015, 1, 2, 0, 0), pd.datetime)


def test_sparsearray():
import warnings

with warnings.catch_warnings():
warnings.simplefilter("ignore", FutureWarning)
assert isinstance(pd.array([1, 2, 3], dtype="Sparse"), pd.SparseArray)


def test_np():
import numpy as np
Expand Down