
    $HJj`                     ,   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ZddlZddlmZmZmZmZmZ dZe
j*                   G d d             Zej.                  defdeed	      fd
       Zdeeee   f   fdZe
j*                   G d d             ZdedefdZddefdedeej@                     dede!fdZ"d#dZ#deee$f   fdZ%de!deegef   fdZ&d Z'	 	 	 d$de!dee   deee   ef   de(deeege(f      defd Z)d! Z*d%d"Z+y)&z
Misc
    N)CallableAnyUnionOptionalLiteral
   c                   P    e Zd ZU dZeed<   eeef   ed<   ed        Zed        Z	y)
LinkHeaderzR
    https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Link
    urlparamsc                 R   t        j                  d|j                         d      }t        |      dk(  r|\  }}|dz  }n|d   d}}|j	                  d      r|j                  d      sJ |dd	 j                         }i }|r|j                  d
      D ]  }|j                         j                  d      \  }}}	|j                         |	xs dj                         }	}|	j	                  d      r&|	j                  d      sJ |	dd	 j                         }	|	xs d||<     | ||      S )zA
        <uri-reference>; param1=value1; param2="value2"
        z>\s*;\s*   )maxsplit   >r    <;="N)r   r   )resplitstriplen
startswithendswith	partition)
clsscompsr   sparamsr   sparamkey_values
             T/Users/ahmed/devFolder/claude-voice/.venv/lib/python3.12/site-packages/csvw/utils.pyfrom_stringzLinkHeader.from_string   s   
 aggi!<u:? LC3JC 8RC~~c"s||C'888!Bioo!--, & 8 8 =Q YY[5;B*=*=*?U##C( >>#...!!BK--/E#mts - s6**    c              #      K   t        t        j                  d|            D ]"  \  }}| j                  |dk(  r|nd|z          $ yw)zP
        A Link header might contain multiple links separated by comma.
        z,\s*<r   r   N)	enumerater   r   r(   )r   r    isingles       r'   
iter_linkszLinkHeader.iter_links5   sA     
 #288Ha#89IAv//AF&fEE :s   AAN)
__name__
__module____qualname____doc__str__annotations__dictclassmethodr(   r.    r)   r'   r
   r
      sD     
HcN+ +. F Fr)   r
   GETmethod)HEADr8   c              #     K    G d dt         j                  j                        }t         j                  j                  |      }dg|_        |j                  t         j                  j                  | |      |       yw)z
    Open URLs
    - without raising an exception on HTTP errors,
    - passing a specific User-Agent header,
    - specifying a timeout.
    c                       e Zd ZdZd xZZy)-urlopen.<locals>.NonRaisingHTTPErrorProcessorz&Don't raise exceptions on HTTP errors.c                     |S Nr7   )selfreqress      r'   <lambda>z6urlopen.<locals>.NonRaisingHTTPErrorProcessor.<lambda>L   s    r)   N)r/   r0   r1   r2   http_responsehttps_responser7   r)   r'   NonRaisingHTTPErrorProcessorr=   J   s    4)CCr)   rF   )z
User-agentz
csvw/4.0.0)r9   )timeoutN)urllibrequestHTTPErrorProcessorbuild_opener
addheadersopenRequest)r   r9   rG   rF   openers        r'   urlopenrP   >   sg     Dv~~'H'H D ^^(()EFF56F
++fnn,,S,@'+
RRs   B Breturnc                 (   t        |       5 }g }|j                         j                  d      xs g D ]&  }|j                  t        j                  |             ( |j                         j                         xs d|fcddd       S # 1 sw Y   yxY w)z<Makes a HEAD request and returns the relevant response data.Linkr   N)rP   infoget_allextendr
   r.   get_content_type)r   responselinksmults       r'   request_headr[   S   sp    	MMO++F39r9DLL..t45 :}}//17R>	 
s   A2BBc                   `    e Zd ZU dZdZeed<   dZeed<   dZ	e
ed<   d Zedd	       Zdefd
Zy)GetResponsez(Relevant data from an HTTP GET response.   status_codeNcontenttextc                     | j                   r,| j                  s | j                   j                  d      | _        | j                  r.| j                   s!| j                  j                  d      | _         y y y )Nutf8)r`   ra   decodeencoder@   s    r'   __post_init__zGetResponse.__post_init__c   sO    <<		++F3DI99T\\99++F3DL *9r)   rQ   c                     |j                         }|j                  |j                  j                         xs d      } | |j                  ||      S )z5Initialize instance with data from a urllib response.utf-8)r_   r`   ra   )readrd   headersget_content_charsetstatus)r   rX   r`   ra   s       r'   from_responsezGetResponse.from_responsei   sD     --/~~h..BBDOPxdKKr)   c                 `    t        j                  | j                  t        j                        S )z+The content of the repsonse parsed as JSON.object_pairs_hook)jsonloadsra   collectionsOrderedDictrf   s    r'   rr   zGetResponse.jsonp   s    zz$)){7N7NOOr)   )rQ   r]   )r/   r0   r1   r2   r_   intr4   r`   bytesra   r3   rg   r6   rn   r   rr   r7   r)   r'   r]   r]   \   sL    2KGUD#4 L LPc Pr)   r]   r   c                 n    t        |       5 }t        j                  |      cddd       S # 1 sw Y   yxY w)zMakes a GET request.N)rP   r]   rn   )r   rX   s     r'   request_getry   u   s#    	((2 
s   +4warningmsgloglevelexception_clsc                 <    |r t        ||      |        y ||       )z
    Helper for error handling. In an inspection scenario, we want to list - i.e. log - all
    errors. In a validation scenario, we raise an exception at the first error.
    N)getattr)r{   r|   r}   r~   s       r'   log_or_raiser   {   s#     UC C  r)   c                 @    |dk(  sJ t        j                  | ||      S )zVOpen a text file suitable for reading JSON content, i.e. assuming it is utf-8 encoded.ri   )encoding)iorM   )filenamemoder   s      r'   	json_openr      s#    w778TH55r)   c                     t        |       } t        |       rt        |       j                         S t	        |       5 }t        j
                  |t        j                        cddd       S # 1 sw Y   yxY w)z6Retrieve JSON content from a local file or remote URL.rp   N)r3   is_urlry   rr   r   loadrt   ru   )fnamefs     r'   get_jsonr      sP    JEe}5!&&((	5	Qyyk.E.EF 
		s   %A**A3type_c                       fdS )zFReturns a callable that casts its argument to type_ unless it is None.c                     | | S  |       S r?   r7   )vr   s    r'   rC   zoptcast.<locals>.<lambda>   s    !)Q1q1r)   r7   )r   s   `r'   optcastr      s	    11r)   c                 @    t        j                  dt        |             S )Nz	https?://)r   matchr3   r    s    r'   r   r      s    88L#a&))r)   defaultr   
allow_nonecondc           	      J   |rG| t         k7  r>t        |t               r.|D cg c]  }t        | d||       c}D cg c]  }||	 c}S |r||S t        ||       r#| t        k(  rt        |t              s
|r" ||      st        j                  d|        |S |S c c}w c c}w )zKCheck if a value has a certain type (with bells and whistles), warn if not.N)r   zInvalid value for property: )list
isinstancetype_checkerrv   boolwarningswarn)r   r   r   r   r   
allow_listvvs          r'   r   r      s     etm
1d(;OPQqLbtDqQcQaUVUbQccai aESLZ45Hd[_`a[b4QC89H Rcs   BB B c                 (   | j                  dd      j                  dd      j                  dd      } | t        j                  v r| dz   S dj                  d | j	                  d      D              } | sd} | d   t
        j                  dz   vrd| z   } | S )u  Convert a string into a valid python attribute name.
    This function is called to convert ASCII strings to something that can pass as
    python attribute name, to be used with namedtuples.

    >>> str(normalize_name('class'))
    'class_'
    >>> str(normalize_name('a-name'))
    'a_name'
    >>> str(normalize_name('a näme'))
    'a_name'
    >>> str(normalize_name('Name'))
    'Name'
    >>> str(normalize_name(''))
    '_'
    >>> str(normalize_name('1'))
    '_1'
    -r%   . c              3   6   K   | ]  }t        |d         yw)F)	lowercaseN)slug).0sss     r'   	<genexpr>z!normalize_name.<locals>.<genexpr>   s     B\rbE**\s   r   )replacekeywordkwlistjoinr   stringascii_lettersr   s    r'   normalize_namer      s    $ 	
		#s##C-55c3?AGNN3wBQWWS\BBAt6''#--!GHr)   c                 x   dj                  d t        j                  d|       D              }|r|j                         }t        j
                  D ]  }|j                  |d      } t        j                  d|rdnd|      }|j                  dd      j                  d      }t        j                  d|      sJ |S )	uy   Condensed version of s, containing only lowercase alphanumeric characters.

    >>> str(slug('A B. äC'))
    'abac'
    r   c              3   P   K   | ]  }t        j                  |      d k7  r|   yw)MnN)unicodedatacategory)r   cs     r'   r   zslug.<locals>.<genexpr>   s+      6< ))!,4 <s   $&NFDz\s+r   asciiignorez[ A-Za-z0-9]*$)r   r   	normalizelowerr   punctuationr   r   subre   rd   r   )r    remove_whitespacer   rB   r   s        r'   r   r      s     '' 6[225!< 6 6Ciikkk!R   
&&0c3
?C
**Wh
'
.
.w
7C88$c***Jr)   )rri   )FNT)TT),r2   r   r   rr   r   r   loggingr   
contextlibrt   dataclassesr   urllib.requestrH   typingr   r   r   r   r   HTTP_REQUEST_TIMEOUT	dataclassr
   contextmanagerrP   tupler3   r   r[   r]   ry   
ValueErrorLoggertyper   r   r5   r   r   r   r   r   r   r   r7   r)   r'   <module>r      s   
 	           : :  %F %F %FP  49$S/0S S(?sD$445 ? P P P03S 3[ 3 )-(	!!gnn%! ! 	!6GuT4Z( G24 2HcUCZ0 2
* !04# cC  	
 xt,- 	.:r)   