o
    QDi`                     @  s8  d dl mZ d dlZd dlZd dlZd dlmZmZmZm	Z	m
Z
mZmZ d dlmZ ddl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 ddlmZ ddlmZ ddlmZm Z m!Z!m"Z" ddl#m$Z$ erddlm%Z% ddlm&Z&m'Z' ddl(m)Z) ddlm*Z*m+Z+ ddlm,Z, G dd deZ-dS )    )annotationsN)TYPE_CHECKINGAnyDictListOptionalTupleUnion)Field   )errorshelpers)Analyzer)Dialect)FrictionlessException)Indexer)platform)Resource)system)HeaderLookupRowTable)Transformer)types)IOnProgressIOnRow)Pipeline)LoaderParser)
IRowStreamc                      sJ  e Zd ZdZdZdZ fddZedddZedd
dZ	edddZ
edddZedddZedddZedddZedddZeddd Zdd"d#Zd$d% Zd&d' Zd(d) Zd*d+ Zd,d- Zd.d/ Zd0d1 Zd2d3 Zd4d5 Zd6d7 Zd8d9 Zdd>d?ZeddFdGZeddHdIZ ddMdNZ!ddOdPZ"dQdRddVdWZ#dQdRddYdZZ$dd\d]Z%	QdddbdcZ&dddeddgdhZ'dddiddkdlZ(	Q	QdddrdsZ)dQdQdQdQdtdd|d}Z*dQdddddQdQdddQd~dddZ+dddZ,ddddZ-dQddddZ.dQddddZ/ddddddZ0edddZ1ddddZ2	QddddZ3  Z4S )TableResourcetableTc                   sD   d | _ d | _d | _d | _d | _d | _d | _d | _d | _t	 
  d S N)_TableResource__loader_TableResource__parser_TableResource__buffer_TableResource__sample_TableResource__labels_TableResource__fragment_TableResource__header_TableResource__lookup_TableResource__row_streamsuper__attrs_post_init__self	__class__ U/var/www/Datamplify/venv/lib/python3.10/site-packages/frictionless/resources/table.pyr.   "   s   z!TableResource.__attrs_post_init__returntypes.IBufferc                 C     | j du r	td| j S )zFile's bytes used as a sample

        These buffer bytes are used to infer characteristics of the
        source file (e.g. encoding, ...).
        Nz"resource is not open or non binary)r&   r   r/   r3   r3   r4   buffer0      
zTableResource.buffertypes.ISamplec                 C  r7   )zTable's lists used as sample.

        These sample rows are used to infer characteristics of the
        source file (e.g. schema, ...).

        Returns:
            list[]?: table sample
        Nresource is not open)r'   r   r/   r3   r3   r4   sample;      

zTableResource.sampletypes.ILabelsc                 C  r7   )z;
        Returns:
            str[]?: table labels
        Nr;   )r(   r   r/   r3   r3   r4   labelsI      
zTableResource.labelstypes.IFragmentc                 C  r7   )zTable's lists used as fragment.

        These fragment rows are used internally to infer characteristics of the
        source file (e.g. schema, ...).

        Returns:
            list[]?: table fragment
        Nr;   )r)   r   r/   r3   r3   r4   fragmentS   r=   zTableResource.fragmentr   c                 C  r7   )z;
        Returns:
            str[]?: table header
        Nr;   )r*   r   r/   r3   r3   r4   headera   r@   zTableResource.headerr   c                 C  r7   )z;
        Returns:
            str[]?: table lookup
        Nr;   )r+   r   r/   r3   r3   r4   lookupk   r@   zTableResource.lookuptypes.ICellStreamc                 C  s   | j du r	td| j jS )zcCell stream in form of a generator

        Yields:
            gen<any[][]>?: cell stream
        Nr;   )r%   r   cell_streamr/   r3   r3   r4   rF   u   s   
zTableResource.cell_streamr    c                 C  r7   )znRow stream in form of a generator of Row objects

        Yields:
            gen<Row[]>?: row stream
        Nr;   )r,   r   r/   r3   r3   r4   
row_stream   r9   zTableResource.row_streamboolc                 C  s
   | j du S )zRWhether the table is closed

        Returns:
            bool: if closed
        N)r%   r/   r3   r3   r4   closed   s   
zTableResource.closedNonec                 C  s4   | j r| j   d| _ | jr| j  d| _dS dS )z+Close the resource as "filelike.close" doesN)r%   closer$   r/   r3   r3   r4   rK      s   


zTableResource.closec                 C  sx   |    z+|   |   |   |   |   |   |   |   | 	  | 
  W | S  ty;   |     w )z#Open the resource as "io.open" does)rK   _TableResource__open_parser_TableResource__open_buffer_TableResource__open_sample_TableResource__open_dialect_TableResource__open_labels_TableResource__open_fragment_TableResource__open_schema_TableResource__open_header_TableResource__open_lookup_TableResource__open_row_stream	Exceptionr/   r3   r3   r4   open   s"   
zTableResource.openc                 C  s   t | | _| j  d S r#   )r   create_parserr%   rW   r/   r3   r3   r4   __open_parser   s   zTableResource.__open_parserc                 C  s6   | j r| j jr| j jj| _d S | jr| jj| _d S d S r#   )r%   requires_loaderloaderr8   r&   r$   r/   r3   r3   r4   __open_buffer   s
   zTableResource.__open_bufferc                 C  s   | j r
| j j| _d S d S r#   )r%   r<   r'   r/   r3   r3   r4   __open_sample   s   zTableResource.__open_samplec                 C  s&   | j d | jj| j| jd| _d S )Ndialectr^   )metadata_assignedadddetectordetect_dialectr<   r^   r/   r3   r3   r4   __open_dialect   s   zTableResource.__open_dialectc                 C     | j | j| _d S r#   )r^   read_labelsr<   r(   r/   r3   r3   r4   __open_labels      zTableResource.__open_labelsc                 C  re   r#   )r^   read_fragmentr<   r)   r/   r3   r3   r4   __open_fragment   rh   zTableResource.__open_fragmentc                 C  sF   | j d | jj| j| j| jt | j	j
d| _t| jj| j_d S )Nschema)r?   rk   field_candidatesheader_case)r`   ra   rb   detect_schemarB   r?   rk   r   detect_field_candidatesr^   rm   lenfieldsstatsr/   r3   r3   r4   __open_schema   s   zTableResource.__open_schemac                 C  sz   | j d usJ t| j | jj| jj| jj d| _| jj	s9| jj
d }tjdkr0t|jt d S tjdkr;t|d S d S )N)rq   row_numbersignore_caser   warnraise)r(   r   rk   rq   r^   header_rowsrm   r*   rC   validr   r   onerrorwarningsrv   messageUserWarningr   )r0   errorr3   r3   r4   __open_header   s   

zTableResource.__open_headerc              	     sV  t  | _| jjD ]}|d d }t|d d }|dkr | js q|rN| js/d}ttj|d| j	|sGd| j
 d| d	}ttj|d| j|}n|  }|jrYg |j_| j|i  || j| v rhqt | j| |< |ssq|+ |jD ] t fd
d|D }t|d hkrqy| j| | | qyW d    n1 sw   Y  qd S )N	referenceresourcerq    z"package is required for FK: "{fk}"notez-failed to handle a foreign key for resource "z" as resource "z" does not existc                 3  s    | ]}  |V  qd S r#   )get.0
field_namerowr3   r4   	<genexpr>  s    z.TableResource.__open_lookup.<locals>.<genexpr>)r   r+   rk   foreign_keystuplepackager   r   ResourceErrorhas_resourcenameget_resourceto_copy
setdefaultsetrG   ra   )r0   fksource_name
source_keyr   
source_rescellsr3   r   r4   __open_lookup   sB   
zTableResource.__open_lookupc                   sT  d}g g i dj jD ]&}|d7 }d |j d |  ||| | fd |j< qi i g tj jj jD ]}|j	
drRi |j< dqCjrj jD ]%}i }|d	 d
 |d< t|d	 d |d< t|d |d< | dqZjj  fdd}jjrj jD ]}| q| _d S )Nr   )namesobjectsmapping   r   r   r   uniqueTr   r   
sourceNamerq   	sourceKey	targetKeyc            
      3  s   dj _D ]7\} }j  jd7  _t|| d rSrS D ]/} | }|d urR| |} j| |< |rRtjj}d| }| ||d} j	| q#rj
jrz
 jj}W n tyr   jjrpJ Y n7w t|d hkrd}tjj |d} j	| n|} j|< |rd| }tjj |d} j	| rrD ]j}j|d }	|	rt fd	d
|d D }t|d hkrq||	|d t v }|sdd|d ddd
 |D |d d|d f }tjj |t|d t||d t|d d} j	| qtjdkr< js< jd }tjdkr5t|t|jt  V  qd S )Nr   r   )
field_info
row_numberz%the same as in the row at position %s)r   r   z/cells composing the primary keys are all "None"r   r   c                 3      | ]} | V  qd S r#   r3   )r   r   r   r3   r4   r   h      zFTableResource.__open_row_stream.<locals>.row_stream.<locals>.<genexpr>r   r   z@for "%s": values "%s" not found in the lookup table "%s" as "%s"z, c                 s  s    | ]}t |V  qd S r#   )str)r   dr3   r3   r4   r   q  r   )r   field_namesfield_valuesreference_namereference_field_namesignorerw   ) rr   rowsr   keysr   r   r   UniqueErrorfrom_rowappendrk   primary_keyprimary_key_cellsr^   rm   KeyErrorrC   ry   r   PrimaryKeyErrorrD   r   joinForeignKeyErrorlistr   rz   r   r{   rv   r|   r}   )
r   r   r   cellmatchfuncr   r~   groupgroup_lookupenumerated_content_streamr   foreign_groupsis_integritymemory_primarymemory_uniquer0   r   r4   rG   5  s   





z3TableResource.__open_row_stream.<locals>.row_stream)rk   rq   r   r   r   create_cell_readercreate_cell_writerrH   r   constraintsr   r+   r   r   r^   read_enumerated_content_streamrF   rb   schema_sync-remove_missing_required_label_from_field_infor,   )r0   field_numberfieldr   r   rG   r3   r   r4   __open_row_stream	  sH   

WzTableResource.__open_row_streamr   r
   r   Dict[str, Any]c                 C  s6   | j j}| |j|d | j|r| |j| d S d S )Nr   )r^   rm   label_is_missingr   r?   remove_field_from_field_info)r0   r   r   is_case_sensitiver3   r3   r4   r     s   z;TableResource.remove_missing_required_label_from_field_infor   r   expected_field_names	List[str]table_labelscase_sensitivec                 C  s8   |s|   } dd |D }dd |D }| |vo| |v S )zWCheck if a schema field name is missing from the TableResource
        labels.
        c                 S     g | ]}|  qS r3   lowerr   labelr3   r3   r4   
<listcomp>      z2TableResource.label_is_missing.<locals>.<listcomp>c                 S  r   r3   r   r   r3   r3   r4   r     s    r   )r   r   r   r   r3   r3   r4   r     s   
zTableResource.label_is_missingc                 C  s0   |d  | }|d |= |d |= |d | = d S )Nr   r   r   )index)r   r   field_indexr3   r3   r4   r     s   

z*TableResource.remove_field_from_field_infor   r   Tuple[Any, ...]c                   s   t  fdd|  |D S )zUCreate a tuple containg all cells from a given row associated to primary
        keysc                 3  r   r#   r3   r   r   r3   r4   r     r   z2TableResource.primary_key_cells.<locals>.<genexpr>)r   primary_key_labels)r0   r   r   r3   r   r4   r     s   zTableResource.primary_key_cellsc                   s:   |r| j j}|S dd | j jD   fdd|jD }|S )z;Create a list of TableResource labels that are primary keysc                 S  r   r3   r   )r   pkr3   r3   r4   r     r   z4TableResource.primary_key_labels.<locals>.<listcomp>c                   s   g | ]
}|   v r|qS r3   r   r   lower_primary_keyr3   r4   r     s    )rk   r   r   )r0   r   r   labels_primary_keyr3   r   r4   r     s   
z TableResource.primary_key_labelsNsizer   Optional[int]List[List[Any]]c                C  `   t | ! g }| jD ]}|| |rt||kr nq|W  d   S 1 s)w   Y  dS )zRRead lists into memory

        Returns:
            any[][]: table lists
        N)r   ensure_openrF   r   rp   )r0   r   resultr   r3   r3   r4   
read_cells     

$zTableResource.read_cells	List[Row]c                C  r   )zNRead rows into memory

        Returns:
            Row[]: table rows
        N)r   r   rG   r   rp   )r0   r   r   r   r3   r3   r4   	read_rows  r   zTableResource.read_rowsr   c                 C  s"   |   }| j}| j}t|||dS )N)rk   rC   r   )r   rC   rk   r   )r0   r   rC   rk   r3   r3   r4   
read_table  s   zTableResource.read_tabletargetOptional[Union[Resource, Any]]optionsr   c                 K  sH   |}t |tst|fi |}t |tstdt|}||  |S )aa  Write this resource to the target resource

        You can pass:
        - a target resource instance (no extra options are allowed) OR
        - path and options to create a new resource.

        Parameters:
            target (Resource|Any): target path or target resource instance
            **options (dict): resource constructor options
        ztarget must be a table resource)
isinstancer   r!   r   r   rX   write_row_stream)r0   r   r   r   parserr3   r3   r4   write_table  s   



zTableResource.write_tableF)rr   rr   c                C  s   | j sd}ttj|d| 1 |s	 W d   dS t| j d| jj | _	| jj
| _
| jj| _| jj| _W d   dS 1 sCw   Y  dS )zfInfer metadata

        Parameters:
            stats: stream file completely and infer stats
        z0Resource.infer cannot be used on a open resourcer   Nzsha256:)rI   r   r   r   r   pass_throughrG   rr   sha256hashbytesrq   r   )r0   rr   r   r3   r3   r4   infer  s   

"zTableResource.inferdetailedr   c                C  s   t  }|j| |dS )zAnalyze the resource

        This feature is currently experimental, and its API may change
        without warning.

        Parameters:
            detailed: do detailed analysis

        Returns:
            dict: resource analysis

        r   )r   analyze_table_resource)r0   r   analyzerr3   r3   r4   analyze  s   zTableResource.analyzeto_path	to_formatOptional[str]
to_dialectOptional[Union[Dialect, str]]c                 C  sF   |pt  }t|||d}tj|rd| d}t|| | |S )N)pathformatr^   z%Cannot convert to the existent path "")r   r!   osr  existsr   write)r0   r  r  r  r^   r   r   r3   r3   r4   convert1  s   

zTableResource.convert)r   filterprocess
limit_rowsr   r  Optional[types.IFilterFunction]r   Optional[types.IProcessFunction]r  types.ITabularDatac                  sX    sdd  | j |d}|rt||n|} r! fdd|D n|}|p'| jt|iS )Nc                 S  s   |   S r#   )to_dictr   r3   r3   r4   <lambda>J  s    z'TableResource.extract.<locals>.<lambda>r   c                 3  s    | ]} |V  qd S r#   r3   r   r   r  r3   r4   r   M  r   z(TableResource.extract.<locals>.<genexpr>)r   builtinsr  r   r   )r0   r   r  r  r  datar3   r  r4   extractA  s   zTableResource.extract)r   fastwith_metadataon_rowon_progressuse_fallbackqsv_pathdatabase_urlr  r  r  Optional[IOnRow]r  Optional[IOnProgress]r   r!  c          
      C  s2   |p| j }t| ||||||||d	}	|	  |gS )N)	r   database
table_namer  r  r  r  r   r!  )r   r   r   )
r0   r"  r   r  r  r  r  r   r!  indexerr3   r3   r4   r   R  s   
zTableResource.indexpipeliner   c                 C  s   t  }|| |S r#   )r   transform_table_resource)r0   r(  transformerr3   r3   r4   	transformo  s   zTableResource.transformlooktypec                 K  s0   |dv sJ t t| jdd|di |}|S )aq  Create a view from the resource

        See PETL's docs for more information:
        https://platform.petl.readthedocs.io/en/stable/util.html#visualising-tables

        Parameters:
            type (look|lookall|see|display|displayall): view's type
            **options (dict): options to be passed to PETL

        Returns
            str: resource's view
        )r,  lookallseedisplay
displayallT)	normalizeNr3   )r   getattrto_petl)r0   r-  r   viewr3   r3   r4   to_viewu  s    zTableResource.to_viewr_   r^   Optional[Dialect]c                C  "   |pt  }| td|d}|jS )z+Helper to export resource as an inline datainliner	  r^   r   r  r   r  r0   r^   r   r3   r3   r4   	to_inline     
zTableResource.to_inlinec                C  r8  )z0Helper to export resource as an Pandas dataframepandasr:  r;  r<  r3   r3   r4   	to_pandas  r>  zTableResource.to_pandasjsonrB  c                C  sb   g }t |   || j  | jD ]}||j|d qW d   |S 1 s*w   Y  |S )zCreate a snapshot from the resource

        Parameters:
            json (bool): make data types compatible with JSON format

        Returns
            list: resource's data
        rA  N)r   r   r   rC   to_listrG   )r0   rB  snapr   r3   r3   r4   to_snap  s   	

zTableResource.to_snapr5  c                 K  s   t dd| i|S )z Create a resource from PETL viewr  Nr3   )r!   )r5  r   r3   r3   r4   	from_petl     zTableResource.from_petlr2  c                   s(   |   G  fdddtjj}| S )zExport resource as a PETL tablec                      s   e Zd Z fddZdS )z+TableResource.to_petl.<locals>.ResourceViewc                 3  s    8  rj jV  dd jD E d H  	 W d    d S jjs(jjV  dd jD E d H  W d    d S 1 s>w   Y  d S )Nc                 s  s    | ]}|  V  qd S r#   )rC  r  r3   r3   r4   r     r   zGTableResource.to_petl.<locals>.ResourceView.__iter__.<locals>.<genexpr>c                 s  s    | ]}|j V  qd S r#   )r   r  r3   r3   r4   r     s    )rk   r   rG   rC   missingr?   r/   r2  r   r3   r4   __iter__  s   

"z4TableResource.to_petl.<locals>.ResourceView.__iter__N)__name__
__module____qualname__rJ  r3   rI  r3   r4   ResourceView  s    rN  )r   r   petlr   )r0   r2  rN  r3   rI  r4   r4    s   zTableResource.to_petlc                 K  s   | j |fi |S r#   )r   )r0   r   r   r3   r3   r4   r    rG  zTableResource.write)r5   r6   )r5   r:   )r5   r>   )r5   rA   )r5   r   )r5   r   )r5   rE   )r5   r    )r5   rH   )r5   rJ   )r   r
   r   r   )
r   r   r   r   r   r>   r   rH   r5   rH   )r   r   r   r   )r   r   r   rH   r5   r   )r   r   r   rH   r5   r   )r   r   r5   r   )r   r   r5   r   )r5   r   r#   )r   r   r   r   r5   r!   )rr   rH   r5   rJ   )r   rH   )NN)r  r   r  r  r  r  r5   r   )
r   r  r  r  r  r  r  r   r5   r  )r"  r   r   r  r  rH   r  rH   r  r#  r  r$  r   rH   r!  r  r5   r   )r(  r   )r,  )r-  r   r   r   )r^   r7  )rB  rH   )r5  r   r   r   )F)r2  rH   )5rK  rL  rM  r-  datatypetabularr.   propertyr8   r<   r?   rB   rC   rD   rF   rG   rI   rK   rW   rL   rM   rN   rO   rP   rQ   rR   rS   rT   rU   r   staticmethodr   r   r   r   r   r   r   r   r   r  r  r  r   r+  r6  r=  r@  rE  rF  r4  r  __classcell__r3   r3   r1   r4   r!      s    
			


	# 
	


	
r!   ).
__future__r   r  r  r{   typingr   r   r   r   r   r   r	   frictionless.schema.fieldr
   r   r   r   r  r   r^   r   	exceptionr   r'  r   r   r   r   r   r"   r   r   r   r   r*  r   r   r   r   r(  r   r   r   r    r!   r3   r3   r3   r4   <module>   s.    $