(node: Union[ast.AST, None])
| 285 | |
| 286 | |
| 287 | def eval_node(node: Union[ast.AST, None]) -> Optional[Filter]: |
| 288 | if node is None: |
| 289 | return None |
| 290 | if isinstance(node, ast.Expression): |
| 291 | return eval_node(node.body) |
| 292 | if isinstance(node, ast.BinOp): |
| 293 | left = eval_node(node.left) |
| 294 | right = eval_node(node.right) |
| 295 | dunders = _find_dunder(node.op, BINARY_OP_DUNDERS) |
| 296 | if dunders: |
| 297 | return getattr(left, dunders[0])(right) |
| 298 | raise ValueError(f"Unknown binary operation: {node.op}") |
| 299 | if isinstance(node, ast.UnaryOp): |
| 300 | value = eval_node(node.operand) |
| 301 | dunders = _find_dunder(node.op, UNARY_OP_DUNDERS) |
| 302 | if dunders: |
| 303 | return getattr(value, dunders[0])() |
| 304 | raise ValueError(f"Unknown unary operation: {node.op}") |
| 305 | if isinstance(node, ast.Name): |
| 306 | if node.id in KEYBINDING_FILTERS: |
| 307 | return KEYBINDING_FILTERS[node.id] |
| 308 | else: |
| 309 | sep = "\n - " |
| 310 | known_filters = sep.join(sorted(KEYBINDING_FILTERS)) |
| 311 | raise NameError( |
| 312 | f"{node.id} is not a known shortcut filter." |
| 313 | f" Known filters are: {sep}{known_filters}." |
| 314 | ) |
| 315 | raise ValueError("Unhandled node", ast.dump(node)) |
| 316 | |
| 317 | |
| 318 | def filter_from_string(code: str) -> Union[Condition, Filter]: |
no test coverage detected
searching dependent graphs…