@@ 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.
@@ 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:])