Source code for prov.identifier

from __future__ import (absolute_import, division, print_function,
                        unicode_literals)

__author__ = 'Trung Dong Huynh'
__email__ = 'trungdong@donggiang.com'

import six


@six.python_2_unicode_compatible
[docs]class Identifier(object): """Base class for all identifiers and also represents xsd:anyURI """ # TODO: make Identifier an "abstract" base class and move xsd:anyURI # into a subclass def __init__(self, uri): self._uri = six.text_type(uri) # Ensure this is a unicode string @property def uri(self): return self._uri def __str__(self): return self._uri def __eq__(self, other): return self.uri == other.uri if isinstance(other, Identifier) else False def __hash__(self): return hash((self.uri, self.__class__)) def __repr__(self): return '<%s: %s>' % (self.__class__.__name__, self._uri)
[docs] def provn_representation(self): return '"%s" %%%% xsd:anyURI' % self._uri
@six.python_2_unicode_compatible
[docs]class QualifiedName(Identifier): def __init__(self, namespace, localpart): Identifier.__init__(self, u''.join([namespace.uri, localpart])) self._namespace = namespace self._localpart = localpart self._str = ( ':'.join([namespace.prefix, localpart]) if namespace.prefix else localpart ) @property def namespace(self): return self._namespace @property def localpart(self): return self._localpart def __str__(self): return self._str def __repr__(self): return '<%s: %s>' % (self.__class__.__name__, self._str) def __hash__(self): return hash(self.uri)
[docs] def provn_representation(self): return "'%s'" % self._str
[docs]class Namespace(object): def __init__(self, prefix, uri): self._prefix = prefix self._uri = uri self._cache = dict() @property def uri(self): return self._uri @property def prefix(self): return self._prefix
[docs] def contains(self, identifier): uri = identifier if isinstance(identifier, six.string_types) else ( identifier.uri if isinstance(identifier, Identifier) else None ) return uri.startswith(self._uri) if uri else False
[docs] def qname(self, identifier): uri = identifier if isinstance(identifier, six.string_types) else ( identifier.uri if isinstance(identifier, Identifier) else None ) if uri and uri.startswith(self._uri): return QualifiedName(self, uri[len(self._uri):]) else: return None
def __eq__(self, other): return ( (self._uri == other.uri and self._prefix == other.prefix) if isinstance(other, Namespace) else False ) def __ne__(self, other): return ( not isinstance(other, Namespace) or self._uri != other.uri or self._prefix != other.prefix ) def __hash__(self): return hash((self._uri, self._prefix)) def __repr__(self): return '<%s: %s {%s}>' % ( self.__class__.__name__, self._prefix, self._uri ) def __getitem__(self, localpart): if localpart in self._cache: return self._cache[localpart] else: qname = QualifiedName(self, localpart) self._cache[localpart] = qname return qname