py2many incompatible with Python 3.7
Here are the non-cli test failures on Python3.7.  I think >3.8 is fine for a tool like this.  The `ast` module has improved a lot and trying to be backwards compatible doesnt seem sensible, as the output will degrade due to less semantic info.

```py
========================================================================================================================= FAILURES =========================================================================================================================
___________________________________________________________________________________________________________ TestValueType.test_direct_assignment ___________________________________________________________________________________________________________

self = <py14.tests.test_tracer.TestValueType object at 0x110940fd0>

    def test_direct_assignment(self):
        source = parse("x = 3")
        x = source.body[0]
        t = value_type(x)
>       assert t == "3"
E       AssertionError: assert None == '3'
E         +None
E         -'3'

py14/tests/test_tracer.py:20: AssertionError
_________________________________________________________________________________________________ TestValueType.test_list_assignment_based_on_later_append _________________________________________________________________________________________________

self = <py14.tests.test_tracer.TestValueType object at 0x11096b510>

    def test_list_assignment_based_on_later_append(self):
        source = parse("x = 3", "results = []", "results.append(x)")
        add_list_calls(source)
        results = source.body[1]
        t = value_type(results)
>       assert t == "3"
E       AssertionError: assert None == '3'
E         +None
E         -'3'

py14/tests/test_tracer.py:51: AssertionError
_______________________________________________________________________________________________ TestValueType.test_list_assignment_with_append_unknown_value _______________________________________________________________________________________________

self = <py14.tests.test_tracer.TestValueType object at 0x11096bad0>

    def test_list_assignment_with_append_unknown_value(self):
        source = parse("results = []", "x = 3", "results.append(x)")
        add_list_calls(source)
        results = source.body[0]
        t = value_type(results)
>       assert t == "3"
E       AssertionError: assert None == '3'
E         +None
E         -'3'

py14/tests/test_tracer.py:58: AssertionError
_______________________________________________________________________________________________ TestValueType.test_global_list_assignment_with_later_append ________________________________________________________________________________________________

self = <py14.tests.test_tracer.TestValueType object at 0x110999210>

    def test_global_list_assignment_with_later_append(self):
        source = parse("results = []", "def add_x():", "   results.append(2)")
        add_list_calls(source)
        results = source.body[0]
        t = value_type(results)
>       assert t == "2"
E       AssertionError: assert None == '2'
E         +None
E         -'2'

py14/tests/test_tracer.py:65: AssertionError
______________________________________________________________________________________________________ TestValueExpr.test_catch_long_expression_chain ______________________________________________________________________________________________________

self = <py14.tests.test_tracer.TestValueExpr object at 0x1109bb5d0>

    def test_catch_long_expression_chain(self):
        source = parse("x = 3 * 1", "y = x - 5", "z = y + 2")
        z = source.body[2]
        t = value_expr(z)
>       assert t == "3 * 1 - 5 + 2"
E       AssertionError: assert 'None * None - None + None' == '3 * 1 - 5 + 2'
E         - 3 * 1 - 5 + 2
E         + None * None - None + None

py14/tests/test_tracer.py:73: AssertionError
_________________________________________________________________________________________________ TestValueExpr.test_catch_expression_chain_with_functions _________________________________________________________________________________________________

self = <py14.tests.test_tracer.TestValueExpr object at 0x11099db10>

    def test_catch_expression_chain_with_functions(self):
        source = parse("x = 3 * 1", "y = foo(x)", "z = y + 2")
        z = source.body[2]
        t = value_expr(z)
>       assert t == "foo(3 * 1) + 2"
E       AssertionError: assert 'foo(None * None) + None' == 'foo(3 * 1) + 2'
E         - foo(3 * 1) + 2
E         + foo(None * None) + None

py14/tests/test_tracer.py:79: AssertionError
__________________________________________________________________________________________________________________ test_decltype_list_var __________________________________________________________________________________________________________________

    def test_decltype_list_var():
        source = parse("results = []", "x = 3", "results.append(x)")
        add_list_calls(source)
        results = source.body[0]
        t = decltype(results)
>       assert t == "std::vector<decltype(3)>"
E       AssertionError: assert 'std::vector<decltype(None)>' == 'std::vector<decltype(3)>'
E         - std::vector<decltype(3)>
E         ?                      ^
E         + std::vector<decltype(None)>
E         ?                      ^^^^

py14/tests/test_tracer.py:94: AssertionError
_______________________________________________________________________________________________________________________ test_declare _______________________________________________________________________________________________________________________

    def test_declare():
        source = parse("x = 3")
        cpp = transpile(source)
>       assert cpp == "auto x = 3;"
E       AssertionError: assert 'auto x = None;' == 'auto x = 3;'
E         - auto x = 3;
E         ?          ^
E         + auto x = None;
E         ?          ^^^^

py14/tests/test_transpiler.py:13: AssertionError
_________________________________________________________________________________________________________________ test_print_multiple_vars _________________________________________________________________________________________________________________

    def test_print_multiple_vars():
        if sys.version_info[0] >= 3:
            source = parse('print(("hi", "there" ))')
        else:
            source = parse('print("hi", "there" )')
>       cpp = transpile(source)

py14/tests/test_transpiler.py:27:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
py14/transpiler.py:39: in transpile
    cpp = transpiler.visit(tree)
py2many/clike.py:61: in visit
    return super(CLikeTranspiler, self).visit(node)
/usr/local/opt/python@3.7/Frameworks/Python.framework/Versions/3.7/lib/python3.7/ast.py:271: in visit
    return visitor(node)
py14/transpiler.py:275: in visit_Module
    buf = [self.visit(b) for b in node.body]
py14/transpiler.py:275: in <listcomp>
    buf = [self.visit(b) for b in node.body]
py2many/clike.py:61: in visit
    return super(CLikeTranspiler, self).visit(node)
/usr/local/opt/python@3.7/Frameworks/Python.framework/Versions/3.7/lib/python3.7/ast.py:271: in visit
    return visitor(node)
py14/transpiler.py:175: in visit_Expr
    s = self.visit(node.value)
py2many/clike.py:61: in visit
    return super(CLikeTranspiler, self).visit(node)
/usr/local/opt/python@3.7/Frameworks/Python.framework/Versions/3.7/lib/python3.7/ast.py:271: in visit
    return visitor(node)
py14/transpiler.py:129: in visit_Call
    args = [self.visit(a) for a in node.args]
py14/transpiler.py:129: in <listcomp>
    args = [self.visit(a) for a in node.args]
py2many/clike.py:61: in visit
    return super(CLikeTranspiler, self).visit(node)
/usr/local/opt/python@3.7/Frameworks/Python.framework/Versions/3.7/lib/python3.7/ast.py:271: in visit
    return visitor(node)
py14/transpiler.py:317: in visit_Tuple
    elts = [self.visit(e) for e in node.elts]
py14/transpiler.py:317: in <listcomp>
    elts = [self.visit(e) for e in node.elts]
py2many/clike.py:61: in visit
    return super(CLikeTranspiler, self).visit(node)
/usr/local/opt/python@3.7/Frameworks/Python.framework/Versions/3.7/lib/python3.7/ast.py:271: in visit
    return visitor(node)
py14/transpiler.py:212: in visit_Str
    return "std::string {" + super(CppTranspiler, self).visit_Str(node) + "}"
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <py14.transpiler.CppTranspiler object at 0x1105fc4d0>, node = <_ast.Str object at 0x1109cbcd0>

    def visit_Str(self, node):
>       return f'"{node.value}"'
E       AttributeError: 'Str' object has no attribute 'value'

py2many/clike.py:88: AttributeError
_______________________________________________________________________________________________________________________ test_assert ________________________________________________________________________________________________________________________

    def test_assert():
        source = parse("assert 1 == foo(3)")
>       cpp = transpile(source)

py14/tests/test_transpiler.py:35:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
py14/transpiler.py:39: in transpile
    cpp = transpiler.visit(tree)
py2many/clike.py:61: in visit
    return super(CLikeTranspiler, self).visit(node)
/usr/local/opt/python@3.7/Frameworks/Python.framework/Versions/3.7/lib/python3.7/ast.py:271: in visit
    return visitor(node)
py14/transpiler.py:275: in visit_Module
    buf = [self.visit(b) for b in node.body]
py14/transpiler.py:275: in <listcomp>
    buf = [self.visit(b) for b in node.body]
py2many/clike.py:61: in visit
    return super(CLikeTranspiler, self).visit(node)
/usr/local/opt/python@3.7/Frameworks/Python.framework/Versions/3.7/lib/python3.7/ast.py:271: in visit
    return visitor(node)
py14/transpiler.py:346: in visit_Assert
    return "REQUIRE({0});".format(self.visit(node.test))
py2many/clike.py:61: in visit
    return super(CLikeTranspiler, self).visit(node)
/usr/local/opt/python@3.7/Frameworks/Python.framework/Versions/3.7/lib/python3.7/ast.py:271: in visit
    return visitor(node)
py2many/clike.py:135: in visit_Compare
    right = self.visit(node.comparators[0])
py2many/clike.py:61: in visit
    return super(CLikeTranspiler, self).visit(node)
/usr/local/opt/python@3.7/Frameworks/Python.framework/Versions/3.7/lib/python3.7/ast.py:271: in visit
    return visitor(node)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <py14.transpiler.CppTranspiler object at 0x110a749d0>, node = <_ast.Call object at 0x110a748d0>

    def visit_Call(self, node):
        fname = self.visit(node.func)
        if node.args:
            args = [self.visit(a) for a in node.args]
>           args = ", ".join(args)
E           TypeError: sequence item 0: expected str instance, NoneType found

py14/transpiler.py:130: TypeError
___________________________________________________________________________________________________________ test_augmented_assigns_with_counter ____________________________________________________________________________________________________________

    def test_augmented_assigns_with_counter():
        source = parse(
            "counter = 0", "counter += 5", "counter -= 2", "counter *= 2", "counter /= 3"
        )
        cpp = transpile(source)
>       assert cpp == parse(
            "auto counter = 0;",
            "counter += 5;",
            "counter -= 2;",
            "counter *= 2;",
            "counter /= 3;",
        )
E       AssertionError: assert 'auto counter...nter /= None;' == 'auto counter...counter /= 3;'
E         - auto counter = 0;
E         ?                ^
E         + auto counter = None;
E         ?                ^^^^
E         - counter += 5;
E         ?            ^
E         + counter += None;...
E
E         ...Full output truncated (14 lines hidden), use '-vv' to show

py14/tests/test_transpiler.py:44: AssertionError
_____________________________________________________________________________________________________ test_declare_vars_inside_if_as_long_as_possible ______________________________________________________________________________________________________

    def test_declare_vars_inside_if_as_long_as_possible():
        source = parse("x = 5", "if True:", "   y = 10", "   x *= y")
        cpp = transpile(source)
>       assert cpp == parse("auto x = 5;", "if(true) {", "auto y = 10;", "x *= y;", "}")
E       AssertionError: assert 'auto x = Non...;\nx *= y;\n}' == 'auto x = 5;\...;\nx *= y;\n}'
E         - auto x = 5;
E         ?          ^
E         + auto x = None;
E         ?          ^^^^
E           if(true) {
E         - auto y = 10;
E         ?          ^^...
E
E         ...Full output truncated (5 lines hidden), use '-vv' to show

py14/tests/test_transpiler.py:70: AssertionError
_________________________________________________________________________________________________________________ test_print_program_args __________________________________________________________________________________________________________________

    def test_print_program_args():
        source = parse(
            'if __name__ == "__main__":', "    for arg in sys.argv:", "       print(arg)"
        )
>       cpp = transpile(source)

py14/tests/test_transpiler.py:77:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
py14/transpiler.py:39: in transpile
    cpp = transpiler.visit(tree)
py2many/clike.py:61: in visit
    return super(CLikeTranspiler, self).visit(node)
/usr/local/opt/python@3.7/Frameworks/Python.framework/Versions/3.7/lib/python3.7/ast.py:271: in visit
    return visitor(node)
py14/transpiler.py:275: in visit_Module
    buf = [self.visit(b) for b in node.body]
py14/transpiler.py:275: in <listcomp>
    buf = [self.visit(b) for b in node.body]
py2many/clike.py:61: in visit
    return super(CLikeTranspiler, self).visit(node)
/usr/local/opt/python@3.7/Frameworks/Python.framework/Versions/3.7/lib/python3.7/ast.py:271: in visit
    return visitor(node)
py14/transpiler.py:241: in visit_If
    if self.visit(node.test) == '__name__ == std::string {"__main__"}':
py2many/clike.py:61: in visit
    return super(CLikeTranspiler, self).visit(node)
/usr/local/opt/python@3.7/Frameworks/Python.framework/Versions/3.7/lib/python3.7/ast.py:271: in visit
    return visitor(node)
py2many/clike.py:135: in visit_Compare
    right = self.visit(node.comparators[0])
py2many/clike.py:61: in visit
    return super(CLikeTranspiler, self).visit(node)
/usr/local/opt/python@3.7/Frameworks/Python.framework/Versions/3.7/lib/python3.7/ast.py:271: in visit
    return visitor(node)
py14/transpiler.py:212: in visit_Str
    return "std::string {" + super(CppTranspiler, self).visit_Str(node) + "}"
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <py14.transpiler.CppTranspiler object at 0x11057e810>, node = <_ast.Str object at 0x110a3e850>

    def visit_Str(self, node):
>       return f'"{node.value}"'
E       AttributeError: 'Str' object has no attribute 'value'

py2many/clike.py:88: AttributeError
_____________________________________________________________________________________________________________________ test_tuple_swap ______________________________________________________________________________________________________________________

    def test_tuple_swap():
        source = parse("x = 3", "y = 1", "x, y = y, x")
        cpp = transpile(source)
>       assert cpp == parse(
            "auto x = 3;", "auto y = 1;", "std::tie(x, y) = std::make_tuple(y, x);"
        )
E       AssertionError: assert 'auto x = Non..._tuple(y, x);' == 'auto x = 3;\..._tuple(y, x);'
E         - auto x = 3;
E         ?          ^
E         + auto x = None;
E         ?          ^^^^
E         - auto y = 1;
E         ?          ^
E         + auto y = None;...
E
E         ...Full output truncated (3 lines hidden), use '-vv' to show

py14/tests/test_transpiler.py:91: AssertionError
_______________________________________________________________________________________________________________________ test_assign ________________________________________________________________________________________________________________________

    def test_assign():
        source = parse("x = 3", "x = 1")
        cpp = transpile(source)
>       assert cpp == parse("auto x = 3;", "x = 1;")
E       AssertionError: assert 'auto x = None;\nx = None;' == 'auto x = 3;\nx = 1;'
E         - auto x = 3;
E         ?          ^
E         + auto x = None;
E         ?          ^^^^
E         - x = 1;
E         + x = None;

py14/tests/test_transpiler.py:99: AssertionError
___________________________________________________________________________________________________________________ test_list_as_vector ____________________________________________________________________________________________________________________

    def test_list_as_vector():
        source = parse("values = [0, 1, 2, 3]")
>       cpp = transpile(source)

py14/tests/test_transpiler.py:124:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
py14/transpiler.py:39: in transpile
    cpp = transpiler.visit(tree)
py2many/clike.py:61: in visit
    return super(CLikeTranspiler, self).visit(node)
/usr/local/opt/python@3.7/Frameworks/Python.framework/Versions/3.7/lib/python3.7/ast.py:271: in visit
    return visitor(node)
py14/transpiler.py:275: in visit_Module
    buf = [self.visit(b) for b in node.body]
py14/transpiler.py:275: in <listcomp>
    buf = [self.visit(b) for b in node.body]
py2many/clike.py:61: in visit
    return super(CLikeTranspiler, self).visit(node)
/usr/local/opt/python@3.7/Frameworks/Python.framework/Versions/3.7/lib/python3.7/ast.py:271: in visit
    return visitor(node)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <py14.transpiler.CppTranspiler object at 0x11057e350>, node = <_ast.Assign object at 0x1109bbbd0>

    def visit_Assign(self, node):
        target = node.targets[0]

        if isinstance(target, ast.Tuple):
            elts = [self.visit(e) for e in target.elts]
            value = self.visit(node.value)
            return "std::tie({0}) = {1};".format(", ".join(elts), value)

        if isinstance(node.scopes[-1], ast.If):
            outer_if = node.scopes[-1]
            if target.id in outer_if.common_vars:
                value = self.visit(node.value)
                return "{0} = {1};".format(target.id, value)

        if isinstance(target, ast.Subscript):
            target = self.visit(target)
            value = self.visit(node.value)
            return "{0} = {1};".format(target, value)

        definition = node.scopes.find(target.id)
        if isinstance(target, ast.Name) and defined_before(definition, node):
            target = self.visit(target)
            value = self.visit(node.value)
            return "{0} = {1};".format(target, value)
        elif isinstance(node.value, ast.List):
            elements = [self.visit(e) for e in node.value.elts]
            return "{0} {1} {{{2}}};".format(
>               decltype(node), self.visit(target), ", ".join(elements)
            )
E           TypeError: sequence item 0: expected str instance, NoneType found

py14/transpiler.py:375: TypeError
________________________________________________________________________________________________________________ test_vector_find_out_type _________________________________________________________________________________________________________________

    def test_vector_find_out_type():
        source = parse("values = []", "values.append(1)")
>       cpp = transpile(source)

py14/tests/test_transpiler.py:130:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
py14/transpiler.py:39: in transpile
    cpp = transpiler.visit(tree)
py2many/clike.py:61: in visit
    return super(CLikeTranspiler, self).visit(node)
/usr/local/opt/python@3.7/Frameworks/Python.framework/Versions/3.7/lib/python3.7/ast.py:271: in visit
    return visitor(node)
py14/transpiler.py:275: in visit_Module
    buf = [self.visit(b) for b in node.body]
py14/transpiler.py:275: in <listcomp>
    buf = [self.visit(b) for b in node.body]
py2many/clike.py:61: in visit
    return super(CLikeTranspiler, self).visit(node)
/usr/local/opt/python@3.7/Frameworks/Python.framework/Versions/3.7/lib/python3.7/ast.py:271: in visit
    return visitor(node)
py14/transpiler.py:175: in visit_Expr
    s = self.visit(node.value)
py2many/clike.py:61: in visit
    return super(CLikeTranspiler, self).visit(node)
/usr/local/opt/python@3.7/Frameworks/Python.framework/Versions/3.7/lib/python3.7/ast.py:271: in visit
    return visitor(node)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <py14.transpiler.CppTranspiler object at 0x110a03250>, node = <_ast.Call object at 0x110a03110>

    def visit_Call(self, node):
        fname = self.visit(node.func)
        if node.args:
            args = [self.visit(a) for a in node.args]
>           args = ", ".join(args)
E           TypeError: sequence item 0: expected str instance, NoneType found

py14/transpiler.py:130: TypeError
_____________________________________________________________________________________________________________________ test_bubble_sort _____________________________________________________________________________________________________________________

    def test_bubble_sort():
        source = parse(
            "def sort(seq):",
            "    L = len(seq)",
            "    for _ in range(L):",
            "        for n in range(1, L):",
            "            if seq[n] < seq[n - 1]:",
            "                seq[n - 1], seq[n] = seq[n], seq[n - 1]",
            "    return seq",
        )
>       cpp = transpile(source)

py14/tests/test_transpiler.py:166:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
py14/transpiler.py:39: in transpile
    cpp = transpiler.visit(tree)
py2many/clike.py:61: in visit
    return super(CLikeTranspiler, self).visit(node)
/usr/local/opt/python@3.7/Frameworks/Python.framework/Versions/3.7/lib/python3.7/ast.py:271: in visit
    return visitor(node)
py14/transpiler.py:275: in visit_Module
    buf = [self.visit(b) for b in node.body]
py14/transpiler.py:275: in <listcomp>
    buf = [self.visit(b) for b in node.body]
py2many/clike.py:61: in visit
    return super(CLikeTranspiler, self).visit(node)
/usr/local/opt/python@3.7/Frameworks/Python.framework/Versions/3.7/lib/python3.7/ast.py:271: in visit
    return visitor(node)
py14/transpiler.py:89: in visit_FunctionDef
    body = "\n".join([self.visit(n) for n in node.body])
py14/transpiler.py:89: in <listcomp>
    body = "\n".join([self.visit(n) for n in node.body])
py2many/clike.py:61: in visit
    return super(CLikeTranspiler, self).visit(node)
/usr/local/opt/python@3.7/Frameworks/Python.framework/Versions/3.7/lib/python3.7/ast.py:271: in visit
    return visitor(node)
py14/transpiler.py:170: in visit_For
    buf.extend([self.visit(c) for c in node.body])
py14/transpiler.py:170: in <listcomp>
    buf.extend([self.visit(c) for c in node.body])
py2many/clike.py:61: in visit
    return super(CLikeTranspiler, self).visit(node)
/usr/local/opt/python@3.7/Frameworks/Python.framework/Versions/3.7/lib/python3.7/ast.py:271: in visit
    return visitor(node)
py14/transpiler.py:167: in visit_For
    it = self.visit(node.iter)
py2many/clike.py:61: in visit
    return super(CLikeTranspiler, self).visit(node)
/usr/local/opt/python@3.7/Frameworks/Python.framework/Versions/3.7/lib/python3.7/ast.py:271: in visit
    return visitor(node)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <py14.transpiler.CppTranspiler object at 0x11099d750>, node = <_ast.Call object at 0x1109402d0>

    def visit_Call(self, node):
        fname = self.visit(node.func)
        if node.args:
            args = [self.visit(a) for a in node.args]
>           args = ", ".join(args)
E           TypeError: sequence item 0: expected str instance, NoneType found

py14/transpiler.py:130: TypeError
_________________________________________________________________________________________________________________________ test_fib _________________________________________________________________________________________________________________________

    def test_fib():
        source = parse(
            "def fib(n):",
            "    if n == 1:",
            "        return 1",
            "    elif n == 0:",
            "        return 0",
            "    else:",
            "        return fib(n-1) + fib(n-2)",
        )
>       cpp = transpile(source)

py14/tests/test_transpiler.py:194:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
py14/transpiler.py:39: in transpile
    cpp = transpiler.visit(tree)
py2many/clike.py:61: in visit
    return super(CLikeTranspiler, self).visit(node)
/usr/local/opt/python@3.7/Frameworks/Python.framework/Versions/3.7/lib/python3.7/ast.py:271: in visit
    return visitor(node)
py14/transpiler.py:275: in visit_Module
    buf = [self.visit(b) for b in node.body]
py14/transpiler.py:275: in <listcomp>
    buf = [self.visit(b) for b in node.body]
py2many/clike.py:61: in visit
    return super(CLikeTranspiler, self).visit(node)
/usr/local/opt/python@3.7/Frameworks/Python.framework/Versions/3.7/lib/python3.7/ast.py:271: in visit
    return visitor(node)
py14/transpiler.py:89: in visit_FunctionDef
    body = "\n".join([self.visit(n) for n in node.body])
py14/transpiler.py:89: in <listcomp>
    body = "\n".join([self.visit(n) for n in node.body])
py2many/clike.py:61: in visit
    return super(CLikeTranspiler, self).visit(node)
/usr/local/opt/python@3.7/Frameworks/Python.framework/Versions/3.7/lib/python3.7/ast.py:271: in visit
    return visitor(node)
py14/transpiler.py:250: in visit_If
    return "".join(var_definitions) + super(CppTranspiler, self).visit_If(node)
py2many/clike.py:103: in visit_If
    orelse = [self.visit(child) for child in node.orelse]
py2many/clike.py:103: in <listcomp>
    orelse = [self.visit(child) for child in node.orelse]
py2many/clike.py:61: in visit
    return super(CLikeTranspiler, self).visit(node)
/usr/local/opt/python@3.7/Frameworks/Python.framework/Versions/3.7/lib/python3.7/ast.py:271: in visit
    return visitor(node)
py14/transpiler.py:250: in visit_If
    return "".join(var_definitions) + super(CppTranspiler, self).visit_If(node)
py2many/clike.py:103: in visit_If
    orelse = [self.visit(child) for child in node.orelse]
py2many/clike.py:103: in <listcomp>
    orelse = [self.visit(child) for child in node.orelse]
py2many/clike.py:61: in visit
    return super(CLikeTranspiler, self).visit(node)
/usr/local/opt/python@3.7/Frameworks/Python.framework/Versions/3.7/lib/python3.7/ast.py:271: in visit
    return visitor(node)
py2many/clike.py:92: in visit_Return
    return "return {0};".format(self.visit(node.value))
py2many/clike.py:61: in visit
    return super(CLikeTranspiler, self).visit(node)
/usr/local/opt/python@3.7/Frameworks/Python.framework/Versions/3.7/lib/python3.7/ast.py:271: in visit
    return visitor(node)
py14/transpiler.py:272: in visit_BinOp
    return super(CppTranspiler, self).visit_BinOp(node)
py14/clike.py:32: in visit_BinOp
    [self.visit(node.left), self.visit(node.op), self.visit(node.right)]
py2many/clike.py:61: in visit
    return super(CLikeTranspiler, self).visit(node)
/usr/local/opt/python@3.7/Frameworks/Python.framework/Versions/3.7/lib/python3.7/ast.py:271: in visit
    return visitor(node)
py14/transpiler.py:129: in visit_Call
    args = [self.visit(a) for a in node.args]
py14/transpiler.py:129: in <listcomp>
    args = [self.visit(a) for a in node.args]
py2many/clike.py:61: in visit
    return super(CLikeTranspiler, self).visit(node)
/usr/local/opt/python@3.7/Frameworks/Python.framework/Versions/3.7/lib/python3.7/ast.py:271: in visit
    return visitor(node)
py14/transpiler.py:272: in visit_BinOp
    return super(CppTranspiler, self).visit_BinOp(node)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <py14.transpiler.CppTranspiler object at 0x11095fb50>, node = <_ast.BinOp object at 0x110aa50d0>

    def visit_BinOp(self, node):
        if isinstance(node.op, ast.Pow):
            return "std::pow({0}, {1})".format(
                self.visit(node.left), self.visit(node.right)
            )
        return " ".join(
>           [self.visit(node.left), self.visit(node.op), self.visit(node.right)]
        )
E       TypeError: sequence item 2: expected str instance, NoneType found

py14/clike.py:32: TypeError
______________________________________________________________________________________________________________________ test_comb_sort ______________________________________________________________________________________________________________________

    def test_comb_sort():
        source = parse(
            "def sort(seq):",
            "    gap = len(seq)",
            "    swap = True",
            "    while gap > 1 or swap:",
            "        gap = max(1, int(gap / 1.25))",
            "        swap = False",
            "        for i in range(len(seq) - gap):",
            "            if seq[i] > seq[i + gap]:",
            "                seq[i], seq[i + gap] = seq[i + gap], seq[i]",
            "                swap = True",
            "                return seq",
        )
>       cpp = transpile(source)

py14/tests/test_transpiler.py:225:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
py14/transpiler.py:39: in transpile
    cpp = transpiler.visit(tree)
py2many/clike.py:61: in visit
    return super(CLikeTranspiler, self).visit(node)
/usr/local/opt/python@3.7/Frameworks/Python.framework/Versions/3.7/lib/python3.7/ast.py:271: in visit
    return visitor(node)
py14/transpiler.py:275: in visit_Module
    buf = [self.visit(b) for b in node.body]
py14/transpiler.py:275: in <listcomp>
    buf = [self.visit(b) for b in node.body]
py2many/clike.py:61: in visit
    return super(CLikeTranspiler, self).visit(node)
/usr/local/opt/python@3.7/Frameworks/Python.framework/Versions/3.7/lib/python3.7/ast.py:271: in visit
    return visitor(node)
py14/transpiler.py:89: in visit_FunctionDef
    body = "\n".join([self.visit(n) for n in node.body])
py14/transpiler.py:89: in <listcomp>
    body = "\n".join([self.visit(n) for n in node.body])
py2many/clike.py:61: in visit
    return super(CLikeTranspiler, self).visit(node)
/usr/local/opt/python@3.7/Frameworks/Python.framework/Versions/3.7/lib/python3.7/ast.py:271: in visit
    return visitor(node)
py2many/clike.py:125: in visit_While
    buf.extend([self.visit(n) for n in node.body])
py2many/clike.py:125: in <listcomp>
    buf.extend([self.visit(n) for n in node.body])
py2many/clike.py:61: in visit
    return super(CLikeTranspiler, self).visit(node)
/usr/local/opt/python@3.7/Frameworks/Python.framework/Versions/3.7/lib/python3.7/ast.py:271: in visit
    return visitor(node)
py14/transpiler.py:370: in visit_Assign
    value = self.visit(node.value)
py2many/clike.py:61: in visit
    return super(CLikeTranspiler, self).visit(node)
/usr/local/opt/python@3.7/Frameworks/Python.framework/Versions/3.7/lib/python3.7/ast.py:271: in visit
    return visitor(node)
py14/transpiler.py:129: in visit_Call
    args = [self.visit(a) for a in node.args]
py14/transpiler.py:129: in <listcomp>
    args = [self.visit(a) for a in node.args]
py2many/clike.py:61: in visit
    return super(CLikeTranspiler, self).visit(node)
/usr/local/opt/python@3.7/Frameworks/Python.framework/Versions/3.7/lib/python3.7/ast.py:271: in visit
    return visitor(node)
py14/transpiler.py:129: in visit_Call
    args = [self.visit(a) for a in node.args]
py14/transpiler.py:129: in <listcomp>
    args = [self.visit(a) for a in node.args]
py2many/clike.py:61: in visit
    return super(CLikeTranspiler, self).visit(node)
/usr/local/opt/python@3.7/Frameworks/Python.framework/Versions/3.7/lib/python3.7/ast.py:271: in visit
    return visitor(node)
py14/transpiler.py:272: in visit_BinOp
    return super(CppTranspiler, self).visit_BinOp(node)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <py14.transpiler.CppTranspiler object at 0x11099d410>, node = <_ast.BinOp object at 0x1109eafd0>

    def visit_BinOp(self, node):
        if isinstance(node.op, ast.Pow):
            return "std::pow({0}, {1})".format(
                self.visit(node.left), self.visit(node.right)
            )
        return " ".join(
>           [self.visit(node.left), self.visit(node.op), self.visit(node.right)]
        )
E       TypeError: sequence item 2: expected str instance, NoneType found

py14/clike.py:32: TypeError
_____________________________________________________________________________________________________________________ test_normal_pdf ______________________________________________________________________________________________________________________

    def test_normal_pdf():
        source = parse(
            "def pdf(x, mean, std_dev):",
            "    term1 = 1.0 / ((2 * math.pi) ** 0.5)",
            "    term2 = (math.e ** (-1.0 * (x-mean) ** 2.0 / 2.0",
            "             * (std_dev ** 2.0)))",
            "    return term1 * term2",
        )
>       cpp = transpile(source)

py14/tests/test_transpiler.py:255:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
py14/transpiler.py:39: in transpile
    cpp = transpiler.visit(tree)
py2many/clike.py:61: in visit
    return super(CLikeTranspiler, self).visit(node)
/usr/local/opt/python@3.7/Frameworks/Python.framework/Versions/3.7/lib/python3.7/ast.py:271: in visit
    return visitor(node)
py14/transpiler.py:275: in visit_Module
    buf = [self.visit(b) for b in node.body]
py14/transpiler.py:275: in <listcomp>
    buf = [self.visit(b) for b in node.body]
py2many/clike.py:61: in visit
    return super(CLikeTranspiler, self).visit(node)
/usr/local/opt/python@3.7/Frameworks/Python.framework/Versions/3.7/lib/python3.7/ast.py:271: in visit
    return visitor(node)
py14/transpiler.py:89: in visit_FunctionDef
    body = "\n".join([self.visit(n) for n in node.body])
py14/transpiler.py:89: in <listcomp>
    body = "\n".join([self.visit(n) for n in node.body])
py2many/clike.py:61: in visit
    return super(CLikeTranspiler, self).visit(node)
/usr/local/opt/python@3.7/Frameworks/Python.framework/Versions/3.7/lib/python3.7/ast.py:271: in visit
    return visitor(node)
py14/transpiler.py:385: in visit_Assign
    value = self.visit(node.value)
py2many/clike.py:61: in visit
    return super(CLikeTranspiler, self).visit(node)
/usr/local/opt/python@3.7/Frameworks/Python.framework/Versions/3.7/lib/python3.7/ast.py:271: in visit
    return visitor(node)
py14/transpiler.py:272: in visit_BinOp
    return super(CppTranspiler, self).visit_BinOp(node)
py14/clike.py:32: in visit_BinOp
    [self.visit(node.left), self.visit(node.op), self.visit(node.right)]
py2many/clike.py:61: in visit
    return super(CLikeTranspiler, self).visit(node)
/usr/local/opt/python@3.7/Frameworks/Python.framework/Versions/3.7/lib/python3.7/ast.py:271: in visit
    return visitor(node)
py14/transpiler.py:272: in visit_BinOp
    return super(CppTranspiler, self).visit_BinOp(node)
py14/clike.py:29: in visit_BinOp
    self.visit(node.left), self.visit(node.right)
py2many/clike.py:61: in visit
    return super(CLikeTranspiler, self).visit(node)
/usr/local/opt/python@3.7/Frameworks/Python.framework/Versions/3.7/lib/python3.7/ast.py:271: in visit
    return visitor(node)
py14/transpiler.py:272: in visit_BinOp
    return super(CppTranspiler, self).visit_BinOp(node)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <py14.transpiler.CppTranspiler object at 0x110af8550>, node = <_ast.BinOp object at 0x110a86dd0>

    def visit_BinOp(self, node):
        if isinstance(node.op, ast.Pow):
            return "std::pow({0}, {1})".format(
                self.visit(node.left), self.visit(node.right)
            )
        return " ".join(
>           [self.visit(node.left), self.visit(node.op), self.visit(node.right)]
        )
E       TypeError: sequence item 0: expected str instance, NoneType found

py14/clike.py:32: TypeError
___________________________________________________________________________________________________________ TestValueType.test_direct_assignment ___________________________________________________________________________________________________________

self = <pyrs.tests.test_tracer.TestValueType object at 0x110b0c310>

    def test_direct_assignment(self):
        source = parse("x = 3")
        x = source.body[0]
        t = value_type(x)
>       assert t == "3"
E       AssertionError: assert None == '3'
E         +None
E         -'3'

pyrs/tests/test_tracer.py:19: AssertionError
_________________________________________________________________________________________________ TestValueType.test_list_assignment_based_on_later_append _________________________________________________________________________________________________

self = <pyrs.tests.test_tracer.TestValueType object at 0x110999510>

    def test_list_assignment_based_on_later_append(self):
        source = parse("x = 3", "results = []", "results.append(x)")
        add_list_calls(source)
        results = source.body[1]
        t = value_type(results)
>       assert t == "3"
E       AssertionError: assert None == '3'
E         +None
E         -'3'

pyrs/tests/test_tracer.py:50: AssertionError
_______________________________________________________________________________________________ TestValueType.test_list_assignment_with_append_unknown_value _______________________________________________________________________________________________

self = <pyrs.tests.test_tracer.TestValueType object at 0x1109cebd0>

    def test_list_assignment_with_append_unknown_value(self):
        source = parse("results = []", "x = 3", "results.append(x)")
        add_list_calls(source)
        results = source.body[0]
        t = value_type(results)
>       assert t == "3"
E       AssertionError: assert None == '3'
E         +None
E         -'3'

pyrs/tests/test_tracer.py:57: AssertionError
_______________________________________________________________________________________________ TestValueType.test_global_list_assignment_with_later_append ________________________________________________________________________________________________

self = <pyrs.tests.test_tracer.TestValueType object at 0x1109cb590>

    def test_global_list_assignment_with_later_append(self):
        source = parse("results = []", "def add_x():", "   results.append(2)")
        add_list_calls(source)
        results = source.body[0]
        t = value_type(results)
>       assert t == "2"
E       AssertionError: assert None == '2'
E         +None
E         -'2'

pyrs/tests/test_tracer.py:64: AssertionError
______________________________________________________________________________________________________ TestValueExpr.test_catch_long_expression_chain ______________________________________________________________________________________________________

self = <pyrs.tests.test_tracer.TestValueExpr object at 0x110a26b50>

    def test_catch_long_expression_chain(self):
        source = parse("x = 3 * 1", "y = x - 5", "z = y + 2")
        z = source.body[2]
        t = value_expr(z)
>       assert t == "3 * 1 - 5 + 2"
E       AssertionError: assert 'None * None - None + None' == '3 * 1 - 5 + 2'
E         - 3 * 1 - 5 + 2
E         + None * None - None + None

pyrs/tests/test_tracer.py:72: AssertionError
_________________________________________________________________________________________________ TestValueExpr.test_catch_expression_chain_with_functions _________________________________________________________________________________________________

self = <pyrs.tests.test_tracer.TestValueExpr object at 0x11095fc50>

    def test_catch_expression_chain_with_functions(self):
        source = parse("x = 3 * 1", "y = foo(x)", "z = y + 2")
        z = source.body[2]
        t = value_expr(z)
>       assert t == "foo(3 * 1) + 2"
E       AssertionError: assert 'foo(None * None) + None' == 'foo(3 * 1) + 2'
E         - foo(3 * 1) + 2
E         + foo(None * None) + None

pyrs/tests/test_tracer.py:78: AssertionError
```