§
    kÃ¿a—4  ã                   óÀ  — d Z ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlm	Z	 dd	l
mZ dd
l
mZ ddl
mZ ddl
mZ ddlZddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ g d¢Zd„ Zd„ Zd8d„Zd„ Zd9d„Zd:de fd„Z!d„ Z"d„ Z#d„ Z$d„ Z%d „ Z&d!„ Z'd;d#„Z(d$„ Z)d%d%d%d&d'd(d)d*d*d*d+d,d-d-d-d.œZ*d9d/„Z+d<d1„Z,d9d2„Z-d3„ ddd4fd5„Z.d6„ Z/e0d7k    r e/¦   «          dS dS )=aT  
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

Statement and component type checkers

* check_context
* check_subject
* check_predicate
* check_object
* check_statement
* check_pattern

é    )Útimegm)Úaltzone)Úgmtime)Ú	localtime)Útime)Útimezone)Úsplitext)ÚContextTypeError)ÚObjectTypeError)ÚPredicateTypeError)ÚSubjectTypeErrorN)Ú	Namespace)ÚNamespaceManager)ÚBNode)ÚLiteral)ÚURIRef)Úsign)Úlist2setÚfirstÚuniqÚ	more_thanÚto_termÚfrom_n3Ú	date_timeÚparse_date_timeÚcheck_contextÚcheck_subjectÚcheck_predicateÚcheck_objectÚcheck_statementÚcheck_patternÚguess_formatÚ
find_rootsÚget_treec                 ó<   ‡— t          ¦   «         Šˆfd„| D ¦   «         S )zX
    Return a new list without duplicates.
    Preserves the order, unlike set(seq)
    c                 óF   •— g | ]}|‰v¯‰                      |¦  «        °|‘ŒS © )Úadd)Ú.0ÚxÚseens     €ú-/usr/lib/python3/dist-packages/rdflib/util.pyú
<listcomp>zlist2set.<locals>.<listcomp>R   s,   ø€ Ð@Ð@Ð@�!˜a t˜m˜m°D·H²H¸Q±K´K˜mˆA˜m˜m˜mó    ©Úset)Úseqr+   s    @r,   r   r   L   s(   ø€ õ
 ‰5Œ5€DØ@Ð@Ð@Ð@�sÐ@Ñ@Ô@Ð@r.   c                 ó   — | D ]}|c S dS )z_
    return the first element in a python sequence
    for graphs, use graph.value instead
    Nr'   )r1   Úresults     r,   r   r   U   s!   € ð
 ð ð ˆØˆˆˆØˆ4r.   c                 óV   — |rt          d„ | D ¦   «         ¦  «        S t          | ¦  «        S )z,removes duplicate strings from the sequence.c              3   ó>   K  — | ]}|                      ¦   «         V — Œd S ©N)Ústrip)r)   Úss     r,   ú	<genexpr>zuniq.<locals>.<genexpr>b   s*   è è € Ð/Ð/ �1—7’7‘9”9Ð/Ð/Ð/Ð/Ð/Ð/r.   r/   )Úsequencer7   s     r,   r   r   _   s3   € àð ÝÐ/Ð/ hÐ/Ñ/Ô/Ñ/Ô/Ð/å�8‰}Œ}Ðr.   c                 ó0   — d}| D ]}|dz  }||k    r dS ŒdS )z>Returns 1 if sequence has more items than number and 0 if not.r   é   r'   )r:   ÚnumberÚiÚitems       r,   r   r   g   s9   € à	€AØð ð ˆØ	ˆQ‰ˆØˆvŠ:ˆ:Ø�1�1ð àˆ1r.   c                 ó~  — | s|S |                       d¦  «        r,|                      d¦  «        rt          | dd…         ¦  «        S |                       d¦  «        r,|                      d¦  «        rt          | dd…         ¦  «        S |                       d¦  «        rt	          | ¦  «        S d| z  }t          |¦  «        ‚)a…  
    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)

    ú<ú>r<   éÿÿÿÿú"Ú_zUnrecognised term syntax: '%s')Ú
startswithÚendswithr   r   r   Ú	Exception)r8   ÚdefaultÚmsgs      r,   r   r   q   sº   € ð ð 
ØˆØ	
�Š�cÑ	Ô	ð ˜qŸzšz¨#™œð Ý�a˜˜"˜”g‰ŒÐØ	
�Š�cÑ	Ô	ð ˜qŸzšz¨#™œð Ý�q˜˜2˜”wÑÔÐØ	
�Š�cÑ	Ô	ð Ý�Q‰xŒxˆà.°Ñ2ˆÝ˜‰nŒnÐr.   r8   c                 ó@  — | s|S |                       d¦  «        r=t          | dd…                              d¦  «                             d¦  «        ¦  «        S |                       d¦  «        �r|                       d¦  «        rd}nd}|                      |d¦  «        \  }}|t          |¦  «        d…         }d}d}|                     d	¦  «        }	|	d
k    rt          ||	dz   d…         |||¦  «        }n|                      d¦  «        r
|dd…         }|                     dd¦  «        }|                     dd¦  «        }|                     d¦  «                             d¦  «        }t          |||¦  «        S | dk    s| dk    rt          | dk    ¦  «        S |  
                    ¦   «         rt          t          | ¦  «        ¦  «        S |                       d¦  «        r7t          | dd…         ¦  «        }
t          j                             ||
¦  «        S |                       d¦  «        r7t          | dd…         ¦  «        }
t          j                             ||
¦  «        S |                       d¦  «        rt!          | dd…         ¦  «        S d| v r‚|€+t#          t          j                             ¦   «         ¦  «        }|                      dd¦  «        \  }}t'          |                     ¦   «         ¦  «        |         }t+          |¦  «        |         S t!          | ¦  «        S )aŠ  
    Creates the Identifier corresponding to the given n3 string.

        >>> 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

    rA   r<   rC   zraw-unicode-escapezunicode-escaperD   z"""Nz^^r   é   ú@z\"z\xz\\xÚtrueÚfalseú{ú[z_:ú:)rF   r   ÚencodeÚdecodeÚrsplitÚlenÚrfindr   Úreplacer   ÚisdigitÚintÚrdflibÚgraphÚQuotedGraphÚGraphr   r   ÚsplitÚdictÚ
namespacesr   )r8   rI   ÚbackendÚnsmÚquotesÚvalueÚrestÚdatatypeÚlanguageÚdtoffsetÚ
identifierÚprefixÚ	last_partÚnss                 r,   r   r   Œ   sæ  € ð6 ð ØˆØ‡|‚|�CÑÔð 6õ �a˜˜"˜”g—n’nÐ%9Ñ:Ô:×AÒAÐBRÑSÔSÑTÔTÐTØ	
�Š�cÑ	Ô	ñ 2Ø�<Š<˜ÑÔð 	ØˆFˆFàˆFØ—h’h˜v qÑ)Ô)‰ˆˆtØ•c˜&‘k”k�m�mÔ$ˆØˆØˆð —:’:˜dÑ#Ô#ˆØ�qŠ=ˆ=õ
 ˜t H¨q¡L N NÔ3°W¸gÀsÑKÔKˆHˆHà�Š˜sÑ#Ô#ð $Ø   œ8�à—’˜e SÑ)Ô)ˆð —’˜e VÑ,Ô,ˆð —’Ð1Ñ2Ô2×9Ò9Ð:JÑKÔKˆÝ�u˜h¨Ñ1Ô1Ð1Ø	
ˆfŠˆ˜˜Wš˜Ý�q˜F’{Ñ#Ô#Ð#Ø	
�Š‰Œð Ý•s˜1‘v”v‰ŒÐØ	
�Š�cÑ	Ô	ð Ý˜Q˜q ˜tœWÑ%Ô%ˆ
ÝŒ|×'Ò'¨°Ñ<Ô<Ð<Ø	
�Š�cÑ	Ô	ð Ý˜Q˜q ˜tœWÑ%Ô%ˆ
ÝŒ|×!Ò! '¨:Ñ6Ô6Ð6Ø	
�Š�dÑ	Ô	ð 
Ý�Q�q�r�r”U‰|Œ|ÐØ	�ˆˆØˆ;å"¥6¤<×#5Ò#5Ñ#7Ô#7Ñ8Ô8ˆCØŸGšG C¨™OœOÑˆ�	Ý�#—.’.Ñ"Ô"Ñ#Ô# FÔ+ˆÝ˜‰}Œ}˜YÔ'Ð'å�Q‰xŒxˆr.   c                 ó    — t          | t          ¦  «        s6t          | t          ¦  «        s#t          | ›dt	          | ¦  «        ›�¦  «        ‚d S d S )NrR   )Ú
isinstancer   r   r
   Útype)Úcs    r,   r   r   â   sX   € Ý�q�&Ñ!Ô!ð 7¥Z°µ5Ñ%9Ô%9ð 7Ý¨!¨!¨!­T°!©W¬W¨WÐ5Ñ6Ô6Ð6ð7ð 7ð 7ð 7r.   c                 ó|   — t          | t          ¦  «        s$t          | t          ¦  «        st          | ¦  «        ‚dS dS )z*Test that s is a valid subject identifier.N)ro   r   r   r   )r8   s    r,   r   r   ç   sG   € å�q�&Ñ!Ô!ð "¥Z°µ5Ñ%9Ô%9ð "Ý˜qÑ!Ô!Ð!ð"ð "ð "ð "r.   c                 óN   — t          | t          ¦  «        st          | ¦  «        ‚dS )z,Test that p is a valid predicate identifier.N)ro   r   r   )Úps    r,   r   r   í   s,   € å�a�Ñ Ô ð $Ý  Ñ#Ô#Ð#ð$ð $r.   c                 óª   — t          | t          ¦  «        s9t          | t          ¦  «        s&t          | t          ¦  «        st	          | ¦  «        ‚dS dS dS )z)Test that o is a valid object identifier.N)ro   r   r   r   r   )Úos    r,   r   r   ó   sb   € å�q�&Ñ!Ô!ð !¥Z°µ7Ñ%;Ô%;ð !½zÈ!ÍUÑ?SÔ?Sð !Ý˜aÑ Ô Ð ð!ð !ð !ð !ð !ð !r.   c                 óp  — | \  }}}t          |t          ¦  «        s$t          |t          ¦  «        st          |¦  «        ‚t          |t          ¦  «        st	          |¦  «        ‚t          |t          ¦  «        s9t          |t
          ¦  «        s&t          |t          ¦  «        st          |¦  «        ‚d S d S d S r6   ©ro   r   r   r   r   r   r   ©Útripler8   rt   rv   s       r,   r    r    ù   s¾   € Ø�I€Qˆˆ1Ý�q�&Ñ!Ô!ð "¥Z°µ5Ñ%9Ô%9ð "Ý˜qÑ!Ô!Ð!å�a�Ñ Ô ð $Ý  Ñ#Ô#Ð#å�q�&Ñ!Ô!ð !¥Z°µ7Ñ%;Ô%;ð !½zÈ!ÍUÑ?SÔ?Sð !Ý˜aÑ Ô Ð ð!ð !ð !ð !ð !ð !r.   c                 ó€  — | \  }}}|r9t          |t          ¦  «        s$t          |t          ¦  «        st          |¦  «        ‚|r$t          |t          ¦  «        st	          |¦  «        ‚|rNt          |t          ¦  «        s;t          |t
          ¦  «        s(t          |t          ¦  «        st          |¦  «        ‚d S d S d S d S r6   rx   ry   s       r,   r!   r!     sâ   € Ø�I€Qˆˆ1Øð "•*˜Q¥Ñ'Ô'ð "­:°a½Ñ+?Ô+?ð "Ý˜qÑ!Ô!Ð!àð $•˜A�vÑ&Ô&ð $Ý  Ñ#Ô#Ð#àð !Ý�1•fÑÔð!Ý!+¨A­wÑ!7Ô!7ð!Ý;EÀaÍÑ;OÔ;Oð!õ ˜aÑ Ô Ð ð!ð !ð !ð !ð !ð !ð !ð !r.   Fc           	      óð   — | €t          ¦   «         } |r:t          | ¦  «        }|d         rt          dz  }n
t          dz  }d|dz  |dz  fz  }nt	          | ¦  «        }d}|\	  }}}}}	}
}}}d|||||	|
|fz  }|S )ah  http://www.w3.org/TR/NOTE-datetime ex: 1997-07-16T19:20:30Z

    >>> 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'
    Né   é<   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Úzr8   s                  r,   r   r     s¤   € ð  	€yÝ‰FŒFˆàð 	Ý˜q‘\”\ˆ
Ø�aŒ=ð 	%Ý ‘mˆGˆGå "‘nˆGØ˜g¨™m¨W°r©\Ð:Ñ:ˆˆå˜A‘Y”Yˆ
Øˆà-7Ñ*€Dˆ%��b˜"˜b " a¨Ø+¨t°U¸CÀÀRÈÈSÐ.QÑQ€AØ€Hr.   c                 ól  — d| vr| dz  } |                       d¦  «        \  }}|dd…         |dd…         }}|r|dk    r|dd…         }d}nLt          |dd…         ¦  «        }t          |d	d
…         ¦  «        }t          |¦  «        |z  |dz  z   dz  }| }|                      d¦  «        \  }	}
}|                      d¦  «        \  }}}t          t          |	¦  «        t          |
¦  «        t          |¦  «        t          |¦  «        t          |¦  «        t          |¦  «        dddf	¦  «        }||z   }|S )aÅ  always returns seconds in UTC

    # 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   rC   é   é   é   r~   ú-rR   )r_   rZ   r   r   )ÚvalÚymdr   ÚhmsÚtz_strÚ	tz_offsetÚ
signed_hrsÚminsÚsecsr…   r†   r‡   ÚhourÚminuteÚsecondr€   s                   r,   r   r   6  s=  € ð& �#€~€~Øˆ|Ñˆà—	’	˜#‘”�I€CˆØ�q˜�s”)˜T ! " "œXˆ€Càð �V˜s’]�]Ø�C�R�CŒyˆØˆ	ˆ	å˜   œ‘_”_ˆ
Ý�6˜!˜A˜#”;ÑÔˆÝ�ZÑ Ô  4Ñ'¨*°r©/Ñ9¸RÑ?ˆØ�Eˆ	à—y’y ‘~”~Ñ€Dˆ%�ØŸ9š9 S™>œ>Ñ€Dˆ&�&åÝ	ˆT‰Œ•C˜‘J”J¥ C¡¤­#¨d©)¬)µS¸±[´[Å#ÀfÁ+Ä+ÈqÐRSÐUVÐWñ	ô 	€Að 	
ˆI‰€AØ€Hr.   ÚxmlÚn3ÚturtleÚntÚtrixÚrdfaÚnquadsÚtrigújson-ld)rŸ   ÚrdfÚowlr    Úttlr¢   r£   ÚxhtmlÚhtmlÚsvgÚnqr¦   ÚjsonÚjsonldr§   c                 ó¦   — |pt           }|                     t          | ¦  «        ¦  «        p&|                     |                      ¦   «         ¦  «        S )a9  
    Guess RDF serialization based on file suffix. Uses
    ``SUFFIX_FORMAT_MAP`` unless ``fmap`` is provided. Examples:

        >>> 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::

        >>> guess_format('.rdf')
        'xml'
        >>> guess_format('rdf')
        'xml'
        >>> guess_format('RDF')
        'xml'
    )ÚSUFFIX_FORMAT_MAPÚgetÚ_get_extÚlower)ÚfpathÚfmaps     r,   r"   r"   u  s@   € ð< Ð$Õ$€DØ�8Š8•H˜U‘O”OÑ$Ô$Ð?¨¯ª°·²±´Ñ(?Ô(?Ð?r.   Tc                 óÔ   — t          | ¦  «        d         }|dk    r|                      d¦  «        r| }|r|                     ¦   «         }|                     d¦  «        r
|dd…         }|S )a)  
    Gets the file extension from a file(path); stripped of leading '.' and in
    lower case. Examples:

        >>> _get_ext("path/to/file.txt")
        'txt'
        >>> _get_ext("OTHER.PDF")
        'pdf'
        >>> _get_ext("noext")
        ''
        >>> _get_ext(".rdf")
        'rdf'
    rC   Ú ú.r<   N)r	   rF   rµ   )r¶   rµ   Úexts      r,   r´   r´   —  so   € õ �5‰/Œ/˜"Ô
€CØ
ˆb‚y€y�U×%Ò% cÑ*Ô*€yØˆØð Ø�iŠi‰kŒkˆØ
‡~‚~�cÑÔð Ø�!�"�"ŒgˆØ€Jr.   c                 ó  — t          ¦   «         }|€t          ¦   «         }|                      |¦  «        D ]L\  }}|                     |¦  «         ||v r|                     |¦  «         ||vr|                     |¦  «         ŒM|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

    )r0   Úsubject_objectsr(   Úremove)r\   ÚpropÚrootsÚ	non_rootsr*   rŒ   s         r,   r#   r#   ¯  s†   € õ ‘”€IØ€}Ý‘”ˆØ×%Ò% dÑ+Ô+ð ð ‰ˆˆ1Ø�Š�aÑÔÐØ�ˆ:ˆ:Ø�LŠL˜‰OŒOˆOØ�IÐÐØ�IŠI�a‰LŒLˆLøØ€Lr.   c                 ó   — | S r6   r'   )r*   s    r,   ú<lambda>rÃ   È  s   € ¨€ r.   Údownc           
      ó\  — |€t          ¦   «         }||v rdS |                     |¦  «         g }|dk    r|                      ||¦  «        }n|                      ||¦  «        }|D ].}	t	          | |	|||||¦  «        }
|
r|                     |
¦  «         Œ/ ||¦  «        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.

    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)r0   r(   ÚsubjectsÚobjectsr$   ÚappendÚsorted)r\   Úrootr¿   ÚmapperÚsortkeyÚdoneÚdirÚtreeÚbranchesÚbranchr€   s              r,   r$   r$   Ç  sÅ   € ð* €|Ý‰uŒuˆØˆt€|€|ØˆØ‡H‚HˆT�N„N€NØ€Dà
ˆf‚}€}Ø—>’> $¨Ñ-Ô-ˆˆà—=’=  tÑ,Ô,ˆàð ð ˆÝ�U˜F D¨&°'¸4ÀÑEÔEˆØð 	Ø�KŠK˜‰NŒNˆNøàˆF�4‰LŒL�& ¨7Ð3Ñ3Ô3Ð4Ð4r.   c                  ó6   — dd l } |                      ¦   «          d S )Nr   )ÚdoctestÚtestmod)rÔ   s    r,   ÚtestrÖ   ð  s!   € Ø€N€N€Nà‡O‚OÑÔÐÐÐr.   Ú__main__)r   r6   )NNN)NF)T)1Ú__doc__Úcalendarr   r   r   r   r   r   Úos.pathr	   Úrdflib.exceptionsr
   r   r   r   Úrdflib.graphr[   Úrdflib.namespacer   r   Úrdflib.termr   r   r   Úrdflib.compatr   Ú__all__r   r   r   r   r   Ústrr   r   r   r   r   r    r!   r   r   r²   r"   r´   r#   r$   rÖ   Ú__name__r'   r.   r,   ú<module>rã      s4  ððð ð> Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð ð Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð à Ð Ð Ð Ð Ð à .Ð .Ð .Ð .Ð .Ð .Ø -Ð -Ð -Ð -Ð -Ð -Ø 0Ð 0Ð 0Ð 0Ð 0Ð 0Ø .Ð .Ð .Ð .Ð .Ð .Ø Ð Ð Ð Ø &Ð &Ð &Ð &Ð &Ð &Ø -Ð -Ð -Ð -Ð -Ð -Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð ðð ð €ð*Að Að Aðð ð ðð ð ð ðð ð ðð ð ð ð6Sð Sˆsð Sð Sð Sð Sðl7ð 7ð 7ð
"ð "ð "ð$ð $ð $ð!ð !ð !ð	!ð 	!ð 	!ð!ð !ð !ð ð  ð  ð  ðF)ð )ð )ðZ ØØØ
ØØ
ØØØØØ
ØØØØðð Ð ð&@ð @ð @ð @ðDð ð ð ð0ð ð ð ð2 *˜k°4¸dÈð&5ð &5ð &5ð &5ðRð ð ð ˆzÒÐð 	€D�F„F€F€F€Fð Ðr.   