diff --git a/allow-database-config-overrides.patch b/allow-database-config-overrides.patch index c4687a2..76632de 100644 --- a/allow-database-config-overrides.patch +++ b/allow-database-config-overrides.patch @@ -1,13 +1,13 @@ -Index: grimoirelab-sortinghat-1.2.1/config/settings/config_testing.py +Index: grimoirelab-sortinghat-1.9.2/config/settings/config_testing.py =================================================================== ---- grimoirelab-sortinghat-1.2.1.orig/config/settings/config_testing.py -+++ grimoirelab-sortinghat-1.2.1/config/settings/config_testing.py +--- grimoirelab-sortinghat-1.9.2.orig/config/settings/config_testing.py ++++ grimoirelab-sortinghat-1.9.2/config/settings/config_testing.py @@ -1,3 +1,4 @@ +import os import sys import logging -@@ -38,8 +39,8 @@ SQL_MODE = [ +@@ -40,8 +41,8 @@ SQL_MODE = [ DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', @@ -18,7 +18,7 @@ Index: grimoirelab-sortinghat-1.2.1/config/settings/config_testing.py 'NAME': 'sortinghat_db', 'OPTIONS': { 'charset': 'utf8mb4', -@@ -49,9 +50,10 @@ DATABASES = { +@@ -51,9 +52,10 @@ DATABASES = { 'NAME': 'testhat', 'CHARSET': 'utf8mb4', 'COLLATION': 'utf8mb4_unicode_520_ci', @@ -30,10 +30,10 @@ Index: grimoirelab-sortinghat-1.2.1/config/settings/config_testing.py } } -Index: grimoirelab-sortinghat-1.2.1/config/settings/config_testing_tenant.py +Index: grimoirelab-sortinghat-1.9.2/config/settings/config_testing_tenant.py =================================================================== ---- grimoirelab-sortinghat-1.2.1.orig/config/settings/config_testing_tenant.py -+++ grimoirelab-sortinghat-1.2.1/config/settings/config_testing_tenant.py +--- grimoirelab-sortinghat-1.9.2.orig/config/settings/config_testing_tenant.py ++++ grimoirelab-sortinghat-1.9.2/config/settings/config_testing_tenant.py @@ -15,8 +15,8 @@ TENANTS_DEDICATED_QUEUES = [t["name"] fo DATABASES.update({ tenant: { diff --git a/python-sortinghat.changes b/python-sortinghat.changes index 0d6ccb9..1fd70da 100644 --- a/python-sortinghat.changes +++ b/python-sortinghat.changes @@ -1,3 +1,34 @@ +------------------------------------------------------------------- +Thu Feb 5 05:12:51 UTC 2026 - Steve Kowalik + +- Update to 1.13.0: + * New features: + + Merge identities when adding a LinkedIn profile + + Redirect to the original URL after user inactivity + + Recommendations based on GitHub-generated email addresses + + Increased minimum version for Python to 3.10 + + Post processing of imported individuals + + History of profile changes + + Allow pasting LinkedIn URL + * Bug fixes: + + Missing migrations from model changes + + Task update issues due to type mismatch + + Remove multiple LinkedIn identities + + Table showing jobs failing for offset-naive datetimes + + Automatic affiliation fixed and reduced results + + Unavailable Individuals in Recommendations + + Django static files configuration + + Automatic affiliation fixed and reduced results + + Merge organizations aliases + + Press Enter key to log in + + Fixed unresponsive affiliation calendar + + Affiliation dates different from input +- Update URL to correct location +- Refreshed patch allow-database-config-overrides.patch +- Drop patches, no longer required: + * support-click-8.2.patch + * support-new-django-graphql-jwt.patch + ------------------------------------------------------------------- Thu May 15 02:33:32 UTC 2025 - Steve Kowalik diff --git a/python-sortinghat.spec b/python-sortinghat.spec index 104ef38..6212e57 100644 --- a/python-sortinghat.spec +++ b/python-sortinghat.spec @@ -1,7 +1,7 @@ # # spec file for package python-sortinghat # -# Copyright (c) 2025 SUSE LLC +# Copyright (c) 2026 SUSE LLC and contributors # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -17,70 +17,59 @@ Name: python-sortinghat -Version: 1.7.1 +Version: 1.13.0 Release: 0 Summary: A tool to manage identities License: GPL-3.0-only -URL: https://github.com/grimoirelab/sortinghat +URL: https://github.com/chaoss/grimoirelab-sortinghat Source: https://github.com/chaoss/grimoirelab-sortinghat/archive/refs/tags/%{version}.tar.gz#/sortinghat-%{version}.tar.gz # PATCH-FIX-OPENSUSE Allow overridding the database config Patch0: allow-database-config-overrides.patch -# PATCH-FIX-OPENSUSE Support django-graphql-jwt 0.4.0 -Patch1: support-new-django-graphql-jwt.patch # PATCH-FIX-OPENSUSE Do not use testcontainers module -Patch2: no-testcontainers.patch -# PATCH-FIX-OPENSUSE Support click 8.2+ -Patch3: support-click-8.2.patch -BuildRequires: %{python_module base >= 3.9} +Patch1: no-testcontainers.patch +BuildRequires: %{python_module base >= 3.10} BuildRequires: %{python_module pip} BuildRequires: %{python_module poetry-core} -BuildRequires: %{python_module wheel} BuildRequires: fdupes BuildRequires: python-rpm-macros -Requires: python-Django >= 4.2 -Requires: python-Jinja2 >= 3.1 +Requires: python-Django >= 5.2 +Requires: python-Jinja2 >= 3.1.1 Requires: python-PyJWT >= 2.4 -Requires: python-PyMySQL >= 0.7.0 Requires: python-PyYAML >= 3.12 Requires: python-SQLAlchemy >= 1.2 -Requires: python-click >= 7.1 +Requires: python-click >= 8.2 Requires: python-django-cors-headers >= 4.6 -Requires: python-django-graphql-jwt >= 0.3 +Requires: python-django-graphql-jwt >= 0.4 Requires: python-django-rq >= 2.3 +Requires: python-django-storages >= 1.13 Requires: python-django-treebeard >= 4.5 -Requires: python-graphene >= 2.1.5 -Requires: python-graphene-django +Requires: python-graphene-django >= 3.2.3 Requires: python-grimoirelab-toolkit >= 0.3 -Requires: python-importlib-resources Requires: python-mysqlclient >= 2.0 -Requires: python-numpy Requires: python-pandas >= 2.2 Requires: python-python-dateutil >= 2.8.0 Requires: python-requests >= 2.7 Requires: python-rq -Requires: python-setuptools Requires: python-sgqlc >= 16.1 Requires(post): update-alternatives Requires(postun): update-alternatives BuildArch: noarch # SECTION test requirements -BuildRequires: %{python_module Jinja2 >= 3.1} -BuildRequires: %{python_module Django >= 4.2} -BuildRequires: %{python_module PyMySQL >= 0.7.0} +BuildRequires: %{python_module Jinja2 >= 3.1.1} +BuildRequires: %{python_module Django >= 5.2} BuildRequires: %{python_module PyYAML >= 3.12} BuildRequires: %{python_module SQLAlchemy >= 1.2} -BuildRequires: %{python_module click >= 7.1} +BuildRequires: %{python_module click >= 8.2} BuildRequires: %{python_module django-cors-headers >= 4.6} -BuildRequires: %{python_module django-graphql-jwt >= 0.3} +BuildRequires: %{python_module django-graphql-jwt >= 0.4} BuildRequires: %{python_module django-rq >= 2.3} +BuildRequires: %{python_module django-storages >= 1.13} BuildRequires: %{python_module django-treebeard >= 4.5} BuildRequires: %{python_module fakeredis} -BuildRequires: %{python_module graphene >= 2.1.5} BuildRequires: %{python_module grimoirelab-toolkit >= 0.3} BuildRequires: %{python_module httpretty >= 0.9.5} BuildRequires: %{python_module importlib-resources} BuildRequires: %{python_module mysqlclient >= 2.0} -BuildRequires: %{python_module numpy} BuildRequires: %{python_module pandas >= 2.2} BuildRequires: %{python_module pytest} BuildRequires: %{python_module python-dateutil >= 2.8.0} @@ -146,8 +135,6 @@ run_dir=/tmp/mysql export TEST_SORTINGHAT_DB_PORT=$port export TEST_SORTINGHAT_DB_USER=$user export TEST_SORTINGHAT_DB_PASSWORD=$pass -# Broken tests -rm tests/test_jobs.py %python_exec manage.py test --settings=config.settings.config_testing %python_exec manage.py test --settings=config.settings.config_testing_tenant # diff --git a/sortinghat-1.13.0.tar.gz b/sortinghat-1.13.0.tar.gz new file mode 100644 index 0000000..4b0cf04 --- /dev/null +++ b/sortinghat-1.13.0.tar.gz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bfebb2609b558db100f8524131da488cdec876b5947f3ae4a01f6eff630dff31 +size 2296077 diff --git a/sortinghat-1.7.1.tar.gz b/sortinghat-1.7.1.tar.gz deleted file mode 100644 index 68f7c3d..0000000 --- a/sortinghat-1.7.1.tar.gz +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:26e091403d3d2699d55b65a79a67494e95654bf78d66d884adff41e30f2af3ca -size 2264700 diff --git a/support-click-8.2.patch b/support-click-8.2.patch deleted file mode 100644 index 8ce4d91..0000000 --- a/support-click-8.2.patch +++ /dev/null @@ -1,856 +0,0 @@ -Index: grimoirelab-sortinghat-1.7.1/tests/cli/test_cmd_add.py -=================================================================== ---- grimoirelab-sortinghat-1.7.1.orig/tests/cli/test_cmd_add.py -+++ grimoirelab-sortinghat-1.7.1/tests/cli/test_cmd_add.py -@@ -20,6 +20,7 @@ - # Santiago Dueñas - # - -+import inspect - import unittest - import unittest.mock - -@@ -107,7 +108,10 @@ class TestAddCommand(unittest.TestCase): - client = MockClient(responses) - mock_client.return_value = client - -- runner = click.testing.CliRunner() -+ if inspect.signature(click.testing.CliRunner).parameters.get("mix_stderr"): -+ runner = click.testing.CliRunner(mix_stderr=False) -+ else: -+ runner = click.testing.CliRunner() - - # Create a new identity - params = [ -@@ -135,7 +139,10 @@ class TestAddCommand(unittest.TestCase): - client = MockClient(responses) - mock_client.return_value = client - -- runner = click.testing.CliRunner() -+ if inspect.signature(click.testing.CliRunner).parameters.get("mix_stderr"): -+ runner = click.testing.CliRunner(mix_stderr=False) -+ else: -+ runner = click.testing.CliRunner() - - # Create a new identity setting partial data - params = [ -@@ -161,7 +168,10 @@ class TestAddCommand(unittest.TestCase): - client = MockClient(responses) - mock_client.return_value = client - -- runner = click.testing.CliRunner() -+ if inspect.signature(click.testing.CliRunner).parameters.get("mix_stderr"): -+ runner = click.testing.CliRunner(mix_stderr=False) -+ else: -+ runner = click.testing.CliRunner() - - # Assign to John Smith - a9b403e150dd4af8953a52a4bb841051e4b705d9 - # individual -@@ -190,7 +200,11 @@ class TestAddCommand(unittest.TestCase): - client = MockClient(responses) - mock_client.return_value = client - -- runner = click.testing.CliRunner() -+ if inspect.signature(click.testing.CliRunner).parameters.get("mix_stderr"): -+ runner = click.testing.CliRunner(mix_stderr=False) -+ else: -+ runner = click.testing.CliRunner() -+ - - params = [ - '--source', 'scm', -@@ -225,7 +239,10 @@ class TestAddCommand(unittest.TestCase): - client = MockClient(responses) - mock_client.return_value = client - -- runner = click.testing.CliRunner(mix_stderr=False) -+ if inspect.signature(click.testing.CliRunner).parameters.get("mix_stderr"): -+ runner = click.testing.CliRunner(mix_stderr=False) -+ else: -+ runner = click.testing.CliRunner() - - params = [ - '--source', 'scm', -Index: grimoirelab-sortinghat-1.7.1/tests/cli/test_cmd_config.py -=================================================================== ---- grimoirelab-sortinghat-1.7.1.orig/tests/cli/test_cmd_config.py -+++ grimoirelab-sortinghat-1.7.1/tests/cli/test_cmd_config.py -@@ -20,6 +20,7 @@ - # Santiago Dueñas - # - -+import inspect - import os.path - import shutil - import unittest -@@ -53,7 +54,10 @@ class TestInitConfig(unittest.TestCase): - def test_init(self): - """Check if it initializes a configuration file.""" - -- runner = click.testing.CliRunner() -+ if inspect.signature(click.testing.CliRunner).parameters.get("mix_stderr"): -+ runner = click.testing.CliRunner(mix_stderr=False) -+ else: -+ runner = click.testing.CliRunner() - - with runner.isolated_filesystem() as fs: - filepath = os.path.join(fs, MOCK_CONFIG_FILE) -@@ -79,7 +83,10 @@ class TestInitConfig(unittest.TestCase): - def test_default_filename(self, mock_basepath): - """Check if it uses the default filename when filepath is not given""" - -- runner = click.testing.CliRunner() -+ if inspect.signature(click.testing.CliRunner).parameters.get("mix_stderr"): -+ runner = click.testing.CliRunner(mix_stderr=False) -+ else: -+ runner = click.testing.CliRunner() - - with runner.isolated_filesystem() as fs: - dirpath = os.path.join(fs, '.sortinghat') -@@ -104,7 +111,10 @@ class TestInitConfig(unittest.TestCase): - def test_config_is_not_overwritten(self): - """Check whether an existing config file is not replaced""" - -- runner = click.testing.CliRunner(mix_stderr=False) -+ if inspect.signature(click.testing.CliRunner).parameters.get("mix_stderr"): -+ runner = click.testing.CliRunner(mix_stderr=False) -+ else: -+ runner = click.testing.CliRunner() - - with runner.isolated_filesystem() as fs: - shutil.copy(MOCK_CONFIG_FILEPATH, fs) -@@ -132,7 +142,10 @@ class TestInitConfig(unittest.TestCase): - def test_overwrite_config(self): - """Check whether an existing config file is overwritten""" - -- runner = click.testing.CliRunner(mix_stderr=False) -+ if inspect.signature(click.testing.CliRunner).parameters.get("mix_stderr"): -+ runner = click.testing.CliRunner(mix_stderr=False) -+ else: -+ runner = click.testing.CliRunner() - - with runner.isolated_filesystem() as fs: - shutil.copy(MOCK_CONFIG_FILEPATH, fs) -@@ -168,7 +181,10 @@ class TestSetConfig(unittest.TestCase): - def test_set_value(self): - """Check set method""" - -- runner = click.testing.CliRunner() -+ if inspect.signature(click.testing.CliRunner).parameters.get("mix_stderr"): -+ runner = click.testing.CliRunner(mix_stderr=False) -+ else: -+ runner = click.testing.CliRunner() - - with runner.isolated_filesystem() as fs: - shutil.copy(MOCK_CONFIG_FILEPATH, fs) -@@ -210,7 +226,10 @@ class TestSetConfig(unittest.TestCase): - def test_default_filename(self, mock_basepath): - """Check if it uses the default filename when filepath is not given""" - -- runner = click.testing.CliRunner() -+ if inspect.signature(click.testing.CliRunner).parameters.get("mix_stderr"): -+ runner = click.testing.CliRunner(mix_stderr=False) -+ else: -+ runner = click.testing.CliRunner() - - with runner.isolated_filesystem() as fs: - dirpath = os.path.join(fs, '.sortinghat') -@@ -240,7 +259,10 @@ class TestSetConfig(unittest.TestCase): - def test_not_available_keys(self): - """Check if it raises an error when the key is not available""" - -- runner = click.testing.CliRunner(mix_stderr=False) -+ if inspect.signature(click.testing.CliRunner).parameters.get("mix_stderr"): -+ runner = click.testing.CliRunner(mix_stderr=False) -+ else: -+ runner = click.testing.CliRunner() - - with runner.isolated_filesystem() as fs: - shutil.copy(MOCK_CONFIG_FILEPATH, fs) -@@ -260,7 +282,10 @@ class TestSetConfig(unittest.TestCase): - def test_invalid_keys(self): - """Check if it raises an error when the key is invalid""" - -- runner = click.testing.CliRunner(mix_stderr=False) -+ if inspect.signature(click.testing.CliRunner).parameters.get("mix_stderr"): -+ runner = click.testing.CliRunner(mix_stderr=False) -+ else: -+ runner = click.testing.CliRunner() - - # Test keys that do not follow '
.