From 38331a661602cfe39cf1bfb12ca10ad1de038f47 Mon Sep 17 00:00:00 2001 From: Marti Raudsepp Date: Wed, 6 Dec 2023 17:05:01 +0200 Subject: [PATCH 1/4] Update and prepare for Django 5.0 * Updated Django dependency to 5.0.0. * Created a separate allowlist `allowlist_todo_django50.txt` for new entries. * Bumped version to `5.0.0.dev1` for the time being (final release will be `5.0.0`). * Django version 4.1 is now officially EOL by Django project, but let's take that separately. --- .github/workflows/test.yml | 2 +- README.md | 1 + ext/setup.py | 3 +- requirements.txt | 2 +- scripts/stubtest.sh | 3 +- scripts/stubtest/allowlist.txt | 3 - scripts/stubtest/allowlist_todo.txt | 35 -- scripts/stubtest/allowlist_todo_django50.txt | 329 +++++++++++++++++++ setup.py | 5 +- 9 files changed, 339 insertions(+), 44 deletions(-) create mode 100644 scripts/stubtest/allowlist_todo_django50.txt diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 3efae77ef..307e1fe74 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -102,7 +102,7 @@ jobs: fail-fast: false matrix: python-version: ['3.8', '3.9', '3.10', '3.11'] - django-version: ['3.2', '4.2'] + django-version: ['3.2', '4.2', '5.0'] include: - python-version: '3.12' django-version: '4.1' diff --git a/README.md b/README.md index 84d2b2741..dbe4f0b90 100644 --- a/README.md +++ b/README.md @@ -49,6 +49,7 @@ We rely on different `django` and `mypy` versions: | django-stubs | Mypy version | Django version | Django partial support | Python version | |----------------|--------------|----------------|------------------------|----------------| +| (next release) | 1.7.x | 5.0 | 4.2, 4.1, 3.2 | 3.8 - 3.12 | | 4.2.7 | 1.7.x | 4.2 | 4.1, 3.2 | 3.8 - 3.12 | | 4.2.6 | 1.6.x | 4.2 | 4.1, 3.2 | 3.8 - 3.12 | | 4.2.5 | 1.6.x | 4.2 | 4.1, 3.2 | 3.8 - 3.12 | diff --git a/ext/setup.py b/ext/setup.py index a5c9a2efe..6d7467e0c 100755 --- a/ext/setup.py +++ b/ext/setup.py @@ -15,7 +15,7 @@ # It's fine to skip django-stubs-ext releases, but when doing a release, update this to newest django-stubs version. setup( name="django-stubs-ext", - version="4.2.7", + version="5.0.0.dev1", description="Monkey-patching and extensions for django-stubs", long_description=readme, long_description_content_type="text/markdown", @@ -44,6 +44,7 @@ "Framework :: Django :: 3.2", "Framework :: Django :: 4.1", "Framework :: Django :: 4.2", + "Framework :: Django :: 5.0", ], project_urls={ "Release notes": "https://github.com/typeddjango/django-stubs/releases", diff --git a/requirements.txt b/requirements.txt index bd9fc8fd9..3e6a837be 100644 --- a/requirements.txt +++ b/requirements.txt @@ -7,7 +7,7 @@ pytest-shard==0.1.2 # Django deps: psycopg2-binary -Django==4.2.7 +Django==5.0.0 -e ./ext -e .[compatible-mypy] diff --git a/scripts/stubtest.sh b/scripts/stubtest.sh index 74ed0e6ec..a4373d220 100644 --- a/scripts/stubtest.sh +++ b/scripts/stubtest.sh @@ -11,4 +11,5 @@ stubtest django \ --mypy-config-file mypy.ini \ --ignore-positional-only \ --allowlist scripts/stubtest/allowlist.txt \ - --allowlist scripts/stubtest/allowlist_todo.txt + --allowlist scripts/stubtest/allowlist_todo.txt \ + --allowlist scripts/stubtest/allowlist_todo_django50.txt diff --git a/scripts/stubtest/allowlist.txt b/scripts/stubtest/allowlist.txt index e3936550d..358e9a653 100644 --- a/scripts/stubtest/allowlist.txt +++ b/scripts/stubtest/allowlist.txt @@ -156,7 +156,6 @@ django.core.cache.backends.memcached.MemcachedCache # We re-export `functools.cached_property` which has different semantics django.utils.functional.cached_property.__class_getitem__ -django.utils.functional.cached_property.__init__ django.utils.functional.cached_property.__set__ django.utils.functional.cached_property.name @@ -250,7 +249,6 @@ django.db.backends.mysql.features.DatabaseFeatures.can_introspect_check_constrai django.db.backends.mysql.features.DatabaseFeatures.can_introspect_foreign_keys django.db.backends.mysql.features.DatabaseFeatures.can_introspect_json_field django.db.backends.mysql.features.DatabaseFeatures.can_return_columns_from_insert -django.db.backends.mysql.features.DatabaseFeatures.has_select_for_update_nowait django.db.backends.mysql.features.DatabaseFeatures.has_select_for_update_of django.db.backends.mysql.features.DatabaseFeatures.has_select_for_update_skip_locked django.db.backends.mysql.features.DatabaseFeatures.has_zoneinfo_database @@ -263,7 +261,6 @@ django.db.backends.mysql.features.DatabaseFeatures.supports_default_in_lead_lag django.db.backends.mysql.features.DatabaseFeatures.supports_explain_analyze django.db.backends.mysql.features.DatabaseFeatures.supports_expression_indexes django.db.backends.mysql.features.DatabaseFeatures.supports_index_column_ordering -django.db.backends.mysql.features.DatabaseFeatures.supports_over_clause django.db.backends.mysql.features.DatabaseFeatures.supports_transactions django.db.backends.mysql.features.DatabaseFeatures.update_can_self_select django.db.backends.postgresql.base.DatabaseWrapper.pg_version diff --git a/scripts/stubtest/allowlist_todo.txt b/scripts/stubtest/allowlist_todo.txt index a29a97a2b..389168690 100644 --- a/scripts/stubtest/allowlist_todo.txt +++ b/scripts/stubtest/allowlist_todo.txt @@ -3,14 +3,10 @@ django.__main__ django.apps.registry.Apps.populate -django.conf.CSRF_COOKIE_MASKED_DEPRECATED_MSG django.conf.DEFAULT_FILE_STORAGE_DEPRECATED_MSG django.conf.LazySettings.DEFAULT_FILE_STORAGE django.conf.LazySettings.STATICFILES_STORAGE -django.conf.LazySettings.USE_L10N django.conf.STATICFILES_STORAGE_DEPRECATED_MSG -django.conf.USE_DEPRECATED_PYTZ_DEPRECATED_MSG -django.conf.USE_L10N_DEPRECATED_MSG django.conf.global_settings.Router django.conf.global_settings.gettext_noop django.conf.urls.IncludedURLConf @@ -125,7 +121,6 @@ django.contrib.auth.forms.UserChangeForm.declared_fields django.contrib.auth.forms.UserCreationForm.declared_fields django.contrib.auth.forms.UserModel django.contrib.auth.hashers.Argon2PasswordHasher.params -django.contrib.auth.hashers.CryptPasswordHasher.__init__ django.contrib.auth.hashers.SHA1PasswordHasher.__init__ django.contrib.auth.hashers.ScryptPasswordHasher django.contrib.auth.hashers.UnsaltedMD5PasswordHasher.__init__ @@ -450,7 +445,6 @@ django.contrib.gis.db.models.QuerySet.__contains__ django.contrib.gis.db.models.QuerySet.__deepcopy__ django.contrib.gis.db.models.QuerySet.__reversed__ django.contrib.gis.db.models.QuerySet.__xor__ -django.contrib.gis.db.models.QuerySet.datetimes django.contrib.gis.db.models.RasterField.contribute_to_class django.contrib.gis.db.models.SlugField.formfield django.contrib.gis.db.models.SmallAutoField.rel_db_type @@ -501,7 +495,6 @@ django.contrib.gis.forms.BaseModelForm.__init__ django.contrib.gis.forms.BaseModelForm.save_m2m django.contrib.gis.forms.BaseModelFormSet.model django.contrib.gis.forms.BaseModelFormSet.save_m2m -django.contrib.gis.forms.BoundField.__html__ django.contrib.gis.forms.BoundWidget django.contrib.gis.forms.ChoiceField.__deepcopy__ django.contrib.gis.forms.ChoiceWidget @@ -580,28 +573,14 @@ django.contrib.messages.storage.cookie.CookieStorage.key_salt django.contrib.messages.storage.cookie.MessageDecoder.decode django.contrib.messages.storage.cookie.MessageEncoder.default django.contrib.messages.storage.cookie.MessageSerializer -django.contrib.postgres.aggregates.ArrayAgg.deprecation_msg -django.contrib.postgres.aggregates.ArrayAgg.deprecation_value django.contrib.postgres.aggregates.CovarPop.__init__ django.contrib.postgres.aggregates.JSONBAgg.__init__ -django.contrib.postgres.aggregates.JSONBAgg.deprecation_empty_result_set_value -django.contrib.postgres.aggregates.JSONBAgg.deprecation_msg -django.contrib.postgres.aggregates.JSONBAgg.deprecation_value django.contrib.postgres.aggregates.RegrCount.empty_result_set_value django.contrib.postgres.aggregates.StatAggregate.__init__ django.contrib.postgres.aggregates.StringAgg.__init__ -django.contrib.postgres.aggregates.StringAgg.deprecation_msg -django.contrib.postgres.aggregates.StringAgg.deprecation_value -django.contrib.postgres.aggregates.general.ArrayAgg.deprecation_msg -django.contrib.postgres.aggregates.general.ArrayAgg.deprecation_value django.contrib.postgres.aggregates.general.BitXor django.contrib.postgres.aggregates.general.JSONBAgg.__init__ -django.contrib.postgres.aggregates.general.JSONBAgg.deprecation_empty_result_set_value -django.contrib.postgres.aggregates.general.JSONBAgg.deprecation_msg -django.contrib.postgres.aggregates.general.JSONBAgg.deprecation_value django.contrib.postgres.aggregates.general.StringAgg.__init__ -django.contrib.postgres.aggregates.general.StringAgg.deprecation_msg -django.contrib.postgres.aggregates.general.StringAgg.deprecation_value django.contrib.postgres.aggregates.mixins.OrderableAggMixin.__init__ django.contrib.postgres.aggregates.mixins.OrderableAggMixin.as_sql django.contrib.postgres.aggregates.mixins.OrderableAggMixin.get_source_expressions @@ -715,7 +694,6 @@ django.contrib.sessions.models.Session.get_previous_by_expire_date django.contrib.sessions.models.Session.session_data django.contrib.sessions.models.Session.session_key django.contrib.sessions.models.SessionManager.__slotnames__ -django.contrib.sessions.serializers.PickleSerializer.__init__ django.contrib.sitemaps.views.SitemapIndexItem django.contrib.sites.admin.SiteAdmin django.contrib.sites.models.Site.domain @@ -793,17 +771,14 @@ django.core.signing.b62_encode django.core.signing.loads django.db.backends.ddl_references.Expressions django.db.backends.mysql.base -django.db.backends.mysql.features.DatabaseFeatures.can_release_savepoints 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 -django.db.backends.mysql.features.DatabaseFeatures.supports_frame_range_fixed_distance django.db.backends.mysql.features.DatabaseFeatures.supports_select_difference django.db.backends.mysql.features.DatabaseFeatures.supports_select_intersection django.db.backends.mysql.features.DatabaseFeatures.supports_table_check_constraints django.db.backends.mysql.features.DatabaseFeatures.test_collations -django.db.backends.mysql.features.DatabaseFeatures.uses_savepoints django.db.backends.mysql.introspection django.db.backends.mysql.schema.DatabaseSchemaEditor.sql_alter_column_comment django.db.backends.oracle.base @@ -849,17 +824,14 @@ django.db.backends.sqlite3.base.adapt_date django.db.backends.sqlite3.base.adapt_datetime django.db.backends.sqlite3.base.check_sqlite_version django.db.backends.sqlite3.features.DatabaseFeatures.can_alter_table_drop_column -django.db.backends.sqlite3.features.DatabaseFeatures.can_alter_table_rename_column django.db.backends.sqlite3.features.DatabaseFeatures.can_introspect_json_field django.db.backends.sqlite3.features.DatabaseFeatures.can_return_columns_from_insert django.db.backends.sqlite3.features.DatabaseFeatures.can_return_rows_from_bulk_insert django.db.backends.sqlite3.features.DatabaseFeatures.django_test_skips django.db.backends.sqlite3.features.DatabaseFeatures.has_json_object_function django.db.backends.sqlite3.features.DatabaseFeatures.introspected_field_types -django.db.backends.sqlite3.features.DatabaseFeatures.supports_atomic_references_rename django.db.backends.sqlite3.features.DatabaseFeatures.supports_json_field django.db.backends.sqlite3.introspection.FieldInfo -django.db.backends.sqlite3.schema.DatabaseSchemaEditor.alter_db_table django.db.backends.sqlite3.schema.DatabaseSchemaEditor.delete_model django.db.backends.sqlite3.schema.DatabaseSchemaEditor.sql_create_fk django.db.backends.utils.debug_transaction @@ -1056,7 +1028,6 @@ django.db.models.QuerySet.__contains__ django.db.models.QuerySet.__deepcopy__ django.db.models.QuerySet.__reversed__ django.db.models.QuerySet.__xor__ -django.db.models.QuerySet.datetimes django.db.models.SlugField.formfield django.db.models.SmallAutoField.rel_db_type django.db.models.StdDev.__init__ @@ -1454,7 +1425,6 @@ django.db.models.query.QuerySet.__contains__ django.db.models.query.QuerySet.__deepcopy__ django.db.models.query.QuerySet.__reversed__ django.db.models.query.QuerySet.__xor__ -django.db.models.query.QuerySet.datetimes django.db.models.query.RawQuerySet.__aiter__ django.db.models.query.RawQuerySet.__init__ django.db.models.query.RelatedPopulator @@ -1581,7 +1551,6 @@ django.forms.BaseModelForm.__init__ django.forms.BaseModelForm.save_m2m django.forms.BaseModelFormSet.model django.forms.BaseModelFormSet.save_m2m -django.forms.BoundField.__html__ django.forms.BoundWidget django.forms.ChoiceField.__deepcopy__ django.forms.ChoiceWidget @@ -1616,7 +1585,6 @@ django.forms.TextInput.__slotnames__ django.forms.Widget.__deepcopy__ django.forms.Widget.subwidgets django.forms.Widget.use_fieldset -django.forms.boundfield.BoundField.__html__ django.forms.boundfield.BoundWidget.__html__ django.forms.fields.ChoiceField.__deepcopy__ django.forms.fields.Field.__deepcopy__ @@ -1651,7 +1619,6 @@ django.forms.models.inlineformset_factory django.forms.models.modelform_factory django.forms.models.modelformset_factory django.forms.renderers.DjangoDivFormRenderer -django.forms.utils.DEFAULT_TEMPLATE_DEPRECATION_MSG django.forms.widgets.ChoiceWidget.__deepcopy__ django.forms.widgets.ChoiceWidget.subwidgets django.forms.widgets.ChoiceWidget.template_name @@ -1727,8 +1694,6 @@ django.template.utils.EngineHandler.__init__ django.templatetags.i18n.BlockTranslateNode.__init__ django.templatetags.static.PrefixNode.__init__ django.templatetags.static.StaticNode.__init__ -django.templatetags.tz.UnknownTimezoneException -django.templatetags.tz.timezone_constructor django.test.SimpleTestCase.assertFormError django.test.SimpleTestCase.assertFormSetError django.test.SimpleTestCase.assertTemplateNotUsed diff --git a/scripts/stubtest/allowlist_todo_django50.txt b/scripts/stubtest/allowlist_todo_django50.txt new file mode 100644 index 000000000..5b9c0b7c5 --- /dev/null +++ b/scripts/stubtest/allowlist_todo_django50.txt @@ -0,0 +1,329 @@ +# Autogenerated by `stubtest` +# Only discrepancies that appeared after Django 4.2 -> 5.0 update. +# Unsorted: there are real problems and things we can really ignore. + +django.conf.FORMS_URLFIELD_ASSUME_HTTPS_DEPRECATED_MSG +django.conf.global_settings.CSRF_COOKIE_MASKED +django.conf.global_settings.FORMS_URLFIELD_ASSUME_HTTPS +django.conf.global_settings.USE_DEPRECATED_PYTZ +django.conf.global_settings.USE_L10N +django.contrib.admin.AdminSite.get_log_entries +django.contrib.admin.AdminSite.get_model_admin +django.contrib.admin.AllValuesFieldListFilter.get_facet_counts +django.contrib.admin.BooleanFieldListFilter.get_facet_counts +django.contrib.admin.ChoicesFieldListFilter.get_facet_counts +django.contrib.admin.DateFieldListFilter.get_facet_counts +django.contrib.admin.EmptyFieldListFilter.get_facet_counts +django.contrib.admin.EmptyFieldListFilter.get_lookup_condition +django.contrib.admin.ModelAdmin.show_facets +django.contrib.admin.RelatedFieldListFilter.get_facet_counts +django.contrib.admin.ShowFacets +django.contrib.admin.SimpleListFilter.get_facet_counts +django.contrib.admin.exceptions.AlreadyRegistered +django.contrib.admin.exceptions.NotRegistered +django.contrib.admin.filters.AllValuesFieldListFilter.get_facet_counts +django.contrib.admin.filters.BooleanFieldListFilter.get_facet_counts +django.contrib.admin.filters.ChoicesFieldListFilter.get_facet_counts +django.contrib.admin.filters.DateFieldListFilter.get_facet_counts +django.contrib.admin.filters.EmptyFieldListFilter.get_facet_counts +django.contrib.admin.filters.EmptyFieldListFilter.get_lookup_condition +django.contrib.admin.filters.FacetsMixin +django.contrib.admin.filters.RelatedFieldListFilter.get_facet_counts +django.contrib.admin.filters.SimpleListFilter.get_facet_counts +django.contrib.admin.helpers.checkbox +django.contrib.admin.options.BaseModelAdmin.lookup_allowed +django.contrib.admin.options.IS_FACETS_VAR +django.contrib.admin.options.ModelAdmin.show_facets +django.contrib.admin.options.ShowFacets +django.contrib.admin.sites.AdminSite.get_log_entries +django.contrib.admin.sites.AdminSite.get_model_admin +django.contrib.admin.utils.build_q_object_from_lookup_parameters +django.contrib.admin.utils.get_last_value_from_parameters +django.contrib.admin.views.main.ChangeList.get_queryset +django.contrib.auth.aauthenticate +django.contrib.auth.admin.UserAdmin.lookup_allowed +django.contrib.auth.aget_user +django.contrib.auth.alogin +django.contrib.auth.alogout +django.contrib.auth.aupdate_session_auth_hash +django.contrib.auth.base_user.AbstractBaseUser.acheck_password +django.contrib.auth.hashers.CryptPasswordHasher +django.contrib.auth.hashers.acheck_password +django.contrib.auth.hashers.verify_password +django.contrib.auth.middleware.auser +django.contrib.auth.models.AbstractBaseUser.acheck_password +django.contrib.contenttypes.fields.GenericForeignKey.get_content_type +django.contrib.contenttypes.fields.GenericForeignKey.get_prefetch_querysets +django.contrib.contenttypes.prefetch +django.contrib.gis.admin.AdminSite.get_log_entries +django.contrib.gis.admin.AdminSite.get_model_admin +django.contrib.gis.admin.ModelAdmin.show_facets +django.contrib.gis.admin.OpenLayersWidget +django.contrib.gis.admin.options.spherical_mercator_srid +django.contrib.gis.admin.widgets +django.contrib.gis.db.backends.spatialite.schema.SpatialiteSchemaEditor.alter_db_table +django.contrib.gis.db.models.BaseConstraint.__init__ +django.contrib.gis.db.models.BaseConstraint.violation_error_code +django.contrib.gis.db.models.Case.allowed_default +django.contrib.gis.db.models.CheckConstraint.__init__ +django.contrib.gis.db.models.ExpressionWrapper.allowed_default +django.contrib.gis.db.models.F.allowed_default +django.contrib.gis.db.models.Field.__init__ +django.contrib.gis.db.models.Field._get_flatchoices +django.contrib.gis.db.models.Field.generated +django.contrib.gis.db.models.FilteredRelation.relabeled_clone +django.contrib.gis.db.models.FilteredRelation.resolve_expression +django.contrib.gis.db.models.ForeignKey.cast_db_type +django.contrib.gis.db.models.ForeignObject.get_joining_fields +django.contrib.gis.db.models.ForeignObject.get_reverse_joining_fields +django.contrib.gis.db.models.ForeignObjectRel.get_joining_fields +django.contrib.gis.db.models.Func.allowed_default +django.contrib.gis.db.models.GeneratedField +django.contrib.gis.db.models.Lookup.allowed_default +django.contrib.gis.db.models.Prefetch.get_current_querysets +django.contrib.gis.db.models.Q.identity +django.contrib.gis.db.models.QuerySet.aupdate_or_create +django.contrib.gis.db.models.QuerySet.update_or_create +django.contrib.gis.db.models.Value.allowed_default +django.contrib.gis.db.models.When.allowed_default +django.contrib.gis.db.models.functions.ClosestPoint +django.contrib.gis.forms.BaseForm._html_output +django.contrib.gis.forms.BaseModelFormSet.save_existing +django.contrib.gis.forms.BoundField.get_context +django.contrib.gis.forms.BoundField.template_name +django.contrib.gis.forms.ClearableFileInput.checked +django.contrib.gis.forms.Field.__init__ +django.contrib.gis.forms.URLField.__init__ +django.contrib.gis.forms.fields_for_model +django.contrib.gis.geos.geometry.GEOSGeometryBase.equals_identical +django.contrib.gis.geos.prototypes.io.DEFAULT_TRIM_VALUE +django.contrib.gis.geos.prototypes.io.default_trim_value +django.contrib.gis.geos.prototypes.predicates.geos_equalsidentical +django.contrib.gis.management +django.contrib.gis.management.commands +django.contrib.gis.management.commands.inspectdb +django.contrib.gis.management.commands.ogrinspect +django.contrib.messages.storage.cookie.CookieStorage.not_finished_json +django.contrib.messages.storage.cookie.MessagePartGatherSerializer +django.contrib.messages.storage.cookie.MessagePartSerializer +django.contrib.messages.storage.cookie.bisect_keep_left +django.contrib.messages.storage.cookie.bisect_keep_right +django.contrib.messages.test +django.contrib.redirects.migrations.0001_initial +django.contrib.redirects.migrations.0002_alter_redirect_new_path_help_text +django.contrib.sessions.migrations.0001_initial +django.contrib.sessions.serializers.PickleSerializer +django.contrib.sitemaps.PING_URL +django.contrib.sitemaps.SitemapNotFound +django.contrib.sitemaps.management +django.contrib.sitemaps.management.commands +django.contrib.sitemaps.management.commands.ping_google +django.contrib.sitemaps.ping_google +django.contrib.sites.migrations.0001_initial +django.contrib.sites.migrations.0002_alter_domain_unique +django.contrib.staticfiles.checks.E005 +django.contrib.staticfiles.checks.check_storages +django.core.cache.backends.base.memcached_error_chars_re +django.core.cache.backends.redis +django.core.files.File.open +django.core.files.base.File.open +django.core.handlers.asgi.ASGIHandler.get_script_prefix +django.core.handlers.asgi.ASGIHandler.listen_for_disconnect +django.core.handlers.asgi.ASGIHandler.run_get_response +django.core.handlers.asgi.get_script_prefix +django.core.management.commands.inspectdb.Command.normalize_table_name +django.core.management.commands.optimizemigration +django.core.paginator.Paginator.__init__ +django.core.paginator.Paginator.default_error_messages +django.core.serializers.base.PickleSerializer +django.core.validators.StepValueValidator.__init__ +django.db.backends.base.base.timezone_constructor +django.db.backends.base.features.BaseDatabaseFeatures.delete_can_self_reference_subquery +django.db.backends.base.features.BaseDatabaseFeatures.insert_test_table_with_defaults +django.db.backends.base.features.BaseDatabaseFeatures.supports_default_keyword_in_bulk_insert +django.db.backends.base.features.BaseDatabaseFeatures.supports_default_keyword_in_insert +django.db.backends.base.features.BaseDatabaseFeatures.supports_expression_defaults +django.db.backends.base.features.BaseDatabaseFeatures.supports_nulls_distinct_unique_constraints +django.db.backends.base.features.BaseDatabaseFeatures.supports_stored_generated_columns +django.db.backends.base.features.BaseDatabaseFeatures.supports_virtual_generated_columns +django.db.backends.base.operations.BaseDatabaseOperations.prepare_join_on_clause +django.db.backends.base.schema.BaseDatabaseSchemaEditor.db_default_sql +django.db.backends.mysql.features.DatabaseFeatures.allows_group_by_selected_pks +django.db.backends.mysql.features.DatabaseFeatures.delete_can_self_reference_subquery +django.db.backends.mysql.features.DatabaseFeatures.has_native_uuid_field +django.db.backends.mysql.features.DatabaseFeatures.insert_test_table_with_defaults +django.db.backends.mysql.features.DatabaseFeatures.supports_expression_defaults +django.db.backends.mysql.features.DatabaseFeatures.supports_stored_generated_columns +django.db.backends.mysql.features.DatabaseFeatures.supports_virtual_generated_columns +django.db.backends.oracle.features.DatabaseFeatures.insert_test_table_with_defaults +django.db.backends.oracle.features.DatabaseFeatures.supports_default_keyword_in_bulk_insert +django.db.backends.oracle.features.DatabaseFeatures.supports_primitives_in_json_field +django.db.backends.oracle.features.DatabaseFeatures.supports_stored_generated_columns +django.db.backends.oracle.features.DatabaseFeatures.supports_virtual_generated_columns +django.db.backends.oracle.features.DatabaseFeatures.test_collations +django.db.backends.oracle.oracledb_any +django.db.backends.postgresql.features.DatabaseFeatures.insert_test_table_with_defaults +django.db.backends.postgresql.features.DatabaseFeatures.is_postgresql_15 +django.db.backends.postgresql.features.DatabaseFeatures.supports_nulls_distinct_unique_constraints +django.db.backends.postgresql.features.DatabaseFeatures.supports_stored_generated_columns +django.db.backends.postgresql.features.DatabaseFeatures.supports_virtual_generated_columns +django.db.backends.postgresql.operations.DatabaseOperations.prepare_join_on_clause +django.db.backends.postgresql.psycopg_any +django.db.backends.sqlite3.features.DatabaseFeatures.insert_test_table_with_defaults +django.db.backends.sqlite3.features.DatabaseFeatures.supports_default_keyword_in_insert +django.db.backends.sqlite3.features.DatabaseFeatures.supports_stored_generated_columns +django.db.backends.sqlite3.features.DatabaseFeatures.supports_virtual_generated_columns +django.db.backends.sqlite3.schema.DatabaseSchemaEditor.sql_alter_column_comment +django.db.backends.sqlite3.schema.DatabaseSchemaEditor.sql_alter_table_comment +django.db.backends.utils.CursorWrapper.APPS_NOT_READY_WARNING_MSG +django.db.migrations.serializer.BaseUnorderedSequenceSerializer +django.db.models.BaseConstraint.__init__ +django.db.models.BaseConstraint.violation_error_code +django.db.models.Case.allowed_default +django.db.models.CheckConstraint.__init__ +django.db.models.ExpressionWrapper.allowed_default +django.db.models.F.allowed_default +django.db.models.Field.__init__ +django.db.models.Field._get_flatchoices +django.db.models.Field.generated +django.db.models.FilteredRelation.relabeled_clone +django.db.models.FilteredRelation.resolve_expression +django.db.models.ForeignKey.cast_db_type +django.db.models.ForeignObject.get_joining_fields +django.db.models.ForeignObject.get_reverse_joining_fields +django.db.models.ForeignObjectRel.get_joining_fields +django.db.models.Func.allowed_default +django.db.models.GeneratedField +django.db.models.Lookup.allowed_default +django.db.models.Prefetch.get_current_querysets +django.db.models.Q.identity +django.db.models.QuerySet.aupdate_or_create +django.db.models.QuerySet.update_or_create +django.db.models.Value.allowed_default +django.db.models.When.allowed_default +django.db.models.constraints.BaseConstraint.__init__ +django.db.models.constraints.BaseConstraint.violation_error_code +django.db.models.constraints.CheckConstraint.__init__ +django.db.models.expressions.BaseExpression.allowed_default +django.db.models.expressions.Case.allowed_default +django.db.models.expressions.CombinedExpression.allowed_default +django.db.models.expressions.DatabaseDefault +django.db.models.expressions.ExpressionWrapper.allowed_default +django.db.models.expressions.F.allowed_default +django.db.models.expressions.Func.allowed_default +django.db.models.expressions.OrderByList.allowed_default +django.db.models.expressions.RawSQL.allowed_default +django.db.models.expressions.Value.allowed_default +django.db.models.expressions.When.allowed_default +django.db.models.fields.Field.__init__ +django.db.models.fields.Field._get_flatchoices +django.db.models.fields.Field.generated +django.db.models.fields.generated +django.db.models.fields.related.ForeignKey.cast_db_type +django.db.models.fields.related.ForeignObject.get_joining_fields +django.db.models.fields.related.ForeignObject.get_reverse_joining_fields +django.db.models.fields.related.ForeignObjectRel.get_joining_fields +django.db.models.fields.related.ForwardManyToOneDescriptor.get_prefetch_querysets +django.db.models.fields.related.ReverseOneToOneDescriptor.get_prefetch_querysets +django.db.models.fields.related_descriptors.ForwardManyToOneDescriptor.get_prefetch_querysets +django.db.models.fields.related_descriptors.ReverseOneToOneDescriptor.get_prefetch_querysets +django.db.models.fields.reverse_related.ForeignObjectRel.get_joining_fields +django.db.models.functions.Collate.allowed_default +django.db.models.functions.Now.as_oracle +django.db.models.functions.comparison.Collate.allowed_default +django.db.models.functions.datetime.Now.as_oracle +django.db.models.lookups.IntegerFieldExact +django.db.models.lookups.IntegerFieldOverflow +django.db.models.lookups.IntegerGreaterThan +django.db.models.lookups.IntegerGreaterThanOrEqual.underflow_exception +django.db.models.lookups.IntegerLessThan.overflow_exception +django.db.models.lookups.IntegerLessThanOrEqual +django.db.models.lookups.Lookup.allowed_default +django.db.models.query.Prefetch.get_current_querysets +django.db.models.query.QuerySet.aupdate_or_create +django.db.models.query.QuerySet.update_or_create +django.db.models.query.aprefetch_related_objects +django.db.models.query_utils.FilteredRelation.relabeled_clone +django.db.models.query_utils.FilteredRelation.resolve_expression +django.db.models.query_utils.Q.identity +django.db.models.sql.Query.build_filtered_relation_q +django.db.models.sql.Query.join +django.db.models.sql.Query.resolve_lookup_value +django.db.models.sql.Query.setup_joins +django.db.models.sql.query.Query.build_filtered_relation_q +django.db.models.sql.query.Query.join +django.db.models.sql.query.Query.resolve_lookup_value +django.db.models.sql.query.Query.setup_joins +django.dispatch.Signal.asend +django.dispatch.Signal.asend_robust +django.dispatch.dispatcher.Signal.asend +django.dispatch.dispatcher.Signal.asend_robust +django.forms.BaseForm._html_output +django.forms.BaseModelFormSet.save_existing +django.forms.BoundField.get_context +django.forms.BoundField.template_name +django.forms.ClearableFileInput.checked +django.forms.Field.__init__ +django.forms.URLField.__init__ +django.forms.boundfield.BoundField.get_context +django.forms.boundfield.BoundField.template_name +django.forms.fields.CallableChoiceIterator +django.forms.fields.Field.__init__ +django.forms.fields.URLField.__init__ +django.forms.fields_for_model +django.forms.forms.BaseForm._html_output +django.forms.models.BaseModelFormSet.save_existing +django.forms.models.fields_for_model +django.forms.renderers.BaseRenderer.field_template_name +django.forms.renderers.Jinja2DivFormRenderer.__init__ +django.forms.utils.RenderableFieldMixin +django.forms.widgets.ClearableFileInput.checked +django.shortcuts.aget_list_or_404 +django.shortcuts.aget_object_or_404 +django.template.Template.__iter__ +django.template.autoreload +django.template.base.Template.__iter__ +django.template.defaultfilters.escapeseq +django.test.AsyncClient.delete +django.test.AsyncClient.get +django.test.AsyncClient.head +django.test.AsyncClient.options +django.test.AsyncClient.patch +django.test.AsyncClient.post +django.test.AsyncClient.put +django.test.AsyncClient.trace +django.test.client.AsyncClient.delete +django.test.client.AsyncClient.get +django.test.client.AsyncClient.head +django.test.client.AsyncClient.options +django.test.client.AsyncClient.patch +django.test.client.AsyncClient.post +django.test.client.AsyncClient.put +django.test.client.AsyncClient.trace +django.test.client.ClientMixin.aforce_login +django.test.client.ClientMixin.alogin +django.test.client.ClientMixin.alogout +django.test.client.ClientMixin.asession +django.test.runner.DiscoverRunner.__init__ +django.test.runner.DiscoverRunner.run_tests +django.test.runner.RemoteTestResult.addDuration +django.utils.baseconv +django.utils.choices +django.utils.datetime_safe +django.utils.deprecation.RemovedInDjango50Warning +django.utils.deprecation.RemovedInDjango60Warning +django.utils.html.VOID_ELEMENTS +django.utils.text.Truncator.add_truncation_text +django.utils.text.add_truncation_text +django.utils.timezone.make_aware +django.utils.timezone.utc +django.utils.topological_sort +django.views.csrf.CSRF_FAILURE_TEMPLATE +django.views.csrf.builtin_template_path +django.views.decorators.debug.coroutine_functions_to_sensitive_variables +django.views.generic.edit.BaseDeleteView.__init__ +django.views.generic.edit.DeleteViewCustomDeleteWarning +django.views.i18n.builtin_template_path +django.views.i18n.js_catalog_template +django.views.static.DEFAULT_DIRECTORY_INDEX_TEMPLATE +django.views.static.builtin_template_path diff --git a/setup.py b/setup.py index 15a8961c1..612a11de7 100644 --- a/setup.py +++ b/setup.py @@ -22,7 +22,7 @@ def find_stub_files(name: str) -> List[str]: dependencies = [ "django", - "django-stubs-ext>=4.2.7", + "django-stubs-ext>=5.0.0.dev1", "tomli; python_version < '3.11'", # Types: "typing-extensions", @@ -37,7 +37,7 @@ def find_stub_files(name: str) -> List[str]: setup( name="django-stubs", - version="4.2.7", + version="5.0.0.dev1", description="Mypy stubs for Django", long_description=readme, long_description_content_type="text/markdown", @@ -70,6 +70,7 @@ def find_stub_files(name: str) -> List[str]: "Framework :: Django :: 3.2", "Framework :: Django :: 4.1", "Framework :: Django :: 4.2", + "Framework :: Django :: 5.0", ], project_urls={ "Release notes": "https://github.com/typeddjango/django-stubs/releases", From 66b933ce9d503b43e2984cb24988a3b206f1470c Mon Sep 17 00:00:00 2001 From: Marti Raudsepp Date: Wed, 6 Dec 2023 17:17:53 +0200 Subject: [PATCH 2/4] Fix CI by removing Python 3.8, 3.9 from incompatible jobs --- .github/workflows/test.yml | 8 +++++--- pyproject.toml | 2 +- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 307e1fe74..5479f46c2 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -20,7 +20,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - python-version: ['3.8', '3.9', '3.10', '3.11', '3.12'] + python-version: ['3.10', '3.11', '3.12'] fail-fast: false steps: - uses: actions/checkout@v4 @@ -48,7 +48,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - python-version: ['3.8', '3.9', '3.10', '3.11', '3.12'] + python-version: ['3.10', '3.11', '3.12'] shard: [0, 1, 2, 3] fail-fast: false steps: @@ -101,9 +101,11 @@ jobs: strategy: fail-fast: false matrix: - python-version: ['3.8', '3.9', '3.10', '3.11'] + python-version: ['3.10', '3.11'] django-version: ['3.2', '4.2', '5.0'] include: + - python-version: ['3.8', '3.9'] + django-version: ['3.2', '4.2'] - python-version: '3.12' django-version: '4.1' steps: diff --git a/pyproject.toml b/pyproject.toml index dbb28d548..6f71291aa 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ line-length = 120 include = '\.pyi?$' [tool.codespell] -ignore-words-list = "aadd,acount,nam" +ignore-words-list = "aadd,acount,nam,asend" [tool.ruff] # Adds to default excludes: https://ruff.rs/docs/settings/#exclude From a22aa15af4929df422be7cdae8b04c471e4e0a25 Mon Sep 17 00:00:00 2001 From: Marti Raudsepp Date: Wed, 6 Dec 2023 17:20:40 +0200 Subject: [PATCH 3/4] Try fixing matrix-test again --- .github/workflows/test.yml | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 5479f46c2..2a2f26ccc 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -104,8 +104,14 @@ jobs: python-version: ['3.10', '3.11'] django-version: ['3.2', '4.2', '5.0'] include: - - python-version: ['3.8', '3.9'] - django-version: ['3.2', '4.2'] + - python-version: '3.8' + django-version: '3.2' + - python-version: '3.8' + django-version: '4.2' + - python-version: '3.9' + django-version: '3.2' + - python-version: '3.9' + django-version: '4.2' - python-version: '3.12' django-version: '4.1' steps: From e794a37ef0cb83ee34d314268cf8f1ca5be287dd Mon Sep 17 00:00:00 2001 From: Marti Raudsepp Date: Wed, 6 Dec 2023 17:28:08 +0200 Subject: [PATCH 4/4] Maybe this hack works.... --- .github/workflows/test.yml | 4 ++-- requirements.txt | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 2a2f26ccc..946966dc9 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -20,7 +20,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - python-version: ['3.10', '3.11', '3.12'] + python-version: ['3.8', '3.9', '3.10', '3.11', '3.12'] fail-fast: false steps: - uses: actions/checkout@v4 @@ -48,7 +48,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - python-version: ['3.10', '3.11', '3.12'] + python-version: ['3.8', '3.9', '3.10', '3.11', '3.12'] shard: [0, 1, 2, 3] fail-fast: false steps: diff --git a/requirements.txt b/requirements.txt index 3e6a837be..683fb9c70 100644 --- a/requirements.txt +++ b/requirements.txt @@ -7,7 +7,8 @@ pytest-shard==0.1.2 # Django deps: psycopg2-binary -Django==5.0.0 +Django==4.2.7; python_version < '3.10' +Django==5.0.0; python_version >= '3.10' -e ./ext -e .[compatible-mypy]