Source code for cervmongo.vars

#  vars.py
#
#  Copyright 2020 Anthony "antcer1213" Cervantes <anthony.cervantes@cerver.info>
#
#  MIT License
#
#  Permission is hereby granted, free of charge, to any person obtaining a copy
#  of this software and associated documentation files (the "Software"), to deal
#  in the Software without restriction, including without limitation the rights
#  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
#  copies of the Software, and to permit persons to whom the Software is
#  furnished to do so, subject to the following conditions:
#
#  The above copyright notice and this permission notice shall be included in all
#  copies or substantial portions of the Software.
#
#  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
#  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
#  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
#  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
#  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
#  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
#  SOFTWARE.
#
#
import typing
from enum import Enum
import datetime
from bson.objectid import ObjectId
from pymongo import MongoClient
from dateutil.parser import parse as dateparse

# INFO: Objects
try:
    from pydantic import BaseConfig, BaseModel
    MODEL = typing.NewType("DataModel", BaseModel)
except:
    from dataclasses import dataclass
    MODEL = typing.NewType("DataModel", dataclass)

# INFO: Custom Types
MONGODB_URI = typing.NewType("MongoDB URI", str)
YAML = typing.NewType("YAML Document", str)
JSON = typing.NewType("JSON Document", str)
ENUM = typing.NewType("Enum", Enum)

# INFO: Static
ASCENDING = 1
DESCENDING = -1

# INFO: Fields
OBJECT_ID = OBJ_ID = ObjectId
DOC_ID = typing.NewType("Document ID", OBJ_ID)
DETAILS = typing.NewType("Meta Details", dict)

[docs]class StringEnum(str, Enum): pass
[docs]class IntEnum(int, Enum): pass
# NOTE: defaults to recommended fields; overwrite depending on your schema, use utils.generate_enum PAGINATION_SORT_FIELDS = Enum(value="Pagination Sort Fields", names=[(item, item) for item in ("_id", "created_datetime", "updated_datetime")])
[docs]class ObjectIdStr(str): @classmethod def __get_validators__(cls): yield cls.validate
[docs] @classmethod def validate(cls, v): if not isinstance(v, ObjectId): raise ValueError("Not a valid ObjectId") return str(v)
[docs]def str2bool(v): return str(v).lower() in ("yes", "true", "t", "1")
[docs]def str2datetime(v): if isinstance(v, (datetime.date, datetime,datetime)): return v else: return dateparse(v)
TYPES = {} TYPES["str"] = str TYPES["float"] = float TYPES["int"] = int TYPES["abs"] = abs TYPES["dict"] = dict TYPES["oid"] = ObjectId TYPES["bool"] = ObjectId TYPES["date"] = TYPES["datetime"] = str2datetime TYPES["bool"] = str2bool SCHEMA_TYPES = {} SCHEMA_TYPES["str"] = SCHEMA_TYPES["string"] = SCHEMA_TYPES["text"] = "str" SCHEMA_TYPES["number"] = SCHEMA_TYPES["num"] = SCHEMA_TYPES["decimal"] = SCHEMA_TYPES["float"] = "float" SCHEMA_TYPES["int"] = SCHEMA_TYPES["integer"] = "int" SCHEMA_TYPES["absolute"] = SCHEMA_TYPES["abs"] = "abs" SCHEMA_TYPES["object"] = SCHEMA_TYPES["dict"] = SCHEMA_TYPES["obj"] = "dict" SCHEMA_TYPES["oid"] = SCHEMA_TYPES["objectid"] = SCHEMA_TYPES["object_id"] = "oid" SCHEMA_TYPES["date"] = "date" SCHEMA_TYPES["datetime"] = "datetime" SCHEMA_TYPES["bool"] = SCHEMA_TYPES["boolean"] = "bool"