1
1
import re
2
2
from copy import copy
3
3
from typing import Any , Callable , Dict , List , NamedTuple , Set , Tuple
4
+ from unittest .mock import MagicMock
4
5
5
6
import numpy as np
6
7
import pytest
@@ -79,7 +80,8 @@ def __repr__(self) -> str:
79
80
return f"LibraryInfo(<{ self .name } >)"
80
81
81
82
82
- libinfo_params = []
83
+ unskipped_params = []
84
+ skipped_params = []
83
85
84
86
85
87
# pandas
@@ -89,7 +91,9 @@ def __repr__(self) -> str:
89
91
import pandas as pd
90
92
from pandas .api .interchange import from_dataframe as pandas_from_dataframe
91
93
except ImportError as e :
92
- libinfo_params .append (pytest .param ("pandas" , marks = pytest .mark .skip (reason = e .msg )))
94
+ skipped_params .append (
95
+ pytest .param (None , id = "pandas" , marks = pytest .mark .skip (reason = e .msg ))
96
+ )
93
97
else :
94
98
95
99
def pandas_mock_to_toplevel (mock_df : MockDataFrame ) -> pd .DataFrame :
@@ -112,7 +116,7 @@ def pandas_mock_to_toplevel(mock_df: MockDataFrame) -> pd.DataFrame:
112
116
from_dataframe = pandas_from_dataframe ,
113
117
frame_equal = lambda df1 , df2 : df1 .equals (df2 ),
114
118
)
115
- libinfo_params .append (pytest .param (pandas_libinfo , id = pandas_libinfo .name ))
119
+ unskipped_params .append (pytest .param (pandas_libinfo , id = pandas_libinfo .name ))
116
120
117
121
118
122
# vaex
@@ -122,7 +126,9 @@ def pandas_mock_to_toplevel(mock_df: MockDataFrame) -> pd.DataFrame:
122
126
import vaex
123
127
from vaex .dataframe_protocol import from_dataframe_to_vaex as vaex_from_dataframe
124
128
except ImportError as e :
125
- libinfo_params .append (pytest .param ("vaex" , marks = pytest .mark .skip (reason = e .msg )))
129
+ skipped_params .append (
130
+ pytest .param (None , id = "modin" , marks = pytest .mark .skip (reason = e .msg ))
131
+ )
126
132
else :
127
133
128
134
def vaex_mock_to_toplevel (mock_df : MockDataFrame ) -> TopLevelDataFrame :
@@ -172,30 +178,24 @@ def vaex_frame_equal(df1, df2) -> bool:
172
178
allow_zero_cols = False ,
173
179
allow_zero_rows = False ,
174
180
)
175
- libinfo_params .append (pytest .param (vaex_libinfo , id = vaex_libinfo .name ))
181
+ unskipped_params .append (pytest .param (vaex_libinfo , id = vaex_libinfo .name ))
176
182
177
183
178
184
# modin
179
185
# -----
180
186
181
187
182
188
try :
183
- import modin # noqa: F401
189
+ # ethereal hacks! ----------------------------------------------------------
190
+ import pandas
184
191
185
- try :
186
- import pandas
187
- from pandas .core import base
188
- from pandas .errors import DataError
189
- except ImportError :
190
- pass
191
- else :
192
- # One issue modin has with pandas upstream is an outdated import of an
193
- # exception class, so we try monkey-patching the class to the old path.
194
- setattr (base , "DataError" , DataError )
195
- # modin also hard checks for supported pandas versions, so we
196
- # monkey-patch a supported version.
197
- setattr (pandas , "__version__" , "1.4.3" )
192
+ setattr (pandas , "__getattr__" , MagicMock ())
193
+ if not hasattr (pandas .DataFrame , "mad" ):
194
+ setattr (pandas .DataFrame , "mad" , MagicMock ())
195
+ setattr (pandas .core .indexing , "__getattr__" , MagicMock ())
196
+ # ------------------------------------------------------------ end of hacks.
198
197
198
+ import modin # noqa: F401
199
199
import ray
200
200
201
201
# Without local_mode=True, ray does not use our monkey-patched pandas
@@ -208,7 +208,9 @@ def vaex_frame_equal(df1, df2) -> bool:
208
208
from modin import pandas as mpd
209
209
from modin .pandas .utils import from_dataframe as modin_from_dataframe
210
210
except ImportError as e :
211
- libinfo_params .append (pytest .param ("modin" , marks = pytest .mark .skip (reason = e .msg )))
211
+ skipped_params .append (
212
+ pytest .param (None , id = "modin" , marks = pytest .mark .skip (reason = e .msg ))
213
+ )
212
214
else :
213
215
214
216
def modin_mock_to_toplevel (mock_df : MockDataFrame ) -> mpd .DataFrame :
@@ -259,15 +261,15 @@ def modin_frame_equal(df1: mpd.DataFrame, df2: mpd.DataFrame) -> bool:
259
261
# https://github.com/modin-project/modin/issues/4643
260
262
allow_zero_rows = False ,
261
263
)
262
- libinfo_params .append (pytest .param (modin_libinfo , id = modin_libinfo .name ))
264
+ unskipped_params .append (pytest .param (modin_libinfo , id = modin_libinfo .name ))
263
265
264
266
265
267
# cuDF
266
268
# -----
267
269
268
270
269
271
try :
270
- # cudf has a few issues with upstream pandas that we "fix" with a few hacks
272
+ # ethereal hacks! ----------------------------------------------------------
271
273
try :
272
274
import pandas
273
275
import pyarrow
@@ -294,11 +296,14 @@ def register_extension_type(*a, **kw):
294
296
setattr (pyarrow , "register_extension_type" , register_extension_type )
295
297
setattr (datetimes , "_guess_datetime_format" , guess_datetime_format )
296
298
setattr (pandas , "__version__" , "1.4.3" )
299
+ # ------------------------------------------------------------ end of hacks.
297
300
298
301
import cudf
299
302
from cudf .core .df_protocol import from_dataframe as cudf_from_dataframe
300
303
except ImportError as e :
301
- libinfo_params .append (pytest .param ("cudf" , marks = pytest .mark .skip (reason = e .msg )))
304
+ skipped_params .append (
305
+ pytest .param (None , id = "cudf" , marks = pytest .mark .skip (reason = e .msg ))
306
+ )
302
307
else :
303
308
304
309
def cudf_mock_to_toplevel (mock_df : MockDataFrame ) -> cudf .DataFrame :
@@ -332,12 +337,24 @@ def cudf_mock_to_toplevel(mock_df: MockDataFrame) -> cudf.DataFrame:
332
337
NominalDtype .UTF8 ,
333
338
},
334
339
)
335
- libinfo_params .append (pytest .param (cudf_libinfo , id = cudf_libinfo .name ))
340
+ unskipped_params .append (pytest .param (cudf_libinfo , id = cudf_libinfo .name ))
336
341
342
+ libinfo_params = skipped_params + unskipped_params
343
+ ids = [p .id for p in libinfo_params ]
344
+ assert len (set (ids )) == len (ids ), f"ids: { ids } " # sanity check
337
345
338
346
libname_to_libinfo : Dict [str , LibraryInfo ] = {}
339
347
for param in libinfo_params :
340
348
if not any (m .name .startswith ("skip" ) for m in param .marks ):
341
349
libinfo = param .values [0 ]
342
350
assert isinstance (libinfo , LibraryInfo ) # for mypy
343
351
libname_to_libinfo [libinfo .name ] = libinfo
352
+
353
+
354
+ if __name__ == "__main__" :
355
+ print (f"Wrapped libraries: { [p .id for p in unskipped_params ]} " )
356
+ if len (skipped_params ) > 0 :
357
+ print ("Skipped libraries:" )
358
+ for p in skipped_params :
359
+ m = next (m for m in p .marks if m .name == "skip" )
360
+ print (f" { p .id } ; reason={ m .kwargs ['reason' ]} " )
0 commit comments