Coding style.

- Incorporate gut into tools.
- Remove gut tests which were only useful for developing the old
  implementation.
This commit is contained in:
Andrew Hamilton 2021-05-07 21:07:45 +10:00
parent d471934946
commit 2da603c5bf
3 changed files with 30 additions and 220 deletions

View file

@ -1,55 +0,0 @@
#!/usr/bin/env python3.8
"""Gut shows a python file with the bodies of functions and methods removed.
This can be useful when initially reading a codebase.
"""
import ast
import sys
USAGE = """Usage: gut.py <python-file>
# gut.py test.py"""
def _function_body_lines(module_contents):
ranges = []
class FuncNodeVisitor(ast.NodeVisitor):
def _line_range(self, body):
return body[0].lineno - 1, body[-1].end_lineno
def visit_FunctionDef(self, node):
ranges.append(self._line_range(node.body))
def visit_AsyncFunctionDef(self, node):
ranges.append(self._line_range(node.body))
visitor = FuncNodeVisitor()
tree = ast.parse(module_contents)
visitor.visit(tree)
return ranges
def gut_module(module_contents):
ranges = _function_body_lines(module_contents)
lines = module_contents.splitlines(keepends=True)
deleted = 0
for start_line, end_line in ranges:
del lines[start_line-deleted:end_line-deleted]
deleted += (end_line - start_line)
return "".join(lines)
def main(module_path):
with open(module_path) as module_file:
print(gut_module(module_file.read()))
if __name__ == "__main__":
if len(sys.argv) != 2:
print(USAGE)
sys.exit(-1)
main(sys.argv[1])

View file

@ -2,6 +2,7 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
import ast
import contextlib import contextlib
import enum import enum
import functools import functools
@ -29,7 +30,6 @@ import toml
import eris import eris
import eris.fill3 as fill3 import eris.fill3 as fill3
import eris.gut as gut
import eris.lscolors as lscolors import eris.lscolors as lscolors
import eris.termstr as termstr import eris.termstr as termstr
@ -335,10 +335,38 @@ def python_coverage(path):
return status, _colorize_coverage_report(lines) return status, _colorize_coverage_report(lines)
def _function_body_lines(module_contents):
ranges = []
class FuncNodeVisitor(ast.NodeVisitor):
def _line_range(self, body):
return body[0].lineno - 1, body[-1].end_lineno
def visit_FunctionDef(self, node):
ranges.append(self._line_range(node.body))
def visit_AsyncFunctionDef(self, node):
ranges.append(self._line_range(node.body))
visitor = FuncNodeVisitor()
tree = ast.parse(module_contents)
visitor.visit(tree)
return ranges
def _gut_module(module_contents):
ranges = _function_body_lines(module_contents)
lines = module_contents.splitlines(keepends=True)
deleted = 0
for start_line, end_line in ranges:
del lines[start_line-deleted:end_line-deleted]
deleted += (end_line - start_line)
return "".join(lines)
@deps(url="https://github.com/ahamilton/eris") @deps(url="https://github.com/ahamilton/eris")
def python_gut(path): def python_gut(path):
with open(path) as module_file: with open(path) as module_file:
output = gut.gut_module(module_file.read()) output = _gut_module(module_file.read())
source_widget = _syntax_highlight_using_path(_fix_input(output), path) source_widget = _syntax_highlight_using_path(_fix_input(output), path)
return Status.normal, source_widget return Status.normal, source_widget

View file

@ -1,163 +0,0 @@
#!/usr/bin/env python3.8
import textwrap
import unittest
import eris.gut as gut
class GutTestCase(unittest.TestCase):
def test_import(self):
program = "import hello"
self.assertEqual(gut.gut_module(program), program)
def test_import_and_function(self):
program = textwrap.dedent("""
import hello
def first():
a = 1
""")
expected = textwrap.dedent("""
import hello
def first():
""")
self.assertEqual(gut.gut_module(program), expected)
def test_import_and_function_and_command(self):
program = textwrap.dedent("""
import hello
def first():
a = 1
b = 1
""")
expected = textwrap.dedent("""
import hello
def first():
b = 1
""")
self.assertEqual(gut.gut_module(program), expected)
def test_import_and_class(self):
program = textwrap.dedent("""
import hello
class Foo:
def bar():
a = 1
""")
expected = textwrap.dedent("""
import hello
class Foo:
def bar():
""")
self.assertEqual(gut.gut_module(program), expected)
def test_short_blank_line_in_def(self):
program = textwrap.dedent("""
def bar():
a = 1
b = 2
""")
expected = textwrap.dedent("""
def bar():
""")
self.assertEqual(gut.gut_module(program), expected)
def test_nested_functions(self):
program = textwrap.dedent("""
def bar():
a = 1
def foo():
pass
b = 2
""")
expected = textwrap.dedent("""
def bar():
""")
self.assertEqual(gut.gut_module(program), expected)
def test_multiline_signature(self):
program = textwrap.dedent("""
def bar(a, b,
c, d):
a = 1
""")
expected = textwrap.dedent("""
def bar(a, b,
c, d):
""")
self.assertEqual(gut.gut_module(program), expected)
def test_comment_in_signature_line(self):
program = textwrap.dedent("""
def bar(): # comment
pass
""")
expected = textwrap.dedent("""
def bar(): # comment
""")
self.assertEqual(gut.gut_module(program), expected)
def test_indented_comment_in_body(self):
program = textwrap.dedent("""
def bar():
pass
# comment
pass
""")
expected = textwrap.dedent("""
def bar():
""")
self.assertEqual(gut.gut_module(program), expected)
def test_non_indented_comment_in_body(self):
program = textwrap.dedent("""
def bar():
pass
# comment
pass
""")
expected = textwrap.dedent("""
def bar():
""")
self.assertEqual(gut.gut_module(program), expected)
def test_non_indented_comment_after_body(self):
program = textwrap.dedent("""
def bar():
pass
pass
# comment
pass
""")
expected = textwrap.dedent("""
def bar():
# comment
pass
""")
self.assertEqual(gut.gut_module(program), expected)
def test_commented_out_function(self):
program = textwrap.dedent("""
# def bar():
# pass
""")
self.assertEqual(gut.gut_module(program), program)
if __name__ == "__main__":
unittest.main()