a
    mJh!                     @   s   d dl m Z  d dlmZmZmZmZmZ ddlmZm	Z	m
Z
 ddlmZmZ ddlmZ ddlmZmZ ddlmZmZmZ dd	lmZmZ dd
lmZ ddlmZ ee dddejejdZ G dd deZ!edZ"G dd deZ#dS )    )copy)AnyDictOptionalTypeTypeVar   )AbstractFactoryParser
Serializer)create_schemaneed_ref)	NameStyle)create_parserget_lazy_parser)merge_schemaSchemaUnknown)create_serializerget_lazy_serializer)is_generic_concrete)COMMON_SCHEMASTF)Ztrim_trailing_underscoreZskip_internalZonly_mappedZ
name_styleunknownc                   @   sP   e Zd ZdZdd ZedddZedddZedd	d
ZedddZ	dS )StackedFactorystackfactoryc                 C   s   g | _ || _d S Nr   )selfr    r   K/var/www/shaz/venv/lib/python3.9/site-packages/dataclass_factory/factory.py__init__   s    zStackedFactory.__init__class_c                 C   s   | j || S r   )r    _json_schema_ref_name_with_stackr   r#   r   r   r    json_schema_ref_name   s    z#StackedFactory.json_schema_ref_namec                 C   sF   || j v rd S | j | z| j|| W | j   S | j   0 d S r   )r   appendr   _json_schema_with_stackpopr%   r   r   r    json_schema    s    

zStackedFactory.json_schemac                 C   sN   || j v rt| j|S | j | z| j|| W | j   S | j   0 d S r   )r   r   r   r'   _parser_with_stackr)   r%   r   r   r    parser)   s    

zStackedFactory.parserc                 C   sL   || j v rt| jS | j | z| j|| W | j   S | j   0 d S r   )r   r   r   r'   _serializer_with_stackr)   r%   r   r   r    
serializer2   s    


zStackedFactory.serializerN)
__name__
__module____qualname__	__slots__r!   r   r&   r*   r,   r.   r   r   r   r    r      s   		r   Tc                   @   sV  e Zd ZdZd&ee eeeef  ee	dddZ
ee ee dd	d
Zee ee dddZee eee dddZee dddZee edddZee ee	ef dddZee	ef dddZee eee	ef dddZee ee dddZee eee ddd Zeee ed!d"d#Zd'eee ed!d$d%ZdS )(Factoryz9
    Facade class for all data conversion operations
    NF/definitions)default_schemaschemas
debug_pathjson_schema_definitions_pathc                    sN   | _ | _t  _|r8 j fdd| D  i  _i  _| _	dS )aG  

        :param default_schema: schema used if no specific schema is provided
        :param schemas: dictionary with specific schemas for classes
                        that can be converted. Settings from default schema
                        will be used if they are not set in more specific one
        :param debug_path: show path to broken field in parsing exceptions
                           (InvalidFieldError will be raised)
        :param json_schema_definitions_path: path to definitions of jsonschemas
                       in overall schema, used by $ref

        c                    s    i | ]\}}|t | jtqS r   )r   r6   DEFAULT_SCHEMA).0type_schemar   r   r    
<dictcomp>Z   s   z$Factory.__init__.<locals>.<dictcomp>N)
r8   r6   r   r   r7   updateitemsjson_schemasjson_schema_namesr9   )r   r6   r7   r8   r9   r   r>   r    r!   C   s    
zFactory.__init__)r#   returnc                 C   sZ   t |r|j}nd}| j|}|sV|r4| j|}|s>t }t|| jt}|| j|< |S )zP
        Finds or creates `Schema` describing `class_` conversion rules
        N)r   
__origin__r7   getr   r   r6   r:   )r   r#   Z
base_classr=   r   r   r    r=   b   s    
zFactory.schemac                 C   s   |  |t| S )z
        Returns preconfigure parser to create `class_` instances
        from simple data structures using previously set schemas
        )r+   r   r%   r   r   r    r,   u   s    zFactory.parser)r#   stacked_factoryrD   c                 C   sX   |  |}|jsR|jr@t|}|||| j|_|| j|< |}nt||| j||_|jS r   )r=   r,   Z
get_parserr   r8   r7   r   r   r#   rG   r=   Z
new_schemar   r   r    r+   |   s    

zFactory._parser_with_stackr"   c                 C   s   |  |t| S )zv
        Create name of jsonschema reference used to locate description
        of `class_` in overall schema
        )r$   r   r%   r   r   r    r&      s    zFactory.json_schema_ref_name)r#   rG   c                 C   s   |  |}|jd ur`|j| jvr&|jS | j|j |krZtd|j d| j|j  d| |jS t|ddp~t|ddp~t|}|| jv rtd| d| j|  d| d|| |S )NzAlready found type with name `z`: z#. Please, specify another name for r1    r/   z! in schema or rename class itself)r=   namerC   
ValueErrorgetattrstrr*   )r   r#   rG   r=   rJ   r   r   r    r$      s(    


 



z(Factory._json_schema_ref_name_with_stackc                 C   s   |  |t| S )zi
        Create json schema describing `class_`.
        Can contain references to other classes
        )r(   r   r%   r   r   r    r*      s    zFactory.json_schema)rD   c                 C   s   dd | j  D S )z
        Create mapping for all crated json schemas

        Note: it is filled only with schemas which are requested at least
        once and their references
        c                 S   s   i | ]\}}||qS r   r   )r;   kvr   r   r    r?      s   z3Factory.json_schema_definitions.<locals>.<dictcomp>)rB   rA   r>   r   r   r    json_schema_definitions   s    zFactory.json_schema_definitionsc                 C   sP   |  |}| ||}|| jv r*| j| S t|||| j}t|rL|| j|< |S r   )r=   r$   rB   r   r9   r   )r   r#   rG   r=   rJ   r*   r   r   r    r(      s    




zFactory._json_schema_with_stackc                 C   s   |  |t| S )z
        Returns preconfigured serializer to convert `class_` instances
        to simple data structures using previously set schemas
        )r-   r   r%   r   r   r    r.      s    zFactory.serializerc                 C   sX   |  |}|jsR|jr@t|}|||| j|_|| j|< |}nt||| j||_|jS r   )r=   r.   Zget_serializerr   r8   r7   r   rH   r   r   r    r-      s    

zFactory._serializer_with_stack)datar#   rD   c                 C   s   |  ||S )z6
        Create `class_` instance form `data`
        )r,   r   rQ   r#   r   r   r    load   s    zFactory.loadc                 C   s   |du rt |}| ||S )zx
        Convert `data` to plain structures.
        If `class_` is not provided then `type(data)` will be used
        N)typer.   rR   r   r   r    dump   s    zFactory.dump)NNFr5   )N)r/   r0   r1   __doc__r   r   r   r   boolrM   r!   r3   r=   r
   r,   r   r+   r&   r$   r   r*   rP   r(   r   r.   r-   rS   rU   r   r   r   r    r4   ?   s.       r4   N)$r   typingr   r   r   r   r   commonr	   r
   r   Z
jsonschemar   r   Znamingr   parsersr   r   r=   r   r   r   Zserializersr   r   Ztype_detectionr   Zschema_helpersr   ignoreZSKIPr:   r   r3   r4   r   r   r   r    <module>   s&   	&