Module redvox.cloud.data_api
This module contains API definitions and functions for working with raw RedVox data packets.
Expand source code
"""
This module contains API definitions and functions for working with raw RedVox data packets.
"""
from dataclasses import dataclass
from enum import Enum
from multiprocessing.queues import Queue
from typing import Callable, List, Optional, Tuple
from dataclasses_json import dataclass_json
import requests
from redvox.cloud.api import post_req
from redvox.cloud.config import RedVoxConfig
import redvox.cloud.data_io as data_io
import redvox.cloud.data_client as data_client
from redvox.cloud.routes import RoutesV1
@dataclass_json
@dataclass
class ReportDataReq:
"""
A request for a signed URL to a RedVox report distribution.
"""
auth_token: str
report_id: str
secret_token: Optional[str] = None
@dataclass_json
@dataclass
class ReportDataResp:
"""
Response for a report signed URL.
"""
signed_url: str
def download_buf(self, retries: int = 3) -> Optional[bytes]:
"""
Downloads the zip compressed report data and returns it as a byte buffer.
:param retries: Number of times to retry the download of failure.
:return: Bytes of the compressed report data.
"""
return data_io.get_file(self.signed_url, retries)
def download_fs(self, out_dir: str, retries: int = 3) -> Tuple[str, int]:
"""
Downloads the zip compressed report data to the file system.
:param out_dir: Output directory to download data to.
:param retries: Number of times to retry the download on failure.
:return: A tuple containing the file name and the number of bytes written.
"""
return data_io.download_file(
self.signed_url, requests.Session(), out_dir, retries
)
@dataclass_json
@dataclass
class DataRangeReq:
"""
Definition of data range request.
"""
auth_token: str
start_ts_s: int
end_ts_s: int
redvox_ids: List[str]
secret_token: Optional[str] = None
@dataclass_json
@dataclass
class DataRangeResp:
"""
Definition of a data range response.
"""
signed_urls: List[str]
def download_fs(self, out_dir: str, retries: int = 3, out_queue: Optional[Queue] = None) -> None:
"""
Download the referenced packets to the provided output directory.
:param out_dir: Output directory to store the downloaded files.
:param retries: Number of times to retry downloading the file on failure.
"""
data_client.download_files(self.signed_urls, out_dir, retries, out_queue=out_queue)
def append(self, other: "DataRangeResp") -> "DataRangeResp":
"""
Combines multiple responses.
:param other: The other response to combine results with.
:return: A modified instance of self.
"""
self.signed_urls.extend(other.signed_urls)
return self
def request_report_data(
redvox_config: RedVoxConfig,
report_data_req: ReportDataReq,
session: Optional[requests.Session] = None,
timeout: Optional[float] = None,
) -> Optional[ReportDataResp]:
"""
Makes an API call to generate a signed URL of a RedVox report.
:param redvox_config: An API config.
:param report_data_req: The request.
:param session: An (optional) session for re-using an HTTP client.
:param timeout: An (optional) timeout.
:return: The response.
"""
# noinspection Mypy
# pylint: disable=E1101
handle_resp: Callable[
[requests.Response], ReportDataResp
] = lambda resp: ReportDataResp.from_dict(resp.json())
return post_req(
redvox_config,
RoutesV1.DATA_REPORT_REQ,
report_data_req,
handle_resp,
session,
timeout,
)
class DataRangeReqType(Enum):
"""
Type of RedVox data to be requested.
"""
API_900: str = "API_900"
API_1000: str = "API_1000"
API_900_1000: str = "API_900_1000"
def request_range_data(
redvox_config: RedVoxConfig,
data_range_req: DataRangeReq,
session: Optional[requests.Session] = None,
timeout: Optional[float] = None,
req_type: DataRangeReqType = DataRangeReqType.API_900,
) -> DataRangeResp:
"""
Requests signed URLs for a range of RedVox packets.
:param redvox_config: An API config.
:param data_range_req: The request.
:param session: An (optional) session for re-using an HTTP client.
:param timeout: An (optional) timeout.
:param req_type: (Optional) defines which type of RedVox data should be requested
:return: A DataRangeResp.
"""
# noinspection Mypy
# pylint: disable=E1101
handle_resp: Callable[
[requests.Response], DataRangeResp
] = lambda resp: DataRangeResp.from_dict(resp.json())
# API 900
if req_type == DataRangeReqType.API_900:
res: Optional[DataRangeResp] = post_req(
redvox_config,
RoutesV1.DATA_RANGE_REQ,
data_range_req,
handle_resp,
session,
timeout,
)
return res if res else DataRangeResp([])
# API 1000
elif req_type == DataRangeReqType.API_1000:
res = post_req(
redvox_config,
RoutesV1.DATA_RANGE_REQ_M,
data_range_req,
handle_resp,
session,
timeout,
)
return res if res else DataRangeResp([])
# API 900 and 1000
else:
res_900: Optional[DataRangeResp] = post_req(
redvox_config,
RoutesV1.DATA_RANGE_REQ,
data_range_req,
handle_resp,
session,
timeout,
)
res_1000: Optional[DataRangeResp] = post_req(
redvox_config,
RoutesV1.DATA_RANGE_REQ_M,
data_range_req,
handle_resp,
session,
timeout,
)
res_900_final: DataRangeResp = DataRangeResp([]) if res_900 is None else res_900
res_1000_final: DataRangeResp = (
DataRangeResp([]) if res_1000 is None else res_1000
)
return res_900_final.append(res_1000_final)
Functions
def request_range_data(redvox_config: RedVoxConfig, data_range_req: DataRangeReq, session: Optional[requests.sessions.Session] = None, timeout: Optional[float] = None, req_type: DataRangeReqType = DataRangeReqType.API_900) ‑> DataRangeResp
-
Requests signed URLs for a range of RedVox packets. :param redvox_config: An API config. :param data_range_req: The request. :param session: An (optional) session for re-using an HTTP client. :param timeout: An (optional) timeout. :param req_type: (Optional) defines which type of RedVox data should be requested :return: A DataRangeResp.
Expand source code
def request_range_data( redvox_config: RedVoxConfig, data_range_req: DataRangeReq, session: Optional[requests.Session] = None, timeout: Optional[float] = None, req_type: DataRangeReqType = DataRangeReqType.API_900, ) -> DataRangeResp: """ Requests signed URLs for a range of RedVox packets. :param redvox_config: An API config. :param data_range_req: The request. :param session: An (optional) session for re-using an HTTP client. :param timeout: An (optional) timeout. :param req_type: (Optional) defines which type of RedVox data should be requested :return: A DataRangeResp. """ # noinspection Mypy # pylint: disable=E1101 handle_resp: Callable[ [requests.Response], DataRangeResp ] = lambda resp: DataRangeResp.from_dict(resp.json()) # API 900 if req_type == DataRangeReqType.API_900: res: Optional[DataRangeResp] = post_req( redvox_config, RoutesV1.DATA_RANGE_REQ, data_range_req, handle_resp, session, timeout, ) return res if res else DataRangeResp([]) # API 1000 elif req_type == DataRangeReqType.API_1000: res = post_req( redvox_config, RoutesV1.DATA_RANGE_REQ_M, data_range_req, handle_resp, session, timeout, ) return res if res else DataRangeResp([]) # API 900 and 1000 else: res_900: Optional[DataRangeResp] = post_req( redvox_config, RoutesV1.DATA_RANGE_REQ, data_range_req, handle_resp, session, timeout, ) res_1000: Optional[DataRangeResp] = post_req( redvox_config, RoutesV1.DATA_RANGE_REQ_M, data_range_req, handle_resp, session, timeout, ) res_900_final: DataRangeResp = DataRangeResp([]) if res_900 is None else res_900 res_1000_final: DataRangeResp = ( DataRangeResp([]) if res_1000 is None else res_1000 ) return res_900_final.append(res_1000_final)
def request_report_data(redvox_config: RedVoxConfig, report_data_req: ReportDataReq, session: Optional[requests.sessions.Session] = None, timeout: Optional[float] = None) ‑> Optional[ReportDataResp]
-
Makes an API call to generate a signed URL of a RedVox report. :param redvox_config: An API config. :param report_data_req: The request. :param session: An (optional) session for re-using an HTTP client. :param timeout: An (optional) timeout. :return: The response.
Expand source code
def request_report_data( redvox_config: RedVoxConfig, report_data_req: ReportDataReq, session: Optional[requests.Session] = None, timeout: Optional[float] = None, ) -> Optional[ReportDataResp]: """ Makes an API call to generate a signed URL of a RedVox report. :param redvox_config: An API config. :param report_data_req: The request. :param session: An (optional) session for re-using an HTTP client. :param timeout: An (optional) timeout. :return: The response. """ # noinspection Mypy # pylint: disable=E1101 handle_resp: Callable[ [requests.Response], ReportDataResp ] = lambda resp: ReportDataResp.from_dict(resp.json()) return post_req( redvox_config, RoutesV1.DATA_REPORT_REQ, report_data_req, handle_resp, session, timeout, )
Classes
class DataRangeReq (auth_token: str, start_ts_s: int, end_ts_s: int, redvox_ids: List[str], secret_token: Optional[str] = None)
-
Definition of data range request.
Expand source code
@dataclass_json @dataclass class DataRangeReq: """ Definition of data range request. """ auth_token: str start_ts_s: int end_ts_s: int redvox_ids: List[str] secret_token: Optional[str] = None
Class variables
var auth_token : str
var end_ts_s : int
var redvox_ids : List[str]
var secret_token : Optional[str]
var start_ts_s : int
Static methods
def from_dict(kvs: Union[dict, list, str, int, float, bool, ForwardRef(None)], *, infer_missing=False) ‑> ~A
-
Expand source code
@classmethod def from_dict(cls: Type[A], kvs: Json, *, infer_missing=False) -> A: return _decode_dataclass(cls, kvs, infer_missing)
def from_json(s: Union[str, bytes, bytearray], *, parse_float=None, parse_int=None, parse_constant=None, infer_missing=False, **kw) ‑> ~A
-
Expand source code
@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)
def schema(*, infer_missing: bool = False, only=None, exclude=(), many: bool = False, context=None, load_only=(), dump_only=(), partial: bool = False, unknown=None) ‑> dataclasses_json.mm.SchemaF[~A]
-
Expand source code
@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: 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)
Methods
def to_dict(self, encode_json=False) ‑> Dict[str, Union[dict, list, str, int, float, bool, ForwardRef(None)]]
-
Expand source code
def to_dict(self, encode_json=False) -> Dict[str, Json]: return _asdict(self, encode_json=encode_json)
def to_json(self, *, skipkeys: bool = False, ensure_ascii: bool = True, check_circular: bool = True, allow_nan: bool = True, indent: Union[int, str, ForwardRef(None)] = None, separators: Tuple[str, str] = None, default: Callable = None, sort_keys: bool = False, **kw) ‑> str
-
Expand source code
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: Tuple[str, str] = None, default: 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)
class DataRangeReqType (value, names=None, *, module=None, qualname=None, type=None, start=1)
-
Type of RedVox data to be requested.
Expand source code
class DataRangeReqType(Enum): """ Type of RedVox data to be requested. """ API_900: str = "API_900" API_1000: str = "API_1000" API_900_1000: str = "API_900_1000"
Ancestors
- enum.Enum
Class variables
var API_1000 : str
var API_900 : str
var API_900_1000 : str
class DataRangeResp (signed_urls: List[str])
-
Definition of a data range response.
Expand source code
@dataclass_json @dataclass class DataRangeResp: """ Definition of a data range response. """ signed_urls: List[str] def download_fs(self, out_dir: str, retries: int = 3, out_queue: Optional[Queue] = None) -> None: """ Download the referenced packets to the provided output directory. :param out_dir: Output directory to store the downloaded files. :param retries: Number of times to retry downloading the file on failure. """ data_client.download_files(self.signed_urls, out_dir, retries, out_queue=out_queue) def append(self, other: "DataRangeResp") -> "DataRangeResp": """ Combines multiple responses. :param other: The other response to combine results with. :return: A modified instance of self. """ self.signed_urls.extend(other.signed_urls) return self
Class variables
var signed_urls : List[str]
Static methods
def from_dict(kvs: Union[dict, list, str, int, float, bool, ForwardRef(None)], *, infer_missing=False) ‑> ~A
-
Expand source code
@classmethod def from_dict(cls: Type[A], kvs: Json, *, infer_missing=False) -> A: return _decode_dataclass(cls, kvs, infer_missing)
def from_json(s: Union[str, bytes, bytearray], *, parse_float=None, parse_int=None, parse_constant=None, infer_missing=False, **kw) ‑> ~A
-
Expand source code
@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)
def schema(*, infer_missing: bool = False, only=None, exclude=(), many: bool = False, context=None, load_only=(), dump_only=(), partial: bool = False, unknown=None) ‑> dataclasses_json.mm.SchemaF[~A]
-
Expand source code
@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: 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)
Methods
def append(self, other: DataRangeResp) ‑> DataRangeResp
-
Combines multiple responses. :param other: The other response to combine results with. :return: A modified instance of self.
Expand source code
def append(self, other: "DataRangeResp") -> "DataRangeResp": """ Combines multiple responses. :param other: The other response to combine results with. :return: A modified instance of self. """ self.signed_urls.extend(other.signed_urls) return self
def download_fs(self, out_dir: str, retries: int = 3, out_queue: Optional[multiprocessing.queues.Queue] = None) ‑> None
-
Download the referenced packets to the provided output directory. :param out_dir: Output directory to store the downloaded files. :param retries: Number of times to retry downloading the file on failure.
Expand source code
def download_fs(self, out_dir: str, retries: int = 3, out_queue: Optional[Queue] = None) -> None: """ Download the referenced packets to the provided output directory. :param out_dir: Output directory to store the downloaded files. :param retries: Number of times to retry downloading the file on failure. """ data_client.download_files(self.signed_urls, out_dir, retries, out_queue=out_queue)
def to_dict(self, encode_json=False) ‑> Dict[str, Union[dict, list, str, int, float, bool, ForwardRef(None)]]
-
Expand source code
def to_dict(self, encode_json=False) -> Dict[str, Json]: return _asdict(self, encode_json=encode_json)
def to_json(self, *, skipkeys: bool = False, ensure_ascii: bool = True, check_circular: bool = True, allow_nan: bool = True, indent: Union[int, str, ForwardRef(None)] = None, separators: Tuple[str, str] = None, default: Callable = None, sort_keys: bool = False, **kw) ‑> str
-
Expand source code
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: Tuple[str, str] = None, default: 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)
class ReportDataReq (auth_token: str, report_id: str, secret_token: Optional[str] = None)
-
A request for a signed URL to a RedVox report distribution.
Expand source code
@dataclass_json @dataclass class ReportDataReq: """ A request for a signed URL to a RedVox report distribution. """ auth_token: str report_id: str secret_token: Optional[str] = None
Class variables
var auth_token : str
var report_id : str
var secret_token : Optional[str]
Static methods
def from_dict(kvs: Union[dict, list, str, int, float, bool, ForwardRef(None)], *, infer_missing=False) ‑> ~A
-
Expand source code
@classmethod def from_dict(cls: Type[A], kvs: Json, *, infer_missing=False) -> A: return _decode_dataclass(cls, kvs, infer_missing)
def from_json(s: Union[str, bytes, bytearray], *, parse_float=None, parse_int=None, parse_constant=None, infer_missing=False, **kw) ‑> ~A
-
Expand source code
@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)
def schema(*, infer_missing: bool = False, only=None, exclude=(), many: bool = False, context=None, load_only=(), dump_only=(), partial: bool = False, unknown=None) ‑> dataclasses_json.mm.SchemaF[~A]
-
Expand source code
@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: 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)
Methods
def to_dict(self, encode_json=False) ‑> Dict[str, Union[dict, list, str, int, float, bool, ForwardRef(None)]]
-
Expand source code
def to_dict(self, encode_json=False) -> Dict[str, Json]: return _asdict(self, encode_json=encode_json)
def to_json(self, *, skipkeys: bool = False, ensure_ascii: bool = True, check_circular: bool = True, allow_nan: bool = True, indent: Union[int, str, ForwardRef(None)] = None, separators: Tuple[str, str] = None, default: Callable = None, sort_keys: bool = False, **kw) ‑> str
-
Expand source code
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: Tuple[str, str] = None, default: 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)
class ReportDataResp (signed_url: str)
-
Response for a report signed URL.
Expand source code
@dataclass_json @dataclass class ReportDataResp: """ Response for a report signed URL. """ signed_url: str def download_buf(self, retries: int = 3) -> Optional[bytes]: """ Downloads the zip compressed report data and returns it as a byte buffer. :param retries: Number of times to retry the download of failure. :return: Bytes of the compressed report data. """ return data_io.get_file(self.signed_url, retries) def download_fs(self, out_dir: str, retries: int = 3) -> Tuple[str, int]: """ Downloads the zip compressed report data to the file system. :param out_dir: Output directory to download data to. :param retries: Number of times to retry the download on failure. :return: A tuple containing the file name and the number of bytes written. """ return data_io.download_file( self.signed_url, requests.Session(), out_dir, retries )
Class variables
var signed_url : str
Static methods
def from_dict(kvs: Union[dict, list, str, int, float, bool, ForwardRef(None)], *, infer_missing=False) ‑> ~A
-
Expand source code
@classmethod def from_dict(cls: Type[A], kvs: Json, *, infer_missing=False) -> A: return _decode_dataclass(cls, kvs, infer_missing)
def from_json(s: Union[str, bytes, bytearray], *, parse_float=None, parse_int=None, parse_constant=None, infer_missing=False, **kw) ‑> ~A
-
Expand source code
@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)
def schema(*, infer_missing: bool = False, only=None, exclude=(), many: bool = False, context=None, load_only=(), dump_only=(), partial: bool = False, unknown=None) ‑> dataclasses_json.mm.SchemaF[~A]
-
Expand source code
@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: 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)
Methods
def download_buf(self, retries: int = 3) ‑> Optional[bytes]
-
Downloads the zip compressed report data and returns it as a byte buffer. :param retries: Number of times to retry the download of failure. :return: Bytes of the compressed report data.
Expand source code
def download_buf(self, retries: int = 3) -> Optional[bytes]: """ Downloads the zip compressed report data and returns it as a byte buffer. :param retries: Number of times to retry the download of failure. :return: Bytes of the compressed report data. """ return data_io.get_file(self.signed_url, retries)
def download_fs(self, out_dir: str, retries: int = 3) ‑> Tuple[str, int]
-
Downloads the zip compressed report data to the file system. :param out_dir: Output directory to download data to. :param retries: Number of times to retry the download on failure. :return: A tuple containing the file name and the number of bytes written.
Expand source code
def download_fs(self, out_dir: str, retries: int = 3) -> Tuple[str, int]: """ Downloads the zip compressed report data to the file system. :param out_dir: Output directory to download data to. :param retries: Number of times to retry the download on failure. :return: A tuple containing the file name and the number of bytes written. """ return data_io.download_file( self.signed_url, requests.Session(), out_dir, retries )
def to_dict(self, encode_json=False) ‑> Dict[str, Union[dict, list, str, int, float, bool, ForwardRef(None)]]
-
Expand source code
def to_dict(self, encode_json=False) -> Dict[str, Json]: return _asdict(self, encode_json=encode_json)
def to_json(self, *, skipkeys: bool = False, ensure_ascii: bool = True, check_circular: bool = True, allow_nan: bool = True, indent: Union[int, str, ForwardRef(None)] = None, separators: Tuple[str, str] = None, default: Callable = None, sort_keys: bool = False, **kw) ‑> str
-
Expand source code
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: Tuple[str, str] = None, default: 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)