o
    QDi*(                     @  s  d dl m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 d dlmZmZmZmZmZmZmZmZmZ d dlmZm Z  d	d
l!m"Z" dddZ#dddZ$dddZ%dddZ&dddZ'dd"d#Z(G d$d% d%ee)ef Z*dd&dd*d+Z+dd,d-Z,dd.d/Z-dd1d2Z.dd4d5Z/edd7d8Z0i fdd;d<Z1dd>d?Z2dddCdDZ3ddEdFZ4ddIdJZ5ddLdMZ6ddOdPZ7dddSdTZ8dUdVddXdYZ9dd[d\Z:dd]dd^d_Z;dd`daZ<ddbdcZ=ddddeZ>dd]ddgdhZ?ddidjZ@ddndoZAddqdrZBddsdtZCedueDe)ZEe)dvdwdd|d}ZFdddZGdddZHG dd dZIdddZJdd ZKdS )    )annotationsN)Mapping)contextmanager)deepcopy)Path)	AnyDictIteratorListOptionalTupleTypeTypeVarUnion)parse_qsurlparse   )
stringcase
descriptorDict[str, Any]returnc                 C     dd |   D S )Nc                 S     i | ]
\}}t ||qS  )r   	snakecase.0keyvaluer   r   U/var/www/Datamplify/venv/lib/python3.10/site-packages/frictionless/helpers/general.py
<dictcomp>       z"create_options.<locals>.<dictcomp>items)r   r   r   r   create_options      r$   optionsr   c                  K  r   )Nc                 S  r   r   )r   	camelcaser   r   r   r   r       r!   z%create_descriptor.<locals>.<dictcomp>r"   r&   r   r   r   create_descriptor   r%   r)   cells	List[Any]c                 C  s   dd | D S )Nc                 S  s$   g | ]}|d u r
dnt | qS N )strstrip)r   cellr   r   r   
<listcomp>"   s   $ z#stringify_label.<locals>.<listcomp>r   )r*   r   r   r   stringify_label!      r2   r   c                 C  s   t | d| jjS )N__name__)getattr	__class__r4   )r   r   r   r   get_name%   s   r7   iteratorIterator[Any]c                 C  s   | D ]}qd S Nr   )r8   _r   r   r   pass_through)   s   r<   textr.   datac                 C  s   |  t|S r:   )
format_mapSafeFormatDict)r=   r>   r   r   r   safe_format.   r3   rA   c                   @  s   e Zd ZdddZdS )r@   r   r.   c                 C  s   dS r,   r   )selfr   r   r   r   __missing__3   s   zSafeFormatDict.__missing__N)r   r.   )r4   
__module____qualname__rC   r   r   r   r   r@   2   s    r@   )encoder_classobjrF   Optional[Any]c                C  s   t j| dd|dS )Nr   F)indentensure_asciicls)jsondumps)rG   rF   r   r   r   to_json7   s   rN   c                 C  s"   ddl m } |jj| ddt dS )Nr   platformFT)	sort_keysallow_unicodeDumper)rP   yamldumpcreate_yaml_dumper)rG   rP   r   r   r   to_yaml@   s   rW   c                  K  s   t di t| S )Nr   )dictremove_non_valuesr(   r   r   r   cleaned_dictK   r%   rZ   mappingc                 C  r   )Nc                 S  s   i | ]\}}|d ur||qS r:   r   r   r   r   r   r    P   s    z%remove_non_values.<locals>.<dictcomp>r"   )r[   r   r   r   rY   O   r%   rY   sourcec                 C  s2   t | tr	t| } t | trdd |  D } | S )Nc                 S  s   i | ]\}}||qS r   r   r   r   r   r   r    W   s    z$normalize_source.<locals>.<dictcomp>)
isinstancer   r.   r   r#   r\   r   r   r   normalize_sourceS   s
   

r_   thingc                 c  s:    | j s	| V  d S z|   | V  W |   d S |   w r:   )closedopenclose)r`   r   r   r   ensure_open[   s   
rd   patchkwargsc                 K  s$   | pi   } | | | | | S r:   )copyupdate)r\   re   rf   r   r   r   
copy_mergeg   s   

ri   Union[str, Dict[str, Any]]c                 C  sJ   d}t | tr#tj| }|r#t|s#tj|s#tjj|t d}|S )Nr-   )start)	r]   r.   ospathdirnameis_remote_pathabspathrelpathgetcwd)r   basepathr   r   r   parse_basepathn   s   
rt   rm   rs   Optional[str]c                 C  s8   |s| S t | r
| S t |r| d|  S tj|| S N/)ro   rl   rm   join)rm   rs   r   r   r   join_basepathx   s   ry   c                 C  s   t | }td| r| jddd\}} t d|  |d}|j }t|dk r)d}tj	|jp1|j
d dd   }|sUt|j}|d	}|d urUt|dkrU|d
 }||fS )Nz\+.*://z://   maxsplitz//)schemer   fileformatr   )r   researchsplitr}   lowerlenrl   rm   splitextnetlocr   queryget)rm   parsedr}   r   query_stringquery_string_formatr   r   r   parse_scheme_and_format   s   
$

r   baseheadc                 C  s^   t | }| dg }|dg }|s|rtt|| |d< t| di |di |d< |S )Nrequired
properties)r   r   listsetri   )r   r   resultbase_requiredhead_requiredr   r   r   merge_jsonschema   s   

r   Nonec                 C  s>   t j| st j| } | rt j| st |  d S d S d S r:   )rl   rm   isdirrn   existsmakedirsrm   r   r   r   
ensure_dir   s
   r   targetc                 C  s   t | t| |S r:   )r   shutilmove)r\   r   r   r   r   	move_file   s   r   rmodec                 C  s6   t | |}| W  d    S 1 sw   Y  d S r:   )rb   read)rm   r   r~   r   r   r   	read_file   s   $r   wt)r   bodyc                C  sn   |dkrdnd }t j|d|d}|| |  W d    n1 s$w   Y  t|j|  t| d d S )Nr   zutf-8F)deleteencodingi  )tempfileNamedTemporaryFilewriteflushr   namerl   chmod)rm   r   r   r   r~   r   r   r   
write_file   s   

r   boolc                 C  sF   | rt | tr| d n| } t| j}|sdS |  |d r!dS dS )Nr   Fz:\T)r]   r   r   r}   r   
startswith)rm   r}   r   r   r   ro      s   
ro   )rs   c                C  s>   t | stj| s|rtjj}t |rd}||| g} | S rv   )ro   rl   rm   isabsseprx   )rm   rs   	separatorr   r   r   normalize_path   s   r   c                 C  sX   dd }dd }t j| dt jj | v | dt j| | k|| || g}t| S )Nc                 S     t d| S )Nz%.+%r   matchvalr   r   r   <lambda>       zis_safe_path.<locals>.<lambda>c                 S  r   )Nz\$.+r   r   r   r   r   r      r   z..%s~)rl   rm   r   r   r   
expandvarsany)rm   contains_windows_varcontains_posix_varunsafeness_conditionsr   r   r   is_safe_path   s   

r   c                 C  s.   t | tsdS t| rdS tj| sdS dS )NFT)r]   r.   ro   rl   rm   r   r^   r   r   r   is_directory_source   s   
r   c                 C  s\   t | trt| tttdd | krdS t | tsdS t| r#dS t| p-tj	
| S )Nc                 S  s
   t | tS r:   )r]   r.   r   r   r   r   r      s   
 z&is_expandable_source.<locals>.<lambda>TF)r]   r   r   filterr.   ro   glob	has_magicrl   rm   r   r^   r   r   r   is_expandable_source   s   

r   Union[List[Any], str]c                C  s   t | tr| S g }|rtj|| } tj| r|  dn| }d|v r'ddini }ttj|fi |D ]}|r?tj||}|	| q4|S )Nz/*z**	recursiveT)
r]   r   rl   rm   rx   r   sortedr   rq   append)r\   rs   pathspatternconfigsrm   r   r   r   expand_source   s   
r   c                 C  sB   t | trt| }tj|jp|jd dd   }|dkS d S )Nrz   zip)r]   r.   r   rl   rm   r   r   r   )r   r   r   r   r   r   is_zip_descriptor  s
   
$r   objecttyper   c                 C  s   t | j|kS r:   )r   r4   )r   r   r   r   r   is_type  r3   r   stringc                 C  s.   | d u rd S |  dr| drt| S | S )N{})r   endswithrL   loads)r   r   r   r   parse_json_string  s
   
r   c           
   
   C  s   | d u rd S g }|  d}|D ]4}| d^}}t|d}|D ]}| d\}}	zt|	}	W n	 ty8   Y nw |	||< q|| q|S )N :)r   =)r   rX   astliteral_eval	Exceptionr   )
r   descriptorspartspartr   propsr   propr   r   r   r   r   parse_descriptors_string  s"   


r   TF)convertfallbackr   Type[T]r   List[T]c             
   C  sd   t jt| dd}g }|D ]!}|D ]}z||}W n ty&   |s$ Y nw || q |S |S )N,)	delimiter)csvreaderioStringIO
ValueErrorr   )r   r   r   r   r   rowr0   r   r   r   parse_csv_string_typed.  s   r   	List[str]c                 K  s6   t  }tj|fi |}||  | d}|S )Nz
)r   r   r   writerwriterowgetvaluerstrip)r*   r&   streamr   r   r   r   r   stringify_csv_string@  s
   
r   hashTuple[str, str]c                 C  s6   | j ddd}t|dkrd|d fS |d |d fS )Nr   rz   r{   md5r   )r   r   )r   r   r   r   r   parse_resource_hash_v1H  s   r   c                   @  s    e Zd Zdd Zedd ZdS )Timerc                 C  s   t j  | _d | _d S r:   )datetimenow_Timer__start_Timer__stoprB   r   r   r   __init__P  s   
zTimer.__init__c                 C  s(   | j s	tj | _ t| j | j  dS )N   )r  r  r  roundr  total_secondsr  r   r   r   timeT  s   z
Timer.timeN)r4   rD   rE   r  propertyr  r   r   r   r   r  O  s    r  c                 K  s    ddl m} || fi |}|S )zrThere is a conflict between python-slugify and awesome-slugify
    So we import from a proper module manually
    r   )slugify)slugify.slugifyr  )r=   r&   r  slugr   r   r   r  [  s   r  c                  C  s$   ddl m }  G dd d| jj}|S )Nr   rO   c                      s    e Zd Zd	d
 fddZ  ZS )z(create_yaml_dumper.<locals>.IndentDumperFflowr   
indentlessr   r   c                   s   t  |dS )NF)superincrease_indent)rB   r  r  r6   r   r   r  l  r3   z8create_yaml_dumper.<locals>.IndentDumper.increase_indent)FF)r  r   r  r   r   r   )r4   rD   rE   r  __classcell__r   r   r  r   IndentDumperk  s    r  )rP   rT   
SafeDumper)rP   r  r   r   r   rV   h  s   rV   )r   r   r   r   )r&   r   r   r   )r*   r+   )r   r   )r8   r9   )r=   r.   r>   r   )rG   r   rF   rH   r   r.   )rG   r   r   r.   )r[   r   )r\   r   r   r   )r`   r   )r\   r   re   r   rf   r   )r   rj   r:   )rm   r.   rs   ru   )rm   r.   )r   r   r   r   )rm   r.   r   r   )r\   r.   r   r.   r   r.   )r   )rm   r.   r   r.   )rm   r.   r   r   r   r.   )rm   r.   r   r   )r\   r   r   r   )r\   r   rs   ru   )r   r   r   r.   )r   ru   )r   r.   r   r   r   r   r   r   )r*   r   r&   r   )r   r.   r   r   )r=   r.   r&   r   )L
__future__r   r   r   r  r   r   rL   rl   r   r   r   collections.abcr   
contextlibr   rg   r   pathlibr   typingr   r   r	   r
   r   r   r   r   r   urllib.parser   r   vendorsr   r$   r)   r2   r7   r<   rA   r.   r@   rN   rW   rZ   rY   r_   rd   ri   rt   ry   r   r   r   r   r   r   ro   r   r   r   r   r   r   r   r   r   intr   r   r   r   r  r  rV   r   r   r   r   <module>   sv    ,






	










	











