Server IP : 209.38.156.173 / Your IP : 216.73.216.122 [ Web Server : Apache/2.4.52 (Ubuntu) System : Linux lakekumayuhotel 5.15.0-136-generic #147-Ubuntu SMP Sat Mar 15 15:53:30 UTC 2025 x86_64 User : root ( 0) PHP Version : 8.1.2-1ubuntu2.22 Disable Function : NONE Domains : 2 Domains MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : OFF | Sudo : ON | Pkexec : ON Directory : /lib/python3/dist-packages/josepy/__pycache__/ |
Upload File : |
o h9Ra� � @ sV d Z ddlZddlZddlmZ ddlmZ ddlmZm Z G dd� de ejd�ZdS ) zJOSE interfaces.� N��Any)�errors)�Sequence�Mappingc @ s� e Zd ZdZejdefdd��Zdefdd�Ze ejdedd fdd ���Z e d edd fdd��Zd edefdd�Z defdd�Ze dd defdd��ZdS )�JSONDeSerializablea� Interface for (de)serializable JSON objects. Please recall, that standard Python library implements :class:`json.JSONEncoder` and :class:`json.JSONDecoder` that perform translations based on respective :ref:`conversion tables <conversion-table>` that look pretty much like the one below (for complete tables see relevant Python documentation): .. _conversion-table: ====== ====== JSON Python ====== ====== object dict ... ... ====== ====== While the above **conversion table** is about translation of JSON documents to/from the basic Python types only, :class:`JSONDeSerializable` introduces the following two concepts: serialization Turning an arbitrary Python object into Python object that can be encoded into a JSON document. **Full serialization** produces a Python object composed of only basic types as required by the :ref:`conversion table <conversion-table>`. **Partial serialization** (accomplished by :meth:`to_partial_json`) produces a Python object that might also be built from other :class:`JSONDeSerializable` objects. deserialization Turning a decoded Python object (necessarily one of the basic types as required by the :ref:`conversion table <conversion-table>`) into an arbitrary Python object. Serialization produces **serialized object** ("partially serialized object" or "fully serialized object" for partial and full serialization respectively) and deserialization produces **deserialized object**, both usually denoted in the source code as ``jobj``. Wording in the official Python documentation might be confusing after reading the above, but in the light of those definitions, one can view :meth:`json.JSONDecoder.decode` as decoder and deserializer of basic types, :meth:`json.JSONEncoder.default` as serializer of basic types, :meth:`json.JSONEncoder.encode` as serializer and encoder of basic types. One could extend :mod:`json` to support arbitrary object (de)serialization either by: - overriding :meth:`json.JSONDecoder.decode` and :meth:`json.JSONEncoder.default` in subclasses - or passing ``object_hook`` argument (or ``object_hook_pairs``) to :func:`json.load`/:func:`json.loads` or ``default`` argument for :func:`json.dump`/:func:`json.dumps`. Interestingly, ``default`` is required to perform only partial serialization, as :func:`json.dumps` applies ``default`` recursively. This is the idea behind making :meth:`to_partial_json` produce only partial serialization, while providing custom :meth:`json_dumps` that dumps with ``default`` set to :meth:`json_dump_default`. To make further documentation a bit more concrete, please, consider the following imaginatory implementation example:: class Foo(JSONDeSerializable): def to_partial_json(self): return 'foo' @classmethod def from_json(cls, jobj): return Foo() class Bar(JSONDeSerializable): def to_partial_json(self): return [Foo(), Foo()] @classmethod def from_json(cls, jobj): return Bar() �returnc C s t � �)a� Partially serialize. Following the example, **partial serialization** means the following:: assert isinstance(Bar().to_partial_json()[0], Foo) assert isinstance(Bar().to_partial_json()[1], Foo) # in particular... assert Bar().to_partial_json() != ['foo', 'foo'] :raises josepy.errors.SerializationError: in case of any serialization error. :returns: Partially serializable object. )�NotImplementedError��self� r �3/usr/lib/python3/dist-packages/josepy/interfaces.py�to_partial_jsonf � z"JSONDeSerializable.to_partial_jsonc s dt dt f� fdd�� � | �S )aD Fully serialize. Again, following the example from before, **full serialization** means the following:: assert Bar().to_json() == ['foo', 'foo'] :raises josepy.errors.SerializationError: in case of any serialization error. :returns: Fully serialized object. �objr c s� t | t�r� | �� �S t | t�r| S t | t�r � fdd�| D �S t | t�r0t� fdd�| D ��S t | t�r@� fdd�| �� D �S | S )Nc s g | ]}� |��qS r r ��.0�subobj�� _serializer r � <listcomp>� s zBJSONDeSerializable.to_json.<locals>._serialize.<locals>.<listcomp>c 3 s � | ]}� |�V qd S )Nr r r r r � <genexpr>� s � zAJSONDeSerializable.to_json.<locals>._serialize.<locals>.<genexpr>c s i | ]\}}� |�� |��qS r r )r �key�valuer r r � <dictcomp>� s �zBJSONDeSerializable.to_json.<locals>._serialize.<locals>.<dictcomp>) � isinstancer r �str�listr �tupler �items)r r r r r � s �z.JSONDeSerializable.to_json.<locals>._serializer r r r r �to_jsony s zJSONDeSerializable.to_json�jobjc C s | � S )a� Deserialize a decoded JSON document. :param jobj: Python object, composed of only other basic data types, as decoded from JSON document. Not necessarily :class:`dict` (as decoded from "JSON object" document). :raises josepy.errors.DeserializationError: if decoding was unsuccessful, e.g. in case of unparseable X509 certificate, or wrong padding in JOSE base64 encoded string, etc. r )�clsr! r r r � from_json� r zJSONDeSerializable.from_json�json_stringc C s<