o
    ðT·jj|  ã                
   @   s`  d 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ZddlZddlmZ ddlT ddlmZ ddlmZ ddlmZ ddlmZ dd	lmZ g d
¢Ze d¡ZdZG dd„ deƒZdd„ ZG dd„ deddƒƒZ G dd„ de!ƒZ"dYdd„Z#ejj$ddfejj%ddfej&j'ddfejddfej(ddfej)d d!fe*d"dfe+d#dffZ,d$d%„ Z-dZd'd(„Z.dZd)d*„Z/d+d,„ Z0d-d.„ Z1d/d0„ Z2d1d2„ Z3d3d4„ Z4d5d6„ Z5d7d8„ Z6d9d:„ Z7d;d<„ Z8d=d>„ Z9d?d@„ Z:dAdB„ Z;dCdD„ Z<dEdF„ Z=dGdH„ Z>dIdJ„ Z?dKdL„ Z@dMdN„ ZAdOdP„ ZBdQZCdRdS„ ZDdTdU„ ZEd[dVdW„ZFeGdXk�r.e HeFƒ ¡ dS dS )\aL  
Migration runner built on the playhouse.migrate helpers.

Migrations are plain python scripts in a directory, applied in numeric
order and recorded by name in a history table. Each script defines
``up(migrator, db)`` and (optionally) ``down(migrator, db)``:

    # migrations/0002_add_karma.py
    from peewee import *

    def up(migrator, db):
        migrator.migrate(
            migrator.add_column('user', 'karma', IntegerField(default=0)))

    def down(migrator, db):
        migrator.migrate(migrator.drop_column('user', 'karma'))

Nothing is introspected at runtime or auto-detected. New tables need no special
support: declare the model inline (a frozen copy, deliberately independent of
the application models) and call ``db.create_tables()`` from ``up()``.

Set ``atomic = False`` at module scope to disable transaction wrapping.
é    N)Ú
namedtuple)Ú*)Úis_model)Úsort_models)ÚEnumFieldMixin)ÚSchemaMigrator)Úmake_index_name)Ú	MigrationÚMigrationErrorÚRunnerÚrunÚtemplatezpeewee.migrationszÂ"""%s"""
from peewee import *


def up(migrator, db):
    # migrator.migrate(
    #     migrator.add_column('tbl', 'col', TextField(default='')))
    pass


# def down(migrator, db):
#     pass
c                   @   s   e Zd ZdS )r
   N)Ú__name__Ú
__module__Ú__qualname__© r   r   úW/home/dinkstrade/pdmp-scanner/venv/lib/python3.10/site-packages/playhouse/migrations.pyr
   A   s    r
   c                 C   s$   t  d| ¡}|d urt| ¡ ƒS dS )Nz\d+éÿÿÿÿ)ÚreÚmatchÚintÚgroup)Únamer   r   r   r   Ú_indexC   s   r   c                   @   s$   e Zd ZdZedd„ ƒZdd„ ZdS )r	   r   c                 C   sR   g }t   tj |d¡¡D ]}tj |¡d d… }| tt|ƒ||d ƒ¡ qt|ƒS )Nz	[0-9]*.pyéýÿÿÿ)	ÚglobÚosÚpathÚjoinÚbasenameÚappendr	   r   Úsorted)ÚclsÚ	directoryÚaccumr   r   r   r   r   Úload_directoryJ   s
   zMigration.load_directoryc                 C   s.   t j | j| j¡}t j |¡}|j |¡ |S ©N)Ú	importlibÚutilÚspec_from_file_locationr   r   Úmodule_from_specÚloaderÚexec_module)ÚselfÚspecÚmoduler   r   r   ÚloadR   s   zMigration.loadN)r   r   r   Ú	__slots__Úclassmethodr%   r0   r   r   r   r   r	   G   s
    
r	   )Úidxr   r   Úappliedc                   @   sd   e Zd Z		ddd„Zdd„ Zdd	„ Zd
d„ Zddd„Zddd„Zddd„Z	ddd„Z
ddd„ZdS )r   Ú
migrationsÚschema_migrationNc                    sH   |ˆ _ |ˆ _|ˆ _|ˆ _tj||d�ˆ _G ‡ fdd„d|jƒ}|ˆ _d S )N)Úschemac                       s6   e Zd Zedd�Zeejjd�ZG ‡ fdd„dƒZ	dS )z Runner.__init__.<locals>.HistoryT)Úunique©Údefaultc                       s   e Zd ZdZ” jZ” jZdS )z%Runner.__init__.<locals>.History.MetaFN)r   r   r   Úlegacy_table_namesÚ
table_namer7   r   ©r-   r   r   ÚMetai   s    
r>   N)
r   r   r   Ú	CharFieldr   ÚDateTimeFieldÚdatetimeÚnowr4   r>   r   r=   r   r   ÚHistoryf   s    
rC   )	Údatabaser#   r<   r7   r   Úfrom_databaseÚmigratorÚModelrC   )r-   rD   r#   r<   r7   rC   r   r=   r   Ú__init__\   s   
zRunner.__init__c                 C   s   t  | j¡S r&   )r	   r%   r#   r=   r   r   r   r5   p   s   zRunner.migrationsc                 C   s"   | j  ¡ si S dd„ | j  ¡ D ƒS )Nc                 S   s   i | ]}|j |j“qS r   )r   r4   )Ú.0Úhr   r   r   Ú
<dictcomp>w   ó    z"Runner.applied.<locals>.<dictcomp>)rC   Útable_existsÚselectr=   r   r   r   r4   s   s   
zRunner.appliedc                    sT   |   ¡ ‰ ‡ fdd„|  ¡ D ƒ}tˆ ƒdd„ |D ƒ }| ‡ fdd„|D ƒ¡ t|ƒS )z¸
        Files and history merged as Migration tuples, in numeric order.
        ``applied`` is None for pending files, ``path`` is None for rows
        whose files are gone.
        c                    s    g | ]}|j ˆ  |j¡d �‘qS )©r4   )Ú_replaceÚgetr   ©rI   ÚmrO   r   r   Ú
<listcomp>€   s    ÿz!Runner.status.<locals>.<listcomp>c                 S   ó   h | ]}|j ’qS r   ©r   rR   r   r   r   Ú	<setcomp>‚   ó    z Runner.status.<locals>.<setcomp>c                 3   s&   � | ]}t t|ƒ|d ˆ | ƒV  qd S r&   )r	   r   )rI   ÚnrO   r   r   Ú	<genexpr>ƒ   s   €$ z Runner.status.<locals>.<genexpr>)r4   r5   ÚsetÚextendr!   )r-   r$   Úgoner   rO   r   Ústatusy   s   
ÿzRunner.statusFc           	      C   sÌ   dd„ |   ¡ D ƒ}|dur|dd„ |D ƒvrtd| ƒ‚g }|D ]'}|js@| ¡ }t|ddƒdu r8td|j ƒ‚| |j|f¡ |j|krG nq | j ¡  g }|D ]\}}| j	||d|d	� | |¡ qQ|S )
z‡
        Apply all pending migrations in order, or, given a target, stop
        after applying it. Returns the applied names.
        c                 S   s   g | ]	}|j d ur|‘qS r&   ©r   rR   r   r   r   rT   ‹   s    zRunner.up.<locals>.<listcomp>Nc                 S   rU   r   rV   rR   r   r   r   rW   Œ   rX   zRunner.up.<locals>.<setcomp>zunknown migration "%s".Úupz%s does not define up().©Úfake)
r^   r
   r4   r0   Úgetattrr   r    rC   Úcreate_tableÚ_run)	r-   Útargetrb   ÚrowsÚplanÚ	migrationr/   r$   r   r   r   r   r`   †   s*   ÿ
ÿ
z	Runner.upc                 C   sÜ   dd„ |   ¡ D ƒ}|dur|dd„ |D ƒvrtd| ƒ‚g }t|ƒD ]4}|jdu r0td|j ƒ‚| ¡ }t|ddƒdu rCtd	|j ƒ‚| |j|f¡ |du sT|j|krV nq"g }|D ]\}}|  ||d¡ | |¡ q[|S )
zŠ
        Revert the most recently-applied migration, or, given a target,
        every applied migration back through the target.
        c                 S   s   g | ]}|j r|‘qS r   rO   rR   r   r   r   rT   ¨   rL   zRunner.down.<locals>.<listcomp>Nc                 S   rU   r   rV   rR   r   r   r   rW   ©   rX   zRunner.down.<locals>.<setcomp>z!"%s" is not an applied migration.z.cannot revert "%s": migration file is missing.Údownz%s does not define down().)	r^   r
   Úreversedr   r   r0   rc   r    re   )r-   rf   rg   rh   ri   r/   r$   r   r   r   r   rj   £   s.   
ÿÿÿzRunner.downc                 C   s   | j |dd�S )z”
        Record pending migrations as applied without running them,
        stopping after the target if given. Returns the recorded names.
        Tra   )r`   )r-   rf   r   r   r   rb   Á   s   zRunner.fakeÚ c                 C   s¨   t j| jdd� tdd„ |  ¡ D ƒdd�d }t dd	| ¡ ¡ d	¡ ¡ }t j	 
| jd
||p/df ¡}t|dƒ�}| |p@t| ¡ W d  ƒ |S 1 sMw   Y  |S )z;Write a numbered skeleton migration file. Returns its path.T)Úexist_okc                 s   s   � | ]}|j V  qd S r&   )r3   rR   r   r   r   rZ   Ë   s   € z Runner.create.<locals>.<genexpr>r   r9   é   z[^\w]+Ú_z
%04d_%s.pyri   ÚwN)r   Úmakedirsr#   Úmaxr5   r   ÚsubÚstripÚlowerr   r   ÚopenÚwriteÚTEMPLATE)r-   r   Úbodyr3   Úslugr   Úfhr   r   r   ÚcreateÈ   s   
ÿ
ÿþzRunner.createc                 C   sÀ   t  d|||r	dnd¡ |r| jj|d� d S | j t|ddƒ¡�5 t||ƒ| j| jƒ |dkr8| jj|d� n| j ¡  	| jj
|k¡ ¡  W d   ƒ d S W d   ƒ d S 1 sYw   Y  d S )Nz%s: %s%sz [FAKE]rl   rV   ÚatomicTr`   )ÚloggerÚinforC   r|   rF   Úmigration_contextrc   rD   ÚdeleteÚwherer   Úexecute)r-   r   r/   Ú	directionrb   r   r   r   re   Ó   s   ù"ýzRunner._run)r5   r6   N©NFr&   )rl   N)F)r   r   r   rH   r5   r4   r^   r`   rj   rb   r|   re   r   r   r   r   r   [   s    
ÿ



r   r5   c                 K   s   t | |fi |¤Ž ¡ S r&   )r   r`   )rD   r#   Úkwargsr   r   r   r   ã   ó   r   zdatetime.datetime.nowzimport datetimezdatetime.datetime.utcnowzdatetime.date.todayz	time.timezimport timeztime.time_nsz
uuid.uuid4zimport uuidÚdictÚlistc                 C   sj   t D ]\}}}| |kr| d| ¡ |r| |¡  dS qt| tjƒr3| dt| ƒ ¡ | d¡ dS dS )Nz
default=%sTzdefault=decimal.Decimal(%r)zimport decimalF)Ú_COMMON_DEFAULTSr    ÚaddÚ
isinstanceÚdecimalÚDecimalÚstr)r:   ÚargsÚimportsÚvalueÚsourceÚimpr   r   r   Ú_handle_common_defaultñ   s   
ü
r•   Fc           
      C   s  g }t | tƒr1| j}|s|| ju rd}n|| }| |¡ |s&| j|jjur1| d|| jjf ¡ | jr>t | t	ƒs>| d¡ | j
rG| d¡ n| jrTt | tƒsT| d¡ | jr\| d¡ t | tƒro| jdkro| d| j ¡ nt | tƒrŽ| jd	kr�| d
| j ¡ | jdkrŽ| d| j ¡ | jd urÁ| j}t |tjƒrŸ|j}t |ttttfƒr°| d| ¡ nt|||ƒsÁ| d| j| jf ¡ t | tƒrù| j d¡rÏ| jn| jd }	| j|	krá| d| j ¡ | jrì| d| j ¡ | jr÷| d| j ¡ |S | j| jk�r| d| j ¡ |S )Nz'self'zfield=%s.%szprimary_key=Truezunique=Truez
index=Truez	null=Trueéÿ   zmax_length=%ré
   zmax_digits=%ré   zdecimal_places=%rz
default=%rz$%s: default %r must be added by handÚ_idzcolumn_name=%rzon_delete=%rzon_update=%r)rŒ   ÚForeignKeyFieldÚ	rel_modelÚmodelr    Ú	rel_fieldÚ_metaÚprimary_keyr   Ú	AutoFieldr8   ÚindexÚnullr?   Ú
max_lengthÚDecimalFieldÚ
max_digitsÚdecimal_placesr:   ÚenumÚEnumr’   r�   r   ÚfloatÚboolr•   ÚendswithÚcolumn_nameÚ	on_deleteÚ	on_update)
Úfieldr‘   ÚtodosÚtargetsÚunboundr�   r›   Úrel_namer:   Údefault_colnamer   r   r   Ú_build_field_argsþ   s\   









ÿ
ÿ
ýrµ   c                 C   sj   t | ƒ}t| tƒrtdd„ |jD ƒƒ}|jdkr#| d|j|jf ¡ t| ||||ƒ}d|jd 	|¡f S )Nc                 s   s   � | ]
}|j d kr|V  qdS )ÚpeeweeN)r   )rI   Úcr   r   r   rZ   >  ó   € z_build_field.<locals>.<genexpr>r¶   zfrom %s import %sz%s(%s)ú, )
ÚtyperŒ   r   ÚnextÚ__mro__r   r‹   r   rµ   r   )r¯   r‘   r°   r±   r²   r"   r�   r   r   r   Ú_build_field:  s   

r½   c                 C   s    t | ƒtu o| jdko| jdkS )NÚid)rº   r    r   r¬   )r¯   r   r   r   Ú_is_implicit_idE  s   ÿr¿   c              
   C   sB  | j }d| j g}|jD ]}t|ƒrq| d|jt||||ƒf ¡ q| d¡ | d¡ | d|j ¡ |jr@| d|j ¡ |j	}t
|tƒrY| dd d	d
„ |jD ƒ¡ ¡ n|s`| d¡ g }|jpfdD ]+}	t
|	ttfƒr~|	\}
}| t|
ƒ|f¡ qgt|	dd ƒp‡t|	ƒ}| d|j|f ¡ qg|rŸ| dt|ƒf ¡ |S )Núclass %s(Model):ú    %s = %sú    class Meta:ú        database = dbú        table_name = %rú        schema = %rz&        primary_key = CompositeKey(%s)r¹   c                 s   s   � | ]}t |ƒV  qd S r&   )Úrepr©rI   Úfr   r   r   rZ   [  ó   € z_build_model.<locals>.<genexpr>z        primary_key = Falser   Ú_namez"%s: index %s must be added by handz        indexes = %r)rž   r   Úsorted_fieldsr¿   r    r   r½   r<   r7   rŸ   rŒ   ÚCompositeKeyr   Úfield_namesÚindexesr‰   Útuplerc   rÆ   )rœ   r‘   r°   r±   ÚmetaÚlinesr¯   ÚpkrÎ   r¡   Úcolumnsr8   Úidx_namer   r   r   Ú_build_modelI  sB   

þ


ÿ
ÿrÕ   c                 C   s�   | j }d| j g}|D ]}t|tƒrd|j }nt||g ƒ}| d|j|f ¡ q| d¡ | d¡ | d|j ¡ |j	rF| d|j	 ¡ |S )NrÀ   z.IntegerField(primary_key=True, column_name=%r)rÁ   rÂ   rÃ   rÄ   rÅ   )
rž   r   rŒ   rš   r¬   r½   r    r   r<   r7   )rœ   Úfieldsr‘   rÐ   rÑ   r¯   r“   r   r   r   Ú_build_stubm  s   
ÿ

r×   c                 C   sH   | j rdnd}| jr| jt| j| jƒkr|d| j 7 }d| j| j|f S )Nz, unique=Truerl   z	, name=%rz.migrator.migrate(migrator.add_index(%r, %r%s)))r8   r   r   ÚtablerÓ   )r3   Úextrar   r   r   Ú_build_add_index�  s   ýrÚ   c                 C   sL   |r|d s|  ¡  |r|d r|sd|  S dd„ |D ƒ}d| d |¡f S )Nr   zdef %s(migrator, db):
    passc                 S   s   g | ]
}|r
d | nd‘qS )z    %srl   r   )rI   Úliner   r   r   rT   �  s    z_block.<locals>.<listcomp>zdef %s(migrator, db):
%sÚ
)Úpopr   )ÚfnrÑ   Úindentedr   r   r   Ú_blockŠ  s   ÿrà   c                    sl  g t ƒ }}g }| jD ]‰| ‡fdd„ˆjjD ƒ¡ q| dd„ | jD ƒ¡ t | jƒ}i }|D ] }|j}||v r:q0||vrBi ||< t|jƒsP|j|| |jj	< q0dd„ |t |ƒB D ƒ}g }	t
|dd„ d�D ] ‰t
|ˆ  ¡ d	d„ d�}
tˆ|
|ƒ}| d
¡ |	 |g f¡ qf| jD ]-‰tˆ|||ƒ}| dˆj d
g¡ ˆj}d|j|jr«d|j nd
f }|	 ||gf¡ qŠt | jƒ‰ | jD ]E‰dˆjˆj	f g}g }ˆjdu rÞ| dˆjˆj	f ¡ n t‡ ‡fdd„ˆjD ƒƒr÷| dˆjˆj	f ¡ n| tˆƒ¡ |	 ||f¡ qÀ| jD ];}|jj}t||||dd�}|j�s-|jdu �r-| d|j|jf ¡ |	 d|j|j|f gd|j|jf gf¡ �q	t dd„ | jD ƒƒ}| jD ]>‰ˆjdu �rg| dˆjˆj	f ¡ �qRg }ˆjˆjˆjf|v�r{| tˆƒ¡ dˆjtˆjˆjƒf g}|	 ||f¡ �qR| jD ]\}}|	 d||f gg f¡ | d||f ¡ �q”t dd„ | jD ƒƒ}|�rÈ| dd  t
|ƒ¡ ¡ g g }}|	D ]
\}}| |¡ �qÏt!|	ƒD ]
\}}| |¡ �qÞt"j" #¡  $d¡}d| d g}| t
|ƒ¡ | d
¡ | d!d„ |D ƒ¡ |�r| d
¡ | t%d"|ƒ¡ | d
¡ | d
¡ | t%d#|ƒ¡ d$  |¡d$ S )%a4  
    Render a playhouse.schema_diff.SchemaDiff as a migration-file body.
    Fully-determined changes render as runnable code. Foreign keys
    reference a model created in the file, 'self', or a frozen stub of
    the target table. Anything else needing a definition is flagged
    with a TODO comment.
    c                 3   s(   � | ]}t |tƒr|jˆ ur|V  qd S r&   )rŒ   rš   r›   rÇ   )rœ   r   r   rZ   ¡  s   € ÿ
þþztemplate.<locals>.<genexpr>c                 s   s   � | ]
}t |tƒr|V  qd S r&   )rŒ   rš   rÇ   r   r   r   rZ   ¤  s   € ÿc                 S   s   i | ]}||j “qS r   ©r   )rI   rœ   r   r   r   rK   ±  s    ztemplate.<locals>.<dictcomp>c                 S   ó   | j S r&   rá   )rS   r   r   r   Ú<lambda>µ  ó    ztemplate.<locals>.<lambda>)Úkeyc                 S   râ   r&   )Ú	_sort_key)rÈ   r   r   r   rã   ¶  rä   rl   zdb.create_tables([%s])z+migrator.migrate(migrator.drop_table(%r%s))z, schema=%rz-migrator.migrate(migrator.drop_index(%r, %r))NzF%s: dropped index %s (partial/expression) cannot be restored by down()c                 3   s   � | ]
}ˆj |fˆ v V  qd S r&   )rØ   )rI   Úcolumn)Údroppedr3   r   r   rZ   Ï  r¸   zB%s: dropped index %s cannot be restored by down() (column dropped)T)r²   zA%s.%s: not-null column needs a default or allow_not_null backfillz1migrator.migrate(migrator.add_column(%r, %r, %s))z.migrator.migrate(migrator.drop_column(%r, %r))c                 s   s6   � | ]}|j s
|jr|jjj|jft|jƒfV  qd S r&   )r¡   r8   rœ   rž   r<   r¬   rª   rÇ   r   r   r   rZ   å  s   € þþÿz>%s: create index %s (partial/expression, details not detected)z2%s.%s: dropped column cannot be restored by down()c                 s   s$   � | ]}|j jjr|j jjV  qd S r&   )rœ   rž   r7   r<   rÇ   r   r   r   rZ   ú  s   € 
ÿz`schema-qualified tables (%s): column/index operations are emitted unqualified. Run with --schemar¹   z%Y-%m-%d %H:%Mz%# Generated from a schema diff on %s.zfrom peewee import *c                 s   s   � | ]}d | V  qdS )z
# TODO: %sNr   )rI   Útodor   r   r   rZ     rÉ   r`   rj   rÜ   )&r[   Úcreate_tablesr\   rž   rË   Úadd_columnsr›   r¿   r�   r   r!   Úvaluesr×   r    rÕ   r   r<   r7   Údrop_columnsÚdrop_indexesrØ   rÓ   ÚanyrÚ   rœ   r½   r¢   r:   r¬   Úadd_indexesr8   r   r   rk   rA   rB   Ústrftimerà   )Údiffr°   r‘   ÚfksÚcreatedÚstubsr¯   Úrelr±   rh   rÖ   r`   rÐ   rj   r“   Úauto_indexedrØ   r   Ú	qualifiedÚuro   ÚdÚtsÚoutr   )rè   r3   rœ   r   r   ”  sä   


€

þ


ÿ

ÿ
ÿ

þÿ
ÿ
ýþ

ÿÿÿÿ
ÿÿþ
ÿ



r   c                 C   s*   t  ¡ tjvrtj dt  ¡ ¡ t | ¡S )Nr   )r   ÚgetcwdÚsysr   Úinsertr'   Úimport_moduler_   r   r   r   Ú_cwd_import  s   
r  c           	      C   sD  d }d| v r|   dd¡\} }t| ƒ}|rZt||d ƒ}|d u r&td|| f ƒ‚t|ƒr/|gg fS zt|ƒ}W n tyD   td| |f ƒ‚w |D ]}t|ƒsUtd| |f ƒ‚qG|g fS g g }}t|ƒ ¡ D ]0}t|ƒr•|t	ur•|j
|jkr•|jj}t|ƒdkr�t|d ƒr�|jjs�| |j¡ qe| |¡ qe|sžtd|  ƒ‚||fS )Nú:rn   z"%s" not found in module "%s".z."%s:%s" must name a Model or a list of Models.r   zno models found in module "%s".)Úsplitr  rc   r
   r   r‰   Ú	TypeErrorÚvarsrì   rG   r   r   rž   rË   Úlenr¿   rÎ   r    )	r.   Úattrr/   ÚobjÚmodelsrœ   Úskippedr’   rÖ   r   r   r   Ú_resolve_models  sP   ÿ
ÿÿÿÿ
ÿ
€r  c              
   C   sj  d| v rEddl m} z|| ƒ}W n ttfy$ } ztt|ƒƒ‚d }~ww z| ¡  | ¡  W |S  tyD } ztd| |f ƒ‚d }~ww tj	 
| ¡rOt| ƒS d| vrWtdƒ‚|  dd¡\}}zt|ƒ}W n tyy } ztd||f ƒ‚d }~ww t||d ƒ}|d u rŒtd	||f ƒ‚t|tƒrŸ|jd u rœtd
|  ƒ‚|j}t|tƒsªtd|  ƒ‚|js³td|  ƒ‚|S )Nz://r   )Úconnectzcannot connect to "%s": %sÚ.z_database must be given as a db url, a sqlite filename, or a dotted path to a Database instance.rn   zcannot import "%s": %sz"%s" not found in "%s".z"%s" proxy is uninitialized.z#"%s" did not resolve to a Database.zD"%s" is a deferred database. Initialize it, or point at one that is.)Úplayhouse.db_urlr  ÚRuntimeErrorÚ
ValueErrorr
   r�   ÚcloseÚ	Exceptionr   r   ÚisfileÚSqliteDatabaseÚrsplitr  ÚModuleNotFoundErrorrc   rŒ   ÚProxyr  ÚDatabaserD   )r.   r  rD   ÚexcÚmodule_pathr  r/   r  r   r   r   Ú_resolve_databaseB  sR   €ÿ
þ€ÿ€ÿ


ÿr  c           
   
   C   s¾   ddl m}m} t|ƒ\}}|D ]
}tj d| ¡ q| d u rFg }|D ]}t|jdd ƒr6tj d|j	 ¡ q#| 
|¡ q#|t|ƒg g g g ƒS z|| |ƒW S  ty^ }	 ztt|	ƒƒ‚d }	~	ww )Nr   )Ú
SchemaDiffÚdiff_modelszskipped: %s (no fields)
Úextension_modulezskipped: %s (virtual table)
)Úplayhouse.schema_diffr  r  r  rþ   Ústderrrw   rc   rž   r   r    r   r  r
   r�   )
rD   r.   r  r  r	  r
  r   r$   rœ   r  r   r   r   Ú_resolve_diffi  s&   ÿ€ÿr!  c                 C   s.   |D ]
}t d| |f ƒ q|st dƒ d S d S )Nz%s: %sznothing to do.)Úprint)ÚverbÚnamesr   r   r   r   Ú_report~  s
   ÿr%  c                 C   s|   |   ¡ }|D ]*}|jsd}n
|jd urd}nd}d||jf }|jr,|d|j d¡ 7 }t|ƒ qtdd„ |D ƒƒr<d	S d S )
Nú Úxú?z[%s] %sz  z%Y-%m-%d %H:%M:%Sc                 s   s   � | ]}|j  V  qd S r&   rO   rR   r   r   r   rZ   “  rÉ   z_cmd_status.<locals>.<genexpr>rn   )r^   r4   r   r   rñ   r"  rï   )Úrunnerr�   rg   rS   ÚmarkerrÛ   r   r   r   Ú_cmd_status…  s   

ÿr+  c                 C   ó   t d|  |j¡ƒ d S )Nr4   )r%  r`   rf   ©r)  r�   r   r   r   Ú_cmd_up—  r‡   r.  c                 C   r,  )NÚreverted)r%  rj   rf   r-  r   r   r   Ú	_cmd_down›  r‡   r0  c                 C   r,  )NÚfaked)r%  rb   rf   r-  r   r   r   Ú	_cmd_fakeŸ  r‡   r2  c                 C   sJ   |j stdƒ‚|  ¡ rtd|j ƒ‚td |j ƒ}t| jdt|ƒd�ƒ d S )Nz!initial requires a models module.z!migrations already exist in "%s".Úinitial©ry   )r	  r
   r5   r#   r!  r"  r|   r   ©r)  r�   rò   r   r   r   Ú_cmd_initial£  s   ÿr6  c                 C   s   t |  |j¡ƒ d S r&   )r"  r|   r   r-  r   r   r   Ú_cmd_create­  s   r7  c                 C   sH   |j stdƒ‚t| j|j ƒ}|stdƒ d S t| j|jt|ƒd�ƒ d S )Nz"generate requires a models module.z+schema matches models. Nothing to generate.r4  )r	  r
   r!  rD   r"  r|   r   r   r5  r   r   r   Ú_cmd_generate±  s   r8  c                 C   s6   |j stdƒ‚t| j|j ƒ}t|r|ƒ d S dƒ d S )Nzdiff requires a models module.zschema matches models.)r	  r
   r!  rD   r"  r5  r   r   r   Ú	_cmd_diff»  s   r9  )r^   r`   rj   r3  r|   Úgeneraterb   rò   c                 C   s¼   | d u rd} t j | ¡si S i }t| ƒ�)}|D ]}| ¡ }|r$| d¡r%q| d¡\}}}| ¡ || ¡ < qW d   ƒ n1 s@w   Y  tt|ƒh d£ ƒD ]}t	j
 d|| f ¡ qO|S )Nz
.pwmigrateú#ú=>   rØ   r	  r7   rD   r#   z warning: unknown key "%s" in %s
)r   r   Úexistsrv   rt   Ú
startswithÚ	partitionr!   r[   rþ   r   rw   )r   Úconfigr{   rÛ   rå   ro   r’   r   r   r   Ú_read_configÇ  s"   
ûÿrA  c                 C   sT  t j tjd p	d¡}| d¡sd}tj|dd�}|jddd	� |jd
dddd� tjdd�}|jdd|  	dd¡dd� |jdd|  	d¡dd� |jdd|  	dd¡dd� |jd d!d"d#d$� |j
d%d%d&d'�}|jd(|gd)d*�}|jtd+� |jd,|gd-d*�}|jd.d/d0d1� |jtd+� |jd2|gd3d*�}|jd.d/d4d1� |jtd+� |jd5|gd6d*�}|jd7d/|  	d7¡d8d9� |jtd+� |jd:|gd;d*�}|jd<d=d	� |jtd+� |jd>|gd?d*�}|jd<d=d	� |jd7d/|  	d7¡d8d9� |jtd+� |jd@|gdAd*�}|jd.d/dBd1� |jtd+� |jdC|gdDd*�}|jd7d/|  	d7¡d8d9� |jtd+� |S )ENr   rl   Ú	pwmigratezpython -m playhouse.migrationszpeewee migration runner)ÚprogÚdescriptionrD   ztdotted path to a Database instance (e.g. myapp.settings.db), db url (e.g. postgres:///app), or path to a sqlite file)Úhelpú-cú--configÚFILEz=config file supplying argument defaults (default: .pwmigrate))ÚmetavarrE  F©Úadd_helpz-dz--directoryr#   r5   z*migrations directory (default: migrations))r:   rE  z-sz--schemar7   z+schema containing the tables to be migratedz-tz--tablerØ   r6   zhistory table namez-vz	--verboseÚ
store_truezecho SQL as it executes)ÚactionrE  ÚcommandT)ÚdestrI  Úrequiredr^   z&list migrations and applied timestamps)ÚparentsrE  )Úfuncr`   z!apply pending migrations in orderrf   r(  zstop after this migration)ÚnargsrE  rj   z revert the most recent migrationz"revert back through this migrationr3  z8generate the first migration, assuming an empty databaser	  z3models module ("app.models" or "app.models:MODELS"))rS  r:   rE  r|   zwrite a skeleton migration filer   zmigration namer:  z)generate a migration from the schema diffrb   z.record pending migrations without running themzrecord through this migrationrò   z%print schema drift against the models)r   r   r   rþ   Úargvr>  ÚargparseÚArgumentParserÚadd_argumentrQ   Úadd_subparsersÚ
add_parserÚset_defaultsr+  r.  r0  r6  r7  r8  r2  r9  )r@  rC  ÚparserÚcommonrs   Úpr   r   r   Ú_parserÜ  sœ   
ÿ
ÿ
þþ
þ
ÿÿ
ÿ
ÿ
ÿÿ
ÿÿ
ÿ
ÿÿ
ÿ
ÿÿr^  c           	      C   s¾  | d u rt jdd … } tjdd�}| dd¡ | | ¡\}} |jr3tj 	|j¡s3t j
 d|j ¡ dS t|jƒ}| rM| d tv rM| d	¡sMt j
 d
¡ dS | d	¡ra| rZ| d tv ra|d	 g|  } t|ƒ | ¡}|jr}t d¡}| t ¡ ¡ | tj¡ d }zUz"t|jƒ}t||j|j|jƒ}| ||¡p—dW W |d ur¢| ¡  S S  t t!t"t#t$fyÔ } z!|jr¶t% &¡  t j
 d| ¡ W Y d }~W |d urÎ| ¡  dS dS d }~ww |d urÞ| ¡  w w )Nrn   FrJ  rF  rG  z#error: config file "%s" not found.
é   r   rD   z9error: no database given and no .pwmigrate config found.
r¶   z
error: %s
)'rþ   rT  rU  rV  rW  Úparse_known_argsr@  r   r   r=  r   rw   rA  Ú	_COMMANDSrQ   r^  Ú
parse_argsÚverboseÚloggingÚ	getLoggerÚ
addHandlerÚStreamHandlerÚsetLevelÚDEBUGr  rD   r   r#   rØ   r7   rR  r  r
   ÚDatabaseErrorÚInterfaceErrorÚImproperlyConfiguredr  Ú	tracebackÚ	print_exc)	rT  ÚpreÚknownr@  r�   Úpeewee_loggerrD   r)  r  r   r   r   Úmain*  sX   ÿ



ÿùÿÿ€ù
ÿrr  Ú__main__)r5   r…   r&   )IÚ__doc__rU  rA   r�   r§   r   Úimportlib.utilr'   rd  r   r   rþ   Útimerm  ÚuuidÚcollectionsr   r¶   r   r   Úplayhouse.fieldsr   Úplayhouse.migrater   r   Ú__all__re  r~   rx   r  r
   r   r	   Úobjectr   r   rB   ÚutcnowÚdateÚtodayÚtime_nsÚuuid4rˆ   r‰   rŠ   r•   rµ   r½   r¿   rÕ   r×   rÚ   rà   r   r  r  r  r!  r%  r+  r.  r0  r2  r6  r7  r8  r9  ra  rA  r^  rr  r   Úexitr   r   r   r   Ú<module>   sŠ    
 
	


ø


<$	
 %'


N
+ÿ