Coverage for tld/trie.py: 100%
37 statements
« prev ^ index » next coverage.py v7.4.4, created at 2024-05-27 05:40 +0000
« prev ^ index » next coverage.py v7.4.4, created at 2024-05-27 05:40 +0000
1__author__ = "Artur Barseghyan"
2__copyright__ = "2013-2023 Artur Barseghyan"
3__license__ = "MPL-1.1 OR GPL-2.0-only OR LGPL-2.1-or-later"
4__all__ = (
5 "Trie",
6 "TrieNode",
7)
10class TrieNode(object):
11 """Class representing a single Trie node."""
13 __slots__ = ("children", "exception", "leaf", "private")
15 def __init__(self):
16 self.children = None
17 self.exception = None
18 self.leaf = False
19 self.private = False
22class Trie(object):
23 """An adhoc Trie data structure to store tlds in reverse notation order."""
25 def __init__(self):
26 self.root = TrieNode()
27 self.__nodes = 0
29 def __len__(self):
30 return self.__nodes
32 def add(self, tld: str, private: bool = False) -> None:
33 node = self.root
35 # Iterating over the tld parts in reverse order
36 # for part in reversed(tld.split('.')):
37 tld_split = tld.split(".")
38 tld_split.reverse()
39 for part in tld_split:
41 if part.startswith("!"):
42 node.exception = part[1:]
43 break
45 # To save up some RAM, we initialize the children dict only
46 # when strictly necessary
47 if node.children is None:
48 node.children = {}
49 child = TrieNode()
50 else:
51 child = node.children.get(part)
52 if child is None:
53 child = TrieNode()
55 node.children[part] = child
57 node = child
59 node.leaf = True
61 if private:
62 node.private = True
64 self.__nodes += 1