3
d_              R   @   s  d dl mZ d dl mZ d dl mZ d dl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 d dlmZmZmZmZ dZddddddddddddddddgZejeZG dd de
ZG dd de
ZG d d deZG d!d" d"eZe Zeed#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2gd3Z ed4Z!eeZ"ed5Z#ed6Z$ed7Z%ed8Z&ed9Z'eed:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMd1dNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdig0d3Z(edjZ)edkZ*eedldmdnd;dodpdqdrdsdtdudvdwdxdydzd<d{dLd|d}d~dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddgPd3Z+edZ,edZ-edZ.eeddddddddddddddddddddddddxdd1dddddddg d3Z/ed܃Z0ed݃Z1edރZ2ed߃Z3G dd deZ4dddddgZ5e5dg Z6e5dddddg Z7ddddddgZ8dd Z9dZ:e6fddZ;dd Z<dd Z=dd Z>dS )    )absolute_import)division)print_functionN)category)string_types)	text_type)pathname2url)	urldefrag)urljoin)URIRefVariable_XSD_PFX_is_valid_uria  
===================
Namespace Utilities
===================

RDFLib provides mechanisms for managing Namespaces.

In particular, there is a :class:`~rdflib.namespace.Namespace` class
that takes as its argument the base URI of the namespace.

.. code-block:: pycon

    >>> from rdflib.namespace import Namespace
    >>> owl = Namespace('http://www.w3.org/2002/07/owl#')

Fully qualified URIs in the namespace can be constructed either by attribute
or by dictionary access on Namespace instances:

.. code-block:: pycon

    >>> owl.seeAlso
    rdflib.term.URIRef(u'http://www.w3.org/2002/07/owl#seeAlso')
    >>> owl['seeAlso']
    rdflib.term.URIRef(u'http://www.w3.org/2002/07/owl#seeAlso')


Automatic handling of unknown predicates
-----------------------------------------

As a programming convenience, a namespace binding is automatically
created when :class:`rdflib.term.URIRef` predicates are added to the graph.

Importable namespaces
-----------------------

The following namespaces are available by directly importing from rdflib:

* RDF
* RDFS
* OWL
* XSD
* FOAF
* SKOS
* DOAP
* DC
* DCTERMS
* VOID

.. code-block:: pycon

    >>> from rdflib import OWL
    >>> OWL.seeAlso
    rdflib.term.URIRef(u'http://www.w3.org/2002/07/owl#seeAlso')

	is_ncname	split_uri	NamespaceClosedNamespaceNamespaceManagerXMLNSRDFRDFSXSDOWLSKOSDOAPFOAFDCDCTERMSVOIDc               @   sF   e Zd ZdZdd Zedd Zdd Zdd	d
Zdd Z	dd Z
dS )r   a  
    Utility class for quickly generating URIRefs with a common prefix

    >>> from rdflib import Namespace
    >>> n = Namespace("http://example.org/")
    >>> n.Person # as attribute
    rdflib.term.URIRef(u'http://example.org/Person')
    >>> n['first-name'] # as item - for things that are not valid python identifiers
    rdflib.term.URIRef(u'http://example.org/first-name')

    c             C   s8   yt j| |}W n" tk
r2   t j| |d}Y nX |S )Nzutf-8)r   __new__UnicodeDecodeError)clsvaluert r$   2/tmp/pip-build-7vycvbft/rdflib/rdflib/namespace.pyr   b   s
    zNamespace.__new__c             C   s   t | d S )Ntitle)r   )selfr$   r$   r%   r&   i   s    zNamespace.titlec             C   s   t | t|tr|nd S )N )r   
isinstancer   )r'   namer$   r$   r%   termm   s    zNamespace.termNc             C   s
   | j |S )N)r+   )r'   keydefaultr$   r$   r%   __getitem__q   s    zNamespace.__getitem__c             C   s   |j drtn
| j|S d S )N__)
startswithAttributeErrorr+   )r'   r*   r$   r$   r%   __getattr__t   s    
zNamespace.__getattr__c             C   s   dt |  S )NzNamespace(%r))r   )r'   r$   r$   r%   __repr__z   s    zNamespace.__repr__)N)__name__
__module____qualname____doc__r   propertyr&   r+   r.   r2   r3   r$   r$   r$   r%   r   T   s   
c               @   s0   e Zd ZdZdd Zdd Zdd Zdd	 Zd
S )
URIPatterna9  
    Utility class for creating URIs according to some pattern
    This supports either new style formatting with .format
    or old-style with % operator

    >>> u=URIPattern("http://example.org/%s/%d/resource")
    >>> u%('books', 12345)
    rdflib.term.URIRef(u'http://example.org/books/12345/resource')

    c             C   s8   yt j| |}W n" tk
r2   t j| |d}Y nX |S )Nzutf-8)r   r   r    )r!   r"   r#   r$   r$   r%   r      s
    zURIPattern.__new__c             O   s   t t| j||S )N)r   r   __mod__)r'   argskwargsr$   r$   r%   r:      s    zURIPattern.__mod__c             O   s   t tj| f||S )N)r   r   format)r'   r;   r<   r$   r$   r%   r=      s    zURIPattern.formatc             C   s   dt |  S )NzURIPattern(%r))r   )r'   r$   r$   r%   r3      s    zURIPattern.__repr__N)r4   r5   r6   r7   r   r:   r=   r3   r$   r$   r$   r%   r9   ~   s
   r9   c               @   sB   e Zd ZdZdd Zdd ZdddZd	d
 Zdd Zdd Z	dS )r   zf
    A namespace with a closed list of members

    Trying to create terms not listen is an error
    c             C   s2   || _ i | _x |D ]}t| j | | j|< qW d S )N)uri_ClosedNamespace__urisr   )r'   r>   termstr$   r$   r%   __init__   s    
zClosedNamespace.__init__c             C   s0   | j j|}|d kr(tdj|| jn|S d S )Nzterm '{}' not in namespace '{}')r?   getKeyErrorr=   r>   )r'   r*   r>   r$   r$   r%   r+      s
    zClosedNamespace.termNc             C   s
   | j |S )N)r+   )r'   r,   r-   r$   r$   r%   r.      s    zClosedNamespace.__getitem__c             C   sJ   |j drtn6y
| j|S  tk
rD } zt|W Y d d }~X nX d S )Nr/   )r0   r1   r+   rD   )r'   r*   er$   r$   r%   r2      s    

zClosedNamespace.__getattr__c             C   s
   t | jS )N)r   r>   )r'   r$   r$   r%   __str__   s    zClosedNamespace.__str__c             C   s   dt | j S )Nz!rdf.namespace.ClosedNamespace(%r))r   r>   )r'   r$   r$   r%   r3      s    zClosedNamespace.__repr__)N)
r4   r5   r6   r7   rB   r+   r.   r2   rF   r3   r$   r$   r$   r%   r      s   	
	c                   s,   e Zd ZdZ fddZ fddZ  ZS )_RDFNamespacez(
    Closed namespace for RDF terms
    c          !      sZ   t t| jt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 gd! d S )"Nz+http://www.w3.org/1999/02/22-rdf-syntax-ns#r   DescriptionZIDZaboutZ	parseTyperesourceliZnodeIDdatatypeZSeqZBagZAltZ	StatementZPropertyListZPlainLiteralsubject	predicateobjecttyper"   firstrestnilZ
XMLLiteralZHTMLZ
langStringZJSONZCompoundLiterallanguage	direction)r@   )superrG   rB   r   )r'   )	__class__r$   r%   rB      s    


z_RDFNamespace.__init__c                s^   |j drNyt|dd  }W n tk
r2   Y nX |dkrNtd| j|f S tt| j|S )N_   r   z%s_%s)r0   int
ValueErrorr   r>   rV   rG   r+   )r'   r*   i)rW   r$   r%   r+      s    
z_RDFNamespace.term)r4   r5   r6   r7   rB   r+   __classcell__r$   r$   )rW   r%   rG      s   rG   z%http://www.w3.org/2000/01/rdf-schema#ResourceZClassZ
subClassOfZsubPropertyOfcommentlabeldomainrangeZseeAlsoZisDefinedByLiteral	ContainerZContainerMembershipPropertymemberZDatatype)r>   r@   zhttp://www.w3.org/2002/07/owl#zhttp://www.w3.org/ns/csvw#z http://purl.org/dc/elements/1.1/zhttp://www.w3.org/ns/dcat#zhttp://purl.org/dc/terms/zhttp://usefulinc.com/ns/doap#zhttp://xmlns.com/foaf/0.1/ZAgentZPersonr*   r&   imgZ	depictionZdepictsZ
familyNameZ	givenNameZknowsZ
based_nearZageZmademakerZprimaryTopicZprimaryTopicOfZProjectZOrganizationGroupDocumentZImageZnickZmboxhomepageZweblogZopenidZjabberIDZmbox_sha1sumZinterestZtopic_interestZtopicpageZworkplaceHomepageZworkInfoHomepageZschoolHomepageZpublicationsZcurrentProjectZpastProjectaccountZOnlineAccountZaccountNameZaccountServiceHomepageZPersonalProfileDocumentZtipjarsha1Z	thumbnailZlogozhttp://www.w3.org/ns/odrl/2/zhttp://www.w3.org/ns/org#zhttp://www.w3.org/ns/prov#EntityZActivityZwasGeneratedByZwasDerivedFromZwasAttributedToZstartedAtTimeusedZwasInformedByZendedAtTimeZwasAssociatedWithZactedOnBehalfOf
CollectionZEmptyCollectionZBundleZSoftwareAgentLocationZalternateOfZspecializationOfZgeneratedAtTimeZhadPrimarySourcer"   ZwasQuotedFromZwasRevisionOfZinvalidatedAtTimeZwasInvalidatedByZ	hadMemberZwasStartedByZ
wasEndedByZinvalidatedZ
influencedZ
atLocation	generatedZ	InfluenceZEntityInfluenceUsageZStartZEndZ
DerivationZPrimarySourceZ	QuotationZRevisionZActivityInfluenceZ
GenerationZCommunicationZInvalidationZAgentInfluenceZAttributionZAssociationZPlanZ
DelegationZInstantaneousEventZRoleZwasInfluencedByZqualifiedInfluenceZqualifiedGenerationZqualifiedDerivationZqualifiedPrimarySourceZqualifiedQuotationZqualifiedRevisionZqualifiedAttributionZqualifiedInvalidationZqualifiedStartZqualifiedUsageZqualifiedCommunicationZqualifiedAssociationZqualifiedEndZqualifiedDelegationZ
influencerentityZhadUsageZhadGenerationZactivityZagentZhadPlanZhadActivityatTimeZhadRolezhttp://www.w3.org/ns/dx/prof/zhttps://schema.org/zhttp://www.w3.org/ns/shacl#z$http://www.w3.org/2004/02/skos/core#ZConceptZConceptSchemeZinSchemeZhasTopConceptZtopConceptOfZaltLabelZhiddenLabelZ	prefLabelnotationZ
changeNoteZ
definitionZeditorialNoteZexampleZhistoryNoteZnoteZ	scopeNoteZbroaderZbroaderTransitiveZnarrowerZnarrowerTransitiverelatedZsemanticRelationZOrderedCollectionZ
memberListZ
broadMatchZ
closeMatchZ
exactMatchZmappingRelationZnarrowMatchZrelatedMatchzhttp://www.w3.org/ns/ssn/zhttp://www.w3.org/ns/sosa/zhttp://www.w3.org/2006/time#zhttp://rdfs.org/ns/void#c               @   sx   e Zd ZdZdd Zdd Zdd ZeeZdd	 Z	d
d Z
dd ZdddZdddZdddZdd ZdddZdS ) r   at  

    Class for managing prefix => namespace mappings

    Sample usage from FuXi ...

    .. code-block:: python

        ruleStore = N3RuleStore(additionalBuiltins=additionalBuiltins)
        nsMgr = NamespaceManager(Graph(ruleStore))
        ruleGraph = Graph(ruleStore,namespace_manager=nsMgr)


    and ...

    .. code-block:: pycon

        >>> import rdflib
        >>> from rdflib import Graph
        >>> from rdflib.namespace import Namespace, NamespaceManager
        >>> exNs = Namespace('http://example.com/')
        >>> namespace_manager = NamespaceManager(Graph())
        >>> namespace_manager.bind('ex', exNs, override=False)
        >>> g = Graph()
        >>> g.namespace_manager = namespace_manager
        >>> all_ns = [n for n in g.namespace_manager.namespaces()]
        >>> assert ('ex', rdflib.term.URIRef('http://example.com/')) in all_ns
        >>>

    c             C   s~   || _ i | _i | _d | _i | _i | _x$| j D ]\}}t| jt| q.W | j	dd | j	dt
 | j	dt | j	dt d S )Nxmlz$http://www.w3.org/XML/1998/namespacerdfZrdfsZxsd)graph_NamespaceManager__cache_NamespaceManager__cache_strictZ_NamespaceManager__log_NamespaceManager__strie_NamespaceManager__trie
namespacesinsert_triestrbindr   r   r   )r'   rz   pnr$   r$   r%   rB   d  s    zNamespaceManager.__init__c             C   s<   i | _ i | _i | _x$| j D ]\}}t| jt| qW d S )N)r{   r}   r~   r   r   r   )r'   r   r   r$   r$   r%   resetr  s
    zNamespaceManager.resetc             C   s   | j jS )N)rz   store)r'   r$   r$   r%   Z__get_storey  s    zNamespaceManager.__get_storec             C   s.   | j |\}}}|dkr|S dj||fS d S )Nr(   :)compute_qnamejoin)r'   r>   prefix	namespacer*   r$   r$   r%   qname}  s    zNamespaceManager.qnamec             C   s.   | j |\}}}|dkr|S dj||fS d S )Nr(   r   )compute_qname_strictr   )r'   r>   r   r   r*   r$   r$   r%   qname_strict  s    zNamespaceManager.qname_strictc             C   s   y:t |\}}|| jkr,t| j| jt| tt|}W n&   t|trTd| S d| S Y nX | j	j
|}|dkrt|trd| S |dkrd| S | j|}dj|d |d gS dS )z
        Takes an RDF Term and 'normalizes' it into a QName (using the
        registered prefix) or (unlike compute_qname) the Notation 3
        form for URIs: <...URI...>
        z?%sz<%s>Nr   r   rY   )r   r}   insert_strier~   r   r   r   r)   r   r   r   r   r   )r'   ZrdfTermr   r*   r   Z
qNamePartsr$   r$   r%   normalizeUri  s     


zNamespaceManager.normalizeUriTc       	      C   sB  t |stdj||| jkr8yt|\}}W n> tk
rp } z"t|}| jj|}|s`|W Y d d }~X nX || jkrt	| j| j
| | j| rt| j| |}|d k	r|}|t|d  }t|}| jj|}|d kr(|stdj|d}x$d| }| jj|sP |d7 }qW | j|| |||f| j|< | j| S )NzY"{}" does not look like a valid URI, cannot serialize this. Did you want to urlencode it?z)No known prefix for {} and generate=FalserY   zns%s)r   r[   r=   r{   r   r   r   r   r}   r   r~   get_longest_namespacelenrD   r   r   )	r'   r>   generater   r*   rE   r   Zpl_namespacenumr$   r$   r%   r     sB    


zNamespaceManager.compute_qnamec       	      C   s  | j |\}}}tt|r&|||fS || jkryt|t\}}W n4 tk
rx } zdj|}t|W Y d d }~X nX || jkrt	| j| j
| t|}| jj|}|d kr|stdj|d}x"d| }| jj|sP |d7 }qW | j|| |||f| j|< | j| S d S )Nz^This graph cannot be serialized to a strict format because there is no valid way to shorten {}z)No known prefix for {} and generate=FalserY   zns%s)r   r   r   r|   r   NAME_START_CATEGORIESr[   r=   r}   r   r~   r   r   r   rD   r   r   )	r'   r>   r   r   r   r*   rE   messager   r$   r$   r%   r     s6    

	z%NamespaceManager.compute_qname_strictFc       
      C   s(  t t|}|dkrd}| jj|}|r0t |}|r||kr|rb| jj|| t| jt| dS |sjd}d}xFd||f }| jj|}|r|t |krdS | jj|sP |d7 }qpW | jj|| nN| jj|}	|	dkr| jj|| n*|	|krn |s|	j	dr| jj|| t| jt| dS )zbind a given namespace to the prefix

        if override, rebind, even if the given namespace is already
        bound to another prefix.

        if replace, replace any existing prefix with the new namespace

        Nr(   r-   rY   z%s%srX   )
r   r   r   r   r   r   r~   r   r   r0   )
r'   r   r   overridereplaceZbound_namespacer   
new_prefixZ
tnamespaceZbound_prefixr$   r$   r%   r      s>    
zNamespaceManager.bindc             c   s.   x(| j j D ]\}}t|}||fV  qW d S )N)r   r   r   )r'   r   r   r$   r$   r%   r   9  s    zNamespaceManager.namespacesrY   c             C   sf   t dttj }t d| || d}|r6t|d }|s^|r^|d dkr^|d	 dkr^d| }t|S )
Nzfile:z%s/)allow_fragmentsr   rY   #z%s#r   r   )r
   r   osgetcwdr	   r   )r'   r>   defragbaseresultr$   r$   r%   
absolutize>  s    zNamespaceManager.absolutizeN)T)T)TF)rY   )r4   r5   r6   r7   rB   r   Z_NamespaceManager__get_storer8   r   r   r   r   r   r   r   r   r   r$   r$   r$   r%   r   D  s   
*
2
9ZLlZLuZLoLtZNlZNdZMcZMeZMnZLm   ·u   ·-.rX   r   c             C   sj   | rf| d }|dks t |tkrfx@tdt| D ].}| | }t |tkr0|dkrZ|tkrZq0dS q0W dS dS )Nr   rX   rY   r   )r   r   rb   r   NAME_CATEGORIESALLOWED_NAME_CHARS)r*   rQ   r\   cr$   r$   r%   r   w  s    z$http://www.w3.org/XML/1998/namespacec             C   s   | j trt| jtd fS t| }xtd|D ]}| | d  }t|tkr0|tkrXq0xXtd| |D ]F}t| | |ks| | dkrh| d | }|sP | |d  }||fS qhW P q0W tdj	| d S )NrY   r   rX   zCan't split '{}'r   )
r0   r   splitr   rb   r   r   r   r[   r=   )r>   Zsplit_startlengthr\   r   jnslnr$   r$   r%   r     s"    
c             C   s   || kr| | S d}xlt | j D ]\}t|t|krN|j|rNt| | |S |j|r"|shi | |< d}| j|}|| | |< q"W || kri | |< | | S )z Insert a value into the trie if it is not already contained in the trie.
        Return the subtree for the value regardless of whether it is a new value
        or not. FT)tuplekeysr   r0   r   pop)trier"   Zmulti_checkr,   Zdict_r$   r$   r%   r     s    

r   c             C   s   || krt ||| |< d S )N)r   )Zstrier   r"   r$   r$   r%   r     s    r   c             C   s:   x4| D ],}|j |rt| | |}|d kr.|S |S qW d S )N)r0   r   )r   r"   r,   outr$   r$   r%   r     s    

r   )?
__future__r   r   r   loggingr   unicodedatar   sixr   r   Zsix.moves.urllib.requestr   Zsix.moves.urllib.parser	   r
   Zrdflib.termr   r   r   r   r7   __all__	getLoggerr4   loggerr   r9   rO   r   rG   r   r   r   r   ZCSVWr   ZDCATr   r   r   ZODRL2ZORGZPROVZPROFZSDOZSHr   ZSOSAZSSNZTIMEr   r   r   ZSPLIT_START_CATEGORIESr   r   r   r   r   r   r   r   r$   r$   r$   r%   <module>   s   8

*).

























  (

