- 8 DB models (services, incidents, monitors, subscribers, etc.) - Full CRUD API for services, incidents, monitors - Public status page with live data - Incident detail page with timeline - API key authentication - Uptime monitoring scheduler - 13 tests passing - TECHNICAL_DESIGN.md with full spec
23 lines
617 B
Python
23 lines
617 B
Python
"""Generic node traverser visitor"""
|
|
|
|
from __future__ import annotations
|
|
|
|
from mypy.nodes import Block, MypyFile
|
|
from mypy.traverser import TraverserVisitor
|
|
|
|
|
|
class TreeFreer(TraverserVisitor):
|
|
def visit_block(self, block: Block) -> None:
|
|
super().visit_block(block)
|
|
block.body.clear()
|
|
|
|
|
|
def free_tree(tree: MypyFile) -> None:
|
|
"""Free all the ASTs associated with a module.
|
|
|
|
This needs to be done recursively, since symbol tables contain
|
|
references to definitions, so those won't be freed but we want their
|
|
contents to be.
|
|
"""
|
|
tree.accept(TreeFreer())
|
|
tree.defs.clear()
|