
    #HJjFG              
         d 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mZ ddlmZmZmZmZmZmZmZmZmZmZmZmZmZmZ ddlmZmZmZ ddlZ ddl!Z ddl"Z dd	l#m$Z$ erdd
lm%Z% g dZ& ede      Z' ed      Z(i ddddddddddddddddddddddddddddd dddZ)d!gd"gd#gd$gd%gd&d'gd(gd)gd*gd+	Z*d,gd-gd.gd/gd0Z+dJd1Z,dKd2Z-dLdMd3Z.dNd4Z/	 dO	 	 	 	 	 dPd5Z0	 	 	 dQ	 	 	 	 	 	 	 	 	 dRd6Z1dSd7Z2dTd8Z3dOdUd9Z4dVdWd:Z5	 dO	 	 	 	 	 	 	 dXd;Z6d< ddd=f	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dYd>Z7edZd?       Z8ed@dA	 	 	 	 	 d[dB       Z8ddA	 	 	 	 	 d[dCZ8dDZ9	 dEe9z   dFz   Z:	 e:dGz   Z;	 e9dEz   Z<	 e:dHz   Z=	 d\dIZ>y)]z
Some utility functions.

Miscellaneous utilities

* list2set
* first
* uniq
* more_than

Term characterisation and generation

* to_term
* from_n3

Date/time utilities

* date_time
* parse_date_time

    )annotations)timegm)splitext)altzonegmtime	localtimetimetimezone)TYPE_CHECKINGAnyCallableDictHashableIterableIteratorListOptionalSetTupleTypeVarUnionoverload)quoteurlsplit
urlunsplitN)sign)Graph)list2setfirstuniq	more_thanto_termfrom_n3	date_timeparse_date_timeguess_format
find_rootsget_tree	_coalesce_iri2uri
_HashableT)bound_AnyTxmlrdfowln3ttlturtlenttrixxhtmlrdfahtmlsvgnqnquadstrigjsonjson-ldjsonldzapplication/rdf+xmlztext/n3ztext/turtlezapplication/n-tripleszapplication/trixz	text/htmlzapplication/xhtml+xmlzapplication/n-quadszapplication/trigzapplication/ld+json)	r.   r1   r3   r4   r5   r7   r;   r<   r>   zapplication/sparql-results+xmlzapplication/sparql-results+jsonztext/csvztext/tab-separated-values)r.   r=   csvtsvc                n    t               }| D cg c]  }||vs|j                  |      r| c}S c c}w )zX
    Return a new list without duplicates.
    Preserves the order, unlike set(seq)
    )setadd)seqseenxs      U/Users/ahmed/devFolder/claude-voice/.venv/lib/python3.12/site-packages/rdflib/util.pyr   r   v   s3    
 5D@s!atmDHHQKAs@@@s   	222c                    | D ]  }|c S  y)z_
    return the first element in a python sequence
    for graphs, use graph.value instead
    N )rE   results     rH   r   r      s    
      c                @    |rt        d | D              S t        |       S )z,removes duplicate strings from the sequence.c              3  <   K   | ]  }|j                           y wN)strip).0ss     rH   	<genexpr>zuniq.<locals>.<genexpr>   s     /h1779hs   )rC   )sequencerP   s     rH   r    r       s     /h///8}rL   c                .    d}| D ]  }|dz  }||kD  s y y)z>Returns 1 if sequence has more items than number and 0 if not.r      rJ   )rT   numberiitems       rH   r!   r!      s)    	A	Qv:  rL   c                   | s|S | j                  d      r3| j                  d      r"t        j                  j	                  | dd       S | j                  d      r3| j                  d      r"t        j                  j                  | dd       S | j                  d      rt        j                  j                  |       S d| z  }t        |      )ay  
    Creates and returns an Identifier of type corresponding
    to the pattern of the given positional argument string `s`:

    '' returns the `default` keyword argument value or `None`

    '<s>' returns `URIRef(s)` (i.e. without angle brackets)

    '"s"' returns `Literal(s)` (i.e. without doublequotes)

    '_s' returns `BNode(s)` (i.e. without leading underscore)

    <>rV   "_zUnrecognised term syntax: '%s')
startswithendswithrdflibtermURIRefLiteralBNode	Exception)rR   defaultmsgs      rH   r"   r"      s      	
c	qzz#{{!!!Ab'**	
c	qzz#{{""1Qr7++	
c	{{  ##.2nrL   c                8   | s|S | j                  d      r@t        j                  j                  | dd j	                  d      j                  d            S | j                  d      r| j                  d      rd}nd}| j                  |d      \  }}|t        |      d }d}d}|j                  d	      }	|	d
k\  rt        ||	dz   d |||      }n|j                  d      r|dd }|j                  dd      }|j                  dd      }|j	                  d      j                  d      }t        j                  j                  |||      S | dk(  s| dk(  r"t        j                  j                  | dk(        S | j                         j                  ddd      j                  ddd      j                  ddd      j                         rd| j                         v rCt        j                  j                  | t        j                  j                  j                         S d| v rLt        j                  j                  t#        |       t        j                  j                  j$                        S t        j                  j                  t'        |       t        j                  j                  j(                        S | j                  d      r.t        | dd       }
t        j*                  j-                  ||
      S | j                  d      r.t        | dd       }
t        j*                  j/                  ||
      S | j                  d      r"t        j                  j1                  | dd       S d| v r|;t        j                  j3                  t        j*                  j/                               }| j5                  dd      \  }}t7        |j9                               |   }t        j                  j;                  |      |   S t        j                  j1                  |       S )a  Creates the Identifier corresponding to the given n3 string.

    ```python
    >>> from rdflib.term import URIRef, Literal
    >>> from rdflib.namespace import NamespaceManager
    >>> from_n3('<http://ex.com/foo>') == URIRef('http://ex.com/foo')
    True
    >>> from_n3('"foo"@de') == Literal('foo', lang='de')
    True
    >>> from_n3('"""multi\nline\nstring"""@en') == Literal(
    ...     'multi\nline\nstring', lang='en')
    True
    >>> from_n3('42') == Literal(42)
    True
    >>> from_n3(Literal(42).n3()) == Literal(42)
    True
    >>> from_n3('"42"^^xsd:integer') == Literal(42)
    True
    >>> from rdflib import RDFS
    >>> from_n3('rdfs:label') == RDFS['label']
    True
    >>> nsm = NamespaceManager(rdflib.graph.Graph())
    >>> nsm.bind('dbpedia', 'http://dbpedia.org/resource/')
    >>> berlin = URIRef('http://dbpedia.org/resource/Berlin')
    >>> from_n3('dbpedia:Berlin', nsm=nsm) == berlin
    True

    ```
    r[   rV   r]   zraw-unicode-escapezunicode-escaper^   z"""Nz^^r      @z\"z\xz\\xtruefalse. -e)datatype{[z_::)r`   rb   rc   rd   encodedecodersplitlenrfindr#   replacere   lower	isnumeric	namespaceXSDdoublefloatdecimalintintegergraphQuotedGraphr   rf   NamespaceManagersplitdict
namespaces	Namespace)rR   rh   backendnsmquotesvaluerestrs   languagedtoffset
identifierprefix	last_partnss                 rH   r#   r#      si   F ||C {{!!aGNN/0778HI
 	
 
c	<<FFhhvq)tc&km$ ::d#q=
 tHqLN3WgsKHs#8eS) eV, 1299:JK{{""5(H==	
fW{{""1;//			b!		b!		b!				 !'');;&&q63C3C3G3G3N3N&OO!8;;&&uQx&:J:J:N:N:V:V&WW{{""3q6F4D4D4H4H4P4P"QQ	
c	QqW%
 ||''<<	
c	QqW%
 ||!!':66	
d	{{  12''	;""33FLL4F4F4HICGGCO	#.."#F+))"-i88{{  ##rL   c           	         | 
t               } |r1t        |       }|d   r
t        dz  }n	t        dz  }d|dz  |dz  fz  }nt	        |       }d}|\	  }}}}}	}
}}}d|||||	|
|fz  }|S )a  http://www.w3.org/TR/NOTE-datetime ex: 1997-07-16T19:20:30Z

    ```python
    >>> date_time(1126482850)
    '2005-09-11T23:54:10Z'

    @@ this will change depending on where it is run
    #>>> date_time(1126482850, local_time_zone=True)
    #'2005-09-11T19:54:10-04:00'

    >>> date_time(1)
    '1970-01-01T00:00:01Z'

    >>> date_time(0)
    '1970-01-01T00:00:00Z'

    ```
       <   z
-%02d:%02dZz!%0004d-%02d-%02dT%02d:%02d:%02d%s)r	   r   r   r
   r   )tlocal_time_zone
time_tupletz_minstzdyearmonthdayhhmmsswdyzrR   s                  rH   r$   r$   )  s    & 	yFq\
a=mG"nGgmWr\::AY
-7*D%b"b"a+tUCRS.QQAHrL   c                   d| vr| dz  } | j                  d      \  }}|dd |dd }}|r|dk(  r|dd }d}n6t        |dd       }t        |d	d
       }t        |      |z  |dz  z   dz  }| }|j                  d      \  }	}
}|j                  d      \  }}}t        t        |	      t        |
      t        |      t        |      t        |      t        |      dddf	      }||z   }|S )a  always returns seconds in UTC

    ```python
    # tests are written like this to make any errors easier to understand
    >>> parse_date_time('2005-09-11T23:54:10Z') - 1126482850.0
    0.0

    >>> parse_date_time('2005-09-11T16:54:10-07:00') - 1126482850.0
    0.0

    >>> parse_date_time('1970-01-01T00:00:01Z') - 1.0
    0.0

    >>> parse_date_time('1970-01-01T00:00:00Z') - 0.0
    0.0
    >>> parse_date_time("2005-09-05T10:42:00") - 1125916920.0
    0.0

    ```
    Tz
T00:00:00Zr   r   Nr   r]            r   rq   rv   )r   r   r   r   )valymdr	   hmstz_str	tz_offset
signed_hrsminssecsr   r   r   hourminutesecondr   s                   rH   r%   r%   O  s	   , #~|		#ICq)T!"XCVs]CRy	_
6!A;Z 4'*r/9R?E	yy~D%99S>D&&	TCJC#d)S[#f+qRSUVW	A 	
IAHrL   c                    |xs t         }|j                  t        |             xs |j                  | j                               S )a}  
    Guess RDF serialization based on file suffix. Uses
    `SUFFIX_FORMAT_MAP` unless `fmap` is provided.

    Example:
        ```python
        >>> guess_format('path/to/file.rdf')
        'xml'
        >>> guess_format('path/to/file.owl')
        'xml'
        >>> guess_format('path/to/file.ttl')
        'turtle'
        >>> guess_format('path/to/file.json')
        'json-ld'
        >>> guess_format('path/to/file.xhtml')
        'rdfa'
        >>> guess_format('path/to/file.svg')
        'rdfa'
        >>> guess_format('path/to/file.xhtml', {'xhtml': 'grddl'})
        'grddl'

        ```

        This also works with just the suffixes, with or without leading dot, and
        regardless of letter case:

        ```python
        >>> guess_format('.rdf')
        'xml'
        >>> guess_format('rdf')
        'xml'
        >>> guess_format('RDF')
        'xml'

        ```
    )SUFFIX_FORMAT_MAPget_get_extr}   )fpathfmaps     rH   r&   r&   ~  s7    J $$D88HUO$?(??rL   c                    t        |       d   }|dk(  r| j                  d      r| }|r|j                         }|j                  d      r|dd }|S )aK  
    Gets the file extension from a file(path); stripped of leading '.' and in
    lower case.

    Example:
        ```python
        >>> _get_ext("path/to/file.txt")
        'txt'
        >>> _get_ext("OTHER.PDF")
        'pdf'
        >>> _get_ext("noext")
        ''
        >>> _get_ext(".rdf")
        'rdf'

        ```
    r]   rp   ro   rV   N)r   r`   r}   )r   r}   exts      rH   r   r     sU    $ 5/"
C
byU%%c*iik
~~c!"gJrL   c                    t               }|
t               }| j                  |      D ]A  \  }}|j                  |       ||v r|j                  |       ||vs1|j                  |       C |S )a  Find the roots in some sort of transitive hierarchy.

    find_roots(graph, rdflib.RDFS.subClassOf)
    will return a set of all roots of the sub-class hierarchy

    Assumes triple of the form (child, prop, parent), i.e. the direction of
    `RDFS.subClassOf` or `SKOS.broader`
    )rC   subject_objectsrD   remove)r   proproots	non_rootsrG   r   s         rH   r'   r'     sh     (+uI}%%d+1a:LLOIIIaL , LrL   c                    | S rO   rJ   )rG   s    rH   <lambda>r     s    qrL   downc           
         |
t               }||v ry|j                  |       g }|dk(  r| j                  ||      }n| j                  ||      }|D ]'  }	t	        | |	|||||      }
|
s|j                  |
       )  ||      t        ||      fS )a  
    Return a nested list/tuple structure representing the tree
    built by the transitive property given, starting from the root given

    i.e.

    ```python
    get_tree(
        graph,
        rdflib.URIRef("http://xmlns.com/foaf/0.1/Person"),
        rdflib.RDFS.subClassOf,
    )
    ```

    will return the structure for the subClassTree below person.

    dir='down' assumes triple of the form (child, prop, parent),
    i.e. the direction of RDFS.subClassOf or SKOS.broader
    Any other dir traverses in the other direction
    Nr   )key)rC   rD   subjectsobjectsr(   appendsorted)r   rootr   mappersortkeydonedirtreebranchesbranchr   s              rH   r(   r(     s    < |ut|HHTND f}>>$-==t,UFD&'4EKKN 
 4L&7344rL   c                     y rO   rJ   rh   argss     rH   r)   r)     s    @CrL   .)rh   c                     y rO   rJ   r   s     rH   r)   r)     s     rL   c                     |D ]  }||c S  | S )a  
    This is a null coalescing function, it will return the first non-`None`
    argument passed to it, otherwise it will return `default` which is `None`
    by default.

    For more info regarding the rationale of this function see deferred
    [PEP 505](https://peps.python.org/pep-0505/).

    Args:
        *args: Values to consider as candidates to return, the first arg that
            is not `None` will be returned. If no argument is passed this function
            will return None.
        default: The default value to return if none of the args are not `None`.

    Returns:
        The first `args` that is not `None`, otherwise the value of
            `default` if there are no `args` or if all `args` are `None`.
    rJ   )rh   r   args      rH   r)   r)     s    * ?J  NrL   z!$&'()*+,;=%z:@z/?/c                   t        |       }|\  }}}}}|dvr| S t        |t              }t        |t              }t        |t              }|j                  r+|j                  j                  d      j                  d      }nd}d|v rd| d}|j                  r| d|j                   }|j                  rPt        |j                  t              }|j                  r"t        |j                  t              }| d| }| d	| }t        |||||f      }	| j                  d
      r|	j                  d
      s|	d
z  }	|	S )u*  
    Prior art:

    - [iri_to_uri from Werkzeug](https://github.com/pallets/werkzeug/blob/92c6380248c7272ee668e1f8bbd80447027ccce2/src/werkzeug/urls.py#L926-L931)

    ```python
    >>> _iri2uri("https://dbpedia.org/resource/Almería")
    'https://dbpedia.org/resource/Almer%C3%ADa'

    ```
    )httphttps)safeidnaasciirp   rv   ru   ]rl   #)r   r   _PATH_SAFE_CHARS_QUERY_SAFE_CHARShostnamerw   rx   portusername_USERNAME_SAFE_CHARSpasswordr   ra   )
iripartsschemenetlocpathqueryfragmentauthpass_quoteduris
             rH   r*   r*   a  s8    SME.3+VVT5( &&
,-D%/0EX$56H~~&&v.55g>
f}VHAzz81UZZL)~~U^^*>?>>5IJKV1[M*D66(#
ffdE8<
=C
||Cc!2s
JrL   )rE   zIterable[_HashableT]returnzList[_HashableT])rE   zIterable[_AnyT]r   Optional[_AnyT])r   )rT   zIterable[str]rP   r   r   zSet[str])rT   zIterable[Any]rW   r   r   r   rO   )rR   Optional[str]rh    Optional[rdflib.term.Identifier]r   r   )NNN)
rR   strrh   r   r   r   r   z+Optional[rdflib.namespace.NamespaceManager]r   z&Optional[Union[rdflib.term.Node, str]])NF)r   r   r   r   )r   r   r   zOptional[Dict[str, str]]r   r   )T)r   r   r}   boolr   r   )r   r   r   rdflib.term.URIRefr   Optional[Set[rdflib.term.Node]]r   zSet[rdflib.term.Node])r   r   r   zrdflib.term.Noder   r   r   z.Callable[[rdflib.term.Node], rdflib.term.Node]r   zOptional[Callable[[Any], Any]]r   r  r   r   r   z,Optional[Tuple[rdflib.term.Node, List[Any]]])r   r   rh   r-   r   r-   )r   r   rh   r   r   r   )r   r   r   r   )?__doc__
__future__r   calendarr   os.pathr   r	   r   r   r   r
   typingr   r   r   r   r   r   r   r   r   r   r   r   r   r   urllib.parser   r   r   rdflib.graphrb   rdflib.namespacerdflib.termrdflib.compatr   r   __all__r+   r-   r   FORMAT_MIMETYPE_MAP"RESPONSE_TABLE_FORMAT_MIMETYPE_MAPr   r   r    r!   r"   r#   r$   r%   r&   r   r'   r(   r)   _RFC3986_SUBDELIMS_RFC3986_PCHAR_NUr   r   r   r*   rJ   rL   rH   <module>r     sv  , #   < ;     5 4    "  \2
	5	5 
5 	$	
 
8 	$ F V F 
6 	( h F I i  y! * ""+o"
# 12$% %&
  --./<'(	& "A CG?%> "!7;	m$
m$m$ m$ 
5	m$
 ,m$`#L,^&@R> .2
 + 	< >I.2,01515
15 15 ;	15
 ,15 *15 
15 215h 
 C 
 C 
7:%4 
 8<%46 # 
 ,,t3  &,  *C/ 
 %s* 2rL   