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 9b7df28..67e992d 100644 --- a/clickhouse_backend/models/engines.py +++ b/clickhouse_backend/models/engines.py @@ -1,5 +1,6 @@ +from collections.abc import Iterable + from django.db.models import Func, Value -from django.utils.itercompat import is_iterable __all__ = [ "Distributed", @@ -139,7 +140,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): diff --git a/clickhouse_backend/models/fields/__init__.py b/clickhouse_backend/models/fields/__init__.py index 138e043..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 django.utils.itercompat import is_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..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 django.utils.itercompat import is_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..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 django.utils.itercompat import is_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