mirror of
https://github.com/odoo-ide/odoo-stubs.git
synced 2025-05-08 16:52:26 +03:00
Update stubs
This commit is contained in:
@@ -22,6 +22,7 @@ from .models import BaseModel
|
||||
from .modules.registry import Registry
|
||||
from .sql_db import Cursor
|
||||
from .tools import SQL, StackMap, frozendict
|
||||
from .tools.translate import LazyGettext
|
||||
|
||||
_T = TypeVar("_T")
|
||||
_ModelT = TypeVar("_ModelT", bound=BaseModel)
|
||||
@@ -110,6 +111,7 @@ class Environment(Mapping[str, BaseModel]):
|
||||
def companies(self) -> Company: ...
|
||||
@property
|
||||
def lang(self) -> str: ...
|
||||
def _(self, source: str | LazyGettext, *args, **kwargs) -> str: ...
|
||||
def clear(self) -> None: ...
|
||||
def invalidate_all(self, flush: bool = ...) -> None: ...
|
||||
def flush_all(self) -> None: ...
|
||||
@@ -198,6 +200,10 @@ class Cache:
|
||||
def clear(self) -> None: ...
|
||||
def check(self, env: Environment) -> None: ...
|
||||
|
||||
class GroupedCompanyDependentFieldCache:
|
||||
def __init__(self, company_field_cache) -> None: ...
|
||||
def __getitem__(self, id_): ...
|
||||
|
||||
class Starred:
|
||||
value: Any
|
||||
def __init__(self, value) -> None: ...
|
||||
|
||||
@@ -12,8 +12,6 @@ class RedirectWarning(Exception):
|
||||
button_text: str,
|
||||
additional_context: dict | None = ...,
|
||||
) -> None: ...
|
||||
@property
|
||||
def name(self): ...
|
||||
|
||||
class AccessDenied(UserError):
|
||||
traceback: tuple[str, str, str]
|
||||
|
||||
@@ -17,8 +17,9 @@ import psycopg2
|
||||
from markupsafe import Markup
|
||||
|
||||
from . import SUPERUSER_ID as SUPERUSER_ID
|
||||
from .api import Environment, Registry
|
||||
from .api import Environment
|
||||
from .models import BaseModel
|
||||
from .modules.registry import Registry
|
||||
from .tools import date_utils, float_utils
|
||||
|
||||
_FieldT = TypeVar("_FieldT", bound=Field)
|
||||
@@ -30,6 +31,7 @@ DATE_LENGTH: int
|
||||
DATETIME_LENGTH: int
|
||||
NO_ACCESS: str
|
||||
IR_MODELS: tuple[str, ...]
|
||||
COMPANY_DEPENDENT_FIELDS: tuple[str, ...]
|
||||
NoneType: type[None]
|
||||
Default: object
|
||||
|
||||
@@ -45,7 +47,6 @@ class Field(Generic[_FieldValueT], metaclass=MetaField):
|
||||
type: str
|
||||
relational: bool
|
||||
translate: bool
|
||||
column_type: tuple[str, str] | None
|
||||
write_sequence: int
|
||||
args: dict[str, Any] | None
|
||||
automatic: bool
|
||||
@@ -91,7 +92,10 @@ class Field(Generic[_FieldValueT], metaclass=MetaField):
|
||||
def setup_related(self, model: BaseModel) -> None: ...
|
||||
def traverse_related(self, record: _ModelT) -> tuple[_ModelT, Field]: ...
|
||||
@property
|
||||
def column_type(self) -> tuple[str, str] | None: ...
|
||||
@property
|
||||
def base_field(self) -> Field: ...
|
||||
def get_company_dependent_fallback(self, records: BaseModel): ...
|
||||
def resolve_depends(self, registry: Registry) -> Iterator[tuple]: ...
|
||||
def get_description(
|
||||
self, env: Environment, attributes: Container[str] | None = ...
|
||||
@@ -101,6 +105,10 @@ class Field(Generic[_FieldValueT], metaclass=MetaField):
|
||||
def convert_to_column(
|
||||
self, value, record: BaseModel, values: Any | None = ..., validate: bool = ...
|
||||
): ...
|
||||
def convert_to_column_insert(
|
||||
self, value, record: BaseModel, values: Any | None = ..., validate: bool = ...
|
||||
): ...
|
||||
def convert_to_column_update(self, value, record: BaseModel): ...
|
||||
def convert_to_cache(self, value, record: BaseModel, validate: bool = ...): ...
|
||||
def convert_to_record(self, value, record: BaseModel): ...
|
||||
def convert_to_record_multi(self, values, records: BaseModel): ...
|
||||
@@ -133,7 +141,6 @@ class Field(Generic[_FieldValueT], metaclass=MetaField):
|
||||
|
||||
class Boolean(Field[bool]):
|
||||
type: str
|
||||
column_type: tuple[str, str]
|
||||
def convert_to_column(
|
||||
self, value, record: BaseModel, values: Any | None = ..., validate: bool = ...
|
||||
) -> bool: ...
|
||||
@@ -144,7 +151,6 @@ class Boolean(Field[bool]):
|
||||
|
||||
class Integer(Field[int]):
|
||||
type: str
|
||||
column_type: tuple[str, str]
|
||||
aggregator: str
|
||||
def convert_to_column(
|
||||
self, value, record: BaseModel, values: Any | None = ..., validate: bool = ...
|
||||
@@ -164,8 +170,6 @@ class Float(Field[float]):
|
||||
def __init__(
|
||||
self, string: str = ..., digits: tuple[int, int] | str | None = ..., **kwargs
|
||||
) -> None: ...
|
||||
@property
|
||||
def column_type(self): ...
|
||||
def get_digits(self, env: Environment) -> tuple[int, int]: ...
|
||||
def convert_to_column(
|
||||
self, value, record: BaseModel, values: Any | None = ..., validate: bool = ...
|
||||
@@ -182,7 +186,6 @@ class Float(Field[float]):
|
||||
class Monetary(Field[float]):
|
||||
type: str
|
||||
write_sequence: int
|
||||
column_type: tuple[str, str]
|
||||
currency_field: str | None
|
||||
aggregator: str
|
||||
def __init__(
|
||||
@@ -191,7 +194,7 @@ class Monetary(Field[float]):
|
||||
def get_currency_field(self, model: BaseModel) -> str: ...
|
||||
def setup_nonrelated(self, model: BaseModel) -> None: ...
|
||||
def setup_related(self, model: BaseModel) -> None: ...
|
||||
def convert_to_column(
|
||||
def convert_to_column_insert(
|
||||
self, value, record: BaseModel, values: Any | None = ..., validate: bool = ...
|
||||
) -> float: ...
|
||||
def convert_to_cache(
|
||||
@@ -202,6 +205,7 @@ class Monetary(Field[float]):
|
||||
self, value, record: BaseModel, use_display_name: bool = ...
|
||||
): ...
|
||||
def convert_to_write(self, value, record: BaseModel): ...
|
||||
def convert_to_export(self, value, record: BaseModel): ...
|
||||
|
||||
class _String(Field[str]):
|
||||
translate: Callable | bool
|
||||
@@ -212,6 +216,10 @@ class _String(Field[str]):
|
||||
def convert_to_column(
|
||||
self, value, record: BaseModel, values: Any | None = ..., validate: bool = ...
|
||||
): ...
|
||||
def convert_to_column_insert(
|
||||
self, value, record: BaseModel, values: Any | None = ..., validate: bool = ...
|
||||
): ...
|
||||
def convert_to_column_update(self, value, record: BaseModel): ...
|
||||
def convert_to_cache(self, value, record: BaseModel, validate: bool = ...): ...
|
||||
def convert_to_record(self, value, record: BaseModel): ...
|
||||
def convert_to_write(self, value, record: BaseModel): ...
|
||||
@@ -224,8 +232,6 @@ class _String(Field[str]):
|
||||
class Char(_String):
|
||||
type: str
|
||||
trim: bool
|
||||
@property
|
||||
def column_type(self) -> tuple[str, str]: ...
|
||||
def update_db_column(self, model: BaseModel, column: dict | None) -> None: ...
|
||||
def convert_to_column(
|
||||
self, value, record: BaseModel, values: Any | None = ..., validate: bool = ...
|
||||
@@ -233,8 +239,6 @@ class Char(_String):
|
||||
|
||||
class Text(_String):
|
||||
type: str
|
||||
@property
|
||||
def column_type(self) -> tuple[str, str]: ...
|
||||
|
||||
class Html(_String):
|
||||
type: str
|
||||
@@ -246,8 +250,6 @@ class Html(_String):
|
||||
sanitize_form: bool
|
||||
strip_style: bool
|
||||
strip_classes: bool
|
||||
@property
|
||||
def column_type(self) -> tuple[str, str]: ...
|
||||
def convert_to_column(
|
||||
self, value, record: BaseModel, values: Any | None = ..., validate: bool = ...
|
||||
) -> Markup | None: ...
|
||||
@@ -262,7 +264,6 @@ class Html(_String):
|
||||
|
||||
class Date(Field[datetime.date]):
|
||||
type: str
|
||||
column_type: tuple[str, str]
|
||||
start_of = date_utils.start_of
|
||||
end_of = date_utils.end_of
|
||||
add = date_utils.add
|
||||
@@ -278,6 +279,7 @@ class Date(Field[datetime.date]):
|
||||
from_string = to_date
|
||||
@staticmethod
|
||||
def to_string(value: datetime.datetime | datetime.date) -> str: ...
|
||||
def convert_to_column_update(self, value, record: BaseModel): ...
|
||||
def convert_to_cache(
|
||||
self, value, record: BaseModel, validate: bool = ...
|
||||
) -> datetime.date | None: ...
|
||||
@@ -286,7 +288,6 @@ class Date(Field[datetime.date]):
|
||||
|
||||
class Datetime(Field[datetime.datetime]):
|
||||
type: str
|
||||
column_type: tuple[str, str]
|
||||
start_of = date_utils.start_of
|
||||
end_of = date_utils.end_of
|
||||
add = date_utils.add
|
||||
@@ -304,6 +305,7 @@ class Datetime(Field[datetime.datetime]):
|
||||
from_string = to_datetime
|
||||
@staticmethod
|
||||
def to_string(value: datetime.datetime | datetime.date) -> str: ...
|
||||
def convert_to_column_update(self, value, record: BaseModel): ...
|
||||
def convert_to_cache(
|
||||
self, value, record: BaseModel, validate: bool = ...
|
||||
) -> datetime.datetime | None: ...
|
||||
@@ -338,7 +340,6 @@ class Image(Binary):
|
||||
|
||||
class Selection(Field[str]):
|
||||
type: str
|
||||
column_type: tuple[str, str]
|
||||
selection: list | Callable | str
|
||||
validate: bool
|
||||
ondelete: dict[str, Any] | None
|
||||
@@ -357,8 +358,6 @@ class Selection(Field[str]):
|
||||
|
||||
class Reference(Selection):
|
||||
type: str
|
||||
@property
|
||||
def column_type(self) -> tuple[str, str]: ...
|
||||
def convert_to_column(
|
||||
self, value, record: BaseModel, values: Any | None = ..., validate: bool = ...
|
||||
) -> str | None: ...
|
||||
@@ -383,7 +382,6 @@ class _Relational(Field[BaseModel]):
|
||||
|
||||
class Many2one(_Relational):
|
||||
type: str
|
||||
column_type: tuple[str, str]
|
||||
ondelete: str | None
|
||||
auto_join: bool
|
||||
delegate: bool
|
||||
@@ -416,7 +414,6 @@ class Many2oneReference(Integer):
|
||||
|
||||
class Json(Field):
|
||||
type: str
|
||||
column_type: tuple[str, str]
|
||||
def convert_to_record(self, value, record: BaseModel): ...
|
||||
def convert_to_cache(self, value, record: BaseModel, validate: bool = ...): ...
|
||||
def convert_to_column(
|
||||
@@ -426,7 +423,6 @@ class Json(Field):
|
||||
|
||||
class Properties(Field):
|
||||
type: str
|
||||
column_type: tuple[str, str]
|
||||
copy: bool
|
||||
prefetch: bool
|
||||
write_sequence: int
|
||||
@@ -453,7 +449,6 @@ class Properties(Field):
|
||||
|
||||
class PropertiesDefinition(Field):
|
||||
type: str
|
||||
column_type: tuple[str, str]
|
||||
copy: bool
|
||||
readonly: bool
|
||||
prefetch: bool
|
||||
|
||||
@@ -50,16 +50,6 @@ def dispatch_rpc(service_name: str, method: str, params: Mapping): ...
|
||||
def get_session_max_inactivity(env: Environment) -> int: ...
|
||||
def is_cors_preflight(request: Request, endpoint) -> bool: ...
|
||||
def serialize_exception(exception: Exception): ...
|
||||
def send_file(
|
||||
filepath_or_fp,
|
||||
mimetype: str | None = ...,
|
||||
as_attachment: bool = ...,
|
||||
filename: str | None = ...,
|
||||
mtime: str | None = ...,
|
||||
add_etags: bool = ...,
|
||||
cache_timeout: int = ...,
|
||||
conditional: bool = ...,
|
||||
) -> werkzeug.Response: ...
|
||||
|
||||
class Stream:
|
||||
type: str
|
||||
|
||||
@@ -156,12 +156,9 @@ class BaseModel(metaclass=MetaModel):
|
||||
) -> list[list]: ...
|
||||
def export_data(self, fields_to_export: list[str]) -> dict[str, list[list]]: ...
|
||||
def load(self, fields: list[str], data: list[list[str]]) -> dict[str, Any]: ...
|
||||
def _add_fake_fields(
|
||||
self, fields: dict[str | None, Field]
|
||||
) -> dict[str | None, Field]: ...
|
||||
def _extract_records(
|
||||
self,
|
||||
fields_: Iterable[Sequence[str]],
|
||||
field_paths: Iterable[Sequence[str]],
|
||||
data,
|
||||
log: Callable = ...,
|
||||
limit: float = ...,
|
||||
@@ -341,6 +338,12 @@ class BaseModel(metaclass=MetaModel):
|
||||
def get_base_url(self) -> str: ...
|
||||
def _check_company_domain(self, companies) -> list: ...
|
||||
def _check_company(self, fnames: Collection[str] | None = ...) -> None: ...
|
||||
def check_access(self, operation: str) -> None: ...
|
||||
def has_access(self, operation: str) -> bool: ...
|
||||
def _filtered_access(self, operation: str): ...
|
||||
def _check_access(
|
||||
self: _ModelT, operation: str
|
||||
) -> tuple[_ModelT, Callable] | None: ...
|
||||
def check_access_rights(
|
||||
self, operation: str, raise_exception: bool = ...
|
||||
) -> bool: ...
|
||||
@@ -364,8 +367,9 @@ class BaseModel(metaclass=MetaModel):
|
||||
def _parent_store_create(self) -> None: ...
|
||||
def _parent_store_update_prepare(self: _ModelT, vals_list) -> _ModelT: ...
|
||||
def _parent_store_update(self) -> None: ...
|
||||
def _clean_properties(self) -> None: ...
|
||||
def _load_records_write(self, values: dict[str, Any]) -> None: ...
|
||||
def _load_records_create(self, values: list[dict[str, Any]]): ...
|
||||
def _load_records_create(self, vals_list: list[dict[str, Any]]): ...
|
||||
def _load_records(
|
||||
self, data_list: list[dict], update: bool = ..., ignore_duplicates: bool = ...
|
||||
) -> BaseModel: ...
|
||||
@@ -541,12 +545,6 @@ class BaseModel(metaclass=MetaModel):
|
||||
fields_spec: dict,
|
||||
) -> dict: ...
|
||||
def _get_placeholder_filename(self, field: str) -> str | bool: ...
|
||||
def _populate_factories(self) -> list[tuple[str, Callable[..., Iterator]]]: ...
|
||||
@property
|
||||
def _populate_sizes(self) -> dict[str, int]: ...
|
||||
@property
|
||||
def _populate_dependencies(self) -> list[str]: ...
|
||||
def _populate(self: _ModelT, size: str) -> _ModelT: ...
|
||||
|
||||
class RecordCache(MutableMapping):
|
||||
def __init__(self, record: BaseModel) -> None: ...
|
||||
|
||||
@@ -30,9 +30,6 @@ def module_manifest(path: str) -> str | None: ...
|
||||
def get_module_root(path: str) -> str | None: ...
|
||||
def load_manifest(module: str, mod_path: str | None = ...) -> dict[str, Any]: ...
|
||||
def get_manifest(module: str, mod_path: str | None = ...) -> dict[str, Any]: ...
|
||||
def load_information_from_description_file(
|
||||
module: str, mod_path: str | None = ...
|
||||
) -> dict: ...
|
||||
def load_openerp_module(module_name: str) -> None: ...
|
||||
def get_modules() -> list[str]: ...
|
||||
def get_modules_with_version() -> dict[str, Any]: ...
|
||||
|
||||
@@ -31,6 +31,7 @@ class Registry(Mapping[str, type[BaseModel]]):
|
||||
field_depends: Collector
|
||||
field_depends_context: Collector
|
||||
field_inverses: Collector
|
||||
many2one_company_dependents: Collector
|
||||
registry_sequence: int | None
|
||||
cache_sequences: dict
|
||||
has_unaccent: bool
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
import logging.handlers
|
||||
import warnings
|
||||
from logging import Logger, LogRecord
|
||||
from typing import TextIO
|
||||
|
||||
@@ -52,7 +51,6 @@ def init_logger(): ...
|
||||
|
||||
DEFAULT_LOG_CONFIGURATION: list[str]
|
||||
PSEUDOCONFIG_MAPPER: dict[str, list[str]]
|
||||
showwarning = warnings.showwarning
|
||||
IGNORE: set[str]
|
||||
|
||||
def showwarning_with_traceback(
|
||||
|
||||
@@ -2,4 +2,3 @@ from . import common as common
|
||||
from . import db as db
|
||||
from . import model as model
|
||||
from . import server as server
|
||||
from . import wsgi_server as wsgi_server
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
def application(environ, start_response): ...
|
||||
@@ -75,8 +75,8 @@ class Cursor(BaseCursor):
|
||||
fetch: bool = ...,
|
||||
): ...
|
||||
def split_for_in_conditions(
|
||||
self, ids: Iterable, size: int | None = ...
|
||||
) -> Iterator[tuple]: ...
|
||||
self, ids: Iterable[_T], size: int = ...
|
||||
) -> Iterator[tuple[_T, ...]]: ...
|
||||
def print_log(self): ...
|
||||
def close(self): ...
|
||||
def commit(self): ...
|
||||
|
||||
@@ -99,6 +99,10 @@ class BaseCase(case.TestCase, metaclass=MetaCase):
|
||||
self, expected, flush: bool = ...
|
||||
) -> Generator[list, None, None]: ...
|
||||
@contextmanager
|
||||
def assertQueriesContain(
|
||||
self, expected, flush: bool = ...
|
||||
) -> Generator[list, None, None]: ...
|
||||
@contextmanager
|
||||
def assertQueryCount(
|
||||
self, default: int = ..., flush: bool = ..., **counters
|
||||
) -> Generator[None, None, None]: ...
|
||||
@@ -123,8 +127,11 @@ class Like:
|
||||
|
||||
class Approx:
|
||||
value: float
|
||||
decorate: bool
|
||||
cmp: Callable
|
||||
def __init__(self, value: float, rounding: int | float | Currency) -> None: ...
|
||||
def __init__(
|
||||
self, value: float, rounding: int | float | Currency, decorate: bool
|
||||
) -> None: ...
|
||||
def __repr__(self) -> str: ...
|
||||
def __eq__(self, other: object) -> bool | NotImplemented: ...
|
||||
|
||||
@@ -217,6 +224,10 @@ class HttpCase(TransactionCase):
|
||||
allow_end_on_form: bool
|
||||
@classmethod
|
||||
def setUpClass(cls) -> None: ...
|
||||
@classmethod
|
||||
def base_url(cls) -> str: ...
|
||||
@classmethod
|
||||
def http_port(cls) -> int | None: ...
|
||||
xmlrpc_common: xmlrpclib.ServerProxy
|
||||
xmlrpc_db: xmlrpclib.ServerProxy
|
||||
xmlrpc_object: xmlrpclib.ServerProxy
|
||||
@@ -253,8 +264,6 @@ class HttpCase(TransactionCase):
|
||||
debug: bool = ...,
|
||||
**kw
|
||||
) -> None: ...
|
||||
@classmethod
|
||||
def base_url(cls) -> str: ...
|
||||
def start_tour(
|
||||
self, url_path: str, tour_name: str, step_delay: float | None = ..., **kwargs
|
||||
) -> None: ...
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
import collections
|
||||
from typing import Any, Generic, Iterable, Iterator, TypeVar
|
||||
|
||||
from ..api import Environment
|
||||
from ..models import BaseModel
|
||||
|
||||
_ModelT = TypeVar("_ModelT", bound=BaseModel)
|
||||
@@ -10,6 +11,8 @@ MODIFIER_ALIASES: dict
|
||||
|
||||
class Form(Generic[_ModelT]):
|
||||
def __init__(self, record: _ModelT, view: Any | None = ...) -> None: ...
|
||||
@classmethod
|
||||
def from_action(cls, env: Environment, action: dict) -> Form: ...
|
||||
def __getattr__(self, field_name: str): ...
|
||||
def __getitem__(self, field_name: str): ...
|
||||
def __setattr__(self, field_name: str, value) -> None: ...
|
||||
|
||||
@@ -30,8 +30,8 @@ from .query import Query as Query
|
||||
from .set_expression import SetDefinitions as SetDefinitions
|
||||
from .sourcemap_generator import SourceMapGenerator as SourceMapGenerator
|
||||
from .sql import *
|
||||
from .translate import LazyTranslate as LazyTranslate
|
||||
from .translate import _ as _
|
||||
from .translate import _lt as _lt
|
||||
from .translate import html_translate as html_translate
|
||||
from .translate import xml_translate as xml_translate
|
||||
from .xml_utils import cleanup_xml_node as cleanup_xml_node
|
||||
|
||||
@@ -19,7 +19,9 @@ class configmanager:
|
||||
config_file: str
|
||||
parser: OptionParser
|
||||
def __init__(self, fname: str | None = ...) -> None: ...
|
||||
def parse_config(self, args: list | None = ...): ...
|
||||
def parse_config(
|
||||
self, args: list[str] | None = ..., *, setup_logging: bool | None = ...
|
||||
) -> None: ...
|
||||
def load(self) -> None: ...
|
||||
def save(self, keys: Any | None = ...) -> None: ...
|
||||
def get(self, key, default: Any | None = ...): ...
|
||||
|
||||
@@ -1,31 +1,36 @@
|
||||
from typing import Callable, Generic, TypeVar
|
||||
from typing import Any, Callable, Generic, TypeVar, overload
|
||||
|
||||
_T = TypeVar("_T")
|
||||
|
||||
class lazy_property(Generic[_T]):
|
||||
fget: Callable[..., _T]
|
||||
def __init__(self, fget: Callable[..., _T]) -> None: ...
|
||||
def __get__(self, obj, cls) -> _T: ...
|
||||
fget: Callable[[Any], _T]
|
||||
def __init__(self, fget: Callable[[Any], _T]) -> None: ...
|
||||
@overload
|
||||
def __get__(self, obj: None, cls: Any) -> Any: ...
|
||||
@overload
|
||||
def __get__(self, obj: object, cls: Any) -> _T: ...
|
||||
@property
|
||||
def __doc__(self): ...
|
||||
@staticmethod
|
||||
def reset_all(obj) -> None: ...
|
||||
|
||||
class lazy_classproperty(lazy_property[_T]):
|
||||
def __get__(self, obj, cls) -> _T: ...
|
||||
|
||||
def conditional(condition, decorator): ...
|
||||
def filter_kwargs(func, kwargs) -> dict: ...
|
||||
def filter_kwargs(func: Callable, kwargs: dict[str, Any]) -> dict[str, Any]: ...
|
||||
def synchronized(lock_attr: str = ...) -> Callable[[_T], _T]: ...
|
||||
|
||||
locked: Callable[[_T], _T]
|
||||
|
||||
def frame_codeinfo(fframe, back: int = ...) -> tuple[str | None, str | None]: ...
|
||||
|
||||
class _ClassProperty(property, Generic[_T]):
|
||||
def __get__(self, cls, owner) -> _T: ...
|
||||
class classproperty(Generic[_T]):
|
||||
fget: ...
|
||||
def __init__(self, fget: Callable[[Any], _T]) -> None: ...
|
||||
def __get__(self, cls, owner: type | None = ...) -> _T: ...
|
||||
@property
|
||||
def __doc__(self): ...
|
||||
|
||||
def classproperty(func: Callable[..., _T]) -> _ClassProperty[_T]: ...
|
||||
class lazy_classproperty(classproperty[_T], Generic[_T]):
|
||||
def __get__(self, cls, owner: type | None = ...) -> _T: ...
|
||||
|
||||
class lazy:
|
||||
def __init__(self, func, *args, **kwargs) -> None: ...
|
||||
|
||||
@@ -1,7 +1,10 @@
|
||||
from re import Pattern
|
||||
from typing import Literal, Sequence
|
||||
|
||||
from ..api import Environment
|
||||
|
||||
XPG_LOCALE_RE: Pattern
|
||||
|
||||
def format_list(
|
||||
env: Environment,
|
||||
lst: Sequence[str],
|
||||
@@ -16,3 +19,4 @@ def format_list(
|
||||
] = ...,
|
||||
lang_code: str | None = ...,
|
||||
) -> str: ...
|
||||
def py_to_js_locale(locale: str) -> str: ...
|
||||
|
||||
@@ -1,15 +1,18 @@
|
||||
from collections import OrderedDict
|
||||
from typing import Any
|
||||
from typing import Generic, Iterable, Iterator, MutableMapping, TypeVar
|
||||
|
||||
class LRU:
|
||||
_K = TypeVar("_K")
|
||||
_V = TypeVar("_V")
|
||||
|
||||
class LRU(MutableMapping[_K, _V], Generic[_K, _V]):
|
||||
count: int
|
||||
d: OrderedDict
|
||||
def __init__(self, count: int, pairs: tuple[Any, Any] = ...) -> None: ...
|
||||
def __contains__(self, obj) -> bool: ...
|
||||
def get(self, obj, val: Any | None = ...): ...
|
||||
def __getitem__(self, obj): ...
|
||||
def __setitem__(self, obj, val) -> None: ...
|
||||
def __delitem__(self, obj) -> None: ...
|
||||
def __init__(self, count: int, pairs: Iterable[tuple[_K, _V]] = ...) -> None: ...
|
||||
def __contains__(self, obj: _K) -> bool: ...
|
||||
def __getitem__(self, obj: _K) -> _V: ...
|
||||
def __setitem__(self, obj: _K, val: _V): ...
|
||||
def __delitem__(self, obj: _K): ...
|
||||
def __len__(self) -> int: ...
|
||||
def pop(self, key): ...
|
||||
def __iter__(self) -> Iterator[_K]: ...
|
||||
def pop(self, key: _K) -> _V: ...
|
||||
def clear(self) -> None: ...
|
||||
|
||||
@@ -10,11 +10,13 @@ from typing import (
|
||||
Callable,
|
||||
Collection,
|
||||
Generic,
|
||||
ItemsView,
|
||||
Iterable,
|
||||
Iterator,
|
||||
NoReturn,
|
||||
Reversible,
|
||||
Sequence,
|
||||
TypeVar,
|
||||
overload,
|
||||
)
|
||||
|
||||
import markupsafe
|
||||
@@ -54,11 +56,11 @@ def file_open(
|
||||
) -> IO: ...
|
||||
def file_open_temporary_directory(env: Environment) -> Iterator[str]: ...
|
||||
def flatten(list) -> list: ...
|
||||
def reverse_enumerate(l): ...
|
||||
def reverse_enumerate(lst: Sequence[_T]) -> Iterator[tuple[int, _T]]: ...
|
||||
def partition(
|
||||
pred: Callable[[_T], bool], elems: Iterable[_T]
|
||||
) -> tuple[list[_T], list[_T]]: ...
|
||||
def topological_sort(elems: dict[_T, Any]) -> list[_T]: ...
|
||||
def topological_sort(elems: Mapping[_T, Collection[_T]]) -> list[_T]: ...
|
||||
def merge_sequences(*iterables: Iterable[_T]) -> list[_T]: ...
|
||||
|
||||
class PatchedWorkbook(xlwt.Workbook):
|
||||
@@ -81,8 +83,15 @@ DATETIME_FORMATS_MAP: dict[str, str]
|
||||
POSIX_TO_LDML: dict[str, str]
|
||||
|
||||
def posix_to_ldml(fmt: str, locale: Locale) -> str: ...
|
||||
@overload
|
||||
def split_every(n: int, iterable: Iterable[_T]) -> Iterator[tuple[_T, ...]]: ...
|
||||
@overload
|
||||
def split_every(
|
||||
n: int, iterable: Iterable[_T], piece_maker: Callable[[Iterable[_T]], _T1] = ...
|
||||
n: int, iterable: Iterable[_T], piece_maker: type[Collection[_T]]
|
||||
) -> Iterator[Collection[_T]]: ...
|
||||
@overload
|
||||
def split_every(
|
||||
n: int, iterable: Iterable[_T], piece_maker: Callable[[Iterable[_T]], _T1]
|
||||
) -> Iterator[_T1]: ...
|
||||
def discardattr(obj, key: str) -> None: ...
|
||||
def remove_accents(input_str: str) -> str: ...
|
||||
@@ -119,18 +128,9 @@ class lower_logging(Handler):
|
||||
) -> None: ...
|
||||
def emit(self, record: LogRecord) -> None: ...
|
||||
|
||||
class CountingStream(Generic[_T]):
|
||||
stream: Iterator[_T]
|
||||
index: int
|
||||
stopped: bool
|
||||
def __init__(self, stream: Iterable[_T], start: int = ...) -> None: ...
|
||||
def __iter__(self) -> CountingStream[_T]: ...
|
||||
def next(self) -> _T: ...
|
||||
__next__ = next
|
||||
|
||||
def stripped_sys_argv(*strip_args: str) -> list[str]: ...
|
||||
|
||||
class ConstantMapping(Mapping[_KT, _VT]):
|
||||
class ConstantMapping(Mapping[Any, _VT], Generic[_VT]):
|
||||
def __init__(self, val: _VT) -> None: ...
|
||||
def __len__(self) -> int: ...
|
||||
def __iter__(self) -> Iterator: ...
|
||||
@@ -142,7 +142,7 @@ def dumpstacks(
|
||||
def freehash(arg) -> int: ...
|
||||
def clean_context(context: dict[str, Any]) -> dict[str, Any]: ...
|
||||
|
||||
class frozendict(dict):
|
||||
class frozendict(dict[_KT, _VT], Generic[_KT, _VT]):
|
||||
def __delitem__(self, key) -> NoReturn: ...
|
||||
def __setitem__(self, key, val) -> NoReturn: ...
|
||||
def clear(self) -> NoReturn: ...
|
||||
@@ -152,23 +152,24 @@ class frozendict(dict):
|
||||
def update(self, *args, **kwargs) -> NoReturn: ...
|
||||
def __hash__(self) -> int: ...
|
||||
|
||||
class Collector(dict[_KT, tuple[_T]]):
|
||||
def __getitem__(self, key: _KT) -> tuple[_T]: ...
|
||||
def __setitem__(self, key: _KT, val: Iterable[_T]) -> None: ...
|
||||
def add(self, key: _KT, val: _T) -> None: ...
|
||||
def discard_keys_and_values(self, excludes: Collection): ...
|
||||
class Collector(dict[_KT, tuple[_T, ...]], Generic[_KT, _T]):
|
||||
def __getitem__(self, key: _KT) -> tuple[_T, ...]: ...
|
||||
def __setitem__(self, key: _KT, val: Iterable[_T]): ...
|
||||
def add(self, key: _KT, val: _T): ...
|
||||
def discard_keys_and_values(self, excludes: Collection[_KT | _T]) -> None: ...
|
||||
|
||||
class StackMap(MutableMapping):
|
||||
def __init__(self, m: MutableMapping | None = ...) -> None: ...
|
||||
def __getitem__(self, key): ...
|
||||
def __setitem__(self, key, val) -> None: ...
|
||||
def __delitem__(self, key) -> None: ...
|
||||
def __iter__(self) -> Iterator: ...
|
||||
class StackMap(MutableMapping[_KT, _VT], Generic[_KT, _VT]):
|
||||
def __init__(self, m: MutableMapping[_KT, _VT] | None = ...) -> None: ...
|
||||
def __getitem__(self, key: _KT) -> _VT: ...
|
||||
def __setitem__(self, key: _KT, val: _VT): ...
|
||||
def __delitem__(self, key: _KT): ...
|
||||
def __iter__(self) -> Iterator[_KT]: ...
|
||||
def __len__(self) -> int: ...
|
||||
def pushmap(self, m: MutableMapping | None = ...) -> None: ...
|
||||
def popmap(self) -> MutableMapping: ...
|
||||
def __str__(self) -> str: ...
|
||||
def pushmap(self, m: MutableMapping[_KT, _VT] | None = ...): ...
|
||||
def popmap(self) -> MutableMapping[_KT, _VT]: ...
|
||||
|
||||
class OrderedSet(MutableSet):
|
||||
class OrderedSet(MutableSet[_T], Generic[_T]):
|
||||
def __init__(self, elems: Iterable = ...) -> None: ...
|
||||
def __contains__(self, elem) -> bool: ...
|
||||
def __iter__(self) -> Iterator: ...
|
||||
@@ -178,7 +179,7 @@ class OrderedSet(MutableSet):
|
||||
def update(self, elems: Iterable) -> None: ...
|
||||
def difference_update(self, elems: Iterable) -> None: ...
|
||||
|
||||
class LastOrderedSet(OrderedSet):
|
||||
class LastOrderedSet(OrderedSet[_T], Generic[_T]):
|
||||
def add(self, elem) -> None: ...
|
||||
|
||||
class Callbacks:
|
||||
@@ -188,17 +189,17 @@ class Callbacks:
|
||||
def run(self) -> None: ...
|
||||
def clear(self) -> None: ...
|
||||
|
||||
class ReversedIterable(Generic[_T]):
|
||||
iterable: Iterable[_T]
|
||||
def __init__(self, iterable: Iterable[_T]) -> None: ...
|
||||
class ReversedIterable(Reversible[_T], Generic[_T]):
|
||||
iterable: Reversible[_T]
|
||||
def __init__(self, iterable: Reversible[_T]) -> None: ...
|
||||
def __iter__(self) -> Iterator[_T]: ...
|
||||
def __reversed__(self) -> Iterator[_T]: ...
|
||||
|
||||
def groupby(
|
||||
iterable: Iterable[_T], key: Callable[..., _T1] | None = ...
|
||||
) -> ItemsView[_T1, _T]: ...
|
||||
iterable: Iterable[_T], key: Callable[[_T], _T1] = ...
|
||||
) -> Iterable[tuple[_T1, list[_T]]]: ...
|
||||
def unique(it: Iterable[_T]) -> Iterator[_T]: ...
|
||||
def submap(mapping: Mapping[_KT, _VT], keys: Iterable[_KT]) -> dict[_KT, _VT]: ...
|
||||
def submap(mapping: Mapping[_KT, _VT], keys: Iterable[_KT]) -> Mapping[_KT, _VT]: ...
|
||||
|
||||
class Reverse:
|
||||
val: Any
|
||||
@@ -265,7 +266,7 @@ def format_duration(value: float) -> str: ...
|
||||
|
||||
consteq: Callable[[str, str], bool]
|
||||
|
||||
class ReadonlyDict(Mapping): ...
|
||||
class ReadonlyDict(Mapping[_KT, _VT], Generic[_KT, _VT]): ...
|
||||
|
||||
class DotDict(dict):
|
||||
def __getattr__(self, attrib): ...
|
||||
|
||||
@@ -4,4 +4,4 @@ from typing import Callable
|
||||
component_re: Pattern
|
||||
replace: Callable
|
||||
|
||||
def parse_version(s: str) -> tuple[str]: ...
|
||||
def parse_version(s: str) -> tuple[str, ...]: ...
|
||||
|
||||
@@ -1,54 +1,50 @@
|
||||
import datetime
|
||||
import random
|
||||
from typing import Any, Callable, Iterable, Iterator, Sequence, TypeVar
|
||||
|
||||
from dateutil.relativedelta import relativedelta
|
||||
from ..api import Environment
|
||||
from ..fields import Field, Many2one
|
||||
from ..models import Model
|
||||
from . import SQL
|
||||
|
||||
_T = TypeVar("_T")
|
||||
MIN_DATETIME: datetime.datetime
|
||||
MAX_DATETIME: datetime.datetime
|
||||
|
||||
def Random(seed) -> random.Random: ...
|
||||
def format_str(val: _T, counter, values) -> _T: ...
|
||||
def chain_factories(
|
||||
field_factories: Iterable[tuple[str, Callable[..., Iterator]]], model_name: str
|
||||
) -> Iterator: ...
|
||||
def root_factory() -> Iterator[dict]: ...
|
||||
def randomize(
|
||||
vals: Sequence,
|
||||
weights: Sequence | None = ...,
|
||||
seed: Any = ...,
|
||||
formatter: Callable[[Any, Any, Any], Any] = ...,
|
||||
counter_offset: int = ...,
|
||||
) -> Callable[[Iterable, str, str], dict]: ...
|
||||
def cartesian(
|
||||
vals: Sequence,
|
||||
weights: Sequence | None = ...,
|
||||
seed: Any = ...,
|
||||
formatter: Callable[[Any, Any, Any], Any] = ...,
|
||||
then: Callable[[Iterable, str, str], dict] | None = ...,
|
||||
) -> Callable[[Iterable, str, str], Iterator[dict]]: ...
|
||||
def iterate(
|
||||
vals: Sequence,
|
||||
weights: Sequence | None = ...,
|
||||
seed: Any = ...,
|
||||
formatter: Callable[[Any, Any, Any], Any] = ...,
|
||||
then: Callable[[Iterable, str, str], dict] | None = ...,
|
||||
) -> Callable[[Iterable, str, str], Iterator[dict]]: ...
|
||||
def constant(
|
||||
val: Sequence, formatter: Callable[[Any, Any, Any], Any] = ...
|
||||
) -> Callable[[Iterable, str, str], Iterator[dict]]: ...
|
||||
def compute(
|
||||
function: Callable[[Any, Any, Any], Any], seed: Any | None = ...
|
||||
) -> Callable[[Iterable, str, str], Iterator[dict]]: ...
|
||||
def randint(
|
||||
a: int, b: int, seed: Any | None = ...
|
||||
) -> Callable[[Iterable, str, str], Iterator[dict]]: ...
|
||||
def randfloat(
|
||||
a: float, b: float, seed: Any | None = ...
|
||||
) -> Callable[[Iterable, str, str], Iterator[dict]]: ...
|
||||
def randdatetime(
|
||||
*,
|
||||
base_date: datetime.datetime | None = ...,
|
||||
relative_before: datetime.timedelta | relativedelta | None = ...,
|
||||
relative_after: datetime.timedelta | relativedelta | None = ...,
|
||||
seed: Any | None = ...
|
||||
) -> Callable[[Iterable, str, str], Iterator[dict]]: ...
|
||||
def get_field_variation_date(
|
||||
model: Model, field: Field, factor: int, series_alias: str
|
||||
) -> SQL: ...
|
||||
def get_field_variation_char(field: Field, postfix: str | SQL | None = ...) -> SQL: ...
|
||||
def ignore_indexes(model: Model): ...
|
||||
def ignore_fkey_constraints(model: Model): ...
|
||||
def field_needs_variation(model: Model, field: Field) -> bool: ...
|
||||
def get_field_variation(
|
||||
model: Model, field: Field, factor: int, series_alias: str
|
||||
) -> SQL: ...
|
||||
def fetch_last_id(model: Model) -> int: ...
|
||||
def populate_field(
|
||||
model: Model,
|
||||
field: Field,
|
||||
populated: dict[Model, int],
|
||||
factors: dict[Model, int],
|
||||
table_alias: str = ...,
|
||||
series_alias: str = ...,
|
||||
) -> SQL | None: ...
|
||||
def populate_model(
|
||||
model: Model,
|
||||
populated: dict[Model, int],
|
||||
factors: dict[Model, int],
|
||||
separator_code: str,
|
||||
) -> None: ...
|
||||
|
||||
class Many2oneFieldWrapper(Many2one):
|
||||
def __init__(self, model, field_name, comodel_name) -> None: ...
|
||||
|
||||
class Many2manyModelWrapper:
|
||||
env: Environment
|
||||
def __init__(self, env, field) -> None: ...
|
||||
def __repr__(self) -> str: ...
|
||||
def __eq__(self, other): ...
|
||||
def __hash__(self): ...
|
||||
|
||||
def infer_many2many_model(
|
||||
env: Environment, field: Field
|
||||
) -> Model | Many2manyModelWrapper: ...
|
||||
def populate_models(model_factors: dict[Model, int], separator_code: int) -> None: ...
|
||||
|
||||
@@ -47,7 +47,7 @@ class Query:
|
||||
def select(self, *args: str | SQL) -> SQL: ...
|
||||
def subselect(self, *args: str | SQL) -> SQL: ...
|
||||
def get_result_ids(self) -> tuple[int, ...]: ...
|
||||
def set_result_ids(self, ids, ordered: bool = ...) -> None: ...
|
||||
def set_result_ids(self, ids: Iterable[int], ordered: bool = ...) -> None: ...
|
||||
def __bool__(self) -> bool: ...
|
||||
def __len__(self) -> int: ...
|
||||
def __iter__(self) -> Iterator[int]: ...
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
from abc import ABC, abstractmethod
|
||||
from collections.abc import Iterable
|
||||
from typing import Any
|
||||
from typing import Any, Collection, Literal
|
||||
|
||||
class SetDefinitions:
|
||||
def __init__(self, definitions: dict[int, dict]) -> None: ...
|
||||
@@ -9,9 +9,11 @@ class SetDefinitions:
|
||||
@property
|
||||
def universe(self) -> SetExpression: ...
|
||||
def parse(self, refs: str, raise_if_not_found: bool = ...) -> SetExpression: ...
|
||||
def from_ids(self, ids, keep_subsets: bool = ...) -> SetExpression: ...
|
||||
def from_ids(
|
||||
self, ids: Iterable[int], keep_subsets: bool = ...
|
||||
) -> SetExpression: ...
|
||||
def from_key(self, key: str) -> SetExpression: ...
|
||||
def get_id(self, ref): ...
|
||||
def get_id(self, ref: LeafIdType) -> LeafIdType | None: ...
|
||||
|
||||
class SetExpression(ABC):
|
||||
@abstractmethod
|
||||
@@ -19,7 +21,7 @@ class SetExpression(ABC):
|
||||
@abstractmethod
|
||||
def is_universal(self) -> bool: ...
|
||||
@abstractmethod
|
||||
def invert_intersect(self, factor: SetExpression) -> SetExpression: ...
|
||||
def invert_intersect(self, factor: SetExpression) -> SetExpression | None: ...
|
||||
@abstractmethod
|
||||
def matches(self, user_group_ids: Iterable[int]) -> bool: ...
|
||||
@property
|
||||
@@ -32,7 +34,7 @@ class SetExpression(ABC):
|
||||
@abstractmethod
|
||||
def __invert__(self) -> SetExpression: ...
|
||||
@abstractmethod
|
||||
def __eq__(self, other: SetExpression) -> bool: ...
|
||||
def __eq__(self, other) -> bool: ...
|
||||
@abstractmethod
|
||||
def __le__(self, other: SetExpression) -> bool: ...
|
||||
@abstractmethod
|
||||
@@ -46,15 +48,15 @@ class Union(SetExpression):
|
||||
def key(self) -> str: ...
|
||||
def is_empty(self) -> bool: ...
|
||||
def is_universal(self) -> bool: ...
|
||||
def invert_intersect(self, factor: Union) -> SetExpression: ...
|
||||
def __and__(self, other: Union) -> SetExpression: ...
|
||||
def __or__(self, other: Union) -> SetExpression: ...
|
||||
def invert_intersect(self, factor: SetExpression) -> Union | None: ...
|
||||
def __and__(self, other: SetExpression) -> Union: ...
|
||||
def __or__(self, other: SetExpression) -> Union: ...
|
||||
def __invert__(self) -> Union: ...
|
||||
def matches(self, user_group_ids) -> bool: ...
|
||||
def __bool__(self) -> bool: ...
|
||||
def __eq__(self, other: Union) -> bool: ...
|
||||
def __le__(self, other: Union) -> bool: ...
|
||||
def __lt__(self, other: Union) -> bool: ...
|
||||
def __eq__(self, other) -> bool: ...
|
||||
def __le__(self, other: SetExpression) -> bool: ...
|
||||
def __lt__(self, other: SetExpression) -> bool: ...
|
||||
def __str__(self) -> str: ...
|
||||
def __repr__(self) -> str: ...
|
||||
def __hash__(self): ...
|
||||
@@ -67,29 +69,29 @@ class Inter:
|
||||
def is_universal(self) -> bool: ...
|
||||
def matches(self, user_group_ids) -> bool: ...
|
||||
def __and__(self, other: Inter) -> Inter: ...
|
||||
def __eq__(self, other: Inter) -> bool: ...
|
||||
def __eq__(self, other) -> bool: ...
|
||||
def __le__(self, other: Inter) -> bool: ...
|
||||
def __lt__(self, other: Inter) -> bool: ...
|
||||
def __hash__(self): ...
|
||||
|
||||
class Leaf:
|
||||
id: ...
|
||||
ref: ...
|
||||
id: LeafIdType
|
||||
ref: str | int
|
||||
negative: bool
|
||||
key: ...
|
||||
subsets: set
|
||||
supersets: set
|
||||
disjoints: set
|
||||
key: tuple[LeafIdType, bool]
|
||||
subsets: set[LeafIdType]
|
||||
supersets: set[LeafIdType]
|
||||
disjoints: set[LeafIdType]
|
||||
inverse: Leaf | None
|
||||
def __init__(
|
||||
self, leaf_id, ref: Any | None = ..., negative: bool = ...
|
||||
self, leaf_id: LeafIdType, ref: str | int | None = ..., negative: bool = ...
|
||||
) -> None: ...
|
||||
def __invert__(self): ...
|
||||
def __invert__(self) -> Leaf: ...
|
||||
def is_empty(self) -> bool: ...
|
||||
def is_universal(self) -> bool: ...
|
||||
def isdisjoint(self, other: Leaf) -> bool: ...
|
||||
def matches(self, user_group_ids): ...
|
||||
def __eq__(self, other: Leaf) -> bool: ...
|
||||
def matches(self, user_group_ids: Collection[int]) -> bool: ...
|
||||
def __eq__(self, other) -> bool: ...
|
||||
def __le__(self, other: Leaf) -> bool: ...
|
||||
def __lt__(self, other: Leaf) -> bool: ...
|
||||
def __hash__(self): ...
|
||||
@@ -98,6 +100,7 @@ class UnknownId(str):
|
||||
def __lt__(self, other) -> bool: ...
|
||||
def __gt__(self, other) -> bool: ...
|
||||
|
||||
LeafIdType: int | Literal["*"] | UnknownId
|
||||
UNIVERSAL_LEAF: Leaf
|
||||
EMPTY_LEAF: Leaf
|
||||
EMPTY_INTER: Inter
|
||||
|
||||
@@ -47,18 +47,30 @@ def html_term_converter(value: str) -> str: ...
|
||||
def get_text_content(term: str) -> str: ...
|
||||
def is_text(term: str) -> bool: ...
|
||||
def translate_sql_constraint(cr: Cursor, key: str, lang: str) -> str: ...
|
||||
def get_translation(module: str, lang: str, source: str, args: tuple | dict) -> str: ...
|
||||
def get_translated_module(arg) -> str: ...
|
||||
def get_text_alias(source: str, *args, **kwargs): ...
|
||||
|
||||
class GettextAlias:
|
||||
def __call__(self, source: str, *args, **kwargs) -> str: ...
|
||||
class LazyGettext:
|
||||
def __init__(
|
||||
self, source, *args, _module: str = ..., _default_lang: str = ..., **kwargs
|
||||
) -> None: ...
|
||||
def __repr__(self) -> str: ...
|
||||
def __str__(self) -> str: ...
|
||||
def __eq__(self, other): ...
|
||||
def __hash__(self): ...
|
||||
def __lt__(self, other): ...
|
||||
def __add__(self, other): ...
|
||||
def __radd__(self, other): ...
|
||||
|
||||
class _lt:
|
||||
def __init__(self, source: str, *args, **kwargs) -> None: ...
|
||||
def __eq__(self, other) -> NoReturn: ...
|
||||
def __lt__(self, other) -> NoReturn: ...
|
||||
def __add__(self, other: str | _lt) -> str: ...
|
||||
def __radd__(self, other: str) -> str: ...
|
||||
class LazyTranslate:
|
||||
module: str
|
||||
default_lang: str
|
||||
def __init__(self, module: str, *, default_lang: str = ...) -> None: ...
|
||||
def __call__(self, source: str, *args, **kwargs) -> LazyGettext: ...
|
||||
|
||||
_: GettextAlias
|
||||
_ = get_text_alias
|
||||
_lt = LazyGettext
|
||||
|
||||
def quote(s: str) -> str: ...
|
||||
|
||||
|
||||
Reference in New Issue
Block a user