Skip to content
This repository was archived by the owner on Jan 12, 2026. It is now read-only.

Commit f72f94b

Browse files
Switch to use packaging.Version from distutils LooseVersion (#232)
1 parent add6671 commit f72f94b

File tree

7 files changed

+36
-34
lines changed

7 files changed

+36
-34
lines changed

requirements-test.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ flake8==3.7.7
22
flake8-comprehensions
33
flake8-quotes==2.0.0
44
yapf==0.23.0
5+
packaging
56
petastorm
67
pytest
78
pyarrow
@@ -11,4 +12,4 @@ modin
1112
dask
1213

1314
#workaround for now
14-
tensorboardX==2.2
15+
tensorboardX==2.2

setup.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,5 +10,6 @@
1010
"distributed computing framework Ray.",
1111
url="https://github.com/ray-project/xgboost_ray",
1212
install_requires=[
13-
"ray>=1.10", "numpy>=1.16", "pandas", "wrapt>=1.12.1", "xgboost>=0.90"
13+
"ray>=1.10", "numpy>=1.16", "pandas", "wrapt>=1.12.1", "xgboost>=0.90",
14+
'packaging'
1415
])

xgboost_ray/data_sources/modin.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@
1515
try:
1616
import modin # noqa: F401
1717
from modin.config.envvars import Engine
18-
from distutils.version import LooseVersion
19-
MODIN_INSTALLED = LooseVersion(modin.__version__) >= LooseVersion("0.9.0")
18+
from packaging.version import Version
19+
MODIN_INSTALLED = Version(modin.__version__) >= Version("0.9.0")
2020

2121
# Check if importing the Ray engine leads to errors
2222
Engine().get()

xgboost_ray/main.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import platform
22
from typing import Tuple, Dict, Any, List, Optional, Callable, Union, Sequence
33
from dataclasses import dataclass, field
4-
from distutils.version import LooseVersion
4+
from packaging.version import Version
55

66
import functools
77
import multiprocessing
@@ -128,8 +128,8 @@ def __getattribute__(self, item):
128128
f"fully tested and supported for XGBoost >= 1.4. Please consider "
129129
f"upgrading your XGBoost version (`pip install -U xgboost`).")
130130

131-
# XGBoost LooseVersion for comparisions
132-
XGBOOST_LOOSE_VERSION = LooseVersion(xgboost_version)
131+
# XGBoost Version for comparisions
132+
XGBOOST_VERSION = Version(xgboost_version)
133133

134134

135135
class RayXGBoostTrainingError(RuntimeError):
@@ -260,7 +260,7 @@ def __exit__(self, *args):
260260

261261
def _ray_get_actor_cpus():
262262
# Get through resource IDs
263-
if LooseVersion(ray.__version__) < LooseVersion("2.0.0"):
263+
if Version(ray.__version__) < Version("2.0.0"):
264264
# Remove after 2.2?
265265
resource_ids = ray.worker.get_resource_ids()
266266
if "CPU" in resource_ids:

xgboost_ray/sklearn.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
# https://github.com/dmlc/xgboost/blob/c6a0bdbb5a68232cd59ea556c981c633cc0646ca/LICENSE
2626

2727
from typing import Callable, Tuple, Dict, Optional, Union, Any, List
28-
from distutils.version import LooseVersion
28+
from packaging.version import Version
2929

3030
import numpy as np
3131

@@ -35,7 +35,7 @@
3535

3636
from ray.util.annotations import PublicAPI, DeveloperAPI
3737

38-
from xgboost_ray.main import (RayParams, train, predict, XGBOOST_LOOSE_VERSION,
38+
from xgboost_ray.main import (RayParams, train, predict, XGBOOST_VERSION,
3939
LEGACY_WARNING)
4040
from xgboost_ray.matrix import RayDMatrix
4141

@@ -236,7 +236,7 @@ def _xgboost_version_warn(f):
236236

237237
@functools.wraps(f)
238238
def inner_f(*args, **kwargs):
239-
if XGBOOST_LOOSE_VERSION < LooseVersion("1.4.0"):
239+
if XGBOOST_VERSION < Version("1.4.0"):
240240
warnings.warn(LEGACY_WARNING)
241241
return f(*args, **kwargs)
242242

xgboost_ray/tests/test_sklearn.py

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
import numpy as np
2929
import xgboost as xgb
3030
import unittest
31-
from distutils.version import LooseVersion
31+
from packaging.version import Version
3232

3333
# import io
3434
# from contextlib import redirect_stdout, redirect_stderr
@@ -43,8 +43,8 @@
4343
RayXGBRFClassifier, RayXGBRFRegressor,
4444
RayXGBRanker)
4545

46-
from xgboost_ray.main import (XGBOOST_LOOSE_VERSION, RayDMatrix, RayParams,
47-
train, predict)
46+
from xgboost_ray.main import (XGBOOST_VERSION, RayDMatrix, RayParams, train,
47+
predict)
4848
from xgboost_ray.matrix import RayShardingMode
4949

5050

@@ -135,7 +135,7 @@ def test_binary_classification_dmatrix_params(self):
135135
ray_dmatrix_params={"sharding": RayShardingMode.BATCH})
136136

137137
# ray: added for legacy CI test
138-
@unittest.skipIf(XGBOOST_LOOSE_VERSION < LooseVersion("1.0.0"),
138+
@unittest.skipIf(XGBOOST_VERSION < Version("1.0.0"),
139139
f"not supported in xgb version {xgb.__version__}")
140140
def test_binary_rf_classification(self):
141141
self.run_binary_classification(RayXGBRFClassifier)
@@ -194,7 +194,7 @@ def check_pred(preds, labels, output_margin):
194194
assert proba.shape[0] == X.shape[0]
195195
assert proba.shape[1] == cls.n_classes_
196196

197-
@unittest.skipIf(XGBOOST_LOOSE_VERSION < LooseVersion("1.4.0"),
197+
@unittest.skipIf(XGBOOST_VERSION < Version("1.4.0"),
198198
f"not supported in xgb version {xgb.__version__}")
199199
def test_best_ntree_limit(self):
200200
self._init_ray()
@@ -307,13 +307,13 @@ def test_num_parallel_tree(self):
307307
dump = bst.get_booster().get_dump(dump_format="json")
308308
assert len(dump) == 16
309309

310-
if XGBOOST_LOOSE_VERSION != LooseVersion("0.90"):
310+
if XGBOOST_VERSION != Version("0.90"):
311311
reg = RayXGBRFRegressor(n_estimators=4)
312312
bst = reg.fit(X=boston["data"], y=boston["target"])
313313
dump = bst.get_booster().get_dump(dump_format="json")
314314
assert len(dump) == 4
315315

316-
if XGBOOST_LOOSE_VERSION >= LooseVersion("1.6.0"):
316+
if XGBOOST_VERSION >= Version("1.6.0"):
317317
config = json.loads(bst.get_booster().save_config())
318318
assert (int(config["learner"]["gradient_booster"][
319319
"gbtree_model_param"]["num_parallel_tree"]) == 4)
@@ -351,7 +351,7 @@ def test_boston_housing_regression(self):
351351
assert mean_squared_error(preds3, labels) < 25
352352
assert mean_squared_error(preds4, labels) < 350
353353

354-
@unittest.skipIf(XGBOOST_LOOSE_VERSION < LooseVersion("1.0.0"),
354+
@unittest.skipIf(XGBOOST_VERSION < Version("1.0.0"),
355355
f"not supported in xgb version {xgb.__version__}")
356356
def run_boston_housing_rf_regression(self, tree_method):
357357
from sklearn.metrics import mean_squared_error
@@ -523,7 +523,7 @@ def test_sklearn_api_gblinear(self):
523523
if p != l]) * 1.0 / len(te_l))
524524
assert err < 0.5
525525

526-
@unittest.skipIf(XGBOOST_LOOSE_VERSION < LooseVersion("1.0.0"),
526+
@unittest.skipIf(XGBOOST_VERSION < Version("1.0.0"),
527527
f"not supported in xgb version {xgb.__version__}")
528528
def test_sklearn_random_state(self):
529529
self._init_ray()
@@ -538,7 +538,7 @@ def test_sklearn_random_state(self):
538538
clf = RayXGBClassifier(random_state=random_state)
539539
assert isinstance(clf.get_xgb_params()["random_state"], int)
540540

541-
@unittest.skipIf(XGBOOST_LOOSE_VERSION < LooseVersion("1.0.0"),
541+
@unittest.skipIf(XGBOOST_VERSION < Version("1.0.0"),
542542
f"not supported in xgb version {xgb.__version__}")
543543
def test_sklearn_n_jobs(self):
544544
self._init_ray()
@@ -549,7 +549,7 @@ def test_sklearn_n_jobs(self):
549549
clf = RayXGBClassifier(n_jobs=2)
550550
assert clf.get_xgb_params()["n_jobs"] == 2
551551

552-
@unittest.skipIf(XGBOOST_LOOSE_VERSION < LooseVersion("1.3.0"),
552+
@unittest.skipIf(XGBOOST_VERSION < Version("1.3.0"),
553553
f"not supported in xgb version {xgb.__version__}")
554554
def test_parameters_access(self):
555555
self._init_ray()
@@ -615,7 +615,7 @@ def test_sklearn_clone(self):
615615
clf.n_jobs = -1
616616
clone(clf)
617617

618-
@unittest.skipIf(XGBOOST_LOOSE_VERSION < LooseVersion("1.0.0"),
618+
@unittest.skipIf(XGBOOST_VERSION < Version("1.0.0"),
619619
f"not supported in xgb version {xgb.__version__}")
620620
def test_sklearn_get_default_params(self):
621621
self._init_ray()
@@ -630,7 +630,7 @@ def test_sklearn_get_default_params(self):
630630
cls.fit(X[:4, ...], y[:4, ...])
631631
assert cls.get_params()["base_score"] is not None
632632

633-
@unittest.skipIf(XGBOOST_LOOSE_VERSION < LooseVersion("1.1.0"),
633+
@unittest.skipIf(XGBOOST_VERSION < Version("1.1.0"),
634634
f"not supported in xgb version {xgb.__version__}")
635635
def test_validation_weights_xgbmodel(self):
636636
self._init_ray()
@@ -802,7 +802,7 @@ def save_load_model(self, model_path):
802802
xgb_model = xgb.XGBModel()
803803
xgb_model.load_model(model_path)
804804

805-
@unittest.skipIf(XGBOOST_LOOSE_VERSION < LooseVersion("1.3.0"),
805+
@unittest.skipIf(XGBOOST_VERSION < Version("1.3.0"),
806806
f"not supported in xgb version {xgb.__version__}")
807807
def test_save_load_model(self):
808808
self._init_ray()
@@ -956,7 +956,7 @@ def test_XGBClassifier_resume(self):
956956
assert np.any(pred1 != pred2)
957957
assert log_loss1 > log_loss2
958958

959-
@unittest.skipIf(XGBOOST_LOOSE_VERSION < LooseVersion("1.0.0"),
959+
@unittest.skipIf(XGBOOST_VERSION < Version("1.0.0"),
960960
f"not supported in xgb version {xgb.__version__}")
961961
def test_constraint_parameters(self):
962962
self._init_ray()
@@ -967,7 +967,7 @@ def test_constraint_parameters(self):
967967
reg.fit(X, y)
968968

969969
config = json.loads(reg.get_booster().save_config())
970-
if XGBOOST_LOOSE_VERSION >= LooseVersion("1.6.0"):
970+
if XGBOOST_VERSION >= Version("1.6.0"):
971971
assert (config["learner"]["gradient_booster"]["updater"][
972972
"grow_histmaker"]["train_param"]["interaction_constraints"] ==
973973
"[[0, 1], [2, 3, 4]]")
@@ -1176,12 +1176,12 @@ def boost_from_prediction(self, tree_method):
11761176

11771177
self.run_boost_from_prediction(tree_method)
11781178

1179-
@unittest.skipIf(XGBOOST_LOOSE_VERSION < LooseVersion("1.0.0"),
1179+
@unittest.skipIf(XGBOOST_VERSION < Version("1.0.0"),
11801180
f"not supported in xgb version {xgb.__version__}")
11811181
def test_boost_from_prediction_hist(self):
11821182
self.run_boost_from_prediction("hist")
11831183

1184-
@unittest.skipIf(XGBOOST_LOOSE_VERSION < LooseVersion("1.2.0"),
1184+
@unittest.skipIf(XGBOOST_VERSION < Version("1.2.0"),
11851185
f"not supported in xgb version {xgb.__version__}")
11861186
def test_boost_from_prediction_approx(self):
11871187
self.run_boost_from_prediction("approx")
@@ -1192,7 +1192,7 @@ def test_boost_from_prediction_exact(self):
11921192
with self.assertRaises(ValueError):
11931193
self.run_boost_from_prediction("exact")
11941194

1195-
@unittest.skipIf(XGBOOST_LOOSE_VERSION < LooseVersion("1.4.0"),
1195+
@unittest.skipIf(XGBOOST_VERSION < Version("1.4.0"),
11961196
f"not supported in xgb version {xgb.__version__}")
11971197
def test_estimator_type(self):
11981198
self._init_ray()

xgboost_ray/tests/test_sklearn_matrix.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from distutils.version import LooseVersion
1+
from packaging.version import Version
22
import numpy as np
33
import unittest
44

@@ -10,10 +10,10 @@
1010
from xgboost_ray.sklearn import (RayXGBClassifier, RayXGBRegressor)
1111
from xgboost_ray.main import RayDMatrix
1212

13-
from xgboost_ray.main import XGBOOST_LOOSE_VERSION
13+
from xgboost_ray.main import XGBOOST_VERSION
1414

15-
has_label_encoder = (XGBOOST_LOOSE_VERSION >= LooseVersion("1.0.0")
16-
and XGBOOST_LOOSE_VERSION < LooseVersion("1.6.0"))
15+
has_label_encoder = (XGBOOST_VERSION >= Version("1.0.0")
16+
and XGBOOST_VERSION < Version("1.6.0"))
1717

1818

1919
class XGBoostRaySklearnMatrixTest(unittest.TestCase):

0 commit comments

Comments
 (0)