about summary refs log tree commit diff
diff options
context:
space:
mode:
authorFrederick Muriuki Muriithi2025-07-24 13:33:13 -0500
committerFrederick Muriuki Muriithi2025-07-24 13:33:13 -0500
commit659d9afedc75aecc05b7eddd2cefa0b45e5162b9 (patch)
treede0336c2e9900f9cf920fabe6760bd1f34ebcdac
parentdf74a7fce6cc189dff389b6333d0088b8acd2c1a (diff)
downloadgn-libs-659d9afedc75aecc05b7eddd2cefa0b45e5162b9.tar.gz
Fix errors caught by type-checker.
-rw-r--r--gn_libs/privileges.py57
1 files changed, 31 insertions, 26 deletions
diff --git a/gn_libs/privileges.py b/gn_libs/privileges.py
index ad813da..32c943d 100644
--- a/gn_libs/privileges.py
+++ b/gn_libs/privileges.py
@@ -1,7 +1,7 @@
 """Utilities for handling privileges."""
 import logging
 from functools import reduce
-from typing import Union, Sequence, Iterator, TypeAlias
+from typing import Union, Sequence, Iterator, TypeAlias, TypedDict
 
 logger = logging.getLogger(__name__)
 
@@ -27,16 +27,25 @@ def __add_leaves__(
         index: int,
         tree: tuple[Operator],
         leaves: dict
-) -> Union[tuple[Operator], ParseTree]:
+) -> Union[tuple[Operator], Union[ParseTree, tuple]]:
     """Add leaves to the tree."""
     if leaves.get(index):
         return tree + (leaves[index],)
-    return tree
+    return tree + (tuple())
 
 
-def __build_tree__(tree_state: dict) -> ParseTree:
+class ParsingState(TypedDict):
+    """Class to create a state object. Mostly used to silence MyPy"""
+    tokens: list[str]
+    trees: list[tuple[int, int, str, int, int]]#(name, parent, operator, start, end)
+    open_parens: int
+    current_tree: int
+    leaves: dict[int, tuple[str, ...]]#[parent-tree, [index, index, ...]]
+
+
+def __build_tree__(tree_state: ParsingState) -> ParseTree:
     """Given computed state, build the actual tree."""
-    _built= []
+    _built = []
     for idx, tree in enumerate(tree_state["trees"]):
         _built.append(__add_leaves__(idx, (tree[2],), tree_state["leaves"]))
 
@@ -70,49 +79,45 @@ def __build_tree__(tree_state: dict) -> ParseTree:
 
 def __parse_tree__(tokens: Iterator[str]) -> ParseTree:
     """Parse the tokens into a tree."""
-    _state = {
-        "tokens": [],
-        "trees": [],#(name, parent, operator, start, end)
-        "open-parens": 0,
-        "current-tree": 0,
-        "leaves": {}#[parent-tree, [index, index, ...]]
-    }
+    _state = ParsingState(
+        tokens=[], trees=[], open_parens=0, current_tree=0, leaves={})
     for _idx, _token in enumerate(tokens):
         _state["tokens"].append(_token)
 
         if _idx==0:
             if _token[1:].upper() not in _OPERATORS_:
                 raise SpecificationValueError(f"Invalid operator: {_token[1:]}")
-            _state["open-parens"] += 1
-            _state["trees"].append((0, 0, _token[1:].upper(), _idx))
-            _state["current-tree"] = 0
+            _state["open_parens"] += 1
+            _state["trees"].append((0, 0, _token[1:].upper(), _idx, -1))
+            _state["current_tree"] = 0
             continue# this is bad!
 
         if _token == ")":# end a tree
             logger.debug("ENDING A TREE: %s", _state)
-            _state["open-parens"] -= 1
-            _state["trees"][_state["current-tree"]] = (
-                _state["trees"][_state["current-tree"]] + (_idx,))
+            _state["open_parens"] -= 1
+            _state["trees"][_state["current_tree"]] = (
+                _state["trees"][_state["current_tree"]][0:-1] + (_idx,))
             # We go back to the parent below.
-            _state["current-tree"] = _state["trees"][_state["current-tree"]][1]
+            _state["current_tree"] = _state["trees"][_state["current_tree"]][1]
             continue# still really bad!
 
         if _token[1:].upper() in _OPERATORS_:# new child tree
-            _state["open-parens"] += 1
+            _state["open_parens"] += 1
             _state["trees"].append((len(_state["trees"]),
-                                    _state["current-tree"],
+                                    _state["current_tree"],
                                     _token[1:].upper(),
-                                    _idx))
-            _state["current-tree"] = len(_state["trees"]) - 1
+                                    _idx,
+                                    -1))
+            _state["current_tree"] = len(_state["trees"]) - 1
             continue# more evil still
 
         logger.debug("state: %s", _state)
         # leaves
-        _state["leaves"][_state["current-tree"]] = _state["leaves"].get(
-            _state["current-tree"], tuple()) + (_token,)
+        _state["leaves"][_state["current_tree"]] = _state["leaves"].get(
+            _state["current_tree"], tuple()) + (_token,)
 
     # Build parse-tree from state
-    if _state["open-parens"] != 0:
+    if _state["open_parens"] != 0:
         raise SpecificationValueError("Unbalanced parentheses.")
     return __build_tree__(_state)