
    #Zj`                     l   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+dS )*z
Misc
    N)CallableAnyUnionOptionalLiteral
   c                   d    e Zd ZU dZeed<   eeef         ed<   ed             Zed             Z	dS )
LinkHeaderzR
    https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Link
    urlparamsc                    t          j        d|                                d          }t          |          dk    r|\  }}|dz  }n
|d         d}}|                    d          r|                    d          sJ |dd	                                         }i }|r|                    d
          D ]}|                                                    d          \  }}}	|                                |	pd                                }	}|	                    d          r3|	                    d          sJ |	dd	                                         }	|	p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
             V/Users/jameslopez/projects/MentorCore/.venv/lib/python3.11/site-packages/csvw/utils.pyfrom_stringzLinkHeader.from_string   sg   
 aggii!<<<u::?? LC3JCC 8RC~~c""8s||C'8'8888!B$ioo 	,!--,, , , & 8 8 = =Q YY[[5;B*=*=*?*?U##C(( 0 >>#.....!!B$K--//E#mtsss6****    c              #      K   t          t          j        d|                    D ]'\  }}|                     |dk    r|nd|z             V  (dS )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   sh      
 #28Ha#8#899 	F 	FIAv//AFF&&fEEEEEE	F 	Fr)   N)
__name__
__module____qualname____doc__str__annotations__dictclassmethodr(   r.    r)   r'   r
   r
      sx           
HHHcN+ + [+. F F [F F Fr)   r
   GETmethod)HEADr8   c              #     K    G d dt           j        j                  }t           j                            |          }dg|_        |                    t           j                            | |          |          V  dS )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dS )-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4)C)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   >   s      D D D D Dv~'H D D D ^(()EFFF56F
++fn,,S,@@'+
R
RRRRRRr)   returnc                 ^   t          |           5 }g }|                                                    d          pg D ]/}|                    t                              |                     0|                                                                pd|fcddd           S # 1 swxY w Y   dS )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   s    	 ?MMOO++F339r 	6 	6DLL..t445555}}//117R>	? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?s   BB""B&)B&c                   h    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dS )GetResponsez(Relevant data from an HTTP GET response.   status_codeNcontenttextc                     | j         r&| j        s| j                             d          | _        | j        r(| j         s#| j                            d          | _         d S d S d S )Nutf8)r`   ra   decodeencoder@   s    r'   __post_init__zGetResponse.__post_init__c   sn    < 	4	 	4++F33DI9 	4T\ 	49++F33DLLL	4 	4 	4 	4r)   rQ   c                     |                                 }|                    |j                                        p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   sO     --//~~h.BBDDOPPsxdKKKKr)   c                 L    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    z$){7NOOOOr)   )rQ   r]   )r/   r0   r1   r2   r_   intr4   r`   bytesra   r3   rg   r6   rn   r   rr   r7   r)   r'   r]   r]   \   s         22KGUD#4 4 4 L L L [LPc P P P P P Pr)   r]   r   c                     t          |           5 }t                              |          cddd           S # 1 swxY w Y   dS )zMakes a GET request.N)rP   r]   rn   )r   rX   s     r'   request_getry   u   s    	 3((223 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3s   7;;warningmsgloglevelexception_clsc                 R    |r t          ||          |            dS  ||           )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     mC   r)   rri   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78TH5555r)   c                    t          |           } t          |           r!t          |                                           S t	          |           5 }t          j        |t          j                  cddd           S # 1 swxY w Y   dS )z6Retrieve JSON content from a local file or remote URL.rp   N)r3   is_urlry   rr   r   loadrt   ru   )fnamefs     r'   get_jsonr      s    JJEe}} )5!!&&(((	5		 GQyk.EFFFG G G G G G G G G G G G G G G G G Gs    A<<B B type_c                       fdS )zFReturns a callable that casts its argument to type_ unless it is None.c                 "    | | n
 |           S r?   r7   )vr   s    r'   rC   zoptcast.<locals>.<lambda>   s    !)QQq r)   r7   )r   s   `r'   optcastr      s    11111r)   c                 F    t          j        dt          |                     S )Nz	https?://)r   matchr3   r    s    r'   r   r      s    8L#a&&)))r)   FTdefaultr   
allow_nonecondc                 8    |r9 t           k    r.t          |t                     rd  fd|D             D             S |r||S t          |           r- t          k    rt          |t                    sr$ |          st	          j        d|            |S |S )zKCheck if a value has a certain type (with bells and whistles), warn if not.c                     g | ]}||S r?   r7   ).0r   s     r'   
<listcomp>z type_checker.<locals>.<listcomp>   s    cccaUVUbUbUbUbr)   c                 6    g | ]}t          d |          S )N)r   )type_checker)r   vvr   r   s     r'   r   z type_checker.<locals>.<listcomp>   s*    QQQLbtDDDQQQr)   NzInvalid value for property: )list
isinstancerv   boolwarningswarn)r   r   r   r   r   
allow_lists   `   ` r'   r   r      s      detmm
1d(;(;mccQQQQQqQQQcccc ai a ESLLZ45H5HLdL[_[_`a[b[bL8Q88999Hr)   c                 L   |                      dd                               dd                               dd          } | t          j        v r| dz   S d                    d |                     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   8   K   | ]}t          |d           V  dS )F)	lowercaseN)slug)r   sss     r'   	<genexpr>z!normalize_name.<locals>.<genexpr>   s/      BBrbE***BBBBBBr)   r   )replacekeywordkwlistjoinr   stringascii_lettersr   s    r'   normalize_namer      s    $ 	
		#s##C--55c3??AGN3wBBQWWS\\BBBBBA t6'#---!GHr)   c                    d                     d t          j        d|           D                       }|r|                                }t          j        D ]}|                    |d          }t          j        d|rdnd|          }|	                    dd          
                    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   J   K   | ]}t          j        |          d k    |V  dS )MnN)unicodedatacategory)r   cs     r'   r   zslug.<locals>.<genexpr>   sC       6 6 )!,,44 44446 6r)   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 6[25!<< 6 6 6 6 6C iikk ! !kk!R  
&09c3
?
?C
**Wh
'
'
.
.w
7
7C8$c*****Jr)   )r   ri   )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      sD    
			 				                          : : : : : : : : : : : : : :  %F %F %F %F %F %F %F %FP  49$S S/0S S S S(?sD$445 ? ? ? ? P P P P P P P P03S 3[ 3 3 3 3 )-(	! !!gn%! ! 	! ! ! !6 6 6 6GuT4Z( G G G G24 2HcUCZ0 2 2 2 2
* * * !04 # cC  	
 xt,- 	   .  :     r)   