diff --git a/.github/workflows/end_to_end.yml b/.github/workflows/end_to_end.yml index f9f539db..418e5e97 100644 --- a/.github/workflows/end_to_end.yml +++ b/.github/workflows/end_to_end.yml @@ -10,7 +10,7 @@ jobs: runs-on: ${{ matrix.os }} strategy: matrix: - python-version: ['3.8', '3.9', '3.10', '3.11'] + python-version: ['3.8', '3.9', '3.10', '3.11', '3.12'] os: [ubuntu-latest, macos-latest, windows-latest] steps: - uses: actions/checkout@v1 diff --git a/.github/workflows/minimum.yml b/.github/workflows/minimum.yml index e56b5a5e..832e7f08 100644 --- a/.github/workflows/minimum.yml +++ b/.github/workflows/minimum.yml @@ -10,7 +10,7 @@ jobs: runs-on: ${{ matrix.os }} strategy: matrix: - python-version: ['3.8', '3.9', '3.10', '3.11'] + python-version: ['3.8', '3.9', '3.10', '3.11', '3.12'] os: [ubuntu-latest, macos-latest, windows-latest] steps: - uses: actions/checkout@v1 diff --git a/.github/workflows/numerical.yml b/.github/workflows/numerical.yml index 5c86bcb5..52d0f881 100644 --- a/.github/workflows/numerical.yml +++ b/.github/workflows/numerical.yml @@ -10,7 +10,7 @@ jobs: runs-on: ${{ matrix.os }} strategy: matrix: - python-version: ['3.8', '3.9', '3.10', '3.11'] + python-version: ['3.8', '3.9', '3.10', '3.11', '3.12'] os: [ubuntu-latest, macos-latest, windows-latest] steps: - uses: actions/checkout@v1 diff --git a/.github/workflows/readme.yml b/.github/workflows/readme.yml index 4d76f2da..8be604ab 100644 --- a/.github/workflows/readme.yml +++ b/.github/workflows/readme.yml @@ -10,7 +10,7 @@ jobs: runs-on: ${{ matrix.os }} strategy: matrix: - python-version: ['3.8', '3.9', '3.10', '3.11'] + python-version: ['3.8', '3.9', '3.10', '3.11', '3.12'] os: [ubuntu-latest, macos-latest] steps: - uses: actions/checkout@v1 diff --git a/.github/workflows/tutorials.yml b/.github/workflows/tutorials.yml index 9673a618..a59f58a7 100644 --- a/.github/workflows/tutorials.yml +++ b/.github/workflows/tutorials.yml @@ -10,7 +10,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - python-version: ['3.8', '3.9', '3.10', '3.11'] + python-version: ['3.8', '3.9', '3.10', '3.11', '3.12'] steps: - uses: actions/checkout@v1 - name: Set up Python ${{ matrix.python-version }} diff --git a/.github/workflows/unit.yml b/.github/workflows/unit.yml index b3c73a50..34c35314 100644 --- a/.github/workflows/unit.yml +++ b/.github/workflows/unit.yml @@ -10,7 +10,7 @@ jobs: runs-on: ${{ matrix.os }} strategy: matrix: - python-version: ['3.8', '3.9', '3.10', '3.11'] + python-version: ['3.8', '3.9', '3.10', '3.11', '3.12'] os: [ubuntu-latest, macos-latest, windows-latest] steps: - uses: actions/checkout@v1 diff --git a/pyproject.toml b/pyproject.toml index ac4adb2b..14d728c6 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -12,22 +12,26 @@ classifiers = [ 'Programming Language :: Python :: 3.9', 'Programming Language :: Python :: 3.10', 'Programming Language :: Python :: 3.11', + 'Programming Language :: Python :: 3.12', 'Topic :: Scientific/Engineering :: Artificial Intelligence', ] keywords = [ 'copulas' ] dynamic = ["version"] license = { text = 'BSL-1.1' } -requires-python = '>=3.8,<3.12' +requires-python = '>=3.8,<3.13' readme = 'README.md' dependencies = [ "numpy>=1.20.0,<2;python_version<'3.10'", - "numpy>=1.23.3,<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'", 'plotly>=5.10.0,<6', "scipy>=1.5.4,<2;python_version<'3.10'", - "scipy>=1.9.2,<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'", + 'setuptools>=69', ] [project.urls] @@ -47,14 +51,14 @@ version = {attr = 'copulas.__version__'} [project.optional-dependencies] tutorials = [ 'markupsafe<=2.0.1', - 'scikit-learn>=0.24,<1.2', + 'scikit-learn>=0.24,<1.5', 'jupyter>=1.0.0,<2', ] test = [ 'copulas[tutorials]', 'pytest>=6.2.5,<7', 'pytest-cov>=2.6.0,<3', - 'pytest-rerunfailures>=9.0.0,<10', + 'pytest-rerunfailures>=10.3,<15', 'rundoc>=0.4.3,<0.5', 'tomli>=2.0.0,<3', ] @@ -65,7 +69,8 @@ dev = [ 'pip>=9.0.1', 'build>=1.0.0,<2', 'bump-my-version>=0.18.3,<1', - 'watchdog>=0.8.3,<0.11', + 'watchdog>=1.0.1,<5', + 'pyzmq>=25.1.2', # docs 'm2r>=0.2.0,<0.3', diff --git a/tests/unit/bivariate/test_base.py b/tests/unit/bivariate/test_base.py index e8513897..0f42fe61 100644 --- a/tests/unit/bivariate/test_base.py +++ b/tests/unit/bivariate/test_base.py @@ -80,7 +80,7 @@ def test_save(self, json_mock, open_mock): instance.save('test.json') # Check - assert open_mock.called_once_with('test.json', 'w') + open_mock.assert_called_once_with('test.json', 'w') assert json_mock.called compare_nested_dicts(json_mock.call_args[0][0], expected_content) @@ -99,10 +99,10 @@ def test_load_from_file(self, json_mock, open_mock): instance = Bivariate.load('somefile.json') # Check - assert open_mock.called_once_with('test.json', 'r') - instance.copula_type == CopulaTypes.FRANK - instance.tau == -0.33333333333333337 - instance.theta == -3.305771759329249 + open_mock.assert_called_once_with('somefile.json') + assert instance.copula_type == CopulaTypes.FRANK + assert instance.tau == -0.33333333333333337 + assert instance.theta == -3.305771759329249 @mock.patch('copulas.bivariate.clayton.Clayton.partial_derivative') def test_partial_derivative_scalar(self, derivative_mock): diff --git a/tests/unit/multivariate/test_gaussian.py b/tests/unit/multivariate/test_gaussian.py index 2e7060b5..7c31e774 100644 --- a/tests/unit/multivariate/test_gaussian.py +++ b/tests/unit/multivariate/test_gaussian.py @@ -392,11 +392,15 @@ def test_sample(self, normal_mock): # Check assert result.equals(expected_result) - assert normal_mock.called_once_with( - np.zeros(instance.correlation.shape[0]), - instance.correlation, - 5 + np.testing.assert_array_equal( + normal_mock.call_args[0][0], + np.zeros(instance.correlation.shape[0]) ) + np.testing.assert_array_equal( + normal_mock.call_args[0][1], + instance.correlation + ) + assert normal_mock.call_args[1] == {'size': 5} def test_sample_random_state(self): """When random_state is set the samples are the same.""" diff --git a/tox.ini b/tox.ini index baaff459..633abe92 100644 --- a/tox.ini +++ b/tox.ini @@ -1,5 +1,5 @@ [tox] -envlist = py39-lint, py3{8,9,10,11}-{readme,unit,end_to_end,numerical,minimum,tutorials} +envlist = py39-lint, py3{8,9,10,11,12}-{readme,unit,end_to_end,numerical,minimum,tutorials} [testenv] skipsdist = false diff --git a/tutorials/04_Syntehtic_Data_for_Machine_Learning.ipynb b/tutorials/04_Syntehtic_Data_for_Machine_Learning.ipynb index 92b7f652..9bc86154 100644 --- a/tutorials/04_Syntehtic_Data_for_Machine_Learning.ipynb +++ b/tutorials/04_Syntehtic_Data_for_Machine_Learning.ipynb @@ -26,10 +26,10 @@ "\n", "warnings.filterwarnings('ignore')\n", "\n", - "from sklearn.datasets import load_boston\n", + "from sklearn.datasets import load_diabetes\n", "from sklearn.model_selection import train_test_split\n", "\n", - "X, y = load_boston(return_X_y=True)\n", + "X, y = load_diabetes(return_X_y=True)\n", "X_train, X_test, y_train, y_test = train_test_split(X, y)" ] },