diff --git a/odoo-stubs/models.pyi b/odoo-stubs/models.pyi index 3f1ca9b..7155fb8 100644 --- a/odoo-stubs/models.pyi +++ b/odoo-stubs/models.pyi @@ -316,7 +316,7 @@ class BaseModel(metaclass=MetaModel): def _has_onchange(self, field: Field, other_fields: Container[Field]) -> bool: ... def _onchange_spec(self, view_info: dict | None = ...) -> dict: ... def _onchange_eval(self, field_name: str, onchange: str, result: dict) -> None: ... - def onchange(self, values: dict[str, Any], field_name: str | list[str] | bool, field_onchange: dict[str, str]): ... + def onchange(self, values: dict[str, Any], field_name: str | list[str] | bool, field_onchange: dict[str, str]) -> dict: ... def _get_placeholder_filename(self, field: str) -> str | bool: ... def _populate_factories(self) -> list[tuple[str, Iterator]]: ... @property diff --git a/odoo-stubs/tests/common.pyi b/odoo-stubs/tests/common.pyi index 68bbcf2..23f8dc9 100644 --- a/odoo-stubs/tests/common.pyi +++ b/odoo-stubs/tests/common.pyi @@ -1,41 +1,54 @@ import collections import logging import unittest -from typing import Any +from re import Pattern + +from itertools import count +from typing import Any, Callable, Generator, Generic, Iterator, Literal, Mapping, Match, TypeVar from xmlrpc import client as xmlrpclib import requests +from lxml.etree import _Element +from websocket import WebSocket from ..api import Environment from ..http import OpenERPSession +from ..models import BaseModel from ..modules.registry import Registry from ..sql_db import BaseCursor, Cursor +from ..tools import profiler +from ..tools._vendor.sessions import Session +from ..tools.profiler import Profiler -_logger: Any -ADDONS_PATH: Any +_T = TypeVar('_T') +_CallableT = TypeVar('_CallableT', bound=Callable) +_ModelT = TypeVar('_ModelT', bound=BaseModel) +_FormT = TypeVar('_FormT', bound=Form) + +ADDONS_PATH: str HOST: str -ADMIN_USER_ID: Any +ADMIN_USER_ID: int -def get_db_name(): ... +def get_db_name() -> str: ... -standalone_tests: Any +standalone_tests: collections.defaultdict[str, list] -def standalone(*tags): ... +def standalone(*tags: str) -> Callable[[_CallableT], _CallableT]: ... -DB: Any +DB: str -def new_test_user(env, login: str = ..., groups: str = ..., context: Any | None = ..., **kwargs): ... +def new_test_user(env: Environment, login: str = ..., groups: str = ..., context: dict | None = ..., **kwargs) -> 'odoo.model.res_users': ... class RecordCapturer: - _model: Any - _domain: Any - def __init__(self, model, domain) -> None: ... - _before: Any - _after: Any - def __enter__(self): ... + _model: BaseModel + _domain: list + def __init__(self, model: BaseModel, domain: list) -> None: ... + _before: BaseModel | None + _after: BaseModel | None + def __enter__(self: _T) -> _T: ... def __exit__(self, exc_type, exc_value, exc_traceback) -> None: ... @property - def records(self): ... + def records(self) -> BaseModel: ... class OdooSuite(unittest.suite.TestSuite): def __init__(self, *args, **kwargs) -> None: ... @@ -47,10 +60,14 @@ class OdooSuite(unittest.suite.TestSuite): class MetaCase(type): def __init__(cls, name, bases, attrs) -> None: ... -def _normalize_arch_for_assert(arch_string, parser_method: str = ...): ... +def _normalize_arch_for_assert(arch_string: str, parser_method: str = ...) -> str: ... class BaseCase(unittest.TestCase, metaclass=MetaCase): - _class_cleanups: Any + _class_cleanups: list + tearDown_exceptions: list + registry: Registry + env: Environment + cr: Cursor @classmethod def addClassCleanup(cls, function, *args, **kwargs) -> None: ... @classmethod @@ -62,27 +79,26 @@ class BaseCase(unittest.TestCase, metaclass=MetaCase): def cursor(self) -> Cursor: ... @property def uid(self) -> int: ... - env: Environment @uid.setter def uid(self, user) -> None: ... - def ref(self, xid): ... - def browse_ref(self, xid): ... + def ref(self, xid: str) -> int: ... + def browse_ref(self, xid: str) -> BaseModel | None: ... def patch(self, obj, key, val) -> None: ... - def with_user(self, login) -> None: ... - def _assertRaises(self, exception, *, msg: Any | None = ...) -> None: ... - def assertRaises(self, exception, func: Any | None = ..., *args, **kwargs): ... - def assertQueries(self, expected, flush: bool = ...): ... - def assertQueryCount(self, default: int = ..., flush: bool = ..., **counters): ... - def assertRecordValues(self, records, expected_values): ... - def assertItemsEqual(self, a, b, msg: Any | None = ...) -> None: ... - def assertTreesEqual(self, n1, n2, msg: Any | None = ...) -> None: ... - def _assertXMLEqual(self, original, expected, parser: str = ...) -> None: ... - def assertXMLEqual(self, original, expected): ... - def assertHTMLEqual(self, original, expected): ... - profile_session: Any - def profile(self, **kwargs): ... + def with_user(self, login: str) -> None: ... + def _assertRaises(self, exception, *, msg: Any | None = ...) -> Generator[Any, None, None]: ... + def assertRaises(self, exception, func: Any | None = ..., *args, **kwargs) -> Generator[Any, None, None] | None: ... + def assertQueries(self, expected, flush: bool = ...) -> Generator[list, None, None]: ... + def assertQueryCount(self, default: int = ..., flush: bool = ..., **counters) -> Generator[None, None, None]: ... + def assertRecordValues(self, records: BaseModel, expected_values: list[dict[str, Any]]) -> None: ... + def assertItemsEqual(self, a, b, msg: str | None = ...) -> None: ... + def assertTreesEqual(self, n1, n2, msg: str | None = ...) -> None: ... + def _assertXMLEqual(self, original: str, expected: str, parser: str = ...) -> None: ... + def assertXMLEqual(self, original: str, expected: str) -> None: ... + def assertHTMLEqual(self, original: str, expected: str) -> None: ... + profile_session: str + def profile(self, **kwargs) -> Profiler: ... -savepoint_seq: Any +savepoint_seq: count[int] class TransactionCase(BaseCase): registry: Registry @@ -90,7 +106,7 @@ class TransactionCase(BaseCase): cr: Cursor @classmethod def setUpClass(cls) -> None: ... - _savepoint_id: Any + _savepoint_id: int def setUp(self): ... class SavepointCase(TransactionCase): @@ -98,9 +114,6 @@ class SavepointCase(TransactionCase): def __init_subclass__(cls) -> None: ... class SingleTransactionCase(BaseCase): - registry: Registry - env: Environment - cr: Cursor @classmethod def __init_subclass__(cls) -> None: ... @classmethod @@ -110,56 +123,55 @@ class SingleTransactionCase(BaseCase): class ChromeBrowserException(Exception): ... class ChromeBrowser: - _logger: Any - test_class: Any - devtools_port: Any + test_class: str + devtools_port: int | None ws_url: str - ws: Any + ws: WebSocket | None request_id: int - user_data_dir: Any - chrome_pid: Any - screenshots_dir: Any - screencasts_dir: Any - screencast_frames: Any - window_size: Any + user_data_dir: str + chrome_pid: int | None + screenshots_dir: str + screencasts_dir: str | None + screencast_frames: list + window_size: str sigxcpu_handler: Any - def __init__(self, logger, window_size, test_class) -> None: ... + def __init__(self, logger: logging.Logger, window_size: str, test_class: str) -> None: ... def signal_handler(self, sig, frame) -> None: ... def stop(self) -> None: ... @property - def executable(self): ... - def _spawn_chrome(self, cmd): ... + def executable(self) -> str | None: ... + def _spawn_chrome(self, cmd: list[str]) -> int | None: ... def _chrome_start(self) -> None: ... def _find_websocket(self) -> None: ... - def _json_command(self, command, timeout: int = ..., get_key: Any | None = ...): ... + def _json_command(self, command: str, timeout: int = ..., get_key: Any | None = ...): ... def _open_websocket(self) -> None: ... - def _websocket_send(self, method, params: Any | None = ...): ... - def _get_message(self, raise_log_error: bool = ...): ... - _TO_LEVEL: Any - def _websocket_wait_id(self, awaited_id, timeout: int = ...): ... - def _websocket_wait_event(self, method, params: Any | None = ..., timeout: int = ...): ... - def take_screenshot(self, prefix: str = ..., suffix: Any | None = ...) -> None: ... + def _websocket_send(self, method: str, params: Any | None = ...) -> int | None: ... + def _get_message(self, raise_log_error: bool = ...) -> dict: ... + _TO_LEVEL: dict[str, int] + def _websocket_wait_id(self, awaited_id: int, timeout: int = ...) -> dict: ... + def _websocket_wait_event(self, method: str, params: dict | None = ..., timeout: int = ...) -> dict | None: ... + def take_screenshot(self, prefix: str = ..., suffix: str | None = ...) -> None: ... def _save_screencast(self, prefix: str = ...) -> None: ... - screencasts_frames_dir: Any + screencasts_frames_dir: str def start_screencast(self) -> None: ... - def set_cookie(self, name, value, path, domain): ... - def delete_cookie(self, name, **kwargs): ... - def _wait_ready(self, ready_code, timeout: int = ...): ... - def _wait_code_ok(self, code, timeout): ... - def navigate_to(self, url, wait_stop: bool = ...) -> None: ... + def set_cookie(self, name: str, value, path, domain) -> dict: ... + def delete_cookie(self, name: str, **kwargs) -> dict: ... + def _wait_ready(self, ready_code, timeout: int = ...) -> bool: ... + def _wait_code_ok(self, code, timeout: float) -> Literal[True] | None: ... + def navigate_to(self, url: str, wait_stop: bool = ...) -> None: ... def clear(self) -> None: ... - def _from_remoteobject(self, arg): ... + def _from_remoteobject(self, arg: Mapping): ... LINE_PATTERN: str - def _format_stack(self, logrecord) -> None: ... - def console_formatter(self, args): ... + def _format_stack(self, logrecord: Mapping) -> None: ... + def console_formatter(self, args: list) -> Callable[[Match[str]], str]: ... class Opener(requests.Session): - cr: Any + cr: BaseCursor def __init__(self, cr: BaseCursor) -> None: ... def request(self, *args, **kwargs): ... class Transport(xmlrpclib.Transport): - cr: Any + cr: BaseCursor def __init__(self, cr: BaseCursor) -> None: ... def request(self, *args, **kwargs): ... @@ -179,102 +191,110 @@ class HttpCase(TransactionCase): def start_browser(cls) -> None: ... @classmethod def terminate_browser(cls) -> None: ... - def url_open(self, url, data: Any | None = ..., files: Any | None = ..., timeout: int = ..., headers: Any | None = ..., allow_redirects: bool = ..., head: bool = ...): ... - def _wait_remaining_requests(self, timeout: int = ...): ... + def url_open(self, url: str, data: Any | None = ..., files: Mapping | None = ..., timeout: int = ..., + headers: Mapping | None = ..., allow_redirects: bool = ..., head: bool = ...) -> requests.Response: ... + def _wait_remaining_requests(self, timeout: int = ...) -> None: ... def logout(self, keep_db: bool = ...) -> None: ... session: OpenERPSession - def authenticate(self, user, password): ... - def browser_js(self, url_path, code, ready: str = ..., login: Any | None = ..., timeout: int = ..., **kw) -> None: ... + def authenticate(self, user, password) -> Session: ... + def browser_js(self, url_path: str, code: str, ready: str = ..., login: str | None = ..., timeout: int = ..., **kw) -> None: ... @classmethod - def base_url(cls): ... - def start_tour(self, url_path, tour_name, step_delay: Any | None = ..., **kwargs): ... + def base_url(cls) -> str: ... + def start_tour(self, url_path: str, tour_name: str, step_delay: float | None = ..., **kwargs) -> None: ... + def profile(self, **kwargs) -> profiler.Nested: ... class HttpSavepointCase(HttpCase): @classmethod def __init_subclass__(cls) -> None: ... -def users(*logins): ... -def warmup(func, *args, **kwargs) -> None: ... -def can_import(module): ... +def users(*logins: str) -> Callable[[_CallableT], _CallableT]: ... +def warmup(func: _CallableT, *args, **kwargs) -> _CallableT: ... +def can_import(module: str) -> bool: ... -ref_re: Any +ref_re: Pattern -class Form: - def __init__(self, recordp, view: Any | None = ...) -> None: ... - def _o2m_set_edition_view(self, descr, node, level) -> None: ... - def __str__(self): ... - def _process_fvg(self, model, fvg, level: int = ...) -> None: ... - def _init_from_defaults(self, model) -> None: ... - def _init_from_values(self, values) -> None: ... - def __getattr__(self, field): ... - def _get_modifier(self, field, modifier, default: bool = ..., modmap: Any | None = ..., vals: Any | None = ...): ... - _OPS: Any - def _get_context(self, field): ... - def __setattr__(self, field, value) -> None: ... - def __enter__(self) -> Form: ... +class Form(Generic[_ModelT]): + _env: Environment + _model: _ModelT + _view: dict + _values: dict + _changed: set + def __init__(self, recordp: _ModelT, view: _ModelT | str | None = ...) -> None: ... + def _o2m_set_edition_view(self, descr: dict, node: _Element, level: int) -> None: ... + def __str__(self) -> str: ... + def _process_fvg(self, model: BaseModel, fvg: dict, level: int = ...) -> None: ... + def _init_from_defaults(self, model: BaseModel) -> None: ... + def _init_from_values(self, values: BaseModel) -> None: ... + def __getattr__(self, field: str): ... + def _get_modifier(self, field: str, modifier: str, *, default: Any = ..., view: Any = ..., modmap: Any | None = ..., + vals: Any | None = ...): ... + _OPS: dict[str, Callable[..., bool]] + def _get_context(self, field: str): ... + def __setattr__(self, field: str, value) -> None: ... + def __enter__(self: _FormT) -> _FormT: ... def __exit__(self, etype, _evalue, _etb) -> None: ... - def save(self): ... - def _values_to_save(self, all_fields: bool = ...): ... - def _values_to_save_(self, record_values, fields, view, changed, all_fields: bool = ..., modifiers_values: Any | None = ..., parent_link: Any | None = ...): ... - def _perform_onchange(self, fields): ... - def _onchange_values(self): ... - def _onchange_values_(self, fields, record): ... - def _cleanup_onchange(self, descr, value, current): ... + def save(self) -> _ModelT: ... + def _values_to_save(self, all_fields: bool = ...) -> dict: ... + def _values_to_save_(self, record_values: dict, fields: dict, view: Any, changed: set, all_fields: bool = ..., + modifiers_values: dict | None = ..., parent_link: Any | None = ...) -> dict: ... + def _perform_onchange(self, fields: list[str]) -> dict: ... + def _onchange_values(self) -> dict: ... + def _onchange_values_(self, fields, record: dict) -> dict: ... + def _cleanup_onchange(self, descr: dict, value, current): ... class O2MForm(Form): - def __init__(self, proxy, index: Any | None = ...) -> None: ... - def _get_modifier(self, field, modifier, default: bool = ..., modmap: Any | None = ..., vals: Any | None = ...): ... - def _onchange_values(self): ... + _proxy: O2MProxy + _index: int | None + def __init__(self, proxy: O2MProxy, index: int | None = ...) -> None: ... + def _get_modifier(self, field: str, modifier: str, *, default: Any = ..., view: Any = ..., modmap: Any | None = ..., + vals: Any | None = ...): ... + def _onchange_values(self) -> dict: ... def save(self) -> None: ... - def _values_to_save(self, all_fields: bool = ...): ... + def _values_to_save(self, all_fields: bool = ...) -> UpdateDict: ... class UpdateDict(dict): - _changed: Any + _changed: set def __init__(self, *args, **kwargs) -> None: ... - def changed_items(self): ... + def changed_items(self) -> Iterator[tuple[Any, Any]]: ... def update(self, *args, **kw) -> None: ... class X2MProxy: - _parent: Any - _field: Any + _parent: Form + _field: str def _assert_editable(self) -> None: ... class O2MProxy(X2MProxy): - _parent: Any - _field: Any - _records: Any - def __init__(self, parent, field) -> None: ... - def __len__(self): ... + _records: list[dict] + def __init__(self, parent: Form, field: str) -> None: ... + def __len__(self) -> int: ... @property - def _model(self): ... + def _model(self) -> BaseModel: ... @property - def _descr(self): ... - def _command_index(self, for_record): ... - def new(self): ... - def edit(self, index): ... - def remove(self, index) -> None: ... + def _descr(self) -> dict: ... + def _command_index(self, for_record: int) -> int: ... + def new(self) -> O2MForm: ... + def edit(self, index: int): ... + def remove(self, index: int) -> None: ... class M2MProxy(X2MProxy, collections.Sequence): - _parent: Any - _field: Any - def __init__(self, parent, field) -> None: ... - def __getitem__(self, it): ... - def __len__(self): ... - def __iter__(self): ... - def __contains__(self, record): ... - def add(self, record) -> None: ... - def _get_ids(self): ... - def remove(self, id: Any | None = ..., index: Any | None = ...) -> None: ... + def __init__(self, parent: Form, field: str) -> None: ... + def __getitem__(self, it) -> BaseModel: ... + def __len__(self) -> int: ... + def __iter__(self) -> Iterator[BaseModel]: ... + def __contains__(self, record: BaseModel) -> bool: ... + def add(self, record: BaseModel) -> None: ... + def _get_ids(self) -> list[int]: ... + def remove(self, id: int | None = ..., index: int | None = ...) -> None: ... def clear(self) -> None: ... -def record_to_values(fields, record): ... -def _cleanup_from_default(type_, value): ... +def record_to_values(fields: dict, record: BaseModel) -> dict: ... +def _cleanup_from_default(type_: str, value): ... def _get_node(view, f, *arg): ... -def tagged(*tags): ... +def tagged(*tags: str) -> Callable[[_CallableT], _CallableT]: ... class TagsSelector: - filter_spec_re: Any - exclude: Any - include: Any - def __init__(self, spec) -> None: ... - def check(self, test): ... + filter_spec_re: Pattern + exclude: set + include: set + def __init__(self, spec: str) -> None: ... + def check(self, test) -> bool: ... diff --git a/odoo-stubs/tools/_vendor/__init__.pyi b/odoo-stubs/tools/_vendor/__init__.pyi new file mode 100644 index 0000000..e69de29 diff --git a/odoo-stubs/tools/_vendor/sessions.pyi b/odoo-stubs/tools/_vendor/sessions.pyi new file mode 100644 index 0000000..ada438c --- /dev/null +++ b/odoo-stubs/tools/_vendor/sessions.pyi @@ -0,0 +1,53 @@ +from re import Pattern +from typing import Any, Generic, TypeVar + +from werkzeug.datastructures import CallbackDict + +_ModificationTrackingDictT = TypeVar('_ModificationTrackingDictT', bound=ModificationTrackingDict) +_SessionT = TypeVar('_SessionT', bound=Session) + +_sha1_re: Pattern + +def generate_key(salt: Any = ...) -> str: ... + +class ModificationTrackingDict(CallbackDict): + __slots__ = ('modified',) + modified: bool + def __init__(self, *args, **kwargs): ... + def copy(self: _ModificationTrackingDictT) -> _ModificationTrackingDictT: ... + def __copy__(self: _ModificationTrackingDictT) -> _ModificationTrackingDictT: ... + +class Session(ModificationTrackingDict): + __slots__ = ('modified', 'sid', 'new') + sid: str + new: bool + def __init__(self, data, sid, new: bool = ...): ... + def __repr__(self) -> str: ... + @property + def should_save(self) -> bool: ... + +class SessionStore(Generic[_SessionT]): + session_class: type[_SessionT] + def __init__(self, session_class: type[_SessionT] | None = ...): ... + def is_valid_key(self, key) -> bool: ... + def generate_key(self, salt: Any = ...) -> str: ... + def new(self) -> _SessionT: ... + def save(self, session: _SessionT) -> None: ... + def save_if_modified(self, session: _SessionT) -> None: ... + def delete(self, session: _SessionT) -> None: ... + def get(self, sid: str) -> _SessionT: ... + +_fs_transaction_suffix: str + +class FilesystemSessionStore(SessionStore[_SessionT]): + path: str | None + filename_template: str + renew_missing: bool + mode: int + def __init__(self, path: str | None = ..., filename_template: str = ..., session_class: type[_SessionT] | None = ..., + renew_missing: bool = ..., mode: int = ...) -> None: ... + def get_session_filename(self, sid: str) -> str: ... + def save(self, session: _SessionT) -> None: ... + def delete(self, session: _SessionT) -> None: ... + def get(self, sid: str) -> _SessionT: ... + def list(self) -> list[str]: ... diff --git a/odoo-stubs/tools/_vendor/useragents.pyi b/odoo-stubs/tools/_vendor/useragents.pyi new file mode 100644 index 0000000..605c19b --- /dev/null +++ b/odoo-stubs/tools/_vendor/useragents.pyi @@ -0,0 +1,23 @@ +from re import Pattern + +class UserAgentParser(object): + platforms: list[tuple[str, Pattern]] + browsers: list[tuple[str, Pattern]] + _browser_version_re: str + _language_re: Pattern + def __init__(self) -> None: ... + def __call__(self, user_agent: str) -> tuple[str | None, str | None, str | None, str | None]: ... + +class UserAgent(object): + _parser: UserAgentParser + string: str + platform: str | None + browser: str | None + version: str | None + language: str | None + def __init__(self, environ_or_string: dict | str): ... + def to_header(self) -> str: ... + def __str__(self) -> str: ... + def __nonzero__(self) -> bool: ... + __bool__ = __nonzero__ + def __repr__(self) -> str: ... diff --git a/odoo-stubs/tools/profiler.pyi b/odoo-stubs/tools/profiler.pyi index cad4445..c7d2f7e 100644 --- a/odoo-stubs/tools/profiler.pyi +++ b/odoo-stubs/tools/profiler.pyi @@ -123,6 +123,6 @@ class Profiler: class Nested(Generic[_T]): profiler: Profiler context_manager: ContextManager[_T] - def __init__(self, profiler: Profiler, context_manager: ContextManager) -> None: ... + def __init__(self, profiler: Profiler, context_manager: ContextManager[_T]) -> None: ... def __enter__(self) -> _T: ... def __exit__(self, exc_type, exc_value, traceback): ...