comparison env/lib/python3.9/site-packages/prov/identifier.py @ 0:4f3585e2f14b draft default tip

"planemo upload commit 60cee0fc7c0cda8592644e1aad72851dec82c959"
author shellac
date Mon, 22 Mar 2021 18:12:50 +0000
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:4f3585e2f14b
1 from __future__ import (absolute_import, division, print_function,
2 unicode_literals)
3
4 import six
5
6 __author__ = 'Trung Dong Huynh'
7 __email__ = 'trungdong@donggiang.com'
8
9
10 @six.python_2_unicode_compatible
11 class Identifier(object):
12 """Base class for all identifiers and also represents xsd:anyURI."""
13 # TODO: make Identifier an "abstract" base class and move xsd:anyURI
14 # into a subclass
15
16 def __init__(self, uri):
17 """
18 Constructor.
19
20 :param uri: URI string for the long namespace identifier.
21 """
22 self._uri = six.text_type(uri) # Ensure this is a unicode string
23
24 @property
25 def uri(self):
26 """Identifier's URI."""
27 return self._uri
28
29 def __str__(self):
30 return self._uri
31
32 def __eq__(self, other):
33 return self.uri == other.uri if isinstance(other, Identifier) else False
34
35 def __hash__(self):
36 return hash((self.uri, self.__class__))
37
38 def __repr__(self):
39 return '<%s: %s>' % (self.__class__.__name__, self._uri)
40
41 def provn_representation(self):
42 """PROV-N representation of qualified name in a string."""
43 return '"%s" %%%% xsd:anyURI' % self._uri
44
45
46 @six.python_2_unicode_compatible
47 class QualifiedName(Identifier):
48 """Qualified name of an identifier in a particular namespace."""
49
50 def __init__(self, namespace, localpart):
51 """
52 Constructor.
53
54 :param namespace: Namespace to use for qualified name resolution.
55 :param localpart: Portion of identifier not part of the namespace prefix.
56 """
57 Identifier.__init__(self, u''.join([namespace.uri, localpart]))
58 self._namespace = namespace
59 self._localpart = localpart
60 self._str = (
61 ':'.join([namespace.prefix, localpart])
62 if namespace.prefix else localpart
63 )
64
65 @property
66 def namespace(self):
67 """Namespace of qualified name."""
68 return self._namespace
69
70 @property
71 def localpart(self):
72 """Local part of qualified name."""
73 return self._localpart
74
75 def __str__(self):
76 return self._str
77
78 def __repr__(self):
79 return '<%s: %s>' % (self.__class__.__name__, self._str)
80
81 def __hash__(self):
82 return hash(self.uri)
83
84 def provn_representation(self):
85 """PROV-N representation of qualified name in a string."""
86 return "'%s'" % self._str
87
88
89 class Namespace(object):
90 """PROV Namespace."""
91
92 def __init__(self, prefix, uri):
93 """
94 Constructor.
95
96 :param prefix: String short hand prefix for the namespace.
97 :param uri: URI string for the long namespace identifier.
98 """
99 self._prefix = prefix
100 self._uri = uri
101 self._cache = dict()
102
103 @property
104 def uri(self):
105 """Namespace URI."""
106 return self._uri
107
108 @property
109 def prefix(self):
110 """Namespace prefix."""
111 return self._prefix
112
113 def contains(self, identifier):
114 """
115 Indicates whether the identifier provided is contained in this namespace.
116
117 :param identifier: Identifier to check.
118 :return: bool
119 """
120 uri = identifier if isinstance(identifier, six.string_types) else (
121 identifier.uri if isinstance(identifier, Identifier) else None
122 )
123 return uri.startswith(self._uri) if uri else False
124
125 def qname(self, identifier):
126 """
127 Returns the qualified name of the identifier given using the namespace
128 prefix.
129
130 :param identifier: Identifier to resolve to a qualified name.
131 :return: :py:class:`QualifiedName`
132 """
133 uri = identifier if isinstance(identifier, six.string_types) else (
134 identifier.uri if isinstance(identifier, Identifier) else None
135 )
136 if uri and uri.startswith(self._uri):
137 return QualifiedName(self, uri[len(self._uri):])
138 else:
139 return None
140
141 def __eq__(self, other):
142 return (
143 (self._uri == other.uri and self._prefix == other.prefix)
144 if isinstance(other, Namespace) else False
145 )
146
147 def __ne__(self, other):
148 return (
149 not isinstance(other, Namespace) or
150 self._uri != other.uri or
151 self._prefix != other.prefix
152 )
153
154 def __hash__(self):
155 return hash((self._uri, self._prefix))
156
157 def __repr__(self):
158 return '<%s: %s {%s}>' % (
159 self.__class__.__name__, self._prefix, self._uri
160 )
161
162 def __getitem__(self, localpart):
163 if localpart in self._cache:
164 return self._cache[localpart]
165 else:
166 qname = QualifiedName(self, localpart)
167 self._cache[localpart] = qname
168 return qname