From bcab164cddc898e5ac95bdf3386b5519c54ded13 Mon Sep 17 00:00:00 2001 From: Ruslan Sibgatulin Date: Fri, 13 Dec 2024 09:50:29 +0300 Subject: [PATCH 1/3] refactor base merge tree engine to check Iterable value --- clickhouse_backend/models/engines.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/clickhouse_backend/models/engines.py b/clickhouse_backend/models/engines.py index 9b7df28..b638582 100644 --- a/clickhouse_backend/models/engines.py +++ b/clickhouse_backend/models/engines.py @@ -1,5 +1,5 @@ from django.db.models import Func, Value -from django.utils.itercompat import is_iterable +from collections.abc import Iterable __all__ = [ "Distributed", @@ -139,7 +139,7 @@ def __init__( for key in ["order_by", "primary_key", "partition_by"]: value = getattr(self, key) if value is not None: - if isinstance(value, str) or not is_iterable(value): + if isinstance(value, str) or not isinstance(value, Iterable): value = (value,) setattr(self, key, value) elif not isinstance(value, tuple): From 7b7454372dd12ebb6b52643b9165f7f877cacdf9 Mon Sep 17 00:00:00 2001 From: Ruslan Sibgatulin Date: Mon, 30 Dec 2024 13:08:05 +0300 Subject: [PATCH 2/3] refactor model fields to check Iterable value --- clickhouse_backend/models/fields/__init__.py | 4 ++-- clickhouse_backend/models/fields/array.py | 6 +++--- clickhouse_backend/models/fields/tuple.py | 8 ++++---- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/clickhouse_backend/models/fields/__init__.py b/clickhouse_backend/models/fields/__init__.py index 138e043..0c35581 100644 --- a/clickhouse_backend/models/fields/__init__.py +++ b/clickhouse_backend/models/fields/__init__.py @@ -4,7 +4,7 @@ from django.core import checks, exceptions from django.db.models import IntegerChoices, fields from django.utils.functional import cached_property -from django.utils.itercompat import is_iterable +from collections.abc import Iterable from django.utils.translation import gettext_lazy as _ from clickhouse_backend.validators import MaxBytesValidator @@ -284,7 +284,7 @@ def _check_choices(self): id="fields.E005", ) ] - if not is_iterable(self.choices) or isinstance(self.choices, str): + if not isinstance(self.choices, Iterable) or isinstance(self.choices, str): return invalid_errors if not self.choices: diff --git a/clickhouse_backend/models/fields/array.py b/clickhouse_backend/models/fields/array.py index 55a4f0d..0a7788f 100644 --- a/clickhouse_backend/models/fields/array.py +++ b/clickhouse_backend/models/fields/array.py @@ -5,7 +5,7 @@ from django.core import checks, exceptions from django.db.models import Field, Func, Value, lookups from django.db.models.fields.mixins import CheckFieldDefaultMixin -from django.utils.itercompat import is_iterable +from collections.abc import Iterable from django.utils.translation import gettext_lazy as _ from .base import FieldMixin @@ -97,7 +97,7 @@ def cast_db_type(self, connection): return "Array(%s)" % self.base_field.cast_db_type(connection) def get_db_prep_value(self, value, connection, prepared=False): - if is_iterable(value) and not isinstance(value, (str, bytes)): + if isinstance(value, Iterable) and not isinstance(value, (str, bytes)): return [ self.base_field.get_db_prep_value(i, connection, prepared=prepared) for i in value @@ -105,7 +105,7 @@ def get_db_prep_value(self, value, connection, prepared=False): return value def get_db_prep_save(self, value, connection): - if is_iterable(value) and not isinstance(value, (str, bytes)): + if isinstance(value, Iterable) and not isinstance(value, (str, bytes)): return [self.base_field.get_db_prep_save(i, connection) for i in value] return value diff --git a/clickhouse_backend/models/fields/tuple.py b/clickhouse_backend/models/fields/tuple.py index 4150d43..202f8f7 100644 --- a/clickhouse_backend/models/fields/tuple.py +++ b/clickhouse_backend/models/fields/tuple.py @@ -7,7 +7,7 @@ from django.core import checks, exceptions from django.db.models import Field, Func, Value, lookups from django.utils.functional import cached_property -from django.utils.itercompat import is_iterable +from collections.abc import Iterable from django.utils.translation import gettext_lazy as _ from .base import FieldMixin @@ -38,7 +38,7 @@ def _check_base_fields(self, base_fields): "field instances or (field name, field instance) tuples, " "and field name must be valid python identifier." ) - if not is_iterable(base_fields) or isinstance(base_fields, str): + if not isinstance(base_fields, Iterable) or isinstance(base_fields, str): raise invalid_error fields = [] @@ -192,7 +192,7 @@ def call_base_fields(self, func_name, value, *args, **kwargs): return values def get_db_prep_value(self, value, connection, prepared=False): - if is_iterable(value) and not isinstance(value, (str, bytes)): + if isinstance(value, Iterable) and not isinstance(value, (str, bytes)): values = self.call_base_fields( "get_db_prep_value", value, connection, prepared=prepared ) @@ -200,7 +200,7 @@ def get_db_prep_value(self, value, connection, prepared=False): return value def get_db_prep_save(self, value, connection): - if is_iterable(value) and not isinstance(value, (str, bytes)): + if isinstance(value, Iterable) and not isinstance(value, (str, bytes)): values = self.call_base_fields("get_db_prep_save", value, connection) return tuple(values) return value From 1fd89c2dec922e3364f74fc6f506200f11942bde Mon Sep 17 00:00:00 2001 From: Ruslan Sibgatulin Date: Thu, 9 Jan 2025 11:55:35 +0300 Subject: [PATCH 3/3] Code linting. Changelog updated --- CHANGELOG.md | 1 + clickhouse_backend/models/engines.py | 3 ++- clickhouse_backend/models/fields/__init__.py | 2 +- clickhouse_backend/models/fields/array.py | 2 +- clickhouse_backend/models/fields/tuple.py | 2 +- 5 files changed, 6 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6e5fea8..c238024 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ - fix: pass DSN to clickhouse-client if configured. - feat: #108 Queryset.iterator use clickhouse_driver.Client.execute_iter. - chore: test for python3.13. +- refactor: Using collections.abc.Iterable instead of deprecated django.utils.itercompat.is_iterable ### 1.3.1 diff --git a/clickhouse_backend/models/engines.py b/clickhouse_backend/models/engines.py index b638582..67e992d 100644 --- a/clickhouse_backend/models/engines.py +++ b/clickhouse_backend/models/engines.py @@ -1,6 +1,7 @@ -from django.db.models import Func, Value from collections.abc import Iterable +from django.db.models import Func, Value + __all__ = [ "Distributed", "Engine", diff --git a/clickhouse_backend/models/fields/__init__.py b/clickhouse_backend/models/fields/__init__.py index 0c35581..694012c 100644 --- a/clickhouse_backend/models/fields/__init__.py +++ b/clickhouse_backend/models/fields/__init__.py @@ -1,10 +1,10 @@ import ipaddress +from collections.abc import Iterable from datetime import datetime from django.core import checks, exceptions from django.db.models import IntegerChoices, fields from django.utils.functional import cached_property -from collections.abc import Iterable from django.utils.translation import gettext_lazy as _ from clickhouse_backend.validators import MaxBytesValidator diff --git a/clickhouse_backend/models/fields/array.py b/clickhouse_backend/models/fields/array.py index 0a7788f..0eae21a 100644 --- a/clickhouse_backend/models/fields/array.py +++ b/clickhouse_backend/models/fields/array.py @@ -1,11 +1,11 @@ import json +from collections.abc import Iterable from django.contrib.postgres.utils import prefix_validation_error from django.contrib.postgres.validators import ArrayMaxLengthValidator from django.core import checks, exceptions from django.db.models import Field, Func, Value, lookups from django.db.models.fields.mixins import CheckFieldDefaultMixin -from collections.abc import Iterable from django.utils.translation import gettext_lazy as _ from .base import FieldMixin diff --git a/clickhouse_backend/models/fields/tuple.py b/clickhouse_backend/models/fields/tuple.py index 202f8f7..dd75d98 100644 --- a/clickhouse_backend/models/fields/tuple.py +++ b/clickhouse_backend/models/fields/tuple.py @@ -2,12 +2,12 @@ import collections.abc import copy import json +from collections.abc import Iterable from django.contrib.postgres.utils import prefix_validation_error from django.core import checks, exceptions from django.db.models import Field, Func, Value, lookups from django.utils.functional import cached_property -from collections.abc import Iterable from django.utils.translation import gettext_lazy as _ from .base import FieldMixin