def set_enter_call_nodes(self): for node in self.nodes: if isinstance(node, (ast.Module, ast.FunctionDef)): for stmt in node.body: if not is_future_import(stmt): stmt._enter_call_node = True break
def exec_ipython_cell(self, source, callback): from IPython import get_ipython shell = get_ipython() filename = name = shell.compile.cache(source) flags = shell.compile.flags traced_file = self.compile(source, filename, flags) traced_file.is_ipython_cell = True for node in traced_file.root.body: if is_future_import(node): raise ValueError('from __future__ import ... statements ' 'are not allowed in cells traced with %%eye') shell.user_global_ns.update(self._trace_methods_dict(traced_file)) self._trace(name, filename, traced_file, traced_file.code, 'module', source) try: shell.ex(traced_file.code) return self._ipython_cell_value finally: callback(self._last_call_id) self._ipython_cell_value = None
def set_basic_node_attributes(self): self.nodes = [] # type: List[ast.AST] for node in ast.walk(self.root): # type: ast.AST for child in ast.iter_child_nodes(node): child.parent = node node._tree_index = len(self.nodes) self.nodes.append(node) # Mark __future__ imports and anything before (i.e. module docstrings) # to be ignored by the AST transformer for i, stmt in enumerate(self.root.body): if is_future_import(stmt): for s in self.root.body[:i + 1]: for node in ast.walk(s): node._visit_ignore = True
def exec_ipython_cell(self, source, callback): from IPython import get_ipython shell = get_ipython() filename = name = shell.compile.cache(source) flags = shell.compile.flags traced_file = self.compile(source, filename, flags) traced_file.is_ipython_cell = True for node in traced_file.root.body: if is_future_import(node): raise ValueError('from __future__ import ... statements ' 'are not allowed in cells traced with %%eye') shell.user_global_ns.update(self._trace_methods_dict(traced_file)) start_lineno = 1 lines = source.splitlines() end_lineno = start_lineno + len(lines) nodes = list( self._nodes_of_interest(traced_file, start_lineno, end_lineno)) html_body = self._nodes_html(nodes, start_lineno, end_lineno, traced_file) data_dict = dict( # This maps each node to the loops enclosing that node node_loops={ node._tree_index: [n._tree_index for n in node._loops] for node, _ in nodes if node._loops }) data = json.dumps(data_dict, sort_keys=True) db_func = self._db_func(data, filename, html_body, name, start_lineno, source) self._code_infos[traced_file.code] = CodeInfo(db_func, traced_file, ()) self._ipython_cell_call_id = 'waiting' try: shell.ex(traced_file.code) finally: callback(self._ipython_cell_call_id) self._ipython_cell_call_id = None self._ipython_cell_value = None return self._ipython_cell_value