o
    QD©i8F  ã                   @  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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m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  ervddlm!Z! ddl"m#Z# ddl$m%Z% G dd„ dƒZ&dS )é    )ÚannotationsN)ÚMapping)Údeepcopy)ÚPath)
ÚTYPE_CHECKINGÚAnyÚClassVarÚDictÚ	GeneratorÚListÚOptionalÚSetÚTypeÚUnion)ÚSelfé   )Úhelpers)ÚFrictionlessException)Úplatform)Ú
stringcase)Útypes)ÚError)ÚReportc                      s.  e Zd ZU dZi Zded< 	 d~‡ fdd„Zd	d
„ Zd‡ fdd„Zd€dd„Z	e
d€dd„ƒZe
d€dd„ƒZddd„Zd‚dd„Zdƒdd„Zd d!œd„d#d$„Zd%d&œd…d(d)„Zed d*œd†d0d1„ƒZed‡d4d5„ƒZe	%dˆd‰d7d8„ƒZd%d9œdŠd<d=„Zd‹d>d?„ZdŒd@dA„ZddBdC„Z	 dŽddGdH„Zdd‘dIdJ„Zd’d“dLdM„ZdNedO< d ZdPedQ< i ZdRedS< i ZdRedT< i Z dRedU< d%Z!dedV< e"ƒ Z#dWedX< i Z$dYedZ< d Z%d.ed[< d Z&d\ed]< ed”d`da„ƒZ'ed•dcdd„ƒZ(ededf„ ƒZ)ed dgœd–djdk„ƒZ*ed—dldm„ƒZ+ed d dnœd˜dtdu„ƒZ,ed%dvœd™dxdy„ƒZ-g dzœdšd|d}„Z.‡  Z/S )›ÚMetadatazÇMetadata representation

    For proper functioning a child class must be decorated by
    "@attrs.define(kw_only=True, repr=False)" and ensure that
    "Metadata.__attrs_post_init__" is called

    zdict[str, Any]ÚcustomÚargsr   Úkwargsc                   sD   t ƒ  | ¡}|j ¡ |_| j ¡ |_| j ¡ |_|j | ¡ ¡ |S ©N)ÚsuperÚ__new__r   ÚcopyÚmetadata_defaultsÚmetadata_assignedÚupdateÚkeys)Úclsr   r   Úobj©Ú	__class__© úW/var/www/Datamplify/venv/lib/python3.10/site-packages/frictionless/metadata/metadata.pyr   4   s   zMetadata.__new__c                 C  s
   d| _ d S )NT)Úmetadata_initiated©Úselfr)   r)   r*   Ú__attrs_post_init__<   s   
zMetadata.__attrs_post_init__ÚnameÚstrÚvaluec                   sˆ   |  d¡s;| jr|d ur| j |¡ n(|| jv r| j |¡ nt|ttfƒr.| ¡ | j	|< nt|t
ƒr;|j ¡ | j	|< tƒ  ||¡ d S )N)Ú_Ú	metadata_)Ú
startswithr+   r"   ÚaddÚremoveÚ
isinstanceÚlistÚdictr    r!   ÚtypeÚ__dict__r   Ú__setattr__)r-   r/   r1   r'   r)   r*   r<   ?   s   

€
zMetadata.__setattr__Úreturnc                 C  s   t j|  ¡ ddS )NF)Ú
sort_dicts)ÚpprintÚpformatÚto_descriptorr,   r)   r)   r*   Ú__repr__L   s   zMetadata.__repr__c                 C  s@   t | ddƒ}ztj |¡}| dd¡}|W S  ty   Y dS w )zDescription in HTMLÚdescriptionÚ Ú
)Úgetattrr   ÚmarkoÚconvertÚreplaceÚ	Exception)r-   rC   Úhtmlr)   r)   r*   Údescription_htmlO   s   ÿzMetadata.description_htmlc                 C  s0   G dd„ dt jjƒ}|ƒ }| | j¡ |j ¡ S )zDescription in Textc                   @  s   e Zd ZdZddd„ZdS )z-Metadata.description_text.<locals>.HTMLFilterrD   Údatar0   c                 S  s    |  j |7  _ |  j d7  _ d S )Nú )Útext)r-   rM   r)   r)   r*   Úhandle_dataa   s   z9Metadata.description_text.<locals>.HTMLFilter.handle_dataN)rM   r0   )Ú__name__Ú
__module__Ú__qualname__rO   rP   r)   r)   r)   r*   Ú
HTMLFilter^   s    rT   )r   Úhtml_parserÚ
HTMLParserÚfeedrL   rO   Ústrip)r-   rT   Úparserr)   r)   r*   Údescription_textZ   s   
zMetadata.description_textú	List[str]c                 C  sT   t | jƒ}| j ¡ D ]\}}t| |d ƒ}t|tƒr|j ¡ }||kr'| 	|¡ q
|S r   )
r8   r"   r!   ÚitemsrF   r7   r:   r;   r    Úappend)r-   Údefinedr/   Údefaultr1   r)   r)   r*   Úlist_definedk   s   



€zMetadata.list_definedÚNonec                 C  s   | j  |¡ d S r   )r"   r5   ©r-   r/   r)   r)   r*   Úadd_definedu   s   zMetadata.add_definedÚboolc                 C  s   ||   ¡ v S r   )r`   rb   r)   r)   r*   Úhas_definedx   s   zMetadata.has_definedN)r_   r_   c                C  s$   |   |¡r
t| |ƒS |d ur|S d S r   )re   rF   )r-   r/   r_   r)   r)   r*   Úget_defined{   s
   

ÿzMetadata.get_definedF)Údistinctrg   c                C  sB   |   |¡s|d ur|rt| |d ƒ|krd S t| ||ƒ d S d S d S r   )re   rF   Úsetattr)r-   r/   r1   rg   r)   r)   r*   Úset_not_defined   s
   ýzMetadata.set_not_defined©ÚbasepathÚ
descriptorúUnion[types.IDescriptor, str]rk   úOptional[str]r   c             
   C  sl   g }t  ¡ }z	| j||d W n ty+ } z|jr|jn|jg}W Y d }~nd }~ww tjjj	|j
|dS )Nrj   )ÚtimeÚerrors)r   ÚTimerÚfrom_descriptorr   ÚreasonsÚerrorr   Úfrictionlessr   Úfrom_validationro   )r%   rl   rk   rp   ÚtimerÚ	exceptionr)   r)   r*   Úvalidate_descriptor‰   s    €ÿÿzMetadata.validate_descriptorÚoptionsr   c                 O  s   | |i t  |¡¤ŽS r   )r   Úremove_non_values)r%   r   rz   r)   r)   r*   Úfrom_options   s   zMetadata.from_optionsÚallow_invalidc                 K  s  d }t |tƒr%|}| dd ¡}t ||¡}dt | j¡jv r%t 	|¡|d< |  
|¡}|  |¡ | d¡}t| ƒ d¡}t |tƒrB|}|  |¡}|jpMtjj}	| |¡ t| |¡ƒ}
|si|
ri|	dd}t||
d‚|j|fi t |¡¤Ž}|r||_| ¡ |_|S )Nrk   r:   údescriptor is not valid©Únote©rs   )r7   r0   Úpopr   Újoin_basepathÚinspectÚ	signatureÚ__init__Ú
parametersÚparse_basepathÚmetadata_retrieveÚmetadata_transformÚgetÚvarsÚmetadata_select_classÚmetadata_Errorr   Úfrictionless_errorsÚMetadataErrorr8   Úmetadata_validater   Úmetadata_importr{   Úmetadata_descriptor_pathrA   Úmetadata_descriptor_initial)r%   rl   r}   rz   Údescriptor_pathrk   r:   Ú
class_typeÚClassr   rp   rt   Úmetadatar)   r)   r*   rr   ¡   s4   








zMetadata.from_descriptor)Úvalidater™   útypes.IDescriptorc                C  sF   |   ¡ }|r!| jptjj}t|  |¡ƒ}|r!|dd}t||d‚|S )Nr~   r   r   )Úmetadata_exportrŽ   r   r   r   r8   r‘   r   )r-   r™   rl   r   rp   rt   r)   r)   r*   rA   Å   s   
zMetadata.to_descriptorc                 C  s"   |   ¡ }| jr| j|kr| jS |S )z4Export metadata as a descriptor or a descriptor path)rA   r“   r”   )r-   rl   r)   r)   r*   Úto_descriptor_sourceÏ   s
   
zMetadata.to_descriptor_sourcec                 K  s   t | ƒj|  ¡ fi |¤ŽS )zCreate a copy of the metadata)r:   rr   rA   )r-   rz   r)   r)   r*   Úto_copy×   s   zMetadata.to_copyc                 C  s   |   ¡ S )z9Export metadata as dictionary (alias for "to_descriptor"))rA   r,   r)   r)   r*   Úto_dictÛ   s   zMetadata.to_dictÚpathÚencoder_classúOptional[Any]c              
   C  sh   | j ptjj}tj|  ¡ |d}|r2z	t ||¡ W |S  ty1 } z
t	|t
|ƒdƒ|‚d}~ww |S )zYSave metadata as a json

        Parameters:
            path (str): target path
        )r    r   N)rŽ   r   r   r   r   Úto_jsonrA   Ú
write_filerJ   r   r0   )r-   rŸ   r    r   rO   Úexcr)   r)   r*   r¢   ß   s   þ€ÿzMetadata.to_jsonc              
   C  sd   | j ptjj}t |  ¡ ¡}|r0z	t ||¡ W |S  ty/ } z
t	|t
|ƒdƒ|‚d}~ww |S )zYSave metadata as a yaml

        Parameters:
            path (str): target path
        r   N)rŽ   r   r   r   r   Úto_yamlrA   r£   rJ   r   r0   )r-   rŸ   r   rO   r¤   r)   r)   r*   r¥   ð   s   þ€ÿzMetadata.to_yamlÚtablec              
   C  sp   | j ptjj}tjj ¡ }|j| |d}|r6z	t 	||¡ W |S  t
y5 } z
t|t|ƒdƒ|‚d}~ww |S )aF  Convert metadata as a markdown

        This feature has been contributed to the framework by Ethan Welty (@ezwelty):
        - https://github.com/frictionlessdata/frictionless-py/issues/837

        Parameters:
            path (str): target path
            table (bool): if true converts markdown to tabular format
        )r¦   r   N)rŽ   r   r   r   Úfrictionless_formatsÚmarkdownÚMarkdownMapperÚwrite_metadatar   r£   rJ   r   r0   )r-   rŸ   r¦   r   ÚmapperrO   r¤   r)   r)   r*   Úto_markdownÿ   s   
þ€ÿzMetadata.to_markdownzClassVar[str]Úmetadata_typezClassVar[Optional[Type[Error]]]rŽ   zClassVar[Dict[str, Any]]Úmetadata_profileÚmetadata_profile_patchÚmetadata_profile_mergedr+   zSet[str]r"   zDict[str, Any]r!   r“   zOptional[types.IDescriptor]r”   r:   úType[Metadata]c                 C  s6   |rd| j › d|› }| jptjj}t||dƒ‚| S )Nzunsupported type for "z": r   )r­   rŽ   r   r   r   r   )r%   r:   r€   r   r)   r)   r*   r      s
   zMetadata.metadata_select_classúOptional[Type[Metadata]]c                 C  s   d S r   r)   )r%   r/   r)   r)   r*   Úmetadata_select_property_class(  s   z'Metadata.metadata_select_property_classc                 C  sF   | j  dd ¡s | j| _t|  ¡ ƒD ]}t | jt|di ƒ¡| _q| jS )Nr°   r¯   )	r;   r‹   r®   r°   ÚreversedÚmror   Úmerge_jsonschemarF   )r%   Úsubclsr)   r)   r*   Úmetadata_ensure_profile,  s   
þz Metadata.metadata_ensure_profile)Úsizer¹   úOptional[int]c             
   C  sF  z~t |tƒrt|ƒW S t |ttfƒr{t |tƒrt|ƒ}t |¡rBtjj	j
}|j|dd}| ¡  d|j_|j |¡ d¡}| ¡  nt|dd}| |¡}W d   ƒ n1 sXw   Y  | d¡rltj t |¡¡}nt |¡}t |tƒsxJ ‚|W S tdƒ‚ ty¢ } z| jpŒtjj}	d|› d|› d	}
t |	|
d
ƒ|‚d }~ww )NT)Ústreamzutf-8)Úencodingz.yamlz descriptor type is not supportedzcannot retrieve metadata "z" because "ú"r   )!r7   r   r   r0   r   r   Úis_remote_pathr   ru   ÚsystemÚhttp_sessionr‹   Úraise_for_statusÚrawÚdecode_contentÚreadÚdecodeÚcloseÚopenÚendswithÚyamlÚ	safe_loadÚioÚStringIOÚjsonÚloadsr9   Ú	TypeErrorrJ   rŽ   r   r   r   )r%   rl   r¹   ÚsessionÚresponseÚcontentÚfiler˜   rx   r   r€   r)   r)   r*   r‰   7  s8   





ÿ

€ýzMetadata.metadata_retrievec           	      C  sˆ   |   ¡ }| di ¡D ]7}| |¡}|  |¡}|rAt|tƒr7|D ]}t|tƒr5| d¡}| |¡}| |¡ qq
t|tƒrA| |¡ q
d S )NÚ
propertiesr:   )r¸   r‹   r³   r7   r8   r9   r   rŠ   )	r%   rl   Úprofiler/   r1   r—   Úitemr:   Ú	ItemClassr)   r)   r*   rŠ   W  s"   






€ü

€õzMetadata.metadata_transform)rÕ   Úerror_classrÕ   ú'Optional[Union[types.IDescriptor, str]]rØ   úOptional[Type[Error]]úGenerator[Error, None, None]c                c  s0   |}|s| j ptjj}|p|  ¡ }t|tƒr|  |¡}tjj	 
|¡}||ƒ}| |¡D ]%}d tt|jƒ¡}t dd|j¡}	|	}
|rK|
› d|› d}
||
dV  q,| di ¡D ]=}| |¡}|  |¡}|r•t|tƒrˆ|D ]}t|tƒr†| d¡}| |¡}| |¡E d H  qmqXt|tƒr•| |¡E d H  qXd S )	Nú/z\s+rN   z at property 'ú'r   rÔ   r:   )rŽ   r   r   r   r¸   r7   r0   r‰   Ú
jsonschemaÚ
validatorsÚvalidator_forÚiter_errorsÚjoinÚmaprŸ   ÚreÚsubÚmessager‹   r³   r8   r9   r   r‘   )r%   rl   rÕ   rØ   r   Úvalidator_classÚ	validatorrt   Úmetadata_pathræ   r€   r/   r1   r—   rÖ   r:   r×   r)   r)   r*   r‘   g  s@   €







€ü
€õzMetadata.metadata_validate)Úwith_basepathrê   c                K  s:  i }|   ¡ }| dd ¡}tt| dd ƒtƒ}| di ¡D ]j}| |d ¡}	|	d u s+|	i kr,q|dkr3|r3q|  |¡}
|
r|t|	tƒrpt|	ƒD ]+\}}t|t	ƒr`| d¡}|
 
|¡}|j||d|	|< qCt|tƒrn|
j||d|	|< qCnt|	t	ƒr||
j|	|d}	| t |¡|	¡ q| |¡ |r‘||d< | di |¤Ž}||_|S )Nrk   r:   rÔ   rj   r)   )r¸   r‚   r7   rF   r0   r‹   r³   r8   Ú	enumerater9   r   r’   rr   Ú
setdefaultr   Ú	snakecaser#   r   )r%   rl   rê   rz   Úmerged_optionsrÕ   rk   Úis_typed_classr/   r1   r—   ÚixrÖ   r:   r×   r˜   r)   r)   r*   r’   ‹  s>   





€ú

zMetadata.metadata_import)Úexcluderñ   c                C  sÔ   i }|   ¡ }| di ¡D ]U}||v rq|dkr |  t |¡¡s qt| t |¡d ƒ}|  |¡}|d u s;t|tƒr<|i kr<q|rRt|t	ƒrKdd„ |D ƒ}n| 
¡ }|sRqt|t	tfƒr]t|ƒ}|||< q| | j¡ |S )NrÔ   r:   c                 S  s   g | ]}|  ¡ ‘qS r)   )rœ   )Ú.0rÖ   r)   r)   r*   Ú
<listcomp>¿  s    z,Metadata.metadata_export.<locals>.<listcomp>)r¸   r‹   re   r   rí   rF   r³   r7   r9   r8   rœ   r   r#   r   )r-   rñ   rl   rÕ   r/   r1   r—   r)   r)   r*   r›   ±  s,   


zMetadata.metadata_export)r   r   r   r   )r/   r0   r1   r   )r=   r0   )r=   r[   )r/   r0   r=   ra   )r/   r0   r=   rd   )r/   r0   r_   r   r=   r   )r/   r0   r1   r   rg   rd   r=   ra   )rl   rm   rk   rn   r=   r   )r   r   rz   r   r=   r   )F)rl   rm   r}   rd   rz   r   r=   r   )r™   rd   r=   rš   )r=   rm   )rz   r   r=   r   )r=   rš   )NN)rŸ   rn   r    r¡   r=   r0   r   )rŸ   rn   r=   r0   )NF)rŸ   rn   r¦   rd   r=   r0   )r:   rn   r=   r±   )r/   r0   r=   r²   )rl   rm   r¹   rº   r=   rš   )rl   rš   )rl   rš   rÕ   rÙ   rØ   rÚ   r=   rÛ   )rl   rš   rê   rd   rz   r   r=   r   )rñ   r[   r=   rš   )0rQ   rR   rS   Ú__doc__r   Ú__annotations__r   r.   r<   rB   ÚpropertyrL   rZ   r`   rc   re   rf   ri   Úclassmethodry   r|   rr   rA   rœ   r   rž   r¢   r¥   r¬   rŽ   r®   r¯   r°   r+   Úsetr"   r!   r“   r”   r   r³   r¸   r‰   rŠ   r‘   r’   r›   Ú__classcell__r)   r)   r'   r*   r   %   s|   
 





üý#



ÿ

ÿû#ü%r   )'Ú
__future__r   r„   rË   rÍ   r?   rä   Úcollections.abcr   r    r   Úpathlibr   Útypingr   r   r   r	   r
   r   r   r   r   r   Útyping_extensionsr   rD   r   rx   r   r   Úvendorsr   r   rt   r   Úreportr   r   r)   r)   r)   r*   Ú<module>   s(    0