Avoid failing when a dependency is too old
authorDebian Science Team <debian-science-maintainers@lists.alioth.debian.org>
Sun, 2 Feb 2025 11:17:13 +0000 (11:17 +0000)
committerPeter Michael Green <plugwash@raspbian.org>
Sun, 2 Feb 2025 11:17:13 +0000 (11:17 +0000)
(some of them are pulled in by other dependencies, so
just not including them in d/control doesn't stop them being installed)

Most of the content of this patch was generated by the following Python code:

import pathlib
import re

basedir = pathlib.Path.cwd()
if not (basedir / 'pandas/tests').exists():
    raise FileNotFoundError('must be run from the pandas root')
for source_file in basedir.glob('pandas/**/*.py'):
    with open(source_file, 'r') as fd:
        source_text = fd.read()
    if 'pytest.importorskip' in source_text:
        source_text = re.sub(r'pytest\.importorskip(.*)minversion', r'td.versioned_importorskip\1min_version', source_text)
        source_text = re.sub(r'pytest\.importorskip', r'td.versioned_importorskip', source_text)
        if '_test_decorators as td' not in source_text:
            # add the import if it isn't already present
            source_text, count = re.subn(r'^(import pandas|from pandas.*import)',r'import pandas.util._test_decorators as td\n\1', source_text, count=1, flags=re.MULTILINE)
            if count != 1:
                raise KeyError("failed to add import")
        with open(source_file, 'w') as fd:
            fd.write(source_text)

Author: Rebecca N. Palmer <rebecca_palmer@zoho.com>
Forwarded: no

Gbp-Pq: Name versioned_importorskip.patch

159 files changed:
pandas/_testing/_io.py
pandas/conftest.py
pandas/tests/apply/test_frame_apply.py
pandas/tests/apply/test_numba.py
pandas/tests/arrays/categorical/test_warnings.py
pandas/tests/arrays/datetimes/test_constructors.py
pandas/tests/arrays/interval/test_interval_pyarrow.py
pandas/tests/arrays/masked/test_arrow_compat.py
pandas/tests/arrays/period/test_arrow_compat.py
pandas/tests/arrays/sparse/test_accessor.py
pandas/tests/arrays/sparse/test_constructors.py
pandas/tests/arrays/string_/test_string.py
pandas/tests/arrays/string_/test_string_arrow.py
pandas/tests/computation/test_compat.py
pandas/tests/copy_view/test_astype.py
pandas/tests/dtypes/test_common.py
pandas/tests/dtypes/test_inference.py
pandas/tests/extension/test_arrow.py
pandas/tests/extension/test_string.py
pandas/tests/frame/indexing/test_indexing.py
pandas/tests/frame/indexing/test_setitem.py
pandas/tests/frame/methods/test_astype.py
pandas/tests/frame/methods/test_convert_dtypes.py
pandas/tests/frame/methods/test_cov_corr.py
pandas/tests/frame/methods/test_describe.py
pandas/tests/frame/methods/test_dot.py
pandas/tests/frame/methods/test_info.py
pandas/tests/frame/methods/test_interpolate.py
pandas/tests/frame/methods/test_join.py
pandas/tests/frame/methods/test_rank.py
pandas/tests/frame/test_api.py
pandas/tests/frame/test_arrow_interface.py
pandas/tests/frame/test_constructors.py
pandas/tests/frame/test_query_eval.py
pandas/tests/frame/test_reductions.py
pandas/tests/frame/test_repr.py
pandas/tests/frame/test_subclass.py
pandas/tests/frame/test_ufunc.py
pandas/tests/generic/test_finalize.py
pandas/tests/generic/test_to_xarray.py
pandas/tests/groupby/aggregate/test_numba.py
pandas/tests/groupby/test_counting.py
pandas/tests/groupby/test_groupby.py
pandas/tests/groupby/test_numba.py
pandas/tests/groupby/test_reductions.py
pandas/tests/groupby/test_timegrouper.py
pandas/tests/groupby/transform/test_numba.py
pandas/tests/indexes/base_class/test_constructors.py
pandas/tests/indexes/base_class/test_reshape.py
pandas/tests/indexes/multi/test_constructors.py
pandas/tests/indexes/numeric/test_indexing.py
pandas/tests/indexes/test_base.py
pandas/tests/indexing/test_datetime.py
pandas/tests/indexing/test_loc.py
pandas/tests/interchange/test_impl.py
pandas/tests/interchange/test_utils.py
pandas/tests/io/conftest.py
pandas/tests/io/excel/test_odf.py
pandas/tests/io/excel/test_odswriter.py
pandas/tests/io/excel/test_openpyxl.py
pandas/tests/io/excel/test_readers.py
pandas/tests/io/excel/test_style.py
pandas/tests/io/excel/test_xlrd.py
pandas/tests/io/excel/test_xlsxwriter.py
pandas/tests/io/formats/style/test_bar.py
pandas/tests/io/formats/style/test_exceptions.py
pandas/tests/io/formats/style/test_format.py
pandas/tests/io/formats/style/test_highlight.py
pandas/tests/io/formats/style/test_html.py
pandas/tests/io/formats/style/test_matplotlib.py
pandas/tests/io/formats/style/test_non_unique.py
pandas/tests/io/formats/style/test_style.py
pandas/tests/io/formats/style/test_to_latex.py
pandas/tests/io/formats/style/test_to_string.py
pandas/tests/io/formats/style/test_tooltip.py
pandas/tests/io/formats/test_format.py
pandas/tests/io/formats/test_to_excel.py
pandas/tests/io/formats/test_to_latex.py
pandas/tests/io/formats/test_to_markdown.py
pandas/tests/io/formats/test_to_string.py
pandas/tests/io/json/test_pandas.py
pandas/tests/io/json/test_readlines.py
pandas/tests/io/parser/conftest.py
pandas/tests/io/parser/dtypes/test_dtypes_basic.py
pandas/tests/io/parser/test_concatenate_chunks.py
pandas/tests/io/parser/test_network.py
pandas/tests/io/parser/test_python_parser_only.py
pandas/tests/io/parser/test_read_fwf.py
pandas/tests/io/parser/test_upcast.py
pandas/tests/io/pytables/common.py
pandas/tests/io/pytables/test_append.py
pandas/tests/io/pytables/test_compat.py
pandas/tests/io/pytables/test_read.py
pandas/tests/io/pytables/test_round_trip.py
pandas/tests/io/pytables/test_store.py
pandas/tests/io/pytables/test_subclass.py
pandas/tests/io/test_clipboard.py
pandas/tests/io/test_common.py
pandas/tests/io/test_feather.py
pandas/tests/io/test_fsspec.py
pandas/tests/io/test_gcs.py
pandas/tests/io/test_html.py
pandas/tests/io/test_http_headers.py
pandas/tests/io/test_orc.py
pandas/tests/io/test_parquet.py
pandas/tests/io/test_pickle.py
pandas/tests/io/test_s3.py
pandas/tests/io/test_spss.py
pandas/tests/io/test_sql.py
pandas/tests/io/test_stata.py
pandas/tests/io/xml/test_to_xml.py
pandas/tests/io/xml/test_xml.py
pandas/tests/plotting/conftest.py
pandas/tests/plotting/frame/test_frame.py
pandas/tests/plotting/frame/test_frame_color.py
pandas/tests/plotting/frame/test_frame_groupby.py
pandas/tests/plotting/frame/test_frame_legend.py
pandas/tests/plotting/frame/test_frame_subplots.py
pandas/tests/plotting/frame/test_hist_box_by.py
pandas/tests/plotting/test_boxplot_method.py
pandas/tests/plotting/test_common.py
pandas/tests/plotting/test_converter.py
pandas/tests/plotting/test_datetimelike.py
pandas/tests/plotting/test_groupby.py
pandas/tests/plotting/test_hist_method.py
pandas/tests/plotting/test_misc.py
pandas/tests/plotting/test_series.py
pandas/tests/plotting/test_style.py
pandas/tests/reductions/test_reductions.py
pandas/tests/reductions/test_stat_reductions.py
pandas/tests/resample/test_datetime_index.py
pandas/tests/reshape/merge/test_merge.py
pandas/tests/reshape/test_melt.py
pandas/tests/series/accessors/test_list_accessor.py
pandas/tests/series/accessors/test_struct_accessor.py
pandas/tests/series/methods/test_convert_dtypes.py
pandas/tests/series/methods/test_cov_corr.py
pandas/tests/series/methods/test_drop_duplicates.py
pandas/tests/series/methods/test_explode.py
pandas/tests/series/methods/test_interpolate.py
pandas/tests/series/methods/test_rank.py
pandas/tests/series/methods/test_reset_index.py
pandas/tests/series/test_api.py
pandas/tests/series/test_constructors.py
pandas/tests/series/test_formats.py
pandas/tests/series/test_logical_ops.py
pandas/tests/series/test_reductions.py
pandas/tests/strings/test_extract.py
pandas/tests/test_algos.py
pandas/tests/test_downstream.py
pandas/tests/test_nanops.py
pandas/tests/test_optional_dependency.py
pandas/tests/tools/test_to_datetime.py
pandas/tests/tools/test_to_numeric.py
pandas/tests/tools/test_to_timedelta.py
pandas/tests/window/test_online.py
pandas/tests/window/test_rolling_skew_kurt.py
pandas/tests/window/test_win_type.py
pandas/util/_test_decorators.py

index 95977edb600ade42a8f8a1fada2b5085cee1da56..ca5750b2cf6be2590dd0367e5c6c00927f7b59cb 100644 (file)
@@ -107,9 +107,9 @@ def round_trip_localpath(writer, reader, path: str | None = None):
     pandas object
         The original object that was serialized and then re-read.
     """
-    import pytest
+    import pandas.util._test_decorators as td
 
-    LocalPath = pytest.importorskip("py.path").local
+    LocalPath = td.versioned_importorskip("py.path").local
     if path is None:
         path = "___localpath___"
     with ensure_clean(path) as path:
index 91e07f853add0617bdc22e1cbf28345a19fd7150..a08c8721cba37a852f751b98e14d78368e363656 100644 (file)
@@ -1816,7 +1816,7 @@ def ip():
 
     Will raise a skip if IPython is not installed.
     """
-    pytest.importorskip("IPython", minversion="6.0.0")
+    td.versioned_importorskip("IPython", min_version="6.0.0")
     from IPython.core.interactiveshell import InteractiveShell
 
     # GH#35711 make sure sqlite history file handle is not leaked
@@ -1833,7 +1833,7 @@ def spmatrix(request):
     """
     Yields scipy sparse matrix classes.
     """
-    sparse = pytest.importorskip("scipy.sparse")
+    sparse = td.versioned_importorskip("scipy.sparse")
 
     return getattr(sparse, request.param + "_matrix")
 
index b7eac6b8f0ea11cfdaaf760101eb407901c90319..166bb64119b5f0ccf84b48e4649e007e9da72255 100644 (file)
@@ -4,6 +4,7 @@ import warnings
 import numpy as np
 import pytest
 
+import pandas.util._test_decorators as td
 from pandas.core.dtypes.dtypes import CategoricalDtype
 
 import pandas as pd
@@ -35,7 +36,7 @@ def int_frame_const_col():
 @pytest.fixture(params=["python", pytest.param("numba", marks=pytest.mark.single_cpu)])
 def engine(request):
     if request.param == "numba":
-        pytest.importorskip("numba")
+        td.versioned_importorskip("numba")
     return request.param
 
 
index 57b81711ddb48a7390d33b4624f9956fbcd473a8..f6abf903d88dac4caa02f87eebb018d3609b254f 100644 (file)
@@ -26,7 +26,7 @@ def test_numba_vs_python_noop(float_frame, apply_axis):
 
 def test_numba_vs_python_string_index():
     # GH#56189
-    pytest.importorskip("pyarrow")
+    td.versioned_importorskip("pyarrow")
     df = DataFrame(
         1,
         index=Index(["a", "b"], dtype="string[pyarrow_numpy]"),
index 68c59706a6c3bf93908108c337b51c8da187cbb4..2cfef3fc40e0cc239f1754a9829122b8ea279c34 100644 (file)
@@ -1,12 +1,13 @@
 import pytest
 
+import pandas.util._test_decorators as td
 import pandas._testing as tm
 
 
 class TestCategoricalWarnings:
     def test_tab_complete_warning(self, ip):
         # https://github.com/pandas-dev/pandas/issues/16409
-        pytest.importorskip("IPython", minversion="6.0.0")
+        td.versioned_importorskip("IPython", min_version="6.0.0")
         from IPython.core.completer import provisionalcompleter
 
         code = "import pandas as pd; c = pd.Categorical([])"
index 3652b5fec46bbe7a519dd2c3a196ac87bd74784f..1431dc25bfcc1ed6bd8c7518d303ea6a077ca677 100644 (file)
@@ -1,6 +1,7 @@
 import numpy as np
 import pytest
 
+import pandas.util._test_decorators as td
 from pandas._libs import iNaT
 
 from pandas.core.dtypes.dtypes import DatetimeTZDtype
@@ -226,7 +227,7 @@ COARSE_TO_FINE_SAFE = [123, None, -123]
 def test_from_arrow_with_different_units_and_timezones_with(
     pa_unit, pd_unit, pa_tz, pd_tz, data
 ):
-    pa = pytest.importorskip("pyarrow")
+    pa = td.versioned_importorskip("pyarrow")
 
     pa_type = pa.timestamp(pa_unit, tz=pa_tz)
     arr = pa.array(data, type=pa_type)
@@ -253,7 +254,7 @@ def test_from_arrow_with_different_units_and_timezones_with(
     ],
 )
 def test_from_arrow_from_empty(unit, tz):
-    pa = pytest.importorskip("pyarrow")
+    pa = td.versioned_importorskip("pyarrow")
 
     data = []
     arr = pa.array(data)
@@ -269,7 +270,7 @@ def test_from_arrow_from_empty(unit, tz):
 
 
 def test_from_arrow_from_integers():
-    pa = pytest.importorskip("pyarrow")
+    pa = td.versioned_importorskip("pyarrow")
 
     data = [0, 123456789, None, 2**63 - 1, iNaT, -123456789]
     arr = pa.array(data)
index ef8701be81e2b9248c29fc4e901161fd18d72bbe..455b026227f60a80f1e3712f660b429720bbe23f 100644 (file)
@@ -1,13 +1,14 @@
 import numpy as np
 import pytest
 
+import pandas.util._test_decorators as td
 import pandas as pd
 import pandas._testing as tm
 from pandas.core.arrays import IntervalArray
 
 
 def test_arrow_extension_type():
-    pa = pytest.importorskip("pyarrow")
+    pa = td.versioned_importorskip("pyarrow")
 
     from pandas.core.arrays.arrow.extension_types import ArrowIntervalType
 
@@ -23,7 +24,7 @@ def test_arrow_extension_type():
 
 
 def test_arrow_array():
-    pa = pytest.importorskip("pyarrow")
+    pa = td.versioned_importorskip("pyarrow")
 
     from pandas.core.arrays.arrow.extension_types import ArrowIntervalType
 
@@ -52,7 +53,7 @@ def test_arrow_array():
 
 
 def test_arrow_array_missing():
-    pa = pytest.importorskip("pyarrow")
+    pa = td.versioned_importorskip("pyarrow")
 
     from pandas.core.arrays.arrow.extension_types import ArrowIntervalType
 
@@ -89,7 +90,7 @@ def test_arrow_array_missing():
     ids=["float", "datetime64[ns]"],
 )
 def test_arrow_table_roundtrip(breaks):
-    pa = pytest.importorskip("pyarrow")
+    pa = td.versioned_importorskip("pyarrow")
 
     from pandas.core.arrays.arrow.extension_types import ArrowIntervalType
 
@@ -125,7 +126,7 @@ def test_arrow_table_roundtrip(breaks):
     ids=["float", "datetime64[ns]"],
 )
 def test_arrow_table_roundtrip_without_metadata(breaks):
-    pa = pytest.importorskip("pyarrow")
+    pa = td.versioned_importorskip("pyarrow")
 
     arr = IntervalArray.from_breaks(breaks)
     arr[1] = None
@@ -145,7 +146,7 @@ def test_from_arrow_from_raw_struct_array():
     # in case pyarrow lost the Interval extension type (eg on parquet roundtrip
     # with datetime64[ns] subtype, see GH-45881), still allow conversion
     # from arrow to IntervalArray
-    pa = pytest.importorskip("pyarrow")
+    pa = td.versioned_importorskip("pyarrow")
 
     arr = pa.array([{"left": 0, "right": 1}, {"left": 1, "right": 2}])
     dtype = pd.IntervalDtype(np.dtype("int64"), closed="neither")
index 7a89656bd5aa0bff079f58fb1acaa1f7742ed8e8..9d8137ff37ab40235ae65308a140deabe1c6d3ee 100644 (file)
@@ -1,6 +1,7 @@
 import numpy as np
 import pytest
 
+import pandas.util._test_decorators as td
 import pandas as pd
 import pandas._testing as tm
 
@@ -8,7 +9,7 @@ pytestmark = pytest.mark.filterwarnings(
     "ignore:Passing a BlockManager to DataFrame:DeprecationWarning"
 )
 
-pa = pytest.importorskip("pyarrow")
+pa = td.versioned_importorskip("pyarrow")
 
 from pandas.core.arrays.arrow._arrow_utils import pyarrow_array_to_numpy_and_mask
 
index 431309aca0df21dbe885ae015b10c3c21f0134a2..11e5d3430ec466f04371796985186a0e57f33756 100644 (file)
@@ -1,5 +1,6 @@
 import pytest
 
+import pandas.util._test_decorators as td
 from pandas.compat.pyarrow import pa_version_under10p1
 
 from pandas.core.dtypes.dtypes import PeriodDtype
@@ -16,7 +17,7 @@ pytestmark = pytest.mark.filterwarnings(
 )
 
 
-pa = pytest.importorskip("pyarrow")
+pa = td.versioned_importorskip("pyarrow")
 
 
 def test_arrow_extension_type():
index 87eb7bcfa9cee3e92386ad0f148b896c0e682b07..8f9034af9b46166b79cf9d128fc2050ceeb02ccc 100644 (file)
@@ -3,6 +3,7 @@ import string
 import numpy as np
 import pytest
 
+import pandas.util._test_decorators as td
 import pandas as pd
 from pandas import SparseDtype
 import pandas._testing as tm
@@ -26,7 +27,7 @@ class TestSeriesAccessor:
         assert result == expected
 
     def test_from_coo(self):
-        scipy_sparse = pytest.importorskip("scipy.sparse")
+        scipy_sparse = td.versioned_importorskip("scipy.sparse")
 
         row = [0, 3, 1, 0]
         col = [0, 3, 1, 2]
@@ -64,7 +65,7 @@ class TestSeriesAccessor:
     def test_to_coo(
         self, sort_labels, expected_rows, expected_cols, expected_values_pos
     ):
-        sp_sparse = pytest.importorskip("scipy.sparse")
+        sp_sparse = td.versioned_importorskip("scipy.sparse")
 
         values = SparseArray([0, np.nan, 1, 0, None, 3], fill_value=0)
         index = pd.MultiIndex.from_tuples(
@@ -107,7 +108,7 @@ class TestFrameAccessor:
     @pytest.mark.parametrize("labels", [None, list(string.ascii_letters[:10])])
     @pytest.mark.parametrize("dtype", ["float64", "int64"])
     def test_from_spmatrix(self, format, labels, dtype):
-        sp_sparse = pytest.importorskip("scipy.sparse")
+        sp_sparse = td.versioned_importorskip("scipy.sparse")
 
         sp_dtype = SparseDtype(dtype, np.array(0, dtype=dtype).item())
 
@@ -120,7 +121,7 @@ class TestFrameAccessor:
 
     @pytest.mark.parametrize("format", ["csc", "csr", "coo"])
     def test_from_spmatrix_including_explicit_zero(self, format):
-        sp_sparse = pytest.importorskip("scipy.sparse")
+        sp_sparse = td.versioned_importorskip("scipy.sparse")
 
         mat = sp_sparse.random(10, 2, density=0.5, format=format)
         mat.data[0] = 0
@@ -134,7 +135,7 @@ class TestFrameAccessor:
         [["a", "b"], pd.MultiIndex.from_product([["A"], ["a", "b"]]), ["a", "a"]],
     )
     def test_from_spmatrix_columns(self, columns):
-        sp_sparse = pytest.importorskip("scipy.sparse")
+        sp_sparse = td.versioned_importorskip("scipy.sparse")
 
         dtype = SparseDtype("float64", 0.0)
 
@@ -147,7 +148,7 @@ class TestFrameAccessor:
         "colnames", [("A", "B"), (1, 2), (1, pd.NA), (0.1, 0.2), ("x", "x"), (0, 0)]
     )
     def test_to_coo(self, colnames):
-        sp_sparse = pytest.importorskip("scipy.sparse")
+        sp_sparse = td.versioned_importorskip("scipy.sparse")
 
         df = pd.DataFrame(
             {colnames[0]: [0, 1, 0], colnames[1]: [1, 0, 0]}, dtype="Sparse[int64, 0]"
@@ -158,7 +159,7 @@ class TestFrameAccessor:
 
     @pytest.mark.parametrize("fill_value", [1, np.nan])
     def test_to_coo_nonzero_fill_val_raises(self, fill_value):
-        pytest.importorskip("scipy")
+        td.versioned_importorskip("scipy")
         df = pd.DataFrame(
             {
                 "A": SparseArray(
@@ -174,7 +175,7 @@ class TestFrameAccessor:
 
     def test_to_coo_midx_categorical(self):
         # GH#50996
-        sp_sparse = pytest.importorskip("scipy.sparse")
+        sp_sparse = td.versioned_importorskip("scipy.sparse")
 
         midx = pd.MultiIndex.from_arrays(
             [
@@ -219,7 +220,7 @@ class TestFrameAccessor:
     @pytest.mark.parametrize("dtype", ["int64", "float64"])
     @pytest.mark.parametrize("dense_index", [True, False])
     def test_series_from_coo(self, dtype, dense_index):
-        sp_sparse = pytest.importorskip("scipy.sparse")
+        sp_sparse = td.versioned_importorskip("scipy.sparse")
 
         A = sp_sparse.eye(3, format="coo", dtype=dtype)
         result = pd.Series.sparse.from_coo(A, dense_index=dense_index)
@@ -239,7 +240,7 @@ class TestFrameAccessor:
 
     def test_series_from_coo_incorrect_format_raises(self):
         # gh-26554
-        sp_sparse = pytest.importorskip("scipy.sparse")
+        sp_sparse = td.versioned_importorskip("scipy.sparse")
 
         m = sp_sparse.csr_matrix(np.array([[0, 1], [0, 0]]))
         with pytest.raises(
index 2831c8abdaf137b6454ea8f73bff7e94a3ec1b2b..e66a041e58fe1b6849fdc9f8518f7147ec6c7c42 100644 (file)
@@ -1,6 +1,7 @@
 import numpy as np
 import pytest
 
+import pandas.util._test_decorators as td
 from pandas._libs.sparse import IntIndex
 
 import pandas as pd
@@ -188,7 +189,7 @@ class TestConstructors:
     @pytest.mark.parametrize("format", ["coo", "csc", "csr"])
     @pytest.mark.parametrize("size", [0, 10])
     def test_from_spmatrix(self, size, format):
-        sp_sparse = pytest.importorskip("scipy.sparse")
+        sp_sparse = td.versioned_importorskip("scipy.sparse")
 
         mat = sp_sparse.random(size, 1, density=0.5, format=format)
         result = SparseArray.from_spmatrix(mat)
@@ -199,7 +200,7 @@ class TestConstructors:
 
     @pytest.mark.parametrize("format", ["coo", "csc", "csr"])
     def test_from_spmatrix_including_explicit_zero(self, format):
-        sp_sparse = pytest.importorskip("scipy.sparse")
+        sp_sparse = td.versioned_importorskip("scipy.sparse")
 
         mat = sp_sparse.random(10, 1, density=0.5, format=format)
         mat.data[0] = 0
@@ -210,7 +211,7 @@ class TestConstructors:
         tm.assert_numpy_array_equal(result, expected)
 
     def test_from_spmatrix_raises(self):
-        sp_sparse = pytest.importorskip("scipy.sparse")
+        sp_sparse = td.versioned_importorskip("scipy.sparse")
 
         mat = sp_sparse.eye(5, 4, format="csc")
 
index 320bdca60a9327bee90ffde5483e735829aaa2c8..1c1328092fca626fdeea3a62adbf2389b5082748 100644 (file)
@@ -7,6 +7,7 @@ import operator
 import numpy as np
 import pytest
 
+import pandas.util._test_decorators as td
 from pandas.compat.pyarrow import pa_version_under12p0
 
 from pandas.core.dtypes.common import is_dtype_equal
@@ -486,7 +487,7 @@ def test_fillna_args(dtype, arrow_string_storage):
 
 def test_arrow_array(dtype):
     # protocol added in 0.15.0
-    pa = pytest.importorskip("pyarrow")
+    pa = td.versioned_importorskip("pyarrow")
     import pyarrow.compute as pc
 
     data = pd.array(["a", "b", "c"], dtype=dtype)
@@ -502,7 +503,7 @@ def test_arrow_array(dtype):
 @pytest.mark.filterwarnings("ignore:Passing a BlockManager:DeprecationWarning")
 def test_arrow_roundtrip(dtype, string_storage2, request, using_infer_string):
     # roundtrip possible from arrow 1.0.0
-    pa = pytest.importorskip("pyarrow")
+    pa = td.versioned_importorskip("pyarrow")
 
     if using_infer_string and string_storage2 != "pyarrow_numpy":
         request.applymarker(
@@ -532,7 +533,7 @@ def test_arrow_load_from_zero_chunks(
     dtype, string_storage2, request, using_infer_string
 ):
     # GH-41040
-    pa = pytest.importorskip("pyarrow")
+    pa = td.versioned_importorskip("pyarrow")
 
     if using_infer_string and string_storage2 != "pyarrow_numpy":
         request.applymarker(
index d7811b6fed8838cb792cc6faf2354d2b4237d4de..89ca9738e7d5e0282bae7332592c70192a594e0e 100644 (file)
@@ -19,7 +19,7 @@ from pandas.core.arrays.string_arrow import (
 
 
 def test_eq_all_na():
-    pytest.importorskip("pyarrow")
+    td.versioned_importorskip("pyarrow")
     a = pd.array([pd.NA, pd.NA], dtype=StringDtype("pyarrow"))
     result = a == a
     expected = pd.array([pd.NA, pd.NA], dtype="boolean[pyarrow]")
@@ -48,7 +48,7 @@ def test_config_bad_storage_raises():
 @pytest.mark.parametrize("chunked", [True, False])
 @pytest.mark.parametrize("array", ["numpy", "pyarrow"])
 def test_constructor_not_string_type_raises(array, chunked, arrow_string_storage):
-    pa = pytest.importorskip("pyarrow")
+    pa = td.versioned_importorskip("pyarrow")
 
     array = pa if array in arrow_string_storage else np
 
@@ -69,7 +69,7 @@ def test_constructor_not_string_type_raises(array, chunked, arrow_string_storage
 
 @pytest.mark.parametrize("chunked", [True, False])
 def test_constructor_not_string_type_value_dictionary_raises(chunked):
-    pa = pytest.importorskip("pyarrow")
+    pa = td.versioned_importorskip("pyarrow")
 
     arr = pa.array([1, 2, 3], pa.dictionary(pa.int32(), pa.int32()))
     if chunked:
@@ -87,7 +87,7 @@ def test_constructor_not_string_type_value_dictionary_raises(chunked):
 )
 @pytest.mark.parametrize("chunked", [True, False])
 def test_constructor_valid_string_type_value_dictionary(chunked):
-    pa = pytest.importorskip("pyarrow")
+    pa = td.versioned_importorskip("pyarrow")
 
     arr = pa.array(["1", "2", "3"], pa.large_string()).dictionary_encode()
     if chunked:
@@ -99,14 +99,14 @@ def test_constructor_valid_string_type_value_dictionary(chunked):
 
 def test_constructor_from_list():
     # GH#27673
-    pytest.importorskip("pyarrow")
+    td.versioned_importorskip("pyarrow")
     result = pd.Series(["E"], dtype=StringDtype(storage="pyarrow"))
     assert isinstance(result.dtype, StringDtype)
     assert result.dtype.storage == "pyarrow"
 
 
 def test_from_sequence_wrong_dtype_raises(using_infer_string):
-    pytest.importorskip("pyarrow")
+    td.versioned_importorskip("pyarrow")
     with pd.option_context("string_storage", "python"):
         ArrowStringArray._from_sequence(["a", None, "c"], dtype="string")
 
@@ -199,7 +199,7 @@ def test_pyarrow_not_installed_raises():
     ],
 )
 def test_setitem(multiple_chunks, key, value, expected):
-    pa = pytest.importorskip("pyarrow")
+    pa = td.versioned_importorskip("pyarrow")
 
     result = pa.array(list("abcde"))
     expected = pa.array(expected)
@@ -216,7 +216,7 @@ def test_setitem(multiple_chunks, key, value, expected):
 
 
 def test_setitem_invalid_indexer_raises():
-    pa = pytest.importorskip("pyarrow")
+    pa = td.versioned_importorskip("pyarrow")
 
     arr = ArrowStringArray(pa.array(list("abcde")))
 
@@ -242,7 +242,7 @@ def test_setitem_invalid_indexer_raises():
 @pytest.mark.parametrize("dtype", ["string[pyarrow]", "string[pyarrow_numpy]"])
 def test_pickle_roundtrip(dtype):
     # GH 42600
-    pytest.importorskip("pyarrow")
+    td.versioned_importorskip("pyarrow")
     expected = pd.Series(range(10), dtype=dtype)
     expected_sliced = expected.head(2)
     full_pickled = pickle.dumps(expected)
@@ -259,7 +259,7 @@ def test_pickle_roundtrip(dtype):
 
 def test_string_dtype_error_message():
     # GH#55051
-    pytest.importorskip("pyarrow")
+    td.versioned_importorskip("pyarrow")
     msg = "Storage must be 'python', 'pyarrow' or 'pyarrow_numpy'."
     with pytest.raises(ValueError, match=msg):
         StringDtype("bla")
index 856a5b3a22a95d35cc577050f52d762b065e3ddf..c63cd8c9b7e5271a40c4d291d3d1ff41c8213e2d 100644 (file)
@@ -1,5 +1,6 @@
 import pytest
 
+import pandas.util._test_decorators as td
 from pandas.compat._optional import VERSIONS
 
 import pandas as pd
@@ -13,7 +14,7 @@ def test_compat():
 
     from pandas.core.computation.check import NUMEXPR_INSTALLED
 
-    ne = pytest.importorskip("numexpr")
+    ne = td.versioned_importorskip("numexpr")
 
     ver = ne.__version__
     if Version(ver) < Version(VERSIONS["numexpr"]):
@@ -26,7 +27,7 @@ def test_compat():
 @pytest.mark.parametrize("parser", expr.PARSERS)
 def test_invalid_numexpr_version(engine, parser):
     if engine == "numexpr":
-        pytest.importorskip("numexpr")
+        td.versioned_importorskip("numexpr")
     a, b = 1, 2  # noqa: F841
     res = pd.eval("a + b", engine=engine, parser=parser)
     assert res == 3
index d462ce3d3187daf1b414d45ffe8193500ac8487c..50093a728e8097df95697e118ec14080a88d2001 100644 (file)
@@ -45,7 +45,7 @@ def test_astype_single_dtype(using_copy_on_write):
 @pytest.mark.parametrize("new_dtype", ["int64", "Int64", "int64[pyarrow]"])
 def test_astype_avoids_copy(using_copy_on_write, dtype, new_dtype):
     if new_dtype == "int64[pyarrow]":
-        pytest.importorskip("pyarrow")
+        td.versioned_importorskip("pyarrow")
     df = DataFrame({"a": [1, 2, 3]}, dtype=dtype)
     df_orig = df.copy()
     df2 = df.astype(new_dtype)
@@ -70,7 +70,7 @@ def test_astype_avoids_copy(using_copy_on_write, dtype, new_dtype):
 @pytest.mark.parametrize("dtype", ["float64", "int32", "Int32", "int32[pyarrow]"])
 def test_astype_different_target_dtype(using_copy_on_write, dtype):
     if dtype == "int32[pyarrow]":
-        pytest.importorskip("pyarrow")
+        td.versioned_importorskip("pyarrow")
     df = DataFrame({"a": [1, 2, 3]})
     df_orig = df.copy()
     df2 = df.astype(dtype)
@@ -198,7 +198,7 @@ def test_astype_different_timezones_different_reso(using_copy_on_write):
 
 
 def test_astype_arrow_timestamp(using_copy_on_write):
-    pytest.importorskip("pyarrow")
+    td.versioned_importorskip("pyarrow")
     df = DataFrame(
         {
             "a": [
index c34c97b6e4f0483994f6c81f6a2c470f84e9c488..d0fcfb1949db782ddb4b3c6485903abd3ee81790 100644 (file)
@@ -214,7 +214,7 @@ def test_is_sparse(check_scipy):
 
 
 def test_is_scipy_sparse():
-    sp_sparse = pytest.importorskip("scipy.sparse")
+    sp_sparse = td.versioned_importorskip("scipy.sparse")
 
     assert com.is_scipy_sparse(sp_sparse.bsr_matrix([1, 2, 3]))
 
index 0567be737c681282d162225d10a0849e476a579a..2f3530c58dec1e2e171f170f391ab7c93711cb9d 100644 (file)
@@ -28,6 +28,7 @@ import numpy as np
 import pytest
 import pytz
 
+import pandas.util._test_decorators as td
 from pandas._libs import (
     lib,
     missing as libmissing,
@@ -1984,7 +1985,7 @@ def test_nan_to_nat_conversions():
 
 @pytest.mark.filterwarnings("ignore::PendingDeprecationWarning")
 def test_is_scipy_sparse(spmatrix):
-    pytest.importorskip("scipy")
+    td.versioned_importorskip("scipy")
     assert is_scipy_sparse(spmatrix([[0, 1]]))
     assert not is_scipy_sparse(np.array([1]))
 
index d9a3033b8380ef0217f23870c0ee5d918c069ff8..bec8352689cdefea88aaac428a039fd0fcb4580e 100644 (file)
@@ -62,7 +62,7 @@ from pandas.api.types import (
 )
 from pandas.tests.extension import base
 
-pa = pytest.importorskip("pyarrow")
+pa = td.versioned_importorskip("pyarrow")
 
 from pandas.core.arrays.arrow.array import ArrowExtensionArray
 from pandas.core.arrays.arrow.extension_types import ArrowPeriodType
index 2d5a134f8560a17b915486313730ea6c1be28b40..be356038e8f32e17257cd6be7adf0445d0a361e4 100644 (file)
@@ -21,6 +21,7 @@ from typing import cast
 import numpy as np
 import pytest
 
+import pandas.util._test_decorators as td
 import pandas as pd
 import pandas._testing as tm
 from pandas.api.types import is_string_dtype
@@ -35,7 +36,7 @@ def maybe_split_array(arr, chunked):
     elif arr.dtype.storage != "pyarrow":
         return arr
 
-    pa = pytest.importorskip("pyarrow")
+    pa = td.versioned_importorskip("pyarrow")
 
     arrow_array = arr._pa_array
     split = len(arrow_array) // 2
index 22d9c7f26a57ceb3876e2e30cef11017cb8b24b0..2e761a573d9cc3cc9615a5e49ea9d727373f1ffc 100644 (file)
@@ -1945,7 +1945,7 @@ def test_adding_new_conditional_column() -> None:
 )
 def test_adding_new_conditional_column_with_string(dtype, infer_string) -> None:
     # https://github.com/pandas-dev/pandas/issues/56204
-    pytest.importorskip("pyarrow")
+    td.versioned_importorskip("pyarrow")
 
     df = DataFrame({"a": [1, 2], "b": [3, 4]})
     with pd.option_context("future.infer_string", infer_string):
@@ -1958,7 +1958,7 @@ def test_adding_new_conditional_column_with_string(dtype, infer_string) -> None:
 
 def test_add_new_column_infer_string():
     # GH#55366
-    pytest.importorskip("pyarrow")
+    td.versioned_importorskip("pyarrow")
     df = DataFrame({"x": [1]})
     with pd.option_context("future.infer_string", True):
         df.loc[df["x"] == 1, "y"] = "1"
index a58dd701f0f22e520391f169e9e6d942570991df..9d441e8800c8b12f53b3ecfe6134258150e2ca6f 100644 (file)
@@ -760,7 +760,7 @@ class TestDataFrameSetItem:
 
     def test_setitem_string_option_object_index(self):
         # GH#55638
-        pytest.importorskip("pyarrow")
+        td.versioned_importorskip("pyarrow")
         df = DataFrame({"a": [1, 2]})
         with pd.option_context("future.infer_string", True):
             df["b"] = Index(["a", "b"], dtype=object)
index 5a1e3cd786f84f3ddd60acbb4a10b214b602658e..4c67c5b85f22bf615760e43fd7026e8fe26fb791 100644 (file)
@@ -893,7 +893,7 @@ def test_frame_astype_no_copy():
 @pytest.mark.parametrize("dtype", ["int64", "Int64"])
 def test_astype_copies(dtype):
     # GH#50984
-    pytest.importorskip("pyarrow")
+    td.versioned_importorskip("pyarrow")
     df = DataFrame({"a": [1, 2, 3]}, dtype=dtype)
     result = df.astype("int64[pyarrow]", copy=True)
     df.iloc[0, 0] = 100
index 521d2cb14ac6adf0d127e817833ef6620d6cb5e8..d822f5994d068175b93c79906e57395888f181bd 100644 (file)
@@ -3,6 +3,7 @@ import datetime
 import numpy as np
 import pytest
 
+import pandas.util._test_decorators as td
 import pandas as pd
 import pandas._testing as tm
 
@@ -49,7 +50,7 @@ class TestConvertDtypes:
         assert result.columns.name == "cols"
 
     def test_pyarrow_dtype_backend(self):
-        pa = pytest.importorskip("pyarrow")
+        pa = td.versioned_importorskip("pyarrow")
         df = pd.DataFrame(
             {
                 "a": pd.Series([1, 2, 3], dtype=np.dtype("int32")),
@@ -105,13 +106,13 @@ class TestConvertDtypes:
         tm.assert_frame_equal(result, expected)
 
     def test_pyarrow_dtype_backend_already_pyarrow(self):
-        pytest.importorskip("pyarrow")
+        td.versioned_importorskip("pyarrow")
         expected = pd.DataFrame([1, 2, 3], dtype="int64[pyarrow]")
         result = expected.convert_dtypes(dtype_backend="pyarrow")
         tm.assert_frame_equal(result, expected)
 
     def test_pyarrow_dtype_backend_from_pandas_nullable(self):
-        pa = pytest.importorskip("pyarrow")
+        pa = td.versioned_importorskip("pyarrow")
         df = pd.DataFrame(
             {
                 "a": pd.Series([1, 2, None], dtype="Int32"),
@@ -135,7 +136,7 @@ class TestConvertDtypes:
 
     def test_pyarrow_dtype_empty_object(self):
         # GH 50970
-        pytest.importorskip("pyarrow")
+        td.versioned_importorskip("pyarrow")
         expected = pd.DataFrame(columns=[0])
         result = expected.convert_dtypes(dtype_backend="pyarrow")
         tm.assert_frame_equal(result, expected)
@@ -152,7 +153,7 @@ class TestConvertDtypes:
 
     def test_pyarrow_backend_no_conversion(self):
         # GH#52872
-        pytest.importorskip("pyarrow")
+        td.versioned_importorskip("pyarrow")
         df = pd.DataFrame({"a": [1, 2], "b": 1.5, "c": True, "d": "x"})
         expected = df.copy()
         result = df.convert_dtypes(
@@ -166,7 +167,7 @@ class TestConvertDtypes:
 
     def test_convert_dtypes_pyarrow_to_np_nullable(self):
         # GH 53648
-        pytest.importorskip("pyarrow")
+        td.versioned_importorskip("pyarrow")
         ser = pd.DataFrame(range(2), dtype="int32[pyarrow]")
         result = ser.convert_dtypes(dtype_backend="numpy_nullable")
         expected = pd.DataFrame(range(2), dtype="Int32")
@@ -174,7 +175,7 @@ class TestConvertDtypes:
 
     def test_convert_dtypes_pyarrow_timestamp(self):
         # GH 54191
-        pytest.importorskip("pyarrow")
+        td.versioned_importorskip("pyarrow")
         ser = pd.Series(pd.date_range("2020-01-01", "2020-01-02", freq="1min"))
         expected = ser.astype("timestamp[ms][pyarrow]")
         result = expected.convert_dtypes(dtype_backend="pyarrow")
index 04a08c8b9bc5237d72376fda51b645b047b74966..23f2cb60cfa2b9621c39c93bbd5685ba8069ab76 100644 (file)
@@ -105,7 +105,7 @@ class TestDataFrameCorr:
 
     @pytest.mark.parametrize("method", ["pearson", "kendall", "spearman"])
     def test_corr_scipy_method(self, float_frame, method):
-        pytest.importorskip("scipy")
+        td.versioned_importorskip("scipy")
         float_frame.loc[float_frame.index[:5], "A"] = np.nan
         float_frame.loc[float_frame.index[5:10], "B"] = np.nan
         float_frame.loc[float_frame.index[:10], "A"] = float_frame["A"][10:20].copy()
@@ -126,7 +126,7 @@ class TestDataFrameCorr:
     @pytest.mark.parametrize("meth", ["pearson", "kendall", "spearman"])
     def test_corr_nooverlap(self, meth):
         # nothing in common
-        pytest.importorskip("scipy")
+        td.versioned_importorskip("scipy")
         df = DataFrame(
             {
                 "A": [1, 1.5, 1, np.nan, np.nan, np.nan],
@@ -159,7 +159,7 @@ class TestDataFrameCorr:
         # when dtypes of pandas series are different
         # then ndarray will have dtype=object,
         # so it need to be properly handled
-        pytest.importorskip("scipy")
+        td.versioned_importorskip("scipy")
         df = DataFrame({"a": [True, False], "b": [1, 0]})
 
         expected = DataFrame(np.ones((2, 2)), index=["a", "b"], columns=["a", "b"])
@@ -201,7 +201,7 @@ class TestDataFrameCorr:
     @pytest.mark.parametrize("method", ["pearson", "spearman", "kendall"])
     def test_corr_nullable_integer(self, nullable_column, other_column, method):
         # https://github.com/pandas-dev/pandas/issues/33803
-        pytest.importorskip("scipy")
+        td.versioned_importorskip("scipy")
         data = DataFrame({"a": nullable_column, "b": other_column})
         result = data.corr(method=method)
         expected = DataFrame(np.ones((2, 2)), columns=["a", "b"], index=["a", "b"])
@@ -250,7 +250,7 @@ class TestDataFrameCorr:
 
     @pytest.mark.parametrize("method", ["pearson", "spearman", "kendall"])
     def test_corr_min_periods_greater_than_length(self, method):
-        pytest.importorskip("scipy")
+        td.versioned_importorskip("scipy")
         df = DataFrame({"A": [1, 2], "B": [1, 2]})
         result = df.corr(method=method, min_periods=3)
         expected = DataFrame(
@@ -264,7 +264,7 @@ class TestDataFrameCorr:
         # when dtypes of pandas series are different
         # then ndarray will have dtype=object,
         # so it need to be properly handled
-        pytest.importorskip("scipy")
+        td.versioned_importorskip("scipy")
         df = DataFrame({"a": [1, 0], "b": [1, 0], "c": ["x", "y"]})
         expected = DataFrame(np.ones((2, 2)), index=["a", "b"], columns=["a", "b"])
         if numeric_only:
@@ -433,7 +433,7 @@ class TestDataFrameCorrWith:
 
     def test_corrwith_spearman(self):
         # GH#21925
-        pytest.importorskip("scipy")
+        td.versioned_importorskip("scipy")
         df = DataFrame(np.random.default_rng(2).random(size=(100, 3)))
         result = df.corrwith(df**2, method="spearman")
         expected = Series(np.ones(len(result)))
@@ -441,7 +441,7 @@ class TestDataFrameCorrWith:
 
     def test_corrwith_kendall(self):
         # GH#21925
-        pytest.importorskip("scipy")
+        td.versioned_importorskip("scipy")
         df = DataFrame(np.random.default_rng(2).random(size=(100, 3)))
         result = df.corrwith(df**2, method="kendall")
         expected = Series(np.ones(len(result)))
@@ -449,7 +449,7 @@ class TestDataFrameCorrWith:
 
     def test_corrwith_spearman_with_tied_data(self):
         # GH#48826
-        pytest.importorskip("scipy")
+        td.versioned_importorskip("scipy")
         df1 = DataFrame(
             {
                 "A": [1, np.nan, 7, 8],
index 5beb09940acf32a4a597819f5b130863d90261e5..f3ddeb17e794cb3d22740f2f2f0582c2d9d65d75 100644 (file)
@@ -1,6 +1,7 @@
 import numpy as np
 import pytest
 
+import pandas.util._test_decorators as td
 import pandas as pd
 from pandas import (
     Categorical,
@@ -398,7 +399,7 @@ class TestDataFrameDescribe:
 
     def test_describe_exclude_pa_dtype(self):
         # GH#52570
-        pa = pytest.importorskip("pyarrow")
+        pa = td.versioned_importorskip("pyarrow")
         df = DataFrame(
             {
                 "a": Series([1, 2, 3], dtype=pd.ArrowDtype(pa.int8())),
index 3e01f67c8794bcf35d2b7be57f8bedcc06c2a137..995a6569c25bceaecd4b78ca0465914bf3865f39 100644 (file)
@@ -1,6 +1,7 @@
 import numpy as np
 import pytest
 
+import pandas.util._test_decorators as td
 from pandas import (
     DataFrame,
     Series,
@@ -144,7 +145,7 @@ class TestDataFrameDot(DotSharedTests):
     [("Float32", "Float64"), ("Int16", "Int32"), ("float[pyarrow]", "double[pyarrow]")],
 )
 def test_arrow_dtype(dtype, exp_dtype):
-    pytest.importorskip("pyarrow")
+    td.versioned_importorskip("pyarrow")
 
     cols = ["a", "b"]
     df_a = DataFrame([[1, 2], [3, 4], [5, 6]], columns=cols, dtype="int32")
index fcb7677f03f279fe35b9ebfc103bbd59f1073076..6c995963f2da104de834bc10f3a0cf2ccc56b884 100644 (file)
@@ -7,6 +7,7 @@ import textwrap
 import numpy as np
 import pytest
 
+import pandas.util._test_decorators as td
 from pandas.compat import (
     IS64,
     PYPY,
@@ -527,7 +528,7 @@ def test_memory_usage_empty_no_warning():
 @pytest.mark.single_cpu
 def test_info_compute_numba():
     # GH#51922
-    pytest.importorskip("numba")
+    td.versioned_importorskip("numba")
     df = DataFrame([[1, 2], [3, 4]])
 
     with option_context("compute.use_numba", True):
index 252b950004bea6494b686ba409c5b5563a456a67..3262c3a1406521e73b3efcaaca1ea0790155b601 100644 (file)
@@ -213,7 +213,7 @@ class TestDataFrameInterpolate:
             df.interpolate(method="values")
 
     def test_interp_various(self):
-        pytest.importorskip("scipy")
+        td.versioned_importorskip("scipy")
         df = DataFrame(
             {"A": [1, 2, np.nan, 4, 5, np.nan, 7], "C": [1, 2, 3, 5, 8, 13, 21]}
         )
@@ -252,7 +252,7 @@ class TestDataFrameInterpolate:
         tm.assert_frame_equal(result, expected, check_dtype=False)
 
     def test_interp_alt_scipy(self):
-        pytest.importorskip("scipy")
+        td.versioned_importorskip("scipy")
         df = DataFrame(
             {"A": [1, 2, np.nan, 4, 5, np.nan, 7], "C": [1, 2, 3, 5, 8, 13, 21]}
         )
@@ -541,7 +541,7 @@ class TestDataFrameInterpolate:
     )
     def test_interpolate_arrow(self, dtype):
         # GH#55347
-        pytest.importorskip("pyarrow")
+        td.versioned_importorskip("pyarrow")
         df = DataFrame({"a": [1, None, None, None, 3]}, dtype=dtype + "[pyarrow]")
         result = df.interpolate(limit=2)
         expected = DataFrame({"a": [1, 1.5, 2.0, None, 3]}, dtype="float64[pyarrow]")
index 735f6c50ab739dba04ebc49fec73cfa3147fc661..cd8c017a5207d22f81414218b23eb123b6fa31cc 100644 (file)
@@ -3,6 +3,7 @@ from datetime import datetime
 import numpy as np
 import pytest
 
+import pandas.util._test_decorators as td
 from pandas.errors import MergeError
 
 import pandas as pd
@@ -163,7 +164,7 @@ def test_join_on_single_col_dup_on_right(left_no_dup, right_w_dups, dtype):
     # GH 46622
     # Dups on right allowed by one_to_many constraint
     if dtype == "string[pyarrow]":
-        pytest.importorskip("pyarrow")
+        td.versioned_importorskip("pyarrow")
     left_no_dup = left_no_dup.astype(dtype)
     right_w_dups.index = right_w_dups.index.astype(dtype)
     left_no_dup.join(
index 8d7a0b373f5f8ad16b8e35167a1c9b71f0d21753..4a9f1affdb85093d2568b1087aec5f166c734399 100644 (file)
@@ -6,6 +6,7 @@ from datetime import (
 import numpy as np
 import pytest
 
+import pandas.util._test_decorators as td
 from pandas._libs.algos import (
     Infinity,
     NegInfinity,
@@ -39,7 +40,7 @@ class TestRank:
         return request.param
 
     def test_rank(self, float_frame):
-        sp_stats = pytest.importorskip("scipy.stats")
+        sp_stats = td.versioned_importorskip("scipy.stats")
 
         float_frame.loc[::2, "A"] = np.nan
         float_frame.loc[::3, "B"] = np.nan
@@ -143,7 +144,7 @@ class TestRank:
             float_string_frame.rank(axis=1)
 
     def test_rank_na_option(self, float_frame):
-        sp_stats = pytest.importorskip("scipy.stats")
+        sp_stats = td.versioned_importorskip("scipy.stats")
 
         float_frame.loc[::2, "A"] = np.nan
         float_frame.loc[::3, "B"] = np.nan
@@ -227,7 +228,7 @@ class TestRank:
     @pytest.mark.parametrize("ax", [0, 1])
     @pytest.mark.parametrize("m", ["average", "min", "max", "first", "dense"])
     def test_rank_methods_frame(self, ax, m):
-        sp_stats = pytest.importorskip("scipy.stats")
+        sp_stats = td.versioned_importorskip("scipy.stats")
 
         xs = np.random.default_rng(2).integers(0, 21, (100, 26))
         xs = (xs - 10.0) / 10.0
@@ -503,7 +504,7 @@ class TestRank:
     )
     def test_rank_string_dtype(self, dtype, exp_dtype):
         # GH#55362
-        pytest.importorskip("pyarrow")
+        td.versioned_importorskip("pyarrow")
         obj = Series(["foo", "foo", None, "foo"], dtype=dtype)
         result = obj.rank(method="first")
         expected = Series([1, 2, None, 3], dtype=exp_dtype)
index c7b444045a0f23ea9d7b9ad94a1244b0b320fee6..bf84ff8cc88bbe9cbc34bbe32ce7cee278c55555 100644 (file)
@@ -5,6 +5,7 @@ import pydoc
 import numpy as np
 import pytest
 
+import pandas.util._test_decorators as td
 from pandas._config import using_pyarrow_string_dtype
 from pandas._config.config import option_context
 
@@ -288,7 +289,7 @@ class TestDataFrameMisc:
 
     def test_tab_complete_warning(self, ip, frame_or_series):
         # GH 16409
-        pytest.importorskip("IPython", minversion="6.0.0")
+        td.versioned_importorskip("IPython", min_version="6.0.0")
         from IPython.core.completer import provisionalcompleter
 
         if frame_or_series is DataFrame:
@@ -383,7 +384,7 @@ class TestDataFrameMisc:
 
     def test_inspect_getmembers(self):
         # GH38740
-        pytest.importorskip("jinja2")
+        td.versioned_importorskip("jinja2")
         df = DataFrame()
         msg = "DataFrame._data is deprecated"
         with tm.assert_produces_warning(
index 098d1829b973cedab334cb5992b6a74f7d2c7766..cf6a9b42f46f9995aba3b6e74683a1c37e58e493 100644 (file)
@@ -6,7 +6,7 @@ import pandas.util._test_decorators as td
 
 import pandas as pd
 
-pa = pytest.importorskip("pyarrow")
+pa = td.versioned_importorskip("pyarrow")
 
 
 @td.skip_if_no("pyarrow", min_version="14.0")
index cae2f6e81d384149a5d52b1fed7f3c58f2413365..95d0867f149c97b18025200359508c3452661544 100644 (file)
@@ -2704,7 +2704,7 @@ class TestDataFrameConstructors:
 
     def test_frame_string_inference(self):
         # GH#54430
-        pytest.importorskip("pyarrow")
+        td.versioned_importorskip("pyarrow")
         dtype = "string[pyarrow_numpy]"
         expected = DataFrame(
             {"a": ["a", "b"]}, dtype=dtype, columns=Index(["a"], dtype=dtype)
@@ -2739,7 +2739,7 @@ class TestDataFrameConstructors:
 
     def test_frame_string_inference_array_string_dtype(self):
         # GH#54496
-        pytest.importorskip("pyarrow")
+        td.versioned_importorskip("pyarrow")
         dtype = "string[pyarrow_numpy]"
         expected = DataFrame(
             {"a": ["a", "b"]}, dtype=dtype, columns=Index(["a"], dtype=dtype)
@@ -2764,7 +2764,7 @@ class TestDataFrameConstructors:
 
     def test_frame_string_inference_block_dim(self):
         # GH#55363
-        pytest.importorskip("pyarrow")
+        td.versioned_importorskip("pyarrow")
         with pd.option_context("future.infer_string", True):
             df = DataFrame(np.array([["hello", "goodbye"], ["hello", "Hello"]]))
         assert df._mgr.blocks[0].ndim == 2
@@ -2852,7 +2852,7 @@ class TestDataFrameConstructorIndexInference:
     )
     def test_dict_data_arrow_column_expansion(self, key_val, col_vals, col_type):
         # GH 53617
-        pa = pytest.importorskip("pyarrow")
+        pa = td.versioned_importorskip("pyarrow")
         cols = pd.arrays.ArrowExtensionArray(
             pa.array(col_vals, type=pa.dictionary(pa.int8(), getattr(pa, col_type)()))
         )
index 2c807c72582c52d748d043263a736b5c9dbdfffa..76b43b77448f0c6043d988b7faa427ef4f7ba7c2 100644 (file)
@@ -1384,7 +1384,7 @@ class TestDataFrameQueryBacktickQuoting:
     @pytest.mark.parametrize("dtype", ["int64", "Int64", "int64[pyarrow]"])
     def test_query_ea_dtypes(self, dtype):
         if dtype == "int64[pyarrow]":
-            pytest.importorskip("pyarrow")
+            td.versioned_importorskip("pyarrow")
         # GH#50261
         df = DataFrame({"a": Series([1, 2], dtype=dtype)})
         ref = {2}  # noqa: F841
@@ -1402,7 +1402,7 @@ class TestDataFrameQueryBacktickQuoting:
         if engine == "numexpr" and not NUMEXPR_INSTALLED:
             pytest.skip("numexpr not installed")
         if dtype == "int64[pyarrow]":
-            pytest.importorskip("pyarrow")
+            td.versioned_importorskip("pyarrow")
         df = DataFrame(
             {"A": Series([1, 1, 2], dtype="Int64"), "B": Series([1, 2, 2], dtype=dtype)}
         )
index bd0e38ba594c2f10e4ba5e1d9f8a5df35310db01..b2f25854b00952c3d9f69720c54dce54fd5b24ee 100644 (file)
@@ -369,7 +369,7 @@ class TestDataFrameAnalytics:
         )
 
     def test_stat_op_calc_skew_kurtosis(self, float_frame_with_na):
-        sp_stats = pytest.importorskip("scipy.stats")
+        sp_stats = td.versioned_importorskip("scipy.stats")
 
         def skewness(x):
             if len(x) < 3:
@@ -1162,7 +1162,7 @@ class TestDataFrameAnalytics:
 
     def test_idxmax_arrow_types(self):
         # GH#55368
-        pytest.importorskip("pyarrow")
+        td.versioned_importorskip("pyarrow")
 
         df = DataFrame({"a": [2, 3, 1], "b": [2, 1, 1]}, dtype="int64[pyarrow]")
         result = df.idxmax()
@@ -2020,7 +2020,7 @@ def test_reduction_axis_none_returns_scalar(method, numeric_only, dtype):
     result = getattr(df, method)(axis=None, numeric_only=numeric_only)
     np_arr = df.to_numpy(dtype=np.float64)
     if method in {"skew", "kurt"}:
-        comp_mod = pytest.importorskip("scipy.stats")
+        comp_mod = td.versioned_importorskip("scipy.stats")
         if method == "kurt":
             method = "kurtosis"
         expected = getattr(comp_mod, method)(np_arr, bias=False, axis=None)
index 776007fb9691d3f6faa185ed037bdd2ab1fd47fe..0aba14d9ab40864d598749cce93701ac5f3c36fe 100644 (file)
@@ -7,6 +7,7 @@ from io import StringIO
 import numpy as np
 import pytest
 
+import pandas.util._test_decorators as td
 from pandas._config import using_pyarrow_string_dtype
 
 from pandas import (
@@ -287,7 +288,7 @@ NaT   4"""
             assert "StringCol" in repr(df)
 
     def test_latex_repr(self):
-        pytest.importorskip("jinja2")
+        td.versioned_importorskip("jinja2")
         expected = r"""\begin{tabular}{llll}
 \toprule
  & 0 & 1 & 2 \\
@@ -475,7 +476,7 @@ NaT   4"""
 
     def test_repr_ea_columns(self, any_string_dtype):
         # GH#54797
-        pytest.importorskip("pyarrow")
+        td.versioned_importorskip("pyarrow")
         df = DataFrame({"long_column_name": [1, 2, 3], "col2": [4, 5, 6]})
         df.columns = df.columns.astype(any_string_dtype)
         expected = """   long_column_name  col2
index 855b58229cbdb5819e83e3abe39a938bbb8658eb..432d6f553c5696bf3a261f8b8d5b061aa251352d 100644 (file)
@@ -1,6 +1,7 @@
 import numpy as np
 import pytest
 
+import pandas.util._test_decorators as td
 import pandas as pd
 from pandas import (
     DataFrame,
@@ -669,7 +670,7 @@ class TestDataFrameSubclassing:
         assert isinstance(result, tm.SubclassedSeries)
 
     def test_corrwith(self):
-        pytest.importorskip("scipy")
+        td.versioned_importorskip("scipy")
         index = ["a", "b", "c", "d", "e"]
         columns = ["one", "two", "three", "four"]
         df1 = tm.SubclassedDataFrame(
index 88c62da2b0a735b103f7a6b03634aa185fc46d2c..53256cf0d565ac1b150ed6fcb285595ce88e8c2c 100644 (file)
@@ -4,6 +4,7 @@ import re
 import numpy as np
 import pytest
 
+import pandas.util._test_decorators as td
 import pandas as pd
 import pandas._testing as tm
 from pandas.api.types import is_extension_array_dtype
@@ -250,7 +251,7 @@ def test_alignment_deprecation_many_inputs_enforced():
     # https://github.com/pandas-dev/pandas/issues/39184
     # test that the deprecation also works with > 2 inputs -> using a numba
     # written ufunc for this because numpy itself doesn't have such ufuncs
-    numba = pytest.importorskip("numba")
+    numba = td.versioned_importorskip("numba")
 
     @numba.vectorize([numba.float64(numba.float64, numba.float64, numba.float64)])
     def my_ufunc(x, y, z):
index 866e9e203ffe3ac1fe29d86b87bbacccf1268e12..d07931478b3a291aec053ca8535317e2f4013b7b 100644 (file)
@@ -7,6 +7,7 @@ import re
 import numpy as np
 import pytest
 
+import pandas.util._test_decorators as td
 import pandas as pd
 import pandas._testing as tm
 
@@ -443,7 +444,7 @@ def test_finalize_last(data):
 
 @not_implemented_mark
 def test_finalize_called_eval_numexpr():
-    pytest.importorskip("numexpr")
+    td.versioned_importorskip("numexpr")
     df = pd.DataFrame({"A": [1, 2]})
     df.attrs["A"] = 1
     result = df.eval("A + 1", engine="numexpr")
index d8401a8b2ae3f3b885374375b64910e166dbe525..2bd235c4f1a29e674521454a0485c5eee0b73d93 100644 (file)
@@ -1,6 +1,7 @@
 import numpy as np
 import pytest
 
+import pandas.util._test_decorators as td
 from pandas import (
     Categorical,
     DataFrame,
@@ -10,7 +11,7 @@ from pandas import (
 )
 import pandas._testing as tm
 
-pytest.importorskip("xarray")
+td.versioned_importorskip("xarray")
 
 
 class TestDataFrameToXArray:
index 1f7890ff8eada133330c0457eda9544c2a8ea39d..4c922191e5ded9564d7bff97d8ba37dcfe7817bd 100644 (file)
@@ -1,6 +1,7 @@
 import numpy as np
 import pytest
 
+import pandas.util._test_decorators as td
 from pandas.errors import NumbaUtilError
 
 from pandas import (
@@ -22,7 +23,7 @@ pytestmark = pytest.mark.single_cpu
 
 
 def test_correct_function_signature():
-    pytest.importorskip("numba")
+    td.versioned_importorskip("numba")
 
     def incorrect_function(x):
         return sum(x) * 2.7
@@ -39,7 +40,7 @@ def test_correct_function_signature():
 
 
 def test_check_nopython_kwargs():
-    pytest.importorskip("numba")
+    td.versioned_importorskip("numba")
 
     def incorrect_function(values, index):
         return sum(values) * 2.7
@@ -61,7 +62,7 @@ def test_check_nopython_kwargs():
 @pytest.mark.parametrize("pandas_obj", ["Series", "DataFrame"])
 @pytest.mark.parametrize("as_index", [True, False])
 def test_numba_vs_cython(jit, pandas_obj, nogil, parallel, nopython, as_index):
-    pytest.importorskip("numba")
+    td.versioned_importorskip("numba")
 
     def func_numba(values, index):
         return np.mean(values) * 2.7
@@ -92,7 +93,7 @@ def test_numba_vs_cython(jit, pandas_obj, nogil, parallel, nopython, as_index):
 @pytest.mark.parametrize("pandas_obj", ["Series", "DataFrame"])
 def test_cache(jit, pandas_obj, nogil, parallel, nopython):
     # Test that the functions are cached correctly if we switch functions
-    pytest.importorskip("numba")
+    td.versioned_importorskip("numba")
 
     def func_1(values, index):
         return np.mean(values) - 3.4
@@ -130,7 +131,7 @@ def test_cache(jit, pandas_obj, nogil, parallel, nopython):
 
 
 def test_use_global_config():
-    pytest.importorskip("numba")
+    td.versioned_importorskip("numba")
 
     def func_1(values, index):
         return np.mean(values) - 3.4
@@ -155,7 +156,7 @@ def test_use_global_config():
     ],
 )
 def test_multifunc_numba_vs_cython_frame(agg_kwargs):
-    pytest.importorskip("numba")
+    td.versioned_importorskip("numba")
     data = DataFrame(
         {
             0: ["a", "a", "b", "b", "a"],
@@ -190,7 +191,7 @@ def test_multifunc_numba_vs_cython_frame(agg_kwargs):
     ],
 )
 def test_multifunc_numba_udf_frame(agg_kwargs, expected_func):
-    pytest.importorskip("numba")
+    td.versioned_importorskip("numba")
     data = DataFrame(
         {
             0: ["a", "a", "b", "b", "a"],
@@ -212,7 +213,7 @@ def test_multifunc_numba_udf_frame(agg_kwargs, expected_func):
     [{"func": ["min", "max"]}, {"func": "min"}, {"min_val": "min", "max_val": "max"}],
 )
 def test_multifunc_numba_vs_cython_series(agg_kwargs):
-    pytest.importorskip("numba")
+    td.versioned_importorskip("numba")
     labels = ["a", "a", "b", "b", "a"]
     data = Series([1.0, 2.0, 3.0, 4.0, 5.0])
     grouped = data.groupby(labels)
@@ -265,7 +266,7 @@ def test_multifunc_numba_vs_cython_series(agg_kwargs):
     strict=False,
 )
 def test_multifunc_numba_kwarg_propagation(data, agg_kwargs):
-    pytest.importorskip("numba")
+    td.versioned_importorskip("numba")
     labels = ["a", "a", "b", "b", "a"]
     grouped = data.groupby(labels)
     result = grouped.agg(**agg_kwargs, engine="numba", engine_kwargs={"parallel": True})
@@ -278,7 +279,7 @@ def test_multifunc_numba_kwarg_propagation(data, agg_kwargs):
 
 def test_args_not_cached():
     # GH 41647
-    pytest.importorskip("numba")
+    td.versioned_importorskip("numba")
 
     def sum_last(values, index, n):
         return values[-n:].sum()
@@ -296,7 +297,7 @@ def test_args_not_cached():
 
 def test_index_data_correctly_passed():
     # GH 43133
-    pytest.importorskip("numba")
+    td.versioned_importorskip("numba")
 
     def f(values, index):
         return np.mean(index)
@@ -312,7 +313,7 @@ def test_index_data_correctly_passed():
 def test_engine_kwargs_not_cached():
     # If the user passes a different set of engine_kwargs don't return the same
     # jitted function
-    pytest.importorskip("numba")
+    td.versioned_importorskip("numba")
     nogil = True
     parallel = False
     nopython = True
@@ -339,7 +340,7 @@ def test_engine_kwargs_not_cached():
 
 @pytest.mark.filterwarnings("ignore")
 def test_multiindex_one_key(nogil, parallel, nopython):
-    pytest.importorskip("numba")
+    td.versioned_importorskip("numba")
 
     def numba_func(values, index):
         return 1
@@ -354,7 +355,7 @@ def test_multiindex_one_key(nogil, parallel, nopython):
 
 
 def test_multiindex_multi_key_not_supported(nogil, parallel, nopython):
-    pytest.importorskip("numba")
+    td.versioned_importorskip("numba")
 
     def numba_func(values, index):
         return 1
@@ -368,7 +369,7 @@ def test_multiindex_multi_key_not_supported(nogil, parallel, nopython):
 
 
 def test_multilabel_numba_vs_cython(numba_supported_reductions):
-    pytest.importorskip("numba")
+    td.versioned_importorskip("numba")
     reduction, kwargs = numba_supported_reductions
     df = DataFrame(
         {
@@ -389,7 +390,7 @@ def test_multilabel_numba_vs_cython(numba_supported_reductions):
 
 
 def test_multilabel_udf_numba_vs_cython():
-    pytest.importorskip("numba")
+    td.versioned_importorskip("numba")
     df = DataFrame(
         {
             "A": ["foo", "bar", "foo", "bar", "foo", "bar", "foo", "foo"],
index 2622895f9f8d21a9e568b0954681f4a7169659c1..1efbc6b8d6aa6b6e3787908bf2ffcddb925de099 100644 (file)
@@ -4,6 +4,7 @@ from string import ascii_lowercase
 import numpy as np
 import pytest
 
+import pandas.util._test_decorators as td
 from pandas import (
     DataFrame,
     Index,
@@ -385,7 +386,7 @@ def test_count_uses_size_on_exception():
 
 def test_count_arrow_string_array(any_string_dtype):
     # GH#54751
-    pytest.importorskip("pyarrow")
+    td.versioned_importorskip("pyarrow")
     df = DataFrame(
         {"a": [1, 2, 3], "b": Series(["a", "b", "a"], dtype=any_string_dtype)}
     )
index 8fddb14ebb7501676a0abd90e048a1189e65c332..fb0772af3ccb3c51851ba4107f36203a5c90e82d 100644 (file)
@@ -2596,7 +2596,7 @@ def test_groupby_column_index_name_lost(func):
 def test_groupby_duplicate_columns(infer_string):
     # GH: 31735
     if infer_string:
-        pytest.importorskip("pyarrow")
+        td.versioned_importorskip("pyarrow")
     df = DataFrame(
         {"A": ["f", "e", "g", "h"], "B": ["a", "b", "c", "d"], "C": [1, 2, 3, 4]}
     ).astype(object)
index ee7d3424724932befa772e47162e032e28f2cd1d..f7c08c731072d925e9372a6fd07e822b70c94121 100644 (file)
@@ -1,5 +1,6 @@
 import pytest
 
+import pandas.util._test_decorators as td
 from pandas import (
     DataFrame,
     Series,
@@ -9,7 +10,7 @@ import pandas._testing as tm
 
 pytestmark = pytest.mark.single_cpu
 
-pytest.importorskip("numba")
+td.versioned_importorskip("numba")
 
 
 @pytest.mark.filterwarnings("ignore")
index 25b0f80639cff61bafe9ee13e5acef950f470e64..31ee3a7854f6d8ef360038a8d5e4f19620a88531 100644 (file)
@@ -701,7 +701,7 @@ def test_groupby_min_max_categorical(func):
 @pytest.mark.parametrize("func", ["min", "max"])
 def test_min_empty_string_dtype(func):
     # GH#55619
-    pytest.importorskip("pyarrow")
+    td.versioned_importorskip("pyarrow")
     dtype = "string[pyarrow_numpy]"
     df = DataFrame({"a": ["a"], "b": "a", "c": "a"}, dtype=dtype).iloc[:0]
     result = getattr(df.groupby("a"), func)()
index 8ef7c2b8ce859d399abf4972aa040e347a7e91e1..282ac1a480278bc487ab914483e9c10d845de247 100644 (file)
@@ -10,6 +10,7 @@ import numpy as np
 import pytest
 import pytz
 
+import pandas.util._test_decorators as td
 import pandas as pd
 from pandas import (
     DataFrame,
@@ -944,7 +945,7 @@ class TestGroupBy:
     def test_groupby_agg_numba_timegrouper_with_nat(
         self, groupby_with_truncated_bingrouper
     ):
-        pytest.importorskip("numba")
+        td.versioned_importorskip("numba")
 
         # See discussion in GH#43487
         gb = groupby_with_truncated_bingrouper
index 61fcc930f116a7e9a5fefde0885f92b9b489d343..09bf98f5518a479d1ebf89fe58a96ac196816a0e 100644 (file)
@@ -1,6 +1,7 @@
 import numpy as np
 import pytest
 
+import pandas.util._test_decorators as td
 from pandas.errors import NumbaUtilError
 
 from pandas import (
@@ -14,7 +15,7 @@ pytestmark = pytest.mark.single_cpu
 
 
 def test_correct_function_signature():
-    pytest.importorskip("numba")
+    td.versioned_importorskip("numba")
 
     def incorrect_function(x):
         return x + 1
@@ -31,7 +32,7 @@ def test_correct_function_signature():
 
 
 def test_check_nopython_kwargs():
-    pytest.importorskip("numba")
+    td.versioned_importorskip("numba")
 
     def incorrect_function(values, index):
         return values + 1
@@ -53,7 +54,7 @@ def test_check_nopython_kwargs():
 @pytest.mark.parametrize("pandas_obj", ["Series", "DataFrame"])
 @pytest.mark.parametrize("as_index", [True, False])
 def test_numba_vs_cython(jit, pandas_obj, nogil, parallel, nopython, as_index):
-    pytest.importorskip("numba")
+    td.versioned_importorskip("numba")
 
     def func(values, index):
         return values + 1
@@ -84,7 +85,7 @@ def test_numba_vs_cython(jit, pandas_obj, nogil, parallel, nopython, as_index):
 @pytest.mark.parametrize("pandas_obj", ["Series", "DataFrame"])
 def test_cache(jit, pandas_obj, nogil, parallel, nopython):
     # Test that the functions are cached correctly if we switch functions
-    pytest.importorskip("numba")
+    td.versioned_importorskip("numba")
 
     def func_1(values, index):
         return values + 1
@@ -121,7 +122,7 @@ def test_cache(jit, pandas_obj, nogil, parallel, nopython):
 
 
 def test_use_global_config():
-    pytest.importorskip("numba")
+    td.versioned_importorskip("numba")
 
     def func_1(values, index):
         return values + 1
@@ -141,7 +142,7 @@ def test_use_global_config():
     "agg_func", [["min", "max"], "min", {"B": ["min", "max"], "C": "sum"}]
 )
 def test_string_cython_vs_numba(agg_func, numba_supported_reductions):
-    pytest.importorskip("numba")
+    td.versioned_importorskip("numba")
     agg_func, kwargs = numba_supported_reductions
     data = DataFrame(
         {0: ["a", "a", "b", "b", "a"], 1: [1.0, 2.0, 3.0, 4.0, 5.0]}, columns=[0, 1]
@@ -159,7 +160,7 @@ def test_string_cython_vs_numba(agg_func, numba_supported_reductions):
 
 def test_args_not_cached():
     # GH 41647
-    pytest.importorskip("numba")
+    td.versioned_importorskip("numba")
 
     def sum_last(values, index, n):
         return values[-n:].sum()
@@ -177,7 +178,7 @@ def test_args_not_cached():
 
 def test_index_data_correctly_passed():
     # GH 43133
-    pytest.importorskip("numba")
+    td.versioned_importorskip("numba")
 
     def f(values, index):
         return index - 1
@@ -191,7 +192,7 @@ def test_index_data_correctly_passed():
 def test_engine_kwargs_not_cached():
     # If the user passes a different set of engine_kwargs don't return the same
     # jitted function
-    pytest.importorskip("numba")
+    td.versioned_importorskip("numba")
     nogil = True
     parallel = False
     nopython = True
@@ -218,7 +219,7 @@ def test_engine_kwargs_not_cached():
 
 @pytest.mark.filterwarnings("ignore")
 def test_multiindex_one_key(nogil, parallel, nopython):
-    pytest.importorskip("numba")
+    td.versioned_importorskip("numba")
 
     def numba_func(values, index):
         return 1
@@ -233,7 +234,7 @@ def test_multiindex_one_key(nogil, parallel, nopython):
 
 
 def test_multiindex_multi_key_not_supported(nogil, parallel, nopython):
-    pytest.importorskip("numba")
+    td.versioned_importorskip("numba")
 
     def numba_func(values, index):
         return 1
@@ -247,7 +248,7 @@ def test_multiindex_multi_key_not_supported(nogil, parallel, nopython):
 
 
 def test_multilabel_numba_vs_cython(numba_supported_reductions):
-    pytest.importorskip("numba")
+    td.versioned_importorskip("numba")
     reduction, kwargs = numba_supported_reductions
     df = DataFrame(
         {
@@ -264,7 +265,7 @@ def test_multilabel_numba_vs_cython(numba_supported_reductions):
 
 
 def test_multilabel_udf_numba_vs_cython():
-    pytest.importorskip("numba")
+    td.versioned_importorskip("numba")
     df = DataFrame(
         {
             "A": ["foo", "bar", "foo", "bar", "foo", "bar", "foo", "foo"],
index 338509dd239e63f7fde17fe377a697429f1405e2..980c53f199de33acd44adfb605e60259eb86bf6f 100644 (file)
@@ -1,6 +1,7 @@
 import numpy as np
 import pytest
 
+import pandas.util._test_decorators as td
 import pandas as pd
 from pandas import (
     Index,
@@ -47,7 +48,7 @@ class TestIndexConstructor:
 
     def test_index_string_inference(self):
         # GH#54430
-        pytest.importorskip("pyarrow")
+        td.versioned_importorskip("pyarrow")
         dtype = "string[pyarrow_numpy]"
         expected = Index(["a", "b"], dtype=dtype)
         with pd.option_context("future.infer_string", True):
index 814a6a516904b6c31d3ef38fa91f23f69fa6ed7e..4fb6e1b6832bb6c24766923adc4e5c89a14a1dac 100644 (file)
@@ -4,6 +4,7 @@ Tests for ndarray-like method on the base Index class
 import numpy as np
 import pytest
 
+import pandas.util._test_decorators as td
 from pandas import Index
 import pandas._testing as tm
 
@@ -58,7 +59,7 @@ class TestReshape:
 
     def test_insert_none_into_string_numpy(self):
         # GH#55365
-        pytest.importorskip("pyarrow")
+        td.versioned_importorskip("pyarrow")
         index = Index(["a", "b", "c"], dtype="string[pyarrow_numpy]")
         result = index.insert(-1, None)
         expected = Index(["a", "b", None, "c"], dtype="string[pyarrow_numpy]")
index 8456e6a7acba5a160556f6f3192fa795ce678786..7bcda510d418961400f99edb352d01bd7685a2ff 100644 (file)
@@ -7,6 +7,7 @@ import itertools
 import numpy as np
 import pytest
 
+import pandas.util._test_decorators as td
 from pandas.core.dtypes.cast import construct_1d_object_array_from_listlike
 
 import pandas as pd
@@ -648,7 +649,7 @@ def test_from_frame():
 
 def test_from_frame_missing_values_multiIndex():
     # GH 39984
-    pa = pytest.importorskip("pyarrow")
+    pa = td.versioned_importorskip("pyarrow")
 
     df = pd.DataFrame(
         {
index cd28d519313ed36228040361dfbb2a8dccf77be5..f53d55571b658c306b423ec0d28dc82e55de4ed0 100644 (file)
@@ -1,6 +1,7 @@
 import numpy as np
 import pytest
 
+import pandas.util._test_decorators as td
 from pandas.errors import InvalidIndexError
 
 from pandas import (
@@ -385,7 +386,7 @@ class TestGetIndexer:
     def test_get_indexer_masked_na_boolean(self, dtype):
         # GH#39133
         if dtype == "bool[pyarrow]":
-            pytest.importorskip("pyarrow")
+            td.versioned_importorskip("pyarrow")
         idx = Index([True, False, NA], dtype=dtype)
         result = idx.get_loc(False)
         assert result == 1
@@ -393,7 +394,7 @@ class TestGetIndexer:
         assert result == 2
 
     def test_get_indexer_arrow_dictionary_target(self):
-        pa = pytest.importorskip("pyarrow")
+        pa = td.versioned_importorskip("pyarrow")
         target = Index(
             ArrowExtensionArray(
                 pa.array([1, 2], type=pa.dictionary(pa.int8(), pa.int8()))
index 7eeb626d91dc8e19ec7768dc80bb9b08472c5b41..4108e3d20ec51141c78a729d4df7c49ddad6038e 100644 (file)
@@ -1285,7 +1285,7 @@ class TestIndex:
 
     def test_tab_complete_warning(self, ip):
         # https://github.com/pandas-dev/pandas/issues/16409
-        pytest.importorskip("IPython", minversion="6.0.0")
+        td.versioned_importorskip("IPython", min_version="6.0.0")
         from IPython.core.completer import provisionalcompleter
 
         code = "import pandas as pd; idx = pd.Index([1, 2])"
index af7533399ea74afb5a5d2b14d2d37d2194926114..bb551127c9367edeb4c466e0dc357fc6494d05f7 100644 (file)
@@ -2,6 +2,7 @@ import re
 
 import pytest
 
+import pandas.util._test_decorators as td
 import pandas as pd
 from pandas import (
     DataFrame,
@@ -174,7 +175,7 @@ class TestDatetimeIndex:
 
     def test_getitem_pyarrow_index(self, frame_or_series):
         # GH 53644
-        pytest.importorskip("pyarrow")
+        td.versioned_importorskip("pyarrow")
         obj = frame_or_series(
             range(5),
             index=date_range("2020", freq="D", periods=5).astype(
index 0cd1390d41461cedf3c11c6e8e633007d05e3ecb..ef7f8b487dd85dd7a75e209cf789402f5a63a34d 100644 (file)
@@ -1308,7 +1308,7 @@ class TestLocBaseIndependent:
     @pytest.mark.parametrize("spmatrix_t", ["coo_matrix", "csc_matrix", "csr_matrix"])
     @pytest.mark.parametrize("dtype", [np.int64, np.float64, complex])
     def test_loc_getitem_range_from_spmatrix(self, spmatrix_t, dtype):
-        sp_sparse = pytest.importorskip("scipy.sparse")
+        sp_sparse = td.versioned_importorskip("scipy.sparse")
 
         spmatrix_t = getattr(sp_sparse, spmatrix_t)
 
@@ -1337,7 +1337,7 @@ class TestLocBaseIndependent:
 
     def test_loc_getitem_sparse_frame(self):
         # GH34687
-        sp_sparse = pytest.importorskip("scipy.sparse")
+        sp_sparse = td.versioned_importorskip("scipy.sparse")
 
         df = DataFrame.sparse.from_spmatrix(sp_sparse.eye(5))
         result = df.loc[range(2)]
@@ -3078,7 +3078,7 @@ def test_loc_periodindex_3_levels():
 
 def test_loc_setitem_pyarrow_strings():
     # GH#52319
-    pytest.importorskip("pyarrow")
+    td.versioned_importorskip("pyarrow")
     df = DataFrame(
         {
             "strings": Series(["A", "B", "C"], dtype="string[pyarrow]"),
index 25418b8bb2b37d3241ffe0d066f8877db80dded5..c7b7c996c3da459fcd3512dc32f3544fca3ed0d6 100644 (file)
@@ -6,6 +6,7 @@ from datetime import (
 import numpy as np
 import pytest
 
+import pandas.util._test_decorators as td
 from pandas._libs.tslibs import iNaT
 from pandas.compat import (
     is_ci_environment,
@@ -67,7 +68,7 @@ def test_categorical_dtype(data, data_categorical):
 
 def test_categorical_pyarrow():
     # GH 49889
-    pa = pytest.importorskip("pyarrow", "11.0.0")
+    pa = td.versioned_importorskip("pyarrow", "11.0.0")
 
     arr = ["Mon", "Tue", "Mon", "Wed", "Mon", "Thu", "Fri", "Sat", "Sun"]
     table = pa.table({"weekday": pa.array(arr).dictionary_encode()})
@@ -82,7 +83,7 @@ def test_categorical_pyarrow():
 
 def test_empty_categorical_pyarrow():
     # https://github.com/pandas-dev/pandas/issues/53077
-    pa = pytest.importorskip("pyarrow", "11.0.0")
+    pa = td.versioned_importorskip("pyarrow", "11.0.0")
 
     arr = [None]
     table = pa.table({"arr": pa.array(arr, "float64").dictionary_encode()})
@@ -94,7 +95,7 @@ def test_empty_categorical_pyarrow():
 
 def test_large_string_pyarrow():
     # GH 52795
-    pa = pytest.importorskip("pyarrow", "11.0.0")
+    pa = td.versioned_importorskip("pyarrow", "11.0.0")
 
     arr = ["Mon", "Tue"]
     table = pa.table({"weekday": pa.array(arr, "large_string")})
@@ -120,7 +121,7 @@ def test_large_string_pyarrow():
 )
 def test_bitmasks_pyarrow(offset, length, expected_values):
     # GH 52795
-    pa = pytest.importorskip("pyarrow", "11.0.0")
+    pa = td.versioned_importorskip("pyarrow", "11.0.0")
 
     arr = [3.3, None, 2.1]
     table = pa.table({"arr": arr}).slice(offset, length)
@@ -282,7 +283,7 @@ def test_categorical_to_numpy_dlpack():
 @pytest.mark.parametrize("data", [{}, {"a": []}])
 def test_empty_pyarrow(data):
     # GH 53155
-    pytest.importorskip("pyarrow", "11.0.0")
+    td.versioned_importorskip("pyarrow", "11.0.0")
     from pyarrow.interchange import from_dataframe as pa_from_dataframe
 
     expected = pd.DataFrame(data)
@@ -292,7 +293,7 @@ def test_empty_pyarrow(data):
 
 
 def test_multi_chunk_pyarrow() -> None:
-    pa = pytest.importorskip("pyarrow", "11.0.0")
+    pa = td.versioned_importorskip("pyarrow", "11.0.0")
     n_legs = pa.chunked_array([[2, 2, 4], [4, 5, 100]])
     names = ["n_legs"]
     table = pa.table([n_legs], names=names)
@@ -305,7 +306,7 @@ def test_multi_chunk_pyarrow() -> None:
 
 
 def test_multi_chunk_column() -> None:
-    pytest.importorskip("pyarrow", "11.0.0")
+    td.versioned_importorskip("pyarrow", "11.0.0")
     ser = pd.Series([1, 2, None], dtype="Int64[pyarrow]")
     df = pd.concat([ser, ser], ignore_index=True).to_frame("a")
     df_orig = df.copy()
@@ -327,7 +328,7 @@ def test_multi_chunk_column() -> None:
 
 def test_timestamp_ns_pyarrow():
     # GH 56712
-    pytest.importorskip("pyarrow", "11.0.0")
+    td.versioned_importorskip("pyarrow", "11.0.0")
     timestamp_args = {
         "year": 2000,
         "month": 1,
@@ -362,7 +363,7 @@ def test_datetimetzdtype(tz, unit):
 
 def test_interchange_from_non_pandas_tz_aware(request):
     # GH 54239, 54287
-    pa = pytest.importorskip("pyarrow", "11.0.0")
+    pa = td.versioned_importorskip("pyarrow", "11.0.0")
     import pyarrow.compute as pc
 
     if is_platform_windows() and is_ci_environment():
@@ -420,7 +421,7 @@ def test_empty_string_column():
 
 def test_large_string():
     # GH#56702
-    pytest.importorskip("pyarrow")
+    td.versioned_importorskip("pyarrow")
     df = pd.DataFrame({"a": ["x"]}, dtype="large_string[pyarrow]")
     result = pd.api.interchange.from_dataframe(df.__dataframe__())
     expected = pd.DataFrame({"a": ["x"]}, dtype="object")
@@ -500,7 +501,7 @@ def test_pandas_nullable_with_missing_values(
 ) -> None:
     # https://github.com/pandas-dev/pandas/issues/57643
     # https://github.com/pandas-dev/pandas/issues/57664
-    pa = pytest.importorskip("pyarrow", "11.0.0")
+    pa = td.versioned_importorskip("pyarrow", "11.0.0")
     import pyarrow.interchange as pai
 
     if expected_dtype == "timestamp[us, tz=Asia/Kathmandu]":
@@ -562,7 +563,7 @@ def test_pandas_nullable_without_missing_values(
     data: list, dtype: str, expected_dtype: str
 ) -> None:
     # https://github.com/pandas-dev/pandas/issues/57643
-    pa = pytest.importorskip("pyarrow", "11.0.0")
+    pa = td.versioned_importorskip("pyarrow", "11.0.0")
     import pyarrow.interchange as pai
 
     if expected_dtype == "timestamp[us, tz=Asia/Kathmandu]":
@@ -578,7 +579,7 @@ def test_pandas_nullable_without_missing_values(
 
 def test_string_validity_buffer() -> None:
     # https://github.com/pandas-dev/pandas/issues/57761
-    pytest.importorskip("pyarrow", "11.0.0")
+    td.versioned_importorskip("pyarrow", "11.0.0")
     df = pd.DataFrame({"a": ["x"]}, dtype="large_string[pyarrow]")
     result = df.__dataframe__().get_column_by_name("a").get_buffers()["validity"]
     assert result is None
@@ -586,7 +587,7 @@ def test_string_validity_buffer() -> None:
 
 def test_string_validity_buffer_no_missing() -> None:
     # https://github.com/pandas-dev/pandas/issues/57762
-    pytest.importorskip("pyarrow", "11.0.0")
+    td.versioned_importorskip("pyarrow", "11.0.0")
     df = pd.DataFrame({"a": ["x", None]}, dtype="large_string[pyarrow]")
     validity = df.__dataframe__().get_column_by_name("a").get_buffers()["validity"]
     assert validity is not None
index a47bc2752ff32f5eb7630a3960e7611242cb73e3..47b2fd65d381ec02570af91d70492593da796c9a 100644 (file)
@@ -1,6 +1,7 @@
 import numpy as np
 import pytest
 
+import pandas.util._test_decorators as td
 import pandas as pd
 from pandas.core.interchange.utils import dtype_to_arrow_c_fmt
 
@@ -78,7 +79,7 @@ def test_dtype_to_arrow_c_fmt(pandas_dtype, c_string):  # PR01
 )
 def test_dtype_to_arrow_c_fmt_arrowdtype(pa_dtype, args_kwargs, c_string):
     # GH 52323
-    pa = pytest.importorskip("pyarrow")
+    pa = td.versioned_importorskip("pyarrow")
     if not args_kwargs:
         pa_type = getattr(pa, pa_dtype)()
     elif isinstance(args_kwargs, tuple):
index ab6cacc4cc860d0d4c0ffe948274252daae2ee27..3bdbf10e7256845c1b956850f548e5641177cbc7 100644 (file)
@@ -58,8 +58,8 @@ def s3_base(worker_id, monkeypatch):
     Sets up moto server in separate process locally
     Return url for motoserver/moto CI service
     """
-    pytest.importorskip("s3fs")
-    pytest.importorskip("boto3")
+    td.versioned_importorskip("s3fs")
+    td.versioned_importorskip("boto3")
 
     # temporary workaround as moto fails for botocore >= 1.11 otherwise,
     # see https://github.com/spulec/moto/issues/1924 & 1952
@@ -80,9 +80,9 @@ def s3_base(worker_id, monkeypatch):
             # set in .github/workflows/unit-tests.yml
             yield "http://localhost:5000"
     else:
-        requests = pytest.importorskip("requests")
-        pytest.importorskip("moto")
-        pytest.importorskip("flask")  # server mode needs flask too
+        requests = td.versioned_importorskip("requests")
+        td.versioned_importorskip("moto")
+        td.versioned_importorskip("flask")  # server mode needs flask too
 
         # Launching moto in server mode, i.e., as a separate process
         # with an S3 endpoint on localhost
index b5bb9b27258d86cda6e44aeae17a4cdba4157a43..7e2f0e8b936afe79ac46e0177262928f5a36b351 100644 (file)
@@ -3,12 +3,13 @@ import functools
 import numpy as np
 import pytest
 
+import pandas.util._test_decorators as td
 from pandas.compat import is_platform_windows
 
 import pandas as pd
 import pandas._testing as tm
 
-pytest.importorskip("odf")
+td.versioned_importorskip("odf")
 
 if is_platform_windows():
     pytestmark = pytest.mark.single_cpu
index 1c728ad801bc139c1ca1cd2e902884a5a2c91ffc..a20193a347cfb6bca95304f1ffffbcf84581cac7 100644 (file)
@@ -6,6 +6,7 @@ import re
 
 import pytest
 
+import pandas.util._test_decorators as td
 from pandas.compat import is_platform_windows
 
 import pandas as pd
@@ -13,7 +14,7 @@ import pandas._testing as tm
 
 from pandas.io.excel import ExcelWriter
 
-odf = pytest.importorskip("odf")
+odf = td.versioned_importorskip("odf")
 
 if is_platform_windows():
     pytestmark = pytest.mark.single_cpu
index 99c19638eaece3f971b97499729253587b258a13..3fbb4bce17dc5a3e98c8a644fc8aff9cf1e0d653 100644 (file)
@@ -5,6 +5,7 @@ import re
 import numpy as np
 import pytest
 
+import pandas.util._test_decorators as td
 from pandas.compat import is_platform_windows
 
 import pandas as pd
@@ -17,7 +18,7 @@ from pandas.io.excel import (
 )
 from pandas.io.excel._openpyxl import OpenpyxlReader
 
-openpyxl = pytest.importorskip("openpyxl")
+openpyxl = td.versioned_importorskip("openpyxl")
 
 if is_platform_windows():
     pytestmark = pytest.mark.single_cpu
index ff29d7819996cbe4a8ea46ba91c3f55b0b9ec628..0db5e7b3dcdb9205a4231080cd05692bdf17bb1a 100644 (file)
@@ -667,7 +667,7 @@ class TestReaders:
         if read_ext in (".xlsb", ".xls"):
             pytest.skip(f"No engine for filetype: '{read_ext}'")
 
-        pa = pytest.importorskip("pyarrow")
+        pa = td.versioned_importorskip("pyarrow")
 
         with pd.option_context("mode.string_storage", string_storage):
             df = DataFrame(
index 89615172688d7b56fbb070dbcd4750365d7d612d..f0c093b3d5f28398d5aa98cc46a3ae6fe8b8405a 100644 (file)
@@ -16,7 +16,7 @@ import pandas._testing as tm
 from pandas.io.excel import ExcelWriter
 from pandas.io.formats.excel import ExcelFormatter
 
-pytest.importorskip("jinja2")
+td.versioned_importorskip("jinja2")
 # jinja2 is currently required for Styler.__init__(). Technically Styler.to_excel
 # could compute styles and render to excel without jinja2, since there is no
 # 'template' file, but this needs the import error to delayed until render time.
@@ -41,14 +41,14 @@ def assert_equal_cell_styles(cell1, cell2):
 )
 def test_styler_to_excel_unstyled(engine):
     # compare DataFrame.to_excel and Styler.to_excel when no styles applied
-    pytest.importorskip(engine)
+    td.versioned_importorskip(engine)
     df = DataFrame(np.random.default_rng(2).standard_normal((2, 2)))
     with tm.ensure_clean(".xlsx") as path:
         with ExcelWriter(path, engine=engine) as writer:
             df.to_excel(writer, sheet_name="dataframe")
             df.style.to_excel(writer, sheet_name="unstyled")
 
-        openpyxl = pytest.importorskip("openpyxl")  # test loading only with openpyxl
+        openpyxl = td.versioned_importorskip("openpyxl")  # test loading only with openpyxl
         with contextlib.closing(openpyxl.load_workbook(path)) as wb:
             for col1, col2 in zip(wb["dataframe"].columns, wb["unstyled"].columns):
                 assert len(col1) == len(col2)
@@ -133,7 +133,7 @@ shared_style_params = [
 )
 @pytest.mark.parametrize("css, attrs, expected", shared_style_params)
 def test_styler_to_excel_basic(engine, css, attrs, expected):
-    pytest.importorskip(engine)
+    td.versioned_importorskip(engine)
     df = DataFrame(np.random.default_rng(2).standard_normal((1, 1)))
     styler = df.style.map(lambda x: css)
 
@@ -142,7 +142,7 @@ def test_styler_to_excel_basic(engine, css, attrs, expected):
             df.to_excel(writer, sheet_name="dataframe")
             styler.to_excel(writer, sheet_name="styled")
 
-        openpyxl = pytest.importorskip("openpyxl")  # test loading only with openpyxl
+        openpyxl = td.versioned_importorskip("openpyxl")  # test loading only with openpyxl
         with contextlib.closing(openpyxl.load_workbook(path)) as wb:
             # test unstyled data cell does not have expected styles
             # test styled cell has expected styles
@@ -164,7 +164,7 @@ def test_styler_to_excel_basic(engine, css, attrs, expected):
 )
 @pytest.mark.parametrize("css, attrs, expected", shared_style_params)
 def test_styler_to_excel_basic_indexes(engine, css, attrs, expected):
-    pytest.importorskip(engine)
+    td.versioned_importorskip(engine)
     df = DataFrame(np.random.default_rng(2).standard_normal((1, 1)))
 
     styler = df.style
@@ -181,7 +181,7 @@ def test_styler_to_excel_basic_indexes(engine, css, attrs, expected):
             null_styler.to_excel(writer, sheet_name="null_styled")
             styler.to_excel(writer, sheet_name="styled")
 
-        openpyxl = pytest.importorskip("openpyxl")  # test loading only with openpyxl
+        openpyxl = td.versioned_importorskip("openpyxl")  # test loading only with openpyxl
         with contextlib.closing(openpyxl.load_workbook(path)) as wb:
             # test null styled index cells does not have expected styles
             # test styled cell has expected styles
@@ -233,7 +233,7 @@ def test_styler_to_excel_border_style(engine, border_style):
     attrs = ["border", "left", "style"]
     expected = border_style
 
-    pytest.importorskip(engine)
+    td.versioned_importorskip(engine)
     df = DataFrame(np.random.default_rng(2).standard_normal((1, 1)))
     styler = df.style.map(lambda x: css)
 
@@ -242,7 +242,7 @@ def test_styler_to_excel_border_style(engine, border_style):
             df.to_excel(writer, sheet_name="dataframe")
             styler.to_excel(writer, sheet_name="styled")
 
-        openpyxl = pytest.importorskip("openpyxl")  # test loading only with openpyxl
+        openpyxl = td.versioned_importorskip("openpyxl")  # test loading only with openpyxl
         with contextlib.closing(openpyxl.load_workbook(path)) as wb:
             # test unstyled data cell does not have expected styles
             # test styled cell has expected styles
@@ -259,7 +259,7 @@ def test_styler_to_excel_border_style(engine, border_style):
 
 
 def test_styler_custom_converter():
-    openpyxl = pytest.importorskip("openpyxl")
+    openpyxl = td.versioned_importorskip("openpyxl")
 
     def custom_converter(css):
         return {"font": {"color": {"rgb": "111222"}}}
index 066393d91eeadcdc08873f4ffeedda0f689337fe..60941e2754b15fba1616d862e4b72b07f882a793 100644 (file)
@@ -3,6 +3,7 @@ import io
 import numpy as np
 import pytest
 
+import pandas.util._test_decorators as td
 from pandas.compat import is_platform_windows
 
 import pandas as pd
@@ -11,7 +12,7 @@ import pandas._testing as tm
 from pandas.io.excel import ExcelFile
 from pandas.io.excel._base import inspect_excel_format
 
-xlrd = pytest.importorskip("xlrd")
+xlrd = td.versioned_importorskip("xlrd")
 
 if is_platform_windows():
     pytestmark = pytest.mark.single_cpu
index 529367761fc025e3e5d02bea85741c82f64c97ca..8402a7c8b8204349496e7f66ec051289f96bb84f 100644 (file)
@@ -2,6 +2,7 @@ import contextlib
 
 import pytest
 
+import pandas.util._test_decorators as td
 from pandas.compat import is_platform_windows
 
 from pandas import DataFrame
@@ -9,7 +10,7 @@ import pandas._testing as tm
 
 from pandas.io.excel import ExcelWriter
 
-xlsxwriter = pytest.importorskip("xlsxwriter")
+xlsxwriter = td.versioned_importorskip("xlsxwriter")
 
 if is_platform_windows():
     pytestmark = pytest.mark.single_cpu
@@ -23,7 +24,7 @@ def ext():
 def test_column_format(ext):
     # Test that column formats are applied to cells. Test for issue #9167.
     # Applicable to xlsxwriter only.
-    openpyxl = pytest.importorskip("openpyxl")
+    openpyxl = td.versioned_importorskip("openpyxl")
 
     with tm.ensure_clean(ext) as path:
         frame = DataFrame({"A": [123456, 123456], "B": [123456, 123456]})
index b0e4712e8bb3d15959bddc0bd8697981b16bd8ef..9c84fde64f1163fa20297a00f65961b6336bed9d 100644 (file)
@@ -3,13 +3,14 @@ import io
 import numpy as np
 import pytest
 
+import pandas.util._test_decorators as td
 from pandas import (
     NA,
     DataFrame,
     read_csv,
 )
 
-pytest.importorskip("jinja2")
+td.versioned_importorskip("jinja2")
 
 
 def bar_grad(a=None, b=None, c=None, d=None):
index d52e3a37e7693dadce34f73fc03a0790c7a0b4d3..a742f06f06878017b4ba514f36b9e750be41eec4 100644 (file)
@@ -1,6 +1,7 @@
 import pytest
 
-jinja2 = pytest.importorskip("jinja2")
+import pandas.util._test_decorators as td
+jinja2 = td.versioned_importorskip("jinja2")
 
 from pandas import (
     DataFrame,
index 1c84816ead140b95f14df8dbeccc83b317ac239a..3531a47e354e948fe8d0a9480e221264b571d9ff 100644 (file)
@@ -1,6 +1,7 @@
 import numpy as np
 import pytest
 
+import pandas.util._test_decorators as td
 from pandas import (
     NA,
     DataFrame,
@@ -11,7 +12,7 @@ from pandas import (
     option_context,
 )
 
-pytest.importorskip("jinja2")
+td.versioned_importorskip("jinja2")
 from pandas.io.formats.style import Styler
 from pandas.io.formats.style_render import _str_escape
 
index 3d59719010ee03cc53373a1c96f5f8c5611d7681..b659146a5769679e1c53b4ff8f33816ae68a3bfa 100644 (file)
@@ -1,13 +1,14 @@
 import numpy as np
 import pytest
 
+import pandas.util._test_decorators as td
 from pandas import (
     NA,
     DataFrame,
     IndexSlice,
 )
 
-pytest.importorskip("jinja2")
+td.versioned_importorskip("jinja2")
 
 from pandas.io.formats.style import Styler
 
index 2c5220da960f1645f6559585ef1dbafcf074bcd4..2f03a579cb0fbc7618024fd45802237424edf3a7 100644 (file)
@@ -6,13 +6,14 @@ from textwrap import (
 import numpy as np
 import pytest
 
+import pandas.util._test_decorators as td
 from pandas import (
     DataFrame,
     MultiIndex,
     option_context,
 )
 
-jinja2 = pytest.importorskip("jinja2")
+jinja2 = td.versioned_importorskip("jinja2")
 from pandas.io.formats.style import Styler
 
 
index fb7a77f1ddb27db66a847fc1a1d87d14d95822aa..30f03065ee4499f9448c074c679c3b182256fd3b 100644 (file)
@@ -3,14 +3,15 @@ import gc
 import numpy as np
 import pytest
 
+import pandas.util._test_decorators as td
 from pandas import (
     DataFrame,
     IndexSlice,
     Series,
 )
 
-pytest.importorskip("matplotlib")
-pytest.importorskip("jinja2")
+td.versioned_importorskip("matplotlib")
+td.versioned_importorskip("jinja2")
 
 import matplotlib as mpl
 
@@ -23,9 +24,9 @@ def mpl_cleanup():
     # 1) Resets units registry
     # 2) Resets rc_context
     # 3) Closes all figures
-    mpl = pytest.importorskip("matplotlib")
-    mpl_units = pytest.importorskip("matplotlib.units")
-    plt = pytest.importorskip("matplotlib.pyplot")
+    mpl = td.versioned_importorskip("matplotlib")
+    mpl_units = td.versioned_importorskip("matplotlib.units")
+    plt = td.versioned_importorskip("matplotlib.pyplot")
     orig_units_registry = mpl_units.registry.copy()
     with mpl.rc_context():
         mpl.use("template")
index e4d31fe21f2c9cf3454a67f8c7443382f7f1c0ef..278fbf7b37cabf8b289ee52823f87cd4e77ed3c4 100644 (file)
@@ -2,12 +2,13 @@ from textwrap import dedent
 
 import pytest
 
+import pandas.util._test_decorators as td
 from pandas import (
     DataFrame,
     IndexSlice,
 )
 
-pytest.importorskip("jinja2")
+td.versioned_importorskip("jinja2")
 
 from pandas.io.formats.style import Styler
 
index 3e231e37d1dd67c9c03d4d7f42bdaa1303df6d7a..80b4209bd0c532d1b85c5fdac1a873d1cefbe173 100644 (file)
@@ -16,7 +16,7 @@ from pandas import (
 import pandas._testing as tm
 import pandas.util._test_decorators as td
 
-jinja2 = pytest.importorskip("jinja2")
+jinja2 = td.versioned_importorskip("jinja2")
 from pandas.io.formats.style import (  # isort:skip
     Styler,
 )
index 7f1443c3ee66be040f668f546682924207cfd31e..e804cfb6b0b3d38d6f79b7e245baad1c60942caa 100644 (file)
@@ -3,6 +3,7 @@ from textwrap import dedent
 import numpy as np
 import pytest
 
+import pandas.util._test_decorators as td
 from pandas import (
     DataFrame,
     MultiIndex,
@@ -10,7 +11,7 @@ from pandas import (
     option_context,
 )
 
-pytest.importorskip("jinja2")
+td.versioned_importorskip("jinja2")
 from pandas.io.formats.style import Styler
 from pandas.io.formats.style_render import (
     _parse_latex_cell_styles,
index e6f84cc9e9cd89ae63ff7a04bff70bade5874d85..cfe92eba0817dbe88b3d558c664a0f00d6545050 100644 (file)
@@ -2,12 +2,13 @@ from textwrap import dedent
 
 import pytest
 
+import pandas.util._test_decorators as td
 from pandas import (
     DataFrame,
     Series,
 )
 
-pytest.importorskip("jinja2")
+td.versioned_importorskip("jinja2")
 from pandas.io.formats.style import Styler
 
 
index c49a0e05c67002ab0b6eebd1ffd3bda554622f4d..9d21067c20a2036d56500a34a48aca4262ccd0d9 100644 (file)
@@ -1,9 +1,10 @@
 import numpy as np
 import pytest
 
+import pandas.util._test_decorators as td
 from pandas import DataFrame
 
-pytest.importorskip("jinja2")
+td.versioned_importorskip("jinja2")
 from pandas.io.formats.style import Styler
 
 
index 0ca29c219b55b0931885f2fbf92cbf1fd809c5b8..017e4b908fa5ea8db36d73af1a4e0c1d06dd4d82 100644 (file)
@@ -11,6 +11,7 @@ from shutil import get_terminal_size
 import numpy as np
 import pytest
 
+import pandas.util._test_decorators as td
 from pandas._config import using_pyarrow_string_dtype
 
 import pandas as pd
@@ -2268,7 +2269,7 @@ def test_filepath_or_buffer_arg(
 ):
     df = DataFrame([data])
     if method in ["to_latex"]:  # uses styler implementation
-        pytest.importorskip("jinja2")
+        td.versioned_importorskip("jinja2")
 
     if filepath_or_buffer_id not in ["string", "pathlike"] and encoding is not None:
         with pytest.raises(
@@ -2287,7 +2288,7 @@ def test_filepath_or_buffer_arg(
 @pytest.mark.parametrize("method", ["to_string", "to_html", "to_latex"])
 def test_filepath_or_buffer_bad_arg_raises(float_frame, method):
     if method in ["to_latex"]:  # uses styler implementation
-        pytest.importorskip("jinja2")
+        td.versioned_importorskip("jinja2")
     msg = "buf is not a file name and it has no write method"
     with pytest.raises(TypeError, match=msg):
         getattr(float_frame, method)(buf=object())
index 927a9f4961f6ff7ae51f74aceb0cb36dc6754c21..583d11b6633cd9ea3ff6f285a73bca157e60d162 100644 (file)
@@ -6,6 +6,7 @@ import string
 
 import pytest
 
+import pandas.util._test_decorators as td
 from pandas.errors import CSSWarning
 
 import pandas._testing as tm
@@ -336,7 +337,7 @@ def tests_css_named_colors_valid():
 
 
 def test_css_named_colors_from_mpl_present():
-    mpl_colors = pytest.importorskip("matplotlib.colors")
+    mpl_colors = td.versioned_importorskip("matplotlib.colors")
 
     pd_colors = CSSToExcelConverter.NAMED_COLORS
     for name, color in mpl_colors.CSS4_COLORS.items():
index 1fd96dff27d06dc3056b56c5f7e8eb054e98bd8f..156824b5c8bda605f94333f0348e56f2be40713e 100644 (file)
@@ -4,6 +4,7 @@ from textwrap import dedent
 
 import pytest
 
+import pandas.util._test_decorators as td
 import pandas as pd
 from pandas import (
     DataFrame,
@@ -11,7 +12,7 @@ from pandas import (
 )
 import pandas._testing as tm
 
-pytest.importorskip("jinja2")
+td.versioned_importorskip("jinja2")
 
 
 def _dedent(string):
index 85eca834ff0d43ca30eb4043ed9f97fd3807899b..af9195738500e8044746231325430f0b948eba43 100644 (file)
@@ -5,10 +5,11 @@ from io import (
 
 import pytest
 
+import pandas.util._test_decorators as td
 import pandas as pd
 import pandas._testing as tm
 
-pytest.importorskip("tabulate")
+td.versioned_importorskip("tabulate")
 
 
 def test_simple():
index 2e5a5005cb0761c104ed6de26cd5a6ef730c08d5..022a1d52321ce76ef0b0ef1be5459a0a2e10ab64 100644 (file)
@@ -10,6 +10,7 @@ from textwrap import dedent
 import numpy as np
 import pytest
 
+import pandas.util._test_decorators as td
 from pandas._config import using_pyarrow_string_dtype
 
 from pandas import (
@@ -748,7 +749,7 @@ class TestDataFrameToString:
 
     def test_to_string_string_dtype(self):
         # GH#50099
-        pytest.importorskip("pyarrow")
+        td.versioned_importorskip("pyarrow")
         df = DataFrame(
             {"x": ["foo", "bar", "baz"], "y": ["a", "b", "c"], "z": [1, 2, 3]}
         )
index 5279f3f1cdfbe9fbec62f5685503c28b62f5f872..5ef69fbec8d1c62e0aa78688ad973f6263940e16 100644 (file)
@@ -2034,7 +2034,7 @@ class TestPandasContainer:
         self, string_storage, dtype_backend, orient, using_infer_string
     ):
         # GH#50750
-        pa = pytest.importorskip("pyarrow")
+        pa = td.versioned_importorskip("pyarrow")
         df = DataFrame(
             {
                 "a": Series([1, np.nan, 3], dtype="Int64"),
@@ -2056,7 +2056,7 @@ class TestPandasContainer:
             string_array_na = StringArray(np.array(["a", "b", NA], dtype=np.object_))
 
         elif dtype_backend == "pyarrow":
-            pa = pytest.importorskip("pyarrow")
+            pa = td.versioned_importorskip("pyarrow")
             from pandas.arrays import ArrowExtensionArray
 
             string_array = ArrowExtensionArray(pa.array(["a", "b", "c"]))
@@ -2103,7 +2103,7 @@ class TestPandasContainer:
     @pytest.mark.parametrize("orient", ["split", "records", "index"])
     def test_read_json_nullable_series(self, string_storage, dtype_backend, orient):
         # GH#50750
-        pa = pytest.importorskip("pyarrow")
+        pa = td.versioned_importorskip("pyarrow")
         ser = Series([1, np.nan, 3], dtype="Int64")
 
         out = ser.to_json(orient=orient)
@@ -2147,7 +2147,7 @@ def test_pyarrow_engine_lines_false():
 
 
 def test_json_roundtrip_string_inference(orient):
-    pytest.importorskip("pyarrow")
+    td.versioned_importorskip("pyarrow")
     df = DataFrame(
         [["a", "b"], ["c", "d"]], index=["row 1", "row 2"], columns=["col 1", "col 2"]
     )
index d96ccb4b94cc2c567c8d7e59cad3227017f9200d..5663f238a96b8fc348489209190fe225cb5ab39d 100644 (file)
@@ -5,6 +5,7 @@ from pathlib import Path
 import numpy as np
 import pytest
 
+import pandas.util._test_decorators as td
 import pandas as pd
 from pandas import (
     DataFrame,
@@ -28,7 +29,7 @@ def lines_json_df():
 @pytest.fixture(params=["ujson", "pyarrow"])
 def engine(request):
     if request.param == "pyarrow":
-        pytest.importorskip("pyarrow.json")
+        td.versioned_importorskip("pyarrow.json")
     return request.param
 
 
index 6d5f870f07206f0380f87233828047cdc6dc5ea9..ef030ac2da45b2183eebfa11637c948dc543b231 100644 (file)
@@ -4,6 +4,7 @@ import os
 
 import pytest
 
+import pandas.util._test_decorators as td
 from pandas.compat._optional import VERSIONS
 
 from pandas import (
@@ -135,7 +136,7 @@ def all_parsers(request):
     """
     parser = request.param()
     if parser.engine == "pyarrow":
-        pytest.importorskip("pyarrow", VERSIONS["pyarrow"])
+        td.versioned_importorskip("pyarrow", VERSIONS["pyarrow"])
         # Try finding a way to disable threads all together
         # for more stable CI runs
         import pyarrow
index ce02e752fb90b4f69d63baa6875ba8bda6d991fb..8b2477928a60ea077a2d0b77441fe890ab71da74 100644 (file)
@@ -8,6 +8,7 @@ from io import StringIO
 import numpy as np
 import pytest
 
+import pandas.util._test_decorators as td
 from pandas.errors import ParserWarning
 
 import pandas as pd
@@ -460,7 +461,7 @@ def test_dtype_backend_and_dtype(all_parsers):
 
 def test_dtype_backend_string(all_parsers, string_storage):
     # GH#36712
-    pa = pytest.importorskip("pyarrow")
+    pa = td.versioned_importorskip("pyarrow")
 
     with pd.option_context("mode.string_storage", string_storage):
         parser = all_parsers
@@ -503,7 +504,7 @@ def test_dtype_backend_ea_dtype_specified(all_parsers):
 
 def test_dtype_backend_pyarrow(all_parsers, request):
     # GH#36712
-    pa = pytest.importorskip("pyarrow")
+    pa = td.versioned_importorskip("pyarrow")
     parser = all_parsers
 
     data = """a,b,c,d,e,f,g,h,i,j
@@ -556,7 +557,7 @@ def test_ea_int_avoid_overflow(all_parsers):
 
 def test_string_inference(all_parsers):
     # GH#54430
-    pytest.importorskip("pyarrow")
+    td.versioned_importorskip("pyarrow")
     dtype = "string[pyarrow_numpy]"
 
     data = """a,b
@@ -577,7 +578,7 @@ y,2
 @pytest.mark.parametrize("dtype", ["O", object, "object", np.object_, str, np.str_])
 def test_string_inference_object_dtype(all_parsers, dtype):
     # GH#56047
-    pytest.importorskip("pyarrow")
+    td.versioned_importorskip("pyarrow")
 
     data = """a,b
 x,a
index 1bae2317a2fc602a436d17e80bc8d4bfdcd7fe5f..8c828460ae8eb213c988b43d1fbf7d702eec0160 100644 (file)
@@ -1,6 +1,7 @@
 import numpy as np
 import pytest
 
+import pandas.util._test_decorators as td
 from pandas.errors import DtypeWarning
 
 import pandas._testing as tm
@@ -11,7 +12,7 @@ from pandas.io.parsers.c_parser_wrapper import _concatenate_chunks
 
 def test_concatenate_chunks_pyarrow():
     # GH#51876
-    pa = pytest.importorskip("pyarrow")
+    pa = td.versioned_importorskip("pyarrow")
     chunks = [
         {0: ArrowExtensionArray(pa.array([1.5, 2.5]))},
         {0: ArrowExtensionArray(pa.array([1, 2]))},
@@ -23,7 +24,7 @@ def test_concatenate_chunks_pyarrow():
 
 def test_concatenate_chunks_pyarrow_strings():
     # GH#51876
-    pa = pytest.importorskip("pyarrow")
+    pa = td.versioned_importorskip("pyarrow")
     chunks = [
         {0: ArrowExtensionArray(pa.array([1.5, 2.5]))},
         {0: ArrowExtensionArray(pa.array(["a", "b"]))},
index 9351387dfc3379e6b90756a3a771ec5d46ec4065..d064e836b6b01b989703ee893d5e967ba83ca35b 100644 (file)
@@ -80,7 +80,7 @@ class TestS3:
     def test_parse_public_s3_bucket(self, s3_public_bucket_with_data, tips_df, s3so):
         # more of an integration test due to the not-public contents portion
         # can probably mock this though.
-        pytest.importorskip("s3fs")
+        td.versioned_importorskip("s3fs")
         for ext, comp in [("", None), (".gz", "gzip"), (".bz2", "bz2")]:
             df = read_csv(
                 f"s3://{s3_public_bucket_with_data.name}/tips.csv" + ext,
@@ -93,7 +93,7 @@ class TestS3:
 
     def test_parse_private_s3_bucket(self, s3_private_bucket_with_data, tips_df, s3so):
         # Read public file from bucket with not-public contents
-        pytest.importorskip("s3fs")
+        td.versioned_importorskip("s3fs")
         df = read_csv(
             f"s3://{s3_private_bucket_with_data.name}/tips.csv", storage_options=s3so
         )
@@ -258,7 +258,7 @@ class TestS3:
     def test_write_s3_parquet_fails(self, tips_df, s3so):
         # GH 27679
         # Attempting to write to an invalid S3 path should raise
-        pytest.importorskip("pyarrow")
+        td.versioned_importorskip("pyarrow")
         import botocore
 
         # GH 34087
@@ -318,7 +318,7 @@ class TestS3:
         self, s3_public_bucket_with_data, feather_file, s3so
     ):
         # GH 29055
-        pytest.importorskip("pyarrow")
+        td.versioned_importorskip("pyarrow")
         expected = read_feather(feather_file)
         res = read_feather(
             f"s3://{s3_public_bucket_with_data.name}/simple_dataset.feather",
index dbd474c6ae0b994911316517277f9c60d74bf862..08387c4e17027b19f2ad66c9e5769ae34c36ec43 100644 (file)
@@ -17,6 +17,7 @@ from typing import TYPE_CHECKING
 import numpy as np
 import pytest
 
+import pandas.util._test_decorators as td
 from pandas.errors import (
     ParserError,
     ParserWarning,
@@ -167,7 +168,7 @@ def test_decompression_regex_sep(python_parser_only, csv1, compression, klass):
     data = data.replace(b",", b"::")
     expected = parser.read_csv(csv1)
 
-    module = pytest.importorskip(compression)
+    module = td.versioned_importorskip(compression)
     klass = getattr(module, klass)
 
     with tm.ensure_clean() as path:
index bed2b5e10a6f79cd3393be9859d652720800aadd..3606320bc1df21c34721f228e2652e8ce661d62a 100644 (file)
@@ -14,6 +14,7 @@ from pathlib import Path
 import numpy as np
 import pytest
 
+import pandas.util._test_decorators as td
 from pandas.errors import EmptyDataError
 
 import pandas as pd
@@ -972,13 +973,13 @@ def test_dtype_backend(string_storage, dtype_backend):
         arr = StringArray(np.array(["a", "b"], dtype=np.object_))
         arr_na = StringArray(np.array([pd.NA, "a"], dtype=np.object_))
     elif dtype_backend == "pyarrow":
-        pa = pytest.importorskip("pyarrow")
+        pa = td.versioned_importorskip("pyarrow")
         from pandas.arrays import ArrowExtensionArray
 
         arr = ArrowExtensionArray(pa.array(["a", "b"]))
         arr_na = ArrowExtensionArray(pa.array([None, "a"]))
     else:
-        pa = pytest.importorskip("pyarrow")
+        pa = td.versioned_importorskip("pyarrow")
         arr = ArrowStringArray(pa.array(["a", "b"]))
         arr_na = ArrowStringArray(pa.array([None, "a"]))
 
@@ -1002,7 +1003,7 @@ def test_dtype_backend(string_storage, dtype_backend):
         }
     )
     if dtype_backend == "pyarrow":
-        pa = pytest.importorskip("pyarrow")
+        pa = td.versioned_importorskip("pyarrow")
         from pandas.arrays import ArrowExtensionArray
 
         expected = DataFrame(
index bc4c4c2e24e9caf8d4ac118b5053fe03d97aafb0..5014a2546b4ee1c0235a98fc25d34bec0375b5fc 100644 (file)
@@ -1,6 +1,7 @@
 import numpy as np
 import pytest
 
+import pandas.util._test_decorators as td
 from pandas._libs.parsers import (
     _maybe_upcast,
     na_values,
@@ -87,7 +88,7 @@ def test_maybe_upcaste_all_nan():
 @pytest.mark.parametrize("val", [na_values[np.object_], "c"])
 def test_maybe_upcast_object(val, string_storage):
     # GH#36712
-    pa = pytest.importorskip("pyarrow")
+    pa = td.versioned_importorskip("pyarrow")
 
     with pd.option_context("mode.string_storage", string_storage):
         arr = np.array(["a", "b", val], dtype=np.object_)
index 62582b212eb387c94b095ca54029f971dc54e777..825ab1b9dac41a8bc30e6e3e14d8d931ba14b86e 100644 (file)
@@ -5,9 +5,10 @@ import tempfile
 
 import pytest
 
+import pandas.util._test_decorators as td
 from pandas.io.pytables import HDFStore
 
-tables = pytest.importorskip("tables")
+tables = td.versioned_importorskip("tables")
 # set these parameters so we don't have file sharing
 tables.parameters.MAX_NUMEXPR_THREADS = 1
 tables.parameters.MAX_BLOSC_THREADS = 1
index 3acfd8ef8c068025e09155a7bc850a8778aa7b59..1da112400f527f9b146cd5efd90eadd9e5fedf97 100644 (file)
@@ -29,7 +29,7 @@ is_crashing_arch=bool((platform.uname()[4].startswith('arm') or platform.uname()
 
 pytestmark = pytest.mark.single_cpu
 
-tables = pytest.importorskip("tables")
+tables = td.versioned_importorskip("tables")
 
 
 @pytest.mark.filterwarnings("ignore::tables.NaturalNameWarning")
index b07fb3ddd3ac829f5b90d6fd7226926aeed284e6..6bf427ea3ff7d0dc4a90bd7b89f455ddfedc5677 100644 (file)
@@ -1,9 +1,10 @@
 import pytest
 
+import pandas.util._test_decorators as td
 import pandas as pd
 import pandas._testing as tm
 
-tables = pytest.importorskip("tables")
+tables = td.versioned_importorskip("tables")
 
 
 @pytest.fixture
index 78f9a874f99c81a667db5ee2434dfb96ab5629a9..0f049482fff6cbebe9b84f19b77920892df36a0a 100644 (file)
@@ -401,7 +401,7 @@ def test_read_py2_hdf_file_in_py3(datapath):
 
 def test_read_infer_string(tmp_path, setup_path):
     # GH#54431
-    pytest.importorskip("pyarrow")
+    td.versioned_importorskip("pyarrow")
     df = DataFrame({"a": ["a", "b", None]})
     path = tmp_path / setup_path
     df.to_hdf(path, key="data", format="table")
index 4ba9787a5a6b9ec3dcfa60b64b0e43a8af1d1afc..d1e073ecac6fd286f9944c9c3d47e0a7b0c28ee5 100644 (file)
@@ -565,7 +565,7 @@ def test_round_trip_equals(tmp_path, setup_path):
 
 def test_infer_string_columns(tmp_path, setup_path):
     # GH#
-    pytest.importorskip("pyarrow")
+    td.versioned_importorskip("pyarrow")
     path = tmp_path / setup_path
     with pd.option_context("future.infer_string", True):
         df = DataFrame(1, columns=list("ABCD"), index=list(range(10))).set_index(
index 4172e12a640f8bb7004a16df555049cdcc2d0379..d3921d80ed94a76a7879a93c27ca321ae36bb1dd 100644 (file)
@@ -7,6 +7,7 @@ import time
 import numpy as np
 import pytest
 
+import pandas.util._test_decorators as td
 import pandas as pd
 from pandas import (
     DataFrame,
@@ -37,7 +38,7 @@ is_crashing_arch=bool((platform.uname()[4].startswith('arm') or platform.uname()
 
 pytestmark = pytest.mark.single_cpu
 
-tables = pytest.importorskip("tables")
+tables = td.versioned_importorskip("tables")
 
 
 def test_context(setup_path):
index 03622faa2b5a8f65d709c23cab23fd3680084cb4..d9ed6f246226aa8f80b4bc7bfcca47251d8c26fd 100644 (file)
@@ -1,6 +1,7 @@
 import numpy as np
 import pytest
 
+import pandas.util._test_decorators as td
 from pandas import (
     DataFrame,
     Series,
@@ -12,7 +13,7 @@ from pandas.io.pytables import (
     read_hdf,
 )
 
-pytest.importorskip("tables")
+td.versioned_importorskip("tables")
 
 
 class TestHDFStoreSubclass:
index 3c0208fcc74ec83f782e1fedf5e89b40fca3ed69..acfd96f92256bbe328defb378da3d5112493d0f0 100644 (file)
@@ -3,6 +3,7 @@ from textwrap import dedent
 import numpy as np
 import pytest
 
+import pandas.util._test_decorators as td
 from pandas.errors import (
     PyperclipException,
     PyperclipWindowsException,
@@ -353,14 +354,14 @@ class TestClipboard:
     ):
         # GH#50502
         if string_storage == "pyarrow" or dtype_backend == "pyarrow":
-            pa = pytest.importorskip("pyarrow")
+            pa = td.versioned_importorskip("pyarrow")
 
         if string_storage == "python":
             string_array = StringArray(np.array(["x", "y"], dtype=np.object_))
             string_array_na = StringArray(np.array(["x", NA], dtype=np.object_))
 
         elif dtype_backend == "pyarrow" and engine != "c":
-            pa = pytest.importorskip("pyarrow")
+            pa = td.versioned_importorskip("pyarrow")
             from pandas.arrays import ArrowExtensionArray
 
             string_array = ArrowExtensionArray(pa.array(["x", "y"]))
index 4b79ff7bdf643f932ba57a45ce5e655d4ef8cb9a..a1b1bff09bf3d25cf96263fe17c8a43b7038497d 100644 (file)
@@ -100,7 +100,7 @@ bar2,12,13,14,15
 
     def test_stringify_file_and_path_like(self):
         # GH 38125: do not stringify file objects that are also path-like
-        fsspec = pytest.importorskip("fsspec")
+        fsspec = td.versioned_importorskip("fsspec")
         with tm.ensure_clean() as path:
             with fsspec.open(f"file://{path}", mode="wb") as fsspec_obj:
                 assert fsspec_obj == icom.stringify_path(fsspec_obj)
@@ -153,7 +153,7 @@ Look,a snake,🐍"""
 
     # Test that pyarrow can handle a file opened with get_handle
     def test_get_handle_pyarrow_compat(self):
-        pa_csv = pytest.importorskip("pyarrow.csv")
+        pa_csv = td.versioned_importorskip("pyarrow.csv")
 
         # Test latin1, ucs-2, and ucs-4 chars
         data = """a,b,c
@@ -196,7 +196,7 @@ Look,a snake,🐍"""
         ],
     )
     def test_read_non_existent(self, reader, module, error_class, fn_ext):
-        pytest.importorskip(module)
+        td.versioned_importorskip(module)
 
         path = os.path.join(HERE, "data", "does_not_exist." + fn_ext)
         msg1 = rf"File (b')?.+does_not_exist\.{fn_ext}'? does not exist"
@@ -234,7 +234,7 @@ Look,a snake,🐍"""
     )
     # NOTE: Missing parent directory for pd.DataFrame.to_hdf is handled by PyTables
     def test_write_missing_parent_directory(self, method, module, error_class, fn_ext):
-        pytest.importorskip(module)
+        td.versioned_importorskip(module)
 
         dummy_frame = pd.DataFrame({"a": [1, 2, 3], "b": [2, 3, 4], "c": [3, 4, 5]})
 
@@ -264,7 +264,7 @@ Look,a snake,🐍"""
     def test_read_expands_user_home_dir(
         self, reader, module, error_class, fn_ext, monkeypatch
     ):
-        pytest.importorskip(module)
+        td.versioned_importorskip(module)
 
         path = os.path.join("~", "does_not_exist." + fn_ext)
         monkeypatch.setattr(icom, "_expand_user", lambda x: os.path.join("foo", x))
@@ -321,7 +321,7 @@ Look,a snake,🐍"""
         ],
     )
     def test_read_fspath_all(self, reader, module, path, datapath):
-        pytest.importorskip(module)
+        td.versioned_importorskip(module)
         path = datapath(*path)
 
         mypath = CustomFSPath(path)
@@ -349,13 +349,13 @@ Look,a snake,🐍"""
     )
     def test_write_fspath_all(self, writer_name, writer_kwargs, module):
         if writer_name in ["to_latex"]:  # uses Styler implementation
-            pytest.importorskip("jinja2")
+            td.versioned_importorskip("jinja2")
         p1 = tm.ensure_clean("string")
         p2 = tm.ensure_clean("fspath")
         df = pd.DataFrame({"A": [1, 2]})
 
         with p1 as string, p2 as fspath:
-            pytest.importorskip(module)
+            td.versioned_importorskip(module)
             mypath = CustomFSPath(fspath)
             writer = getattr(df, writer_name)
 
@@ -377,7 +377,7 @@ Look,a snake,🐍"""
         # Same test as write_fspath_all, except HDF5 files aren't
         # necessarily byte-for-byte identical for a given dataframe, so we'll
         # have to read and compare equality
-        pytest.importorskip("tables")
+        td.versioned_importorskip("tables")
 
         df = pd.DataFrame({"A": [1, 2]})
         p1 = tm.ensure_clean("string")
index 22a7d3b83a459a5dc48ee5d56c2f70130d644be4..d4e86756efa73c10276d266d0f9df668b0b424b5 100644 (file)
@@ -2,6 +2,7 @@
 import numpy as np
 import pytest
 
+import pandas.util._test_decorators as td
 import pandas as pd
 import pandas._testing as tm
 from pandas.core.arrays import (
@@ -15,7 +16,7 @@ pytestmark = pytest.mark.filterwarnings(
     "ignore:Passing a BlockManager to DataFrame:DeprecationWarning"
 )
 
-pa = pytest.importorskip("pyarrow")
+pa = td.versioned_importorskip("pyarrow")
 
 
 @pytest.mark.single_cpu
index a1dec8a2d05b4fc4c39cbc910544532bf4eb0cca..fce08511637b63da3ced084fbe14b024ac9eeb51 100644 (file)
@@ -25,7 +25,7 @@ pytestmark = pytest.mark.filterwarnings(
 
 @pytest.fixture
 def fsspectest():
-    pytest.importorskip("fsspec")
+    td.versioned_importorskip("fsspec")
     from fsspec import register_implementation
     from fsspec.implementations.memory import MemoryFileSystem
     from fsspec.registry import _registry as registry
@@ -59,7 +59,7 @@ def df1():
 
 @pytest.fixture
 def cleared_fs():
-    fsspec = pytest.importorskip("fsspec")
+    fsspec = td.versioned_importorskip("fsspec")
 
     memfs = fsspec.filesystem("memory")
     yield memfs
@@ -99,7 +99,7 @@ def test_to_csv(cleared_fs, df1):
 
 
 def test_to_excel(cleared_fs, df1):
-    pytest.importorskip("openpyxl")
+    td.versioned_importorskip("openpyxl")
     ext = "xlsx"
     path = f"memory://test/test.{ext}"
     df1.to_excel(path, index=True)
@@ -111,7 +111,7 @@ def test_to_excel(cleared_fs, df1):
 
 @pytest.mark.parametrize("binary_mode", [False, True])
 def test_to_csv_fsspec_object(cleared_fs, binary_mode, df1):
-    fsspec = pytest.importorskip("fsspec")
+    fsspec = td.versioned_importorskip("fsspec")
 
     path = "memory://test/test.csv"
     mode = "wb" if binary_mode else "w"
@@ -153,7 +153,7 @@ def test_read_table_options(fsspectest):
 
 
 def test_excel_options(fsspectest):
-    pytest.importorskip("openpyxl")
+    td.versioned_importorskip("openpyxl")
     extension = "xlsx"
 
     df = DataFrame({"a": [0]})
@@ -168,7 +168,7 @@ def test_excel_options(fsspectest):
 
 def test_to_parquet_new_file(cleared_fs, df1):
     """Regression test for writing to a not-yet-existent GCS Parquet file."""
-    pytest.importorskip("fastparquet")
+    td.versioned_importorskip("fastparquet")
 
     df1.to_parquet(
         "memory://test/test.csv", index=True, engine="fastparquet", compression=None
@@ -177,7 +177,7 @@ def test_to_parquet_new_file(cleared_fs, df1):
 
 def test_arrowparquet_options(fsspectest):
     """Regression test for writing to a not-yet-existent GCS Parquet file."""
-    pytest.importorskip("pyarrow")
+    td.versioned_importorskip("pyarrow")
     df = DataFrame({"a": [0]})
     df.to_parquet(
         "testmem://test/test.csv",
@@ -197,7 +197,7 @@ def test_arrowparquet_options(fsspectest):
 @td.skip_array_manager_not_yet_implemented  # TODO(ArrayManager) fastparquet
 def test_fastparquet_options(fsspectest):
     """Regression test for writing to a not-yet-existent GCS Parquet file."""
-    pytest.importorskip("fastparquet")
+    td.versioned_importorskip("fastparquet")
 
     df = DataFrame({"a": [0]})
     df.to_parquet(
@@ -217,7 +217,7 @@ def test_fastparquet_options(fsspectest):
 
 @pytest.mark.single_cpu
 def test_from_s3_csv(s3_public_bucket_with_data, tips_file, s3so):
-    pytest.importorskip("s3fs")
+    td.versioned_importorskip("s3fs")
     tm.assert_equal(
         read_csv(
             f"s3://{s3_public_bucket_with_data.name}/tips.csv", storage_options=s3so
@@ -242,7 +242,7 @@ def test_from_s3_csv(s3_public_bucket_with_data, tips_file, s3so):
 @pytest.mark.single_cpu
 @pytest.mark.parametrize("protocol", ["s3", "s3a", "s3n"])
 def test_s3_protocols(s3_public_bucket_with_data, tips_file, protocol, s3so):
-    pytest.importorskip("s3fs")
+    td.versioned_importorskip("s3fs")
     tm.assert_equal(
         read_csv(
             f"{protocol}://{s3_public_bucket_with_data.name}/tips.csv",
@@ -255,8 +255,8 @@ def test_s3_protocols(s3_public_bucket_with_data, tips_file, protocol, s3so):
 @pytest.mark.single_cpu
 @td.skip_array_manager_not_yet_implemented  # TODO(ArrayManager) fastparquet
 def test_s3_parquet(s3_public_bucket, s3so, df1):
-    pytest.importorskip("fastparquet")
-    pytest.importorskip("s3fs")
+    td.versioned_importorskip("fastparquet")
+    td.versioned_importorskip("s3fs")
 
     fn = f"s3://{s3_public_bucket.name}/test.parquet"
     df1.to_parquet(
@@ -274,7 +274,7 @@ def test_not_present_exception():
 
 
 def test_feather_options(fsspectest):
-    pytest.importorskip("pyarrow")
+    td.versioned_importorskip("pyarrow")
     df = DataFrame({"a": [0]})
     df.to_feather("testmem://mockfile", storage_options={"test": "feather_write"})
     assert fsspectest.test[0] == "feather_write"
@@ -321,7 +321,7 @@ def test_stata_options(fsspectest):
 
 
 def test_markdown_options(fsspectest):
-    pytest.importorskip("tabulate")
+    td.versioned_importorskip("tabulate")
     df = DataFrame({"a": [0]})
     df.to_markdown("testmem://mockfile", storage_options={"test": "md_write"})
     assert fsspectest.test[0] == "md_write"
@@ -329,7 +329,7 @@ def test_markdown_options(fsspectest):
 
 
 def test_non_fsspec_options():
-    pytest.importorskip("pyarrow")
+    td.versioned_importorskip("pyarrow")
     with pytest.raises(ValueError, match="storage_options"):
         read_csv("localfile", storage_options={"a": True})
     with pytest.raises(ValueError, match="storage_options"):
index 4b337b5b82052f76580da8de1b64b70fd06f4617..33e2b49d22d70cb191c4f2d2642fad9b9d98a36d 100644 (file)
@@ -29,8 +29,8 @@ pytestmark = pytest.mark.filterwarnings(
 @pytest.fixture
 def gcs_buffer():
     """Emulate GCS using a binary buffer."""
-    pytest.importorskip("gcsfs")
-    fsspec = pytest.importorskip("fsspec")
+    td.versioned_importorskip("gcsfs")
+    fsspec = td.versioned_importorskip("fsspec")
 
     gcs_buffer = BytesIO()
     gcs_buffer.close = lambda: True
@@ -83,8 +83,8 @@ def test_to_read_gcs(gcs_buffer, format, monkeypatch, capsys, request):
         df1.to_json(path)
         df2 = read_json(path, convert_dates=["dt"])
     elif format == "parquet":
-        pytest.importorskip("pyarrow")
-        pa_fs = pytest.importorskip("pyarrow.fs")
+        td.versioned_importorskip("pyarrow")
+        pa_fs = td.versioned_importorskip("pyarrow.fs")
 
         class MockFileSystem(pa_fs.FileSystem):
             @staticmethod
@@ -107,7 +107,7 @@ def test_to_read_gcs(gcs_buffer, format, monkeypatch, capsys, request):
         captured = capsys.readouterr()
         assert captured.out == "Using pyarrow filesystem\nUsing pyarrow filesystem\n"
     elif format == "markdown":
-        pytest.importorskip("tabulate")
+        td.versioned_importorskip("tabulate")
         df1.to_markdown(path)
         df2 = df1
 
@@ -196,8 +196,8 @@ def test_to_csv_compression_encoding_gcs(
 
 def test_to_parquet_gcs_new_file(monkeypatch, tmpdir):
     """Regression test for writing to a not-yet-existent GCS Parquet file."""
-    pytest.importorskip("fastparquet")
-    pytest.importorskip("gcsfs")
+    td.versioned_importorskip("fastparquet")
+    td.versioned_importorskip("gcsfs")
 
     from fsspec import AbstractFileSystem
 
index 607357e709b6ec94225c8ff266219abdb763e085..3f8a982bb754fb4daf904662f6718d94f4306551 100644 (file)
@@ -71,8 +71,8 @@ def assert_framelist_equal(list1, list2, *args, **kwargs):
 
 
 def test_bs4_version_fails(monkeypatch, datapath):
-    bs4 = pytest.importorskip("bs4")
-    pytest.importorskip("html5lib")
+    bs4 = td.versioned_importorskip("bs4")
+    td.versioned_importorskip("html5lib")
 
     monkeypatch.setattr(bs4, "__version__", "4.2")
     with pytest.raises(ImportError, match="Pandas requires version"):
@@ -89,9 +89,9 @@ def test_invalid_flavor():
 
 
 def test_same_ordering(datapath):
-    pytest.importorskip("bs4")
-    pytest.importorskip("lxml")
-    pytest.importorskip("html5lib")
+    td.versioned_importorskip("bs4")
+    td.versioned_importorskip("lxml")
+    td.versioned_importorskip("html5lib")
 
     filename = datapath("io", "data", "html", "valid_markup.html")
     dfs_lxml = read_html(filename, index_col=0, flavor=["lxml"])
@@ -184,13 +184,13 @@ class TestReadHtml:
             string_array = StringArray(np.array(["a", "b", "c"], dtype=np.object_))
             string_array_na = StringArray(np.array(["a", "b", NA], dtype=np.object_))
         elif dtype_backend == "pyarrow":
-            pa = pytest.importorskip("pyarrow")
+            pa = td.versioned_importorskip("pyarrow")
             from pandas.arrays import ArrowExtensionArray
 
             string_array = ArrowExtensionArray(pa.array(["a", "b", "c"]))
             string_array_na = ArrowExtensionArray(pa.array(["a", "b", None]))
         else:
-            pa = pytest.importorskip("pyarrow")
+            pa = td.versioned_importorskip("pyarrow")
             string_array = ArrowStringArray(pa.array(["a", "b", "c"]))
             string_array_na = ArrowStringArray(pa.array(["a", "b", None]))
 
index 2ca11ad1f74e6381e389577e821d37d89cc689db..fe4dd24d45e6c6b8ccc09c84853fdb2c80cf2adb 100644 (file)
@@ -161,7 +161,7 @@ def test_to_parquet_to_disk_with_storage_options(engine):
         "Auth": "other_custom",
     }
 
-    pytest.importorskip(engine)
+    td.versioned_importorskip(engine)
 
     true_df = pd.DataFrame({"column_name": ["column_value"]})
     msg = (
index a4021311fc963a41633ebec2680c7f6d79525044..df5503763891fe2e830c4065f94087ed3d8559f2 100644 (file)
@@ -8,12 +8,13 @@ import pathlib
 import numpy as np
 import pytest
 
+import pandas.util._test_decorators as td
 import pandas as pd
 from pandas import read_orc
 import pandas._testing as tm
 from pandas.core.arrays import StringArray
 
-pytest.importorskip("pyarrow.orc")
+td.versioned_importorskip("pyarrow.orc")
 
 import pyarrow as pa
 
@@ -248,7 +249,7 @@ def test_orc_reader_snappy_compressed(dirpath):
 def test_orc_roundtrip_file(dirpath):
     # GH44554
     # PyArrow gained ORC write support with the current argument order
-    pytest.importorskip("pyarrow")
+    td.versioned_importorskip("pyarrow")
 
     data = {
         "boolean1": np.array([False, True], dtype="bool"),
@@ -273,7 +274,7 @@ def test_orc_roundtrip_file(dirpath):
 def test_orc_roundtrip_bytesio():
     # GH44554
     # PyArrow gained ORC write support with the current argument order
-    pytest.importorskip("pyarrow")
+    td.versioned_importorskip("pyarrow")
 
     data = {
         "boolean1": np.array([False, True], dtype="bool"),
@@ -297,7 +298,7 @@ def test_orc_roundtrip_bytesio():
 def test_orc_writer_dtypes_not_supported(orc_writer_dtypes_not_supported):
     # GH44554
     # PyArrow gained ORC write support with the current argument order
-    pytest.importorskip("pyarrow")
+    td.versioned_importorskip("pyarrow")
 
     msg = "The dtype of one or more columns is not supported yet."
     with pytest.raises(NotImplementedError, match=msg):
@@ -305,7 +306,7 @@ def test_orc_writer_dtypes_not_supported(orc_writer_dtypes_not_supported):
 
 
 def test_orc_dtype_backend_pyarrow():
-    pytest.importorskip("pyarrow")
+    td.versioned_importorskip("pyarrow")
     df = pd.DataFrame(
         {
             "string": list("abc"),
@@ -341,7 +342,7 @@ def test_orc_dtype_backend_pyarrow():
 
 def test_orc_dtype_backend_numpy_nullable():
     # GH#50503
-    pytest.importorskip("pyarrow")
+    td.versioned_importorskip("pyarrow")
     df = pd.DataFrame(
         {
             "string": list("abc"),
index 760a64c8d4c33d6e1f48460cd99cdb00e030a9b1..3fbd55a732322166e38610e7a6e80622f6e0598a 100644 (file)
@@ -8,6 +8,7 @@ import pathlib
 import numpy as np
 import pytest
 
+import pandas.util._test_decorators as td
 from pandas._config import using_copy_on_write
 from pandas._config.config import _get_option
 
@@ -389,7 +390,7 @@ class Base:
     @pytest.mark.single_cpu
     def test_parquet_read_from_url(self, httpserver, datapath, df_compat, engine):
         if engine != "auto":
-            pytest.importorskip(engine)
+            td.versioned_importorskip(engine)
         with open(datapath("io", "data", "parquet", "simple.parquet"), mode="rb") as f:
             httpserver.serve_content(content=f.read())
             df = read_parquet(httpserver.url)
@@ -611,7 +612,7 @@ class TestBasic(Base):
             check_round_trip(df, engine)
 
     def test_dtype_backend(self, engine, request):
-        pq = pytest.importorskip("pyarrow.parquet")
+        pq = td.versioned_importorskip("pyarrow.parquet")
 
         if engine == "fastparquet":
             # We are manually disabling fastparquet's
@@ -799,7 +800,7 @@ class TestParquetPyArrow(Base):
 
     @pytest.mark.single_cpu
     def test_s3_roundtrip_explicit_fs(self, df_compat, s3_public_bucket, pa, s3so):
-        s3fs = pytest.importorskip("s3fs")
+        s3fs = td.versioned_importorskip("s3fs")
         s3 = s3fs.S3FileSystem(**s3so)
         kw = {"filesystem": s3}
         check_round_trip(
@@ -833,7 +834,7 @@ class TestParquetPyArrow(Base):
     def test_s3_roundtrip_for_dir(
         self, df_compat, s3_public_bucket, pa, partition_col, s3so
     ):
-        pytest.importorskip("s3fs")
+        td.versioned_importorskip("s3fs")
         # GH #26388
         expected_df = df_compat.copy()
 
@@ -862,14 +863,14 @@ class TestParquetPyArrow(Base):
         )
 
     def test_read_file_like_obj_support(self, df_compat):
-        pytest.importorskip("pyarrow")
+        td.versioned_importorskip("pyarrow")
         buffer = BytesIO()
         df_compat.to_parquet(buffer)
         df_from_buf = read_parquet(buffer)
         tm.assert_frame_equal(df_compat, df_from_buf)
 
     def test_expand_user(self, df_compat, monkeypatch):
-        pytest.importorskip("pyarrow")
+        td.versioned_importorskip("pyarrow")
         monkeypatch.setenv("HOME", "TestingUser")
         monkeypatch.setenv("USERPROFILE", "TestingUser")
         with pytest.raises(OSError, match=r".*TestingUser.*"):
@@ -924,7 +925,7 @@ class TestParquetPyArrow(Base):
     def test_additional_extension_arrays(self, pa):
         # test additional ExtensionArrays that are supported through the
         # __arrow_array__ protocol
-        pytest.importorskip("pyarrow")
+        td.versioned_importorskip("pyarrow")
         df = pd.DataFrame(
             {
                 "a": pd.Series([1, 2, 3], dtype="Int64"),
@@ -939,7 +940,7 @@ class TestParquetPyArrow(Base):
 
     def test_pyarrow_backed_string_array(self, pa, string_storage):
         # test ArrowStringArray supported through the __arrow_array__ protocol
-        pytest.importorskip("pyarrow")
+        td.versioned_importorskip("pyarrow")
         df = pd.DataFrame({"a": pd.Series(["a", None, "c"], dtype="string[pyarrow]")})
         with pd.option_context("string_storage", string_storage):
             check_round_trip(df, pa, expected=df.astype(f"string[{string_storage}]"))
@@ -947,7 +948,7 @@ class TestParquetPyArrow(Base):
     def test_additional_extension_types(self, pa):
         # test additional ExtensionArrays that are supported through the
         # __arrow_array__ protocol + by defining a custom ExtensionType
-        pytest.importorskip("pyarrow")
+        td.versioned_importorskip("pyarrow")
         df = pd.DataFrame(
             {
                 "c": pd.IntervalIndex.from_tuples([(0, 1), (1, 2), (3, 4)]),
@@ -992,7 +993,7 @@ class TestParquetPyArrow(Base):
 
     def test_filter_row_groups(self, pa):
         # https://github.com/pandas-dev/pandas/issues/26551
-        pytest.importorskip("pyarrow")
+        td.versioned_importorskip("pyarrow")
         df = pd.DataFrame({"a": list(range(3))})
         with tm.ensure_clean() as path:
             df.to_parquet(path, engine=pa)
@@ -1349,7 +1350,7 @@ class TestParquetFastParquet(Base):
         tm.assert_frame_equal(result, df)
 
     def test_filesystem_notimplemented(self):
-        pytest.importorskip("fastparquet")
+        td.versioned_importorskip("fastparquet")
         df = pd.DataFrame(data={"A": [0, 1], "B": [1, 0]})
         with tm.ensure_clean() as path:
             with pytest.raises(
@@ -1365,7 +1366,7 @@ class TestParquetFastParquet(Base):
                 read_parquet(path, engine="fastparquet", filesystem="foo")
 
     def test_invalid_filesystem(self):
-        pytest.importorskip("pyarrow")
+        td.versioned_importorskip("pyarrow")
         df = pd.DataFrame(data={"A": [0, 1], "B": [1, 0]})
         with tm.ensure_clean() as path:
             with pytest.raises(
@@ -1381,7 +1382,7 @@ class TestParquetFastParquet(Base):
                 read_parquet(path, engine="pyarrow", filesystem="foo")
 
     def test_unsupported_pa_filesystem_storage_options(self):
-        pa_fs = pytest.importorskip("pyarrow.fs")
+        pa_fs = td.versioned_importorskip("pyarrow.fs")
         df = pd.DataFrame(data={"A": [0, 1], "B": [1, 0]})
         with tm.ensure_clean() as path:
             with pytest.raises(
index 2347fad8e12a97959a019a00852d5302026e9732..e4b28cdc43d9043f222c8c9198487941d5d605f9 100644 (file)
@@ -499,7 +499,7 @@ def test_pickle_generalurl_read(monkeypatch, mockurl):
 
 
 def test_pickle_fsspec_roundtrip():
-    pytest.importorskip("fsspec")
+    td.versioned_importorskip("fsspec")
     with tm.ensure_clean():
         mockurl = "memory://mockfile"
         df = DataFrame(
index 79473895b662da6af68fbe29a60eb05f134a54df..4e8113f17f864f8fec4258632c602bd1e83cc839 100644 (file)
@@ -2,13 +2,14 @@ from io import BytesIO
 
 import pytest
 
+import pandas.util._test_decorators as td
 from pandas import read_csv
 
 
 def test_streaming_s3_objects():
     # GH17135
     # botocore gained iteration support in 1.10.47, can now be used in read_*
-    pytest.importorskip("botocore", minversion="1.10.47")
+    td.versioned_importorskip("botocore", min_version="1.10.47")
     from botocore.response import StreamingBody
 
     data = [b"foo,bar,baz\n1,2,3\n4,5,6\n", b"just,the,header\n"]
@@ -20,7 +21,7 @@ def test_streaming_s3_objects():
 @pytest.mark.single_cpu
 def test_read_without_creds_from_pub_bucket(s3_public_bucket_with_data, s3so):
     # GH 34626
-    pytest.importorskip("s3fs")
+    td.versioned_importorskip("s3fs")
     result = read_csv(
         f"s3://{s3_public_bucket_with_data.name}/tips.csv",
         nrows=3,
@@ -33,7 +34,7 @@ def test_read_without_creds_from_pub_bucket(s3_public_bucket_with_data, s3so):
 def test_read_with_creds_from_pub_bucket(s3_public_bucket_with_data, s3so):
     # Ensure we can read from a public bucket with credentials
     # GH 34626
-    pytest.importorskip("s3fs")
+    td.versioned_importorskip("s3fs")
     df = read_csv(
         f"s3://{s3_public_bucket_with_data.name}/tips.csv",
         nrows=5,
index e118c90d9bc02041719cd1452b5af8e77b12db77..d40128192a64f3626c25769d1d0bf6b817516902 100644 (file)
@@ -4,11 +4,12 @@ from pathlib import Path
 import numpy as np
 import pytest
 
+import pandas.util._test_decorators as td
 import pandas as pd
 import pandas._testing as tm
 from pandas.util.version import Version
 
-pyreadstat = pytest.importorskip("pyreadstat")
+pyreadstat = td.versioned_importorskip("pyreadstat")
 
 
 # TODO(CoW) - detection of chained assignment in cython
@@ -101,7 +102,7 @@ def test_spss_umlauts_dtype_backend(datapath, dtype_backend):
     expected = pd.DataFrame({"var1": [1.0, 2.0, 1.0, 3.0]}, dtype="Int64")
 
     if dtype_backend == "pyarrow":
-        pa = pytest.importorskip("pyarrow")
+        pa = td.versioned_importorskip("pyarrow")
 
         from pandas.arrays import ArrowExtensionArray
 
index 7068247bbfa8bcab937736e8a93b7299c1ba17d6..9619aafc115afc19371c3397d10a975d6de1ab4a 100644 (file)
@@ -601,8 +601,8 @@ def drop_view(
 
 @pytest.fixture
 def mysql_pymysql_engine():
-    sqlalchemy = pytest.importorskip("sqlalchemy")
-    pymysql = pytest.importorskip("pymysql")
+    sqlalchemy = td.versioned_importorskip("sqlalchemy")
+    pymysql = td.versioned_importorskip("pymysql")
     engine = sqlalchemy.create_engine(
         "mysql+pymysql://root@localhost:3306/pandas",
         connect_args={"client_flag": pymysql.constants.CLIENT.MULTI_STATEMENTS},
@@ -649,8 +649,8 @@ def mysql_pymysql_conn_types(mysql_pymysql_engine_types):
 
 @pytest.fixture
 def postgresql_psycopg2_engine():
-    sqlalchemy = pytest.importorskip("sqlalchemy")
-    pytest.importorskip("psycopg2")
+    sqlalchemy = td.versioned_importorskip("sqlalchemy")
+    td.versioned_importorskip("psycopg2")
     engine = sqlalchemy.create_engine(
         "postgresql+psycopg2://postgres:postgres@localhost:5432/pandas",
         poolclass=sqlalchemy.pool.NullPool,
@@ -684,7 +684,7 @@ def postgresql_psycopg2_conn(postgresql_psycopg2_engine):
 
 @pytest.fixture
 def postgresql_adbc_conn():
-    pytest.importorskip("adbc_driver_postgresql")
+    td.versioned_importorskip("adbc_driver_postgresql")
     from adbc_driver_postgresql import dbapi
 
     uri = "postgresql://postgres:postgres@localhost:5432/pandas"
@@ -747,14 +747,14 @@ def postgresql_psycopg2_conn_types(postgresql_psycopg2_engine_types):
 
 @pytest.fixture
 def sqlite_str():
-    pytest.importorskip("sqlalchemy")
+    td.versioned_importorskip("sqlalchemy")
     with tm.ensure_clean() as name:
         yield f"sqlite:///{name}"
 
 
 @pytest.fixture
 def sqlite_engine(sqlite_str):
-    sqlalchemy = pytest.importorskip("sqlalchemy")
+    sqlalchemy = td.versioned_importorskip("sqlalchemy")
     engine = sqlalchemy.create_engine(sqlite_str, poolclass=sqlalchemy.pool.NullPool)
     yield engine
     for view in get_all_views(engine):
@@ -772,7 +772,7 @@ def sqlite_conn(sqlite_engine):
 
 @pytest.fixture
 def sqlite_str_iris(sqlite_str, iris_path):
-    sqlalchemy = pytest.importorskip("sqlalchemy")
+    sqlalchemy = td.versioned_importorskip("sqlalchemy")
     engine = sqlalchemy.create_engine(sqlite_str)
     create_and_load_iris(engine, iris_path)
     create_and_load_iris_view(engine)
@@ -795,7 +795,7 @@ def sqlite_conn_iris(sqlite_engine_iris):
 
 @pytest.fixture
 def sqlite_str_types(sqlite_str, types_data):
-    sqlalchemy = pytest.importorskip("sqlalchemy")
+    sqlalchemy = td.versioned_importorskip("sqlalchemy")
     engine = sqlalchemy.create_engine(sqlite_str)
     create_and_load_types(engine, types_data, "sqlite")
     engine.dispose()
@@ -816,7 +816,7 @@ def sqlite_conn_types(sqlite_engine_types):
 
 @pytest.fixture
 def sqlite_adbc_conn():
-    pytest.importorskip("adbc_driver_sqlite")
+    td.versioned_importorskip("adbc_driver_sqlite")
     from adbc_driver_sqlite import dbapi
 
     with tm.ensure_clean() as name:
@@ -1001,7 +1001,7 @@ def test_dataframe_to_sql_empty(conn, test_frame1, request):
 @pytest.mark.parametrize("conn", all_connectable)
 def test_dataframe_to_sql_arrow_dtypes(conn, request):
     # GH 52046
-    pytest.importorskip("pyarrow")
+    td.versioned_importorskip("pyarrow")
     df = DataFrame(
         {
             "int": pd.array([1], dtype="int8[pyarrow]"),
@@ -1035,7 +1035,7 @@ def test_dataframe_to_sql_arrow_dtypes(conn, request):
 @pytest.mark.parametrize("conn", all_connectable)
 def test_dataframe_to_sql_arrow_dtypes_missing(conn, request, nulls_fixture):
     # GH 52046
-    pytest.importorskip("pyarrow")
+    td.versioned_importorskip("pyarrow")
     df = DataFrame(
         {
             "datetime": pd.array(
@@ -2515,7 +2515,7 @@ def test_sqlalchemy_integer_overload_mapping(conn, request, integer):
 
 @pytest.mark.parametrize("conn", all_connectable)
 def test_database_uri_string(conn, request, test_frame1):
-    pytest.importorskip("sqlalchemy")
+    td.versioned_importorskip("sqlalchemy")
     conn = request.getfixturevalue(conn)
     # Test read_sql and .to_sql method with a database URI (GH10654)
     # db_uri = 'sqlite:///:memory:' # raises
@@ -2537,7 +2537,7 @@ def test_database_uri_string(conn, request, test_frame1):
 @td.skip_if_installed("pg8000")
 @pytest.mark.parametrize("conn", all_connectable)
 def test_pg8000_sqlalchemy_passthrough_error(conn, request):
-    pytest.importorskip("sqlalchemy")
+    td.versioned_importorskip("sqlalchemy")
     conn = request.getfixturevalue(conn)
     # using driver that will not be installed on CI to trigger error
     # in sqlalchemy.create_engine -> test passing of this error to user
@@ -3414,7 +3414,7 @@ def test_to_sql_with_negative_npinf(conn, request, input):
         # The input {"foo": [-np.inf], "infe0": ["bar"]} does not raise any error
         # for pymysql version >= 0.10
         # TODO(GH#36465): remove this version check after GH 36465 is fixed
-        pymysql = pytest.importorskip("pymysql")
+        pymysql = td.versioned_importorskip("pymysql")
 
         if Version(pymysql.__version__) < Version("1.0.3") and "infe0" in df.columns:
             mark = pytest.mark.xfail(reason="GH 36465")
@@ -3529,7 +3529,7 @@ def test_options_auto(conn, request, test_frame1):
 
 
 def test_options_get_engine():
-    pytest.importorskip("sqlalchemy")
+    td.versioned_importorskip("sqlalchemy")
     assert isinstance(get_engine("sqlalchemy"), SQLAlchemyEngine)
 
     with pd.option_context("io.sql.engine", "sqlalchemy"):
@@ -3681,14 +3681,14 @@ def dtype_backend_expected():
             string_array_na = StringArray(np.array(["a", "b", pd.NA], dtype=np.object_))
 
         elif dtype_backend == "pyarrow":
-            pa = pytest.importorskip("pyarrow")
+            pa = td.versioned_importorskip("pyarrow")
             from pandas.arrays import ArrowExtensionArray
 
             string_array = ArrowExtensionArray(pa.array(["a", "b", "c"]))  # type: ignore[assignment]
             string_array_na = ArrowExtensionArray(pa.array(["a", "b", None]))  # type: ignore[assignment]
 
         else:
-            pa = pytest.importorskip("pyarrow")
+            pa = td.versioned_importorskip("pyarrow")
             string_array = ArrowStringArray(pa.array(["a", "b", "c"]))
             string_array_na = ArrowStringArray(pa.array(["a", "b", None]))
 
@@ -3705,7 +3705,7 @@ def dtype_backend_expected():
             }
         )
         if dtype_backend == "pyarrow":
-            pa = pytest.importorskip("pyarrow")
+            pa = td.versioned_importorskip("pyarrow")
 
             from pandas.arrays import ArrowExtensionArray
 
@@ -3850,7 +3850,7 @@ def test_row_object_is_named_tuple(sqlite_engine):
 def test_read_sql_string_inference(sqlite_engine):
     conn = sqlite_engine
     # GH#54430
-    pytest.importorskip("pyarrow")
+    td.versioned_importorskip("pyarrow")
     table = "test"
     df = DataFrame({"a": ["x", "y"]})
     df.to_sql(table, con=conn, index=False, if_exists="replace")
index 43febd41d9d92c809faf5a575e854d6f6b048681..bef0df6225f4d44aa941c8dee60fe13594ec6d8a 100644 (file)
@@ -2045,11 +2045,11 @@ def test_compression(compression, version, use_dict, infer, compression_to_exten
             with bz2.open(path, "rb") as comp:
                 fp = io.BytesIO(comp.read())
         elif compression == "zstd":
-            zstd = pytest.importorskip("zstandard")
+            zstd = td.versioned_importorskip("zstandard")
             with zstd.open(path, "rb") as comp:
                 fp = io.BytesIO(comp.read())
         elif compression == "xz":
-            lzma = pytest.importorskip("lzma")
+            lzma = td.versioned_importorskip("lzma")
             with lzma.open(path, "rb") as comp:
                 fp = io.BytesIO(comp.read())
         elif compression is None:
index 37251a58b0c119ef1da15c259e9e77a456b86ac9..69a7d85ea6b4cbbda2f7fb06d12d1134c56c11ff 100644 (file)
@@ -867,7 +867,7 @@ def test_encoding_option_str(xml_baby_names, parser):
 
 
 def test_correct_encoding_file(xml_baby_names):
-    pytest.importorskip("lxml")
+    td.versioned_importorskip("lxml")
     df_file = read_xml(xml_baby_names, encoding="ISO-8859-1", parser="lxml")
 
     with tm.ensure_clean("test.xml") as path:
@@ -876,7 +876,7 @@ def test_correct_encoding_file(xml_baby_names):
 
 @pytest.mark.parametrize("encoding", ["UTF-8", "UTF-16", "ISO-8859-1"])
 def test_wrong_encoding_option_lxml(xml_baby_names, parser, encoding):
-    pytest.importorskip("lxml")
+    td.versioned_importorskip("lxml")
     df_file = read_xml(xml_baby_names, encoding="ISO-8859-1", parser="lxml")
 
     with tm.ensure_clean("test.xml") as path:
@@ -892,7 +892,7 @@ def test_misspelled_encoding(parser, geom_df):
 
 
 def test_xml_declaration_pretty_print(geom_df):
-    pytest.importorskip("lxml")
+    td.versioned_importorskip("lxml")
     expected = """\
 <data>
   <row>
@@ -1005,7 +1005,7 @@ xsl_expected = """\
 
 
 def test_stylesheet_file_like(xsl_row_field_output, mode, geom_df):
-    pytest.importorskip("lxml")
+    td.versioned_importorskip("lxml")
     with open(
         xsl_row_field_output, mode, encoding="utf-8" if mode == "r" else None
     ) as f:
@@ -1015,7 +1015,7 @@ def test_stylesheet_file_like(xsl_row_field_output, mode, geom_df):
 def test_stylesheet_io(xsl_row_field_output, mode, geom_df):
     # note: By default the bodies of untyped functions are not checked,
     # consider using --check-untyped-defs
-    pytest.importorskip("lxml")
+    td.versioned_importorskip("lxml")
     xsl_obj: BytesIO | StringIO  # type: ignore[annotation-unchecked]
 
     with open(
@@ -1032,7 +1032,7 @@ def test_stylesheet_io(xsl_row_field_output, mode, geom_df):
 
 
 def test_stylesheet_buffered_reader(xsl_row_field_output, mode, geom_df):
-    pytest.importorskip("lxml")
+    td.versioned_importorskip("lxml")
     with open(
         xsl_row_field_output, mode, encoding="utf-8" if mode == "r" else None
     ) as f:
@@ -1044,7 +1044,7 @@ def test_stylesheet_buffered_reader(xsl_row_field_output, mode, geom_df):
 
 
 def test_stylesheet_wrong_path(geom_df):
-    lxml_etree = pytest.importorskip("lxml.etree")
+    lxml_etree = td.versioned_importorskip("lxml.etree")
 
     xsl = os.path.join("data", "xml", "row_field_output.xslt")
 
@@ -1057,7 +1057,7 @@ def test_stylesheet_wrong_path(geom_df):
 
 @pytest.mark.parametrize("val", ["", b""])
 def test_empty_string_stylesheet(val, geom_df):
-    lxml_etree = pytest.importorskip("lxml.etree")
+    lxml_etree = td.versioned_importorskip("lxml.etree")
 
     msg = "|".join(
         [
@@ -1073,7 +1073,7 @@ def test_empty_string_stylesheet(val, geom_df):
 
 
 def test_incorrect_xsl_syntax(geom_df):
-    lxml_etree = pytest.importorskip("lxml.etree")
+    lxml_etree = td.versioned_importorskip("lxml.etree")
 
     xsl = """\
 <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
@@ -1103,7 +1103,7 @@ def test_incorrect_xsl_syntax(geom_df):
 
 
 def test_incorrect_xsl_eval(geom_df):
-    lxml_etree = pytest.importorskip("lxml.etree")
+    lxml_etree = td.versioned_importorskip("lxml.etree")
 
     xsl = """\
 <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
@@ -1131,7 +1131,7 @@ def test_incorrect_xsl_eval(geom_df):
 
 
 def test_incorrect_xsl_apply(geom_df):
-    lxml_etree = pytest.importorskip("lxml.etree")
+    lxml_etree = td.versioned_importorskip("lxml.etree")
 
     xsl = """\
 <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
@@ -1169,7 +1169,7 @@ def test_stylesheet_with_etree(geom_df):
 
 
 def test_style_to_csv(geom_df):
-    pytest.importorskip("lxml")
+    td.versioned_importorskip("lxml")
     xsl = """\
 <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
     <xsl:output method="text" indent="yes" />
@@ -1198,7 +1198,7 @@ def test_style_to_csv(geom_df):
 
 
 def test_style_to_string(geom_df):
-    pytest.importorskip("lxml")
+    td.versioned_importorskip("lxml")
     xsl = """\
 <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
     <xsl:output method="text" indent="yes" />
@@ -1232,7 +1232,7 @@ def test_style_to_string(geom_df):
 
 
 def test_style_to_json(geom_df):
-    pytest.importorskip("lxml")
+    td.versioned_importorskip("lxml")
     xsl = """\
 <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
     <xsl:output method="text" indent="yes" />
@@ -1363,8 +1363,8 @@ def test_unsuported_compression(parser, geom_df):
 
 @pytest.mark.single_cpu
 def test_s3_permission_output(parser, s3_public_bucket, geom_df):
-    s3fs = pytest.importorskip("s3fs")
-    pytest.importorskip("lxml")
+    s3fs = td.versioned_importorskip("s3fs")
+    td.versioned_importorskip("lxml")
 
     with tm.external_error_raised((PermissionError, FileNotFoundError)):
         fs = s3fs.S3FileSystem(anon=True)
index e40b7a51009766cba56b1eb39bf81a9d822af921..dbd05e46e17a9b6b9b92732522cb11ff39298f01 100644 (file)
@@ -249,7 +249,7 @@ df_kml = DataFrame(
 
 def test_literal_xml_deprecation():
     # GH 53809
-    pytest.importorskip("lxml")
+    td.versioned_importorskip("lxml")
     msg = (
         "Passing literal xml to 'read_xml' is deprecated and "
         "will be removed in a future version. To read from a "
@@ -289,7 +289,7 @@ def read_xml_iterparse_comp(comp_path, compression_only, **kwargs):
 
 
 def test_parser_consistency_file(xml_books):
-    pytest.importorskip("lxml")
+    td.versioned_importorskip("lxml")
     df_file_lxml = read_xml(xml_books, parser="lxml")
     df_file_etree = read_xml(xml_books, parser="etree")
 
@@ -462,7 +462,7 @@ def test_file_handle_close(xml_books, parser):
 
 @pytest.mark.parametrize("val", ["", b""])
 def test_empty_string_lxml(val):
-    lxml_etree = pytest.importorskip("lxml.etree")
+    lxml_etree = td.versioned_importorskip("lxml.etree")
 
     msg = "|".join(
         [
@@ -505,7 +505,7 @@ def test_wrong_file_path(parser, datapath):
 @pytest.mark.network
 @pytest.mark.single_cpu
 def test_url(httpserver, xml_file):
-    pytest.importorskip("lxml")
+    td.versioned_importorskip("lxml")
     with open(xml_file, encoding="utf-8") as f:
         httpserver.serve_content(content=f.read())
         df_url = read_xml(httpserver.url, xpath=".//book[count(*)=4]")
@@ -587,7 +587,7 @@ def test_whitespace(parser):
 
 
 def test_empty_xpath_lxml(xml_books):
-    pytest.importorskip("lxml")
+    td.versioned_importorskip("lxml")
     with pytest.raises(ValueError, match=("xpath does not return any nodes")):
         read_xml(xml_books, xpath=".//python", parser="lxml")
 
@@ -600,7 +600,7 @@ def test_bad_xpath_etree(xml_books):
 
 
 def test_bad_xpath_lxml(xml_books):
-    lxml_etree = pytest.importorskip("lxml.etree")
+    lxml_etree = td.versioned_importorskip("lxml.etree")
 
     with pytest.raises(lxml_etree.XPathEvalError, match=("Invalid expression")):
         read_xml(xml_books, xpath=".//[book]", parser="lxml")
@@ -659,7 +659,7 @@ def test_prefix_namespace(parser):
 
 
 def test_consistency_default_namespace():
-    pytest.importorskip("lxml")
+    td.versioned_importorskip("lxml")
     df_lxml = read_xml(
         StringIO(xml_default_nmsp),
         xpath=".//ns:row",
@@ -678,7 +678,7 @@ def test_consistency_default_namespace():
 
 
 def test_consistency_prefix_namespace():
-    pytest.importorskip("lxml")
+    td.versioned_importorskip("lxml")
     df_lxml = read_xml(
         StringIO(xml_prefix_nmsp),
         xpath=".//doc:row",
@@ -710,7 +710,7 @@ def test_missing_prefix_definition_etree(kml_cta_rail_lines):
 
 
 def test_missing_prefix_definition_lxml(kml_cta_rail_lines):
-    lxml_etree = pytest.importorskip("lxml.etree")
+    lxml_etree = td.versioned_importorskip("lxml.etree")
 
     with pytest.raises(lxml_etree.XPathEvalError, match=("Undefined namespace prefix")):
         read_xml(kml_cta_rail_lines, xpath=".//kml:Placemark", parser="lxml")
@@ -718,7 +718,7 @@ def test_missing_prefix_definition_lxml(kml_cta_rail_lines):
 
 @pytest.mark.parametrize("key", ["", None])
 def test_none_namespace_prefix(key):
-    pytest.importorskip("lxml")
+    td.versioned_importorskip("lxml")
     with pytest.raises(
         TypeError, match=("empty namespace prefix is not supported in XPath")
     ):
@@ -831,7 +831,7 @@ def test_empty_elems_only(parser):
 
 
 def test_attribute_centric_xml():
-    pytest.importorskip("lxml")
+    td.versioned_importorskip("lxml")
     xml = """\
 <?xml version="1.0" encoding="UTF-8"?>
 <TrainSchedule>
@@ -1061,7 +1061,7 @@ def test_ascii_encoding(xml_baby_names, parser):
 
 
 def test_parser_consistency_with_encoding(xml_baby_names):
-    pytest.importorskip("lxml")
+    td.versioned_importorskip("lxml")
     df_xpath_lxml = read_xml(xml_baby_names, parser="lxml", encoding="ISO-8859-1")
     df_xpath_etree = read_xml(xml_baby_names, parser="etree", encoding="iso-8859-1")
 
@@ -1084,7 +1084,7 @@ def test_parser_consistency_with_encoding(xml_baby_names):
 
 
 def test_wrong_encoding_for_lxml():
-    pytest.importorskip("lxml")
+    td.versioned_importorskip("lxml")
     # GH#45133
     data = """<data>
   <row>
@@ -1131,7 +1131,7 @@ def test_wrong_parser(xml_books):
 
 
 def test_stylesheet_file(kml_cta_rail_lines, xsl_flatten_doc):
-    pytest.importorskip("lxml")
+    td.versioned_importorskip("lxml")
     df_style = read_xml(
         kml_cta_rail_lines,
         xpath=".//k:Placemark",
@@ -1158,7 +1158,7 @@ def test_stylesheet_file(kml_cta_rail_lines, xsl_flatten_doc):
 
 
 def test_stylesheet_file_like(kml_cta_rail_lines, xsl_flatten_doc, mode):
-    pytest.importorskip("lxml")
+    td.versioned_importorskip("lxml")
     with open(xsl_flatten_doc, mode, encoding="utf-8" if mode == "r" else None) as f:
         df_style = read_xml(
             kml_cta_rail_lines,
@@ -1173,7 +1173,7 @@ def test_stylesheet_file_like(kml_cta_rail_lines, xsl_flatten_doc, mode):
 def test_stylesheet_io(kml_cta_rail_lines, xsl_flatten_doc, mode):
     # note: By default the bodies of untyped functions are not checked,
     # consider using --check-untyped-defs
-    pytest.importorskip("lxml")
+    td.versioned_importorskip("lxml")
     xsl_obj: BytesIO | StringIO  # type: ignore[annotation-unchecked]
 
     with open(xsl_flatten_doc, mode, encoding="utf-8" if mode == "r" else None) as f:
@@ -1193,7 +1193,7 @@ def test_stylesheet_io(kml_cta_rail_lines, xsl_flatten_doc, mode):
 
 
 def test_stylesheet_buffered_reader(kml_cta_rail_lines, xsl_flatten_doc, mode):
-    pytest.importorskip("lxml")
+    td.versioned_importorskip("lxml")
     with open(xsl_flatten_doc, mode, encoding="utf-8" if mode == "r" else None) as f:
         xsl_obj = f.read()
 
@@ -1208,7 +1208,7 @@ def test_stylesheet_buffered_reader(kml_cta_rail_lines, xsl_flatten_doc, mode):
 
 
 def test_style_charset():
-    pytest.importorskip("lxml")
+    td.versioned_importorskip("lxml")
     xml = "<中文標籤><row><c1>1</c1><c2>2</c2></row></中文標籤>"
 
     xsl = """\
@@ -1237,7 +1237,7 @@ def test_style_charset():
 
 
 def test_not_stylesheet(kml_cta_rail_lines, xml_books):
-    lxml_etree = pytest.importorskip("lxml.etree")
+    lxml_etree = td.versioned_importorskip("lxml.etree")
 
     with pytest.raises(
         lxml_etree.XSLTParseError, match=("document is not a stylesheet")
@@ -1246,7 +1246,7 @@ def test_not_stylesheet(kml_cta_rail_lines, xml_books):
 
 
 def test_incorrect_xsl_syntax(kml_cta_rail_lines):
-    lxml_etree = pytest.importorskip("lxml.etree")
+    lxml_etree = td.versioned_importorskip("lxml.etree")
 
     xsl = """\
 <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
@@ -1275,7 +1275,7 @@ def test_incorrect_xsl_syntax(kml_cta_rail_lines):
 
 
 def test_incorrect_xsl_eval(kml_cta_rail_lines):
-    lxml_etree = pytest.importorskip("lxml.etree")
+    lxml_etree = td.versioned_importorskip("lxml.etree")
 
     xsl = """\
 <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
@@ -1302,7 +1302,7 @@ def test_incorrect_xsl_eval(kml_cta_rail_lines):
 
 
 def test_incorrect_xsl_apply(kml_cta_rail_lines):
-    lxml_etree = pytest.importorskip("lxml.etree")
+    lxml_etree = td.versioned_importorskip("lxml.etree")
 
     xsl = """\
 <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
@@ -1321,7 +1321,7 @@ def test_incorrect_xsl_apply(kml_cta_rail_lines):
 
 
 def test_wrong_stylesheet(kml_cta_rail_lines, xml_data_path):
-    xml_etree = pytest.importorskip("lxml.etree")
+    xml_etree = td.versioned_importorskip("lxml.etree")
 
     xsl = xml_data_path / "flatten.xsl"
 
@@ -1335,7 +1335,7 @@ def test_wrong_stylesheet(kml_cta_rail_lines, xml_data_path):
 def test_stylesheet_file_close(kml_cta_rail_lines, xsl_flatten_doc, mode):
     # note: By default the bodies of untyped functions are not checked,
     # consider using --check-untyped-defs
-    pytest.importorskip("lxml")
+    td.versioned_importorskip("lxml")
     xsl_obj: BytesIO | StringIO  # type: ignore[annotation-unchecked]
 
     with open(xsl_flatten_doc, mode, encoding="utf-8" if mode == "r" else None) as f:
@@ -1350,7 +1350,7 @@ def test_stylesheet_file_close(kml_cta_rail_lines, xsl_flatten_doc, mode):
 
 
 def test_stylesheet_with_etree(kml_cta_rail_lines, xsl_flatten_doc):
-    pytest.importorskip("lxml")
+    td.versioned_importorskip("lxml")
     with pytest.raises(
         ValueError, match=("To use stylesheet, you need lxml installed")
     ):
@@ -1359,7 +1359,7 @@ def test_stylesheet_with_etree(kml_cta_rail_lines, xsl_flatten_doc):
 
 @pytest.mark.parametrize("val", ["", b""])
 def test_empty_stylesheet(val, datapath):
-    pytest.importorskip("lxml")
+    td.versioned_importorskip("lxml")
     msg = (
         "Passing literal xml to 'read_xml' is deprecated and "
         "will be removed in a future version. To read from a "
@@ -1662,7 +1662,7 @@ def test_empty_data(xml_books, parser):
 
 
 def test_online_stylesheet():
-    pytest.importorskip("lxml")
+    td.versioned_importorskip("lxml")
     xml = """\
 <?xml version="1.0" encoding="UTF-8"?>
 <catalog>
@@ -1993,8 +1993,8 @@ def test_unsuported_compression(parser):
 @pytest.mark.network
 @pytest.mark.single_cpu
 def test_s3_parser_consistency(s3_public_bucket_with_data, s3so):
-    pytest.importorskip("s3fs")
-    pytest.importorskip("lxml")
+    td.versioned_importorskip("s3fs")
+    td.versioned_importorskip("lxml")
     s3 = f"s3://{s3_public_bucket_with_data.name}/books.xml"
 
     df_lxml = read_xml(s3, parser="lxml", storage_options=s3so)
@@ -2035,7 +2035,7 @@ def test_read_xml_nullable_dtypes(
 </data>"""
 
     if using_infer_string:
-        pa = pytest.importorskip("pyarrow")
+        pa = td.versioned_importorskip("pyarrow")
         string_array = ArrowStringArrayNumpySemantics(pa.array(["x", "y"]))
         string_array_na = ArrowStringArrayNumpySemantics(pa.array(["x", None]))
 
@@ -2044,14 +2044,14 @@ def test_read_xml_nullable_dtypes(
         string_array_na = StringArray(np.array(["x", NA], dtype=np.object_))
 
     elif dtype_backend == "pyarrow":
-        pa = pytest.importorskip("pyarrow")
+        pa = td.versioned_importorskip("pyarrow")
         from pandas.arrays import ArrowExtensionArray
 
         string_array = ArrowExtensionArray(pa.array(["x", "y"]))
         string_array_na = ArrowExtensionArray(pa.array(["x", None]))
 
     else:
-        pa = pytest.importorskip("pyarrow")
+        pa = td.versioned_importorskip("pyarrow")
         string_array = ArrowStringArray(pa.array(["x", "y"]))
         string_array_na = ArrowStringArray(pa.array(["x", None]))
 
@@ -2073,7 +2073,7 @@ def test_read_xml_nullable_dtypes(
     )
 
     if dtype_backend == "pyarrow":
-        pa = pytest.importorskip("pyarrow")
+        pa = td.versioned_importorskip("pyarrow")
         from pandas.arrays import ArrowExtensionArray
 
         expected = DataFrame(
index d688bbd47595c2ec6451bd9ddf7c916275013384..174c5d1e95e6fb172c73e34bf90fe1e3f2f04eef 100644 (file)
@@ -3,6 +3,7 @@ import gc
 import numpy as np
 import pytest
 
+import pandas.util._test_decorators as td
 from pandas import (
     DataFrame,
     to_datetime,
@@ -15,9 +16,9 @@ def mpl_cleanup():
     # 1) Resets units registry
     # 2) Resets rc_context
     # 3) Closes all figures
-    mpl = pytest.importorskip("matplotlib")
-    mpl_units = pytest.importorskip("matplotlib.units")
-    plt = pytest.importorskip("matplotlib.pyplot")
+    mpl = td.versioned_importorskip("matplotlib")
+    mpl_units = td.versioned_importorskip("matplotlib.units")
+    plt = td.versioned_importorskip("matplotlib.pyplot")
     orig_units_registry = mpl_units.registry.copy()
     with mpl.rc_context():
         mpl.use("template")
index 4ca4067214bbd20e56065bf74d6851e926679b88..158c9f63a58fdf14f48fd764a9c9aa7537e7b286 100644 (file)
@@ -48,8 +48,8 @@ from pandas.util.version import Version
 
 from pandas.io.formats.printing import pprint_thing
 
-mpl = pytest.importorskip("matplotlib")
-plt = pytest.importorskip("matplotlib.pyplot")
+mpl = td.versioned_importorskip("matplotlib")
+plt = td.versioned_importorskip("matplotlib.pyplot")
 
 
 class TestDataFramePlots:
@@ -1119,7 +1119,7 @@ class TestDataFramePlots:
         _check_box_return_type(result, return_type)
 
     def test_kde_df(self):
-        pytest.importorskip("scipy")
+        td.versioned_importorskip("scipy")
         df = DataFrame(np.random.default_rng(2).standard_normal((100, 4)))
         ax = _check_plot_works(df.plot, kind="kde")
         expected = [pprint_thing(c) for c in df.columns]
@@ -1127,13 +1127,13 @@ class TestDataFramePlots:
         _check_ticks_props(ax, xrot=0)
 
     def test_kde_df_rot(self):
-        pytest.importorskip("scipy")
+        td.versioned_importorskip("scipy")
         df = DataFrame(np.random.default_rng(2).standard_normal((10, 4)))
         ax = df.plot(kind="kde", rot=20, fontsize=5)
         _check_ticks_props(ax, xrot=20, xlabelsize=5, ylabelsize=5)
 
     def test_kde_df_subplots(self):
-        pytest.importorskip("scipy")
+        td.versioned_importorskip("scipy")
         df = DataFrame(np.random.default_rng(2).standard_normal((10, 4)))
         axes = _check_plot_works(
             df.plot,
@@ -1144,13 +1144,13 @@ class TestDataFramePlots:
         _check_axes_shape(axes, axes_num=4, layout=(4, 1))
 
     def test_kde_df_logy(self):
-        pytest.importorskip("scipy")
+        td.versioned_importorskip("scipy")
         df = DataFrame(np.random.default_rng(2).standard_normal((10, 4)))
         axes = df.plot(kind="kde", logy=True, subplots=True)
         _check_ax_scales(axes, yaxis="log")
 
     def test_kde_missing_vals(self):
-        pytest.importorskip("scipy")
+        td.versioned_importorskip("scipy")
         df = DataFrame(np.random.default_rng(2).uniform(size=(100, 4)))
         df.loc[0, 0] = np.nan
         _check_plot_works(df.plot, kind="kde")
@@ -1447,14 +1447,14 @@ class TestDataFramePlots:
 
     @pytest.mark.parametrize("kind", plotting.PlotAccessor._common_kinds)
     def test_kind_both_ways(self, kind):
-        pytest.importorskip("scipy")
+        td.versioned_importorskip("scipy")
         df = DataFrame({"x": [1, 2, 3]})
         df.plot(kind=kind)
         getattr(df.plot, kind)()
 
     @pytest.mark.parametrize("kind", ["scatter", "hexbin"])
     def test_kind_both_ways_x_y(self, kind):
-        pytest.importorskip("scipy")
+        td.versioned_importorskip("scipy")
         df = DataFrame({"x": [1, 2, 3]})
         df.plot("x", "x", kind=kind)
         getattr(df.plot, kind)("x", "x")
@@ -2100,7 +2100,7 @@ class TestDataFramePlots:
     @pytest.mark.parametrize("kind", plotting.PlotAccessor._all_kinds)
     def test_memory_leak(self, kind):
         """Check that every plot type gets properly collected."""
-        pytest.importorskip("scipy")
+        td.versioned_importorskip("scipy")
         args = {}
         if kind in ["hexbin", "scatter", "pie"]:
             df = DataFrame(
@@ -2427,7 +2427,7 @@ class TestDataFramePlots:
         "kind", ("line", "bar", "barh", "hist", "kde", "density", "area", "pie")
     )
     def test_group_subplot(self, kind):
-        pytest.importorskip("scipy")
+        td.versioned_importorskip("scipy")
         d = {
             "a": np.arange(10),
             "b": np.arange(10) + 1,
index ff1edd323ef280cef5e7e79aa809906434a86407..5c94c2175aa569825123036220ee78295745d6ca 100644 (file)
@@ -4,6 +4,7 @@ import re
 import numpy as np
 import pytest
 
+import pandas.util._test_decorators as td
 import pandas as pd
 from pandas import DataFrame
 import pandas._testing as tm
@@ -14,9 +15,9 @@ from pandas.tests.plotting.common import (
 )
 from pandas.util.version import Version
 
-mpl = pytest.importorskip("matplotlib")
-plt = pytest.importorskip("matplotlib.pyplot")
-cm = pytest.importorskip("matplotlib.cm")
+mpl = td.versioned_importorskip("matplotlib")
+plt = td.versioned_importorskip("matplotlib.pyplot")
+cm = td.versioned_importorskip("matplotlib.cm")
 
 
 def _check_colors_box(bp, box_c, whiskers_c, medians_c, caps_c="k", fliers_c=None):
@@ -446,7 +447,7 @@ class TestDataFrameColor:
         _check_colors(ax.patches[::10], facecolors=["green"] * 5)
 
     def test_kde_colors(self):
-        pytest.importorskip("scipy")
+        td.versioned_importorskip("scipy")
         custom_colors = "rgcby"
         df = DataFrame(np.random.default_rng(2).random((5, 5)))
 
@@ -455,14 +456,14 @@ class TestDataFrameColor:
 
     @pytest.mark.parametrize("colormap", ["jet", cm.jet])
     def test_kde_colors_cmap(self, colormap):
-        pytest.importorskip("scipy")
+        td.versioned_importorskip("scipy")
         df = DataFrame(np.random.default_rng(2).standard_normal((5, 5)))
         ax = df.plot.kde(colormap=colormap)
         rgba_colors = [cm.jet(n) for n in np.linspace(0, 1, len(df))]
         _check_colors(ax.get_lines(), linecolors=rgba_colors)
 
     def test_kde_colors_and_styles_subplots(self):
-        pytest.importorskip("scipy")
+        td.versioned_importorskip("scipy")
         default_colors = _unpack_cycler(mpl.pyplot.rcParams)
 
         df = DataFrame(np.random.default_rng(2).standard_normal((5, 5)))
@@ -473,14 +474,14 @@ class TestDataFrameColor:
 
     @pytest.mark.parametrize("colormap", ["k", "red"])
     def test_kde_colors_and_styles_subplots_single_col_str(self, colormap):
-        pytest.importorskip("scipy")
+        td.versioned_importorskip("scipy")
         df = DataFrame(np.random.default_rng(2).standard_normal((5, 5)))
         axes = df.plot(kind="kde", color=colormap, subplots=True)
         for ax in axes:
             _check_colors(ax.get_lines(), linecolors=[colormap])
 
     def test_kde_colors_and_styles_subplots_custom_color(self):
-        pytest.importorskip("scipy")
+        td.versioned_importorskip("scipy")
         df = DataFrame(np.random.default_rng(2).standard_normal((5, 5)))
         custom_colors = "rgcby"
         axes = df.plot(kind="kde", color=custom_colors, subplots=True)
@@ -489,7 +490,7 @@ class TestDataFrameColor:
 
     @pytest.mark.parametrize("colormap", ["jet", cm.jet])
     def test_kde_colors_and_styles_subplots_cmap(self, colormap):
-        pytest.importorskip("scipy")
+        td.versioned_importorskip("scipy")
         df = DataFrame(np.random.default_rng(2).standard_normal((5, 5)))
         rgba_colors = [cm.jet(n) for n in np.linspace(0, 1, len(df))]
         axes = df.plot(kind="kde", colormap=colormap, subplots=True)
@@ -497,7 +498,7 @@ class TestDataFrameColor:
             _check_colors(ax.get_lines(), linecolors=[c])
 
     def test_kde_colors_and_styles_subplots_single_col(self):
-        pytest.importorskip("scipy")
+        td.versioned_importorskip("scipy")
         df = DataFrame(np.random.default_rng(2).standard_normal((5, 5)))
         # make color a list if plotting one column frame
         # handles cases like df.plot(color='DodgerBlue')
@@ -505,7 +506,7 @@ class TestDataFrameColor:
         _check_colors(axes[0].lines, linecolors=["DodgerBlue"])
 
     def test_kde_colors_and_styles_subplots_single_char(self):
-        pytest.importorskip("scipy")
+        td.versioned_importorskip("scipy")
         df = DataFrame(np.random.default_rng(2).standard_normal((5, 5)))
         # list of styles
         # single character style
@@ -514,7 +515,7 @@ class TestDataFrameColor:
             _check_colors(ax.get_lines(), linecolors=["r"])
 
     def test_kde_colors_and_styles_subplots_list(self):
-        pytest.importorskip("scipy")
+        td.versioned_importorskip("scipy")
         df = DataFrame(np.random.default_rng(2).standard_normal((5, 5)))
         # list of styles
         styles = list("rgcby")
index f1924185a3df1cae2f0df89ec84225cd68f8fa6d..644ce2bb40f1fff8ea059997a6280a71af2b8d40 100644 (file)
@@ -2,10 +2,11 @@
 
 import pytest
 
+import pandas.util._test_decorators as td
 from pandas import DataFrame
 from pandas.tests.plotting.common import _check_visible
 
-pytest.importorskip("matplotlib")
+td.versioned_importorskip("matplotlib")
 
 
 class TestDataFramePlotsGroupby:
index 402a4b9531e5d4857d0d6e9d7cda2c002d0469d4..bb464624693bab220d35afcb7604efd62d4663b8 100644 (file)
@@ -14,7 +14,7 @@ from pandas.tests.plotting.common import (
 )
 from pandas.util.version import Version
 
-mpl = pytest.importorskip("matplotlib")
+mpl = td.versioned_importorskip("matplotlib")
 
 
 class TestFrameLegend:
@@ -61,7 +61,7 @@ class TestFrameLegend:
 
     @pytest.mark.parametrize("kind", ["line", "bar", "barh", "kde", "area", "hist"])
     def test_df_legend_labels(self, kind):
-        pytest.importorskip("scipy")
+        td.versioned_importorskip("scipy")
         df = DataFrame(np.random.default_rng(2).random((3, 3)), columns=["a", "b", "c"])
         df2 = DataFrame(
             np.random.default_rng(2).random((3, 3)), columns=["d", "e", "f"]
@@ -87,7 +87,7 @@ class TestFrameLegend:
         _check_legend_labels(ax, labels=expected)
 
     def test_df_legend_labels_secondary_y(self):
-        pytest.importorskip("scipy")
+        td.versioned_importorskip("scipy")
         df = DataFrame(np.random.default_rng(2).random((3, 3)), columns=["a", "b", "c"])
         df2 = DataFrame(
             np.random.default_rng(2).random((3, 3)), columns=["d", "e", "f"]
@@ -105,7 +105,7 @@ class TestFrameLegend:
 
     def test_df_legend_labels_time_series(self):
         # Time Series
-        pytest.importorskip("scipy")
+        td.versioned_importorskip("scipy")
         ind = date_range("1/1/2014", periods=3)
         df = DataFrame(
             np.random.default_rng(2).standard_normal((3, 3)),
@@ -131,7 +131,7 @@ class TestFrameLegend:
 
     def test_df_legend_labels_time_series_scatter(self):
         # Time Series
-        pytest.importorskip("scipy")
+        td.versioned_importorskip("scipy")
         ind = date_range("1/1/2014", periods=3)
         df = DataFrame(
             np.random.default_rng(2).standard_normal((3, 3)),
@@ -157,7 +157,7 @@ class TestFrameLegend:
         _check_legend_labels(ax, labels=["data1", "data3"])
 
     def test_df_legend_labels_time_series_no_mutate(self):
-        pytest.importorskip("scipy")
+        td.versioned_importorskip("scipy")
         ind = date_range("1/1/2014", periods=3)
         df = DataFrame(
             np.random.default_rng(2).standard_normal((3, 3)),
index 46b9cea2ff74a077b2e6ba3b34bc90c6a908843b..a7de569d24480211bc26bd4ad3dc7b809b90a187 100644 (file)
@@ -6,6 +6,7 @@ import numpy as np
 from numpy.testing import assert_array_almost_equal_nulp
 import pytest
 
+import pandas.util._test_decorators as td
 from pandas.compat import is_platform_linux
 from pandas.compat.numpy import np_version_gte1p24
 
@@ -27,8 +28,8 @@ from pandas.tests.plotting.common import (
 
 from pandas.io.formats.printing import pprint_thing
 
-mpl = pytest.importorskip("matplotlib")
-plt = pytest.importorskip("matplotlib.pyplot")
+mpl = td.versioned_importorskip("matplotlib")
+plt = td.versioned_importorskip("matplotlib.pyplot")
 
 
 class TestDataFramePlotsSubplots:
index a9250fa8347cc04fa34c28b016e1fb27d837284f..e8afa0e2080681e0f6ee08b408e7e12179de1d9b 100644 (file)
@@ -3,6 +3,7 @@ import re
 import numpy as np
 import pytest
 
+import pandas.util._test_decorators as td
 from pandas import DataFrame
 import pandas._testing as tm
 from pandas.tests.plotting.common import (
@@ -12,7 +13,7 @@ from pandas.tests.plotting.common import (
     get_y_axis,
 )
 
-pytest.importorskip("matplotlib")
+td.versioned_importorskip("matplotlib")
 
 
 @pytest.fixture
index 76f7fa1f22eec4bdb7464619226352c918d31a02..580da287a87a6ba404a5b21b4ee91a82311282c2 100644 (file)
@@ -6,6 +6,7 @@ import string
 import numpy as np
 import pytest
 
+import pandas.util._test_decorators as td
 from pandas import (
     DataFrame,
     MultiIndex,
@@ -25,8 +26,8 @@ from pandas.tests.plotting.common import (
 
 from pandas.io.formats.printing import pprint_thing
 
-mpl = pytest.importorskip("matplotlib")
-plt = pytest.importorskip("matplotlib.pyplot")
+mpl = td.versioned_importorskip("matplotlib")
+plt = td.versioned_importorskip("matplotlib.pyplot")
 
 
 def _check_ax_limits(col, ax):
index 20daf5935624843af3224f991497f84fa6639a0d..8d58408ace5a221cffd66ff6bdd50a25add1bb8b 100644 (file)
@@ -1,5 +1,6 @@
 import pytest
 
+import pandas.util._test_decorators as td
 from pandas import DataFrame
 from pandas.tests.plotting.common import (
     _check_plot_works,
@@ -7,7 +8,7 @@ from pandas.tests.plotting.common import (
     _gen_two_subplots,
 )
 
-plt = pytest.importorskip("matplotlib.pyplot")
+plt = td.versioned_importorskip("matplotlib.pyplot")
 
 
 class TestCommon:
index f748d7c5fc758045fc5d3475b94e376a06f5269b..69784259616bd2a4c7817b3b57bb1a6c16579efc 100644 (file)
@@ -8,6 +8,7 @@ import sys
 import numpy as np
 import pytest
 
+import pandas.util._test_decorators as td
 import pandas._config.config as cf
 
 from pandas._libs.tslibs import to_offset
@@ -41,8 +42,8 @@ except ImportError:
     # causing an improper skip
     pass
 
-pytest.importorskip("matplotlib.pyplot")
-dates = pytest.importorskip("matplotlib.dates")
+td.versioned_importorskip("matplotlib.pyplot")
+dates = td.versioned_importorskip("matplotlib.dates")
 
 
 @pytest.mark.single_cpu
@@ -79,7 +80,7 @@ class TestRegistration:
         assert subprocess.check_call(call) == 0
 
     def test_registering_no_warning(self):
-        plt = pytest.importorskip("matplotlib.pyplot")
+        plt = td.versioned_importorskip("matplotlib.pyplot")
         s = Series(range(12), index=date_range("2017", periods=12))
         _, ax = plt.subplots()
 
@@ -89,7 +90,7 @@ class TestRegistration:
         plt.close()
 
     def test_pandas_plots_register(self):
-        plt = pytest.importorskip("matplotlib.pyplot")
+        plt = td.versioned_importorskip("matplotlib.pyplot")
         s = Series(range(12), index=date_range("2017", periods=12))
         # Set to the "warn" state, in case this isn't the first test run
         with tm.assert_produces_warning(None) as w:
@@ -101,7 +102,7 @@ class TestRegistration:
             plt.close()
 
     def test_matplotlib_formatters(self):
-        units = pytest.importorskip("matplotlib.units")
+        units = td.versioned_importorskip("matplotlib.units")
 
         # Can't make any assertion about the start state.
         # We we check that toggling converters off removes it, and toggling it
@@ -113,9 +114,9 @@ class TestRegistration:
             assert Timestamp in units.registry
 
     def test_option_no_warning(self):
-        pytest.importorskip("matplotlib.pyplot")
+        td.versioned_importorskip("matplotlib.pyplot")
         ctx = cf.option_context("plotting.matplotlib.register_converters", False)
-        plt = pytest.importorskip("matplotlib.pyplot")
+        plt = td.versioned_importorskip("matplotlib.pyplot")
         s = Series(range(12), index=date_range("2017", periods=12))
         _, ax = plt.subplots()
 
@@ -130,8 +131,8 @@ class TestRegistration:
         plt.close()
 
     def test_registry_resets(self):
-        units = pytest.importorskip("matplotlib.units")
-        dates = pytest.importorskip("matplotlib.dates")
+        units = td.versioned_importorskip("matplotlib.units")
+        dates = td.versioned_importorskip("matplotlib.dates")
 
         # make a copy, to reset to
         original = dict(units.registry)
index 6c318402ea226a09fbd4b9278343ef914f8fc83a..65bb6354306c590c0f83668d2682505ec2b245fe 100644 (file)
@@ -10,6 +10,7 @@ import pickle
 import numpy as np
 import pytest
 
+import pandas.util._test_decorators as td
 from pandas._libs.tslibs import (
     BaseOffset,
     to_offset,
@@ -41,7 +42,7 @@ from pandas.tests.plotting.common import _check_ticks_props
 
 from pandas.tseries.offsets import WeekOfMonth
 
-mpl = pytest.importorskip("matplotlib")
+mpl = td.versioned_importorskip("matplotlib")
 
 
 class TestTSPlot:
@@ -737,7 +738,7 @@ class TestTSPlot:
         assert ax.get_yaxis().get_visible()
 
     def test_secondary_kde(self):
-        pytest.importorskip("scipy")
+        td.versioned_importorskip("scipy")
         ser = Series(np.random.default_rng(2).standard_normal(10))
         fig, ax = mpl.pyplot.subplots()
         ax = ser.plot(secondary_y=True, kind="density", ax=ax)
index 5ebf93510a61549c838d91ab2e703f9db23fd626..ad901abb8255d2fc25c8545cdc3777e875806cf3 100644 (file)
@@ -4,6 +4,7 @@
 import numpy as np
 import pytest
 
+import pandas.util._test_decorators as td
 from pandas import (
     DataFrame,
     Index,
@@ -14,7 +15,7 @@ from pandas.tests.plotting.common import (
     _check_legend_labels,
 )
 
-pytest.importorskip("matplotlib")
+td.versioned_importorskip("matplotlib")
 
 
 class TestDataFrameGroupByPlots:
index 4d17f87fdc7bc1456a118c84b76c631544572fd4..773bc762a92acd84f47eb1d8b5395f3c87fde3c0 100644 (file)
@@ -4,6 +4,7 @@ import re
 import numpy as np
 import pytest
 
+import pandas.util._test_decorators as td
 from pandas import (
     DataFrame,
     Index,
@@ -25,7 +26,7 @@ from pandas.tests.plotting.common import (
     get_y_axis,
 )
 
-mpl = pytest.importorskip("matplotlib")
+mpl = td.versioned_importorskip("matplotlib")
 
 
 @pytest.fixture
@@ -206,7 +207,7 @@ class TestSeriesPlots:
 
     @pytest.mark.xfail(reason="Api changed in 3.6.0")
     def test_hist_kde(self, ts):
-        pytest.importorskip("scipy")
+        td.versioned_importorskip("scipy")
         _, ax = mpl.pyplot.subplots()
         ax = ts.plot.hist(logy=True, ax=ax)
         _check_ax_scales(ax, yaxis="log")
@@ -217,16 +218,16 @@ class TestSeriesPlots:
         _check_text_labels(ylabels, [""] * len(ylabels))
 
     def test_hist_kde_plot_works(self, ts):
-        pytest.importorskip("scipy")
+        td.versioned_importorskip("scipy")
         _check_plot_works(ts.plot.kde)
 
     def test_hist_kde_density_works(self, ts):
-        pytest.importorskip("scipy")
+        td.versioned_importorskip("scipy")
         _check_plot_works(ts.plot.density)
 
     @pytest.mark.xfail(reason="Api changed in 3.6.0")
     def test_hist_kde_logy(self, ts):
-        pytest.importorskip("scipy")
+        td.versioned_importorskip("scipy")
         _, ax = mpl.pyplot.subplots()
         ax = ts.plot.kde(logy=True, ax=ax)
         _check_ax_scales(ax, yaxis="log")
@@ -236,7 +237,7 @@ class TestSeriesPlots:
         _check_text_labels(ylabels, [""] * len(ylabels))
 
     def test_hist_kde_color_bins(self, ts):
-        pytest.importorskip("scipy")
+        td.versioned_importorskip("scipy")
         _, ax = mpl.pyplot.subplots()
         ax = ts.plot.hist(logy=True, bins=10, color="b", ax=ax)
         _check_ax_scales(ax, yaxis="log")
@@ -244,7 +245,7 @@ class TestSeriesPlots:
         _check_colors(ax.patches, facecolors=["b"] * 10)
 
     def test_hist_kde_color(self, ts):
-        pytest.importorskip("scipy")
+        td.versioned_importorskip("scipy")
         _, ax = mpl.pyplot.subplots()
         ax = ts.plot.kde(logy=True, color="r", ax=ax)
         _check_ax_scales(ax, yaxis="log")
@@ -631,7 +632,7 @@ class TestDataFramePlots:
 
     def test_hist_with_nans_and_weights(self):
         # GH 48884
-        mpl_patches = pytest.importorskip("matplotlib.patches")
+        mpl_patches = td.versioned_importorskip("matplotlib.patches")
         df = DataFrame(
             [[np.nan, 0.2, 0.3], [0.4, np.nan, np.nan], [0.7, 0.8, 0.9]],
             columns=list("abc"),
index cfb657c2a800fefe2d509ddfb398399af4ce8649..b98663c63b8b3efc4dc38651caf6ac95036bf280 100644 (file)
@@ -26,9 +26,9 @@ from pandas.tests.plotting.common import (
     _check_ticks_props,
 )
 
-mpl = pytest.importorskip("matplotlib")
-plt = pytest.importorskip("matplotlib.pyplot")
-cm = pytest.importorskip("matplotlib.cm")
+mpl = td.versioned_importorskip("matplotlib")
+plt = td.versioned_importorskip("matplotlib.pyplot")
+cm = td.versioned_importorskip("matplotlib.cm")
 
 
 @pytest.fixture
@@ -148,7 +148,7 @@ class TestSeriesPlots:
 class TestDataFramePlots:
     @pytest.mark.parametrize("pass_axis", [False, True])
     def test_scatter_matrix_axis(self, pass_axis):
-        pytest.importorskip("scipy")
+        td.versioned_importorskip("scipy")
         scatter_matrix = plotting.scatter_matrix
 
         ax = None
@@ -173,7 +173,7 @@ class TestDataFramePlots:
 
     @pytest.mark.parametrize("pass_axis", [False, True])
     def test_scatter_matrix_axis_smaller(self, pass_axis):
-        pytest.importorskip("scipy")
+        td.versioned_importorskip("scipy")
         scatter_matrix = plotting.scatter_matrix
 
         ax = None
index 2b2f2f3b84307b9ed69e440d2ac0112abf153e67..4aac755a775116fa3519248939a8d3c52f132adf 100644 (file)
@@ -32,8 +32,8 @@ from pandas.tests.plotting.common import (
     get_y_axis,
 )
 
-mpl = pytest.importorskip("matplotlib")
-plt = pytest.importorskip("matplotlib.pyplot")
+mpl = td.versioned_importorskip("matplotlib")
+plt = td.versioned_importorskip("matplotlib.pyplot")
 
 
 @pytest.fixture
@@ -569,16 +569,16 @@ class TestSeriesPlots:
         ],
     )
     def test_kde_kwargs(self, ts, bw_method, ind):
-        pytest.importorskip("scipy")
+        td.versioned_importorskip("scipy")
         _check_plot_works(ts.plot.kde, bw_method=bw_method, ind=ind)
 
     def test_density_kwargs(self, ts):
-        pytest.importorskip("scipy")
+        td.versioned_importorskip("scipy")
         sample_points = np.linspace(-100, 100, 20)
         _check_plot_works(ts.plot.density, bw_method=0.5, ind=sample_points)
 
     def test_kde_kwargs_check_axes(self, ts):
-        pytest.importorskip("scipy")
+        td.versioned_importorskip("scipy")
         _, ax = mpl.pyplot.subplots()
         sample_points = np.linspace(-100, 100, 20)
         ax = ts.plot.kde(logy=True, bw_method=0.5, ind=sample_points, ax=ax)
@@ -586,7 +586,7 @@ class TestSeriesPlots:
         _check_text_labels(ax.yaxis.get_label(), "Density")
 
     def test_kde_missing_vals(self):
-        pytest.importorskip("scipy")
+        td.versioned_importorskip("scipy")
         s = Series(np.random.default_rng(2).uniform(size=50))
         s[0] = np.nan
         axes = _check_plot_works(s.plot.kde)
@@ -609,7 +609,7 @@ class TestSeriesPlots:
         plotting.PlotAccessor._common_kinds + plotting.PlotAccessor._series_kinds,
     )
     def test_kind_kwarg(self, kind):
-        pytest.importorskip("scipy")
+        td.versioned_importorskip("scipy")
         s = Series(range(3))
         _, ax = mpl.pyplot.subplots()
         s.plot(kind=kind, ax=ax)
@@ -620,7 +620,7 @@ class TestSeriesPlots:
         plotting.PlotAccessor._common_kinds + plotting.PlotAccessor._series_kinds,
     )
     def test_kind_attr(self, kind):
-        pytest.importorskip("scipy")
+        td.versioned_importorskip("scipy")
         s = Series(range(3))
         _, ax = mpl.pyplot.subplots()
         getattr(s.plot, kind)()
@@ -636,7 +636,7 @@ class TestSeriesPlots:
 
     @pytest.mark.parametrize("kind", plotting.PlotAccessor._common_kinds)
     def test_valid_object_plot(self, kind):
-        pytest.importorskip("scipy")
+        td.versioned_importorskip("scipy")
         s = Series(range(10), dtype=object)
         _check_plot_works(s.plot, kind=kind)
 
@@ -750,7 +750,7 @@ class TestSeriesPlots:
     @pytest.mark.slow
     def test_series_grid_settings(self):
         # Make sure plot defaults to rcParams['axes.grid'] setting, GH 9792
-        pytest.importorskip("scipy")
+        td.versioned_importorskip("scipy")
         _check_grid_settings(
             Series([1, 2, 3]),
             plotting.PlotAccessor._series_kinds + plotting.PlotAccessor._common_kinds,
index 665bda15724fd67dc9917509d2b95957b03107e3..6c64e46d34d5b57ffb0504d2b8453133e5bf179a 100644 (file)
@@ -1,8 +1,9 @@
 import pytest
 
+import pandas.util._test_decorators as td
 from pandas import Series
 
-pytest.importorskip("matplotlib")
+td.versioned_importorskip("matplotlib")
 from pandas.plotting._matplotlib.style import get_standard_colors
 
 
index 30ec0d0affaa3b30facdb8bf55062017a217b5ae..5547f25e09c0e66dcf426454bc1292af2691dd15 100644 (file)
@@ -7,6 +7,7 @@ from decimal import Decimal
 import numpy as np
 import pytest
 
+import pandas.util._test_decorators as td
 import pandas as pd
 from pandas import (
     Categorical,
@@ -1091,7 +1092,7 @@ class TestSeriesReductions:
 
     def test_any_all_pyarrow_string(self):
         # GH#54591
-        pytest.importorskip("pyarrow")
+        td.versioned_importorskip("pyarrow")
         ser = Series(["", "a"], dtype="string[pyarrow_numpy]")
         assert ser.any()
         assert not ser.all()
index 8fbb78737474c8abf34b8720603e32f6a93d83e7..44a01205dc8a4b37a009b9fa321067d8c0baaf04 100644 (file)
@@ -6,6 +6,7 @@ import inspect
 import numpy as np
 import pytest
 
+import pandas.util._test_decorators as td
 import pandas as pd
 from pandas import (
     DataFrame,
@@ -231,7 +232,7 @@ class TestSeriesStatReductions:
         assert pd.isna(result)
 
     def test_skew(self):
-        sp_stats = pytest.importorskip("scipy.stats")
+        sp_stats = td.versioned_importorskip("scipy.stats")
 
         string_series = Series(range(20), dtype=np.float64, name="series")
 
@@ -253,7 +254,7 @@ class TestSeriesStatReductions:
                 assert (df.skew() == 0).all()
 
     def test_kurt(self):
-        sp_stats = pytest.importorskip("scipy.stats")
+        sp_stats = td.versioned_importorskip("scipy.stats")
 
         string_series = Series(range(20), dtype=np.float64, name="series")
 
index ddd81ab1d347d315de0aba6e75908a18beb923ec..efcfb916026da40aba6486a89753725fd3e18421 100644 (file)
@@ -1110,7 +1110,7 @@ def test_resample_dtype_preservation(unit):
 
 
 def test_resample_dtype_coercion(unit):
-    pytest.importorskip("scipy.interpolate")
+    td.versioned_importorskip("scipy.interpolate")
 
     # GH 16361
     df = {"a": [1, 3, 1, 4]}
index ed49f3b758cc5cd826a804c8de611681a3e0343c..71ba6d80b2840898024b54120e1a4e999a8aef33 100644 (file)
@@ -8,6 +8,7 @@ import re
 import numpy as np
 import pytest
 
+import pandas.util._test_decorators as td
 from pandas.core.dtypes.common import (
     is_object_dtype,
     is_string_dtype,
@@ -2817,7 +2818,7 @@ def test_merge_ea_and_non_ea(any_numeric_ea_dtype, join_type):
 @pytest.mark.parametrize("dtype", ["int64", "int64[pyarrow]"])
 def test_merge_arrow_and_numpy_dtypes(dtype):
     # GH#52406
-    pytest.importorskip("pyarrow")
+    td.versioned_importorskip("pyarrow")
     df = DataFrame({"a": [1, 2]}, dtype=dtype)
     df2 = DataFrame({"a": [1, 2]}, dtype="int64[pyarrow]")
     result = df.merge(df2)
@@ -2967,7 +2968,7 @@ def test_merge_ea_int_and_float_numpy():
 
 def test_merge_arrow_string_index(any_string_dtype):
     # GH#54894
-    pytest.importorskip("pyarrow")
+    td.versioned_importorskip("pyarrow")
     left = DataFrame({"a": ["a", "b"]}, dtype=any_string_dtype)
     right = DataFrame({"b": 1}, index=Index(["a", "c"], dtype=any_string_dtype))
     result = left.merge(right, left_on="a", right_index=True, how="left")
index 272c5b34032937215b3ffff45ea10a9e31048041..5320ffc79da5097a9f42dc16e22e27039c7e7aa8 100644 (file)
@@ -3,6 +3,7 @@ import re
 import numpy as np
 import pytest
 
+import pandas.util._test_decorators as td
 import pandas as pd
 from pandas import (
     DataFrame,
@@ -1224,7 +1225,7 @@ class TestWideToLong:
 
 def test_wide_to_long_pyarrow_string_columns():
     # GH 57066
-    pytest.importorskip("pyarrow")
+    td.versioned_importorskip("pyarrow")
     df = DataFrame(
         {
             "ID": {0: 1},
index 1c60567c1a5300dd4118ae729c3c784eabd4d747..77435d5df6ba4079c20108998f4781cabb926ef1 100644 (file)
@@ -2,13 +2,14 @@ import re
 
 import pytest
 
+import pandas.util._test_decorators as td
 from pandas import (
     ArrowDtype,
     Series,
 )
 import pandas._testing as tm
 
-pa = pytest.importorskip("pyarrow")
+pa = td.versioned_importorskip("pyarrow")
 
 from pandas.compat import pa_version_under11p0
 
index 80aea75fda406cf77e0fda73a6d9849c393e7d83..5d4fcf459fa2c51e5ae9c289a4943b743a851842 100644 (file)
@@ -2,6 +2,7 @@ import re
 
 import pytest
 
+import pandas.util._test_decorators as td
 from pandas.compat.pyarrow import (
     pa_version_under11p0,
     pa_version_under13p0,
@@ -15,8 +16,8 @@ from pandas import (
 )
 import pandas._testing as tm
 
-pa = pytest.importorskip("pyarrow")
-pc = pytest.importorskip("pyarrow.compute")
+pa = td.versioned_importorskip("pyarrow")
+pc = td.versioned_importorskip("pyarrow.compute")
 
 
 def test_struct_accessor_dtypes():
index b0a920ba02cadeb21a7c0cc93f615cb1bc49dcbb..23bedf8ed36d2b1390fdf836ed45a528a42ff4d2 100644 (file)
@@ -3,6 +3,7 @@ from itertools import product
 import numpy as np
 import pytest
 
+import pandas.util._test_decorators as td
 from pandas._libs import lib
 
 import pandas as pd
@@ -291,7 +292,7 @@ class TestSeriesConvertDtypes:
 
     def test_convert_dtypes_pyarrow_to_np_nullable(self):
         # GH 53648
-        pytest.importorskip("pyarrow")
+        td.versioned_importorskip("pyarrow")
         ser = pd.Series(range(2), dtype="int32[pyarrow]")
         result = ser.convert_dtypes(dtype_backend="numpy_nullable")
         expected = pd.Series(range(2), dtype="Int32")
@@ -299,7 +300,7 @@ class TestSeriesConvertDtypes:
 
     def test_convert_dtypes_pyarrow_null(self):
         # GH#55346
-        pa = pytest.importorskip("pyarrow")
+        pa = td.versioned_importorskip("pyarrow")
         ser = pd.Series([None, None])
         result = ser.convert_dtypes(dtype_backend="pyarrow")
         expected = pd.Series([None, None], dtype=pd.ArrowDtype(pa.null()))
index a369145b4e884d740af39b236edbf2ce6e088cd0..2d769a4c7bc54325c085e487eb2996db1750cd72 100644 (file)
@@ -3,6 +3,7 @@ import math
 import numpy as np
 import pytest
 
+import pandas.util._test_decorators as td
 import pandas as pd
 from pandas import (
     Series,
@@ -58,7 +59,7 @@ class TestSeriesCov:
 class TestSeriesCorr:
     @pytest.mark.parametrize("dtype", ["float64", "Float64"])
     def test_corr(self, datetime_series, dtype):
-        stats = pytest.importorskip("scipy.stats")
+        stats = td.versioned_importorskip("scipy.stats")
 
         datetime_series = datetime_series.astype(dtype)
 
@@ -93,7 +94,7 @@ class TestSeriesCorr:
         tm.assert_almost_equal(result, expected)
 
     def test_corr_rank(self):
-        stats = pytest.importorskip("scipy.stats")
+        stats = td.versioned_importorskip("scipy.stats")
 
         # kendall and spearman
         A = Series(
index 10b2e98586365929e4ff05df0d93660d55cf8850..91b6e6bf967015521e7754691bb75c0c3a822637 100644 (file)
@@ -1,6 +1,7 @@
 import numpy as np
 import pytest
 
+import pandas.util._test_decorators as td
 import pandas as pd
 from pandas import (
     Categorical,
@@ -252,7 +253,7 @@ class TestSeriesDropDuplicates:
         tm.assert_series_equal(result, expected)
 
     def test_duplicated_arrow_dtype(self):
-        pytest.importorskip("pyarrow")
+        td.versioned_importorskip("pyarrow")
         ser = Series([True, False, None, False], dtype="bool[pyarrow]")
         result = ser.drop_duplicates()
         expected = Series([True, False, None], dtype="bool[pyarrow]")
@@ -260,7 +261,7 @@ class TestSeriesDropDuplicates:
 
     def test_drop_duplicates_arrow_strings(self):
         # GH#54904
-        pa = pytest.importorskip("pyarrow")
+        pa = td.versioned_importorskip("pyarrow")
         ser = Series(["a", "a"], dtype=pd.ArrowDtype(pa.string()))
         result = ser.drop_duplicates()
         expecetd = Series(["a"], dtype=pd.ArrowDtype(pa.string()))
index 5a0188585ef30c12f7222a054714957df4ed2ff2..da5bbb0440dbd64f1b51053bfa23389a8820a166 100644 (file)
@@ -1,6 +1,7 @@
 import numpy as np
 import pytest
 
+import pandas.util._test_decorators as td
 import pandas as pd
 import pandas._testing as tm
 
@@ -146,7 +147,7 @@ def test_explode_scalars_can_ignore_index():
 @pytest.mark.parametrize("ignore_index", [True, False])
 def test_explode_pyarrow_list_type(ignore_index):
     # GH 53602
-    pa = pytest.importorskip("pyarrow")
+    pa = td.versioned_importorskip("pyarrow")
 
     data = [
         [None, None],
@@ -167,7 +168,7 @@ def test_explode_pyarrow_list_type(ignore_index):
 
 @pytest.mark.parametrize("ignore_index", [True, False])
 def test_explode_pyarrow_non_list_type(ignore_index):
-    pa = pytest.importorskip("pyarrow")
+    pa = td.versioned_importorskip("pyarrow")
     data = [1, 2, 3]
     ser = pd.Series(data, dtype=pd.ArrowDtype(pa.int64()))
     result = ser.explode(ignore_index=ignore_index)
index d854f0b7877595fba5ac0050a281aa3708240b0e..1886b973d76725c780d0e5da9e5b05e460412b35 100644 (file)
@@ -118,7 +118,7 @@ class TestSeriesInterpolateData:
             non_ts.interpolate(method="time")
 
     def test_interpolate_cubicspline(self):
-        pytest.importorskip("scipy")
+        td.versioned_importorskip("scipy")
         ser = Series([10, 11, 12, 13])
 
         expected = Series(
@@ -133,7 +133,7 @@ class TestSeriesInterpolateData:
         tm.assert_series_equal(result, expected)
 
     def test_interpolate_pchip(self):
-        pytest.importorskip("scipy")
+        td.versioned_importorskip("scipy")
         ser = Series(np.sort(np.random.default_rng(2).uniform(size=100)))
 
         # interpolate at new_index
@@ -145,7 +145,7 @@ class TestSeriesInterpolateData:
         interp_s.loc[49:51]
 
     def test_interpolate_akima(self):
-        pytest.importorskip("scipy")
+        td.versioned_importorskip("scipy")
         ser = Series([10, 11, 12, 13])
 
         # interpolate at new_index where `der` is zero
@@ -171,7 +171,7 @@ class TestSeriesInterpolateData:
         tm.assert_series_equal(interp_s.loc[1:3], expected)
 
     def test_interpolate_piecewise_polynomial(self):
-        pytest.importorskip("scipy")
+        td.versioned_importorskip("scipy")
         ser = Series([10, 11, 12, 13])
 
         expected = Series(
@@ -186,7 +186,7 @@ class TestSeriesInterpolateData:
         tm.assert_series_equal(interp_s.loc[1:3], expected)
 
     def test_interpolate_from_derivatives(self):
-        pytest.importorskip("scipy")
+        td.versioned_importorskip("scipy")
         ser = Series([10, 11, 12, 13])
 
         expected = Series(
@@ -276,14 +276,14 @@ class TestSeriesInterpolateData:
         tm.assert_series_equal(result, expected)
 
     def test_interp_quad(self):
-        pytest.importorskip("scipy")
+        td.versioned_importorskip("scipy")
         sq = Series([1, 4, np.nan, 16], index=[1, 2, 3, 4])
         result = sq.interpolate(method="quadratic")
         expected = Series([1.0, 4.0, 9.0, 16.0], index=[1, 2, 3, 4])
         tm.assert_series_equal(result, expected)
 
     def test_interp_scipy_basic(self):
-        pytest.importorskip("scipy")
+        td.versioned_importorskip("scipy")
         s = Series([1, 3, np.nan, 12, np.nan, 25])
         # slinear
         expected = Series([1.0, 3.0, 7.5, 12.0, 18.5, 25.0])
@@ -618,7 +618,7 @@ class TestSeriesInterpolateData:
         tm.assert_series_equal(result, expected)
 
     def test_interp_all_good(self):
-        pytest.importorskip("scipy")
+        td.versioned_importorskip("scipy")
         s = Series([1, 2, 3])
         result = s.interpolate(method="polynomial", order=1)
         tm.assert_series_equal(result, s)
@@ -645,7 +645,7 @@ class TestSeriesInterpolateData:
                 s.interpolate(method="polynomial", order=1)
 
     def test_interp_nonmono_raise(self):
-        pytest.importorskip("scipy")
+        td.versioned_importorskip("scipy")
         s = Series([1, np.nan, 3], index=[0, 2, 1])
         msg = "krogh interpolation requires that the index be monotonic"
         with pytest.raises(ValueError, match=msg):
@@ -653,7 +653,7 @@ class TestSeriesInterpolateData:
 
     @pytest.mark.parametrize("method", ["nearest", "pad"])
     def test_interp_datetime64(self, method, tz_naive_fixture):
-        pytest.importorskip("scipy")
+        td.versioned_importorskip("scipy")
         df = Series(
             [1, np.nan, 3], index=date_range("1/1/2000", periods=3, tz=tz_naive_fixture)
         )
@@ -699,7 +699,7 @@ class TestSeriesInterpolateData:
     @pytest.mark.parametrize("method", ["polynomial", "spline"])
     def test_no_order(self, method):
         # see GH-10633, GH-24014
-        pytest.importorskip("scipy")
+        td.versioned_importorskip("scipy")
         s = Series([0, 1, np.nan, 3])
         msg = "You must specify the order of the spline or polynomial"
         with pytest.raises(ValueError, match=msg):
@@ -707,21 +707,21 @@ class TestSeriesInterpolateData:
 
     @pytest.mark.parametrize("order", [-1, -1.0, 0, 0.0, np.nan])
     def test_interpolate_spline_invalid_order(self, order):
-        pytest.importorskip("scipy")
+        td.versioned_importorskip("scipy")
         s = Series([0, 1, np.nan, 3])
         msg = "order needs to be specified and greater than 0"
         with pytest.raises(ValueError, match=msg):
             s.interpolate(method="spline", order=order)
 
     def test_spline(self):
-        pytest.importorskip("scipy")
+        td.versioned_importorskip("scipy")
         s = Series([1, 2, np.nan, 4, 5, np.nan, 7])
         result = s.interpolate(method="spline", order=1)
         expected = Series([1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0])
         tm.assert_series_equal(result, expected)
 
     def test_spline_extrapolate(self):
-        pytest.importorskip("scipy")
+        td.versioned_importorskip("scipy")
         s = Series([1, 2, 3, 4, np.nan, 6, np.nan])
         result3 = s.interpolate(method="spline", order=1, ext=3)
         expected3 = Series([1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 6.0])
@@ -732,7 +732,7 @@ class TestSeriesInterpolateData:
         tm.assert_series_equal(result1, expected1)
 
     def test_spline_smooth(self):
-        pytest.importorskip("scipy")
+        td.versioned_importorskip("scipy")
         s = Series([1, 2, np.nan, 4, 5.1, np.nan, 7])
         assert (
             s.interpolate(method="spline", order=3, s=0)[5]
@@ -741,7 +741,7 @@ class TestSeriesInterpolateData:
 
     def test_spline_interpolation(self):
         # Explicit cast to float to avoid implicit cast when setting np.nan
-        pytest.importorskip("scipy")
+        td.versioned_importorskip("scipy")
         s = Series(np.arange(10) ** 2, dtype="float")
         s[np.random.default_rng(2).integers(0, 9, 3)] = np.nan
         result1 = s.interpolate(method="spline", order=1)
@@ -801,7 +801,7 @@ class TestSeriesInterpolateData:
 
         method, kwargs = interp_methods_ind
         if method == "pchip":
-            pytest.importorskip("scipy")
+            td.versioned_importorskip("scipy")
 
         if method == "linear":
             result = df[0].interpolate(**kwargs)
@@ -824,7 +824,7 @@ class TestSeriesInterpolateData:
         are tested here.
         """
         # gh 21662
-        pytest.importorskip("scipy")
+        td.versioned_importorskip("scipy")
         ind = pd.timedelta_range(start=1, periods=4)
         df = pd.DataFrame([0, 1, np.nan, 3], index=ind)
 
@@ -861,7 +861,7 @@ class TestSeriesInterpolateData:
 
     def test_interpolate_fill_value(self):
         # GH#54920
-        pytest.importorskip("scipy")
+        td.versioned_importorskip("scipy")
         ser = Series([np.nan, 0, 1, np.nan, 3, np.nan])
         result = ser.interpolate(method="nearest", fill_value=0)
         expected = Series([np.nan, 0, 1, 1, 3, 0])
index 24cf97c05c0a810bac00a8843b21d0ee88a1c00d..a3ca64d94dae6f7b088597d9c660e81e07ca2043 100644 (file)
@@ -56,7 +56,7 @@ def dtype(request):
 
 class TestSeriesRank:
     def test_rank(self, datetime_series):
-        sp_stats = pytest.importorskip("scipy.stats")
+        sp_stats = td.versioned_importorskip("scipy.stats")
 
         datetime_series[::2] = np.nan
         datetime_series[:10:3] = 4.0
@@ -269,7 +269,7 @@ class TestSeriesRank:
     def test_rank_tie_methods_on_infs_nans(
         self, method, na_option, ascending, dtype, na_value, pos_inf, neg_inf
     ):
-        pytest.importorskip("scipy")
+        td.versioned_importorskip("scipy")
         if dtype == "float64[pyarrow]":
             if method == "average":
                 exp_dtype = "float64[pyarrow]"
@@ -318,7 +318,7 @@ class TestSeriesRank:
         ],
     )
     def test_rank_methods_series(self, method, op, value):
-        sp_stats = pytest.importorskip("scipy.stats")
+        sp_stats = td.versioned_importorskip("scipy.stats")
 
         xs = np.random.default_rng(2).standard_normal(9)
         xs = np.concatenate([xs[i:] for i in range(0, 9, 2)])  # add duplicates
index 48e2608a1032a0664f7b6b3cb2c354e7f7c531f6..b43260c05d60cbcaf1e57944a558cb85c25257a0 100644 (file)
@@ -3,6 +3,7 @@ from datetime import datetime
 import numpy as np
 import pytest
 
+import pandas.util._test_decorators as td
 import pandas as pd
 from pandas import (
     DataFrame,
@@ -170,7 +171,7 @@ class TestResetIndex:
 
     def test_reset_index_drop_infer_string(self):
         # GH#56160
-        pytest.importorskip("pyarrow")
+        td.versioned_importorskip("pyarrow")
         ser = Series(["a", "b", "c"], dtype=object)
         with option_context("future.infer_string", True):
             result = ser.reset_index(drop=True)
index 29d6e2036476ef62ed1a7eea734400915d71f0ab..6d262b6ff61abd761a6c016601415fb084fb9291 100644 (file)
@@ -4,6 +4,7 @@ import pydoc
 import numpy as np
 import pytest
 
+import pandas.util._test_decorators as td
 import pandas as pd
 from pandas import (
     DataFrame,
@@ -169,7 +170,7 @@ class TestSeriesMisc:
 
     def test_inspect_getmembers(self):
         # GH38782
-        pytest.importorskip("jinja2")
+        td.versioned_importorskip("jinja2")
         ser = Series(dtype=object)
         msg = "Series._data is deprecated"
         with tm.assert_produces_warning(
index 387be8398e4b281421317c844269fe45a10eb6bc..4201731c8bd3ca7c205e7698809660e200987ac9 100644 (file)
@@ -2094,7 +2094,7 @@ class TestSeriesConstructors:
 
     def test_series_string_inference(self):
         # GH#54430
-        pytest.importorskip("pyarrow")
+        td.versioned_importorskip("pyarrow")
         dtype = "string[pyarrow_numpy]"
         expected = Series(["a", "b"], dtype=dtype)
         with pd.option_context("future.infer_string", True):
@@ -2109,7 +2109,7 @@ class TestSeriesConstructors:
     @pytest.mark.parametrize("na_value", [None, np.nan, pd.NA])
     def test_series_string_with_na_inference(self, na_value):
         # GH#54430
-        pytest.importorskip("pyarrow")
+        td.versioned_importorskip("pyarrow")
         dtype = "string[pyarrow_numpy]"
         expected = Series(["a", na_value], dtype=dtype)
         with pd.option_context("future.infer_string", True):
@@ -2118,7 +2118,7 @@ class TestSeriesConstructors:
 
     def test_series_string_inference_scalar(self):
         # GH#54430
-        pytest.importorskip("pyarrow")
+        td.versioned_importorskip("pyarrow")
         expected = Series("a", index=[1], dtype="string[pyarrow_numpy]")
         with pd.option_context("future.infer_string", True):
             ser = Series("a", index=[1])
@@ -2126,7 +2126,7 @@ class TestSeriesConstructors:
 
     def test_series_string_inference_array_string_dtype(self):
         # GH#54496
-        pytest.importorskip("pyarrow")
+        td.versioned_importorskip("pyarrow")
         expected = Series(["a", "b"], dtype="string[pyarrow_numpy]")
         with pd.option_context("future.infer_string", True):
             ser = Series(np.array(["a", "b"]))
@@ -2134,7 +2134,7 @@ class TestSeriesConstructors:
 
     def test_series_string_inference_storage_definition(self):
         # GH#54793
-        pytest.importorskip("pyarrow")
+        td.versioned_importorskip("pyarrow")
         expected = Series(["a", "b"], dtype="string[pyarrow_numpy]")
         with pd.option_context("future.infer_string", True):
             result = Series(["a", "b"], dtype="string")
@@ -2150,7 +2150,7 @@ class TestSeriesConstructors:
 
     def test_series_string_inference_na_first(self):
         # GH#55655
-        pytest.importorskip("pyarrow")
+        td.versioned_importorskip("pyarrow")
         expected = Series([pd.NA, "b"], dtype="string[pyarrow_numpy]")
         with pd.option_context("future.infer_string", True):
             result = Series([pd.NA, "b"])
index a1c5018ea7961c5979b4f407f7096e81e2dda0c0..99a9347c11175c6d9737ecfa13c75d16a2a645d6 100644 (file)
@@ -6,6 +6,7 @@ from datetime import (
 import numpy as np
 import pytest
 
+import pandas.util._test_decorators as td
 from pandas._config import using_pyarrow_string_dtype
 
 import pandas as pd
@@ -227,7 +228,7 @@ class TestSeriesRepr:
         repr(ts2).splitlines()[-1]
 
     def test_latex_repr(self):
-        pytest.importorskip("jinja2")  # uses Styler implementation
+        td.versioned_importorskip("jinja2")  # uses Styler implementation
         result = r"""\begin{tabular}{ll}
 \toprule
  & 0 \\
index d9c94e871bd4bf39e0a380ca1bc3806dc33154c2..4d5c9cee75056ddbf3a22e2e480664a41fe3a759 100644 (file)
@@ -4,6 +4,7 @@ import operator
 import numpy as np
 import pytest
 
+import pandas.util._test_decorators as td
 from pandas import (
     DataFrame,
     Index,
@@ -533,7 +534,7 @@ class TestSeriesLogicalOps:
 
     def test_pyarrow_numpy_string_invalid(self):
         # GH#56008
-        pytest.importorskip("pyarrow")
+        td.versioned_importorskip("pyarrow")
         ser = Series([False, True])
         ser2 = Series(["a", "b"], dtype="string[pyarrow_numpy]")
         result = ser == ser2
index 76353ab25fca6e5208f099b030aa308aeb8837c1..73efdbb35c0bb53d748863fa91a5d65b91a29d60 100644 (file)
@@ -1,6 +1,7 @@
 import numpy as np
 import pytest
 
+import pandas.util._test_decorators as td
 import pandas as pd
 from pandas import Series
 import pandas._testing as tm
@@ -53,7 +54,7 @@ def test_mode_nullable_dtype(any_numeric_ea_dtype):
 
 def test_mode_infer_string():
     # GH#56183
-    pytest.importorskip("pyarrow")
+    td.versioned_importorskip("pyarrow")
     ser = Series(["a", "b"], dtype=object)
     with pd.option_context("future.infer_string", True):
         result = ser.mode()
index 77d008c650264889550ec70331a1b98064242d26..c01c1f68f4288b421b906d58ad56cacde17d2b5c 100644 (file)
@@ -4,6 +4,7 @@ import re
 import numpy as np
 import pytest
 
+import pandas.util._test_decorators as td
 from pandas.core.dtypes.dtypes import ArrowDtype
 
 from pandas import (
@@ -718,7 +719,7 @@ def test_extractall_same_as_extract_subject_index(any_string_dtype):
 def test_extractall_preserves_dtype():
     # Ensure that when extractall is called on a series with specific dtypes set, that
     # the dtype is preserved in the resulting DataFrame's column.
-    pa = pytest.importorskip("pyarrow")
+    pa = td.versioned_importorskip("pyarrow")
 
     result = Series(["abc", "ab"], dtype=ArrowDtype(pa.string())).str.extractall("(ab)")
     assert result.dtypes[0] == "string[pyarrow]"
index 718d1b3ee2e834507919cd1e46b2e2bead191589..9f0a197c6ba68e75c13ac2a3503fd1c18d486bbb 100644 (file)
@@ -4,6 +4,7 @@ import struct
 import numpy as np
 import pytest
 
+import pandas.util._test_decorators as td
 from pandas._libs import (
     algos as libalgos,
     hashtable as ht,
@@ -1789,7 +1790,7 @@ class TestRank:
         ],
     )
     def test_scipy_compat(self, arr):
-        sp_stats = pytest.importorskip("scipy.stats")
+        sp_stats = td.versioned_importorskip("scipy.stats")
 
         arr = np.array(arr)
 
index e04fc4b796196e34a272e02a44658ee67eec77c5..774317c40496355689b6f0c30802268ed4083141 100644 (file)
@@ -44,8 +44,8 @@ def test_dask(df):
     olduse = pd.get_option("compute.use_numexpr")
 
     try:
-        pytest.importorskip("toolz")
-        dd = pytest.importorskip("dask.dataframe")
+        td.versioned_importorskip("toolz")
+        dd = td.versioned_importorskip("dask.dataframe")
 
         ddf = dd.from_pandas(df, npartitions=3)
         assert ddf.A is not None
@@ -61,8 +61,8 @@ def test_dask_ufunc():
     olduse = pd.get_option("compute.use_numexpr")
 
     try:
-        da = pytest.importorskip("dask.array")
-        dd = pytest.importorskip("dask.dataframe")
+        da = td.versioned_importorskip("dask.array")
+        dd = td.versioned_importorskip("dask.dataframe")
 
         s = Series([1.5, 2.3, 3.7, 4.0])
         ds = dd.from_pandas(s, npartitions=2)
@@ -78,7 +78,7 @@ def test_dask_ufunc():
 def test_construct_dask_float_array_int_dtype_match_ndarray():
     # GH#40110 make sure we treat a float-dtype dask array with the same
     #  rules we would for an ndarray
-    dd = pytest.importorskip("dask.dataframe")
+    dd = td.versioned_importorskip("dask.dataframe")
 
     arr = np.array([1, 2.5, 3])
     darr = dd.from_array(arr)
@@ -102,15 +102,15 @@ def test_construct_dask_float_array_int_dtype_match_ndarray():
 
 
 def test_xarray(df):
-    pytest.importorskip("xarray")
+    td.versioned_importorskip("xarray")
 
     assert df.to_xarray() is not None
 
 
 def test_xarray_cftimeindex_nearest():
     # https://github.com/pydata/xarray/issues/3751
-    cftime = pytest.importorskip("cftime")
-    xarray = pytest.importorskip("xarray")
+    cftime = td.versioned_importorskip("cftime")
+    xarray = td.versioned_importorskip("xarray")
 
     times = xarray.cftime_range("0001", periods=2)
     key = cftime.DatetimeGregorian(2000, 1, 1)
@@ -142,7 +142,7 @@ def test_oo_optimized_datetime_index_unpickle():
 
 
 def test_statsmodels():
-    smf = pytest.importorskip("statsmodels.formula.api")
+    smf = td.versioned_importorskip("statsmodels.formula.api")
 
     df = DataFrame(
         {"Lottery": range(5), "Literacy": range(5), "Pop1831": range(100, 105)}
@@ -151,7 +151,7 @@ def test_statsmodels():
 
 
 def test_scikit_learn():
-    pytest.importorskip("sklearn")
+    td.versioned_importorskip("sklearn")
     from sklearn import (
         datasets,
         svm,
@@ -164,7 +164,7 @@ def test_scikit_learn():
 
 
 def test_seaborn():
-    seaborn = pytest.importorskip("seaborn")
+    seaborn = td.versioned_importorskip("seaborn")
     tips = DataFrame(
         {"day": pd.date_range("2023", freq="D", periods=5), "total_bill": range(5)}
     )
@@ -172,12 +172,12 @@ def test_seaborn():
 
 
 def test_pandas_datareader():
-    pytest.importorskip("pandas_datareader")
+    td.versioned_importorskip("pandas_datareader")
 
 
 @pytest.mark.filterwarnings("ignore:Passing a BlockManager:DeprecationWarning")
 def test_pyarrow(df):
-    pyarrow = pytest.importorskip("pyarrow")
+    pyarrow = td.versioned_importorskip("pyarrow")
     table = pyarrow.Table.from_pandas(df)
     result = table.to_pandas()
     tm.assert_frame_equal(result, df)
@@ -185,7 +185,7 @@ def test_pyarrow(df):
 
 def test_yaml_dump(df):
     # GH#42748
-    yaml = pytest.importorskip("yaml")
+    yaml = td.versioned_importorskip("yaml")
 
     dumped = yaml.dump(df)
 
@@ -247,7 +247,7 @@ def test_frame_setitem_dask_array_into_new_col():
     olduse = pd.get_option("compute.use_numexpr")
 
     try:
-        da = pytest.importorskip("dask.array")
+        da = td.versioned_importorskip("dask.array")
 
         dda = da.array([1, 2])
         df = DataFrame({"a": ["a", "b"]})
@@ -348,7 +348,7 @@ def test_dataframe_consortium() -> None:
     Full testing is done at https://github.com/data-apis/dataframe-api-compat,
     this is just to check that the entry point works as expected.
     """
-    pytest.importorskip("dataframe_api_compat")
+    td.versioned_importorskip("dataframe_api_compat")
     df_pd = DataFrame({"a": [1, 2, 3], "b": [4, 5, 6]})
     df = df_pd.__dataframe_consortium_standard__()
     result_1 = df.get_column_names()
@@ -362,7 +362,7 @@ def test_dataframe_consortium() -> None:
 
 def test_xarray_coerce_unit():
     # GH44053
-    xr = pytest.importorskip("xarray")
+    xr = td.versioned_importorskip("xarray")
 
     arr = xr.DataArray([1, 2, 3])
     result = pd.to_datetime(arr, unit="ns")
index a50054f33f382ed913261e0cafd944c2fd86aaa3..d7342c652268872b0881feb8ae7a573f8a286b34 100644 (file)
@@ -500,7 +500,7 @@ class TestnanopsDataFrame:
 
     @pytest.mark.parametrize("ddof", range(3))
     def test_nansem(self, ddof, skipna):
-        sp_stats = pytest.importorskip("scipy.stats")
+        sp_stats = td.versioned_importorskip("scipy.stats")
 
         with np.errstate(invalid="ignore"):
             self.check_funs(
@@ -559,7 +559,7 @@ class TestnanopsDataFrame:
         return result
 
     def test_nanskew(self, skipna):
-        sp_stats = pytest.importorskip("scipy.stats")
+        sp_stats = td.versioned_importorskip("scipy.stats")
 
         func = partial(self._skew_kurt_wrap, func=sp_stats.skew)
         with np.errstate(invalid="ignore"):
@@ -573,7 +573,7 @@ class TestnanopsDataFrame:
             )
 
     def test_nankurt(self, skipna):
-        sp_stats = pytest.importorskip("scipy.stats")
+        sp_stats = td.versioned_importorskip("scipy.stats")
 
         func1 = partial(sp_stats.kurtosis, fisher=True)
         func = partial(self._skew_kurt_wrap, func=func1)
@@ -704,7 +704,7 @@ class TestnanopsDataFrame:
         self.check_nancorr_nancov_1d(nanops.nancorr, targ0, targ1, method="pearson")
 
     def test_nancorr_kendall(self):
-        sp_stats = pytest.importorskip("scipy.stats")
+        sp_stats = td.versioned_importorskip("scipy.stats")
 
         targ0 = sp_stats.kendalltau(self.arr_float_2d, self.arr_float1_2d)[0]
         targ1 = sp_stats.kendalltau(self.arr_float_2d.flat, self.arr_float1_2d.flat)[0]
@@ -714,7 +714,7 @@ class TestnanopsDataFrame:
         self.check_nancorr_nancov_1d(nanops.nancorr, targ0, targ1, method="kendall")
 
     def test_nancorr_spearman(self):
-        sp_stats = pytest.importorskip("scipy.stats")
+        sp_stats = td.versioned_importorskip("scipy.stats")
 
         targ0 = sp_stats.spearmanr(self.arr_float_2d, self.arr_float1_2d)[0]
         targ1 = sp_stats.spearmanr(self.arr_float_2d.flat, self.arr_float1_2d.flat)[0]
@@ -724,7 +724,7 @@ class TestnanopsDataFrame:
         self.check_nancorr_nancov_1d(nanops.nancorr, targ0, targ1, method="spearman")
 
     def test_invalid_method(self):
-        pytest.importorskip("scipy")
+        td.versioned_importorskip("scipy")
         targ0 = np.corrcoef(self.arr_float_2d, self.arr_float1_2d)[0, 1]
         targ1 = np.corrcoef(self.arr_float_2d.flat, self.arr_float1_2d.flat)[0, 1]
         msg = "Unknown method 'foo', expected one of 'kendall', 'spearman'"
index 52b5f636b1254ceddf869704a6378f4ea5012b8c..3d50300aa882fcfca2901029d8a4710fa2daca1b 100644 (file)
@@ -3,6 +3,7 @@ import types
 
 import pytest
 
+import pandas.util._test_decorators as td
 from pandas.compat._optional import (
     VERSIONS,
     import_optional_dependency,
@@ -23,7 +24,7 @@ def test_import_optional():
 
 
 def test_xlrd_version_fallback():
-    pytest.importorskip("xlrd")
+    td.versioned_importorskip("xlrd")
     import_optional_dependency("xlrd")
 
 
index ede38ce9c9a09e705a20eae2dd42bde8216f19cb..c74bf61498caf6026c34896e7fcfe4c4c25056db 100644 (file)
@@ -1002,7 +1002,7 @@ class TestToDatetime:
     @pytest.mark.parametrize("utc", [True, False])
     @pytest.mark.parametrize("tz", [None, "US/Central"])
     def test_to_datetime_arrow(self, tz, utc, arg_class):
-        pa = pytest.importorskip("pyarrow")
+        pa = td.versioned_importorskip("pyarrow")
 
         dti = date_range("1965-04-03", periods=19, freq="2W", tz=tz)
         dti = arg_class(dti)
@@ -1357,7 +1357,7 @@ class TestToDatetime:
 
     def test_to_datetime_tz_psycopg2(self, request, cache):
         # xref 8260
-        psycopg2_tz = pytest.importorskip("psycopg2.tz")
+        psycopg2_tz = td.versioned_importorskip("psycopg2.tz")
 
         # misc cases
         tz1 = psycopg2_tz.FixedOffsetTimezone(offset=-300, name=None)
@@ -3742,7 +3742,7 @@ def test_ignoring_unknown_tz_deprecated():
 
 def test_from_numeric_arrow_dtype(any_numeric_ea_dtype):
     # GH 52425
-    pytest.importorskip("pyarrow")
+    td.versioned_importorskip("pyarrow")
     ser = Series([1, 2], dtype=f"{any_numeric_ea_dtype.lower()}[pyarrow]")
     result = to_datetime(ser)
     expected = Series([1, 2], dtype="datetime64[ns]")
index c452382ec572bd24cf704c445f24f9af87947141..7cd9889e841e93cc2cc5b4f10c7bcad85216b775 100644 (file)
@@ -867,7 +867,7 @@ def test_to_numeric_dtype_backend(val, dtype):
 def test_to_numeric_dtype_backend_na(val, dtype):
     # GH#50505
     if "pyarrow" in dtype:
-        pytest.importorskip("pyarrow")
+        td.versioned_importorskip("pyarrow")
         dtype_backend = "pyarrow"
     else:
         dtype_backend = "numpy_nullable"
@@ -891,7 +891,7 @@ def test_to_numeric_dtype_backend_na(val, dtype):
 def test_to_numeric_dtype_backend_downcasting(val, dtype, downcast):
     # GH#50505
     if "pyarrow" in dtype:
-        pytest.importorskip("pyarrow")
+        td.versioned_importorskip("pyarrow")
         dtype_backend = "pyarrow"
     else:
         dtype_backend = "numpy_nullable"
@@ -908,7 +908,7 @@ def test_to_numeric_dtype_backend_downcasting(val, dtype, downcast):
 def test_to_numeric_dtype_backend_downcasting_uint(smaller, dtype_backend):
     # GH#50505
     if dtype_backend == "pyarrow":
-        pytest.importorskip("pyarrow")
+        td.versioned_importorskip("pyarrow")
     ser = Series([1, pd.NA], dtype="UInt64")
     result = to_numeric(ser, dtype_backend=dtype_backend, downcast="unsigned")
     expected = Series([1, pd.NA], dtype=smaller)
@@ -931,7 +931,7 @@ def test_to_numeric_dtype_backend_downcasting_uint(smaller, dtype_backend):
 def test_to_numeric_dtype_backend_already_nullable(dtype):
     # GH#50505
     if "pyarrow" in dtype:
-        pytest.importorskip("pyarrow")
+        td.versioned_importorskip("pyarrow")
     ser = Series([1, pd.NA], dtype=dtype)
     result = to_numeric(ser, dtype_backend="numpy_nullable")
     expected = Series([1, pd.NA], dtype=dtype)
@@ -971,7 +971,7 @@ def test_invalid_dtype_backend():
 
 def test_coerce_pyarrow_backend():
     # GH 52588
-    pa = pytest.importorskip("pyarrow")
+    pa = td.versioned_importorskip("pyarrow")
     ser = Series(list("12x"), dtype=ArrowDtype(pa.string()))
     result = to_numeric(ser, errors="coerce", dtype_backend="pyarrow")
     expected = Series([1, 2, None], dtype=ArrowDtype(pa.int64()))
index 5a75988e4ff80726bcde64cd66a66f3b9343db49..3852c7a9eda0be24a1d18802acbc93fe81508cdb 100644 (file)
@@ -6,6 +6,7 @@ from datetime import (
 import numpy as np
 import pytest
 
+import pandas.util._test_decorators as td
 from pandas.compat import IS64
 from pandas.errors import OutOfBoundsTimedelta
 
@@ -324,7 +325,7 @@ class TestTimedeltas:
 
 def test_from_numeric_arrow_dtype(any_numeric_ea_dtype):
     # GH 52425
-    pytest.importorskip("pyarrow")
+    td.versioned_importorskip("pyarrow")
     ser = Series([1, 2], dtype=f"{any_numeric_ea_dtype.lower()}[pyarrow]")
     result = to_timedelta(ser)
     expected = Series([1, 2], dtype="timedelta64[ns]")
@@ -334,7 +335,7 @@ def test_from_numeric_arrow_dtype(any_numeric_ea_dtype):
 @pytest.mark.parametrize("unit", ["ns", "ms"])
 def test_from_timedelta_arrow_dtype(unit):
     # GH 54298
-    pytest.importorskip("pyarrow")
+    td.versioned_importorskip("pyarrow")
     expected = Series([timedelta(1)], dtype=f"duration[{unit}][pyarrow]")
     result = to_timedelta(expected)
     tm.assert_series_equal(result, expected)
index 14d3a39107bc4de7ee3d39e3a5968ab381bc1569..def048b2ba3f5a875ac9bc56d1a10a9f1d3df83e 100644 (file)
@@ -1,6 +1,7 @@
 import numpy as np
 import pytest
 
+import pandas.util._test_decorators as td
 from pandas import (
     DataFrame,
     Series,
@@ -9,7 +10,7 @@ import pandas._testing as tm
 
 pytestmark = pytest.mark.single_cpu
 
-pytest.importorskip("numba")
+td.versioned_importorskip("numba")
 
 
 @pytest.mark.filterwarnings("ignore")
index 79c14f243e7cc93b395ea84e05ec6bc79942b79b..c30d50037c074f9d6a197e7800aec7de72a28929 100644 (file)
@@ -3,6 +3,7 @@ from functools import partial
 import numpy as np
 import pytest
 
+import pandas.util._test_decorators as td
 from pandas import (
     DataFrame,
     Series,
@@ -17,7 +18,7 @@ from pandas.tseries import offsets
 
 @pytest.mark.parametrize("sp_func, roll_func", [["kurtosis", "kurt"], ["skew", "skew"]])
 def test_series(series, sp_func, roll_func):
-    sp_stats = pytest.importorskip("scipy.stats")
+    sp_stats = td.versioned_importorskip("scipy.stats")
 
     compare_func = partial(getattr(sp_stats, sp_func), bias=False)
     result = getattr(series.rolling(50), roll_func)()
@@ -27,7 +28,7 @@ def test_series(series, sp_func, roll_func):
 
 @pytest.mark.parametrize("sp_func, roll_func", [["kurtosis", "kurt"], ["skew", "skew"]])
 def test_frame(raw, frame, sp_func, roll_func):
-    sp_stats = pytest.importorskip("scipy.stats")
+    sp_stats = td.versioned_importorskip("scipy.stats")
 
     compare_func = partial(getattr(sp_stats, sp_func), bias=False)
     result = getattr(frame.rolling(50), roll_func)()
@@ -41,7 +42,7 @@ def test_frame(raw, frame, sp_func, roll_func):
 
 @pytest.mark.parametrize("sp_func, roll_func", [["kurtosis", "kurt"], ["skew", "skew"]])
 def test_time_rule_series(series, sp_func, roll_func):
-    sp_stats = pytest.importorskip("scipy.stats")
+    sp_stats = td.versioned_importorskip("scipy.stats")
 
     compare_func = partial(getattr(sp_stats, sp_func), bias=False)
     win = 25
@@ -56,7 +57,7 @@ def test_time_rule_series(series, sp_func, roll_func):
 
 @pytest.mark.parametrize("sp_func, roll_func", [["kurtosis", "kurt"], ["skew", "skew"]])
 def test_time_rule_frame(raw, frame, sp_func, roll_func):
-    sp_stats = pytest.importorskip("scipy.stats")
+    sp_stats = td.versioned_importorskip("scipy.stats")
 
     compare_func = partial(getattr(sp_stats, sp_func), bias=False)
     win = 25
@@ -75,7 +76,7 @@ def test_time_rule_frame(raw, frame, sp_func, roll_func):
 
 @pytest.mark.parametrize("sp_func, roll_func", [["kurtosis", "kurt"], ["skew", "skew"]])
 def test_nans(sp_func, roll_func):
-    sp_stats = pytest.importorskip("scipy.stats")
+    sp_stats = td.versioned_importorskip("scipy.stats")
 
     compare_func = partial(getattr(sp_stats, sp_func), bias=False)
     obj = Series(np.random.default_rng(2).standard_normal(50))
index 5052019ddb7264c4f81e99ccdd79d88d86865ec4..f69d23dd8ef4bca8fa2b238f03a301f309467467 100644 (file)
@@ -1,6 +1,7 @@
 import numpy as np
 import pytest
 
+import pandas.util._test_decorators as td
 from pandas import (
     DataFrame,
     Series,
@@ -35,7 +36,7 @@ def win_types_special(request):
 
 def test_constructor(frame_or_series):
     # GH 12669
-    pytest.importorskip("scipy")
+    td.versioned_importorskip("scipy")
     c = frame_or_series(range(5)).rolling
 
     # valid
@@ -47,7 +48,7 @@ def test_constructor(frame_or_series):
 @pytest.mark.parametrize("w", [2.0, "foo", np.array([2])])
 def test_invalid_constructor(frame_or_series, w):
     # not valid
-    pytest.importorskip("scipy")
+    td.versioned_importorskip("scipy")
     c = frame_or_series(range(5)).rolling
     with pytest.raises(ValueError, match="min_periods must be an integer"):
         c(win_type="boxcar", window=2, min_periods=w)
@@ -57,7 +58,7 @@ def test_invalid_constructor(frame_or_series, w):
 
 @pytest.mark.parametrize("wt", ["foobar", 1])
 def test_invalid_constructor_wintype(frame_or_series, wt):
-    pytest.importorskip("scipy")
+    td.versioned_importorskip("scipy")
     c = frame_or_series(range(5)).rolling
     with pytest.raises(ValueError, match="Invalid win_type"):
         c(win_type=wt, window=2)
@@ -65,14 +66,14 @@ def test_invalid_constructor_wintype(frame_or_series, wt):
 
 def test_constructor_with_win_type(frame_or_series, win_types):
     # GH 12669
-    pytest.importorskip("scipy")
+    td.versioned_importorskip("scipy")
     c = frame_or_series(range(5)).rolling
     c(win_type=win_types, window=2)
 
 
 @pytest.mark.parametrize("arg", ["median", "kurt", "skew"])
 def test_agg_function_support(arg):
-    pytest.importorskip("scipy")
+    td.versioned_importorskip("scipy")
     df = DataFrame({"A": np.arange(5)})
     roll = df.rolling(2, win_type="triang")
 
@@ -89,7 +90,7 @@ def test_agg_function_support(arg):
 
 def test_invalid_scipy_arg():
     # This error is raised by scipy
-    pytest.importorskip("scipy")
+    td.versioned_importorskip("scipy")
     msg = r"boxcar\(\) got an unexpected"
     with pytest.raises(TypeError, match=msg):
         Series(range(3)).rolling(1, win_type="boxcar").mean(foo="bar")
@@ -97,7 +98,7 @@ def test_invalid_scipy_arg():
 
 def test_constructor_with_win_type_invalid(frame_or_series):
     # GH 13383
-    pytest.importorskip("scipy")
+    td.versioned_importorskip("scipy")
     c = frame_or_series(range(5)).rolling
 
     msg = "window must be an integer 0 or greater"
@@ -108,7 +109,7 @@ def test_constructor_with_win_type_invalid(frame_or_series):
 
 def test_window_with_args(step):
     # make sure that we are aggregating window functions correctly with arg
-    pytest.importorskip("scipy")
+    td.versioned_importorskip("scipy")
     r = Series(np.random.default_rng(2).standard_normal(100)).rolling(
         window=10, min_periods=1, win_type="gaussian", step=step
     )
@@ -130,7 +131,7 @@ def test_window_with_args(step):
 
 
 def test_win_type_with_method_invalid():
-    pytest.importorskip("scipy")
+    td.versioned_importorskip("scipy")
     with pytest.raises(
         NotImplementedError, match="'single' is the only supported method type."
     ):
@@ -140,7 +141,7 @@ def test_win_type_with_method_invalid():
 @pytest.mark.parametrize("arg", [2000000000, "2s", Timedelta("2s")])
 def test_consistent_win_type_freq(arg):
     # GH 15969
-    pytest.importorskip("scipy")
+    td.versioned_importorskip("scipy")
     s = Series(range(1))
     with pytest.raises(ValueError, match="Invalid win_type freq"):
         s.rolling(arg, win_type="freq")
@@ -153,7 +154,7 @@ def test_win_type_freq_return_none():
 
 
 def test_win_type_not_implemented():
-    pytest.importorskip("scipy")
+    td.versioned_importorskip("scipy")
 
     class CustomIndexer(BaseIndexer):
         def get_window_bounds(self, num_values, min_periods, center, closed, step):
@@ -167,7 +168,7 @@ def test_win_type_not_implemented():
 
 def test_cmov_mean(step):
     # GH 8238
-    pytest.importorskip("scipy")
+    td.versioned_importorskip("scipy")
     vals = np.array([6.95, 15.21, 4.72, 9.12, 13.81, 13.49, 16.68, 9.48, 10.63, 14.48])
     result = Series(vals).rolling(5, center=True, step=step).mean()
     expected_values = [
@@ -188,7 +189,7 @@ def test_cmov_mean(step):
 
 def test_cmov_window(step):
     # GH 8238
-    pytest.importorskip("scipy")
+    td.versioned_importorskip("scipy")
     vals = np.array([6.95, 15.21, 4.72, 9.12, 13.81, 13.49, 16.68, 9.48, 10.63, 14.48])
     result = Series(vals).rolling(5, win_type="boxcar", center=True, step=step).mean()
     expected_values = [
@@ -210,7 +211,7 @@ def test_cmov_window(step):
 def test_cmov_window_corner(step):
     # GH 8238
     # all nan
-    pytest.importorskip("scipy")
+    td.versioned_importorskip("scipy")
     vals = Series([np.nan] * 10)
     result = vals.rolling(5, center=True, win_type="boxcar", step=step).mean()
     assert np.isnan(result).all()
@@ -294,7 +295,7 @@ def test_cmov_window_corner(step):
 )
 def test_cmov_window_frame(f, xp, step):
     # Gh 8238
-    pytest.importorskip("scipy")
+    td.versioned_importorskip("scipy")
     df = DataFrame(
         np.array(
             [
@@ -321,7 +322,7 @@ def test_cmov_window_frame(f, xp, step):
 
 @pytest.mark.parametrize("min_periods", [0, 1, 2, 3, 4, 5])
 def test_cmov_window_na_min_periods(step, min_periods):
-    pytest.importorskip("scipy")
+    td.versioned_importorskip("scipy")
     vals = Series(np.random.default_rng(2).standard_normal(10))
     vals[4] = np.nan
     vals[8] = np.nan
@@ -335,7 +336,7 @@ def test_cmov_window_na_min_periods(step, min_periods):
 
 def test_cmov_window_regular(win_types, step):
     # GH 8238
-    pytest.importorskip("scipy")
+    td.versioned_importorskip("scipy")
     vals = np.array([6.95, 15.21, 4.72, 9.12, 13.81, 13.49, 16.68, 9.48, 10.63, 14.48])
     xps = {
         "hamming": [
@@ -443,7 +444,7 @@ def test_cmov_window_regular(win_types, step):
 
 def test_cmov_window_regular_linear_range(win_types, step):
     # GH 8238
-    pytest.importorskip("scipy")
+    td.versioned_importorskip("scipy")
     vals = np.array(range(10), dtype=float)
     xp = vals.copy()
     xp[:2] = np.nan
@@ -456,7 +457,7 @@ def test_cmov_window_regular_linear_range(win_types, step):
 
 def test_cmov_window_regular_missing_data(win_types, step):
     # GH 8238
-    pytest.importorskip("scipy")
+    td.versioned_importorskip("scipy")
     vals = np.array(
         [6.95, 15.21, 4.72, 9.12, 13.81, 13.49, 16.68, np.nan, 10.63, 14.48]
     )
@@ -566,7 +567,7 @@ def test_cmov_window_regular_missing_data(win_types, step):
 
 def test_cmov_window_special(win_types_special, step):
     # GH 8238
-    pytest.importorskip("scipy")
+    td.versioned_importorskip("scipy")
     kwds = {
         "kaiser": {"beta": 1.0},
         "gaussian": {"std": 1.0},
@@ -638,7 +639,7 @@ def test_cmov_window_special(win_types_special, step):
 
 def test_cmov_window_special_linear_range(win_types_special, step):
     # GH 8238
-    pytest.importorskip("scipy")
+    td.versioned_importorskip("scipy")
     kwds = {
         "kaiser": {"beta": 1.0},
         "gaussian": {"std": 1.0},
@@ -663,7 +664,7 @@ def test_cmov_window_special_linear_range(win_types_special, step):
 
 def test_weighted_var_big_window_no_segfault(win_types, center):
     # GitHub Issue #46772
-    pytest.importorskip("scipy")
+    td.versioned_importorskip("scipy")
     x = Series(0)
     result = x.rolling(window=16, center=center, win_type=win_types).var()
     expected = Series(np.nan)
@@ -672,7 +673,7 @@ def test_weighted_var_big_window_no_segfault(win_types, center):
 
 
 def test_rolling_center_axis_1():
-    pytest.importorskip("scipy")
+    td.versioned_importorskip("scipy")
     df = DataFrame(
         {"a": [1, 1, 0, 0, 0, 1], "b": [1, 0, 0, 1, 0, 0], "c": [1, 0, 0, 1, 0, 1]}
     )
index 2c1912bce856dd2694447d820ea2c5124be9c1a0..3315b55c96fc863eb1669c16617c479c32ff7b74 100644 (file)
@@ -79,8 +79,8 @@ def skip_if_no(package: str, min_version: str | None = None) -> pytest.MarkDecor
 
     The mark can be used as either a decorator for a test class or to be
     applied to parameters in pytest.mark.parametrize calls or parametrized
-    fixtures. Use pytest.importorskip if an imported moduled is later needed
-    or for test functions.
+    fixtures. Use td.versioned_importorskip if an imported module is later
+    needed or for test functions.
 
     If the import and version check are unsuccessful, then the test function
     (or test case when used in conjunction with parametrization) will be
@@ -171,3 +171,22 @@ skip_copy_on_write_invalid_test = pytest.mark.skipif(
     get_option("mode.copy_on_write") is True,
     reason="Test not valid for Copy-on-Write mode",
 )
+
+def versioned_importorskip(*args, **kwargs):
+    """
+    (warning - this is currently Debian-specific, the name may change if upstream request this)
+
+    Return the requested module, or skip the test if it is
+    not available in a new enough version.
+
+    Intended as a replacement for pytest.importorskip that
+    defaults to requiring at least pandas' minimum version for that
+    optional dependency, rather than any version.
+
+    See import_optional_dependency for full parameter documentation.
+    """
+    try:
+        module = import_optional_dependency(*args, **kwargs)
+    except ImportError as exc:
+        pytest.skip(str(exc), allow_module_level=True)
+    return module