]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commit
establish mypy / typing approach for v2.0
authorMike Bayer <mike_mp@zzzcomputing.com>
Mon, 24 Jan 2022 22:04:27 +0000 (17:04 -0500)
committerMike Bayer <mike_mp@zzzcomputing.com>
Sun, 13 Feb 2022 19:23:04 +0000 (14:23 -0500)
commite545298e35ea9f126054b337e4b5ba01988b29f7
treee64aea159111d5921ff01f08b1c4efb667249dfe
parentf1da1623b800cd4de3b71fd1b2ad5ccfde286780
establish mypy / typing approach for v2.0

large patch to get ORM / typing efforts started.
this is to support adding new test cases to mypy,
support dropping sqlalchemy2-stubs entirely from the
test suite, validate major ORM typing reorganization
to eliminate the need for the mypy plugin.

* New declarative approach which uses annotation
  introspection, fixes: #7535
* Mapped[] is now at the base of all ORM constructs
  that find themselves in classes, to support direct
  typing without plugins
* Mypy plugin updated for new typing structures
* Mypy test suite broken out into "plugin" tests vs.
  "plain" tests, and enhanced to better support test
  structures where we assert that various objects are
  introspected by the type checker as we expect.
  as we go forward with typing, we will
  add new use cases to "plain" where we can assert that
  types are introspected as we expect.
* For typing support, users will be much more exposed to the
  class names of things.  Add these all to "sqlalchemy" import
  space.
* Column(ForeignKey()) no longer needs to be `@declared_attr`
  if the FK refers to a remote table
* composite() attributes mapped to a dataclass no longer
  need to implement a `__composite_values__()` method
* with_variant() accepts multiple dialect names

Change-Id: I22797c0be73a8fbbd2d6f5e0c0b7258b17fe145d
Fixes: #7535
Fixes: #7551
References: #6810
149 files changed:
doc/build/changelog/migration_20.rst
doc/build/changelog/unreleased_20/6980.rst
doc/build/changelog/unreleased_20/composite_dataclass.rst [new file with mode: 0644]
doc/build/changelog/unreleased_20/decl_fks.rst [new file with mode: 0644]
doc/build/changelog/unreleased_20/prop_name.rst [new file with mode: 0644]
doc/build/core/selectable.rst
doc/build/orm/composites.rst
doc/build/orm/declarative_mixins.rst
doc/build/orm/internals.rst
doc/build/orm/loading_relationships.rst
doc/build/orm/relationship_api.rst
lib/sqlalchemy/__init__.py
lib/sqlalchemy/engine/__init__.py
lib/sqlalchemy/engine/create.py
lib/sqlalchemy/engine/reflection.py
lib/sqlalchemy/ext/associationproxy.py
lib/sqlalchemy/ext/declarative/extensions.py
lib/sqlalchemy/ext/mypy/apply.py
lib/sqlalchemy/ext/mypy/decl_class.py
lib/sqlalchemy/ext/mypy/infer.py
lib/sqlalchemy/ext/mypy/names.py
lib/sqlalchemy/ext/mypy/plugin.py
lib/sqlalchemy/ext/mypy/util.py
lib/sqlalchemy/ext/orderinglist.py
lib/sqlalchemy/log.py
lib/sqlalchemy/orm/__init__.py
lib/sqlalchemy/orm/_orm_constructors.py
lib/sqlalchemy/orm/attributes.py
lib/sqlalchemy/orm/base.py
lib/sqlalchemy/orm/clsregistry.py
lib/sqlalchemy/orm/collections.py
lib/sqlalchemy/orm/context.py
lib/sqlalchemy/orm/decl_api.py
lib/sqlalchemy/orm/decl_base.py
lib/sqlalchemy/orm/descriptor_props.py
lib/sqlalchemy/orm/dynamic.py
lib/sqlalchemy/orm/interfaces.py
lib/sqlalchemy/orm/mapped_collection.py [new file with mode: 0644]
lib/sqlalchemy/orm/mapper.py
lib/sqlalchemy/orm/properties.py
lib/sqlalchemy/orm/query.py
lib/sqlalchemy/orm/relationships.py
lib/sqlalchemy/orm/session.py
lib/sqlalchemy/orm/strategies.py
lib/sqlalchemy/orm/strategy_options.py
lib/sqlalchemy/orm/util.py
lib/sqlalchemy/pool/__init__.py
lib/sqlalchemy/schema.py
lib/sqlalchemy/sql/__init__.py
lib/sqlalchemy/sql/_selectable_constructors.py
lib/sqlalchemy/sql/_typing.py
lib/sqlalchemy/sql/base.py
lib/sqlalchemy/sql/compiler.py
lib/sqlalchemy/sql/ddl.py
lib/sqlalchemy/sql/expression.py
lib/sqlalchemy/sql/naming.py
lib/sqlalchemy/sql/roles.py
lib/sqlalchemy/sql/schema.py
lib/sqlalchemy/sql/selectable.py
lib/sqlalchemy/sql/type_api.py
lib/sqlalchemy/testing/config.py
lib/sqlalchemy/testing/fixtures.py
lib/sqlalchemy/testing/plugin/plugin_base.py
lib/sqlalchemy/testing/requirements.py
lib/sqlalchemy/util/__init__.py
lib/sqlalchemy/util/_collections.py
lib/sqlalchemy/util/compat.py
lib/sqlalchemy/util/concurrency.py
lib/sqlalchemy/util/deprecations.py
lib/sqlalchemy/util/langhelpers.py
lib/sqlalchemy/util/typing.py
mypy_plugin.ini [new file with mode: 0644]
pyproject.toml
setup.cfg
test/base/test_concurrency_py3k.py
test/base/test_utils.py
test/dialect/postgresql/test_dialect.py
test/ext/declarative/test_inheritance.py
test/ext/mypy/inspection_inspect.py [moved from test/ext/mypy/files/inspect.py with 100% similarity]
test/ext/mypy/plain_files/engine_inspection.py [new file with mode: 0644]
test/ext/mypy/plain_files/experimental_relationship.py [new file with mode: 0644]
test/ext/mypy/plain_files/mapped_column.py [new file with mode: 0644]
test/ext/mypy/plain_files/trad_relationship_uselist.py [new file with mode: 0644]
test/ext/mypy/plain_files/traditional_relationship.py [new file with mode: 0644]
test/ext/mypy/plugin_files/abstract_one.py [moved from test/ext/mypy/files/abstract_one.py with 100% similarity]
test/ext/mypy/plugin_files/as_declarative.py [moved from test/ext/mypy/files/as_declarative.py with 100% similarity]
test/ext/mypy/plugin_files/as_declarative_base.py [moved from test/ext/mypy/files/as_declarative_base.py with 100% similarity]
test/ext/mypy/plugin_files/boolean_col.py [moved from test/ext/mypy/files/boolean_col.py with 100% similarity]
test/ext/mypy/plugin_files/cols_noninferred_plain_nonopt.py [moved from test/ext/mypy/files/cols_noninferred_plain_nonopt.py with 100% similarity]
test/ext/mypy/plugin_files/cols_notype_on_fk_col.py [moved from test/ext/mypy/files/cols_notype_on_fk_col.py with 100% similarity]
test/ext/mypy/plugin_files/complete_orm_no_plugin.py [moved from test/ext/mypy/files/complete_orm_no_plugin.py with 100% similarity]
test/ext/mypy/plugin_files/composite_props.py [moved from test/ext/mypy/files/composite_props.py with 95% similarity]
test/ext/mypy/plugin_files/constr_cols_only.py [moved from test/ext/mypy/files/constr_cols_only.py with 100% similarity]
test/ext/mypy/plugin_files/dataclasses_workaround.py [moved from test/ext/mypy/files/dataclasses_workaround.py with 95% similarity]
test/ext/mypy/plugin_files/decl_attrs_one.py [moved from test/ext/mypy/files/decl_attrs_one.py with 100% similarity]
test/ext/mypy/plugin_files/decl_attrs_two.py [moved from test/ext/mypy/files/decl_attrs_two.py with 100% similarity]
test/ext/mypy/plugin_files/decl_base_subclass_one.py [moved from test/ext/mypy/files/decl_base_subclass_one.py with 100% similarity]
test/ext/mypy/plugin_files/decl_base_subclass_two.py [moved from test/ext/mypy/files/decl_base_subclass_two.py with 100% similarity]
test/ext/mypy/plugin_files/declarative_base_dynamic.py [moved from test/ext/mypy/files/declarative_base_dynamic.py with 100% similarity]
test/ext/mypy/plugin_files/declarative_base_explicit.py [moved from test/ext/mypy/files/declarative_base_explicit.py with 100% similarity]
test/ext/mypy/plugin_files/ensure_descriptor_type_fully_inferred.py [moved from test/ext/mypy/files/ensure_descriptor_type_fully_inferred.py with 100% similarity]
test/ext/mypy/plugin_files/ensure_descriptor_type_noninferred.py [moved from test/ext/mypy/files/ensure_descriptor_type_noninferred.py with 100% similarity]
test/ext/mypy/plugin_files/ensure_descriptor_type_semiinferred.py [moved from test/ext/mypy/files/ensure_descriptor_type_semiinferred.py with 100% similarity]
test/ext/mypy/plugin_files/enum_col.py [moved from test/ext/mypy/files/enum_col.py with 100% similarity]
test/ext/mypy/plugin_files/imperative_table.py [moved from test/ext/mypy/files/imperative_table.py with 100% similarity]
test/ext/mypy/plugin_files/invalid_noninferred_lh_type.py [moved from test/ext/mypy/files/invalid_noninferred_lh_type.py with 100% similarity]
test/ext/mypy/plugin_files/issue_7321.py [moved from test/ext/mypy/files/issue_7321.py with 100% similarity]
test/ext/mypy/plugin_files/issue_7321_part2.py [moved from test/ext/mypy/files/issue_7321_part2.py with 100% similarity]
test/ext/mypy/plugin_files/mapped_attr_assign.py [moved from test/ext/mypy/files/mapped_attr_assign.py with 100% similarity]
test/ext/mypy/plugin_files/mixin_not_mapped.py [moved from test/ext/mypy/files/mixin_not_mapped.py with 100% similarity]
test/ext/mypy/plugin_files/mixin_one.py [moved from test/ext/mypy/files/mixin_one.py with 100% similarity]
test/ext/mypy/plugin_files/mixin_three.py [moved from test/ext/mypy/files/mixin_three.py with 100% similarity]
test/ext/mypy/plugin_files/mixin_two.py [moved from test/ext/mypy/files/mixin_two.py with 95% similarity]
test/ext/mypy/plugin_files/mixin_w_tablename.py [moved from test/ext/mypy/files/mixin_w_tablename.py with 100% similarity]
test/ext/mypy/plugin_files/orderinglist1.py [moved from test/ext/mypy/files/orderinglist1.py with 100% similarity]
test/ext/mypy/plugin_files/orderinglist2.py [moved from test/ext/mypy/files/orderinglist2.py with 100% similarity]
test/ext/mypy/plugin_files/other_mapper_props.py [moved from test/ext/mypy/files/other_mapper_props.py with 100% similarity]
test/ext/mypy/plugin_files/plugin_doesnt_break_one.py [moved from test/ext/mypy/files/plugin_doesnt_break_one.py with 100% similarity]
test/ext/mypy/plugin_files/relationship_6255_one.py [moved from test/ext/mypy/files/relationship_6255_one.py with 74% similarity]
test/ext/mypy/plugin_files/relationship_6255_three.py [moved from test/ext/mypy/files/relationship_6255_three.py with 100% similarity]
test/ext/mypy/plugin_files/relationship_6255_two.py [moved from test/ext/mypy/files/relationship_6255_two.py with 100% similarity]
test/ext/mypy/plugin_files/relationship_direct_cls.py [moved from test/ext/mypy/files/relationship_direct_cls.py with 100% similarity]
test/ext/mypy/plugin_files/relationship_err1.py [moved from test/ext/mypy/files/relationship_err1.py with 91% similarity]
test/ext/mypy/plugin_files/relationship_err2.py [moved from test/ext/mypy/files/relationship_err2.py with 100% similarity]
test/ext/mypy/plugin_files/relationship_err3.py [moved from test/ext/mypy/files/relationship_err3.py with 100% similarity]
test/ext/mypy/plugin_files/sa_module_prefix.py [moved from test/ext/mypy/files/sa_module_prefix.py with 100% similarity]
test/ext/mypy/plugin_files/t_6950.py [moved from test/ext/mypy/files/t_6950.py with 100% similarity]
test/ext/mypy/plugin_files/type_decorator.py [moved from test/ext/mypy/files/type_decorator.py with 100% similarity]
test/ext/mypy/plugin_files/typeless_fk_col_cant_infer.py [moved from test/ext/mypy/files/typeless_fk_col_cant_infer.py with 100% similarity]
test/ext/mypy/plugin_files/typing_err1.py [moved from test/ext/mypy/files/typing_err1.py with 100% similarity]
test/ext/mypy/plugin_files/typing_err2.py [moved from test/ext/mypy/files/typing_err2.py with 88% similarity]
test/ext/mypy/plugin_files/typing_err3.py [moved from test/ext/mypy/files/typing_err3.py with 93% similarity]
test/ext/mypy/test_mypy_plugin_py3k.py
test/ext/test_serializer.py
test/orm/declarative/__init__.py [new file with mode: 0644]
test/orm/declarative/test_basic.py
test/orm/declarative/test_mixin.py
test/orm/declarative/test_tm_future_annotations.py [new file with mode: 0644]
test/orm/declarative/test_typed_mapping.py [new file with mode: 0644]
test/orm/declarative/test_typing_py3k.py [deleted file]
test/orm/inheritance/test_concrete.py
test/orm/inheritance/test_poly_loading.py
test/orm/test_composites.py
test/orm/test_dataclasses_py3k.py
test/orm/test_mapper.py
test/orm/test_options.py
test/orm/test_query.py
test/sql/test_metadata.py
tox.ini