diff --git a/requirements_dev.txt b/requirements_dev.txt index cd5180d..8634111 100644 --- a/requirements_dev.txt +++ b/requirements_dev.txt @@ -6,3 +6,4 @@ coverage Sphinx pytest pytest-cov +mypy diff --git a/setup.py b/setup.py index c517bc8..b01f197 100755 --- a/setup.py +++ b/setup.py @@ -29,6 +29,37 @@ url='https://github.com/touilleMan/umongo', packages=['umongo', 'umongo.frameworks'], include_package_data=True, + package_data={ + 'umongo': [ + "py.typed", + "__init__.pyi", + "abstract.pyi", + "builder.pyi", + "data_objects.pyi", + "data_proxy.pyi", + "document.pyi", + "embedded_document.pyi", + "exceptions.pyi", + "expose_missing.pyi", + "fields.pyi", + "i18n.pyi", + "indexes.pyi", + "instance.pyi", + "marshmallow_bonus.pyi", + "mixin.pyi", + "query_wrapper.pyi", + "template.pyi", + "validate.pyi", + ], + 'umongo.frameworks': [ + "__init__.pyi", + "mongomock.pyi", + "motor_asyncio.pyi", + "pymongo.pyi", + "tools.pyi", + "txmongo.pyi", + ] + }, python_requires='>=3.7', install_requires=requirements, extras_require={ diff --git a/umongo/__init__.pyi b/umongo/__init__.pyi new file mode 100644 index 0000000..2645ee2 --- /dev/null +++ b/umongo/__init__.pyi @@ -0,0 +1,28 @@ +from . import fields as fields, validate as validate +from .data_objects import Reference as Reference +from .document import ( + Document as Document, + post_dump as post_dump, + post_load as post_load, + pre_dump as pre_dump, + pre_load as pre_load, + validates_schema as validates_schema, +) +from .embedded_document import EmbeddedDocument as EmbeddedDocument +from .exceptions import ( + AlreadyCreatedError as AlreadyCreatedError, + DeleteError as DeleteError, + NoneReferenceError as NoneReferenceError, + NotCreatedError as NotCreatedError, + UMongoError as UMongoError, + UnknownFieldInDBError as UnknownFieldInDBError, + UpdateError as UpdateError, +) +from .expose_missing import ( + ExposeMissing as ExposeMissing, + RemoveMissingSchema as RemoveMissingSchema, +) +from .i18n import set_gettext as set_gettext +from .instance import Instance as Instance +from .mixin import MixinDocument as MixinDocument +from marshmallow import ValidationError as ValidationError, missing as missing diff --git a/umongo/abstract.pyi b/umongo/abstract.pyi new file mode 100644 index 0000000..337e276 --- /dev/null +++ b/umongo/abstract.pyi @@ -0,0 +1,52 @@ +import marshmallow as ma +from .expose_missing import RemoveMissingSchema +from typing import Any, Optional +import abc + +class I18nErrorDict(dict): + def __getitem__(self, name): ... + +class BaseMarshmallowSchema(RemoveMissingSchema): + class Meta: + ordered: bool + +class BaseSchema(ma.Schema): + MA_BASE_SCHEMA_CLS: Any + class Meta: + ordered: bool + error_messages: Any + def __init__(self, *args, **kwargs) -> None: ... + def map_to_field(self, func) -> None: ... + def as_marshmallow_schema(self): ... + +class BaseField(ma.fields.Field): + default_error_messages: Any + MARSHMALLOW_ARGS_PREFIX: str + error_messages: Any + io_validate: Any + io_validate_recursive: Any + unique: Any + instance: Any + def __init__( + self, + *args, + io_validate: Optional[Any] = ..., + unique: bool = ..., + instance: Optional[Any] = ..., + **kwargs + ) -> None: ... + def serialize_to_mongo(self, obj): ... + def deserialize_from_mongo(self, value): ... + def as_marshmallow_field(self): ... + +class BaseValidator(ma.validate.Validator, metaclass=abc.ABCMeta): + def __init__(self, *args, **kwargs) -> None: ... + +class BaseDataObject: + def is_modified(self) -> None: ... + def clear_modified(self) -> None: ... + @classmethod + def build_from_mongo(cls, data): ... + def from_mongo(self, data): ... + def to_mongo(self, update: bool = ...): ... + def dump(self): ... diff --git a/umongo/builder.pyi b/umongo/builder.pyi new file mode 100644 index 0000000..f5a9af5 --- /dev/null +++ b/umongo/builder.pyi @@ -0,0 +1,35 @@ +from . import fields as fields +from .abstract import BaseSchema as BaseSchema +from .data_proxy import data_proxy_factory as data_proxy_factory +from .document import ( + DocumentImplementation as DocumentImplementation, + DocumentOpts as DocumentOpts, + DocumentTemplate as DocumentTemplate, +) +from .embedded_document import ( + EmbeddedDocumentImplementation as EmbeddedDocumentImplementation, + EmbeddedDocumentOpts as EmbeddedDocumentOpts, + EmbeddedDocumentTemplate as EmbeddedDocumentTemplate, +) +from .exceptions import ( + DocumentDefinitionError as DocumentDefinitionError, + NotRegisteredDocumentError as NotRegisteredDocumentError, +) +from .mixin import ( + MixinDocumentImplementation as MixinDocumentImplementation, + MixinDocumentOpts as MixinDocumentOpts, + MixinDocumentTemplate as MixinDocumentTemplate, +) +from .template import Implementation as Implementation, Template as Template +from typing import Any + +TEMPLATE_IMPLEMENTATION_MAPPING: Any +TEMPLATE_OPTIONS_MAPPING: Any + +def camel_to_snake(name): ... + +class BaseBuilder: + BASE_DOCUMENT_CLS: Any + instance: Any + def __init__(self, instance) -> None: ... + def build_from_template(self, template): ... diff --git a/umongo/data_objects.pyi b/umongo/data_objects.pyi new file mode 100644 index 0000000..5aa9472 --- /dev/null +++ b/umongo/data_objects.pyi @@ -0,0 +1,27 @@ +from .abstract import BaseDataObject as BaseDataObject +from typing import Any, Optional, Coroutine + +class List(BaseDataObject, list): + inner_field: Any + def __init__(self, inner_field, *args, **kwargs) -> None: ... + def is_modified(self): ... + def set_modified(self) -> None: ... + def clear_modified(self) -> None: ... + +class Dict(BaseDataObject, dict): + key_field: Any + value_field: Any + def __init__(self, key_field, value_field, *args, **kwargs) -> None: ... + def is_modified(self): ... + def set_modified(self) -> None: ... + def clear_modified(self) -> None: ... + +class Reference: + error_messages: Any + document_cls: Any + pk: Any + def __init__(self, document_cls, pk) -> None: ... + def fetch( + self, no_data: bool = ..., force_reload: bool = ... + ) -> Optional[Coroutine[Any, Any, Any]]: ... + def __eq__(self, other): ... diff --git a/umongo/data_proxy.pyi b/umongo/data_proxy.pyi new file mode 100644 index 0000000..aea6a04 --- /dev/null +++ b/umongo/data_proxy.pyi @@ -0,0 +1,29 @@ +from .abstract import BaseDataObject as BaseDataObject +from .exceptions import UnknownFieldInDBError as UnknownFieldInDBError +from typing import Any, Optional + +class BaseDataProxy: + schema: Any + def __init__(self, data: Optional[Any] = ...) -> None: ... + def to_mongo(self, update: bool = ...): ... + def from_mongo(self, data) -> None: ... + def dump(self): ... + def update(self, data) -> None: ... + def load(self, data) -> None: ... + def get(self, name): ... + def set(self, name, value) -> None: ... + def delete(self, name) -> None: ... + def __eq__(self, other): ... + def get_modified_fields(self): ... + def clear_modified(self) -> None: ... + def is_modified(self): ... + def required_validate(self) -> None: ... + def items(self): ... + def keys(self): ... + def values(self): ... + +class BaseNonStrictDataProxy(BaseDataProxy): + def __init__(self, data: Optional[Any] = ...) -> None: ... + def from_mongo(self, data) -> None: ... + +def data_proxy_factory(basename, schema, strict: bool = ...): ... diff --git a/umongo/document.pyi b/umongo/document.pyi new file mode 100644 index 0000000..3b2f416 --- /dev/null +++ b/umongo/document.pyi @@ -0,0 +1,74 @@ +from .embedded_document import EmbeddedDocumentImplementation +from .template import MetaImplementation, Template +from marshmallow import ( + post_dump as post_dump, + post_load as post_load, + pre_dump as pre_dump, + pre_load as pre_load, + validates_schema as validates_schema, +) +from typing import Any, Optional + +class DocumentTemplate(Template): ... + +Document = DocumentTemplate + +class DocumentOpts: + instance: Any + template: Any + collection_name: Any + abstract: Any + indexes: Any + is_child: Any + strict: Any + offspring: Any + def __init__( + self, + instance, + template, + collection_name: Optional[Any] = ..., + abstract: bool = ..., + indexes: Optional[Any] = ..., + is_child: bool = ..., + strict: bool = ..., + offspring: Optional[Any] = ..., + ) -> None: ... + +class MetaDocumentImplementation(MetaImplementation): + def __init__(cls, *args, **kwargs) -> None: ... + @property + def collection(cls): ... + @property + def indexes(cls): ... + +class DocumentImplementation( + EmbeddedDocumentImplementation, metaclass=MetaDocumentImplementation +): + opts: Any + is_created: bool + def __init__(self, **kwargs) -> None: ... + def __eq__(self, other): ... + def clone(self): ... + @property + def collection(self): ... + @property + def pk(self): ... + @property + def dbref(self): ... + @classmethod + def build_from_mongo(cls, data, use_cls: bool = ...): ... + def from_mongo(self, data) -> None: ... + def to_mongo(self, update: bool = ...): ... + def update(self, data) -> None: ... + def dump(self): ... + def is_modified(self): ... + def __setitem__(self, name, value) -> None: ... + def __delitem__(self, name) -> None: ... + def __setattr__(self, name, value) -> None: ... + def __delattr__(self, name) -> None: ... + def pre_insert(self) -> None: ... + def pre_update(self) -> None: ... + def pre_delete(self) -> None: ... + def post_insert(self, ret) -> None: ... + def post_update(self, ret) -> None: ... + def post_delete(self, ret) -> None: ... diff --git a/umongo/embedded_document.pyi b/umongo/embedded_document.pyi new file mode 100644 index 0000000..183e336 --- /dev/null +++ b/umongo/embedded_document.pyi @@ -0,0 +1,45 @@ +from .data_objects import BaseDataObject +from .template import Implementation, Template +from typing import Any, Optional + +class EmbeddedDocumentTemplate(Template): ... + +EmbeddedDocument = EmbeddedDocumentTemplate + +class EmbeddedDocumentOpts: + instance: Any + template: Any + abstract: Any + is_child: Any + strict: Any + offspring: Any + def __init__( + self, + instance, + template, + abstract: bool = ..., + is_child: bool = ..., + strict: bool = ..., + offspring: Optional[Any] = ..., + ) -> None: ... + +class EmbeddedDocumentImplementation(Implementation, BaseDataObject): + opts: Any + def __init__(self, **kwargs) -> None: ... + def __eq__(self, other): ... + def is_modified(self): ... + def clear_modified(self) -> None: ... + def required_validate(self) -> None: ... + @classmethod + def build_from_mongo(cls, data, use_cls: bool = ...): ... + def from_mongo(self, data) -> None: ... + def to_mongo(self, update: bool = ...): ... + def update(self, data): ... + def dump(self): ... + def items(self): ... + def __getitem__(self, name): ... + def __delitem__(self, name) -> None: ... + def __setitem__(self, name, value) -> None: ... + def __setattr__(self, name, value) -> None: ... + def __getattr__(self, name): ... + def __delattr__(self, name) -> None: ... diff --git a/umongo/exceptions.pyi b/umongo/exceptions.pyi new file mode 100644 index 0000000..3b4bb48 --- /dev/null +++ b/umongo/exceptions.pyi @@ -0,0 +1,13 @@ +class UMongoError(Exception): ... +class NoCompatibleInstanceError(UMongoError): ... +class AbstractDocumentError(UMongoError): ... +class DocumentDefinitionError(UMongoError): ... +class NoDBDefinedError(UMongoError): ... +class NotRegisteredDocumentError(UMongoError): ... +class AlreadyRegisteredDocumentError(UMongoError): ... +class UpdateError(UMongoError): ... +class DeleteError(UMongoError): ... +class AlreadyCreatedError(UMongoError): ... +class NotCreatedError(UMongoError): ... +class NoneReferenceError(UMongoError): ... +class UnknownFieldInDBError(UMongoError): ... diff --git a/umongo/expose_missing.pyi b/umongo/expose_missing.pyi new file mode 100644 index 0000000..13a7742 --- /dev/null +++ b/umongo/expose_missing.pyi @@ -0,0 +1,11 @@ +import marshmallow as ma +from contextlib import AbstractContextManager +from typing import Any + +class ExposeMissing(AbstractContextManager): + token: Any + def __enter__(self) -> None: ... + def __exit__(self, *args, **kwargs) -> None: ... + +class RemoveMissingSchema(ma.Schema): + def dump(self, *args, **kwargs): ... diff --git a/umongo/fields.pyi b/umongo/fields.pyi new file mode 100644 index 0000000..3cb6d35 --- /dev/null +++ b/umongo/fields.pyi @@ -0,0 +1,58 @@ +import marshmallow as ma +from . import marshmallow_bonus as ma_bonus_fields +from .abstract import BaseField +from typing import Any + +class StringField(BaseField, ma.fields.String): ... +class UUIDField(BaseField, ma.fields.UUID): ... +class NumberField(BaseField, ma.fields.Number): ... +class IntegerField(BaseField, ma.fields.Integer): ... +class DecimalField(BaseField, ma.fields.Decimal): ... +class BooleanField(BaseField, ma.fields.Boolean): ... +class FloatField(BaseField, ma.fields.Float): ... +class DateTimeField(BaseField, ma.fields.DateTime): ... +class NaiveDateTimeField(BaseField, ma.fields.NaiveDateTime): ... +class AwareDateTimeField(BaseField, ma.fields.AwareDateTime): ... +class DateField(BaseField, ma.fields.Date): ... +class UrlField(BaseField, ma.fields.Url): ... +class EmailField(BaseField, ma.fields.Email): ... +class ConstantField(BaseField, ma.fields.Constant): ... + +class DictField(BaseField, ma.fields.Dict): + default: Any + missing: Any + def __init__(self, *args, **kwargs): ... + def as_marshmallow_field(self): ... + +class ListField(BaseField, ma.fields.List): + default: Any + missing: Any + def __init__(self, *args, **kwargs): ... + def map_to_field(self, mongo_path, path, func) -> None: ... + def as_marshmallow_field(self): ... + +URLField = UrlField +StrField = StringField +BoolField = BooleanField +IntField = IntegerField + +class ObjectIdField(BaseField, ma_bonus_fields.ObjectId): ... + +class ReferenceField(BaseField, ma_bonus_fields.Reference): + reference_cls: Any + document: Any + def __init__(self, document, *args, reference_cls=..., **kwargs) -> None: ... + @property + def document_cls(self): ... + +class GenericReferenceField(BaseField, ma_bonus_fields.GenericReference): + reference_cls: Any + def __init__(self, *args, reference_cls=..., **kwargs) -> None: ... + +class EmbeddedField(BaseField, ma.fields.Nested): + embedded_document: Any + def __init__(self, embedded_document, *args, **kwargs) -> None: ... + @property + def embedded_document_cls(self): ... + def map_to_field(self, mongo_path, path, func) -> None: ... + def as_marshmallow_field(self): ... diff --git a/umongo/frameworks/__init__.pyi b/umongo/frameworks/__init__.pyi new file mode 100644 index 0000000..c7bbbde --- /dev/null +++ b/umongo/frameworks/__init__.pyi @@ -0,0 +1,17 @@ +from .mongomock import MongoMockInstance as MongoMockInstance +from .motor_asyncio import MotorAsyncIOInstance as MotorAsyncIOInstance +from .pymongo import PyMongoInstance as PyMongoInstance +from .txmongo import TxMongoInstance as TxMongoInstance +from typing import Any + +class InstanceRegisterer: + instances: Any + def __init__(self) -> None: ... + def register(self, instance) -> None: ... + def unregister(self, instance) -> None: ... + def find_from_db(self, db): ... + +default_instance_registerer: Any +register_instance: Any +unregister_instance: Any +find_instance_from_db: Any diff --git a/umongo/frameworks/mongomock.pyi b/umongo/frameworks/mongomock.pyi new file mode 100644 index 0000000..adb296b --- /dev/null +++ b/umongo/frameworks/mongomock.pyi @@ -0,0 +1,26 @@ +from ..document import DocumentImplementation as DocumentImplementation +from ..instance import Instance as Instance +from .pymongo import ( + BaseWrappedCursor as BaseWrappedCursor, + PyMongoBuilder as PyMongoBuilder, + PyMongoDocument as PyMongoDocument, +) +from typing import Any + +# FIXME Should inherit from mongomock.Cursor, but mongomock might not be installed +# There might be some missing attributes +class WrappedCursor(BaseWrappedCursor): + def __len__(self) -> int: ... + def __contains__(self, x: object) -> bool: ... + +class MongoMockDocument(PyMongoDocument): + cursor_cls: Any + opts: Any + +class MongoMockBuilder(PyMongoBuilder): + BASE_DOCUMENT_CLS: Any + +class MongoMockInstance(Instance): + BUILDER_CLS: Any + @staticmethod + def is_compatible_with(db): ... diff --git a/umongo/frameworks/motor_asyncio.pyi b/umongo/frameworks/motor_asyncio.pyi new file mode 100644 index 0000000..3fb8d2b --- /dev/null +++ b/umongo/frameworks/motor_asyncio.pyi @@ -0,0 +1,76 @@ +from ..builder import BaseBuilder as BaseBuilder +from ..data_objects import Reference as Reference +from ..document import DocumentImplementation as DocumentImplementation +from ..exceptions import ( + DeleteError as DeleteError, + NoneReferenceError as NoneReferenceError, + NotCreatedError as NotCreatedError, + UpdateError as UpdateError, +) +from ..fields import ( + DictField as DictField, + EmbeddedField as EmbeddedField, + ListField as ListField, + ReferenceField as ReferenceField, +) +from ..instance import Instance as Instance +from ..query_mapper import map_query as map_query +from .tools import ( + cook_find_filter as cook_find_filter, + remove_cls_field_from_embedded_docs as remove_cls_field_from_embedded_docs, +) +from typing import Any, Optional, Type + +SESSION: Any + +# FIXME: Should inherit from motor_asyncio.AsyncIOMotorCursor, but motor might not be installed +class WrappedCursor: + def __init__(self, document_cls, cursor) -> None: ... + def __getattr__(self, name): ... + def __setattr__(self, name, value): ... + def clone(self): ... + async def next(self): ... + __anext__: Any + def next_object(self): ... + def each(self, callback): ... + def to_list(self, length, callback: Optional[Any] = ...): ... + +class MotorAsyncIODocument(DocumentImplementation): + opts: Any + async def reload(self) -> None: ... + is_created: bool + async def commit( + self, + io_validate_all: bool = ..., + conditions: Optional[Any] = ..., + replace: bool = ..., + ): ... + async def delete(self, conditions: Optional[Any] = ...): ... + async def remove(self, conditions: Optional[Any] = ...): ... + async def io_validate(self, validate_all: bool = ...): ... + @classmethod + async def find_one(cls, filter: Optional[Any] = ..., *args, **kwargs): ... + @classmethod + def find(cls, filter: Optional[Any] = ..., *args, **kwargs): ... + @classmethod + async def count_documents( + cls, filter: Optional[Any] = ..., *, with_limit_and_skip: bool = ..., **kwargs + ): ... + @classmethod + async def ensure_indexes(cls) -> None: ... + +class MotorAsyncIOReference(Reference): + def __init__(self, *args, **kwargs) -> None: ... + async def fetch(self, no_data: bool = ..., force_reload: bool = ...): ... + +class MotorAsyncIOBuilder(BaseBuilder): + BASE_DOCUMENT_CLS: Any + +class MotorAsyncIOInstance(Instance): + BUILDER_CLS: Any + @staticmethod + def is_compatible_with(db): ... + async def session(self) -> None: ... + +class MotorAsyncIOMigrationInstance(MotorAsyncIOInstance): + async def migrate_2_to_3(self) -> None: ... diff --git a/umongo/frameworks/pymongo.pyi b/umongo/frameworks/pymongo.pyi new file mode 100644 index 0000000..1ce9045 --- /dev/null +++ b/umongo/frameworks/pymongo.pyi @@ -0,0 +1,77 @@ +from ..builder import BaseBuilder as BaseBuilder +from ..data_objects import Reference as Reference +from ..document import DocumentImplementation as DocumentImplementation, DocumentTemplate +from ..exceptions import ( + DeleteError as DeleteError, + NoneReferenceError as NoneReferenceError, + NotCreatedError as NotCreatedError, + UpdateError as UpdateError, +) +from ..fields import ( + DictField as DictField, + EmbeddedField as EmbeddedField, + ListField as ListField, + ReferenceField as ReferenceField, +) +from ..instance import Instance as Instance, TDocImpl +from ..query_mapper import map_query as map_query +from .tools import ( + cook_find_filter as cook_find_filter, + remove_cls_field_from_embedded_docs as remove_cls_field_from_embedded_docs, +) +from typing import Any, Optional, TypeVar, Dict, Type, Collection, Iterator +import abc + +SESSION: Any + +class BaseWrappedCursor(Collection[TDocImpl], metaclass=abc.ABCMeta): + def __init__(self, document_cls, cursor, *args, **kwargs) -> None: ... + def __getattr__(self, name): ... + def __setattr__(self, name, value): ... + def __getitem__(self, index: int) -> TDocImpl: ... + def __next__(self) -> TDocImpl: ... + def __iter__(self) -> Iterator[TDocImpl]: ... + +# FIXME real WrappedCursor inherits from pymongo.cursor.Cursor. +# There might be some missing attributes +class WrappedCursor(BaseWrappedCursor[TDocImpl]): + def __len__(self) -> int: ... + def __contains__(self, x: object) -> bool: ... + +class PyMongoDocument(DocumentImplementation): + cursor_cls: Any + opts: Any + def reload(self) -> None: ... + is_created: bool + def commit( + self, + io_validate_all: bool = ..., + conditions: Optional[Any] = ..., + replace: bool = ..., + ): ... + def delete(self, conditions: Optional[Any] = ...): ... + def io_validate(self, validate_all: bool = ...) -> None: ... + @classmethod + def find_one(cls: Type[TDocImpl], filter: Optional[Dict[str, Any]] = ..., *args, **kwargs) -> Optional[TDocImpl]: ... + @classmethod + def find(cls: Type[TDocImpl], filter: Optional[Dict[str, Any]] = ..., *args, **kwargs) -> WrappedCursor[TDocImpl]: ... + @classmethod + def count_documents(cls, filter: Optional[Any] = ..., **kwargs): ... + @classmethod + def ensure_indexes(cls) -> None: ... + +class PyMongoReference(Reference): + def __init__(self, *args, **kwargs) -> None: ... + def fetch(self, no_data: bool = ..., force_reload: bool = ...): ... + +class PyMongoBuilder(BaseBuilder): + BASE_DOCUMENT_CLS: PyMongoDocument + +class PyMongoInstance(Instance[PyMongoDocument]): + BUILDER_CLS: PyMongoBuilder + @staticmethod + def is_compatible_with(db): ... + def session(self) -> None: ... + +class PyMongoMigrationInstance(PyMongoInstance): + def migrate_2_to_3(self) -> None: ... diff --git a/umongo/frameworks/tools.pyi b/umongo/frameworks/tools.pyi new file mode 100644 index 0000000..62b07e3 --- /dev/null +++ b/umongo/frameworks/tools.pyi @@ -0,0 +1,4 @@ +from ..query_mapper import map_query as map_query + +def cook_find_filter(doc_cls, filter): ... +def remove_cls_field_from_embedded_docs(dict_in, embedded_docs): ... diff --git a/umongo/frameworks/txmongo.pyi b/umongo/frameworks/txmongo.pyi new file mode 100644 index 0000000..c11ba10 --- /dev/null +++ b/umongo/frameworks/txmongo.pyi @@ -0,0 +1,60 @@ +from ..builder import BaseBuilder as BaseBuilder +from ..data_objects import Reference as Reference +from ..document import DocumentImplementation as DocumentImplementation +from ..exceptions import ( + DeleteError as DeleteError, + NoneReferenceError as NoneReferenceError, + NotCreatedError as NotCreatedError, + UpdateError as UpdateError, +) +from ..fields import ( + DictField as DictField, + EmbeddedField as EmbeddedField, + ListField as ListField, + ReferenceField as ReferenceField, +) +from ..instance import Instance as Instance +from ..query_mapper import map_query as map_query +from .tools import ( + cook_find_filter as cook_find_filter, + remove_cls_field_from_embedded_docs as remove_cls_field_from_embedded_docs, +) +from typing import Any, Optional + +class TxMongoDocument(DocumentImplementation): + opts: Any + def reload(self) -> None: ... + is_created: bool + def commit( + self, + io_validate_all: bool = ..., + conditions: Optional[Any] = ..., + replace: bool = ..., + ): ... + def delete(self, conditions: Optional[Any] = ...): ... + def io_validate(self, validate_all: bool = ...): ... + @classmethod + def find_one(cls, filter: Optional[Any] = ..., *args, **kwargs): ... + @classmethod + def find(cls, filter: Optional[Any] = ..., *args, **kwargs): ... + @classmethod + def find_with_cursor(cls, filter: Optional[Any] = ..., *args, **kwargs): ... + @classmethod + def count(cls, filter: Optional[Any] = ..., **kwargs): ... + @classmethod + def ensure_indexes(cls) -> None: ... + +class TxMongoReference(Reference): + def __init__(self, *args, **kwargs) -> None: ... + def fetch(self, no_data: bool = ..., force_reload: bool = ...) -> None: ... + +class TxMongoBuilder(BaseBuilder): + BASE_DOCUMENT_CLS: Any + +class TxMongoInstance(Instance): + BUILDER_CLS: Any + @staticmethod + def is_compatible_with(db): ... + +class TxMongoMigrationInstance(TxMongoInstance): + def migrate_2_to_3(self) -> None: ... diff --git a/umongo/i18n.pyi b/umongo/i18n.pyi new file mode 100644 index 0000000..00ead46 --- /dev/null +++ b/umongo/i18n.pyi @@ -0,0 +1,3 @@ +def gettext(message): ... +def set_gettext(gettext) -> None: ... +def N_(message): ... diff --git a/umongo/indexes.pyi b/umongo/indexes.pyi new file mode 100644 index 0000000..28e2b08 --- /dev/null +++ b/umongo/indexes.pyi @@ -0,0 +1,4 @@ +from typing import Any, Optional + +def explicit_key(index): ... +def parse_index(index, base_compound_field: Optional[Any] = ...): ... diff --git a/umongo/instance.pyi b/umongo/instance.pyi new file mode 100644 index 0000000..7f5fe9a --- /dev/null +++ b/umongo/instance.pyi @@ -0,0 +1,27 @@ +import abc +from .document import DocumentTemplate as DocumentTemplate, DocumentImplementation +from .embedded_document import EmbeddedDocumentTemplate as EmbeddedDocumentTemplate +from .exceptions import ( + AlreadyRegisteredDocumentError as AlreadyRegisteredDocumentError, + NoDBDefinedError as NoDBDefinedError, + NotRegisteredDocumentError as NotRegisteredDocumentError, +) +from .template import get_template as get_template +from typing import Any, Optional, Type, Generic, TypeVar + +TDocImpl = TypeVar("TDocImpl", bound=DocumentImplementation) + +class Instance(abc.ABC, Generic[TDocImpl], metaclass=abc.ABCMeta): + BUILDER_CLS: Any + builder: Any + def __init__(self, db: Optional[Any] = ...) -> None: ... + @classmethod + def from_db(cls, db): ... + def retrieve_document(self, name_or_template): ... + def retrieve_embedded_document(self, name_or_template): ... + def register(self, template: Type[DocumentTemplate]) -> Type[TDocImpl]: ... + @property + def db(self): ... + @abc.abstractmethod + def is_compatible_with(self, db): ... + def set_db(self, db) -> None: ... diff --git a/umongo/marshmallow_bonus.pyi b/umongo/marshmallow_bonus.pyi new file mode 100644 index 0000000..429eea5 --- /dev/null +++ b/umongo/marshmallow_bonus.pyi @@ -0,0 +1,5 @@ +import marshmallow as ma + +class ObjectId(ma.fields.Field): ... +class Reference(ObjectId): ... +class GenericReference(ma.fields.Field): ... diff --git a/umongo/mixin.pyi b/umongo/mixin.pyi new file mode 100644 index 0000000..fc09561 --- /dev/null +++ b/umongo/mixin.pyi @@ -0,0 +1,14 @@ +from .template import Implementation, Template +from typing import Any + +class MixinDocumentTemplate(Template): ... + +MixinDocument = MixinDocumentTemplate + +class MixinDocumentOpts: + instance: Any + template: Any + def __init__(self, instance, template) -> None: ... + +class MixinDocumentImplementation(Implementation): + opts: Any diff --git a/umongo/py.typed b/umongo/py.typed new file mode 100644 index 0000000..e69de29 diff --git a/umongo/query_mapper.pyi b/umongo/query_mapper.pyi new file mode 100644 index 0000000..6e877d6 --- /dev/null +++ b/umongo/query_mapper.pyi @@ -0,0 +1,9 @@ +from umongo.document import DocumentImplementation as DocumentImplementation +from umongo.embedded_document import ( + EmbeddedDocumentImplementation as EmbeddedDocumentImplementation, +) +from umongo.fields import EmbeddedField as EmbeddedField, ListField as ListField + +def map_entry(entry, fields): ... +def map_entry_with_dots(entry, fields): ... +def map_query(query, fields): ... diff --git a/umongo/template.pyi b/umongo/template.pyi new file mode 100644 index 0000000..a5564ad --- /dev/null +++ b/umongo/template.pyi @@ -0,0 +1,18 @@ +from .abstract import BaseMarshmallowSchema as BaseMarshmallowSchema +from typing import Any + +class MetaTemplate(type): + def __new__(cls, name, bases, nmspc): ... + +class Template(metaclass=MetaTemplate): + MA_BASE_SCHEMA_CLS: Any + def __init__(self, *args, **kwargs) -> None: ... + +class MetaImplementation(MetaTemplate): + def __new__(cls, name, bases, nmspc): ... + +class Implementation(metaclass=MetaImplementation): + @property + def opts(self) -> None: ... + +def get_template(template_or_implementation): ... diff --git a/umongo/validate.pyi b/umongo/validate.pyi new file mode 100644 index 0000000..5361d8c --- /dev/null +++ b/umongo/validate.pyi @@ -0,0 +1,13 @@ +import marshmallow as ma +from .abstract import BaseValidator + +class URL(BaseValidator, ma.validate.URL): ... +class Email(BaseValidator, ma.validate.Email): ... +class Range(BaseValidator, ma.validate.Range): ... +class Length(BaseValidator, ma.validate.Length): ... +class Equal(BaseValidator, ma.validate.Equal): ... +class Regexp(BaseValidator, ma.validate.Regexp): ... +class Predicate(BaseValidator, ma.validate.Predicate): ... +class NoneOf(BaseValidator, ma.validate.NoneOf): ... +class OneOf(BaseValidator, ma.validate.OneOf): ... +class ContainsOnly(BaseValidator, ma.validate.ContainsOnly): ...