U
    @	e                     @   s|   d dl m Z mZmZ d dlmZ d dlmZ d dlZd dlmZ	m
Z d dlZddlmZmZ G dd	 d	ZG d
d dZdS )    )datetime	timedeltatimezone)Path)ListN)CLoaderCDumper   )	safe_copysafe_write_textc                   @   sX   e Zd Zdeeeeeeeeeed
ddZdd	d
ddddddg	Z	dd Z
edd ZdS )FileVersionNFr    )
datefilenameauthor
is_approve	is_backupdir_pathst_sizecmf_deletedversionmd5sumc                 C   sT   |j s|jtjd}|| _|| _|| _|| _|| _|| _	|| _
|| _|	| _|
| _d S )N)tzinfo)r   replacer   utcr   r   r   r   r   r   r   r   r   r   )selfr   r   r   r   r   r   r   r   r   r    r   /opt/rdisk/rdisk/version.py__init__   s    zFileVersion.__init__r   r   r   r   r   r   r   r   r   c                    s    fddt   D S )Nc                    s    i | ]\}}| j kr||qS r   )dump_fieldnames).0kvr   r   r   
<dictcomp>,   s     
  z(FileVersion.to_pyobj.<locals>.<dictcomp>)varsitemsr#   r   r#   r   to_pyobj+   s    zFileVersion.to_pyobjc                 C   s   | j | j S N)r   r   r#   r   r   r   path.   s    zFileVersion.path)
NNNNNNNFr   r   )__name__
__module____qualname__r   strboolr   intr   r   r'   propertyr)   r   r   r   r   r      s4             r   c                   @   s   e Zd Zdeee dddZeedddZeeddd	Z	eedd
dZ
eed dddZdd ZeeedddZdd Zdd Zdd ZedddZedddZdS ) FileVersionsN)	file_pathversionsc                 C   s   |sg }|| _ || _d S r(   )r3   r2   )r   r2   r3   r   r   r   r   4   s    zFileVersions.__init__)returnc                 C   s   t t| jd S )Nz.meta)r   r-   r2   r#   r   r   r   	meta_path:   s    zFileVersions.meta_pathc                 C   s
   | j d S )Nzversions.yamlr5   r#   r   r   r   version_file_path>   s    zFileVersions.version_file_pathc                 C   s
   | j d S )Nr3   r6   r#   r   r   r   versions_dir_pathB   s    zFileVersions.versions_dir_path)r2   r4   c                 C   s   | |d}|j jdd |jjdd g }|j  }|rt }tj|tdD ]*}|	dr^qN|
tf |d|ji qNt | }|dkrtd| d	| d
 |jdd d ||_|S )N)r2   T)exist_ok)Loaderr   r   g333333?zCall yaml.safe_load on file z run z secc                 S   s   | j S r(   r   )r"   r   r   r   <lambda>\       z,FileVersions.for_file_path.<locals>.<lambda>)key)r7   touchr8   mkdir
read_bytestimeyamlloadr:   getappendr   printsortr3   )clsr2   fvsr3   Zversions_file_datastr"   Zendtr   r   r   for_file_pathF   s"    


zFileVersions.for_file_pathc                 C   s   | j s
d S tdd | j D S )Nc                 s   s   | ]}|j s|jV  qd S r(   )r   r   r    ir   r   r   	<genexpr>d   s      z1FileVersions.last_version_date.<locals>.<genexpr>)r3   maxr#   r   r   r   last_version_date`   s    zFileVersions.last_version_date)namer4   c                 C   s   ddl m} dd l}dd l}dd l}|d| }d}t| t| t|d  }||krd}|| \}	}
|	r|| dd	 }|	|d }| d |d
t|   
  d|| d } |r|  d| } td| d| d|   | S )Nr	   )cmf_hashlibr   u   [А-Яа-я]      r   .   -   u0   Слишком длинное название. z > u   . Меняем на )r   rS   remath	mimetypesfindalllen
guess_typesplitfloorstripZshort_str_encrG   )rR   rS   r[   r\   r]   Z
rus_simbolZos_max_lengthZfile_name_lengthextmimetypeencodingslice_lengthr   r   r   get_filenamef   s$    .zFileVersions.get_filenamec              	   K   s   t tjjdd}| |dd | jj }t	|||
dd dd| j| j jd}| jd	}| rv| |_| jr| jd
 j|jkr| jd
 j|jkrd S t| j|j |j j|_| jsd|_n| jd
 jd |_| j| |   d S )Nr   )microsecondz%Y%m%d%H%M%SrY   r   FT)r   r   r   r   r   r   r   md5rW   r	   )r   nowr   r   r   rh   strftimer2   rR   r   rE   r8   statr   r5   joinpathexists	read_textr   r3   r
   r)   r   rF   dump_versions_file)r   kwargsr   r   new_versionmd5_pathr   r   r   backup{   s.    



*zFileVersions.backupc                 K   s:   |   }|r*ttj| tddk r*d S | jf | d S )N   )minutes)rQ   r   rk   r   r   r   ru   )r   rr   rQ   r   r   r   backup_smart   s    zFileVersions.backup_smartc                 C   s.   dd | j D }tj|dd}t|| j d S )Nc                 S   s   g | ]}|  qS r   )r'   rM   r   r   r   
<listcomp>   s     z3FileVersions.dump_versions_file.<locals>.<listcomp>T)allow_unicode)r3   rC   	safe_dumpr   r7   )r   Zpyobjdatar   r   r   rq      s    zFileVersions.dump_versions_filer;   c                 C   s   |j }| j}t|| d S r(   )r)   r2   r
   )r   r   srcdstr   r   r   restore   s    zFileVersions.restorec                 C   s   d|_ |   dS )uW   Фейковое удаление, просто не загружаем в списокTN)r   rq   )r   r   r   r   r   remove   s    zFileVersions.remove)NN)r*   r+   r,   r   r   r   r   r0   r5   r7   r8   classmethodrL   rQ   staticmethodr-   rh   ru   rx   rq   r   r   r   r   r   r   r1   3   s"   r1   )r   r   r   pathlibr   typingr   rC   r   r:   r   DumperrB   utilr
   r   r   r1   r   r   r   r   <module>   s   &