o
    FD©iÍ*  ã                   @   s   d dl mZ G dd„ dƒZdS )é   )Úresolve_schema_instancec                   @   sH   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dd„ Z
dS )ÚSchemaResolvera¿  Resolve marshmallow Schemas in OpenAPI components and translate to OpenAPI
    `schema objects
    <https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#schema-object>`_,
    `parameter objects
    <https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#parameter-object>`_
    or `reference objects
    <https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#reference-object>`_.
    c                 C   s   || _ || _d S )N)Úopenapi_versionÚ	converter)Úselfr   r   © r   ú`/var/www/Datamplify/venv/lib/python3.10/site-packages/apispec/ext/marshmallow/schema_resolver.pyÚ__init__   s   
zSchemaResolver.__init__c                 K   sŒ   |  ¡ D ]?}t|tƒsqd|v r|  |d ¡|d< | jjdkr3|  | di ¡¡ d|v r3|  |d ¡ | di ¡  ¡ D ]}|  	|¡ q;qdS )zÂResolve marshmallow Schemas in a dict mapping operation to OpenApi `Operation Object
        https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#operationObject`_
        Ú
parametersé   Ú	callbacksÚrequestBodyÚ	responsesN)
ÚvaluesÚ
isinstanceÚdictÚresolve_parametersr   ÚmajorÚresolve_callbackÚgetÚresolve_schemaÚresolve_response)r   Ú
operationsÚkwargsÚ	operationÚresponser   r   r   Úresolve_operations   s   
ÿÿõz!SchemaResolver.resolve_operationsc                 C   s4   |  ¡ D ]}t|tƒr|  ¡ D ]}|  |¡ qqdS )a  Resolve marshmallow Schemas in a dict mapping callback name to OpenApi `Callback Object
        https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#callbackObject`_.

        This is done recursively, so it is possible to define callbacks in your callbacks.

        Example: ::

            # Input
            {
                "userEvent": {
                    "https://my.example/user-callback": {
                        "post": {
                            "requestBody": {
                                "content": {"application/json": {"schema": UserSchema}}
                            }
                        },
                    }
                }
            }

            # Output
            {
                "userEvent": {
                    "https://my.example/user-callback": {
                        "post": {
                            "requestBody": {
                                "content": {
                                    "application/json": {
                                        "schema": {"$ref": "#/components/schemas/User"}
                                    }
                                }
                            }
                        },
                    }
                }
            }


        N)r   r   r   r   )r   r   ÚcallbackÚpathr   r   r   r   %   s   (
€ýzSchemaResolver.resolve_callbackc                 C   s|   g }|D ]7}t |tƒr1t | di ¡tƒs1d|v r1t| d¡ƒ}|| jj|fd| d¡i|¤Ž7 }q|  |¡ | |¡ q|S )a÷  Resolve marshmallow Schemas in a list of OpenAPI `Parameter Objects
        <https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#parameter-object>`_.
        Each parameter object that contains a Schema will be translated into
        one or more Parameter Objects.

        If the value of a `schema` key is marshmallow Schema class, instance or
        a string that resolves to a Schema Class each field in the Schema will
        be expanded as a separate Parameter Object.

        Example: ::

            # Input
            class UserSchema(Schema):
                name = fields.String()
                id = fields.Int()


            [{"in": "query", "schema": "UserSchema"}]

            # Output
            [
                {
                    "in": "query",
                    "name": "id",
                    "required": False,
                    "schema": {"type": "integer"},
                },
                {
                    "in": "query",
                    "name": "name",
                    "required": False,
                    "schema": {"type": "string"},
                },
            ]

        If the Parameter Object contains a `content` key a single Parameter
        Object is returned with the Schema translated into a Schema Object or
        Reference Object.

        Example: ::

            # Input
            [
                {
                    "in": "query",
                    "name": "pet",
                    "content": {"application/json": {"schema": "PetSchema"}},
                }
            ]

            # Output
            [
                {
                    "in": "query",
                    "name": "pet",
                    "content": {
                        "application/json": {
                            "schema": {"$ref": "#/components/schemas/Pet"}
                        }
                    },
                }
            ]


        :param list parameters: the list of OpenAPI parameter objects to resolve.
        ÚschemaÚinÚlocation)	r   r   r   r   Úpopr   Úschema2parametersr   Úappend)r   r
   ÚresolvedÚ	parameterÚschema_instancer   r   r   r   R   s$   Cÿþÿÿ
ÿ
z!SchemaResolver.resolve_parametersc                 C   s6   |   |¡ d|v r|d  ¡ D ]	}|   |¡ qdS dS )a¾  Resolve marshmallow Schemas in OpenAPI `Response Objects
        <https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#responseObject>`_.
        Schemas may appear in either a Media Type Object or a Header Object.

        Example: ::

            # Input
            {
                "content": {"application/json": {"schema": "PetSchema"}},
                "description": "successful operation",
                "headers": {"PetHeader": {"schema": "PetHeaderSchema"}},
            }

            # Output
            {
                "content": {
                    "application/json": {"schema": {"$ref": "#/components/schemas/Pet"}}
                },
                "description": "successful operation",
                "headers": {
                    "PetHeader": {"schema": {"$ref": "#/components/schemas/PetHeader"}}
                },
            }

        :param dict response: the response object to resolve.
        ÚheadersN)r   r   )r   r   Úheaderr   r   r   r   ¥   s   
þzSchemaResolver.resolve_responsec                 C   st   t |tƒsdS d|v r|  |d ¡|d< | jjdkr4d|v r6|d  ¡ D ]}d|v r3|  |d ¡|d< q$dS dS dS )aY  Resolve marshmallow Schemas in an OpenAPI component or header -
        modifies the input dictionary to translate marshmallow Schemas to OpenAPI
        Schema Objects or Reference Objects.

        OpenAPIv3 Components: ::

            # Input
            {
                "description": "user to add to the system",
                "content": {"application/json": {"schema": "UserSchema"}},
            }

            # Output
            {
                "description": "user to add to the system",
                "content": {
                    "application/json": {
                        "schema": {"$ref": "#/components/schemas/User"}
                    }
                },
            }

        :param dict|str data: either a parameter or response dictionary that may
            contain a schema, or a reference provided as string
        Nr   r   Úcontent)r   r   Úresolve_schema_dictr   r   r   )r   Údatar*   r   r   r   r   Å   s   
€üzSchemaResolver.resolve_schemac                    s¼   t |tƒrX| d¡dkrd|v rˆ  |d ¡|d< | d¡dkr3d|v r3‡ fdd„|d  ¡ D ƒ|d< dD ]}||v rH‡ fd	d
„|| D ƒ||< q5d|v rVˆ  |d ¡|d< |S ˆ j |¡S )aL  Resolve a marshmallow Schema class, object, or a string that resolves
        to a Schema class or a schema reference or an OpenAPI Schema Object
        containing one of the above to an OpenAPI Schema Object or Reference Object.

        If the input is a marshmallow Schema class, object or a string that resolves
        to a Schema class the Schema will be translated to an OpenAPI Schema Object
        or Reference Object.

        Example: ::

            # Input
            "PetSchema"

            # Output
            {"$ref": "#/components/schemas/Pet"}

        If the input is a dictionary representation of an OpenAPI Schema Object
        recursively search for a marshmallow Schemas to resolve. For `"type": "array"`,
        marshmallow Schemas may appear as the value of the `items` key. For
        `"type": "object"` Marshmalow Schemas may appear as values in the `properties`
        dictionary.

        Examples: ::

            # Input
            {"type": "array", "items": "PetSchema"}

            # Output
            {"type": "array", "items": {"$ref": "#/components/schemas/Pet"}}

            # Input
            {
                "type": "object",
                "properties": {"pet": "PetSchcema", "user": "UserSchema"},
            }

            # Output
            {
                "type": "object",
                "properties": {
                    "pet": {"$ref": "#/components/schemas/Pet"},
                    "user": {"$ref": "#/components/schemas/User"},
                },
            }

        :param string|Schema|dict schema: the schema to resolve.
        ÚtypeÚarrayÚitemsÚobjectÚ
propertiesc                    s   i | ]
\}}|ˆ   |¡“qS r   ©r+   )Ú.0ÚkÚv©r   r   r   Ú
<dictcomp>   s    
ÿÿz6SchemaResolver.resolve_schema_dict.<locals>.<dictcomp>)ÚoneOfÚanyOfÚallOfc                    s   g | ]}ˆ   |¡‘qS r   r2   )r3   Úsr6   r   r   Ú
<listcomp>&  s    
ÿz6SchemaResolver.resolve_schema_dict.<locals>.<listcomp>Únot)r   r   r   r+   r/   r   Úresolve_nested_schema)r   r   Úkeywordr   r6   r   r+   ì   s"   
0


þ

ÿ€z"SchemaResolver.resolve_schema_dictN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r	   r   r   r   r   r   r+   r   r   r   r   r      s    	-S 'r   N)Úcommonr   r   r   r   r   r   Ú<module>   s    