
    PiA                     $   d 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 g dZej        eej        ej        ej        e         f         Zdedefd	Z G d
 d          Z G d d          Z G d de          Z G d de          Z G d de          Z	 	 	 d#dedej        e         dej        e         dej        e         dej        f
dZeZ dej        eej        f         dej!        e"ej#        e         gej        dej#        e         f         f         fdZ$dej        eej        f         dej#        e         fdZ%dej        eej        f         dej!        e&gef         de"fd Z' G d! d"e(          Z)dS )$a  Support for reading delimiter-separated value files.

This module contains unicode aware replacements for :func:`csv.reader`
and :func:`csv.writer`. It was stolen/extracted from the ``csvkit``
project to allow re-use when the whole ``csvkit`` package isn't
required.

The original implementations were largely copied from
`examples in the csv module documentation <http://docs.python.org/library/csv.html#examples>`_.

.. seealso:: http://en.wikipedia.org/wiki/Delimiter-separated_values
    N   )utils)Dialect)	UnicodeWriterUnicodeReaderUnicodeReaderWithLineNumberUnicodeDictReaderNamedTupleReaderiterrowsrewriteadd_rowsfilter_rows_as_dictencodingreturnc                 4    t          j        |           j        S N)codecslookupname)r   s    \/home/jaya/work/projects/VOICE-AGENT/VIET/agent-env/lib/python3.11/site-packages/csvw/dsv.pynormalize_encodingr   &   s    =""''    c                   :   e Zd ZdZ	 	 ddej        ej        eej	        f                  dej        ej        e
ef                  fdZd Zdej        e         fdZd	 Zd
ej        ej        edf                  fdZdej        ej        eeef                  fdZdS )r   u  
    Write Unicode data to a csv file.

    :param f: The target to which to write the data; a local path specified as `str` or     `pathlib.Path` or `None`, in which case the data, formatted as DSV can be retrieved     via :meth:`~UnicodeWriter.read`
    :param dialect: Either a dialect name as recognized by `csv.writer` or a     :class:`~Dialect` instance for dialect customization beyond what can be done with     `csv.writer`.
    :param kw: Keyword arguments passed through to `csv.writer`.

    .. code-block:: python

        >>> from csvw import UnicodeWriter
        >>> with UnicodeWriter('data.tsv', delimiter='	') as writer:
        ...     writer.writerow(['ä', 'ö', 'ü'])
    Nfdialectc                 L   || _         |                    dd          | _        t          |t                    r@|j        | _        |                                | _        | j                            |           n|| _        |r
|| j        d<   t          | j                  | _        | j        
                    d          | _        | j        rB| j        
                    d          t          j        k    rt          | j        d| j        z  fd}nd }|| _        d	| _        d
| _        d S )Nr   utf-8r   
escapecharquoting   c                 (    fd| D             S )Nc                 `    g | ]*}t          |          r|                              n|+S  )
isinstancereplace).0s_new_old_types     r   
<listcomp>zBUnicodeWriter.__init__.<locals>._escapedoubled.<locals>.<listcomp>U   s<    ZZZQRAu1E1EL		$---1ZZZr   r#   )rowr*   r)   r(   s    ```r   _escapedoubledz.UnicodeWriter.__init__.<locals>._escapedoubledQ   s)     [ZZZZZVYZZZZr   c                     | S r   r#   )r,   s    r   r-   z.UnicodeWriter.__init__.<locals>._escapedoubledW   s    
r   Fr   )r   popr   r$   r   python_encodingas_python_formatting_parameterskwupdater   getr   csv
QUOTE_NONEstrr-   _close_rows_written)selfr   r   r2   r-   s        r   __init__zUnicodeWriter.__init__=   s)   
 z733gw'' 	-#3DM==??DGGNN2DG -%,	"*4=99'++l33? 
	tw{{955GG &)$(O$%$7[ [ [ [ [  ,r   c                    t          | j        t          t          j        f          rgt          | j        t          j                  rt          | j                  | _        t          j        | j        d| j        d          | _        d| _        n!| j        t          j	        d          | _        t          j        | j        fi | j        | _        | S )Nwt )r   newlineT)r?   )r$   r   r7   pathlibPathioopenr   r8   StringIOr5   writerr2   r:   s    r   	__enter__zUnicodeWriter.__enter__]   s    dfsGL122 	-$&',// %TVWTVTDM2NNNDFDKKV^[,,,DFj334733r   r   c                     t          | j        d          r| j                            d           t          | j        d          r,| j                                                            d          S dS )z
        If the writer has been initialized passing `None` as target, the CSV data as `bytes` can be
        retrieved calling this method.
        seekr   readr   N)hasattrr   rI   rJ   encoderF   s    r   rJ   zUnicodeWriter.readj   se    
 466"" 	FKKNNN466"" 	16;;==''000	1 	1r   c                 J    | j         r| j                                         d S d S r   r8   r   close)r:   typevalue	tracebacks       r   __exit__zUnicodeWriter.__exit__t   )    ; 	FLLNNNNN	 	r   r,   c                     | j                             |                     |                     | xj        dz  c_        d S )Nr   )rE   writerowr-   r9   r:   r,   s     r   rV   zUnicodeWriter.writerowx   s@    T0055666ar   rowsc                    t          |          D ]w\  }}t          |t                    rH|dk    r.| j        s'|                     |                                           |                                }|                     |           xdS )aL  
        Writes each row in `rows` formatted as CSV row. This behaves as
        [`csvwriter.writerows`](https://docs.python.org/3/library/csv.html#csv.csvwriter.writerows)
        except when an iterable of `dict` objects is passed. In that case, it is assumed that all
        items in `rows` are `dict`s and all have the same keys in the same order (as what would
        be read by `UnicodeDictReader`). Then, the keys of the first item are written as header row
        and the values of each row are written as subsequent rows.

        :param rows: The data to be written.
        r   N)	enumerater$   dictr9   rV   keysvalues)r:   rX   ir,   s       r   	writerowszUnicodeWriter.writerows|   s      oo 	 	FAs#t$$ #66$"46MM#((**---jjllMM#	 	r   )NN)__name__
__module____qualname____doc__typingOptionalUnionr7   r@   rA   r   r;   rG   bytesrJ   rS   IterablerV   tuplelistr[   r_   r#   r   r   r   r   *   s        ( CGCG v|C,=>? _V\'3,%?@   @  1foe, 1 1 1 1   FOFLd,CD        fofl5$;L.MN      r   r   c                   t    e Zd ZdZ	 ddedej        ej        ee	f                  fdZ
d Zd Zd Zd	 Zd
 ZdS )r   a  
    Read Unicode data from a csv file.

    :param f: The source from which to read the data; a local path specified as `str` or     `pathlib.Path`, a file-like object or a `list` of lines.
    :param dialect: Either a dialect name as recognized by `csv.reader` or a     :class:`~Dialect` instance for dialect customization beyond what can be done with     `csv.writer`.
    :param kw: Keyword arguments passed through to `csv.reader`.

    .. code-block:: python

        >>> with UnicodeReader('tests/fixtures/frictionless-data.csv', delimiter='|') as reader:
        ...     for row in reader:
        ...         print(row)
        ...         break
        ...
        ['FK', 'Year', 'Location name', 'Value', 'binary', 'anyURI', 'email', 'boolean', 'array',
        'geojson']
    Nr   r   c                    || _         t          |                    dd                    | _        |                    dd           | _        t          |t                    r|nd | _        | j        rE| j        j        | _        |	                                | _
        | j
                            |           n|| _
        |r
|| j
        d<   d| _        g | _        | j        dk    rd| _        | j        | _        d S )Nr   z	utf-8-siglineterminatorr   Fr   )r   r   r/   r   r?   r$   r   r   r0   r1   r2   r3   r8   comments_reader_encoding)r:   r   r   r2   s       r   r;   zUnicodeReader.__init__   s    
 *266*k+J+JKKvv.55",Wg">">HwwD< 	- L8DM==??DGGNN2DG -%,	" =G##'DM
 !%r   c                 V   t          | j        t          t          j        f          rnt          | j        t          j                  rt          | j                  | _        t          j        | j        d| j        | j        pd          | _        d| _	        nlt          | j        d          sWg }| j        D ]F}|                    t          |t                    r|                    | j                  n|           G|| _        t          j        | j        fi | j        | _        d| _        | S )Nrtr>   )moder   r?   TrJ   )r$   r   r7   r@   rA   rB   rC   r   r?   r8   rK   appendrg   decoder5   readerr2   lineno)r:   lineslines      r   rG   zUnicodeReader.__enter__   s   dfsGL122 
	$&',// %TVWTV$PTP\Pb`bcccDFDKK(( 	E ^ ^:dE;R;R\T[[777X\]]]]DFj334733r   c                       xj         dz  c_          fdt           j                  D             } xj         t          d |D                       z  c_         |S )Nr   c                 r    g | ]3}t          |t                    r|n|                    j                  4S r#   )r$   r7   ru   ro   r&   r'   r:   s     r   r+   z+UnicodeReader._next_row.<locals>.<listcomp>   sK     ( ( ( As##HAA$2G)H)H( ( (r   c                 R    g | ]$}t          |                              d           %S )
)rj   count)r&   r'   s     r   r+   z+UnicodeReader._next_row.<locals>.<listcomp>   s*    ===ADGGMM$//===r   )rw   nextrv   sumrW   s   ` r   	_next_rowzUnicodeReader._next_row   ss    q( ( ( ($+&&( ( ( 	s=====>>>
r   c                                                       } j        r|r1 j        j        r%|d                              j        j                  s8|rt	          |          dhk    r j        j        s j         j        j        k     r7|r1 j        j        r%|d                              j        j                  s|r j         j        j        k     rm j        	                     j         j        j
                            |                               j        j                                                  f                                             }|r1 j        j        r%|d                              j        j                  |rt	          |          dhk    r j        j        ! j         j        j        k     7 fd|D              j        j        d          }|S )Nr   r>   c                 D    g | ]}j                             |          S r#   )r   trimmerr|   s     r   r+   z*UnicodeReader.__next__.<locals>.<listcomp>   s)    888q4<''**888r   )r   r   commentPrefix
startswithsetskipBlankRowsrw   skipRowsrn   rt   	delimiterjoinlstripstripskipColumnsrW   s   ` r   __next__zUnicodeReader.__next__   s   nn< 	T '4<5 'q6$$T\%?@@''!$SbT!1!1t|7Q!1[4<#888 DL6 A))$,*DEE!%t|/D!D!DM((.33C88??@Z[[aacc*    nn&&  '4<5 'q6$$T\%?@@''!$SbT!1!1t|7Q!1[4<#888 9888C8889Q9R9RSC
r   c                 J    | j         r| j                                         d S d S r   rN   )r:   exc_typeexc_valexc_tbs       r   rS   zUnicodeReader.__exit__   rT   r   c                     | S r   r#   rF   s    r   __iter__zUnicodeReader.__iter__   s    r   r   )r`   ra   rb   rc   LINES_OR_PATHrd   re   rf   r   r7   r;   rG   r   r   rS   r   r#   r   r   r   r      s         . DH. .. _V\'3,%?@. . . .@       $      r   r   c                   "     e Zd ZdZ fdZ xZS )r   z
    A `UnicodeReader` yielding (lineno, row) pairs, where "lineno" is the 1-based number of the
    the **text line** where the (possibly multi-line) row data starts in the DSV file.
    c                 j    t          t          |                                           }| j        dz   |fS )zI
        :return: a pair (1-based line number in the input, row)
        r   )superr   r   rw   r:   r,   	__class__s     r   r   z$UnicodeReaderWithLineNumber.__next__   s2    
 /66??AA{Q##r   )r`   ra   rb   rc   r   __classcell__r   s   @r   r   r      sB         $ $ $ $ $ $ $ $ $r   r   c                   n     e Zd ZdZd fd	Ze fd            Zdej        f fdZ	dej        fdZ
 xZS )	r	   a  
    A `UnicodeReader` yielding one `dict` per row.

    :param f: As for :class:`UnicodeReader`
    :param fieldnames:

    .. code-block:: python

        >>> with UnicodeDictReader(
        ...         'tests/fixtures/frictionless-data.csv',
        ...         dialect=Dialect(delimiter='|', header=False),
        ...         fieldnames=[str(i) for i in range(1, 11)]) as reader:
        ...     for row in reader:
        ...         print(row)
        ...         break
        ...
        OrderedDict([('1', 'FK'), ('2', 'Year'), ('3', 'Location name'), ('4', 'Value'),
        ('5', 'binary'), ('6', 'anyURI'), ('7', 'email'), ('8', 'boolean'), ('9', 'array'),
        ('10', 'geojson')])

    Nc                     || _         || _        || _        d| _         t	          t
          |           j        |fi | d S Nr   )_fieldnamesrestkeyrestvalline_numr   r	   r;   )r:   r   
fieldnamesr   r   r2   r   s         r   r;   zUnicodeDictReader.__init__  sL    %/&&/88R88888r   c                 b   | j         >	 t          t          |                                           | _         n# t          $ r Y nw xY w| j        j        | _        | j         rKt          t          | j                             t          | j                   k    rt          j
        d           | j         S )NzDuplicate column names!)r   r   r	   r   StopIterationrv   r   lenr   warningswarn)r:   r   s    r   r   zUnicodeDictReader.fieldnames#  s    ##():D#A#A#J#J#L#L      , 	93t'(())S1A-B-BBB7888s   ,7 
AAr   c                 (   | j         dk    r| j         t          t          |                                           }| j        j         | _         |g k    r-t          t          |                                           }|g k    -|                     |          S r   )r   r   r   r	   r   rv   itemr   s     r   r   zUnicodeDictReader.__next__0  s    =AOO%t,,5577,
 Rii)40099;;C Riiyy~~r   c                 $   t          j        d t          | j        |          D                       }t	          | j                  }t	          |          }||k     r||d          || j        <   n"||k    r| j        |d          D ]}| j        ||<   |S )Nc              3   $   K   | ]\  }}||fV  d S r   r#   )r&   kvs      r   	<genexpr>z)UnicodeDictReader.item.<locals>.<genexpr>?  s*      #Q#Qtq!QF#Q#Q#Q#Q#Q#Qr   )collectionsOrderedDictzipr   r   r   r   )r:   r,   dlflrkeys         r   r   zUnicodeDictReader.item>  s    ##Q#Qs4?C7P7P#Q#Q#QQQ!!XX77!"##hAdlOO"WWrss+ & &#r   )NNN)r`   ra   rb   rc   r;   propertyr   r   r   r   r   r   r   s   @r   r	   r	     s         ,9 9 9 9 9 9 
  
  
  
  X
 +1      	;2 	 	 	 	 	 	 	 	r   r	   c                   X    e Zd ZdZ eej                  Zej	        d             Z
d ZdS )r
   a  
    A `UnicodeReader` yielding one `namedtuple` per row.

    .. note::

        This reader has some limitations, notably that fieldnames must be normalized to be
        admissible Python names, but also bad performance (compared with `UnicodeDictReader`).
    c                 z    t          t          | j        | j                            }t	          j        d|          S )NRow)rj   map_normalize_fieldnamer   r   
namedtuple)r:   r   s     r   clszNamedTupleReader.clsV  s1    #d7IIJJ
%eZ888r   c                      t                                |          } j        D ]}|                    |d              j        di  fd|                                D             S )Nc                 T    i | ]$\  }}|j         v                     |          |%S r#   )r   r   )r&   r   r   r:   s      r   
<dictcomp>z)NamedTupleReader.item.<locals>.<dictcomp>`  s9    ]]]41aT_H\H\t((++QH\H\H\r   r#   )r	   r   r   
setdefaultr   items)r:   r,   r   r   s   `   r   r   zNamedTupleReader.item[  s    ""4--O 	% 	%DLLt$$$$tx _ _]]]]17799]]]_ _ 	_r   N)r`   ra   rb   rc   staticmethodr   normalize_namer   	functoolscached_propertyr   r   r#   r   r   r
   r
   J  sd          (<(<==9 9 9_ _ _ _ _r   r
   Fr   lines_or_filenamedtuplesdictsc              +      K   |r|rt          d          |rt          }n|rt          }nt          } || fd|i|5 }|D ]}|V  	 ddd           dS # 1 swxY w Y   dS )a  Convenience factory function for csv reader.

    :param lines_or_file: Content to be read. Either a file handle, a file path or a list    of strings.
    :param namedtuples: Yield namedtuples.
    :param dicts: Yield dicts.
    :param encoding: Encoding of the content.
    :param kw: Keyword parameters are passed through to csv.reader.
    :return: A generator over the rows.
    z:either namedtuples or dicts can be chosen as output formatr   N)
ValueErrorr
   r	   r   )r   r   r   r   r2   _readerrr   s           r   r   r   c  s         u  UVVV	  "	  #		8	8	8R	8	8 A 	 	DJJJJ	                 s   
AAAfnamevisitorc                 J   t          j        |           } |                                 sJ t          j        d          5 }t          j        |j                  }ddd           n# 1 swxY w Y   t          | fi |5 }t          |fi |5 }t          |          D ](\  }} |||          }||                    |           )	 ddd           n# 1 swxY w Y   ddd           n# 1 swxY w Y   t          j        t          |          t          |                      dS )aD  Utility function to rewrite rows in dsv files.

    :param fname: Path of the dsv file to operate on.
    :param visitor: A callable that takes a line-number and a row as input and returns a     (modified) row or None to filter out the row.
    :param kw: Keyword parameters are passed through to csv.reader/csv.writer.
    FdeleteN)r   ensure_pathis_filetempfileNamedTemporaryFiler@   rA   r   r   r   rZ   rV   shutilmover7   )	r   r   r2   fptmpreader_rE   r^   r,   s	            r   r   r     s    e$$E==???		$E	2	2	2 $bl27##$ $ $ $ $ $ $ $ $ $ $ $ $ $ $ 
u	#	#	#	# )w3%%"%% 	)#G,, ) )3gaoo?OOC((()	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	)) ) ) ) ) ) ) ) ) ) ) ) ) ) ) KC#e**%%%%%sH    A&&A*-A*>C)9CC)C	C)C	C))C-0C-rX   c                 <   t          j        d          5 }t          j        |j                  }d d d            n# 1 swxY w Y   t          j        |           } t          |          5 }|                                 rBt          |           5 }|D ]}|
                    |           	 d d d            n# 1 swxY w Y   |                    |           d d d            n# 1 swxY w Y   t          j        t          |          t          |                      d S )NFr   )r   r   r@   rA   r   r   r   r   existsr   rV   r_   r   r   r7   )r   rX   r   r   rE   r   r,   s          r   r   r     s   		$E	2	2	2 $bl27##$ $ $ $ $ $ $ $ $ $ $ $ $ $ $ e$$E	s		 v<<>> 	)u%% )" ) )COOC(((()) ) ) ) ) ) ) ) ) ) ) ) ) ) ) 	               KC#e**%%%%%sE   <A A *$C"B6*C"6B:	:C"=B:	>C""C&)C&filter_c                 J    t          |          }t          | |fi | |j        S )a  Rewrite a dsv file, filtering the rows.

    :param fname: Path to dsv file
    :param filter_: callable which accepts a `dict` with a row's data as single argument    returning a `Boolean` indicating whether to keep the row (`True`) or to discard it     `False`.
    :param kw: Keyword arguments to be passed `UnicodeReader` and `UnicodeWriter`.
    :return: The number of rows that have been removed.
    )
DictFilterr   removed)r   r   r2   s      r   r   r     s1     !!GE7!!b!!!?r   c                       e Zd Zd Zd ZdS )r   c                 0    d | _         || _        d| _        d S r   )headerfilterr   )r:   r   s     r   r;   zDictFilter.__init__  s    r   c                     |dk    r	|| _         |S |rKt          t          | j         |                    }|                     |          r|S | xj        dz  c_        d S d S )Nr   r   )r   r[   r   r   r   )r:   r^   r,   r   s       r   __call__zDictFilter.__call__  so    66DKJ 	"DK--..D{{4   "
!	" 	"r   N)r`   ra   rb   r;   r   r#   r   r   r   r     s2          
	" 	" 	" 	" 	"r   r   )FFr   )*rc   rB   r5   r   r   rd   r@   r   r   r   r   r>   r   dsv_dialectsr   __all__rf   r7   rA   IOrh   r   r   r   r   r   r	   r
   re   bool	Generatorr   rv   CallableintListr   r   r[   r   objectr   r#   r   r   <module>r      sZ    
			 



                     ! ! ! ! ! !   S',	6?3;OOP( ( ( ( ( (c c c c c c c cLd d d d d d d dN$ $ $ $ $- $ $ $B B B B B B B BJ_ _ _ _ _( _ _ _4 38,1.5 M  /$/OD) s+ &	   : 
&6<W\ 12 &_c6;s+;%<fl4QWQ\]`QaKa>b%bc& & & &0&FLgl!23 &FK<L & & & &v|C,=> !'$!>!$   "" " " " " " " " " "r   