search: provides type information for the views
2 files changed, 92 insertions(+), 0 deletions(-)

M test/test_util.py
M tshistory/search.py
M test/test_util.py +30 -0
@@ 654,6 654,36 @@ def test_search():
     assert _serialize_roundtrip(s15)
 
 
+def test_search_types():
+    types = {}
+    for lispname, kname in search._OPMAP.items():
+        if not getattr(search, kname, False):
+            continue
+        types[lispname] = search.query.klassbyname(kname).__sig__()
+
+    assert types == {
+        '<': {'key': 'str', 'return': 'query', 'value': 'Union[str, Number, bool]'},
+        '<=': {'key': 'str', 'return': 'query', 'value': 'Union[str, Number, bool]'},
+        '=': {'key': 'str', 'return': 'query', 'value': 'Union[str, Number, bool]'},
+        '>': {'key': 'str', 'return': 'query', 'value': 'Union[str, Number, bool]'},
+        '>=': {'key': 'str', 'return': 'query', 'value': 'Union[str, Number, bool]'},
+        'by.and': {'items': 'Packed[query]', 'return': 'query'},
+        'by.everything': {'return': 'query'},
+        'by.internal-metaitem': {'key': 'str',
+                                 'return': 'query',
+                                 'value': 'Union[str, Number, bool]'},
+        'by.metaitem': {'key': 'str',
+                        'return': 'query',
+                        'value': 'Union[str, Number, bool]'},
+        'by.metakey': {'key': 'str', 'return': 'query'},
+        'by.name': {'query': 'str', 'return': 'query'},
+        'by.not': {'item': 'query', 'return': 'query'},
+        'by.or': {'items': 'Packed[query]', 'return': 'query'},
+        'by.source': {'query': 'query', 'return': 'query'},
+        'by.tzaware': {'return': 'query'}
+    }
+
+
 def test_prune_bysource():
     """Notion of by.source filter.
 

          
M tshistory/search.py +62 -0
@@ 188,6 188,13 @@ class bysource(query):
     def __expr__(self):
         return f'(by.source "{self.query}")'
 
+    @staticmethod
+    def __sig__():
+        return {
+            'query': 'query',
+            'return': 'query'
+        }
+
     @classmethod
     def _fromtree(cls, tree):
         return cls(tree[1])

          
@@ 202,6 209,12 @@ class byeverything(query):
     def _fromtree(cls, _):
         return cls()
 
+    @staticmethod
+    def __sig__():
+        return {
+            'return': 'query'
+        }
+
     def sql(self, namespace='tsh'):
         return '', {}
 

          
@@ 215,6 228,13 @@ class and_(query):
     def __expr__(self):
         return f'(by.and {" ".join(x.expr() for x in self.items)})'
 
+    @staticmethod
+    def __sig__():
+        return {
+            'items': 'Packed[query]',
+            'return': 'query'
+        }
+
     @classmethod
     def _fromtree(cls, tree):
         items = [

          
@@ 242,6 262,13 @@ class or_(query):
     def __expr__(self):
         return f'(by.or {" ".join(x.expr() for x in self.items)})'
 
+    @staticmethod
+    def __sig__():
+        return {
+            'items': 'Packed[query]',
+            'return': 'query'
+        }
+
     @classmethod
     def _fromtree(cls, tree):
         items = [

          
@@ 269,6 296,13 @@ class not_(query):
     def __expr__(self):
         return f'(by.not {self.item.expr()})'
 
+    @staticmethod
+    def __sig__():
+        return {
+            'item': 'query',
+            'return': 'query'
+        }
+
     @classmethod
     def _fromtree(cls, tree):
         return cls(query._fromtree(tree[1]))

          
@@ 283,6 317,12 @@ class tzaware(query):
     def __expr__(self):
         return '(by.tzaware)'
 
+    @staticmethod
+    def __sig__():
+        return {
+            'return': 'query'
+        }
+
     @classmethod
     def _fromtree(cls, _):
         return cls()

          
@@ 300,6 340,13 @@ class byname(query):
     def __expr__(self):
         return f'(by.name "{self.query}")'
 
+    @staticmethod
+    def __sig__():
+        return {
+            'query': 'str',
+            'return': 'query'
+        }
+
     @classmethod
     def _fromtree(cls, tree):
         return cls(tree[1])

          
@@ 319,6 366,13 @@ class bymetakey(query):
     def __expr__(self):
         return f'(by.metakey "{self.key}")'
 
+    @staticmethod
+    def __sig__():
+        return {
+            'key': 'str',
+            'return': 'query'
+        }
+
     @classmethod
     def _fromtree(cls, tree):
         return cls(tree[1])

          
@@ 343,6 397,14 @@ class _comparator(query):
             return f'({self._lispop or self._op} "{self.key}" "{self.value}")'
         return f'({self._lispop or self._op} "{self.key}" {self.value})'
 
+    @staticmethod
+    def __sig__():
+        return {
+            'key': 'str',
+            'value': 'Union[str, Number, bool]',
+            'return': 'query'
+        }
+
     @classmethod
     def _fromtree(cls, tree):
         return cls(*tree[1:])