o
    QDi0                     @  sL  d dl m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 dd	lmZmZ dd
lmZ ddlmZ ddlmZ erddl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' ddl(m)Z) ddl*m+Z+ ddl,m-Z- ddl.m/Z/ ddl0m1Z1 G dd dZ2e2 Z3dS )    )annotationsN)OrderedDict)contextmanager)cached_property)import_module)TYPE_CHECKINGAnyClassVarDictListOptionalType   )errorssettings)Control)FrictionlessException)platform)types)Check)Error)Package)Step)Resource)Field   )Adapter)Loader)Parser)Pluginc                   @  sH  e Zd ZU dZg dZded< ejZded< 	 ej	Z
ded< 	 ejZd	ed
< 	 dd Zedd ZedYddZedZddZd[ddZd\ddZedddddd]d%d&Zddd'd(d^d1d2Zd_d6d7Zd`d9d:Zdad<d=Zdbd?d@ZdcdddCdDZdcdedFdGZdcdfdIdJZdcdgdLdMZdcdhdOdPZ 	dcddQdidTdUZ!dcdjdWdXZ"dS )kSystemzSystem representation

    This class provides an ability to make system Frictionless calls.
    It's available as `frictionless.system` singletone.

    )create_adaptercreate_loadercreate_parserdetect_resourcedetect_field_candidatesselect_check_classselect_control_classselect_error_classselect_field_classselect_package_classselect_resource_classselect_step_classzClassVar[List[str]]supported_hooksbooltrustedztypes.IOnerroronerrorztypes.IStandards	standardsc                 C  s   t  | _d | _d S N)r   _System__dynamic_plugins_System__http_session)self r6   S/var/www/Datamplify/venv/lib/python3.10/site-packages/frictionless/system/system.py__init__K   s   
zSystem.__init__c                 C  s*   | j stj }|jtj || _ | j S )zReturn a HTTP session

        This method will return a new session or the session
        from `system.use_http_session` context manager

        Returns:
            requests.Session: a HTTP session
        )r4   r   requestsSessionheadersupdater   DEFAULT_HTTP_HEADERS)r5   http_sessionr6   r6   r7   r>   O   s
   

zSystem.http_sessionreturnDict[str, Any]c                 C  sZ   i }| j D ]%}t ||< | j D ]\}}|tt|v r)t||d }||| |< qq|S r2   )r-   r   pluginsitemsvarstypegetattr)r5   methodsactionnamepluginfuncr6   r6   r7   rF   _   s   

zSystem.methodsOrderedDict[str, Plugin]c                 C  s   t  }t D ]}|jdrt|j}|||jdd< qdD ]-}td| }|jrMtj	
|j}t|gD ]\}}}td| d| }|||< q9q t | j}| D ]\}}t||  dd }	|	ro|	 }
|
||< qW|S )Nfrictionless_ )schemesformatsportalszfrictionless..r   )r   pkgutiliter_modulesrH   
startswithr   replace__file__ospathdirnamer3   rB   rE   
capitalize)r5   modulesitemmodulegrouprX   _rH   rA   r   rI   r6   r6   r7   rA   j   s,   


zSystem.pluginsrH   strrI   r   c                 C  s,   || j |< d| jv r| jd= | jd= dS dS )zRegister a plugin

        Parameters:
            name (str): plugin name
            plugin (Plugin): plugin to register
        rF   rA   N)r3   __dict__)r5   rH   rI   r6   r6   r7   register   s
   

zSystem.registerc                 C  s0   | j |d d| jv r| jd= | jd= dS dS )zUDeregister a plugin

        Parameters:
            name (str): plugin name
        NrF   rA   )r3   popra   )r5   rH   r6   r6   r7   
deregister   s
   
zSystem.deregisterN)r/   r0   r1   r>   Optional[bool]Optional[types.IOnerror]Optional[types.IStandards]r>   Optional[Any]c          	      c  st    | j }| j}| j}| j}|d ur|| _ |d ur|| _|d ur"|| _|d ur)|| _| V  || _ || _|| _|| _d S r2   )r/   r0   r1   r4   )	r5   r/   r0   r1   r>   current_trustedcurrent_onerrorcurrent_standardscurrent_http_sessionr6   r6   r7   use_context   s$   

zSystem.use_contextF)controlbasepath	packagifysourcer   rn   Optional[Control]ro   Optional[str]rp   Optional[Adapter]c                C  s<   d}| j d  D ]}|||||d}|dur|  S q	dS )zCreate adapter

        Parameters:
            resource (Resource): loader resource

        Returns:
            Loader: loader
        Nr!   )rn   rp   ro   )rF   values)r5   rq   rn   ro   rp   adapterrJ   r6   r6   r7   r!      s   zSystem.create_adapterresourcer   r   c                 C  R   d}|j }| jd  D ]}||}|dur|  S qd| d}ttj|d)zCreate loader

        Parameters:
            resource (Resource): loader resource

        Returns:
            Loader: loader
        Nr"   zscheme "" is not supportednote)schemerF   ru   r   r   SchemeError)r5   rw   loaderrH   rJ   r{   r6   r6   r7   r"         	zSystem.create_loaderr   c                 C  rx   )zCreate parser

        Parameters:
            resource (Resource): parser resource

        Returns:
            Parser: parser
        Nr#   zformat "ry   rz   )formatrF   ru   r   r   FormatError)r5   rw   parserrH   rJ   r{   r6   r6   r7   r#      r   zSystem.create_parserNonec                 C  s8   |j | | jd  D ]}|| q|jpd|_dS )zeHook into resource detection

        Parameters:
            resource (Resource): resource

        r$   fileN)detectorr$   rF   ru   datatype)r5   rw   rJ   r6   r6   r7   r$      s   
zSystem.detect_resourceList[dict[str, Any]]c                 C  s*   t j }| jd  D ]}|| q|S )zCreate candidates

        Returns:
            dict[]: an ordered by priority list of type descriptors for type detection
        r%   )r   DEFAULT_FIELD_CANDIDATEScopyrF   ru   )r5   
candidatesrJ   r6   r6   r7   r%     s   

zSystem.detect_field_candidatesrD   Type[Check]c                 C     |st jjS | jd  D ]}||}|d ur|  S qtt j D ]}t|r8t|	dd |kr8|  S q#d| d}t
tj|d)Nr&   rD   zcheck type "ry   rz   )r   frictionlessr   rF   ru   rC   frictionless_checksinspectisclassgetr   r   
CheckErrorr5   rD   rJ   Classr{   r6   r6   r7   r&        
zSystem.select_check_classType[Control]c                 C  T   |st jjS | jd  D ]}||}|d ur|  S qd| d}ttj|d)Nr'   zcontrol type "ry   rz   )r   r   r   rF   ru   r   r   ControlErrorr   r6   r6   r7   r'        zSystem.select_control_classType[Error]c                 C  s   |st jjS | jd  D ]}||}|d ur|  S qtt j D ]}t|r8t|	dd |kr8|  S q#d| d}t
tj|d)Nr(   rD   zerror type "ry   rz   )r   r   r   rF   ru   rC   frictionless_errorsr   r   r   r   r   r   r6   r6   r7   r(   (  r   zSystem.select_error_classType[Field]c                 C  r   )Nr)   rD   zfield type "ry   rz   )r   r   r   rF   ru   rC   frictionless_fieldsr   r   r   r   r   
FieldErrorr   r6   r6   r7   r)   6  r   zSystem.select_field_classType[Package]c                 C  r   )Nr*   zpackage type "ry   rz   )r   r   r   rF   ru   r   r   r   r   r6   r6   r7   r*   D  r   zSystem.select_package_classr   r   Type[Resource]c                C  s   |s|st jjS | jd  D ]}|||d}|d ur|  S qtt j D ]'}t|rN|r>t|	dd |kr>|  S |rNt|	dd |krN|  S q'd|pS| d}t
tj|d)Nr+   r   r   rD   zresource type "ry   rz   )r   r   r   rF   ru   rC   frictionless_resourcesr   r   r   r   r   ResourceError)r5   rD   r   rJ   r   r{   r6   r6   r7   r+   N  s$   
zSystem.select_resource_class
Type[Step]c                 C  r   )Nr,   rD   zstep type "ry   rz   )r   r   r   rF   ru   rC   frictionless_stepsr   r   r   r   r   	StepErrorr   r6   r6   r7   r,   b  r   zSystem.select_step_class)r?   r@   )r?   rK   )rH   r`   rI   r   )rH   r`   )r/   re   r0   rf   r1   rg   r>   rh   )
rq   r   rn   rr   ro   rs   rp   r.   r?   rt   )rw   r   r?   r   )rw   r   r?   r   )rw   r   r?   r   )r?   r   r2   )rD   rs   r?   r   )rD   rs   r?   r   )rD   rs   r?   r   )rD   rs   r?   r   )rD   rs   r?   r   )rD   rs   r   rs   r?   r   )rD   rs   r?   r   )#__name__
__module____qualname____doc__r-   __annotations__r   DEFAULT_TRUSTEDr/   DEFAULT_ONERRORr0   DEFAULT_STANDARDSr1   r8   propertyr>   r   rF   rA   rb   rd   r   rm   r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r6   r6   r6   r7   r    #   sT   
 



%




r    )4
__future__r   r   rW   rR   collectionsr   
contextlibr   	functoolsr   	importlibr   typingr   r   r	   r
   r   r   r   rM   r   r   dialectr   	exceptionr   r   r   	checklistr   errorr   packager   pipeliner   rw   r   schemar   rv   r   r~   r   r   r   rI   r   r    systemr6   r6   r6   r7   <module>   s:    $  
P