Skip to content

Commit 2153645

Browse files
committed
DEPS: remove most of distutils usage pandas-dev#41199
1 parent 244ae51 commit 2153645

22 files changed

+78
-79
lines changed

pandas/compat/_optional.py

+3-2
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
from __future__ import annotations
22

3-
import distutils.version
43
import importlib
54
import sys
65
import types
76
import warnings
87

8+
from packaging.version import Version
9+
910
# Update install.rst when updating versions!
1011

1112
VERSIONS = {
@@ -128,7 +129,7 @@ def import_optional_dependency(
128129
minimum_version = min_version if min_version is not None else VERSIONS.get(parent)
129130
if minimum_version:
130131
version = get_version(module_to_get)
131-
if distutils.version.LooseVersion(version) < minimum_version:
132+
if Version(version) < Version(minimum_version):
132133
msg = (
133134
f"Pandas requires version '{minimum_version}' or newer of '{parent}' "
134135
f"(version '{version}' currently installed)."

pandas/compat/numpy/__init__.py

+6-6
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,21 @@
11
""" support numpy compatibility across versions """
22

3-
from distutils.version import LooseVersion
43
import re
54

65
import numpy as np
6+
from packaging.version import Version
77

88
# numpy versioning
99
_np_version = np.__version__
10-
_nlv = LooseVersion(_np_version)
11-
np_version_under1p18 = _nlv < LooseVersion("1.18")
12-
np_version_under1p19 = _nlv < LooseVersion("1.19")
13-
np_version_under1p20 = _nlv < LooseVersion("1.20")
10+
_nlv = Version(_np_version)
11+
np_version_under1p18 = _nlv < Version("1.18")
12+
np_version_under1p19 = _nlv < Version("1.19")
13+
np_version_under1p20 = _nlv < Version("1.20")
1414
is_numpy_dev = ".dev" in str(_nlv)
1515
_min_numpy_ver = "1.17.3"
1616

1717

18-
if _nlv < _min_numpy_ver:
18+
if _nlv < Version(_min_numpy_ver):
1919
raise ImportError(
2020
f"this version of pandas is incompatible with numpy < {_min_numpy_ver}\n"
2121
f"your numpy version is {_np_version}.\n"

pandas/compat/numpy/function.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
methods that are spread throughout the codebase. This module will make it
1616
easier to adjust to future upstream changes in the analogous numpy signatures.
1717
"""
18-
from distutils.version import LooseVersion
1918
from typing import (
2019
Any,
2120
Dict,
@@ -27,6 +26,7 @@
2726
__version__,
2827
ndarray,
2928
)
29+
from packaging.version import Version
3030

3131
from pandas._libs.lib import (
3232
is_bool,
@@ -128,7 +128,7 @@ def validate_argmax_with_skipna(skipna, args, kwargs):
128128
ARGSORT_DEFAULTS["kind"] = "quicksort"
129129
ARGSORT_DEFAULTS["order"] = None
130130

131-
if LooseVersion(__version__) >= LooseVersion("1.17.0"):
131+
if Version(__version__) >= Version("1.17.0"):
132132
# GH-26361. NumPy added radix sort and changed default to None.
133133
ARGSORT_DEFAULTS["kind"] = None
134134

pandas/core/arrays/_arrow_utils.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
1-
from distutils.version import LooseVersion
21
import json
32

43
import numpy as np
4+
from packaging.version import Version
55
import pyarrow
66

77
from pandas.core.arrays.interval import VALID_CLOSED
88

9-
_pyarrow_version_ge_015 = LooseVersion(pyarrow.__version__) >= LooseVersion("0.15")
9+
_pyarrow_version_ge_015 = Version(pyarrow.__version__) >= Version("0.15")
1010

1111

1212
def pyarrow_array_to_numpy_and_mask(arr, dtype):

pandas/core/arrays/string_arrow.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
from __future__ import annotations
22

3-
from distutils.version import LooseVersion
43
from typing import (
54
TYPE_CHECKING,
65
Any,
@@ -9,6 +8,7 @@
98
)
109

1110
import numpy as np
11+
from packaging.version import Version
1212

1313
from pandas._libs import (
1414
lib,
@@ -54,7 +54,7 @@
5454
# PyArrow backed StringArrays are available starting at 1.0.0, but this
5555
# file is imported from even if pyarrow is < 1.0.0, before pyarrow.compute
5656
# and its compute functions existed. GH38801
57-
if LooseVersion(pa.__version__) >= "1.0.0":
57+
if Version(pa.__version__) >= Version("1.0.0"):
5858
import pyarrow.compute as pc
5959

6060
ARROW_CMP_FUNCS = {
@@ -222,7 +222,7 @@ def __init__(self, values):
222222
def _chk_pyarrow_available(cls) -> None:
223223
# TODO: maybe update import_optional_dependency to allow a minimum
224224
# version to be specified rather than use the global minimum
225-
if pa is None or LooseVersion(pa.__version__) < "1.0.0":
225+
if pa is None or Version(pa.__version__) < Version("1.0.0"):
226226
msg = "pyarrow>=1.0.0 is required for PyArrow backed StringArray."
227227
raise ImportError(msg)
228228

pandas/core/computation/ops.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
from __future__ import annotations
66

77
from datetime import datetime
8-
from distutils.version import LooseVersion
98
from functools import partial
109
import operator
1110
from typing import (
@@ -14,6 +13,7 @@
1413
)
1514

1615
import numpy as np
16+
from packaging.version import Version
1717

1818
from pandas._libs.tslibs import Timestamp
1919

@@ -623,7 +623,7 @@ def __init__(self, name: str):
623623

624624
if name not in MATHOPS or (
625625
NUMEXPR_INSTALLED
626-
and NUMEXPR_VERSION < LooseVersion("2.6.9")
626+
and Version(NUMEXPR_VERSION) < Version("2.6.9")
627627
and name in ("floor", "ceil")
628628
):
629629
raise ValueError(f'"{name}" is not a supported function')

pandas/core/util/numba_.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
"""Common utilities for Numba operations"""
2-
from distutils.version import LooseVersion
32
import types
43
from typing import (
54
Callable,
@@ -9,6 +8,7 @@
98
)
109

1110
import numpy as np
11+
from packaging.version import Version
1212

1313
from pandas.compat._optional import import_optional_dependency
1414
from pandas.errors import NumbaUtilError
@@ -89,7 +89,7 @@ def jit_user_function(
8989
"""
9090
numba = import_optional_dependency("numba")
9191

92-
if LooseVersion(numba.__version__) >= LooseVersion("0.49.0"):
92+
if Version(numba.__version__) >= Version("0.49.0"):
9393
is_jitted = numba.extending.is_jitted(func)
9494
else:
9595
is_jitted = isinstance(func, numba.targets.registry.CPUDispatcher)

pandas/io/clipboard/__init__.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -51,9 +51,9 @@
5151
get_errno,
5252
sizeof,
5353
)
54-
import distutils.spawn
5554
import os
5655
import platform
56+
from shutil import which
5757
import subprocess
5858
import time
5959
import warnings
@@ -528,7 +528,7 @@ def determine_clipboard():
528528
return init_windows_clipboard()
529529

530530
if platform.system() == "Linux":
531-
if distutils.spawn.find_executable("wslconfig.exe"):
531+
if which("wslconfig.exe"):
532532
return init_wsl_clipboard()
533533

534534
# Setup for the MAC OS X platform:

pandas/io/excel/_base.py

+3-2
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
import abc
44
import datetime
5-
from distutils.version import LooseVersion
65
import inspect
76
from io import BytesIO
87
import os
@@ -15,6 +14,8 @@
1514
import warnings
1615
import zipfile
1716

17+
from packaging.version import Version
18+
1819
from pandas._config import config
1920

2021
from pandas._libs.parsers import STR_NA_VALUES
@@ -1147,7 +1148,7 @@ def __init__(
11471148
else:
11481149
import xlrd
11491150

1150-
xlrd_version = LooseVersion(get_version(xlrd))
1151+
xlrd_version = Version(get_version(xlrd))
11511152

11521153
ext = None
11531154
if engine is None:

pandas/io/parquet.py

+3-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
""" parquet compat """
22
from __future__ import annotations
33

4-
from distutils.version import LooseVersion
54
import io
65
import os
76
from typing import (
@@ -10,6 +9,8 @@
109
)
1110
from warnings import catch_warnings
1211

12+
from packaging.version import Version
13+
1314
from pandas._typing import (
1415
FilePathOrBuffer,
1516
StorageOptions,
@@ -210,7 +211,7 @@ def read(
210211

211212
to_pandas_kwargs = {}
212213
if use_nullable_dtypes:
213-
if LooseVersion(self.api.__version__) >= "0.16":
214+
if Version(self.api.__version__) >= Version("0.16"):
214215
import pandas as pd
215216

216217
mapping = {

pandas/io/sql.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111
datetime,
1212
time,
1313
)
14-
from distutils.version import LooseVersion
1514
from functools import partial
1615
import re
1716
from typing import (
@@ -24,6 +23,7 @@
2423
import warnings
2524

2625
import numpy as np
26+
from packaging.version import Version
2727

2828
import pandas._libs.lib as lib
2929
from pandas._typing import DtypeArg
@@ -83,7 +83,7 @@ def _gt14() -> bool:
8383
"""
8484
import sqlalchemy
8585

86-
return LooseVersion(sqlalchemy.__version__) >= LooseVersion("1.4.0")
86+
return Version(sqlalchemy.__version__) >= Version("1.4.0")
8787

8888

8989
def _convert_params(sql, params):

pandas/plotting/_matplotlib/compat.py

+3-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
# being a bit too dynamic
2-
from distutils.version import LooseVersion
32
import operator
43

4+
from packaging.version import Version
5+
56

67
def _mpl_version(version, op):
78
def inner():
@@ -10,7 +11,7 @@ def inner():
1011
except ImportError:
1112
return False
1213
return (
13-
op(LooseVersion(mpl.__version__), LooseVersion(version))
14+
op(Version(mpl.__version__), Version(version))
1415
and str(mpl.__version__)[0] != "0"
1516
)
1617

pandas/tests/computation/test_compat.py

+2-3
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
from distutils.version import LooseVersion
2-
1+
from packaging.version import Version
32
import pytest
43

54
from pandas.compat._optional import VERSIONS
@@ -18,7 +17,7 @@ def test_compat():
1817
import numexpr as ne
1918

2019
ver = ne.__version__
21-
if LooseVersion(ver) < LooseVersion(VERSIONS["numexpr"]):
20+
if Version(ver) < Version(VERSIONS["numexpr"]):
2221
assert not NUMEXPR_INSTALLED
2322
else:
2423
assert NUMEXPR_INSTALLED

pandas/tests/computation/test_eval.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
from distutils.version import LooseVersion
21
from functools import reduce
32
from itertools import product
43
import operator
@@ -10,6 +9,7 @@
109
import warnings
1110

1211
import numpy as np
12+
from packaging.version import Version
1313
import pytest
1414

1515
from pandas.errors import PerformanceWarning
@@ -78,14 +78,14 @@ def parser(request):
7878

7979
@pytest.fixture
8080
def ne_lt_2_6_9():
81-
if NUMEXPR_INSTALLED and NUMEXPR_VERSION >= LooseVersion("2.6.9"):
81+
if NUMEXPR_INSTALLED and NUMEXPR_VERSION >= Version("2.6.9"):
8282
pytest.skip("numexpr is >= 2.6.9")
8383
return "numexpr"
8484

8585

8686
def _get_unary_fns_for_ne():
8787
if NUMEXPR_INSTALLED:
88-
if NUMEXPR_VERSION >= LooseVersion("2.6.9"):
88+
if NUMEXPR_VERSION >= Version("2.6.9"):
8989
return list(_unary_math_ops)
9090
else:
9191
return [x for x in _unary_math_ops if x not in ["floor", "ceil"]]

pandas/tests/io/excel/__init__.py

+2-3
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
from distutils.version import LooseVersion
2-
1+
from packaging.version import Version
32
import pytest
43

54
from pandas.compat._optional import (
@@ -32,4 +31,4 @@
3231
else:
3332
import xlrd
3433

35-
xlrd_version = LooseVersion(get_version(xlrd))
34+
xlrd_version = Version(get_version(xlrd))

pandas/tests/io/generate_legacy_storage_files.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -33,13 +33,13 @@
3333
"""
3434

3535
from datetime import timedelta
36-
from distutils.version import LooseVersion
3736
import os
3837
import pickle
3938
import platform as pl
4039
import sys
4140

4241
import numpy as np
42+
from packaging.version import Version
4343

4444
import pandas
4545
from pandas import (
@@ -88,7 +88,7 @@
8888
from pandas.core.sparse.api import SparseArray
8989

9090

91-
_loose_version = LooseVersion(pandas.__version__)
91+
_loose_version = Version(pandas.__version__)
9292

9393

9494
def _create_sp_series():
@@ -155,7 +155,7 @@ def create_data():
155155

156156
index["range"] = RangeIndex(10)
157157

158-
if _loose_version >= LooseVersion("0.21"):
158+
if _loose_version >= Version("0.21"):
159159
from pandas import interval_range
160160

161161
index["interval"] = interval_range(0, periods=10)

pandas/tests/io/pytables/test_select.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
from distutils.version import LooseVersion
21
from warnings import catch_warnings
32

43
import numpy as np
4+
from packaging.version import Version
55
import pytest
66

77
from pandas._libs.tslibs import Timestamp
@@ -862,7 +862,7 @@ def test_select_as_multiple(setup_path):
862862

863863

864864
@pytest.mark.skipif(
865-
LooseVersion(tables.__version__) < LooseVersion("3.1.0"),
865+
Version(tables.__version__) < Version("3.1.0"),
866866
reason=("tables version does not support fix for nan selection bug: GH 4858"),
867867
)
868868
def test_nan_selection_bug_4858(setup_path):

0 commit comments

Comments
 (0)