diff --git a/tract_querier/query_processor.py b/tract_querier/query_processor.py index bf4a033..ab5a964 100644 --- a/tract_querier/query_processor.py +++ b/tract_querier/query_processor.py @@ -6,8 +6,6 @@ from itertools import takewhile import fnmatch -from .code_util import DocStringInheritor - __all__ = [ 'keywords', 'EvaluateQueries', 'eval_queries', @@ -107,7 +105,6 @@ def operation(tract_query_info): return operation -# @add_metaclass(DocStringInheritor) class EvaluateQueries(ast.NodeVisitor): r""" @@ -133,7 +130,6 @@ class EvaluateQueries(ast.NodeVisitor): the tracts resulting from this query """ - __metaclass__ = DocStringInheritor relative_terms = [ 'anterior_of', @@ -246,9 +242,7 @@ def visit_Call(self, node): if ( isinstance(node.func, ast.Name) and len(node.args) == 1 and - len(node.keywords) == 0 and - (not hasattr(node, 'starargs') or node.starargs is None) and - (not hasattr(node, 'kwargs') or node.kwargs is None) + len(node.keywords) == 0 ): if (node.func.id.lower() == 'only'): query_info = self.visit(node.args[0]) diff --git a/tract_querier/shell.py b/tract_querier/shell.py index e3bd2e8..73898d2 100644 --- a/tract_querier/shell.py +++ b/tract_querier/shell.py @@ -151,7 +151,7 @@ def do_save(self, line): ) self.save_query_visitor.visit(ast.Module(body=body)) except SyntaxError as e: - print(e.value) + print(e) except TractQuerierSyntaxError as e: print(e.value) except TractQuerierLabelNotFound as e: @@ -194,7 +194,7 @@ def default(self, line): self.querier.visit(body) self.save_query_visitor.visit(body) except SyntaxError as e: - print(e.value) + print(e) except TractQuerierSyntaxError as e: print(e.value) except TractQuerierLabelNotFound as e: @@ -204,18 +204,7 @@ def default(self, line): @safe_method def names(self): - names = [] - for query in self.querier.evaluated_queries_info.keys(): - if query.endswith('_left'): - names += [ - query.replace('_left', '.left'), - query.replace('_left', '.right'), - ] - elif query.endswith('_right'): - pass - else: - names.append(query) - return names + return list(self.querier.evaluated_queries_info.keys()) @safe_method def completenames(self, text, *ignored): diff --git a/tract_querier/tests/test_shell.py b/tract_querier/tests/test_shell.py new file mode 100644 index 0000000..37c44dd --- /dev/null +++ b/tract_querier/tests/test_shell.py @@ -0,0 +1,33 @@ +from .. import shell + + +class EmptySpatialIndexing: + crossing_tracts_labels = {} + crossing_labels_tracts = {} + ending_tracts_labels = ({}, {}) + ending_labels_tracts = ({}, {}) + label_bounding_boxes = {} + tract_bounding_boxes = {} + + +def test_names(): + cmd = shell.TractQuerierCmd( + EmptySpatialIndexing(), + initial_body="a.left = 1\na.right = 2\nb = 1\nc_left = 1\nc_right = 2" + ) + assert sorted(cmd.names()) == [ + 'a.left', 'a.right', 'b', 'c_left', 'c_right' + ] + + +def test_syntax_error_is_printed(monkeypatch, capsys): + def raise_syntax_error(*args, **kwargs): + raise SyntaxError('invalid syntax') + + monkeypatch.setattr(shell, 'queries_preprocess', raise_syntax_error) + cmd = shell.TractQuerierCmd(EmptySpatialIndexing()) + cmd.default('a = (') + cmd.do_save('a') + out, err = capsys.readouterr() + assert out.count('invalid syntax') == 2 + assert 'Uncaught exception' not in err diff --git a/tract_querier/tract_math/decorator.py b/tract_querier/tract_math/decorator.py index 2efeae0..1fa44ee 100644 --- a/tract_querier/tract_math/decorator.py +++ b/tract_querier/tract_math/decorator.py @@ -190,11 +190,7 @@ def process_output(output, file_output=None): f = open(file_output, 'w') writer = csv.DictWriter(f, output.keys(), dialect=dialect) - if hasattr(writer, 'writeheader'): - writer.writeheader() - else: - header = dict(zip(writer.fieldnames, writer.fieldnames)) - writer.writerow(header) + writer.writeheader() first_value = next(iter(output.values())) if (