diff --git a/.github/workflows/mysql_test.yml b/.github/workflows/mysql_test.yml index 212dddb..843823b 100644 --- a/.github/workflows/mysql_test.yml +++ b/.github/workflows/mysql_test.yml @@ -4,7 +4,6 @@ on: push: branches: [ master ] pull_request: - branches: [ master ] jobs: test: @@ -12,17 +11,17 @@ jobs: strategy: max-parallel: 4 matrix: - python-version: [ 3.8, 3.9, 3.10.13, 3.11 ] - django-version: [ 3.2.21, 4.1.11, 4.2.5 ] + python-version: [ '3.9', '3.10', '3.11', '3.12', '3.13' ] + django-version: [ 4.2.17, 5.0.10, 5.1.4 ] exclude: - - python-version: 3.8 - django-version: 4.1.11 - - python-version: 3.8 - django-version: 4.2.5 - - python-version: 3.11 - django-version: 3.2.21 - - python-version: 3.11 - django-version: 4.1.11 + - python-version: '3.9' + django-version: 5.0.10 + - python-version: '3.9' + django-version: 5.1.4 + - python-version: '3.13' + django-version: 4.2.17 + - python-version: '3.13' + django-version: 5.0.10 services: mysql: image: mysql @@ -40,9 +39,9 @@ jobs: --health-timeout=5s --health-retries=5 steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v2 + uses: actions/setup-python@v5 with: python-version: ${{ matrix.python-version }} - name: Install Dependencies diff --git a/.github/workflows/postgres_test.yml b/.github/workflows/postgres_test.yml index 605a8e1..a4b67ed 100644 --- a/.github/workflows/postgres_test.yml +++ b/.github/workflows/postgres_test.yml @@ -4,7 +4,6 @@ on: push: branches: [ master ] pull_request: - branches: [ master ] jobs: test: @@ -12,17 +11,17 @@ jobs: strategy: max-parallel: 4 matrix: - python-version: [ 3.8, 3.9, 3.10.13, 3.11 ] - django-version: [ 3.2.21, 4.1.11, 4.2.5 ] + python-version: [ '3.9', '3.10', '3.11', '3.12', '3.13' ] + django-version: [ 4.2.17, 5.0.10, 5.1.4 ] exclude: - - python-version: 3.8 - django-version: 4.1.11 - - python-version: 3.8 - django-version: 4.2.5 - - python-version: 3.11 - django-version: 3.2.21 - - python-version: 3.11 - django-version: 4.1.11 + - python-version: '3.9' + django-version: 5.0.10 + - python-version: '3.9' + django-version: 5.1.4 + - python-version: '3.13' + django-version: 4.2.17 + - python-version: '3.13' + django-version: 5.0.10 services: postgres: image: postgres @@ -37,9 +36,9 @@ jobs: --health-timeout 5s --health-retries 5 steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v2 + uses: actions/setup-python@v5 with: python-version: ${{ matrix.python-version }} - name: Install Dependencies diff --git a/.github/workflows/sqlite_test.yml b/.github/workflows/sqlite_test.yml index 5c4d14a..764ed5a 100644 --- a/.github/workflows/sqlite_test.yml +++ b/.github/workflows/sqlite_test.yml @@ -4,7 +4,6 @@ on: push: branches: [ master ] pull_request: - branches: [ master ] jobs: test: @@ -12,21 +11,21 @@ jobs: strategy: max-parallel: 4 matrix: - python-version: [ 3.8, 3.9, 3.10.13, 3.11 ] - django-version: [ 3.2.21, 4.1.11, 4.2.5 ] + python-version: [ '3.9', '3.10', '3.11', '3.12', '3.13' ] + django-version: [ 4.2.17, 5.0.10, 5.1.4 ] exclude: - - python-version: 3.8 - django-version: 4.1.11 - - python-version: 3.8 - django-version: 4.2.5 - - python-version: 3.11 - django-version: 3.2.21 - - python-version: 3.11 - django-version: 4.1.11 + - python-version: '3.9' + django-version: 5.0.10 + - python-version: '3.9' + django-version: 5.1.4 + - python-version: '3.13' + django-version: 4.2.17 + - python-version: '3.13' + django-version: 5.0.10 steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v2 + uses: actions/setup-python@v5 with: python-version: ${{ matrix.python-version }} - name: Install Dependencies diff --git a/pyproject.toml b/pyproject.toml index 03ee0b0..951bad5 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -10,14 +10,14 @@ authors = [ ] description = "Improved API for aggregating using Subquery" readme = "Readme.rst" -requires-python = ">=3.8" +requires-python = ">=3.9" classifiers = [ "Programming Language :: Python :: 3", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", ] dependencies = [ - "django>=3.2", + "django>=4.2", "sqlparse" ] diff --git a/sql_util/aggregates.py b/sql_util/aggregates.py index 18e5c72..4687660 100644 --- a/sql_util/aggregates.py +++ b/sql_util/aggregates.py @@ -9,7 +9,7 @@ def __init__(self, queryset_or_expression, **extra): if isinstance(queryset_or_expression, QuerySet): self.queryset = queryset_or_expression self.query = self.queryset.query - super(Subquery, self).__init__(queryset_or_expression, **extra) + super().__init__(queryset_or_expression, **extra) else: expression = queryset_or_expression if not hasattr(expression, 'resolve_expression'): @@ -34,7 +34,7 @@ def resolve_expression(self, query=None, allow_joins=True, reuse=None, summarize queryset = self.get_queryset(query.clone(), True, reuse, summarize) self.queryset = queryset self.query = queryset.query - return super(Subquery, self).resolve_expression(query, allow_joins, reuse, summarize, for_save) + return super().resolve_expression(query, allow_joins, reuse, summarize, for_save) def get_queryset(self, query, allow_joins, reuse, summarize): # This is a customization hook for child classes to override the base queryset computed automatically @@ -144,7 +144,7 @@ def __init__(self, *args, **extra): self.ordering = extra.pop('ordering', None) assert self.aggregate is not None, "Error: Attempt to instantiate a " \ "SubqueryAggregate with no aggregate function" - super(SubqueryAggregate, self).__init__(*args, **extra) + super().__init__(*args, **extra) def get_queryset(self, query, allow_joins, reuse, summarize): queryset = self._get_base_queryset(query, allow_joins, reuse, summarize) @@ -207,7 +207,7 @@ class SubqueryCount(SubqueryAggregate): def __init__(self, expression, reverse='', *args, **kwargs): kwargs['output_field'] = kwargs.get('output_field', IntegerField()) - super(SubqueryCount, self).__init__(expression, reverse=reverse, *args, **kwargs) + super().__init__(expression, reverse=reverse, *args, **kwargs) class SubqueryMin(SubqueryAggregate): @@ -236,7 +236,7 @@ class Exists(Subquery): def __init__(self, *args, **kwargs): self.negated = kwargs.pop('negated', False) - super(Exists, self).__init__(*args, **kwargs) + super().__init__(*args, **kwargs) self.output_field = BooleanField() def __invert__(self): @@ -244,7 +244,7 @@ def __invert__(self): return type(self)(self.queryset if self.queryset is not None else self.expression, negated=(not self.negated), **self.extra) def as_sql(self, compiler, connection, template=None, **extra_context): - sql, params = super(Exists, self).as_sql(compiler, connection, template, **extra_context) + sql, params = super().as_sql(compiler, connection, template, **extra_context) if self.negated: sql = 'NOT {}'.format(sql) return sql, params diff --git a/sql_util/tests/test_exists.py b/sql_util/tests/test_exists.py index 590d48d..87002dd 100644 --- a/sql_util/tests/test_exists.py +++ b/sql_util/tests/test_exists.py @@ -10,7 +10,7 @@ class TestExists(TestCase): @classmethod def setUpClass(cls): - super(TestExists, cls).setUpClass() + super().setUpClass() parents = [ Parent.objects.create(name='John'), @@ -55,7 +55,7 @@ def test_easy_negated_exists(self): class TestExistsFilter(TestCase): @classmethod def setUpClass(cls): - super(TestExistsFilter, cls).setUpClass() + super().setUpClass() publishers = [ Publisher.objects.create(name='Publisher 1', number=1), Publisher.objects.create(name='Publisher 2', number=2) @@ -113,7 +113,7 @@ class TestManyToManyExists(TestCase): @classmethod def setUpClass(cls): - super(TestManyToManyExists, cls).setUpClass() + super().setUpClass() publishers = [ Publisher.objects.create(name='Publisher 1', number=1), Publisher.objects.create(name='Publisher 2', number=2) @@ -219,7 +219,7 @@ def test_filter_last_join(self): class TestExistsReverseNames(TestCase): @classmethod def setUpClass(cls): - super(TestExistsReverseNames, cls).setUpClass() + super().setUpClass() categories = [ Category.objects.create(name='cat one'), Category.objects.create(name='cat two'), @@ -292,7 +292,7 @@ def test_name_doesnt_match_m2m(self): class TestGenericForeignKey(TestCase): @classmethod def setUpClass(cls): - super(TestGenericForeignKey, cls).setUpClass() + super().setUpClass() dogs = [ Dog.objects.create(name="Fido"), Dog.objects.create(name="Snoopy"), diff --git a/sql_util/tests/test_postgres_settings.py b/sql_util/tests/test_postgres_settings.py index 58fec0a..f870ff0 100644 --- a/sql_util/tests/test_postgres_settings.py +++ b/sql_util/tests/test_postgres_settings.py @@ -2,7 +2,7 @@ DATABASES = { 'default': { - 'ENGINE': 'django.db.backends.postgresql_psycopg2', + 'ENGINE': 'django.db.backends.postgresql', 'NAME': 'sqlutil', 'USER': 'postgres', 'PASSWORD': 'postgres', diff --git a/sql_util/tests/test_subquery.py b/sql_util/tests/test_subquery.py index 6670d17..808fa81 100644 --- a/sql_util/tests/test_subquery.py +++ b/sql_util/tests/test_subquery.py @@ -13,7 +13,7 @@ class TestParentChild(TestCase): @classmethod def setUpClass(cls): - super(TestParentChild, cls).setUpClass() + super().setUpClass() parents = [ Parent.objects.create(name='John'), Parent.objects.create(name='Jane') @@ -96,7 +96,7 @@ class TestManyToMany(TestCase): @classmethod def setUpClass(cls): - super(TestManyToMany, cls).setUpClass() + super().setUpClass() publishers = [ Publisher.objects.create(name='Publisher 1', number=1), Publisher.objects.create(name='Publisher 2', number=2) @@ -220,7 +220,7 @@ def test_self_join(self): class TestForeignKey(TestCase): @classmethod def setUpClass(cls): - super(TestForeignKey, cls).setUpClass() + super().setUpClass() publishers = [ Publisher.objects.create(name='Publisher 1', number=1), Publisher.objects.create(name='Publisher 2', number=2) @@ -271,7 +271,7 @@ class TestReverseForeignKey(TestCase): @classmethod def setUpClass(cls): - super(TestReverseForeignKey, cls).setUpClass() + super().setUpClass() catalogs = [ Catalog.objects.create(number='A'), Catalog.objects.create(number='B') @@ -366,7 +366,7 @@ class TestForeignKeyToField(TestCase): @classmethod def setUpClass(cls): - super(TestForeignKeyToField, cls).setUpClass() + super().setUpClass() brand = Brand.objects.create(name='Python', company_id=1337) products = [ Product.objects.create(brand=brand, num_purchases=1), @@ -384,7 +384,7 @@ class TestMultipleForeignKeyToTheSameModel(TestCase): @classmethod def setUpClass(cls): - super(TestMultipleForeignKeyToTheSameModel, cls).setUpClass() + super().setUpClass() player1 = Player.objects.create(nickname='Player 1') player2 = Player.objects.create(nickname='Player 2')