U
    e4                     @   s|  d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	Z	d dl
Z
d dlZd dlZd dlmZ d dlmZ d dlmZ d dlmZmZ d dlmZmZ d dlmZmZ G dd	 d	ZG d
d deZG dd deZG dd deZG dd deZ G dd deZ!G dd deZ"G dd deZ#G dd deZ$G dd deZ%G dd deZ&G dd deZ'G d d! d!eZ(G d"d# d#eZ)G d$d% d%eZ*G d&d' d'e#Z+G d(d) d)e#Z,G d*d+ d+eZ-G d,d- d-eZ.G d.d/ d/eZ/G d0d1 d1eZ0G d2d3 d3eZ1G d4d5 d5eZ2G d6d7 d7eZ3G d8d9 d9eZ4G d:d; d;eZ5G d<d= d=eZ6G d>d? d?Z7d@dA Z8dS )B    N)SettingsReference)models)	Operation)COMPILED_REGEX_TYPERegexObject)
LazyObjectPromise)PY311get_docs_versionc                   @   s   e Zd Zdd Zdd ZdS )BaseSerializerc                 C   s
   || _ d S Nvalue)selfr    r   C/tmp/pip-unpacked-wheel-lctamlir/django/db/migrations/serializer.py__init__   s    zBaseSerializer.__init__c                 C   s   t dd S )NzCSubclasses of BaseSerializer must implement the serialize() method.NotImplementedErrorr   r   r   r   	serialize   s    zBaseSerializer.serializeN)__name__
__module____qualname__r   r   r   r   r   r   r      s   r   c                   @   s   e Zd Zdd Zdd ZdS )BaseSequenceSerializerc                 C   s   t dd S )NzISubclasses of BaseSequenceSerializer must implement the _format() method.r   r   r   r   r   _format!   s    zBaseSequenceSerializer._formatc                 C   sT   t  }g }| jD ](}t| \}}|| || q|  }|d| |fS )N, )setr   serializer_factoryr   updateappendr   joinr   importsstringsitemZitem_stringZitem_importsr   r   r   r   r   &   s    

z BaseSequenceSerializer.serializeN)r   r   r   r   r   r   r   r   r   r       s   r   c                   @   s   e Zd Zdd ZdS )BaseSimpleSerializerc                 C   s   t | jt fS r   )reprr   r   r   r   r   r   r   2   s    zBaseSimpleSerializer.serializeNr   r   r   r   r   r   r   r   r&   1   s   r&   c                   @   s   e Zd Zdd ZdS )ChoicesSerializerc                 C   s   t | jj S r   )r   r   r   r   r   r   r   r   7   s    zChoicesSerializer.serializeNr(   r   r   r   r   r)   6   s   r)   c                   @   s   e Zd ZdZdd ZdS )DateTimeSerializerz)For datetime.*, except datetime.datetime.c                 C   s   t | jdhfS Nzimport datetimer'   r   r   r   r   r   r   >   s    zDateTimeSerializer.serializeNr   r   r   __doc__r   r   r   r   r   r*   ;   s   r*   c                   @   s   e Zd ZdZdd ZdS )DatetimeDatetimeSerializerzFor datetime.datetime.c                 C   sF   | j jd k	r.| j jtjjkr.| j tjj| _ dg}t| j t|fS r+   )r   tzinfodatetimetimezoneutc
astimezoner'   r   )r   r#   r   r   r   r   E   s    z$DatetimeDatetimeSerializer.serializeNr-   r   r   r   r   r/   B   s   r/   c                   @   s   e Zd Zdd ZdS )DecimalSerializerc                 C   s   t | jdhfS )Nzfrom decimal import Decimalr,   r   r   r   r   r   M   s    zDecimalSerializer.serializeNr(   r   r   r   r   r5   L   s   r5   c                   @   s,   e Zd Zedd Zedd Zdd ZdS )DeconstructableSerializerc           
      C   s   t | \}}g }|D ](}t| \}}|| || qt| D ]4\}	}t| \}}|| |d|	|f  qLd|d|f |fS )Nz%s=%sz%s(%s)r   )	r6   _serialize_pathr   r   r    r   sorteditemsr!   )
pathargskwargsnamer#   r$   arg
arg_stringZarg_importskwr   r   r   serialize_deconstructedR   s    

z1DeconstructableSerializer.serialize_deconstructedc                 C   s>   |  dd\}}|dkr(dh}d| }nd| h}| }||fS )N.   zdjango.db.modelsfrom django.db import modelsz	models.%s	import %s)rsplit)r:   moduler=   r#   r   r   r   r7   `   s    

z)DeconstructableSerializer._serialize_pathc                 C   s   | j | j  S r   )rA   r   deconstructr   r   r   r   r   k   s    z#DeconstructableSerializer.serializeN)r   r   r   staticmethodrA   r7   r   r   r   r   r   r6   Q   s
   


r6   c                   @   s   e Zd Zdd ZdS )DictionarySerializerc           	      C   s   t  }g }t| j D ]J\}}t| \}}t| \}}|| || |||f qdddd |D  |fS )N{%s}r   c                 s   s   | ]\}}d ||f V  qdS )z%s: %sNr   ).0kvr   r   r   	<genexpr>y   s     z1DictionarySerializer.serialize.<locals>.<genexpr>)	r   r8   r   r9   r   r   r   r    r!   )	r   r#   r$   rM   rN   Zk_stringZ	k_importsZv_stringZ	v_importsr   r   r   r   p   s    

zDictionarySerializer.serializeNr(   r   r   r   r   rJ   o   s   rJ   c                   @   s   e Zd Zdd ZdS )EnumSerializerc                    sr   | j j  jt tjrFtr*t| j }qNt | j \}}t	|}n| j f}d
 fdd|D d hfS )Nz | c                    s&   g | ]} d  j  d|jdqS )rB   [])r   r=   )rL   r%   
enum_classrG   r   r   
<listcomp>   s   z,EnumSerializer.serialize.<locals>.<listcomp>rE   )r   	__class__r   
issubclassenumFlagr	   list
_decomposereversedr!   )r   members_r   rS   r   r   }   s    
zEnumSerializer.serializeNr(   r   r   r   r   rP   |   s   rP   c                       s   e Zd Z fddZ  ZS )FloatSerializerc                    s4   t | jst | jr*d| jt fS t  S )Nzfloat("{}"))mathisnanr   isinfformatr   superr   r   rV   r   r   r      s    zFloatSerializer.serialize)r   r   r   r   __classcell__r   r   re   r   r_      s   r_   c                   @   s   e Zd Zdd ZdS )FrozensetSerializerc                 C   s   dS )Nzfrozenset([%s])r   r   r   r   r   r      s    zFrozensetSerializer._formatNr   r   r   r   r   r   r   r   rg      s   rg   c                   @   s   e Zd Zdd ZdS )FunctionTypeSerializerc                 C   s   t | jdd rHt| jjtrH| jj}|j}d||j| jjf d| hfS | jjdkr\td| jjd krvtd| j | jj}d| jjkrd|| jjf d| jj hfS td	| jj|f d S )
N__self__z%s.%s.%srE   z<lambda>z!Cannot serialize function: lambdaz'Cannot serialize function %r: No module<%s.%sz"Could not find function %s in %s.
)	getattrr   
isinstancerj   typer   r   
ValueErrorr   )r   klassrG   module_namer   r   r   r      s*     
z FunctionTypeSerializer.serializeNr(   r   r   r   r   ri      s   ri   c                   @   s   e Zd Zdd ZdS )FunctoolsPartialSerializerc                 C   sd   t | jj \}}t | jj \}}t | jj \}}dh|||}d| jjj|||f |fS )Nzimport functoolszfunctools.%s(%s, *%s, **%s))r   r   funcr   r;   keywordsrV   r   )r   Zfunc_stringZfunc_importsargs_stringZargs_importsZkeywords_stringZkeywords_importsr#   r   r   r   r      s    z$FunctoolsPartialSerializer.serializeNr(   r   r   r   r   rs      s   rs   c                   @   s   e Zd Zdd ZdS )IterableSerializerc                 C   s`   t  }g }| jD ](}t| \}}|| || qt|dkrJdnd}|d| |fS )NrC   (%s)(%s,)r   )r   r   r   r   r   r    lenr!   r"   r   r   r   r      s    

zIterableSerializer.serializeNr(   r   r   r   r   rw      s   rw   c                   @   s   e Zd Zdd ZdS )ModelFieldSerializerc                 C   s    | j  \}}}}| |||S r   )r   rH   rA   )r   	attr_namer:   r;   r<   r   r   r   r      s    zModelFieldSerializer.serializeNr(   r   r   r   r   r{      s   r{   c                   @   s   e Zd Zdd ZdS )ModelManagerSerializerc                 C   sD   | j  \}}}}}|r2| |\}}d| |fS | |||S d S )Nz%s.as_manager())r   rH   r7   rA   )r   Z
as_managerZmanager_pathZqs_pathr;   r<   r=   r#   r   r   r   r      s
    z ModelManagerSerializer.serializeNr(   r   r   r   r   r}      s   r}   c                   @   s   e Zd Zdd ZdS )OperationSerializerc                 C   s0   ddl m} || jdd \}}|d|fS )Nr   )OperationWriter)indentation,)Zdjango.db.migrations.writerr   r   r   rstrip)r   r   stringr#   r   r   r   r      s    zOperationSerializer.serializeNr(   r   r   r   r   r~      s   r~   c                   @   s   e Zd Zdd ZdS )PathLikeSerializerc                 C   s   t t| ji fS r   )r'   osfspathr   r   r   r   r   r      s    zPathLikeSerializer.serializeNr(   r   r   r   r   r      s   r   c                   @   s   e Zd Zdd ZdS )PathSerializerc                 C   s*   t | jtjrdnd}d|| jf dhfS )NZPure zpathlib.%s%rzimport pathlib)rn   r   pathlibPath)r   prefixr   r   r   r      s    zPathSerializer.serializeNr(   r   r   r   r   r      s   r   c                   @   s   e Zd Zdd ZdS )RegexSerializerc                 C   sj   t | jj \}}| jjtdjA }t | \}}dh||}|g}|rX|| dd| |fS )Nr   z	import rezre.compile(%s)r   )	r   r   patternr   flagsrecompiler    r!   )r   Zregex_patternZpattern_importsr   Zregex_flagsZflag_importsr#   r;   r   r   r   r     s    
zRegexSerializer.serializeNr(   r   r   r   r   r     s   r   c                   @   s   e Zd Zdd ZdS )SequenceSerializerc                 C   s   dS )Nz[%s]r   r   r   r   r   r     s    zSequenceSerializer._formatNrh   r   r   r   r   r     s   r   c                   @   s   e Zd Zdd ZdS )SetSerializerc                 C   s   | j r
dS dS )NrK   zset(%s)r   r   r   r   r   r     s    zSetSerializer._formatNrh   r   r   r   r   r     s   r   c                   @   s   e Zd Zdd ZdS )SettingsReferenceSerializerc                 C   s   d| j j dhfS )Nzsettings.%sz from django.conf import settings)r   Zsetting_namer   r   r   r   r   "  s    
z%SettingsReferenceSerializer.serializeNr(   r   r   r   r   r   !  s   r   c                   @   s   e Zd Zdd ZdS )TupleSerializerc                 C   s   t | jdkrdS dS )NrC   rx   ry   )rz   r   r   r   r   r   r   )  s    zTupleSerializer._formatNrh   r   r   r   r   r   (  s   r   c                   @   s   e Zd Zdd ZdS )TypeSerializerc                 C   s   t jddgftd dg fg}|D ]$\}}}|| jkr |t|f  S q t| jdr| jj}|tjkrr| jjt fS d|| jj	f d| hfS d S )Nzmodels.ModelrD   z
type(None)r   rl   rE   )
r   ZModelro   r   r   hasattrr   builtinsr   r   )r   Zspecial_casesZcaser   r#   rG   r   r   r   r   0  s    

zTypeSerializer.serializeNr(   r   r   r   r   r   /  s   r   c                   @   s   e Zd Zdd ZdS )UUIDSerializerc                 C   s   dt | j dhfS )Nzuuid.%szimport uuidr,   r   r   r   r   r   C  s    zUUIDSerializer.serializeNr(   r   r   r   r   r   B  s   r   c                (   @   s   e Zd Zeeeeeee	e
eeejeejeejeejejejfeeeeeeeede e!e"fe#e$j%e&e'j(e'j)fe*e+j,e+j-e+j.fe/e0j1j2e3e4e5fe6e7j8e9e:j;e<e=j>e?iZ@eAdd ZBeAdd ZCdS )
SerializerNc                 C   s&   t |tstd|j || j|< d S )Nz('%s' must inherit from 'BaseSerializer'.)rW   r   rp   r   	_registry)clstype_
serializerr   r   r   registerd  s
    
zSerializer.registerc                 C   s   | j | d S r   )r   pop)r   r   r   r   r   
unregisterl  s    zSerializer.unregister)Dr   r   r   	frozensetrg   rZ   r   r   r   tupler   dictrJ   r   ZChoicesr)   rX   EnumrP   r1   r/   date	timedeltatimer*   r   r   floatr_   boolintro   bytesstrranger&   decimalDecimalr5   	functoolspartialpartialmethodrs   typesFunctionTypeBuiltinFunctionType
MethodTyperi   collectionsabcIterablerw   r   r   r   uuidUUIDr   r   PurePathr   r   PathLiker   r   classmethodr   r   r   r   r   r   r   G  s`                
      
r   c                 C   s   t | trt| } nt | tr.|  d d } t | tjrBt| S t | tjj	rXt
| S t | trjt| S t | tr|t| S t| drt| S tj D ]\}}t | |r||   S qtd| t f d S )NrC   r   rH   zCannot serialize: %r
There are some values Django cannot serialize into migration files.
For more, see https://docs.djangoproject.com/en/%s/topics/migrations/#migration-serializing)rn   r   r   r   
__reduce__r   ZFieldr{   managerZBaseManagerr}   r   r~   ro   r   r   r6   r   r   r9   rp   r
   )r   r   Zserializer_clsr   r   r   r   q  s,    






r   )9r   collections.abcr   r1   r   rX   r   r`   r   r   r   r   r   Zdjango.confr   Z	django.dbr   Z$django.db.migrations.operations.baser   Zdjango.db.migrations.utilsr   r   Zdjango.utils.functionalr   r   Zdjango.utils.versionr	   r
   r   r   r&   r)   r*   r/   r5   r6   rJ   rP   r_   rg   ri   rs   rw   r{   r}   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   <module>   s\   


	*