about summary refs log tree commit diff
path: root/.venv/lib/python3.12/site-packages/dataclasses_json/api.py
diff options
context:
space:
mode:
Diffstat (limited to '.venv/lib/python3.12/site-packages/dataclasses_json/api.py')
-rw-r--r--.venv/lib/python3.12/site-packages/dataclasses_json/api.py153
1 files changed, 153 insertions, 0 deletions
diff --git a/.venv/lib/python3.12/site-packages/dataclasses_json/api.py b/.venv/lib/python3.12/site-packages/dataclasses_json/api.py
new file mode 100644
index 00000000..3481e93f
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/dataclasses_json/api.py
@@ -0,0 +1,153 @@
+import abc
+import json
+from typing import Any, Callable, Dict, List, Optional, Tuple, Type, TypeVar, Union, overload
+
+from dataclasses_json.cfg import config, LetterCase
+from dataclasses_json.core import (Json, _ExtendedEncoder, _asdict,
+                                   _decode_dataclass)
+from dataclasses_json.mm import (JsonData, SchemaType, build_schema)
+from dataclasses_json.undefined import Undefined
+from dataclasses_json.utils import (_handle_undefined_parameters_safe,
+                                    _undefined_parameter_action_safe)
+
+A = TypeVar('A', bound="DataClassJsonMixin")
+T = TypeVar('T')
+Fields = List[Tuple[str, Any]]
+
+
+class DataClassJsonMixin(abc.ABC):
+    """
+    DataClassJsonMixin is an ABC that functions as a Mixin.
+
+    As with other ABCs, it should not be instantiated directly.
+    """
+    dataclass_json_config: Optional[dict] = None
+
+    def to_json(self,
+                *,
+                skipkeys: bool = False,
+                ensure_ascii: bool = True,
+                check_circular: bool = True,
+                allow_nan: bool = True,
+                indent: Optional[Union[int, str]] = None,
+                separators: Optional[Tuple[str, str]] = None,
+                default: Optional[Callable] = None,
+                sort_keys: bool = False,
+                **kw) -> str:
+        return json.dumps(self.to_dict(encode_json=False),
+                          cls=_ExtendedEncoder,
+                          skipkeys=skipkeys,
+                          ensure_ascii=ensure_ascii,
+                          check_circular=check_circular,
+                          allow_nan=allow_nan,
+                          indent=indent,
+                          separators=separators,
+                          default=default,
+                          sort_keys=sort_keys,
+                          **kw)
+
+    @classmethod
+    def from_json(cls: Type[A],
+                  s: JsonData,
+                  *,
+                  parse_float=None,
+                  parse_int=None,
+                  parse_constant=None,
+                  infer_missing=False,
+                  **kw) -> A:
+        kvs = json.loads(s,
+                         parse_float=parse_float,
+                         parse_int=parse_int,
+                         parse_constant=parse_constant,
+                         **kw)
+        return cls.from_dict(kvs, infer_missing=infer_missing)
+
+    @classmethod
+    def from_dict(cls: Type[A],
+                  kvs: Json,
+                  *,
+                  infer_missing=False) -> A:
+        return _decode_dataclass(cls, kvs, infer_missing)
+
+    def to_dict(self, encode_json=False) -> Dict[str, Json]:
+        return _asdict(self, encode_json=encode_json)
+
+    @classmethod
+    def schema(cls: Type[A],
+               *,
+               infer_missing: bool = False,
+               only=None,
+               exclude=(),
+               many: bool = False,
+               context=None,
+               load_only=(),
+               dump_only=(),
+               partial: bool = False,
+               unknown=None) -> "SchemaType[A]":
+        Schema = build_schema(cls, DataClassJsonMixin, infer_missing, partial)
+
+        if unknown is None:
+            undefined_parameter_action = _undefined_parameter_action_safe(cls)
+            if undefined_parameter_action is not None:
+                # We can just make use of the same-named mm keywords
+                unknown = undefined_parameter_action.name.lower()
+
+        return Schema(only=only,
+                      exclude=exclude,
+                      many=many,
+                      context=context,
+                      load_only=load_only,
+                      dump_only=dump_only,
+                      partial=partial,
+                      unknown=unknown)
+
+
+@overload
+def dataclass_json(_cls: None = ..., *, letter_case: Optional[LetterCase] = ...,
+                   undefined: Optional[Union[str, Undefined]] = ...) -> Callable[[Type[T]], Type[T]]: ...
+
+
+@overload
+def dataclass_json(_cls: Type[T], *, letter_case: Optional[LetterCase] = ...,
+                   undefined: Optional[Union[str, Undefined]] = ...) -> Type[T]: ...
+
+
+def dataclass_json(_cls: Optional[Type[T]] = None, *, letter_case: Optional[LetterCase] = None,
+                   undefined: Optional[Union[str, Undefined]] = None) -> Union[Callable[[Type[T]], Type[T]], Type[T]]:
+    """
+    Based on the code in the `dataclasses` module to handle optional-parens
+    decorators. See example below:
+
+    @dataclass_json
+    @dataclass_json(letter_case=LetterCase.CAMEL)
+    class Example:
+        ...
+    """
+
+    def wrap(cls: Type[T]) -> Type[T]:
+        return _process_class(cls, letter_case, undefined)
+
+    if _cls is None:
+        return wrap
+    return wrap(_cls)
+
+
+def _process_class(cls: Type[T], letter_case: Optional[LetterCase],
+                   undefined: Optional[Union[str, Undefined]]) -> Type[T]:
+    if letter_case is not None or undefined is not None:
+        cls.dataclass_json_config = config(letter_case=letter_case,  # type: ignore[attr-defined]
+                                           undefined=undefined)['dataclasses_json']
+
+    cls.to_json = DataClassJsonMixin.to_json  # type: ignore[attr-defined]
+    # unwrap and rewrap classmethod to tag it to cls rather than the literal
+    # DataClassJsonMixin ABC
+    cls.from_json = classmethod(DataClassJsonMixin.from_json.__func__)  # type: ignore[attr-defined]
+    cls.to_dict = DataClassJsonMixin.to_dict  # type: ignore[attr-defined]
+    cls.from_dict = classmethod(DataClassJsonMixin.from_dict.__func__)  # type: ignore[attr-defined]
+    cls.schema = classmethod(DataClassJsonMixin.schema.__func__)  # type: ignore[attr-defined]
+
+    cls.__init__ = _handle_undefined_parameters_safe(cls, kvs=(),  # type: ignore[attr-defined,method-assign]
+                                                     usage="init")
+    # register cls as a virtual subclass of DataClassJsonMixin
+    DataClassJsonMixin.register(cls)
+    return cls