diff --git a/odoo-stubs/api.pyi b/odoo-stubs/api.pyi index 12fa52a..8b2ea26 100644 --- a/odoo-stubs/api.pyi +++ b/odoo-stubs/api.pyi @@ -23,18 +23,18 @@ class Params: class Meta(type): def __new__(meta, name: str, bases: tuple, attrs: dict): ... -def attrsetter(attr, value) -> Callable: ... +def attrsetter(attr, value) -> Callable[[_T], _T]: ... def propagate(method1: Callable, method2: _CallableT) -> _CallableT: ... -def constrains(*args: str) -> Callable: ... -def ondelete(*, at_uninstall: bool) -> Callable: ... -def onchange(*args: str) -> Callable: ... -def depends(*args: Union[str, Callable]) -> Callable: ... -def depends_context(*args: str) -> Callable: ... -def returns(model: str | None, downgrade: Callable | None = ..., upgrade: Callable | None = ...) -> Callable: ... +def constrains(*args: str) -> Callable[[_T], _T]: ... +def ondelete(*, at_uninstall: bool) -> Callable[[_T], _T]: ... +def onchange(*args: str) -> Callable[[_T], _T]: ... +def depends(*args: Union[str, Callable]) -> Callable[[_T], _T]: ... +def depends_context(*args: str) -> Callable[[_T], _T]: ... +def returns(model: str | None, downgrade: Callable | None = ..., upgrade: Callable | None = ...) -> Callable[[_T], _T]: ... def downgrade(method: Callable, value, self, args, kwargs): ... def split_context(method: Callable, args, kwargs) -> tuple: ... -def autovacuum(method: Callable) -> Callable: ... -def model(method: Callable) -> Callable: ... +def autovacuum(method: _CallableT) -> _CallableT: ... +def model(method: _CallableT) -> _CallableT: ... def _model_create_single(create: Callable[..., _ModelT], self: _ModelT, arg) -> _ModelT: ... def model_create_single(method: _CallableT) -> _CallableT: ... diff --git a/odoo-stubs/sql_db.pyi b/odoo-stubs/sql_db.pyi index d39572d..4702918 100644 --- a/odoo-stubs/sql_db.pyi +++ b/odoo-stubs/sql_db.pyi @@ -4,6 +4,7 @@ from threading import Lock, RLock from typing import Any, Callable, Iterable, Iterator, Literal, NoReturn, Sequence, TypeVar import psycopg2.extensions +from decorator import decorator from .api import Transaction from .tools import Callbacks @@ -21,6 +22,7 @@ re_from: Pattern re_into: Pattern sql_counter: int +@decorator def check(f: Callable[..., _T], self: Cursor, *args, **kwargs) -> _T: ... class BaseCursor: @@ -94,7 +96,7 @@ class TestCursor(BaseCursor): class PsycoConnection(psycopg2.extensions.connection): ... class ConnectionPool: - def locked(fun: Callable) -> Callable: ... + def locked(fun: Callable[..., _T]) -> Callable[..., _T]: ... _connections: list[tuple[psycopg2.extensions.connection, bool]] _maxconn: int _lock: Lock diff --git a/odoo-stubs/tools/cache.pyi b/odoo-stubs/tools/cache.pyi index b405cd0..55b9495 100644 --- a/odoo-stubs/tools/cache.pyi +++ b/odoo-stubs/tools/cache.pyi @@ -1,9 +1,12 @@ from collections import defaultdict -from typing import Any, Callable +from typing import Any, Callable, TypeVar from .lru import LRU from ..models import BaseModel +_T = TypeVar('_T') +_CallableT = TypeVar('_CallableT') + unsafe_eval = eval class ormcache_counter: @@ -21,7 +24,7 @@ class ormcache: skiparg: Any def __init__(self, *args, **kwargs) -> None: ... method: Callable - def __call__(self, method: Callable): ... + def __call__(self, method: _CallableT) -> _CallableT: ... key: Any def determine_key(self): ... def lru(self, model: BaseModel) -> tuple[LRU, tuple[str, Callable], ormcache_counter]: ... diff --git a/odoo-stubs/tools/func.pyi b/odoo-stubs/tools/func.pyi index 5c1c0be..b59c017 100644 --- a/odoo-stubs/tools/func.pyi +++ b/odoo-stubs/tools/func.pyi @@ -1,27 +1,29 @@ from json import JSONEncoder as JSONEncoder -from typing import Any, Callable +from typing import Callable, Generic, TypeVar -class lazy_property: - fget: Any - def __init__(self, fget) -> None: ... - def __get__(self, obj, cls): ... +_T = TypeVar('_T') + +class lazy_property(Generic[_T]): + fget: Callable[..., _T] + def __init__(self, fget: Callable[..., _T]) -> None: ... + def __get__(self, obj, cls) -> _T: ... @property def __doc__(self): ... @staticmethod def reset_all(obj) -> None: ... -class lazy_classproperty(lazy_property): - def __get__(self, obj, cls): ... +class lazy_classproperty(lazy_property[_T]): + def __get__(self, obj, cls) -> _T: ... def conditional(condition, decorator): ... def synchronized(lock_attr: str = ...): ... def frame_codeinfo(fframe, back: int = ...): ... -def compose(a: Callable, b: Callable): ... +def compose(a: Callable[..., _T], b: Callable) -> Callable[..., _T]: ... -class _ClassProperty(property): - def __get__(self, cls, owner): ... +class _ClassProperty(property, Generic[_T]): + def __get__(self, cls, owner) -> _T: ... -def classproperty(func): ... +def classproperty(func: Callable[..., _T]) -> _ClassProperty[_T]: ... class lazy: __slots__ = ['_func', '_args', '_kwargs', '_cached_value'] diff --git a/odoo-stubs/tools/misc.pyi b/odoo-stubs/tools/misc.pyi index ed9d08d..55a440c 100644 --- a/odoo-stubs/tools/misc.pyi +++ b/odoo-stubs/tools/misc.pyi @@ -1,7 +1,9 @@ +import datetime import pickle as pickle_ from collections import deque from collections.abc import Mapping, MutableMapping, MutableSet from logging import Filter, LogRecord +from types import ModuleType from typing import Any, Collection, Generic, IO, AnyStr, ItemsView, Iterable, Iterator, NoReturn, TypeVar, Callable import markupsafe @@ -12,6 +14,7 @@ from xlwt import Worksheet from .cache import * from .parse_version import parse_version as parse_version +from ..api import Environment from ..loglevels import exception_to_unicode as exception_to_unicode, get_encodings as get_encodings from ..sql_db import Cursor @@ -19,6 +22,7 @@ _T = TypeVar('_T') _T1 = TypeVar('_T1') _KT = TypeVar('_KT') _VT = TypeVar('_VT') +_CallableT = TypeVar('_CallableT', bound=Callable) SKIPPED_ELEMENT_TYPES: tuple NON_BREAKING_SPACE: str @@ -31,7 +35,7 @@ def exec_pg_environ() -> dict[str, str]: ... def exec_pg_command(name: str, *args) -> None: ... def exec_pg_command_pipe(name: str, *args) -> tuple[IO[AnyStr] | None, IO[AnyStr] | None]: ... def file_path(file_path: str, filter_ext: tuple[str, ...] = ...) -> str: ... -def file_open(name: str, mode: str = ..., filter_ext: tuple[str] | None = ...) -> IO: ... +def file_open(name: str, mode: str = ..., filter_ext: tuple[str, ...] | None = ...) -> IO: ... def flatten(list) -> list: ... def reverse_enumerate(l): ... def partition(pred: Callable[[_T], bool], elems: Iterable[_T]) -> tuple[list[_T], list[_T]]: ... @@ -50,12 +54,12 @@ def scan_languages() -> list[tuple[str, str]]: ... def mod10r(number: str) -> str: ... def str2bool(s: str, default: Any | None = ...) -> bool: ... def human_size(sz) -> str: ... -def logged(f: Callable) -> Callable: ... +def logged(f: _CallableT) -> _CallableT: ... class profile: fname: str | None def __init__(self, fname: str | None = ...) -> None: ... - def __call__(self, f: Callable) -> Callable: ... + def __call__(self, f: _CallableT) -> _CallableT: ... def detect_ip_addr() -> str: ... @@ -88,7 +92,7 @@ class mute_logger(Filter): def filter(self, record: LogRecord) -> int: ... def __enter__(self) -> None: ... def __exit__(self, exc_type: Any | None = ..., exc_val: Any | None = ..., exc_tb: Any | None = ...) -> None: ... - def __call__(self, func: Callable) -> Callable: ... + def __call__(self, func: _CallableT) -> _CallableT: ... _ph: Any @@ -196,33 +200,37 @@ def ignore(*exc) -> None: ... html_escape = markupsafe.escape -def get_lang(env, lang_code: str = ...): ... -def babel_locale_parse(lang_code): ... -def formatLang(env, value, digits: Any | None = ..., grouping: bool = ..., monetary: bool = ..., dp: bool = ..., currency_obj: bool = ...): ... -def format_date(env, value, lang_code: str = ..., date_format: bool = ...): ... -def parse_date(env, value, lang_code: str = ...): ... -def format_datetime(env, value, tz: str = ..., dt_format: str = ..., lang_code: str = ...): ... -def format_time(env, value, tz: str = ..., time_format: str = ..., lang_code: str = ...): ... -def _format_time_ago(env, time_delta, lang_code: str = ..., add_direction: bool = ...): ... -def format_decimalized_number(number, decimal: int = ...): ... -def format_decimalized_amount(amount, currency: Any | None = ...): ... -def format_amount(env, amount, currency, lang_code: str = ...): ... -def format_duration(value): ... -def _consteq(str1, str2): ... +def get_lang(env: Environment, lang_code: str = ...) -> 'odoo.model.res_lang': ... +def babel_locale_parse(lang_code: str) -> Locale: ... +def formatLang(env: Environment, value, digits: int | None = ..., grouping: bool = ..., monetary: bool = ..., + dp: bool = ..., currency_obj: 'odoo.model.res_currency' = ...) -> str: ... +def format_date(env: Environment, value: datetime.date | datetime.datetime | str, lang_code: str = ..., + date_format: str = ...) -> str: ... +def parse_date(env: Environment, value: str, lang_code: str = ...) -> datetime.date: ... +def format_datetime(env: Environment, value: str | datetime.datetime, tz: str = ..., + dt_format: str = ..., lang_code: str = ...) -> str: ... +def format_time(env: Environment, value, tz: str = ..., time_format: str = ..., lang_code: str = ...) -> str: ... +def _format_time_ago(env: Environment, time_delta: datetime.timedelta | int, lang_code: str = ..., + add_direction: bool = ...) -> str: ... +def format_decimalized_number(number: float, decimal: int = ...) -> str: ... +def format_decimalized_amount(amount: float, currency: 'odoo.model.res_currency | None' = ...) -> str: ... +def format_amount(env: Environment, amount: float, currency: 'odoo.model.res_currency', lang_code: str = ...) -> str: ... +def format_duration(value: float) -> str: ... +def _consteq(str1: str, str2: str) -> bool: ... -consteq: Any +consteq: Callable[[str, str], bool] class Unpickler(pickle_.Unpickler): find_global: Any find_class: Any -def _pickle_load(stream, encoding: str = ..., errors: bool = ...): ... +def _pickle_load(stream: pickle_._ReadableFileobj, encoding: str = ..., errors: bool = ...): ... -pickle: Any +pickle: ModuleType class DotDict(dict): def __getattr__(self, attrib): ... -def get_diff(data_from, data_to, custom_style: bool = ...): ... -def traverse_containers(val, type_) -> None: ... -def hmac(env, scope, message, hash_function=...): ... +def get_diff(data_from: tuple[str, str], data_to: tuple[str, str], custom_style: bool = ...) -> str: ... +def traverse_containers(val, type_) -> Iterator: ... +def hmac(env: Environment, scope, message, hash_function = ...) -> str: ...