
    $HJj=                         d Z ddlmZ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gZdd	iZd
 Zej                   G d d             Zy)a  
DSV data can be surprisingly diverse. While Python's `csv` module offers out-of-the-box support
for the basic formatting parameters, CSVW recognizes a couple more, like `skipColumns` or
`skipRows`.

.. seealso::

    - `<https://www.w3.org/TR/2015/REC-tabular-metadata-20151217/#dialect-descriptions>`_
    - `<https://docs.python.org/3/library/csv.html#dialects-and-formatting-parameters>`_
    - `<https://specs.frictionlessdata.io/csv-dialect/>`_
    )CallableLiteralN   )utilsdataclass_asdictDialectz	UTF-8-BOMz	utf-8-sigc                     t        j                  t        d|       } 	 dj                  t        j                  | |             }| S # t        $ r t        j                  d|         Y yw xY w)zOWe want to force utf-8 encoding, but accept diverse ways of specifying this :).utf-8xzInvalid value for property: )	r   type_checkerstrencodeENCODING_MAPgetLookupErrorwarningswarn)s_s     [/Users/ahmed/devFolder/claude-voice/.venv/lib/python3.12/site-packages/csvw/dsv_dialects.pyconvert_encodingr      sa    3+AJJ|''1-. 4QC89s   &A !A('A(c                      e Zd ZU dZdZeed<    ej                  d       Z	e
e   ed<   dZeed<   d	Zeed
<   dZeed<   dZeed<   d	Zeed<   dZeed<   dZeed<   dZeed<   dZeed<   dZeed<   dZed   ed<   d Zd%dZej8                  d        Zej8                  de
e   fd       Zej8                  deegef   fd        Z d&d!Z!e"d"        Z#d# Z$y$)'r	   z
    A CSV dialect specification.

    .. seealso:: `<https://www.w3.org/TR/2015/REC-tabular-metadata-20151217/#dialect-descriptions>`_
    r   encodingc                  
    ddgS )N

 r       r   <lambda>zDialect.<lambda>0   s    r   )default_factorylineTerminators"	quoteCharTdoubleQuoter   skipRows#commentPrefixheaderr   headerRowCount,	delimiterskipColumnsFskipBlankRowsskipInitialSpacefalsetruer0   startendtrimc                    t        | j                        | _        t        j                  t        ddg| j
                        | _        t        j                  t        d| j                  d      | _        t        j                  t        d| j                        | _	        t        j                  t        d| j                  d       | _        t        j                  t        d	| j                  d      | _        t        j                  t        d| j                        | _        t        j                  t        d
| j                  d       | _        t        j                  t        d| j                        | _        t        j                  t        d| j                   d       | _        t        j                  t        d| j"                        | _        t        j                  t        d| j$                        | _        t        j                  t        t        fdt'        | j(                  t              r#t        | j(                        j+                         n| j(                        | _        | j(                  dv sJ d       y )Nr   r   r#   T)
allow_noner   c                     | dk\  S Nr   r   r   s    r   r    z'Dialect.__post_init__.<locals>.<lambda>B   s    QRVWQWr   )condr'   r   c                     | dk\  S r9   r   r:   s    r   r    z'Dialect.__post_init__.<locals>.<lambda>F   s    Qr   r+   c                     | dk\  S r9   r   r:   s    r   r    z'Dialect.__post_init__.<locals>.<lambda>H   s    WX\]W]r   Fr0   r1   zinvalid trim)r   r   r   r   listline_terminatorsr   r$   boolr%   intr&   r(   r)   r*   r,   r-   r.   r/   
isinstancer5   lowerselfs    r   __post_init__zDialect.__post_init__=   s   (7 % 2 24&$I^I^ _++CdnnQUV --dD$:J:JK**34==GWX"//S$:L:LY]^((tT[[A#00D''.>@++CdnnE --c1d6F6FM]^"//eT=O=OP % 2 24@U@U V&&$K$))T* #&dii."6"6"804		;	 yy==M~M=r   returnc                      | j                   di t        j                  |       }|j                         D ]  \  }}t	        |||        |S )z0Update the spec, returning a new updated object.r   )	__class__dataclassesasdictitemssetattr)rE   kwreskvs        r   updatedzDialect.updatedP   sE    dnn8{11$78HHJDAqCA 
r   c                 >    | j                   d S | j                  rdS dS )Nr#   \)r$   r%   rD   s    r   escape_characterzDialect.escape_characterW   s$    ~~-tV4;K;KCVQUVr   c                 h    t        | j                  t              r| j                  gS | j                  S N)rB   r"   r   rD   s    r   r?   zDialect.line_terminators[   s7     $..4 $$% 	O:>:N:N	Or   c                 :    d d d d d d d| j                      S )z/Map trim spec to a callable to do the trimming.c                 "    | j                         S rW   stripr:   s    r   r    z!Dialect.trimmer.<locals>.<lambda>d   s
    AGGIr   c                 "    | j                         S rW   rZ   r:   s    r   r    z!Dialect.trimmer.<locals>.<lambda>e   s
    aggir   c                     | S rW   r   r:   s    r   r    z!Dialect.trimmer.<locals>.<lambda>f   s    Qr   c                     | S rW   r   r:   s    r   r    z!Dialect.trimmer.<locals>.<lambda>g   s    qr   c                 "    | j                         S rW   )lstripr:   s    r   r    z!Dialect.trimmer.<locals>.<lambda>h   s
    qxxzr   c                 "    | j                         S rW   )rstripr:   s    r   r    z!Dialect.trimmer.<locals>.<lambda>i   s
    QXXZr   )Tr2   Fr0   r3   r4   )r5   rD   s    r   trimmerzDialect.trimmer`   s.     &' )'
 )) 	r   c                     t        | |      S )z9The dialect spec as dict suitable for JSON serialization.)omit_defaultsr   )rE   re   s     r   rK   zDialect.asdictl   s    MBBr   c                 V    t         j                  | j                  | j                        S )zM
        Turn the encoding name into something understood by python.
        )r   r   r   rD   s    r   python_encodingzDialect.python_encodingp   s    
 t}}==r   c                     | j                   | j                  | j                  s| j                  nd| j                  d   | j                  | j
                  ddS )zg
        Turn the dialect spec into a dict suitable as kwargs for Python's csv implementation.
        Nr   T)r,   doublequote
escapecharlineterminator	quotecharskipinitialspacestrict)r,   r%   rU   r?   r$   r/   rD   s    r   as_python_formatting_parametersz'Dialect.as_python_formatting_parametersw   sT    
 ++ 8<7G7G$//T"33A6 $ 5 5

 
	
r   N)rG   r	   )T)%__name__
__module____qualname____doc__r   r   __annotations__rJ   fieldr"   r>   r$   r%   r@   r&   rA   r(   r)   r*   r,   r-   r.   r/   r5   r   rF   rR   	functoolscached_propertyrU   r?   r   rc   rK   propertyrg   ro   r   r   r   r	   r	   &   sB    Hc!2!2!2."0OT#Y 0IsKHcM3FDNCIsKM4"d"5<D'1
2<N& W W O$s) O O 	3%*- 	 	C > >
r   )rs   typingr   r   r   rv   rJ    r   metadata_utilsr   __all__r   r   	dataclassr	   r   r   r   <module>r~      sZ   
 %     ,+ 
 ^
 ^
 ^
r   