diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index ea33c3ecb..9069c46f0 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -204,6 +204,11 @@ jobs: matrix: python-version: ['3.10', '3.11', '3.12', '3.13'] django-version: ['5.0', '5.1', '5.2'] + include: + - python-version: '3.12' + django-version: '6.0' + - python-version: '3.13' + django-version: '6.0' steps: - uses: actions/checkout@v6 - name: Setup system dependencies diff --git a/pyproject.toml b/pyproject.toml index aea16ac20..f265bb87b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -49,7 +49,8 @@ tests = [ "pytest-shard==0.1.2", "pytest-xdist==3.8.0", # Django deps: - "django==5.2.9", + "django==5.2.9; python_version < '3.12'", + "django==6.0; python_version >= '3.12'", "mysqlclient==2.2.7", "psycopg2-binary==2.9.11", "jinja2==3.1.6", diff --git a/scripts/stubtest.sh b/scripts/stubtest.sh index 994d54a3a..3ba76c53c 100755 --- a/scripts/stubtest.sh +++ b/scripts/stubtest.sh @@ -13,4 +13,5 @@ stubtest django \ --mypy-config-file mypy.ini \ --allowlist scripts/stubtest/allowlist.txt \ --allowlist scripts/stubtest/allowlist_todo.txt \ - --allowlist scripts/stubtest/allowlist_todo_django52.txt + --allowlist scripts/stubtest/allowlist_todo_django52.txt \ + --allowlist scripts/stubtest/allowlist_todo_django60.txt diff --git a/scripts/stubtest/allowlist.txt b/scripts/stubtest/allowlist.txt index 48f49d67f..6d061c73d 100644 --- a/scripts/stubtest/allowlist.txt +++ b/scripts/stubtest/allowlist.txt @@ -235,24 +235,6 @@ django.contrib.sessions.backends.base.SessionBase.setdefault # Limited stubtest support for enums (https://github.com/python/mypy/issues/16806) django.db.migrations.operations.base.OperationCategory.__new__ -# Ignore: ...Model.[a]save is inconsistent, stub does not have *args argument "args" -# Positional arguments were deprecated in Django 5.1, we have adopted keyword-only arguments early. -django.contrib.auth.base_user.AbstractBaseUser.save -django.contrib.auth.models.AbstractBaseUser.save -django.contrib.gis.db.models.Model.asave -django.contrib.gis.db.models.Model.save -django.db.models.Model.asave -django.db.models.Model.save -django.db.models.base.Model.asave -django.db.models.base.Model.save - -# Ignore: GeneratedField.__init__ is inconsistent, runtime argument "db_persist" has a default value but stub argument does not -# The default value None never worked and has been dropped for Django 6.0: -# https://code.djangoproject.com/ticket/36262 -django.contrib.gis.db.models.GeneratedField.__init__ -django.db.models.GeneratedField.__init__ -django.db.models.fields.generated.GeneratedField.__init__ - # These are dynamically added when using `save(commit=False)` # See https://docs.djangoproject.com/en/5.2/topics/forms/modelforms/#the-save-method django.forms.BaseModelForm.save_m2m @@ -276,9 +258,6 @@ django.http.request.QueryDict.pop # Django incorrectly uses a signature of `(cls, **kwargs)` when it should be `(cls, *args, **kwargs)`. django.test.selenium.SeleniumTestCase.__init_subclass__ -# Django incorrectly uses a signature of `(self, *args, **kwargs)` when it should be `(self)`. -django.forms.renderers.Jinja2DivFormRenderer.__init__ - # mypy does not understand __getitem__ unpacking python/mypy#2220 django.urls.ResolverMatch.__iter__ django.urls.resolvers.ResolverMatch.__iter__ diff --git a/scripts/stubtest/allowlist_todo.txt b/scripts/stubtest/allowlist_todo.txt index cbfaf036f..23fc33e06 100644 --- a/scripts/stubtest/allowlist_todo.txt +++ b/scripts/stubtest/allowlist_todo.txt @@ -30,7 +30,6 @@ django.contrib.admin.site django.contrib.admin.sites.site django.contrib.admin.tests.AdminSeleniumTestCase django.contrib.admin.tests.AdminSeleniumTestCase.assertCountSeleniumElements -django.contrib.admin.tests.CSPMiddleware.process_response django.contrib.admin.utils.QUOTE_MAP django.contrib.admin.utils.UNQUOTE_MAP django.contrib.admin.utils.prepare_lookup_value @@ -212,10 +211,8 @@ django.contrib.gis.db.models.ForeignObject.get_extra_descriptor_filter django.contrib.gis.db.models.ForeignObject.get_extra_restriction django.contrib.gis.db.models.ForeignObject.get_foreign_related_value django.contrib.gis.db.models.ForeignObject.get_instance_value_for_fields -django.contrib.gis.db.models.ForeignObject.get_joining_columns django.contrib.gis.db.models.ForeignObject.get_local_related_value django.contrib.gis.db.models.ForeignObject.get_path_info -django.contrib.gis.db.models.ForeignObject.get_reverse_joining_columns django.contrib.gis.db.models.ForeignObject.get_reverse_path_info django.contrib.gis.db.models.ForeignObject.path_infos django.contrib.gis.db.models.ForeignObject.related_accessor_class @@ -397,7 +394,6 @@ django.core.servers.basehttp.ServerHandler.__init__ django.core.servers.basehttp.ThreadedWSGIServer.__init__ django.db.backends.ddl_references.Expressions django.db.backends.mysql.base.DatabaseWrapper.ops -django.db.backends.mysql.features.DatabaseFeatures.can_rename_index django.db.backends.mysql.features.DatabaseFeatures.can_return_rows_from_bulk_insert django.db.backends.mysql.features.DatabaseFeatures.django_test_skips django.db.backends.mysql.features.DatabaseFeatures.minimum_database_version @@ -546,10 +542,8 @@ django.db.models.ForeignObject.get_extra_descriptor_filter django.db.models.ForeignObject.get_extra_restriction django.db.models.ForeignObject.get_foreign_related_value django.db.models.ForeignObject.get_instance_value_for_fields -django.db.models.ForeignObject.get_joining_columns django.db.models.ForeignObject.get_local_related_value django.db.models.ForeignObject.get_path_info -django.db.models.ForeignObject.get_reverse_joining_columns django.db.models.ForeignObject.get_reverse_path_info django.db.models.ForeignObject.path_infos django.db.models.ForeignObject.related_accessor_class @@ -757,10 +751,8 @@ django.db.models.fields.related.ForeignObject.get_extra_descriptor_filter django.db.models.fields.related.ForeignObject.get_extra_restriction django.db.models.fields.related.ForeignObject.get_foreign_related_value django.db.models.fields.related.ForeignObject.get_instance_value_for_fields -django.db.models.fields.related.ForeignObject.get_joining_columns django.db.models.fields.related.ForeignObject.get_local_related_value django.db.models.fields.related.ForeignObject.get_path_info -django.db.models.fields.related.ForeignObject.get_reverse_joining_columns django.db.models.fields.related.ForeignObject.get_reverse_path_info django.db.models.fields.related.ForeignObject.path_infos django.db.models.fields.related.ForeignObject.related_accessor_class @@ -916,7 +908,6 @@ django.forms.models.BaseModelFormSet.model django.forms.models.ModelChoiceField.__deepcopy__ django.forms.models.inlineformset_factory django.forms.models.modelformset_factory -django.forms.renderers.DjangoDivFormRenderer django.forms.widgets.ChoiceWidget.template_name django.forms.widgets.Input.input_type django.forms.widgets.Media.__html__ diff --git a/scripts/stubtest/allowlist_todo_django52.txt b/scripts/stubtest/allowlist_todo_django52.txt index be5300168..e725dfa81 100644 --- a/scripts/stubtest/allowlist_todo_django52.txt +++ b/scripts/stubtest/allowlist_todo_django52.txt @@ -61,7 +61,6 @@ django.db.backends.oracle.features.DatabaseFeatures.supports_primitives_in_json_ django.db.backends.oracle.features.DatabaseFeatures.supports_tuple_lookups django.db.backends.oracle.features.DatabaseFeatures.test_collations django.db.backends.oracle.introspection.TableInfo -django.db.backends.oracle.oracledb_any django.db.backends.oracle.utils.BulkInsertMapper.NCLOB django.db.backends.oracle.utils.dsn django.db.backends.postgresql.base.DatabaseWrapper.close_pool @@ -71,7 +70,6 @@ django.db.backends.postgresql.features.DatabaseFeatures.django_test_skips django.db.backends.postgresql.features.DatabaseFeatures.supports_nulls_distinct_unique_constraints django.db.backends.postgresql.psycopg_any django.db.backends.sqlite3.base.DatabaseWrapper.transaction_modes -django.db.backends.sqlite3.features.DatabaseFeatures.supports_tuple_lookups django.db.backends.sqlite3.schema.DatabaseSchemaEditor.sql_alter_column_comment django.db.backends.sqlite3.schema.DatabaseSchemaEditor.sql_alter_table_comment django.db.migrations.autodetector.MigrationAutodetector.generate_altered_constraints diff --git a/scripts/stubtest/allowlist_todo_django60.txt b/scripts/stubtest/allowlist_todo_django60.txt new file mode 100644 index 000000000..adcab54d4 --- /dev/null +++ b/scripts/stubtest/allowlist_todo_django60.txt @@ -0,0 +1,265 @@ +django.conf.FORMS_URLFIELD_ASSUME_HTTPS_DEPRECATED_MSG +django.conf.global_settings.FORMS_URLFIELD_ASSUME_HTTPS +django.conf.global_settings.SECURE_CSP +django.conf.global_settings.SECURE_CSP_REPORT_ONLY +django.conf.global_settings.TASKS +django.conf.global_settings.URLIZE_ASSUME_HTTPS +django.contrib.admin.AdminSite.password_change_form +django.contrib.admin.ModelAdmin.log_deletion +django.contrib.admin.models.LogEntry.NotUpdated +django.contrib.admin.models.LogEntryManager.log_action +django.contrib.admin.options.BaseModelAdmin.lookup_allowed +django.contrib.admin.options.ModelAdmin.log_deletion +django.contrib.admin.sites.AdminSite.password_change_form +django.contrib.admin.tests.AdminSeleniumTestCase.trigger_resize +django.contrib.admin.tests.CSPMiddleware +django.contrib.admin.widgets.DateTimeWidgetContextMixin +django.contrib.auth.admin.UserAdmin.lookup_allowed +django.contrib.auth.admin.csrf_protect_m +django.contrib.auth.admin.sensitive_post_parameters_m +django.contrib.auth.checks.check_models_permissions +django.contrib.auth.checks.check_user_model +django.contrib.auth.forms.SetPasswordMixin.__class_getitem__ +django.contrib.auth.management.RenamePermission +django.contrib.auth.management.rename_permissions +django.contrib.auth.models.Group.NotUpdated +django.contrib.auth.models.Permission.NotUpdated +django.contrib.auth.models.User.NotUpdated +django.contrib.auth.templatetags +django.contrib.auth.templatetags.auth +django.contrib.contenttypes.checks.check_generic_foreign_keys +django.contrib.contenttypes.checks.check_model_name_lengths +django.contrib.contenttypes.fields.GenericForeignKey.ct_field_attname +django.contrib.contenttypes.fields.GenericForeignKey.get_prefetch_queryset +django.contrib.contenttypes.management.get_contenttypes_and_models +django.contrib.contenttypes.models.ContentType.NotUpdated +django.contrib.flatpages.models.FlatPage.NotUpdated +django.contrib.gis.admin.AdminSite.password_change_form +django.contrib.gis.admin.ModelAdmin.log_deletion +django.contrib.gis.db.backends.oracle.models.OracleGeometryColumns.NotUpdated +django.contrib.gis.db.backends.oracle.models.OracleSpatialRefSys.NotUpdated +django.contrib.gis.db.backends.postgis.models.PostGISGeometryColumns.NotUpdated +django.contrib.gis.db.backends.postgis.models.PostGISSpatialRefSys.NotUpdated +django.contrib.gis.db.backends.spatialite.models.SpatialiteGeometryColumns.NotUpdated +django.contrib.gis.db.backends.spatialite.models.SpatialiteSpatialRefSys.NotUpdated +django.contrib.gis.db.models.Aggregate.allow_order_by +django.contrib.gis.db.models.AnyValue +django.contrib.gis.db.models.BaseConstraint.__init__ +django.contrib.gis.db.models.BaseConstraint.check +django.contrib.gis.db.models.CheckConstraint.__init__ +django.contrib.gis.db.models.CheckConstraint.check +django.contrib.gis.db.models.ForeignObjectRel.get_joining_columns +django.contrib.gis.db.models.GeneratedField.referenced_fields +django.contrib.gis.db.models.Index.check +django.contrib.gis.db.models.Model._do_update +django.contrib.gis.db.models.Prefetch.get_current_queryset +django.contrib.gis.db.models.StringAgg +django.contrib.gis.db.models.UniqueConstraint.check +django.contrib.gis.db.models.__all__ +django.contrib.gis.db.models.functions.GeometryType +django.contrib.gis.db.models.functions.Rotate +django.contrib.gis.forms.BaseGeometryWidget.base_layer +django.contrib.gis.forms.BaseModelForm.validate_constraints +django.contrib.gis.forms.ClearableFileInput.use_fieldset +django.contrib.gis.forms.OSMWidget.base_layer +django.contrib.gis.forms.OpenLayersWidget.base_layer +django.contrib.gis.forms.widgets.BaseGeometryWidget.base_layer +django.contrib.gis.forms.widgets.OSMWidget.base_layer +django.contrib.gis.forms.widgets.OpenLayersWidget.base_layer +django.contrib.gis.gdal.OGRGeometry.coord_dim +django.contrib.gis.gdal.geometries.OGRGeometry.coord_dim +django.contrib.gis.geoip2.GeoIP2.coords +django.contrib.gis.geoip2.GeoIP2.open +django.contrib.gis.geos.geometry.GEOSGeometryBase.hasm +django.contrib.gis.geos.prototypes.predicates.geos_hasm +django.contrib.postgres.aggregates.ArrayAgg.allow_order_by +django.contrib.postgres.aggregates.JSONBAgg.allow_order_by +django.contrib.postgres.aggregates.general.ArrayAgg.allow_order_by +django.contrib.postgres.aggregates.general.JSONBAgg.allow_order_by +django.contrib.postgres.aggregates.mixins.OrderableAggMixin.__init_subclass__ +django.contrib.postgres.aggregates.mixins.OrderableAggMixin.allow_order_by +django.contrib.postgres.aggregates.mixins.OrderableAggMixin.as_sql +django.contrib.postgres.aggregates.mixins.OrderableAggMixin.get_source_expressions +django.contrib.postgres.aggregates.mixins.OrderableAggMixin.set_source_expressions +django.contrib.postgres.constraints.ExclusionConstraint.check +django.contrib.postgres.operations.BloomExtension.__init__ +django.contrib.postgres.operations.BtreeGinExtension.__init__ +django.contrib.postgres.operations.BtreeGistExtension.__init__ +django.contrib.postgres.operations.CITextExtension.__init__ +django.contrib.postgres.operations.CreateExtension.__init__ +django.contrib.postgres.operations.CryptoExtension.__init__ +django.contrib.postgres.operations.HStoreExtension.__init__ +django.contrib.postgres.operations.TrigramExtension.__init__ +django.contrib.postgres.operations.UnaccentExtension.__init__ +django.contrib.postgres.search.CombinedLexeme +django.contrib.postgres.search.Lexeme +django.contrib.postgres.search.LexemeCombinable +django.contrib.postgres.search.multiple_spaces_re +django.contrib.postgres.search.normalize_spaces +django.contrib.postgres.search.psql_escape +django.contrib.postgres.search.quote_lexeme +django.contrib.postgres.search.spec_chars_re +django.contrib.postgres.utils.CheckPostgresInstalledMixin +django.contrib.redirects.models.Redirect.NotUpdated +django.contrib.sessions.models.Session.NotUpdated +django.contrib.sites.models.Site.NotUpdated +django.contrib.staticfiles.checks.check_finders +django.contrib.staticfiles.checks.check_storages +django.core.checks.model_checks.check_all_models +django.core.checks.model_checks.check_lazy_references +django.core.checks.security.base.E026 +django.core.checks.security.base.check_csp_settings +django.core.exceptions.ObjectNotUpdated +django.core.mail.EmailMessage.__init__ +django.core.mail.EmailMessage.message +django.core.mail.EmailMultiAlternatives.__init__ +django.core.mail.backends.smtp.EmailBackend.prep_address +django.core.mail.get_connection +django.core.mail.mail_admins +django.core.mail.mail_managers +django.core.mail.message.EmailMessage.__init__ +django.core.mail.message.EmailMessage.message +django.core.mail.message.EmailMultiAlternatives.__init__ +django.core.mail.send_mail +django.core.mail.send_mass_mail +django.core.paginator.AsyncPage +django.core.paginator.AsyncPaginator +django.core.paginator.BasePaginator +django.db.backends.base.client.BaseDatabaseClient.__del__ +django.db.backends.base.creation.BaseDatabaseCreation.__del__ +django.db.backends.base.creation.BaseDatabaseCreation.create_test_db +django.db.backends.base.features.BaseDatabaseFeatures.__del__ +django.db.backends.base.features.BaseDatabaseFeatures.can_return_rows_from_update +django.db.backends.base.features.BaseDatabaseFeatures.supports_aggregate_distinct_multiple_argument +django.db.backends.base.features.BaseDatabaseFeatures.supports_aggregate_order_by_clause +django.db.backends.base.features.BaseDatabaseFeatures.supports_any_value +django.db.backends.base.features.BaseDatabaseFeatures.supports_json_negative_indexing +django.db.backends.base.features.BaseDatabaseFeatures.supports_tuple_comparison_against_subquery +django.db.backends.base.introspection.BaseDatabaseIntrospection.__del__ +django.db.backends.base.operations.BaseDatabaseOperations.__del__ +django.db.backends.base.operations.BaseDatabaseOperations.compile_json_path +django.db.backends.base.operations.BaseDatabaseOperations.fetch_returned_insert_columns +django.db.backends.base.operations.BaseDatabaseOperations.fetch_returned_rows +django.db.backends.base.operations.BaseDatabaseOperations.field_cast_sql +django.db.backends.base.operations.BaseDatabaseOperations.format_debug_sql +django.db.backends.base.operations.BaseDatabaseOperations.format_json_path_numeric_index +django.db.backends.base.operations.BaseDatabaseOperations.return_insert_columns +django.db.backends.base.operations.BaseDatabaseOperations.returning_columns +django.db.backends.base.validation.BaseDatabaseValidation.__del__ +django.db.backends.mysql.features.DatabaseFeatures.supports_aggregate_order_by_clause +django.db.backends.mysql.features.DatabaseFeatures.supports_any_value +django.db.backends.mysql.features.DatabaseFeatures.supports_json_negative_indexing +django.db.backends.mysql.operations.DatabaseOperations.fetch_returned_insert_rows +django.db.backends.mysql.operations.DatabaseOperations.return_insert_columns +django.db.backends.oracle.features.DatabaseFeatures.can_return_rows_from_update +django.db.backends.oracle.features.DatabaseFeatures.supports_aggregate_order_by_clause +django.db.backends.oracle.features.DatabaseFeatures.supports_any_value +django.db.backends.oracle.features.DatabaseFeatures.supports_json_negative_indexing +django.db.backends.oracle.features.DatabaseFeatures.supports_tuple_comparison_against_subquery +django.db.backends.oracle.operations.DatabaseOperations.fetch_returned_insert_columns +django.db.backends.oracle.operations.DatabaseOperations.fetch_returned_rows +django.db.backends.oracle.operations.DatabaseOperations.field_cast_sql +django.db.backends.oracle.operations.DatabaseOperations.return_insert_columns +django.db.backends.oracle.operations.DatabaseOperations.returning_columns +django.db.backends.oracle.utils.BoundVar +django.db.backends.oracle.utils.InsertVar +django.db.backends.postgresql.features.DatabaseFeatures.can_return_rows_from_update +django.db.backends.postgresql.features.DatabaseFeatures.supports_aggregate_order_by_clause +django.db.backends.postgresql.features.DatabaseFeatures.supports_any_value +django.db.backends.postgresql.operations.DatabaseOperations.fetch_returned_insert_rows +django.db.backends.sqlite3.features.DatabaseFeatures.can_return_rows_from_update +django.db.backends.sqlite3.features.DatabaseFeatures.max_query_params +django.db.backends.sqlite3.features.DatabaseFeatures.supports_aggregate_distinct_multiple_argument +django.db.backends.sqlite3.features.DatabaseFeatures.supports_aggregate_order_by_clause +django.db.backends.sqlite3.features.DatabaseFeatures.supports_any_value +django.db.backends.sqlite3.operations.DatabaseOperations.fetch_returned_insert_rows +django.db.backends.sqlite3.operations.DatabaseOperations.format_json_path_numeric_index +django.db.migrations.executor.MigrationExecutor.record_migration +django.db.migrations.loader.MigrationLoader.all_replaced_applied +django.db.migrations.loader.MigrationLoader.replace_migration +django.db.migrations.operations.base.Operation.__replace__ +django.db.migrations.recorder.MigrationRecorder.Migration.NotUpdated +django.db.migrations.serializer.DeconstructableSerializer +django.db.migrations.serializer.DeconstructibleSerializer +django.db.migrations.serializer.ZoneInfoSerializer +django.db.models.Aggregate.allow_order_by +django.db.models.AnyValue +django.db.models.BaseConstraint.__init__ +django.db.models.BaseConstraint.check +django.db.models.CheckConstraint.__init__ +django.db.models.CheckConstraint.check +django.db.models.ForeignObjectRel.get_joining_columns +django.db.models.GeneratedField.referenced_fields +django.db.models.Index.check +django.db.models.Model._do_update +django.db.models.Prefetch.get_current_queryset +django.db.models.StringAgg +django.db.models.UniqueConstraint.check +django.db.models.__all__ +django.db.models.aggregates.Aggregate.allow_order_by +django.db.models.aggregates.AnyValue +django.db.models.aggregates.StringAgg +django.db.models.aggregates.__all__ +django.db.models.base.Model._do_update +django.db.models.constraints.BaseConstraint.__init__ +django.db.models.constraints.BaseConstraint.check +django.db.models.constraints.CheckConstraint.__init__ +django.db.models.constraints.CheckConstraint.check +django.db.models.constraints.UniqueConstraint.check +django.db.models.enums.ChoicesMeta +django.db.models.expressions.OrderByList.from_param +django.db.models.fields.generated.GeneratedField.referenced_fields +django.db.models.fields.json.HasKeyLookup.compile_json_path_final_key +django.db.models.fields.json.HasKeyOrArrayIndex.compile_json_path_final_key +django.db.models.fields.mixins.FieldCacheMixin.get_cache_name +django.db.models.fields.related.ForeignObjectRel.get_joining_columns +django.db.models.fields.related.ForwardManyToOneDescriptor.get_prefetch_queryset +django.db.models.fields.related.ReverseOneToOneDescriptor.get_prefetch_queryset +django.db.models.fields.related_descriptors.ForwardManyToOneDescriptor.get_prefetch_queryset +django.db.models.fields.related_descriptors.ReverseOneToOneDescriptor.get_prefetch_queryset +django.db.models.fields.reverse_related.ForeignObjectRel.get_joining_columns +django.db.models.indexes.Index.check +django.db.models.query.Prefetch.get_current_queryset +django.db.models.sql.compiler.SQLUpdateCompiler.execute_returning_sql +django.db.models.sql.compiler.SQLUpdateCompiler.returning_fields +django.db.models.sql.compiler.SQLUpdateCompiler.returning_params +django.db.utils.DatabaseErrorWrapper.__del__ +django.forms.BaseModelForm.validate_constraints +django.forms.ClearableFileInput.use_fieldset +django.forms.models.BaseModelForm.validate_constraints +django.forms.renderers.Jinja2DivFormRenderer +django.forms.widgets.ClearableFileInput.use_fieldset +django.middleware.csp +django.tasks +django.tasks.backends +django.tasks.backends.base +django.tasks.backends.dummy +django.tasks.backends.immediate +django.tasks.base +django.tasks.checks +django.tasks.exceptions +django.tasks.signals +django.template.base.PartialTemplate +django.template.context_processors.csp +django.template.defaulttags.PartialDefNode +django.template.defaulttags.PartialNode +django.template.defaulttags.partial_func +django.template.defaulttags.partialdef_func +django.test.runner.QueryFormatter +django.test.selenium.SeleniumTestCase.get_browser_logs +django.test.testcases._AssertTemplateUsedContext.rendered_template_names +django.utils.copy +django.utils.csp +django.utils.datastructures.DeferredSubDict +django.utils.deprecation.RemovedInDjango60Warning +django.utils.deprecation.RemovedInDjango70Warning +django.utils.deprecation.deprecate_posargs +django.utils.deprecation.django_file_prefixes +django.utils.http.MAX_HEADER_LENGTH +django.utils.http.parse_header_parameters +django.utils.inspect.is_module_level_function +django.utils.itercompat +django.utils.json +django.utils.log.log_message +django.utils.text.acompress_sequence +django.views.decorators.csp diff --git a/tests/typecheck/fields/test_related.yml b/tests/typecheck/fields/test_related.yml index e671ff455..213953079 100644 --- a/tests/typecheck/fields/test_related.yml +++ b/tests/typecheck/fields/test_related.yml @@ -1200,6 +1200,7 @@ ) - case: test_many_to_many + skip: __import__("django").VERSION < (6, 0) main: | from typing_extensions import reveal_type from myapp.models import MyModel, Other @@ -1273,13 +1274,13 @@ main:34: note: Revealed type is "django.db.models.manager.Manager[myapp.models.MyModel_auto_through]" main:36: note: Revealed type is "myapp.models.Other_ManyRelatedManager[myapp.models.MyModel_auto_through]" main:37: note: Revealed type is "type[myapp.models.MyModel_auto_through]" - main:38: note: Revealed type is "django.db.models.fields._FieldDescriptor[django.db.models.fields.AutoField[django.db.models.expressions.Combinable | builtins.int | builtins.str | None, builtins.int]]" + main:38: note: Revealed type is "django.db.models.fields._FieldDescriptor[django.db.models.fields.BigAutoField[builtins.float | builtins.int | builtins.str | django.db.models.expressions.Combinable | None, builtins.int]]" main:39: note: Revealed type is "myapp.models.Other_ManyRelatedManager[myapp.models.MyModel_other_again]" main:40: note: Revealed type is "type[myapp.models.MyModel_other_again]" - main:41: note: Revealed type is "django.db.models.fields._FieldDescriptor[django.db.models.fields.AutoField[django.db.models.expressions.Combinable | builtins.int | builtins.str | None, builtins.int]]" + main:41: note: Revealed type is "django.db.models.fields._FieldDescriptor[django.db.models.fields.BigAutoField[builtins.float | builtins.int | builtins.str | django.db.models.expressions.Combinable | None, builtins.int]]" main:42: note: Revealed type is "myapp.models.Other_ManyRelatedManager[myapp.models.CustomThrough]" main:43: note: Revealed type is "type[myapp.models.CustomThrough]" - main:44: note: Revealed type is "django.db.models.fields._FieldDescriptor[django.db.models.fields.AutoField[django.db.models.expressions.Combinable | builtins.int | builtins.str, builtins.int]]" + main:44: note: Revealed type is "django.db.models.fields._FieldDescriptor[django.db.models.fields.BigAutoField[builtins.float | builtins.int | builtins.str | django.db.models.expressions.Combinable, builtins.int]]" installed_apps: - myapp files: diff --git a/tests/typecheck/models/test_create.yml b/tests/typecheck/models/test_create.yml index a60874d06..7dc6f2337 100644 --- a/tests/typecheck/models/test_create.yml +++ b/tests/typecheck/models/test_create.yml @@ -81,12 +81,13 @@ class Child(Base): pass - case: optional_id_fields_for_create_is_error_if_not_autofield + skip: __import__("django").VERSION < (6, 0) main: | from myapp.models import Publisher, Book Book.objects.create(id=None) # E: Incompatible type for "id" of "Book" (got "None", expected "float | int | str | Combinable") [misc] Book.objects.create(publisher=None) # E: Incompatible type for "publisher" of "Book" (got "None", expected "Publisher | Combinable") [misc] - Book.objects.create(publisher_id=None) # E: Incompatible type for "publisher_id" of "Book" (got "None", expected "Combinable | int | str") [misc] + Book.objects.create(publisher_id=None) # E: Incompatible type for "publisher_id" of "Book" (got "None", expected "float | int | str | Combinable") [misc] installed_apps: - myapp files: diff --git a/tests/typecheck/models/test_init.yml b/tests/typecheck/models/test_init.yml index 45f9a991a..dd03f10ca 100644 --- a/tests/typecheck/models/test_init.yml +++ b/tests/typecheck/models/test_init.yml @@ -120,13 +120,14 @@ mypk = models.IntegerField(primary_key=True) - case: set_foreign_key_by_its_primary_key + skip: __import__("django").VERSION < (6, 0) main: | from datetime import datetime now = datetime.now() from myapp.models import Publisher, PublisherDatetime, Book Book(publisher_id=1, publisher_dt_id=now) - Book(publisher_id=[], publisher_dt_id=now) # E: Incompatible type for "publisher_id" of "Book" (got "list[Any]", expected "Combinable | int | str") [misc] + Book(publisher_id=[], publisher_dt_id=now) # E: Incompatible type for "publisher_id" of "Book" (got "list[Any]", expected "float | int | str | Combinable") [misc] Book(publisher_id=1, publisher_dt_id=1) # E: Incompatible type for "publisher_dt_id" of "Book" (got "int", expected "str | datetime | date | Combinable") [misc] installed_apps: - myapp diff --git a/uv.lock b/uv.lock index 7e1194864..792c0c714 100644 --- a/uv.lock +++ b/uv.lock @@ -1,6 +1,10 @@ version = 1 revision = 3 requires-python = ">=3.10" +resolution-markers = [ + "python_full_version >= '3.12'", + "python_full_version < '3.12'", +] [manifest] members = [ @@ -207,22 +211,43 @@ wheels = [ name = "django" version = "5.2.9" source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.12'", +] dependencies = [ - { name = "asgiref" }, - { name = "sqlparse" }, - { name = "tzdata", marker = "sys_platform == 'win32'" }, + { name = "asgiref", marker = "python_full_version < '3.12'" }, + { name = "sqlparse", marker = "python_full_version < '3.12'" }, + { name = "tzdata", marker = "python_full_version < '3.12' and sys_platform == 'win32'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/eb/1c/188ce85ee380f714b704283013434976df8d3a2df8e735221a02605b6794/django-5.2.9.tar.gz", hash = "sha256:16b5ccfc5e8c27e6c0561af551d2ea32852d7352c67d452ae3e76b4f6b2ca495", size = 10848762, upload-time = "2025-12-02T14:01:08.418Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/17/b0/7f42bfc38b8f19b78546d47147e083ed06e12fc29c42da95655e0962c6c2/django-5.2.9-py3-none-any.whl", hash = "sha256:3a4ea88a70370557ab1930b332fd2887a9f48654261cdffda663fef5976bb00a", size = 8290652, upload-time = "2025-12-02T14:01:03.485Z" }, ] +[[package]] +name = "django" +version = "6.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.12'", +] +dependencies = [ + { name = "asgiref", marker = "python_full_version >= '3.12'" }, + { name = "sqlparse", marker = "python_full_version >= '3.12'" }, + { name = "tzdata", marker = "python_full_version >= '3.12' and sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/15/75/19762bfc4ea556c303d9af8e36f0cd910ab17dff6c8774644314427a2120/django-6.0.tar.gz", hash = "sha256:7b0c1f50c0759bbe6331c6a39c89ae022a84672674aeda908784617ef47d8e26", size = 10932418, upload-time = "2025-12-03T16:26:21.878Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d7/ae/f19e24789a5ad852670d6885f5480f5e5895576945fcc01817dfd9bc002a/django-6.0-py3-none-any.whl", hash = "sha256:1cc2c7344303bbfb7ba5070487c17f7fc0b7174bbb0a38cebf03c675f5f19b6d", size = 8339181, upload-time = "2025-12-03T16:26:16.231Z" }, +] + [[package]] name = "django-stubs" version = "5.2.8" source = { editable = "." } dependencies = [ - { name = "django" }, + { name = "django", version = "5.2.9", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.12'" }, + { name = "django", version = "6.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, { name = "django-stubs-ext" }, { name = "tomli", marker = "python_full_version < '3.11'" }, { name = "types-pyyaml" }, @@ -243,7 +268,8 @@ redis = [ [package.dev-dependencies] dev = [ - { name = "django" }, + { name = "django", version = "5.2.9", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.12'" }, + { name = "django", version = "6.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, { name = "django-stubs", extra = ["compatible-mypy", "oracle", "redis"] }, { name = "jinja2" }, { name = "mysqlclient" }, @@ -263,7 +289,8 @@ pyright = [ { name = "pyright" }, ] tests = [ - { name = "django" }, + { name = "django", version = "5.2.9", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.12'" }, + { name = "django", version = "6.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, { name = "django-stubs", extra = ["compatible-mypy", "oracle", "redis"] }, { name = "jinja2" }, { name = "mysqlclient" }, @@ -291,7 +318,8 @@ provides-extras = ["compatible-mypy", "oracle", "redis"] [package.metadata.requires-dev] dev = [ - { name = "django", specifier = "==5.2.9" }, + { name = "django", marker = "python_full_version < '3.12'", specifier = "==5.2.9" }, + { name = "django", marker = "python_full_version >= '3.12'", specifier = "==6.0" }, { name = "django-stubs", extras = ["compatible-mypy", "oracle", "redis"], editable = "." }, { name = "jinja2", specifier = "==3.1.6" }, { name = "mysqlclient", specifier = "==2.2.7" }, @@ -307,7 +335,8 @@ dev = [ pyrefly = [{ name = "pyrefly", specifier = "==0.45.0" }] pyright = [{ name = "pyright", specifier = "==1.1.407" }] tests = [ - { name = "django", specifier = "==5.2.9" }, + { name = "django", marker = "python_full_version < '3.12'", specifier = "==5.2.9" }, + { name = "django", marker = "python_full_version >= '3.12'", specifier = "==6.0" }, { name = "django-stubs", extras = ["compatible-mypy", "oracle", "redis"], editable = "." }, { name = "jinja2", specifier = "==3.1.6" }, { name = "mysqlclient", specifier = "==2.2.7" }, @@ -324,7 +353,8 @@ name = "django-stubs-ext" version = "5.2.8" source = { editable = "ext" } dependencies = [ - { name = "django" }, + { name = "django", version = "5.2.9", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.12'" }, + { name = "django", version = "6.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, { name = "typing-extensions" }, ] @@ -339,7 +369,7 @@ name = "exceptiongroup" version = "1.3.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "typing-extensions", marker = "python_full_version < '3.13'" }, + { name = "typing-extensions", marker = "python_full_version < '3.12'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/50/79/66800aadf48771f6b62f7eb014e352e5d06856655206165d775e675a02c9/exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219", size = 30371, upload-time = "2025-11-21T23:01:54.787Z" } wheels = [