summaryrefslogtreecommitdiff
path: root/venv/lib/python3.7/site-packages/pip-10.0.1-py3.7.egg/pip/_vendor/html5lib/_trie
diff options
context:
space:
mode:
authorShubham Saini <shubham6405@gmail.com>2018-12-11 10:01:23 +0000
committerShubham Saini <shubham6405@gmail.com>2018-12-11 10:01:23 +0000
commit68df54d6629ec019142eb149dd037774f2d11e7c (patch)
tree345bc22d46b4e01a4ba8303b94278952a4ed2b9e /venv/lib/python3.7/site-packages/pip-10.0.1-py3.7.egg/pip/_vendor/html5lib/_trie
First commit
Diffstat (limited to 'venv/lib/python3.7/site-packages/pip-10.0.1-py3.7.egg/pip/_vendor/html5lib/_trie')
-rw-r--r--venv/lib/python3.7/site-packages/pip-10.0.1-py3.7.egg/pip/_vendor/html5lib/_trie/__init__.py14
-rw-r--r--venv/lib/python3.7/site-packages/pip-10.0.1-py3.7.egg/pip/_vendor/html5lib/_trie/_base.py37
-rw-r--r--venv/lib/python3.7/site-packages/pip-10.0.1-py3.7.egg/pip/_vendor/html5lib/_trie/datrie.py44
-rw-r--r--venv/lib/python3.7/site-packages/pip-10.0.1-py3.7.egg/pip/_vendor/html5lib/_trie/py.py67
4 files changed, 162 insertions, 0 deletions
diff --git a/venv/lib/python3.7/site-packages/pip-10.0.1-py3.7.egg/pip/_vendor/html5lib/_trie/__init__.py b/venv/lib/python3.7/site-packages/pip-10.0.1-py3.7.egg/pip/_vendor/html5lib/_trie/__init__.py
new file mode 100644
index 0000000..ccc70bd
--- /dev/null
+++ b/venv/lib/python3.7/site-packages/pip-10.0.1-py3.7.egg/pip/_vendor/html5lib/_trie/__init__.py
@@ -0,0 +1,14 @@
1from __future__ import absolute_import, division, unicode_literals
2
3from .py import Trie as PyTrie
4
5Trie = PyTrie
6
7# pylint:disable=wrong-import-position
8try:
9 from .datrie import Trie as DATrie
10except ImportError:
11 pass
12else:
13 Trie = DATrie
14# pylint:enable=wrong-import-position
diff --git a/venv/lib/python3.7/site-packages/pip-10.0.1-py3.7.egg/pip/_vendor/html5lib/_trie/_base.py b/venv/lib/python3.7/site-packages/pip-10.0.1-py3.7.egg/pip/_vendor/html5lib/_trie/_base.py
new file mode 100644
index 0000000..ecfff32
--- /dev/null
+++ b/venv/lib/python3.7/site-packages/pip-10.0.1-py3.7.egg/pip/_vendor/html5lib/_trie/_base.py
@@ -0,0 +1,37 @@
1from __future__ import absolute_import, division, unicode_literals
2
3from collections import Mapping
4
5
6class Trie(Mapping):
7 """Abstract base class for tries"""
8
9 def keys(self, prefix=None):
10 # pylint:disable=arguments-differ
11 keys = super(Trie, self).keys()
12
13 if prefix is None:
14 return set(keys)
15
16 return {x for x in keys if x.startswith(prefix)}
17
18 def has_keys_with_prefix(self, prefix):
19 for key in self.keys():
20 if key.startswith(prefix):
21 return True
22
23 return False
24
25 def longest_prefix(self, prefix):
26 if prefix in self:
27 return prefix
28
29 for i in range(1, len(prefix) + 1):
30 if prefix[:-i] in self:
31 return prefix[:-i]
32
33 raise KeyError(prefix)
34
35 def longest_prefix_item(self, prefix):
36 lprefix = self.longest_prefix(prefix)
37 return (lprefix, self[lprefix])
diff --git a/venv/lib/python3.7/site-packages/pip-10.0.1-py3.7.egg/pip/_vendor/html5lib/_trie/datrie.py b/venv/lib/python3.7/site-packages/pip-10.0.1-py3.7.egg/pip/_vendor/html5lib/_trie/datrie.py
new file mode 100644
index 0000000..cb1af60
--- /dev/null
+++ b/venv/lib/python3.7/site-packages/pip-10.0.1-py3.7.egg/pip/_vendor/html5lib/_trie/datrie.py
@@ -0,0 +1,44 @@
1from __future__ import absolute_import, division, unicode_literals
2
3from datrie import Trie as DATrie
4from pip._vendor.six import text_type
5
6from ._base import Trie as ABCTrie
7
8
9class Trie(ABCTrie):
10 def __init__(self, data):
11 chars = set()
12 for key in data.keys():
13 if not isinstance(key, text_type):
14 raise TypeError("All keys must be strings")
15 for char in key:
16 chars.add(char)
17
18 self._data = DATrie("".join(chars))
19 for key, value in data.items():
20 self._data[key] = value
21
22 def __contains__(self, key):
23 return key in self._data
24
25 def __len__(self):
26 return len(self._data)
27
28 def __iter__(self):
29 raise NotImplementedError()
30
31 def __getitem__(self, key):
32 return self._data[key]
33
34 def keys(self, prefix=None):
35 return self._data.keys(prefix)
36
37 def has_keys_with_prefix(self, prefix):
38 return self._data.has_keys_with_prefix(prefix)
39
40 def longest_prefix(self, prefix):
41 return self._data.longest_prefix(prefix)
42
43 def longest_prefix_item(self, prefix):
44 return self._data.longest_prefix_item(prefix)
diff --git a/venv/lib/python3.7/site-packages/pip-10.0.1-py3.7.egg/pip/_vendor/html5lib/_trie/py.py b/venv/lib/python3.7/site-packages/pip-10.0.1-py3.7.egg/pip/_vendor/html5lib/_trie/py.py
new file mode 100644
index 0000000..5531263
--- /dev/null
+++ b/venv/lib/python3.7/site-packages/pip-10.0.1-py3.7.egg/pip/_vendor/html5lib/_trie/py.py
@@ -0,0 +1,67 @@
1from __future__ import absolute_import, division, unicode_literals
2from pip._vendor.six import text_type
3
4from bisect import bisect_left
5
6from ._base import Trie as ABCTrie
7
8
9class Trie(ABCTrie):
10 def __init__(self, data):
11 if not all(isinstance(x, text_type) for x in data.keys()):
12 raise TypeError("All keys must be strings")
13
14 self._data = data
15 self._keys = sorted(data.keys())
16 self._cachestr = ""
17 self._cachepoints = (0, len(data))
18
19 def __contains__(self, key):
20 return key in self._data
21
22 def __len__(self):
23 return len(self._data)
24
25 def __iter__(self):
26 return iter(self._data)
27
28 def __getitem__(self, key):
29 return self._data[key]
30
31 def keys(self, prefix=None):
32 if prefix is None or prefix == "" or not self._keys:
33 return set(self._keys)
34
35 if prefix.startswith(self._cachestr):
36 lo, hi = self._cachepoints
37 start = i = bisect_left(self._keys, prefix, lo, hi)
38 else:
39 start = i = bisect_left(self._keys, prefix)
40
41 keys = set()
42 if start == len(self._keys):
43 return keys
44
45 while self._keys[i].startswith(prefix):
46 keys.add(self._keys[i])
47 i += 1
48
49 self._cachestr = prefix
50 self._cachepoints = (start, i)
51
52 return keys
53
54 def has_keys_with_prefix(self, prefix):
55 if prefix in self._data:
56 return True
57
58 if prefix.startswith(self._cachestr):
59 lo, hi = self._cachepoints
60 i = bisect_left(self._keys, prefix, lo, hi)
61 else:
62 i = bisect_left(self._keys, prefix)
63
64 if i == len(self._keys):
65 return False
66
67 return self._keys[i].startswith(prefix)