Skip to content

Commit 4c3117e

Browse files
committed
consider a function-layer in the ORM that returns "Any"
all ORM functions that are used in declarative are now made separate from the classes they refer towards in all cases and indicate the return type of Any so they can be used inline with Mapped[_T] in declarative mappings such that IDEs can deliver Mapped[] behavior without any linter errors. this will require changes in the mypy plugin as we can no longer rely on simple things like "composite()" returning CompositeProperty. References: https://gerrit.sqlalchemy.org/c/sqlalchemy/sqlalchemy/+/3074 Fixes: #170
1 parent 54b56f3 commit 4c3117e

File tree

2 files changed

+142
-10
lines changed

2 files changed

+142
-10
lines changed

sqlalchemy-stubs/orm/__init__.pyi

+140-10
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,15 @@
1+
from typing import AbstractSet
12
from typing import Any
3+
from typing import Callable
4+
from typing import Literal
25
from typing import Mapping
6+
from typing import MutableMapping
37
from typing import Optional
8+
from typing import overload
9+
from typing import Sequence
410
from typing import Tuple
11+
from typing import Type
12+
from typing import Union
513

614
from . import exc as exc
715
from . import mapper as mapperlib # noqa
@@ -46,6 +54,7 @@ from .properties import ColumnProperty as ColumnProperty
4654
from .query import AliasOption as AliasOption
4755
from .query import FromStatement as FromStatement
4856
from .query import Query as Query
57+
from .relationships import _OrderByArgument
4958
from .relationships import foreign as foreign
5059
from .relationships import RelationshipProperty as RelationshipProperty
5160
from .relationships import remote as remote
@@ -73,27 +82,148 @@ from .util import polymorphic_union as polymorphic_union
7382
from .util import was_deleted as was_deleted
7483
from .util import with_parent as with_parent
7584
from .util import with_polymorphic as with_polymorphic
85+
from ..sql import schema
86+
from ..sql.schema import _ServerDefaultType
87+
from ..sql.schema import FetchedValue
88+
from ..sql.schema import SchemaEventTarget
7689

7790
def create_session(bind: Optional[Any] = ..., **kwargs: Any) -> Session: ...
7891

7992
with_loader_criteria = LoaderCriteriaOption
80-
relationship = RelationshipProperty
81-
82-
def relation(*arg: Any, **kw: Any) -> RelationshipProperty[Any]: ...
83-
def dynamic_loader(argument: Any, **kw: Any) -> RelationshipProperty[Any]: ...
84-
85-
column_property = ColumnProperty
86-
composite = CompositeProperty
8793

8894
_BackrefResult = Tuple[str, Mapping[str, Any]]
8995

96+
def relationship(
97+
argument: Any,
98+
secondary: Optional[Any] = ...,
99+
primaryjoin: Optional[Any] = ...,
100+
secondaryjoin: Optional[Any] = ...,
101+
foreign_keys: Optional[Any] = ...,
102+
uselist: Optional[bool] = ...,
103+
order_by: _OrderByArgument = ...,
104+
backref: Union[str, _BackrefResult] = ...,
105+
back_populates: str = ...,
106+
overlaps: Union[AbstractSet[str], str] = ...,
107+
post_update: bool = ...,
108+
cascade: Union[Literal[False], Sequence[str]] = ...,
109+
viewonly: bool = ...,
110+
lazy: str = ...,
111+
collection_class: Optional[Union[Type[Any], Callable[[], Any]]] = ...,
112+
passive_deletes: Union[bool, Literal["all"]] = ...,
113+
passive_updates: bool = ...,
114+
remote_side: Optional[Any] = ...,
115+
enable_typechecks: bool = ..., # NOTE: not documented
116+
join_depth: Optional[int] = ...,
117+
comparator_factory: Optional[Any] = ...,
118+
single_parent: bool = ...,
119+
innerjoin: Union[bool, str] = ...,
120+
distinct_target_key: Optional[bool] = ...,
121+
doc: Optional[str] = ...,
122+
active_history: bool = ...,
123+
cascade_backrefs: bool = ...,
124+
load_on_pending: bool = ...,
125+
bake_queries: bool = ...,
126+
_local_remote_pairs: Optional[Any] = ...,
127+
query_class: Optional[Any] = ...,
128+
info: Optional[MutableMapping[Any, Any]] = ...,
129+
omit_join: Optional[Literal[False]] = ...,
130+
sync_backref: Optional[Any] = ...,
131+
) -> Any: ...
132+
def relation(*arg: Any, **kw: Any) -> Any: ...
133+
def dynamic_loader(argument: Any, **kw: Any) -> Any: ...
134+
def column_property(*arg: Any, **kw: Any) -> Any: ...
135+
def composite(*arg: Any, **kw: Any) -> Any: ...
136+
@overload
137+
def mapped_column(
138+
__name: str,
139+
*args: SchemaEventTarget,
140+
autoincrement: Union[bool, Literal["auto", "ignore_fk"]] = ...,
141+
default: Optional[Any] = ...,
142+
doc: Optional[str] = ...,
143+
key: Optional[str] = ...,
144+
index: Optional[bool] = ...,
145+
info: MutableMapping[Any, Any] = ...,
146+
nullable: bool = ...,
147+
onupdate: Optional[Any] = ...,
148+
primary_key: bool = ...,
149+
server_default: Optional[_ServerDefaultType[Any]] = ...,
150+
server_onupdate: Optional[FetchedValue] = ...,
151+
quote: Optional[bool] = ...,
152+
unique: Optional[bool] = ...,
153+
system: bool = ...,
154+
comment: Optional[str] = ...,
155+
**kwargs: Any,
156+
) -> Any: ...
157+
@overload
158+
def mapped_column(
159+
*args: SchemaEventTarget,
160+
autoincrement: Union[bool, Literal["auto", "ignore_fk"]] = ...,
161+
default: Optional[Any] = ...,
162+
doc: Optional[str] = ...,
163+
key: Optional[str] = ...,
164+
index: Optional[bool] = ...,
165+
info: MutableMapping[Any, Any] = ...,
166+
nullable: bool = ...,
167+
onupdate: Optional[Any] = ...,
168+
primary_key: bool = ...,
169+
server_default: Optional[_ServerDefaultType[Any]] = ...,
170+
server_onupdate: Optional[FetchedValue] = ...,
171+
quote: Optional[bool] = ...,
172+
unique: Optional[bool] = ...,
173+
system: bool = ...,
174+
comment: Optional[str] = ...,
175+
**kwargs: Any,
176+
) -> Any: ...
177+
@overload
178+
def mapped_column(
179+
__name: str,
180+
__type: Union[schema._TE, Type[schema._TE]],
181+
*args: SchemaEventTarget,
182+
autoincrement: Union[bool, Literal["auto", "ignore_fk"]] = ...,
183+
default: Optional[Any] = ...,
184+
doc: Optional[str] = ...,
185+
key: Optional[str] = ...,
186+
index: Optional[bool] = ...,
187+
info: MutableMapping[Any, Any] = ...,
188+
nullable: bool = ...,
189+
onupdate: Optional[Any] = ...,
190+
primary_key: bool = ...,
191+
server_default: Optional[_ServerDefaultType[schema._TE]] = ...,
192+
server_onupdate: Optional[FetchedValue] = ...,
193+
quote: Optional[bool] = ...,
194+
unique: Optional[bool] = ...,
195+
system: bool = ...,
196+
comment: Optional[str] = ...,
197+
**kwargs: Any,
198+
) -> Any: ...
199+
@overload
200+
def mapped_column(
201+
__type: Union[schema._TE, Type[schema._TE]],
202+
*args: SchemaEventTarget,
203+
autoincrement: Union[bool, Literal["auto", "ignore_fk"]] = ...,
204+
default: Optional[Any] = ...,
205+
doc: Optional[str] = ...,
206+
key: Optional[str] = ...,
207+
index: Optional[bool] = ...,
208+
info: MutableMapping[Any, Any] = ...,
209+
nullable: bool = ...,
210+
onupdate: Optional[Any] = ...,
211+
primary_key: bool = ...,
212+
server_default: Optional[_ServerDefaultType[schema._TE]] = ...,
213+
server_onupdate: Optional[FetchedValue] = ...,
214+
quote: Optional[bool] = ...,
215+
unique: Optional[bool] = ...,
216+
system: bool = ...,
217+
comment: Optional[str] = ...,
218+
**kwargs: Any,
219+
) -> Any: ...
90220
def backref(name: str, **kwargs: Any) -> _BackrefResult: ...
91-
def deferred(*columns: Any, **kw: Any) -> ColumnProperty: ...
92-
def query_expression(default_expr: Any = ...) -> ColumnProperty: ...
221+
def deferred(*columns: Any, **kw: Any) -> Any: ...
222+
def query_expression(default_expr: Any = ...) -> Any: ...
93223

94224
mapper = Mapper
95-
synonym = SynonymProperty
96225

226+
def synonym(*arg, **kw) -> Any: ...
97227
def clear_mappers() -> None: ...
98228

99229
joinedload = strategy_options.joinedload._unbound_fn

sqlalchemy-stubs/sql/schema.pyi

+2
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,8 @@ _ID = TypeVar("_ID", bound=Identity)
5656

5757
_ServerDefaultType = Union[FetchedValue, str, TextClause, ColumnElement[_T]]
5858

59+
_T = TypeVar("_T", bound=type_api.TypeEngine)
60+
5961
class SchemaItem(SchemaEventTarget, visitors.Visitable):
6062
__visit_name__: str = ...
6163
create_drop_stringify_dialect: str = ...

0 commit comments

Comments
 (0)