diff --git a/.github/workflows/integration.yml b/.github/workflows/integration.yml index 6d7bb096..a7ad18f3 100644 --- a/.github/workflows/integration.yml +++ b/.github/workflows/integration.yml @@ -13,7 +13,7 @@ jobs: python-version: ['3.8', '3.9', '3.10', '3.11', '3.12'] os: [ubuntu-latest, macos-latest, windows-latest] steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v4 - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@v2 with: diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index fd795acc..84bf0f1d 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -9,7 +9,7 @@ jobs: lint: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v4 - name: Set up Python 3.9 uses: actions/setup-python@v2 with: diff --git a/.github/workflows/minimum.yml b/.github/workflows/minimum.yml index 54efa7dc..1d0d9ecc 100644 --- a/.github/workflows/minimum.yml +++ b/.github/workflows/minimum.yml @@ -13,7 +13,7 @@ jobs: python-version: ['3.8', '3.9', '3.10', '3.11', '3.12'] os: [ubuntu-latest, macos-latest, windows-latest] steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v4 - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@v2 with: diff --git a/.github/workflows/readme.yml b/.github/workflows/readme.yml index 5f3b3496..dcc4389f 100644 --- a/.github/workflows/readme.yml +++ b/.github/workflows/readme.yml @@ -13,7 +13,7 @@ jobs: python-version: ['3.8', '3.9', '3.10', '3.11', '3.12'] os: [ubuntu-latest, macos-latest] # skip windows bc rundoc fails steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v4 - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@v2 with: diff --git a/.github/workflows/unit.yml b/.github/workflows/unit.yml index ce24f310..b031ebe6 100644 --- a/.github/workflows/unit.yml +++ b/.github/workflows/unit.yml @@ -13,7 +13,7 @@ jobs: python-version: ['3.8', '3.9', '3.10', '3.11', '3.12'] os: [ubuntu-latest, macos-latest, windows-latest] steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v4 - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@v2 with: diff --git a/pyproject.toml b/pyproject.toml index 282dadeb..b9b73562 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -21,7 +21,6 @@ license = { text = 'BSL-1.1' } requires-python = '>=3.8,<3.13' readme = 'README.md' dependencies = [ -<<<<<<< HEAD "numpy>=1.20.0;python_version<'3.10'", "numpy>=1.23.3;python_version>='3.10' and python_version<'3.12'", "numpy>=1.26.0;python_version>='3.12'", @@ -36,22 +35,6 @@ dependencies = [ "scikit-learn>=1.1.3;python_version>='3.11' and python_version<'3.12'", "scikit-learn>=1.3.0;python_version>='3.12'", 'Faker>=17', -======= - "numpy>=1.20.0,<2;python_version<'3.10'", - "numpy>=1.23.3,<2;python_version>='3.10' and python_version<'3.12'", - "numpy>=1.26.0,<2;python_version>='3.12'", - "pandas>=1.1.3;python_version<'3.10'", - "pandas>=1.3.4;python_version>='3.10' and python_version<'3.11'", - "pandas>=1.5.0;python_version>='3.11'", - "scipy>=1.5.4,<2;python_version<'3.10'", - "scipy>=1.9.2,<2;python_version>='3.10' and python_version<'3.12'", - "scipy>=1.12.0,<2;python_version>='3.12'", - "scikit-learn>=0.24,<2;python_version<'3.10'", - "scikit-learn>=1.1.0;python_version>='3.10' and python_version<'3.11'", - "scikit-learn>=1.1.3,<2;python_version>='3.11' and python_version<'3.12'", - "scikit-learn>=1.3.0,<2;python_version>='3.12'", - 'Faker>=17,<20', ->>>>>>> a1624cd (Add py12 support) ] [project.urls] @@ -65,7 +48,7 @@ dependencies = [ rdt = { main = 'rdt.cli.__main__:main' } [project.optional-dependencies] -copulas = ['copulas>=0.10.0',] +copulas = ['copulas@git+https://git@github.com/sdv-dev/copulas.git',] test = [ 'rdt[copulas]', diff --git a/rdt/__init__.py b/rdt/__init__.py index 06b92dbc..c0e3dbfc 100644 --- a/rdt/__init__.py +++ b/rdt/__init__.py @@ -10,12 +10,12 @@ import sys import warnings +from importlib.metadata import entry_points from operator import attrgetter from types import ModuleType import numpy as np import pandas as pd -from pkg_resources import iter_entry_points from rdt import transformers from rdt.hyper_transformer import HyperTransformer @@ -149,7 +149,13 @@ def _find_addons(): from top_module.addon_module import x """ group = 'rdt_modules' - for entry_point in iter_entry_points(group=group): + try: + eps = entry_points(group=group) # pylint: disable=E1123 + except TypeError: + # Load-time selection requires Python >= 3.10 or importlib_metadata >= 3.6 + eps = entry_points().get(group, []) + + for entry_point in eps: try: addon = entry_point.load() except Exception: # pylint: disable=broad-exception-caught diff --git a/rdt/transformers/categorical.py b/rdt/transformers/categorical.py index 16ae6ff0..e077f5be 100644 --- a/rdt/transformers/categorical.py +++ b/rdt/transformers/categorical.py @@ -6,7 +6,6 @@ import numpy as np import pandas as pd from scipy.stats import norm -from pandas.api.types import is_numeric_dtype from rdt.errors import TransformerInputError from rdt.transformers.base import BaseTransformer diff --git a/tests/integration/transformers/test_categorical.py b/tests/integration/transformers/test_categorical.py index 5ae02b66..907df485 100644 --- a/tests/integration/transformers/test_categorical.py +++ b/tests/integration/transformers/test_categorical.py @@ -474,6 +474,7 @@ def test_one_hot_categoricals(): # Run transformed_data = transformer.fit_transform(test_data, column='A') + # Assert pd.testing.assert_frame_equal( transformed_data, diff --git a/tests/unit/test___init__.py b/tests/unit/test___init__.py index db0f8b2d..cd027b66 100644 --- a/tests/unit/test___init__.py +++ b/tests/unit/test___init__.py @@ -56,7 +56,7 @@ def test_get_demo_many_rows(): pd.testing.assert_frame_equal(demo, expected) -@patch.object(rdt, 'iter_entry_points') +@patch.object(rdt, 'entry_points') def test__find_addons_module(entry_points_mock, mock_rdt): """Test loading an add-on.""" # Setup @@ -75,7 +75,25 @@ def test__find_addons_module(entry_points_mock, mock_rdt): assert sys.modules['rdt.submodule.entry_name'] == add_on_mock -@patch.object(rdt, 'iter_entry_points') +@patch.object(rdt, 'entry_points') +def test__find_addons_type_error(entry_points_mock): + """Test it when entry_points raises a TypeError (happens for py38, py39).""" + # Setup + def side_effect(arg=None): + if arg == 'rdt_modules': + raise TypeError() + return {arg: []} + + entry_points_mock.side_effect = side_effect + + # Run + _find_addons() + + # Assert + entry_points_mock.assert_called_with() + + +@patch.object(rdt, 'entry_points') def test__find_addons_object(entry_points_mock, mock_rdt): """Test loading an add-on.""" # Setup @@ -93,7 +111,7 @@ def test__find_addons_object(entry_points_mock, mock_rdt): @patch('warnings.warn') -@patch('rdt.iter_entry_points') +@patch('rdt.entry_points') def test__find_addons_bad_addon(entry_points_mock, warning_mock): """Test failing to load an add-on generates a warning.""" # Setup @@ -116,7 +134,7 @@ def entry_point_error(): @patch('warnings.warn') -@patch('rdt.iter_entry_points') +@patch('rdt.entry_points') def test__find_addons_wrong_base(entry_points_mock, warning_mock): """Test incorrect add-on name generates a warning.""" # Setup @@ -137,7 +155,7 @@ def test__find_addons_wrong_base(entry_points_mock, warning_mock): @patch('warnings.warn') -@patch('rdt.iter_entry_points') +@patch('rdt.entry_points') def test__find_addons_missing_submodule(entry_points_mock, warning_mock): """Test incorrect add-on name generates a warning.""" # Setup @@ -158,7 +176,7 @@ def test__find_addons_missing_submodule(entry_points_mock, warning_mock): @patch('warnings.warn') -@patch('rdt.iter_entry_points') +@patch('rdt.entry_points') def test__find_addons_module_and_object(entry_points_mock, warning_mock): """Test incorrect add-on name generates a warning.""" # Setup @@ -179,7 +197,7 @@ def test__find_addons_module_and_object(entry_points_mock, warning_mock): @patch('warnings.warn') -@patch.object(rdt, 'iter_entry_points') +@patch.object(rdt, 'entry_points') def test__find_addons_missing_object(entry_points_mock, warning_mock, mock_rdt): """Test incorrect add-on name generates a warning.""" # Setup